@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
@@ -55,15 +55,24 @@ export interface SatelliteInternal {
55
55
  endX: number;
56
56
  endY: number;
57
57
  }
58
- /** Externally tunable blob configuration — all fields concrete, defaults applied via `BLOB_CONFIG_DEFAULTS`. */
59
- export interface BlobConfig {
58
+ /** Body / orbit / satellite geometry — the contained-droplet length cohort (W15). */
59
+ export interface BlobGeometry {
60
60
  canvasSize: number;
61
61
  bodyRadius: number;
62
62
  satelliteCount: number;
63
63
  satelliteRadius: number;
64
64
  orbitRadius: number;
65
- quality: BlobQuality;
66
- tempo: number;
65
+ eccentricity: number;
66
+ }
67
+ /** Satellite merge/absorb/emerge/orbit lifecycle DURATIONS (ms). */
68
+ export interface BlobSatelliteTiming {
69
+ mergeDuration: number;
70
+ absorbedDuration: [number, number];
71
+ emergeDuration: number;
72
+ orbitDuration: [number, number];
73
+ }
74
+ /** The living membrane — smin merge + surface noise/warp + pulsation. */
75
+ export interface BlobMembrane {
67
76
  smoothK: number;
68
77
  /** Smin merge variant — `quadratic` (default) | `circular` (rounder menisci). */
69
78
  merge: BlobMerge;
@@ -77,12 +86,29 @@ export interface BlobConfig {
77
86
  warpAmp: number;
78
87
  pulseFreq: number;
79
88
  pulseAmp: number;
89
+ }
90
+ /** Palette + OKLCh color-perturbation atom. */
91
+ export interface BlobColor {
92
+ paletteStops: string[];
80
93
  hueRange: number;
81
94
  satShift: number;
82
95
  brightnessShift: number;
83
96
  colorNoiseFreq: number;
84
97
  colorNoiseSpeed: number;
85
- paletteStops: string[];
98
+ }
99
+ /** The lit-glass surface — Blinn-Phong glint + Fresnel rim + iridescence/SSS/core-glow. */
100
+ export interface BlobSurface {
101
+ lit: boolean;
102
+ /** CSS color for the Fresnel rim tint (resolved through the `/color` leaf). */
103
+ rimColor: string;
104
+ /** Light direction [x, y, z] (normalized in-shader). */
105
+ lightDir: [number, number, number];
106
+ specStrength: number;
107
+ /** Specular exponent (16-64 — a tight glint). */
108
+ specShininess: number;
109
+ /** Fresnel/Schlick exponent (~2-3). */
110
+ rimPower: number;
111
+ rimStrength: number;
86
112
  /** Warm-pearl rim sheen weight (0 = off). */
87
113
  iridescence: number;
88
114
  /** Base hue (degrees) the warm-biased cosine palette centres on. */
@@ -95,31 +121,39 @@ export interface BlobConfig {
95
121
  sssPower: number;
96
122
  /** Thickness-driven inner-luminosity (core glow) lift. */
97
123
  coreGlow: number;
98
- lit: boolean;
99
- /** CSS color for the Fresnel rim tint (resolved through the ColorResolver). */
100
- rimColor: string;
101
- /** Light direction [x, y, z] (normalized in-shader). */
102
- lightDir: [number, number, number];
103
- specStrength: number;
104
- /** Specular exponent (16-64 — a tight glint). */
105
- specShininess: number;
106
- /** Fresnel/Schlick exponent (~2-3). */
107
- rimPower: number;
108
- rimStrength: number;
124
+ }
125
+ /** Pointer interaction — lean / squash-stretch / click-impulse. */
126
+ export interface BlobInteraction {
109
127
  pointerAttraction: number;
110
128
  pointerStrength: number;
111
- /** Velocity-driven volume-preserving squash-and-stretch magnitude (0 = off). */
129
+ /**
130
+ * Velocity-driven volume-preserving squash-and-stretch magnitude (0 = off).
131
+ *
132
+ * AY.W-BLOB-CONFIG D3 — a SWAMPED fine-detail axis. The squash rides the smoothed
133
+ * spring velocity (`useBlobPointer`'s critically-damped `response: 0.18` follow),
134
+ * which is heavily damped and down-scaled into body space — so the tanh-saturated
135
+ * elongation reads at the noise floor (a live readback measured 0% body-aspect change
136
+ * between `stretch=0` and `stretch=1.5`). It is NOT a primary axis: it adds a subtle
137
+ * elongation on a FAST flick over the much louder lean/follow/pseudopod channel that
138
+ * dominates the deformation. Kept (the volume-preserving map is correct and lands a
139
+ * whisper on the fastest flicks) but DEMOTED — the demo no longer surfaces it as a
140
+ * top-level slider (the flick blurb is honest-down to match). A consumer that wants a
141
+ * pronounced taffy-pull raises this AND uncouples the velocity from the spring smooth.
142
+ */
112
143
  stretch: number;
113
144
  /** Click spring-impulse amplitude (a one-shot bouncy pulse on the body radius). */
114
145
  clickImpulse: number;
115
- eccentricity: number;
116
- orbitSpeedScale: number;
117
- wobbleScale: number;
118
- mergeRate: number;
119
- mergeDuration: number;
120
- absorbedDuration: [number, number];
121
- emergeDuration: number;
122
- orbitDuration: [number, number];
146
+ }
147
+ /** Externally tunable blob configuration — EIGHT cohesive atoms, defaults via `BLOB_CONFIG_DEFAULTS`. */
148
+ export interface BlobConfig {
149
+ geometry: BlobGeometry;
150
+ satellites: BlobSatelliteTiming;
151
+ membrane: BlobMembrane;
152
+ color: BlobColor;
153
+ surface: BlobSurface;
154
+ interaction: BlobInteraction;
155
+ quality: BlobQuality;
156
+ tempo: number;
123
157
  }
124
158
  export declare const BLOB_CONFIG_DEFAULTS: BlobConfig;
125
159
  export declare const BLOB_CONFIG_KEY: InjectionKey<BlobConfig>;
@@ -28,8 +28,8 @@ export type InstrumentChassisVariant = "glass" | "spine";
28
28
  * the `<ChassisDivider>` adjacent to each — emit markup only when bound.
29
29
  * I gate `<header>`, `<footer>`, and the two dividers on `$slots.strip` /
30
30
  * `$slots.control` presence, so empty-slot consumers don't have to suppress
31
- * the markup with `display: none` overrides. Mirrors the `v-if="$slots.status"`
32
- * idiom InstrumentRail established.
31
+ * the markup with `display: none` overrides — the `v-if="$slots.status"`
32
+ * slot-gating idiom.
33
33
  *
34
34
  * The chassis owns the `--phase-color` cascade via `data-phase`; phase label,
35
35
  * hero number, and phase progress fill all read it through one CSS custom
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Fallback for `--tab-indicator-max-stretch` when the cascade leaves it unset — the
3
+ * default ≈+8% travel-squish cap (AX.W53). `--stretch = 1 + frac · (cap − 1)`, so a
4
+ * full-width jump reaches the cap and a tiny hop stays near 1. The token is the
5
+ * authority; this is the no-token floor.
6
+ */
7
+ export declare const DEFAULT_INDICATOR_MAX_STRETCH = 1.08;
8
+ /**
9
+ * ms after the stretch opens before it releases back to fit (`--stretch → 1`) — the
10
+ * Material "grow then shrink" close. Rides the same snappy glide clock as the travel.
11
+ */
12
+ export declare const INDICATOR_RELEASE_MS = 60;
@@ -0,0 +1,84 @@
1
+ import type { TimingFunction } from "@mkbabb/keyframes.js";
2
+ import type { GlassUnderlinePaths } from "./types";
3
+ type __VLS_Props = {
4
+ /**
5
+ * Which clock drives the draw. `load` (default) — the draw is a
6
+ * `NumericAnimation` the parent's load `Sequence` fires once via `play()`.
7
+ * `scroll` — native `view()` keyframes, bidirectional, no JS. `static` —
8
+ * set drawn, no clock.
9
+ */
10
+ clock?: "load" | "scroll" | "static";
11
+ /**
12
+ * The render variant. `pen` is the only PROVEN, filter-free render.
13
+ * pencil | crayon | boil are UNPROVEN headroom — the API seam for a future
14
+ * wave, NOT shipped here (they render pen today).
15
+ */
16
+ variant?: "pen" | "pencil" | "crayon" | "boil";
17
+ /** The stroke colour. Defaults to `var(--primary)` (re-resolves under .dark). */
18
+ color?: string;
19
+ /** The load-clock draw duration (ms). Default 700. */
20
+ drawMs?: number;
21
+ /**
22
+ * The load-clock easing. Default `easeOutCubic` — doctrine-compliant (DEC-6):
23
+ * ink is an irreversible additive reveal, so an overshooting spring would lay
24
+ * ink past the end then retract it (the "never overshoot past gone" logic).
25
+ * The value.js `TimingFunction` type (already a peer) serves a consumer's own
26
+ * decelerating register (e.g. an expo).
27
+ */
28
+ easing?: TimingFunction;
29
+ /**
30
+ * The scroll-clock timeline name (DEC-5). Default the element's own `view()`.
31
+ * Bound as `--gu-timeline`; the CSS reads `animation-timeline:
32
+ * var(--gu-timeline, view())`. A consumer (`--beat-tl`, a named scroll
33
+ * timeline) passes its own.
34
+ */
35
+ timeline?: string;
36
+ /**
37
+ * The declarative third clock (DEC-2). A thin overlay ON the load clock:
38
+ * `undefined` (default) = source parity (seeds undrawn, parent fires
39
+ * `play()`); bound: rising edge → play() (under PRM → snap()), falling edge
40
+ * → reset to undrawn so re-activation REPLAYS, mount with `true` → plays.
41
+ * Only meaningful with `clock="load"` (the other clocks rest drawn).
42
+ */
43
+ active?: boolean;
44
+ /**
45
+ * The geometry escape (DEC-7). The FULL geometry tuple
46
+ * `{ stroke, ghost?, viewBox?, len? }` — a bare `d`-string escape silently
47
+ * breaks the dash model when the consumer geometry's viewBox/length differ.
48
+ * Defaults to the canonical pen + ghost.
49
+ */
50
+ paths?: GlassUnderlinePaths;
51
+ };
52
+ /**
53
+ * CLOCK A — draw the underline ONCE. The awaitable a parent's load `Sequence` fires
54
+ * as a causal link. Resolves a Promise so the Sequence can `await` it; under PRM it
55
+ * snaps to drawn in one paint and resolves immediately. A no-op for scroll/static.
56
+ */
57
+ declare function play(): Promise<void>;
58
+ /** Snap to terminal (drawn) — the PRM / interrupt path. */
59
+ declare function snap(): void;
60
+ declare var __VLS_1: {};
61
+ type __VLS_Slots = {} & {
62
+ default?: (props: typeof __VLS_1) => any;
63
+ };
64
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {
65
+ play: typeof play;
66
+ snap: typeof snap;
67
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
68
+ active: boolean;
69
+ variant: "pen" | "pencil" | "crayon" | "boil";
70
+ color: string;
71
+ clock: "load" | "scroll" | "static";
72
+ drawMs: number;
73
+ easing: TimingFunction;
74
+ timeline: string;
75
+ paths: GlassUnderlinePaths;
76
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
77
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
78
+ declare const _default: typeof __VLS_export;
79
+ export default _default;
80
+ type __VLS_WithSlots<T, S> = T & {
81
+ new (): {
82
+ $slots: S;
83
+ };
84
+ };
@@ -0,0 +1,2 @@
1
+ export { default as GlassUnderline } from "./GlassUnderline.vue";
2
+ export type { GlassUnderlineClock, GlassUnderlineVariant, GlassUnderlinePaths, GlassUnderlineProps, GlassUnderlineExpose, } from "./types";
@@ -0,0 +1,56 @@
1
+ import type { TimingFunction } from "@mkbabb/keyframes.js";
2
+ /** Which clock drives the draw. */
3
+ export type GlassUnderlineClock = "load" | "scroll" | "static";
4
+ /**
5
+ * The render variant. `pen` is the only PROVEN, filter-free render (the masthead
6
+ * invariant). pencil | crayon | boil are UNPROVEN headroom — the API seam for a
7
+ * future wave, NOT shipped (they render pen today).
8
+ */
9
+ export type GlassUnderlineVariant = "pen" | "pencil" | "crayon" | "boil";
10
+ /**
11
+ * The geometry escape tuple (DEC-7). Carries the FULL geometry so an escaped path
12
+ * stays dash-coherent — a bare `d`-string escape silently breaks the dash model when
13
+ * the consumer geometry's viewBox/length differ from the canonical
14
+ * (`0 0 100 10` + `len` 120).
15
+ */
16
+ export interface GlassUnderlinePaths {
17
+ /** The primary pen stroke `d`. */
18
+ readonly stroke: string;
19
+ /** The faint ghost overdraw `d`. Omit for a single-path (no overdraw) render. */
20
+ readonly ghost?: string;
21
+ /** The SVG viewBox. Default `0 0 100 10`. */
22
+ readonly viewBox?: string;
23
+ /** The dasharray length (the over-long fixed dash). Default `120`. */
24
+ readonly len?: number;
25
+ }
26
+ /** GlassUnderline props (the public prop surface). */
27
+ export interface GlassUnderlineProps {
28
+ /** Which clock drives the draw. Default `load`. */
29
+ clock?: GlassUnderlineClock;
30
+ /** The render variant. Default `pen` (the only proven render). */
31
+ variant?: GlassUnderlineVariant;
32
+ /** The stroke colour. Default `var(--primary)` (re-resolves under `.dark`). */
33
+ color?: string;
34
+ /** The load-clock draw duration (ms). Default `700`. */
35
+ drawMs?: number;
36
+ /** The load-clock easing (value.js `TimingFunction`). Default `easeOutCubic`. */
37
+ easing?: TimingFunction;
38
+ /** The scroll-clock timeline name. Default the element's own `view()`. */
39
+ timeline?: string;
40
+ /**
41
+ * The declarative third clock — a thin overlay ON the load clock. `undefined`
42
+ * (default) = source parity (parent fires `play()`); rising edge → play, falling
43
+ * edge → reset-to-undrawn (re-rise REPLAYS), mount-`true` → plays. Only
44
+ * meaningful with `clock="load"`.
45
+ */
46
+ active?: boolean;
47
+ /** The geometry escape tuple. Defaults to the canonical pen + ghost. */
48
+ paths?: GlassUnderlinePaths;
49
+ }
50
+ /** The imperative handle exposed via `defineExpose` / a template ref. */
51
+ export interface GlassUnderlineExpose {
52
+ /** Draw the load-clock underline once (the awaitable a Sequence chains). */
53
+ play: () => Promise<void>;
54
+ /** Snap to terminal (drawn) — the PRM / interrupt path. */
55
+ snap: () => void;
56
+ }
@@ -39,6 +39,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
39
39
  "onUpdate:activeSnapPoint"?: ((val: string | number) => any) | undefined;
40
40
  }>, {
41
41
  mode: DrawerMode;
42
+ open: boolean;
42
43
  modal: boolean;
43
44
  shouldScaleBackground: boolean;
44
45
  snapPoints: (number | string)[];
@@ -3,9 +3,9 @@ import { type DropdownMenuSubContentProps } from 'reka-ui';
3
3
  type __VLS_Props = DropdownMenuSubContentProps & {
4
4
  class?: HTMLAttributes['class'];
5
5
  };
6
- declare var __VLS_8: {};
6
+ declare var __VLS_14: {};
7
7
  type __VLS_Slots = {} & {
8
- default?: (props: typeof __VLS_8) => any;
8
+ default?: (props: typeof __VLS_14) => any;
9
9
  };
10
10
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
11
11
  escapeKeyDown: (event: KeyboardEvent) => any;
@@ -9,28 +9,35 @@ export { default as Slider } from './Slider.vue';
9
9
  * `.slider-thumb` paint. The size axis lifts pure geometry via CSS vars
10
10
  * (`--slider-track-height`, `--slider-thumb-size`) the SFC defaults read.
11
11
  *
12
- * Exactly two canonical recipes ship (AX.W59 redesign):
13
- * standard — the INTEGRATED-CYLINDER glass slider: the fill is ONE
14
- * continuous glass rounded-pill (W52 backdrop + edge rim, tinted
15
- * to `--primary`) pulled left/right; its rounded LEADING edge IS
16
- * the grab. There is NO visible demarcation between thumb and
17
- * fill — the reka SliderThumb stays mounted (a11y/keyboard/focus)
18
- * but is styled as the cylinder's slim leading CAP (a faint
19
- * specular grip, not a detached circle). Halo-on-state + the iOS
20
- * press spring. This is the general-purpose glass scrubber and
21
- * the default.
12
+ * Exactly two canonical recipes ship:
13
+ * standard — the CONTINUOUS GLASS CYLINDER with NO VISIBLE THUMB AT ALL (the
14
+ * user's binding bar, USER-AUDIT-2026-06-10 §B3): you pull the TRACK
15
+ * itself. A THICK glass capsule track; the filled `.slider-range`
16
+ * glass cylinder (the W52 liquid-glass material — backdrop + edge rim,
17
+ * tinted to `--primary`) is pulled along it, and its leading EDGE IS
18
+ * the handle — the only affordance is the fill edge + the cursor/touch
19
+ * response. The reka `<SliderThumb>` STAYS MOUNTED (a11y/keyboard/drag/
20
+ * value-follow native on it) but paints INVISIBLE: width 0, opacity 0,
21
+ * transparent — no distinct disc/cap/ring over the continuous
22
+ * cylinder. Keyboard focus rings the TRACK (the W-PRIM-POLISH focus
23
+ * register), not the invisible thumb; hover/held lift the track FILL's
24
+ * edge rim; the iOS press spring gives the whole fill a felt squish.
25
+ * This is the general-purpose glass scrubber and the default.
22
26
  * spectrum — the value.js gradient-track color slider: a tall capsule whose
23
27
  * background is a consumer-supplied `--slider-track-bg`
24
28
  * linear-gradient (the LCH/hue ramp), a transparent range, and a
25
- * SQUIRCLE thumb the HEIGHT of the track (the iOS color-picker
26
- * idiom — `corner-shape: superellipse()` via `--corner-shape-thumb`,
27
- * @supports-gated over a `--radius-lg` round fallback). This is the
28
- * aurora/blob color-picking surface.
29
+ * THIN VISIBLE squircle thumb the HEIGHT of the track (the iOS/value.js
30
+ * color-picker idiom — a slim vertical bar, `w-3`-thin per the value.js
31
+ * reference; `corner-shape: superellipse()` via `--corner-shape-thumb`,
32
+ * @supports-gated over a generous proportional round fallback that
33
+ * reads squircle-adjacent cross-engine). This is the aurora/blob
34
+ * color-picking surface — its thumb IS visible (it is the handle).
29
35
  *
30
- * Sizes:
31
- * sm — 4px track / 12px thumb
32
- * md — 6px track / 16px thumb (default; matches HEAD)
33
- * lg — 12px track / 24px thumb
36
+ * Sizes — the standard cylinder is the thick glass capsule (the invisible thumb's
37
+ * value-follow inset still rides the size token for the 44px coarse hit-halo):
38
+ * sm — 12px track
39
+ * md — 20px track (default)
40
+ * lg — 28px track
34
41
  */
35
42
  export declare const sliderVariants: (props?: ({
36
43
  variant?: "standard" | "spectrum" | null | undefined;
@@ -19,7 +19,7 @@ type ToasterToast = Toast & {
19
19
  description?: string;
20
20
  action?: Component | VNode;
21
21
  open?: boolean;
22
- onOpenChange?: (open: boolean) => void;
22
+ 'onUpdate:open'?: (open: boolean) => void;
23
23
  };
24
24
  type ToastOptions = Omit<ToasterToast, 'id'>;
25
25
  declare function toast(props: ToastOptions): {
@@ -160,7 +160,7 @@ declare function useToast(): {
160
160
  | undefined;
161
161
  duration?: number | undefined;
162
162
  open?: boolean | undefined;
163
- onOpenChange?: ((open: boolean) => void) | undefined;
163
+ 'onUpdate:open'?: ((open: boolean) => void) | undefined;
164
164
  }[]>;
165
165
  toast: typeof toast;
166
166
  dismiss: (toastId?: string) => void;
@@ -5,9 +5,13 @@ export interface OklchStop {
5
5
  h: number;
6
6
  }
7
7
  /**
8
- * The injected color seam (DEC-AT-2, consumed by the AU.W7 blob). Resolves a CSS
9
- * color string to a GAMMA-sRGB triple in [0,1]. `defaultBlobColorResolver` is the
10
- * opt-in default; a consumer (value.js) may inject its own.
8
+ * A color seam: resolves a CSS color string to a GAMMA-sRGB triple in [0,1].
9
+ * `defaultBlobColorResolver` is the shipped default. A general-purpose injection
10
+ * type — the `<FourierField>` background takes it as a REQUIRED `colorResolver`
11
+ * prop (the SVG-field surface owns its own color pipeline). The goo-blob no longer
12
+ * injects it: it resolves color internally through `cssToOklch → oklchToGammaRgb`
13
+ * (W-BLOB3 STRIPPED the speculative DI built for an absent value.js consumer that
14
+ * never repatriated; see `docs/consumer-evidence/goo-blob.md`).
11
15
  */
12
16
  export type ColorResolver = (css: string) => [number, number, number];
13
17
  /**
@@ -60,10 +64,11 @@ export declare function cssToOklch(css: string): OklchStop;
60
64
  /** OKLCh stop → `#rrggbb` gamma hex (value.js `oklabToRgb255`). */
61
65
  export declare function oklchStopToHex(s: OklchStop): string;
62
66
  /**
63
- * The OPT-IN default `ColorResolver` — `(css) => gamma [r,g,b]` via
64
- * `cssToOklch → oklchToGammaRgb`. The AU.W7 goo-blob requires an INJECTED resolver
65
- * and throws by THIS name on a no-resolver mount (the loud failure, not a silent
66
- * gray default); value.js supplies its own, the demo story uses this one.
67
+ * The shipped default `ColorResolver` — `(css) => gamma [r,g,b]` via
68
+ * `cssToOklch → oklchToGammaRgb` (the GAMMA exit; `proof:blob-space-gamma` witnesses
69
+ * the `oklchToGammaRgb` resolve). The `<FourierField>` background passes THIS as its
70
+ * `colorResolver` prop. The goo-blob inlines this exact body internally (W-BLOB3 —
71
+ * no DI seam).
67
72
  */
68
73
  export declare const defaultBlobColorResolver: ColorResolver;
69
74
  /**
@@ -104,6 +109,18 @@ export interface DeriveBlobPaletteOptions {
104
109
  hueSpread?: number;
105
110
  /** Midpoint chroma-bump (keeps a vivid pair off the grey midpoint). Default ~0.03. */
106
111
  chromaBump?: number;
112
+ /**
113
+ * AY.W-COHERE E1 — the OKLCh-chroma CEILING on every derived stop (OKLCh C
114
+ * units). When set, each stop's chroma is clamped to AT MOST this value AFTER
115
+ * the midpoint bump and BEFORE the gamut-map — so the seed→palette derivation
116
+ * can never amplify a vivid seed into the neon register the shader's
117
+ * SSS/iridescence then over-drives. This is a CHROMA CAP, not a hue re-map: a
118
+ * blue seed stays blue, just bounded to the non-neon chroma. `undefined` (the
119
+ * default) leaves the derivation byte-identical to HEAD. The blob substrate
120
+ * caps the MOOD/seed path into the warm-register band the FourierField comet +
121
+ * the constellation focal share (the set-cohesion accent identity).
122
+ */
123
+ chromaCeiling?: number;
107
124
  }
108
125
  /**
109
126
  * Seed ONE color into a harmonious, gamut-safe 2-4-stop OKLCh palette for the blob
@@ -21,13 +21,22 @@ import { ref, type CSSProperties } from "vue";
21
21
  *
22
22
  * PRM-aware: under `prefers-reduced-motion: reduce` the seam DOES NOT write the
23
23
  * position (the CSS half pins the catch-light static at the centred `50%`
24
- * fallback). The write is style-only — no reflow, no re-render — and inert until
25
- * the user actually moves the pointer over a wired host.
24
+ * fallback). The PRM signal is read from a SINGLE cached `matchMedia` listener
25
+ * minted once at composable setup (NOT a fresh `matchMedia` per pointer event) —
26
+ * the AV.W7 `useWebGLCanvas` substrate pattern.
27
+ *
28
+ * AY.W-A11Y-PERF O-3 — the pointer write is rAF-COALESCED: `onPointerMove` only
29
+ * stashes the raw event + schedules ONE `requestAnimationFrame`; the rAF callback
30
+ * does the single `getBoundingClientRect()` + style write, so a 120–1000 Hz pointer
31
+ * collapses to ONE batched layout read + ONE style write per animation frame (under
32
+ * W54 maximal-glass every blurred-surface repaint is amortized to the frame, not the
33
+ * event). The composable cancels the pending rAF + removes the matchMedia listener on
34
+ * scope dispose (cleanup discipline).
26
35
  */
27
36
  export interface UseSpecularTracking {
28
37
  /** Bind to the host element's `:style`. Carries the `--mouse-x/--mouse-y` write. */
29
38
  specularStyle: ReturnType<typeof ref<CSSProperties>>;
30
- /** Bind to the host's `@pointermove`. Writes the cursor position (PRM-gated). */
39
+ /** Bind to the host's `@pointermove`. Schedules the rAF-coalesced position write (PRM-gated). */
31
40
  onPointerMove: (event: PointerEvent) => void;
32
41
  }
33
42
  export declare function useSpecularTracking(): UseSpecularTracking;
@@ -1,10 +1,5 @@
1
1
  export declare const OETF_GLSL = "\nfloat srgbToLinearCh(float c) {\n return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4);\n}\nvec3 srgbToLinear(vec3 c) {\n return vec3(srgbToLinearCh(c.r), srgbToLinearCh(c.g), srgbToLinearCh(c.b));\n}\n\nfloat linearToSrgbCh(float c) {\n return c <= 0.0031308 ? c * 12.92 : 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\nvec3 linearToSrgb(vec3 c) {\n return vec3(linearToSrgbCh(c.r), linearToSrgbCh(c.g), linearToSrgbCh(c.b));\n}";
2
2
  export declare const FBM_ROT_GLSL = "const mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);";
3
3
  export declare const OKLCH_MATRICES_GLSL = "\n// value.js LINEAR_SRGB_TO_LMS (constants.ts), row-major; written here as GLSL\n// columns (= the transpose) so mat3 * vec3 evaluates the row-major M\u00B7v.\nconst mat3 LINEAR_SRGB_TO_LMS = mat3(\n 0.4122214708, 0.2119034982, 0.0883024619,\n 0.5363325363, 0.6806995451, 0.2817188376,\n 0.0514459929, 0.1073969566, 0.6299787005\n);\n\n// value.js srgbToOKLab's INLINE LMS\u2192OKLab coefficients (gamut.ts lines 295-297 \u2014\n// these differ at the ~1e-9 digit from LMS_TO_OKLAB_MATRIX; use the inline ones to\n// mirror the exact value.js path), row-major \u2192 GLSL columns.\nconst mat3 LMS_TO_OKLAB = mat3(\n 0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660\n);\n\n// value.js OKLAB_TO_LMS_COEFF (constants.ts), row-major \u2192 GLSL columns. Rows:\n// l = [1, 0.3963377774, 0.2158037573], m = [1, -0.1055613458, -0.0638541728],\n// s = [1, -0.0894841775, -1.2914855480].\nconst mat3 OKLAB_TO_LMS = mat3(\n 1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480\n);\n\n// value.js LMS_TO_LINEAR_SRGB (constants.ts), row-major \u2192 GLSL columns.\nconst mat3 LMS_TO_LINEAR_SRGB = mat3(\n 4.0767416621, -1.2684380046, -0.0041960863,\n -3.3077115913, 2.6097574011, -0.7034186147,\n 0.2309699292, -0.3413193965, 1.7076147010\n);\n\n// Gamma sRGB \u2192 raw OKLab (L, a, b). Mirrors value.js srgbToOKLab.\nvec3 srgbToOklab(vec3 c) {\n vec3 lin = srgbToLinear(c);\n vec3 lms = LINEAR_SRGB_TO_LMS * lin;\n vec3 lmsCbrt = sign(lms) * pow(abs(lms), vec3(1.0 / 3.0));\n return LMS_TO_OKLAB * lmsCbrt;\n}\n\n// Raw OKLab (L, a, b) \u2192 linear sRGB. Mirrors value.js oklabToLinearSRGB.\nvec3 oklabToLinearSrgb(vec3 lab) {\n vec3 lms_ = OKLAB_TO_LMS * lab;\n vec3 lms = lms_ * lms_ * lms_;\n return LMS_TO_LINEAR_SRGB * lms;\n}\n\n// OKLab \u2192 OKLCh: H in RADIANS. Mirrors value.js rawOklabToOklch (which returns\n// degrees; we stay in radians and only fold to [0, 2pi)).\nvec3 oklabToOklch(vec3 lab) {\n float C = length(lab.yz);\n float H = atan(lab.z, lab.y);\n if (H < 0.0) H += 2.0 * PI;\n return vec3(lab.x, C, H);\n}\n\n// OKLCh (H radians) \u2192 OKLab. Mirrors value.js rawOklchToOklab.\nvec3 oklchToOklab(vec3 lch) {\n return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}";
4
- export declare const PALETTE_RAMP_GLSL = "\n// value.js interpolateHue in the NORMALIZED-TURNS domain (h_rad/TAU \u2192 turns, the\n// exact .5/+1.0 branch per method, fract() wrap, *TAU back). A radians-native port\n// (PI thresholds / +TAU wrap) diverges 180\u00B0 at the antipode. methods: 0 shorter,\n// 1 longer, 2 increasing, 3 decreasing.\nfloat interpolateHueTurns(float h0, float h1, float t, int method) {\n float TAU = 2.0 * PI;\n float a = h0 / TAU;\n float b = h1 / TAU;\n float i = b - a;\n if (method == 0) { // shorter\n if (i > 0.5) a += 1.0; else if (i < -0.5) b += 1.0;\n } else if (method == 1) { // longer\n if (i > 0.0 && i < 0.5) a += 1.0; else if (i > -0.5 && i <= 0.0) b += 1.0;\n } else if (method == 2) { // increasing\n if (i < 0.0) b += 1.0;\n } else { // decreasing\n if (i > 0.0) a += 1.0;\n }\n float r = a + t * (b - a);\n r = fract(r); // (r % 1 + 1) % 1 \u2014 fract is non-negative in GLSL\n return r * TAU; // back to radians\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLab-rectangular interpolation \u2192 linear sRGB. Holds\n// chroma across the ramp (no grey midpoint). The default/shorter ramp path.\nvec3 mixPaletteOklab(vec3 linA, vec3 linB, float t) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lab = mix(labA, labB, t);\n return oklabToLinearSrgb(lab);\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLCh interpolation along the huePath arc \u2192 linear\n// sRGB. L and C lerp; H walks the chosen arc. The deliberate-rainbow path.\nvec3 mixPaletteOklchArc(vec3 linA, vec3 linB, float t, int method) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lchA = oklabToOklch(labA);\n vec3 lchB = oklabToOklch(labB);\n float L = mix(lchA.x, lchB.x, t);\n float C = mix(lchA.y, lchB.y, t);\n float H = interpolateHueTurns(lchA.z, lchB.z, t, method);\n return oklabToLinearSrgb(oklchToOklab(vec3(L, C, H)));\n}\n\n// The ramp dispatcher both samplePalette ports splice. tRaw is the raw inter-stop\n// parameter [0,1]; the smoothstep ease + the huePath branch live HERE so the GLSL\n// and WGSL ramps are character-for-character one source. increasing(2)/decreasing(3)\n// take the OKLCh hue-arc (rainbow sweep); every other method takes the OKLab-\n// rectangular straight line (no hue detour).\nvec3 samplePaletteRamp(vec3 a, vec3 b, float tRaw, int huePath) {\n float t = smoothstep(0.0, 1.0, tRaw);\n if (huePath == 2 || huePath == 3) {\n return mixPaletteOklchArc(a, b, t, huePath);\n }\n return mixPaletteOklab(a, b, t);\n}";
4
+ export declare const PALETTE_RAMP_GLSL = "\n// value.js interpolateHue in the NORMALIZED-TURNS domain (h_rad/TAU \u2192 turns, the\n// exact .5/+1.0 branch per method, fract() wrap, *TAU back). A radians-native port\n// (PI thresholds / +TAU wrap) diverges 180\u00B0 at the antipode. methods: 0 shorter,\n// 1 longer, 2 increasing, 3 decreasing.\nfloat interpolateHueTurns(float h0, float h1, float t, int method) {\n float TAU = 2.0 * PI;\n float a = h0 / TAU;\n float b = h1 / TAU;\n float i = b - a;\n if (method == 0) { // shorter\n if (i > 0.5) a += 1.0; else if (i < -0.5) b += 1.0;\n } else if (method == 1) { // longer\n if (i > 0.0 && i < 0.5) a += 1.0; else if (i > -0.5 && i <= 0.0) b += 1.0;\n } else if (method == 2) { // increasing\n if (i < 0.0) b += 1.0;\n } else { // decreasing\n if (i > 0.0) a += 1.0;\n }\n float r = a + t * (b - a);\n r = fract(r); // (r % 1 + 1) % 1 \u2014 fract is non-negative in GLSL\n return r * TAU; // back to radians\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLab-rectangular interpolation \u2192 linear sRGB. Holds\n// chroma across the ramp (no grey midpoint). The default/shorter ramp path.\nvec3 mixPaletteOklab(vec3 linA, vec3 linB, float t) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lab = mix(labA, labB, t);\n return oklabToLinearSrgb(lab);\n}\n\n// Linear-sRGB endpoint pair \u2192 OKLCh interpolation along the huePath arc \u2192 linear\n// sRGB. L and C lerp; H walks the chosen arc. The deliberate-rainbow path.\nvec3 mixPaletteOklchArc(vec3 linA, vec3 linB, float t, int method) {\n vec3 labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3(1.0 / 3.0)));\n vec3 labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3(1.0 / 3.0)));\n vec3 lchA = oklabToOklch(labA);\n vec3 lchB = oklabToOklch(labB);\n float L = mix(lchA.x, lchB.x, t);\n float C = mix(lchA.y, lchB.y, t);\n float H = interpolateHueTurns(lchA.z, lchB.z, t, method);\n return oklabToLinearSrgb(oklchToOklab(vec3(L, C, H)));\n}\n\n// The ramp dispatcher aurora's samplePalette splices. tRaw is the raw inter-stop\n// parameter [0,1]; the smoothstep ease + the huePath branch live HERE so the ramp is\n// one source. increasing(2)/decreasing(3) take the OKLCh hue-arc (rainbow sweep);\n// every other method takes the OKLab-rectangular straight line (no hue detour).\nvec3 samplePaletteRamp(vec3 a, vec3 b, float tRaw, int huePath) {\n float t = smoothstep(0.0, 1.0, tRaw);\n if (huePath == 2 || huePath == 3) {\n return mixPaletteOklchArc(a, b, t, huePath);\n }\n return mixPaletteOklab(a, b, t);\n}";
5
5
  export declare const PCG_HASH_GLSL = "\n// Jarzynski PCG2D \u2014 uvec2 \u2192 uvec2 permuted-congruential hash (JCGT 2020).\nuvec2 pcg2d(uvec2 v) {\n v = v * 1664525u + 1013904223u;\n v.x += v.y * 1664525u;\n v.y += v.x * 1664525u;\n v = v ^ (v >> 16u);\n v.x += v.y * 1664525u;\n v.y += v.x * 1664525u;\n v = v ^ (v >> 16u);\n return v;\n}\n\n// Float\u2192[0,1) scalar hash: bit-reinterpret the lattice coordinate, pcg2d it, take the\n// high word back to [0,1). Integer-bit \u2014 no sin() periodicity, no float-fract lattice.\nfloat pcgHash2(vec2 p) {\n uvec2 u = floatBitsToUint(p);\n return float(pcg2d(u).x) * (1.0 / 4294967296.0);\n}\n\n// Integer-lattice gradient: pcg2d the integer cell, fold the hash to an angle, return\n// the unit gradient vector. The gradient basis (not a scalar value) is what makes the\n// noise zero at the nodes (no value-noise plateaus).\nvec2 pcgGrad2(ivec2 cell) {\n uvec2 h = pcg2d(uvec2(cell));\n float ang = float(h.x) * (1.0 / 4294967296.0) * 6.28318530717958647692;\n return vec2(cos(ang), sin(ang));\n}\n\n// 2D SIMPLEX gradient noise (Gustavson skew). The skew transform F2/G2 maps the square\n// lattice onto a simplex (triangular) grid \u2014 no axis-aligned directional bias. Each of\n// the three simplex corners contributes grad\u00B7offset shaped by a radial (0.5 - r\u00B2)\u2074\n// falloff. Output is ~[-1, 1]; callers remap to [0,1] via 0.5 + 0.5*gnoise.\nfloat gnoise(vec2 p) {\n const float F2 = 0.36602540378443864676; // (sqrt(3) - 1) / 2\n const float G2 = 0.21132486540518711775; // (3 - sqrt(3)) / 6\n float s = (p.x + p.y) * F2;\n vec2 i = floor(p + s);\n float tt = (i.x + i.y) * G2;\n vec2 x0 = p - (i - tt); // offset from the simplex origin corner\n ivec2 i1 = (x0.x > x0.y) ? ivec2(1, 0) : ivec2(0, 1);\n vec2 x1 = x0 - vec2(i1) + G2;\n vec2 x2 = x0 - 1.0 + 2.0 * G2;\n ivec2 ii = ivec2(i);\n float n = 0.0;\n float t0 = 0.5 - dot(x0, x0);\n if (t0 > 0.0) { t0 *= t0; n += t0 * t0 * dot(pcgGrad2(ii), x0); }\n float t1 = 0.5 - dot(x1, x1);\n if (t1 > 0.0) { t1 *= t1; n += t1 * t1 * dot(pcgGrad2(ii + i1), x1); }\n float t2 = 0.5 - dot(x2, x2);\n if (t2 > 0.0) { t2 *= t2; n += t2 * t2 * dot(pcgGrad2(ii + ivec2(1, 1)), x2); }\n return 70.0 * n; // normalize to ~[-1, 1]\n}";
6
- export declare const OETF_WGSL = "\nfn srgbToLinearCh(c: f32) -> f32 {\n return select(pow((c + 0.055) / 1.055, 2.4), c / 12.92, c <= 0.04045);\n}\nfn srgbToLinear(c: vec3f) -> vec3f {\n return vec3f(srgbToLinearCh(c.r), srgbToLinearCh(c.g), srgbToLinearCh(c.b));\n}\nfn linearToSrgbCh(c: f32) -> f32 {\n return select(1.055 * pow(c, 1.0 / 2.4) - 0.055, c * 12.92, c <= 0.0031308);\n}\nfn linearToSrgb(c: vec3f) -> vec3f {\n return vec3f(linearToSrgbCh(c.r), linearToSrgbCh(c.g), linearToSrgbCh(c.b));\n}";
7
- export declare const FBM_ROT_WGSL = "const FBM_ROT: mat2x2f = mat2x2f(0.8, 0.6, -0.6, 0.8);";
8
- export declare const OKLCH_MATRICES_WGSL = "\nconst LINEAR_SRGB_TO_LMS: mat3x3f = mat3x3f(\n 0.4122214708, 0.2119034982, 0.0883024619,\n 0.5363325363, 0.6806995451, 0.2817188376,\n 0.0514459929, 0.1073969566, 0.6299787005\n);\nconst LMS_TO_OKLAB: mat3x3f = mat3x3f(\n 0.2104542553, 1.9779984951, 0.0259040371,\n 0.7936177850, -2.4285922050, 0.7827717662,\n -0.0040720468, 0.4505937099, -0.8086757660\n);\nconst OKLAB_TO_LMS: mat3x3f = mat3x3f(\n 1.0, 1.0, 1.0,\n 0.3963377774, -0.1055613458, -0.0894841775,\n 0.2158037573, -0.0638541728, -1.2914855480\n);\nconst LMS_TO_LINEAR_SRGB: mat3x3f = mat3x3f(\n 4.0767416621, -1.2684380046, -0.0041960863,\n -3.3077115913, 2.6097574011, -0.7034186147,\n 0.2309699292, -0.3413193965, 1.7076147010\n);\n\nfn srgbToOklab(c: vec3f) -> vec3f {\n let lin = srgbToLinear(c);\n let lms = LINEAR_SRGB_TO_LMS * lin;\n let lmsCbrt = sign(lms) * pow(abs(lms), vec3f(1.0 / 3.0));\n return LMS_TO_OKLAB * lmsCbrt;\n}\nfn oklabToLinearSrgb(lab: vec3f) -> vec3f {\n let lms_ = OKLAB_TO_LMS * lab;\n let lms = lms_ * lms_ * lms_;\n return LMS_TO_LINEAR_SRGB * lms;\n}\nfn oklabToOklch(lab: vec3f) -> vec3f {\n let C = length(lab.yz);\n var H = atan2(lab.z, lab.y);\n if (H < 0.0) { H = H + 2.0 * PI; }\n return vec3f(lab.x, C, H);\n}\nfn oklchToOklab(lch: vec3f) -> vec3f {\n return vec3f(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}";
9
- export declare const PALETTE_RAMP_WGSL = "\nfn interpolateHueTurns(h0: f32, h1: f32, t: f32, method: i32) -> f32 {\n let TAU = 2.0 * PI;\n var a = h0 / TAU;\n var b = h1 / TAU;\n let i = b - a;\n if (method == 0) { // shorter\n if (i > 0.5) { a = a + 1.0; } else if (i < -0.5) { b = b + 1.0; }\n } else if (method == 1) { // longer\n if (i > 0.0 && i < 0.5) { a = a + 1.0; } else if (i > -0.5 && i <= 0.0) { b = b + 1.0; }\n } else if (method == 2) { // increasing\n if (i < 0.0) { b = b + 1.0; }\n } else { // decreasing\n if (i > 0.0) { a = a + 1.0; }\n }\n let r = fract(a + t * (b - a));\n return r * TAU;\n}\n\nfn mixPaletteOklab(linA: vec3f, linB: vec3f, t: f32) -> vec3f {\n let labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3f(1.0 / 3.0)));\n let labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3f(1.0 / 3.0)));\n let lab = mix(labA, labB, vec3f(t));\n return oklabToLinearSrgb(lab);\n}\n\nfn mixPaletteOklchArc(linA: vec3f, linB: vec3f, t: f32, method: i32) -> vec3f {\n let labA = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linA) * pow(abs(LINEAR_SRGB_TO_LMS * linA), vec3f(1.0 / 3.0)));\n let labB = LMS_TO_OKLAB * (sign(LINEAR_SRGB_TO_LMS * linB) * pow(abs(LINEAR_SRGB_TO_LMS * linB), vec3f(1.0 / 3.0)));\n let lchA = oklabToOklch(labA);\n let lchB = oklabToOklch(labB);\n let L = mix(lchA.x, lchB.x, t);\n let C = mix(lchA.y, lchB.y, t);\n let H = interpolateHueTurns(lchA.z, lchB.z, t, method);\n return oklabToLinearSrgb(oklchToOklab(vec3f(L, C, H)));\n}\n\nfn samplePaletteRamp(a: vec3f, b: vec3f, tRaw: f32, huePath: i32) -> vec3f {\n let t = smoothstep(0.0, 1.0, tRaw);\n if (huePath == 2 || huePath == 3) {\n return mixPaletteOklchArc(a, b, t, huePath);\n }\n return mixPaletteOklab(a, b, t);\n}";
10
- export declare const PCG_HASH_WGSL = "\nfn pcg2d(v0: vec2u) -> vec2u {\n var v = v0 * 1664525u + vec2u(1013904223u);\n v.x = v.x + v.y * 1664525u;\n v.y = v.y + v.x * 1664525u;\n v = v ^ (v >> vec2u(16u));\n v.x = v.x + v.y * 1664525u;\n v.y = v.y + v.x * 1664525u;\n v = v ^ (v >> vec2u(16u));\n return v;\n}\n\nfn pcgHash2(p: vec2f) -> f32 {\n let u = bitcast<vec2u>(p);\n return f32(pcg2d(u).x) * (1.0 / 4294967296.0);\n}\n\nfn pcgGrad2(cell: vec2i) -> vec2f {\n let h = pcg2d(bitcast<vec2u>(cell));\n let ang = f32(h.x) * (1.0 / 4294967296.0) * 6.28318530717958647692;\n return vec2f(cos(ang), sin(ang));\n}\n\nfn gnoise(p: vec2f) -> f32 {\n let F2 = 0.36602540378443864676;\n let G2 = 0.21132486540518711775;\n let s = (p.x + p.y) * F2;\n let i = floor(p + vec2f(s));\n let tt = (i.x + i.y) * G2;\n let x0 = p - (i - vec2f(tt));\n var i1 = vec2i(0, 1);\n if (x0.x > x0.y) { i1 = vec2i(1, 0); }\n let x1 = x0 - vec2f(i1) + vec2f(G2);\n let x2 = x0 - vec2f(1.0) + vec2f(2.0 * G2);\n let ii = vec2i(i);\n var n = 0.0;\n var t0 = 0.5 - dot(x0, x0);\n if (t0 > 0.0) { t0 = t0 * t0; n = n + t0 * t0 * dot(pcgGrad2(ii), x0); }\n var t1 = 0.5 - dot(x1, x1);\n if (t1 > 0.0) { t1 = t1 * t1; n = n + t1 * t1 * dot(pcgGrad2(ii + i1), x1); }\n var t2 = 0.5 - dot(x2, x2);\n if (t2 > 0.0) { t2 = t2 * t2; n = n + t2 * t2 * dot(pcgGrad2(ii + vec2i(1, 1)), x2); }\n return 70.0 * n;\n}";
@@ -0,0 +1,48 @@
1
+ import { type easeInQuad } from "@mkbabb/value.js";
2
+ import { type Easing, type TimingFunction } from "@mkbabb/keyframes.js";
3
+ /** A value.js easing callable `(t: number) => number` (the family's shape). */
4
+ export type CurveFn = typeof easeInQuad;
5
+ /** The kind of a `MOTION_CURVES` row — a spring `linear()` or a cubic-bezier. */
6
+ export type MotionCurveKind = "spring" | "bezier";
7
+ /**
8
+ * One row of the CSS↔JS curve table. CANONICAL rows carry their own JS twin;
9
+ * ALIAS rows resolve through a `canonical` target (no duplicated twin).
10
+ */
11
+ export interface MotionCurve {
12
+ /** The CSS token name, including the leading `--`. */
13
+ readonly token: `--${string}`;
14
+ /** `spring` (a solved `linear()` token) or `bezier` (a cubic-bezier token). */
15
+ readonly kind: MotionCurveKind;
16
+ /**
17
+ * The JS twin — a callable `Easing` (springs, via `springTimingFunction`) or a
18
+ * `TimingFunction` (`(t) => number`, beziers via `CSSCubicBezier`). For ALIAS
19
+ * rows this is the canonical row's twin (resolve-through, not a copy).
20
+ */
21
+ readonly js: Easing | TimingFunction;
22
+ /**
23
+ * For an ALIAS row: the canonical `--token` this resolves through. `undefined`
24
+ * on a canonical row.
25
+ */
26
+ readonly canonical?: `--${string}`;
27
+ /** The register doc (springs lift it from the shared preset table). */
28
+ readonly note: string;
29
+ }
30
+ /**
31
+ * The CSS↔JS curve table, keyed by CSS token name. Covers EVERY `--ease-*` /
32
+ * `--spring-*` token declared in `tokens.css §2` + `theme.css` (CURVE-TABLE-BOUND
33
+ * gate §3.2). Spring rows carry a keyframes.js `Easing`; bezier rows a value.js
34
+ * `TimingFunction`; alias rows resolve through their `canonical` target.
35
+ *
36
+ * @example
37
+ * import { MOTION_CURVES } from "@mkbabb/glass-ui/motion";
38
+ * const easing = MOTION_CURVES["--spring-snappy"].js; // the iOS-control twin
39
+ * new NumericAnimation(frames, { timingFunction: easing });
40
+ */
41
+ export declare const MOTION_CURVES: Readonly<Record<string, MotionCurve>>;
42
+ /** The canonical (non-alias) curve rows, in declaration order. */
43
+ export declare const MOTION_CURVES_CANONICAL: readonly MotionCurve[];
44
+ /** Look up a curve's JS twin by CSS token name (throws on an unknown token). */
45
+ export declare function motionCurve(token: string): MotionCurve;
46
+ export { linear, easeInQuad, easeOutQuad, easeInOutQuad, easeInCubic, easeOutCubic, easeInOutCubic, easeInSine, easeOutSine, easeInOutSine, easeInCirc, easeOutCirc, easeInOutCirc, easeInExpo, easeOutExpo, easeInOutExpo, easeInBounce, CSSCubicBezier, } from "@mkbabb/value.js";
47
+ export { SPRING_PRESETS, springPreset } from "./springPresets";
48
+ export type { SpringPresetRow, SpringPresetName } from "./springPresets";
@@ -6,3 +6,5 @@ export * from "./useNumericTransition";
6
6
  export * from "./useAnimatedNumber";
7
7
  export * from "./useAnimatedNumberMap";
8
8
  export * from "./useCountup";
9
+ export * from "./suite";
10
+ export { SPRING_PRESETS, springPreset, type SpringPresetRow, type SpringPresetName, } from "./springPresets";
@@ -0,0 +1,33 @@
1
+ /** A glass-ui named-spring preset name. */
2
+ export type SpringPresetName = "smooth" | "snappy" | "bouncy" | "gentle" | "dock";
3
+ /** One named-spring row: the analytic (response, dampingFraction) pair + its register doc. */
4
+ export interface SpringPresetRow {
5
+ /** The token suffix — `--spring-<name>` (CSS) and the `MOTION_CURVES` key. */
6
+ readonly name: SpringPresetName;
7
+ /** Response time in seconds (the spring's `response` solver input). */
8
+ readonly response: number;
9
+ /** Damping fraction ζ (1 = critical; <1 overshoots). */
10
+ readonly dampingFraction: number;
11
+ /** The register this curve serves (the doc-table derives from this one string). */
12
+ readonly comment: string;
13
+ }
14
+ /**
15
+ * iOS-canonical (response, dampingFraction) pairs per AL-X4 §3. The names match
16
+ * the `--spring-*` CSS tokens AND the speedtest CSS consumers that read
17
+ * `var(--spring-smooth)` etc. directly, so they MUST stay stable across retunes —
18
+ * only the `(response, ζ)` pair and the emitted curves change.
19
+ *
20
+ * GOVERNED iOS-SPRING VOCABULARY (AX.W05) — the SINGLE source of the register
21
+ * vocabulary. Each row's `comment` names the surface-class that rides it:
22
+ *
23
+ * SETTLE → smooth — patient entrances, fades, scale-ins (no overshoot read).
24
+ * CONTROL → snappy — crisp position morphs: tab underline glide, progress fill,
25
+ * the continuous-marker pop, the generic crisp settle.
26
+ * PLAYFUL → bouncy — deliberate emphatic one-shots ONLY: the bouncy toggle press,
27
+ * dialog/success entrances, the VT default. Largest overshoot.
28
+ * GENTLE → gentle — critically-damped slow settles (the patient end of the ladder).
29
+ * DOCK → dock — the dock expand/collapse morph AND everything inside it.
30
+ */
31
+ export declare const SPRING_PRESETS: readonly SpringPresetRow[];
32
+ /** Lookup one preset row by name (used by `MOTION_CURVES` spring rows). */
33
+ export declare function springPreset(name: SpringPresetName): SpringPresetRow;
@@ -0,0 +1,2 @@
1
+ export { NumericAnimation, SpringProgress, SmoothProgress, Sequence, Timeline, ManualTimeline, RAFPlayback, ScrollTimeline, createNativeTimeline, flip, flipShared, ElementMorph, drag, Draggable, decay, decayRest, stagger, springTimingFunction, springLinearStops, toEasing, resolveEasing, AnimationOptionError, UnknownEasingError, loadAnimationEngine, } from "@mkbabb/keyframes.js";
2
+ export type { Easing, TimingFunction, TimingFunctionNames, SpringProgressOptions, SpringFrameCallback, SpringSubscriber, SpringLinearStopsOptions, SpringTimingFunctionOptions, SmoothProgressOptions, NumericAnimationOptions, NumericFrameCallback, SequenceEntry, SequenceOptions, SequencePosition, TimelineOptions, NativeTimelineSpec, RAFPlaybackOptions, Tickable, FlipOptions, ElementMorphOptions, MorphRect, DragOptions, DragAxis, DragSubscriber, DecayOptions, DecaySample, StaggerFn, StaggerOptions, StaggerOrigin, AnimationEngine, AnimationOptions, AnimationFrame, AnimateOptions, InputAnimationOptions, ResolvedKeyframes, Vars, } from "@mkbabb/keyframes.js";
@@ -1,6 +1,6 @@
1
1
  import { type Ref } from "vue";
2
2
  import { type SpringRef } from "./useSpring";
3
- /** Named iOS spring presets (mirrors X1 §2.3 / tokens.css §2). */
3
+ /** Named iOS spring presets the mount register exposes (the dock register is not a mount enter). */
4
4
  export type SpringPreset = "smooth" | "snappy" | "bouncy" | "gentle";
5
5
  export interface UseSpringMountOptions {
6
6
  /**
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./useConfiguratorState-DxAqksK6.js";
1
+ import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./useConfiguratorState-BdQXh9ie.js";
2
2
  export { e as CONFIGURATOR_DENSITY_KEY, t as Configurator, i as ConfiguratorLayer, n as ConfiguratorRow, r as provideConfiguratorDensity, o as useConfiguratorState, a as useOptionalConfiguratorDensity };