@mkbabb/glass-ui 3.5.1 → 3.7.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 (227) hide show
  1. package/dist/CardAction-D8nSE62a.js +163 -0
  2. package/dist/CollapsibleContent-D7UNsXQr.js +63 -0
  3. package/dist/{CommandShortcut-BiVyqipe.js → CommandShortcut-CY0aQTz5.js} +4 -4
  4. package/dist/{ContextMenuContent-De01_83g.js → ContextMenuContent-DGKZX1Du.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DrWkXKQP.js → ContextMenuSubContent-BeDz7G6f.js} +4 -4
  6. package/dist/{DataTable-DyKc_26a.js → DataTable-gtPOLZvl.js} +14 -7
  7. package/dist/{DialogContent-IQ8_BRrC.js → DialogContent-DG1YMR-P.js} +24 -24
  8. package/dist/{DialogFooter-Er0wA3K6.js → DialogFooter-BCIaDP15.js} +2 -2
  9. package/dist/{DiscoGlyph-BaZ8OawK.js → DiscoGlyph-ZoBYpoxI.js} +1 -1
  10. package/dist/{GlyphFace-B_7vOmYn.js → GlyphFace-Ce_oe3tM.js} +1 -1
  11. package/dist/{HoverCardContent-ICfIMZX1.js → HoverCardContent-Bn0UBMY9.js} +1 -1
  12. package/dist/{HoverPopover-DTSYkJtw.js → HoverPopover-DXpOEw1P.js} +1 -1
  13. package/dist/{IconTooltip-BTyYn4mr.js → IconTooltip-Cu86JR4e.js} +1 -1
  14. package/dist/{Input-CU9CNKmo.js → Input-DWQQIOC4.js} +4 -1
  15. package/dist/{Label-CZk-3nTc.js → Label-DBc7bKzZ.js} +1 -1
  16. package/dist/{MetricBadge-BlrdbOGN.js → MetricBadge-D-bRaQUD.js} +1 -1
  17. package/dist/{Notification-DP_ApJLo.js → Notification-B5WHP3_1.js} +5 -4
  18. package/dist/{NumberFieldContent-jO-zGOHf.js → NumberFieldContent-CLNVR1iY.js} +5 -5
  19. package/dist/{PopoverContent-B8WtJECb.js → PopoverContent-F1bWnYoh.js} +2 -2
  20. package/dist/{Progress-DjM86vfb.js → Progress-c4vo4ALi.js} +6 -6
  21. package/dist/{ScrollingText-P9o_DuMn.js → ScrollingText-BEp377U5.js} +2 -2
  22. package/dist/{SelectScrollDownButton-BGn3rjs9.js → SelectScrollDownButton-DAo5NmY_.js} +8 -7
  23. package/dist/{Separator-C2XtAXRp.js → Separator-DZyqsCum.js} +1 -1
  24. package/dist/{Switch-x8n6husW.js → Switch-2rsAtDfA.js} +8 -2
  25. package/dist/TabsList-COqIdW7i.js +101 -0
  26. package/dist/{Toaster-DdhMKfus.js → Toaster-BMaeziJJ.js} +54 -60
  27. package/dist/{ToggleGroupItem-gyXj998A.js → ToggleGroupItem-C-AIkBUw.js} +13 -5
  28. package/dist/{TooltipProvider-D-JrSqDu.js → TooltipProvider-CD2IXfRv.js} +1 -1
  29. package/dist/{UnderlineTabs-Cq_AD03t.js → UnderlineTabs-D_c1iYo-.js} +1 -1
  30. package/dist/animated-digit.js +2 -2
  31. package/dist/api/index.d.ts +2 -1
  32. package/dist/api.js +1 -1
  33. package/dist/aurora.js +845 -204
  34. package/dist/{badge-Cl6JZ1B7.js → badge-DHQrc_GQ.js} +13 -9
  35. package/dist/badge.js +1 -1
  36. package/dist/{button-i8Ek5vvg.js → button-CAywcrhO.js} +8 -5
  37. package/dist/button.js +1 -1
  38. package/dist/card.js +2 -2
  39. package/dist/carousel.js +5 -5
  40. package/dist/{check-CdkxGxXJ.js → check-BBKKKSTf.js} +1 -1
  41. package/dist/{chevron-down-pBY8sYfV.js → chevron-down-BSkTP2aL.js} +1 -1
  42. package/dist/{chevron-right-BjeKC22V.js → chevron-right-sDM0Yvrf.js} +1 -1
  43. package/dist/{chevron-up-DBeNHUm1.js → chevron-up-CCOD_FTz.js} +1 -1
  44. package/dist/collapsible.js +1 -1
  45. package/dist/color-DjJCAQ6f.js +76 -0
  46. package/dist/color.js +2 -2
  47. package/dist/command.js +1 -1
  48. package/dist/compile-iM4IUB66.js +158 -0
  49. package/dist/components/custom/aurora/Aurora.vue.d.ts +1 -0
  50. package/dist/components/custom/aurora/composables/atoms.d.ts +60 -0
  51. package/dist/components/custom/aurora/composables/color.d.ts +36 -9
  52. package/dist/components/custom/aurora/composables/cursorModel.d.ts +35 -2
  53. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  54. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +16 -0
  55. package/dist/components/custom/aurora/composables/runtime.d.ts +18 -0
  56. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +29 -0
  57. package/dist/components/custom/aurora/composables/useAurora.d.ts +6 -0
  58. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +8 -0
  59. package/dist/components/custom/aurora/constants/presets.d.ts +64 -2
  60. package/dist/components/custom/aurora/constants/renderMode.d.ts +10 -0
  61. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +7 -0
  62. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  63. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  64. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -1
  65. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  66. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +7 -0
  67. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +4 -0
  68. package/dist/components/custom/aurora/index.d.ts +5 -3
  69. package/dist/components/custom/constellation/Constellation.vue.d.ts +45 -0
  70. package/dist/components/custom/constellation/constellationField.d.ts +85 -0
  71. package/dist/components/custom/constellation/index.d.ts +3 -0
  72. package/dist/components/custom/dock/GlassDock.vue.d.ts +34 -3
  73. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +38 -0
  74. package/dist/components/custom/fourier-field/index.d.ts +2 -0
  75. package/dist/components/custom/fourier-field/math.d.ts +57 -0
  76. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +2 -0
  77. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +14 -2
  78. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +45 -4
  79. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +1 -1
  80. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  81. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  82. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  83. package/dist/components/custom/goo-blob/types.d.ts +40 -0
  84. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +1 -1
  85. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  86. package/dist/components/ui/_shared/ModalOverlay.vue.d.ts +1 -1
  87. package/dist/components/ui/alert/index.d.ts +1 -1
  88. package/dist/components/ui/card/Card.vue.d.ts +10 -3
  89. package/dist/components/ui/card/CardAction.vue.d.ts +24 -0
  90. package/dist/components/ui/card/index.d.ts +1 -0
  91. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +5 -1
  92. package/dist/components/ui/tabs/TabsList.vue.d.ts +13 -3
  93. package/dist/components/ui/toast/Toast.vue.d.ts +5 -5
  94. package/dist/components/ui/toast/use-toast.d.ts +1 -1
  95. package/dist/composables/color/index.d.ts +50 -0
  96. package/dist/composables/glass/canvas2d/index.d.ts +2 -0
  97. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +48 -0
  98. package/dist/composables/glass/createGPUCanvas.d.ts +40 -0
  99. package/dist/composables/glass/index.d.ts +2 -0
  100. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +45 -0
  101. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +3 -0
  102. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +4 -4
  103. package/dist/configurator.js +1 -1
  104. package/dist/confirm-dialog.js +3 -3
  105. package/dist/constellation.d.ts +1 -0
  106. package/dist/constellation.js +182 -0
  107. package/dist/context-menu.js +2 -2
  108. package/dist/controls.js +2 -2
  109. package/dist/dark.js +1 -1
  110. package/dist/data-table.js +1 -1
  111. package/dist/dialog.js +2 -2
  112. package/dist/disco-glyph.js +1 -1
  113. package/dist/dock.js +129 -110
  114. package/dist/{dockContext-spUj_-E5.js → dockContext-DLgrVWsU.js} +1 -1
  115. package/dist/dom.js +5 -5
  116. package/dist/{dropdown-menu-EFjl5iKo.js → dropdown-menu-BWpwutt0.js} +5 -5
  117. package/dist/dropdown-menu.js +1 -1
  118. package/dist/expandable-container.js +2 -2
  119. package/dist/forms.js +10 -7
  120. package/dist/fourier-field.d.ts +1 -0
  121. package/dist/fourier-field.js +166 -0
  122. package/dist/glass-carousel.js +1 -1
  123. package/dist/glass-panel.js +2 -2
  124. package/dist/glass-ui.css +1 -1
  125. package/dist/glass-ui.js +207 -191
  126. package/dist/glyph-face.js +2 -2
  127. package/dist/goo-blob.js +336 -234
  128. package/dist/header-ribbon.js +1 -1
  129. package/dist/hover-card.js +1 -1
  130. package/dist/hover-popover.js +1 -1
  131. package/dist/icon-tooltip.js +1 -1
  132. package/dist/instrument-chassis.js +1 -1
  133. package/dist/instrument-rail.js +1 -1
  134. package/dist/keyboard.js +1 -1
  135. package/dist/{keys-BFoma9vm.js → keys-Dyf_uTs5.js} +1 -1
  136. package/dist/label.js +1 -1
  137. package/dist/labeled-field.js +6 -6
  138. package/dist/metric-badge.js +1 -1
  139. package/dist/metric-stack.js +1 -1
  140. package/dist/{minimize-2-BP27-qBY.js → minimize-2-lcXOuc6V.js} +1 -1
  141. package/dist/motion-core.js +76 -106
  142. package/dist/motion.js +3 -3
  143. package/dist/notification.js +1 -1
  144. package/dist/number-field.js +1 -1
  145. package/dist/paper-backdrop.js +1 -1
  146. package/dist/popover.js +1 -1
  147. package/dist/progress.js +1 -1
  148. package/dist/pulse.js +1 -1
  149. package/dist/reactive.js +2 -2
  150. package/dist/responsive-tabs.js +2 -2
  151. package/dist/scrolling-text.js +1 -1
  152. package/dist/{search-DBG8qaRs.js → search-nbkvr2dC.js} +1 -1
  153. package/dist/search.js +8 -8
  154. package/dist/select.js +3 -3
  155. package/dist/separator.js +1 -1
  156. package/dist/{sheet-CQYYrkr9.js → sheet-Cv1uO-Gq.js} +4 -4
  157. package/dist/sheet.js +1 -1
  158. package/dist/{slider-CgNzRSh6.js → slider-BA9wIs5e.js} +5 -4
  159. package/dist/slider.js +1 -1
  160. package/dist/sortable-list.js +3 -3
  161. package/dist/styles/components.css +1 -1
  162. package/dist/styles/dock.css +185 -1
  163. package/dist/styles/glass-refract.css +60 -0
  164. package/dist/styles/glass-specular-track.css +43 -130
  165. package/dist/styles/glass.css +243 -27
  166. package/dist/styles/index.css +1 -0
  167. package/dist/styles/theme.css +55 -0
  168. package/dist/styles/tokens.css +33 -0
  169. package/dist/styles/typography.css +3 -3
  170. package/dist/styles/utilities.css +17 -13
  171. package/dist/supportsCssTimeline-C5oe0lnD.js +12 -0
  172. package/dist/switch.js +1 -1
  173. package/dist/tabs.js +4 -4
  174. package/dist/timeline.js +2 -2
  175. package/dist/toast.js +1 -1
  176. package/dist/toggle-group.js +1 -1
  177. package/dist/tooltip.js +1 -1
  178. package/dist/typewriter.js +1 -1
  179. package/dist/{useAnimatedNumber-BF6r64lA.js → useAnimatedNumber-C5I3wWd8.js} +1 -1
  180. package/dist/useCanvas2D-C31yfUGY.js +95 -0
  181. package/dist/{useConfiguratorState-DUtC1jxr.js → useConfiguratorState-B24TcgIn.js} +5 -5
  182. package/dist/useScrollProgress-CAH8Ofwt.js +35 -0
  183. package/dist/{useTouchGate-CS5Csc2h.js → useTouchGate-YQRwyUGU.js} +1 -1
  184. package/dist/{vReveal-u2wSG2El.js → vReveal-BE2TsPoR.js} +6 -17
  185. package/dist/watercolor-dot.js +2 -2
  186. package/dist/{x-C4pz9nbD.js → x-Dfsegz9Y.js} +1 -1
  187. package/package.json +49 -1
  188. package/src/styles/dock.css +185 -1
  189. package/src/styles/glass-refract.css +60 -0
  190. package/src/styles/glass-specular-track.css +43 -130
  191. package/src/styles/glass.css +243 -27
  192. package/src/styles/index.css +1 -0
  193. package/src/styles/theme.css +55 -0
  194. package/src/styles/tokens.css +33 -0
  195. package/src/styles/typography.css +3 -3
  196. package/src/styles/utilities.css +17 -13
  197. package/dist/CardFooter-C390imy7.js +0 -129
  198. package/dist/CollapsibleContent-cauTbZEM.js +0 -52
  199. package/dist/TabsIndicator-DA0x9gPr.js +0 -97
  200. package/dist/color-rkK4RMx2.js +0 -33
  201. package/dist/compile-DVgAxagk.js +0 -106
  202. /package/dist/{InstrumentChassis-DaHIZCqy.js → InstrumentChassis-BLJBl1BW.js} +0 -0
  203. /package/dist/{InstrumentRail-B0qqLFN0.js → InstrumentRail-BElFwKyt.js} +0 -0
  204. /package/dist/{ModalOverlay-B_CBtqcE.js → ModalOverlay-D1VrWyoi.js} +0 -0
  205. /package/dist/{PaperBackdrop-D_YZW47j.js → PaperBackdrop-DCGoGatv.js} +0 -0
  206. /package/dist/{SelectGroup-CMdoCjRE.js → SelectGroup-BcaFjvP4.js} +0 -0
  207. /package/dist/{SelectSeparator-CaJnPF3_.js → SelectSeparator-COFMJGng.js} +0 -0
  208. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
  209. /package/dist/{constants-DsCdlK9I.js → constants-CS75AWHG.js} +0 -0
  210. /package/dist/{createContext-DBMGRlx4.js → createContext-CvNyBk4o.js} +0 -0
  211. /package/dist/{createLucideIcon-DuDoe_ra.js → createLucideIcon-B6uNAU9G.js} +0 -0
  212. /package/dist/{menuItemVariants-C2QlXqT3.js → menuItemVariants-B4eFR5Ix.js} +0 -0
  213. /package/dist/{presets-1OhFpaIC.js → presets-BKVyQfbt.js} +0 -0
  214. /package/dist/{prng-Bz_1Tydc.js → prng-wHuHlNHE.js} +0 -0
  215. /package/dist/{useGlassRenderer-Dn3WpfG-.js → useGlassRenderer-HebgSEgN.js} +0 -0
  216. /package/dist/{useGlobalDark-CWiaCoEw.js → useGlobalDark-yhL4Wp-s.js} +0 -0
  217. /package/dist/{useIntersectionPause-DAdVPVp4.js → useIntersectionPause-Cc-H9ees.js} +0 -0
  218. /package/dist/{useInterval-CHVYFpXV.js → useInterval-D3USn0yc.js} +0 -0
  219. /package/dist/{useKeyboardShortcuts-BQfnAHHW.js → useKeyboardShortcuts-Be3w_Rwk.js} +0 -0
  220. /package/dist/{useResizeObserver-DX-STszm.js → useResizeObserver-CSyxGxIX.js} +0 -0
  221. /package/dist/{useSortable-DnyGXKKY.js → useSortable-C8ReQ50P.js} +0 -0
  222. /package/dist/{useSpringMount-CnizvZGm.js → useSpringMount-LRZqJTaF.js} +0 -0
  223. /package/dist/{useTextHighlight-Dmtofpk2.js → useTextHighlight-aMPdEpkq.js} +0 -0
  224. /package/dist/{useTimer-DGgoxTXL.js → useTimer-DEJonOZa.js} +0 -0
  225. /package/dist/{useUserInvalidAria-DmvZ_6Dx.js → useUserInvalidAria-CQKjEfwP.js} +0 -0
  226. /package/dist/{useViewTransition-CJnqg6wl.js → useViewTransition-DaN5Zrox.js} +0 -0
  227. /package/dist/{useViewportReady-Dcvf0c4p.js → useViewportReady-K96m-Mdv.js} +0 -0
