@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
@@ -19,16 +19,49 @@ export interface ConstellationPointer {
19
19
  x: number;
20
20
  y: number;
21
21
  }
22
- /** The neutral palette resolved off the canvas custom properties. */
22
+ /**
23
+ * The neutral palette + legibility weights resolved off the canvas custom
24
+ * properties (the FULL `--constellation-*` set — AX.W17). `node`/`nodeDim`/
25
+ * `line` are the colors; `edgeAlpha`/`edgeFocusAlpha`/`alpha` are the per-mode
26
+ * legibility multipliers (replacing the `0.17`/`0.24` magic literals).
27
+ */
23
28
  export interface ConstellationPalette {
24
29
  node: string;
25
30
  nodeDim: string;
26
31
  line: string;
32
+ /** The hairline-edge alpha multiplier (was the `0.17` literal). */
33
+ edgeAlpha: number;
34
+ /** The focus-proximity edge multiplier (consumer skins may read it). */
35
+ edgeFocusAlpha: number;
36
+ /** The field-yields-to-type translucency knob (the global field dimmer). */
37
+ alpha: number;
38
+ }
39
+ /**
40
+ * The per-axis critically-damped warp spring on the focal node (AX.W17). The
41
+ * focal mark's position is `(x, y)`; `vx`/`vy` its velocity; `targetIdx` the
42
+ * LIVE node index it chases (re-read each frame so it tracks a DRIFTING target,
43
+ * not a frozen click-time snapshot). `-1` = no active warp (the focal mark
44
+ * rides its node's drift directly — the identity-ride at settle).
45
+ */
46
+ export interface ConstellationWarp {
47
+ x: number;
48
+ y: number;
49
+ vx: number;
50
+ vy: number;
51
+ /** The chased node's INDEX (live target), or -1 when inactive. */
52
+ targetIdx: number;
27
53
  }
28
54
  /**
29
55
  * The field state the component exposes to its `drawOverlay` consumer so a
30
56
  * skin can pin itself to a real field node. `k` is the `width / BASE_WIDTH`
31
57
  * scale, `dpr` the device-pixel ratio applied by the substrate.
58
+ *
59
+ * The focal node (AX.W17) is a FIRST-CLASS library concept: `focalIndex` names
60
+ * which node is focal (consumer-owned via `warpTo`), and the engine OWNS its
61
+ * position via the `warp` spring stepped inside `stepField`. A `drawOverlay`
62
+ * paints the focal mark at `field.warp.{x,y}` (the spring-eased position) —
63
+ * node-position mutation `drawOverlay` structurally cannot express, resolved by
64
+ * ONE first-class concept (warp + drift unify; no second parallel hook).
32
65
  */
33
66
  export interface ConstellationField {
34
67
  nodes: ConstellationNode[];
@@ -38,6 +71,14 @@ export interface ConstellationField {
38
71
  h: number;
39
72
  k: number;
40
73
  dpr: number;
74
+ /**
75
+ * The designated focal node's INDEX, or `-1` when none is pinned. Re-points
76
+ * on each `warpTo`; node count is conserved (it is a designation, not a new
77
+ * node). A `drawOverlay` reads `field.warp.{x,y}` for the spring-eased mark.
78
+ */
79
+ focalIndex: number;
80
+ /** The per-axis warp spring the engine steps inside `stepField` (AX.W17). */
81
+ warp: ConstellationWarp;
41
82
  }
42
83
  /**
43
84
  * The `<Constellation>` consumer prop surface (the public type a consumer types
@@ -55,26 +96,90 @@ export interface ConstellationProps {
55
96
  seed?: number | string;
56
97
  /** Steer-toward-cursor + tap ripples. Default true; auto-off under reduced-motion. */
57
98
  pointerReactive?: boolean;
99
+ /**
100
+ * Click-to-warp (AX.W17): a click warps the focal node to the nearest
101
+ * drifting node + springs it there. INDEPENDENT of `pointerReactive` (warp
102
+ * works on a non-ripple lattice). Default false; auto-off under
103
+ * reduced-motion (the focal mark stays put — the stated PRM policy).
104
+ */
105
+ warpOnClick?: boolean;
58
106
  class?: string;
59
107
  /** The skin seam — paints the consumer's focal mark on the live field. */
60
108
  drawOverlay?: (ctx: CanvasRenderingContext2D, field: ConstellationField, now: number) => void;
61
109
  }
