@mkbabb/glass-ui 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/{CommandShortcut-_INFUMu6.js → CommandShortcut-BNDzfFnB.js} +2 -2
  4. package/dist/{ContextMenuSubContent-DCkweFW9.js → ContextMenuSubContent-DLEyeqbh.js} +3 -3
  5. package/dist/{DialogContent-CmCijgX9.js → DialogContent-DSo7PKlU.js} +1 -1
  6. package/dist/{DialogFooter-DRdaCok0.js → DialogFooter-D5KY6sCX.js} +1 -1
  7. package/dist/{Notification-DrI1DT2v.js → Notification-D97JO0fK.js} +2 -2
  8. package/dist/{SelectScrollDownButton-yu8EYUnu.js → SelectScrollDownButton-BwTexKeY.js} +2 -2
  9. package/dist/{Toaster-DY8_jtHv.js → Toaster-CY8gJu9E.js} +69 -58
  10. package/dist/animated-digit.js +1 -1
  11. package/dist/aurora.js +100 -87
  12. package/dist/carousel.js +4 -4
  13. package/dist/{check-dwgetki8.js → check-Nuw7H9Yh.js} +1 -1
  14. package/dist/{chevron-down-DILQA1t6.js → chevron-down-Du2b9vY_.js} +1 -1
  15. package/dist/{chevron-right-fS7fal2t.js → chevron-right-CtDxpE3w.js} +1 -1
  16. package/dist/{chevron-up-BtYjYQOS.js → chevron-up-CenYokvI.js} +1 -1
  17. package/dist/command.js +1 -1
  18. package/dist/components/custom/aurora/composables/runtime.d.ts +24 -1
  19. package/dist/components/custom/sortable-list/SortableHandle.vue.d.ts +1 -1
  20. package/dist/components/custom/toggle-chip/ToggleChip.vue.d.ts +6 -4
  21. package/dist/components/custom/typewriter/TypewriterText.vue.d.ts +1 -1
  22. package/dist/components/ui/drawer/Drawer.vue.d.ts +25 -2
  23. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +12 -1
  24. package/dist/components/ui/drawer/index.d.ts +9 -0
  25. package/dist/components/ui/toast/Toaster.vue.d.ts +7 -1
  26. package/dist/components/ui/toast/index.d.ts +1 -0
  27. package/dist/components/ui/toast/use-toast.d.ts +14 -1
  28. package/dist/composables/dark/index.d.ts +1 -0
  29. package/dist/composables/dom/index.d.ts +1 -0
  30. package/dist/composables/dom/useIdleReady.d.ts +63 -0
  31. package/dist/composables/index.d.ts +1 -0
  32. package/dist/composables/motion/core/index.d.ts +6 -0
  33. package/dist/composables/motion/index.d.ts +0 -7
  34. package/dist/configurator.js +1 -1
  35. package/dist/confirm-dialog.js +1 -1
  36. package/dist/constants-D-8FN28s.js +13 -0
  37. package/dist/context-menu.js +1 -1
  38. package/dist/{createLucideIcon-Bn9a1b70.js → createLucideIcon-rHu18UQW.js} +2 -2
  39. package/dist/dark.d.ts +1 -1
  40. package/dist/dark.js +12 -1
  41. package/dist/dialog.js +2 -2
  42. package/dist/dock.js +1 -1
  43. package/dist/dom.js +2 -2
  44. package/dist/{dropdown-menu-2K-SGkZU.js → dropdown-menu-gHSkffW7.js} +2 -2
  45. package/dist/dropdown-menu.js +1 -1
  46. package/dist/expandable-container.js +2 -2
  47. package/dist/forms.js +2 -2
  48. package/dist/glass-ui.css +1 -1
  49. package/dist/glass-ui.js +139 -115
  50. package/dist/icon-tooltip.js +1 -1
  51. package/dist/keyboard.js +1 -1
  52. package/dist/labeled-field.js +3 -3
  53. package/dist/{minimize-2-LsCJ_eNt.js → minimize-2-C_oyKVwZ.js} +1 -1
  54. package/dist/motion-core.d.ts +1 -0
  55. package/dist/motion-core.js +192 -0
  56. package/dist/motion.js +25 -227
  57. package/dist/notification.js +1 -1
  58. package/dist/responsive-tabs.js +1 -1
  59. package/dist/{search-ocd8tmL9.js → search-7XEx_6hq.js} +1 -1
  60. package/dist/search.js +4 -4
  61. package/dist/select.js +1 -1
  62. package/dist/{sheet-CLVkb3AO.js → sheet-BsBdO5jq.js} +1 -1
  63. package/dist/sheet.js +1 -1
  64. package/dist/sortable-list.js +6 -3
  65. package/dist/status-dot.js +16 -13
  66. package/dist/styles/dock.css +72 -95
  67. package/dist/styles/drawer.css +138 -0
  68. package/dist/styles/index.css +18 -2
  69. package/dist/styles/instrument-chassis.css +28 -1
  70. package/dist/styles/theme.css +3 -0
  71. package/dist/styles/tokens.css +109 -266
  72. package/dist/styles/typography.css +44 -131
  73. package/dist/styles/utilities.css +23 -58
  74. package/dist/toast.js +1 -1
  75. package/dist/{useAnimatedNumber-DcvTR9B4.js → useAnimatedNumber-2l13GibX.js} +9 -20
  76. package/dist/{useConfiguratorState-BlaevW0S.js → useConfiguratorState-BpZi8QJu.js} +5 -5
  77. package/dist/{useBreakpoint-BHlX-MhR.js → useIdleReady-DlzJicQH.js} +29 -1
  78. package/dist/{x-cdWAmO-q.js → x-Cb3NE2Ne.js} +1 -1
  79. package/package.json +12 -5
  80. package/src/styles/dock.css +72 -95
  81. package/src/styles/drawer.css +138 -0
  82. package/src/styles/index.css +14 -2
  83. package/src/styles/instrument-chassis.css +28 -1
  84. package/src/styles/theme.css +3 -0
  85. package/src/styles/tokens.css +109 -266
  86. package/src/styles/typography.css +44 -131
  87. package/src/styles/utilities.css +23 -58
  88. package/dist/composables/motion/useSpringOrchestrator.d.ts +0 -15
  89. /package/dist/{IconTooltip-ge_mBSWR.js → IconTooltip-GIeWdo64.js} +0 -0
  90. /package/dist/{Input-CbakTe3B.js → Input-CBvqW8kZ.js} +0 -0
  91. /package/dist/composables/{motion → dark}/installDarkModeSync.d.ts +0 -0
  92. /package/dist/{useKeyboardShortcuts-B1ev1YEC.js → useKeyboardShortcuts-CPO4AhLx.js} +0 -0