@@ -700,6 +700,32 @@
700
700
  --glass-edge-light: inset 0 0 0 0.75px hsl(0 0% 100% / 0.18);
701
701
  --glass-edge-light-dark: inset 0 0 0 0.75px hsl(0 0% 100% / 0.10);
702
702
 
703
+ /* AW.W23 — content-aware adaptive tint (the Baseline-2025 "tint informed by
704
+ surrounding content" axis, WWDC25 sess. 219). A surface can tint toward a
705
+ consumer-provided dominant backdrop color via a `color-mix(in oklab, …)`
706
+ recipe (oklab is the mwg-preferred space for tint generation; NEVER a
707
+ lightness-shift in `oklch(from …)` — browsers don't gamut-map yet).
708
+
709
+ DEFAULT is zero delta: `--glass-tint-source` is the warm-white card itself
710
+ and `--glass-tint-strength` is 0%, so the rung background mixes 0% toward
711
+ the source = byte-identical to today. A consumer sets `--glass-tint-source`
712
+ to a sampled aurora hue + a strength ≤30% to bias the surface. Alpha-safe:
713
+ the mix is bounded ≤30% and never re-points the card's own alpha. */
714
+ --glass-tint-source: var(--card);
715
+ --glass-tint-strength: 0%;
716
+
717
+ /* AW.W23 — chromatic edge dispersion (the "polished glass" rim fringe Apple
718
+ shows). A warm fringe on one edge + a cool fringe on the other, low-alpha,
719
+ biased warm-cream/NCSU-red (NOT iOS-blue). Composed OVER the W22 uniform
720
+ rim under `prefers-reduced-transparency: no-preference`; dropped under
721
+ `reduce` (it is a transparency garnish). The two directional inset rings
722
+ read as light refracting through the glass edge. */
723
+ --glass-fringe-warm: oklch(0.92 0.06 40 / 0.22);
724
+ --glass-fringe-cool: oklch(0.90 0.05 230 / 0.16);
725
+ --glass-edge-dispersion:
726
+ inset 0.75px 0 0 0 var(--glass-fringe-warm),
727
+ inset -0.75px 0 0 0 var(--glass-fringe-cool);
728
+
703
729
  /* Chassis curvature illusion — a subtle radial gradient at the chassis
704
730
  top centre that lifts the surface without committing to literal 3D.
705
731
  Composed into <InstrumentChassis>'s background stack. */
