@mkbabb/glass-ui 2.1.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 (79) hide show
  1. package/dist/{CommandShortcut-_INFUMu6.js → CommandShortcut-BNDzfFnB.js} +2 -2
  2. package/dist/{ContextMenuSubContent-DCkweFW9.js → ContextMenuSubContent-DLEyeqbh.js} +3 -3
  3. package/dist/{DialogContent-CmCijgX9.js → DialogContent-DSo7PKlU.js} +1 -1
  4. package/dist/{DialogFooter-DRdaCok0.js → DialogFooter-D5KY6sCX.js} +1 -1
  5. package/dist/{Notification-DrI1DT2v.js → Notification-D97JO0fK.js} +2 -2
  6. package/dist/{SelectScrollDownButton-yu8EYUnu.js → SelectScrollDownButton-BwTexKeY.js} +2 -2
  7. package/dist/{Toaster-DY8_jtHv.js → Toaster-CY8gJu9E.js} +69 -58
  8. package/dist/animated-digit.js +1 -1
  9. package/dist/aurora.js +100 -87
  10. package/dist/carousel.js +4 -4
  11. package/dist/{check-dwgetki8.js → check-Nuw7H9Yh.js} +1 -1
  12. package/dist/{chevron-down-DILQA1t6.js → chevron-down-Du2b9vY_.js} +1 -1
  13. package/dist/{chevron-right-fS7fal2t.js → chevron-right-CtDxpE3w.js} +1 -1
  14. package/dist/{chevron-up-BtYjYQOS.js → chevron-up-CenYokvI.js} +1 -1
  15. package/dist/command.js +1 -1
  16. package/dist/components/custom/aurora/composables/runtime.d.ts +24 -1
  17. package/dist/components/custom/toggle-chip/ToggleChip.vue.d.ts +6 -4
  18. package/dist/components/ui/toast/Toaster.vue.d.ts +7 -1
  19. package/dist/components/ui/toast/index.d.ts +1 -0
  20. package/dist/composables/dark/index.d.ts +1 -0
  21. package/dist/composables/dom/index.d.ts +1 -0
  22. package/dist/composables/dom/useIdleReady.d.ts +63 -0
  23. package/dist/composables/index.d.ts +1 -0
  24. package/dist/composables/motion/core/index.d.ts +6 -0
  25. package/dist/composables/motion/index.d.ts +0 -7
  26. package/dist/configurator.js +1 -1
  27. package/dist/confirm-dialog.js +1 -1
  28. package/dist/constants-D-8FN28s.js +13 -0
  29. package/dist/context-menu.js +1 -1
  30. package/dist/{createLucideIcon-Bn9a1b70.js → createLucideIcon-rHu18UQW.js} +2 -2
  31. package/dist/dark.d.ts +1 -1
  32. package/dist/dark.js +12 -1
  33. package/dist/dialog.js +2 -2
  34. package/dist/dock.js +1 -1
  35. package/dist/dom.js +2 -2
  36. package/dist/{dropdown-menu-2K-SGkZU.js → dropdown-menu-gHSkffW7.js} +2 -2
  37. package/dist/dropdown-menu.js +1 -1
  38. package/dist/expandable-container.js +2 -2
  39. package/dist/forms.js +2 -2
  40. package/dist/glass-ui.js +109 -109
  41. package/dist/icon-tooltip.js +1 -1
  42. package/dist/keyboard.js +1 -1
  43. package/dist/labeled-field.js +3 -3
  44. package/dist/{minimize-2-LsCJ_eNt.js → minimize-2-C_oyKVwZ.js} +1 -1
  45. package/dist/motion-core.d.ts +1 -0
  46. package/dist/motion-core.js +192 -0
  47. package/dist/motion.js +25 -227
  48. package/dist/notification.js +1 -1
  49. package/dist/responsive-tabs.js +1 -1
  50. package/dist/{search-ocd8tmL9.js → search-7XEx_6hq.js} +1 -1
  51. package/dist/search.js +4 -4
  52. package/dist/select.js +1 -1
  53. package/dist/{sheet-CLVkb3AO.js → sheet-BsBdO5jq.js} +1 -1
  54. package/dist/sheet.js +1 -1
  55. package/dist/styles/dock.css +72 -95
  56. package/dist/styles/drawer.css +2 -2
  57. package/dist/styles/instrument-chassis.css +28 -1
  58. package/dist/styles/theme.css +3 -0
  59. package/dist/styles/tokens.css +109 -266
  60. package/dist/styles/typography.css +44 -131
  61. package/dist/styles/utilities.css +23 -58
  62. package/dist/toast.js +1 -1
  63. package/dist/{useAnimatedNumber-DcvTR9B4.js → useAnimatedNumber-2l13GibX.js} +9 -20
  64. package/dist/{useConfiguratorState-BlaevW0S.js → useConfiguratorState-BpZi8QJu.js} +5 -5
  65. package/dist/{useBreakpoint-BHlX-MhR.js → useIdleReady-DlzJicQH.js} +29 -1
  66. package/dist/{x-cdWAmO-q.js → x-Cb3NE2Ne.js} +1 -1
  67. package/package.json +12 -5
  68. package/src/styles/dock.css +72 -95
  69. package/src/styles/drawer.css +2 -2
  70. package/src/styles/instrument-chassis.css +28 -1
  71. package/src/styles/theme.css +3 -0
  72. package/src/styles/tokens.css +109 -266
  73. package/src/styles/typography.css +44 -131
  74. package/src/styles/utilities.css +23 -58
  75. package/dist/composables/motion/useSpringOrchestrator.d.ts +0 -15
  76. /package/dist/{IconTooltip-ge_mBSWR.js → IconTooltip-GIeWdo64.js} +0 -0
  77. /package/dist/{Input-CbakTe3B.js → Input-CBvqW8kZ.js} +0 -0
  78. /package/dist/composables/{motion → dark}/installDarkModeSync.d.ts +0 -0
  79. /package/dist/{useKeyboardShortcuts-B1ev1YEC.js → useKeyboardShortcuts-CPO4AhLx.js} +0 -0