62
110
  export declare const DEFAULT_PALETTE: ConstellationPalette;
63
- /** Resolve the neutral palette off a canvas's resolved custom properties. */
111
+ /**
112
+ * Resolve the FULL neutral palette + legibility weights off a canvas's resolved
113
+ * custom properties (AX.W17). The colors AND the alpha multipliers route through
114
+ * the same `getComputedStyle` probe, so a dark-mode flip re-resolves BOTH the
115
+ * `:root`/`.dark` color arms AND the per-mode alpha defaults in one read.
116
+ */
64
117
  export declare function readPalette(canvas: HTMLCanvasElement): ConstellationPalette;
65
118
  /**
66
119
  * Seed `count` drifting nodes inside `w × h`. `rng` is a `() => number` in
67
120
  * `[0, 1)` (the glass-ui `mulberry32`/`Math.random`); a seeded `rng` lays out a
68
- * reproducible field. No node is pinned — every node drifts (pinning a focal
69
- * node is consumer skin, not field mechanics).
121
+ * reproducible field. Every node drifts; a focal node IS pinnable (AX.W17) — the
122
+ * `field.focalIndex` designation + the engine-owned `warp` spring chase a node,
123
+ * but the underlying node still drifts (warp re-points an EXISTING node, never
124
+ * adds one, so node count is conserved).
70
125
  */
71
126
  export declare function seedField(rng: () => number, count: number, w: number, h: number, speed: number): ConstellationNode[];
72
127
  /**
73
128
  * Advance the field one step: drift + wall-bounce every node, then (if the
74
129
  * pointer is live) lean nodes within reach toward the cursor WITHOUT changing
75
130
  * their speed (the slow geometric drift is preserved). `k` is the scale factor.
131
+ *
132
+ * `dt` (seconds since the previous frame) advances the focal-node warp spring
133
+ * via `warpStep` INSIDE this single per-frame call (AX.W17) — NO second rAF,
134
+ * NO `useSpring`. The warp rides the substrate's ONE parked rAF; a `dt` of `0`
135
+ * (omitted / first frame) leaves the spring untouched.
136
+ */
137
+ export declare function stepField(field: ConstellationField, k: number, speed: number, pointer: ConstellationPointer | null, dt?: number): void;
138
+ /**
139
+ * The nearest DRIFTING node to `(px, py)` in canvas-local px — a linear O(count)
140
+ * min-d² scan (count 64 default — negligible; matches the O(count²) edge pass).
141
+ * "Lattice point" = the nearest drifting NODE (the constellation has NO fixed
142
+ * lattice). `excludeIdx` drops a node from the candidate set (the focal node
143
+ * excludes ITSELF, so a cursor-on-focal warp no-ops). Returns `-1` if no
144
+ * eligible node exists (empty field, or only the excluded node).
145
+ */
146
+ export declare function nearestNode(field: ConstellationField, px: number, py: number, excludeIdx?: number): number;
147
+ /**
148
+ * Advance the focal-node warp spring one `dt` (seconds). A per-axis 2nd-order
149
+ * critically-damped integrator over `field.warp.{x,y}` toward the LIVE position
150
+ * of `field.nodes[field.warp.targetIdx]` — re-read EACH frame, so the spring
151
+ * CHASES a drifting target and arrives ON it (the identity-ride). No-ops when no
152
+ * warp is active (`targetIdx < 0`). `dt` is clamped to {@link WARP_DT_CLAMP} so a
153
+ * tab-throttle / offscreen-park-resume gap cannot teleport the mark.
154
+ *
155
+ * x += v·dt ; v += (−2ζω·v − ω²·(x − target))·dt
156
+ *
157
+ * Reuses the keyframes.js `(response, dampingFraction)` param model
158
+ * (ω = 2π/response, ζ = dampingFraction) but NOT its rAF — the FORBID-useSpring
159
+ * contract (a second rAF would defeat the parked-substrate one-path freeze).
160
+ */
161
+ export declare function warpStep(field: ConstellationField, dt: number): void;
162
+ /**
163
+ * Point the warp at a node INDEX (the live target-source seam). The focal node
164
+ * re-points to `idx`; the spring chases `nodes[idx]`'s LIVE position FROM the
165
+ * focal mark's CURRENT position (`warp.{x,y}`) — a continuous spring-eased path,
166
+ * never a snap. The component seeds `warp.{x,y}` at field-center on first layout,
167
+ * so even the first warp springs from a real start point. `idx < 0` clears the
168
+ * warp (the focal mark is removed). Re-pointing does NOT zero the velocity, so a
169
+ * mid-flight re-target curves smoothly toward the new node.
170
+ */
171
+ export declare function setWarpTarget(field: ConstellationField, idx: number): void;
172
+ /**
173
+ * Warp the focal node to the nearest drifting node to a canvas-LOCAL px point
174
+ * (the `warpTo(point)` primitive). The DEGENERATE case — the click's UNCONSTRAINED
175
+ * nearest node is already the current focal (cursor on/closest to the focal mark)
176
+ * — NO-OPS (returns the current focal; a click on yourself does not re-warp). Any
177
+ * OTHER click re-points to the nearest node, with the focal EXCLUDED from the
178
+ * candidate set (you never re-warp to yourself; the next-nearest wins). Returns
179
+ * the chosen node index, or `-1` when no eligible node exists. The component's
180
+ * `warpTo(clientX, clientY)` sugar maps client→local px via `toLocal` first.
76
181
  */
