feat(web): settings view for roots and policies

Own route beside library and queues. Roots edit kind, audience, path
and their policy; policies get a form over the real fields — size
bands as number inputs, score and source weights as numbers,
resolution preference and audio/HDR rules as validated lists. Delete
arms before firing; a 409 from a referenced policy or occupied root
surfaces its message.
This commit is contained in:
Miguel Palhas
2026-08-23 15:14:34 +01:00
parent 9fa1f0cc51
commit 71c2741d08
6 changed files with 891 additions and 10 deletions
+79
View File
@@ -1270,3 +1270,82 @@ body {
width: 2.5rem;
}
}
/* ---- settings (issue #116) -------------------------------------------- */
/* rows follow the queues pattern: line, then an action pair */
.settings-row-actions {
display: flex;
gap: var(--space-2);
margin: var(--space-1) 0 var(--space-2);
}
.form-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
gap: var(--space-3);
align-items: end;
}
.field {
display: grid;
gap: var(--space-1);
}
.field-label {
font-size: var(--text-2xs);
text-transform: uppercase;
letter-spacing: 0.12em;
}
.form-input {
min-height: 2.25rem;
width: 100%;
padding: 0 var(--space-2);
color: var(--ink);
font-family: var(--font-readout);
font-size: var(--text-xs);
background: var(--ground);
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: inset 0 1px var(--lowlight);
caret-color: var(--accent);
transition: border-color 150ms var(--ease-out);
}
.form-input:hover {
border-color: var(--line-strong);
}
.form-input:focus {
border-color: var(--accent);
outline: none;
}
.form-input:disabled {
color: var(--ink-faint);
border-color: var(--line);
}
select.form-input {
appearance: none;
}
.form-input[data-invalid] {
border-color: var(--signal-fault);
}
/* one resolution's size band: label, floor, target, penalty on a line */
.band-line {
display: flex;
align-items: center;
gap: var(--space-2);
}
.band-line .field-label {
width: 3.5rem;
}
.band-num {
width: 4.5rem;
}