@mkbabb/glass-ui 3.9.0 → 3.10.1

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 (265) hide show
  1. package/dist/{CardAction-DuArVky-.js → CardAction-DrAcAV4d.js} +2 -2
  2. package/dist/{CommandShortcut-CefCj5mt.js → CommandShortcut-mV2e1aG6.js} +2 -2
  3. package/dist/{DataTable-CUHMukiQ.js → DataTable-C3E6jZ5B.js} +2 -2
  4. package/dist/{DialogContent-BRkT1cjP.js → DialogContent-BxaaafFi.js} +1 -1
  5. package/dist/{HoverPopover-2LOIW34a.js → HoverPopover-CDA_SaCe.js} +1 -1
  6. package/dist/{MetricBadge-lTc002u2.js → MetricBadge-idgrkqoP.js} +1 -1
  7. package/dist/{Notification-BxK8LZMw.js → Notification-Cu0nN17_.js} +3 -3
  8. package/dist/{NumberFieldContent-BbLOh8RU.js → NumberFieldContent-CHEWghnY.js} +2 -2
  9. package/dist/{PopoverContent-BId6ggf_.js → PopoverContent-DpUvdYY-.js} +1 -1
  10. package/dist/{Progress-iEuD9pxG.js → Progress-BW-StFw2.js} +1 -1
  11. package/dist/{ScrollingText-BPP84wKo.js → ScrollingText-DruYCni_.js} +1 -1
  12. package/dist/{SelectScrollDownButton-T32cVFeM.js → SelectScrollDownButton-pirzjm--.js} +3 -3
  13. package/dist/{Switch-LDKLmmgx.js → Switch-DeAqg6pi.js} +1 -1
  14. package/dist/{TabsList-B8CVOQPC.js → TabsList-BAVzOZpg.js} +2 -2
  15. package/dist/{Toaster-1rYWrmAm.js → Toaster-CvuuW_y9.js} +49 -46
  16. package/dist/{ToggleGroupItem-Cev4pOVK.js → ToggleGroupItem-DtD37b4G.js} +4 -4
  17. package/dist/animated-digit.js +2 -2
  18. package/dist/api/index.d.ts +4 -4
  19. package/dist/api.js +1 -1
  20. package/dist/aurora.js +238 -547
  21. package/dist/{badge-BvwvT50i.js → badge-NdCQMvvB.js} +2 -2
  22. package/dist/badge.js +1 -1
  23. package/dist/{button-DN39cGqL.js → button-DyiWFAOE.js} +12 -12
  24. package/dist/button.js +1 -1
  25. package/dist/canvas.js +2 -2
  26. package/dist/card.js +1 -1
  27. package/dist/carousel.js +5 -5
  28. package/dist/collapsible.js +1 -1
  29. package/dist/{color-8jBjWiJ6.js → color-B65wWyQz.js} +9 -7
  30. package/dist/color.js +1 -1
  31. package/dist/command.js +1 -1
  32. package/dist/{compile-DAjIoEy2.js → compile-Ce_V55zi.js} +23 -23
  33. package/dist/components/custom/aurora/composables/atoms.d.ts +21 -4
  34. package/dist/components/custom/aurora/composables/runtime.d.ts +0 -9
  35. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +0 -11
  36. package/dist/components/custom/aurora/constants/renderMode.d.ts +0 -32
  37. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  38. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  39. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -1
  40. package/dist/components/custom/aurora/constants/shaders/vangogh-medium.glsl.d.ts +1 -0
  41. package/dist/components/custom/aurora/index.d.ts +1 -1
  42. package/dist/components/custom/constellation/Constellation.vue.d.ts +85 -1
  43. package/dist/components/custom/constellation/composables/createConstellationField.d.ts +35 -0
  44. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +35 -0
  45. package/dist/components/custom/constellation/constants.d.ts +36 -0
  46. package/dist/components/custom/constellation/constellationDraw.d.ts +18 -0
  47. package/dist/components/custom/constellation/constellationField.d.ts +174 -63
  48. package/dist/components/custom/constellation/constellationInteraction.d.ts +102 -0
  49. package/dist/components/custom/constellation/index.d.ts +4 -2
  50. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +11 -0
  51. package/dist/components/custom/dock/GlassDock.vue.d.ts +2 -110
  52. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +36 -0
  53. package/dist/components/custom/dock/composables/useDockMorphWindow.d.ts +15 -0
  54. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +131 -0
  55. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +44 -0
  56. package/dist/components/custom/dock/constants.d.ts +23 -0
  57. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +6 -0
  58. package/dist/components/custom/fourier-field/index.d.ts +25 -1
  59. package/dist/components/custom/fourier-field/math.d.ts +20 -8
  60. package/dist/components/custom/fourier-field/presets.d.ts +54 -0
  61. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +8 -10
  62. package/dist/components/custom/goo-blob/composables/buildMetaballProgram.d.ts +18 -0
  63. package/dist/components/custom/goo-blob/composables/uploadBlobUniforms.d.ts +41 -0
  64. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +4 -3
  65. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +16 -21
  66. package/dist/components/custom/goo-blob/constants.d.ts +52 -0
  67. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  68. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -0
  69. package/dist/components/custom/goo-blob/types.d.ts +59 -25
  70. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +2 -2
  71. package/dist/components/custom/tabs/constants.d.ts +12 -0
  72. package/dist/components/custom/underline/GlassUnderline.vue.d.ts +84 -0
  73. package/dist/components/custom/underline/index.d.ts +2 -0
  74. package/dist/components/custom/underline/types.d.ts +56 -0
  75. package/dist/components/ui/drawer/Drawer.vue.d.ts +1 -0
  76. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +2 -2
  77. package/dist/components/ui/slider/index.d.ts +25 -18
  78. package/dist/components/ui/toast/use-toast.d.ts +2 -2
  79. package/dist/composables/color/index.d.ts +24 -7
  80. package/dist/composables/glass/useSpecularTracking.d.ts +12 -3
  81. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +1 -6
  82. package/dist/composables/motion/curves.d.ts +48 -0
  83. package/dist/composables/motion/index.d.ts +2 -0
  84. package/dist/composables/motion/springPresets.d.ts +33 -0
  85. package/dist/composables/motion/suite.d.ts +2 -0
  86. package/dist/composables/motion/useSpringMount.d.ts +1 -1
  87. package/dist/configurator.js +1 -1
  88. package/dist/confirm-dialog.js +2 -2
  89. package/dist/constellation.js +322 -147
  90. package/dist/controls.js +48 -14
  91. package/dist/dark.js +1 -1
  92. package/dist/data-table.js +1 -1
  93. package/dist/dialog.js +2 -2
  94. package/dist/dock.js +340 -327
  95. package/dist/dockContext-bho8B1A4.js +17 -0
  96. package/dist/{dropdown-menu-D77jX6Df.js → dropdown-menu-DVnQcA0E.js} +7 -4
  97. package/dist/dropdown-menu.js +1 -1
  98. package/dist/expandable-container.js +1 -1
  99. package/dist/forms.js +2 -2
  100. package/dist/fourier-field.js +147 -120
  101. package/dist/fourier-math.d.ts +1 -0
  102. package/dist/fourier-math.js +2 -0
  103. package/dist/glass-ui.css +1 -1
  104. package/dist/glass-ui.js +286 -207
  105. package/dist/goo-blob.js +368 -322
  106. package/dist/hover-popover.js +1 -1
  107. package/dist/icon-tooltip.js +1 -1
  108. package/dist/index.d.ts +0 -2
  109. package/dist/keyboard.js +1 -1
  110. package/dist/labeled-field.js +5 -5
  111. package/dist/math-BUU9hHID.js +43 -0
  112. package/dist/metric-badge.js +1 -1
  113. package/dist/metric-stack.js +2 -2
  114. package/dist/motion-core.js +4 -4
  115. package/dist/motion-curves.d.ts +1 -0
  116. package/dist/motion-curves.js +130 -0
  117. package/dist/motion.js +38 -37
  118. package/dist/notification.js +1 -1
  119. package/dist/number-field.js +1 -1
  120. package/dist/popover.js +1 -1
  121. package/dist/progress.js +1 -1
  122. package/dist/pulse.js +1 -1
  123. package/dist/reactive.js +1 -1
  124. package/dist/scrolling-text.js +1 -1
  125. package/dist/search.js +6 -6
  126. package/dist/select.js +1 -1
  127. package/dist/{sheet-VZEtNFvO.js → sheet-ChSXcJpU.js} +1 -1
  128. package/dist/sheet.js +1 -1
  129. package/dist/{slider-DC2mwuoe.js → slider-sfl8gFDD.js} +8 -8
  130. package/dist/slider.js +1 -1
  131. package/dist/sortable-list.js +2 -2
  132. package/dist/springPresets-aRSm-4_k.js +40 -0
  133. package/dist/stacked-icons.js +6 -6
  134. package/dist/styles/cards.css +2 -2
  135. package/dist/styles/components.css +1 -1
  136. package/dist/styles/dock/layer-group.css +38 -4
  137. package/dist/styles/dock/layers.css +11 -1
  138. package/dist/styles/dock/morph.css +95 -19
  139. package/dist/styles/dock/shell.css +12 -0
  140. package/dist/styles/dock-controls.css +25 -12
  141. package/dist/styles/drawer.css +14 -4
  142. package/dist/styles/floating-panel.css +2 -0
  143. package/dist/styles/glass/a11y-fallback.css +245 -0
  144. package/dist/styles/glass/ladder.css +304 -0
  145. package/dist/styles/glass/material.css +238 -0
  146. package/dist/styles/glass/progress-rail.css +78 -0
  147. package/dist/styles/glass/squircle.css +66 -0
  148. package/dist/styles/glass/surfaces.css +306 -0
  149. package/dist/styles/glass-refract.css +2 -0
  150. package/dist/styles/glass.css +31 -1052
  151. package/dist/styles/hover-popover.css +2 -0
  152. package/dist/styles/index.css +24 -6
  153. package/dist/styles/instrument-chassis.css +4 -0
  154. package/dist/styles/theme.css +14 -14
  155. package/dist/styles/tokens/color-radius.css +250 -0
  156. package/dist/styles/tokens/dark-arm.css +194 -0
  157. package/dist/styles/tokens/glass.css +413 -0
  158. package/dist/styles/tokens/light-dark.css +158 -0
  159. package/dist/styles/tokens/offsets-sizing.css +406 -0
  160. package/dist/styles/tokens/property-regs.css +169 -0
  161. package/dist/styles/tokens/scale-paper.css +361 -0
  162. package/dist/styles/tokens/scheme-motion.css +334 -0
  163. package/dist/styles/tokens/shadow.css +132 -0
  164. package/dist/styles/tokens.css +22 -2269
  165. package/dist/styles/transitions.css +20 -2
  166. package/dist/styles/typography.css +18 -6
  167. package/dist/styles/utilities/a11y-overrides.css +140 -0
  168. package/dist/styles/utilities/animate.css +26 -0
  169. package/dist/styles/utilities/base.css +365 -0
  170. package/dist/styles/utilities/btn.css +399 -0
  171. package/dist/styles/utilities/components.css +317 -0
  172. package/dist/styles/utilities.css +19 -1170
  173. package/dist/switch.js +1 -1
  174. package/dist/tabs.js +98 -98
  175. package/dist/timeline.js +2 -2
  176. package/dist/toast.js +1 -1
  177. package/dist/toggle-group.js +1 -1
  178. package/dist/typewriter.js +1 -1
  179. package/dist/underline.d.ts +1 -0
  180. package/dist/underline.js +85 -0
  181. package/dist/{useAnimatedNumber-C5I3wWd8.js → useAnimatedNumber-DfVgP4te.js} +1 -1
  182. package/dist/{useConfiguratorState-DxAqksK6.js → useConfiguratorState-BdQXh9ie.js} +1 -1
  183. package/dist/useSpecularTracking-DFK_fhpG.js +32 -0
  184. package/dist/useSpringMount-DXUzxBjV.js +108 -0
  185. package/dist/watercolor-dot.js +2 -2
  186. package/package.json +62 -38
  187. package/src/styles/cards.css +2 -2
  188. package/src/styles/dock/layer-group.css +38 -4
  189. package/src/styles/dock/layers.css +11 -1
  190. package/src/styles/dock/morph.css +95 -19
  191. package/src/styles/dock/shell.css +12 -0
  192. package/src/styles/dock-controls.css +25 -12
  193. package/src/styles/drawer.css +12 -4
  194. package/src/styles/glass/a11y-fallback.css +245 -0
  195. package/src/styles/glass/ladder.css +304 -0
  196. package/src/styles/glass/material.css +238 -0
  197. package/src/styles/glass/progress-rail.css +78 -0
  198. package/src/styles/glass/squircle.css +66 -0
  199. package/src/styles/glass/surfaces.css +306 -0
  200. package/src/styles/glass.css +31 -1052
  201. package/src/styles/index.css +24 -6
  202. package/src/styles/theme.css +14 -14
  203. package/src/styles/tokens/color-radius.css +250 -0
  204. package/src/styles/tokens/dark-arm.css +194 -0
  205. package/src/styles/tokens/glass.css +413 -0
  206. package/src/styles/tokens/light-dark.css +158 -0
  207. package/src/styles/tokens/offsets-sizing.css +406 -0
  208. package/src/styles/tokens/property-regs.css +169 -0
  209. package/src/styles/tokens/scale-paper.css +361 -0
  210. package/src/styles/tokens/scheme-motion.css +334 -0
  211. package/src/styles/tokens/shadow.css +132 -0
  212. package/src/styles/tokens.css +22 -2269
  213. package/src/styles/transitions.css +20 -2
  214. package/src/styles/typography.css +18 -6
  215. package/src/styles/utilities/a11y-overrides.css +140 -0
  216. package/src/styles/utilities/animate.css +26 -0
  217. package/src/styles/utilities/base.css +365 -0
  218. package/src/styles/utilities/btn.css +399 -0
  219. package/src/styles/utilities/components.css +317 -0
  220. package/src/styles/utilities.css +19 -1170
  221. package/dist/DeckProgress-Dmk4_AKN.js +0 -23
  222. package/dist/InstrumentRail-CUJ05YVG.js +0 -44
  223. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +0 -16
  224. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +0 -7
  225. package/dist/components/custom/deck-progress/DeckProgress.vue.d.ts +0 -27
  226. package/dist/components/custom/deck-progress/index.d.ts +0 -2
  227. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +0 -57
  228. package/dist/components/custom/dialog-native/index.d.ts +0 -1
  229. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +0 -41
  230. package/dist/components/custom/glass-panel/index.d.ts +0 -2
  231. package/dist/components/custom/header-ribbon/HeaderRibbon.vue.d.ts +0 -31
  232. package/dist/components/custom/header-ribbon/index.d.ts +0 -2
  233. package/dist/components/custom/header-ribbon/types.d.ts +0 -7
  234. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +0 -91
  235. package/dist/components/custom/instrument-rail/index.d.ts +0 -2
  236. package/dist/composables/glass/createGPUCanvas.d.ts +0 -40
  237. package/dist/deck-progress.d.ts +0 -1
  238. package/dist/deck-progress.js +0 -2
  239. package/dist/dockContext-BKeIMmNk.js +0 -9
  240. package/dist/glass-panel.d.ts +0 -1
  241. package/dist/glass-panel.js +0 -44
  242. package/dist/header-ribbon.d.ts +0 -1
  243. package/dist/header-ribbon.js +0 -63
  244. package/dist/instrument-rail.d.ts +0 -1
  245. package/dist/instrument-rail.js +0 -2
  246. package/dist/useGlassRenderer-5I0YkI4t.js +0 -69
  247. package/dist/useSpecularTracking-BVRZsRHA.js +0 -26
  248. package/dist/useSpringMount-BJSHcLl3.js +0 -113
  249. /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-Drow5WkV.js} +0 -0
  250. /package/dist/{DialogFooter-Gprw8H_A.js → DialogFooter-DufLHi0y.js} +0 -0
  251. /package/dist/{IconTooltip-yefK7cJc.js → IconTooltip-BrQ5p181.js} +0 -0
  252. /package/dist/{Input-DWQQIOC4.js → Input-B-F818RU.js} +0 -0
  253. /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-DWghtRt7.js} +0 -0
  254. /package/dist/{constants-CS75AWHG.js → constants-C8NMonuo.js} +0 -0
  255. /package/dist/{presets-BKVyQfbt.js → presets-1OhFpaIC.js} +0 -0
  256. /package/dist/{prng-wHuHlNHE.js → prng-CjVgzjQT.js} +0 -0
  257. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CRvVzOvP.js} +0 -0
  258. /package/dist/{useCanvas2D-ClrQuZtp.js → useCanvas2D-CSeH8h16.js} +0 -0
  259. /package/dist/{useGlobalDark-yhL4Wp-s.js → useGlobalDark-D7R9OypB.js} +0 -0
  260. /package/dist/{useIntersectionPause-Cc-H9ees.js → useIntersectionPause-DAdVPVp4.js} +0 -0
  261. /package/dist/{useInterval-Dsmqwi03.js → useInterval-D3USn0yc.js} +0 -0
  262. /package/dist/{useKeyboardShortcuts-Be3w_Rwk.js → useKeyboardShortcuts-i8tHd5WO.js} +0 -0
  263. /package/dist/{useScrollProgress-CAH8Ofwt.js → useScrollProgress-CcgmgMQt.js} +0 -0
  264. /package/dist/{useSortable-C8ReQ50P.js → useSortable-DnyGXKKY.js} +0 -0
  265. /package/dist/{useTextHighlight-DON84L8w.js → useTextHighlight-B3b10W6r.js} +0 -0