@@ -79,21 +79,10 @@
79
79
  headline and the thank-you headline stay in lockstep. */
80
80
  --motion-duration-complete-shimmer: 2.4s;
81
81
  --motion-delay-complete-shimmer: 220ms;
82
- /* AJ.W2-ζ canon checkpoint — the gold-headline shimmer at
83
- CompleteHeadline + ThankYou reads these two tokens under a
84
- one-shot CSS animation. The gradient (background-size: 240% 100%
85
- with --color-gold-light at 46%), the @keyframes
86
- (gold-headline-shimmer: background-position 120% 0 → -120% 0),
87
- and the animation declaration are mutually consistent: at 2.4s
88
- duration + 220ms delay the bright band traverses the headline
89
- glyphs cleanly. A regression that drops either token to 0ms /
90
- unset / 0 would silently collapse the celebratory shimmer to an
91
- imperceptible blow-through (live regression P1-12 surfaced this
92
- risk; investigation closed at the publisher as a verify — both
93
- values resolve correctly today). These two values are LOAD-
94
- BEARING. Do not retire / zero / un-publish without an explicit
95
- decision + companion consumer-side migration at speedtest's
96
- CompleteHeadline.vue + ThankYou.vue. */
82
+ /* The gold-headline shimmer reads these two tokens under a one-shot
83
+ animation: at 2.4s + 220ms delay the bright band traverses the headline
84
+ glyphs cleanly. Load-bearing zeroing either collapses the shimmer to
85
+ an imperceptible blow-through. */
97
86
 