77
- export declare function stepField(field: ConstellationField, k: number, speed: number, pointer: ConstellationPointer | null): void;
182
+ export declare function warpTo(field: ConstellationField, px: number, py: number): number;
78
183
  /** Pass 1 — hairline edges between any two nodes within `link` px (alpha falls off with distance). */
79
184
  export declare function drawEdges(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette): void;
80
185
  /** Pass 2 — ambient node dots. */
@@ -1,3 +1,3 @@
1
1
  export { default as Constellation } from "./Constellation.vue";
2
- export { seedField, stepField, readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, BASE_WIDTH, DEFAULT_PALETTE, } from "./constellationField";
3
- export type { ConstellationNode, ConstellationRipple, ConstellationPointer, ConstellationPalette, ConstellationField, ConstellationProps, } from "./constellationField";
2
+ export { seedField, stepField, readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, nearestNode, warpStep, warpTo, setWarpTarget, BASE_WIDTH, DEFAULT_PALETTE, } from "./constellationField";
3
+ export type { ConstellationNode, ConstellationRipple, ConstellationPointer, ConstellationPalette, ConstellationField, ConstellationWarp, ConstellationProps, } from "./constellationField";
@@ -80,10 +80,18 @@ type __VLS_Props = {
80
80
  * which all touched overflow divergently).
81
81
  * `"grow"` — content grows to fit then overflows visibly past
82
82
  * the cap (the default; nothing clips or scrolls).
83
- * `"wrap"` — expanded content wraps to multiple lines/rows (the
84
- * `.dock-overflow-wrap` recipe — a multi-row pill that narrows
85
- * to the viewport gutter on small screens and snaps
86
- * back to a single nowrap row past `--dock-overflow-bp`).
83
+ * `"wrap"` — expanded content wraps to multiple rows via CONTENT-DRIVEN
84
+ * intrinsic flex-wrap (the `.dock-overflow-wrap` recipe). The
85
+ * dock shrink-wraps to content and caps that intrinsic width
86
+ * at `max-inline-size: var(--dock-max-inline-size)`, so the row
87
+ * reflows to N rows EXACTLY when its intrinsic width exceeds
88
+ * the cap — at ANY viewport width — and collapses to one row
89
+ * when it fits (no viewport breakpoint). The wrapped multi-row silhouette lifts
90
+ * onto the card/floating shadow tier as the dock expands.
91
+ * HORIZONTAL-ONLY: a vertical rail grows-to-fit + clamps via
92
+ * `--dock-max-block-size` (its own overflow story), so the
93
+ * `.dock-overflow-wrap` class is not emitted for a vertical
94
+ * orientation.
87
95
  * `"scroll"` — the dock becomes the scroll port. Horizontal docks
88
96
  * scroll the active layer on the inline axis
89
97
  * (`.dock-scroll-x`); vertical rails scroll on the
