@mkbabb/glass-ui 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +1 -6
  2. package/dist/CardAction-DuArVky-.js +157 -0
  3. package/dist/{CommandShortcut-CY0aQTz5.js → CommandShortcut-CefCj5mt.js} +7 -7
  4. package/dist/{ContextMenuSubContent-BeDz7G6f.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
  5. package/dist/{DataTable-gtPOLZvl.js → DataTable-CUHMukiQ.js} +4 -4
  6. package/dist/DeckProgress-Dmk4_AKN.js +23 -0
  7. package/dist/{DialogContent-DG1YMR-P.js → DialogContent-BRkT1cjP.js} +3 -3
  8. package/dist/{DialogFooter-BCIaDP15.js → DialogFooter-Gprw8H_A.js} +1 -1
  9. package/dist/{HoverPopover-DXpOEw1P.js → HoverPopover-2LOIW34a.js} +1 -1
  10. package/dist/{IconTooltip-Cu86JR4e.js → IconTooltip-yefK7cJc.js} +1 -1
  11. package/dist/{MetricBadge-D-bRaQUD.js → MetricBadge-lTc002u2.js} +1 -1
  12. package/dist/{Notification-B5WHP3_1.js → Notification-BxK8LZMw.js} +1 -1
  13. package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  14. package/dist/{PopoverContent-F1bWnYoh.js → PopoverContent-BId6ggf_.js} +1 -1
  15. package/dist/{Progress-c4vo4ALi.js → Progress-iEuD9pxG.js} +4 -4
  16. package/dist/{ScrollingText-BEp377U5.js → ScrollingText-BPP84wKo.js} +2 -2
  17. package/dist/{SelectScrollDownButton-DAo5NmY_.js → SelectScrollDownButton-T32cVFeM.js} +4 -4
  18. package/dist/{SelectSeparator-COFMJGng.js → SelectSeparator-C4Ql0gzV.js} +1 -1
  19. package/dist/{TabsList-COqIdW7i.js → TabsList-B8CVOQPC.js} +2 -2
  20. package/dist/{Toaster-BMaeziJJ.js → Toaster-1rYWrmAm.js} +1 -1
  21. package/dist/{ToggleGroupItem-C-AIkBUw.js → ToggleGroupItem-Cev4pOVK.js} +5 -5
  22. package/dist/animated-digit.js +1 -1
  23. package/dist/api/index.d.ts +5 -3
  24. package/dist/aurora.js +339 -408
  25. package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
  26. package/dist/badge.js +1 -1
  27. package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
  28. package/dist/button.js +1 -1
  29. package/dist/canvas.d.ts +1 -0
  30. package/dist/canvas.js +3 -0
  31. package/dist/card.js +1 -1
  32. package/dist/carousel.js +106 -105
  33. package/dist/collapsible.js +1 -1
  34. package/dist/{color-DjJCAQ6f.js → color-8jBjWiJ6.js} +22 -14
  35. package/dist/color.js +2 -2
  36. package/dist/command.js +1 -1
  37. package/dist/compile-DAjIoEy2.js +158 -0
  38. package/dist/components/custom/aurora/composables/atoms.d.ts +90 -25
  39. package/dist/components/custom/aurora/composables/color.d.ts +0 -12
  40. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +34 -23
  41. package/dist/components/custom/aurora/constants/presets.d.ts +10 -7
  42. package/dist/components/custom/aurora/constants/renderMode.d.ts +22 -0
  43. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
  44. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  45. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  46. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
  47. package/dist/components/custom/aurora/index.d.ts +3 -3
  48. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
  49. package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
  50. package/dist/components/custom/constellation/constellationField.d.ts +110 -5
  51. package/dist/components/custom/constellation/index.d.ts +2 -2
  52. package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
  53. package/dist/components/custom/dock/GlassDock.vue.d.ts +57 -67
  54. package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
  55. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
  56. package/dist/components/custom/dock/composables/index.d.ts +3 -0
  57. package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
  58. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
  59. package/dist/components/custom/dock/index.d.ts +4 -1
  60. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +13 -0
  61. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +23 -5
  62. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +2 -0
  63. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
  64. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +20 -5
  65. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  66. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  67. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  68. package/dist/components/custom/goo-blob/types.d.ts +8 -0
  69. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
  70. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
  71. package/dist/components/custom/tabs/index.d.ts +2 -5
  72. package/dist/components/ui/button/index.d.ts +1 -1
  73. package/dist/components/ui/card/Card.vue.d.ts +28 -10
  74. package/dist/components/ui/card/index.d.ts +1 -1
  75. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  76. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  77. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
  78. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
  79. package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
  80. package/dist/components/ui/slider/index.d.ts +14 -7
  81. package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
  82. package/dist/composables/color/index.d.ts +19 -0
  83. package/dist/composables/context/createContext.d.ts +1 -1
  84. package/dist/composables/dom/index.d.ts +1 -1
  85. package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
  86. package/dist/composables/glass/canvas2d/index.d.ts +2 -1
  87. package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
  88. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
  89. package/dist/composables/glass/index.d.ts +3 -1
  90. package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
  91. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +1 -1
  92. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +4 -0
  93. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +1 -1
  94. package/dist/composables/motion/core/index.d.ts +1 -0
  95. package/dist/configurator.js +1 -1
  96. package/dist/confirm-dialog.js +2 -2
  97. package/dist/constellation.js +143 -74
  98. package/dist/context-menu.js +2 -2
  99. package/dist/controls.js +1 -1
  100. package/dist/data-table.js +1 -1
  101. package/dist/deck-progress.d.ts +1 -0
  102. package/dist/deck-progress.js +2 -0
  103. package/dist/dialog.js +2 -2
  104. package/dist/dock.js +468 -354
  105. package/dist/{dockContext-DLgrVWsU.js → dockContext-BKeIMmNk.js} +1 -1
  106. package/dist/dom.js +6 -6
  107. package/dist/{dropdown-menu-BWpwutt0.js → dropdown-menu-D77jX6Df.js} +4 -4
  108. package/dist/dropdown-menu.js +1 -1
  109. package/dist/fonts/README.md +26 -18
  110. package/dist/forms.js +5 -5
  111. package/dist/fourier-field.js +35 -35
  112. package/dist/glass-panel.js +7 -7
  113. package/dist/glass-ui.css +1 -1
  114. package/dist/glass-ui.js +154 -169
  115. package/dist/goo-blob.js +361 -274
  116. package/dist/header-ribbon.js +1 -1
  117. package/dist/hover-card.js +1 -1
  118. package/dist/hover-popover.js +1 -1
  119. package/dist/icon-tooltip.js +1 -1
  120. package/dist/index.d.ts +1 -2
  121. package/dist/instrument-chassis.js +1 -1
  122. package/dist/instrument-rail.js +1 -1
  123. package/dist/label.js +1 -1
  124. package/dist/labeled-field.js +5 -5
  125. package/dist/{menuItemVariants-B4eFR5Ix.js → menuItemVariants-CCoBNkU5.js} +1 -1
  126. package/dist/metric-badge.js +1 -1
  127. package/dist/metric-stack.js +1 -1
  128. package/dist/motion-core.js +65 -65
  129. package/dist/motion.js +1 -1
  130. package/dist/notification.js +1 -1
  131. package/dist/number-field.js +1 -1
  132. package/dist/paper-backdrop.js +1 -1
  133. package/dist/popover.js +1 -1
  134. package/dist/progress.js +1 -1
  135. package/dist/pulse.js +2 -2
  136. package/dist/reactive.js +2 -2
  137. package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
  138. package/dist/scrolling-text.js +1 -1
  139. package/dist/search.js +9 -9
  140. package/dist/select.js +3 -3
  141. package/dist/separator.js +1 -1
  142. package/dist/{sheet-Cv1uO-Gq.js → sheet-VZEtNFvO.js} +2 -2
  143. package/dist/sheet.js +1 -1
  144. package/dist/slider-DC2mwuoe.js +142 -0
  145. package/dist/slider.js +1 -1
  146. package/dist/sortable-list.js +2 -2
  147. package/dist/status-dot.js +17 -16
  148. package/dist/styles/animations.css +6 -2
  149. package/dist/styles/components.css +1 -1
  150. package/dist/styles/dock/density.css +230 -0
  151. package/dist/styles/dock/layer-group.css +263 -0
  152. package/dist/styles/dock/layers.css +355 -0
  153. package/dist/styles/dock/morph.css +244 -0
  154. package/dist/styles/dock/overflow.css +201 -0
  155. package/dist/styles/dock/shell.css +457 -0
  156. package/dist/styles/dock-controls.css +187 -50
  157. package/dist/styles/dock.css +65 -1181
  158. package/dist/styles/fonts.css +0 -25
  159. package/dist/styles/glass.css +482 -102
  160. package/dist/styles/index.css +12 -11
  161. package/dist/styles/theme.css +60 -2
  162. package/dist/styles/tokens.css +625 -72
  163. package/dist/styles/typography.css +52 -69
  164. package/dist/styles/utilities.css +91 -40
  165. package/dist/styles/view-transition.css +12 -40
  166. package/dist/switch.js +1 -1
  167. package/dist/tabs.js +183 -152
  168. package/dist/timeline.js +3 -3
  169. package/dist/toast.js +1 -1
  170. package/dist/toggle-group.js +1 -1
  171. package/dist/tooltip.js +1 -1
  172. package/dist/typewriter.js +1 -1
  173. package/dist/{useCanvas2D-C31yfUGY.js → useCanvas2D-ClrQuZtp.js} +2 -1
  174. package/dist/{useConfiguratorState-B24TcgIn.js → useConfiguratorState-DxAqksK6.js} +24 -13
  175. package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
  176. package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
  177. package/dist/{useTextHighlight-aMPdEpkq.js → useTextHighlight-DON84L8w.js} +1 -1
  178. package/dist/{useTouchGate-YQRwyUGU.js → useTouchGate-WFyJYsth.js} +1 -1
  179. package/dist/vReveal-CqaCz_mC.js +44 -0
  180. package/dist/watercolor-dot.js +1 -1
  181. package/package.json +67 -36
  182. package/src/fonts/README.md +26 -18
  183. package/src/styles/animations.css +6 -2
  184. package/src/styles/dock/density.css +230 -0
  185. package/src/styles/dock/layer-group.css +263 -0
  186. package/src/styles/dock/layers.css +355 -0
  187. package/src/styles/dock/morph.css +244 -0
  188. package/src/styles/dock/overflow.css +201 -0
  189. package/src/styles/dock/shell.css +457 -0
  190. package/src/styles/dock-controls.css +187 -50
  191. package/src/styles/dock.css +65 -1181
  192. package/src/styles/fonts.css +0 -25
  193. package/src/styles/glass.css +482 -102
  194. package/src/styles/index.css +12 -11
  195. package/src/styles/theme.css +60 -2
  196. package/src/styles/tokens.css +625 -72
  197. package/src/styles/typography.css +52 -69
  198. package/src/styles/utilities.css +91 -40
  199. package/src/styles/view-transition.css +12 -40
  200. package/dist/CardAction-D8nSE62a.js +0 -163
  201. package/dist/DiscoGlyph-ZoBYpoxI.js +0 -132
  202. package/dist/GlyphFace-Ce_oe3tM.js +0 -51
  203. package/dist/UnderlineTabs-D_c1iYo-.js +0 -39
  204. package/dist/compile-iM4IUB66.js +0 -158
  205. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
  206. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
  207. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
  208. package/dist/components/custom/disco-glyph/index.d.ts +0 -1
  209. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
  210. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
  211. package/dist/components/custom/glass-carousel/index.d.ts +0 -4
  212. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
  213. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
  214. package/dist/components/custom/glyph-face/index.d.ts +0 -2
  215. package/dist/components/custom/glyph-face/keys.d.ts +0 -9
  216. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
  217. package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
  218. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
  219. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
  220. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
  221. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
  222. package/dist/disco-glyph.d.ts +0 -1
  223. package/dist/disco-glyph.js +0 -2
  224. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  225. package/dist/glass-carousel.d.ts +0 -1
  226. package/dist/glass-carousel.js +0 -214
  227. package/dist/glyph-face.d.ts +0 -1
  228. package/dist/glyph-face.js +0 -3
  229. package/dist/keys-Dyf_uTs5.js +0 -9
  230. package/dist/responsive-tabs.d.ts +0 -1
  231. package/dist/responsive-tabs.js +0 -95
  232. package/dist/slider-BA9wIs5e.js +0 -130
  233. package/dist/styles/disco-glyph.css +0 -26
  234. package/dist/styles/glyph-face.css +0 -92
  235. package/dist/useViewTransition-DaN5Zrox.js +0 -21
  236. package/dist/vReveal-BE2TsPoR.js +0 -24
  237. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  238. package/src/styles/disco-glyph.css +0 -26
  239. package/src/styles/glyph-face.css +0 -92
  240. /package/dist/{CollapsibleContent-D7UNsXQr.js → CollapsibleContent-CP9qF1v4.js} +0 -0
  241. /package/dist/{ContextMenuContent-DGKZX1Du.js → ContextMenuContent-DDa0v27s.js} +0 -0
  242. /package/dist/{HoverCardContent-Bn0UBMY9.js → HoverCardContent-B6CcQ8He.js} +0 -0
  243. /package/dist/{InstrumentChassis-BLJBl1BW.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
  244. /package/dist/{InstrumentRail-BElFwKyt.js → InstrumentRail-CUJ05YVG.js} +0 -0
  245. /package/dist/{Label-DBc7bKzZ.js → Label-zRfbQdCn.js} +0 -0
  246. /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-B1GkAjNb.js} +0 -0
  247. /package/dist/{PaperBackdrop-DCGoGatv.js → PaperBackdrop-CqwjnfLv.js} +0 -0
  248. /package/dist/{SelectGroup-BcaFjvP4.js → SelectGroup-BFiod7X2.js} +0 -0
  249. /package/dist/{Separator-DZyqsCum.js → Separator-D7sD7RKj.js} +0 -0
  250. /package/dist/{Switch-2rsAtDfA.js → Switch-LDKLmmgx.js} +0 -0
  251. /package/dist/{TooltipProvider-CD2IXfRv.js → TooltipProvider-CmZzCuaG.js} +0 -0
  252. /package/dist/{_plugin-vue_export-helper-gLzyemvl.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
  253. /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
  254. /package/dist/{createContext-CvNyBk4o.js → createContext-B44Sah_H.js} +0 -0
  255. /package/dist/{useGlassRenderer-HebgSEgN.js → useGlassRenderer-5I0YkI4t.js} +0 -0
  256. /package/dist/{useInterval-D3USn0yc.js → useInterval-Dsmqwi03.js} +0 -0
  257. /package/dist/{useResizeObserver-CSyxGxIX.js → useResizeObserver-CWCbk5Px.js} +0 -0
  258. /package/dist/{useSpringMount-LRZqJTaF.js → useSpringMount-BJSHcLl3.js} +0 -0
  259. /package/dist/{useTimer-DEJonOZa.js → useTimer-3xqf_54b.js} +0 -0
  260. /package/dist/{useUserInvalidAria-CQKjEfwP.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
  261. /package/dist/{useViewportReady-K96m-Mdv.js → useViewportReady-RIr5Wgkh.js} +0 -0
@@ -1,33 +1,8 @@
1
1
  type DockDensity = "compact" | "comfortable" | "spacious" | "audacious";
2
- type __VLS_Props = {
3
- collapseDelay?: number;
4
- startCollapsed?: boolean;
2
+ interface DockCommonProps {
5
3
  fitContent?: boolean;
6
4
  position?: "fixed" | "inline" | "sticky";
7
5
  alwaysExpanded?: boolean;
8
- /**
9
- * Visual/behavioral preset.
10
- * `dock` — the horizontal floating dock (default).
11
- * `rail` — the vertical icon rail variant used by
12
- * app chrome (stadium-pill silhouette,
13
- * `--glass-bg-wash` plate).
14
- * `instrument-strip` — vertical chassis-strip mode for consumer
15
- * cockpits composing an instrument-cluster
16
- * gauge column (the speedtest
17
- * SurveyResultDock consumer). Drops the
18
- * rail variant's `--radius-pill` extreme
19
- * and adopts the `<InstrumentChassis>`
20
- * family's surface vocabulary
21
- * (`--radius-card` border-radius,
22
- * `--glass-bg-chassis` background,
23
- * `--glass-border-quiet` border,
24
- * `--glass-shadow-quiet` shadow, plus an
25
- * engraved-bezel `::before` inner stroke
26
- * matching `InstrumentChassis::before`).
27
- * No new tokens — lifts the existing
28
- * chassis vocabulary. AJ-W1-δ / G-AJ-D7.
29
- */
30
- variant?: "dock" | "rail" | "instrument-strip";
31
6
  /**
32
7
  * Corner treatment.
33
8
  * `"pill"` — the stadium silhouette (default).
@@ -36,9 +11,12 @@ type __VLS_Props = {
36
11
  * radius (`--dock-card-radius`, default `--radius-3xl`)
37
12
  * ABOVE 2xl, below pill — does NOT collapse to a stadium.
38
13
  * 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).
14
+ * morphs on the `--dock-motion-resize` spring. AX.W56's
15
+ * squircle policy applies `corner-shape:
16
+ * var(--corner-shape-bigdock)` here under `@supports
17
+ * (corner-shape: superellipse(2))` — the big-dock is the ONE
18
+ * surface where the superellipse reads (cards/pills stay
19
+ * round); the border-radius arc is the cross-engine contract.
42
20
  *
43
21
  * `"pill"`/`"rounded"` previously bound ONLY under the vertical rail
44
22
  * variant — on a horizontal dock the prop silently no-op'd. AW.W3b adds
@@ -46,24 +24,11 @@ type __VLS_Props = {
46
24
  * so `shape` now paints on a horizontal dock too.
47
25
  */
48
26
  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";
63
27
  /**
64
28
  * Layout axis of the dock. `"horizontal"` (default) lays items out
65
29
  * left-to-right and animates `width`; `"vertical"` lays items out
66
- * top-to-bottom and animates `height`.
30
+ * top-to-bottom and animates `height`. IGNORED under `variant="rail"` /
31
+ * `"instrument-strip"` (those force vertical by construction).
67
32
  */
68
33
  orientation?: "horizontal" | "vertical";
69
34
  /**
@@ -80,10 +45,18 @@ type __VLS_Props = {
80
45
  * which all touched overflow divergently).
81
46
  * `"grow"` — content grows to fit then overflows visibly past
82
47
  * 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`).
48
+ * `"wrap"` — expanded content wraps to multiple rows via CONTENT-DRIVEN
49
+ * intrinsic flex-wrap (the `.dock-overflow-wrap` recipe). The
50
+ * dock shrink-wraps to content and caps that intrinsic width
51
+ * at `max-inline-size: var(--dock-max-inline-size)`, so the row
52
+ * reflows to N rows EXACTLY when its intrinsic width exceeds
53
+ * the cap — at ANY viewport width — and collapses to one row
54
+ * when it fits (no viewport breakpoint). The wrapped multi-row silhouette lifts
55
+ * onto the card/floating shadow tier as the dock expands.
56
+ * HORIZONTAL-ONLY: a vertical rail grows-to-fit + clamps via
57
+ * `--dock-max-block-size` (its own overflow story), so the
58
+ * `.dock-overflow-wrap` class is not emitted for a vertical
59
+ * orientation.
87
60
  * `"scroll"` — the dock becomes the scroll port. Horizontal docks
88
61
  * scroll the active layer on the inline axis
89
62
  * (`.dock-scroll-x`); vertical rails scroll on the
@@ -107,16 +80,45 @@ type __VLS_Props = {
107
80
  * size the dock relies on.
108
81
  */
109
82
  containerName?: string;
110
- };
111
- declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {};
83
+ }
84
+ interface DockVariantProps extends DockCommonProps {
85
+ variant?: "dock";
86
+ /** Idle-collapse delay in ms (default 2000). DOCK-ONLY — a rail never collapses. */
87
+ collapseDelay?: number;
88
+ /** Start in the collapsed state (default true). DOCK-ONLY — a rail is always expanded. */
89
+ startCollapsed?: boolean;
90
+ /**
91
+ * In-cap arrangement. `"linear"` (default) lays the active layer out as a
92
+ * linear row/column. `"grid"` makes the active layer a self-wrapping tile
93
+ * grid (Launchpad/Stage-Manager track symmetry — `auto-fill` columns of
94
+ * `--dock-tile-min`). ORTHOGONAL to `overflow` (the OVER-cap strategy):
95
+ * `layout` is the IN-cap arrangement.
96
+ *
97
+ * Hard contract: a `layout="grid"` dock is `alwaysExpanded` (a 2D panel
98
+ * does not read as a collapsible pill, and no width morph means no
99
+ * per-frame grid reflow). The canonical pairing is
100
+ * `shape="card" layout="grid"` (the props stay independent — no
101
+ * auto-implication of `shape`). DOCK-ONLY — the grid is a horizontal big-dock
102
+ * arrangement, never a rail's.
103
+ */
104
+ layout?: "linear" | "grid";
105
+ }
106
+ interface DockRailProps extends DockCommonProps {
107
+ variant: "rail" | "instrument-strip";
108
+ }
109
+ declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_14: {};
112
110
  type __VLS_Slots = {} & {
113
- default?: (props: typeof __VLS_1) => any;
111
+ persistent?: (props: typeof __VLS_1) => any;
112
+ } & {
113
+ default?: (props: typeof __VLS_3) => any;
114
+ } & {
115
+ collapsed?: (props: typeof __VLS_5) => any;
114
116
  } & {
115
- collapsed?: (props: typeof __VLS_3) => any;
117
+ default?: (props: typeof __VLS_7) => any;
116
118
  } & {
117
- default?: (props: typeof __VLS_5) => any;
119
+ collapsed?: (props: typeof __VLS_14) => any;
118
120
  };
119
- declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
121
+ declare const __VLS_base: import("vue").DefineComponent<DockVariantProps | DockRailProps, {
120
122
  expanded: import("vue").Ref<boolean, boolean>;
121
123
  isPinned: import("vue").Ref<boolean, boolean>;
122
124
  isHeld: import("vue").ComputedRef<boolean>;
@@ -125,19 +127,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
125
127
  collapse: () => void;
126
128
  keepOpen: () => void;
127
129
  release: () => void;
128
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
129
- position: "fixed" | "inline" | "sticky";
130
- overflow: "grow" | "wrap" | "scroll";
131
- orientation: "horizontal" | "vertical";
132
- variant: "dock" | "rail" | "instrument-strip";
133
- density: DockDensity;
134
- shape: "pill" | "rounded" | "card";
135
- layout: "linear" | "grid";
136
- collapseDelay: number;
137
- alwaysExpanded: boolean;
138
- startCollapsed: boolean;
139
- fitContent: boolean;
140
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
130
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DockVariantProps | DockRailProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
141
131
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
142
132
  declare const _default: typeof __VLS_export;
143
133
  export default _default;
@@ -1,5 +1,6 @@
1
1
  import type { ComputedRef } from "vue";
2
2
  export type DockOrientation = "horizontal" | "vertical";
3
+ export type DockLayout = "linear" | "grid";
3
4
  /**
4
5
  * Dock context surfaces the dock id + orientation + held-state coordination
5
6
  * to descendants.
@@ -25,6 +26,12 @@ export type DockOrientation = "horizontal" | "vertical";
25
26
  export interface DockContext {
26
27
  id: string;
27
28
  orientation: ComputedRef<DockOrientation>;
29
+ /**
30
+ * In-cap arrangement (`linear` row/column vs `grid` tile panel). AX.W45 —
31
+ * `<DockSeparator>` reads this to paint a full-row section break in a grid dock
32
+ * (a 1px perpendicular hairline is useless in a 2D tile grid).
33
+ */
34
+ layout: ComputedRef<DockLayout>;
28
35
  /** Acquire a keep-open token; suppresses timer-based collapse. */
29
36
  keepOpen: () => void;
30
37
  /** Release a previously-acquired keep-open token. */
@@ -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;
@@ -6,5 +6,8 @@ export { default as DockBackgroundToggle } from "./DockBackgroundToggle.vue";
6
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
+ export { default as DockSeparator } from "./DockSeparator.vue";
9
10
  export type { UseDockStateOptions, UseDockStateReturn, DockState } from "./composables";
10
- export { DOCK_CONTEXT_KEY, useDockContext, useOptionalDockContext, provideDockContext, type DockContext, type DockOrientation, } from "./composables/dockContext";
11
+ export { useLayerTransition } from "./composables";
12
+ export type { UseLayerTransitionOptions, UseLayerTransitionReturn, } from "./composables";
13
+ export { DOCK_CONTEXT_KEY, useDockContext, useOptionalDockContext, provideDockContext, type DockContext, type DockOrientation, type DockLayout, } from "./composables/dockContext";
@@ -32,6 +32,15 @@ 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;
@@ -41,10 +50,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
41
50
  setMood: typeof setMood;
42
51
  pulse: typeof pulse;
43
52
  currentMood: Readonly<import("vue").Ref<BlobMood, BlobMood>>;
53
+ pause: () => void;
54
+ resume: () => void;
44
55
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
45
56
  click: () => any;
57
+ "update:paused": (value: boolean) => any;
46
58
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
47
59
  onClick?: (() => any) | undefined;
60
+ "onUpdate:paused"?: ((value: boolean) => any) | undefined;
48
61
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
49
62
  declare const _default: typeof __VLS_export;
50
63
  export default _default;
@@ -9,18 +9,36 @@ export interface MoodInteraction {
9
9
  /** ms since the last pointer activity (drives `sleepy` past IDLE_SLEEP_MS). */
10
10
  idleMs: number;
11
11
  }
12
+ /**
13
+ * Who is driving a `setMood` retarget (AX.W46 D7). `"auto"` — the autonomic arc
14
+ * (`update` from the pointer/idle state); `"manual"` — the public expose (an imperative
15
+ * `setMood` from a consumer / the demo mood pills). A manual retarget arms the
16
+ * `manualOverride` latch the auto-arc respects.
17
+ */
18
+ export type MoodSource = "auto" | "manual";
19
+ /** The options bag for `setMood` — the source discriminant (default `"manual"`). */
20
+ export interface SetMoodOptions {
21
+ /** Who is driving the retarget. Defaults to `"manual"` (the public-expose default). */
22
+ source?: MoodSource;
23
+ }
12
24
  /**
13
25
  * Animates the blob's mood parameters — a cross-fade between named mood targets
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.
26
+ * driven per frame by `tick(dt)`. `setMood(mood, { source })` retargets (a `"manual"`
27
+ * source — the default — pins the mood above the auto-arc, AX.W46 D7);
28
+ * `update(interaction)` drives the AUTONOMIC arc from the AW.W10 pointer/idle state
29
+ * (curious on approach, excited on click, sleepy after inactivity), always
30
+ * `source: "auto"`, and early-returns while a manual mood is pinned; `params` is the
31
+ * eased current value the renderer reads.
18
32
  */
19
33
  export declare function useBlobMood(): {
20
34
  currentMood: Readonly<Ref<BlobMood>>;
21
35
  params: Readonly<Ref<MoodParams>>;
22
- setMood: (mood: BlobMood) => void;
36
+ setMood: (mood: BlobMood, options?: SetMoodOptions) => void;
23
37
  update: (interaction: MoodInteraction) => void;
24
38
  tick: (dt: number) => void;
39
+ /** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
40
+ isSettled: () => boolean;
41
+ /** AX.W16 — wall-ms to the next auto-mood retarget (the wake horizon). */
42
+ nextAutoMoodMs: () => number;
25
43
  };
26
44
  export type BlobMoodSystem = ReturnType<typeof useBlobMood>;
@@ -55,5 +55,7 @@ export declare function useBlobPointer(el: Ref<HTMLElement | null>): {
55
55
  click: (amp: number) => void;
56
56
  consumeClick: () => boolean;
57
57
  rest: () => void;
58
+ /** AX.W16 — the quiescence at-rest predicate the renderer's demand gate reads. */
59
+ isAtRest: () => boolean;
58
60
  };
59
61
  export type BlobPointer = ReturnType<typeof useBlobPointer>;
@@ -9,5 +9,7 @@ export declare function useBlobSatellites(config: BlobConfig, initialColor: stri
9
9
  tick: (now: number, mood: MoodParams) => void;
10
10
  nudge: () => void;
11
11
  reseed: (color: string) => void;
12
+ isQuiescent: () => boolean;
13
+ nextEventMs: (now: number) => number;
12
14
  };
13
15
  export type BlobSatelliteSystem = ReturnType<typeof useBlobSatellites>;
@@ -1,22 +1,37 @@
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";
7
7
  export interface UseMetaballRendererOptions {
8
8
  canvasRef: Ref<HTMLCanvasElement | null>;
9
+ /** The base color, ALREADY un-wrapped to a CONCRETE string by the SFC (DOM-free). */
9
10
  color: Ref<string>;
11
+ /**
12
+ * The Fresnel rim color, ALREADY un-wrapped to a CONCRETE string by the SFC
13
+ * (AX.W16 — the renderer no longer reaches the DOM for the `var()`-cascade read;
14
+ * the SFC's `resolveTokenColor` leaf does ALL un-wrapping before the renderer sees
15
+ * it). A `var(--token)` rim arrives here already resolved to `rgb(...)`.
16
+ */
17
+ rimColor: Ref<string>;
18
+ /**
19
+ * The multi-stop palette, ALREADY un-wrapped to CONCRETE strings by the SFC
20
+ * (AX.W16). EMPTY falls back to the base color (uStopCount <= 1).
21
+ */
22
+ paletteStops: Ref<string[]>;
10
23
  mood: BlobMoodSystem;
11
24
  pointer: BlobPointer;
12
25
  satellites: BlobSatelliteSystem;
13
26
  config: BlobConfig;
14
27
  /**
15
- * The injected color seam (DEC-AT-2). Resolves a CSS color string to a GAMMA-
16
- * sRGB triple in [0,1] fed straight into the shader's base-color uniform — the
17
- * faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
28
+ * The injected color seam (DEC-AT-2). Resolves a CONCRETE CSS color string to a
29
+ * GAMMA-sRGB triple in [0,1] fed straight into the shader's base-color uniform —
30
+ * the faithful AU.W7 lift paints gamma. REQUIRED: a no-resolver mount throws (the
18
31
  * loud failure, not a silent gray) instructing the consumer to pass
19
- * `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own).
32
+ * `defaultBlobColorResolver` from `@mkbabb/glass-ui/color` (or their own). The
33
+ * renderer is DOM-FREE: it never un-wraps a `var(--token)` — the SFC's
34
+ * `resolveTokenColor` leaf does that BEFORE handing strings here (inv-K-3 seam).
20
35
  */
21
36
  colorResolver: ColorResolver;
22
37
  }
@@ -1,5 +1,5 @@
1
1
  export { default as GooBlob } from "./GooBlob.vue";
2
- export type { BlobMood, BlobMerge, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
2
+ export type { BlobMood, BlobMerge, BlobQuality, MoodParams, MetaballSource, BlobConfig, SatellitePhase, SatelliteInternal, } from "./types";
3
3
  export { BLOB_CONFIG_DEFAULTS, BLOB_CONFIG_KEY } from "./types";
4
4
  export { useBlobMood, type BlobMoodSystem } from "./composables/useBlobMood";
5
5
  export { useBlobPointer, type BlobPointer } from "./composables/useBlobPointer";
@@ -1 +1 @@
1
- export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// 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
+ export declare const METABALL_SDF_GLSL = "// --- SDF ---\n\nfloat sdCircle(vec2 p, vec2 center, float radius) {\n return length(p - center) - radius;\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT circle: returns vec3(d, dd/dx, dd/dy). The circle\n// gradient is the UNIT radial direction (p - center)/length(p - center) (the\n// eikonal property holds EXACTLY for a circle), guarded at the degenerate centre.\n// This is the keystone of the analytic-gradient smin: carrying the gradient\n// through the scene field DELETES the per-pixel 4-tap normal (4 full sceneDist\n// evals, each running 3-octave FBM + the sat/trail loops).\nvec3 sdgCircle(vec2 p, vec2 center, float radius) {\n vec2 d = p - center;\n float len = length(d);\n vec2 grad = len > 1e-6 ? d / len : vec2(0.0, 1.0);\n return vec3(len - radius, grad);\n}\n\n// IQ 2024 quadratic-polynomial smin, NORMALIZED so k is a blend band in distance\n// units. The k *= 4.0 pre-scale makes the h*h*k*0.25 poly's effective blend width\n// equal to k (the un-normalized form's width was 0.25*k).\nfloat sminQuadratic(float a, float b, float k) {\n k *= 4.0;\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - h * h * k * 0.25;\n}\n\n// IQ circular smin \u2014 a quarter-circle fillet at the seam (rounder than the\n// quadratic). The k *= 1.0/(1.0-sqrt(0.5)) factor normalizes k to the same\n// blend-band units so the merge axis swaps shape without re-tuning uSmoothK.\nfloat sminCircular(float a, float b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a - b), 0.0) / k;\n return min(a, b) - k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n}\n\n// Config-gated merge dispatch \u2014 uMerge 0 = quadratic, 1 = circular.\nfloat smin(float a, float b, float k) {\n if (uMerge > 0.5) return sminCircular(a, b, k);\n return sminQuadratic(a, b, k);\n}\n\n// AX.W15 \u2014 the VALUE+GRADIENT smin. a/b are vec3(dist, grad.xy); the blended\n// gradient is mix(a.yz, b.yz, w) with the interpolation weight w the distance\n// blend uses (IQ's vec2-smin insight). This propagates the analytic gradient\n// through the merge so the surface normal reads the field gradient DIRECTLY \u2014 no\n// finite-difference tap. The blend weight matches each variant.\nvec3 sminQuadraticG(vec3 a, vec3 b, float k) {\n k *= 4.0;\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = h * h * k * 0.25;\n // h-weight that selects which surface dominates (0 \u2192 a, 1 \u2192 b).\n float w = (a.x < b.x) ? 0.5 * h * h : 1.0 - 0.5 * h * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminCircularG(vec3 a, vec3 b, float k) {\n k *= 1.0 / (1.0 - sqrt(0.5));\n float h = max(k - abs(a.x - b.x), 0.0) / k;\n float m = k * 0.5 * (1.0 + h - sqrt(1.0 - h * (h - 2.0)));\n float w = (a.x < b.x) ? 0.5 * h : 1.0 - 0.5 * h;\n float dist = min(a.x, b.x) - m;\n vec2 grad = mix(a.yz, b.yz, w);\n return vec3(dist, grad);\n}\n\nvec3 sminG(vec3 a, vec3 b, float k) {\n if (uMerge > 0.5) return sminCircularG(a, b, k);\n return sminQuadraticG(a, b, k);\n}";
@@ -1,2 +1,2 @@
1
- export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\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
+ export declare const METABALL_EDGE_NOISE_PRE_GLSL = "// --- Noise ---\n\nfloat hash21(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\n// IQ analytic-derivative gradient noise \u2014 value in .x, ANALYTIC gradient\n// (d/dx, d/dy) in .yz, from one eval. The quintic fade has a continuous 2nd\n// derivative so the gradient is smooth (a cubic smoothstep fade would crease it).\n// (Inigo Quilez, https://iquilezles.org/articles/gradientnoise/.)\nvec3 noised(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n\n // Quintic fade + its derivative.\n vec2 u = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n vec2 du = 30.0 * f * f * (f * (f - 2.0) + 1.0);\n\n // Per-corner gradient vectors from the hash (centred to [-1, 1]).\n vec2 ga = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 0.0)), hash21(i + vec2(7.3, 0.0)));\n vec2 gb = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 0.0)), hash21(i + vec2(8.3, 0.0)));\n vec2 gc = -1.0 + 2.0 * vec2(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(7.3, 1.0)));\n vec2 gd = -1.0 + 2.0 * vec2(hash21(i + vec2(1.0, 1.0)), hash21(i + vec2(8.3, 1.0)));\n\n float va = dot(ga, f - vec2(0.0, 0.0));\n float vb = dot(gb, f - vec2(1.0, 0.0));\n float vc = dot(gc, f - vec2(0.0, 1.0));\n float vd = dot(gd, f - vec2(1.0, 1.0));\n\n // Value, remapped to [0,1] so it drops in for the prior valueNoise.\n float n = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd);\n float value = 0.5 + 0.5 * n;\n\n // Analytic gradient (chain rule through the bilinear blend + the fade).\n vec2 grad =\n ga + u.x * (gb - ga) + u.y * (gc - ga) + u.x * u.y * (ga - gb - gc + gd) +\n du * (vec2(u.y, u.x) * (va - vb - vc + vd) + vec2(vb, vc) - va);\n return vec3(value, 0.5 * grad);\n}\n\n// Rotated-octave FBM over the analytic gradient noise: a fixed ~0.5 rad 2x2\n// rotation between octaves breaks the axis-aligned banding. The rotation CONSTANT\n// is spliced from the shared chunk (AV.W2 \u2014 the one FBM_ROT); the loops below\n// stay blob-local (param octaves + the LIQUID lacunarity/persistence, per \u00A73a).";
2
+ export declare const METABALL_EDGE_NOISE_POST_GLSL: string;
@@ -2,6 +2,13 @@ import type { InjectionKey } from "vue";
2
2
  export type BlobMood = "idle" | "happy" | "curious" | "sleepy" | "excited";
3
3
  /** Smin merge variant — `quadratic` (cheap, creased) | `circular` (rounder menisci). */
4
4
  export type BlobMerge = "quadratic" | "circular";
5
+ /**
6
+ * Render-quality axis (AX.W16) — `full` (default) renders the metaball pass at the
7
+ * clamped DPR; `half` renders the backing store at HALF resolution and lets the
8
+ * browser bilinear-upsample on composite (~4× fragment savings for weak GPUs — the
9
+ * blob is the ideal candidate: the soft FBM/AA edge hides the interpolation).
10
+ */
11
+ export type BlobQuality = "full" | "half";
5
12
  export interface MoodParams {
6
13
  orbitSpeedScale: number;
7
14
  wobbleScale: number;
@@ -55,6 +62,7 @@ export interface BlobConfig {
55
62
  satelliteCount: number;
56
63
  satelliteRadius: number;
57
64
  orbitRadius: number;
65
+ quality: BlobQuality;
58
66
  tempo: number;
59
67
  smoothK: number;
60
68
  /** Smin merge variant — `quadratic` (default) | `circular` (rounder menisci). */