98
87
  /* CompleteBadge staged-reveal cluster — the disc / ring / check curve
99
88
  fires at three asymmetric durations + delays per the A4-AF staged-
@@ -106,43 +95,16 @@
106
95
  --motion-delay-badge-ring: 220ms;
107
96
  --motion-delay-badge-check: 460ms;
108
97
 
109
- /* AJ-W4-κ — staggered-reveal increment canon (per A5 §8.9). Promotes
110
- the scattered per-consumer constants
111
- (`STATS_CARD_STAGGER_MS = 40` in MetricGaugeCards,
112
- `BAR_STAGGER_MS = 80` in DistributionChart,
113
- `SERIES_STAGGER_MS = 120` in TimeSeriesChart,
114
- `useStagger` default 80ms) to one shared canon so a per-row /
115
- per-cell / per-bar cascade across consumer surfaces reads at one
116
- of three named tiers.
117
-
118
- The three tiers are perceptually distinct registers:
119
- • tight (40ms) — dense row cascades where the gap between
120
- consecutive reveals should be sub-perceptual (StatsCards row
121
- strip, results-table rows under their `:nth-child(N+1)` delays)
122
- • default (80ms) — the canonical row-stagger rhythm (the
123
- speedtest ResultStack row-tint sweep, the DistributionChart
124
- bar entrance — both already at 80ms). Aliased as `default`
125
- to match `useStagger`'s built-in fallback so consumers
126
- omitting `delayMs` resolve to the same token.
127
- • relaxed (120ms) — wider cascades where each reveal carries
128
- its own attention budget (TimeSeriesChart series entrance)
129
-
130
- The FD2 §6 rule-1 "shared period multiple" canon for ambient
131
- cycles extends here to staggers: at 40/80/120ms, the default
132
- (80ms) is the LCM of tight (40) AND a 2/3 of relaxed (120)
133
- — a tight cascade beating against a default cascade syncs on
134
- every-other-reveal, and a default cascade against a relaxed
135
- cascade syncs on every-three-reveals. Consumers that nest
136
- multiple cascades on adjacent surfaces should pick adjacent
137
- tiers so the cross-beats stay quiet.
138
-
139
- Consumers can read these tokens directly from inline-style
140
- calc() expressions (`animation-delay: calc(var(--motion-stagger-default) * var(--row-index))`)
141
- or via JS by resolving the CSS custom property at runtime
142
- (`getComputedStyle(document.documentElement).getPropertyValue('--motion-stagger-default')`).
143
- The latter shape collapses the speedtest TS-side constants
144
- (SERIES_STAGGER_MS, BAR_STAGGER_MS, STATS_CARD_STAGGER_MS) into
145
- single-source token reads. */
98
+ /* Staggered-reveal increment canon three perceptually-distinct tiers for
99
+ per-row/per-cell/per-bar cascades:
100
+ • tight (40ms) dense row cascades, sub-perceptual gap
101
+ default (80ms) the canonical row-stagger rhythm (matches
102
+ `useStagger`'s built-in fallback)
103
+ relaxed (120ms) wider cascades where each reveal carries its own
104
+ attention budget
105
+ Adjacent tiers keep cross-beats quiet (80 is the LCM of 40 and 2/3 of
106
+ 120). Consumers read these via inline-style calc() or `getComputedStyle`
107
+ at runtime. */
146
108
  --motion-stagger-tight: 40ms;
147
109
  --motion-stagger-default: 80ms;
148
110
  --motion-stagger-relaxed: 120ms;
@@ -199,23 +161,13 @@
199
161
  --ease-accelerate: var(--ease-in);
200
162
 
201
163
  /* ═══════════════════════════════════════════════
202
- §2.A AMBIENT MOTION — Pulse aura tokens (AB.W3.T1)
203
-
204
- Parameterise the breathing rhythm for `<Pulse variant="aura">`
205
- so consumers don't re-author the cycle per site. The 6s
206
- duration is the canon ambient-pulse rate (matches the dial's
207
- idle breathing). Scale 1.0 1.15 reads as a quiet halo at
208
- intensity="normal"; the Pulse component remaps min/max from
209
- its `intensity` prop ('subtle' = 1.06; 'vivid' = 1.22).
210
-
211
- Opacity min/max scope is `--pulse-aura-opacity-{min,max}` —
212
- the aura ALWAYS keeps a visible halo (min 0.55) so the colour
213
- stays read at the trough; the peak goes to 0.95 so the breath
214
- reads as a soft swell, not a fade-in-fade-out.
215
-
216
- Reduced motion: Pulse.vue's scoped @media bracket forces
217
- `animation: none` and parks at the min stop. Depth + colour
218
- remain visible; the breath cycle disables.
164
+ §2.A AMBIENT MOTION — Pulse aura tokens
165
+
166
+ Breathing rhythm for `<Pulse variant="aura">`. The 6s duration is the
167
+ canon ambient-pulse rate; scale 1.0 1.15 reads as a quiet halo at
168
+ intensity="normal" (Pulse remaps min/max from its `intensity` prop).
169
+ The aura always keeps a visible halo at the trough (opacity min 0.55).
170
+ Reduced motion: Pulse.vue parks at the min stop, breath cycle disabled.
219
171
  ═══════════════════════════════════════════════ */
220
172
  --animate-ambient-pulse-duration: 6s;
221
173
  --animate-ambient-pulse-scale-min: 1.0;
@@ -247,37 +199,18 @@
247
199
  --progress-sectioned-track: var(--secondary);
248
200
 
