@mkbabb/glass-ui 4.0.0 → 4.0.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 (394) hide show
  1. package/README.md +3 -1
  2. package/dist/CardAction-CW7a0m8M.js +253 -0
  3. package/dist/{CommandShortcut-DdtWXxOK.js → CommandShortcut-DvZNQ_HF.js} +4 -4
  4. package/dist/ConfiguratorRow-BR4l-ixA.js +143 -0
  5. package/dist/{ContextMenuContent-ON3x7cuk.js → ContextMenuContent-uWnVxDab.js} +1 -1
  6. package/dist/{ContextMenuSubContent-B0Vs6atR.js → ContextMenuSubContent-xol4sD2q.js} +32 -37
  7. package/dist/{DataTable-C464Zbqd.js → DataTable-CuKwF7wr.js} +4 -4
  8. package/dist/{DialogContent-DDE6pQBU.js → DialogContent-DcKK8k9i.js} +5 -5
  9. package/dist/{DialogFooter-8eZbdmPc.js → DialogFooter-BZNX5aVr.js} +3 -3
  10. package/dist/{FadingScroll-DwNnvKMs.js → FadingScroll-DI6hQhT9.js} +1 -1
  11. package/dist/{HoverCardContent-DkMaQzH5.js → HoverCardContent-b2uaAMRR.js} +1 -1
  12. package/dist/{HoverPopover-Dpzwvc4t.js → HoverPopover-CbqbNwgU.js} +2 -2
  13. package/dist/{IconChip-BDw1j5mu.js → IconChip-BTD-nay5.js} +3 -2
  14. package/dist/{IconTooltip-DSjasZIt.js → IconTooltip-Bl8gFZ8d.js} +1 -1
  15. package/dist/{Input-DVG_J0ne.js → Input-h9v5LeXf.js} +1 -1
  16. package/dist/{MetricBadge-BpC0R_Ec.js → MetricBadge-RHdBP72w.js} +1 -1
  17. package/dist/Notification-VUwexFUf.js +43 -0
  18. package/dist/NumberFieldContent-Cq7EzX-U.js +138 -0
  19. package/dist/{PopoverContent-BTorlp--.js → PopoverContent-DL7E6vJP.js} +4 -4
  20. package/dist/{Progress-hAT4gqGH.js → Progress-DctG61iZ.js} +4 -4
  21. package/dist/{ScrollingText-CUVFTWk2.js → ScrollingText-yOpBzFYq.js} +2 -2
  22. package/dist/{SelectScrollDownButton-C1jb3b3K.js → SelectScrollDownButton-CrA8F0iV.js} +18 -19
  23. package/dist/Toaster-Bw4xR8xV.js +274 -0
  24. package/dist/{ToggleGroupItem-Dzk9hWsF.js → ToggleGroupItem-pEM9vIhs.js} +50 -37
  25. package/dist/{TooltipProvider-B3MkB_8P.js → TooltipProvider-rzvnXz60.js} +1 -1
  26. package/dist/animated-digit.js +2 -2
  27. package/dist/api/index.d.ts +8 -3
  28. package/dist/api/types-extra.d.ts +6 -0
  29. package/dist/aurora.js +885 -242
  30. package/dist/badge.js +1 -1
  31. package/dist/border-progress.d.ts +1 -0
  32. package/dist/border-progress.js +106 -0
  33. package/dist/{button-BNDWhAZb.js → button-DYCUa-tH.js} +71 -26
  34. package/dist/button.js +1 -1
  35. package/dist/canvas.js +2 -2
  36. package/dist/card.js +2 -2
  37. package/dist/carousel.js +93 -110
  38. package/dist/collapsible.js +1 -1
  39. package/dist/command.js +1 -1
  40. package/dist/compile-CQEFRTmx.js +19 -0
  41. package/dist/components/custom/aurora/composables/atoms-fields.d.ts +39 -0
  42. package/dist/components/custom/aurora/composables/auroraFallbackGround.d.ts +108 -0
  43. package/dist/components/custom/aurora/composables/runtime.d.ts +19 -0
  44. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +5 -1
  45. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +51 -0
  46. package/dist/components/custom/aurora/composables/wgpuSetup.d.ts +29 -0
  47. package/dist/components/custom/aurora/constants/budget.d.ts +21 -0
  48. package/dist/components/custom/aurora/constants/presets.d.ts +2 -2
  49. package/dist/components/custom/aurora/constants/renderMode.d.ts +63 -12
  50. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -0
  51. package/dist/components/custom/aurora/constants/shaders/oil-modes.glsl.d.ts +1 -0
  52. package/dist/components/custom/aurora/constants/shaders/procedural-color.wgsl.d.ts +4 -0
  53. package/dist/components/custom/aurora/index.d.ts +2 -1
  54. package/dist/components/custom/border-progress/BorderProgress.vue.d.ts +46 -0
  55. package/dist/components/custom/border-progress/composables/useBorderSpectrum.d.ts +22 -0
  56. package/dist/components/custom/border-progress/constants.d.ts +59 -0
  57. package/dist/components/custom/border-progress/index.d.ts +4 -0
  58. package/dist/components/custom/concentric/Concentric.vue.d.ts +39 -0
  59. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +11 -0
  60. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +13 -0
  61. package/dist/components/custom/concentric/composables/ringField.d.ts +44 -0
  62. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +13 -0
  63. package/dist/components/custom/concentric/composables/useConcentric.d.ts +35 -0
  64. package/dist/components/custom/concentric/constants.d.ts +43 -0
  65. package/dist/components/custom/concentric/index.d.ts +5 -0
  66. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +4 -0
  67. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -0
  68. package/dist/components/custom/dock/DockIconButton.vue.d.ts +13 -4
  69. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +10 -2
  70. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +75 -0
  71. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -0
  72. package/dist/components/custom/dot-flow-field/DotFlowField.vue.d.ts +38 -0
  73. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +41 -0
  74. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +24 -0
  75. package/dist/components/custom/dot-flow-field/composables/useDotFlowField.d.ts +34 -0
  76. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -0
  77. package/dist/components/custom/dot-flow-field/constants.d.ts +48 -0
  78. package/dist/components/custom/dot-flow-field/index.d.ts +5 -0
  79. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -0
  80. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +20 -0
  81. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +1 -0
  82. package/dist/components/custom/easing/EasingConfigurator.vue.d.ts +33 -0
  83. package/dist/components/custom/easing/EasingPicker.vue.d.ts +49 -0
  84. package/dist/components/custom/easing/composables/useEasingPicker.d.ts +75 -0
  85. package/dist/components/custom/easing/constants.d.ts +28 -0
  86. package/dist/components/custom/easing/index.d.ts +3 -0
  87. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +12 -2
  88. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +39 -0
  89. package/dist/components/custom/fourier-field/constants.d.ts +7 -0
  90. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +1 -1
  91. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +4 -2
  92. package/dist/components/custom/goo-blob/composables/uniformBridgeWGPU.d.ts +24 -0
  93. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +18 -11
  94. package/dist/components/custom/goo-blob/composables/wgpuSetup.d.ts +23 -0
  95. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -0
  96. package/dist/components/custom/handmark/HandMark.vue.d.ts +1 -1
  97. package/dist/components/custom/icon-chip/types.d.ts +11 -1
  98. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +3 -1
  99. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  100. package/dist/components/custom/spa-view/SpaView.vue.d.ts +50 -0
  101. package/dist/components/custom/spa-view/index.d.ts +2 -0
  102. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +10 -0
  103. package/dist/components/custom/tabs/composables/useTabDragMorph.d.ts +42 -0
  104. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +1 -1
  105. package/dist/components/ui/_shared/menuItemVariants.d.ts +1 -1
  106. package/dist/components/ui/badge/index.d.ts +1 -1
  107. package/dist/components/ui/button/Button.vue.d.ts +5 -2
  108. package/dist/components/ui/button/index.d.ts +2 -2
  109. package/dist/components/ui/card/Card.vue.d.ts +34 -4
  110. package/dist/components/ui/card/CardHeader.vue.d.ts +42 -16
  111. package/dist/components/ui/card/ScrollCard.vue.d.ts +33 -0
  112. package/dist/components/ui/card/ScrollCardHeader.vue.d.ts +17 -0
  113. package/dist/components/ui/card/index.d.ts +2 -0
  114. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
  115. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
  116. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +2 -2
  117. package/dist/components/ui/command/Command.vue.d.ts +1 -1
  118. package/dist/components/ui/drawer/Drawer.vue.d.ts +46 -33
  119. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +7 -8
  120. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +2 -2
  121. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +1 -1
  122. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +2 -2
  123. package/dist/components/ui/drawer/composables/drawerSnapContext.d.ts +26 -0
  124. package/dist/components/ui/drawer/composables/useDrawerSnap.d.ts +17 -0
  125. package/dist/components/ui/drawer/constants.d.ts +45 -0
  126. package/dist/components/ui/drawer/index.d.ts +23 -15
  127. package/dist/components/ui/focus-scope/FocusScope.vue.d.ts +20 -0
  128. package/dist/components/ui/focus-scope/index.d.ts +2 -0
  129. package/dist/components/ui/index.d.ts +1 -0
  130. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +3 -2
  131. package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
  132. package/dist/components/ui/sheet/index.d.ts +1 -1
  133. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
  134. package/dist/components/ui/toast/Toast.vue.d.ts +5 -2
  135. package/dist/components/ui/toast/use-toast.d.ts +14 -0
  136. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  137. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +13 -6
  138. package/dist/composables/glass/index.d.ts +5 -2
  139. package/dist/composables/glass/useSpecularPointer.d.ts +33 -0
  140. package/dist/composables/glass/useSpecularTracking.d.ts +20 -0
  141. package/dist/composables/glass/vSpecular.d.ts +2 -0
  142. package/dist/composables/glass/webgl/shaders/flow.glsl.d.ts +1 -0
  143. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +16 -0
  144. package/dist/composables/glass/webgpu/index.d.ts +2 -0
  145. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +54 -0
  146. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +84 -0
  147. package/dist/composables/motion/core/index.d.ts +1 -0
  148. package/dist/composables/motion/index.d.ts +4 -0
  149. package/dist/composables/motion/useDockCtaReceive.d.ts +59 -0
  150. package/dist/composables/motion/useDragMorph.d.ts +77 -0
  151. package/dist/composables/motion/useLiquidFlex.d.ts +11 -0
  152. package/dist/composables/motion/useLiquidPress.d.ts +71 -0
  153. package/dist/composables/motion/useLiquidReveal.d.ts +51 -0
  154. package/dist/composables/motion/useNumericTransition.d.ts +3 -3
  155. package/dist/composables/motion/usePointerVelocityField.d.ts +98 -0
  156. package/dist/concentric.d.ts +1 -0
  157. package/dist/concentric.js +562 -0
  158. package/dist/configurator.js +3 -2
  159. package/dist/confirm-dialog.js +22 -24
  160. package/dist/constellation.js +11 -11
  161. package/dist/context-menu.js +3 -3
  162. package/dist/controls.js +1 -1
  163. package/dist/createCanvasLifecycle-CHD5XrDW.js +82 -0
  164. package/dist/data-table.js +1 -1
  165. package/dist/dialog.js +2 -2
  166. package/dist/dock.js +564 -457
  167. package/dist/{dockContext-Bu1Avy-a.js → dockContext-BNfyPLe9.js} +1 -1
  168. package/dist/dom.js +5 -5
  169. package/dist/dot-flow-field.d.ts +1 -0
  170. package/dist/dot-flow-field.js +604 -0
  171. package/dist/drawer.d.ts +1 -0
  172. package/dist/drawer.js +380 -0
  173. package/dist/{dropdown-menu-BJ7E9js_.js → dropdown-menu-CofSZuk8.js} +14 -15
  174. package/dist/dropdown-menu.js +1 -1
  175. package/dist/easing.d.ts +1 -0
  176. package/dist/easing.js +463 -0
  177. package/dist/expandable-container.js +7 -4
  178. package/dist/fading-scroll.js +1 -1
  179. package/dist/focus-scope.d.ts +1 -0
  180. package/dist/focus-scope.js +23 -0
  181. package/dist/forms.js +7 -7
  182. package/dist/fourier-field.js +128 -116
  183. package/dist/fourier-math.js +1 -1
  184. package/dist/glass-panel.js +2 -2
  185. package/dist/glass-ui.css +1 -1
  186. package/dist/glass-ui.js +149 -341
  187. package/dist/goo-blob.js +830 -224
  188. package/dist/handmark.js +2 -2
  189. package/dist/header-ribbon.js +1 -1
  190. package/dist/hover-card.js +1 -1
  191. package/dist/hover-popover.js +1 -1
  192. package/dist/icon-chip.js +1 -1
  193. package/dist/icon-tooltip.js +1 -1
  194. package/dist/index.d.ts +1 -1
  195. package/dist/instrument-chassis.js +1 -1
  196. package/dist/label.js +1 -1
  197. package/dist/labeled-field.js +6 -6
  198. package/dist/metric-badge.js +1 -1
  199. package/dist/metric-cell.js +1 -1
  200. package/dist/metric-stack.js +4 -8
  201. package/dist/motion-core.js +36 -36
  202. package/dist/motion-curves.js +1 -1
  203. package/dist/motion.js +157 -55
  204. package/dist/notification.js +1 -1
  205. package/dist/number-field.js +1 -1
  206. package/dist/pager-dots.js +1 -1
  207. package/dist/paper-backdrop.js +1 -1
  208. package/dist/popover.js +1 -1
  209. package/dist/{compile-EXXzEr1q.js → procedural-color.glsl-CIFsJhwI.js} +1 -155
  210. package/dist/procedural-color.wgsl-CToRHugY.js +224 -0
  211. package/dist/progress.js +1 -1
  212. package/dist/pulse.js +1 -1
  213. package/dist/reactive.js +2 -2
  214. package/dist/scrolling-text.js +1 -1
  215. package/dist/search.js +9 -11
  216. package/dist/select.js +3 -3
  217. package/dist/separator.js +1 -1
  218. package/dist/{sheet-CquRYOAw.js → sheet-tZMg0E0w.js} +5 -5
  219. package/dist/sheet.js +1 -1
  220. package/dist/{slider-DQ95MET2.js → slider-DVb4HXU-.js} +3 -3
  221. package/dist/slider.js +1 -1
  222. package/dist/sortable-list.js +3 -3
  223. package/dist/spa-view.d.ts +1 -0
  224. package/dist/spa-view.js +46 -0
  225. package/dist/styles/animations.css +33 -9
  226. package/dist/styles/border-progress.css +109 -0
  227. package/dist/styles/cards.css +76 -0
  228. package/dist/styles/components.css +1 -1
  229. package/dist/styles/critical-partition.mjs +140 -0
  230. package/dist/styles/critical.css +12 -0
  231. package/dist/styles/deferred.css +31 -0
  232. package/dist/styles/dock/density.css +45 -0
  233. package/dist/styles/dock/layers.css +54 -30
  234. package/dist/styles/dock/morph.css +124 -7
  235. package/dist/styles/dock/overflow.css +16 -2
  236. package/dist/styles/dock/shell.css +54 -16
  237. package/dist/styles/dock.css +32 -0
  238. package/dist/styles/drawer.css +81 -35
  239. package/dist/styles/glass/deep.css +44 -0
  240. package/dist/styles/glass/ladder.css +87 -31
  241. package/dist/styles/glass/material.css +78 -15
  242. package/dist/styles/glass/reveal.css +136 -0
  243. package/dist/styles/glass/rim.css +100 -0
  244. package/dist/styles/glass/surfaces.css +101 -3
  245. package/dist/styles/glass-refract.css +96 -44
  246. package/dist/styles/glass-specular-track.css +7 -0
  247. package/dist/styles/glass.css +3 -0
  248. package/dist/styles/hover-popover.css +7 -6
  249. package/dist/styles/icon-chip.css +77 -15
  250. package/dist/styles/index.css +21 -9
  251. package/dist/styles/instrument-chassis.css +66 -3
  252. package/dist/styles/scroll-choreography.css +300 -0
  253. package/dist/styles/segmented-tabs.css +31 -0
  254. package/dist/styles/theme/bridges.css +11 -0
  255. package/dist/styles/theme/literals.css +11 -2
  256. package/dist/styles/theme/radius.css +6 -1
  257. package/dist/styles/tokens/dark-arm.css +98 -26
  258. package/dist/styles/tokens/glass-deep.css +75 -0
  259. package/dist/styles/tokens/glass-fx.css +333 -0
  260. package/dist/styles/tokens/glass.css +39 -319
  261. package/dist/styles/tokens/light-dark.css +15 -2
  262. package/dist/styles/tokens/offsets.css +116 -0
  263. package/dist/styles/tokens/on-glass-fg.css +39 -0
  264. package/dist/styles/tokens/property-regs.css +127 -0
  265. package/dist/styles/tokens/scale-paper.css +117 -89
  266. package/dist/styles/tokens/scheme-motion.css +70 -32
  267. package/dist/styles/tokens/scroll-tokens.css +123 -0
  268. package/dist/styles/tokens/{offsets-sizing.css → sizing.css} +37 -100
  269. package/dist/styles/tokens.css +9 -3
  270. package/dist/styles/typography/semantic.css +8 -8
  271. package/dist/styles/typography/utilities.css +22 -7
  272. package/dist/styles/utilities/animate.css +27 -24
  273. package/dist/styles/utilities/base-misc.css +255 -0
  274. package/dist/styles/utilities/base.css +47 -261
  275. package/dist/styles/utilities/btn.css +3 -1
  276. package/dist/styles/utilities/metal.css +189 -0
  277. package/dist/styles/utilities.css +14 -7
  278. package/dist/switch.js +1 -1
  279. package/dist/tabs.js +220 -107
  280. package/dist/timeline.js +2 -2
  281. package/dist/toast.js +1 -1
  282. package/dist/toggle-group.js +1 -1
  283. package/dist/tooltip.js +1 -1
  284. package/dist/typewriter.js +1 -1
  285. package/dist/useCanvas2D-B8w_E3Rr.js +83 -0
  286. package/dist/useConfiguratorState-DNlOh6c8.js +161 -0
  287. package/dist/useDragMorph-DgxnsVJz.js +102 -0
  288. package/dist/useLiquidPress-kfb4KX79.js +39 -0
  289. package/dist/usePointerVelocityField-JbRd5CrM.js +137 -0
  290. package/dist/useSpring-C0jyvEJB.js +40 -0
  291. package/dist/useSpringMount-q1amq1SJ.js +71 -0
  292. package/dist/useSpringPress-BsqPr7FJ.js +34 -0
  293. package/dist/{useTouchGate-28Tk2-t2.js → useTouchGate-CBZTD4SD.js} +1 -1
  294. package/dist/vSpecular-CQFmLNzA.js +68 -0
  295. package/dist/vendor-CKmzio-i.js +226 -0
  296. package/dist/watercolor-dot.js +2 -2
  297. package/package.json +126 -22
  298. package/src/styles/animations.css +33 -9
  299. package/src/styles/border-progress.css +109 -0
  300. package/src/styles/cards.css +76 -0
  301. package/src/styles/critical-partition.mjs +140 -0
  302. package/src/styles/dock/density.css +45 -0
  303. package/src/styles/dock/layers.css +54 -30
  304. package/src/styles/dock/morph.css +124 -7
  305. package/src/styles/dock/overflow.css +16 -2
  306. package/src/styles/dock/shell.css +54 -16
  307. package/src/styles/dock.css +32 -0
  308. package/src/styles/drawer.css +81 -35
  309. package/src/styles/glass/deep.css +44 -0
  310. package/src/styles/glass/ladder.css +87 -31
  311. package/src/styles/glass/material.css +78 -15
  312. package/src/styles/glass/reveal.css +136 -0
  313. package/src/styles/glass/rim.css +100 -0
  314. package/src/styles/glass/surfaces.css +101 -3
  315. package/src/styles/glass-refract.css +96 -44
  316. package/src/styles/glass-specular-track.css +7 -0
  317. package/src/styles/glass.css +3 -0
  318. package/src/styles/hover-popover.css +7 -6
  319. package/src/styles/icon-chip.css +77 -15
  320. package/src/styles/index.css +12 -0
  321. package/src/styles/instrument-chassis.css +66 -3
  322. package/src/styles/scroll-choreography.css +300 -0
  323. package/src/styles/segmented-tabs.css +31 -0
  324. package/src/styles/theme/bridges.css +11 -0
  325. package/src/styles/theme/literals.css +11 -2
  326. package/src/styles/theme/radius.css +6 -1
  327. package/src/styles/tokens/dark-arm.css +98 -26
  328. package/src/styles/tokens/glass-deep.css +75 -0
  329. package/src/styles/tokens/glass-fx.css +333 -0
  330. package/src/styles/tokens/glass.css +39 -319
  331. package/src/styles/tokens/light-dark.css +15 -2
  332. package/src/styles/tokens/offsets.css +116 -0
  333. package/src/styles/tokens/on-glass-fg.css +39 -0
  334. package/src/styles/tokens/property-regs.css +127 -0
  335. package/src/styles/tokens/scale-paper.css +117 -89
  336. package/src/styles/tokens/scheme-motion.css +70 -32
  337. package/src/styles/tokens/scroll-tokens.css +123 -0
  338. package/src/styles/tokens/{offsets-sizing.css → sizing.css} +37 -100
  339. package/src/styles/tokens.css +9 -3
  340. package/src/styles/typography/semantic.css +8 -8
  341. package/src/styles/typography/utilities.css +22 -7
  342. package/src/styles/utilities/animate.css +27 -24
  343. package/src/styles/utilities/base-misc.css +255 -0
  344. package/src/styles/utilities/base.css +47 -261
  345. package/src/styles/utilities/btn.css +3 -1
  346. package/src/styles/utilities/metal.css +189 -0
  347. package/src/styles/utilities.css +14 -7
  348. package/dist/CardAction-XH4YBVEK.js +0 -158
  349. package/dist/Notification-DKjKsQq8.js +0 -100
  350. package/dist/NumberFieldContent-1VtwDSgf.js +0 -145
  351. package/dist/Toaster-Bm_HQSpc.js +0 -263
  352. package/dist/check-njhk-vfu.js +0 -7
  353. package/dist/chevron-down-DKkxb4VV.js +0 -7
  354. package/dist/chevron-right-CPXbqQQz.js +0 -7
  355. package/dist/chevron-up-n_24SqI-.js +0 -7
  356. package/dist/createLucideIcon-DydS2qgk.js +0 -43
  357. package/dist/minimize-2-BV31Ob_h.js +0 -38
  358. package/dist/search-BSGrf2Sk.js +0 -12
  359. package/dist/useCanvas2D-ClrQuZtp.js +0 -96
  360. package/dist/useConfiguratorState-kiIlun8I.js +0 -303
  361. package/dist/useSpecularTracking-Bo5su68i.js +0 -32
  362. package/dist/useSpringMount-CvopqiFr.js +0 -108
  363. package/dist/useViewTransition-COsPjQVZ.js +0 -47
  364. package/dist/x-BUwTKe50.js +0 -10
  365. /package/dist/{CollapsibleContent-C_s6fG7r.js → CollapsibleContent-68dEXIAl.js} +0 -0
  366. /package/dist/{InstrumentChassis-UUJX0-mW.js → InstrumentChassis-Bx0F_q5g.js} +0 -0
  367. /package/dist/{Label-Ck9SWEKM.js → Label-C2ejNWeC.js} +0 -0
  368. /package/dist/{ModalOverlay-CkPRRgl_.js → ModalOverlay-D1VrWyoi.js} +0 -0
  369. /package/dist/{PaperBackdrop-nBKe0vkB.js → PaperBackdrop-Vf3tlpvd.js} +0 -0
  370. /package/dist/{SelectGroup-Dcczq44n.js → SelectGroup-DwwjicPY.js} +0 -0
  371. /package/dist/{SelectSeparator-DK2y1Bun.js → SelectSeparator-DXswVdRz.js} +0 -0
  372. /package/dist/{Separator-BArl4OaB.js → Separator-pKF0oA4M.js} +0 -0
  373. /package/dist/{Switch-Dr--uLGH.js → Switch-CwYNf8bo.js} +0 -0
  374. /package/dist/{_plugin-vue_export-helper-CBt_VvXa.js → _plugin-vue_export-helper-C1je1s0u.js} +0 -0
  375. /package/dist/{badge-UILT_3pZ.js → badge-D9XWW4GT.js} +0 -0
  376. /package/dist/{createContext-B2RaZ-b8.js → createContext-CpBNTRMI.js} +0 -0
  377. /package/dist/{math-DeuJwLFx.js → math-BINYmg5z.js} +0 -0
  378. /package/dist/{menuItemVariants-DWRQXBxJ.js → menuItemVariants-D8VNHq22.js} +0 -0
  379. /package/dist/{prng-Cg22zv8g.js → prng-Za0Rmgag.js} +0 -0
  380. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CUyHr5Uu.js} +0 -0
  381. /package/dist/{springPresets-WXaLbu8u.js → springPresets-CFQGQfdl.js} +0 -0
  382. /package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-BfUq2bUM.js} +0 -0
  383. /package/dist/{useInterval-CNdua40W.js → useInterval-CvK1mL92.js} +0 -0
  384. /package/dist/{useLiquidFlex-C12hXwOZ.js → useLiquidFlex-mZPMiNXh.js} +0 -0
  385. /package/dist/{useRAFLoop-CdwJ7284.js → useRAFLoop-UYa4zoiN.js} +0 -0
  386. /package/dist/{useResizeObserver-V6nq5gJb.js → useResizeObserver-Bpoi7tRE.js} +0 -0
  387. /package/dist/{useResolveTokenColor-NUG2zYAW.js → useResolveTokenColor-vAylyR0x.js} +0 -0
  388. /package/dist/{useSortable-BVqlJRBR.js → useSortable-DHjtZSEd.js} +0 -0
  389. /package/dist/{useSurfaceAxis-CMnF2zHb.js → useSurfaceAxis-g0NloYEF.js} +0 -0
  390. /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-CWEi25hf.js} +0 -0
  391. /package/dist/{useTimer-B_PAasDL.js → useTimer-BHJOKr35.js} +0 -0
  392. /package/dist/{useUserInvalidAria-CDfJuakL.js → useUserInvalidAria-y5namzeE.js} +0 -0
  393. /package/dist/{useViewportReady-CvBcCYDf.js → useViewportReady-anbac3m6.js} +0 -0
  394. /package/dist/{vReveal-D9k0jADx.js → vReveal-Czsb7zQC.js} +0 -0