@@ -10,59 +10,27 @@
10
10
  * (`.text-display-*`, `.text-body`, `.text-admin-label`) and feature
11
11
  * utilities (`.cm-serif`, `.fira-code`, `.fourier-f`).
12
12
  *
13
- * AC.W6b (v1.5.0)self-host font subsystem
14
- * ────────────────────────────────────────────
15
- * Glass-ui ships two OFL-1.1 face families as bundled woff2 assets under
16
- * `src/fonts/`:
17
- *
18
- * - **Plus Jakarta Sans** (latin + latin-ext, variable wght 200..800).
19
- * Selected as the brand display sans-serif substitute via AC.W6b's
20
- * 5-way visual-fidelity test against pre-substitution General Sans
21
- * baseline at 1200×766 hero size. Closest character match among the
22
- * OFL candidate menu (Plus Jakarta Sans / Onest / Manrope / Inter /
23
- * Geist). Carries `font-display: optional` so paint never blocks on
24
- * the LCP-critical hero font.
25
- *
26
- * - **Fira Code** (latin + latin-ext, variable wght 300..700). The
27
- * canonical glass-ui mono. OFL — full self-host permitted. Carries
28
- * `font-display: swap` (post-LCP register; visual swap acceptable).
29
- *
30
- * Both ship with Capsize-calibrated `size-adjust` / `ascent-override` /
31
- * `descent-override` metric overrides on the matching fallback faces so
32
- * the swap (system → primary) is geometry-neutral; CLS contribution
33
- * from the font-load is zero by construction.
34
- *
35
- * Consumers map `--font-brand-sans` / `--font-display` / `--font-mono`
36
- * to reference these self-hosted families and get the full gestalt-2
37
- * stack (self-host + optional + size-adjust + metric overrides) at the
38
- * substrate layer without re-introducing third-party CDN dependencies
39
- * on the LCP-critical path.
13
+ * Self-host font subsystem glass-ui ships two OFL-1.1 face families as
14
+ * bundled woff2 assets: Plus Jakarta Sans (brand display sans, font-display:
15
+ * optional) + Fira Code (canonical mono, font-display: swap). Both ship with
16
+ * Capsize-calibrated size-adjust / ascent-override / descent-override on the
17
+ * matching fallback faces so the swap is geometry-neutral (zero CLS). Consumers
18
+ * map --font-brand-sans / --font-display / --font-mono to reference them, no
19
+ * third-party CDN dependency on the LCP-critical path.
40
20
  */
41
21
 
42
22
  /* ═══════════════════════════════════════════════
43
23
  OFL FACE FILES — Plus Jakarta Sans (brand display)
44
24
  ═══════════════════════════════════════════════ */
45
25
 
