@mkbabb/glass-ui 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/dist/{CardAction-8whJrLWt.js → CardAction-DlVP2evz.js} +58 -54
  2. package/dist/{CommandShortcut-D3yxgHNn.js → CommandShortcut-By-VQcLO.js} +3 -3
  3. package/dist/{ConfiguratorRow-CaP7U3ZA.js → ConfiguratorRow-YMXdINHx.js} +3 -3
  4. package/dist/{ContextMenuContent-B3ZsheLV.js → ContextMenuContent-CMWn6huB.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DDRID3qC.js → ContextMenuSubContent-DvwWCUc0.js} +1 -1
  6. package/dist/{DataTable-Bc9kUtu_.js → DataTable-C4tG3eIJ.js} +4 -4
  7. package/dist/DialogContent-D8U9ZfWS.js +121 -0
  8. package/dist/{DialogScrollContent-TTuovQst.js → DialogScrollContent-BMekN7gq.js} +1 -1
  9. package/dist/{FadingScroll-DLRbH5Xr.js → FadingScroll-P8B30rAD.js} +1 -1
  10. package/dist/{HoverCardContent-Bel1gdLZ.js → HoverCardContent-DAmGYglo.js} +1 -1
  11. package/dist/{HoverPopover-BcIxvyqZ.js → HoverPopover-DYpBOzzF.js} +1 -1
  12. package/dist/{IconChip-DhbdGdFQ.js → IconChip-CQa7XZYc.js} +7 -5
  13. package/dist/{IconTooltip-B0zimd2H.js → IconTooltip-_df8M3xm.js} +1 -1
  14. package/dist/{Input-Cg9DF62r.js → Input-CyU4_hIC.js} +2 -2
  15. package/dist/{MetricBadge-RHdBP72w.js → MetricBadge-DQt_dGah.js} +1 -1
  16. package/dist/{Notification-CphK7AAm.js → Notification-BlSPJhtZ.js} +1 -1
  17. package/dist/{NumberFieldContent-D8cXeyO4.js → NumberFieldContent-Z3VxGu_6.js} +3 -3
  18. package/dist/PagerDots-CYlqVFd4.js +196 -0
  19. package/dist/PaperBackdrop-DYWgrnh8.js +42 -0
  20. package/dist/{PopoverContent-DL7E6vJP.js → PopoverContent-BuKyHZSz.js} +2 -2
  21. package/dist/{Progress-CnqB7gLm.js → Progress-C9SsdwIZ.js} +1 -1
  22. package/dist/{ScrollingText-CTZbA_cG.js → ScrollingText-DY3W1Jfh.js} +2 -2
  23. package/dist/{SelectScrollDownButton-DAKCBEdW.js → SelectScrollDownButton-3mFHX_R-.js} +15 -12
  24. package/dist/{Switch-B8RscmRu.js → Switch-uf-UKPA2.js} +1 -1
  25. package/dist/{Toaster-D9qIHjBI.js → Toaster-ozrsR4mP.js} +1 -1
  26. package/dist/{ToggleGroupItem-BLtr3TJq.js → ToggleGroupItem-BpzaVzNm.js} +4 -4
  27. package/dist/{TooltipProvider-BJ_Y5EGX.js → TooltipProvider-QQVM_80r.js} +1 -1
  28. package/dist/animated-digit.js +2 -2
  29. package/dist/api/index.d.ts +1 -0
  30. package/dist/api/types-extra.d.ts +3 -1
  31. package/dist/api.js +2 -2
  32. package/dist/aurora.js +163 -131
  33. package/dist/badge-Bt14yURi.js +72 -0
  34. package/dist/badge.js +1 -1
  35. package/dist/border-progress.js +1 -1
  36. package/dist/button-D1W9PrzI.js +130 -0
  37. package/dist/button.js +1 -1
  38. package/dist/canvas.js +1 -1
  39. package/dist/card.js +1 -1
  40. package/dist/carousel.js +227 -98
  41. package/dist/chipVariants-BJQ0I2kB.js +18 -0
  42. package/dist/collapsible.js +1 -1
  43. package/dist/color.js +1 -1
  44. package/dist/command.js +1 -1
  45. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  46. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +1 -1
  47. package/dist/components/custom/aurora/constants/presets.d.ts +29 -0
  48. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
  49. package/dist/components/custom/aurora/index.d.ts +1 -1
  50. package/dist/components/custom/concentric/Concentric.vue.d.ts +15 -12
  51. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +8 -3
  52. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +8 -4
  53. package/dist/components/custom/concentric/composables/levelField.d.ts +50 -0
  54. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +7 -4
  55. package/dist/components/custom/concentric/composables/useConcentric.d.ts +3 -3
  56. package/dist/components/custom/concentric/constants.d.ts +62 -41
  57. package/dist/components/custom/concentric/index.d.ts +2 -2
  58. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +2 -2
  59. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -1
  60. package/dist/components/custom/configurator/Configurator.vue.d.ts +23 -2
  61. package/dist/components/custom/configurator/index.d.ts +1 -1
  62. package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +4 -3
  63. package/dist/components/custom/dock/DockIconButton.vue.d.ts +10 -0
  64. package/dist/components/custom/dock/DockPopoverTrigger.vue.d.ts +19 -0
  65. package/dist/components/custom/dock/DockStack.vue.d.ts +35 -22
  66. package/dist/components/custom/dock/GlassDock.vue.d.ts +19 -3
  67. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +18 -32
  68. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +76 -145
  69. package/dist/components/custom/dock/composables/index.d.ts +1 -0
  70. package/dist/components/custom/dock/composables/railProjection.d.ts +45 -0
  71. package/dist/components/custom/dock/composables/useDockContextSilhouette.d.ts +192 -0
  72. package/dist/components/custom/dock/composables/useDockFission.d.ts +158 -0
  73. package/dist/components/custom/dock/composables/useDockItemDrag.d.ts +18 -0
  74. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +38 -0
  75. package/dist/components/custom/dock/constants.d.ts +14 -3
  76. package/dist/components/custom/dock/index.d.ts +3 -0
  77. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +21 -0
  78. package/dist/components/custom/dot-flow-field/composables/flowGLProgram.d.ts +8 -0
  79. package/dist/components/custom/dot-flow-field/composables/flowSetupGL.d.ts +9 -0
  80. package/dist/components/custom/dot-flow-field/composables/flowSetupGLFlow.d.ts +12 -0
  81. package/dist/components/custom/dot-flow-field/composables/flowSetupWGPU.d.ts +7 -0
  82. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +28 -2
  83. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -17
  84. package/dist/components/custom/dot-flow-field/constants.d.ts +51 -0
  85. package/dist/components/custom/dot-flow-field/index.d.ts +1 -1
  86. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -1
  87. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +29 -0
  88. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +2 -1
  89. package/dist/components/custom/dot-matrix/composables/uniformBridgeWGPU.d.ts +10 -1
  90. package/dist/components/custom/dot-matrix/composables/useDotSphere.d.ts +7 -0
  91. package/dist/components/custom/dot-matrix/constants.d.ts +14 -0
  92. package/dist/components/custom/dot-matrix/index.d.ts +1 -1
  93. package/dist/components/custom/dot-matrix/shaders/dot-matrix.glsl.d.ts +2 -2
  94. package/dist/components/custom/dot-matrix/shaders/dot-matrix.wgsl.d.ts +1 -1
  95. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +4 -0
  96. package/dist/components/custom/fourier-field/composables/fourierFieldGLSetup.d.ts +9 -0
  97. package/dist/components/custom/fourier-field/composables/fourierFieldWGPUSetup.d.ts +11 -0
  98. package/dist/components/custom/fourier-field/composables/uniformBridgeWGPU.d.ts +16 -1
  99. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +22 -1
  100. package/dist/components/custom/fourier-field/constants.d.ts +53 -0
  101. package/dist/components/custom/fourier-field/shaders/fourier-field.glsl.d.ts +1 -1
  102. package/dist/components/custom/fourier-field/shaders/fourier-field.render.wgsl.d.ts +1 -1
  103. package/dist/components/custom/goo-blob/composables/easing.d.ts +1 -0
  104. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +1 -0
  105. package/dist/components/custom/goo-blob/constants.d.ts +26 -1
  106. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -1
  107. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -1
  108. package/dist/components/custom/goo-blob/types.d.ts +50 -1
  109. package/dist/components/custom/goo-dot-matrix/composables/gooDotSetup.d.ts +32 -3
  110. package/dist/components/custom/goo-dot-matrix/composables/uniformBridgeWGPU.d.ts +14 -4
  111. package/dist/components/custom/goo-dot-matrix/constants.d.ts +55 -16
  112. package/dist/components/custom/goo-dot-matrix/index.d.ts +1 -1
  113. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.frag.d.ts +2 -0
  114. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.wgsl.d.ts +1 -0
  115. package/dist/components/custom/goo-filter/GooFilter.vue.d.ts +22 -0
  116. package/dist/components/custom/goo-filter/index.d.ts +1 -0
  117. package/dist/components/custom/handmark/brush.d.ts +17 -17
  118. package/dist/components/custom/handmark/constants.d.ts +28 -8
  119. package/dist/components/custom/handmark/geometry.d.ts +34 -1
  120. package/dist/components/custom/handmark/index.d.ts +1 -1
  121. package/dist/components/custom/icon-chip/types.d.ts +10 -0
  122. package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +18 -0
  123. package/dist/components/custom/paper-grid/composables/paperGrid.d.ts +44 -29
  124. package/dist/components/custom/paper-grid/composables/paperGridGLSetup.d.ts +2 -0
  125. package/dist/components/custom/paper-grid/composables/paperGridWGPUSetup.d.ts +3 -1
  126. package/dist/components/custom/paper-grid/composables/uniformBridgeWGPU.d.ts +2 -2
  127. package/dist/components/custom/paper-grid/constants.d.ts +44 -6
  128. package/dist/components/custom/paper-grid/index.d.ts +2 -2
  129. package/dist/components/custom/paper-grid/shaders/paper-grid.glsl.d.ts +1 -1
  130. package/dist/components/custom/paper-grid/shaders/paper-grid.wgsl.d.ts +1 -1
  131. package/dist/components/custom/selectable-chip/chipVariants.d.ts +39 -0
  132. package/dist/components/custom/selectable-chip/selectableChipVariants.d.ts +12 -20
  133. package/dist/components/custom/tabs/constants.d.ts +16 -8
  134. package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +16 -0
  135. package/dist/components/custom/timeline/geometry.d.ts +0 -8
  136. package/dist/components/custom/toggle-chip/index.d.ts +15 -4
  137. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +12 -10
  138. package/dist/components/ui/_shared/useSurfaceAxis.d.ts +17 -3
  139. package/dist/components/ui/badge/Badge.vue.d.ts +14 -0
  140. package/dist/components/ui/badge/index.d.ts +1 -0
  141. package/dist/components/ui/button/Button.vue.d.ts +1 -0
  142. package/dist/components/ui/card/Card.vue.d.ts +1 -1
  143. package/dist/components/ui/card/ScrollCard.vue.d.ts +1 -1
  144. package/dist/components/ui/carousel/CarouselContent.vue.d.ts +2 -4
  145. package/dist/components/ui/dialog/DialogContent.vue.d.ts +9 -0
  146. package/dist/components/ui/drawer/Drawer.vue.d.ts +33 -14
  147. package/dist/components/ui/drawer/constants.d.ts +8 -6
  148. package/dist/components/ui/drawer/index.d.ts +12 -2
  149. package/dist/components/ui/select/SelectContent.vue.d.ts +9 -0
  150. package/dist/components/ui/slider/Slider.vue.d.ts +9 -0
  151. package/dist/composables/dom/index.d.ts +1 -0
  152. package/dist/composables/dom/useDragVelocity.d.ts +46 -0
  153. package/dist/composables/glass/wave/index.d.ts +4 -0
  154. package/dist/composables/glass/wave/waveField.d.ts +115 -0
  155. package/dist/composables/glass/wave/waveField.glsl.d.ts +1 -0
  156. package/dist/composables/glass/wave/waveField.wgsl.d.ts +1 -0
  157. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +95 -2
  158. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +40 -2
  159. package/dist/composables/glass/webgpu/index.d.ts +1 -0
  160. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +37 -0
  161. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +49 -2
  162. package/dist/composables/glass/webgpu/webgpuDevice.d.ts +1 -1
  163. package/dist/composables/motion/core/index.d.ts +4 -0
  164. package/dist/composables/motion/core/useHaptic.d.ts +48 -0
  165. package/dist/composables/motion/core/writeVelocityWeight.d.ts +31 -0
  166. package/dist/composables/motion/index.d.ts +2 -0
  167. package/dist/composables/motion/springPresets.d.ts +16 -17
  168. package/dist/composables/motion/suite.d.ts +2 -2
  169. package/dist/composables/motion/useBloomUp.d.ts +97 -0
  170. package/dist/composables/motion/useCelebrationBurst.d.ts +50 -0
  171. package/dist/composables/motion/useDockCtaReceive.d.ts +10 -28
  172. package/dist/composables/motion/useGooMorph.d.ts +72 -0
  173. package/dist/composables/motion/useLiquidFlex.d.ts +18 -0
  174. package/dist/composables/motion/useLiquidMorph.d.ts +108 -0
  175. package/dist/composables/motion/useLiquidPress.d.ts +12 -0
  176. package/dist/composables/motion/useLiquidReveal.d.ts +7 -4
  177. package/dist/composables/motion/useMorphField.d.ts +157 -0
  178. package/dist/composables/motion/useScrollPin.d.ts +49 -0
  179. package/dist/composables/motion/useScrollScene.d.ts +67 -0
  180. package/dist/concentric.js +532 -563
  181. package/dist/configurator.js +2 -2
  182. package/dist/confirm-dialog.js +3 -3
  183. package/dist/constellation.js +4 -4
  184. package/dist/context-menu.js +2 -2
  185. package/dist/controls.js +2 -2
  186. package/dist/createCanvasLifecycle-CuCrGRfq.js +173 -0
  187. package/dist/dark.js +1 -1
  188. package/dist/data-table.js +1 -1
  189. package/dist/deck.js +1 -1
  190. package/dist/dialog.js +3 -3
  191. package/dist/dock.js +1163 -618
  192. package/dist/dockContext-gFVS2gMg.js +18 -0
  193. package/dist/dom.js +7 -6
  194. package/dist/dot-flow-field.js +1114 -523
  195. package/dist/dot-matrix.js +348 -204
  196. package/dist/drawer.js +106 -96
  197. package/dist/{dropdown-menu-aJmV5SqE.js → dropdown-menu-CCfcCQ68.js} +3 -3
  198. package/dist/dropdown-menu.js +1 -1
  199. package/dist/easing.js +3 -3
  200. package/dist/expandable-container.js +2 -2
  201. package/dist/fading-scroll.js +1 -1
  202. package/dist/forms.js +6 -6
  203. package/dist/fourier-field.js +441 -197
  204. package/dist/fourier-math.js +1 -1
  205. package/dist/glass-panel.js +2 -2
  206. package/dist/glass-ui.css +1 -1
  207. package/dist/glass-ui.js +139 -135
  208. package/dist/goo-blob.js +11 -9
  209. package/dist/goo-dot-matrix.js +418 -198
  210. package/dist/handmark.js +137 -94
  211. package/dist/header-ribbon.js +1 -1
  212. package/dist/hover-card.js +1 -1
  213. package/dist/hover-popover.js +1 -1
  214. package/dist/icon-chip.js +1 -1
  215. package/dist/icon-tooltip.js +1 -1
  216. package/dist/index.d.ts +3 -0
  217. package/dist/instrument-chassis.js +1 -1
  218. package/dist/keyboard.js +1 -1
  219. package/dist/label.js +1 -1
  220. package/dist/labeled-field.js +7 -7
  221. package/dist/metric-badge.js +1 -1
  222. package/dist/metric-cell.js +1 -1
  223. package/dist/metric-stack.js +1 -1
  224. package/dist/motion-core.js +42 -39
  225. package/dist/motion-curves.js +20 -14
  226. package/dist/motion.js +226 -26
  227. package/dist/notification.js +1 -1
  228. package/dist/number-field.js +1 -1
  229. package/dist/pager-dots.js +1 -1
  230. package/dist/paper-backdrop.js +1 -1
  231. package/dist/paper-grid.js +315 -342
  232. package/dist/paperGrid-CXCSMbZ1.js +191 -0
  233. package/dist/popover.js +1 -1
  234. package/dist/{presets-CvOUqtdY.js → presets-QvYgnFIZ.js} +13 -12
  235. package/dist/progress.js +1 -1
  236. package/dist/pulse.js +1 -1
  237. package/dist/reactive.js +2 -2
  238. package/dist/{resolveCanvasColor-yPyIpJt9.js → resolveCanvasColor-DsSJk06I.js} +5 -5
  239. package/dist/scrolling-text.js +1 -1
  240. package/dist/search.js +7 -7
  241. package/dist/select.js +3 -3
  242. package/dist/selectable-chip.js +18 -35
  243. package/dist/separator.js +1 -1
  244. package/dist/{sheet-B2flBfLH.js → sheet-DUCIoOe0.js} +3 -3
  245. package/dist/sheet.js +1 -1
  246. package/dist/sidebar.js +1 -1
  247. package/dist/slider-CcICPe3u.js +149 -0
  248. package/dist/slider.js +1 -1
  249. package/dist/sortable-list.js +3 -3
  250. package/dist/{spectrum-walk-BVzA7Biz.js → spectrum-walk-cBNSx_zm.js} +1 -1
  251. package/dist/springPresets-DfoQ6XRY.js +64 -0
  252. package/dist/stacked-icons.js +54 -39
  253. package/dist/styles/cards.css +202 -2
  254. package/dist/styles/components.css +1 -3
  255. package/dist/styles/configurator.css +172 -7
  256. package/dist/styles/critical-partition.mjs +35 -2
  257. package/dist/styles/deferred.css +2 -0
  258. package/dist/styles/dock/adaptive-legibility.css +119 -0
  259. package/dist/styles/dock/density.css +18 -10
  260. package/dist/styles/dock/fission-bridge.css +552 -0
  261. package/dist/styles/dock/layers.css +88 -124
  262. package/dist/styles/dock/morph-bridge.css +15 -2
  263. package/dist/styles/dock/morph.css +45 -114
  264. package/dist/styles/dock/shape.css +137 -11
  265. package/dist/styles/dock/shell.css +1 -3
  266. package/dist/styles/dock/stack-rail.css +95 -7
  267. package/dist/styles/dock-controls/icon-button.css +34 -2
  268. package/dist/styles/dock-controls/triggers.css +23 -1
  269. package/dist/styles/dock-controls.css +18 -0
  270. package/dist/styles/dock.css +16 -1
  271. package/dist/styles/drawer.css +166 -0
  272. package/dist/styles/glass/glass-atom.css +244 -0
  273. package/dist/styles/glass/glass-capsule.css +143 -0
  274. package/dist/styles/glass/glass-chip.css +215 -0
  275. package/dist/styles/glass/liquid-enter.css +252 -0
  276. package/dist/styles/glass/liquid-morph.css +850 -0
  277. package/dist/styles/glass/material.css +70 -1
  278. package/dist/styles/glass/reveal.css +22 -2
  279. package/dist/styles/glass/rim.css +13 -1
  280. package/dist/styles/glass/surfaces.css +18 -8
  281. package/dist/styles/glass.css +11 -0
  282. package/dist/styles/icon-chip.css +45 -0
  283. package/dist/styles/index.css +11 -0
  284. package/dist/styles/jubilance.css +65 -0
  285. package/dist/styles/motion/morph-field.css +229 -0
  286. package/dist/styles/paper.css +230 -14
  287. package/dist/styles/scroll-choreography.css +135 -78
  288. package/dist/styles/segmented-tabs.css +85 -51
  289. package/dist/styles/select.css +151 -0
  290. package/dist/styles/tokens/color-radius.css +1 -1
  291. package/dist/styles/tokens/dark-arm.css +57 -8
  292. package/dist/styles/tokens/glass-deep.css +8 -4
  293. package/dist/styles/tokens/glass-fx.css +80 -2
  294. package/dist/styles/tokens/glass.css +140 -8
  295. package/dist/styles/tokens/light-dark.css +2 -2
  296. package/dist/styles/tokens/property-regs.css +144 -0
  297. package/dist/styles/tokens/scale-paper.css +20 -8
  298. package/dist/styles/tokens/scheme-motion.css +92 -157
  299. package/dist/styles/tokens/scheme-spring.css +239 -0
  300. package/dist/styles/tokens/scroll-tokens.css +15 -15
  301. package/dist/styles/tokens/shadow.css +73 -13
  302. package/dist/styles/tokens.css +9 -2
  303. package/dist/styles/utilities/btn.css +70 -0
  304. package/dist/switch.js +1 -1
  305. package/dist/tabs.js +198 -181
  306. package/dist/timeline.js +241 -206
  307. package/dist/toast.js +1 -1
  308. package/dist/toggle-chip.js +14 -41
  309. package/dist/toggle-group.js +1 -1
  310. package/dist/tooltip.js +1 -1
  311. package/dist/typewriter.js +1 -1
  312. package/dist/{uniformBridgeWGPU-CtAKl45L.js → uniformBridgeWGPU-BCse1SHU.js} +191 -127
  313. package/dist/{useAnimatedNumber-CLrxicG9.js → useAnimatedNumber-BntskVdQ.js} +1 -1
  314. package/dist/{useConfiguratorState-4xblKfwd.js → useConfiguratorState-22BcULzF.js} +37 -35
  315. package/dist/useDockCtaReceive-DX7RDb6_.js +88 -0
  316. package/dist/{useDragMorph-BUgAC-zK.js → useDragMorph-DGLSewwB.js} +2 -2
  317. package/dist/useDragVelocity-CjcfX3dA.js +57 -0
  318. package/dist/useGooMorph-Cs13NgYL.js +104 -0
  319. package/dist/useGpuSubstrate-Ceet70xq.js +347 -0
  320. package/dist/{useViewTransition-CUI1nAgn.js → useHaptic-CPz5BT9I.js} +40 -1
  321. package/dist/{useLiquidFlex-UmA6LMZu.js → useLiquidFlex-Cc6PjVJD.js} +8 -3
  322. package/dist/useLiquidPress-CtOQ8Z0_.js +43 -0
  323. package/dist/useMorphField-ogBM7ubT.js +141 -0
  324. package/dist/{useScrollChrome-D66AVP7C.js → useScrollChrome-JuImi1DM.js} +2 -2
  325. package/dist/{useSpringMount-BWDnKIwh.js → useSpringMount-DFxtzmkR.js} +1 -1
  326. package/dist/{useSpringPress-B1-Czp-V.js → useSpringPress-VM9RgVq3.js} +1 -1
  327. package/dist/{useSurfaceAxis-g0NloYEF.js → useSurfaceAxis-Ci7Dnaw2.js} +1 -1
  328. package/dist/{useTouchGate-CBZTD4SD.js → useTouchGate-B1Lf9XqN.js} +1 -1
  329. package/dist/virtual.js +1 -1
  330. package/dist/watercolor-dot.js +16 -26
  331. package/dist/writeVelocityWeight-Bh83xZfs.js +19 -0
  332. package/package.json +14 -3
  333. package/src/styles/cards.css +202 -2
  334. package/src/styles/configurator.css +172 -7
  335. package/src/styles/critical-partition.mjs +35 -2
  336. package/src/styles/dock/adaptive-legibility.css +119 -0
  337. package/src/styles/dock/density.css +18 -10
  338. package/src/styles/dock/fission-bridge.css +552 -0
  339. package/src/styles/dock/layers.css +88 -124
  340. package/src/styles/dock/morph-bridge.css +15 -2
  341. package/src/styles/dock/morph.css +45 -114
  342. package/src/styles/dock/shape.css +137 -11
  343. package/src/styles/dock/shell.css +1 -3
  344. package/src/styles/dock/stack-rail.css +95 -7
  345. package/src/styles/dock-controls/icon-button.css +34 -2
  346. package/src/styles/dock-controls/triggers.css +23 -1
  347. package/src/styles/dock-controls.css +18 -0
  348. package/src/styles/dock.css +16 -1
  349. package/src/styles/drawer.css +164 -0
  350. package/src/styles/glass/glass-atom.css +244 -0
  351. package/src/styles/glass/glass-capsule.css +143 -0
  352. package/src/styles/glass/glass-chip.css +215 -0
  353. package/src/styles/glass/liquid-enter.css +252 -0
  354. package/src/styles/glass/liquid-morph.css +850 -0
  355. package/src/styles/glass/material.css +70 -1
  356. package/src/styles/glass/reveal.css +22 -2
  357. package/src/styles/glass/rim.css +13 -1
  358. package/src/styles/glass/surfaces.css +18 -8
  359. package/src/styles/glass.css +11 -0
  360. package/src/styles/icon-chip.css +45 -0
  361. package/src/styles/index.css +11 -0
  362. package/src/styles/jubilance.css +65 -0
  363. package/src/styles/motion/morph-field.css +229 -0
  364. package/src/styles/paper.css +230 -14
  365. package/src/styles/scroll-choreography.css +135 -78
  366. package/src/styles/segmented-tabs.css +85 -47
  367. package/src/styles/select.css +151 -0
  368. package/src/styles/tokens/color-radius.css +1 -1
  369. package/src/styles/tokens/dark-arm.css +57 -8
  370. package/src/styles/tokens/glass-deep.css +8 -4
  371. package/src/styles/tokens/glass-fx.css +80 -2
  372. package/src/styles/tokens/glass.css +140 -8
  373. package/src/styles/tokens/light-dark.css +2 -2
  374. package/src/styles/tokens/property-regs.css +144 -0
  375. package/src/styles/tokens/scale-paper.css +20 -8
  376. package/src/styles/tokens/scheme-motion.css +92 -157
  377. package/src/styles/tokens/scheme-spring.css +239 -0
  378. package/src/styles/tokens/scroll-tokens.css +15 -15
  379. package/src/styles/tokens/shadow.css +73 -13
  380. package/src/styles/tokens.css +9 -2
  381. package/src/styles/utilities/btn.css +70 -0
  382. package/dist/DialogContent-6JtTB5x2.js +0 -106
  383. package/dist/PagerDots-Cjx96la-.js +0 -98
  384. package/dist/PaperBackdrop-CqwjnfLv.js +0 -31
  385. package/dist/badge-D9XWW4GT.js +0 -53
  386. package/dist/button-5dY1Dvhd.js +0 -125
  387. package/dist/components/custom/concentric/composables/ringField.d.ts +0 -85
  388. package/dist/createCanvasLifecycle-Gh45Ce-p.js +0 -93
  389. package/dist/dockContext-BNfyPLe9.js +0 -17
  390. package/dist/slider-2A0rPn79.js +0 -142
  391. package/dist/springPresets-Ce7OYCm9.js +0 -46
  392. package/dist/useDockCtaReceive-DfFkmgL1.js +0 -82
  393. package/dist/useGpuSubstrate-4pTcp6mX.js +0 -294
  394. package/dist/useLiquidPress-BooG97RY.js +0 -39
  395. /package/dist/{CollapsibleContent-68dEXIAl.js → CollapsibleContent-D7UNsXQr.js} +0 -0
  396. /package/dist/{DialogFooter-9phqcRIS.js → DialogFooter-DoLy0ewI.js} +0 -0
  397. /package/dist/{InstrumentChassis-CxsHSyMj.js → InstrumentChassis-UUJX0-mW.js} +0 -0
  398. /package/dist/{Label-C2ejNWeC.js → Label-B_HPqi_q.js} +0 -0
  399. /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-DfAf7o15.js} +0 -0
  400. /package/dist/{SelectGroup-BFiod7X2.js → SelectGroup-Dcczq44n.js} +0 -0
  401. /package/dist/{SelectSeparator-C2UGOkXF.js → SelectSeparator-CNRGG7Ew.js} +0 -0
  402. /package/dist/{Separator-DQcwC2TR.js → Separator-Cf9-JFgi.js} +0 -0
  403. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
  404. /package/dist/{color-Cs0-oxYL.js → color-B9jZdhJX.js} +0 -0
  405. /package/dist/{compile-nZ1xVYTp.js → compile-INR_tPk_.js} +0 -0
  406. /package/dist/{constants--C2DkLW8.js → constants-BWj7DkMn.js} +0 -0
  407. /package/dist/{createContext-CpBNTRMI.js → createContext-Cd23P9j0.js} +0 -0
  408. /package/dist/{dotMatrixField-D_x9_1qq.js → dotMatrixField-CRO0ZFk4.js} +0 -0
  409. /package/dist/{flow.glsl-B2P7e0MT.js → flow.glsl-DqEGRpl4.js} +0 -0
  410. /package/dist/{math-Eb0w3LqU.js → math-5RcIgCB4.js} +0 -0
  411. /package/dist/{menuItemVariants-D8VNHq22.js → menuItemVariants-DAXquKja.js} +0 -0
  412. /package/dist/{prng-B-d9eYX8.js → prng-B5tIXTtj.js} +0 -0
  413. /package/dist/{procedural-color.wgsl-m7Zgv35j.js → procedural-color.wgsl-C1Y5PkM6.js} +0 -0
  414. /package/dist/{scrollReader-DI1NWxUw.js → scrollReader-rc3Ns_NM.js} +0 -0
  415. /package/dist/{useControlSize-SH1UmJCi.js → useControlSize-DAZ062x7.js} +0 -0
  416. /package/dist/{useFuzzySearch-DIhcYtcw.js → useFuzzySearch-0fTYOhS4.js} +0 -0
  417. /package/dist/{useGlobalDark-CmjB9E32.js → useGlobalDark-B4HO9LXG.js} +0 -0
  418. /package/dist/{useIntersectionPause-Dbozzjgm.js → useIntersectionPause-DO8Vl4gs.js} +0 -0
  419. /package/dist/{useInterval-CNdua40W.js → useInterval-BVUI-sez.js} +0 -0
  420. /package/dist/{useKeyboardShortcuts-BPRp33Im.js → useKeyboardShortcuts-BEut54Tk.js} +0 -0
  421. /package/dist/{usePointerVelocityField-QLsy3_kv.js → usePointerVelocityField-BrkqZFhj.js} +0 -0
  422. /package/dist/{useResizeObserver-Bpoi7tRE.js → useResizeObserver-DdEn3v2f.js} +0 -0
  423. /package/dist/{useResolveTokenColor-vAylyR0x.js → useResolveTokenColor-ChOnCckA.js} +0 -0
  424. /package/dist/{useScrollProgress-c3yxmH6a.js → useScrollProgress-A0M6qRl7.js} +0 -0
  425. /package/dist/{useSortable-BVqlJRBR.js → useSortable-DQV_UNDw.js} +0 -0
  426. /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-Bma3UlKA.js} +0 -0
  427. /package/dist/{useTimer-BHJOKr35.js → useTimer-BBLGPXR8.js} +0 -0
  428. /package/dist/{useUserInvalidAria-y5namzeE.js → useUserInvalidAria-EmmwWPOl.js} +0 -0
  429. /package/dist/{useViewportReady-anbac3m6.js → useViewportReady-C9pYnn7K.js} +0 -0
  430. /package/dist/{vReveal-D9k0jADx.js → vReveal-CT1KtwZA.js} +0 -0
