@mkbabb/glass-ui 3.7.0 → 3.9.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 (261) hide show
  1. package/README.md +1 -6
  2. package/dist/CardAction-DuArVky-.js +157 -0
  3. package/dist/{CommandShortcut-CY0aQTz5.js → CommandShortcut-CefCj5mt.js} +7 -7
  4. package/dist/{ContextMenuSubContent-BeDz7G6f.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
  5. package/dist/{DataTable-gtPOLZvl.js → DataTable-CUHMukiQ.js} +4 -4
  6. package/dist/DeckProgress-Dmk4_AKN.js +23 -0
  7. package/dist/{DialogContent-DG1YMR-P.js → DialogContent-BRkT1cjP.js} +3 -3
  8. package/dist/{DialogFooter-BCIaDP15.js → DialogFooter-Gprw8H_A.js} +1 -1
  9. package/dist/{HoverPopover-DXpOEw1P.js → HoverPopover-2LOIW34a.js} +1 -1
  10. package/dist/{IconTooltip-Cu86JR4e.js → IconTooltip-yefK7cJc.js} +1 -1
  11. package/dist/{MetricBadge-D-bRaQUD.js → MetricBadge-lTc002u2.js} +1 -1
  12. package/dist/{Notification-B5WHP3_1.js → Notification-BxK8LZMw.js} +1 -1
  13. package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  14. package/dist/{PopoverContent-F1bWnYoh.js → PopoverContent-BId6ggf_.js} +1 -1
  15. package/dist/{Progress-c4vo4ALi.js → Progress-iEuD9pxG.js} +4 -4
  16. package/dist/{ScrollingText-BEp377U5.js → ScrollingText-BPP84wKo.js} +2 -2
  17. package/dist/{SelectScrollDownButton-DAo5NmY_.js → SelectScrollDownButton-T32cVFeM.js} +4 -4
  18. package/dist/{SelectSeparator-COFMJGng.js → SelectSeparator-C4Ql0gzV.js} +1 -1
  19. package/dist/{TabsList-COqIdW7i.js → TabsList-B8CVOQPC.js} +2 -2
  20. package/dist/{Toaster-BMaeziJJ.js → Toaster-1rYWrmAm.js} +1 -1
  21. package/dist/{ToggleGroupItem-C-AIkBUw.js → ToggleGroupItem-Cev4pOVK.js} +5 -5
  22. package/dist/animated-digit.js +1 -1
  23. package/dist/api/index.d.ts +5 -3
  24. package/dist/aurora.js +339 -408
  25. package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
  26. package/dist/badge.js +1 -1
  27. package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
  28. package/dist/button.js +1 -1
  29. package/dist/canvas.d.ts +1 -0
  30. package/dist/canvas.js +3 -0
  31. package/dist/card.js +1 -1
  32. package/dist/carousel.js +106 -105
  33. package/dist/collapsible.js +1 -1
  34. package/dist/{color-DjJCAQ6f.js → color-8jBjWiJ6.js} +22 -14
  35. package/dist/color.js +2 -2
  36. package/dist/command.js +1 -1
  37. package/dist/compile-DAjIoEy2.js +158 -0
  38. package/dist/components/custom/aurora/composables/atoms.d.ts +90 -25
  39. package/dist/components/custom/aurora/composables/color.d.ts +0 -12
  40. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +34 -23
  41. package/dist/components/custom/aurora/constants/presets.d.ts +10 -7
  42. package/dist/components/custom/aurora/constants/renderMode.d.ts +22 -0
  43. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
  44. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  45. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  46. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
  47. package/dist/components/custom/aurora/index.d.ts +3 -3
  48. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
  49. package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
  50. package/dist/components/custom/constellation/constellationField.d.ts +110 -5
  51. package/dist/components/custom/constellation/index.d.ts +2 -2
  52. package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
  53. package/dist/components/custom/dock/GlassDock.vue.d.ts +57 -67
  54. package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
  55. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
  56. package/dist/components/custom/dock/composables/index.d.ts +3 -0
  57. package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
  58. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
  59. package/dist/components/custom/dock/index.d.ts +4 -1
  60. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +13 -0
  61. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +23 -5
  62. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +2 -0
  63. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
  64. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +20 -5
  65. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  66. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  67. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  68. package/dist/components/custom/goo-blob/types.d.ts +8 -0
  69. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
  70. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
  71. package/dist/components/custom/tabs/index.d.ts +2 -5
  72. package/dist/components/ui/button/index.d.ts +1 -1
  73. package/dist/components/ui/card/Card.vue.d.ts +28 -10
  74. package/dist/components/ui/card/index.d.ts +1 -1
  75. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  76. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  77. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
  78. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
  79. package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
  80. package/dist/components/ui/slider/index.d.ts +14 -7
  81. package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
  82. package/dist/composables/color/index.d.ts +19 -0
  83. package/dist/composables/context/createContext.d.ts +1 -1
  84. package/dist/composables/dom/index.d.ts +1 -1
  85. package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
  86. package/dist/composables/glass/canvas2d/index.d.ts +2 -1
  87. package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
  88. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
  89. package/dist/composables/glass/index.d.ts +3 -1
  90. package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
  91. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +1 -1
  92. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +4 -0
  93. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +1 -1
  94. package/dist/composables/motion/core/index.d.ts +1 -0
  95. package/dist/configurator.js +1 -1
  96. package/dist/confirm-dialog.js +2 -2
  97. package/dist/constellation.js +143 -74
  98. package/dist/context-menu.js +2 -2
  99. package/dist/controls.js +1 -1
  100. package/dist/data-table.js +1 -1
  101. package/dist/deck-progress.d.ts +1 -0
  102. package/dist/deck-progress.js +2 -0
  103. package/dist/dialog.js +2 -2
  104. package/dist/dock.js +468 -354
  105. package/dist/{dockContext-DLgrVWsU.js → dockContext-BKeIMmNk.js} +1 -1
  106. package/dist/dom.js +6 -6
  107. package/dist/{dropdown-menu-BWpwutt0.js → dropdown-menu-D77jX6Df.js} +4 -4
  108. package/dist/dropdown-menu.js +1 -1
  109. package/dist/fonts/README.md +26 -18
  110. package/dist/forms.js +5 -5
  111. package/dist/fourier-field.js +35 -35
  112. package/dist/glass-panel.js +7 -7
  113. package/dist/glass-ui.css +1 -1
  114. package/dist/glass-ui.js +154 -169
  115. package/dist/goo-blob.js +361 -274
  116. package/dist/header-ribbon.js +1 -1
  117. package/dist/hover-card.js +1 -1
  118. package/dist/hover-popover.js +1 -1
  119. package/dist/icon-tooltip.js +1 -1
  120. package/dist/index.d.ts +1 -2
  121. package/dist/instrument-chassis.js +1 -1
  122. package/dist/instrument-rail.js +1 -1
  123. package/dist/label.js +1 -1
  124. package/dist/labeled-field.js +5 -5
  125. package/dist/{menuItemVariants-B4eFR5Ix.js → menuItemVariants-CCoBNkU5.js} +1 -1
  126. package/dist/metric-badge.js +1 -1
  127. package/dist/metric-stack.js +1 -1
  128. package/dist/motion-core.js +65 -65
  129. package/dist/motion.js +1 -1
  130. package/dist/notification.js +1 -1
  131. package/dist/number-field.js +1 -1
  132. package/dist/paper-backdrop.js +1 -1
  133. package/dist/popover.js +1 -1
  134. package/dist/progress.js +1 -1
  135. package/dist/pulse.js +2 -2
  136. package/dist/reactive.js +2 -2
  137. package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
  138. package/dist/scrolling-text.js +1 -1
  139. package/dist/search.js +9 -9
  140. package/dist/select.js +3 -3
  141. package/dist/separator.js +1 -1
  142. package/dist/{sheet-Cv1uO-Gq.js → sheet-VZEtNFvO.js} +2 -2
  143. package/dist/sheet.js +1 -1
  144. package/dist/slider-DC2mwuoe.js +142 -0
  145. package/dist/slider.js +1 -1
  146. package/dist/sortable-list.js +2 -2
  147. package/dist/status-dot.js +17 -16
  148. package/dist/styles/animations.css +6 -2
  149. package/dist/styles/components.css +1 -1
  150. package/dist/styles/dock/density.css +230 -0
  151. package/dist/styles/dock/layer-group.css +263 -0
  152. package/dist/styles/dock/layers.css +355 -0
  153. package/dist/styles/dock/morph.css +244 -0
  154. package/dist/styles/dock/overflow.css +201 -0
  155. package/dist/styles/dock/shell.css +457 -0
  156. package/dist/styles/dock-controls.css +187 -50
  157. package/dist/styles/dock.css +65 -1181
  158. package/dist/styles/fonts.css +0 -25
  159. package/dist/styles/glass.css +482 -102
  160. package/dist/styles/index.css +12 -11
  161. package/dist/styles/theme.css +60 -2
  162. package/dist/styles/tokens.css +625 -72
  163. package/dist/styles/typography.css +52 -69
  164. package/dist/styles/utilities.css +91 -40
  165. package/dist/styles/view-transition.css +12 -40
  166. package/dist/switch.js +1 -1
  167. package/dist/tabs.js +183 -152
  168. package/dist/timeline.js +3 -3
  169. package/dist/toast.js +1 -1
  170. package/dist/toggle-group.js +1 -1
  171. package/dist/tooltip.js +1 -1
  172. package/dist/typewriter.js +1 -1
  173. package/dist/{useCanvas2D-C31yfUGY.js → useCanvas2D-ClrQuZtp.js} +2 -1
  174. package/dist/{useConfiguratorState-B24TcgIn.js → useConfiguratorState-DxAqksK6.js} +24 -13
  175. package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
  176. package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
  177. package/dist/{useTextHighlight-aMPdEpkq.js → useTextHighlight-DON84L8w.js} +1 -1
  178. package/dist/{useTouchGate-YQRwyUGU.js → useTouchGate-WFyJYsth.js} +1 -1
  179. package/dist/vReveal-CqaCz_mC.js +44 -0
  180. package/dist/watercolor-dot.js +1 -1
  181. package/package.json +67 -36
  182. package/src/fonts/README.md +26 -18
  183. package/src/styles/animations.css +6 -2
  184. package/src/styles/dock/density.css +230 -0
  185. package/src/styles/dock/layer-group.css +263 -0
  186. package/src/styles/dock/layers.css +355 -0
  187. package/src/styles/dock/morph.css +244 -0
  188. package/src/styles/dock/overflow.css +201 -0
  189. package/src/styles/dock/shell.css +457 -0
  190. package/src/styles/dock-controls.css +187 -50
  191. package/src/styles/dock.css +65 -1181
  192. package/src/styles/fonts.css +0 -25
  193. package/src/styles/glass.css +482 -102
  194. package/src/styles/index.css +12 -11
  195. package/src/styles/theme.css +60 -2
  196. package/src/styles/tokens.css +625 -72
  197. package/src/styles/typography.css +52 -69
  198. package/src/styles/utilities.css +91 -40
  199. package/src/styles/view-transition.css +12 -40
  200. package/dist/CardAction-D8nSE62a.js +0 -163
  201. package/dist/DiscoGlyph-ZoBYpoxI.js +0 -132
  202. package/dist/GlyphFace-Ce_oe3tM.js +0 -51
  203. package/dist/UnderlineTabs-D_c1iYo-.js +0 -39
  204. package/dist/compile-iM4IUB66.js +0 -158
  205. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
  206. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
  207. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
  208. package/dist/components/custom/disco-glyph/index.d.ts +0 -1
  209. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
  210. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
  211. package/dist/components/custom/glass-carousel/index.d.ts +0 -4
  212. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
  213. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
  214. package/dist/components/custom/glyph-face/index.d.ts +0 -2
  215. package/dist/components/custom/glyph-face/keys.d.ts +0 -9
  216. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
  217. package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
  218. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
  219. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
  220. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
  221. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
  222. package/dist/disco-glyph.d.ts +0 -1
  223. package/dist/disco-glyph.js +0 -2
  224. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  225. package/dist/glass-carousel.d.ts +0 -1
  226. package/dist/glass-carousel.js +0 -214
  227. package/dist/glyph-face.d.ts +0 -1
  228. package/dist/glyph-face.js +0 -3
  229. package/dist/keys-Dyf_uTs5.js +0 -9
  230. package/dist/responsive-tabs.d.ts +0 -1
  231. package/dist/responsive-tabs.js +0 -95
  232. package/dist/slider-BA9wIs5e.js +0 -130
  233. package/dist/styles/disco-glyph.css +0 -26
  234. package/dist/styles/glyph-face.css +0 -92
  235. package/dist/useViewTransition-DaN5Zrox.js +0 -21
  236. package/dist/vReveal-BE2TsPoR.js +0 -24
  237. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  238. package/src/styles/disco-glyph.css +0 -26
  239. package/src/styles/glyph-face.css +0 -92
  240. /package/dist/{CollapsibleContent-D7UNsXQr.js → CollapsibleContent-CP9qF1v4.js} +0 -0
  241. /package/dist/{ContextMenuContent-DGKZX1Du.js → ContextMenuContent-DDa0v27s.js} +0 -0
  242. /package/dist/{HoverCardContent-Bn0UBMY9.js → HoverCardContent-B6CcQ8He.js} +0 -0
  243. /package/dist/{InstrumentChassis-BLJBl1BW.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
  244. /package/dist/{InstrumentRail-BElFwKyt.js → InstrumentRail-CUJ05YVG.js} +0 -0
  245. /package/dist/{Label-DBc7bKzZ.js → Label-zRfbQdCn.js} +0 -0
  246. /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-B1GkAjNb.js} +0 -0
  247. /package/dist/{PaperBackdrop-DCGoGatv.js → PaperBackdrop-CqwjnfLv.js} +0 -0
  248. /package/dist/{SelectGroup-BcaFjvP4.js → SelectGroup-BFiod7X2.js} +0 -0
  249. /package/dist/{Separator-DZyqsCum.js → Separator-D7sD7RKj.js} +0 -0
  250. /package/dist/{Switch-2rsAtDfA.js → Switch-LDKLmmgx.js} +0 -0
  251. /package/dist/{TooltipProvider-CD2IXfRv.js → TooltipProvider-CmZzCuaG.js} +0 -0
  252. /package/dist/{_plugin-vue_export-helper-gLzyemvl.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
  253. /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
  254. /package/dist/{createContext-CvNyBk4o.js → createContext-B44Sah_H.js} +0 -0
  255. /package/dist/{useGlassRenderer-HebgSEgN.js → useGlassRenderer-5I0YkI4t.js} +0 -0
  256. /package/dist/{useInterval-D3USn0yc.js → useInterval-Dsmqwi03.js} +0 -0
  257. /package/dist/{useResizeObserver-CSyxGxIX.js → useResizeObserver-CWCbk5Px.js} +0 -0
  258. /package/dist/{useSpringMount-LRZqJTaF.js → useSpringMount-BJSHcLl3.js} +0 -0
  259. /package/dist/{useTimer-DEJonOZa.js → useTimer-3xqf_54b.js} +0 -0
  260. /package/dist/{useUserInvalidAria-CQKjEfwP.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
  261. /package/dist/{useViewportReady-K96m-Mdv.js → useViewportReady-RIr5Wgkh.js} +0 -0
@@ -0,0 +1,92 @@
1
+ import { type HTMLAttributes } from "vue";
2
+ /** The canonical tab/option shape — one descriptor across all three variants. */
3
+ export interface SegmentedTabOption {
4
+ label: string;
5
+ value: string;
6
+ icon?: string;
7
+ disabled?: boolean;
8
+ tooltip?: string;
9
+ }
10
+ /** The three indicator chromes. `segmented` (default) = the muted pill-slider;
11
+ * `pill` = the solid `--foreground` pill; `underline` = the hairline rule. */
12
+ export type SegmentedTabsVariant = "segmented" | "pill" | "underline";
13
+ export interface SegmentedTabsResponsive {
14
+ /**
15
+ * CSS length consumed inside `(min-width: <breakpoint>)`. BELOW it the
16
+ * strip collapses to a `<Select>`; at/above it renders the tab strip.
17
+ * Defaults to `"640px"` (Tailwind `sm:`).
18
+ */
19
+ breakpoint?: string;
20
+ /**
21
+ * Optional subset shown in the desktop strip (the mobile Select keeps the
22
+ * full option list). Falls back to `options`.
23
+ */
24
+ desktopOptions?: SegmentedTabOption[] | null;
25
+ /** Accessible name for the mobile `<SelectTrigger>`. */
26
+ ariaLabel?: string;
27
+ /** Class merged onto the mobile `<SelectTrigger>` only. */
28
+ triggerClass?: HTMLAttributes["class"];
29
+ }
30
+ export interface SegmentedTabsProps {
31
+ options: SegmentedTabOption[];
32
+ /**
33
+ * Indicator chrome — `segmented` (DEFAULT, the pill-slider over a muted
34
+ * track), `pill` (solid foreground pill), `underline` (the hairline rule).
35
+ */
36
+ variant?: SegmentedTabsVariant;
37
+ /**
38
+ * Multi-select — when true the surface mutates as a ToggleGroup (N
39
+ * simultaneous pressed buttons, `role="group"`). Only valid on the
40
+ * `segmented`/`pill` variants; `underline` is panel-nav (single-select).
41
+ */
42
+ multiSelect?: boolean;
43
+ /**
44
+ * Tab-row overflow handling.
45
+ * - `"none"` (default) — inline-grid; tabs share width and clip.
46
+ * - `"scroll"` — flex row with intrinsic widths + edge fades; never clips.
47
+ * - `"auto"` — flex row with intrinsic widths + plain horizontal scroll.
48
+ */
49
+ overflow?: "none" | "scroll" | "auto";
50
+ /**
51
+ * Responsive collapse — below the breakpoint the strip becomes a `<Select>`
52
+ * (subsumes the former standalone ResponsiveTabs). `true` uses defaults;
53
+ * an object tunes the breakpoint / desktop subset / accessible name.
54
+ */
55
+ responsive?: boolean | SegmentedTabsResponsive;
56
+ class?: HTMLAttributes["class"];
57
+ }
58
+ type __VLS_Props = SegmentedTabsProps;
59
+ type __VLS_ModelProps = {
60
+ modelValue: string | string[];
61
+ };
62
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
63
+ declare var __VLS_50: {
64
+ option: SegmentedTabOption;
65
+ active: boolean;
66
+ }, __VLS_58: {
67
+ option: SegmentedTabOption;
68
+ active: boolean;
69
+ };
70
+ type __VLS_Slots = {} & {
71
+ option?: (props: typeof __VLS_50) => any;
72
+ } & {
73
+ option?: (props: typeof __VLS_58) => any;
74
+ };
75
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
76
+ "update:modelValue": (value: string | string[]) => any;
77
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
78
+ "onUpdate:modelValue"?: ((value: string | string[]) => any) | undefined;
79
+ }>, {
80
+ overflow: "none" | "scroll" | "auto";
81
+ variant: SegmentedTabsVariant;
82
+ responsive: boolean | SegmentedTabsResponsive;
83
+ multiSelect: boolean;
84
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
85
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
86
+ declare const _default: typeof __VLS_export;
87
+ export default _default;
88
+ type __VLS_WithSlots<T, S> = T & {
89
+ new (): {
90
+ $slots: S;
91
+ };
92
+ };
@@ -0,0 +1,49 @@
1
+ import { type Ref, type ComputedRef } from "vue";
2
+ import type { SegmentedTabOption } from "../SegmentedTabs.vue";
3
+ /**
4
+ * Package-private composable for `SegmentedTabs.vue` — owns the JS-measured
5
+ * indicator path: the single- and multi-select slider styles, the offset
6
+ * measure, the model/options re-measure watchers, and the ResizeObserver
7
+ * lifecycle. It ALSO owns the AX.W53 travel-squish: a velocity-driven,
8
+ * volume-preserving `--stretch` scalar the active indicator reads so it
9
+ * STRETCHES along its travel axis as it glides between tabs and settles to fit
10
+ * (the Material 3 ELASTIC / Apple Liquid-Glass register, capped LOW).
11
+ *
12
+ * The composable is the SOLE writer of the JS slider styles. The measure path
13
+ * runs only on the multi-select OR `@supports not (anchor)` branch — on an
14
+ * anchor-supporting single-select engine the CSS `anchor-name` owns the slider
15
+ * position and that path stays dormant (no RO is constructed, no measure runs).
16
+ * The squish is independent of the position path: it is a transient `--stretch`
17
+ * write driven on EVERY selection (anchor or JS engine) and reads from
18
+ * `--tab-indicator-max-stretch`, so the elastic warp lands on all three
19
+ * variants. Honors `prefers-reduced-motion` (no squish under reduce).
20
+ */
21
+ export interface UseTabIndicatorParams {
22
+ /** The container scroller root (observed by the ResizeObserver). */
23
+ containerRef: Ref<HTMLElement | null>;
24
+ /** The active indicator element (the squish `--stretch` write target). */
25
+ indicatorRef: Ref<HTMLElement | null>;
26
+ /** Per-option button refs, index-aligned to `options`. */
27
+ buttonRefs: Ref<HTMLElement[]>;
28
+ /** The tab options (re-measure on change). */
29
+ options: ComputedRef<SegmentedTabOption[]>;
30
+ /** The defineModel value (re-measure on change). */
31
+ model: Ref<string | string[] | undefined>;
32
+ /** True for the multi-select path. */
33
+ multiSelect: ComputedRef<boolean>;
34
+ /** Whether the browser supports CSS anchor positioning. */
35
+ anchorSupported: boolean;
36
+ /** True when ANY JS slider writer is live (gates RO/watcher attach). */
37
+ jsSliderActive: ComputedRef<boolean>;
38
+ /** The active option values (used by the multi-slider measure). */
39
+ activeValues: ComputedRef<string[]>;
40
+ }
41
+ export interface UseTabIndicatorReturn {
42
+ /** Inline style for the single-select JS slider. */
43
+ singleSliderStyle: Ref<Record<string, string>>;
44
+ /** Inline styles for each active multi-select slider, keyed by value. */
45
+ multiSliderStyles: Ref<Record<string, Record<string, string>>>;
46
+ /** Imperatively kick the travel-squish on a selection at `idx`. */
47
+ squishOnTravel: (toIdx: number) => void;
48
+ }
49
+ export declare function useTabIndicator(params: UseTabIndicatorParams): UseTabIndicatorReturn;
@@ -1,5 +1,2 @@
1
- export { default as UnderlineTabs } from "./UnderlineTabs.vue";
2
- export { default as BouncyTabs } from "./BouncyTabs.vue";
3
- export { default as BouncyToggle } from "./BouncyToggle.vue";
4
- export type { TabOption } from "./UnderlineTabs.vue";
5
- export type { ToggleOption, BouncyToggleProps } from "./BouncyToggle.vue";
1
+ export { default as SegmentedTabs } from "./SegmentedTabs.vue";
2
+ export type { SegmentedTabOption, SegmentedTabsVariant, SegmentedTabsProps, SegmentedTabsResponsive, } from "./SegmentedTabs.vue";
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  export { default as Button } from './Button.vue';
3
3
  export declare const buttonVariants: (props?: ({
4
- variant?: "link" | "default" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null | undefined;
4
+ variant?: "link" | "default" | "solid" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null | undefined;
5
5
  size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-sm" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export type ButtonVariants = VariantProps<typeof buttonVariants>;
@@ -1,16 +1,18 @@
1
1
  import { type HTMLAttributes } from "vue";
2
2
  import { type PrimitiveProps } from "reka-ui";
3
3
  /**
4
- * The five-tier glass surface ladder. Maps 1:1 to `.glass-{tier}` in glass.css
5
- * after the v0.8.0 R3-spec rename:
4
+ * The glass surface ladder. Maps 1:1 to `.glass-{tier}` in glass.css after the
5
+ * v0.8.0 R3-spec rename:
6
6
  *
7
7
  * wash — lightest (~0.30α) : inline workspace chrome, scroll-pane host
8
8
  * quiet — light (~0.50α) : ambient panels, secondary surfaces
9
9
  * resting — canonical (~0.65α) : the protagonist plate (default)
10
10
  * floating — heavy (~0.80α) : popover-class, login surfaces
11
11
  * overlay — heaviest (~0.95α + blur) : modal-on-modal, dialog over content
12
+ * opaque — `--glass-level:0` escape : the solid-card opt-out (AX.W54), maps to
13
+ * `.glass-opaque` through the same `glass-${tier}` rung as the rest
12
14
  */
13
- export type CardTier = "wash" | "quiet" | "resting" | "floating" | "overlay";
15
+ export type CardTier = "wash" | "quiet" | "resting" | "floating" | "overlay" | "opaque";
14
16
  /**
15
17
  * Surface decoration register — orthogonal to `tier`/`shadow`/`grain`.
16
18
  *
@@ -20,6 +22,21 @@ export type CardTier = "wash" | "quiet" | "resting" | "floating" | "overlay";
20
22
  * ANY tier; the retired `<CartoonCard>` was `tier="quiet" surface="cartoon"`.
21
23
  */
22
24
  export type CardSurface = "glass" | "cartoon";
25
+ /**
26
+ * Specular catch-light register (AX.W09) — the pointer-anchored moving lens on a
27
+ * glass card.
28
+ *
29
+ * off — NO catch-light (default). The clean resting panel: a data/content
30
+ * `surface="glass"` card over any backplate reads flat — no centred
31
+ * white bloom, no pointer wiring. The §24 three-consumer-confirmed
32
+ * default for the common content-card case.
33
+ * subtle — the token-ladder lens: the pointer-anchored catch-light wakes on
34
+ * hover/active at the SUBTLE `--glass-specular-intensity-*` magnitudes.
35
+ * The explicit opt-in for a hero/chrome surface.
36
+ * full — the brighter pre-tune rung set, for the busy-backdrop case the recipe
37
+ * was originally authored over (a local intensity-token override).
38
+ */
39
+ export type CardSpecular = "off" | "subtle" | "full";
23
40
  interface Props extends PrimitiveProps {
24
41
  /** Surface tier; selects one rung of the glass ladder. Default `resting`. */
25
42
  tier?: CardTier;
@@ -33,12 +50,13 @@ interface Props extends PrimitiveProps {
33
50
  /** `::after` paper-grain overlay. Off for scroll panes (the grain conflicts
34
51
  * with overflow:auto repaints). */
35
52
  grain?: boolean;
36
- /** Opt-in interactive register (AW.W24). A glass card with `hover` wakes the
37
- * dormant pointer-anchored specular catch-light: it tracks the cursor across
38
- * the surface (the AV.W15 moving-glass illuminate) instead of the centred
39
- * var() floor. Static cards (default) keep the centred catch-light and never
40
- * attach the listener. `cartoon` surfaces own their own sticker lift. */
41
- hover?: boolean;
53
+ /** Specular catch-light register (AX.W09). `off` (default) keeps the card
54
+ * CLEAN — no pointer-anchored lens, clean over any backplate (the §24
55
+ * three-consumer-confirmed default for a data/content card). `subtle` wakes
56
+ * the pointer-anchored moving catch-light at the token-ladder magnitudes (a
57
+ * hero/chrome opt-in); `full` runs the brighter pre-tune rung set for a busy
58
+ * backdrop. Only `glass` surfaces wire it; `cartoon` owns its own sticker lift. */
59
+ specular?: CardSpecular;
42
60
  class?: HTMLAttributes["class"];
43
61
  }
44
62
  declare var __VLS_10: {};
@@ -51,7 +69,7 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, i
51
69
  tier: CardTier;
52
70
  surface: CardSurface;
53
71
  grain: boolean;
54
- hover: boolean;
72
+ specular: CardSpecular;
55
73
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
56
74
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
57
75
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,4 @@
1
- export { default as Card, type CardTier, type CardSurface } from "./Card.vue";
1
+ export { default as Card, type CardTier, type CardSurface, type CardSpecular, } from "./Card.vue";
2
2
  export { default as CardHeader } from "./CardHeader.vue";
3
3
  export { default as CardTitle } from "./CardTitle.vue";
4
4
  export { default as CardDescription } from "./CardDescription.vue";
@@ -10,7 +10,7 @@ type __VLS_Slots = {} & {
10
10
  };
11
11
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
12
12
  size: "default" | "xs" | "sm" | "lg" | "icon" | "icon-sm" | null;
13
- variant: "link" | "default" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null;
13
+ variant: "link" | "default" | "solid" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null;
14
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
15
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
16
16
  declare const _default: typeof __VLS_export;
@@ -10,7 +10,7 @@ type __VLS_Slots = {} & {
10
10
  };
11
11
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
12
12
  size: "default" | "xs" | "sm" | "lg" | "icon" | "icon-sm" | null;
13
- variant: "link" | "default" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null;
13
+ variant: "link" | "default" | "solid" | "primary-audacious" | "gold-audacious" | "destructive" | "outline" | "secondary" | "accent" | "ghost" | "glass" | "glass-wash" | "ai" | null;
14
14
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
15
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
16
16
  declare const _default: typeof __VLS_export;
@@ -2,14 +2,13 @@ import type { HTMLAttributes } from "vue";
2
2
  /**
3
3
  * GlassCarouselPager — audacious carousel pager substrate.
4
4
  *
5
- * Lifts the hand-rolled chevron-prev + counter-pill + chevron-next + state-toggle
6
- * row from `containers/glass-carousel.vue:127-157` into a canonical primitive.
5
+ * A canonical chevron-prev + counter-pill + chevron-next + state-toggle row.
7
6
  * Composes `<Button variant="outline" size="icon">` chevrons with a glass-card
8
7
  * counter pill and an optional toggle slot for collapse/expand affordances.
9
8
  *
10
9
  * Standalone: accepts `:index` / `:total` props and emits `@prev` / `@next` /
11
- * `@select(i)`, so it composes equally with `<GlassCarousel>` (manual state) and
12
- * `<Carousel>` (embla — wire via `useCarousel`).
10
+ * `@select(i)`, so it composes with `<Carousel>` (embla — wire via
11
+ * `useCarousel`) or any manual-state host.
13
12
  */
14
13
  type __VLS_Props = {
15
14
  /** Current zero-based slide index. */
@@ -1,10 +1,20 @@
1
1
  import { type HTMLAttributes } from "vue";
2
2
  import { type ProgressRootProps } from "reka-ui";
3
3
  /**
4
- * Default progress variant — `bg-secondary` rail + `bg-primary` indicator with a
5
- * `translateX(-%)` intake-pulse. The plainest rung; no lifecycle motion grammar
6
- * (that lives on the gradient variant). The thin `Progress` dispatcher routes
7
- * here for `variant="default"`.
4
+ * Default progress variant — a `--progress-track` rail + a `--progress-fill`
5
+ * indicator with a `translateX(-%)` intake-pulse. The plainest rung; no lifecycle
6
+ * motion grammar (that lives on the gradient variant). The thin `Progress`
7
+ * dispatcher routes here for `variant="default"`.
8
+ *
9
+ * Token-read parity with the `gradient` variant (AX.W24 F1): the rail/indicator
10
+ * colour read `--progress-track`/`--progress-fill` (fallbacks `var(--secondary)`/
11
+ * `var(--primary)`) as Tailwind arbitrary properties — `bg-[var(--token,…)]` /
12
+ * `[background:var(--token,…)]` — NOT the `bg-secondary`/`bg-primary` utility
13
+ * classes. A `bg-primary` utility lives in `@layer utilities`, which ALWAYS
14
+ * outranks the `@layer components` `.glass-progress-rail` recipe regardless of
15
+ * source order, so a `:root { --progress-fill }` (or `.glass-progress-rail`'s
16
+ * token-set) override was a silent no-op on the default variant. Reading the token
17
+ * at source makes the `default` variant token-retintable for EVERY consumer.
8
18
  */
9
19
  type __VLS_Props = ProgressRootProps & {
10
20
  class?: HTMLAttributes["class"];
@@ -21,6 +21,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
21
21
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
22
22
  "onUpdate:modelValue"?: ((payload: number[] | undefined) => any) | undefined;
23
23
  onValueCommit?: ((payload: number[]) => any) | undefined;
24
- }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
24
+ }>, {
25
+ keepDockOpen: boolean;
26
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
27
  declare const _default: typeof __VLS_export;
26
28
  export default _default;
@@ -9,15 +9,22 @@ export { default as Slider } from './Slider.vue';
9
9
  * `.slider-thumb` paint. The size axis lifts pure geometry via CSS vars
10
10
  * (`--slider-track-height`, `--slider-thumb-size`) the SFC defaults read.
11
11
  *
12
- * Exactly two canonical recipes ship:
13
- * standard — the continuous rounded iOS knob: a fully-circular, borderless
14
- * thumb that sits in the track and reads as a swelling of the
15
- * capsule, with halo-on-state and the iOS press spring. This is
16
- * the general-purpose glass-scrubber knob and the default.
17
- * spectrum — the gradient-track color slider: a tall capsule whose
12
+ * Exactly two canonical recipes ship (AX.W59 redesign):
13
+ * standard — the INTEGRATED-CYLINDER glass slider: the fill is ONE
14
+ * continuous glass rounded-pill (W52 backdrop + edge rim, tinted
15
+ * to `--primary`) pulled left/right; its rounded LEADING edge IS
16
+ * the grab. There is NO visible demarcation between thumb and
17
+ * fill — the reka SliderThumb stays mounted (a11y/keyboard/focus)
18
+ * but is styled as the cylinder's slim leading CAP (a faint
19
+ * specular grip, not a detached circle). Halo-on-state + the iOS
20
+ * press spring. This is the general-purpose glass scrubber and
21
+ * the default.
22
+ * spectrum — the value.js gradient-track color slider: a tall capsule whose
18
23
  * background is a consumer-supplied `--slider-track-bg`
19
24
  * linear-gradient (the LCH/hue ramp), a transparent range, and a
20
- * small ringed knob that reads against any track hue. This is the
25
+ * SQUIRCLE thumb the HEIGHT of the track (the iOS color-picker
26
+ * idiom — `corner-shape: superellipse()` via `--corner-shape-thumb`,
27
+ * @supports-gated over a `--radius-lg` round fallback). This is the
21
28
  * aurora/blob color-picking surface.
22
29
  *
23
30
  * Sizes:
@@ -5,7 +5,7 @@ type __VLS_Props = TabsListProps & {
5
5
  /**
6
6
  * AW.W25 — render the spring `TabsIndicator` pill behind the triggers so
7
7
  * the base default `<Tabs>` matches its own indicator primitive (the
8
- * polished pill previously lived only in custom BouncyTabs; the base
8
+ * polished pill previously lived only in the custom SegmentedTabs; the base
9
9
  * under-delivered vs its own `TabsIndicator.vue`). Default `true`. Set
10
10
  * `:indicator="false"` for a list that drives its own active-state vocab.
11
11
  */
@@ -20,6 +20,25 @@ export type ColorResolver = (css: string) => [number, number, number];
20
20
  * keeps them off the GPU). The equivalence canary asserts the COMPOSED path.
21
21
  */
22
22
  export declare function oklchToLinear(stop: OklchStop): [number, number, number];
23
+ /**
24
+ * Warm-white catch-light → LINEAR-sRGB triple (AX.W11). The OKLCh-principled light
25
+ * tint the painterly relight (aurora's impasto sheen, the blob's `warmCream`) adds
26
+ * in LINEAR light — one shared OKLCh derivation both surfaces' light models route
27
+ * through instead of an eyeballed sRGB-ish literal. Just `oklchToLinear({L,C,h})`
28
+ * with a self-documenting name (the warm-light/cool-shadow temperature-coupling rule
29
+ * the literature prescribes is "the catch-light is a warm, near-white OKLCh anchor").
30
+ *
31
+ * Aurora's default anchor is `(0.985, 0.0125, 77.5°)` — the OKLCh anchor that
32
+ * reproduces the prior eyeballed `[1.0, 0.95, 0.88]` warm-white to <1e-3 linear (so
33
+ * the live relight reads identically; the seam fix is invisible to the eye). The
34
+ * blob's `warmCream` anchor is `(0.97, 0.03, 85°)` — a deeper, more-saturated cream;
35
+ * W15 re-routes the blob default through THIS helper at that anchor (the cross-surface
36
+ * unification: ONE OKLCh derive, each surface its own principled anchor).
37
+ *
38
+ * An invalid (non-finite) anchor THROWS — a library-internal contract violation, not
39
+ * a silent grey return (the fail-explicit precept; a stale anchor must surface loud).
40
+ */
41
+ export declare function warmCatchLight(L: number, C: number, hDeg: number): [number, number, number];
23
42
  /**
24
43
  * OKLCh stop → GAMMA-sRGB in [0,1] — the blob's faithful-lift exit (DEC-AT-7's W7
25
44
  * GAMMA space). value.js's `oklabToRgb255` returns gamma-encoded 0..255 (HSV/sRGB,
@@ -1,7 +1,7 @@
1
1
  import { type InjectionKey } from "vue";
2
2
  /**
3
3
  * Domain-neutral provide/inject DI factory pair — the single source the dock,
4
- * dock-layer-group, toggle-group, sortable-list, glyph-face, and configurator
4
+ * dock-layer-group, toggle-group, sortable-list, and configurator
5
5
  * contexts collapse onto (AV.W14). Generalizes the four hand-rolled
6
6
  * provide/inject/throw triplets into ONE typed factory so a `*_KEY:
7
7
  * InjectionKey<T>` declaration + its `provide`/`use`/throw boilerplate is never
@@ -1,9 +1,9 @@
1
1
  export * from "./useResizeObserver";
2
2
  export * from "./useTouchGate";
3
3
  export * from "./useTokenColor";
4
+ export * from "./useResolveTokenColor";
4
5
  export * from "./useClipboard";
5
6
  export * from "./useUserInvalidAria";
6
- export * from "./useTextHighlight";
7
7
  export * from "./useBreakpoint";
8
8
  export * from "./useIdleReady";
9
9
  export * from "./useViewportReady";
@@ -0,0 +1,27 @@
1
+ /** A bounded LRU-ish cache for the un-wrap (clears wholesale past the cap). */
2
+ export interface ResolveTokenColorCache {
3
+ resolve: (css: string, el: HTMLElement | null) => string;
4
+ /** Drop every cached entry — call on a cascade change (dark-mode flip) so a token re-resolves. */
5
+ invalidate: () => void;
6
+ }
7
+ /**
8
+ * Un-wrap a `var(--token)` color to a concrete `rgb(...)` via a single cached cascade
9
+ * read; a literal (no `var()`) passes straight through. Paints `css` onto the element's
10
+ * `color` property — a `var(--token)` painted on a real CSS property resolves through
11
+ * the cascade, so `getComputedStyle(el).color` returns the concrete `rgb(...)` — then
12
+ * restores the prior value. SSR-safe (returns `css` unchanged when `window`/`el` are
13
+ * absent).
14
+ *
15
+ * @param css the color string (a `var(--token)` wrapper or a literal)
16
+ * @param el the element to resolve the cascade against (the host wrapper)
17
+ * @returns the concrete color string the `ColorResolver` can parse
18
+ */
19
+ export declare function resolveTokenColor(css: string, el: HTMLElement | null): string;
20
+ /**
21
+ * Build a bounded cache around `resolveTokenColor` — the un-wrap (a forced sync
22
+ * reflow) runs once per unique color string. `invalidate()` drops every entry so a
23
+ * token re-resolves on a dark-mode flip (the SFC observes `<html>.class` and calls it).
24
+ *
25
+ * @param maxEntries the cache cap before a wholesale clear (default 256)
26
+ */
27
+ export declare function createTokenColorCache(maxEntries?: number): ResolveTokenColorCache;
@@ -1,2 +1,3 @@
1
- export { createCanvas2D } from "./useCanvas2D";
1
+ export { useCanvas2D, useCanvasLifecycle } from "./useCanvas2D";
2
2
  export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./useCanvas2D";
3
+ export { resolveCanvasColor } from "./resolveCanvasColor";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Resolve a CSS custom property or color value to a Canvas2D-VALID
3
+ * `rgb()`/`rgba()` string.
4
+ *
5
+ * @param cssVar a `--custom-property` NAME (resolved as `var(<name>)`) OR a full
6
+ * CSS color value (`light-dark(...)`, `color-mix(...)`, `var(...)`, `oklch()`,
7
+ * `hsl()`, hex, a named color). A bare `--token` is wrapped as `var(--token)`.
8
+ * @param el an element ON the cascade — the canvas host or any descendant. The
9
+ * probe is appended here so it inherits `el`'s `color-scheme` + `--token`
10
+ * cascade; the resolved color reflects the live theme at `el`.
11
+ * @returns the browser-resolved `rgb()`/`rgba()` string, ready to hand straight
12
+ * to `ctx.strokeStyle`/`ctx.fillStyle`. On SSR / no-DOM, returns the input
13
+ * `cssVar` unchanged (the befitting-silent fallback).
14
+ *
15
+ * @example
16
+ * // A `light-dark()` `--foreground` token that Canvas2D would reject raw:
17
+ * ctx.strokeStyle = resolveCanvasColor("--foreground", canvas);
18
+ * // → "rgb(28, 25, 23)" in light, "rgb(250, 250, 249)" in dark — NOT black.
19
+ */
20
+ export declare function resolveCanvasColor(cssVar: string, el: HTMLElement): string;
@@ -45,4 +45,18 @@ export interface Canvas2DHandle {
45
45
  /** The live `prefers-reduced-motion: reduce` state (consumers read it to skip stepping). */
46
46
  readonly reducedMotion: boolean;
47
47
  }
48
- export declare function createCanvas2D(options: Canvas2DOptions): Canvas2DHandle;
48
+ /**
49
+ * The Canvas2D lifecycle substrate — the park/freeze/dispose twin of
50
+ * `useWebGLCanvas`. Returns an imperative {@link Canvas2DHandle} (the same
51
+ * handle idiom the WebGL twin uses — an imperative canvas seam is NOT a
52
+ * ref-bundle). `useCanvasLifecycle` is the alias-of-record for the
53
+ * lifecycle-only framing; both name the same factory.
54
+ */
55
+ export declare function useCanvas2D(options: Canvas2DOptions): Canvas2DHandle;
56
+ /**
57
+ * Alias-of-record for {@link useCanvas2D} — the lifecycle-only framing (the
58
+ * park/freeze/dispose machinery, paralleling the WebGL substrate's
59
+ * `createCanvasLifecycle`). Same factory, same handle; reach for this name when
60
+ * the lifecycle (not the 2D drawing) is the consumer's emphasis.
61
+ */
62
+ export declare const useCanvasLifecycle: typeof useCanvas2D;
@@ -1,3 +1,5 @@
1
1
  export { useGlassRenderer, createGlassFilter, destroyGlassFilter, type GlassTier, type GlassFilterState, type UseGlassRendererReturn, } from "./useGlassRenderer";
2
- export { createCanvas2D } from "./canvas2d";
2
+ export { useSpecularTracking } from "./useSpecularTracking";
3
+ export type { UseSpecularTracking } from "./useSpecularTracking";
4
+ export { useCanvas2D, useCanvasLifecycle, resolveCanvasColor } from "./canvas2d";
3
5
  export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./canvas2d";
@@ -0,0 +1,33 @@
1
+ import { ref, type CSSProperties } from "vue";
2
+ /**
3
+ * `useSpecularTracking` — the pointer-anchored moving-specular write seam
4
+ * (AX.W09). The single DRY home for the catch-light position write that was
5
+ * hand-copied VERBATIM in `Card.vue` and `DockIconButton.vue`.
6
+ *
7
+ * On pointer-move it writes the cursor position (`--mouse-x`/`--mouse-y`, as
8
+ * percentages of the host box) onto the host's inline style; the unified
9
+ * `.glass-material::before` recipe (`glass.css`) MAPS that host write onto its
10
+ * typed `--specular-x`/`--specular-y` channel and paints the travelling glow.
11
+ *
12
+ * VOCAB (HARDENING §G #28): `--mouse-x`/`--mouse-y` is the HOST WRITE this seam
13
+ * owns; `--specular-x`/`--specular-y` is the CSS-internal MAPPED channel the
14
+ * recipe reads. The host writes `--mouse-x/y`; the recipe maps it.
15
+ *
16
+ * The catch-light MAGNITUDE rides the `--glass-specular-intensity-{rest,hover,
17
+ * active}` token cohort (tokens.css) the recipe reads — this seam only feeds the
18
+ * position. The recipe's rest rung is `0` (dormant) so an UNWIRED surface is
19
+ * clean; calling this seam is the wire-or-omit opt-in that wakes the lens on
20
+ * hover/active.
21
+ *
22
+ * PRM-aware: under `prefers-reduced-motion: reduce` the seam DOES NOT write the
23
+ * position (the CSS half pins the catch-light static at the centred `50%`
24
+ * fallback). The write is style-only — no reflow, no re-render — and inert until
25
+ * the user actually moves the pointer over a wired host.
26
+ */
27
+ export interface UseSpecularTracking {
28
+ /** Bind to the host element's `:style`. Carries the `--mouse-x/--mouse-y` write. */
29
+ specularStyle: ReturnType<typeof ref<CSSProperties>>;
30
+ /** Bind to the host's `@pointermove`. Writes the cursor position (PRM-gated). */
31
+ onPointerMove: (event: PointerEvent) => void;
32
+ }
33
+ export declare function useSpecularTracking(): UseSpecularTracking;
@@ -1,4 +1,4 @@
1
- export type CanvasSuspendReason = "tab-hidden" | "off-screen" | "manual";
1
+ export type CanvasSuspendReason = "tab-hidden" | "off-screen" | "off-screen-io" | "manual";
2
2
  /** The per-frame hooks a backend's `buildContext` returns to the lifecycle core. */
3
3
  export interface CanvasFrameHooks {
4
4
  /** Draw one frame at `timeSec`. */
@@ -1,6 +1,10 @@
1
1
  export declare const OETF_GLSL = "\nfloat srgbToLinearCh(float c) {\n return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4);\n}\nvec3 srgbToLinear(vec3 c) {\n return vec3(srgbToLinearCh(c.r), srgbToLinearCh(c.g), srgbToLinearCh(c.b));\n}\n\nfloat linearToSrgbCh(float c) {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\nvec3 linearToSrgb(vec3 c) {\n return vec3(linearToSrgbCh(c.r), linearToSrgbCh(c.g), linearToSrgbCh(c.b));\n}";
2
2
  export declare const FBM_ROT_GLSL = "const mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);";
3
3
  export declare const OKLCH_MATRICES_GLSL = "\n// value.js LINEAR_SRGB_TO_LMS (constants.ts), row-major; written here as GLSL\n// columns (= the transpose) so mat3 * vec3 evaluates the row-major M\u00B7v.\nconst mat3 LINEAR_SRGB_TO_LMS = mat3(\n 0.4122214708, 0.2119034982, 0.0883024619,\n 0.5363325363, 0.6806995451, 0.2817188376,\n 0.0514459929, 0.1073969566, 0.6299787005\n);\n\n// value.js srgbToOKLab's INLINE LMS\u2192OKLab coefficients (gamut.ts lines 295-297 \u2014\n// these differ at the ~1e-9 digit from LMS_TO_OKLAB_MATRIX; use the inline ones to\n// mirror the exact value.js path), row-major \u2192 GLSL columns.\nconst mat3 LMS_TO_OKLAB = mat3(\n 0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660\n);\n\n// value.js OKLAB_TO_LMS_COEFF (constants.ts), row-major \u2192 GLSL columns. Rows:\n// l = [1, 0.3963377774, 0.2158037573], m = [1, -0.1055613458, -0.0638541728],\n// s = [1, -0.0894841775, -1.2914855480].\nconst mat3 OKLAB_TO_LMS = mat3(\n 1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480\n);\n\n// value.js LMS_TO_LINEAR_SRGB (constants.ts), row-major \u2192 GLSL columns.\nconst mat3 LMS_TO_LINEAR_SRGB = mat3(\n 4.0767416621, -1.2684380046, -0.0041960863,\n -3.3077115913, 2.6097574011, -0.7034186147,\n 0.2309699292, -0.3413193965, 1.7076147010\n);\n\n// Gamma sRGB \u2192 raw OKLab (L, a, b). Mirrors value.js srgbToOKLab.\nvec3 srgbToOklab(vec3 c) {\n vec3 lin = srgbToLinear(c);\n vec3 lms = LINEAR_SRGB_TO_LMS * lin;\n vec3 lmsCbrt = sign(lms) * pow(abs(lms), vec3(1.0 / 3.0));\n return LMS_TO_OKLAB * lmsCbrt;\n}\n\n// Raw OKLab (L, a, b) \u2192 linear sRGB. Mirrors value.js oklabToLinearSRGB.\nvec3 oklabToLinearSrgb(vec3 lab) {\n vec3 lms_ = OKLAB_TO_LMS * lab;\n vec3 lms = lms_ * lms_ * lms_;\n return LMS_TO_LINEAR_SRGB * lms;\n}\n\n// OKLab \u2192 OKLCh: H in RADIANS. Mirrors value.js rawOklabToOklch (which returns\n// degrees; we stay in radians and only fold to [0, 2pi)).\nvec3 oklabToOklch(vec3 lab) {\n float C = length(lab.yz);\n float H = atan(lab.z, lab.y);\n if (H < 0.0) H += 2.0 * PI;\n return vec3(lab.x, C, H);\n}\n\n// OKLCh (H radians) \u2192 OKLab. Mirrors value.js rawOklchToOklab.\nvec3 oklchToOklab(vec3 lch) {\n return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}";
4
+ export declare const PALETTE_RAMP_GLSL = "\n// value.js interpolateHue in the NORMALIZED-TURNS domain (h_rad/TAU \u2192 turns, the\n// exact .5/+1.0 branch per method, fract() wrap, *TAU back). A radians-native port\n// (PI thresholds / +TAU wrap) diverges 180\u00B0 at the antipode. methods: 0 shorter,\n// 1 longer, 2 increasing, 3 decreasing.\nfloat interpolateHueTurns(float h0, float h1, float t, int method) {\n float TAU = 2.0 * PI;\n float a = h0 / TAU;\n float b = h1 / TAU;\n float i = b - a;\n if (method == 0) { // shorter\n if (i > 0.5) a += 1.0; else if (i < -0.5) b += 1.0;\n } else if (method == 1) { // longer\n if (i > 0.0 && i < 0.5) a += 1.0; else if (i > -0.5 && i <= 0.0) b += 1.0;\n } else if (method == 2) { // increasing\n if (i < 0.0) b += 1.0;\n } else { // decreasing\n if (i > 0.0) a += 1.0;\n }\n float r = a + t * (b - a);\n r = fract(r); // (r % 1 + 1) % 1 \u2014 fract is non-negative in GLSL\n return r * TAU; // back to radians\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLab-rectangular interpolation \u2192 linear sRGB. Holds\n// chroma across the ramp (no grey midpoint). The default/shorter ramp path.\nvec3 mixPaletteOklab(vec3 linA, vec3 linB, float t) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lab = mix(labA, labB, t);\n return oklabToLinearSrgb(lab);\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLCh interpolation along the huePath arc \u2192 linear\n// sRGB. L and C lerp; H walks the chosen arc. The deliberate-rainbow path.\nvec3 mixPaletteOklchArc(vec3 linA, vec3 linB, float t, int method) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lchA = oklabToOklch(labA);\n vec3 lchB = oklabToOklch(labB);\n float L = mix(lchA.x, lchB.x, t);\n float C = mix(lchA.y, lchB.y, t);\n float H = interpolateHueTurns(lchA.z, lchB.z, t, method);\n return oklabToLinearSrgb(oklchToOklab(vec3(L, C, H)));\n}\n\n// The ramp dispatcher both samplePalette ports splice. tRaw is the raw inter-stop\n// parameter [0,1]; the smoothstep ease + the huePath branch live HERE so the GLSL\n// and WGSL ramps are character-for-character one source. increasing(2)/decreasing(3)\n// take the OKLCh hue-arc (rainbow sweep); every other method takes the OKLab-\n// rectangular straight line (no hue detour).\nvec3 samplePaletteRamp(vec3 a, vec3 b, float tRaw, int huePath) {\n float t = smoothstep(0.0, 1.0, tRaw);\n if (huePath == 2 || huePath == 3) {\n return mixPaletteOklchArc(a, b, t, huePath);\n }\n return mixPaletteOklab(a, b, t);\n}";
5
+ export declare const PCG_HASH_GLSL = "\n// Jarzynski PCG2D \u2014 uvec2 \u2192 uvec2 permuted-congruential hash (JCGT 2020).\nuvec2 pcg2d(uvec2 v) {\n v = v * 1664525u + 1013904223u;\n v.x += v.y * 1664525u;\n v.y += v.x * 1664525u;\n v = v ^ (v >> 16u);\n v.x += v.y * 1664525u;\n v.y += v.x * 1664525u;\n v = v ^ (v >> 16u);\n return v;\n}\n\n// Float\u2192[0,1) scalar hash: bit-reinterpret the lattice coordinate, pcg2d it, take the\n// high word back to [0,1). Integer-bit \u2014 no sin() periodicity, no float-fract lattice.\nfloat pcgHash2(vec2 p) {\n uvec2 u = floatBitsToUint(p);\n return float(pcg2d(u).x) * (1.0 / 4294967296.0);\n}\n\n// Integer-lattice gradient: pcg2d the integer cell, fold the hash to an angle, return\n// the unit gradient vector. The gradient basis (not a scalar value) is what makes the\n// noise zero at the nodes (no value-noise plateaus).\nvec2 pcgGrad2(ivec2 cell) {\n uvec2 h = pcg2d(uvec2(cell));\n float ang = float(h.x) * (1.0 / 4294967296.0) * 6.28318530717958647692;\n return vec2(cos(ang), sin(ang));\n}\n\n// 2D SIMPLEX gradient noise (Gustavson skew). The skew transform F2/G2 maps the square\n// lattice onto a simplex (triangular) grid \u2014 no axis-aligned directional bias. Each of\n// the three simplex corners contributes grad\u00B7offset shaped by a radial (0.5 - r\u00B2)\u2074\n// falloff. Output is ~[-1, 1]; callers remap to [0,1] via 0.5 + 0.5*gnoise.\nfloat gnoise(vec2 p) {\n const float F2 = 0.36602540378443864676; // (sqrt(3) - 1) / 2\n const float G2 = 0.21132486540518711775; // (3 - sqrt(3)) / 6\n float s = (p.x + p.y) * F2;\n vec2 i = floor(p + s);\n float tt = (i.x + i.y) * G2;\n vec2 x0 = p - (i - tt); // offset from the simplex origin corner\n ivec2 i1 = (x0.x > x0.y) ? ivec2(1, 0) : ivec2(0, 1);\n vec2 x1 = x0 - vec2(i1) + G2;\n vec2 x2 = x0 - 1.0 + 2.0 * G2;\n ivec2 ii = ivec2(i);\n float n = 0.0;\n float t0 = 0.5 - dot(x0, x0);\n if (t0 > 0.0) { t0 *= t0; n += t0 * t0 * dot(pcgGrad2(ii), x0); }\n float t1 = 0.5 - dot(x1, x1);\n if (t1 > 0.0) { t1 *= t1; n += t1 * t1 * dot(pcgGrad2(ii + i1), x1); }\n float t2 = 0.5 - dot(x2, x2);\n if (t2 > 0.0) { t2 *= t2; n += t2 * t2 * dot(pcgGrad2(ii + ivec2(1, 1)), x2); }\n return 70.0 * n; // normalize to ~[-1, 1]\n}";
4
6
  export declare const OETF_WGSL = "\nfn srgbToLinearCh(c: f32) -> f32 {\n return select(pow((c + 0.055) / 1.055, 2.4), c / 12.92, c <= 0.04045);\n}\nfn srgbToLinear(c: vec3f) -> vec3f {\n return vec3f(srgbToLinearCh(c.r), srgbToLinearCh(c.g), srgbToLinearCh(c.b));\n}\nfn linearToSrgbCh(c: f32) -> f32 {\n return select(1.055 * pow(c, 1.0 / 2.4) - 0.055, c * 12.92, c <= 0.0031308);\n}\nfn linearToSrgb(c: vec3f) -> vec3f {\n return vec3f(linearToSrgbCh(c.r), linearToSrgbCh(c.g), linearToSrgbCh(c.b));\n}";
5
7
  export declare const FBM_ROT_WGSL = "const FBM_ROT: mat2x2f = mat2x2f(0.8, 0.6, -0.6, 0.8);";
6
8
  export declare const OKLCH_MATRICES_WGSL = "\nconst LINEAR_SRGB_TO_LMS: mat3x3f = mat3x3f(\n 0.4122214708, 0.2119034982, 0.0883024619,\n 0.5363325363, 0.6806995451, 0.2817188376,\n 0.0514459929, 0.1073969566, 0.6299787005\n);\nconst LMS_TO_OKLAB: mat3x3f = mat3x3f(\n 0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660\n);\nconst OKLAB_TO_LMS: mat3x3f = mat3x3f(\n 1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480\n);\nconst LMS_TO_LINEAR_SRGB: mat3x3f = mat3x3f(\n 4.0767416621, -1.2684380046, -0.0041960863,\n -3.3077115913, 2.6097574011, -0.7034186147,\n 0.2309699292, -0.3413193965, 1.7076147010\n);\n\nfn srgbToOklab(c: vec3f) -> vec3f {\n let lin = srgbToLinear(c);\n let lms = LINEAR_SRGB_TO_LMS * lin;\n let lmsCbrt = sign(lms) * pow(abs(lms), vec3f(1.0 / 3.0));\n return LMS_TO_OKLAB * lmsCbrt;\n}\nfn oklabToLinearSrgb(lab: vec3f) -> vec3f {\n let lms_ = OKLAB_TO_LMS * lab;\n let lms = lms_ * lms_ * lms_;\n return LMS_TO_LINEAR_SRGB * lms;\n}\nfn oklabToOklch(lab: vec3f) -> vec3f {\n let C = length(lab.yz);\n var H = atan2(lab.z, lab.y);\n if (H < 0.0) { H = H + 2.0 * PI; }\n return vec3f(lab.x, C, H);\n}\nfn oklchToOklab(lch: vec3f) -> vec3f {\n return vec3f(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}";
9
+ export declare const PALETTE_RAMP_WGSL = "\nfn interpolateHueTurns(h0: f32, h1: f32, t: f32, method: i32) -> f32 {\n let TAU = 2.0 * PI;\n var a = h0 / TAU;\n var b = h1 / TAU;\n let i = b - a;\n if (method == 0) { // shorter\n if (i > 0.5) { a = a + 1.0; } else if (i < -0.5) { b = b + 1.0; }\n } else if (method == 1) { // longer\n if (i > 0.0 && i < 0.5) { a = a + 1.0; } else if (i > -0.5 && i <= 0.0) { b = b + 1.0; }\n } else if (method == 2) { // increasing\n if (i < 0.0) { b = b + 1.0; }\n } else { // decreasing\n if (i > 0.0) { a = a + 1.0; }\n }\n let r = fract(a + t * (b - a));\n return r * TAU;\n}\n\nfn mixPaletteOklab(linA: vec3f, linB: vec3f, t: f32) -> vec3f {\n let labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3f(1.0 / 3.0)));\n let labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3f(1.0 / 3.0)));\n let lab = mix(labA, labB, vec3f(t));\n return oklabToLinearSrgb(lab);\n}\n\nfn mixPaletteOklchArc(linA: vec3f, linB: vec3f, t: f32, method: i32) -> vec3f {\n let labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3f(1.0 / 3.0)));\n let labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3f(1.0 / 3.0)));\n let lchA = oklabToOklch(labA);\n let lchB = oklabToOklch(labB);\n let L = mix(lchA.x, lchB.x, t);\n let C = mix(lchA.y, lchB.y, t);\n let H = interpolateHueTurns(lchA.z, lchB.z, t, method);\n return oklabToLinearSrgb(oklchToOklab(vec3f(L, C, H)));\n}\n\nfn samplePaletteRamp(a: vec3f, b: vec3f, tRaw: f32, huePath: i32) -> vec3f {\n let t = smoothstep(0.0, 1.0, tRaw);\n if (huePath == 2 || huePath == 3) {\n return mixPaletteOklchArc(a, b, t, huePath);\n }\n return mixPaletteOklab(a, b, t);\n}";
10
+ export declare const PCG_HASH_WGSL = "\nfn pcg2d(v0: vec2u) -> vec2u {\n var v = v0 * 1664525u + vec2u(1013904223u);\n v.x = v.x + v.y * 1664525u;\n v.y = v.y + v.x * 1664525u;\n v = v ^ (v >> vec2u(16u));\n v.x = v.x + v.y * 1664525u;\n v.y = v.y + v.x * 1664525u;\n v = v ^ (v >> vec2u(16u));\n return v;\n}\n\nfn pcgHash2(p: vec2f) -> f32 {\n let u = bitcast<vec2u>(p);\n return f32(pcg2d(u).x) * (1.0 / 4294967296.0);\n}\n\nfn pcgGrad2(cell: vec2i) -> vec2f {\n let h = pcg2d(bitcast<vec2u>(cell));\n let ang = f32(h.x) * (1.0 / 4294967296.0) * 6.28318530717958647692;\n return vec2f(cos(ang), sin(ang));\n}\n\nfn gnoise(p: vec2f) -> f32 {\n let F2 = 0.36602540378443864676;\n let G2 = 0.21132486540518711775;\n let s = (p.x + p.y) * F2;\n let i = floor(p + vec2f(s));\n let tt = (i.x + i.y) * G2;\n let x0 = p - (i - vec2f(tt));\n var i1 = vec2i(0, 1);\n if (x0.x > x0.y) { i1 = vec2i(1, 0); }\n let x1 = x0 - vec2f(i1) + vec2f(G2);\n let x2 = x0 - vec2f(1.0) + vec2f(2.0 * G2);\n let ii = vec2i(i);\n var n = 0.0;\n var t0 = 0.5 - dot(x0, x0);\n if (t0 > 0.0) { t0 = t0 * t0; n = n + t0 * t0 * dot(pcgGrad2(ii), x0); }\n var t1 = 0.5 - dot(x1, x1);\n if (t1 > 0.0) { t1 = t1 * t1; n = n + t1 * t1 * dot(pcgGrad2(ii + i1), x1); }\n var t2 = 0.5 - dot(x2, x2);\n if (t2 > 0.0) { t2 = t2 * t2; n = n + t2 * t2 * dot(pcgGrad2(ii + vec2i(1, 1)), x2); }\n return 70.0 * n;\n}";
@@ -1,4 +1,4 @@
1
- export type WebGLSuspendReason = "tab-hidden" | "off-screen" | "manual";
1
+ export type WebGLSuspendReason = "tab-hidden" | "off-screen" | "off-screen-io" | "manual";
2
2
  /** The per-frame hooks a consumer's `setup(gl)` returns. */
3
3
  export interface WebGLCanvasFrame {
4
4
  /** Draw one frame at `timeSec`. The consumer uploads its uniforms + draws. */
@@ -8,3 +8,4 @@ export * from "../useYieldToMain";
8
8
  export * from "../usePrioritizedTask";
9
9
  export * from "../useViewTransition";
10
10
  export * from "../vReveal";
11
+ export * from "../useTextHighlight";
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./useConfiguratorState-B24TcgIn.js";
1
+ import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./useConfiguratorState-DxAqksK6.js";
2
2
  export { e as CONFIGURATOR_DENSITY_KEY, t as Configurator, i as ConfiguratorLayer, n as ConfiguratorRow, r as provideConfiguratorDensity, o as useConfiguratorState, a as useOptionalConfiguratorDensity };
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./createLucideIcon-B6uNAU9G.js";
2
- import { n as t } from "./button-CAywcrhO.js";
3
- import { t as n } from "./_plugin-vue_export-helper-gLzyemvl.js";
2
+ import { n as t } from "./button-DN39cGqL.js";
3
+ import { t as n } from "./_plugin-vue_export-helper-ok8pgSl5.js";
4
4
  import { Transition as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createTextVNode as c, createVNode as l, defineComponent as u, mergeModels as d, openBlock as f, renderSlot as p, toDisplayString as m, unref as h, useModel as g, withCtx as _, withKeys as v, withModifiers as y } from "vue";
5
5
  var b = e("loader-circle", [["path", {
6
6
  d: "M21 12a9 9 0 1 1-6.219-8.56",