@@ -1586,6 +1612,13 @@
1586
1612
  `.dark` (mirroring the `--glass-specular` remap above). The lit token
1587
1613
  resolves to the `-dark` alpha on the deeper canvas. */
1588
1614
  --glass-edge-light: var(--glass-edge-light-dark);
1615
+
1616
+ /* AW.W23 — the chromatic-fringe + adaptive-tint dark arm. The fringe drops
1617
+ to a lower-luminance warm/cool pair on the deep canvas; `--glass-tint-
1618
+ source` auto-flips with `--card` (no override needed — the default already
1619
+ resolves the dark card). */
1620
+ --glass-fringe-warm: oklch(0.78 0.07 40 / 0.18);
1621
+ --glass-fringe-cool: oklch(0.74 0.06 230 / 0.14);
1589
1622
  --glass-curvature-overlay: radial-gradient(
1590
1623
  ellipse at 50% -20%,
1591
1624
  hsl(0 0% 100% / 0.06),
@@ -486,8 +486,8 @@ body {
486
486
  surface read as a fade, not as engraving. */
487
487
  .text-engraved {
488
488
  color: var(--muted-foreground);
489
- text-shadow:
490
- 0 1px 0 color-mix(in srgb, var(--background) 30%, transparent),
491
- 0 -1px 0 var(--surface-tint-8);
489
+ /* AW.W26 — composes the `--text-shadow-engraved` @theme identity token
490
+ (the two-stop emboss) instead of a hand-rolled literal (gate 4). */
491
+ text-shadow: var(--text-shadow-engraved);
492
492
  }
493
493
  }
@@ -173,7 +173,12 @@
173
173
  box-shadow: var(--focus-ring-shadow);
174
174
  }