@@ -1,5 +1,4 @@
1
- /** Reference width the `k` scale factor is keyed to (CSS px). */
2
- export declare const BASE_WIDTH = 1280;
1
+ export { BASE_WIDTH } from "./constants";
3
2
  export interface ConstellationNode {
4
3
  x: number;
5
4
  y: number;
@@ -51,6 +50,89 @@ export interface ConstellationWarp {
51
50
  /** The chased node's INDEX (live target), or -1 when inactive. */
52
51
  targetIdx: number;
53
52
  }
53
+ /**
54
+ * The auto-DRIFT target-source (AY.W-CON1 — the 2nd half of the AX.W17 "drift +
55
+ * warp are ONE mechanic" thesis). The warp re-points its focal node to a
56
+ * periodically-chosen RANDOM node on a jittered cadence: the SAME warp spring,
57
+ * a different target-PICKER (a click for warp, this cadence for drift). No new
58
+ * rAF, no second mechanic — `stepField` steps this cadence inline, re-pointing
59
+ * `setWarpTarget` to a picked node only when the spring has SETTLED (so a
60
+ * click-warp in flight always pre-empts the cadence). PRM is enforced by the
61
+ * CALLER (the component does not advance the cadence under reduced-motion — the
62
+ * `stepField` call lives inside the `!reducedMotion` block — so the focal mark
63
+ * stays at its seed: the WARP precedent, NOT fire-but-freeze).
64
+ */
65
+ export interface ConstellationWander {
66
+ /** ms timestamp of the next auto re-target; -1 until armed on the first stepped frame. */
67
+ nextAt: number;
68
+ /** the minimum idle (ms) between auto re-targets. */
69
+ minIdle: number;
70
+ /** the random extra idle (ms) added per cadence (so the rhythm is not metronomic). */
71
+ jitter: number;
72
+ }
73
+ /**
74
+ * The warp-spring tuning the integrator reads (AY.W-CON2). Tokenised numeric (the
75
+ * `--constellation-warp-*` cohort) so a consumer retunes the warp WITHOUT editing
76
+ * src — read ONCE on mount via `parseFloat`, threaded onto the field.
77
+ *
78
+ * `response` is the keyframes.js `(response, dampingFraction)` model's ANGULAR
79
+ * PERIOD (the SwiftUI `.spring(response:)` axis): `ω₀ = 2π/response`. It is NOT a
80
+ * settle-duration — at ζ=1 the 2%-settle lands at `t₂ ≈ 5.83/ω₀ ≈ 0.93·response`
81
+ * (the `(1 + ω₀t)e^(−ω₀t)` critically-damped envelope). Documented here + in the
82
+ * `--constellation-warp-response` token comment so the token semantics are honest
83
+ * at ANY ζ (the AY.W-CON2 ω-reconcile; the engine keeps the keyframes.js convention,
84
+ * mints NO second ω formula).
85
+ */
86
+ export interface ConstellationWarpConfig {
87
+ /** keyframes.js angular period (s) — `ω₀ = 2π/response`, NOT a settle-duration. */
88
+ response: number;
89
+ /** damping ratio ζ — 1 critically damped (a focal mark must NOT ring). */
90
+ zeta: number;
91
+ }
92
+ /**
93
+ * The gravity-well tuning (AY.W-CON2). The held-pointer pull is an inverse-square
94
+ * force composed into `stepField` (no new rAF). Tokenised numeric (the
95
+ * `--constellation-well-*` cohort) so a consumer retunes the well WITHOUT editing
96
+ * src. All distances are base-width px (`k`-scaled at step time).
97
+ */
98
+ export interface ConstellationWellConfig {
99
+ /** the inverse-square pull gain (the force scale at unit distance). */
100
+ gain: number;
101
+ /** the reach (base-width px) — nodes beyond it are untouched (the O(within-reach) cost floor). */
102
+ reach: number;
103
+ /**
104
+ * the ARM ramp rate (1/s) — `strength` eases toward `target = 1` at this rate
105
+ * while HELD (the gentle bloom the token tunes). The RELEASE is NOT this rate:
106
+ * it is the fixed brisk {@link WELL_RELEASE_RAMP} (the field-cools invariant —
107
+ * not consumer-tunable, F8.2). A consumer slowing this token slows the ARM
108
+ * bloom only; the release stays brisk so the cool gate holds.
109
+ */
110
+ ramp: number;
111
+ /** the per-node speed cap (base-width px/frame) — the no-slingshot clamp. */
112
+ maxSpeed: number;
113
+ /** the singularity floor (px) — a node AT the cursor gets a bounded pull, never `∞`. */
114
+ soften: number;
115
+ /** ms the pointer is held before the well arms. */
116
+ holdMs: number;
117
+ }
118
+ /**
119
+ * The gravity-well live STATE (AY.W-CON2). `(x, y)` is the held pointer in
120
+ * canvas-local px (`-1` = inactive); `strength` is the eased pull 0→1 (ramps to
121
+ * `target` at `cfg.ramp`/s); `target` is the strength the ramp eases toward (1
122
+ * while held, 0 on release). A transient force — the field renormalises back to
123
+ * `speed` after release (the field-cools invariant).
124
+ */
125
+ export interface ConstellationWell {
126
+ /** canvas-local px of the held pointer; `-1` = inactive. */
127
+ x: number;
128
+ y: number;
129
+ /** the eased pull strength 0→1 (ramps to `target` at `cfg.ramp`/s). */
130
+ strength: number;
131
+ /** the strength the ramp is easing toward: 1 while held, 0 on release. */
132
+ target: number;
133
+ /** the well tuning (gain/reach/ramp/maxSpeed/soften). */
134
+ cfg: ConstellationWellConfig;
135
+ }
54
136
  /**
55
137
  * The field state the component exposes to its `drawOverlay` consumer so a
56
138
  * skin can pin itself to a real field node. `k` is the `width / BASE_WIDTH`
@@ -79,6 +161,28 @@ export interface ConstellationField {
79
161
  focalIndex: number;
80
162
  /** The per-axis warp spring the engine steps inside `stepField` (AX.W17). */
81
163
  warp: ConstellationWarp;
164
+ /**
165
+ * The warp-spring tuning `warpStep` reads (AY.W-CON2). Optional — absent
166
+ * falls back to the shipped `{ response: 0.55, zeta: 1.0 }` defaults (the
167
+ * byte-identical HEAD spring). A tokenised override (read on mount) reaches
168
+ * the integrator through this member.
169
+ */
170
+ warpCfg?: ConstellationWarpConfig;
171
+ /**
172
+ * The optional auto-DRIFT cadence (AY.W-CON1). When set, `stepField`
173
+ * periodically re-points the warp to a random node (the wander source on the
174
+ * SAME spring). Absent (`undefined`) leaves the field BYTE-IDENTICAL to the
175
+ * pre-wander HEAD — `stepField` skips the cadence block entirely.
176
+ */
177
+ wander?: ConstellationWander;
178
+ /**
179
+ * The optional gravity-well (AY.W-CON2). When set, `stepField` composes a
180
+ * held-pointer inverse-square pull force (no new rAF) — `well.target → 1`
181
+ * while held, `→ 0` on release, the field renormalising back to `speed` once
182
+ * the well cools. Absent (`undefined`) leaves the field BYTE-IDENTICAL to the
183
+ * pre-well HEAD — `stepField` skips the force pass entirely.
184
+ */
185
+ well?: ConstellationWell;
82
186
  }
