@mkbabb/glass-ui 3.5.1 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/dist/CardAction-D8nSE62a.js +163 -0
  2. package/dist/CollapsibleContent-D7UNsXQr.js +63 -0
  3. package/dist/{CommandShortcut-BiVyqipe.js → CommandShortcut-CY0aQTz5.js} +4 -4
  4. package/dist/{ContextMenuContent-De01_83g.js → ContextMenuContent-DGKZX1Du.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DrWkXKQP.js → ContextMenuSubContent-BeDz7G6f.js} +4 -4
  6. package/dist/{DataTable-DyKc_26a.js → DataTable-gtPOLZvl.js} +14 -7
  7. package/dist/{DialogContent-IQ8_BRrC.js → DialogContent-DG1YMR-P.js} +24 -24
  8. package/dist/{DialogFooter-Er0wA3K6.js → DialogFooter-BCIaDP15.js} +2 -2
  9. package/dist/{DiscoGlyph-BaZ8OawK.js → DiscoGlyph-ZoBYpoxI.js} +1 -1
  10. package/dist/{GlyphFace-B_7vOmYn.js → GlyphFace-Ce_oe3tM.js} +1 -1
  11. package/dist/{HoverCardContent-ICfIMZX1.js → HoverCardContent-Bn0UBMY9.js} +1 -1
  12. package/dist/{HoverPopover-DTSYkJtw.js → HoverPopover-DXpOEw1P.js} +1 -1
  13. package/dist/{IconTooltip-BTyYn4mr.js → IconTooltip-Cu86JR4e.js} +1 -1
  14. package/dist/{Input-CU9CNKmo.js → Input-DWQQIOC4.js} +4 -1
  15. package/dist/{Label-CZk-3nTc.js → Label-DBc7bKzZ.js} +1 -1
  16. package/dist/{MetricBadge-BlrdbOGN.js → MetricBadge-D-bRaQUD.js} +1 -1
  17. package/dist/{Notification-DP_ApJLo.js → Notification-B5WHP3_1.js} +5 -4
  18. package/dist/{NumberFieldContent-jO-zGOHf.js → NumberFieldContent-CLNVR1iY.js} +5 -5
  19. package/dist/{PopoverContent-B8WtJECb.js → PopoverContent-F1bWnYoh.js} +2 -2
  20. package/dist/{Progress-DjM86vfb.js → Progress-c4vo4ALi.js} +6 -6
  21. package/dist/{ScrollingText-P9o_DuMn.js → ScrollingText-BEp377U5.js} +2 -2
  22. package/dist/{SelectScrollDownButton-BGn3rjs9.js → SelectScrollDownButton-DAo5NmY_.js} +8 -7
  23. package/dist/{Separator-C2XtAXRp.js → Separator-DZyqsCum.js} +1 -1
  24. package/dist/{Switch-x8n6husW.js → Switch-2rsAtDfA.js} +8 -2
  25. package/dist/TabsList-COqIdW7i.js +101 -0
  26. package/dist/{Toaster-DdhMKfus.js → Toaster-BMaeziJJ.js} +54 -60
  27. package/dist/{ToggleGroupItem-gyXj998A.js → ToggleGroupItem-C-AIkBUw.js} +13 -5
  28. package/dist/{TooltipProvider-D-JrSqDu.js → TooltipProvider-CD2IXfRv.js} +1 -1
  29. package/dist/{UnderlineTabs-Cq_AD03t.js → UnderlineTabs-D_c1iYo-.js} +1 -1
  30. package/dist/animated-digit.js +2 -2
  31. package/dist/api/index.d.ts +2 -1
  32. package/dist/api.js +1 -1
  33. package/dist/aurora.js +845 -204
  34. package/dist/{badge-Cl6JZ1B7.js → badge-DHQrc_GQ.js} +13 -9
  35. package/dist/badge.js +1 -1
  36. package/dist/{button-i8Ek5vvg.js → button-CAywcrhO.js} +8 -5
  37. package/dist/button.js +1 -1
  38. package/dist/card.js +2 -2
  39. package/dist/carousel.js +5 -5
  40. package/dist/{check-CdkxGxXJ.js → check-BBKKKSTf.js} +1 -1
  41. package/dist/{chevron-down-pBY8sYfV.js → chevron-down-BSkTP2aL.js} +1 -1
  42. package/dist/{chevron-right-BjeKC22V.js → chevron-right-sDM0Yvrf.js} +1 -1
  43. package/dist/{chevron-up-DBeNHUm1.js → chevron-up-CCOD_FTz.js} +1 -1
  44. package/dist/collapsible.js +1 -1
  45. package/dist/color-DjJCAQ6f.js +76 -0
  46. package/dist/color.js +2 -2
  47. package/dist/command.js +1 -1
  48. package/dist/compile-iM4IUB66.js +158 -0
  49. package/dist/components/custom/aurora/Aurora.vue.d.ts +1 -0
  50. package/dist/components/custom/aurora/composables/atoms.d.ts +60 -0
  51. package/dist/components/custom/aurora/composables/color.d.ts +36 -9
  52. package/dist/components/custom/aurora/composables/cursorModel.d.ts +35 -2
  53. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  54. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +16 -0
  55. package/dist/components/custom/aurora/composables/runtime.d.ts +18 -0
  56. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +29 -0
  57. package/dist/components/custom/aurora/composables/useAurora.d.ts +6 -0
  58. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +8 -0
  59. package/dist/components/custom/aurora/constants/presets.d.ts +64 -2
  60. package/dist/components/custom/aurora/constants/renderMode.d.ts +10 -0
  61. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +7 -0
  62. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  63. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  64. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -1
  65. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  66. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +7 -0
  67. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +4 -0
  68. package/dist/components/custom/aurora/index.d.ts +5 -3
  69. package/dist/components/custom/constellation/Constellation.vue.d.ts +45 -0
  70. package/dist/components/custom/constellation/constellationField.d.ts +85 -0
  71. package/dist/components/custom/constellation/index.d.ts +3 -0
  72. package/dist/components/custom/dock/GlassDock.vue.d.ts +34 -3
  73. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +38 -0
  74. package/dist/components/custom/fourier-field/index.d.ts +2 -0
  75. package/dist/components/custom/fourier-field/math.d.ts +57 -0
  76. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +2 -0
  77. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +14 -2
  78. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +45 -4
  79. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +1 -1
  80. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  81. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  82. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  83. package/dist/components/custom/goo-blob/types.d.ts +40 -0
  84. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +1 -1
  85. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  86. package/dist/components/ui/_shared/ModalOverlay.vue.d.ts +1 -1
  87. package/dist/components/ui/alert/index.d.ts +1 -1
  88. package/dist/components/ui/card/Card.vue.d.ts +10 -3
  89. package/dist/components/ui/card/CardAction.vue.d.ts +24 -0
  90. package/dist/components/ui/card/index.d.ts +1 -0
  91. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +5 -1
  92. package/dist/components/ui/tabs/TabsList.vue.d.ts +13 -3
  93. package/dist/components/ui/toast/Toast.vue.d.ts +5 -5
  94. package/dist/components/ui/toast/use-toast.d.ts +1 -1
  95. package/dist/composables/color/index.d.ts +50 -0
  96. package/dist/composables/glass/canvas2d/index.d.ts +2 -0
  97. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +48 -0
  98. package/dist/composables/glass/createGPUCanvas.d.ts +40 -0
  99. package/dist/composables/glass/index.d.ts +2 -0
  100. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +45 -0
  101. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +3 -0
  102. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +4 -4
  103. package/dist/configurator.js +1 -1
  104. package/dist/confirm-dialog.js +3 -3
  105. package/dist/constellation.d.ts +1 -0
  106. package/dist/constellation.js +182 -0
  107. package/dist/context-menu.js +2 -2
  108. package/dist/controls.js +2 -2
  109. package/dist/dark.js +1 -1
  110. package/dist/data-table.js +1 -1
  111. package/dist/dialog.js +2 -2
  112. package/dist/disco-glyph.js +1 -1
  113. package/dist/dock.js +129 -110
  114. package/dist/{dockContext-spUj_-E5.js → dockContext-DLgrVWsU.js} +1 -1
  115. package/dist/dom.js +5 -5
  116. package/dist/{dropdown-menu-EFjl5iKo.js → dropdown-menu-BWpwutt0.js} +5 -5
  117. package/dist/dropdown-menu.js +1 -1
  118. package/dist/expandable-container.js +2 -2
  119. package/dist/forms.js +10 -7
  120. package/dist/fourier-field.d.ts +1 -0
  121. package/dist/fourier-field.js +166 -0
  122. package/dist/glass-carousel.js +1 -1
  123. package/dist/glass-panel.js +2 -2
  124. package/dist/glass-ui.css +1 -1
  125. package/dist/glass-ui.js +207 -191
  126. package/dist/glyph-face.js +2 -2
  127. package/dist/goo-blob.js +336 -234
  128. package/dist/header-ribbon.js +1 -1
  129. package/dist/hover-card.js +1 -1
  130. package/dist/hover-popover.js +1 -1
  131. package/dist/icon-tooltip.js +1 -1
  132. package/dist/instrument-chassis.js +1 -1
  133. package/dist/instrument-rail.js +1 -1
  134. package/dist/keyboard.js +1 -1
  135. package/dist/{keys-BFoma9vm.js → keys-Dyf_uTs5.js} +1 -1
  136. package/dist/label.js +1 -1
  137. package/dist/labeled-field.js +6 -6
  138. package/dist/metric-badge.js +1 -1
  139. package/dist/metric-stack.js +1 -1
  140. package/dist/{minimize-2-BP27-qBY.js → minimize-2-lcXOuc6V.js} +1 -1
  141. package/dist/motion-core.js +76 -106
  142. package/dist/motion.js +3 -3
  143. package/dist/notification.js +1 -1
  144. package/dist/number-field.js +1 -1
  145. package/dist/paper-backdrop.js +1 -1
  146. package/dist/popover.js +1 -1
  147. package/dist/progress.js +1 -1
  148. package/dist/pulse.js +1 -1
  149. package/dist/reactive.js +2 -2
  150. package/dist/responsive-tabs.js +2 -2
  151. package/dist/scrolling-text.js +1 -1
  152. package/dist/{search-DBG8qaRs.js → search-nbkvr2dC.js} +1 -1
  153. package/dist/search.js +8 -8
  154. package/dist/select.js +3 -3
  155. package/dist/separator.js +1 -1
  156. package/dist/{sheet-CQYYrkr9.js → sheet-Cv1uO-Gq.js} +4 -4
  157. package/dist/sheet.js +1 -1
  158. package/dist/{slider-CgNzRSh6.js → slider-BA9wIs5e.js} +5 -4
  159. package/dist/slider.js +1 -1
  160. package/dist/sortable-list.js +3 -3
  161. package/dist/styles/components.css +1 -1
  162. package/dist/styles/dock.css +185 -1
  163. package/dist/styles/glass-refract.css +60 -0
  164. package/dist/styles/glass-specular-track.css +43 -130
  165. package/dist/styles/glass.css +243 -27
  166. package/dist/styles/index.css +1 -0
  167. package/dist/styles/theme.css +55 -0
  168. package/dist/styles/tokens.css +33 -0
  169. package/dist/styles/typography.css +3 -3
  170. package/dist/styles/utilities.css +17 -13
  171. package/dist/supportsCssTimeline-C5oe0lnD.js +12 -0
  172. package/dist/switch.js +1 -1
  173. package/dist/tabs.js +4 -4
  174. package/dist/timeline.js +2 -2
  175. package/dist/toast.js +1 -1
  176. package/dist/toggle-group.js +1 -1
  177. package/dist/tooltip.js +1 -1
  178. package/dist/typewriter.js +1 -1
  179. package/dist/{useAnimatedNumber-BF6r64lA.js → useAnimatedNumber-C5I3wWd8.js} +1 -1
  180. package/dist/useCanvas2D-C31yfUGY.js +95 -0
  181. package/dist/{useConfiguratorState-DUtC1jxr.js → useConfiguratorState-B24TcgIn.js} +5 -5
  182. package/dist/useScrollProgress-CAH8Ofwt.js +35 -0
  183. package/dist/{useTouchGate-CS5Csc2h.js → useTouchGate-YQRwyUGU.js} +1 -1
  184. package/dist/{vReveal-u2wSG2El.js → vReveal-BE2TsPoR.js} +6 -17
  185. package/dist/watercolor-dot.js +2 -2
  186. package/dist/{x-C4pz9nbD.js → x-Dfsegz9Y.js} +1 -1
  187. package/package.json +49 -1
  188. package/src/styles/dock.css +185 -1
  189. package/src/styles/glass-refract.css +60 -0
  190. package/src/styles/glass-specular-track.css +43 -130
  191. package/src/styles/glass.css +243 -27
  192. package/src/styles/index.css +1 -0
  193. package/src/styles/theme.css +55 -0
  194. package/src/styles/tokens.css +33 -0
  195. package/src/styles/typography.css +3 -3
  196. package/src/styles/utilities.css +17 -13
  197. package/dist/CardFooter-C390imy7.js +0 -129
  198. package/dist/CollapsibleContent-cauTbZEM.js +0 -52
  199. package/dist/TabsIndicator-DA0x9gPr.js +0 -97
  200. package/dist/color-rkK4RMx2.js +0 -33
  201. package/dist/compile-DVgAxagk.js +0 -106
  202. /package/dist/{InstrumentChassis-DaHIZCqy.js → InstrumentChassis-BLJBl1BW.js} +0 -0
  203. /package/dist/{InstrumentRail-B0qqLFN0.js → InstrumentRail-BElFwKyt.js} +0 -0
  204. /package/dist/{ModalOverlay-B_CBtqcE.js → ModalOverlay-D1VrWyoi.js} +0 -0
  205. /package/dist/{PaperBackdrop-D_YZW47j.js → PaperBackdrop-DCGoGatv.js} +0 -0
  206. /package/dist/{SelectGroup-CMdoCjRE.js → SelectGroup-BcaFjvP4.js} +0 -0
  207. /package/dist/{SelectSeparator-CaJnPF3_.js → SelectSeparator-COFMJGng.js} +0 -0
  208. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
  209. /package/dist/{constants-DsCdlK9I.js → constants-CS75AWHG.js} +0 -0
  210. /package/dist/{createContext-DBMGRlx4.js → createContext-CvNyBk4o.js} +0 -0
  211. /package/dist/{createLucideIcon-DuDoe_ra.js → createLucideIcon-B6uNAU9G.js} +0 -0
  212. /package/dist/{menuItemVariants-C2QlXqT3.js → menuItemVariants-B4eFR5Ix.js} +0 -0
  213. /package/dist/{presets-1OhFpaIC.js → presets-BKVyQfbt.js} +0 -0
  214. /package/dist/{prng-Bz_1Tydc.js → prng-wHuHlNHE.js} +0 -0
  215. /package/dist/{useGlassRenderer-Dn3WpfG-.js → useGlassRenderer-HebgSEgN.js} +0 -0
  216. /package/dist/{useGlobalDark-CWiaCoEw.js → useGlobalDark-yhL4Wp-s.js} +0 -0
  217. /package/dist/{useIntersectionPause-DAdVPVp4.js → useIntersectionPause-Cc-H9ees.js} +0 -0
  218. /package/dist/{useInterval-CHVYFpXV.js → useInterval-D3USn0yc.js} +0 -0
  219. /package/dist/{useKeyboardShortcuts-BQfnAHHW.js → useKeyboardShortcuts-Be3w_Rwk.js} +0 -0
  220. /package/dist/{useResizeObserver-DX-STszm.js → useResizeObserver-CSyxGxIX.js} +0 -0
  221. /package/dist/{useSortable-DnyGXKKY.js → useSortable-C8ReQ50P.js} +0 -0
  222. /package/dist/{useSpringMount-CnizvZGm.js → useSpringMount-LRZqJTaF.js} +0 -0
  223. /package/dist/{useTextHighlight-Dmtofpk2.js → useTextHighlight-aMPdEpkq.js} +0 -0
  224. /package/dist/{useTimer-DGgoxTXL.js → useTimer-DEJonOZa.js} +0 -0
  225. /package/dist/{useUserInvalidAria-DmvZ_6Dx.js → useUserInvalidAria-CQKjEfwP.js} +0 -0
  226. /package/dist/{useViewTransition-CJnqg6wl.js → useViewTransition-DaN5Zrox.js} +0 -0
  227. /package/dist/{useViewportReady-Dcvf0c4p.js → useViewportReady-K96m-Mdv.js} +0 -0