@@ -1,15 +1,26 @@
1
1
  import { type VariantProps } from "class-variance-authority";
2
2
  export { default as ToggleChip } from "./ToggleChip.vue";
3
3
  /**
4
- * Shared toggleable "chip" / "cell" primitive for selector grids.
4
+ * Shared toggleable "chip" / "cell" primitive for selector grids
5
+ * (BD.W-CHIP-CONGRUENT-GLASS).
5
6
  *
6
7
  * `chip` — inline horizontal token (e.g. tag pickers, tool-filter rows).
7
8
  * `cell` — square card that stacks an icon/preview over a label
8
9
  * (e.g. pose pickers, palette swatches, emotion pickers).
9
10
  *
10
- * The `data-state="on"` attribute is set by the reka-ui Toggle root
11
- * when pressed, so selected styling hangs off the data attribute and
12
- * doesn't need a class-binding at the call site.
11
+ * Survival of the fittest: the chip family collapsed to ONE congruent recipe
12
+ * (`../selectable-chip/chipVariants`). ToggleChip keeps its `variant` ergonomics
13
+ * (`chip` inline pill / `cell` square card) but RE-POINTS onto the shared
14
+ * `chipVariants` `size` axis — `chip` → the `md` stadium rung, `cell` → the
15
+ * `cell` card exception. Clean break (no alias): the prior 4px `rounded-sm`
16
+ * grab-bag + the `rounded-[0.625rem]→0px` cell + the per-state
17
+ * `color-mix(…--primary…)` literals are GONE; the recipe is now the shared
18
+ * `.glass-chip .glass-capsule .glass-capsule-hover .accent-tone` lens — the SAME
19
+ * register SelectableChip + the toggle-group render. ONE family, no fork.
20
+ *
21
+ * The `data-state="on"` attribute is set by the reka-ui Toggle root when pressed,
22
+ * so the selected colour-flood + the punch hang off the data attribute (in
23
+ * `glass/glass-chip.css`) — no class-binding at the call site.
13
24
  */