175
175
  .interactive-item:active {
176
- scale: 0.98;
176
+ /* AW.W31.a — fold the residual literal press scale onto the canonical
177
+ `--scale-press*` cohort (the prior `0.98` was the sole per-atom press
178
+ literal surviving the W2/W3/W25 sweeps). `--scale-press-sm` (0.97) is
179
+ the soft press rung the button + slider recipes consume — ONE press
180
+ vocabulary, no per-atom literal. The 0.98→0.97 delta is sub-perceptual. */
181
+ scale: var(--scale-press-sm);
177
182
  }
178
183
  .interactive-item:disabled,
179
184
  .interactive-item[data-disabled] {
@@ -227,22 +232,16 @@
227
232
  background var(--duration-fast) var(--ease-standard),
228
233
  box-shadow var(--duration-fast) var(--ease-standard);
229
234
  }
230
- /* ── Depth text (layered shadow with customizable colors) ── */
235
+ /* ── Depth text (layered offset stamp) ──
236
+ AW.W26 — composes the `--text-shadow-depth` @theme identity token (the
237
+ hard offset stack + soft ambient tail) instead of a hand-rolled multi-stop
238
+ literal. The token holds the stack inside the `@theme` defs (gate 4) and
239
+ re-tints under `.dark` via `--shadow`/`--shadow-color` BY CONSTRUCTION. */
231
240
  .depth-text {
232
241
  --depth-color-primary: var(--primary);
233
- --depth-color-shadow: var(--shadow);
234
242
 
235
243
  color: var(--depth-color-primary);
236
- text-shadow:
237
- 1px 1px 0 var(--depth-color-shadow),
238
- 2px 2px 0 var(--depth-color-shadow),
239
- 3px 3px 0 var(--depth-color-shadow),
240
- 4px 4px 0 var(--depth-color-shadow),
241
- 5px 5px 0 var(--depth-color-shadow),
242
- 5px 5px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
243
- 2px 2px 2px color-mix(in srgb, var(--shadow-color) 20%, transparent),
244
- 4px 4px 5px color-mix(in srgb, var(--shadow-color) 25%, transparent),
245
- 6px 6px 10px color-mix(in srgb, var(--shadow-color) 15%, transparent);
244
+ text-shadow: var(--text-shadow-depth);
246
245
  }
247
246
 
248
247
  /* ── 3D preserve ── */
@@ -397,6 +396,11 @@
397
396
 
398
397
  .metric-badge > span {
399
398
  line-height: 1;
399
+ /* AW.W26 — `wrap-anywhere` (overflow-wrap: anywhere) on the value slot:
400
+ a long metric value breaks WITHIN the badge rather than being clipped
401
+ by the host `overflow: hidden`. v4.1 `wrap-anywhere` / mwg css §7.
402
+ Scoped to the value span, NOT a universal selector (mwg perf caveat). */
403
+ overflow-wrap: anywhere;
400
404
  }