46
- /* The payload-bearing "Plus Jakarta Sans" faces (latin + latin-ext woff2)
47
- live in `fonts.css`, reachable via the `@mkbabb/glass-ui/styles/fonts`
48
- export. They are split off the critical entry path so `./styles` (first
49
- paint) does not carry the ~99 KB-gzipped base64 font binary. Consumers
50
- import `…/styles/fonts` once, separately. The calibrated `local()`
51
- fallback face below carries NO payload and stays on the critical path —
52
- it is what paints during the `font-display: optional` window. */
53
-
54
- /* Plus Jakarta Sans — calibrated fallback face.
55
- Wraps the platform's system sans-serif (San Francisco / Segoe UI /
56
- Roboto / Arial) and overrides its metrics to match Plus Jakarta Sans's
57
- x-width + ascent + descent. While the primary face hasn't arrived
58
- (font-display: optional → renders in fallback if not in cache within
59
- the 100ms block window), the fallback paints at Plus Jakarta's
60
- geometry — the swap is metrically neutral, no CLS contribution.
61
-
62
- The four values (size-adjust + ascent-override + descent-override per
63
- system face) were derived programmatically via @capsizecss/core's
64
- `createFontStack` against the bundled latin woff2 (AC.W6b Capsize
65
- calibration; receipts at docs/tranches/AC/artefacts/W6b/). */
26
+ /* The payload-bearing "Plus Jakarta Sans" faces live in `fonts.css`
27
+ (`@mkbabb/glass-ui/styles/fonts`), split off the critical entry path so
28
+ `./styles` does not carry the ~99 KB-gzipped font binary. The calibrated
29
+ `local()` fallback face below carries NO payload, stays on the critical
30
+ path, and paints during the `font-display: optional` window. Its metric
31
+ overrides (per system face) were derived via @capsizecss/core's
32
+ `createFontStack` against the bundled latin woff2 — the swap is metrically
33
+ neutral (no CLS). */
66
34
  @font-face {
67
35
  font-family: "Plus Jakarta Sans Fallback";
68
36
  src: local("System Font"), local(".SFNS-Regular"), local(".SFNSText-Regular"),
@@ -98,19 +66,12 @@
98
66
  OFL FACE FILES — Fira Code (canonical mono)
99
67
  ═══════════════════════════════════════════════ */
100
68
 
101
- /* The payload-bearing "Fira Code" faces (latin + latin-ext woff2) live in
102
- `fonts.css`, reachable via the `@mkbabb/glass-ui/styles/fonts` export
103
- split off the critical entry path (see the Plus Jakarta note above). The
104
- calibrated `local()` fallback face below carries NO payload and stays on
105
- the critical path; it covers the `font-display: swap` window. */
106
-
107
- /* Fira Code — calibrated fallback face. Wraps the platform mono stack
108
- (SF Mono / Menlo / Consolas / Courier New) with Capsize-derived
109
- metric overrides referenced against Roboto Mono (the only mono entry
110
- in `@capsizecss/metrics`; the platform monos cluster within ~2% of
111
- Roboto Mono's metrics, so the override holds across the chain).
112
- size-adjust ≈ 1.0 means Fira Code's x-width matches the system mono
113
- exactly — the swap is geometrically transparent. */
69
+ /* The payload-bearing "Fira Code" faces live in `fonts.css`
70
+ (`@mkbabb/glass-ui/styles/fonts`), split off the critical entry path. The
71
+ calibrated `local()` fallback face below carries NO payload, stays on the
72
+ critical path, and covers the `font-display: swap` window. Its metric
73
+ overrides reference Roboto Mono (the platform monos cluster within ~2%);
74
+ size-adjust ≈ 1.0 makes the swap geometrically transparent. */
114
75
  @font-face {
115
76
  font-family: "Fira Code Fallback";
116
77
  src: local("SF Mono"), local("SFMono-Regular"), local("Menlo"),
@@ -121,37 +82,16 @@
121
82
  }
122
83
 
123
84
  :root {
124
- /* Font family tokens.
125
-
126
- `--font-serif`, `--font-display`, and `--font-mono` are NOT declared
127
- here. Their canonical source-of-truth lives in tokens.css
128
- (`--font-stack-serif`, `--font-stack-display`, `--font-stack-mono`),
129
- bridged to Tailwind utilities via the `@theme` block in theme.css
130
- (`--font-serif: var(--font-stack-serif)` etc.). Declaring them here
131
- as `:root` literals would shadow any consumer `@theme` override because
132
- un-layered `:root` declarations win over `@layer theme { :root }` in
133
- the Tailwind v4 cascade. The Q.W3 Lane F substrate revert (commit
134
- retiring the L.W1 `6ce14e5` fossil) removes those literals so the
135
- tokens.css→theme.css bridge is the single resolution path.
136
-
137
- Per AC.W6b (v1.5.0): the self-hosted OFL face files declared above
138
- expose two new family names: `"Plus Jakarta Sans"` (brand display
139
- sans — Path D substitute) + `"Fira Code"` (canonical mono). Both
140
- families pair with their respective `"... Fallback"` faces (which
141
- wrap the system fallback via `local()` + Capsize-calibrated
142
- metric overrides — the swap is no-shift on geometry).
143
-
144
- - `--font-brand-sans` ships its neutral default
145
- (`"Helvetica Neue" → Arial Nova → Arial → system-ui → sans-serif`).
146
- Consumers opting into Plus Jakarta Sans via the `brand-uniform-sans`
147
- preset override this token at `:root` to:
148
- `"Plus Jakarta Sans", "Plus Jakarta Sans Fallback", system-ui, sans-serif`.
149
-
150
- - `--font-mono` references `"Fira Code"` first so the self-hosted
151
- face engages by default for every glass-ui consumer; the
152
- calibrated `"Fira Code Fallback"` covers the swap window, then
153
- fallback `"Fira Mono"` + the generic `monospace` backstop the
154
- chain for browsers that reject local() lookups. */
85
+ /* Font family tokens. `--font-serif` / `--font-display` / `--font-mono`
86
+ are NOT declared here — their source-of-truth lives in tokens.css
87
+ (`--font-stack-*`), bridged to Tailwind via theme.css's `@theme` block;
88
+ declaring `:root` literals here would shadow consumer `@theme` overrides
89
+ (un-layered `:root` wins over `@layer theme`). The self-hosted faces
90
+ above expose `"Plus Jakarta Sans"` + `"Fira Code"`, each pairing with a
91
+ calibrated `"... Fallback"`. `--font-brand-sans` ships a neutral default;
92
+ consumers opting into Plus Jakarta via the `brand-uniform-sans` preset
93
+ override it. `--font-mono` references `"Fira Code"` first (engages by
94
+ default) then the fallback chain. */
155
95
  /* Independent brand/system sans stack; consumers override once for uniform sans. */
156
96
  --font-brand-sans: "Helvetica Neue", "Arial Nova", Arial, system-ui, sans-serif;
157
97
  --font-sans: var(--font-brand-sans);
@@ -219,29 +159,12 @@ body {
219
159
  font-weight: var(--font-display-weight);
220
160
  }
221
161
 
222
- /* O.W6 Lane D — `.text-hero` consumer-recipe hoist (speedtest AC.W6
223
- cohort, T_GU-HERO).
224
-
225
- The poster-type hero register. Composes the existing audacious ladder:
226
- ceiling pegs to `--type-display-audacious` (φ^(11/2) peak 352px, the
227
- fast.com peg) so consumers reading this utility against the type-scale
228
- get the canonical ceiling without re-declaring it.
229
-
230
- Three knobs let consumers tune without forking the recipe:
231
- - `--text-hero-size`: total clamp (default = canonical cap). Speedtest
232
- overrides this to `clamp(3rem, 45cqi, var(--type-display-audacious))`
233
- for its container-query metric column.
234
- - `--text-hero-leading`: line-height; default 0.84 matches speedtest's
235
- AB.W1.T3 tight-leading baseline.
236
- - `--text-hero-tracking`: letter-spacing; default -0.03em (poster-type
237
- register — tighter than `--type-tracking-tight`).
238
-
239
- `font-weight: 300` (poster-type) and `font-feature-settings: ss01,
240
- tnum, lnum` lock the numeric/stylistic-set baseline; consumers that
241
- need different features re-declare locally. The utility is otherwise
242
- substrate-only — consumer-side data-attribute registers (e.g.,
243
- speedtest's `.text-hero[data-idle]` colour cascade) compose ON TOP of
244
- this base. */
162
+ /* `.text-hero` — the poster-type hero register. Ceiling pegs to
163
+ `--type-display-audacious` (φ^(11/2) — peak 352px). Three knobs tune without
164
+ forking: `--text-hero-size` (total clamp), `--text-hero-leading` (line-height,
165
+ default 0.84), `--text-hero-tracking` (letter-spacing, default -0.03em).
166
+ `font-weight: 300` + `font-feature-settings: ss01, tnum, lnum` lock the
167
+ numeric/stylistic baseline; consumer data-attribute registers compose on top. */
245
168
  @utility text-hero {
246
169
  font-family: var(--font-display);
247
170
  font-size: var(--text-hero-size, var(--type-display-audacious));
@@ -352,23 +275,13 @@ body {
352
275
  font-weight: 600;
353
276
  }
354
277
 
355
- /* AB.W1.T5 — canonical dock control label register.
356
- Use case: text labels INSIDE `.dock-tab-button` (Start, Next, Submit,
357
- Done, New Test, survey labels). The dock-tab-button shell itself owns
358
- `--type-small` as a fallback, but consumers wanting an emphatic label
359
- character (slightly larger than the body small register) reach for
360
- `.dock-label` rather than `.text-heading` `.text-heading` is the
361
- heading register and carries `font-weight: 700`, which reads as
362
- literal bold inside a dock pill (the user mandate is "the start text
363
- should not be bold", redressed to every bottom-dock label).
364
-
365
- Composes the audacious-dock `--dock-label-size` knob when set
366
- (utilities.css §audacious mobile carve declares `--dock-label-size:
367
- 14-15px` at narrow viewports); falls back to `--type-subheading` so
368
- the register stays one rung above body-small at desktop. Weight 400
369
- (regular) per the standing precept: Plus Jakarta Sans at the dock
370
- pill size reads visually heavier than the numeric weight implies, so
371
- the regular rung is the correct register for the not-bold posture. */
278
+ /* Canonical dock control label register — text labels INSIDE
279
+ `.dock-tab-button` (Start, Next, Submit, …) that want an emphatic character
280
+ without `.text-heading`'s `font-weight: 700` (which reads as literal bold in
281
+ a dock pill). Composes the `--dock-label-size` knob when set (dock.css
282
+ audacious mobile carve), else `--type-subheading`. Weight 400 Plus Jakarta
283
+ reads heavier than its numeric weight at pill size, so regular is the
284
+ not-bold register. */
372
285
  @utility dock-label {
373
286
  font-family: var(--font-serif);
374
287
  font-size: var(--dock-label-size, var(--type-subheading));
@@ -460,8 +460,10 @@
460
460
  color: color-mix(in srgb, var(--muted-foreground) 50%, transparent);
461
461
  }
462
462
 
463
- /* ── Hover lift — translate-y + shadow on hover (3 levels) ── */
464
- .hover-lift {
463
+ /* ── Hover lift — translate-y + shadow on hover (3 levels) ──
464
+ The shared transition is expressed once over the family; the three
465
+ :hover rules carry the per-level translate + shadow. */
466
+ :where(.hover-lift, .hover-lift-md, .hover-lift-lg) {
465
467
  transition-property: transform, box-shadow;
466
468
  transition-duration: var(--duration-normal);
467
469
  transition-timing-function: var(--ease-standard);
@@ -470,22 +472,10 @@
470
472
  transform: translateY(var(--lift-sm));
471
473
  box-shadow: var(--shadow-md);
472
474
  }
473
-
474
- .hover-lift-md {
475
- transition-property: transform, box-shadow;
476
- transition-duration: var(--duration-normal);
477
- transition-timing-function: var(--ease-standard);
478
- }
479
475
  .hover-lift-md:hover:not(:disabled):not([aria-disabled='true']) {
480
476
  transform: translateY(var(--lift-md));
481
477
  box-shadow: var(--shadow-md);
482
478
  }
483
-
484
- .hover-lift-lg {
485
- transition-property: transform, box-shadow;
486
- transition-duration: var(--duration-normal);
487
- transition-timing-function: var(--ease-standard);
488
- }
489
479
  .hover-lift-lg:hover:not(:disabled):not([aria-disabled='true']) {
490
480
  transform: translateY(var(--lift-lg));
491
481
  box-shadow: var(--shadow-lg);
@@ -501,21 +491,19 @@
501
491
  the whole cartoon read.
502
492
  (Per audit U.W0.C-c §1.3 / Union 1 — collapses the dual-system
503
493
  drift onto the token-driven shadow.) */
494
+ :where(.shadow-cartoon-sm, .shadow-cartoon-md, .shadow-cartoon-lg) {
495
+ border: 2px solid var(--border);
496
+ }
504
497
  .shadow-cartoon-sm {
505
498
  box-shadow: var(--shadow-cartoon-sm);
506
- border: 2px solid var(--border);
507
499
  transform: translateY(-1px);
508
500
  }
509
-
510
501
  .shadow-cartoon-md {
511
502
  box-shadow: var(--shadow-cartoon-md);
512
- border: 2px solid var(--border);
513
503
  transform: translateY(-1px);
514
504
  }
515
-
516
505
  .shadow-cartoon-lg {
517
506
  box-shadow: var(--shadow-cartoon-lg);
518
- border: 2px solid var(--border);
519
507
  transform: translateY(-2px);
520
508
  }
521
509
 
@@ -574,21 +562,14 @@
574
562
  data-[state=closed]:duration-[var(--duration-fast)];
575
563
  }
576
564
 
577
- /* ── Audacious primary CTA recipe (K.W6 HEADLINE) ────────────────────
578
- Lifted from `dock.css` `.dock-tab-button[data-tier="primary"]` per
579
- K.W6 spec §3 (Option B drop phase-tinting from the canonical
580
- variant; phase-tint stays as a dock-local extension). Composes three
581
- at-rest marks (top-highlight via --glass-highlight, bottom under-shadow
582
- via --border-hairline, baseline glass via --card surface) with three
583
- disco accents on hover (specular swap via --glass-specular, sparkle
584
- sweep via the ::after star, disco-grain via --paper-clean-texture
585
- blended with a --primary radial). Reservation: disco fires on hover
586
- only — at rest the button reads as a Vignelli-restrained composed
587
- glass surface.
588
-
589
- Pair with `bg-primary text-primary-foreground` for the canonical
590
- Button variant; the utility owns the texture/highlight/sparkle
591
- composition only. */
565
+ /* ── Audacious primary CTA recipe ────────────────────────────────────────
566
+ Composes three at-rest marks (top-highlight via --glass-highlight, bottom
567
+ under-shadow via --border-hairline, baseline glass) with three disco accents
568
+ on hover (specular swap via --glass-specular, sparkle sweep via the ::after
569
+ star, disco-grain via --paper-clean-texture blended with a --primary radial).
570
+ Disco fires on hover only at rest the button reads as a restrained glass
571
+ surface. Pair with `bg-primary text-primary-foreground`; the utility owns
572
+ the texture/highlight/sparkle composition only. */
592
573
  @utility btn-audacious {
593
574
  position: relative;
594
575
  isolation: isolate;
@@ -782,21 +763,11 @@
782
763
  padding-inline: var(--table-head-px, 1rem);
783
764
  }
784
765
 
785
- /* ── Rainbow gradient backgrounds (Q.W3 Lane E re-promote) ──────────────
766
+ /* ── Rainbow gradient backgrounds ───────────────────────────────────────
786
767
  `.rainbow-vivid` + `.rainbow-pastel` paint a left-to-right 7-stop spectrum
787
768
  from the canonical `--rainbow-*` / `--rainbow-pastel-*` token families
788
- (tokens.css §14). They were retired at `b0debec` (D.W2.D, 2026-04-30)
789
- under a zero-consumer audit that did not include keyframes.js in its
790
- sweep corpus — keyframes.js's `AnimationMenuBar.vue` round play button
791
- composes `rainbow-vivid` (playing) / `rainbow-pastel` (idle) and silently
792
- lost its gradient when the recipes left the library. The `--rainbow-*`
793
- color tokens survived the retiral; only the class recipes were dropped.
794
-
795
- Re-promoted as `@utility` recipes — the token half is canonical, so the
796
- class form that paints it belongs alongside it. Not a backwards-compat
797
- alias: it is a substrate REVERT, the revert IS the consumer rediscovery
798
- (≥ 1 consumer exists post-revert, satisfying L invariant 8). Faithful
799
- to the pre-`b0debec` recipe bodies. */
769
+ (tokens.css §14). Consumed by keyframes.js's `AnimationMenuBar.vue` round
770
+ play button — `rainbow-vivid` (playing) / `rainbow-pastel` (idle). */
800
771
  @utility rainbow-vivid {
801
772
  background: linear-gradient(
802
773
  to right,
@@ -823,19 +794,13 @@
823
794
  );
824
795
  }
825
796
 
826
- /* ── Interactive-button four-state recipe (Q.W3 Lane E re-promote) ───────
797
+ /* ── Interactive-button four-state recipe ────────────────────────────────
827
798
  `.btn-interactive` carries the canonical "Button-with-spring-hover"
828
799
  four-state contract — transition + hover-scale (`--scale-hover`) +
829
- active-press (`--scale-press`) + disabled-opacity (`--opacity-disabled`)
830
- + focus-ring fade-in. Same shape as `.btn-audacious` (a composition-only
831
- recipe a Button variant opts into). Retired at `b0debec` (D.W2.D)
832
- alongside the rainbow recipes under the same incomplete audit corpus;
833
- keyframes.js consumes it at 7 sites (CubeScene, EasingScene, demo/cube,
834
- AnimationControlsGroup RIBBON_BUTTON_CLASS, PlaybackRibbon Reverse).
835
-
836
- The Button primitive's own variants emit the four states except
837
- `hover:scale-*` — `.btn-interactive` is the canonical opt-in that adds
838
- the spring-hover lift. Faithful to the pre-`b0debec` recipe body. */
800
+ active-press (`--scale-press`) + disabled-opacity + focus-ring fade-in.
801
+ The Button primitive's variants emit the four states except `hover:scale-*`;
802
+ this is the canonical opt-in that adds the spring-hover lift. Consumed by
803
+ keyframes.js at 7 sites. */
839
804
  @utility btn-interactive {
840
805
  transition:
841
806
  background-color var(--duration-fast) var(--ease-standard),
package/dist/toast.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "./Toaster-DY8_jtHv.js";
1
+ import { a as e, c as t, i as n, n as r, o as i, r as a, s as o, t as s } from "./Toaster-CY8gJu9E.js";
2
2
  export { t as Toast, o as ToastAction, i as ToastClose, e as ToastDescription, n as ToastTitle, s as Toaster, r as toast, a as useToast };
@@ -1,23 +1,12 @@
1
- import { getCurrentScope as e, onScopeDispose as t, readonly as n, ref as r, shallowRef as i, toValue as a, watch as o } from "vue";
2
- import { SmoothProgress as s } from "@mkbabb/keyframes.js";
3
- //#region src/composables/motion/constants.ts
4
- var c = {
5
- canvasNeedle: .08,
6
- domHero: .12,
7
- domPill: .14,
8
- domProgress: .18
9
- }, l = {
10
- canvas: .002,
11
- dom: .05,
12
- domProgress: .5
13
- };
14
- //#endregion
1
+ import { n as e, t } from "./constants-D-8FN28s.js";
2
+ import { getCurrentScope as n, onScopeDispose as r, readonly as i, ref as a, shallowRef as o, toValue as s, watch as c } from "vue";
3
+ import { SmoothProgress as l } from "@mkbabb/keyframes.js";
15
4
  //#region src/composables/motion/useAnimatedNumber.ts
16
5
  function u(e) {
17
6
  return Math.max(0, Math.min(100, e));
18
7
  }
19
8
  function d(d, f = {}) {
20
- let p = f.mode ?? "absolute", m = p === "progress" ? (e) => u(e) / 100 : (e) => e, h = p === "progress" ? (e) => e * 100 : (e) => e, g = p === "progress" ? u(f.initial ?? 0) : f.initial ?? 0, _ = m(g), v = r(g), y = r(!1), b = p === "progress" ? c.domProgress : c.domHero, x = p === "progress" ? l.domProgress : l.dom, S = p === "progress" ? (f.snapThreshold ?? x) / 100 : f.snapThreshold ?? x, C = i(new s({
9
+ let p = f.mode ?? "absolute", m = p === "progress" ? (e) => u(e) / 100 : (e) => e, h = p === "progress" ? (e) => e * 100 : (e) => e, g = p === "progress" ? u(f.initial ?? 0) : f.initial ?? 0, _ = m(g), v = a(g), y = a(!1), b = p === "progress" ? t.domProgress : t.domHero, x = p === "progress" ? e.domProgress : e.dom, S = p === "progress" ? (f.snapThreshold ?? x) / 100 : f.snapThreshold ?? x, C = o(new l({
21
10
  damping: f.damping ?? b,
22
11
  snapThreshold: S,
23
12
  targetEpsilon: p === "progress" ? (f.targetEpsilon ?? 0) / 100 : f.targetEpsilon ?? 0,
@@ -28,15 +17,15 @@ function d(d, f = {}) {
28
17
  C.value.play((e) => {
29
18
  v.value = h(e), y.value = !C.value.settled, f.onValue?.(v.value);
30
19
  });
31
- let w = o(() => a(d), (e) => {
20
+ let w = c(() => s(d), (e) => {
32
21
  e != null && C.value.setTarget(m(e));
33
22
  }, { immediate: !0 });
34
23
  function T() {
35
24
  w(), C.value.stop(), y.value = !1;
36
25
  }
37
- return e() && t(T), {
38
- current: n(v),
39
- isAnimating: n(y),
26
+ return n() && r(T), {
27
+ current: i(v),
28
+ isAnimating: i(y),
40
29
  snap: () => {
41
30
  C.value.snap(), v.value = h(C.value.current), y.value = !1;
42
31
  },
@@ -48,4 +37,4 @@ function d(d, f = {}) {
48
37
  };
49
38
  }
50
39
  //#endregion
51
- export { c as n, l as r, d as t };
40
+ export { d as t };
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./cn-DJXf4yaB.js";
2
- import { t } from "./createLucideIcon-Bn9a1b70.js";
3
- import { t as n } from "./chevron-down-DILQA1t6.js";
2
+ import { t } from "./createLucideIcon-rHu18UQW.js";
3
+ import { t as n } from "./chevron-down-Du2b9vY_.js";
4
4
  import { t as r } from "./_plugin-vue_export-helper-n-_DRHWS.js";
5
5
  import { t as i } from "./Label-C8QMJSsf.js";
6
6
  import { Fragment as a, computed as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createTextVNode as u, createVNode as d, defineComponent as f, inject as p, normalizeClass as m, normalizeStyle as h, openBlock as g, provide as _, reactive as v, ref as y, renderList as b, renderSlot as x, toDisplayString as S, toRaw as C, unref as w, useId as T, watch as E, withCtx as D } from "vue";
@@ -54,7 +54,7 @@ var M = { class: "configurator-stage relative min-h-0 min-w-0 overflow-hidden" }
54
54
  setup(t, { emit: n }) {
55
55
  let r = t;
56
56
  A(o(() => r.density));
57
- let i = n, u = o(() => e("configurator glass-floating rounded-card border border-border/60 overflow-hidden", "grid grid-cols-1 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]", "min-h-0", r.class)), d = o(() => {
57
+ let i = n, u = o(() => e("configurator glass-floating rounded-panel border border-border/60 overflow-hidden", "grid grid-cols-1 lg:grid-cols-[minmax(0,1fr)_minmax(280px,360px)]", "min-h-0", r.class)), d = o(() => {
58
58
  switch (r.scrollMode) {
59
59
  case "always": return "overflow-y-auto scroll-fade-y scrollbar-thin";
60
60
  case "never": return "overflow-visible";
@@ -134,11 +134,11 @@ var M = { class: "configurator-stage relative min-h-0 min-w-0 overflow-hidden" }
134
134
  }
135
135
  let v = o(() => u.value ? "open" : "closed");
136
136
  return (r, a) => (g(), c("div", {
137
- class: m(w(e)("configurator-layer border-b border-border/40 last:border-b-0", i.class)),
137
+ class: m(w(e)("configurator-layer rounded-panel border-b border-border/40 last:border-b-0", i.class)),
138
138
  "data-state": v.value
139
139
  }, [l("button", {
140
140
  type: "button",
141
- class: m(w(e)("configurator-layer-trigger", "group flex w-full items-center justify-between gap-2 px-3 py-2", "text-left transition-colors hover:bg-foreground/5 focus-ring")),
141
+ class: m(w(e)("configurator-layer-trigger", "rounded-panel", "group flex w-full items-center justify-between gap-2 px-3 py-2", "text-left transition-colors hover:bg-foreground/5 focus-ring")),
142
142
  "aria-expanded": u.value,
143
143
  "aria-controls": p.value,
144
144
  "data-state": v.value,
@@ -131,4 +131,32 @@ function m(e) {
131
131
  };
132
132
  }
133
133
  //#endregion
134
- export { c as a, f as i, p as n, d as r, m as t };
134
+ //#region src/composables/dom/useIdleReady.ts
135
+ function h(e = {}) {
136
+ let n = e.timeout ?? 2e3, i = a(!1), o = null, s = null, c = !1;
137
+ function l() {
138
+ c || i.value || (i.value = !0, e.onReady?.(), u());
139
+ }
140
+ function u() {
141
+ o !== null && typeof window < "u" && "cancelIdleCallback" in window && (window.cancelIdleCallback(o), o = null), s !== null && (clearTimeout(s), s = null);
142
+ }
143
+ function d() {
144
+ if (!c) {
145
+ if (typeof window > "u") {
146
+ l();
147
+ return;
148
+ }
149
+ "requestIdleCallback" in window ? o = window.requestIdleCallback(l, { timeout: n }) : s = setTimeout(l, 0);
150
+ }
151
+ }
152
+ d();
153
+ function f() {
154
+ c || (c = !0, u());
155
+ }
156
+ return t() && r(f), {
157
+ ready: i,
158
+ stop: f
159
+ };
160
+ }
161
+ //#endregion
162
+ export { f as a, d as i, m as n, c as o, p as r, h as t };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./createLucideIcon-Bn9a1b70.js";
1
+ import { t as e } from "./createLucideIcon-rHu18UQW.js";
2
2
  var t = e("x", [["path", {
3
3
  d: "M18 6 6 18",
4
4
  key: "1bl5f8"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mkbabb/glass-ui",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "description": "Glassmorphic design system — Vue 3.5 components, reka-ui primitives, Tailwind CSS v4 tokens",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -130,6 +130,9 @@
130
130
  "motion": [
131
131
  "dist/motion.d.ts"
132
132
  ],
133
+ "motion-core": [
134
+ "dist/motion-core.d.ts"
135
+ ],
133
136
  "button": [
134
137
  "dist/button.d.ts"
135
138
  ],
@@ -378,6 +381,10 @@
378
381
  "types": "./dist/motion.d.ts",
379
382
  "import": "./dist/motion.js"
380
383
  },
384
+ "./motion-core": {
385
+ "types": "./dist/motion-core.d.ts",
386
+ "import": "./dist/motion-core.js"
387
+ },
381
388
  "./button": {
382
389
  "types": "./dist/button.d.ts",
383
390
  "import": "./dist/button.js"
@@ -478,9 +485,9 @@
478
485
  ],
479
486
  "scripts": {
480
487
  "dev": "vite",
481
- "build": "NODE_OPTIONS=--max-old-space-size=8192 vite build && npm run emit-types",
482
- "build:watch": "NODE_OPTIONS=--max-old-space-size=8192 vite build --watch",
483
- "prepare": "test -f dist/glass-ui.js || npm run build",
488
+ "build": "vite build && npm run emit-types",
489
+ "build:watch": "vite build --watch",
490
+ "prepare": "test -f dist/glass-ui.js -a -f dist/index.d.ts || npm run build",
484
491
  "typecheck": "vue-tsc --noEmit",
485
492
  "test": "vitest run",
486
493
  "verify-export-types": "node scripts/verify-export-types.mjs",
@@ -511,7 +518,7 @@
511
518
  },
512
519
  "peerDependencies": {
513
520
  "@lucide/vue": "^1.16.0",
514
- "@mkbabb/keyframes.js": "^2.0.0",
521
+ "@mkbabb/keyframes.js": "^2.1.1",
515
522
  "@vueuse/core": "^14.0",
516
523
  "class-variance-authority": "^0.7",
517
524
  "clsx": "^2.0",