@@ -8,13 +8,13 @@ type __VLS_Slots = {} & {
8
8
  default?: (props: typeof __VLS_8) => any;
9
9
  };
10
10
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
11
- "update:modelValue": (payload: import("reka-ui").AcceptableInputValue[]) => any;
12
11
  invalid: (payload: import("reka-ui").AcceptableInputValue) => any;
12
+ "update:modelValue": (payload: import("reka-ui").AcceptableInputValue[]) => any;
13
13
  addTag: (payload: import("reka-ui").AcceptableInputValue) => any;
14
14
  removeTag: (payload: import("reka-ui").AcceptableInputValue) => any;
15
15
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
16
- "onUpdate:modelValue"?: ((payload: import("reka-ui").AcceptableInputValue[]) => any) | undefined;
17
16
  onInvalid?: ((payload: import("reka-ui").AcceptableInputValue) => any) | undefined;
17
+ "onUpdate:modelValue"?: ((payload: import("reka-ui").AcceptableInputValue[]) => any) | undefined;
18
18
  onAddTag?: ((payload: import("reka-ui").AcceptableInputValue) => any) | undefined;
19
19
  onRemoveTag?: ((payload: import("reka-ui").AcceptableInputValue) => any) | undefined;
20
20
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -1,18 +1,20 @@
1
1
  import { type HTMLAttributes } from 'vue';