401
405
 
402
406
  .metric-badge:hover {
@@ -0,0 +1,12 @@
1
+ //#region src/composables/motion/supportsCssTimeline.ts
2
+ function e(e, t) {
3
+ return typeof CSS > "u" || typeof CSS.supports != "function" ? !1 : CSS.supports("animation-timeline", e) && !CSS.supports("animation-timeline", t);
4
+ }
5
+ function t() {
6
+ return e("scroll()", "gl-not-a-real-timeline");
7
+ }
8
+ function n() {
9
+ return e("view()", "gl-not-a-real-timeline");
10
+ }
11
+ //#endregion
12
+ export { n, t };
package/dist/switch.js CHANGED
@@ -1,2 +1,2 @@
1
- import { t as e } from "./Switch-x8n6husW.js";
1
+ import { t as e } from "./Switch-2rsAtDfA.js";
2
2
  export { e as Switch };
package/dist/tabs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./cn-DJXf4yaB.js";
2
- import { t } from "./_plugin-vue_export-helper-C1je1s0u.js";
3
- import { i as n, n as r, r as i, t as a } from "./TooltipProvider-D-JrSqDu.js";
4
- import { t as o } from "./UnderlineTabs-Cq_AD03t.js";
2
+ import { t } from "./_plugin-vue_export-helper-gLzyemvl.js";
3
+ import { i as n, n as r, r as i, t as a } from "./TooltipProvider-CD2IXfRv.js";
4
+ import { t as o } from "./UnderlineTabs-D_c1iYo-.js";
5
5
  import { Fragment as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createTextVNode as p, createVNode as m, defineComponent as h, mergeModels as g, nextTick as _, normalizeClass as v, normalizeStyle as y, onMounted as b, onUnmounted as x, openBlock as S, ref as C, renderList as w, renderSlot as T, toDisplayString as E, unref as D, useModel as O, watch as k, withCtx as A } from "vue";
6
6
  //#region src/components/custom/tabs/composables/useBouncySlider.ts
7
7
  function j(e) {
@@ -208,7 +208,7 @@ var M = [
208
208
  }, () => [p(E(e.label), 1)], !0)], 10, N))], 64))), 128))
209
209
  ], 2));
210
210
  }