83
187
  /**
84
188
  * The `<Constellation>` consumer prop surface (the public type a consumer types
@@ -92,6 +196,15 @@ export interface ConstellationProps {
92
196
  link?: number;
93
197
  /** Drift speed. Default 0.16. */
94
198
  speed?: number;
199
+ /**
200
+ * AY.W-COHERE E3 — the per-instance outer-envelope RECESSION knob (the aurora
201
+ * `opacityCeiling` / fourier `intensity` sibling — ONE recession vocabulary
202
+ * across the four live substrates). Scales the painted edge/node/web/ripple
203
+ * alpha OVER the mode-tuned `--constellation-alpha` base so the lattice can
204
+ * RECEDE behind content (0.4–0.6 in a hero). Default `1` is byte-identical to
205
+ * HEAD.
206
+ */
207
+ opacityCeiling?: number;
95
208
  /** Seed for a reproducible field (number or hashed string); omit for `Math.random`. */
96
209
  seed?: number | string;
97
210
  /** Steer-toward-cursor + tap ripples. Default true; auto-off under reduced-motion. */
@@ -103,18 +216,50 @@ export interface ConstellationProps {
103
216
  * reduced-motion (the focal mark stays put — the stated PRM policy).
104
217
  */
105
218
  warpOnClick?: boolean;
219
+ /**
220
+ * Auto-DRIFT (AY.W-CON1): a periodic auto-pick re-points the focal node to a
221
+ * random node on a jittered cadence — the wander source on the SAME warp
222
+ * spring (no second mechanic). `true` uses the default cadence (8–16s, the
223
+ * slides rhythm); `{ minIdle, jitter }` tunes it. Default OFF (absent →
224
+ * byte-identical to HEAD). PRM-gated by the WARP precedent (the cadence never
225
+ * advances under reduced-motion — the focal stays at its seed).
226
+ */
227
+ wander?: boolean | {
228
+ minIdle?: number;
229
+ jitter?: number;
230
+ };
231
+ /**
232
+ * Pointer-held GRAVITY-WELL (AY.W-CON2): hold the pointer and the lattice is
233
+ * pulled toward it (an inverse-square force on the same engine, no new rAF);
234
+ * release and the field cools back to `speed`. INDEPENDENT of `warpOnClick`
235
+ * and `pointerReactive` (a consumer can hold-to-pull on a non-ripple,
236
+ * non-warp lattice). `true` uses the tokenised defaults; an object tunes the
237
+ * gains. Default OFF (absent → byte-identical to HEAD). PRM-gated by the WARP
238
+ * precedent (the held-timer is not registered under reduced-motion).
239
+ */
240
+ gravityWell?: boolean | {
241
+ holdMs?: number;
242
+ gain?: number;
243
+ reach?: number;
244
+ ramp?: number;
245
+ maxSpeed?: number;
246
+ soften?: number;
247
+ };
248
+ /**
249
+ * Deterministic-capture freeze (AY.W-CON3): when `true`, lays out ONE
250
+ * reproducible STATIC frame (no `stepField`, no ripple / warp / wander / well
251
+ * advance) and hands `drawOverlay` a FROZEN `now` so a phase-driven skin
252
+ * resolves to a fixed value. Omit to AUTO-DERIVE from `location.search`
253
+ * matching `export | print | freeze` (the deploy-pipeline contract); an
254
+ * explicit `false` forces live even under a capture URL. Set `seed` for a
255
+ * field stable ACROSS runs. Unifies with the reduced-motion one-static-frame
256
+ * path (`freeze || reducedMotion` is the single static-frame predicate).
257
+ */
258
+ freeze?: boolean;
106
259
  class?: string;
107
260
  /** The skin seam — paints the consumer's focal mark on the live field. */
108
261
  drawOverlay?: (ctx: CanvasRenderingContext2D, field: ConstellationField, now: number) => void;
109
262
  }