2
2
  import { type ToastRootProps } from 'reka-ui';
3
+ import { type Surface } from '../_shared/useSurfaceAxis';
3
4
  import type { ToastVariant } from './use-toast';
4
5
  interface ToastProps extends ToastRootProps {
5
6
  class?: HTMLAttributes['class'];
6
7
  variant?: ToastVariant;
8
+ surface?: Surface;
7
9
  }
8
10
  declare var __VLS_8: {};
9
11
  type __VLS_Slots = {} & {
10
12
  default?: (props: typeof __VLS_8) => any;
11
13
  };
12
14
  declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
+ pause: () => any;
13
16
  "update:open": (value: boolean) => any;
14
17
  escapeKeyDown: (event: KeyboardEvent) => any;
15
- pause: () => any;
16
18
  resume: () => any;
17
19
  swipeStart: (event: {
18
20
  currentTarget: EventTarget & HTMLElement;
@@ -51,9 +53,9 @@ declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {},
51
53
  };
52
54
  }>, "currentTarget">) => any;
53
55
  }, string, import("vue").PublicProps, Readonly<ToastProps> & Readonly<{
56
+ onPause?: (() => any) | undefined;
54
57
  "onUpdate:open"?: ((value: boolean) => any) | undefined;
55
58
  onEscapeKeyDown?: ((event: KeyboardEvent) => any) | undefined;
56
- onPause?: (() => any) | undefined;
57
59
  onResume?: (() => any) | undefined;
58
60
  onSwipeStart?: ((event: {
59
61
  currentTarget: EventTarget & HTMLElement;
@@ -93,6 +95,7 @@ declare const __VLS_base: import("vue").DefineComponent<ToastProps, {}, {}, {},
93
95
  }>, "currentTarget">) => any) | undefined;
94
96
  }>, {
95
97
  variant: ToastVariant;
98
+ surface: Surface;
96
99
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
97
100
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
98
101
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,5 @@
1
1
  import type { Component, VNode } from 'vue';
2
+ import type { Surface } from '../_shared/useSurfaceAxis';
2
3
  export type ToastVariant = 'default' | 'destructive' | 'success' | 'warning' | 'info';
3
4
  export interface Toast {
4
5
  id: string;
@@ -6,6 +7,12 @@ export interface Toast {
6
7
  description?: string;
7
8
  action?: Component | VNode;
8
9
  variant?: ToastVariant;
10
+ /**
11
+ * BB.W-SURFACE-AXIS-COMPLETE — the shared {glass·veil·opaque} surface-decoration
12
+ * axis on a queued toast (default `glass`). Forwarded through `Toaster.vue`'s
13
+ * per-toast `v-bind` exactly like `variant`; orthogonal to the tone arm.
14
+ */
15
+ surface?: Surface;
9
16
  /**
10
17
  * Auto-dismiss delay in ms, forwarded to reka-ui's `ToastRoot`. Omit to
11
18
  * inherit the `ToastProvider` default; `Number.POSITIVE_INFINITY` keeps the
@@ -152,6 +159,13 @@ declare function useToast(): {
152
159
  __name?: string | undefined;
153
160
  } | undefined;
154
161
  variant?: ToastVariant
162
+ /**
163
+ * BB.W-SURFACE-AXIS-COMPLETE — the shared {glass·veil·opaque} surface-decoration
164
+ * axis on a queued toast (default `glass`). Forwarded through `Toaster.vue`'s
165
+ * per-toast `v-bind` exactly like `variant`; orthogonal to the tone arm.
166
+ */
167
+ | undefined;
168
+ surface?: Surface
155
169
  /**
156
170
  * Auto-dismiss delay in ms, forwarded to reka-ui's `ToastRoot`. Omit to
157
171
  * inherit the `ToastProvider` default; `Number.POSITIVE_INFINITY` keeps the
@@ -16,8 +16,8 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
16
16
  "onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
17
17
  }>, {
18
18
  size: "default" | "sm" | "lg" | null;
19
- variant: "default" | "outline" | "card" | null;
20
19
  disabled: boolean;
20
+ variant: "default" | "outline" | "card" | null;
21
21
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
22
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
23
23
  declare const _default: typeof __VLS_export;
@@ -1,6 +1,12 @@
1
1
  import { type MaybeRefOrGetter } from "vue";
2
- /** The suspend reasons that gate the loop. Twins the WebGL substrate's union. */
3
- export type Canvas2DSuspendReason = "tab-hidden" | "off-screen" | "manual";
2
+ /**
3
+ * The suspend reasons that gate the loop. Twins the WebGL substrate's union
4
+ * (`createCanvasLifecycle.CanvasSuspendReason`): the AX.W16 F6 `"off-screen-io"`
5
+ * key is the IntersectionObserver fallback's OWN reason, distinct from the
6
+ * content-visibility path's `"off-screen"`, so the two offscreen detectors never
7
+ * cross-lift each other's suspend.
8
+ */
9
+ export type Canvas2DSuspendReason = "tab-hidden" | "off-screen" | "off-screen-io" | "manual";
4
10
  /** The per-frame hooks a consumer's `setup(ctx)` returns. */
5
11
  export interface Canvas2DFrame {
6
12
  /**
@@ -47,10 +53,11 @@ export interface Canvas2DHandle {
47
53
  }
48
54
  /**
49
55
  * The Canvas2D lifecycle substrate — the park/freeze/dispose twin of
50
- * `useWebGLCanvas`. Returns an imperative {@link Canvas2DHandle} (the same
51
- * handle idiom the WebGL twin uses — an imperative canvas seam is NOT a
52
- * ref-bundle). `useCanvasLifecycle` is the alias-of-record for the
53
- * lifecycle-only framing; both name the same factory.
56
+ * `useWebGLCanvas`, a thin Canvas2D backend over the shared
57
+ * `createCanvasLifecycle` core. Returns an imperative {@link Canvas2DHandle} (the
58
+ * same handle idiom the WebGL twin uses — an imperative canvas seam is NOT a
59
+ * ref-bundle). `useCanvasLifecycle` is the alias-of-record for the lifecycle-only
60
+ * framing; both name the same factory.
54
61
  */
55
62
  export declare function useCanvas2D(options: Canvas2DOptions): Canvas2DHandle;
56
63
  /**
@@ -1,4 +1,7 @@
1
- export { useSpecularTracking } from "./useSpecularTracking";
2
- export type { UseSpecularTracking } from "./useSpecularTracking";
1
+ export { useSpecularTracking, createSpecularWriter, } from "./useSpecularTracking";
2
+ export type { UseSpecularTracking, SpecularWriter, } from "./useSpecularTracking";
3
+ export { vSpecular } from "./vSpecular";
4
+ export { useSpecularPointer } from "./useSpecularPointer";
5
+ export type { UseSpecularPointer } from "./useSpecularPointer";
3
6
  export { useCanvas2D, useCanvasLifecycle, resolveCanvasColor } from "./canvas2d";
4
7
  export type { Canvas2DFrame, Canvas2DHandle, Canvas2DOptions, Canvas2DSuspendReason, } from "./canvas2d";
@@ -0,0 +1,33 @@
1
+ import { ref, type CSSProperties } from "vue";
2
+ /**
3
+ * `useSpecularPointer` — the EVOLUTION of `useSpecularTracking` (BB.W-LENSING). It
4
+ * writes the catch-light POSITION (`--mouse-x`/`--mouse-y`, as today) PLUS the
5
+ * `--specular-angle` channel — the pointer's angle-from-center the EDGE-glint conic
6
+ * sweep reads (the `.glass-material::before` recipe, material.css). The angle feed is
7
+ * what turns the centered disc into a motion-reactive RIM glint (the glass-THICKNESS
8
+ * read); the leaf is the ONE shared specular source the hover/button waves consume.
9
+ *
10
+ * SINGLE-SOURCE (the W-LIQUIDHOVER reconcile, EXTENDED here — NOT a fork). There is
11
+ * exactly ONE position-write core: `createSpecularWriter` (useSpecularTracking.ts) —
12
+ * the rAF-coalesced, cached-PRM, scope-dispose seam. This composable WRAPS that core;
13
+ * the angle is DERIVED in the sink from the SAME `(x, y)` percentage the core already
14
+ * computes (`angle = atan2(y - 50, x - 50)`), so there is NO duplicate
15
+ * `getBoundingClientRect` / `--mouse-x` write — the core owns the layout read + the
16
+ * coordinate math, this leaf only adds the angle derivation onto the existing sink.
17
+ * `useSpecularTracking` (the position-only delivery) STAYS for the bare-position call
18
+ * sites; `useSpecularPointer` is the angle-adding delivery for an edge-glint consumer.
19
+ * Both wrap the ONE core — never two copies of the rAF/PRM/coordinate logic.
20
+ *
21
+ * PRM-aware by construction (the wrapped core skips the write under
22
+ * `prefers-reduced-motion: reduce` — the CSS bracket pins `--specular-x/y` to the
23
+ * centred 50% and `--specular-angle` to its `0deg` static rest). The composable
24
+ * disposes the core (cancel the pending rAF + drop the cached PRM listener) on scope
25
+ * teardown.
26
+ */
27
+ export interface UseSpecularPointer {
28
+ /** Bind to the host element's `:style`. Carries `--mouse-x/--mouse-y` + `--specular-angle`. */
29
+ specularStyle: ReturnType<typeof ref<CSSProperties>>;
30
+ /** Bind to the host's `@pointermove`. Schedules the rAF-coalesced position+angle write (PRM-gated). */
31
+ onPointerMove: (event: PointerEvent) => void;
32
+ }
33
+ export declare function useSpecularPointer(): UseSpecularPointer;
@@ -32,6 +32,13 @@ import { ref, type CSSProperties } from "vue";
32
32
  * W54 maximal-glass every blurred-surface repaint is amortized to the frame, not the
33
33
  * event). The composable cancels the pending rAF + removes the matchMedia listener on
34
34
  * scope dispose (cleanup discipline).
35
+ *
36
+ * BB.W-LIQUIDHOVER — the rAF-coalesce + cached-PRM + cleanup LOGIC is extracted to
37
+ * `createSpecularWriter()`, the SINGLE position-write core. The composable below wraps
38
+ * it for the Vue `:style`-ref case (Card's prop-gated `specular` opt-in); the
39
+ * tier-root auto-arm (`vSpecular`) wraps the SAME core to write directly on the
40
+ * directive host's `el.style` (the zero-wiring delivery). ONE position-write source,
41
+ * TWO deliveries — never a re-pasted handler.
35
42
  */
36
43
  export interface UseSpecularTracking {
37
44
  /** Bind to the host element's `:style`. Carries the `--mouse-x/--mouse-y` write. */
@@ -39,4 +46,17 @@ export interface UseSpecularTracking {
39
46
  /** Bind to the host's `@pointermove`. Schedules the rAF-coalesced position write (PRM-gated). */
40
47
  onPointerMove: (event: PointerEvent) => void;
41
48
  }
49
+ /**
50
+ * The SINGLE position-write core (BB.W-LIQUIDHOVER) — the rAF-coalesced,
51
+ * PRM-aware `--mouse-x/y` write seam, sink-agnostic. `sink(x, y)` receives the
52
+ * percentage position once per animation frame; the composable sinks into its
53
+ * `specularStyle` ref, the `vSpecular` directive sinks into `el.style.setProperty`.
54
+ * Returns the event handler + a `dispose` (cancel the pending rAF + drop the cached
55
+ * PRM listener) so BOTH deliveries share ONE cleanup discipline.
56
+ */
57
+ export interface SpecularWriter {
58
+ onPointerMove: (event: PointerEvent) => void;
59
+ dispose: () => void;
60
+ }
61
+ export declare function createSpecularWriter(sink: (xPct: number, yPct: number) => void): SpecularWriter;
42
62
  export declare function useSpecularTracking(): UseSpecularTracking;
@@ -0,0 +1,2 @@
1
+ import type { ObjectDirective } from "vue";
2
+ export declare const vSpecular: ObjectDirective<HTMLElement, boolean | undefined>;
@@ -0,0 +1 @@
1
+ export declare const CURL_FBM_GLSL = "\nconst float CURL_EPS = 0.012;\n\n// Scalar fbm potential psi \u2014 the host's noise basis, wrapped so the curl operator is\n// basis-agnostic. A host carrying its own fbm defines this as: return fbm(p);\nfloat potentialFBM(vec2 p);\n\n// \u2207\u00D7\u03C8 in 2D \u2014 the divergence-free flow direction. Central finite differences of the\n// scalar potential give the partials; the cross-pairing (\u2202y, \u2212\u2202x) is the 2D curl.\nvec2 curlFBM(vec2 p) {\n float dx = potentialFBM(p + vec2(CURL_EPS, 0.0)) - potentialFBM(p - vec2(CURL_EPS, 0.0));\n float dy = potentialFBM(p + vec2(0.0, CURL_EPS)) - potentialFBM(p - vec2(0.0, CURL_EPS));\n // \u03C8-gradient is (dx, dy)/(2\u00B7eps); the curl rotates it 90\u00B0: (\u2202\u03C8/\u2202y, \u2212\u2202\u03C8/\u2202x).\n vec2 g = vec2(dx, dy) / (2.0 * CURL_EPS);\n return vec2(g.y, -g.x);\n}\n";
@@ -1,3 +1,19 @@
1
+ /**
2
+ * The ONE `getContext("webgl2")` capability probe (BB.W-CI-GREEN — the
3
+ * single-bootstrap rule). A throwaway WebGL2 context is created here, in the
4
+ * substrate (the sole webgl2-creating module per `proof:webgl-substrate-single`),
5
+ * so a consumer feature-detecting WebGL2 / reading the unmasked renderer string
6
+ * NEVER creates a second context of its own. The probe canvas is detached, its
7
+ * context released via `WEBGL_lose_context` under the per-page context cap; the
8
+ * read is one-shot (a mount-time device-tier decision, not a reactive one).
9
+ *
10
+ * Returns the lower-cased `UNMASKED_RENDERER_WEBGL` string (e.g.
11
+ * `"google swiftshader"`), or `null` when WebGL2 / the debug-renderer extension
12
+ * is unavailable or the probe throws — the caller treats `null` as "cannot prove"
13
+ * (the conservative-but-lossy fall-back). SSR-safe (returns `null` with no
14
+ * `document`).
15
+ */
16
+ export declare function probeWebGL2Renderer(): string | null;
1
17
  export type WebGLSuspendReason = "tab-hidden" | "off-screen" | "off-screen-io" | "manual";
2
18
  /** The per-frame hooks a consumer's `setup(gl)` returns. */
3
19
  export interface WebGLCanvasFrame {
@@ -0,0 +1,2 @@
1
+ export { createWebGPUCanvas, supportsWebGPU, type WebGPUCanvasFrame, type WebGPUCanvasHandle, type WebGPUCanvasOptions, type WebGPUSuspendReason, } from "./useWebGPUCanvas";
2
+ export { createGpuSubstrate, type GpuBackend, type GpuSubstrateHandle, type GpuSubstrateOptions, } from "./useGpuSubstrate";
@@ -0,0 +1,54 @@
1
+ import { type WebGLCanvasFrame, type WebGLCanvasOptions } from "../webgl/useWebGLCanvas";
2
+ import { supportsWebGPU, type WebGPUCanvasFrame, type WebGPUCanvasOptions } from "./useWebGPUCanvas";
3
+ export { supportsWebGPU };
4
+ /** Which backend the picker resolved. */
5
+ export type GpuBackend = "webgpu" | "webgl2";
6
+ export interface GpuSubstrateOptions {
7
+ /** `"capture"` → renderAt-only (no auto-loop). Default `"live"`. */
8
+ mode?: "live" | "capture";
9
+ /** Honor `prefers-reduced-motion: reduce` (one static frame then park). Default `true`. */
10
+ respectReducedMotion?: boolean;
11
+ /**
12
+ * The WGSL pipeline builder (the WebGPU primary path). Omitting it forces the
13
+ * WebGL2 fallback even where WebGPU is supported (a viz with no WGSL path yet).
14
+ */
15
+ setupWGPU?: WebGPUCanvasOptions["setup"];
16
+ /** The GLSL program builder (the WebGL2 fallback path — always required). */
17
+ setupGL: WebGLCanvasOptions["setup"];
18
+ /** WebGPU `context.configure` alpha mode (default `"premultiplied"`). */
19
+ alphaMode?: WebGPUCanvasOptions["alphaMode"];
20
+ /** WebGPU adapter/device request options. */
21
+ adapterOptions?: WebGPUCanvasOptions["adapterOptions"];
22
+ deviceDescriptor?: WebGPUCanvasOptions["deviceDescriptor"];
23
+ /** WebGL2 `getContext("webgl2", …)` attributes. */
24
+ contextAttrs?: WebGLCanvasOptions["contextAttrs"];
25
+ /** Surface a device-init / validation failure (the WebGPU path). */
26
+ onInitError?: WebGPUCanvasOptions["onInitError"];
27
+ }
28
+ /**
29
+ * The uniform substrate handle. A viz consumer wires its lifecycle (offscreen pause,
30
+ * pause/resume, pointer-`wake`, capture-`renderAt`) against THIS — identical across the
31
+ * WebGPU and WebGL2 backends. `armAsync` is the start seam (the WebGPU path awaits the
32
+ * device; the WebGL2 path resolves immediately); `arm` is the synchronous twin.
33
+ */
34
+ export interface GpuSubstrateHandle {
35
+ /** The resolved backend (`"webgpu"` where supported + a WGSL path is provided, else `"webgl2"`). */
36
+ readonly backend: GpuBackend;
37
+ /** Acquire the device/context + `setup` + arm the loop. Resolves once armed. */
38
+ armAsync: () => Promise<void>;
39
+ /** Synchronous arm (the WebGL2 path arms immediately; the WebGPU path is a no-op until the device resolves). */
40
+ arm: () => void;
41
+ suspend: (reason?: "tab-hidden" | "off-screen" | "off-screen-io" | "manual") => void;
42
+ resume: (reason?: "tab-hidden" | "off-screen" | "off-screen-io" | "manual") => void;
43
+ wake: () => void;
44
+ renderAt: (timeSec: number) => void;
45
+ dispose: () => void;
46
+ readonly reducedMotion: boolean;
47
+ }
48
+ /**
49
+ * Pick the backend + return the uniform handle. WebGPU-first (`supportsWebGPU()` AND a
50
+ * `setupWGPU` callback is provided); otherwise the WebGL2 fallback. The decision is
51
+ * made ONCE at construction (a mount-time device-tier choice, not a reactive one).
52
+ */
53
+ export declare function createGpuSubstrate(canvas: HTMLCanvasElement, options: GpuSubstrateOptions): GpuSubstrateHandle;
54
+ export type { WebGPUCanvasFrame, WebGLCanvasFrame };
@@ -0,0 +1,84 @@
1
+ /**
2
+ * The ONE `navigator.gpu` capability probe (the single-bootstrap rule — mirrors
3
+ * `probeWebGL2Renderer`). SSR-safe (returns `false` with no `navigator`). The picker
4
+ * (`useGpuSubstrate`) reads it to decide the backend; a consumer NEVER touches
5
+ * `navigator.gpu` directly (it composes the substrate — `proof:gpu-substrate-single`
6
+ * clause A reds a direct call).
7
+ */
8
+ export declare function supportsWebGPU(): boolean;
9
+ export type WebGPUSuspendReason = "tab-hidden" | "off-screen" | "off-screen-io" | "manual";
10
+ /**
11
+ * The per-frame hooks a consumer's `setup(device, context, format)` returns. The
12
+ * consumer owns the WGSL pipeline + bind groups + the per-frame command-encoder
13
+ * record/submit; the substrate owns the schedule.
14
+ */
15
+ export interface WebGPUCanvasFrame {
16
+ /**
17
+ * Draw one frame at `timeSec`: the consumer records a command encoder, begins a
18
+ * render pass against the current swap-chain texture view
19
+ * (`context.getCurrentTexture().createView()`), draws, and submits.
20
+ */
21
+ frame: (timeSec: number) => void;
22
+ /** Demand-gate: is there live motion to render next frame? `false` → park. */
23
+ shouldContinue: () => boolean;
24
+ /** Size the canvas backing store. The consumer owns its DPR policy. */
25
+ resize: () => void;
26
+ /** Frame time from elapsed seconds — the consumer owns frozen/reduced-motion. */
27
+ time?: (elapsedSec: number) => number;
28
+ /** Release per-instance GPU resources (pipelines/buffers/bind groups). Runs on dispose + before a restore re-setup. */
29
+ teardown?: () => void;
30
+ }
31
+ export interface WebGPUCanvasOptions {
32
+ /** `context.configure` alpha mode (the consumer's — default `"premultiplied"`). */
33
+ alphaMode?: GPUCanvasAlphaMode;
34
+ /** Extra device-request options (features/limits). */
35
+ deviceDescriptor?: GPUDeviceDescriptor;
36
+ /** Adapter-request options (e.g. `powerPreference`). */
37
+ adapterOptions?: GPURequestAdapterOptions;
38
+ /** `"capture"` pre-seeds the `manual` suspension (renderAt-only). Default `"live"`. */
39
+ mode?: "live" | "capture";
40
+ /**
41
+ * Honor `prefers-reduced-motion: reduce` by painting ONE static frame then
42
+ * parking the loop. The shared lifecycle core live-monitors the query via a
43
+ * `matchMedia` `change` listener and re-arms (one static frame) on un-reduce.
44
+ * Default `true` for live mode, `false` for capture mode.
45
+ */
46
+ respectReducedMotion?: boolean;
47
+ /**
48
+ * Build the WGSL pipeline + bind groups on the resolved device. Called on the
49
+ * async arm AND on every device-restore. Returns the per-frame hooks.
50
+ */
51
+ setup: (device: GPUDevice, context: GPUCanvasContext, format: GPUTextureFormat) => WebGPUCanvasFrame;
52
+ /** Surface a device-init / validation failure (no WebGPU adapter, a `setup` throw). */
53
+ onInitError?: (error: unknown) => void;
54
+ }
55
+ export interface WebGPUCanvasHandle {
56
+ /**
57
+ * Run the expensive ASYNC init (adapter + device + context.configure + `setup`)
58
+ * THEN arm the loop. Resolves once armed (or rejects-via-`onInitError` on a
59
+ * device-unavailable / `setup` failure). Idempotent; a no-op post-dispose.
60
+ */
61
+ armAsync: () => Promise<void>;
62
+ /**
63
+ * Synchronous `arm` — a no-op until `armAsync` has resolved the device (the
64
+ * uniform-handle parity with the synchronous backends; the picker calls
65
+ * `armAsync` for the WebGPU path). Idempotent.
66
+ */
67
+ arm: () => void;
68
+ suspend: (reason?: WebGPUSuspendReason) => void;
69
+ resume: (reason?: WebGPUSuspendReason) => void;
70
+ /** Re-arm a parked loop (a setter that re-introduced motion calls this). */
71
+ wake: () => void;
72
+ /** Draw one frame at `timeSec` out-of-loop (capture / thumbnail). */
73
+ renderAt: (timeSec: number) => void;
74
+ dispose: () => void;
75
+ /** The live device (null before armAsync / after dispose / mid-loss). */
76
+ readonly device: GPUDevice | null;
77
+ /**
78
+ * The live `prefers-reduced-motion: reduce` state. The shared lifecycle core
79
+ * owns + re-monitors it; consumers read it (e.g. a viz freezes its frame time
80
+ * at the authored offset while this is `true`).
81
+ */
82
+ readonly reducedMotion: boolean;
83
+ }
84
+ export declare function createWebGPUCanvas(canvas: HTMLCanvasElement, options: WebGPUCanvasOptions): WebGPUCanvasHandle;
@@ -10,3 +10,4 @@ export * from "../useViewTransition";
10
10
  export * from "../vReveal";
11
11
  export * from "../useTextHighlight";
12
12
  export * from "../useLiquidFlex";
13
+ export * from "../usePointerVelocityField";
@@ -2,6 +2,10 @@ export * from "./constants";
2
2
  export * from "./useSpring";
3
3
  export * from "./useSpringMount";
4
4
  export * from "./useSpringPress";
5
+ export * from "./useLiquidPress";
6
+ export * from "./useDragMorph";
7
+ export * from "./useLiquidReveal";
8
+ export * from "./useDockCtaReceive";
5
9
  export * from "./useNumericTransition";
6
10
  export * from "./useAnimatedNumber";
7
11
  export * from "./useAnimatedNumberMap";
@@ -0,0 +1,59 @@
1
+ import { type Ref } from "vue";
2
+ import { type SpringPresetName } from "./springPresets";
3
+ /** The receive spring register — `snappy` (the crisp absorb default) or `bouncy`
4
+ * (the emphatic land-with-overshoot). A subset of the named `SPRING_PRESETS` rows,
5
+ * matching `useLiquidReveal`'s register so the two seams read as ONE family. */
6
+ export type DockCtaReceivePreset = Extract<SpringPresetName, "snappy" | "bouncy">;
7
+ export interface UseDockCtaReceiveOptions {
8
+ /**
9
+ * The target dock control the CTA morphs INTO — the destination rect (the
10
+ * `<DockIconButton>`/dock control element). When null at receive time, the morph
11
+ * is a no-op snap (no destination to fly to) and `onReceived` fires immediately.
12
+ */
13
+ dockControl: Ref<HTMLElement | null>;
14
+ /** The spring register (default `snappy`). */
15
+ preset?: DockCtaReceivePreset;
16
+ /** The ending congest blur radius in px (the CTA dissolves into the glass). Default 4. */
17
+ blur?: number;
18
+ /** Honor `prefers-reduced-motion: reduce` (snap to gone, then hand off). Default true. */
19
+ respectReducedMotion?: boolean;
20
+ /**
21
+ * Fired ONCE when the CTA has landed on the dock control (the hand-off seam) — the
22
+ * consumer hides the CTA + activates the dock control here. Fires on the animation
23
+ * settle AND on the PRM/no-target snap (the gesture always completes).
24
+ */
25
+ onReceived?: () => void;
26
+ }
27
+ export interface UseDockCtaReceiveReturn {
28
+ /**
29
+ * Morph the CTA into the dock control. Idempotent per call — measures the CTA +
30
+ * dock-control rects fresh, drives the spring 0→1 (fly+reshape+fade+congest). A
31
+ * no-op if the CTA element is not yet mounted (no `onReceived`).
32
+ */
33
+ receive: () => void;
34
+ /**
35
+ * Clear the morph transform (restore the CTA to its own rect, opacity 1) — the
36
+ * abort/reset seam. Cancels any in-flight morph; does NOT fire `onReceived`.
37
+ */
38
+ reset: () => void;
39
+ }
40
+ /**
41
+ * The external-CTA-into-dock-control morph. Composes the SAME kf `ElementMorph` +
42
+ * `springTimingFunction` substrate `useLiquidReveal` activates, driven FORWARD (the
43
+ * reveal's inverse): the CTA flies + reshapes from its own rect onto the dock
44
+ * control's rect, fades + congests into the glass on the spring clock, then hands off.
45
+ * Compositor-only + PRM-seats. See the module header for the REUSE + the FORWARD-play
46
+ * mechanism + the channel split.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const { receive, reset } = useDockCtaReceive(ctaRef, {
51
+ * dockControl: dockTargetRef,
52
+ * preset: "snappy",
53
+ * onReceived: () => (ctaConsumed.value = true),
54
+ * })
55
+ * // on the CTA click: morph it into the dock.
56
+ * function onCta() { receive() }
57
+ * ```
58
+ */
59
+ export declare function useDockCtaReceive(cta: Ref<HTMLElement | null>, options: UseDockCtaReceiveOptions): UseDockCtaReceiveReturn;
@@ -0,0 +1,77 @@
1
+ import { type ComputedRef, type Ref } from "vue";
2
+ /** The morph axis — `"x"` tracks the inline (horizontal) travel, `"y"` the block. */
3
+ export type DragMorphAxis = "x" | "y";
4
+ /**
5
+ * One snap target on the drag axis. `value` is the consumer's domain value (the
6
+ * tab/layer id) committed via `onSnap`; `center` is the target's center coordinate
7
+ * in the SAME px space the drag tracks (the element's offset-axis center).
8
+ */
9
+ export interface DragMorphSnapTarget<V = string> {
10
+ value: V;
11
+ center: number;
12
+ }
13
+ export interface UseDragMorphParams<V = string> {
14
+ /** The draggable element ref (the indicator/handle the gesture captures). */
15
+ el: Ref<HTMLElement | null>;
16
+ /** The morph axis (`"x"` horizontal · `"y"` vertical). May be a getter. */
17
+ axis: DragMorphAxis | (() => DragMorphAxis);
18
+ /**
19
+ * The ordered snap targets, resolved off the consumer's geometry (the
20
+ * center-anchored button/layer centers). May be a getter so a re-measure
21
+ * (a resize, an option change) re-resolves them without reconstruction.
22
+ */
23
+ snapTargets: readonly DragMorphSnapTarget<V>[] | (() => readonly DragMorphSnapTarget<V>[]);
24
+ /**
25
+ * The live cap getter for the squish (`--tab-indicator-max-stretch`, ≤1.08).
26
+ * Defaults to the shared 1.08 fence; a getter re-reads the cascade override.
27
+ */
28
+ maxStretch?: () => number;
29
+ /**
30
+ * Fired ONCE on settle at the nearest snap with the committed value. The
31
+ * consumer writes its `v-model` here — the single source of truth.
32
+ */
33
+ onSnap: (value: V) => void;
34
+ /** Honor `prefers-reduced-motion: reduce` (squish off, instant snap). Default true. */
35
+ respectReducedMotion?: boolean;
36
+ }
37
+ export interface UseDragMorphReturn {
38
+ /** True while a pointer gesture is in progress (down, not yet settled). */
39
+ dragging: Readonly<Ref<boolean>>;
40
+ /** The live drag position on the morph axis (px), for diagnostics/tests. */
41
+ position: Readonly<Ref<number>>;
42
+ /** The live squish scalar (≥1, capped at the live cap). 1 at rest / under PRM. */
43
+ stretch: Readonly<Ref<number>>;
44
+ /** The `transform: translate` style the consumer binds on the morph element. */
45
+ dragStyle: ComputedRef<Record<string, string>>;
46
+ /**
47
+ * Re-resolve the snap centers + axis (kf reads `snap` at construction, so a
48
+ * geometry change — a resize, an option change, an orientation flip — calls
49
+ * this to rebuild the `Draggable` over the SAME reused spring). Idempotent;
50
+ * a no-op while a gesture is in flight (the rebuild waits for settle).
51
+ */
52
+ refresh: () => void;
53
+ /** Tear down — detach the `Draggable`, dispose the spring + watchers. */
54
+ detach: () => void;
55
+ }
56
+ /**
57
+ * The abstract pull/drag-to-morph-squish gesture. Composes kf `Draggable`
58
+ * (pointer-capture follow + velocity + snap-aware fling) + `SpringProgress` (the
59
+ * physics core) + `useLiquidFlex` (`"tanh"` velocity-squish) into ONE gesture with
60
+ * a consumer-wired single-commit `onSnap`. See the module header for the REUSE +
61
+ * compositor-only + PRM rationale.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * const { dragging, stretch, dragStyle, detach } = useDragMorph({
66
+ * el: indicatorRef,
67
+ * axis: () => (isVertical.value ? "y" : "x"),
68
+ * snapTargets: () => buttonRefs.value.map((b, i) => ({
69
+ * value: options.value[i].value,
70
+ * center: b.offsetLeft + b.offsetWidth / 2,
71
+ * })),
72
+ * maxStretch: () => readCap(),
73
+ * onSnap: (v) => { model.value = v },
74
+ * })
75
+ * ```
76
+ */
77
+ export declare function useDragMorph<V = string>(params: UseDragMorphParams<V>): UseDragMorphReturn;
@@ -53,6 +53,17 @@ export interface UseLiquidFlexReturn {
53
53
  /**
54
54
  * The size as a CSS length style object, keyed on `axis` (`{ width: "Npx" }` or
55
55
  * `{ height: "Npx" }`). Bind on the morphing element's style.
56
+ *
57
+ * DOCTRINE (BB.W-MOTION-CANON, P5 — the SIZESTYLE-LATENT record): `sizeStyle`
58
+ * is the SETTLED-FOOTPRINT writer — a one-time reserve of the morph TARGET box
59
+ * (the FLIP-measured `to` span), NEVER the per-frame animation channel. The
60
+ * per-frame channel is `transform` (the `stretchStyle` `--stretch` reciprocal
61
+ * scale, a compositor property). Binding `sizeStyle` to a CONTINUOUSLY-animated
62
+ * element animates `width`/`height` per frame OFF the compositor (the A'-3
63
+ * reflow-storm class proof:no-layout-animation forbids library-wide) — FORBIDDEN
64
+ * by the canon. Write the reserved footprint ONCE at the morph endpoint, then
65
+ * drive the visible motion through `stretchStyle`/`transform`. See
66
+ * `docs/precepts/motion-canon.md` P5.
56
67
  */
57
68
  sizeStyle: ComputedRef<Record<string, string>>;
58
69
  /**
@@ -0,0 +1,71 @@
1
+ import { type CSSProperties, type ComputedRef, type Ref } from "vue";
2
+ import { type UseSpringPressOptions } from "./useSpringPress";
3
+ export interface UseLiquidPressOptions extends UseSpringPressOptions {
4
+ /**
5
+ * The uniform press SHRINK depth — the contraction the press scale reaches at
6
+ * `t=1` (the iOS uniform shrink the reciprocal squish deforms AROUND). The X axis
7
+ * reads `shrink·stretch`, the Y axis `shrink/stretch` (the volume preserved on the
8
+ * travel axis). Default 0.03 (the button `--scale-press-btn` 0.97 magnitude — the
9
+ * JS path AGREES with the CSS `.tap-squish active:scale` floor). A calmer surface
10
+ * (the dock control's no-overshoot tap register) passes a smaller depth.
11
+ */
12
+ shrinkDepth?: number;
13
+ /**
14
+ * The LOW reciprocal-squish cap handed to `useLiquidFlex` (the +N% elongation along
15
+ * the travel axis). Default 1.04 (a button has no size span — the deform is a
16
+ * lively settle, never a taffy-pull). Kept LOW by the liquid register.
17
+ */
18
+ maxStretch?: number;
19
+ /**
20
+ * The custom-property NAME the live press value (0..1) is written under, for the
21
+ * surface CSS to read for the coupled brightness/specular leg. Default
22
+ * `"--press-t"`. Button passes `"--glass-btn-press-t"` (the W-BUTTON-GLASS drive
23
+ * the gleam already reads); the dock control passes `"--dock-press-t"`.
24
+ */
25
+ pressVar?: string;
26
+ /**
27
+ * Below this travel threshold the inline `scale` is OMITTED from `pressStyle` so the
28
+ * surface's at-rest CVA/utility transforms (a hover `scale`) win unimpeded; the JS
29
+ * reciprocal scale wins ONLY while the press is engaged (the single-source press,
30
+ * then yields back to the cascade as it settles). Default 0.001.
31
+ */
32
+ engageThreshold?: number;
33
+ }
34
+ export interface UseLiquidPressReturn {
35
+ /** The live spring press value (0 released → 1 pressed, with the spring overshoot). */
36
+ value: Readonly<Ref<number>>;
37
+ /** Drive the press to 1 (call on `pointerdown`). Interruptible — re-targets the live spring. */
38
+ press: () => void;
39
+ /** Release the press to 0 (call on `pointerup`/`cancel`/`leave`). */
40
+ release: () => void;
41
+ /** Pointer handlers ready to spread onto an element (the `useSpringPress` ergonomics). */
42
+ handlers: {
43
+ onPointerdown: () => void;
44
+ onPointerup: () => void;
45
+ onPointercancel: () => void;
46
+ onPointerleave: () => void;
47
+ };
48
+ /**
49
+ * The coupled press style — the ONE `:style` object a consumer binds. Carries the
50
+ * reciprocal X/Y `scale` (engaged only past `engageThreshold`) AND the `pressVar`
51
+ * 0..1 drive scalar the surface CSS reads for the brightness/specular leg.
52
+ * Compositor-only (`scale` + a custom property — never a layout property).
53
+ */
54
+ pressStyle: ComputedRef<CSSProperties>;
55
+ }
56
+ /**
57
+ * The ONE interruptible, coupled spring-press. Composes `useSpringPress` (the spring
58
+ * driver, PRM-aware) + `useLiquidFlex` (the volume-preserving reciprocal squish) and
59
+ * exposes a single `pressStyle` object + the pointer `handlers`.
60
+ *
61
+ * @example
62
+ * ```vue
63
+ * <script setup>
64
+ * const press = useLiquidPress()
65
+ * </script>
66
+ * <template>
67
+ * <button v-bind="press.handlers" :style="press.pressStyle" />
68
+ * </template>
69
+ * ```
70
+ */
71
+ export declare function useLiquidPress(options?: UseLiquidPressOptions): UseLiquidPressReturn;