211
- }), [["__scopeId", "data-v-ba2dfb91"]]), F = /* @__PURE__ */ h({
211
+ }), [["__scopeId", "data-v-45c0ed13"]]), F = /* @__PURE__ */ h({
212
212
  __name: "BouncyTabs",
213
213
  props: /* @__PURE__ */ g({
214
214
  options: {},
package/dist/timeline.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as e } from "./_plugin-vue_export-helper-C1je1s0u.js";
2
- import { t } from "./HoverPopover-DTSYkJtw.js";
1
+ import { t as e } from "./_plugin-vue_export-helper-gLzyemvl.js";
2
+ import { t } from "./HoverPopover-DXpOEw1P.js";
3
3
  import { Fragment as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createSlots as c, createVNode as l, defineComponent as u, guardReactiveProps as d, normalizeClass as f, normalizeProps as p, normalizeStyle as m, openBlock as h, ref as g, renderList as _, renderSlot as v, toDisplayString as y, unref as b, withCtx as x } from "vue";
4
4
  //#region src/components/custom/timeline/geometry.ts
5
5
  function S(e) {
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-DdhMKfus.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-BMaeziJJ.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,2 +1,2 @@
1
- import { n as e, t } from "./ToggleGroupItem-gyXj998A.js";
1
+ import { n as e, t } from "./ToggleGroupItem-C-AIkBUw.js";
2
2
  export { e as ToggleGroup, t as ToggleGroupItem };
package/dist/tooltip.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as e, n as t, r as n, t as r } from "./TooltipProvider-D-JrSqDu.js";
1
+ import { i as e, n as t, r as n, t as r } from "./TooltipProvider-CD2IXfRv.js";
2
2
  export { e as Tooltip, n as TooltipContent, r as TooltipProvider, t as TooltipTrigger };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./_plugin-vue_export-helper-C1je1s0u.js";
1
+ import { t as e } from "./_plugin-vue_export-helper-gLzyemvl.js";
2
2
  import { Fragment as t, computed as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, defineComponent as o, normalizeClass as s, onMounted as c, onUnmounted as l, openBlock as u, ref as d, renderList as f, toDisplayString as p, unref as m, watch as h } from "vue";
3
3
  //#region src/components/custom/typewriter/types.ts
4
4
  var g = {
@@ -1,4 +1,4 @@
1
- import { n as e, t } from "./constants-DsCdlK9I.js";
1
+ import { n as e, t } from "./constants-CS75AWHG.js";
2
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
3
  import { SmoothProgress as l } from "@mkbabb/keyframes.js";
4
4
  //#region src/composables/motion/useAnimatedNumber.ts
@@ -0,0 +1,95 @@
1
+ import { getCurrentScope as e, onScopeDispose as t, toValue as n } from "vue";
2
+ //#region src/composables/glass/canvas2d/useCanvas2D.ts
3
+ var r = "200px";
4
+ function i(i) {
5
+ let { setup: a, autoStart: o = !0, contextAttrs: s, rootMargin: c = r } = i, l = i.respectReducedMotion ?? !0, u = () => n(i.canvas), d = /* @__PURE__ */ new Set(), f = () => d.size === 0, p = 0, m = null, h = null, g = !1, _ = !1, v = typeof window < "u", y = typeof document < "u", b = l && v && window.matchMedia ? window.matchMedia("(prefers-reduced-motion: reduce)") : null, x = b?.matches ?? !1;
6
+ function S() {
7
+ if (!f() || !h || !m) {
8
+ p = 0;
9
+ return;
10
+ }
11
+ h.render(m, v ? performance.now() : 0), p = x ? 0 : requestAnimationFrame(S);
12
+ }
13
+ function C() {
14
+ g && f() && !p && h && m && (p = requestAnimationFrame(S));
15
+ }
16
+ function w() {
17
+ g && h && m && h.render(m, v ? performance.now() : 0);
18
+ }
19
+ function T() {
20
+ let e = b?.matches ?? !1;
21
+ e !== x && (x = e, C());
22
+ }
23
+ b?.addEventListener("change", T);
24
+ function E(e = "manual") {
25
+ let t = f();
26
+ d.add(e), t && !f() && (cancelAnimationFrame(p), p = 0);
27
+ }
28
+ function D(e = "manual") {
29
+ let t = !f();
30
+ d.delete(e), t && f() && g && h && (x ? w() : C());
31
+ }
32
+ function O() {
33
+ document.hidden ? E("tab-hidden") : D("tab-hidden");
34
+ }
35
+ y && document.addEventListener("visibilitychange", O), y && document.hidden && d.add("tab-hidden");
36
+ let k = null;
37
+ function A(e) {
38
+ e.skipped ? E("off-screen") : D("off-screen");
39
+ }
40
+ function j(e) {
41
+ if (k) return;
42
+ let t = e.parentElement;
43
+ t && (k = t, t.addEventListener("contentvisibilityautostatechange", A));
44
+ }
45
+ function M() {
46
+ k?.removeEventListener("contentvisibilityautostatechange", A), k = null;
47
+ }
48
+ let N = null;
49
+ function P(e) {
50
+ N || typeof IntersectionObserver > "u" || (N = new IntersectionObserver((e) => {
51
+ for (let t of e) t.isIntersecting || t.intersectionRatio > 0 ? D("off-screen") : E("off-screen");
52
+ }, { rootMargin: c }), N.observe(e));
53
+ }
54
+ let F = null, I = !1;
55
+ function L(e) {
56
+ if (!m) return;
57
+ let t = e.clientWidth || e.offsetWidth || 0, n = e.clientHeight || e.offsetHeight || 0;
58
+ if (!t || !n) return;
59
+ let r = Math.min(v && window.devicePixelRatio || 1, 2);
60
+ e.width = Math.round(t * r), e.height = Math.round(n * r), m.setTransform(r, 0, 0, r, 0, 0), !I && !p && w();
61
+ }
62
+ function R(e) {
63
+ F || typeof ResizeObserver > "u" || (F = new ResizeObserver(() => {
64
+ let e = u();
65
+ e && L(e);
66
+ }), F.observe(e));
67
+ }
68
+ function z() {
69
+ if (g || _) return;
70
+ let e = u();
71
+ if (!e) return;
72
+ let t = e.getContext("2d", s);
73
+ if (!t) throw Error("[useCanvas2D] 2D context unavailable");
74
+ m = t, h = a(m), g = !0, R(e), j(e), P(e), I = !0, L(e), I = !1, x ? w() : f() && (p = requestAnimationFrame(S));
75
+ }
76
+ function B() {
77
+ _ || (_ = !0, cancelAnimationFrame(p), p = 0, y && document.removeEventListener("visibilitychange", O), b?.removeEventListener("change", T), M(), N?.disconnect(), N = null, F?.disconnect(), F = null, h?.teardown?.(), h = null, m = null, d.clear());
78
+ }
79
+ return o && z(), e() && t(B), {
80
+ arm: z,
81
+ suspend: E,
82
+ resume: D,
83
+ wake: C,
84
+ dispose: B,
85
+ isRunning: f,
86
+ get ctx() {
87
+ return m;
88
+ },
89
+ get reducedMotion() {
90
+ return x;
91
+ }
92
+ };
93
+ }
94
+ //#endregion
95
+ export { i as t };
@@ -1,9 +1,9 @@
1
1
  import { t as e } from "./cn-DJXf4yaB.js";
2
- import { t } from "./createLucideIcon-DuDoe_ra.js";
3
- import { t as n } from "./chevron-down-pBY8sYfV.js";
4
- import { t as r } from "./_plugin-vue_export-helper-C1je1s0u.js";
5
- import { t as i } from "./createContext-DBMGRlx4.js";
6
- import { t as a } from "./Label-CZk-3nTc.js";
2
+ import { t } from "./createLucideIcon-B6uNAU9G.js";
3
+ import { t as n } from "./chevron-down-BSkTP2aL.js";
4
+ import { t as r } from "./_plugin-vue_export-helper-gLzyemvl.js";
5
+ import { t as i } from "./createContext-CvNyBk4o.js";
6
+ import { t as a } from "./Label-DBc7bKzZ.js";
7
7
  import { Fragment as o, computed as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createTextVNode as d, createVNode as f, defineComponent as p, mergeModels as m, normalizeClass as h, normalizeStyle as g, openBlock 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, useModel as E, withCtx as D } from "vue";
8
8
  var O = t("rotate-ccw", [["path", {
9
9
  d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",
@@ -0,0 +1,35 @@
1
+ import { t as e } from "./supportsCssTimeline-C5oe0lnD.js";
2
+ import { onBeforeUnmount as t, onMounted as n, ref as r, unref as i, watch as a } from "vue";
3
+ //#region src/composables/motion/useScrollProgress.ts
4
+ var o = e();
5
+ function s(e) {
6
+ let { offset: s = 0, trackExit: c = !1 } = e, l = r(0), u = 0, d = null;
7
+ function f() {
8
+ let t = i(e.target);
9
+ if (!t) return;
10
+ let n = t.getBoundingClientRect(), r = window.innerHeight + s, a = r - (c ? -n.height : 0);
11
+ if (a === 0) {
12
+ l.value = 0;
13
+ return;
14
+ }
15
+ let o = (r - n.top) / a;
16
+ l.value = Math.max(0, Math.min(1, o));
17
+ }
18
+ function p() {
19
+ u ||= requestAnimationFrame(() => {
20
+ u = 0, f();
21
+ });
22
+ }
23
+ return n(() => {
24
+ if (f(), o) return;
25
+ window.addEventListener("scroll", p, { passive: !0 }), window.addEventListener("resize", p, { passive: !0 });
26
+ let t = i(e.target);
27
+ t && typeof ResizeObserver < "u" && (d = new ResizeObserver(p), d.observe(t));
28
+ }), o || a(() => i(e.target), (e, t) => {
29
+ t && d && d.unobserve(t), e && d && d.observe(e), p();
30
+ }), t(() => {
31
+ window.removeEventListener("scroll", p), window.removeEventListener("resize", p), u && cancelAnimationFrame(u), d?.disconnect(), d = null;
32
+ }), l;
33
+ }
34
+ //#endregion
35
+ export { s as t };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./useTimer-DGgoxTXL.js";
1
+ import { t as e } from "./useTimer-DEJonOZa.js";
2
2
  import { getCurrentScope as t, onScopeDispose as n, ref as r } from "vue";
3
3
  //#region src/composables/dom/useTouchGate.ts
4
4
  var i = /* @__PURE__ */ new Set(), a = !1;
@@ -7,29 +7,18 @@ function t() {
7
7
  return typeof Element < "u" && "moveBefore" in Element.prototype;
8
8
  }
9
9
  //#endregion
10
- //#region src/composables/motion/supportsCssTimeline.ts
11
- function n(e, t) {
12
- return typeof CSS > "u" || typeof CSS.supports != "function" ? !1 : CSS.supports("animation-timeline", e) && !CSS.supports("animation-timeline", t);
13
- }
14
- function r() {
15
- return n("scroll()", "gl-not-a-real-timeline");
16
- }
17
- function i() {
18
- return n("view()", "gl-not-a-real-timeline");
19
- }
20
- //#endregion
21
10
  //#region src/utils/platformSupport.ts
22
- function a() {
11
+ function n() {
23
12
  return typeof globalThis.scheduler?.postTask == "function";
24
13
  }
25
14
  //#endregion
26
15
  //#region src/composables/motion/vReveal.ts
27
- function o(e, t) {
16
+ function r(e, t) {
28
17
  e.setAttribute("data-reveal", t.arg === "fade" ? "fade" : ""), e.style.setProperty("--d", String(t.value ?? 0));
29
18
  }
30
- var s = {
31
- mounted: o,
32
- updated: o
19
+ var i = {
20
+ mounted: r,
21
+ updated: r
33
22
  };
34
23
  //#endregion
35
- export { e as a, i, a as n, t as o, r, s as t };
24
+ export { t as i, n, e as r, i as t };
@@ -1,5 +1,5 @@
1
- import { t as e } from "./_plugin-vue_export-helper-C1je1s0u.js";
2
- import { n as t, t as n } from "./prng-Bz_1Tydc.js";
1
+ import { t as e } from "./_plugin-vue_export-helper-gLzyemvl.js";
2
+ import { n as t, t as n } from "./prng-wHuHlNHE.js";
3
3
  import { computed as r, createBlock as i, createElementVNode as a, defineComponent as o, normalizeClass as s, normalizeStyle as c, onUnmounted as l, openBlock as u, ref as d, renderSlot as f, resolveDynamicComponent as p, toRef as m, useId as h, watch as g, withCtx as _ } from "vue";
4
4
  //#region src/components/custom/watercolor-dot/prng.ts
5
5
  function v(e, t, n) {
@@ -1,4 +1,4 @@
1
- import { t as e } from "./createLucideIcon-DuDoe_ra.js";
1
+ import { t as e } from "./createLucideIcon-B6uNAU9G.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": "3.5.1",
3
+ "version": "3.7.0",
4
4
  "description": "Glassmorphic design system — Vue 3.5 components, reka-ui primitives, Tailwind CSS v4 tokens",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -52,6 +52,9 @@
52
52
  "color": [
53
53
  "dist/color.d.ts"
54
54
  ],
55
+ "fourier-field": [
56
+ "dist/fourier-field.d.ts"
57
+ ],
55
58
  "goo-blob": [
56
59
  "dist/goo-blob.d.ts"
57
60
  ],
@@ -118,6 +121,9 @@
118
121
  "header-ribbon": [
119
122
  "dist/header-ribbon.d.ts"
120
123
  ],
124
+ "constellation": [
125
+ "dist/constellation.d.ts"
126
+ ],
121
127
  "scrolling-text": [
122
128
  "dist/scrolling-text.d.ts"
123
129
  ],
@@ -290,6 +296,10 @@
290
296
  "types": "./dist/color.d.ts",
291
297
  "import": "./dist/color.js"
292
298
  },
299
+ "./fourier-field": {
300
+ "types": "./dist/fourier-field.d.ts",
301
+ "import": "./dist/fourier-field.js"
302
+ },
293
303
  "./goo-blob": {
294
304
  "types": "./dist/goo-blob.d.ts",
295
305
  "import": "./dist/goo-blob.js"
@@ -306,6 +316,10 @@
306
316
  "types": "./dist/header-ribbon.d.ts",
307
317
  "import": "./dist/header-ribbon.js"
308
318
  },
319
+ "./constellation": {
320
+ "types": "./dist/constellation.d.ts",
321
+ "import": "./dist/constellation.js"
322
+ },
309
323
  "./metric-badge": {
310
324
  "types": "./dist/metric-badge.d.ts",
311
325
  "import": "./dist/metric-badge.js"
@@ -551,6 +565,7 @@
551
565
  "proof:vt-names": "node scripts/proof-vt-names.mjs",
552
566
  "proof:dock-animation-live": "node scripts/proof-dock-animation-live.mjs",
553
567
  "proof:dock-clip-reveal": "node scripts/proof-dock-clip-reveal.mjs",
568
+ "proof:dock-layering-polish": "node scripts/proof-dock-layering-polish.mjs",
554
569
  "proof:dock-motion-parity": "node scripts/proof-dock-motion-parity.mjs",
555
570
  "proof:dock-motion-single-source": "node scripts/proof-dock-motion-single-source.mjs",
556
571
  "proof:dock-opacity-lockstep": "node scripts/proof-dock-opacity-lockstep.mjs",
@@ -576,7 +591,10 @@
576
591
  "proof:frostShader-deleted": "node scripts/proof-frostshader-deleted.mjs",
577
592
  "proof:slider-two-only": "node scripts/proof-slider-two-only.mjs",
578
593
  "proof:storybook-ia": "node scripts/proof-storybook-ia.mjs",
594
+ "proof:storybook-complete": "node scripts/proof-storybook-complete.mjs",
579
595
  "proof:no-orphan-demo-route": "node scripts/proof-no-orphan-demo-route.mjs",
596
+ "proof:demo-dock-nav": "node scripts/proof-demo-dock-nav.mjs",
597
+ "proof:demo-dock-nav-runtime": "node scripts/proof-demo-dock-nav-runtime.mjs",
580
598
  "proof:font-canon": "node scripts/proof-font-canon.mjs",
581
599
  "proof:webgl-substrate-single": "node scripts/proof-webgl-substrate-single.mjs",
582
600
  "proof:blob-value-free": "node scripts/proof-blob-value-free.mjs",
@@ -584,7 +602,24 @@
584
602
  "proof:motion-value-free": "node scripts/proof-motion-value-free.mjs",
585
603
  "proof:no-value-default": "node scripts/proof-no-value-default.mjs",
586
604
  "proof:blob-space-gamma": "node scripts/proof-blob-space-gamma.mjs",
605
+ "proof:blob-smin-normalized": "node scripts/proof-blob-smin-normalized.mjs",
606
+ "proof:blob-gradient-unit-length": "node scripts/proof-blob-gradient-unit-length.mjs",
607
+ "proof:blob-spec-premult": "node scripts/proof-blob-spec-premult.mjs",
608
+ "proof:blob-interaction-prm": "node scripts/proof-blob-interaction-prm.mjs",
609
+ "proof:blob-mood-resolved": "node scripts/proof-blob-mood-resolved.mjs",
610
+ "proof:blob-tempo-suppression": "node scripts/proof-blob-tempo-suppression.mjs",
587
611
  "proof:aurora-space-gamma": "node scripts/proof-aurora-space-gamma.mjs",
612
+ "proof:aurora-oklch-interp": "node scripts/proof-aurora-oklch-interp.mjs",
613
+ "proof:aurora-derive-gamut": "vitest run tests/components/custom/aurora/derive-color.test.ts",
614
+ "proof:aurora-tensor-field": "node scripts/proof-aurora-tensor-field.mjs && vitest run tests/components/custom/aurora/painterly.test.ts",
615
+ "proof:aurora-impasto-relight": "node scripts/proof-aurora-impasto-relight.mjs",
616
+ "proof:aurora-vangogh-preset": "node scripts/proof-aurora-vangogh-preset.mjs",
617
+ "proof:aurora-oilpastel-medium": "node scripts/proof-aurora-oilpastel-medium.mjs",
618
+ "proof:aurora-atoms-roundtrip": "node scripts/proof-aurora-atoms-roundtrip.mjs",
619
+ "proof:aurora-wgsl-equivalence": "node scripts/proof-aurora-wgsl-equivalence.mjs",
620
+ "proof:aurora-backend-fallback": "node scripts/proof-aurora-backend-fallback.mjs",
621
+ "proof:webgpu-substrate-single": "node scripts/proof-webgpu-substrate-single.mjs",
622
+ "proof:aurora-interaction-prm": "node scripts/proof-aurora-interaction-prm.mjs",
588
623
  "proof:shader-shared-source": "node scripts/proof-shader-shared-source.mjs",
589
624
  "proof:blob-color-equivalence": "vitest run tests/components/custom/goo-blob/blob-color-equivalence.test.ts",
590
625
  "proof:fail-explicit": "node scripts/proof-fail-explicit.mjs",
@@ -597,9 +632,22 @@
597
632
  "proof:no-test-in-src": "node scripts/proof-no-test-in-src.mjs",
598
633
  "proof:spring-tokens-synced": "node scripts/proof-spring-tokens-synced.mjs",
599
634
  "proof:offscreen-pause": "node scripts/proof-offscreen-pause.mjs",
635
+ "proof:constellation-substrate-single": "node scripts/proof-constellation-substrate-single.mjs",
636
+ "proof:canvas2d-substrate": "vitest run tests/composables/glass/canvas2d/useCanvas2D.test.ts",
637
+ "proof:constellation-field": "vitest run tests/components/custom/constellation/constellationField.test.ts",
638
+ "proof:input-invalid-aria": "node scripts/proof-input-invalid-aria.mjs",
639
+ "proof:styling-hygiene": "node scripts/proof-styling-hygiene.mjs",
600
640
  "proof:subpath-enumeration": "node scripts/proof-subpath-enumeration.mjs",
601
641
  "proof:no-orphan-composable": "node scripts/proof-no-orphan-composable.mjs",
602
642
  "proof:speedtest-boundary": "node scripts/proof-speedtest-boundary.mjs",
643
+ "proof:glass-material-unified": "node scripts/proof-glass-material-unified.mjs",
644
+ "proof:glass-material-sota": "node scripts/proof-glass-material-sota.mjs",
645
+ "proof:glass-card-tiers": "node scripts/proof-glass-card-tiers.mjs",
646
+ "proof:primitive-affordance": "node scripts/proof-primitive-affordance.mjs",
647
+ "proof:reka-binding-idiom": "node scripts/proof-reka-binding-idiom.mjs",
648
+ "proof:animation-coherence": "node scripts/proof-animation-coherence.mjs",
649
+ "proof:design-md-current": "node scripts/proof-design-md-current.mjs",
650
+ "proof:naming-consistency": "node scripts/proof-naming-consistency.mjs",
603
651
  "proof:all": "node scripts/gates.mjs --run local",
604
652
  "gates:verify-ci": "node scripts/gates.mjs --verify-ci",
605
653
  "profile:bundle": "node scripts/profile-bundle.mjs",