14
25
  export declare const toggleChipVariants: (props?: ({
15
26
  variant?: "cell" | "chip" | null | undefined;
@@ -27,16 +27,18 @@ type __VLS_Props = {
27
27
  * Render mode:
28
28
  * `solid` (default) — the filled organic blob (the swatch background IS the
29
29
  * color; the existing register, unchanged).
30
- * `ghost` — the SAME seeded blob SILHOUETTE traced as a DASHED outline: an
31
- * SVG <ellipse> `stroke-dasharray` carrying the SAME wet
32
- * `feDisplacementMap` filter, so the displacement wobbles the
33
- * dashed ellipse INTO the seeded organic outline (a dashed
34
- * OUTLINE following the silhouette — NOT a solid ring, NOT a CSS
35
- * dashed rectangle). A low-alpha `color` fill is kept behind the
36
- * stroke. A `ghost` of a given `color + seed` carries the SAME
37
- * seeded `border-radius` silhouette the `solid` dot of that seed
38
- * renders (both read the same `useWatercolorBlob` morph). The
39
- * empty-palette-slot / placeholder affordance.
30
+ * `ghost` — the SAME seeded blob SILHOUETTE traced as a DASHED outline: a
31
+ * dashed CSS BORDER reading the SAME seeded `border-radius`
32
+ * silhouette the solid dot fills (`activeBorderRadius`), carrying
33
+ * the SAME wet `feDisplacementMap` filter so the displacement
34
+ * wobbles the dashed border INTO the seeded organic outline. A
35
+ * CSS dashed border hugs its own `border-radius`, so the outline
36
+ * follows the seeded blob EXACTLY — NOT an ellipse, NOT a circle,
37
+ * NOT a dashed rectangle. A low-alpha `color` fill is kept behind
38
+ * the border. A `ghost` of a given `color + seed` traces the SAME
39
+ * outline the `solid` dot of that seed fills (both read the same
40
+ * `useWatercolorBlob` morph — the ONE shape source). The empty-
41
+ * palette-slot / placeholder affordance.
40
42
  */
41
43
  variant?: "solid" | "ghost";
42
44
  /** Run the rAF-driven compositor transform wobble (default false → static). */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The shared surface-decoration axis — three rungs, ONE grammar.
2
+ * The shared surface-decoration axis — four rungs, ONE grammar.
3
3
  *
4
4
  * glass — the resolved tier's plain glass rung (default). The translucent
5
5
  * blur surface, the maximal glass-first register.
@@ -11,8 +11,16 @@
11
11
  * opaque — the `--glass-level:0` solid-card escape: solid `--card` + `blur(0)`
12
12
  * through the ONE level knob. The explicit opt-out from the maximal
13
13
  * glass default.
14
+ * clear — BE.W-CLEAR-VARIANT: the Apple-Clear MAXIMALLY translucent register —
15
+ * the `--glass-bg-clear` (0.58) plate, the clearest the library ships
16
+ * (the album grid bleeds genuinely through). STRUCTURALLY coupled to a
17
+ * MANDATORY `::before` legibility scrim (a near-transparent plate → the
18
+ * text needs a scrim floor) whose strength derives from the sampled
19
+ * `--glass-backdrop-luma` (it dims MORE over a bright backdrop). A
20
+ * scrim-less clear surface is FORBIDDEN — the `.glass-clear` decoration
21
+ * class carries the scrim in the SAME rule (the Apple Clear contract).
14
22
  */
15
- export type Surface = "glass" | "veil" | "opaque";
23
+ export type Surface = "glass" | "veil" | "opaque" | "clear";
16
24
  /**
17
25
  * The 5-rung glass-ladder tier the surface paints its base over. Mirrors the
18
26
  * `.glass-{wash,quiet,resting,floating,overlay}` ladder. A surface passes the rung
@@ -34,8 +42,14 @@ export type SurfaceTier = "wash" | "quiet" | "resting" | "floating" | "overlay";
34
42
  * surfaceClass("glass", "floating") → "glass-floating"
35
43
  * surfaceClass("veil", "floating") → "glass-floating veil-surface"
36
44
  * surfaceClass("opaque", "floating") → "glass-floating glass-opaque"
45
+ * surfaceClass("clear", "floating") → "glass-floating glass-clear"
37
46
  *
38
- * @param surface the decoration rung (`glass` default · `veil` · `opaque`)
47
+ * The `glass-clear` decoration class (BE.W-CLEAR-VARIANT) is scrim-COUPLED: its CSS
48
+ * rule carries the MANDATORY `::before` legibility scrim in the SAME seam, so a
49
+ * `surface="clear"` surface can NEVER paint the maximally-translucent plate without
50
+ * the dim — the Apple Clear contract is structural, not opt-out.
51
+ *
52
+ * @param surface the decoration rung (`glass` default · `veil` · `opaque` · `clear`)
39
53
  * @param tier the base ladder rung (default `resting`)
40
54
  */
41
55
  export declare function surfaceClass(surface?: Surface, tier?: SurfaceTier): string;
@@ -3,6 +3,20 @@ import { type BadgeVariants } from '.';
3
3
  type __VLS_Props = {
4
4
  variant?: BadgeVariants['variant'];
5
5
  size?: BadgeVariants['size'];
6
+ /**
7
+ * BD.W-GLASS-ATOM-REGISTER — the register split. `loud` (default) is the opaque
8
+ * saturated identity pill; `glass` is the quiet transmissive `.glass-atom`
9
+ * capsule tinted via `--glass-fill-tint`. A status badge stays loud (information,
10
+ * not a sticker); `secondary`/`outline` placements may route quiet.
11
+ */
12
+ surface?: BadgeVariants['surface'];
13
+ /**
14
+ * The LOUD cel cast opt-in (BD.W-CARTOON-CASTER). Every badge carries the
15
+ * family floor (the press-squish + a hairline rim-cast); `cast` INTENSIFIES the
16
+ * loud layered-offset stamp + mounts the inert `.cartoon-cast` child. A status
17
+ * pill is information, so the loud stamp is opt-in (not the default).
18
+ */
19
+ cast?: boolean;
6
20
  class?: HTMLAttributes['class'];
7
21
  };
8
22
  declare var __VLS_1: {};
@@ -3,5 +3,6 @@ export { default as Badge } from './Badge.vue';
3
3
  export declare const badgeVariants: (props?: ({
4
4
  variant?: "default" | "outline" | "destructive" | "secondary" | "success" | "warning" | "info" | null | undefined;
5
5
  size?: "sm" | "lg" | "md" | null | undefined;
6
+ surface?: "glass" | "loud" | null | undefined;
6
7
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
8
  export type BadgeVariants = VariantProps<typeof badgeVariants>;
@@ -8,6 +8,7 @@ interface Props extends PrimitiveProps {
8
8
  class?: HTMLAttributes['class'];
9
9
  surface?: Surface;
10
10
  liquid?: boolean;
11
+ punch?: boolean;
11
12
  type?: ButtonHTMLAttributes['type'];
12
13
  disabled?: ButtonHTMLAttributes['disabled'];
13
14
  }
@@ -149,10 +149,10 @@ type __VLS_Slots = {} & {
149
149
  };
150
150
  declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
151
151
  shadow: boolean;
152
+ tier: CardTier;
152
153
  grid: boolean;
153
154
  surface: CardSurface;
154
155
  as: import("reka-ui").AsTag | import("vue").Component;
155
- tier: CardTier;
156
156
  grain: boolean;
157
157
  specular: CardSpecular;
158
158
  pressable: boolean;
@@ -19,9 +19,9 @@ declare const _default: typeof __VLS_export;
19
19
  export default _default;
20
20
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<ScrollCardProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ScrollCardProps> & Readonly<{}>, {
21
21
  shadow: boolean;
22
+ tier: CardTier;
22
23
  maxHeight: string;
23
24
  surface: CardSurface;
24
- tier: CardTier;
25
25
  specular: CardSpecular;
26
26
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, {
27
27
  default?: (props: {}) => any;
@@ -1,11 +1,9 @@
1
- import type { WithClassAsProps } from './interface';
1
+ import type { WithClassAsProps } from "./interface";
2
2
  declare var __VLS_1: {};
3
3
  type __VLS_Slots = {} & {
4
4
  default?: (props: typeof __VLS_1) => any;
5
5
  };
6
- declare const __VLS_base: import("vue").DefineComponent<WithClassAsProps, {
7
- carouselRef: import("vue").Ref<HTMLElement | undefined, HTMLElement | undefined>;
8
- }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<WithClassAsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
6
+ declare const __VLS_base: import("vue").DefineComponent<WithClassAsProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<WithClassAsProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
7
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
10
8
  declare const _default: typeof __VLS_export;
11
9
  export default _default;
@@ -51,6 +51,14 @@ type __VLS_Props = DialogContentProps & {
51
51
  * double-up. The default keeps every existing mount byte-identical.
52
52
  */
53
53
  showClose?: boolean;
54
+ /**
55
+ * BD.W-OVERLAY-STAGE-COUPLE — the scene-staging enum for the centered modal band.
56
+ * `none` (default — byte-identical to HEAD) leaves the page untouched; `dim`/
57
+ * `scale`/`immersive` flip the ONE `--stage-t` scalar 0→1 on open so the page
58
+ * RECEDES + SCALES behind the dialog (the iOS card-recede) and the scrim deepens.
59
+ * PRM degrades `scale`/`immersive` → `dim` (no page transform, fold C1·R6).
60
+ */
61
+ stage?: 'none' | 'dim' | 'scale' | 'immersive';
54
62
  };
55
63
  declare var __VLS_19: {};
56
64
  type __VLS_Slots = {} & {
@@ -73,6 +81,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
73
81
  }>, {
74
82
  surface: Surface;
75
83
  showClose: boolean;
84
+ stage: "none" | "dim" | "scale" | "immersive";
76
85
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
77
86
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
78
87
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,4 @@
1
- import type { DrawerDirection, DrawerMode } from './index';
1
+ import type { DrawerDirection, DrawerMode, DrawerStage } from './index';
2
2
  /**
3
3
  * BB.W-DRAWER-ABROGATE — the Drawer root on the HOUSE reka `DialogRoot` substrate
4
4
  * (the SAME shape `Dialog.vue` binds). vaul-vue is gone: reka owns the open-control,
@@ -7,17 +7,31 @@ import type { DrawerDirection, DrawerMode } from './index';
7
7
  * owns the snap math vaul used to own.
8
8
  *
9
9
  * `mode` — additive shorthand (AN.W3). `"modal"` (default) keeps the iOS scale-down
10
- * look: `modal: true` (reka focus-traps + page-occludes). `"live-behind"` is the
11
- * non-modal peek/half/full bottom sheet — `modal: false` (no focus trap, no page
12
- * `aria-hidden`, page-behind stays interactive — reka delivers this natively),
13
- * `shouldScaleBackground: false`, and the direction-derived snap ladder. Every prop
14
- * the mode sets is still overridable by an explicit prop — `mode` only supplies
15
- * defaults.
10
+ * look: `modal: true` (reka focus-traps + page-occludes) + `stage: "scale"` (the page
11
+ * recedes). `"live-behind"` is the non-modal peek/half/full bottom sheet — `modal:
12
+ * false` (no focus trap, no page `aria-hidden`, page-behind stays interactive — reka
13
+ * delivers this natively), `stage: "none"`, and the direction-derived snap ladder.
14
+ * Every prop the mode sets is still overridable by an explicit prop — `mode` only
15
+ * supplies defaults.
16
16
  *
17
- * The snap props (`snapPoints`/`activeSnapPoint`/`direction`/`shouldScaleBackground`)
18
- * are HOUSE props now (they were vaul's `DrawerRootProps` surface — preserved by
19
- * shape so the consumer binding is byte-identical, but resolved by the house engine,
20
- * not forwarded to reka, which knows only `open`/`defaultOpen`/`modal`).
17
+ * The snap props (`snapPoints`/`activeSnapPoint`/`direction`) are HOUSE props now
18
+ * (they were vaul's `DrawerRootProps` surface — preserved by shape so the consumer
19
+ * binding is byte-identical, but resolved by the house engine, not forwarded to reka,
20
+ * which knows only `open`/`defaultOpen`/`modal`).
21
+ *
22
+ * BD.W-OVERLAY-STAGE-COUPLE — `stage` is the honest scene-staging enum that RETIRES
23
+ * the dead `shouldScaleBackground` boolean (clean break, no alias — the old boolean
24
+ * was read by NOTHING, `#app transform: none` at every detent):
25
+ * • `none` — no staging (the live-behind peek sheet leaves the page untouched).
26
+ * • `dim` — the scrim deepens with the detent; the page does NOT transform
27
+ * (the PRM-safe luminance-only depth cue; also the `scale` degrade).
28
+ * • `scale` — `dim` + the page RECEDES + SCALES (the iOS card-recede depth cue).
29
+ * • `immersive` — `scale` + the scrim's backdrop-blur ENGAGES (the spotlight).
30
+ * Under `prefers-reduced-motion: reduce`, `scale`/`immersive` degrade to `dim` (no
31
+ * page transform — a full-page snap-scale IS perceived motion, fold C1·R6). The enum
32
+ * toggles `data-stage-scale` / `data-stage-immersive` on the page-wrapper marker
33
+ * (`[data-stage-wrapper]`, mounted by the consumer/demo shell) while the sheet is
34
+ * open; the `--stage-t` scalar the snap engine writes at `:root` drives the couplings.
21
35
  */
22
36
  type __VLS_Props = {
23
37
  /** The controlled open state (`v-model:open`). */
@@ -34,8 +48,13 @@ type __VLS_Props = {
34
48
  activeSnapPoint?: number | string | null;
35
49
  /** Drag/slide axis (BB-2 default-ladder source). */
36
50
  direction?: DrawerDirection;
37
- /** iOS page scale-down on open (the modal look). Defaulted by `mode`. */
38
- shouldScaleBackground?: boolean;
51
+ /**
52
+ * BD.W-OVERLAY-STAGE-COUPLE — the scene-staging enum (retires the dead
53
+ * `shouldScaleBackground`). `none` leaves the page untouched (the live-behind
54
+ * default); `dim` deepens the scrim only; `scale` recedes + scales the page;
55
+ * `immersive` adds the backdrop-blur engage. Defaulted by `mode`.
56
+ */
57
+ stage?: DrawerStage;
39
58
  };
40
59
  declare var __VLS_10: {};
41
60
  type __VLS_Slots = {} & {
@@ -53,9 +72,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
53
72
  mode: DrawerMode;
54
73
  defaultOpen: boolean;
55
74
  modal: boolean;
75
+ stage: DrawerStage;
56
76
  snapPoints: (number | string)[];
57
77
  activeSnapPoint: number | string | null;
58
- shouldScaleBackground: boolean;
59
78
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
60
79
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
61
80
  declare const _default: typeof __VLS_export;
@@ -8,14 +8,16 @@ import type { DrawerDirection } from "./index";
8
8
  * give than the dock's crisp 0.32/0.7 box-morph). Co-located here so the pair is
9
9
  * defined ONCE rather than at the top of the composable.
10
10
  *
11
- * `response 0.4` — the angular period (≈ the swing time); a hair looser than the
12
- * dock so the sheet reads as a heavier surface settling. `dampingFraction 0.82` —
13
- * the iOS "smooth" register: sub-perceptual overshoot (a settled sheet, not a
14
- * bouncing one) while staying alive on a flung release.
11
+ * BD.W-ANIM-IOS27-TUNE — re-tuned `{0.4, 0.82}` → `{0.50, 0.74}` so the sheet-grow
12
+ * reads as inertial liquid MASS (the Maps-card reference): `response 0.50` lengthens
13
+ * the settle ~+25% (the flowing-heavy arrival) and `dampingFraction 0.74` adds a small
14
+ * ~3.2% liquid overshoot (vs the prior near-critical 0%) — the sheet settles cleanly to
15
+ * its detent WITHOUT over-shooting past the viewport (ζ ≥ 0.72 keeps overshoot ≤ ~4%).
16
+ * The fling-decision (`DRAWER_FLING_VELOCITY`) is SEPARATE + unchanged.
15
17
  */
16
18
  export declare const DRAWER_SNAP: {
17
- readonly response: 0.4;
18
- readonly dampingFraction: 0.82;
19
+ readonly response: 0.5;
20
+ readonly dampingFraction: 0.74;
19
21
  };
20
22
  /**
21
23
  * BB-2 (the direction-aware default snap ladder fold) — the peek/half/full detent
@@ -12,10 +12,20 @@ export type DrawerDirection = "top" | "bottom" | "left" | "right";
12
12
  * focus-trapped (reka `:modal="true"`), page-behind scaled. `"live-behind"` is the
13
13
  * non-modal peek/half/full bottom sheet — reka `:modal="false"` (no focus trap, no
14
14
  * page `aria-hidden`, page-behind at native size + interactive) — bundling the
15
- * `modal:false` + `shouldScaleBackground:false` + the direction-derived snap ladder.
16
- * Explicit props still override the mode's defaults.
15
+ * `modal:false` + `stage:"none"` + the direction-derived snap ladder. Explicit props
16
+ * still override the mode's defaults.
17
17
  */
18
18
  export type DrawerMode = "modal" | "live-behind";
19
+ /**
20
+ * BD.W-OVERLAY-STAGE-COUPLE — the scene-staging enum (retires the dead
21
+ * `shouldScaleBackground` boolean, clean break). `none` leaves the page untouched;
22
+ * `dim` deepens the scrim only (the PRM-safe luminance depth cue); `scale` recedes +
23
+ * scales the page (the iOS card-recede); `immersive` adds the backdrop-blur engage.
24
+ * `modal` defaults to `scale`; `live-behind` to `none`. PRM degrades `scale`/
25
+ * `immersive` to `dim`. All four couplings ride the ONE `--stage-t` scalar the snap
26
+ * engine writes at `:root`.
27
+ */
28
+ export type DrawerStage = "none" | "dim" | "scale" | "immersive";
19
29
  export { default as Drawer } from "./Drawer.vue";
20
30
  export { default as DrawerOverlay } from "./DrawerOverlay.vue";
21
31
  export { default as DrawerContent } from "./DrawerContent.vue";
@@ -4,6 +4,15 @@ import { type Surface } from '../_shared/useSurfaceAxis';
4
4
  type __VLS_Props = SelectContentProps & {
5
5
  class?: HTMLAttributes['class'];
6
6
  surface?: Surface;
7
+ /**
8
+ * BD.W-SELECT-WELL — the route's warm-field HUE re-emitted onto the portalled
9
+ * menu so it transmits its route identity even though it escapes to <body>
10
+ * (the page field stops at the route root; the portal does not). The menu-local
11
+ * `.glass-field-portal` spine reads this `--field-h`. A forms route resolves 48
12
+ * (terracotta); a feedback route a different warm hue — so each dropdown reads as
13
+ * different warm glass, none gray. Unset → the select.css `--field-h: 48` floor.
14
+ */
15
+ fieldHue?: number;
7
16
  };
8
17
  declare var __VLS_25: {};
9
18
  type __VLS_Slots = {} & {
@@ -14,6 +14,14 @@ type __VLS_Props = SliderRootProps & {
14
14
  * `data-held` on its root, intensifying the thumb halo. Default: true.
15
15
  */
16
16
  keepDockOpen?: boolean;
17
+ /**
18
+ * BD.W-GLASS-ATOM-REGISTER — the liquid weight-train on the fill: anticipation
19
+ * dip on grab → BOUNDED saturating smear while pulling (the cel cast lagging by
20
+ * `--motion-weight × velocity`) → follow-through overshoot on release. Composes
21
+ * the `useDragVelocity` bridge (writes `--atom-drag-v`, no-idle-rAF teardown).
22
+ * PRM collapses it to the plain squish floor. Default: true.
23
+ */
24
+ liquidDrag?: boolean;
17
25
  };
18
26
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
19
27
  "update:modelValue": (payload: number[] | undefined) => any;
@@ -23,6 +31,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
23
31
  onValueCommit?: ((payload: number[]) => any) | undefined;
24
32
  }>, {
25
33
  keepDockOpen: boolean;
34
+ liquidDrag: boolean;
26
35
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
36
  declare const _default: typeof __VLS_export;
28
37
  export default _default;
@@ -1,5 +1,6 @@
1
1
  export * from "./useResizeObserver";
2
2
  export * from "./useTouchGate";
3
+ export * from "./useDragVelocity";
3
4
  export * from "./useTokenColor";
4
5
  export * from "./useResolveTokenColor";
5
6
  export * from "./useClipboard";
@@ -0,0 +1,46 @@
1
+ import { type Ref } from "vue";
2
+ export interface UseDragVelocityParams {
3
+ /**
4
+ * The host element resolver — a getter (NOT a ref Slider populates in a sibling
5
+ * `onMounted`) so it sidesteps the onMounted-ordering trap the slider's
6
+ * `useDockHold` already documents. The `--atom-drag-v` var is written on THIS
7
+ * element; descendants inherit it (the fill + the cast read it).
8
+ */
9
+ host: () => HTMLElement | null;
10
+ /**
11
+ * The pointer axis the velocity is measured on. Default `"x"` (the horizontal
12
+ * slider). A getter re-reads on an orientation flip.
13
+ */
14
+ axis?: "x" | "y" | (() => "x" | "y");
15
+ /**
16
+ * The saturating-smear gain (the `tanh` steepness over px/frame). Higher = the
17
+ * smear reaches its ceiling at a slower drag. Default `0.06`.
18
+ */
19
+ gain?: number;
20
+ /**
21
+ * The smear CEILING (the clamp the saturated value floors under). Default `0.7`
22
+ * (challenge #3 R3 — mass wins, the pull never rubber-bands past this).
23
+ */
24
+ clamp?: number;
25
+ /** Honor `prefers-reduced-motion: reduce` (no rAF, value pinned 0). Default true. */
26
+ respectReducedMotion?: boolean;
27
+ }
28
+ export interface UseDragVelocityReturn {
29
+ /** True while a drag gesture is live (between `pointerdown` and `pointerup`). */
30
+ dragging: Readonly<Ref<boolean>>;
31
+ /** Detach all listeners + tear down any live rAF. Idempotent. */
32
+ detach: () => void;
33
+ }
34
+ /**
35
+ * The drag-window-gated velocity bridge — writes `--atom-drag-v` (0..1, bounded by a
36
+ * saturating `tanh`) on the host while a pointer drag is live, and tears the rAF DOWN
37
+ * on release (the no-idle-cost contract). The slider weight-train is its first
38
+ * consumer; any pull-to-smear atom reads the same var.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const { dragging, detach } = useDragVelocity({ host: getRootEl })
43
+ * // CSS: .slider-range { transform: scaleX(calc(1 + 0.08 * var(--atom-drag-v))) }
44
+ * ```
45
+ */
46
+ export declare function useDragVelocity(params: UseDragVelocityParams): UseDragVelocityReturn;
@@ -0,0 +1,4 @@
1
+ export type { Vec2, CellDriver } from "./waveField";
2
+ export { travelingEnvelope, curlScalar, cellTwist, cellDriver, cellHeight, faceRelief, facePlateau, waveFlow, cursorSwirl, heightField, waveSwell, cellWarpBeforeHeight, } from "./waveField";
3
+ export { WAVE_FIELD_GLSL } from "./waveField.glsl";
4
+ export { WAVE_FIELD_WGSL } from "./waveField.wgsl";
@@ -0,0 +1,115 @@
1
+ /** A 2-vector. */
2
+ export interface Vec2 {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ /**
7
+ * The directed-twist magnitude FLOOR (the visibility cure — shared across JS↔GLSL↔WGSL).
8
+ * The curl scalar alone sits ~|0.3|, damping the crest twist to a whisper; a cell in the
9
+ * crest band always rotates at least this fraction of `twistMax` so the wave READS.
10
+ */
11
+ export declare const TWIST_FLOOR = 0.62;
12
+ /**
13
+ * A moving Gaussian crest band sweeping along `waveDir` at angular speed `waveOmega`.
14
+ * Returns the envelope in [0,1]: ~0 where the wave has NOT reached, ~1 at the crest,
15
+ * relaxing back to ~0 behind it. `coord` is the wave phase at a point; `crest` wraps it
16
+ * to a single 0..1 cycle and `env` is the Gaussian about the cycle midpoint. The crest
17
+ * "passes OVER and THROUGH" the field — the cells are calm ahead, twist HARD at the
18
+ * crest, relax behind.
19
+ */
20
+ export declare function travelingEnvelope(pivot: Vec2, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number): number;
21
+ /**
22
+ * The curl-noise vorticity read at the cell center — a smooth low-frequency scalar in
23
+ * roughly [-1,1] that DIRECTS the per-cell twist so adjacent cells lean TOGETHER (a
24
+ * flowing read, never per-cell noise). The host supplies `curlFn(p) -> Vec2` (the shared
25
+ * divergence-free curl of its own noise basis); this takes the x-component as the signed
26
+ * director and folds a slow time drift so the flow itself evolves. Basis-agnostic.
27
+ */
28
+ export declare function curlScalar(curlFn: (p: Vec2) => Vec2, cc: Vec2, t: number): number;
29
+ /** The cell pivot `cc` + the spring-eased crest envelope `env` a cell rides. */
30
+ export interface CellDriver {
31
+ /** The PRE-twist cell center (the per-cell pivot the twist rotates about). */
32
+ cc: Vec2;
33
+ /** The traveling-Gaussian crest envelope × amp at that pivot ([0,1] · amp). */
34
+ env: number;
35
+ }
36
+ /**
37
+ * The pre-twist driver for the grid coordinate `g`: floor `g` to its cell, return that cell's
38
+ * center `cc` + the traveling-wave crest envelope `env` evaluated AT that center (= `cellHeight`,
39
+ * so there is provably ONE envelope). FOLD A: the face must sample its height/relief at THIS
40
+ * pre-twist `cc`, NOT at `floor(twisted_g)` (the crest twist crosses the cell boundary → the
41
+ * face would light a NEIGHBOUR cell). `cellTwist` rides the SAME driver, so twist and face fuse.
42
+ */
43
+ export declare function cellDriver(g: Vec2, cellSize: number, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, amp: number): CellDriver;
44
+ /**
45
+ * Twist the grid coordinate `g` about its OWN cell center, gated by the traveling wave
46
+ * and directed by the curl flow. The pivot is the cell center (a per-cell constant) so the
47
+ * box rotates about its middle — the cell stays in place but TWISTS (a windmill of warped
48
+ * boxes where the crest passes; calm square cells elsewhere). `amp` is the spring-eased
49
+ * envelope amplitude the JS host drives (the liquid-weight inertia). Returns the twisted
50
+ * coordinate (still in grid space; the host evaluates its extraction at it).
51
+ *
52
+ * FOLD C — the `TWIST_FLOOR` is CREST-GATED: the floor is multiplied by the crest envelope so
53
+ * OFF-crest cells relax to near-flat (calm paper) and only the crest band crinkles. Without
54
+ * this every cell crinkles regardless of the wave (static foil, no traveling read).
55
+ */
56
+ export declare function cellTwist(curlFn: (p: Vec2) => Vec2, g: Vec2, cellSize: number, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, twistMax: number, shearMax: number, amp: number): Vec2;
57
+ /**
58
+ * The sheet displacement at a cell center `cc` — the EXACT traveling-wave scalar the twist
59
+ * rides (`travelingEnvelope · amp`), surfaced as a named leaf fn so the face reads ONE
60
+ * envelope. Range [0,1]·amp: ~0 ahead of / behind the crest, ~amp at the crest. `cellTwist`
61
+ * (via `cellDriver`) calls this, so a sign drift reds the numeric parity gate everywhere.
62
+ */
63
+ export declare function cellHeight(cc: Vec2, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, amp: number): number;
64
+ /**
65
+ * The central-difference slope of `cellHeight` across a cell (`ε = 0.5·cellSize`) — the lit-fold
66
+ * normal source. Pure, derivative-FREE (NO `dFdx` on the height) → Safari WebGL2-safe by
67
+ * construction (only the Golus AA uses `fwidth`). Returns ∇H = (∂H/∂x, ∂H/∂y) at `cc`.
68
+ */
69
+ export declare function faceRelief(cc: Vec2, cellSize: number, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, amp: number): Vec2;
70
+ /**
71
+ * Soft inset-square coverage inside a (warped) cell — the filled FACE plateau. `d` is the
72
+ * distance into the cell from the nearest gutter (per axis, on the triangle-wave the Golus
73
+ * grid already uses); `smoothstep(inset, inset+2·aa, d)` floors the face to a soft-edged tile
74
+ * that retreats as `inset` grows (the squash). The shaders pass `aa = fwidth(g)` (crisp at any
75
+ * DPR — the Golus precedent); the JS round-trip passes a fixed `uvDeriv` (reproducible).
76
+ * Returns face coverage [0..1].
77
+ */
78
+ export declare function facePlateau(g: Vec2, inset: number, uvDeriv: Vec2): number;
79
+ /**
80
+ * A LOCAL Gaussian-gated rotation about the cursor — the finger twists the cells around
81
+ * it (the re-aimed `cursorBulge`: a swirl, not a radial push). `strength` is the peak
82
+ * twist angle at the cursor; `radius` the Gaussian falloff (grid units). Returns the
83
+ * swirled coordinate.
84
+ */
85
+ export declare function cursorSwirl(g: Vec2, cursor: Vec2, strength: number, radius: number): Vec2;
86
+ /**
87
+ * A CONTINUOUS divergence-free flow warp gated by the traveling wave — the SMOOTH twin of
88
+ * `cellTwist` for surfaces that need an unbroken coordinate (the level-set contours shatter
89
+ * into a mesh under the per-cell discontinuity; they need this continuous warp). The curl
90
+ * flow direction is read at `g` itself (no per-cell pivot → no seam), its magnitude gated by
91
+ * the SAME traveling Gaussian crest sweeping along `waveDir`. So the contours flow + twist as
92
+ * the wave passes OVER and THROUGH them, with NO cell-boundary discontinuity. Returns the
93
+ * warped coordinate.
94
+ */
95
+ export declare function waveFlow(curlFn: (p: Vec2) => Vec2, g: Vec2, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, twistMax: number, amp: number): Vec2;
96
+ /**
97
+ * A LOW-octave value-noise topography H(p) — the scalar field concentric extracts level-set
98
+ * contours of. `octaves` LOW (3) keeps the nested loops CLEAN (not high-freq speckle — the
99
+ * legibility floor). The host supplies its `noiseFn(x,y)` (the SAME value-noise basis its
100
+ * `potentialFBM` uses, basis-agnostic). Returns the un-normalized height.
101
+ */
102
+ export declare function heightField(noiseFn: (x: number, y: number) => number, p: Vec2, octaves: number, seed: number): number;
103
+ /**
104
+ * The ω=√(g·k) breathing swell — a slow global rise/fall the topography rides so basins
105
+ * inflate/deflate with weight (the deep-water dispersion the suite shares). A pure
106
+ * f(t) the host adds onto H. `phase` lets a host offset its own swell.
107
+ */
108
+ export declare function waveSwell(t: number, phase: number): number;
109
+ /**
110
+ * The cell-warp applied BEFORE the height eval (concentric's `cellWarpBeforeHeight`). It
111
+ * is the SAME `cellTwist` paper-grid runs — concentric warps the SAMPLING coordinate so
112
+ * the contours twist/flow as the traveling wave crosses (kinship with paper-grid). A thin
113
+ * alias for the gate's by-name assert + the host's call-site clarity.
114
+ */
115
+ export declare function cellWarpBeforeHeight(curlFn: (p: Vec2) => Vec2, g: Vec2, cellSize: number, t: number, waveDir: Vec2, waveK: number, waveOmega: number, waveSigma: number, twistMax: number, shearMax: number, amp: number): Vec2;
@@ -0,0 +1 @@
1
+ export declare const WAVE_FIELD_GLSL = "\n#ifndef WAVE_FIELD_TAU\n#define WAVE_FIELD_TAU 6.283185307179586\n#endif\n\n// The traveling-wave envelope \u2014 a moving Gaussian crest band sweeping along waveDir.\nfloat travelingEnvelope(vec2 pivot, float t, vec2 waveDir, float waveK, float waveOmega, float waveSigma) {\n float coord = dot(pivot, waveDir) * waveK - t * waveOmega;\n float crest = fract(coord / WAVE_FIELD_TAU);\n float z = (crest - 0.5) * 2.0;\n return exp(-(z * z) / max(waveSigma, 1e-3));\n}\n\n// The curl-direction scalar \u2014 the smooth low-freq director the per-cell twist follows.\nfloat curlScalar(vec2 cc, float t) {\n vec2 f = curlFBM(vec2(cc.x * 0.5 + t * 0.08, cc.y * 0.5 - t * 0.06));\n return clamp(f.x, -1.0, 1.0);\n}\n\n// The directed-twist FLOOR (the visibility cure): keep the curl SIGN (adjacent cells lean\n// together) but floor the magnitude so a crest-band cell ALWAYS rotates decisively.\n#ifndef WAVE_FIELD_TWIST_FLOOR\n#define WAVE_FIELD_TWIST_FLOOR 0.62\n#endif\nfloat directedTwist(float s, float floorMag) {\n float mag = max(floorMag, abs(s));\n float sgn = tanh(s * 6.0);\n return sgn * mag;\n}\n\n// \u2500\u2500 The FACE leaf (the structurally-absent RE-INVENT \u2014 height-lit filled cell interior) \u2500\u2500\n// Defined ABOVE cellTwist: cellTwist rides cellHeight via the driver so twist + face read ONE\n// envelope.\n\n// The sheet displacement at a cell center = the EXACT traveling-wave scalar the twist rides.\nfloat cellHeight(vec2 cc, float t, vec2 waveDir, float waveK, float waveOmega, float waveSigma, float amp) {\n return travelingEnvelope(cc, t, waveDir, waveK, waveOmega, waveSigma) * amp;\n}\n\n// The pre-twist driver (FOLD A): the cell pivot cc + the crest envelope env the twist AND the\n// face both ride. The face samples height/relief at THIS pre-twist cc (floor(twisted_g) at the\n// crest lights a NEIGHBOUR cell). cc in .xy, env in .z.\nvec3 cellDriver(vec2 g, float cellSize, float t, vec2 waveDir, float waveK, float waveOmega,\n float waveSigma, float amp) {\n float cs = max(cellSize, 1e-3);\n vec2 cc = (floor(g / cs) + 0.5) * cs;\n float env = cellHeight(cc, t, waveDir, waveK, waveOmega, waveSigma, amp);\n return vec3(cc, env);\n}\n\n// The central-difference slope of cellHeight across a cell (eps = 0.5\u00B7cellSize) \u2014 derivative-\n// FREE (NO dFdx on the height) \u2192 Safari WebGL2-safe. Returns \u2207H.\nvec2 faceRelief(vec2 cc, float cellSize, float t, vec2 waveDir, float waveK, float waveOmega,\n float waveSigma, float amp) {\n float eps = max(cellSize, 1e-3) * 0.5;\n float hxp = cellHeight(cc + vec2(eps, 0.0), t, waveDir, waveK, waveOmega, waveSigma, amp);\n float hxm = cellHeight(cc - vec2(eps, 0.0), t, waveDir, waveK, waveOmega, waveSigma, amp);\n float hyp = cellHeight(cc + vec2(0.0, eps), t, waveDir, waveK, waveOmega, waveSigma, amp);\n float hym = cellHeight(cc - vec2(0.0, eps), t, waveDir, waveK, waveOmega, waveSigma, amp);\n return vec2((hxp - hxm) / (2.0 * eps), (hyp - hym) / (2.0 * eps));\n}\n\n// Soft inset-square coverage inside a (warped) cell \u2014 the filled FACE plateau. d is the distance\n// into the cell from the nearest gutter (the Golus triangle-wave); the inset retreats as it grows\n// (the squash). aa = the shader's fwidth(g) (JS passes a fixed uvDeriv).\nfloat facePlateau(vec2 g, float inset, vec2 uvDeriv) {\n vec2 tri = 1.0 - abs(fract(g) * 2.0 - 1.0);\n float d = min(tri.x, tri.y);\n float aa = max(uvDeriv.x, uvDeriv.y) * 1.5;\n return smoothstep(inset, inset + 2.0 * aa, d);\n}\n\n// The cell-local twist about each cell's own center, gated by the traveling wave + directed\n// by the curl flow. amp is the spring-eased envelope amplitude the JS host drives. FOLD C: the\n// TWIST_FLOOR is crest-gated by env so OFF-crest cells relax to flat calm paper (the traveling\n// read, not static foil).\nvec2 cellTwist(vec2 g, float cellSize, float t, vec2 waveDir, float waveK, float waveOmega,\n float waveSigma, float twistMax, float shearMax, float amp) {\n vec3 drv = cellDriver(g, cellSize, t, waveDir, waveK, waveOmega, waveSigma, amp);\n vec2 cc = drv.xy;\n float env = drv.z;\n float floorMag = WAVE_FIELD_TWIST_FLOOR * env; // FOLD C: crest-gated floor\n float theta = twistMax * env * directedTwist(curlScalar(cc, t), floorMag);\n float shear = shearMax * env * directedTwist(curlScalar(cc + vec2(17.3, 9.1), t), floorMag);\n vec2 local = g - cc;\n float ct = cos(theta);\n float st = sin(theta);\n vec2 rot = vec2(ct * local.x - st * local.y, st * local.x + ct * local.y);\n rot.x += shear * rot.y; // a small skew so the box MORPHS, not just rotates\n return cc + rot;\n}\n\n// The CONTINUOUS traveling-wave FLOW warp \u2014 the SMOOTH twin of cellTwist (no per-cell seam;\n// for the level-set contours that shatter into a mesh under the cell discontinuity).\nvec2 waveFlow(vec2 g, float t, vec2 waveDir, float waveK, float waveOmega, float waveSigma,\n float twistMax, float amp) {\n float env = travelingEnvelope(g, t, waveDir, waveK, waveOmega, waveSigma) * amp;\n vec2 f = curlFBM(vec2(g.x * 0.6 + t * 0.05, g.y * 0.6 - t * 0.04));\n vec2 f2 = curlFBM(vec2(g.x * 1.1 - t * 0.03, g.y * 1.1 + t * 0.035));\n float k = twistMax * env;\n return g + (f + f2 * 0.5) * k;\n}\n\n// The local cursor swirl \u2014 the finger twists the cells around it (re-aimed cursorBulge).\nvec2 cursorSwirl(vec2 g, vec2 cursor, float strength, float radius) {\n vec2 to = g - cursor;\n float d2 = dot(to, to);\n float r = max(radius, 1e-4);\n float theta = strength * exp(-d2 / (2.0 * r * r));\n float ct = cos(theta);\n float st = sin(theta);\n return cursor + vec2(ct * to.x - st * to.y, st * to.x + ct * to.y);\n}\n\n// The LOW-octave value-noise topography \u2014 the scalar field concentric extracts contours of.\nfloat heightField(vec2 p, float octavesF, float seed) {\n float v = 0.0;\n float amp = 0.5;\n float freq = 1.0;\n float px = p.x + seed;\n float py = p.y - seed;\n int n = int(clamp(octavesF, 1.0, 6.0));\n for (int i = 0; i < 6; i++) {\n if (i >= n) break;\n v += amp * valueNoise(px * freq, py * freq);\n float rx = 0.8 * px - 0.6 * py;\n float ry = 0.6 * px + 0.8 * py;\n px = rx;\n py = ry;\n freq *= 2.0;\n amp *= 0.5;\n }\n return v;\n}\n\n// The \u03C9=\u221A(g\u00B7k) breathing swell \u2014 basins inflate/deflate with weight.\nfloat waveSwell(float t, float phase) {\n return sin(t * 0.35 + phase) * 0.5 + sin(t * 0.21 + phase * 1.7) * 0.5;\n}\n";
@@ -0,0 +1 @@
1
+ export declare const WAVE_FIELD_WGSL = "\nconst WAVE_FIELD_TAU: f32 = 6.283185307179586;\n\n// The traveling-wave envelope \u2014 a moving Gaussian crest band sweeping along waveDir.\nfn travelingEnvelope(pivot: vec2f, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32, waveSigma: f32) -> f32 {\n let coord = dot(pivot, waveDir) * waveK - t * waveOmega;\n let crest = fract(coord / WAVE_FIELD_TAU);\n let z = (crest - 0.5) * 2.0;\n return exp(-(z * z) / max(waveSigma, 1e-3));\n}\n\n// The curl-direction scalar \u2014 the smooth low-freq director the per-cell twist follows.\nfn curlScalar(cc: vec2f, t: f32) -> f32 {\n let f = curlFBM(vec2f(cc.x * 0.5 + t * 0.08, cc.y * 0.5 - t * 0.06));\n return clamp(f.x, -1.0, 1.0);\n}\n\n// The directed-twist FLOOR (the visibility cure): keep the curl SIGN (adjacent cells lean\n// together) but floor the magnitude so a crest-band cell ALWAYS rotates decisively.\nconst WAVE_FIELD_TWIST_FLOOR: f32 = 0.62;\nfn directedTwist(s: f32, floorMag: f32) -> f32 {\n let mag = max(floorMag, abs(s));\n let sgn = tanh(s * 6.0);\n return sgn * mag;\n}\n\n// \u2500\u2500 The FACE leaf (the structurally-absent RE-INVENT \u2014 height-lit filled cell interior) \u2500\u2500\n// DECLARED ABOVE cellTwist (no WGSL forward declaration): cellTwist rides cellHeight via the\n// driver so twist + face read ONE envelope.\n\n// The sheet displacement at a cell center = the EXACT traveling-wave scalar the twist rides.\nfn cellHeight(cc: vec2f, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32, waveSigma: f32, amp: f32) -> f32 {\n return travelingEnvelope(cc, t, waveDir, waveK, waveOmega, waveSigma) * amp;\n}\n\n// The pre-twist driver (FOLD A): the cell pivot cc + the crest envelope env the twist AND the\n// face both ride. The face samples height/relief at THIS pre-twist cc (the crest twist crosses\n// the cell boundary \u2192 floor(twisted_g) would light a NEIGHBOUR cell). cc in .xy, env in .z.\nfn cellDriver(g: vec2f, cellSize: f32, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32,\n waveSigma: f32, amp: f32) -> vec3f {\n let cs = max(cellSize, 1e-3);\n let cc = (floor(g / cs) + 0.5) * cs;\n let env = cellHeight(cc, t, waveDir, waveK, waveOmega, waveSigma, amp);\n return vec3f(cc, env);\n}\n\n// The central-difference slope of cellHeight across a cell (eps = 0.5\u00B7cellSize) \u2014 derivative-\n// FREE (NO dFdx on the height) \u2192 Safari WebGL2-safe. Returns \u2207H.\nfn faceRelief(cc: vec2f, cellSize: f32, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32,\n waveSigma: f32, amp: f32) -> vec2f {\n let eps = max(cellSize, 1e-3) * 0.5;\n let hxp = cellHeight(cc + vec2f(eps, 0.0), t, waveDir, waveK, waveOmega, waveSigma, amp);\n let hxm = cellHeight(cc - vec2f(eps, 0.0), t, waveDir, waveK, waveOmega, waveSigma, amp);\n let hyp = cellHeight(cc + vec2f(0.0, eps), t, waveDir, waveK, waveOmega, waveSigma, amp);\n let hym = cellHeight(cc - vec2f(0.0, eps), t, waveDir, waveK, waveOmega, waveSigma, amp);\n return vec2f((hxp - hxm) / (2.0 * eps), (hyp - hym) / (2.0 * eps));\n}\n\n// Soft inset-square coverage inside a (warped) cell \u2014 the filled FACE plateau. d is the\n// distance into the cell from the nearest gutter (the Golus triangle-wave); the inset retreats\n// as it grows (the squash). aa = the shader's fwidth(g) (JS passes a fixed uvDeriv).\nfn facePlateau(g: vec2f, inset: f32, uvDeriv: vec2f) -> f32 {\n let tri = 1.0 - abs(fract(g) * 2.0 - 1.0);\n let d = min(tri.x, tri.y);\n let aa = max(uvDeriv.x, uvDeriv.y) * 1.5;\n return smoothstep(inset, inset + 2.0 * aa, d);\n}\n\n// The cell-local twist about each cell's own center, gated by the traveling wave + directed\n// by the curl flow. amp is the spring-eased envelope amplitude the JS host drives. FOLD C: the\n// TWIST_FLOOR is crest-gated by env so OFF-crest cells relax to flat calm paper (the traveling\n// read, not static foil).\nfn cellTwist(g: vec2f, cellSize: f32, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32,\n waveSigma: f32, twistMax: f32, shearMax: f32, amp: f32) -> vec2f {\n let drv = cellDriver(g, cellSize, t, waveDir, waveK, waveOmega, waveSigma, amp);\n let cc = drv.xy;\n let env = drv.z;\n let floorMag = WAVE_FIELD_TWIST_FLOOR * env; // FOLD C: crest-gated floor\n let theta = twistMax * env * directedTwist(curlScalar(cc, t), floorMag);\n let shear = shearMax * env * directedTwist(curlScalar(cc + vec2f(17.3, 9.1), t), floorMag);\n let local = g - cc;\n let ct = cos(theta);\n let st = sin(theta);\n var rot = vec2f(ct * local.x - st * local.y, st * local.x + ct * local.y);\n rot.x = rot.x + shear * rot.y; // a small skew so the box MORPHS, not just rotates\n return cc + rot;\n}\n\n// The CONTINUOUS traveling-wave FLOW warp \u2014 the SMOOTH twin of cellTwist (no per-cell seam;\n// for the level-set contours that shatter into a mesh under the cell discontinuity).\nfn waveFlow(g: vec2f, t: f32, waveDir: vec2f, waveK: f32, waveOmega: f32, waveSigma: f32,\n twistMax: f32, amp: f32) -> vec2f {\n let env = travelingEnvelope(g, t, waveDir, waveK, waveOmega, waveSigma) * amp;\n let f = curlFBM(vec2f(g.x * 0.6 + t * 0.05, g.y * 0.6 - t * 0.04));\n let f2 = curlFBM(vec2f(g.x * 1.1 - t * 0.03, g.y * 1.1 + t * 0.035));\n let k = twistMax * env;\n return g + (f + f2 * 0.5) * k;\n}\n\n// The local cursor swirl \u2014 the finger twists the cells around it (re-aimed cursorBulge).\nfn cursorSwirl(g: vec2f, cursor: vec2f, strength: f32, radius: f32) -> vec2f {\n let to = g - cursor;\n let d2 = dot(to, to);\n let r = max(radius, 1e-4);\n let theta = strength * exp(-d2 / (2.0 * r * r));\n let ct = cos(theta);\n let st = sin(theta);\n return cursor + vec2f(ct * to.x - st * to.y, st * to.x + ct * to.y);\n}\n\n// The LOW-octave value-noise topography \u2014 the scalar field concentric extracts contours of.\nfn heightField(p: vec2f, octavesF: f32, seed: f32) -> f32 {\n var v = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n var px = p.x + seed;\n var py = p.y - seed;\n let n = i32(clamp(octavesF, 1.0, 6.0));\n for (var i = 0; i < 6; i = i + 1) {\n if (i >= n) { break; }\n v = v + amp * valueNoise(px * freq, py * freq);\n let rx = 0.8 * px - 0.6 * py;\n let ry = 0.6 * px + 0.8 * py;\n px = rx;\n py = ry;\n freq = freq * 2.0;\n amp = amp * 0.5;\n }\n return v;\n}\n\n// The \u03C9=\u221A(g\u00B7k) breathing swell \u2014 basins inflate/deflate with weight.\nfn waveSwell(t: f32, phase: f32) -> f32 {\n return sin(t * 0.35 + phase) * 0.5 + sin(t * 0.21 + phase * 1.7) * 0.5;\n}\n";