@mkbabb/glass-ui 3.6.0 → 3.8.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 (255) hide show
  1. package/dist/CardAction-q2qHCJFG.js +157 -0
  2. package/dist/CollapsibleContent-CP9qF1v4.js +63 -0
  3. package/dist/{CommandShortcut-BiVyqipe.js → CommandShortcut-SzWRhROC.js} +4 -4
  4. package/dist/{ContextMenuContent-De01_83g.js → ContextMenuContent-DDa0v27s.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DrWkXKQP.js → ContextMenuSubContent-Do977Cbf.js} +4 -4
  6. package/dist/{DataTable-BGVXx0Ww.js → DataTable-CvlWXz65.js} +14 -7
  7. package/dist/DeckProgress-AVgbIULY.js +23 -0
  8. package/dist/{DialogContent-IQ8_BRrC.js → DialogContent-DjZWT3lK.js} +24 -24
  9. package/dist/{DialogFooter-Er0wA3K6.js → DialogFooter-Gprw8H_A.js} +2 -2
  10. package/dist/{DiscoGlyph-BaZ8OawK.js → DiscoGlyph-CG0F410s.js} +1 -1
  11. package/dist/{GlyphFace-B_7vOmYn.js → GlyphFace-DRjDkB0s.js} +1 -1
  12. package/dist/{HoverCardContent-ICfIMZX1.js → HoverCardContent-B6CcQ8He.js} +1 -1
  13. package/dist/{HoverPopover-DTSYkJtw.js → HoverPopover-D56O6Ylp.js} +1 -1
  14. package/dist/{IconTooltip-DZlCkU-0.js → IconTooltip-D2T5nYOM.js} +1 -1
  15. package/dist/{Input-CRJ2owjN.js → Input-DVG_J0ne.js} +4 -1
  16. package/dist/{Label-CZk-3nTc.js → Label-zRfbQdCn.js} +1 -1
  17. package/dist/{MetricBadge-BlrdbOGN.js → MetricBadge-lTc002u2.js} +1 -1
  18. package/dist/{Notification-DP_ApJLo.js → Notification-BxK8LZMw.js} +5 -4
  19. package/dist/{NumberFieldContent-Bhhmk95p.js → NumberFieldContent-CLNVR1iY.js} +5 -5
  20. package/dist/{PopoverContent-B8WtJECb.js → PopoverContent-BId6ggf_.js} +2 -2
  21. package/dist/{Progress-DjM86vfb.js → Progress-iEuD9pxG.js} +7 -7
  22. package/dist/{ScrollingText-P9o_DuMn.js → ScrollingText-CVyqxvfv.js} +2 -2
  23. package/dist/{SelectScrollDownButton-BGn3rjs9.js → SelectScrollDownButton-C7TRe-ep.js} +8 -7
  24. package/dist/{Separator-C2XtAXRp.js → Separator-D7sD7RKj.js} +1 -1
  25. package/dist/{Switch-x8n6husW.js → Switch-LDKLmmgx.js} +8 -2
  26. package/dist/TabsList-qyHZ2lKY.js +101 -0
  27. package/dist/{Toaster-DdhMKfus.js → Toaster-CabYEEF_.js} +54 -60
  28. package/dist/{ToggleGroupItem-gyXj998A.js → ToggleGroupItem-CkXUcBlt.js} +13 -5
  29. package/dist/{TooltipProvider-D-JrSqDu.js → TooltipProvider-CmZzCuaG.js} +1 -1
  30. package/dist/{UnderlineTabs-CuIK16JI.js → UnderlineTabs-Uxn-R3MT.js} +2 -2
  31. package/dist/animated-digit.js +2 -2
  32. package/dist/api/index.d.ts +4 -2
  33. package/dist/api.js +1 -1
  34. package/dist/aurora.js +753 -359
  35. package/dist/{badge-Cl6JZ1B7.js → badge-DHQrc_GQ.js} +13 -9
  36. package/dist/badge.js +1 -1
  37. package/dist/{button-BcMzVrqs.js → button-CAywcrhO.js} +6 -3
  38. package/dist/button.js +1 -1
  39. package/dist/canvas.d.ts +1 -0
  40. package/dist/canvas.js +3 -0
  41. package/dist/card.js +2 -2
  42. package/dist/carousel.js +110 -109
  43. package/dist/{check-CdkxGxXJ.js → check-BBKKKSTf.js} +1 -1
  44. package/dist/{chevron-down-pBY8sYfV.js → chevron-down-BSkTP2aL.js} +1 -1
  45. package/dist/{chevron-right-BjeKC22V.js → chevron-right-sDM0Yvrf.js} +1 -1
  46. package/dist/{chevron-up-DBeNHUm1.js → chevron-up-CCOD_FTz.js} +1 -1
  47. package/dist/collapsible.js +1 -1
  48. package/dist/color-DMLTunJK.js +84 -0
  49. package/dist/color.js +2 -2
  50. package/dist/command.js +1 -1
  51. package/dist/compile-BBTRjvQS.js +158 -0
  52. package/dist/components/custom/aurora/Aurora.vue.d.ts +1 -0
  53. package/dist/components/custom/aurora/composables/atoms.d.ts +125 -0
  54. package/dist/components/custom/aurora/composables/color.d.ts +7 -25
  55. package/dist/components/custom/aurora/composables/cursorModel.d.ts +35 -2
  56. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  57. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +16 -0
  58. package/dist/components/custom/aurora/composables/runtime.d.ts +18 -0
  59. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +46 -12
  60. package/dist/components/custom/aurora/composables/useAurora.d.ts +6 -0
  61. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +8 -0
  62. package/dist/components/custom/aurora/constants/presets.d.ts +60 -4
  63. package/dist/components/custom/aurora/constants/renderMode.d.ts +32 -0
  64. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +7 -0
  65. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  66. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  67. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -1
  68. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  69. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +7 -0
  70. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +4 -0
  71. package/dist/components/custom/aurora/index.d.ts +4 -3
  72. package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
  73. package/dist/components/custom/constellation/constellationField.d.ts +110 -5
  74. package/dist/components/custom/constellation/index.d.ts +2 -2
  75. package/dist/components/custom/dock/GlassDock.vue.d.ts +12 -4
  76. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
  77. package/dist/components/custom/dock/composables/index.d.ts +3 -0
  78. package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
  79. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
  80. package/dist/components/custom/dock/index.d.ts +2 -0
  81. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +38 -0
  82. package/dist/components/custom/fourier-field/index.d.ts +2 -0
  83. package/dist/components/custom/fourier-field/math.d.ts +57 -0
  84. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +15 -0
  85. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +18 -2
  86. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +47 -4
  87. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
  88. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +19 -4
  89. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  90. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  91. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  92. package/dist/components/custom/goo-blob/types.d.ts +48 -0
  93. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +1 -1
  94. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  95. package/dist/components/ui/_shared/ModalOverlay.vue.d.ts +1 -1
  96. package/dist/components/ui/alert/index.d.ts +1 -1
  97. package/dist/components/ui/card/Card.vue.d.ts +26 -3
  98. package/dist/components/ui/card/CardAction.vue.d.ts +24 -0
  99. package/dist/components/ui/card/index.d.ts +2 -1
  100. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +5 -1
  101. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
  102. package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
  103. package/dist/components/ui/tabs/TabsList.vue.d.ts +13 -3
  104. package/dist/components/ui/toast/Toast.vue.d.ts +5 -5
  105. package/dist/components/ui/toast/use-toast.d.ts +1 -1
  106. package/dist/composables/color/index.d.ts +69 -0
  107. package/dist/composables/dom/index.d.ts +1 -1
  108. package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
  109. package/dist/composables/glass/canvas2d/index.d.ts +2 -1
  110. package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
  111. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
  112. package/dist/composables/glass/createGPUCanvas.d.ts +40 -0
  113. package/dist/composables/glass/index.d.ts +3 -1
  114. package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
  115. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +45 -0
  116. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +7 -0
  117. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +5 -5
  118. package/dist/composables/motion/core/index.d.ts +1 -0
  119. package/dist/configurator.js +1 -1
  120. package/dist/confirm-dialog.js +3 -3
  121. package/dist/constellation.js +144 -75
  122. package/dist/context-menu.js +2 -2
  123. package/dist/controls.js +2 -2
  124. package/dist/dark.js +1 -1
  125. package/dist/data-table.js +1 -1
  126. package/dist/deck-progress.d.ts +1 -0
  127. package/dist/deck-progress.js +2 -0
  128. package/dist/dialog.js +2 -2
  129. package/dist/disco-glyph.js +1 -1
  130. package/dist/dock.js +388 -287
  131. package/dist/{dockContext-spUj_-E5.js → dockContext-BKeIMmNk.js} +1 -1
  132. package/dist/dom.js +6 -6
  133. package/dist/{dropdown-menu-EFjl5iKo.js → dropdown-menu-B_4bWyyG.js} +5 -5
  134. package/dist/dropdown-menu.js +1 -1
  135. package/dist/expandable-container.js +2 -2
  136. package/dist/fonts/README.md +26 -18
  137. package/dist/forms.js +10 -7
  138. package/dist/fourier-field.d.ts +1 -0
  139. package/dist/fourier-field.js +166 -0
  140. package/dist/glass-carousel.js +12 -7
  141. package/dist/glass-panel.js +7 -7
  142. package/dist/glass-ui.css +1 -1
  143. package/dist/glass-ui.js +209 -206
  144. package/dist/glyph-face.js +2 -2
  145. package/dist/goo-blob.js +485 -300
  146. package/dist/header-ribbon.js +1 -1
  147. package/dist/hover-card.js +1 -1
  148. package/dist/hover-popover.js +1 -1
  149. package/dist/icon-tooltip.js +1 -1
  150. package/dist/index.d.ts +1 -0
  151. package/dist/instrument-chassis.js +1 -1
  152. package/dist/instrument-rail.js +1 -1
  153. package/dist/keyboard.js +1 -1
  154. package/dist/{keys-BFoma9vm.js → keys-BsYjEFOW.js} +1 -1
  155. package/dist/label.js +1 -1
  156. package/dist/labeled-field.js +6 -6
  157. package/dist/metric-badge.js +1 -1
  158. package/dist/metric-stack.js +1 -1
  159. package/dist/{minimize-2-BP27-qBY.js → minimize-2-lcXOuc6V.js} +1 -1
  160. package/dist/motion-core.js +68 -98
  161. package/dist/motion.js +3 -3
  162. package/dist/notification.js +1 -1
  163. package/dist/number-field.js +1 -1
  164. package/dist/paper-backdrop.js +1 -1
  165. package/dist/popover.js +1 -1
  166. package/dist/progress.js +1 -1
  167. package/dist/pulse.js +1 -1
  168. package/dist/reactive.js +2 -2
  169. package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
  170. package/dist/responsive-tabs.js +2 -2
  171. package/dist/scrolling-text.js +1 -1
  172. package/dist/{search-DBG8qaRs.js → search-nbkvr2dC.js} +1 -1
  173. package/dist/search.js +12 -12
  174. package/dist/select.js +3 -3
  175. package/dist/separator.js +1 -1
  176. package/dist/{sheet-CQYYrkr9.js → sheet-VZEtNFvO.js} +4 -4
  177. package/dist/sheet.js +1 -1
  178. package/dist/slider-D9puf-Ko.js +142 -0
  179. package/dist/slider.js +1 -1
  180. package/dist/sortable-list.js +3 -3
  181. package/dist/styles/components.css +1 -1
  182. package/dist/styles/dock-controls.css +21 -18
  183. package/dist/styles/dock.css +415 -224
  184. package/dist/styles/fonts.css +0 -25
  185. package/dist/styles/glass.css +100 -41
  186. package/dist/styles/theme.css +58 -2
  187. package/dist/styles/tokens.css +139 -32
  188. package/dist/styles/typography.css +55 -72
  189. package/dist/styles/utilities.css +19 -14
  190. package/dist/styles/view-transition.css +12 -40
  191. package/dist/supportsCssTimeline-C5oe0lnD.js +12 -0
  192. package/dist/switch.js +1 -1
  193. package/dist/tabs.js +5 -5
  194. package/dist/timeline.js +3 -3
  195. package/dist/toast.js +1 -1
  196. package/dist/toggle-group.js +1 -1
  197. package/dist/tooltip.js +1 -1
  198. package/dist/typewriter.js +1 -1
  199. package/dist/{useAnimatedNumber-DfVgP4te.js → useAnimatedNumber-C_3wZLx4.js} +1 -1
  200. package/dist/{useCanvas2D-BeNJqqIS.js → useCanvas2D-ClrQuZtp.js} +2 -1
  201. package/dist/{useConfiguratorState-DUtC1jxr.js → useConfiguratorState-CMff4GzH.js} +5 -5
  202. package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
  203. package/dist/useScrollProgress-C9ysDic5.js +35 -0
  204. package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
  205. package/dist/{useTextHighlight-Dmtofpk2.js → useTextHighlight-9nMW23Qb.js} +1 -1
  206. package/dist/{useTouchGate-CS5Csc2h.js → useTouchGate-WFyJYsth.js} +1 -1
  207. package/dist/vReveal-CqaCz_mC.js +44 -0
  208. package/dist/watercolor-dot.js +2 -2
  209. package/dist/{x-C4pz9nbD.js → x-Dfsegz9Y.js} +1 -1
  210. package/package.json +64 -4
  211. package/src/fonts/README.md +26 -18
  212. package/src/styles/dock-controls.css +21 -18
  213. package/src/styles/dock.css +415 -224
  214. package/src/styles/fonts.css +0 -25
  215. package/src/styles/glass.css +100 -41
  216. package/src/styles/theme.css +58 -2
  217. package/src/styles/tokens.css +139 -32
  218. package/src/styles/typography.css +55 -72
  219. package/src/styles/utilities.css +19 -14
  220. package/src/styles/view-transition.css +12 -40
  221. package/dist/CardFooter-C390imy7.js +0 -129
  222. package/dist/CollapsibleContent-cauTbZEM.js +0 -52
  223. package/dist/TabsIndicator-DA0x9gPr.js +0 -97
  224. package/dist/color-DS-iLRVM.js +0 -33
  225. package/dist/compile-C62K_FpC.js +0 -106
  226. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  227. package/dist/slider-CgNzRSh6.js +0 -129
  228. package/dist/useViewTransition-DI0Rs2rV.js +0 -21
  229. package/dist/vReveal-u2wSG2El.js +0 -35
  230. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  231. /package/dist/{InstrumentChassis-DaHIZCqy.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
  232. /package/dist/{InstrumentRail-B0qqLFN0.js → InstrumentRail-CUJ05YVG.js} +0 -0
  233. /package/dist/{ModalOverlay-B_CBtqcE.js → ModalOverlay-B1GkAjNb.js} +0 -0
  234. /package/dist/{PaperBackdrop-D_YZW47j.js → PaperBackdrop-CqwjnfLv.js} +0 -0
  235. /package/dist/{SelectGroup-CMdoCjRE.js → SelectGroup-BFiod7X2.js} +0 -0
  236. /package/dist/{SelectSeparator-CaJnPF3_.js → SelectSeparator-L8pPEn4L.js} +0 -0
  237. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
  238. /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
  239. /package/dist/{constants-C8NMonuo.js → constants-BPOqYJAm.js} +0 -0
  240. /package/dist/{createContext-DBMGRlx4.js → createContext-B44Sah_H.js} +0 -0
  241. /package/dist/{createLucideIcon-DuDoe_ra.js → createLucideIcon-B6uNAU9G.js} +0 -0
  242. /package/dist/{menuItemVariants-C2QlXqT3.js → menuItemVariants-DKM85SNE.js} +0 -0
  243. /package/dist/{presets-Dyv9Zl7W.js → presets-D1XPuTj-.js} +0 -0
  244. /package/dist/{prng-CjVgzjQT.js → prng-COGhh02-.js} +0 -0
  245. /package/dist/{useGlassRenderer-Dn3WpfG-.js → useGlassRenderer-5I0YkI4t.js} +0 -0
  246. /package/dist/{useGlobalDark-D7R9OypB.js → useGlobalDark-D3EBWzXK.js} +0 -0
  247. /package/dist/{useIntersectionPause-DsQYGc8V.js → useIntersectionPause-Bj4sPkMh.js} +0 -0
  248. /package/dist/{useInterval-CHVYFpXV.js → useInterval-CcLfq2WU.js} +0 -0
  249. /package/dist/{useKeyboardShortcuts-i8tHd5WO.js → useKeyboardShortcuts-BXWXOZ-9.js} +0 -0
  250. /package/dist/{useResizeObserver-DX-STszm.js → useResizeObserver-CWCbk5Px.js} +0 -0
  251. /package/dist/{useSortable-muI29agz.js → useSortable-MGAbCGVJ.js} +0 -0
  252. /package/dist/{useSpringMount-CnizvZGm.js → useSpringMount-BJSHcLl3.js} +0 -0
  253. /package/dist/{useTimer-DGgoxTXL.js → useTimer-3xqf_54b.js} +0 -0
  254. /package/dist/{useUserInvalidAria-DmvZ_6Dx.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
  255. /package/dist/{useViewportReady-Dcvf0c4p.js → useViewportReady-RIr5Wgkh.js} +0 -0
@@ -1,8 +1,31 @@
1
1
  import { type Ref } from "vue";
2
+ /** Compile-time trail length — mirrors `TRAIL_N` in metaball.frag.ts. */
3
+ export declare const TRAIL_N = 15;
4
+ /** A single trail sample — a decaying-radius metaball source the shader smin-merges. */
5
+ export interface TrailSample {
6
+ x: number;
7
+ y: number;
8
+ radius: number;
9
+ }
2
10
  /**
3
- * Tracks the pointer over a host element, normalised to [-1, 1] relative to the
4
- * element centre, and smooths it per frame via `tick()`. On pointer-leave the
5
- * smoothed position decays back toward centre.
11
+ * The blob pointer/interaction machine (W10). Tracks the pointer over a host
12
+ * element (normalised to [-1, 1] about the element centre) and resolves it with a
13
+ * FRAME-RATE-INDEPENDENT critically-damped spring fed the renderer's per-frame
14
+ * `dtMs` (NOT a fixed-α lerp — the prior `SMOOTH_FACTOR = 0.12` was framerate
15
+ * dependent). The spring is `@mkbabb/keyframes.js` `SpringProgress` driven through
16
+ * its `tick(dt)` seam by the SUBSTRATE's single rAF — it does NOT call
17
+ * `SpringProgress.play()` (that would start a parallel rAF, the
18
+ * single-substrate-loop violation `proof:blob-interaction-prm` forbids).
19
+ *
20
+ * Exposes the smoothed `pointer` position AND its `velocity` (the spring's own
21
+ * per-frame velocity, units/s in normalized space), plus a decaying-radius `trail`
22
+ * buffer (the elastic pseudopod reaching toward the cursor and snapping back).
23
+ *
24
+ * Under `prefers-reduced-motion` the substrate freezes the rAF, so `tick` is not
25
+ * called and every axis holds its rest value — there is NO parallel matchMedia
26
+ * here (the substrate owns PRM). The deterministic rest pose: the spring at the
27
+ * pointer target (or centre when inactive), zero velocity, the trail collapsed
28
+ * onto the body.
6
29
  */
7
30
  export declare function useBlobPointer(el: Ref<HTMLElement | null>): {
8
31
  pointer: Readonly<Ref<{
@@ -12,7 +35,27 @@ export declare function useBlobPointer(el: Ref<HTMLElement | null>): {
12
35
  readonly x: number;
13
36
  readonly y: number;
14
37
  }>>;
38
+ velocity: Readonly<Ref<{
39
+ readonly x: number;
40
+ readonly y: number;
41
+ }, {
42
+ readonly x: number;
43
+ readonly y: number;
44
+ }>>;
15
45
  active: Readonly<Ref<boolean, boolean>>;
16
- tick: () => void;
46
+ /** The live click-impulse pulse value (folds into uPulseAmp). */
47
+ pulse: Readonly<Ref<number, number>>;
48
+ /** ms since the last pointer activity (W11.c mood idle drift). */
49
+ idleMs: () => number;
50
+ tick: (dtMs?: number) => void;
51
+ trailSources: (baseRadius: number) => {
52
+ sources: TrailSample[];
53
+ count: number;
54
+ };
55
+ click: (amp: number) => void;
56
+ consumeClick: () => boolean;
57
+ rest: () => void;
58
+ /** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
59
+ isAtRest: () => boolean;
17
60
  };
18
61
  export type BlobPointer = ReturnType<typeof useBlobPointer>;
@@ -9,5 +9,7 @@ export declare function useBlobSatellites(config: BlobConfig, initialColor: stri
9
9
  tick: (now: number, mood: MoodParams) => void;
10
10
  nudge: () => void;
11
11
  reseed: (color: string) => void;
12
+ isQuiescent: () => boolean;
13
+ nextEventMs: (now: number) => number;
12
14
  };
13
15
  export type BlobSatelliteSystem = ReturnType<typeof useBlobSatellites>;
@@ -6,17 +6,32 @@ import type { BlobPointer } from "./useBlobPointer";
6
6
  import type { BlobSatelliteSystem } from "./useBlobSatellites";
7
7
  export interface UseMetaballRendererOptions {
8
8
  canvasRef: Ref<HTMLCanvasElement | null>;
9
+ /** The base color, ALREADY un-wrapped to a CONCRETE string by the SFC (DOM-free). */
9
10
  color: Ref<string>;
11
+ /**
12
+ * The Fresnel rim color, ALREADY un-wrapped to a CONCRETE string by the SFC
13
+ * (AX.W16 — the renderer no longer reaches the DOM for the `var()`-cascade read;
14
+ * the SFC's `resolveTokenColor` leaf does ALL un-wrapping before the renderer sees
15
+ * it). A `var(--token)` rim arrives here already resolved to `rgb(...)`.
16
+ */
17
+ rimColor: Ref<string>;
18
+ /**
19
+ * The multi-stop palette, ALREADY un-wrapped to CONCRETE strings by the SFC
20
+ * (AX.W16). EMPTY falls back to the base color (uStopCount <= 1).
21
+ */
22
+ paletteStops: Ref<string[]>;
10
23
  mood: BlobMoodSystem;
11
24
  pointer: BlobPointer;
12
25
  satellites: BlobSatelliteSystem;
13
26
  config: BlobConfig;
14
27
  /**
15
- * The injected color seam (DEC-AT-2). Resolves a CSS color string to a GAMMA-
16
- * sRGB triple in [0,1] fed straight into the shader's base-color uniform — the
17
- * faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
28
+ * The injected color seam (DEC-AT-2). Resolves a CONCRETE CSS color string to a
29
+ * GAMMA-sRGB triple in [0,1] fed straight into the shader's base-color uniform —
30
+ * the faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
18
31
  * loud failure, not a silent gray) instructing the consumer to pass
19
- * `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own).
32
+ * `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own). The
33
+ * renderer is DOM-FREE: it never un-wraps a `var(--token)` — the SFC's
34
+ * `resolveTokenColor` leaf does that BEFORE handing strings here (inv-K-3 seam).
20
35
  */
21
36
  colorResolver: ColorResolver;
22
37
  }
@@ -1,5 +1,5 @@
1
1
  export { default as GooBlob } from "./GooBlob.vue";
2
- export type { BlobMood, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
2
+ export type { BlobMood, BlobMerge, BlobQuality, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
3
3
  export { BLOB_CONFIG_DEFAULTS, BLOB_CONFIG_KEY } from "./types";
4
4
  export { useBlobMood, type BlobMoodSystem } from "./composables/useBlobMood";
5
5
  export { useBlobPointer, type BlobPointer } from "./composables/useBlobPointer";
@@ -1 +1 @@
1
- export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// Edit #2 \u2014 Inigo Quilez quadratic polynomial smin (same uSmoothK uniform). The\n// quadratic h*h*k*0.25 form has a cleaner C1 seam than the prior cubic smin.\nfloat smin(float a, float b, float k) {\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * k * 0.25;\n}";
1
+ export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT circle: returns vec3(d, dd/dx, dd/dy). The circle\n// gradient is the UNIT radial direction (p - center)/length(p - center) (the\n// eikonal property holds EXACTLY for a circle), guarded at the degenerate centre.\n// This is the keystone of the analytic-gradient smin: carrying the gradient\n// through the scene field DELETES the per-pixel 4-tap normal (4 full sceneDist\n// evals, each running 3-octave FBM + the sat/trail loops).\nvec3 sdgCircle(vec2 p, vec2 center, float radius) {\n vec2 d = p - center;\n float len = length(d);\n vec2 grad = len > 1e-6 ? d / len : vec2(0.0, 1.0);\n return vec3(len - radius, grad);\n}\n\n// IQ 2024 quadratic-polynomial smin, NORMALIZED so k is a blend band in distance\n// units. The k *= 4.0 pre-scale makes the h*h*k*0.25 poly's effective blend width\n// equal to k (the un-normalized form's width was 0.25*k).\nfloat sminQuadratic(float a, float b, float k) {\n k *= 4.0;\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * k * 0.25;\n}\n\n// IQ circular smin \u2014 a quarter-circle fillet at the seam (rounder than the\n// quadratic). The k *= 1.0/(1.0-sqrt(0.5)) factor normalizes k to the same\n// blend-band units so the merge axis swaps shape without re-tuning uSmoothK.\nfloat sminCircular(float a, float b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n}\n\n// Config-gated merge dispatch \u2014 uMerge 0 = quadratic, 1 = circular.\nfloat smin(float a, float b, float k) {\n if (uMerge > 0.5) return sminCircular(a, b, k);\n return sminQuadratic(a, b, k);\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT smin. a/b are vec3(dist, grad.xy); the blended\n// gradient is mix(a.yz, b.yz, w) with the interpolation weight w the distance\n// blend uses (IQ's vec2-smin insight). This propagates the analytic gradient\n// through the merge so the surface normal reads the field gradient DIRECTLY \u2014 no\n// finite-difference tap. The blend weight matches each variant.\nvec3 sminQuadraticG(vec3 a, vec3 b, float k) {\n k *= 4.0;\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = h * h * k * 0.25;\n // h-weight that selects which surface dominates (0 \u2192 a, 1 \u2192 b).\n float w = (a.x < b.x) ? 0.5 * h * h : 1.0 - 0.5 * h * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminCircularG(vec3 a, vec3 b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n float w = (a.x < b.x) ? 0.5 * h : 1.0 - 0.5 * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminG(vec3 a, vec3 b, float k) {\n if (uMerge > 0.5) return sminCircularG(a, b, k);\n return sminQuadraticG(a, b, k);\n}";
@@ -1,2 +1,2 @@
1
- export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfloat valueNoise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n\n float a = hash21(i);\n float b = hash21(i + vec2(1.0, 0.0));\n float c = hash21(i + vec2(0.0, 1.0));\n float d = hash21(i + vec2(1.0, 1.0));\n\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\n// Edit #3 \u2014 rotated-octave FBM: a fixed ~0.5 rad 2x2 rotation between octaves\n// breaks the axis-aligned banding the un-rotated lattice noise produces. The\n// rotation CONSTANT is spliced from the shared chunk (AV.W2 \u2014 the one FBM_ROT);\n// the loop below stays blob-local (param octaves + 2.0 lacunarity, per \u00A73a).";
2
- export declare const METABALL_EDGE_NOISE_POST_GLSL = "float fbm(vec2 p, int octaves) {\n float value = 0.0;\n float amp = 0.5;\n float freq = 1.0;\n for (int i = 0; i < 4; i++) {\n if (i >= octaves) break;\n value += amp * valueNoise(p * freq);\n p = FBM_ROT * p;\n freq *= 2.0;\n amp *= 0.5;\n }\n return value;\n}\n";
1
+ export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\n// IQ analytic-derivative gradient noise \u2014 value in .x, ANALYTIC gradient\n// (d/dx, d/dy) in .yz, from one eval. The quintic fade has a continuous 2nd\n// derivative so the gradient is smooth (a cubic smoothstep fade would crease it).\n// (Inigo Quilez, https://iquilezles.org/articles/gradientnoise/.)\nvec3 noised(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n\n // Quintic fade + its derivative.\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n vec2 du = 30.0 * f * f * (f * (f - 2.0) + 1.0);\n\n // Per-corner gradient vectors from the hash (centred to [-1, 1]).\n vec2 ga = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 0.0)), hash21(i + vec2(7.3, 0.0)));\n vec2 gb = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 0.0)), hash21(i + vec2(8.3, 0.0)));\n vec2 gc = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(7.3, 1.0)));\n vec2 gd = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 1.0)), hash21(i + vec2(8.3, 1.0)));\n\n float va = dot(ga, f - vec2(0.0, 0.0));\n float vb = dot(gb, f - vec2(1.0, 0.0));\n float vc = dot(gc, f - vec2(0.0, 1.0));\n float vd = dot(gd, f - vec2(1.0, 1.0));\n\n // Value, remapped to [0,1] so it drops in for the prior valueNoise.\n float n = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd);\n float value = 0.5 + 0.5 * n;\n\n // Analytic gradient (chain rule through the bilinear blend + the fade).\n vec2 grad =\n ga + u.x * (gb - ga) + u.y * (gc - ga) + u.x * u.y * (ga - gb - gc + gd) +\n du * (vec2(u.y, u.x) * (va - vb - vc + vd) + vec2(vb, vc) - va);\n return vec3(value, 0.5 * grad);\n}\n\n// Rotated-octave FBM over the analytic gradient noise: a fixed ~0.5 rad 2x2\n// rotation between octaves breaks the axis-aligned banding. The rotation CONSTANT\n// is spliced from the shared chunk (AV.W2 \u2014 the one FBM_ROT); the loops below\n// stay blob-local (param octaves + the LIQUID lacunarity/persistence, per \u00A73a).";
2
+ export declare const METABALL_EDGE_NOISE_POST_GLSL: string;
@@ -1,5 +1,14 @@
1
1
  import type { InjectionKey } from "vue";
2
2
  export type BlobMood = "idle" | "happy" | "curious" | "sleepy" | "excited";
3
+ /** Smin merge variant — `quadratic` (cheap, creased) | `circular` (rounder menisci). */
4
+ export type BlobMerge = "quadratic" | "circular";
5
+ /**
6
+ * Render-quality axis (AX.W16) — `full` (default) renders the metaball pass at the
7
+ * clamped DPR; `half` renders the backing store at HALF resolution and lets the
8
+ * browser bilinear-upsample on composite (~4× fragment savings for weak GPUs — the
9
+ * blob is the ideal candidate: the soft FBM/AA edge hides the interpolation).
10
+ */
11
+ export type BlobQuality = "full" | "half";
3
12
  export interface MoodParams {
4
13
  orbitSpeedScale: number;
5
14
  wobbleScale: number;
@@ -12,6 +21,8 @@ export interface MoodParams {
12
21
  smoothK: number;
13
22
  pointerAttraction: number;
14
23
  mergeRate: number;
24
+ /** Mood-driven iridescence/SSS intensity multiplier (excited > 1, sleepy < 1). */
25
+ iridScale: number;
15
26
  }
16
27
  export interface MetaballSource {
17
28
  x: number;
@@ -51,10 +62,19 @@ export interface BlobConfig {
51
62
  satelliteCount: number;
52
63
  satelliteRadius: number;
53
64
  orbitRadius: number;
65
+ quality: BlobQuality;
66
+ tempo: number;
54
67
  smoothK: number;
68
+ /** Smin merge variant — `quadratic` (default) | `circular` (rounder menisci). */
69
+ merge: BlobMerge;
55
70
  noiseAmp: number;
56
71
  noiseFreq: number;
57
72
  noiseSpeed: number;
73
+ /**
74
+ * Domain-warp strength on the FBM edge displacement (0 = plain fbm, the
75
+ * pre-warp look; ~0.6 = a marbled organic membrane). Taste-first low default.
76
+ */
77
+ warpAmp: number;
58
78
  pulseFreq: number;
59
79
  pulseAmp: number;
60
80
  hueRange: number;
@@ -62,8 +82,36 @@ export interface BlobConfig {
62
82
  brightnessShift: number;
63
83
  colorNoiseFreq: number;
64
84
  colorNoiseSpeed: number;
85
+ paletteStops: string[];
86
+ /** Warm-pearl rim sheen weight (0 = off). */
87
+ iridescence: number;
88
+ /** Base hue (degrees) the warm-biased cosine palette centres on. */
89
+ iridHue: number;
90
+ /** Animated-thickness scroll speed for the iridescent shimmer. */
91
+ iridSpeed: number;
92
+ /** Fast-SSS back-light weight. */
93
+ sssScale: number;
94
+ /** Fast-SSS exponent. */
95
+ sssPower: number;
96
+ /** Thickness-driven inner-luminosity (core glow) lift. */
97
+ coreGlow: number;
98
+ lit: boolean;
99
+ /** CSS color for the Fresnel rim tint (resolved through the ColorResolver). */
100
+ rimColor: string;
101
+ /** Light direction [x, y, z] (normalized in-shader). */
102
+ lightDir: [number, number, number];
103
+ specStrength: number;
104
+ /** Specular exponent (16-64 — a tight glint). */
105
+ specShininess: number;
106
+ /** Fresnel/Schlick exponent (~2-3). */
107
+ rimPower: number;
108
+ rimStrength: number;
65
109
  pointerAttraction: number;
66
110
  pointerStrength: number;
111
+ /** Velocity-driven volume-preserving squash-and-stretch magnitude (0 = off). */
112
+ stretch: number;
113
+ /** Click spring-impulse amplitude (a one-shot bouncy pulse on the body radius). */
114
+ clickImpulse: number;
67
115
  eccentricity: number;
68
116
  orbitSpeedScale: number;
69
117
  wobbleScale: number;
@@ -83,9 +83,9 @@ type __VLS_Slots = {} & {
83
83
  };
84
84
  declare const __VLS_base: import("vue").DefineComponent<MetricCellProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MetricCellProps> & Readonly<{}>, {
85
85
  placeholder: string;
86
+ appearance: MetricCellAppearance;
86
87
  iconStrokeWidth: number;
87
88
  iconSize: number;
88
- appearance: MetricCellAppearance;
89
89
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
90
90
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
91
91
  declare const _default: typeof __VLS_export;
@@ -78,8 +78,8 @@ type __VLS_Slots = {} & {
78
78
  };
79
79
  declare const __VLS_base: import("vue").DefineComponent<MetricStackProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<MetricStackProps> & Readonly<{}>, {
80
80
  as: string | Component;
81
- rows: number;
82
81
  containerName: string;
82
+ rows: number;
83
83
  register: "audacious" | "result";
84
84
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
85
85
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -77,8 +77,8 @@ type __VLS_Slots = {} & {
77
77
  };
78
78
  declare const __VLS_base: import("vue").DefineComponent<ModalOverlayProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ModalOverlayProps> & Readonly<{}>, {
79
79
  animate: "fade" | "scale" | "slide" | "none";
80
- scrim: "glass" | "clear" | "dim";
81
80
  layout: "centered" | "edge" | "scroll";
81
+ scrim: "glass" | "clear" | "dim";
82
82
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
83
83
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
84
84
  declare const _default: typeof __VLS_export;
@@ -3,6 +3,6 @@ export { default as Alert } from './Alert.vue';
3
3
  export { default as AlertDescription } from './AlertDescription.vue';
4
4
  export { default as AlertTitle } from './AlertTitle.vue';
5
5
  export declare const alertVariants: (props?: ({
6
- variant?: "default" | "destructive" | null | undefined;
6
+ variant?: "default" | "destructive" | "success" | "warning" | "info" | null | undefined;
7
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
8
  export type AlertVariants = VariantProps<typeof alertVariants>;
@@ -1,4 +1,4 @@
1
- import type { HTMLAttributes } from "vue";
1
+ import { type HTMLAttributes } from "vue";
2
2
  import { type PrimitiveProps } from "reka-ui";
3
3
  /**
4
4
  * The five-tier glass surface ladder. Maps 1:1 to `.glass-{tier}` in glass.css
@@ -20,6 +20,21 @@ export type CardTier = "wash" | "quiet" | "resting" | "floating" | "overlay";
20
20
  * ANY tier; the retired `<CartoonCard>` was `tier="quiet" surface="cartoon"`.
21
21
  */
22
22
  export type CardSurface = "glass" | "cartoon";
23
+ /**
24
+ * Specular catch-light register (AX.W09) — the pointer-anchored moving lens on a
25
+ * glass card.
26
+ *
27
+ * off — NO catch-light (default). The clean resting panel: a data/content
28
+ * `surface="glass"` card over any backplate reads flat — no centred
29
+ * white bloom, no pointer wiring. The §24 three-consumer-confirmed
30
+ * default for the common content-card case.
31
+ * subtle — the token-ladder lens: the pointer-anchored catch-light wakes on
32
+ * hover/active at the SUBTLE `--glass-specular-intensity-*` magnitudes.
33
+ * The explicit opt-in for a hero/chrome surface.
34
+ * full — the brighter pre-tune rung set, for the busy-backdrop case the recipe
35
+ * was originally authored over (a local intensity-token override).
36
+ */
37
+ export type CardSpecular = "off" | "subtle" | "full";
23
38
  interface Props extends PrimitiveProps {
24
39
  /** Surface tier; selects one rung of the glass ladder. Default `resting`. */
25
40
  tier?: CardTier;
@@ -33,11 +48,18 @@ interface Props extends PrimitiveProps {
33
48
  /** `::after` paper-grain overlay. Off for scroll panes (the grain conflicts
34
49
  * with overflow:auto repaints). */
35
50
  grain?: boolean;
51
+ /** Specular catch-light register (AX.W09). `off` (default) keeps the card
52
+ * CLEAN — no pointer-anchored lens, clean over any backplate (the §24
53
+ * three-consumer-confirmed default for a data/content card). `subtle` wakes
54
+ * the pointer-anchored moving catch-light at the token-ladder magnitudes (a
55
+ * hero/chrome opt-in); `full` runs the brighter pre-tune rung set for a busy
56
+ * backdrop. Only `glass` surfaces wire it; `cartoon` owns its own sticker lift. */
57
+ specular?: CardSpecular;
36
58
  class?: HTMLAttributes["class"];
37
59
  }
38
- declare var __VLS_8: {};
60
+ declare var __VLS_10: {};
39
61
  type __VLS_Slots = {} & {
40
- default?: (props: typeof __VLS_8) => any;
62
+ default?: (props: typeof __VLS_10) => any;
41
63
  };
42
64
  declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
43
65
  shadow: boolean;
@@ -45,6 +67,7 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, i
45
67
  tier: CardTier;
46
68
  surface: CardSurface;
47
69
  grain: boolean;
70
+ specular: CardSpecular;
48
71
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
49
72
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
50
73
  declare const _default: typeof __VLS_export;
@@ -0,0 +1,24 @@
1
+ import type { HTMLAttributes } from "vue";
2
+ /**
3
+ * <CardAction> — the shadcn-2025 top-right action slot of the Card family.
4
+ * When present inside a <CardHeader>, the header reflows to a two-column grid
5
+ * (title/description column + this action column) via the `@container/card-header`
6
+ * `has-data-[slot=card-action]` query on CardHeader. Self-aligns to the start of
7
+ * the header's first two rows, justified to the end.
8
+ */
9
+ type __VLS_Props = {
10
+ class?: HTMLAttributes["class"];
11
+ };
12
+ declare var __VLS_1: {};
13
+ type __VLS_Slots = {} & {
14
+ default?: (props: typeof __VLS_1) => any;
15
+ };
16
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
18
+ declare const _default: typeof __VLS_export;
19
+ export default _default;
20
+ type __VLS_WithSlots<T, S> = T & {
21
+ new (): {
22
+ $slots: S;
23
+ };
24
+ };
@@ -1,6 +1,7 @@
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";
5
5
  export { default as CardContent } from "./CardContent.vue";
6
6
  export { default as CardFooter } from "./CardFooter.vue";
7
+ export { default as CardAction } from "./CardAction.vue";
@@ -1,9 +1,13 @@
1
+ import { type HTMLAttributes } from 'vue';
1
2
  import { type CollapsibleTriggerProps } from 'reka-ui';
3
+ type __VLS_Props = CollapsibleTriggerProps & {
4
+ class?: HTMLAttributes['class'];
5
+ };
2
6
  declare var __VLS_8: {};
3
7
  type __VLS_Slots = {} & {
4
8
  default?: (props: typeof __VLS_8) => any;
5
9
  };
6
- declare const __VLS_base: import("vue").DefineComponent<CollapsibleTriggerProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<CollapsibleTriggerProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
11
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
8
12
  declare const _default: typeof __VLS_export;
9
13
  export default _default;
@@ -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;
@@ -2,12 +2,22 @@ import { type HTMLAttributes } from 'vue';
2
2
  import { type TabsListProps } from 'reka-ui';
3
3
  type __VLS_Props = TabsListProps & {
4
4
  class?: HTMLAttributes['class'];
5
+ /**
6
+ * AW.W25 — render the spring `TabsIndicator` pill behind the triggers so
7
+ * the base default `<Tabs>` matches its own indicator primitive (the
8
+ * polished pill previously lived only in custom BouncyTabs; the base
9
+ * under-delivered vs its own `TabsIndicator.vue`). Default `true`. Set
10
+ * `:indicator="false"` for a list that drives its own active-state vocab.
11
+ */
12
+ indicator?: boolean;
5
13
  };
6
- declare var __VLS_8: {};
14
+ declare var __VLS_13: {};
7
15
  type __VLS_Slots = {} & {
8
- default?: (props: typeof __VLS_8) => any;
16
+ default?: (props: typeof __VLS_13) => any;
9
17
  };
10
- declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
18
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
19
+ indicator: boolean;
20
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
21
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
12
22
  declare const _default: typeof __VLS_export;
13
23
  export default _default;
@@ -1,13 +1,13 @@
1
1
  import { type HTMLAttributes } from 'vue';
2
2
  import { type ToastRootProps } from 'reka-ui';
3
+ import type { ToastVariant } from './use-toast';
3
4
  interface ToastProps extends ToastRootProps {
4
5
  class?: HTMLAttributes['class'];
5
- variant?: 'default' | 'destructive';
6
- onOpenChange?: ((value: boolean) => void) | undefined;
6
+ variant?: ToastVariant;
7
7
  }
8
- declare var __VLS_21: {};
8
+ declare var __VLS_8: {};
9
9
  type __VLS_Slots = {} & {
10
- default?: (props: typeof __VLS_21) => any;
10
+ default?: (props: typeof __VLS_8) => any;
11
11
  };
12
12
  declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
13
13
  "update:open": (value: boolean) => any;
@@ -92,7 +92,7 @@ declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {},
92
92
  };
93
93
  }>, "currentTarget">) => any) | undefined;
94
94
  }>, {
95
- variant: "default" | "destructive";
95
+ variant: ToastVariant;
96
96
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
97
97
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
98
98
  declare const _default: typeof __VLS_export;
@@ -1,5 +1,5 @@
1
1
  import type { Component, VNode } from 'vue';
2
- export type ToastVariant = 'default' | 'destructive';
2
+ export type ToastVariant = 'default' | 'destructive' | 'success' | 'warning' | 'info';
3
3
  export interface Toast {
4
4
  id: string;
5
5
  title?: string;
@@ -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,
@@ -47,3 +66,53 @@ export declare function oklchStopToHex(s: OklchStop): string;
47
66
  * gray default); value.js supplies its own, the demo story uses this one.
48
67
  */
49
68
  export declare const defaultBlobColorResolver: ColorResolver;
69
+ /**
70
+ * Harmony schemes for the OKLCh palette derivers. Each maps the seed hue onto the
71
+ * derived stops differently:
72
+ * - `analogous` — neighbouring hues (seed ± a small spread).
73
+ * - `complementary` — seed → +180° along the LONG arc (stays saturated; the short
74
+ * arc cuts through grey on a warm→cool pair).
75
+ * - `split-complementary` — the two hues flanking the complement (±150/210).
76
+ * - `triad` — seed + its two 120° partners.
77
+ * - `tetradic` — seed + the three 90° partners.
78
+ * - `monochrome` — every stop holds the seed hue; only L and C travel.
79
+ */
80
+ export type ColorHarmony = "analogous" | "complementary" | "split-complementary" | "triad" | "tetradic" | "monochrome";
81
+ /**
82
+ * Hue per harmony, walked across the ramp parameter `t` (0..1) THROUGH value.js's
83
+ * `interpolateHue` in the NORMALIZED-TURNS domain (`/360` in, `*360` out — value.js
84
+ * takes turns [0,1], NOT degrees; the `.5` short-arc threshold is a half-TURN). The
85
+ * single canonical hue-walk both backdrops consume.
86
+ */
87
+ export declare function deriveHue(anchorHue: number, harmony: ColorHarmony, hueSpread: number, t: number): number;
88
+ /**
89
+ * Gamut-map one OklchStop through value.js's Ottosson core
90
+ * (`rawOklchToOklab → gamutMapOKLab → rawOklabToOklch`) with a bounded inward-chroma
91
+ * nudge for the over-1 hull-placement escape. Hue is preserved exactly; the result
92
+ * is in-sRGB to the pipeline's tolerance. The single gamut-mapper both backdrops use.
93
+ */
94
+ export declare function gamutMapStop(stop: OklchStop): OklchStop;
95
+ /** Tuning for {@link deriveBlobPalette}. */
96
+ export interface DeriveBlobPaletteOptions {
97
+ /** Number of stops to produce. Default 3; clamped to [2, 4]. */
98
+ stopCount?: number;
99
+ /** Hue scheme across the stops. Default `analogous`. */
100
+ harmony?: ColorHarmony;
101
+ /** Total L travel across the stops, in OKLCh L units. Default ~0.18. */
102
+ lightnessSpread?: number;
103
+ /** Hue walk in degrees for analogous; ignored by monochrome. Default ~24. */
104
+ hueSpread?: number;
105
+ /** Midpoint chroma-bump (keeps a vivid pair off the grey midpoint). Default ~0.03. */
106
+ chromaBump?: number;
107
+ }
108
+ /**
109
+ * Seed ONE color into a harmonious, gamut-safe 2-4-stop OKLCh palette for the blob
110
+ * — the blob-side twin of `deriveAurora`, consuming the SHARED `ColorHarmony`
111
+ * vocabulary (no forked `deriveHue`). The body takes the deepest/most-saturated
112
+ * stop; satellites take the lighter in-family stops. Every stop is gamut-mapped.
113
+ * Deterministic + DOM-free (SSR-safe; `cssToOklch` parses via value.js).
114
+ *
115
+ * @param seed any CSS color string OR an `OklchStop` anchor.
116
+ * @param options stop count, harmony, spreads.
117
+ */
118
+ export declare function deriveBlobPalette(seed: string | OklchStop, options?: DeriveBlobPaletteOptions): OklchStop[];
@@ -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;