110
- export declare const DEFAULT_PALETTE: ConstellationPalette;
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
- */
117
- export declare function readPalette(canvas: HTMLCanvasElement): ConstellationPalette;
118
263
  /**
119
264
  * Seed `count` drifting nodes inside `w × h`. `rng` is a `() => number` in
120
265
  * `[0, 1)` (the glass-ui `mulberry32`/`Math.random`); a seeded `rng` lays out a
@@ -124,6 +269,19 @@ export declare function readPalette(canvas: HTMLCanvasElement): ConstellationPal
124
269
  * adds one, so node count is conserved).
125
270
  */
126
271
  export declare function seedField(rng: () => number, count: number, w: number, h: number, speed: number): ConstellationNode[];
272
+ /**
273
+ * Re-fit the existing lattice to a NEW canvas size, proportionally, ON the
274
+ * size-change frame (AY.W-CON1). Without it a field seeded at a transitional
275
+ * size (the canvas measures mid responsive-scale — the deck slide-enter case)
276
+ * keeps its small-canvas positions and DRIFTS out to fill the larger box at
277
+ * `speed` px/frame — the visible "takes a while to expand out" lag the slides
278
+ * bespoke copy fixed. Scales node + warp positions by the per-axis dimension
279
+ * ratio; velocities are UNTOUCHED (they are base-width direction vectors
280
+ * `k`-scaled at step time — scaling them would HEAT the field, breaking the
281
+ * cool-down invariant). No-op on first layout (`prev ≤ 0`; the seed path owns
282
+ * it) or unchanged dims.
283
+ */
284
+ export declare function refitField(field: ConstellationField, prevW: number, prevH: number): void;
127
285
  /**
128
286
  * Advance the field one step: drift + wall-bounce every node, then (if the
129
287
  * pointer is live) lean nodes within reach toward the cursor WITHOUT changing
@@ -133,58 +291,11 @@ export declare function seedField(rng: () => number, count: number, w: number, h
133
291
  * via `warpStep` INSIDE this single per-frame call (AX.W17) — NO second rAF,
134
292
  * NO `useSpring`. The warp rides the substrate's ONE parked rAF; a `dt` of `0`
135
293
  * (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
294
  *
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.
295
+ * `now` (ms; default `0` — every existing caller stays green) + `rng` (default
296
+ * `Math.random`) drive the optional auto-DRIFT cadence (AY.W-CON1): AFTER the
297
+ * warp step, if `field.wander` is set and `now > 0`, the cadence re-points
298
+ * `setWarpTarget` to a random node when it elapses AND the spring has settled
299
+ * (a click-warp in flight pre-empts the cadence — `warpSettled` reports false).
181
300
  */