@@ -28,8 +28,38 @@ type __VLS_Props = {
28
28
  * chassis vocabulary. AJ-W1-δ / G-AJ-D7.
29
29
  */
30
30
  variant?: "dock" | "rail" | "instrument-strip";
31
- /** Corner treatment for vertical rail/tool-palette docks. */
32
- shape?: "pill" | "rounded";
31
+ /**
32
+ * Corner treatment.
33
+ * `"pill"` — the stadium silhouette (default).
34
+ * `"rounded"` — a finite rounded radius (`--radius-xl`).
35
+ * `"card"` — the AW.W3b big-dock card shell: a finite concentric
36
+ * radius (`--dock-card-radius`, default `--radius-3xl`)
37
+ * ABOVE 2xl, below pill — does NOT collapse to a stadium.
38
+ * Collapsed it returns to a pill; the pill↔card swap
39
+ * morphs on the `--dock-motion-resize` spring. A `@supports
40
+ * (corner-shape: squircle)` enhancement reads better at the
41
+ * large radius (the border-radius arc is the contract).
42
+ *
43
+ * `"pill"`/`"rounded"` previously bound ONLY under the vertical rail
44
+ * variant — on a horizontal dock the prop silently no-op'd. AW.W3b adds
45
+ * the horizontal-root shape rules (closing that documented-but-dead prop),
46
+ * so `shape` now paints on a horizontal dock too.
47
+ */
48
+ shape?: "pill" | "rounded" | "card";
49
+ /**
50
+ * In-cap arrangement. `"linear"` (default) lays the active layer out as a
51
+ * linear row/column. `"grid"` makes the active layer a self-wrapping tile
52
+ * grid (Launchpad/Stage-Manager track symmetry — `auto-fill` columns of
53
+ * `--dock-tile-min`). ORTHOGONAL to `overflow` (the OVER-cap strategy):
54
+ * `layout` is the IN-cap arrangement.
55
+ *
56
+ * Hard contract: a `layout="grid"` dock is `alwaysExpanded` (a 2D panel
57
+ * does not read as a collapsible pill, and no width morph means no
58
+ * per-frame grid reflow). The canonical pairing is
59
+ * `shape="card" layout="grid"` (the props stay independent — no
60
+ * auto-implication of `shape`).
61
+ */
62
+ layout?: "linear" | "grid";
33
63
  /**
34
64
  * Layout axis of the dock. `"horizontal"` (default) lays items out
35
65
  * left-to-right and animates `width`; `"vertical"` lays items out
@@ -101,7 +131,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
101
131
  orientation: "horizontal" | "vertical";
102
132
  variant: "dock" | "rail" | "instrument-strip";
103
133
  density: DockDensity;
104
- shape: "pill" | "rounded";
134
+ shape: "pill" | "rounded" | "card";
135
+ layout: "linear" | "grid";
105
136
  collapseDelay: number;
106
137
  alwaysExpanded: boolean;
107
138
  startCollapsed: boolean;
@@ -0,0 +1,38 @@
1
+ import { type ColorResolver } from "../../../composables/color";
2
+ /**
3
+ * FourierField — a Fourier epicycle field on a Canvas2D surface, a sibling
4
+ * primitive to Aurora and GooBlob. A seeded elliptic spectrum reconstructs a
5
+ * slow, never-ending closed curve via the inverse DFT; a fading comet trail
6
+ * chases the curve's head, and (in the `hero` preset) the nested epicycle
7
+ * circles and arms draw underneath in a harmonious second hue. It composes the
8
+ * `useCanvas2D` substrate, so it inherits the offscreen / tab-hidden /
9
+ * reduced-motion freeze for free — no hand-rolled RAF-park.
10
+ *
11
+ * Color resolves through the same INJECTED `colorResolver` seam as GooBlob: the
12
+ * field paints the gamma-sRGB triple it returns. The prop is REQUIRED — pass
13
+ * `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` so a `var()` /
14
+ * `light-dark()` token, an `oklch()` / `hsl()` / hex string all resolve. A
15
+ * `var()` token is first resolved to a concrete `rgb()` against the host's
16
+ * inherited color-scheme, then re-resolved on a color change AND on a dark-mode
17
+ * toggle so the field retints with the theme.
18
+ *
19
+ * `variant` is the configuration BUNDLE, not a recolour of one curve: `hero`
20
+ * draws a few big phasors with the epicycles ON and a warm trail feel; `final`
21
+ * draws a denser elliptic spectrum with the epicycles OFF. One engine, two
22
+ * presets. The hue itself always comes from the consumer's `color`.
23
+ */
24
+ type __VLS_Props = {
25
+ /** Configuration bundle. `hero` = epicycles on, fewer harmonics; `final` = epicycles off, denser. Default `hero`. */
26
+ variant?: "hero" | "final";
27
+ /** Base CSS color (any form the resolver understands; a `var()`/`light-dark()` token resolves against the host). */
28
+ color: string;
29
+ /** REQUIRED color seam — resolves a concrete color to a gamma-sRGB [r,g,b] triple in [0,1]. */
30
+ colorResolver: ColorResolver;
31
+ /** Extra seed mixed into the spectrum PRNG for a unique-but-reproducible curve. Default "". */
32
+ seed?: string;
33
+ /** When true, paint ONE static deterministic best-frame and never animate (the capture/export lever). Default false. */
34
+ freeze?: boolean;
35
+ };
36
+ declare const __VLS_export: 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>;
37
+ declare const _default: typeof __VLS_export;
38
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export { default as FourierField } from "./FourierField.vue";
2
+ export { comp, evalFourier, positionsAt, makeEllipticSpectrum, type BasisComponent, type EllipticSpectrumOptions, } from "./math";
@@ -0,0 +1,57 @@
1
+ /**
2
+ * One Fourier phasor. `index` is the integer frequency (a counter-rotating pair
3
+ * is `+1` and `-1`); `coefficient` is the complex coefficient `[re, im]`;
4
+ * `amplitude`/`phase` are its polar form (carried for callers that prefer the
5
+ * polar read — the reconstruction uses the rectangular `coefficient`).
6
+ */
7
+ export interface BasisComponent {
8
+ index: number;
9
+ coefficient: [number, number];
10
+ amplitude: number;
11
+ phase: number;
12
+ }
13
+ /**
14
+ * Build a {@link BasisComponent} from a frequency index and its rectangular
15
+ * coefficient `(re, im)`, deriving the polar `amplitude`/`phase`.
16
+ */
17
+ export declare function comp(index: number, re: number, im: number): BasisComponent;
18
+ /**
19
+ * Sum `c_k * exp(2*pi*i*k*t)` — the curve point at parameter `t`. `maxTerms`
20
+ * truncates the series (the partial-sum read). Returns the complex value as
21
+ * `[re, im]` (the curve's `[x, y]` before view-fit).
22
+ */
23
+ export declare function evalFourier(components: BasisComponent[], t: number, maxTerms?: number): [number, number];
24
+ /**
25
+ * The epicycle chain at parameter `t`: the running tip of each phasor stacked on
26
+ * the last, starting at the origin. `positions[0]` is `[0, 0]`; the final entry
27
+ * is the curve point ({@link evalFourier} at the same `t`). `maxCircles`
28
+ * truncates the chain (draw fewer arms than the spectrum carries).
29
+ */
30
+ export declare function positionsAt(components: BasisComponent[], t: number, maxCircles?: number): [number, number][];
31
+ /** Tuning for {@link makeEllipticSpectrum}. */
32
+ export interface EllipticSpectrumOptions {
33
+ /**
34
+ * How many smaller higher-order harmonics to layer on top of the dominant
35
+ * counter-rotating pair (the dominant pair is always present). Default 4.
36
+ * The `final` preset passes a larger count for a denser, busier curve.
37
+ */
38
+ harmonics?: number;
39
+ /**
40
+ * Peak magnitude of the higher-order harmonics relative to the dominant
41
+ * phasor. Smaller keeps the curve a clean, smooth ellipse with a little
42
+ * character; larger crinkles it. Default ~0.22.
43
+ */
44
+ harmonicScale?: number;
45
+ }
46
+ /**
47
+ * Emit a procedural elliptic spectrum: a DOMINANT counter-rotating pair (index
48
+ * `+1` and `-1`) of UNEQUAL magnitude — the inequality is what draws a tilted
49
+ * ellipse rather than a circle — plus a few smaller higher-order harmonics with
50
+ * random small magnitudes and phases for character. Lower orders carry more
51
+ * weight (a `1 / order` falloff), so the curve stays large, smooth and
52
+ * few-big-phasor; the `harmonics` knob lifts it to the denser `final` look.
53
+ *
54
+ * Deterministic in `rng`: the same seeded `() => number` yields the same
55
+ * spectrum, so a frozen frame reproduces exactly.
56
+ */
57
+ export declare function makeEllipticSpectrum(rng: () => number, opts?: EllipticSpectrumOptions): BasisComponent[];
@@ -35,9 +35,11 @@ type __VLS_Props = {
35
35
  };
36
36
  declare function nudge(): void;
37
37
  declare function setMood(m: BlobMood): void;
38
+ declare function pulse(): void;
38
39
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
39
40
  nudge: typeof nudge;
40
41
  setMood: typeof setMood;
42
+ pulse: typeof pulse;
41
43
  currentMood: Readonly<import("vue").Ref<BlobMood, BlobMood>>;
42
44
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
43
45
  click: () => any;
@@ -1,14 +1,26 @@
1
1
  import { type Ref } from "vue";
2
2
  import type { BlobMood, MoodParams } from "../types";
3
+ /** The interaction signals `update` reads to drive the auto-mood arc. */
4
+ export interface MoodInteraction {
5
+ /** The pointer is over the blob (drives `curious`). */
6
+ pointerActive: boolean;
7
+ /** A click landed this frame (drives a one-shot `excited`). */
8
+ clicked: boolean;
9
+ /** ms since the last pointer activity (drives `sleepy` past IDLE_SLEEP_MS). */
10
+ idleMs: number;
11
+ }
3
12
  /**
4
13
  * Animates the blob's mood parameters — a cross-fade between named mood targets
5
- * driven per frame by `tick(dt)`. `setMood` retargets; `params` is the eased
6
- * current value the renderer reads.
14
+ * driven per frame by `tick(dt)`. `setMood` retargets; `update(interaction)` wires
15
+ * `setMood` internally from the AW.W10 pointer/idle state (curious on approach,
16
+ * excited on click, sleepy after inactivity); `params` is the eased current value
17
+ * the renderer reads.
7
18
  */
8
19
  export declare function useBlobMood(): {
9
20
  currentMood: Readonly<Ref<BlobMood>>;
10
21
  params: Readonly<Ref<MoodParams>>;
11
22
  setMood: (mood: BlobMood) => void;
23
+ update: (interaction: MoodInteraction) => void;
12
24
  tick: (dt: number) => void;
13
25
  };
14
26
  export type BlobMoodSystem = ReturnType<typeof useBlobMood>;
@@ -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,25 @@ 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;
17
58
  };