@@ -0,0 +1,57 @@
1
+ import type { Ref } from "vue";
2
+ export interface DockMorphGroupRegistration {
3
+ /** The container element owning this group's grid-stacked panes. */
4
+ containerEl: Ref<HTMLElement | null>;
5
+ /** The group's currently-active pane id (its `v-model:active`). */
6
+ activeLayer: Ref<string>;
7
+ /** Layout axis of the group; matches the group's `orientation`. */
8
+ axis: Ref<"horizontal" | "vertical">;
9
+ }
10
+ export interface DockMorphGroupHandle {
11
+ /** The active pane id post-swap (the orchestrator mutates it). */
12
+ currentLayer: Readonly<Ref<string>>;
13
+ /** The pane id currently fading out, or null. */
14
+ leavingLayer: Readonly<Ref<string | null>>;
15
+ /** Detach this group from the orchestrator (on the group's unmount). */
16
+ release(): void;
17
+ }
18
+ /**
19
+ * The provided morph seam. A nested `<DockLayerGroup>` injects this and DEFERS
20
+ * its pane-swap morph to the dock's single orchestrator via `registerGroup`.
21
+ */
22
+ export interface DockMorphContext {
23
+ registerGroup(group: DockMorphGroupRegistration): DockMorphGroupHandle;
24
+ }
25
+ export declare const DOCK_MORPH_KEY: import("vue").InjectionKey<DockMorphContext>;
26
+ export declare function provideDockMorphContext(context: DockMorphContext): void;
27
+ /**
28
+ * Befitting-silent — returns `null` for a `<DockLayerGroup>` rendered outside a
29
+ * `<GlassDock>` (the standalone self-orchestrate path).
30
+ */
31
+ export declare const useOptionalDockMorphContext: () => DockMorphContext | null;
32
+ export interface UseDockMorphOrchestratorOptions {
33
+ /** The `.glass-dock` root that carries the shared scalar + clip aperture. */
34
+ rootEl: Ref<HTMLElement | null>;
35
+ /** The outer collapse↔expand container (`.dock-layers`). */
36
+ outerEl: Ref<HTMLElement | null>;
37
+ /** The outer active "layer" id — `(expandedState)` projected to a string. */
38
+ outerActiveLayer: Ref<string>;
39
+ /** The outer pair morphs the inline axis (a horizontal dock). */
40
+ outerAxis: Ref<"horizontal" | "vertical">;
41
+ }
42
+ export interface UseDockMorphOrchestratorReturn {
43
+ /** Provide-able context: a nested `<DockLayerGroup>` registers through it. */
44
+ context: DockMorphContext;
45
+ /** The outer pair's post-swap active layer id (call-site parity). */
46
+ outerCurrentLayer: Readonly<Ref<string>>;
47
+ /** Defensive settle on a stray `@transitionend` (call-site parity). */
48
+ onOuterTransitionEnd(e: TransitionEvent): void;
49
+ }
50
+ /**
51
+ * The ONE morph engine for a dock instance. Owns a single `SpringProgress`;
52
+ * drives the outer collapse↔expand box AND every nested `<DockLayerGroup>`'s
53
+ * pane-swap off the one `--dock-morph-t` scalar. Replaces the per-pair
54
+ * `useLayerTransition` instantiation (W01's single-scalar primitive) with a
55
+ * single multi-target driver, so a nested dock runs ONE engine, not two.
56
+ */
57
+ export declare function useDockMorphOrchestrator(options: UseDockMorphOrchestratorOptions): UseDockMorphOrchestratorReturn;
@@ -2,6 +2,9 @@ export { useDockState } from "./useDockState";
2
2
  export type { UseDockStateOptions, UseDockStateReturn, DockState } from "./useDockState";
3
3
  export { useLayerTransition } from "./useLayerTransition";
4
4
  export type { UseLayerTransitionOptions, UseLayerTransitionReturn } from "./useLayerTransition";
5
+ export { useDockHold } from "./useDockHold";
6
+ export type { UseDockHoldOptions, UseDockHoldReturn } from "./useDockHold";
5
7
  export { isTeleportedTarget } from "./isTeleportedTarget";
6
8
  export { provideDockContext, useDockContext, useOptionalDockContext, DOCK_CONTEXT_KEY, type DockContext, type DockOrientation, } from "./dockContext";
7
9
  export { provideDockLayerGroupContext, useDockLayerGroupContext, useOptionalDockLayerGroupContext, DOCK_LAYER_GROUP_KEY, type DockLayerDescriptor, type DockLayerGroupContext, } from "./dockLayerContext";