249
201
  /* ═══════════════════════════════════════════════
250
- §2.C ANIMATION EXPRESSIVENESS — AI.W4 grammar
251
- (publisher-side; consumer-side companions live in speedtest)
252
-
253
- Three idiom families compose the W4 wave:
254
-
255
- Progress lifecycle (M.1) the under-meter / survey progress bar
256
- rides an intake pulse on rising-edge, a crescendo brightening at
257
- ≥85%, and a one-shot discharge flash at 100%. The crescendo is a
258
- typed CSS variable (`@property --progress-crescendo`) so the
259
- indicator's leading-edge gradient stop interpolates smoothly.
260
-
261
- Chassis phase-tint companion (M.1) — the `--phase-color` cross-
262
- fade established by the chassis cascade gains an amount companion
263
- (`@property --phase-tint-amount`) so the chassis backdrop "warms
264
- toward" the active phase. Both typed vars interpolate together
265
- across the speedtest-owned `--motion-duration-phase-handoff`
266
- window; the chassis reads the consumer-tuned clock with a safe
267
- 600ms default so a non-speedtest consumer still gets the cross-
268
- fade shape.
269
-
270
- • Audacious button press-ripple (M.2 Q5 — ratified G-AI-D27) — the
271
- `btn-audacious` utility gains an in-place `@property --ripple-
272
- radius` ripple emanating from the pressed surface. Single typed
273
- length, ramps 0 → max over the ripple duration, retires on
274
- release. Q3 (needle micro-jitter) + Q4 (DockLayerGroup sympath-
275
- etic motion) were pruned at G-AI-D27 — no tokens reserved.
276
-
277
- All three families coexist with the existing `--motion-*` /
278
- `--phase-*` cluster. Speedtest re-uses these tokens at the existing
279
- --motion-duration-phase-handoff (consumer-side, 600ms). PRM brackets
280
- live alongside each consumer rule. */
202
+ §2.C ANIMATION EXPRESSIVENESS
203
+
204
+ Three idiom families:
205
+ Progress lifecycle the progress bar rides an intake pulse on
206
+ rising-edge, a crescendo brightening at ≥85%, and a one-shot discharge
207
+ flash at 100% (the crescendo is the typed `@property --progress-crescendo`).
208
+ Chassis phase-tint companion `@property --phase-tint-amount` so the
209
+ chassis backdrop warms toward the active phase, interpolating with
210
+ `--phase-color` across the consumer's phase-handoff window (600ms default).
211
+ Audacious button press-ripple `btn-audacious` gains a typed
212
+ `@property --ripple-radius` ramping 0 → max over the ripple duration.
213
+ ═══════════════════════════════════════════════ */
281
214
 
282
215
  /* Progress lifecycle — typed crescendo + segment-local durations */
283
216
  --motion-duration-progress-intake: 220ms; /* rising-edge pulse */
@@ -391,6 +324,13 @@
391
324
  --popover: var(--neutral-0);
392
325
  --popover-foreground: var(--foreground);
393
326
 
327
+ /* R0G-5 (AO.W4) — warm-neutral public-data panel surface. One warmth step
328
+ off --card (hue 44 vs 48, +4 sat, −2 L) so a consumer's aurora-OFF
329
+ /dashboard/* surfaces read with the admin canon's warm-neutral chrome
330
+ instead of the colder bare card. Opaque surface (the --card family), not
331
+ a --surface-tint-* overlay. Consumer applies on /dashboard/* only. */
332
+ --surface-public-data-panel: hsl(44 16% 96%);
333
+
394
334
  --muted: var(--neutral-1);
395
335
  --muted-foreground: var(--neutral-5);
396
336
  /* W7-α' (AK-FD1) — one rung less-faint than --muted-foreground for
@@ -547,21 +487,12 @@
547
487
  variable at any ancestor. Auto-dark via `--card`. */
548
488
  --card-header-bg: color-mix(in srgb, var(--card) 60%, transparent);
549
489
 
550
- /* Dock shadows */
551
- /* User 2026-05-13 (third + fourth report). The dock previously layered:
552
- 1) directional `0 4px 20px` drop → retired (third report; the Y-
553
- offset concentrated on the pill's rounded right cap and read as
554
- a right-edge halo on the rightmost child).
555
- 2) `0 0 0 1px` hairline outer ring → retired (fourth report; in
556
- dark mode the 10% cream-white ring traced the right-cap arc and
557
- still read as a shadow even after the directional drop was
558
- gone).
559
- The dock's own `border: 1.5px solid var(--glass-border-dock)` already
560
- provides silhouette definition, so the outer ring was redundant. The
561
- canonical dock shadow is now a single omnidirectional glow in the
562
- `--shadow-md`/`--shadow-lg` family. Per-instance directional drop
563
- can still be reinstated via `--shadow-dock-override` (consumed by
564
- every `.glass-dock` state selector — see dock.css). */
490
+ /* Dock shadows — a single omnidirectional glow in the
491
+ `--shadow-md`/`--shadow-lg` family (a directional drop concentrated on
492
+ the pill's rounded right cap as a right-edge halo; the dock's own
493
+ border already defines the silhouette). Per-instance directional drop
494
+ reinstates via `--shadow-dock-override` (consumed by every `.glass-dock`
495
+ state selector see dock.css). */
565
496
  --shadow-dock: 0 0 20px color-mix(in srgb, var(--shadow-color) 14%, transparent);