18
59
  export type BlobPointer = ReturnType<typeof useBlobPointer>;
@@ -1,6 +1,6 @@
1
1
  import { type Ref } from "vue";
2
2
  import type { ColorResolver } from "../../../../composables/color";
3
- import type { BlobConfig } from "../types";
3
+ import { type BlobConfig } from "../types";
4
4
  import type { BlobMoodSystem } from "./useBlobMood";
5
5
  import type { BlobPointer } from "./useBlobPointer";
6
6
  import type { BlobSatelliteSystem } from "./useBlobSatellites";
@@ -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, 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// 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}";
@@ -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 + 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 * noised(p * freq).x;\n p = FBM_ROT * p;\n freq *= 2.0;\n amp *= 0.5;\n }\n return value;\n}\n\n// One domain-warp pass: offset the sample point by a low-frequency FBM of itself\n// (the IQ fbm(p + W*fbm(p)) marbling). warpAmp (uniform-driven) is the warp\n// strength; warpAmp == 0.0 degrades to plain fbm (the pre-warp look).\nfloat fbmWarped(vec2 p, int octaves, float warpAmp) {\n if (warpAmp <= 0.0) return fbm(p, octaves);\n vec2 q = vec2(fbm(p + vec2(0.0, 0.0), octaves), fbm(p + vec2(5.2, 1.3), octaves));\n return fbm(p + warpAmp * (q - 0.5), octaves);\n}\n";
@@ -1,5 +1,7 @@
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";
3
5
  export interface MoodParams {
4
6
  orbitSpeedScale: number;
5
7
  wobbleScale: number;
@@ -12,6 +14,8 @@ export interface MoodParams {
12
14
  smoothK: number;
13
15
  pointerAttraction: number;
14
16
  mergeRate: number;
17
+ /** Mood-driven iridescence/SSS intensity multiplier (excited > 1, sleepy < 1). */
18
+ iridScale: number;
15
19
  }
16
20
  export interface MetaballSource {
17
21
  x: number;
@@ -51,10 +55,18 @@ export interface BlobConfig {
51
55
  satelliteCount: number;
52
56
  satelliteRadius: number;
53
57
  orbitRadius: number;
58
+ tempo: number;
54
59
  smoothK: number;
60
+ /** Smin merge variant — `quadratic` (default) | `circular` (rounder menisci). */
61
+ merge: BlobMerge;
55
62
  noiseAmp: number;
56
63
  noiseFreq: number;
57
64
  noiseSpeed: number;
65
+ /**
66
+ * Domain-warp strength on the FBM edge displacement (0 = plain fbm, the
67
+ * pre-warp look; ~0.6 = a marbled organic membrane). Taste-first low default.
68
+ */
69
+ warpAmp: number;
58
70
  pulseFreq: number;
59
71
  pulseAmp: number;
60
72
  hueRange: number;
@@ -62,8 +74,36 @@ export interface BlobConfig {
62
74
  brightnessShift: number;
63
75
  colorNoiseFreq: number;
64
76
  colorNoiseSpeed: number;
77
+ paletteStops: string[];
78
+ /** Warm-pearl rim sheen weight (0 = off). */
79
+ iridescence: number;
80
+ /** Base hue (degrees) the warm-biased cosine palette centres on. */
81
+ iridHue: number;
82
+ /** Animated-thickness scroll speed for the iridescent shimmer. */
83
+ iridSpeed: number;
84
+ /** Fast-SSS back-light weight. */
85
+ sssScale: number;
86
+ /** Fast-SSS exponent. */
87
+ sssPower: number;
88
+ /** Thickness-driven inner-luminosity (core glow) lift. */
89
+ coreGlow: number;
90
+ lit: boolean;
91
+ /** CSS color for the Fresnel rim tint (resolved through the ColorResolver). */
92
+ rimColor: string;
93
+ /** Light direction [x, y, z] (normalized in-shader). */
94
+ lightDir: [number, number, number];
95
+ specStrength: number;
96
+ /** Specular exponent (16-64 — a tight glint). */
97
+ specShininess: number;
98
+ /** Fresnel/Schlick exponent (~2-3). */
99
+ rimPower: number;
100
+ rimStrength: number;
65
101
  pointerAttraction: number;
66
102
  pointerStrength: number;
103
+ /** Velocity-driven volume-preserving squash-and-stretch magnitude (0 = off). */
104
+ stretch: number;
105
+ /** Click spring-impulse amplitude (a one-shot bouncy pulse on the body radius). */
106
+ clickImpulse: number;
67
107
  eccentricity: number;
68
108
  orbitSpeedScale: number;
69
109
  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
@@ -33,11 +33,17 @@ interface Props extends PrimitiveProps {
33
33
  /** `::after` paper-grain overlay. Off for scroll panes (the grain conflicts
34
34
  * with overflow:auto repaints). */
35
35
  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;
36
42
  class?: HTMLAttributes["class"];
37
43
  }
38
- declare var __VLS_8: {};
44
+ declare var __VLS_10: {};
39
45
  type __VLS_Slots = {} & {
40
- default?: (props: typeof __VLS_8) => any;
46
+ default?: (props: typeof __VLS_10) => any;
41
47
  };
42
48
  declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
43
49
  shadow: boolean;
@@ -45,6 +51,7 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, i
45
51
  tier: CardTier;
46
52
  surface: CardSurface;
47
53
  grain: boolean;
54
+ hover: boolean;
48
55
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
49
56
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
50
57
  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
+ };
@@ -4,3 +4,4 @@ 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;
@@ -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;
@@ -47,3 +47,53 @@ export declare function oklchStopToHex(s: OklchStop): string;
47
47
  * gray default); value.js supplies its own, the demo story uses this one.
48
48
  */
49
49
  export declare const defaultBlobColorResolver: ColorResolver;
50
+ /**
51
+ * Harmony schemes for the OKLCh palette derivers. Each maps the seed hue onto the
52
+ * derived stops differently:
53
+ * - `analogous` — neighbouring hues (seed ± a small spread).
54
+ * - `complementary` — seed → +180° along the LONG arc (stays saturated; the short
55
+ * arc cuts through grey on a warm→cool pair).
56
+ * - `split-complementary` — the two hues flanking the complement (±150/210).
57
+ * - `triad` — seed + its two 120° partners.
58
+ * - `tetradic` — seed + the three 90° partners.
59
+ * - `monochrome` — every stop holds the seed hue; only L and C travel.
60
+ */
61
+ export type ColorHarmony = "analogous" | "complementary" | "split-complementary" | "triad" | "tetradic" | "monochrome";
62
+ /**
63
+ * Hue per harmony, walked across the ramp parameter `t` (0..1) THROUGH value.js's
64
+ * `interpolateHue` in the NORMALIZED-TURNS domain (`/360` in, `*360` out — value.js
65
+ * takes turns [0,1], NOT degrees; the `.5` short-arc threshold is a half-TURN). The
66
+ * single canonical hue-walk both backdrops consume.
67
+ */
68
+ export declare function deriveHue(anchorHue: number, harmony: ColorHarmony, hueSpread: number, t: number): number;
69
+ /**
70
+ * Gamut-map one OklchStop through value.js's Ottosson core
71
+ * (`rawOklchToOklab → gamutMapOKLab → rawOklabToOklch`) with a bounded inward-chroma
72
+ * nudge for the over-1 hull-placement escape. Hue is preserved exactly; the result
73
+ * is in-sRGB to the pipeline's tolerance. The single gamut-mapper both backdrops use.
74
+ */
75
+ export declare function gamutMapStop(stop: OklchStop): OklchStop;
76
+ /** Tuning for {@link deriveBlobPalette}. */
77
+ export interface DeriveBlobPaletteOptions {
78
+ /** Number of stops to produce. Default 3; clamped to [2, 4]. */
79
+ stopCount?: number;
80
+ /** Hue scheme across the stops. Default `analogous`. */
81
+ harmony?: ColorHarmony;
82
+ /** Total L travel across the stops, in OKLCh L units. Default ~0.18. */
83
+ lightnessSpread?: number;
84
+ /** Hue walk in degrees for analogous; ignored by monochrome. Default ~24. */
85
+ hueSpread?: number;
86
+ /** Midpoint chroma-bump (keeps a vivid pair off the grey midpoint). Default ~0.03. */
87
+ chromaBump?: number;
88
+ }
89
+ /**
90
+ * Seed ONE color into a harmonious, gamut-safe 2-4-stop OKLCh palette for the blob
91
+ * — the blob-side twin of `deriveAurora`, consuming the SHARED `ColorHarmony`
92
+ * vocabulary (no forked `deriveHue`). The body takes the deepest/most-saturated
93
+ * stop; satellites take the lighter in-family stops. Every stop is gamut-mapped.
94
+ * Deterministic + DOM-free (SSR-safe; `cssToOklch` parses via value.js).
95
+ *
96
+ * @param seed any CSS color string OR an `OklchStop` anchor.
97
+ * @param options stop count, harmony, spreads.
98
+ */
99
+ export declare function deriveBlobPalette(seed: string | OklchStop, options?: DeriveBlobPaletteOptions): OklchStop[];
@@ -0,0 +1,2 @@
1
+ export { createCanvas2D } from "./useCanvas2D";
2
+ export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./useCanvas2D";