182
- export declare function warpTo(field: ConstellationField, px: number, py: number): number;
183
- /** Pass 1 — hairline edges between any two nodes within `link` px (alpha falls off with distance). */
184
- export declare function drawEdges(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette): void;
185
- /** Pass 2 — ambient node dots. */
186
- export declare function drawNodes(ctx: CanvasRenderingContext2D, field: ConstellationField, palette: ConstellationPalette): void;
187
- /** Pass 3 — the cursor joins the web: faint links to nodes within reach + a soft cursor node. */
188
- export declare function drawPointerWeb(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette, pointer: ConstellationPointer | null): void;
189
- /** Pass 4 — tap ripples: expanding rings that fade over ~0.9s; consumed entries are spliced. */
190
- export declare function drawRipples(ctx: CanvasRenderingContext2D, field: ConstellationField, now: number, ripples: ConstellationRipple[], palette: ConstellationPalette): void;
301
+ export declare function stepField(field: ConstellationField, k: number, speed: number, pointer: ConstellationPointer | null, dt?: number, now?: number, rng?: () => number): void;
@@ -0,0 +1,102 @@
1
+ import type { ConstellationField, ConstellationWarpConfig, ConstellationWellConfig } from "./constellationField";
2
+ import { DEFAULT_WANDER_IDLE, DEFAULT_WANDER_JITTER, DEFAULT_WELL_CONFIG, WARP_RESPONSE, WARP_ZETA } from "./constants";
3
+ export { DEFAULT_WANDER_IDLE, DEFAULT_WANDER_JITTER, DEFAULT_WELL_CONFIG, WARP_RESPONSE, WARP_ZETA };
4
+ /**
5
+ * Read the NUMERIC interaction-tuning tokens (the warp spring + the gravity-well
6
+ * gains) off a canvas's resolved custom properties — ONCE on mount (AY.W-CON2),
7
+ * via `parseFloat`, NOT per-frame `getComputedStyle` (the hot loop stays clean).
8
+ * Returns `{ warp, well }` configs the field carries; every member falls back to
9
+ * the shipped default when the token is absent (an SSR / no-token mount reads the
10
+ * byte-identical spring). The tokens are PLAIN numbers (`0.55`, `12000`), immune
11
+ * to the W30 `light-dark()`-into-Canvas2D leak (they never reach a `fillStyle`).
12
+ */
13
+ export declare function readInteractionConfig(canvas: HTMLCanvasElement): {
14
+ warp: ConstellationWarpConfig;
15
+ well: ConstellationWellConfig;
16
+ wander: {
17
+ minIdle: number;
18
+ jitter: number;
19
+ };
20
+ };
21
+ /**
22
+ * Advance the gravity-well one `dt` (AY.W-CON2). A transient held-pointer force
23
+ * composed inside `stepField` (NO new rAF): ease `well.strength` toward
24
+ * `well.target` (1 held / 0 released) at `cfg.ramp`/s; while active, add an
25
+ * inverse-square pull toward the held point onto each node within `cfg.reach`
26
+ * (the `max(d, soften)` no-singularity floor + the `cfg.maxSpeed` no-slingshot
27
+ * clamp); ALWAYS ease every node's |v| back toward `speed` (the field-cools
28
+ * invariant — so a released well re-settles). No-ops (entirely skipped) when
29
+ * `field.well` is undefined → the default render is byte-identical to HEAD.
30
+ *
31
+ * `dt` is clamped to {@link WARP_DT_CLAMP} (the same park-resume guard the warp
32
+ * uses) so a tab-throttle gap cannot slingshot the field in one giant step.
33
+ */
34
+ export declare function stepWell(field: ConstellationField, k: number, speed: number, dt: number): void;
35
+ /**
36
+ * The nearest DRIFTING node to `(px, py)` in canvas-local px — a linear O(count)
37
+ * min-d² scan (count 64 default — negligible; matches the O(count²) edge pass).
38
+ * "Lattice point" = the nearest drifting NODE (the constellation has NO fixed
39
+ * lattice). `excludeIdx` drops a node from the candidate set (the focal node
40
+ * excludes ITSELF, so a cursor-on-focal warp no-ops). Returns `-1` if no
41
+ * eligible node exists (empty field, or only the excluded node).
42
+ */
43
+ export declare function nearestNode(field: ConstellationField, px: number, py: number, excludeIdx?: number): number;
44
+ /**
45
+ * Advance the focal-node warp spring one `dt` (seconds). A per-axis 2nd-order
46
+ * critically-damped integrator over `field.warp.{x,y}` toward the LIVE position
47
+ * of `field.nodes[field.warp.targetIdx]` — re-read EACH frame, so the spring
48
+ * CHASES a drifting target and arrives ON it (the identity-ride). No-ops when no
49
+ * warp is active (`targetIdx < 0`). `dt` is clamped to {@link WARP_DT_CLAMP} so a
50
+ * tab-throttle / offscreen-park-resume gap cannot teleport the mark.
51
+ *
52
+ * x += v·dt ; v += (−2ζω·v − ω²·(x − target))·dt
53
+ *
54
+ * Reads `(response, ζ)` from `field.warpCfg` (the tokenised override — AY.W-CON2),
55
+ * falling back to the shipped `WARP_RESPONSE`/`WARP_ZETA` defaults. `ω = 2π/response`
56
+ * is the keyframes.js `(response, dampingFraction)` convention (the SHARED house
57
+ * model — `ω₀` is the angular frequency, `response` its ANGULAR PERIOD, NOT a
58
+ * settle-duration; at ζ=1 the 2%-settle is `t₂ ≈ 5.83/ω₀ ≈ 0.93·response`). NO
59
+ * second ω formula is minted (the ω-reconcile). NOT its rAF — the FORBID-useSpring
60
+ * contract (a second rAF would defeat the parked-substrate one-path freeze).
61
+ */
62
+ export declare function warpStep(field: ConstellationField, dt: number): void;
63
+ /**
64
+ * Point the warp at a node INDEX (the live target-source seam). The focal node
65
+ * re-points to `idx`; the spring chases `nodes[idx]`'s LIVE position FROM the
66
+ * focal mark's CURRENT position (`warp.{x,y}`) — a continuous spring-eased path,
67
+ * never a snap. The component seeds `warp.{x,y}` at field-center on first layout,
68
+ * so even the first warp springs from a real start point. `idx < 0` clears the
69
+ * warp (the focal mark is removed). Re-pointing does NOT zero the velocity, so a
70
+ * mid-flight re-target curves smoothly toward the new node.
71
+ */
72
+ export declare function setWarpTarget(field: ConstellationField, idx: number): void;
73
+ /**
74
+ * Warp the focal node to the nearest drifting node to a canvas-LOCAL px point
75
+ * (the `warpTo(point)` primitive). The DEGENERATE case — the click's UNCONSTRAINED
76
+ * nearest node is already the current focal (cursor on/closest to the focal mark)
77
+ * — NO-OPS (returns the current focal; a click on yourself does not re-warp). Any
78
+ * OTHER click re-points to the nearest node, with the focal EXCLUDED from the
79
+ * candidate set (you never re-warp to yourself; the next-nearest wins). Returns
80
+ * the chosen node index, or `-1` when no eligible node exists. The component's
81
+ * `warpTo(clientX, clientY)` sugar maps client→local px via `toLocal` first.
82
+ */
83
+ export declare function warpTo(field: ConstellationField, px: number, py: number): number;
84
+ /**
85
+ * Is the warp spring ARRIVED on its target (AY.W-CON1)? True when there is no
86
+ * active target (`targetIdx < 0`) OR the focal's gap to its LIVE target node is
87
+ * within {@link WARP_SETTLE_BAND}. A click-warp in flight (hundreds of px out)
88
+ * reports NOT arrived, so a user click always PRE-EMPTS the auto-drift cadence
89
+ * (the wander only re-targets a spring that has reached its current node). The
90
+ * gate is POSITION-only by design — a critically-damped spring tracking a drifting
91
+ * node carries a non-zero steady-state velocity forever, so a velocity term would
92
+ * never clear on a live field.
93
+ */
94
+ export declare function warpSettled(field: ConstellationField): boolean;
95
+ /**
96
+ * Pick a random eligible node index for the auto-drift re-target (AY.W-CON1) —
97
+ * any node EXCEPT the current `focalIndex` (so the focal actually MOVES). `rng`
98
+ * is the seeded `() => number` in `[0, 1)`. A degenerate field (≤1 node, or only
99
+ * the current focal) returns the current focal, which `setWarpTarget` no-ops
100
+ * cleanly (no crash, no jump).
101
+ */
102
+ export declare function pickWanderTarget(field: ConstellationField, rng: () => number): number;
@@ -1,3 +1,5 @@
1
1
  export { default as Constellation } from "./Constellation.vue";
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";
2
+ export { seedField, stepField, refitField, BASE_WIDTH, } from "./constellationField";
3
+ export { stepWell, nearestNode, readInteractionConfig, warpStep, warpTo, setWarpTarget, warpSettled, pickWanderTarget, DEFAULT_WELL_CONFIG, DEFAULT_WANDER_IDLE, DEFAULT_WANDER_JITTER, WARP_RESPONSE, WARP_ZETA, } from "./constellationInteraction";
4
+ export { readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, DEFAULT_PALETTE, } from "./constellationDraw";
5
+ export type { ConstellationNode, ConstellationRipple, ConstellationPointer, ConstellationPalette, ConstellationField, ConstellationWarp, ConstellationWarpConfig, ConstellationWander, ConstellationWell, ConstellationWellConfig, ConstellationProps, } from "./constellationField";
@@ -13,11 +13,22 @@ type __VLS_Props = {
13
13
  * @default false
14
14
  */
15
15
  disableTransitions?: boolean;
16
+ /**
17
+ * Opt-in slow-ECLIPSE register: a LONG-PRESS (vs the normal click) flips
18
+ * the mode through an indulgent, stretched sun↔moon cross-fade — the
19
+ * `--toggle-eclipse-duration` (≈1600ms) over the default 750ms. The bare
20
+ * `@click` flip is UNCHANGED (the default-path canary). Under
21
+ * `prefers-reduced-motion: reduce` the long-press flips INSTANTLY (no
22
+ * eclipse). Default false — the toggle behaves exactly as before.
23
+ * @default false
24
+ */
25
+ eclipse?: boolean;
16
26
  };