566
497
  --shadow-dock-collapsed: 0 0 12px color-mix(in srgb, var(--shadow-color) 12%, transparent);
567
498
  --dock-shadow: var(--shadow-dock);
@@ -617,27 +548,11 @@
617
548
  --glass-blur-resting-radius: 12px;
618
549
  --glass-blur-floating-radius: 16px;
619
550
  --glass-blur-overlay-radius: 24px;
620
- /* AJ.W2-β — dock blur lifted to 14px (was 0px at J.W3.C, was 1px
621
- pre-J.W3.C). Per FD1 §4 §1.9 (AJ-time live regression P1-11):
622
- "the dock should feel anchored to its surface; too much blur
623
- dissociates" but zero blur reads as "transparent-with-tint",
624
- NOT as "feathered glass." The AJ-time perceptual register
625
- overrides the J.W3.C compositor-cost concern: 14px is the lower
626
- end of the FD1 §4 target range (14-16px); the dock composes
627
- `blur()` only (no saturate — preserved from J.W3.C); the
628
- `prefers-reduced-transparency` PRM bracket at glass.css:229
629
- still maps the dock to its opacity-only register.
630
- Quiet tier (above) lifted 3px → 10px on the same perceptual-
631
- register reset (FD1 §4 target range 10-12px; 10px is the lower
632
- end). The MetricBadge pills + InstrumentChassis-internal cells
633
- now read as translucent gauge rather than flat tint.
634
-
635
- AL-W3-α (T10 per A-synthesis §1.5): retune 14px → 11px with a
636
- paired opacity lift 0.32 → 0.42 (below). The user mandate at
637
- AL-time was "slight blur" + "refined glassyness" — at 11px /
638
- 0.42 the dock reads as a CRISPER GLASS PILL (the iOS Control
639
- Center register), not a feathered watercolour wash. Holds the
640
- register at the lower blur radius. */
551
+ /* Dock blur radius 11px, paired with the 0.42 opacity below: a crisp
552
+ glass pill (the iOS Control Center register), not a feathered wash.
553
+ The dock composes `blur()` only (no saturate); the
554
+ `prefers-reduced-transparency` bracket at glass.css maps it to the
555
+ opacity-only register. */
641
556
  --glass-blur-dock-radius: 11px;
642
557
 
643
558
  --glass-blur-wash: blur(var(--glass-blur-wash-radius)) saturate(1.05);
@@ -645,23 +560,14 @@
645
560
  --glass-blur-resting: blur(var(--glass-blur-resting-radius)) saturate(1.05);
646
561
  --glass-blur-floating: blur(var(--glass-blur-floating-radius)) saturate(1.4);
647
562
  --glass-blur-overlay: blur(var(--glass-blur-overlay-radius)) saturate(1.5);
648
- /* Dock blur composes blur() only — no saturate. The 14px radius
649
- feathers the aurora bleed-through into a watercolour register
650
- while `--glass-bg-dock` (32% card opacity) carries the
651
- translucent register. The dock reads as "feathered glass" rather
652
- than "transparent tint" (AJ.W2-β). */
563
+ /* Dock blur composes blur() only — no saturate. */
653
564
  --glass-blur-dock: blur(var(--glass-blur-dock-radius));
654
565
 
655
- /* Dock-specific opacity. Lighter than `resting` (0.65) so the dock reads
656
- as a translucent overlay rather than a panel backdrop bleed visible
657
- through it. Consumed by `.glass-dock` via the `--glass-bg-dock` token.
658
-
659
- AL-W3-α (T10 per A-synthesis §1.5): retune 0.32 0.42 paired with
660
- the dock blur radius drop (14px → 11px above). The user mandate at
661
- AL-time was "slight blur" + "refined glassyness" — the +0.10 opacity
662
- lift HOLDS the surface register against the tightened blur, so the
663
- dock still reads as a clearly painted chrome rather than dissociating
664
- into a frosted ghost. */
566
+ /* Dock-specific opacity (0.42) lighter than `resting` (0.65) so the dock
567
+ reads as a translucent overlay rather than a panel, backdrop bleed
568
+ visible through it. Consumed by `.glass-dock` via `--glass-bg-dock`. The
569
+ value holds the surface register against the tightened 11px blur so the
570
+ dock reads as painted chrome, not a frosted ghost. */
665
571
  --glass-opacity-dock: 0.42;
