mirror of
https://github.com/MichaelScottsman/LiquidAss-Frame.git
synced 2026-10-18 18:01:54 +02:00
455 lines
43 KiB
CSS
455 lines
43 KiB
CSS
/* Shared control vocabulary v3 (docs/phase2/concepts/controls.md), rendered on top of kit.css.
|
|
*
|
|
* Every size is a main-window CSS px (1 pt = 4/3 px, DESIGN2 §2.1) unless a block says otherwise.
|
|
* Nothing in this file draws an outline on glass. The only ring is the text-field focus ring (VP P-17).
|
|
* State classes follow the kit: is-hover (with --hx/--hy), is-focus, is-pressed, is-selected, is-disabled,
|
|
* plus is-drag (slider), is-open (pop-up button), is-lift (selection pill while travelling), is-within
|
|
* (focus inside a single-control row), is-within-multi (a multi-control row), is-lifted (the control in such a row).
|
|
* Revision 3 (PLAN §1 conformance, M0): gamepad focus add .28 (§1.4), the light layer drawn under the label
|
|
* (VP P-10), navigation rows hover with the spot only, navigation selection = .18 + arc + Semibold, glyph
|
|
* badges only in gamepad mode (VP P-26), 656 px window glass for /zoo boards (§1.2), 48 px thick-glass
|
|
* tooltips (§1.13), contiguous segments (E-SEG), 40 px menu header and a 56 px quiet Cancel (§1.12).
|
|
* The keyboard block (kb-*, c-key) is C4b's look and is kept as it was.
|
|
*/
|
|
|
|
:root {
|
|
/* state recipe (PLAN §1.4). P4 sets the final focus add once, between .28 and .32, from the G-FOCUS measurement */
|
|
--c-focus: .28;
|
|
--c-hover: .08;
|
|
--c-spot-hover: .12;
|
|
--c-spot-focus: .16;
|
|
--c-nav: .18;
|
|
/* focus on a white or coloured fill: a blurred glow, not a ring. PLAN §1.4 starts from 0 0 18px 2px white .30, which measures
|
|
+4..6 L in the P-16 band (8-16 px outside) on the state board. P4's token --lgs-white-glow (contracts/tokens.md §1.6) is the
|
|
shared value; the mockups use it as written */
|
|
--c-glow-on: 0 0 22px 8px rgb(255 255 255 / .55);
|
|
/* text and glyphs on a coloured whole fill (CC §7, PLAN §1.12): dark on green, orange, yellow and red; white only on blue */
|
|
--c-on-fill: #0d0e12;
|
|
/* recessed: darker than the glass, lit on its lower inner lip (light from above), never a ring */
|
|
--c-recess: inset 0 2px 5px rgb(0 0 0 / .30), inset 0 -2px 3px -1px rgb(255 255 255 / .10);
|
|
/* raised: lighter than the glass, a soft top sheen and a faint contact shadow */
|
|
--c-raised-bg: linear-gradient(180deg, rgb(255 255 255 / .07), rgb(255 255 255 / 0) 55%), rgb(255 255 255 / .10);
|
|
--c-raised-sh: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .22), 0 1px 2px rgb(0 0 0 / .10);
|
|
/* the control's own specular arc, x1.5 under focus: a conic arc from the key light with gaps on both sides */
|
|
--c-arc: conic-gradient(from var(--lg-light), rgb(255 255 255 / .75) 0deg, rgb(255 255 255 / .2) 40deg, transparent 75deg,
|
|
transparent 145deg, rgb(255 255 255 / .22) 180deg, transparent 215deg, transparent 285deg, rgb(255 255 255 / .2) 320deg,
|
|
rgb(255 255 255 / .75) 360deg);
|
|
/* the navigation selection's top arc: the same light, weaker (selection is quieter than focus, VP P-15) */
|
|
--c-arc-sel: conic-gradient(from var(--lg-light), rgb(255 255 255 / .46) 0deg, rgb(255 255 255 / .12) 40deg, transparent 75deg,
|
|
transparent 285deg, rgb(255 255 255 / .12) 320deg, rgb(255 255 255 / .46) 360deg);
|
|
--c-ring-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
}
|
|
|
|
/* ===================================================================== gallery window (spec board drawn as the /zoo route, `window` glass 1280 x 656) */
|
|
.cg-win { left: 0; top: 0; width: 1280px; height: 656px; }
|
|
.cg-side { position: absolute; left: 0; top: 0; bottom: 0; width: 320px; background: var(--lg-fill-regular);
|
|
border-radius: var(--lg-r-window) 0 0 var(--lg-r-window); overflow: hidden; }
|
|
.cg-side > .cg-back { position: absolute; left: 24px; top: 24px; }
|
|
.cg-side > .t-large { position: absolute; left: 100px; top: 54px; translate: 0 -50%; white-space: nowrap; }
|
|
.cg-nav { position: absolute; left: 12px; right: 12px; top: 108px; display: flex; flex-direction: column; gap: 8px; }
|
|
.cg-nav .lgk-row { height: 72px; padding: 0 14px; gap: 16px; font-size: 24px; }
|
|
.cg-side::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 72px; pointer-events: none; /* scroll edge: the list scrolls under it */
|
|
background: linear-gradient(180deg, rgb(0 0 0 / 0), rgb(0 0 0 / .22)); -webkit-mask: linear-gradient(180deg, transparent, #000); }
|
|
.cg-main { position: absolute; left: 320px; top: 0; right: 0; bottom: 0; }
|
|
.cg-head { position: absolute; left: 0; right: 0; top: 0; height: 108px; display: flex; align-items: center; justify-content: center; }
|
|
.cg-head > .lgk-btn { position: absolute; top: 24px; }
|
|
.cg-sec { position: absolute; left: 66px; font: 600 22px/1 var(--lg-font); color: var(--lg-text-2); white-space: nowrap; }
|
|
.cg-sec .v3 { font-weight: 500; }
|
|
.cg-platter { position: absolute; left: 40px; right: 40px; border-radius: var(--lg-r-platter); background: var(--lg-fill-regular); }
|
|
.cg-spec { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 12px; }
|
|
.cg-cap { font: 500 18px/1.2 var(--lg-font); color: var(--lg-text-2); white-space: nowrap; text-align: center; }
|
|
.cg-cap b { font-weight: 600; color: var(--lg-text-1); }
|
|
.cg-row { position: absolute; display: flex; align-items: center; }
|
|
.cg-mode { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 10px; border-radius: 13px; background: rgb(255 255 255 / .10);
|
|
font: 600 15px/1 var(--lg-font); color: var(--lg-text-2); white-space: nowrap; } /* annotation chip: which input mode a specimen shows */
|
|
|
|
/* ===================================================================== buttons (raised fill on glass) */
|
|
.lgk-btn:not(.plain):not(.primary):not(.play):not(.danger):not(.is-selected):not(.c-glassbtn) { background: var(--c-raised-bg); box-shadow: var(--c-raised-sh); }
|
|
.lgk-btn.primary, .lgk-btn.play, .lgk-btn.danger { box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .35), 0 3px 8px rgb(0 0 0 / .22); color: #fff; }
|
|
/* Play (green) and the destructive confirm (red): a dark label and glyph, 9.5:1 and 5.6:1 (white would be 2.0:1 and 3.4:1, CC §7) */
|
|
.lgk-btn.play, .lgk-btn.danger { color: var(--c-on-fill); }
|
|
.lgk-btn.danger { background: linear-gradient(180deg, rgb(255 255 255 / .16), rgb(255 255 255 / 0) 55%), rgb(255 66 69 / .92); }
|
|
.lgk-btn.danger-label { color: rgb(255 130 125); } /* >= 3:1 (large text) on text-bearing glass L 70-90; VP P-40 exception (>= 22 px Semibold) */
|
|
.lgk-btn.is-selected { box-shadow: 0 2px 6px rgb(0 0 0 / .22); }
|
|
.lgk-btn.is-disabled { opacity: .4; }
|
|
.lgk-btn.mini { --s: 38px; --is: 18px; }
|
|
.lgk-btn.sm { --is: 20px; }
|
|
.lgk-btn.lg.circle { --is: 30px; }
|
|
.lgk-btn.xl.circle { --is: 36px; }
|
|
.lgk-btn.capsule.lg { padding: 0 28px; }
|
|
.lgk-btn.capsule.xl { padding: 0 34px; }
|
|
.lgk-btn.play-80 { --s: 80px; width: 280px; font-size: 28px; padding: 0 40px; gap: 12px; } /* Play: 280 x 80 on game pages (PLAN §1.3) */
|
|
.lgk-btn .lgk-glyph { margin-right: -8px; }
|
|
/* a button floating in space (no glass behind it) is its own small glass: liquid, in-page blur 12 + saturate 1.7 (PLAN §1.6) */
|
|
.c-glassbtn { background: linear-gradient(180deg, rgb(255 255 255 / .16), rgb(255 255 255 / .04) 60%), rgb(90 92 100 / .22);
|
|
-webkit-backdrop-filter: blur(12px) saturate(1.7) brightness(.86); backdrop-filter: blur(12px) saturate(1.7) brightness(.86);
|
|
box-shadow: inset 0 0 6px -1px rgb(0 0 0 / .14), inset 0 -2px 4px -1px rgb(0 0 0 / .12), 0 8px 22px rgb(0 0 0 / .30); }
|
|
.c-glassbtn::before { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; padding: 1.5px;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; opacity: .8; }
|
|
|
|
/* controller glyph badges: gamepad mode only (VP P-26). A view in laser mode carries data-lgs-vr-mode="laser", as the live root does */
|
|
.lgk-view[data-lgs-vr-mode="laser"] .lgk-glyph:not(.keep) { display: none; }
|
|
|
|
/* ===================================================================== the light layer (hover, focus, press): PLAN §1.4
|
|
One pseudo-element per control (normally ::after), drawn ABOVE the control's fill and BELOW its label (VP P-10):
|
|
the host is its own stacking context and the layer sits at z-index -1. Values are composited as written
|
|
("+ white .28" = .28 white over the rest look), which is how VP D-2 computes the luma steps. */
|
|
:is(.lgk-btn, .lgk-row, .lgk-seg > *, .c-popup, .c-field, .c-opt, .c-seg2 > span) { isolation: isolate; }
|
|
:is(.lgk-btn, .lgk-row, .lgk-seg > *)::after { z-index: -1; mix-blend-mode: normal; }
|
|
.c-switch::after, .c-check::after, .c-popup::after, .c-field::after, .c-row::after, .c-key::after, .c-opt::after, .c-slider::after, .c-seg2 > span::after {
|
|
content: ""; position: absolute; inset: var(--lit-inset, 0); border-radius: inherit; pointer-events: none; opacity: 0;
|
|
background: radial-gradient(circle at var(--hx, 50%) var(--hy, 30%), rgb(255 255 255 / var(--spot, .12)) 0, rgb(255 255 255 / 0) var(--spot-r, 75%)),
|
|
rgb(255 255 255 / var(--lift, 0)); z-index: 2; }
|
|
:is(.c-popup, .c-field, .c-opt, .c-seg2 > span)::after { z-index: -1; }
|
|
.c-row::after { z-index: 0; } /* above the row's pill (tree order), below its content (z 1) */
|
|
.c-key::after { mix-blend-mode: plus-lighter; } /* keys: unchanged (C4b) */
|
|
|
|
/* generic state rules use :where() (low specificity), so every control-specific rule below overrides them.
|
|
laser hover: + white .08 and a light spot of .12 at the pointer, at once */
|
|
:where(.lgk-btn, .lgk-row, .lgk-seg > *, .c-switch, .c-check, .c-popup, .c-field, .c-row, .c-key, .c-opt, .c-slider, .c-seg2 > span).is-hover::after { opacity: 1; --lift: var(--c-hover); --spot: var(--c-spot-hover); }
|
|
/* navigation rows (rows that can carry the navigation selection: sidebars, selection lists, tab bars): the spot only (SM-D13, SET T-SEL) */
|
|
:is(.cg-nav .lgk-row, .lgk-row.nav, .c-row.nav).is-hover::after { --lift: 0; }
|
|
/* a check circle is small and dark: its hover spot is softer, so hover stays inside VP P-03 (+10..25 L) */
|
|
.c-check.is-hover::after { --spot: .07; }
|
|
/* gamepad focus: + white .28 uniform, a spot of .16 static in the upper third (VP P-09), the control's own arc x1.5 */
|
|
:where(.lgk-btn, .lgk-row, .lgk-seg > *, .c-switch, .c-check, .c-popup, .c-row, .c-opt, .c-slider, .c-seg2 > span).is-focus::after { opacity: 1; --lift: var(--c-focus); --spot: var(--c-spot-focus); --hx: 50%; --hy: 30%; }
|
|
/* text fields: the ring is the focus look (VP P-17); the fill adds only .08 so typed text keeps its contrast */
|
|
.c-field.is-focus::after { opacity: 1; --lift: .08; --spot: 0; }
|
|
.c-key.is-focus::after { opacity: 1; --lift: .14; --spot: .16; } /* keys: C4b's values (white .32 key + this layer) */
|
|
/* press: a glow from the hit point on `interactive`; glass controls also swell (kit: scale min(1.06, 1 + 6 / maxSide)) */
|
|
:where(.lgk-btn, .lgk-row, .c-switch, .c-check, .c-popup, .c-field, .c-row, .c-key, .c-opt, .c-slider, .c-seg2 > span).is-pressed::after { opacity: 1; --lift: .06; --spot: .22; --spot-r: 120%; }
|
|
/* focus arc: the control lifts into glass (its own specular arc, never a ring) */
|
|
:where(.c-switch, .c-popup, .c-row, .c-key, .c-opt, .c-slider, .c-seg2 > span).is-focus::before {
|
|
content: ""; position: absolute; inset: var(--lit-inset, 0); border-radius: inherit; pointer-events: none; padding: 1.5px; z-index: 3;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
/* focus on a white or coloured fill: white cannot get brighter, so an outer glow; the inner light is capped (+.04) */
|
|
:is(.lgk-btn.is-selected, .lgk-btn.primary, .lgk-btn.play, .lgk-btn.danger, .c-opt.is-selected).is-focus,
|
|
.c-popup.is-open.is-focus { box-shadow: 0 2px 6px rgb(0 0 0 / .22), var(--c-glow-on); }
|
|
:is(.lgk-btn.is-selected, .lgk-btn.primary, .lgk-btn.play, .lgk-btn.danger, .c-opt.is-selected).is-focus::after { --lift: .04; --spot: .04; }
|
|
:is(.lgk-btn.is-selected, .c-opt.is-selected).is-focus::after, :is(.lgk-btn.is-selected, .c-opt.is-selected).is-focus::before { opacity: 0; }
|
|
|
|
/* navigation selection: white .18 pill + a specular top arc + a Semibold label (PLAN §1.4) */
|
|
.lgk-row.is-nav-selected { background: rgb(255 255 255 / var(--c-nav)); font-weight: 600; }
|
|
.lgk-row.is-nav-selected:not(.is-focus)::before { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; padding: 1.5px;
|
|
background: var(--c-arc-sel); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
|
|
/* ===================================================================== switch (visionOS 51 x 31 pt ~ 66 x 40 px) */
|
|
.c-switch { position: relative; width: 66px; height: 40px; border-radius: 20px; flex: none; background: rgb(255 255 255 / .16);
|
|
box-shadow: inset 0 1px 3px rgb(0 0 0 / .22); }
|
|
.c-switch.on { background: linear-gradient(180deg, rgb(255 255 255 / .14), rgb(255 255 255 / 0) 60%), var(--lg-green); box-shadow: inset 0 1px 2px rgb(0 0 0 / .12); }
|
|
.c-switch > .knob { position: absolute; top: 3px; left: 3px; width: 34px; height: 34px; border-radius: 50%; background: #fff; z-index: 4;
|
|
box-shadow: 0 2px 5px rgb(0 0 0 / .30), 0 0 1px rgb(0 0 0 / .25); }
|
|
.c-switch.on > .knob { left: 29px; }
|
|
.c-switch.on.is-focus { box-shadow: inset 0 1px 2px rgb(0 0 0 / .12), var(--c-glow-on); }
|
|
.c-switch.on.is-focus::after { --lift: .04; --spot: .04; }
|
|
/* press: the knob lifts into clear glass (x1.3 wide, x1.2 high) on `interactive`, MO §4.15 */
|
|
.c-switch.is-pressed > .knob { width: 44px; height: 41px; top: -.5px; left: 22px; border-radius: 21px;
|
|
background: linear-gradient(180deg, rgb(255 255 255 / .45), rgb(255 255 255 / .18)); -webkit-backdrop-filter: blur(1.5px) saturate(1.8); backdrop-filter: blur(1.5px) saturate(1.8);
|
|
box-shadow: 0 3px 8px rgb(0 0 0 / .30), inset 0 0 4px rgb(255 255 255 / .35), inset 0 -2px 3px rgb(0 0 0 / .10); }
|
|
.c-switch.is-pressed > .knob::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1.5px; background: var(--c-arc);
|
|
-webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-switch.is-disabled { opacity: .4; }
|
|
|
|
/* ===================================================================== check circle (40 px, 80 px hit cell) */
|
|
.c-check { position: relative; width: 40px; height: 40px; border-radius: 50%; flex: none; background: rgb(0 0 0 / .22);
|
|
box-shadow: inset 0 0 0 2.5px rgb(255 255 255 / .34), inset 0 2px 4px rgb(0 0 0 / .30); } /* empty = the "circle" symbol in a shallow well */
|
|
.c-check.on { background: linear-gradient(180deg, rgb(255 255 255 / .16), rgb(255 255 255 / 0) 60%), var(--lg-blue);
|
|
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .35), 0 1px 3px rgb(0 0 0 / .25); display: grid; place-items: center; color: #fff; }
|
|
.c-check.on > .lgk-i { --is: 24px; stroke-width: 3; }
|
|
.c-check.is-disabled { opacity: .4; }
|
|
|
|
/* ===================================================================== capsule slider (64 px; value = white fill, glyph inside) */
|
|
.c-slider { position: relative; height: 64px; border-radius: 32px; background: var(--lg-fill-thick); box-shadow: var(--c-recess); --v: .5; }
|
|
.c-slider > .fill { position: absolute; left: 0; top: 0; bottom: 0; width: calc(64px + var(--v) * (100% - 64px)); border-radius: 32px;
|
|
background: linear-gradient(180deg, rgb(255 255 255 / .92), rgb(255 255 255 / .84)); box-shadow: 0 1px 3px rgb(0 0 0 / .18); }
|
|
.c-slider > .glyph { position: absolute; left: 19px; top: 19px; --is: 26px; color: #1b1c20; z-index: 3; }
|
|
/* the knob (Steam's SliderHandle, 64 via --slider-handle-width) shows on hover, focus or drag; its white disc is 58, inset 3 */
|
|
.c-slider > .knob { position: absolute; top: 3px; width: 58px; height: 58px; left: calc(3px + var(--v) * (100% - 64px)); border-radius: 50%; z-index: 4;
|
|
background: #fff; box-shadow: 0 2px 8px rgb(0 0 0 / .32), 0 0 0 .5px rgb(0 0 0 / .10); display: none; }
|
|
.c-slider:is(.is-hover, .is-focus, .is-drag, .stepped) > .knob { display: block; }
|
|
.c-slider.stepped > .fill { width: calc(32px + var(--v) * (100% - 64px)); } /* stepped: fill ends at the knob centre */
|
|
.c-slider.stepped > .knob { width: 50px; height: 50px; top: 7px; left: calc(7px + var(--v) * (100% - 64px)); box-shadow: 0 2px 8px rgb(0 0 0 / .38), 0 0 0 .5px rgb(0 0 0 / .12); }
|
|
.c-slider.is-drag > .knob { scale: 1.25; background: radial-gradient(circle at 50% 30%, rgb(255 255 255 / .30), rgb(255 255 255 / .04) 70%);
|
|
-webkit-backdrop-filter: blur(2px) saturate(1.8) brightness(.86); backdrop-filter: blur(2px) saturate(1.8) brightness(.86);
|
|
box-shadow: 0 6px 16px rgb(0 0 0 / .30), inset 0 0 8px rgb(0 0 0 / .16), inset 0 -3px 5px rgb(0 0 0 / .08); }
|
|
.c-slider.is-drag > .knob::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1.5px; background: var(--c-arc);
|
|
-webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-slider > .notches { position: absolute; left: 32px; right: 32px; top: 28px; height: 8px; z-index: 3; }
|
|
.c-slider > .notches > i { position: absolute; width: 8px; height: 8px; margin-left: -4px; border-radius: 50%; background: rgb(255 255 255 / .42); }
|
|
.c-slider > .notches > i.under { background: rgb(13 14 18 / .28); }
|
|
.c-val { font: 600 22px/1 var(--lg-font); color: var(--lg-text-2); font-variant-numeric: tabular-nums; }
|
|
.c-notchlabels { position: absolute; display: flex; font: 600 18px/1 var(--lg-font); color: var(--lg-text-2); }
|
|
.c-notchlabels > span { position: absolute; translate: -50% 0; white-space: nowrap; }
|
|
.c-notchlabels > span.on { color: var(--lg-text-1); }
|
|
|
|
/* ===================================================================== pop-up button (value + up/down chevrons) */
|
|
.c-popup { position: relative; display: inline-flex; align-items: center; gap: 14px; height: 60px; padding: 0 20px 0 24px; box-sizing: border-box;
|
|
border-radius: 30px; background: var(--c-raised-bg); box-shadow: var(--c-raised-sh); font: 500 22px/1 var(--lg-font); color: var(--lg-text-1); white-space: nowrap; }
|
|
.c-popup > .val { flex: 1; }
|
|
.c-popup > .lgk-i { --is: 22px; color: var(--lg-text-2); }
|
|
.c-popup.is-open { background: var(--lg-fill-selected); color: var(--lg-text-on-selected); box-shadow: 0 2px 6px rgb(0 0 0 / .22); }
|
|
.c-popup.is-open > .lgk-i { color: rgb(13 14 18 / .6); }
|
|
.c-popup.rich { height: 76px; border-radius: 30px; }
|
|
.c-popup.rich .t2 { display: block; font: 500 18px/1.2 var(--lg-font); color: var(--lg-text-2); margin-top: 4px; }
|
|
.c-popup.rich.is-open .t2 { color: rgb(13 14 18 / .62); }
|
|
|
|
/* ===================================================================== segmented (legacy kit form; boards use .c-seg2 below) */
|
|
.lgk-seg > .is-lift { background: linear-gradient(180deg, rgb(255 255 255 / .42), rgb(255 255 255 / .18)) !important; color: var(--lg-text-1) !important;
|
|
scale: 1.06 1.12; -webkit-backdrop-filter: blur(1.5px) saturate(1.8); backdrop-filter: blur(1.5px) saturate(1.8);
|
|
box-shadow: 0 4px 12px rgb(0 0 0 / .28), inset 0 0 6px rgb(255 255 255 / .30); }
|
|
.lgk-seg > .is-lift::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1.5px; background: var(--c-arc);
|
|
-webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.lgk-seg > .ghost { color: var(--lg-text-on-selected); }
|
|
.lgk-seg.c-seg { height: 64px; }
|
|
.lgk-seg.c-seg > * { min-width: 140px; box-sizing: border-box; }
|
|
.lgk-seg > .is-selected.is-focus { box-shadow: 0 2px 6px rgb(0 0 0 / .22), var(--c-glow-on); }
|
|
|
|
/* option circles (SteamVR refresh rate: circular segments, selected = white) */
|
|
.c-opt { position: relative; display: grid; place-items: center; width: 64px; height: 64px; border-radius: 50%; flex: none;
|
|
background: var(--c-raised-bg); box-shadow: var(--c-raised-sh); font: 600 22px/1 var(--lg-font); font-variant-numeric: tabular-nums; }
|
|
.c-opt.is-selected { box-shadow: 0 2px 6px rgb(0 0 0 / .22); }
|
|
|
|
/* ===================================================================== text field (64 px recessed capsule) */
|
|
.c-field { position: relative; display: flex; align-items: center; gap: 14px; height: 64px; padding: 0 12px 0 24px; box-sizing: border-box;
|
|
border-radius: 32px; background: var(--lg-fill-thick); box-shadow: var(--c-recess); font: 500 24px/1 var(--lg-font); color: var(--lg-text-1); white-space: nowrap; }
|
|
.c-field > .lead { --is: 26px; color: rgb(255 255 255 / .62); margin-left: -2px; }
|
|
.c-field > .txt { flex: 1; overflow: hidden; display: flex; align-items: center; }
|
|
.c-field .ph { color: rgb(255 255 255 / .55); }
|
|
.c-field .txt.ph { display: block; text-overflow: ellipsis; }
|
|
.c-field .caret { display: inline-block; width: 2.5px; height: 30px; border-radius: 2px; background: var(--lg-blue); margin: 0 1px; flex: none; }
|
|
.c-field .sel { background: rgb(0 145 255 / .45); border-radius: 3px; }
|
|
.c-field > .clear { position: relative; display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; flex: none;
|
|
background: rgb(255 255 255 / .26); color: rgb(20 21 26 / .85); margin-right: 1px; }
|
|
.c-field > .clear > .lgk-i { --is: 18px; stroke-width: 2.8; }
|
|
.c-field.is-focus { box-shadow: var(--c-recess), 0 0 0 3px rgb(255 255 255 / .55), 0 0 16px rgb(255 255 255 / .22); }
|
|
.c-field.is-error { background: rgb(255 66 69 / .22); }
|
|
.c-field.multi { height: auto; min-height: 64px; align-items: flex-start; padding-top: 18px; padding-bottom: 18px; border-radius: 30px; white-space: normal; line-height: 1.3; }
|
|
.c-fieldlabel { font: 600 20px/1 var(--lg-font); color: var(--lg-text-2); }
|
|
.c-fieldnote { font: 500 18px/1.3 var(--lg-font); color: var(--lg-text-2); }
|
|
.c-fieldnote.err { color: rgb(255 255 255 / .86); display: flex; align-items: center; gap: 8px; }
|
|
.c-fieldnote.err .lgk-i { --is: 20px; color: var(--lg-red); stroke-width: 2.4; }
|
|
|
|
/* ===================================================================== list rows: contiguous 80 px rows, pill inset 6 */
|
|
.c-list { position: absolute; border-radius: var(--lg-r-platter); background: var(--lg-fill-regular); padding: 0; }
|
|
.c-row { position: relative; display: flex; align-items: center; gap: 18px; height: 80px; padding: 0 26px; box-sizing: border-box;
|
|
font: 500 24px/1.2 var(--lg-font); color: var(--lg-text-1); --lit-inset: 6px; border-radius: 30px; }
|
|
.c-row::after, .c-row::before { border-radius: 24px; }
|
|
.c-row.tall { height: 100px; }
|
|
.c-row .chip { display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; color: #fff; --is: 22px; flex: none;
|
|
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .35), 0 1px 2px rgb(0 0 0 / .18); }
|
|
.c-row .two { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
|
|
.c-row .two .sub { font: 500 20px/1.2 var(--lg-font); color: var(--lg-text-2); white-space: nowrap; }
|
|
.c-row .trail { margin-left: auto; display: flex; align-items: center; gap: 10px; color: var(--lg-text-2); font: 500 22px/1 var(--lg-font); --is: 22px; white-space: nowrap; }
|
|
.c-row .trail .lgk-i.chev { --is: 20px; color: var(--lg-text-3); stroke-width: 2.6; }
|
|
.c-row .trail .chk { color: var(--lg-blue); --is: 26px; stroke-width: 3; }
|
|
.c-row > .pill { position: absolute; inset: 6px; border-radius: 24px; background: var(--lift-bg, transparent); z-index: 0; }
|
|
.c-row > :not(.pill) { position: relative; z-index: 1; }
|
|
/* navigation selection on a row: .18 pill + top arc + Semibold */
|
|
.c-row.nav-sel { font-weight: 600; }
|
|
.c-row.nav-sel > .pill { background: rgb(255 255 255 / var(--c-nav)); }
|
|
.c-row.nav-sel:not(.is-focus)::before { content: ""; position: absolute; inset: var(--lit-inset, 0); pointer-events: none; padding: 1.5px; z-index: 0;
|
|
background: var(--c-arc-sel); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-row.danger { color: rgb(255 130 125); font-weight: 600; }
|
|
.c-row.danger.is-focus > .pill { background: linear-gradient(180deg, rgb(255 255 255 / .14), rgb(255 255 255 / 0) 60%), rgb(255 66 69 / .92); box-shadow: var(--c-glow-on); }
|
|
.c-row.danger.is-focus { color: var(--c-on-fill); }
|
|
.c-row.danger.is-focus::after { --lift: .04; --spot: .04; }
|
|
.c-row.is-disabled { opacity: .4; }
|
|
.c-sep { position: absolute; height: 2px; background: rgb(255 255 255 / .08); border-radius: 1px; }
|
|
|
|
/* ===================================================================== tooltips: a thick-glass capsule 48 px, 20 px Semibold (PLAN §1.13; the layer is P3's) */
|
|
.c-tip { display: inline-flex; align-items: center; height: 48px; padding: 0 20px; box-sizing: border-box; font: 600 20px/1 var(--lg-font); white-space: nowrap; --r: 24px; }
|
|
|
|
/* ===================================================================== keyboard (C4b's look; kept unchanged)
|
|
Steam keyboard quad 854 x 280 kb px; authored in kb px.
|
|
Geometry is Steam's: 5 rows of 47.6 px hit areas from y 41 (the key block moved down into the 41 px band, SQ4),
|
|
visible key = hit area inset ~2 px, radius 11 (concentric with the 30 px platter at a 6 px inset + gaps). */
|
|
.kb { position: relative; width: 854px; height: 280px; }
|
|
.kb-plat { position: absolute; left: 0; top: 0; width: 854px; height: 280px; --r: 30px; }
|
|
.kb-echo { position: absolute; left: 8px; right: 8px; top: 5px; height: 33px; border-radius: 17px; background: rgb(0 0 0 / .30); box-shadow: var(--c-recess);
|
|
display: flex; align-items: center; gap: 12px; padding: 0 16px; box-sizing: border-box; white-space: nowrap; z-index: 2; }
|
|
.kb-echo .lbl { font: 600 15px/1 var(--lg-font); color: var(--lg-text-2); flex: none; display: flex; align-items: center; gap: 6px; --is: 15px; }
|
|
.kb-echo .txt { font: 500 19px/1 var(--lg-font); color: var(--lg-text-1); display: flex; align-items: center; }
|
|
.kb-echo .txt .ph { color: rgb(255 255 255 / .55); }
|
|
.kb-echo .caret { display: inline-block; width: 2px; height: 21px; border-radius: 1px; background: var(--lg-blue); margin-left: 1px; }
|
|
.kb-keys { position: absolute; left: 6px; right: 6px; top: 44px; display: flex; flex-direction: column; gap: 5.5px; z-index: 2; }
|
|
.kb-row { display: flex; gap: 4px; height: 42px; }
|
|
.c-key { position: relative; flex: 1 1 0; min-width: 0; height: 42px; border-radius: 11px; display: grid; place-items: center;
|
|
background: linear-gradient(180deg, rgb(255 255 255 / .07), rgb(255 255 255 / 0) 60%), rgb(255 255 255 / .15);
|
|
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .24), 0 2px 3px rgb(0 0 0 / .22);
|
|
font: 500 20px/1 var(--lg-font); color: var(--lg-text-1); --is: 20px; }
|
|
.c-key.mod { background: linear-gradient(180deg, rgb(255 255 255 / .05), rgb(255 255 255 / 0) 60%), rgb(255 255 255 / .075); font: 600 15px/1 var(--lg-font); }
|
|
.c-key.space { background: linear-gradient(180deg, rgb(255 255 255 / .07), rgb(255 255 255 / 0) 60%), rgb(255 255 255 / .15); }
|
|
.c-key .sh { position: absolute; left: 8px; top: 5px; font: 500 15px/1 var(--lg-font); color: rgb(255 255 255 / .60); }
|
|
.c-key.num > span:not(.sh):not(.glyphbadge) { margin-top: 12px; }
|
|
.c-key.enter { background: linear-gradient(180deg, rgb(255 255 255 / .18), rgb(255 255 255 / 0) 60%), var(--lg-tint-primary); color: #fff; font: 600 17px/1 var(--lg-font);
|
|
box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .38), 0 2px 4px rgb(0 0 0 / .25); }
|
|
.c-key.on, .c-key.is-pressed { background: var(--lg-fill-selected); color: var(--lg-text-on-selected); }
|
|
.c-key.on .sh, .c-key.is-pressed .sh { color: rgb(13 14 18 / .55); }
|
|
.c-key.is-pressed { box-shadow: 0 0 16px 2px rgb(255 255 255 / .30), 0 2px 3px rgb(0 0 0 / .22); }
|
|
.c-key.is-hover, .c-key.is-focus { background: linear-gradient(180deg, rgb(255 255 255 / .12), rgb(255 255 255 / 0) 60%), rgb(255 255 255 / .32); }
|
|
.c-key .glyphbadge { position: absolute; right: 5px; top: 5px; display: grid; place-items: center; width: 22px; height: 22px; border-radius: 11px;
|
|
background: rgb(255 255 255 / .22); font: 700 13.5px/1 var(--lg-font); color: #fff; }
|
|
.c-key.enter { display: flex; justify-content: center; align-items: center; gap: 8px; }
|
|
.c-key.enter .glyphbadge { background: rgb(255 255 255 / .30); }
|
|
.c-key .glyphbadge.inline { position: static; }
|
|
.c-key.on .glyphbadge { background: rgb(13 14 18 / .14); color: var(--lg-text-on-selected); }
|
|
/* long-press accent bubble: a menu bubble on the platter (fill, not glass: it lives inside the keyboard quad) */
|
|
.kb-accents { position: absolute; display: flex; gap: 4px; padding: 6px; border-radius: 17px; z-index: 5;
|
|
background: linear-gradient(180deg, rgb(255 255 255 / .10), rgb(255 255 255 / 0) 50%), rgb(44 46 54 / .96); box-shadow: 0 6px 18px rgb(0 0 0 / .45); }
|
|
.kb-accents .c-key { flex: none; width: 48px; }
|
|
|
|
/* ===================================================================== storyboard frames (motion page) */
|
|
.sb-frame { position: absolute; display: flex; flex-direction: column; align-items: center; gap: 14px; }
|
|
.sb-time { font: 600 18px/1 var(--lg-font); color: var(--lg-text-2); font-variant-numeric: tabular-nums; }
|
|
.sb-time b { color: var(--lg-text-1); font-weight: 600; }
|
|
.sb-arrow { position: absolute; color: var(--lg-text-3); --is: 22px; }
|
|
|
|
/* partial states for storyboards: the light layer at a fraction of its final contrast (eased values from D2 §11.3) */
|
|
.f93::after, .f93::before { opacity: .93 !important; }
|
|
.f60::after, .f60::before { opacity: .6 !important; }
|
|
.f36::after, .f36::before { opacity: .36 !important; }
|
|
.f35::after, .f35::before { opacity: .35 !important; }
|
|
.f30::after, .f30::before { opacity: .3 !important; }
|
|
.lgk-glass.c-tip.mat50 { scale: 1.12; background: rgb(60 62 70 / .06) !important; -webkit-backdrop-filter: blur(6px) saturate(1.2) !important; backdrop-filter: blur(6px) saturate(1.2) !important; box-shadow: none; }
|
|
.lgk-glass.c-tip.mat50::before { opacity: .45; }
|
|
.lgk-glass.c-tip.mat50 > * { opacity: 0; }
|
|
.lgk-glass.c-tip.mat90 { scale: 1.02; }
|
|
.lgk-glass.c-tip.mat90 > * { opacity: .55; filter: blur(2px); }
|
|
|
|
/* notes beside a mockup (outside the scene: annotation, not product UI) */
|
|
.c-note { position: absolute; z-index: 60; max-width: 300px; padding: 14px 18px; border-radius: 16px; background: rgb(12 13 16 / .80);
|
|
font: 500 18px/1.35 var(--lg-font); color: rgb(255 255 255 / .86); box-shadow: 0 6px 20px rgb(0 0 0 / .35); }
|
|
.c-note b { color: #fff; font-weight: 600; }
|
|
.c-note .k { color: #ffd65c; font-weight: 600; }
|
|
|
|
/* ===================================================================== focus inside rows (controls.md §4.3, C-D14)
|
|
Steam focuses the control; the row gets .gpfocuswithin.
|
|
Single-control row: the row carries the focus (pill + white .28 + spot + arc) and the control is "lifted".
|
|
Multi-control row (check matrix, toggle pairs): the row warms (white .06); the focused control carries the focus. */
|
|
.c-row.is-within::after { opacity: 1; --lift: var(--c-focus); --spot: var(--c-spot-focus); --hx: 50%; --hy: 30%; }
|
|
.c-row.is-within::before { content: ""; position: absolute; inset: var(--lit-inset, 0); border-radius: 24px; pointer-events: none; padding: 1.5px; z-index: 3;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-row.is-within-multi > .pill { background: rgb(255 255 255 / .06); }
|
|
/* the control inside a focused single-control row: lifted (its own arc) plus a soft glow on its white knob, + .10 light on the track */
|
|
.c-switch.is-lifted > .knob { box-shadow: 0 2px 5px rgb(0 0 0 / .30), 0 0 14px 3px rgb(255 255 255 / .42); }
|
|
.c-switch.is-lifted::after { opacity: 1; --lift: .10; --spot: 0; }
|
|
.c-switch.is-lifted::before, .c-popup.is-lifted::before { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; padding: 1.5px; z-index: 3;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-popup.is-lifted::after { opacity: 1; --lift: .10; --spot: .12; }
|
|
/* focus on a check circle in a multi-control row: Steam's FocusRing as a light plate 12 px larger than the circle */
|
|
.c-check.is-focus::after { inset: -12px; border-radius: 50%; opacity: 1; --lift: 0;
|
|
background: radial-gradient(circle, rgb(255 255 255 / .40) 0, rgb(255 255 255 / .26) 42%, rgb(255 255 255 / 0) 72%); }
|
|
/* a 40 px check circle: the token's blur and alpha with a 12 px spread (8 + 4), so the fixed 8-16 px band of P-16 still gets +20 L around a small circle (22px 8px measured +17.2 L, 22px 12px +27.4 L on the state board) */
|
|
.c-check.on.is-focus { box-shadow: inset 0 1.5px 1.5px -1px rgb(255 255 255 / .35), 0 0 22px 12px rgb(255 255 255 / .55); }
|
|
.c-check.on.is-focus::after { opacity: 0; } /* a blue (on) fill: the glow carries the focus; no light washes the blue */
|
|
|
|
/* disabled + focused: never opacity on the element (it would dim the focus light too). Content 40 %, fill white .10, arc at 60 %, no spot */
|
|
.c-row.is-disabled { opacity: 1; }
|
|
.c-row.is-disabled > :not(.pill) { opacity: .4; }
|
|
.c-row.is-disabled.is-focus > .pill { background: rgb(255 255 255 / .10); }
|
|
.c-row.is-disabled.is-focus::after { opacity: 0; }
|
|
.c-row.is-disabled.is-focus::before { content: ""; position: absolute; inset: var(--lit-inset, 0); border-radius: 24px; pointer-events: none; padding: 1.5px; z-index: 3; opacity: .6;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.lgk-btn.is-disabled.is-focus { opacity: 1; color: rgb(255 255 255 / .40); background: linear-gradient(180deg, rgb(255 255 255 / .07), rgb(255 255 255 / 0) 55%), rgb(255 255 255 / .10) !important; }
|
|
.lgk-btn.is-disabled.is-focus::after { opacity: 0; }
|
|
.lgk-btn.is-disabled.is-focus::before { opacity: .6; }
|
|
.c-switch.dis-soft { opacity: 1; background: rgb(255 255 255 / .07); box-shadow: none; }
|
|
.c-switch.dis-soft > .knob { background: rgb(255 255 255 / .42); box-shadow: none; }
|
|
|
|
/* slider at value 0: no white at all (fill opacity from v); an inert glyph turns white on the dark track */
|
|
.c-slider > .fill { opacity: clamp(0, calc(var(--v) * 40), 1); }
|
|
.c-slider > .glyph { color: rgb(calc(255 - 228 * clamp(0, var(--v) * 40, 1)) calc(255 - 227 * clamp(0, var(--v) * 40, 1)) calc(255 - 223 * clamp(0, var(--v) * 40, 1)) / calc(.72 + .28 * clamp(0, var(--v) * 40, 1))); }
|
|
/* slider with Steam's clickable mute icon: a separate glyph zone at the capsule's leading end, before the track, never under the knob.
|
|
Sound on: the white fill starts under the zone, so the glyph sits dark inside the fill (VP P-69); at level 0 there is no white at
|
|
all and the glyph is white on the dark track. Muted: the zone is white (the toggle's "on" fill) with the slashed glyph and the
|
|
level fill after it dims to .24, so 0, muted and "some volume" read three different ways (controls.md §7.2, C-D13). */
|
|
.c-slider.mz > .zone { position: absolute; left: 0; top: 0; width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center; z-index: 3;
|
|
--is: 26px; color: rgb(calc(255 - 228 * clamp(0, var(--v) * 40, 1)) calc(255 - 227 * clamp(0, var(--v) * 40, 1)) calc(255 - 223 * clamp(0, var(--v) * 40, 1)) / calc(.72 + .28 * clamp(0, var(--v) * 40, 1))); }
|
|
.c-slider.mz > .fill { left: 0; width: calc(128px + var(--v) * (100% - 128px)); }
|
|
.c-slider.mz.muted > .zone { background: rgb(255 255 255 / .94); color: #1b1c20; box-shadow: 0 1px 3px rgb(0 0 0 / .22); }
|
|
.c-slider.mz.muted > .fill { left: 64px; width: calc(64px + var(--v) * (100% - 128px)); background: rgb(255 255 255 / .24); box-shadow: none; }
|
|
.c-slider.mz > .knob { left: calc(67px + var(--v) * (100% - 128px)); }
|
|
/* Steam's default-value tick (kept): a small marker above the capsule at the default value */
|
|
.c-slider > .dtick { position: absolute; top: -13px; width: 0; height: 0; left: calc(32px + var(--d) * (100% - 64px)); z-index: 5; }
|
|
.c-slider > .dtick::before { content: ""; position: absolute; left: -6px; top: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 7px solid rgb(255 255 255 / .72); }
|
|
.c-slider.mz > .dtick { left: calc(96px + var(--d) * (100% - 128px)); }
|
|
|
|
/* popup-scale variants (bar popups at m 0.83: 1 popup px = 1.2 main px; authored in popup px) */
|
|
.qp .c-slider { height: 54px; border-radius: 27px; }
|
|
.qp .c-slider > .fill { border-radius: 27px; width: calc(54px + var(--v) * (100% - 54px)); }
|
|
.qp .c-slider > .glyph { left: 15px; top: 15px; --is: 24px; }
|
|
.qp .c-slider > .knob { width: 48px; height: 48px; left: calc(3px + var(--v) * (100% - 54px)); }
|
|
.qp .c-slider.stepped > .fill { width: calc(27px + var(--v) * (100% - 54px)); }
|
|
.qp .c-slider.stepped > .knob { width: 42px; height: 42px; top: 6px; left: calc(6px + var(--v) * (100% - 54px)); }
|
|
.qp .c-slider > .notches { left: 27px; right: 27px; top: 23px; }
|
|
.qp .c-slider > .dtick { left: calc(27px + var(--d) * (100% - 54px)); }
|
|
.qp .c-slider.mz > .zone { width: 54px; height: 54px; --is: 22px; }
|
|
.qp .c-slider.mz > .fill { left: 0; width: calc(108px + var(--v) * (100% - 108px)); }
|
|
.qp .c-slider.mz.muted > .fill { left: 54px; width: calc(54px + var(--v) * (100% - 108px)); }
|
|
.qp .c-slider.mz > .knob { left: calc(57px + var(--v) * (100% - 108px)); }
|
|
|
|
/* the keyboard echo for secret fields: dots, never characters (C4b) */
|
|
.kb-echo .dots { letter-spacing: .18em; font: 700 19px/1 var(--lg-font); color: var(--lg-text-1); }
|
|
|
|
/* ===================================================================== value menus (the slab is C1c's; these boards show the vocabulary's rules)
|
|
Header row 40 px (22 px Bold text-2), rows 72 px 6 px apart, Steam's Cancel as a 56 px quiet capsule (PLAN §1.12). */
|
|
.lgk-menu.c-menu .hdr { height: 40px; padding: 0 20px; }
|
|
/* the current value: a check in the row's leading 28 px slot, which every row of a value menu reserves so labels align; no fill
|
|
(C1c's menu rule, the same as visionOS menus; PLAN §1.12 "the current value checked") */
|
|
.lgk-menu.c-menu .lgk-row { padding: 0 22px 0 16px; gap: 16px; }
|
|
.lgk-menu.c-menu .lgk-row .lead { color: var(--lg-text-1); }
|
|
.lgk-menu.c-menu .lgk-row .lead .lgk-i { stroke-width: 3; }
|
|
.c-cancel { align-self: center; flex: none; height: 56px; padding: 0 44px; margin-top: 6px; border-radius: 28px; display: inline-flex; align-items: center; box-sizing: border-box;
|
|
background: rgb(255 255 255 / .08); font: 500 22px/1 var(--lg-font); color: var(--lg-text-2); }
|
|
/* long value lists (>= 15 options off settings routes; the fallback of the settings list page): one scrolling column of two-line rows
|
|
in a slab capped at the modal box (520 tall) */
|
|
.c-vmenu { padding: 8px; box-sizing: border-box; display: flex; flex-direction: column; gap: 6px; }
|
|
.c-vmenu .hdr { height: 40px; display: flex; align-items: center; padding: 0 18px; font: 700 22px/1 var(--lg-font); color: var(--lg-text-2); flex: none; }
|
|
.c-vmenu .scr { position: relative; flex: 1; overflow: hidden;
|
|
-webkit-mask-image: linear-gradient(180deg, transparent 0, #000 24px, #000 calc(100% - 24px), transparent 100%);
|
|
mask-image: linear-gradient(180deg, transparent 0, #000 24px, #000 calc(100% - 24px), transparent 100%); }
|
|
.c-vmenu .scr > .in { position: absolute; left: 0; right: 0; display: flex; flex-direction: column; gap: 6px; }
|
|
.c-vmenu .vr { position: relative; display: flex; align-items: center; gap: 16px; height: 100px; padding: 0 20px 0 16px; border-radius: 24px; flex: none; box-sizing: border-box; isolation: isolate; }
|
|
.c-vmenu .vr .lead { width: 28px; flex: none; display: grid; place-items: center; --is: 24px; color: var(--lg-text-1); }
|
|
.c-vmenu .vr .lead .lgk-i { stroke-width: 3; }
|
|
.c-vmenu .vr .two { display: flex; flex-direction: column; gap: 6px; min-width: 0; flex: 1; }
|
|
.c-vmenu .vr .t { font: 500 24px/1.15 var(--lg-font); color: var(--lg-text-1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
.c-vmenu .vr .s { font: 500 20px/1.2 var(--lg-font); color: var(--lg-text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
|
|
.c-vmenu .vr .chk { --is: 26px; color: var(--lg-text-1); stroke-width: 3; flex: none; }
|
|
.c-vmenu .vr.is-focus { background: rgb(255 255 255 / var(--c-focus)); }
|
|
.c-vmenu .vr.is-focus::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: -1;
|
|
background: radial-gradient(circle at 50% 30%, rgb(255 255 255 / .16) 0, rgb(255 255 255 / 0) 75%); }
|
|
.c-vmenu .vr.is-focus::before { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; padding: 1.5px;
|
|
background: var(--c-arc); -webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
.c-vmenu .cancel { align-self: center; flex: none; height: 56px; padding: 0 44px; border-radius: 28px; display: inline-flex; align-items: center;
|
|
background: rgb(255 255 255 / .08); font: 500 22px/1 var(--lg-font); color: var(--lg-text-2); }
|
|
/* the position rail: a <= 8 px capsule on the trailing edge, shown only while the list scrolls (VP P-72) */
|
|
.c-vmenu .rail { position: absolute; right: 3px; width: 5px; border-radius: 3px; background: rgb(255 255 255 / .30); }
|
|
|
|
/* ===================================================================== segmented control: contiguous hit areas (E-SEG)
|
|
Track 64, padding 2: each segment is its full share of the track (60 tall, >= 140 wide, 120 compact), no dead gap;
|
|
the visible fill is inset 2 px, so 4 px of track show between fills. The selected pill is white and travels on `snappy`. */
|
|
.c-seg2 { display: inline-flex; padding: 2px; height: 64px; box-sizing: border-box; border-radius: 32px; background: var(--lg-fill-thick); box-shadow: var(--c-recess); }
|
|
/* the segment is the hit area (60 tall); its label box <b> fills it inset 2 px and sets its width, so a long label widens its
|
|
segment (one line, never wrapped) instead of breaking: "Great on Frame" stays one line */
|
|
.c-seg2 > span { position: relative; display: flex; min-width: 140px; padding: 2px; box-sizing: border-box; border-radius: 30px;
|
|
font: 600 22px/1 var(--lg-font); color: var(--lg-text-1); --lit-inset: 2px; white-space: nowrap; }
|
|
.c-seg2.compact > span { min-width: 120px; }
|
|
.c-seg2 > span > b { position: relative; flex: 1; padding: 0 22px; border-radius: 28px; font-weight: 600; display: grid; place-items: center; z-index: 1; }
|
|
.c-seg2.compact > span > b { padding: 0 16px; }
|
|
.c-seg2 > span::after, .c-seg2 > span::before { border-radius: 28px; }
|
|
.c-seg2 > span.on > b { background: var(--lg-fill-selected); color: var(--lg-text-on-selected); box-shadow: 0 2px 6px rgb(0 0 0 / .22); }
|
|
.c-seg2 > span.on.is-focus > b { box-shadow: 0 2px 6px rgb(0 0 0 / .22), var(--c-glow-on); }
|
|
.c-seg2 > span.on.is-focus::after, .c-seg2 > span.on.is-focus::before { opacity: 0; }
|
|
/* the pill while it travels: lifted into clear glass for its first 180 ms, label colours swap at t90 (MO §4.5) */
|
|
.c-seg2 > span.lift > b { background: linear-gradient(180deg, rgb(255 255 255 / .42), rgb(255 255 255 / .18)); color: var(--lg-text-1);
|
|
scale: 1.06 1.12; -webkit-backdrop-filter: blur(1.5px) saturate(1.8); backdrop-filter: blur(1.5px) saturate(1.8);
|
|
box-shadow: 0 4px 12px rgb(0 0 0 / .28), inset 0 0 6px rgb(255 255 255 / .30); }
|
|
.c-seg2 > span.lift > b::before { content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1.5px; background: var(--c-arc);
|
|
-webkit-mask: var(--c-ring-mask); -webkit-mask-composite: xor; mask-composite: exclude; }
|
|
|
|
/* annotation overlays (not product UI): hit regions and dimension labels */
|
|
.c-dim { position: absolute; z-index: 61; font: 600 15px/1 ui-monospace, Consolas, monospace; color: #ffd65c; white-space: nowrap; text-shadow: 0 1px 2px #000; }
|
|
.c-hit { position: absolute; z-index: 59; border-radius: 6px; pointer-events: none;
|
|
background: repeating-linear-gradient(135deg, rgb(255 214 92 / .16) 0 6px, rgb(255 214 92 / .04) 6px 12px); box-shadow: inset 0 0 0 1.5px rgb(255 214 92 / .75); }
|