17
27
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
18
28
  size: DarkModeToggleSize;
19
29
  passive: boolean;
20
30
  disableTransitions: boolean;
31
+ eclipse: boolean;
21
32
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
33
  declare const _default: typeof __VLS_export;
23
34
  export default _default;
@@ -1,111 +1,3 @@
1
- type DockDensity = "compact" | "comfortable" | "spacious" | "audacious";
2
- interface DockCommonProps {
3
- fitContent?: boolean;
4
- position?: "fixed" | "inline" | "sticky";
5
- alwaysExpanded?: boolean;
6
- /**
7
- * Corner treatment.
8
- * `"pill"` — the stadium silhouette (default).
9
- * `"rounded"` — a finite rounded radius (`--radius-xl`).
10
- * `"card"` — the AW.W3b big-dock card shell: a finite concentric
11
- * radius (`--dock-card-radius`, default `--radius-3xl`)
12
- * ABOVE 2xl, below pill — does NOT collapse to a stadium.
13
- * Collapsed it returns to a pill; the pill↔card swap
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.
20
- *
21
- * `"pill"`/`"rounded"` previously bound ONLY under the vertical rail
22
- * variant — on a horizontal dock the prop silently no-op'd. AW.W3b adds
23
- * the horizontal-root shape rules (closing that documented-but-dead prop),
24
- * so `shape` now paints on a horizontal dock too.
25
- */
26
- shape?: "pill" | "rounded" | "card";
27
- /**
28
- * Layout axis of the dock. `"horizontal"` (default) lays items out
29
- * left-to-right and animates `width`; `"vertical"` lays items out
30
- * top-to-bottom and animates `height`. IGNORED under `variant="rail"` /
31
- * `"instrument-strip"` (those force vertical by construction).
32
- */
33
- orientation?: "horizontal" | "vertical";
34
- /**
35
- * Density controls dock padding, gaps, layer height, and inherited
36
- * dock control sizing. Root CSS variables can override each density.
37
- */
38
- density?: DockDensity;
39
- /**
40
- * Overflow strategy when the expanded content exceeds the dock's
41
- * axis cap (`--dock-max-inline-size` horizontally,
42
- * `--dock-max-block-size` vertically). The ONE knob governing every
43
- * overflow behaviour (AT.W7-dock-a clean break — collapsed from the
44
- * prior `wrap` boolean + `overflow` pair + `containerName` clip-lift,
45
- * which all touched overflow divergently).
46
- * `"grow"` — content grows to fit then overflows visibly past
47
- * the cap (the default; nothing clips or scrolls).
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.
60
- * `"scroll"` — the dock becomes the scroll port. Horizontal docks
61
- * scroll the active layer on the inline axis
62
- * (`.dock-scroll-x`); vertical rails scroll on the
63
- * block axis (`.dock-scroll-y`), keeping the
64
- * `max-block-size` cap. The rounded pill masks the
65
- * scroll edge; the scrollbar is hidden. The axis is
66
- * chosen automatically from `orientation`.
67
- */
68
- overflow?: "grow" | "wrap" | "scroll";
69
- /**
70
- * When set, the dock root establishes an inline-size container query
71
- * subject (`container-type: inline-size; container-name: <value>`) so
72
- * descendants can query the named container via `@container <value>
73
- * (...)` rules. ORTHOGONAL to the `overflow` clip: opting into a
74
- * container subject does NOT silently change the dock's clip shell
75
- * (AT.W7-dock-a — the prior clip-lift was folded out; use
76
- * `overflow="wrap"` to allow multi-line content).
77
- *
78
- * T.B audit §1.3 cornerstone: the cluster's container subject must
79
- * live on the dock primitive, never on a descendant whose intrinsic
80
- * size the dock relies on.
81
- */
82
- containerName?: string;
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
1
  declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {}, __VLS_14: {};
110
2
  type __VLS_Slots = {} & {
111
3
  persistent?: (props: typeof __VLS_1) => any;
@@ -118,7 +10,7 @@ type __VLS_Slots = {} & {
118
10
  } & {
119
11
  collapsed?: (props: typeof __VLS_14) => any;
120
12
  };
121
- declare const __VLS_base: import("vue").DefineComponent<DockVariantProps | DockRailProps, {
13
+ declare const __VLS_base: import("vue").DefineComponent<import("./composables/useDockShellProps").DockVariantProps | import("./composables/useDockShellProps").DockRailProps, {
122
14
  expanded: import("vue").Ref<boolean, boolean>;
123
15
  isPinned: import("vue").Ref<boolean, boolean>;
124
16
  isHeld: import("vue").ComputedRef<boolean>;
@@ -127,7 +19,7 @@ declare const __VLS_base: import("vue").DefineComponent<DockVariantProps | DockR
127
19
  collapse: () => void;
128
20
  keepOpen: () => void;
129
21
  release: () => void;
130
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DockVariantProps | DockRailProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("./composables/useDockShellProps").DockVariantProps | import("./composables/useDockShellProps").DockRailProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
131
23
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
132
24
  declare const _default: typeof __VLS_export;
133
25
  export default _default;
@@ -1,4 +1,40 @@
1
1
  import type { Ref } from "vue";
2
+ /**
3
+ * AX.W02 — ONE morph orchestrator per dock. The dock is a single morph stack
4
+ * whose active "layer" is `(expandedState × activePane)`: the outer
5
+ * collapse↔expand swap and the inner `<DockLayerGroup>` pane swaps are
6
+ * transitions in the SAME group — ONE spring, ONE scalar (`--dock-morph-t`,
7
+ * established by W01), ONE clock. No second engine.
8
+ *
9
+ * Re-derived from first principles on W01's settled single-scalar substrate:
10
+ * - `--dock-morph-t` is written to the `.glass-dock` root and INHERITS to every
11
+ * descendant (dock.css `@property … inherits:true`), so ONE spring writing
12
+ * that one scalar drives EVERY registered container's size calc at once.
13
+ * - Each morphing container carries its OWN `--dock-morph-from`/`--dock-morph-to`
14
+ * px span (the allowed one-time FLIP measurement) and interpolates it against
15
+ * the shared scalar — `from + (to − from) · t`. So a simultaneous
16
+ * collapse + pane-swap reads as one continuous spring: the box, the nested
17
+ * stack, and every child stagger ramp on the same `t`.
18
+ *
19
+ * The orchestrator OWNS one `SpringProgress`. The OUTER collapse↔expand pair
20
+ * registers as a target; a NESTED `<DockLayerGroup>` registers a SECOND target
21
+ * instead of minting its own `useLayerTransition` engine. A re-toggle mid-flight
22
+ * re-bases the live solver onto the new span from its current velocity (the iOS
23
+ * interruptible-physics contract W01 keeps), so even an interrupted morph stays
24
+ * one continuous trajectory.
25
+ *
26
+ * This is the dock-flavored first instance of the general `MorphGroup` /
27
+ * `GlassEffectContainer` facility (the iOS-26 Liquid-Glass corpus, facet 26 —
28
+ * the `provideMorphGroup` two-part seam: a per-element driver + a provide/inject
29
+ * orchestrator). AX.W42 generalizes it; W02 establishes the seam it builds on.
30
+ *
31
+ * LIGHT-surface only: `SpringProgress` owns its own rAF via `.play(onFrame)` and
32
+ * carries no static value.js edge — never import `AnimationGroup` / `./engine`
33
+ * (that pulls value.js into the dock bundle).
34
+ *
35
+ * The `DOCK_SPRING` tuning this orchestrator drives is the ONE authority shared with
36
+ * `useLayerTransition` — it lives in `../constants` (the feature-dir constants home).
37
+ */
2
38
  export interface DockMorphGroupRegistration {
3
39
  /** The container element owning this group's grid-stacked panes. */
4
40
  containerEl: Ref<HTMLElement | null>;
@@ -0,0 +1,15 @@
1
+ import { type Ref } from "vue";
2
+ /** The morph-window handlers the GlassDock SFC wires. */
3
+ export interface DockMorphWindow {
4
+ markTransitioning: () => void;
5
+ onDockTransitionDone: (event: TransitionEvent) => void;
6
+ clearTransitionTimer: () => void;
7
+ }
8
+ /**
9
+ * Own the `isTransitioning` flag's morph-window lifecycle. `markTransitioning`
10
+ * (every `visualExpanded` flip) bumps a private generation so any in-flight
11
+ * morph's pending timer / `transitionend` self-cancels (the A→B→A no-skip /
12
+ * no-queue invariant); `onDockTransitionDone` resolves the flag on a resize-morph
13
+ * property finishing. Clears its timer on unmount.
14
+ */
15
+ export declare function useDockMorphWindow(dockEl: Ref<HTMLElement | null>, isTransitioning: Ref<boolean>): DockMorphWindow;