666
572
 
667
573
  /* Chassis-specific opacity. Looser than `default` (0.50) so the
@@ -881,6 +787,13 @@
881
787
  - var(--page-padding-top, 0rem)
882
788
  - 1rem
883
789
  );
790
+ /* R0G-2 (AO.W3/W4) — chassis mobile dial-reserve canon. instrument-
791
+ chassis.css's mobile breakpoint reserves the dial's final box from
792
+ frame 0 via these vars (with the same values as inline fallbacks, the
793
+ safety net). Token-first home so the vars resolve canonically. */
794
+ --instrument-dial-min-height-mobile: 24rem;
795
+ --instrument-dial-meter-reserve-mobile: minmax(0, 1fr);
796
+
884
797
  --max-width-input: 24rem;
885
798
  --input-min-width-sm: 5rem;
886
799
  --min-width-input-sm: var(--input-min-width-sm);
@@ -1000,27 +913,10 @@
1000
913
  --scale-press: 0.96;
1001
914
  --scale-press-dock: 0.92;
1002
915
 
1003
- /* Press-scale the canonical iOS Liquid Glass press value.
1004
- `--scale-press` (0.96) is the canonical rung every primitive
1005
- should reach for unless it has a documented reason — see
1006
- DESIGN.md §L3. `--scale-press-btn` (aliased to `--scale-press-sm`,
1007
- 0.97) is the slightly-softer rung the legacy button + slider
1008
- recipes consume.
1009
-
1010
- AL-W10 SLIM reconciliation (per audit G-W1-2 / G-W1-4 F-2):
1011
- the prior `--scale-press: 0.95` value drifted from the §L3
1012
- canonical 0.96 rung; the canon-amend lifts the token to match
1013
- the iOS `.regular` control rung the precept ratifies.
1014
-
1015
- Q.W4 Lane D (Q-sty-5) retired the P.W4 `--scale-press-{xs,md,lg}`
1016
- rungs: the ladder was minted as preemptive consumer-facing
1017
- substrate for a words/frontend `active:scale-[X.XX]` absorption
1018
- that never landed — a fleet-wide grep (words/frontend, fourier,
1019
- bbnf-buddy, speedtest, keyframes.js + glass-ui src/) found zero
1020
- `var(--scale-press-{xs,md,lg})` consumers. Substrate-without-
1021
- consumer is binary (N invariant 23 / L invariant 8); the three
1022
- unused rungs are gone. `sm` is retained — `--scale-press-btn`
1023
- aliases it. */
916
+ /* Press-scale rungs. `--scale-press` (0.96) is the canonical iOS Liquid
917
+ Glass press value every primitive reaches for unless it has a documented
918
+ reason (DESIGN.md §L3); `--scale-press-btn` aliases the slightly-softer
919
+ `--scale-press-sm` (0.97) the button + slider recipes consume. */
1024
920
  --scale-press-sm: 0.97;
1025
921
  --scale-press-btn: var(--scale-press-sm);
1026
922
  --opacity-disabled: 0.5;
@@ -1168,26 +1064,12 @@
1168
1064
  /* ═══════════════════════════════════════════════
1169
1065
  §17 METRIC
1170
1066
 
1171
- MetricRow / MetricStack value-clamp dialect. The post-P
1172
- `9ba68ca` + `d244dd5` commits introduced this 8-token family
1173
- (plus the P.W5 Lane A.1 MetricRow clamp work) as a private SFC
1174
- dialect the defaults lived as `var(…, fallback)` literals
1175
- scattered across MetricRow.vue / MetricStack.vue, never
1176
- discoverable or `:root`-overridable. Q.W4 Lane A promotes the
1177
- whole family here per the DESIGN.md feature-token-home rule;
1178
- the SFCs now consume them bare.
1179
-
1180
- The declared values ARE the `audacious` poster register — the
1181
- hero-scale clamp for a single giant number the user watches
1182
- climb. MetricStack's `[data-register="result"]` scoped selector
1183
- legitimately overrides this register-locally for the compact
1184
- multi-row ledger; that override now retunes a globally declared
1185
- default rather than minting a fallback.
1186
-
1187
- Three clamp arms each: `min` (floor), `cqi` (the binding
1188
- container-query middle term), `max` (ceiling). value + label
1189
- carry all three; unit carries min/max only (its cqi coefficient
1190
- is a fixed 6cqi, not consumer-tuned).
1067
+ MetricRow / MetricStack value-clamp dialect. The declared values are the
1068
+ `audacious` poster register the hero-scale clamp for a single giant
1069
+ number; MetricStack's `[data-register="result"]` selector overrides it
1070
+ locally for the compact multi-row ledger. Three clamp arms each: `min`
1071
+ (floor), `cqi` (the binding container-query middle term), `max`
1072
+ (ceiling); unit carries min/max only (its cqi is a fixed 6cqi).
1191
1073
  ═══════════════════════════════════════════════ */