10
+ export { useDockMorphOrchestrator, provideDockMorphContext, useOptionalDockMorphContext, DOCK_MORPH_KEY, type DockMorphContext, type DockMorphGroupRegistration, type DockMorphGroupHandle, type UseDockMorphOrchestratorOptions, type UseDockMorphOrchestratorReturn, } from "./dockMorphContext";
@@ -0,0 +1,61 @@
1
+ import type { ComputedRef } from "vue";
2
+ /**
3
+ * AX.W03 — the host-native dock hold.
4
+ *
5
+ * `keepDockOpen` is a FIRST-CLASS, synchronous morph-state input to the dock's
6
+ * one state machine: while a continuous pointer/touch gesture is live on a
7
+ * descendant control, the dock holds open (idle-collapse suppressed) and the
8
+ * dock's `held` edge lights `data-held` on the dock root AND the control for the
9
+ * thumb-halo intensification.
10
+ *
11
+ * Why NATIVE host listeners (not a Vue `@pointerdown` template binding):
12
+ * reka-ui's `<SliderRoot>` is a FORWARDING component — it renders through a
13
+ * `CollectionSlot` + `resolveDynamicComponent` (SliderHorizontal/Vertical) +
14
+ * `forwardRef` chain and binds its OWN cached `onPointerdown`
15
+ * (`SliderRoot.js → SliderImpl.js`, which calls `setPointerCapture`). A consumer
16
+ * `@pointerdown` arrives as `$attrs.onPointerdown` and is DROPPED across that
17
+ * Slot/forwardRef boundary — vue-tsc + units pass, only a real drag catches it
18
+ * (the canonical binding-verification class, `feedback_glass_ui_binding_*`). A
19
+ * native `addEventListener` on the RESOLVED host element is immune: the event
20
+ * always reaches the DOM node the user actually presses. This is the
21
+ * device-proven fix (AX.W03 §Scope.1/2 — slice-2 F0/F2; ratified host-native
22
+ * over a reka `dragging`-ref subscription, which reka does not publicly expose
23
+ * and which would re-introduce the same forwarding fragility).
24
+ *
25
+ * The hold is INSTANT-ON (Apple "Building Fluid Interfaces", facet 5): the first
26
+ * line `keepOpen()` is capture-independent and synchronous, so the halo +
27
+ * substrate tier-shade light the instant the pointer goes down (under the ~100ms
28
+ * perception threshold — reads as instant); the spring governs only the settle.
29
+ *
30
+ * The release window is window-scoped `pointerup`/`pointercancel`: reka
31
+ * `setPointerCapture`-retargets the move/up to the captured element, which
32
+ * bubbles to `window`, so a release anywhere ends the hold. The touch parity
33
+ * folds onto the SAME single acquire — one owner, one acquire path (no second
34
+ * hold path, no parallel `touchGate` watch).
35
+ *
36
+ * DI: consumes the EXISTING typed `DockContext` via `useOptionalDockContext()`
37
+ * (the `keepOpen`/`release` pair, O.W2 single-typed-key collapse). A control
38
+ * rendered OUTSIDE a `<GlassDock>` gets the befitting-silent default (no dock) —
39
+ * every hook is a no-op, a primitive may legitimately render outside a dock.
40
+ */
41
+ export interface UseDockHoldOptions {
42
+ /**
43
+ * Whether the hold is armed. A reactive getter so a consumer prop
44
+ * (`keepDockOpen`) can disarm it without re-instantiating the composable.
45
+ * Defaults to always-armed.
46
+ */
47
+ enabled?: () => boolean;
48
+ }
49
+ export interface UseDockHoldReturn {
50
+ /** `true` whenever the dock observes ≥1 held token (the `data-held` edge). */
51
+ isHeld: ComputedRef<boolean> | undefined;
52
+ }
53
+ /**
54
+ * @param resolveHost A getter that resolves the REAL host element to attach the
55
+ * native listeners to. Called inside `onMounted` (template refs are populated
56
+ * before `onMounted` fires), so a reka forwardRef host (`SliderRoot.$el`) is
57
+ * live by then. A getter — not a `Ref` — sidesteps the cross-composable
58
+ * `onMounted`-ordering trap (a sibling `onMounted` that populates a ref runs
59
+ * AFTER this one).
60
+ */
61
+ export declare function useDockHold(resolveHost: () => HTMLElement | null, options?: UseDockHoldOptions): UseDockHoldReturn;
@@ -2,78 +2,32 @@ import type { Ref } from "vue";
2
2
  export interface UseLayerTransitionOptions {
3
3
  /** The container element that owns the stacked layer panes. */
4
4
  containerEl: Ref<HTMLElement | null>;
5
- /** The currently active layer id */
5
+ /** The currently active layer id. */
6
6
  activeLayer: Ref<string>;
7
7
  /**
8
- * Animation axis. `"horizontal"` animates `width`; `"vertical"` animates
9
- * `height`. Defaults to horizontal when omitted.
8
+ * Animation axis. `"horizontal"` morphs the inline axis; `"vertical"` morphs
9
+ * the block axis. Defaults to horizontal when omitted.
10
10
  */
11
11
  axis?: Ref<"horizontal" | "vertical">;
12
12
  /**
13
- * AW.W3 — typed directional View-Transitions. Maps a swap `(from, to)` to
14
- * the `types` array passed to `startViewTransition`, so
15
- * `:active-view-transition-type(<t>)` CSS can author DIRECTION-specific
16
- * curves (snappier exit, softer entry-overshoot — the iOS-feel asymmetry).
17
- * The outer collapsed↔expanded pair resolves `dock-expand` / `dock-collapse`;
18
- * the inner DockLayerGroup pane swap resolves `layer-forward` / `layer-back`.
19
- * Omit to run the single symmetric curve. Feature-detected — degrades to the
20
- * symmetric curve on an engine without the `types` overload (Firefox 144).
13
+ * Retained for API parity with the prior VT-typed signature (consumed by
14
+ * `GlassDock` + `DockLayerGroup`). The single-scalar morph runs ONE symmetric
15
+ * spring on every engine, so the direction hint is no longer a curve fork — it
16
+ * is accepted and ignored. Kept so the call sites need no edit.
21
17
  */
22
18
  directionTypes?: (from: string, to: string) => string[];
23
19
  }
