Files
digital-garbageandClaude Sonnet 5.5 aa31b95ea5 Timeline header on one line; kit literals into tokens; Composer fits; running-state viewport test; remove Auto Montage
- Header: view toggles (Assets/Preview/Properties/Auto-hide) move to the top bar; progress, the prompt warning and scene actions (rate, upscale, interpolate) move to the row under the toolbar; the timeline head never wraps from 1000px up and never clips its controls. The top bar grows a line instead of spilling when it wraps.
- Kit: every literal pixel size in element CSS is a token (the ratchet test is now zero); Composer's text box follows the viewport; the catalogue shows the component sizes.
- test:viewport adds a fake ComfyUI queue and socket for the render-running state and asserts the header is one row.
- Auto Montage removed (button, window, code, README/docs, tests). Saved projects holding pieces it made still load: the reused flag is kept.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-06 14:28:45 +02:00

66 lines
4.6 KiB
CSS

/* The Settings window, after macOS System Settings / About: a sidebar that stays open, a large title,
* and rows grouped into rounded inset cards -- label on the left, value on the right, hairlines between. */
.cx-settings-modal { height: min(var(--settings-h), 92vh); }
.cx-settings-modal .cx-modal-body { padding: 0; }
.cx-settings-body.cx-stack { display: grid; grid-template-columns: var(--settings-rail-w) minmax(0, 1fr); block-size: 100%; min-block-size: 0; }
/* sidebar */
.cx-settings-rail {
min-inline-size: 0; inline-size: auto; position: static; overflow: hidden;
background: var(--elev-2); border-inline-end: var(--bw) solid var(--line);
padding: var(--sp-6) var(--sp-5); gap: var(--sp-5);
}
.cx-settings-rail .cx-search { inline-size: 100%; }
.cx-settings-rail .cx-filter-list { gap: var(--sp-1); }
.cx-settings-rail .cx-filter-row { gap: var(--sp-5); padding: var(--sp-3) var(--sp-4); border-radius: var(--r-4); font-size: var(--fs-4); }
.cx-settings-rail .cx-filter-icon { inline-size: var(--sp-9); block-size: var(--sp-9); border-radius: var(--sp-3); font-size: var(--fs-5); margin: 0; }
.cx-settings-rail .cx-filter-row.cx-on { background: var(--accent); color: var(--on-accent); }
.cx-settings-rail .cx-filter-row.cx-on .cx-filter-label { font-weight: var(--fw-medium); }
.cx-settings-rail .cx-filter-gap { block-size: var(--sp-5); }
/* content */
.cx-settings-content { margin: 0; padding: var(--sp-8) var(--sp-10) var(--sp-10); block-size: 100%; overflow-y: auto; min-inline-size: 0; }
.cx-settings-content > .cx-h-md { font-size: var(--fs-d3); line-height: var(--lh-d3); font-weight: var(--fw-bold); letter-spacing: -.015em; }
.cx-settings-content > .cx-hint { font-size: var(--fs-4); line-height: var(--lh-4); margin-block-end: var(--sp-4); }
/* section titles sit above their card, in the sentence-case bold the About pane uses */
.cx-settings-content .cx-eyebrow {
font-size: var(--fs-4); line-height: var(--lh-4); letter-spacing: 0; text-transform: none;
font-weight: var(--fw-semibold); color: var(--text); margin-block: var(--sp-7) calc(-1 * var(--sp-2));
}
/* a run of rows (and switches) is one card */
:is(.cx-settings-content, .cx-modal-body) .cx-stack > :is(.cx-settings-row, .cx-toggle-row) {
background-color: var(--elev-2); border: 0; border-radius: var(--r-5);
padding: var(--sp-5) var(--sp-7); min-block-size: var(--sp-11); display: flex; align-items: center;
}
:is(.cx-settings-content, .cx-modal-body) .cx-stack > .cx-toggle-row > label { inline-size: 100%; display: flex; }
:is(.cx-settings-content, .cx-modal-body) .cx-stack > :is(.cx-settings-row, .cx-toggle-row):has(+ :is(.cx-settings-row, .cx-toggle-row)) { border-end-start-radius: 0; border-end-end-radius: 0; }
:is(.cx-settings-content, .cx-modal-body) .cx-stack > :is(.cx-settings-row, .cx-toggle-row) + :is(.cx-settings-row, .cx-toggle-row) {
border-start-start-radius: 0; border-start-end-radius: 0;
margin-block-start: calc(-1 * var(--cx-gap, var(--sp-4)));
background-image: linear-gradient(var(--line), var(--line)); background-repeat: no-repeat;
background-size: calc(100% - 2 * var(--sp-7)) 1px; background-position: center top;
}
.cx-settings-content .cx-settings-label { font-size: var(--fs-4); line-height: var(--lh-4); }
.cx-settings-content .cx-settings-text .cx-hint, .cx-settings-content .cx-settings-text > :not(:first-child) { color: var(--muted); }
/* a plain value, as in About, reads as the quieter half of the row */
.cx-settings-content .cx-settings-control > .cx-t { color: var(--muted); text-align: end; font-size: var(--fs-4); }
/* the control keeps its whole column, whatever the hint's length: the text wraps instead (a long hint used to squeeze the slider and push its readout out of the row) */
.cx-settings-content .cx-settings-control { flex: 0 0 var(--control-col); }
.cx-settings-content .cx-settings-control > .cx-t { flex: 1 1 auto; }
/* the About hero */
.cx-settings-hero { align-items: center; text-align: center; gap: var(--sp-4); padding-block: var(--sp-4) var(--sp-7); }
.cx-settings-hero .cx-h { font-size: var(--fs-d3); }
.cx-settings-hero .cx-brand-mark { font-size: var(--fs-d3); }
.cx-settings-content .cx-settings-control:has(> .cx-t) { flex: 1 1 auto; }
.cx-settings-content .cx-settings-text { flex: 0 1 auto; min-inline-size: 0; }
/* rows already inside a card of their own (Engine, Models) take the same look */
.cx-settings-content .cx-group-rows { background: var(--elev-2); border: 0; border-radius: var(--r-5); padding-inline: var(--sp-7); }
.cx-settings-content .cx-group-rows .cx-settings-row { padding-block: var(--sp-5); border-bottom: var(--bw) solid var(--line); }
.cx-settings-content .cx-group-rows .cx-settings-row:last-child { border-bottom: 0; }