1192
1074
 
1193
1075
  /* Value register — audacious-poster hero clamp */
@@ -1206,69 +1088,35 @@
1206
1088
  --metric-row-label-clamp-max: 2.75rem;
1207
1089
 
1208
1090
  /* ═══════════════════════════════════════════════
1209
- §2.D INSTRUMENT-CLUSTER COMPOSITION RHYTHM
1210
- AK.W3 / FD1 TRANSPOSITION 5 absorb.
1211
-
1212
- The under-meter progress bar nests INTO the dial's painted-disc
1213
- bound (FD2 §5.2) and any two stacked progress rails inside a
1214
- cluster share the same vertical rhythm token. Both tokens were
1215
- authored speedtest-local (`AJ.W3-α`, `AJ.W3-μ.3`) but the design
1216
- intent is library-canon: the instrument-chassis family owns the
1217
- under-meter / progress-cluster grammar, so the tokens absorb here
1218
- at AK.W3. Speedtest reads transitively through the canon.
1219
-
1220
- AM-W7-δ — `--meter-progress-gap` RETIRED (dead-canon). It was
1221
- absorbed pre-emptively at AK.W3 for a post-nest "meter ↔ per-phase
1222
- progress-bar gap" composition that never materialised: speedtest's
1223
- bar uses the negative `--meter-progress-inset` instead, and a
1224
- fleet grep (glass-ui src/ + demo + speedtest) found ZERO `var()`
1225
- consumers (only doc references in pre-AL/pre-AK audits flagging it
1226
- as G-AL-D-METER-PROGRESS-GAP-DEAD-CANON, routed to retire). Per
1227
- NO-legacy-code it is removed rather than kept as speculative
1228
- forward-compat reservation; a future glass-ui Meter primitive that
1229
- needs the gap re-authors it at its real consumer.
1230
-
1231
- • `--meter-progress-inset` — the negative-margin inset that pulls
1232
- the under-meter bar INTO the unpainted ring lane around the
1233
- dial canvas (~4% of meter-size, two-thirds of the way through
1234
- the lane). Consumed at `.phase-progress` with `margin-block-
1235
- start: calc(-1 * var(--meter-progress-inset))`.
1236
- • `--progress-stack-gap` — vertical rhythm between any two stacked
1237
- progress rails inside one cluster (the under-meter bar cluster
1238
- + the global PhaseTimeline siblinged at W3-β).
1091
+ §2.D INSTRUMENT-CLUSTER COMPOSITION RHYTHM
1092
+
1093
+ The instrument-chassis family owns the under-meter / progress-cluster
1094
+ grammar.
1239
1095
 
1240
- The `--meter-size` reference inside the inset clamp resolves
1241
- against the consumer's own `--meter-size` declaration; when no
1242
- consumer ships one (a non-speedtest demo of the chassis), the
1243
- inline fallback of 200px keeps the calc well-defined. */
1096
+ `--meter-progress-inset` the negative-margin inset that pulls the
1097
+ under-meter bar INTO the unpainted ring lane around the dial canvas
1098
+ (~4% of meter-size). Consumed at `.phase-progress` via
1099
+ `margin-block-start: calc(-1 * var(--meter-progress-inset))`. The
1100
+ `--meter-size` reference resolves against the consumer's own
1101
+ declaration; the 200px fallback keeps the calc well-defined.
1102
+ • `--progress-stack-gap` — vertical rhythm between any two stacked
1103
+ progress rails inside one cluster.
1104
+ ═══════════════════════════════════════════════ */
1244
1105
  --meter-progress-inset: calc(var(--meter-size, 200px) * 0.04);
1245
1106
  --progress-stack-gap: clamp(0.1875rem, 0.4cqi, 0.375rem);
1246
1107
 