24
20
  export interface UseLayerTransitionReturn {
25
- /** Attach to @transitionend on the container */
21
+ /** Attach to `@transitionend` on the container (kept for call-site parity). */
26
22
  onTransitionEnd(e: TransitionEvent): void;
27
- /** The currently active layer id (post-swap) */
23
+ /** The currently active layer id (post-swap). */
28
24
  currentLayer: Ref<string>;
29
- /** The layer id currently fading out, or null */
25
+ /** The layer id currently fading out, or null. */
30
26
  leavingLayer: Ref<string | null>;
31
27
  }
32
28
  /**
33
- * Coordinates the crossfade + size animation between grid-stacked dock layer
34
- * panes. Reusable at any nesting level (the inner `<DockLayerGroup>` pair AND
35
- * the outer GlassDock collapsed↔expanded pair).
36
- *
37
- * AQ.W6 §Design 7 — the swap FORKS on View-Transitions support:
38
- *
39
- * - **Native path** (`document.startViewTransition` present): the layer swap is
40
- * wrapped in `startViewTransition(() => mutate())`. The browser snapshots the
41
- * container + panes (tagged `view-transition-name` in `dock.css`) and morphs
42
- * the size + crossfades the pane content with ZERO `getBoundingClientRect`
43
- * reads. No pin/measure/re-pin dance, no inline size, no rAF.
44
- *
45
- * - **Fallback path** (no `startViewTransition`): the axis-aware FLIP, KEPT as
46
- * the sole feature-detected fallback (no alias — one path or the other runs per
47
- * swap, never both). It is now the ONLY driver that writes inline size on a
48
- * non-VT engine (AV.W9.0 retired the `interpolate-size`/`calc-size` CSS arm that
49
- * used to second-drive width on Chrome 129+ and freeze the dock):
50
- * 1. Capture current container size (or the live spring's pixel value on a
51
- * retarget)
52
- * 2. Pin container to that size
53
- * 3. nextTick → rAF: swap classes (old → leaving, new → active) AND measure new
54
- * natural size in ONE frame origin
55
- * 4. Drive size off ONE `SpringProgress` clock in PIXEL space (its `value` IS
56
- * the live width/height)
57
- * 5. On settle, clear inline size + restore the CSS transition
58
- *
59
- * AV.W9.2 — velocity-continuity: an interrupted swap (a re-toggle while the
60
- * spring is still live) RE-SEATS the existing solver's target from its current
61
- * `(value, velocity)` instead of dispose+reconstruct-from-rest, so the morph is
62
- * continuous through a retarget (the iOS interruptible-spring contract).
63
- *
64
- * AV.W7 perf folds:
65
- * - F3 — on-demand `will-change`: the morphing box gets `will-change:<dim>`
66
- * ONLY for the gesture's duration (set just before the spring drives it,
67
- * cleared to `auto` on settle/`transitionend`). NEVER a standing hint — a
68
- * permanent `will-change` holds a compositor layer + VRAM for an idle dock.
69
- * - F5 — inheritance-bomb guard (CONVENTION): this driver animates ONLY the
70
- * element's own `width`/`height` (the spring's pixel-space `value`) and the
71
- * pane opacity rides a class-driven CSS transition on the SEPARATE
72
- * `.dock-layer-item-host`. NO INHERITED custom property (`--phase-color` /
73
- * `--shadow-color`) is TWEENED per frame here — animating an inherited
74
- * custom property forces a whole-subtree style recalc every frame (the
75
- * inheritance bomb). Phase/shadow colors are SET on a discrete state change,
76
- * never interpolated frame-by-frame. Keep new motion on `transform`/`opacity`
77
- * /`width`/`height`; route any color shift through a discrete class swap.
29
+ * Coordinates the size morph + crossfade between grid-stacked dock layer panes.
30
+ * Reusable at any nesting level (the inner `<DockLayerGroup>` pair AND the outer
31
+ * `GlassDock` collapsed↔expanded pair).
78
32
  */
