web: LIGHT is four strips on a phone, not four folded rows — the tab's column measured 215px of a 390x844 screen with its panels stacked, and the photo 498px; the strip is 40px and the photo 641px
LIGHT is the one tab whose picks are panels, and on a phone those panels were
being drawn the way a wide screen draws them: four heads stacked down the bottom
bar, each a disclosure for rows that were already there. The bar is a strip on
every other tab, so it is a strip here: .dev-chips now carries the four panels
as chips (WB, TONE, PRESENCE, DETAIL & EFFECTS) and .dev-panels is hidden under
860px, exactly as .dev-chips is hidden over it. The four chips fit a 390px strip
without scrolling.
WB, TONE, PRESENCE and DETAIL & EFFECTS become strip keys of their own
(DEV_PANELS holds the rows each owns; DEV_DEF is one lookup for the defs, so a
row the phone has and the web has not draws nothing). A panel's strip is its
knobs first, then the picks that close it where they belong: WB's presets and
its two Color Chromes, TONE's curve, DETAIL & EFFECTS' four D.RANGE stops.
A knob in that strip opens its ruler in the row above, and the strip stays under
it, so the panel is still on screen while the number moves — the first level of
the cascade the other tabs already walk, one turn deeper.
PARAM_GROUP is what that costs: every knob LIGHT owns names its panel
(temperature -> wb, exposure -> tone, dehaze -> presence, grain -> effects), so
the ruler's own "<" reopens the panel it came from instead of dropping the strip
off the screen. A slider row opened from a strip returns to it.
The way back up is a path under the strip: TABS > LIGHT > WB > COLOR TEMP, one
name per level, each name returning to the strip it names and the last one drawn
as where the visitor stands. It replaces the single ☀TABS chip: that chip said
the same thing with one name where the path says how far down the visitor is,
which is the half of it the glyph could not. It is the last line of the stack,
so it, not the strip, carries the home-indicator inset now. A wide screen draws
no path: every column is in sight there already.
RESET leaves the bar. The topbar's RESET and this row both call the same reset(),
so the row was a second button for one action, and on a phone it sat at the end
of a strip that already scrolls sideways. CREATE keeps its own: that row also
bumps createReset, which the topbar's button does not do.
Measured on 390x844, LIGHT open: the bar 215px -> 40px, the photo 498px ->
641px, the path 32px; the four chips 390px of scroll width in a 390px strip, and
the page itself does not scroll sideways. On 1280x900 .dev-panels is painted,
.dev-chips and .crumb are not.
Checks:
- npm run build (tsc --noEmit + vite) clean: dist/assets/index-BAbl_ECT.css
71.65 kB, index-RU9cTwG7.js 735.50 kB.
- node scripts/{tone-base,highlight-knee,half,white-level,auto-tone,preview-match,
raw-develop,roll-walk,wb-table,mask-wb}-check.mjs: all pass.
- Chromium 390x844 light and dark: rail -> LIGHT gives one 40px row of
dev-wb/dev-tone/dev-presence/dev-effects and the path "TABS > LIGHT";
dev-wb gives the panel's strip over the bar (13 chips, 824px of scroll);
COLOR TEMP opens its ruler above that strip, strip still up, path
"TABS > LIGHT > WB > COLOR TEMP"; the ruler's "<" lands back on the WB strip;
crumb-strip drops the ruler, crumb-tab drops the strip, crumb-tabs stands the
rail back up; TONE closes on the curve, DETAIL & EFFECTS on the four D.RANGE
stops; no page error, no sideways scroll.
- Chromium 1280x900: .dev-panels painted, .dev-chips/.crumb none, WB panel opens
with its presets, rows, chromes; no ruler column, as before.
Skipped:
- The row RESET on CREATE is kept, so that one bar still ends on a chip, where
the topbar's button would leave the form's own reset unrun.
- The path is not drawn over 860px, where the columns are already in sight.
This commit is contained in:
@@ -114,10 +114,11 @@
|
||||
/* RESET is the way out of an edit, not one more chip: a rule and some air keep
|
||||
it apart from the tab's own buttons at the foot of the column. */
|
||||
.reset-row { margin-top: 6px; padding-top: 12px; border-top: 1px solid var(--border); }
|
||||
/* Two things that belong to the phone alone: the way back from a tab's strip to
|
||||
the rail, and the mark a sub-chip wears on its tile. A desktop draws neither —
|
||||
it reads the rail beside the chips, and a chip there is its label. */
|
||||
.tabs-back, .chip-icon { display: none; }
|
||||
/* Three things that belong to the phone alone: the mark a sub-chip wears on its
|
||||
tile, the path back up under the strip, and LIGHT's panels as a chip row. A
|
||||
desktop draws none of them — a chip there is its label, every column is in
|
||||
sight, and LIGHT's panels are the column itself. */
|
||||
.chip-icon, .crumb, .dev-chips { display: none; }
|
||||
.chip-row { display: flex; flex-wrap: wrap; gap: 6px; }
|
||||
/* The rule a strip is read across (the mixer's PICK, its bands, the three
|
||||
knobs): a line of its own, so it breaks the row it is written into whichever
|
||||
@@ -1563,30 +1564,76 @@ input[type="range"] { width: 100%; accent-color: var(--accent); }
|
||||
overflow-y: hidden;
|
||||
background: var(--bg);
|
||||
border-top: 1px solid var(--border-soft);
|
||||
padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
|
||||
/* No inset here any more: the path under the strip (.crumb) is the last
|
||||
line of the phone's stack now, so it carries the home indicator. */
|
||||
padding: 6px 8px;
|
||||
}
|
||||
/* The strip is as wide as its chips and the bar scrolls: a row that was
|
||||
allowed to shrink would squeeze under its own contents and the chips would
|
||||
paint over the ones beside them. */
|
||||
.col-main > *, .col-sub:not(.wm-extra) > * { flex: 0 0 auto; }
|
||||
.col-main:not(.col-create):not(.col-dev) .chip-row { flex-wrap: nowrap; }
|
||||
.col-main:not(.col-create) .chip-row { flex-wrap: nowrap; }
|
||||
.col-main .chip { flex: 0 0 auto; }
|
||||
/* The rule a strip is read across runs the other way here: in a row of chips
|
||||
it divides the line, it does not break it. */
|
||||
.col-main .chip-rule { flex: 0 0 auto; width: 1px; height: 18px; margin: 0 3px; }
|
||||
/* RESET is ruled off the tab's chips at the foot of a desktop column; in the
|
||||
bar the rule moves to their side. */
|
||||
.reset-row { margin: 0; padding: 0 0 0 8px; border-top: none; border-left: 1px solid var(--border); }
|
||||
/* LIGHT's panels and CREATE's form are not a strip of chips: they keep the
|
||||
column's shape and scroll down instead of across, in the bar's place. */
|
||||
.col-main.col-create, .col-main.col-dev {
|
||||
bar the rule moves to their side. The topbar's RESET already covers every
|
||||
other tab (it and this row call the same reset), so the row only survives
|
||||
where the button does something the topbar's does not: CREATE's form. */
|
||||
.reset-row { display: none; }
|
||||
.col-create .reset-row { display: block; margin: 0; padding: 0 0 0 8px; border-top: none; border-left: 1px solid var(--border); }
|
||||
/* CREATE's form is not a strip of chips: it keeps the column's shape and
|
||||
scrolls down instead of across, in the bar's place. */
|
||||
.col-main.col-create {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
/* The way back to the rail, which this strip is standing in for. */
|
||||
.tabs-back { display: flex; }
|
||||
/* LIGHT is a strip of chips like any other tab, and its chips are its four
|
||||
panels — so the widths of the panels' heads come off and the row stands in
|
||||
the wrapper's place, exactly as .chips itself stands in its columns'. */
|
||||
.col-dev .dev-chips { display: contents; }
|
||||
.col-dev .dev-panels { display: none; }
|
||||
|
||||
/* --- the way back up: the path under the strip -------------------------- */
|
||||
/* TABS > LIGHT > WB. The bar is as deep as the visitor walked, so the bar's
|
||||
own chips cannot say it; the path can, and each name in it returns to the
|
||||
strip it names. It is the last line of the stack, so it, not the strip,
|
||||
carries the home indicator. */
|
||||
.crumb {
|
||||
order: 5;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
overflow-x: auto;
|
||||
padding: 0 10px calc(6px + env(safe-area-inset-bottom));
|
||||
background: var(--bg);
|
||||
border-top: 1px solid var(--border-soft);
|
||||
font-family: var(--mono);
|
||||
font-size: 10px;
|
||||
letter-spacing: 0.08em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
.crumb::-webkit-scrollbar { display: none; }
|
||||
.crumb-part { display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto; }
|
||||
.crumb-sep { opacity: 0.5; }
|
||||
/* A name in the path is a button wherever a strip answers to it, and plain
|
||||
where the visitor already stands. */
|
||||
.crumb-btn, .crumb-here { padding: 6px 2px; }
|
||||
.crumb-btn {
|
||||
border: 0;
|
||||
background: none;
|
||||
font: inherit;
|
||||
letter-spacing: inherit;
|
||||
text-transform: inherit;
|
||||
color: var(--text-dim);
|
||||
cursor: pointer;
|
||||
}
|
||||
.crumb-btn:hover { color: var(--text); }
|
||||
.crumb-here { color: var(--accent); }
|
||||
|
||||
/* --- a chip's own sub-chips: the row over the bar ----------------------- */
|
||||
.col-sub:not(.wm-extra) {
|
||||
|
||||
Reference in New Issue
Block a user