1247
1108
  /* ═══════════════════════════════════════════════
1248
- §2.E CELEBRATION-TIER REGISTER — AK.W3 / FD1
1249
- TRANSPOSITION 5 absorb.
1250
-
1251
- The celebration cluster (speedtest "Complete!" headline,
1252
- ThankYou's "Thanks for taking the time" headline) is a SHARED
1253
- peak across multiple consumer surfaces. Before AK.W3 these
1254
- tokens were speedtest-local (`AJ.W3-μ.4`, W2-C headline-parity)
1255
- but the design intent is library-canon: any glass-ui consumer
1256
- composing a "completion" / "thank-you" surface should reach
1257
- for the same row-rhythm + headline-ceiling pair.
1258
-
1259
- • `--celebration-row-rhythm` — gap between the celebration
1260
- cluster's rows (cqi-axis so the rhythm tracks the card's
1261
- intrinsic width).
1262
- • `--text-celebration-headline-size` — the SINGLE designed peak
1263
- both celebration surfaces clamp toward (the W2-C unification).
1264
- cqi-axis so the size tracks each card's intrinsic width.
1265
- • `--complete-headline-size` — the per-consumer FONT-SIZE HOOK
1266
- that `CompleteHeadline.vue` reads (`font-size:
1267
- var(--complete-headline-size, …)`). Each consumer assigns the
1268
- canon clamp (`--text-celebration-headline-size`) to this hook
1269
- at the container so the headline pegs at the shared peak.
1270
- The default falls back to a smaller hero-rung clamp for
1271
- consumers that haven't opted into the celebration ceiling. */
1109
+ §2.E CELEBRATION-TIER REGISTER
1110
+
1111
+ Shared peak for any "completion" / "thank-you" surface.
1112
+
1113
+ `--celebration-row-rhythm` gap between the cluster's rows (cqi-axis).
1114
+ `--text-celebration-headline-size` the single designed peak both
1115
+ celebration surfaces clamp toward (cqi-axis).
1116
+ `--complete-headline-size` the per-consumer font-size hook a consumer
1117
+ assigns the canon clamp to so its headline pegs at the shared peak;
1118
+ the default falls back to a smaller hero-rung clamp.
1119
+ ═══════════════════════════════════════════════ */
1272
1120
  --celebration-row-rhythm: clamp(0.5rem, 1.6cqi, 1rem);
1273
1121
  --text-celebration-headline-size: clamp(2.5rem, 12cqi, 9rem);
1274
1122
  --complete-headline-size: clamp(2.25rem, 11cqi, 4rem);
@@ -1276,22 +1124,12 @@
1276
1124
  /* ═══════════════════════════════════════════════
1277
1125
  §19 TABLE DENSITY
1278
1126
 
1279
- A single unitless knob `--table-density` scales the cell
1280
- padding and header row height of the Table / DataTable
1281
- primitive. Default `1` is backward-compatible (resolves to
1282
- the same `1rem` cell padding and `3rem` header height as the
1283
- pre-knob hardcoded values). Consumers set this on a wrapping
1284
- element or on `:root` to tune density for their context:
1285
-
1286
- • 0.75 — compact admin table (tighter rows, more data/screen)
1287
- • 1 — default (unchanged)
1288
- • 1.25 — comfortable / touch-friendly rows
1289
-
1290
- The derived tokens are read by the `table-cell` and `table-head`
1291
- CSS utilities (utilities.css) which TableCell.vue and TableHead.vue
1292
- consume instead of the former Tailwind `p-4` / `h-12` literals.
1293
- Changing `--table-density` cascades instantly via CSS inheritance —
1294
- no JS prop is needed.
1127
+ A single unitless knob `--table-density` scales the cell padding +
1128
+ header row height of the Table / DataTable primitive. Default `1`
1129
+ resolves to 1rem cell padding + 3rem header height; 0.75 is a compact
1130
+ admin table, 1.25 is comfortable/touch-friendly. The derived tokens are
1131
+ read by the `table-cell` / `table-head` utilities; changing the knob
1132
+ cascades instantly via CSS inheritance no JS prop needed.
1295
1133
  ═══════════════════════════════════════════════ */
1296
1134
  --table-density: 1;
1297
1135
  --table-cell-px: calc(1rem * var(--table-density));
@@ -1326,6 +1164,11 @@
1326
1164
  --popover: hsl(24 8% 10%);
1327
1165
  --popover-foreground: var(--foreground);
1328
1166
 
1167
+ /* R0G-5 (AO.W4) — dark mirror of the warm-neutral public-data panel.
1168
+ --card's dark hsl(24 8% 10%) nudged one warmth step toward amber
1169
+ (24→36) + +1 sat + +2 L so the dark dashboard panel lifts off the page. */
1170
+ --surface-public-data-panel: hsl(36 9% 12%);
1171
+
1329
1172
  --muted: var(--neutral-1);
1330
1173
  --muted-foreground: var(--neutral-5);
1331
1174
  /* W7-α' (AK-FD1) — strong-muted secondary text. Auto-tracks the dark