79
33
  export declare function useLayerTransition(options: UseLayerTransitionOptions): UseLayerTransitionReturn;
@@ -7,4 +7,6 @@ export { default as DockTabButton } from "./DockTabButton.vue";
7
7
  export { default as DockSelectTrigger } from "./DockSelectTrigger.vue";
8
8
  export { default as DockDropdownTrigger } from "./DockDropdownTrigger.vue";
9
9
  export type { UseDockStateOptions, UseDockStateReturn, DockState } from "./composables";
10
+ export { useLayerTransition } from "./composables";
11
+ export type { UseLayerTransitionOptions, UseLayerTransitionReturn, } from "./composables";
10
12
  export { DOCK_CONTEXT_KEY, useDockContext, useOptionalDockContext, provideDockContext, type DockContext, type DockOrientation, } from "./composables/dockContext";
@@ -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[];
@@ -32,17 +32,32 @@ type __VLS_Props = {
32
32
  config?: BlobConfig;
33
33
  /** Extra seed string mixed into the satellite PRNG for a unique-but-reproducible system. */
34
34
  seed?: string;
35
+ /**
36
+ * AX.W16 — the declarative WCAG-2.2.2 pause seam. `v-model:paused` parks the
37
+ * render loop (the substrate's `manual` suspend) when `true` and restarts it when
38
+ * `false`. This is the EXACT shape `<DockBackgroundToggle>` wears — wire its
39
+ * `@update:paused` to this `v-model` and the blob's animation stops/starts for ALL
40
+ * users. The imperative `pause()`/`resume()` defineExpose handles bind the SAME
41
+ * renderer seam (no parallel pause path); the prop owns the default.
42
+ */
43
+ paused?: boolean;
35
44
  };
36
45
  declare function nudge(): void;
37
46
  declare function setMood(m: BlobMood): void;
47
+ declare function pulse(): void;
38
48
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
39
49
  nudge: typeof nudge;
40
50
  setMood: typeof setMood;
51
+ pulse: typeof pulse;
41
52
  currentMood: Readonly<import("vue").Ref<BlobMood, BlobMood>>;
53
+ pause: () => void;
54
+ resume: () => void;
42
55
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
43
56
  click: () => any;
57
+ "update:paused": (value: boolean) => any;
44
58
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
45
59
  onClick?: (() => any) | undefined;
60
+ "onUpdate:paused"?: ((value: boolean) => any) | undefined;
46
61
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
47
62
  declare const _default: typeof __VLS_export;
48
63
  export default _default;
@@ -1,14 +1,30 @@
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;
25
+ /** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
26
+ isSettled: () => boolean;
27
+ /** AX.W16 — wall-ms to the next auto-mood retarget (the wake horizon). */
28
+ nextAutoMoodMs: () => number;
13
29
  };
14
30
  export type BlobMoodSystem = ReturnType<typeof useBlobMood>;