@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,17 +1,288 @@
1
- import { t as e } from "./_plugin-vue_export-helper-C1je1s0u.js";
2
- import { t } from "./usePointerVelocityField-QLsy3_kv.js";
3
- import { n, o as r, r as i, s as a } from "./procedural-color.wgsl-m7Zgv35j.js";
4
- import { a as o, t as s } from "./useGpuSubstrate-4pTcp6mX.js";
5
- import { c } from "./color-Cs0-oxYL.js";
1
+ import { t as e } from "./_plugin-vue_export-helper-gLzyemvl.js";
2
+ import { t } from "./usePointerVelocityField-BrkqZFhj.js";
3
+ import { n, o as r, r as i, s as a } from "./procedural-color.wgsl-C1Y5PkM6.js";
4
+ import { a as o, t as s } from "./useGpuSubstrate-Ceet70xq.js";
5
+ import { c } from "./color-B9jZdhJX.js";
6
6
  import { computed as l, createElementBlock as u, createElementVNode as d, defineComponent as f, normalizeStyle as p, onScopeDispose as m, openBlock as h, useTemplateRef as g, watch as _ } from "vue";
7
+ //#region src/components/custom/dot-flow-field/composables/flowField.ts
8
+ var v = 9.81, y = Math.PI * 2;
9
+ function b(e) {
10
+ let t = e * Math.PI / 180;
11
+ return {
12
+ x: Math.cos(t),
13
+ y: Math.sin(t)
14
+ };
15
+ }
16
+ function x(e, t, n, r) {
17
+ let i = 0, a = 0;
18
+ for (let o of n) {
19
+ let n = y / Math.max(o.wavelength, 1e-4), s = b(o.direction), c = Math.sqrt(v * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase, u = Math.cos(l), d = o.amplitude * n * u;
20
+ i += d * s.x, a += d * s.y;
21
+ }
22
+ return {
23
+ x: a,
24
+ y: -i
25
+ };
26
+ }
27
+ var S = .012;
28
+ function C(e, t) {
29
+ let n = e * .1031 % 1, r = t * .1031 % 1, i = e * .1031 % 1;
30
+ n < 0 && (n += 1), r < 0 && (r += 1), i < 0 && (i += 1);
31
+ let a = n * (r + 33.33) + r * (i + 33.33) + i * (n + 33.33);
32
+ n += a, r += a, i += a;
33
+ let o = (n + r) * i % 1;
34
+ return o < 0 && (o += 1), o;
35
+ }
36
+ function w(e, t, n) {
37
+ return e + (t - e) * n;
38
+ }
39
+ function T(e, t) {
40
+ let n = Math.floor(e), r = Math.floor(t), i = e - n, a = t - r, o = i * i * i * (i * (i * 6 - 15) + 10), s = a * a * a * (a * (a * 6 - 15) + 10), c = C(n, r), l = C(n + 1, r), u = C(n, r + 1), d = C(n + 1, r + 1);
41
+ return w(w(c, l, o), w(u, d, o), s);
42
+ }
43
+ function E(e, t) {
44
+ let n = 0, r = .5, i = 1, a = e, o = t;
45
+ for (let e = 0; e < 3; e++) {
46
+ n += r * T(a * i, o * i);
47
+ let e = .8 * a - .6 * o, t = .6 * a + .8 * o;
48
+ a = e, o = t, i *= 2, r *= .5;
49
+ }
50
+ return n;
51
+ }
52
+ function D(e) {
53
+ let t = E(e.x + S, e.y) - E(e.x - S, e.y), n = E(e.x, e.y + S) - E(e.x, e.y - S), r = t / (2 * S);
54
+ return {
55
+ x: n / (2 * S),
56
+ y: -r
57
+ };
58
+ }
59
+ function O(e, t, n, r, i) {
60
+ let a = x(e, t, n, r);
61
+ if (i <= 0) return a;
62
+ let o = D({
63
+ x: e.x * .55 + t * .15,
64
+ y: e.y * .55
65
+ });
66
+ return {
67
+ x: a.x + o.x * i,
68
+ y: a.y + o.y * i
69
+ };
70
+ }
71
+ function k(e, t) {
72
+ if (!t.active) return {
73
+ x: 0,
74
+ y: 0
75
+ };
76
+ let n = e.x - t.cursor.x, r = e.y - t.cursor.y, i = Math.hypot(n, r), a = Math.max(t.radius, .001), o = Math.exp(-(i * i) / (a * a)), s = -r, c = n, l = Math.hypot(s, c) || 1e-6, u = s / l, d = c / l, f = n / Math.max(i, 1e-4), p = r / Math.max(i, 1e-4), m = u * t.spin + t.pointerVel.x * t.dragGain + f * t.burst * t.burstShove, h = d * t.spin + t.pointerVel.y * t.dragGain + p * t.burst * t.burstShove;
77
+ return {
78
+ x: m * o,
79
+ y: h * o
80
+ };
81
+ }
82
+ var A = .85;
83
+ function j(e, t, n) {
84
+ let r = Math.max(t, 1), i = e % r, a = Math.floor(e / r), o = (r - 1) * n / 2;
85
+ return {
86
+ x: i * n - o,
87
+ y: a * n - o
88
+ };
89
+ }
90
+ function M(e, t, n, r) {
91
+ let i = 0, a = 0;
92
+ for (let o of n) {
93
+ let n = y / Math.max(o.wavelength, 1e-4), s = b(o.direction), c = Math.sqrt(v * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase;
94
+ i += o.amplitude * Math.sin(l), a += Math.abs(o.amplitude);
95
+ }
96
+ return i / Math.max(a, 1e-4);
97
+ }
98
+ function N(e, t, n, r, i) {
99
+ let a = O(e, t, n, r, i), o = Math.hypot(a.x, a.y);
100
+ if (o < 1e-5) return {
101
+ x: 0,
102
+ y: 0
103
+ };
104
+ let s = Math.tanh(o) / o;
105
+ return {
106
+ x: a.x * s,
107
+ y: a.y * s
108
+ };
109
+ }
110
+ function P(e, t, n) {
111
+ return 1 - F(0, Math.max(n, .001), Math.abs(e - t));
112
+ }
113
+ function F(e, t, n) {
114
+ let r = Math.min(Math.max((n - e) / Math.max(t - e, 1e-6), 0), 1);
115
+ return r * r * (3 - 2 * r);
116
+ }
117
+ function I(e, t = 3, n = 2.5) {
118
+ let r = 2 * A, i = Math.max(n, .5) * r, a = i / y, o = r / 3, s = Math.max(1, Math.min(Math.round(t), 3)), c = [], l = i, u = 1;
119
+ for (let t = 0; t < s; t++) {
120
+ let n = Math.max(l, o), r = y / n, i = Math.exp(-1 / (r * a) ** 2) / (r * r), s = (t % 2 == 0 ? 1 : -1) * (8 + t * 4);
121
+ c.push({
122
+ amplitude: i * u,
123
+ wavelength: n,
124
+ direction: e + s,
125
+ phase: t * 1.618033 % y
126
+ }), l *= .58, u *= .38;
127
+ }
128
+ return c;
129
+ }
130
+ //#endregion
131
+ //#region src/components/custom/dot-flow-field/constants.ts
132
+ var L = 16384, R = 8, z = 4, B = 1.618033988749895;
133
+ function ee(e, t = 1 / 60) {
134
+ let n = Math.max(e, .001);
135
+ return 2 ** (-t / n);
136
+ }
137
+ var V = [{
138
+ L: .92,
139
+ C: .03,
140
+ h: 78
141
+ }, {
142
+ L: .84,
143
+ C: .07,
144
+ h: 62
145
+ }], H = I(35, 3, 2.5), U = {
146
+ mode: "flow",
147
+ particleCount: 12e3,
148
+ trailHalfLife: .55,
149
+ trailScale: .5,
150
+ turnRate: .14,
151
+ speedScale: .9,
152
+ speedGlow: 1.25,
153
+ lifetimeSec: .55 * B,
154
+ edgeBias: .35,
155
+ contentMask: null,
156
+ vortexRadius: .3,
157
+ vortexSpin: 1.6,
158
+ dragGain: 1,
159
+ burstShove: 1.8,
160
+ shadowOffset: .18,
161
+ stretchAmp: .6,
162
+ waveComponents: H,
163
+ windSpeed: .3,
164
+ curlStrength: .12,
165
+ gridPitch: 26,
166
+ dotSize: 2,
167
+ displaceAmp: .18,
168
+ springK: 6,
169
+ waveBandCenter: 0,
170
+ waveBandWidth: .55,
171
+ contrast: .6,
172
+ coherence: .8,
173
+ globeMask: !1,
174
+ palette: V,
175
+ background: "transparent",
176
+ interactive: !0,
177
+ respectReducedMotion: !0
178
+ }, W = A, te = 16384;
179
+ function G(e, t) {
180
+ let n = Math.min(Math.max(Math.ceil((t || 320) / Math.max(e, 4)) + 2, 4), 128);
181
+ return {
182
+ cols: n,
183
+ count: Math.min(n * n, te),
184
+ pitchDomain: 2 * W / Math.max(n, 1)
185
+ };
186
+ }
187
+ var ne = 240, K = {
188
+ p0: 0,
189
+ p1: 4,
190
+ ints: 8,
191
+ f0: 12,
192
+ f1: 16,
193
+ ptr: 20,
194
+ ptr2: 24,
195
+ waves: 28
196
+ }, re = {
197
+ cursorX: 0,
198
+ cursorY: 0,
199
+ velX: 0,
200
+ velY: 0,
201
+ burst: 0,
202
+ active: 0
203
+ };
204
+ function ie() {
205
+ let e = new ArrayBuffer(ne);
206
+ return {
207
+ buffer: e,
208
+ f32: new Float32Array(e),
209
+ i32: new Int32Array(e)
210
+ };
211
+ }
212
+ function ae(e, t, n, r, i, a, o = re) {
213
+ let { f32: s, i32: c } = e, l = t.mode === "flow";
214
+ s[K.p0 + 0] = n, s[K.p0 + 1] = r, s[K.p0 + 2] = t.windSpeed, s[K.p0 + 3] = t.curlStrength, s[K.p1 + 0] = i.pitchDomain, s[K.p1 + 1] = t.displaceAmp, s[K.p1 + 2] = t.springK, s[K.p1 + 3] = i.cols;
215
+ let u = Math.min(t.waveComponents.length, 8);
216
+ return c[K.ints + 0] = u, c[K.ints + 1] = a, c[K.ints + 2] = i.cols, c[K.ints + 3] = +!!l, s[K.f0 + 0] = t.turnRate, s[K.f0 + 1] = t.speedScale, s[K.f0 + 2] = t.lifetimeSec, s[K.f0 + 3] = W, s[K.f1 + 0] = t.vortexRadius, s[K.f1 + 1] = t.vortexSpin, s[K.f1 + 2] = t.dragGain, s[K.f1 + 3] = t.burstShove, s[K.ptr + 0] = o.cursorX, s[K.ptr + 1] = o.cursorY, s[K.ptr + 2] = o.velX, s[K.ptr + 3] = o.velY, s[K.ptr2 + 0] = o.burst, s[K.ptr2 + 1] = o.active, s[K.ptr2 + 2] = t.edgeBias, s[K.ptr2 + 3] = 0, pe(s, K.waves, t.waveComponents), e;
217
+ }
218
+ var oe = 160, se = .022, q = {
219
+ r0: 0,
220
+ r1: 4,
221
+ r2: 8,
222
+ ints: 12,
223
+ bg: 16,
224
+ f0: 20,
225
+ palette: 24
226
+ };
227
+ function ce() {
228
+ let e = new ArrayBuffer(oe);
229
+ return {
230
+ buffer: e,
231
+ f32: new Float32Array(e),
232
+ i32: new Int32Array(e)
233
+ };
234
+ }
235
+ var le = .22, ue = .4;
236
+ function de(e, t) {
237
+ let n = (t || 320) / (2 * W);
238
+ return e / Math.max(n, 1e-4);
239
+ }
240
+ function fe(e, t, n, r, i, a, o) {
241
+ let { f32: s, i32: l } = e;
242
+ s[q.r0 + 0] = n, s[q.r0 + 1] = t.contrast, s[q.r0 + 2] = le, s[q.r0 + 3] = W, s[q.r1 + 0] = de(t.dotSize, i), s[q.r1 + 1] = ue, s[q.r1 + 2] = r, s[q.r1 + 3] = a.pitchDomain, s[q.r2 + 0] = t.waveBandCenter, s[q.r2 + 1] = t.waveBandWidth, s[q.r2 + 2] = +!!t.globeMask, s[q.r2 + 3] = +(t.mode === "flow"), s[q.f0 + 0] = t.speedGlow, s[q.f0 + 1] = se, s[q.f0 + 2] = t.shadowOffset, s[q.f0 + 3] = t.stretchAmp;
243
+ let u = Math.min(o.length, 4);
244
+ if (l[q.ints + 0] = u, l[q.ints + 1] = a.count, l[q.ints + 2] = 0, l[q.ints + 3] = 0, t.background === "transparent") s[q.bg + 0] = 0, s[q.bg + 1] = 0, s[q.bg + 2] = 0, s[q.bg + 3] = 0;
245
+ else {
246
+ let e = c(t.background);
247
+ s[q.bg + 0] = e[0], s[q.bg + 1] = e[1], s[q.bg + 2] = e[2], s[q.bg + 3] = 1;
248
+ }
249
+ for (let e = 0; e < 4; e++) {
250
+ let t = q.palette + e * 4, n = c(o[Math.min(e, u - 1)] ?? o[0]);
251
+ s[t + 0] = n[0], s[t + 1] = n[1], s[t + 2] = n[2], s[t + 3] = 0;
252
+ }
253
+ return e;
254
+ }
255
+ function pe(e, t, n) {
256
+ for (let r = 0; r < 8; r++) {
257
+ let i = t + r * 4, a = n[r];
258
+ a ? (e[i + 0] = a.amplitude, e[i + 1] = a.wavelength, e[i + 2] = a.direction, e[i + 3] = a.phase) : (e[i + 0] = 0, e[i + 1] = 1, e[i + 2] = 0, e[i + 3] = 0);
259
+ }
260
+ }
261
+ function me(e) {
262
+ let { cols: t, count: n, pitchDomain: r } = e, i = new Float32Array(n * 4), a = (t - 1) * r / 2;
263
+ for (let e = 0; e < n; e++) {
264
+ let n = e % t, o = Math.floor(e / t), s = e * 4;
265
+ i[s + 0] = n * r - a, i[s + 1] = o * r - a, i[s + 2] = 0, i[s + 3] = 0;
266
+ }
267
+ return i;
268
+ }
269
+ function he(e, t) {
270
+ let n = new Float32Array(e * 4), r = W, i = 2654435769, a = () => (i = i * 1664525 + 1013904223 >>> 0, i / 4294967295);
271
+ for (let i = 0; i < e; i++) {
272
+ let e = i * 4;
273
+ n[e + 0] = (a() * 2 - 1) * r, n[e + 1] = (a() * 2 - 1) * r, n[e + 2] = 0, n[e + 3] = a() * Math.max(t, .001);
274
+ }
275
+ return n;
276
+ }
277
+ //#endregion
7
278
  //#region src/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.ts
8
- var v = "\nconst MAX_WAVE_COMPONENTS: i32 = 8;\nconst PI: f32 = 3.141592653589793;\nconst TAU: f32 = 6.283185307179586;\nconst FLOW_GRAVITY: f32 = 9.81;\nconst CURL_EPS: f32 = 0.012;\nconst FBM_ROT: mat2x2<f32> = mat2x2<f32>(0.8, 0.6, -0.6, 0.8);\n\nstruct Particle {\n // (pos.x, pos.y, height, |disp|) — the anchored-lattice live state\n data: vec4<f32>,\n};\n\n// ── Uniforms (the typed-struct source-of-truth — see uniformBridgeWGPU.ts) ──\nstruct FlowUniforms {\n // p0: (uTime, uDt, uWindSpeed, uCurlStrength)\n p0: vec4<f32>,\n // p1: (uGridPitch, uDisplaceAmp, uSpringK, uGridCols) — the lattice geometry\n p1: vec4<f32>,\n // ints: (uWaveCount, uParticleCount, uGridColsI, _pad)\n ints: vec4<i32>,\n // each wave row: (amplitude, wavelength, directionDeg, phase)\n waves: array<vec4<f32>, 8>,\n};\n\n@group(0) @binding(0) var<uniform> u: FlowUniforms;\n@group(0) @binding(1) var<storage, read_write> particles: array<Particle>;\n\n// ── The deterministic lattice origin (transcribes flowField.ts gridOrigin) ──\nfn gridOrigin(index: u32, cols: i32, pitch: f32) -> vec2<f32> {\n let c = max(cols, 1);\n let col = i32(index) % c;\n let row = i32(index) / c;\n let half = f32(c - 1) * pitch * 0.5;\n return vec2<f32>(f32(col) * pitch - half, f32(row) * pitch - half);\n}\n\n// ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──\nfn gerstnerVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n var dhdx = 0.0;\n var dhdy = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let amplitude = w.x;\n let wavelength = max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let phase = w.w;\n let k = TAU / wavelength;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * p.x + d.y * p.y) - omega * t + phase;\n let akc = amplitude * k * cos(theta);\n dhdx = dhdx + akc * d.x;\n dhdy = dhdy + akc * d.y;\n }\n // v = ∇⊥h = (∂h/∂y, −∂h/∂x).\n return vec2<f32>(dhdy, -dhdx);\n}\n\n// ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight — the brightness\n// driver, normalized to ≈[-1,1] by the total amplitude so the band thresholds are\n// wave-table-independent). ──\nfn sampleHeight(o: vec2<f32>, t: f32) -> f32 {\n var h = 0.0;\n var ampSum = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let k = TAU / max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;\n h = h + w.x * sin(theta);\n ampSum = ampSum + abs(w.x);\n }\n return h / max(ampSum, 1e-4);\n}\n\n// ── Shared curl-noise basis (the WGSL twin of flow.glsl.ts curlFBM) ──\nfn hash21(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.x, p.y, p.x) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn valueNoise(p: vec2<f32>) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n let a = hash21(i + vec2<f32>(0.0, 0.0));\n let b = hash21(i + vec2<f32>(1.0, 0.0));\n let c = hash21(i + vec2<f32>(0.0, 1.0));\n let d = hash21(i + vec2<f32>(1.0, 1.0));\n return mix(mix(a, b, u2.x), mix(c, d, u2.x), u2.y);\n}\n\nfn potentialFBM(p0: vec2<f32>) -> f32 {\n var v = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n var p = p0;\n for (var i = 0; i < 3; i = i + 1) {\n v = v + amp * valueNoise(p * freq);\n p = FBM_ROT * p;\n freq = freq * 2.0;\n amp = amp * 0.5;\n }\n return v;\n}\n\nfn curlFBM(p: vec2<f32>) -> vec2<f32> {\n let dx = potentialFBM(p + vec2<f32>(CURL_EPS, 0.0)) - potentialFBM(p - vec2<f32>(CURL_EPS, 0.0));\n let dy = potentialFBM(p + vec2<f32>(0.0, CURL_EPS)) - potentialFBM(p - vec2<f32>(0.0, CURL_EPS));\n let g = vec2<f32>(dx, dy) / (2.0 * CURL_EPS);\n return vec2<f32>(g.y, -g.x);\n}\n\n// The composite flow velocity (transcribes flowField.ts sampleVelocity EXACTLY — the\n// coarse ×0.55 curl domain-scale, the §3.2 inversion).\nfn sampleVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n let curlStrength = u.p0.w;\n var v = gerstnerVelocity(p, t);\n if (curlStrength > 0.0) {\n let c = curlFBM(vec2<f32>(p.x * 0.55 + t * 0.15, p.y * 0.55));\n v = v + c * curlStrength;\n }\n return v;\n}\n\n// The sub-cell DISPLACEMENT (transcribes flowField.ts sampleDisplacement — ∇⊥h + the\n// coarse curl break, soft-clamped through tanh so the magnitude rides into [0,1)).\nfn sampleDisplacement(o: vec2<f32>, t: f32) -> vec2<f32> {\n let v = sampleVelocity(o, t);\n let mag = length(v);\n if (mag < 1e-5) { return vec2<f32>(0.0, 0.0); }\n let bounded = tanh(mag);\n return v * (bounded / mag);\n}\n\n@compute @workgroup_size(64)\nfn cs_main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n let count = u32(u.ints.y);\n if (idx >= count) { return; } // bounds-guard the dispatch tail\n\n let t = u.p0.x;\n let dt = u.p0.y;\n let pitch = u.p1.x;\n let displaceAmp = u.p1.y;\n let springK = u.p1.z;\n let cols = u.ints.z;\n\n // The PERMANENT anchor — no wrap, no re-seed (the coherence fix).\n let o = gridOrigin(idx, cols, pitch);\n let disp = sampleDisplacement(o, t);\n let anchorTarget = o + disp * (displaceAmp * pitch);\n\n var pr = particles[idx];\n var pos = pr.data.xy;\n // Framerate-independent critically-damped pull-to-anchor:\n // p ← mix(p, anchorTarget, 1 - exp(-springK·dt)) (the GPGPU influence-pull pattern).\n let k = 1.0 - exp(-springK * dt);\n pos = mix(pos, anchorTarget, k);\n\n let h = sampleHeight(o, t);\n particles[idx] = Particle(vec4<f32>(pos, h, length(disp)));\n}\n", y = `
279
+ var ge = "\nconst MAX_WAVE_COMPONENTS: i32 = 8;\nconst PI: f32 = 3.141592653589793;\nconst TAU: f32 = 6.283185307179586;\nconst FLOW_GRAVITY: f32 = 9.81;\nconst CURL_EPS: f32 = 0.012;\nconst FBM_ROT: mat2x2<f32> = mat2x2<f32>(0.8, 0.6, -0.6, 0.8);\n\nstruct Particle {\n // field: (pos.x, pos.y, height, |disp|) — the anchored-lattice live state\n // flow: (pos.x, pos.y, speed, life) — the advected-mote live state\n data: vec4<f32>,\n};\n\n// ── Uniforms (the typed-struct source-of-truth — see uniformBridgeWGPU.ts) ──\nstruct FlowUniforms {\n // p0: (uTime, uDt, uWindSpeed, uCurlStrength)\n p0: vec4<f32>,\n // p1: (uGridPitch, uDisplaceAmp, uSpringK, uGridCols) — the lattice geometry (field)\n p1: vec4<f32>,\n // ints: (uWaveCount, uParticleCount, uGridColsI, uMode) — uMode: 0=field, 1=flow\n ints: vec4<i32>,\n // f0: (uTurnRate, uSpeedScale, uLifetimeSec, uDomainHalf) — the flow advection levers\n f0: vec4<f32>,\n // f1: (uVortexRadius, uVortexSpin, uDragGain, uBurstShove) — the cursor vortex\n f1: vec4<f32>,\n // ptr: (cursor.x, cursor.y, vel.x, vel.y) — the pointer in domain space + its velocity\n ptr: vec4<f32>,\n // ptr2: (burst, pointerActive, edgeBias, _pad)\n ptr2: vec4<f32>,\n // each wave row: (amplitude, wavelength, directionDeg, phase)\n waves: array<vec4<f32>, 8>,\n};\n\n@group(0) @binding(0) var<uniform> u: FlowUniforms;\n@group(0) @binding(1) var<storage, read_write> particles: array<Particle>;\n\n// ── The deterministic lattice origin (transcribes flowField.ts gridOrigin) ──\nfn gridOrigin(index: u32, cols: i32, pitch: f32) -> vec2<f32> {\n let c = max(cols, 1);\n let col = i32(index) % c;\n let row = i32(index) / c;\n let half = f32(c - 1) * pitch * 0.5;\n return vec2<f32>(f32(col) * pitch - half, f32(row) * pitch - half);\n}\n\n// ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──\nfn gerstnerVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n var dhdx = 0.0;\n var dhdy = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let amplitude = w.x;\n let wavelength = max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let phase = w.w;\n let k = TAU / wavelength;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * p.x + d.y * p.y) - omega * t + phase;\n let akc = amplitude * k * cos(theta);\n dhdx = dhdx + akc * d.x;\n dhdy = dhdy + akc * d.y;\n }\n // v = ∇⊥h = (∂h/∂y, −∂h/∂x).\n return vec2<f32>(dhdy, -dhdx);\n}\n\n// ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight — the brightness\n// driver, normalized to ≈[-1,1] by the total amplitude so the band thresholds are\n// wave-table-independent). ──\nfn sampleHeight(o: vec2<f32>, t: f32) -> f32 {\n var h = 0.0;\n var ampSum = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let k = TAU / max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;\n h = h + w.x * sin(theta);\n ampSum = ampSum + abs(w.x);\n }\n return h / max(ampSum, 1e-4);\n}\n\n// ── Shared curl-noise basis (the WGSL twin of flow.glsl.ts curlFBM) ──\nfn hash21(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.x, p.y, p.x) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn valueNoise(p: vec2<f32>) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n let a = hash21(i + vec2<f32>(0.0, 0.0));\n let b = hash21(i + vec2<f32>(1.0, 0.0));\n let c = hash21(i + vec2<f32>(0.0, 1.0));\n let d = hash21(i + vec2<f32>(1.0, 1.0));\n return mix(mix(a, b, u2.x), mix(c, d, u2.x), u2.y);\n}\n\nfn potentialFBM(p0: vec2<f32>) -> f32 {\n var v = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n var p = p0;\n for (var i = 0; i < 3; i = i + 1) {\n v = v + amp * valueNoise(p * freq);\n p = FBM_ROT * p;\n freq = freq * 2.0;\n amp = amp * 0.5;\n }\n return v;\n}\n\nfn curlFBM(p: vec2<f32>) -> vec2<f32> {\n let dx = potentialFBM(p + vec2<f32>(CURL_EPS, 0.0)) - potentialFBM(p - vec2<f32>(CURL_EPS, 0.0));\n let dy = potentialFBM(p + vec2<f32>(0.0, CURL_EPS)) - potentialFBM(p - vec2<f32>(0.0, CURL_EPS));\n let g = vec2<f32>(dx, dy) / (2.0 * CURL_EPS);\n return vec2<f32>(g.y, -g.x);\n}\n\n// The composite flow velocity (transcribes flowField.ts sampleVelocity EXACTLY — the\n// coarse ×0.55 curl domain-scale, the §3.2 inversion).\nfn sampleVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n let curlStrength = u.p0.w;\n var v = gerstnerVelocity(p, t);\n if (curlStrength > 0.0) {\n let c = curlFBM(vec2<f32>(p.x * 0.55 + t * 0.15, p.y * 0.55));\n v = v + c * curlStrength;\n }\n return v;\n}\n\n// The sub-cell DISPLACEMENT (transcribes flowField.ts sampleDisplacement — ∇⊥h + the\n// coarse curl break, soft-clamped through tanh so the magnitude rides into [0,1)).\nfn sampleDisplacement(o: vec2<f32>, t: f32) -> vec2<f32> {\n let v = sampleVelocity(o, t);\n let mag = length(v);\n if (mag < 1e-5) { return vec2<f32>(0.0, 0.0); }\n let bounded = tanh(mag);\n return v * (bounded / mag);\n}\n\n// ── The cursor VORTEX injected into the velocity field (transcribes flowField.ts\n// pointerVortex). r = p − cursor; a gaussian fall-off; a TRUE tangential ∇⊥ swirl +\n// a drag-along term + a radial burst shove. Inert when the pointer is inactive. ──\nfn pointerVortex(p: vec2<f32>) -> vec2<f32> {\n if (u.ptr2.y < 0.5) { return vec2<f32>(0.0, 0.0); } // pointer inactive → no vortex\n let cursor = u.ptr.xy;\n let vel = u.ptr.zw;\n let burst = u.ptr2.x;\n let radius = max(u.f1.x, 1e-3);\n let r = p - cursor;\n let d = length(r);\n let fall = exp(-(d * d) / (radius * radius));\n let swirl = normalize(vec2<f32>(-r.y, r.x) + vec2<f32>(1e-6, 0.0)); // tangential ∇⊥\n let radial = r / max(d, 1e-4);\n let v = swirl * u.f1.y // the spin\n + vel * u.f1.z // the drag (streamlines follow the gesture)\n + radial * burst * u.f1.w; // the flick shockwave\n return v * fall;\n}\n\n// ── density-weighted respawn: a hash-stratified seed inside the domain, biased toward the\n// edges by edgeBias (a faint vignette — the field never thins to a hole). ──\nfn respawn(idx: u32, t: f32) -> vec2<f32> {\n let half = u.f0.w;\n let s = f32(idx) * 0.013 + t * 0.37;\n let rx = hash21(vec2<f32>(s, 1.7)) * 2.0 - 1.0;\n let ry = hash21(vec2<f32>(3.1, s)) * 2.0 - 1.0;\n // edgeBias>0 pushes the seed toward the perimeter (a power-curve on |coord|).\n let bias = clamp(u.ptr2.z, 0.0, 1.0);\n let bx = sign(rx) * pow(abs(rx), mix(1.0, 0.5, bias));\n let by = sign(ry) * pow(abs(ry), mix(1.0, 0.5, bias));\n return vec2<f32>(bx, by) * half;\n}\n\n// ── cs_field — the ANCHORED-LATTICE evaluator (BYTE-MOVED from cs_main; the field-mode\n// fence-scoped unit; F1 greps the no-advection/no-reseed witness WITHIN this brace-span).\nfn cs_field(idx: u32, t: f32, dt: f32) {\n let pitch = u.p1.x;\n let displaceAmp = u.p1.y;\n let springK = u.p1.z;\n let cols = u.ints.z;\n\n // The PERMANENT anchor — no wrap, no re-seed (the coherence fix).\n let o = gridOrigin(idx, cols, pitch);\n let disp = sampleDisplacement(o, t);\n let anchorTarget = o + disp * (displaceAmp * pitch);\n\n var pr = particles[idx];\n var pos = pr.data.xy;\n // Framerate-independent critically-damped pull-to-anchor:\n // p ← mix(p, anchorTarget, 1 - exp(-springK·dt)) (the GPGPU influence-pull pattern).\n let k = 1.0 - exp(-springK * dt);\n pos = mix(pos, anchorTarget, k);\n\n let h = sampleHeight(o, t);\n particles[idx] = Particle(vec4<f32>(pos, h, length(disp)));\n}\n\n// ── cs_flow — the AURORA CURRENT (the RE-INVENT register). Momentum-integrated advection\n// along the curl current + the live cursor vortex, with lifetime decay + density-weighted\n// respawn. F1b greps the pos+=v*dt + respawn( + pointerVortex( witness in THIS function.\nfn cs_flow(idx: u32, t: f32, dt: f32) {\n let half = u.f0.w;\n let turnRate = u.f0.x;\n let speedScale = u.f0.y;\n let lifetimeSec = max(u.f0.z, 1e-3);\n\n var pr = particles[idx];\n var pos = pr.data.xy;\n var life = pr.data.w;\n\n // First-frame / dead / out-of-domain seed (the density-weighted respawn).\n let outOfDomain = max(abs(pos.x), abs(pos.y)) > half * 1.05;\n if (life <= 0.0 || outOfDomain) {\n pos = respawn(idx, t);\n // stratify the initial life across [0,lifetime] so deaths don't synchronize.\n life = lifetimeSec * hash21(vec2<f32>(f32(idx) * 0.027, t * 0.11));\n }\n\n // The target velocity: the divergence-free curl current + the cursor vortex.\n let vField = sampleVelocity(pos, t) + pointerVortex(pos);\n // Momentum/inertia: the low turnRate scales how hard the mote commits to the field\n // each step — a weighty ease into the current's turns (arcs, not snaps), the\n // overlapping-action/follow-through on a particle (R4-motion).\n let v = vField * turnRate * speedScale;\n // Forward-Euler advection step (the integrator — F1b's witness pos = pos + v*dt).\n pos = pos + v * dt * 60.0;\n\n life = life - dt;\n let speed = length(v);\n particles[idx] = Particle(vec4<f32>(pos, speed, life));\n}\n\n@compute @workgroup_size(64)\nfn cs_main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n let count = u32(u.ints.y);\n if (idx >= count) { return; } // bounds-guard the dispatch tail\n\n let t = u.p0.x;\n let dt = u.p0.y;\n let mode = u.ints.w;\n\n if (mode == 1) {\n cs_flow(idx, t, dt);\n } else {\n cs_field(idx, t, dt);\n }\n}\n", _e = `
9
280
  const PI: f32 = 3.141592653589793;
10
281
  const TAU: f32 = 6.283185307179586;
11
282
  const MAX_FLOW_STOPS: i32 = 4;
12
283
 
13
284
  struct Particle {
14
- // (pos.x, pos.y, height, |disp|)
285
+ // field: (pos.x, pos.y, height, |disp|) flow: (pos.x, pos.y, speed, life)
15
286
  data: vec4<f32>,
16
287
  };
17
288
 
@@ -21,12 +292,14 @@ struct RenderUniforms {
21
292
  r0: vec4<f32>,
22
293
  // r1: (uDotSize, uSizePulse, uAspect, uGridPitch)
23
294
  r1: vec4<f32>,
24
- // r2: (uWaveBandCenter, uWaveBandWidth, uGlobeMask, _pad)
295
+ // r2: (uWaveBandCenter, uWaveBandWidth, uGlobeMask, uMode) — uMode: 0=field, 1=flow
25
296
  r2: vec4<f32>,
26
297
  // ints: (uStopCount, uParticleCount, _pad, _pad)
27
298
  ints: vec4<i32>,
28
299
  // bg: (background.rgb, hasBackground)
29
300
  bg: vec4<f32>,
301
+ // f0: (uSpeedGlow, uSpeedNorm, uShadowOffset, uStretchAmp) — the flow velocity-map levers
302
+ f0: vec4<f32>,
30
303
  // each palette stop: linear-sRGB rgb + _pad
31
304
  palette: array<vec4<f32>, 4>,
32
305
  };
@@ -74,7 +347,9 @@ fn samplePaletteLin(t: f32) -> vec3<f32> {
74
347
  struct VSOut {
75
348
  @builtin(position) pos: vec4<f32>,
76
349
  @location(0) local: vec2<f32>, // [-1,1] billboard-local coords for the soft circle
77
- @location(1) bright: f32, // band-driven brightness [0, ~1.6]
350
+ @location(1) bright: f32, // brightness [0, ~1.6]
351
+ @location(2) ramp: f32, // palette-ramp coord (field: tone, flow: speedNorm)
352
+ @location(3) flowFade: f32, // flow life-fade [0,1] (field: 1)
78
353
  };
79
354
 
80
355
  @vertex
@@ -91,24 +366,39 @@ fn vs_main(
91
366
 
92
367
  let pr = particles[ii].data;
93
368
  let p = pr.xy;
94
- let h = pr.z;
95
- let dispMag = pr.w;
96
369
  let half = u.r0.w;
370
+ let aspect = u.r1.z;
371
+ let mode = i32(u.r2.w + 0.5);
97
372
 
98
- // Brightness = base + band·contrast, masked by the optional globe (read at the live
99
- // position — close enough to the anchor at the sub-cell cap). The band SWEEPS as h
100
- // translates across the lattice.
101
- let band = waveBand(h, u.r2.x, u.r2.y);
102
- var bright = u.r0.z + band * u.r0.y;
103
- bright = bright * globeMask(p, u.r0.x, u.r2.z);
373
+ var bright: f32;
374
+ var ramp: f32;
375
+ var sizeWorld: f32;
376
+ var flowFade: f32 = 1.0;
104
377
 
105
- // A subtle drift-driven size pulse (never a re-seed — the dot only breathes).
106
- let sizePulse = u.r1.y;
107
- let sizeWorld = u.r1.x * (1.0 + dispMag * sizePulse);
378
+ if (mode == 1) {
379
+ // ── flow (AURORA CURRENT): speed→hue, speed·life→brightness, speed→size bloom ──
380
+ let speed = pr.z;
381
+ let life = pr.w;
382
+ let speedNorm = clamp(speed / max(u.f0.y, 1e-4), 0.0, 1.0);
383
+ // life fades the mote over its last third (the trail's tail / overlapping-action).
384
+ flowFade = clamp(life * 3.0, 0.0, 1.0);
385
+ ramp = speedNorm;
386
+ bright = (0.35 + speedNorm * u.f0.x) * flowFade;
387
+ // a speed bloom (the cartoon "more" on WGPU — faster motes read as hot speed-cores) +
388
+ // the √φ stretch lever scales the bloom (the squash-stretch as an isotropic core here).
389
+ sizeWorld = u.r1.x * (1.0 + speedNorm * (u.f0.w + 1.0));
390
+ } else {
391
+ // ── field: the sweeping bright band over the anchored lattice (BC.W-VIZ-DOTFLOW) ──
392
+ let h = pr.z;
393
+ let dispMag = pr.w;
394
+ let band = waveBand(h, u.r2.x, u.r2.y);
395
+ bright = (u.r0.z + band * u.r0.y) * globeMask(p, u.r0.x, u.r2.z);
396
+ ramp = clamp(bright, 0.0, 1.0);
397
+ sizeWorld = u.r1.x * (1.0 + dispMag * u.r1.y);
398
+ }
108
399
 
109
400
  // Position the quad at the dot in clip space. Domain [-half,half] → NDC [-1,1];
110
401
  // the quad half-extent rides sizeWorld (in domain units, aspect-corrected x).
111
- let aspect = u.r1.z;
112
402
  let ndc = p / half;
113
403
  let off = local * sizeWorld / half;
114
404
  let offX = off.x / max(aspect, 1e-4);
@@ -117,6 +407,8 @@ fn vs_main(
117
407
  out.pos = vec4<f32>(ndc.x + offX, ndc.y + off.y, 0.0, 1.0);
118
408
  out.local = local;
119
409
  out.bright = bright;
410
+ out.ramp = ramp;
411
+ out.flowFade = flowFade;
120
412
  return out;
121
413
  }
122
414
 
@@ -128,98 +420,434 @@ fn fs_main(in: VSOut) -> @location(0) vec4<f32> {
128
420
  let mask = 1.0 - smoothstep(1.0 - feather, 1.0, r);
129
421
  if (mask < 0.002) { return vec4<f32>(0.0); }
130
422
 
131
- // The brightness lights the dot core; the palette tints it (the warm-cream identity).
423
+ let mode = i32(u.r2.w + 0.5);
132
424
  let bright = clamp(in.bright, 0.0, 1.6);
133
- let tone = clamp(bright, 0.0, 1.0);
134
- let lin = samplePaletteLin(tone) * bright;
135
- // A floor alpha so even an off-band dot stays a faint lattice point (the calm grid).
136
- let alpha = mask * clamp(bright * 0.8 + 0.12, 0.0, 1.0);
425
+ let lin = samplePaletteLin(in.ramp) * bright;
137
426
  let rgb = clamp(linearToSrgb(lin), vec3<f32>(0.0), vec3<f32>(1.0));
138
- // Premultiplied-alpha output.
427
+
428
+ if (mode == 1) {
429
+ // flow: additive premultiplied — a soft glowing core, alpha rides speed·life.
430
+ let coreAlpha = mask * mask; // a tighter hot core (less white wash — H2 cap)
431
+ let a = coreAlpha * clamp(bright, 0.0, 1.0);
432
+ return vec4<f32>(rgb * a, a);
433
+ }
434
+ // field: a floor alpha so even an off-band dot stays a faint lattice point.
435
+ let alpha = mask * clamp(bright * 0.8 + 0.12, 0.0, 1.0);
139
436
  return vec4<f32>(rgb * alpha, alpha);
140
437
  }
141
- `, b = "#version 300 es\nprecision highp float;\nin vec2 aPosition;\nout vec2 vUv;\nvoid main() {\n vUv = aPosition; // [-1,1]² domain\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}", x = `#version 300 es
142
- precision highp float;
143
-
144
- #define PI 3.141592653589793
145
- #define TAU 6.283185307179586
146
- #define FLOW_GRAVITY 9.81
147
- #define CURL_EPS 0.012
148
- #define MAX_WAVE_COMPONENTS 8
149
- #define MAX_FLOW_STOPS 4
150
-
151
- in vec2 vUv;
152
- out vec4 fragColor;
153
-
154
- uniform float uTime;
155
- uniform float uWindSpeed;
156
- uniform float uCurlStrength;
157
- uniform float uDomainHalf;
158
- uniform float uAspect;
159
- uniform float uGridPitchDomain; // lattice pitch in DOMAIN units
160
- uniform float uDotRadiusDomain; // dot radius in DOMAIN units
161
- uniform float uDisplaceAmp; // sub-cell drift in pitch fractions
162
- uniform float uContrast;
163
- uniform float uBaseBright;
164
- uniform float uWaveBandCenter;
165
- uniform float uWaveBandWidth;
166
- uniform float uGlobeMask;
167
- uniform int uWaveCount;
168
- uniform int uStopCount;
169
- uniform float uHasBackground;
170
- uniform vec3 uBg;
171
- uniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)
172
- uniform vec3 uPalette[MAX_FLOW_STOPS]; // linear-sRGB stops
438
+ `, ve = `
439
+ struct TrailUniforms {
440
+ // (decay, hasGround, time, _pad)
441
+ p: vec4<f32>,
442
+ // floor.rgb (linear-sRGB) + _pad
443
+ floorC: vec4<f32>,
444
+ // bloom.rgb (linear-sRGB) + _pad
445
+ bloomC: vec4<f32>,
446
+ };
447
+ @group(0) @binding(0) var<uniform> u: TrailUniforms;
448
+ @group(0) @binding(1) var samp: sampler;
449
+ @group(0) @binding(2) var tex: texture_2d<f32>;
173
450
 
174
- const mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);
451
+ ${n}
175
452
 
176
- ${r}
177
- ${a}
453
+ struct FSQ { @builtin(position) pos: vec4<f32>, @location(0) uv: vec2<f32> };
178
454
 
179
- // ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──
180
- vec2 gerstnerVelocity(vec2 p, float t) {
181
- float dhdx = 0.0;
182
- float dhdy = 0.0;
183
- for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
184
- if (i >= uWaveCount) break;
185
- vec4 w = uWaves[i];
186
- float k = TAU / max(w.y, 1e-4);
187
- float dirRad = w.z * PI / 180.0;
188
- vec2 d = vec2(cos(dirRad), sin(dirRad));
189
- float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
190
- float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;
191
- float akc = w.x * k * cos(theta);
192
- dhdx += akc * d.x;
193
- dhdy += akc * d.y;
194
- }
195
- return vec2(dhdy, -dhdx);
455
+ @vertex
456
+ fn vs_fsq(@builtin(vertex_index) vi: u32) -> FSQ {
457
+ var c = array<vec2<f32>, 3>(
458
+ vec2<f32>(-1.0, -1.0), vec2<f32>(3.0, -1.0), vec2<f32>(-1.0, 3.0),
459
+ );
460
+ let p = c[vi];
461
+ var out: FSQ;
462
+ out.pos = vec4<f32>(p, 0.0, 1.0);
463
+ out.uv = p * 0.5 + 0.5;
464
+ return out;
196
465
  }
197
466
 
198
- // ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight) ──
199
- float sampleHeight(vec2 o, float t) {
200
- float h = 0.0;
201
- float ampSum = 0.0;
202
- for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
203
- if (i >= uWaveCount) break;
204
- vec4 w = uWaves[i];
205
- float k = TAU / max(w.y, 1e-4);
206
- float dirRad = w.z * PI / 180.0;
207
- vec2 d = vec2(cos(dirRad), sin(dirRad));
208
- float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
209
- float theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;
210
- h += w.x * sin(theta);
211
- ampSum += abs(w.x);
212
- }
213
- return h / max(ampSum, 1e-4);
467
+ @fragment
468
+ fn fs_decay(in: FSQ) -> @location(0) vec4<f32> {
469
+ let prev = textureSample(tex, samp, in.uv);
470
+ return prev * u.p.x; // fade toward black
214
471
  }
215
472
 
216
- // ── Shared curl-noise basis (the GLSL twin of flow.glsl.ts curlFBM) ──
217
- float hash21(vec2 p) {
218
- vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);
219
- p3 += dot(p3, p3.yzx + 33.33);
220
- return fract((p3.x + p3.y) * p3.z);
473
+ @fragment
474
+ fn fs_present(in: FSQ) -> @location(0) vec4<f32> {
475
+ let trail = textureSample(tex, samp, in.uv).rgb;
476
+ let mapped = trail / (trail + vec3<f32>(0.85)); // Reinhard — hot cores, not white wash
477
+ if (u.p.y < 0.5) {
478
+ let rgb = clamp(linearToSrgb(mapped), vec3<f32>(0.0), vec3<f32>(1.0));
479
+ let a = clamp(max(mapped.r, max(mapped.g, mapped.b)), 0.0, 1.0);
480
+ return vec4<f32>(rgb * a, a);
481
+ }
482
+ let bloom = smoothstep(1.3, 0.0, distance(in.uv, vec2<f32>(0.12, 0.88)));
483
+ let floorLin = u.floorC.rgb + u.bloomC.rgb * bloom * 0.5;
484
+ let lin = floorLin + mapped;
485
+ let rgb = clamp(linearToSrgb(lin), vec3<f32>(0.0), vec3<f32>(1.0));
486
+ return vec4<f32>(rgb, 1.0);
221
487
  }
222
- float valueNoise(vec2 p) {
488
+ `, J = 64, ye = 128, Y = 8, be = 16, xe = 4, Se = 1, X = 2, Ce = 4, we = 64;
489
+ function Te(e) {
490
+ let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a, getPointer: s } = e;
491
+ return function(e, l, u) {
492
+ let d = n.mode === "flow", f = G(n.gridPitch, $(t)), p = d ? He(n) : f.count, m = d ? he(p, n.lifetimeSec) : me(f), h = e.createShaderModule({
493
+ label: "[DotFlowField] flow-field.compute.wgsl",
494
+ code: ge
495
+ }), g = e.createShaderModule({
496
+ label: "[DotFlowField] flow-field.render.wgsl",
497
+ code: _e
498
+ }), _ = e.createBuffer({
499
+ label: "[DotFlowField] particles",
500
+ size: m.length / 4 * 16,
501
+ usage: ye | Y,
502
+ mappedAtCreation: !0
503
+ });
504
+ new Float32Array(_.getMappedRange()).set(m), _.unmap();
505
+ let v = e.createBuffer({
506
+ label: "[DotFlowField] compute-uniforms",
507
+ size: ie().buffer.byteLength,
508
+ usage: J | Y
509
+ }), y = e.createBuffer({
510
+ label: "[DotFlowField] render-uniforms",
511
+ size: ce().buffer.byteLength,
512
+ usage: J | Y
513
+ }), b = e.createBindGroupLayout({
514
+ label: "[DotFlowField] compute-bgl",
515
+ entries: [{
516
+ binding: 0,
517
+ visibility: Ce,
518
+ buffer: { type: "uniform" }
519
+ }, {
520
+ binding: 1,
521
+ visibility: Ce,
522
+ buffer: { type: "storage" }
523
+ }]
524
+ }), x = e.createComputePipeline({
525
+ label: "[DotFlowField] compute-pipeline",
526
+ layout: e.createPipelineLayout({ bindGroupLayouts: [b] }),
527
+ compute: {
528
+ module: h,
529
+ entryPoint: "cs_main"
530
+ }
531
+ }), S = e.createBindGroup({
532
+ label: "[DotFlowField] compute-bg",
533
+ layout: b,
534
+ entries: [{
535
+ binding: 0,
536
+ resource: { buffer: v }
537
+ }, {
538
+ binding: 1,
539
+ resource: { buffer: _ }
540
+ }]
541
+ }), C = e.createBindGroupLayout({
542
+ label: "[DotFlowField] render-bgl",
543
+ entries: [{
544
+ binding: 0,
545
+ visibility: Se | X,
546
+ buffer: { type: "uniform" }
547
+ }, {
548
+ binding: 1,
549
+ visibility: Se,
550
+ buffer: { type: "read-only-storage" }
551
+ }]
552
+ }), w = "rgba16float", T = e.createRenderPipeline({
553
+ label: "[DotFlowField] render-pipeline",
554
+ layout: e.createPipelineLayout({ bindGroupLayouts: [C] }),
555
+ vertex: {
556
+ module: g,
557
+ entryPoint: "vs_main"
558
+ },
559
+ fragment: {
560
+ module: g,
561
+ entryPoint: "fs_main",
562
+ targets: [{
563
+ format: d ? w : u,
564
+ blend: d ? {
565
+ color: {
566
+ srcFactor: "one",
567
+ dstFactor: "one",
568
+ operation: "add"
569
+ },
570
+ alpha: {
571
+ srcFactor: "one",
572
+ dstFactor: "one",
573
+ operation: "add"
574
+ }
575
+ } : {
576
+ color: {
577
+ srcFactor: "one",
578
+ dstFactor: "one-minus-src-alpha",
579
+ operation: "add"
580
+ },
581
+ alpha: {
582
+ srcFactor: "one",
583
+ dstFactor: "one-minus-src-alpha",
584
+ operation: "add"
585
+ }
586
+ }
587
+ }]
588
+ },
589
+ primitive: { topology: "triangle-list" }
590
+ }), E = e.createBindGroup({
591
+ label: "[DotFlowField] render-bg",
592
+ layout: C,
593
+ entries: [{
594
+ binding: 0,
595
+ resource: { buffer: y }
596
+ }, {
597
+ binding: 1,
598
+ resource: { buffer: _ }
599
+ }]
600
+ }), D = d ? e.createShaderModule({
601
+ label: "[DotFlowField] flow-field.trail.wgsl",
602
+ code: ve
603
+ }) : null, O = d ? e.createBuffer({
604
+ label: "[DotFlowField] trail-uniforms",
605
+ size: 48,
606
+ usage: J | Y
607
+ }) : null, k = d ? e.createSampler({
608
+ magFilter: "linear",
609
+ minFilter: "linear"
610
+ }) : null, A = d && D ? e.createBindGroupLayout({
611
+ label: "[DotFlowField] trail-bgl",
612
+ entries: [
613
+ {
614
+ binding: 0,
615
+ visibility: X,
616
+ buffer: { type: "uniform" }
617
+ },
618
+ {
619
+ binding: 1,
620
+ visibility: X,
621
+ sampler: { type: "filtering" }
622
+ },
623
+ {
624
+ binding: 2,
625
+ visibility: X,
626
+ texture: { sampleType: "float" }
627
+ }
628
+ ]
629
+ }) : null, j = d && D && A ? e.createRenderPipeline({
630
+ label: "[DotFlowField] trail-decay-pipeline",
631
+ layout: e.createPipelineLayout({ bindGroupLayouts: [A] }),
632
+ vertex: {
633
+ module: D,
634
+ entryPoint: "vs_fsq"
635
+ },
636
+ fragment: {
637
+ module: D,
638
+ entryPoint: "fs_decay",
639
+ targets: [{ format: w }]
640
+ },
641
+ primitive: { topology: "triangle-list" }
642
+ }) : null, M = d && D && A ? e.createRenderPipeline({
643
+ label: "[DotFlowField] trail-present-pipeline",
644
+ layout: e.createPipelineLayout({ bindGroupLayouts: [A] }),
645
+ vertex: {
646
+ module: D,
647
+ entryPoint: "vs_fsq"
648
+ },
649
+ fragment: {
650
+ module: D,
651
+ entryPoint: "fs_present",
652
+ targets: [{ format: u }]
653
+ },
654
+ primitive: { topology: "triangle-list" }
655
+ }) : null, N = null, P = null, F = null, I = null, L = 0;
656
+ function R() {
657
+ if (!d || !A || !O || !k) return;
658
+ let r = Math.min(Math.max(n.trailScale, .25), 1), i = Math.max(2, Math.round(t.width * r)), a = Math.max(2, Math.round(t.height * r));
659
+ N?.forEach((e) => e.destroy());
660
+ let o = () => e.createTexture({
661
+ label: "[DotFlowField] trail",
662
+ size: {
663
+ width: i,
664
+ height: a
665
+ },
666
+ format: w,
667
+ usage: be | xe
668
+ }), s = o(), c = o();
669
+ N = [s, c], P = [s.createView(), c.createView()];
670
+ let l = (t) => e.createBindGroup({
671
+ layout: A,
672
+ entries: [
673
+ {
674
+ binding: 0,
675
+ resource: { buffer: O }
676
+ },
677
+ {
678
+ binding: 1,
679
+ resource: k
680
+ },
681
+ {
682
+ binding: 2,
683
+ resource: t
684
+ }
685
+ ]
686
+ });
687
+ F = [l(P[1]), l(P[0])], I = [l(P[0]), l(P[1])];
688
+ }
689
+ let z = ie(), B = ce(), V = new Float32Array(12), H = -1;
690
+ function U() {
691
+ let e = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * e)), s = Math.max(1, Math.round(i * e));
692
+ if ((t.width !== a || t.height !== s) && (t.width = a, t.height = s), !d) {
693
+ let e = G(n.gridPitch, $(t));
694
+ f = {
695
+ ...e,
696
+ count: Math.min(e.count, m.length / 4)
697
+ };
698
+ }
699
+ R();
700
+ }
701
+ function W(i) {
702
+ a?.(i);
703
+ let o = H < 0 ? 0 : Math.min(Math.max(i - H, 0), .05);
704
+ H = i;
705
+ let u = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1), m = d ? p : f.count, h = s?.();
706
+ ae(z, n, i, o, f, m, h), e.queue.writeBuffer(v, 0, z.buffer), fe(B, n, i, u, $(t), f, r()), e.queue.writeBuffer(y, 0, B.buffer);
707
+ let g = e.createCommandEncoder({ label: "[DotFlowField] frame" }), _ = g.beginComputePass();
708
+ if (_.setPipeline(x), _.setBindGroup(0, S), _.dispatchWorkgroups(Math.ceil(m / we)), _.end(), d && P && F && I && j && M && O) {
709
+ let t = L, r = 1 - L, a = ee(n.trailHalfLife), o = n.background === "transparent" ? 0 : 1, s = c(n.background === "transparent" ? Be : n.background), u = c(Ve);
710
+ V[0] = a, V[1] = o, V[2] = i, V[4] = s[0], V[5] = s[1], V[6] = s[2], V[8] = u[0], V[9] = u[1], V[10] = u[2], e.queue.writeBuffer(O, 0, V.buffer);
711
+ let d = g.beginRenderPass({ colorAttachments: [{
712
+ view: P[t],
713
+ clearValue: {
714
+ r: 0,
715
+ g: 0,
716
+ b: 0,
717
+ a: 0
718
+ },
719
+ loadOp: "clear",
720
+ storeOp: "store"
721
+ }] });
722
+ d.setPipeline(j), d.setBindGroup(0, F[t]), d.draw(3, 1, 0, 0), d.end();
723
+ let f = g.beginRenderPass({ colorAttachments: [{
724
+ view: P[t],
725
+ loadOp: "load",
726
+ storeOp: "store"
727
+ }] });
728
+ f.setPipeline(T), f.setBindGroup(0, E), f.draw(6, m, 0, 0), f.end();
729
+ let p = l.getCurrentTexture().createView(), h = g.beginRenderPass({ colorAttachments: [{
730
+ view: p,
731
+ clearValue: {
732
+ r: 0,
733
+ g: 0,
734
+ b: 0,
735
+ a: 0
736
+ },
737
+ loadOp: "clear",
738
+ storeOp: "store"
739
+ }] });
740
+ h.setPipeline(M), h.setBindGroup(0, I[t]), h.draw(3, 1, 0, 0), h.end(), L = r;
741
+ } else {
742
+ let e = l.getCurrentTexture().createView(), t = g.beginRenderPass({ colorAttachments: [{
743
+ view: e,
744
+ clearValue: {
745
+ r: 0,
746
+ g: 0,
747
+ b: 0,
748
+ a: 0
749
+ },
750
+ loadOp: "clear",
751
+ storeOp: "store"
752
+ }] });
753
+ t.setPipeline(T), t.setBindGroup(0, E), t.draw(6, m, 0, 0), t.end();
754
+ }
755
+ e.queue.submit([g.finish()]);
756
+ }
757
+ return {
758
+ frame: W,
759
+ shouldContinue: i,
760
+ resize: U,
761
+ teardown: () => {
762
+ _.destroy(), v.destroy(), y.destroy(), O?.destroy(), N?.forEach((e) => e.destroy());
763
+ }
764
+ };
765
+ };
766
+ }
767
+ //#endregion
768
+ //#region src/components/custom/dot-flow-field/shaders/flow-field.glsl.ts
769
+ var Ee = "#version 300 es\nprecision highp float;\nin vec2 aPosition;\nout vec2 vUv;\nvoid main() {\n vUv = aPosition; // [-1,1]² domain\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}", De = `#version 300 es
770
+ precision highp float;
771
+
772
+ #define PI 3.141592653589793
773
+ #define TAU 6.283185307179586
774
+ #define FLOW_GRAVITY 9.81
775
+ #define CURL_EPS 0.012
776
+ #define MAX_WAVE_COMPONENTS 8
777
+ #define MAX_FLOW_STOPS 4
778
+
779
+ in vec2 vUv;
780
+ out vec4 fragColor;
781
+
782
+ uniform float uTime;
783
+ uniform float uWindSpeed;
784
+ uniform float uCurlStrength;
785
+ uniform float uDomainHalf;
786
+ uniform float uAspect;
787
+ uniform float uGridPitchDomain; // lattice pitch in DOMAIN units
788
+ uniform float uDotRadiusDomain; // dot radius in DOMAIN units
789
+ uniform float uDisplaceAmp; // sub-cell drift in pitch fractions
790
+ uniform float uContrast;
791
+ uniform float uBaseBright;
792
+ uniform float uWaveBandCenter;
793
+ uniform float uWaveBandWidth;
794
+ uniform float uGlobeMask;
795
+ uniform int uWaveCount;
796
+ uniform int uStopCount;
797
+ uniform float uHasBackground;
798
+ uniform vec3 uBg;
799
+ uniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)
800
+ uniform vec3 uPalette[MAX_FLOW_STOPS]; // linear-sRGB stops
801
+
802
+ const mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);
803
+
804
+ ${r}
805
+ ${a}
806
+
807
+ // ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──
808
+ vec2 gerstnerVelocity(vec2 p, float t) {
809
+ float dhdx = 0.0;
810
+ float dhdy = 0.0;
811
+ for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
812
+ if (i >= uWaveCount) break;
813
+ vec4 w = uWaves[i];
814
+ float k = TAU / max(w.y, 1e-4);
815
+ float dirRad = w.z * PI / 180.0;
816
+ vec2 d = vec2(cos(dirRad), sin(dirRad));
817
+ float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
818
+ float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;
819
+ float akc = w.x * k * cos(theta);
820
+ dhdx += akc * d.x;
821
+ dhdy += akc * d.y;
822
+ }
823
+ return vec2(dhdy, -dhdx);
824
+ }
825
+
826
+ // ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight) ──
827
+ float sampleHeight(vec2 o, float t) {
828
+ float h = 0.0;
829
+ float ampSum = 0.0;
830
+ for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
831
+ if (i >= uWaveCount) break;
832
+ vec4 w = uWaves[i];
833
+ float k = TAU / max(w.y, 1e-4);
834
+ float dirRad = w.z * PI / 180.0;
835
+ vec2 d = vec2(cos(dirRad), sin(dirRad));
836
+ float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
837
+ float theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;
838
+ h += w.x * sin(theta);
839
+ ampSum += abs(w.x);
840
+ }
841
+ return h / max(ampSum, 1e-4);
842
+ }
843
+
844
+ // ── Shared curl-noise basis (the GLSL twin of flow.glsl.ts curlFBM) ──
845
+ float hash21(vec2 p) {
846
+ vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);
847
+ p3 += dot(p3, p3.yzx + 33.33);
848
+ return fract((p3.x + p3.y) * p3.z);
849
+ }
850
+ float valueNoise(vec2 p) {
223
851
  vec2 i = floor(p);
224
852
  vec2 f = fract(p);
225
853
  vec2 u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);
@@ -340,388 +968,326 @@ void main() {
340
968
  return;
341
969
  }
342
970
  fragColor = vec4(rgb * alpha, alpha);
343
- }`, S = 9.81, C = Math.PI * 2;
344
- function w(e) {
345
- let t = e * Math.PI / 180;
346
- return {
347
- x: Math.cos(t),
348
- y: Math.sin(t)
349
- };
350
- }
351
- function T(e, t, n, r) {
352
- let i = 0, a = 0;
353
- for (let o of n) {
354
- let n = C / Math.max(o.wavelength, 1e-4), s = w(o.direction), c = Math.sqrt(S * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase, u = Math.cos(l), d = o.amplitude * n * u;
355
- i += d * s.x, a += d * s.y;
356
- }
357
- return {
358
- x: a,
359
- y: -i
360
- };
361
- }
362
- var E = .012;
363
- function D(e, t) {
364
- let n = e * .1031 % 1, r = t * .1031 % 1, i = e * .1031 % 1;
365
- n < 0 && (n += 1), r < 0 && (r += 1), i < 0 && (i += 1);
366
- let a = n * (r + 33.33) + r * (i + 33.33) + i * (n + 33.33);
367
- n += a, r += a, i += a;
368
- let o = (n + r) * i % 1;
369
- return o < 0 && (o += 1), o;
370
- }
371
- function O(e, t, n) {
372
- return e + (t - e) * n;
373
- }
374
- function k(e, t) {
375
- let n = Math.floor(e), r = Math.floor(t), i = e - n, a = t - r, o = i * i * i * (i * (i * 6 - 15) + 10), s = a * a * a * (a * (a * 6 - 15) + 10), c = D(n, r), l = D(n + 1, r), u = D(n, r + 1), d = D(n + 1, r + 1);
376
- return O(O(c, l, o), O(u, d, o), s);
377
- }
378
- function A(e, t) {
379
- let n = 0, r = .5, i = 1, a = e, o = t;
380
- for (let e = 0; e < 3; e++) {
381
- n += r * k(a * i, o * i);
382
- let e = .8 * a - .6 * o, t = .6 * a + .8 * o;
383
- a = e, o = t, i *= 2, r *= .5;
384
- }
385
- return n;
386
- }
387
- function j(e) {
388
- let t = A(e.x + E, e.y) - A(e.x - E, e.y), n = A(e.x, e.y + E) - A(e.x, e.y - E), r = t / (2 * E);
389
- return {
390
- x: n / (2 * E),
391
- y: -r
392
- };
393
- }
394
- function M(e, t, n, r, i) {
395
- let a = T(e, t, n, r);
396
- if (i <= 0) return a;
397
- let o = j({
398
- x: e.x * .55 + t * .15,
399
- y: e.y * .55
400
- });
401
- return {
402
- x: a.x + o.x * i,
403
- y: a.y + o.y * i
404
- };
405
- }
406
- var N = .85;
407
- function P(e, t, n) {
408
- let r = Math.max(t, 1), i = e % r, a = Math.floor(e / r), o = (r - 1) * n / 2;
409
- return {
410
- x: i * n - o,
411
- y: a * n - o
412
- };
413
- }
414
- function F(e, t, n, r) {
415
- let i = 0, a = 0;
416
- for (let o of n) {
417
- let n = C / Math.max(o.wavelength, 1e-4), s = w(o.direction), c = Math.sqrt(S * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase;
418
- i += o.amplitude * Math.sin(l), a += Math.abs(o.amplitude);
419
- }
420
- return i / Math.max(a, 1e-4);
421
- }
422
- function I(e, t, n, r, i) {
423
- let a = M(e, t, n, r, i), o = Math.hypot(a.x, a.y);
424
- if (o < 1e-5) return {
425
- x: 0,
426
- y: 0
427
- };
428
- let s = Math.tanh(o) / o;
429
- return {
430
- x: a.x * s,
431
- y: a.y * s
432
- };
433
- }
434
- function L(e, t, n) {
435
- return 1 - ee(0, Math.max(n, .001), Math.abs(e - t));
971
+ }`, Oe = "\n#define PI 3.141592653589793\n#define TAU 6.283185307179586\n#define FLOW_GRAVITY 9.81\n#define CURL_EPS 0.012\n#define MAX_WAVE_COMPONENTS 8\nconst mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);\n\nuniform float uTime;\nuniform float uWindSpeed;\nuniform float uCurlStrength;\nuniform int uWaveCount;\nuniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)\n\nvec2 gerstnerVelocity(vec2 p, float t) {\n float dhdx = 0.0; float dhdy = 0.0;\n for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {\n if (i >= uWaveCount) break;\n vec4 w = uWaves[i];\n float k = TAU / max(w.y, 1e-4);\n float dirRad = w.z * PI / 180.0;\n vec2 d = vec2(cos(dirRad), sin(dirRad));\n float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;\n float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;\n float akc = w.x * k * cos(theta);\n dhdx += akc * d.x; dhdy += akc * d.y;\n }\n return vec2(dhdy, -dhdx);\n}\nfloat hash21f(vec2 p) {\n vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\nfloat valueNoiseF(vec2 p) {\n vec2 i = floor(p); vec2 f = fract(p);\n vec2 u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n float a = hash21f(i + vec2(0.0, 0.0));\n float b = hash21f(i + vec2(1.0, 0.0));\n float c = hash21f(i + vec2(0.0, 1.0));\n float d = hash21f(i + vec2(1.0, 1.0));\n return mix(mix(a, b, u2.x), mix(c, d, u2.x), u2.y);\n}\nfloat potentialFBMf(vec2 p0) {\n float v = 0.0; float amp = 0.5; float freq = 1.0; vec2 p = p0;\n for (int i = 0; i < 3; i++) { v += amp * valueNoiseF(p * freq); p = FBM_ROT * p; freq *= 2.0; amp *= 0.5; }\n return v;\n}\nvec2 curlFBMf(vec2 p) {\n float dx = potentialFBMf(p + vec2(CURL_EPS, 0.0)) - potentialFBMf(p - vec2(CURL_EPS, 0.0));\n float dy = potentialFBMf(p + vec2(0.0, CURL_EPS)) - potentialFBMf(p - vec2(0.0, CURL_EPS));\n vec2 g = vec2(dx, dy) / (2.0 * CURL_EPS);\n return vec2(g.y, -g.x);\n}\nvec2 sampleVelocityF(vec2 p, float t) {\n vec2 v = gerstnerVelocity(p, t);\n if (uCurlStrength > 0.0) { v += curlFBMf(vec2(p.x * 0.55 + t * 0.15, p.y * 0.55)) * uCurlStrength; }\n return v;\n}\n", Z = "#version 300 es\nprecision highp float;\nin vec2 aPosition;\nout vec2 vUv;\nvoid main() {\n vUv = aPosition * 0.5 + 0.5; // [0,1] texel space\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}", ke = `#version 300 es
972
+ precision highp float;
973
+ in vec2 vUv;
974
+ out vec4 fragColor;
975
+
976
+ uniform sampler2D uState; // prev particle state (RGBA = pos.xy, speed, life)
977
+ uniform float uDt;
978
+ uniform float uDomainHalf;
979
+ uniform float uTurnRate;
980
+ uniform float uSpeedScale;
981
+ uniform float uLifetimeSec;
982
+ uniform float uEdgeBias;
983
+ uniform vec2 uCursor; // pointer in domain space
984
+ uniform vec2 uPointerVel; // pointer velocity (domain/s)
985
+ uniform float uBurst; // flick-burst impulse
986
+ uniform float uPointerActive; // 0/1
987
+ uniform float uVortexRadius;
988
+ uniform float uVortexSpin;
989
+ uniform float uDragGain;
990
+ uniform float uBurstShove;
991
+
992
+ ${Oe}
993
+
994
+ vec2 pointerVortex(vec2 p) {
995
+ if (uPointerActive < 0.5) return vec2(0.0);
996
+ vec2 r = p - uCursor;
997
+ float d = length(r);
998
+ float radius = max(uVortexRadius, 1e-3);
999
+ float fall = exp(-(d * d) / (radius * radius));
1000
+ vec2 swirl = normalize(vec2(-r.y, r.x) + vec2(1e-6, 0.0));
1001
+ vec2 radial = r / max(d, 1e-4);
1002
+ vec2 v = swirl * uVortexSpin + uPointerVel * uDragGain + radial * uBurst * uBurstShove;
1003
+ return v * fall;
436
1004
  }
437
- function ee(e, t, n) {
438
- let r = Math.min(Math.max((n - e) / Math.max(t - e, 1e-6), 0), 1);
439
- return r * r * (3 - 2 * r);
1005
+
1006
+ vec2 respawn(vec2 seed, float t) {
1007
+ float rx = hash21f(seed + vec2(t * 0.37, 1.7)) * 2.0 - 1.0;
1008
+ float ry = hash21f(seed.yx + vec2(3.1, t * 0.37)) * 2.0 - 1.0;
1009
+ float bias = clamp(uEdgeBias, 0.0, 1.0);
1010
+ float bx = sign(rx) * pow(abs(rx), mix(1.0, 0.5, bias));
1011
+ float by = sign(ry) * pow(abs(ry), mix(1.0, 0.5, bias));
1012
+ return vec2(bx, by) * uDomainHalf;
440
1013
  }
441
- function R(e, t = 3, n = 2.5) {
442
- let r = 2 * N, i = Math.max(n, .5) * r, a = i / C, o = r / 3, s = Math.max(1, Math.min(Math.round(t), 3)), c = [], l = i, u = 1;
443
- for (let t = 0; t < s; t++) {
444
- let n = Math.max(l, o), r = C / n, i = Math.exp(-1 / (r * a) ** 2) / (r * r), s = (t % 2 == 0 ? 1 : -1) * (8 + t * 4);
445
- c.push({
446
- amplitude: i * u,
447
- wavelength: n,
448
- direction: e + s,
449
- phase: t * 1.618033 % C
450
- }), l *= .58, u *= .38;
451
- }
452
- return c;
1014
+
1015
+ void main() {
1016
+ vec4 st = texture(uState, vUv);
1017
+ vec2 pos = st.xy;
1018
+ float life = st.w;
1019
+ float half = uDomainHalf;
1020
+
1021
+ bool dead = life <= 0.0;
1022
+ bool outOfDomain = max(abs(pos.x), abs(pos.y)) > half * 1.05;
1023
+ if (dead || outOfDomain) {
1024
+ pos = respawn(vUv, uTime);
1025
+ life = max(uLifetimeSec, 1e-3) * hash21f(vUv * 7.0 + uTime * 0.11);
1026
+ }
1027
+
1028
+ vec2 vField = sampleVelocityF(pos, uTime) + pointerVortex(pos);
1029
+ // momentum: low turnRate = weighty arcs (eases into the current's turns).
1030
+ vec2 v = vField * uTurnRate * uSpeedScale;
1031
+ // forward-Euler advection (pos = pos + v*dt — the integrand twin of cs_flow).
1032
+ pos = pos + v * uDt * 60.0;
1033
+ life = life - uDt;
1034
+
1035
+ fragColor = vec4(pos, length(v), life);
1036
+ }`, Ae = "#version 300 es\nprecision highp float;\nuniform sampler2D uState;\nuniform int uStateCols;\nuniform float uDomainHalf;\nuniform float uPointSize;\nuniform float uSpeedNorm; // the speed→[0,1] normalizer (modal-speed at ramp middle)\nuniform float uStretchAmp;\nout float vSpeedNorm;\nout float vFade;\nvoid main() {\n int id = gl_VertexID;\n int col = id % uStateCols;\n int row = id / uStateCols;\n vec2 uv = (vec2(float(col), float(row)) + 0.5) / float(uStateCols);\n vec4 st = texture(uState, uv);\n vec2 pos = st.xy;\n float speed = st.z;\n float life = st.w;\n float sn = clamp(speed / max(uSpeedNorm, 1e-4), 0.0, 1.0);\n vSpeedNorm = sn;\n vFade = clamp(life * 3.0, 0.0, 1.0);\n // NDC: domain [-half,half] → [-1,1].\n gl_Position = vec4(pos / uDomainHalf, 0.0, 1.0);\n // faster motes read as larger hot speed-cores (the cartoon \"more\" as point size).\n gl_PointSize = max(uPointSize * (1.0 + sn * (uStretchAmp + 1.0)), 1.0);\n}", je = `#version 300 es
1037
+ precision highp float;
1038
+ #define MAX_FLOW_STOPS 4
1039
+ in float vSpeedNorm;
1040
+ in float vFade;
1041
+ out vec4 fragColor;
1042
+ uniform int uStopCount;
1043
+ uniform vec3 uPalette[MAX_FLOW_STOPS];
1044
+ uniform float uSpeedGlow;
1045
+
1046
+ ${r}
1047
+ ${a}
1048
+
1049
+ vec3 samplePaletteLin(float t) {
1050
+ if (uStopCount <= 1) return uPalette[0];
1051
+ float n = float(uStopCount);
1052
+ float ft = clamp(t, 0.0, 1.0) * (n - 1.0);
1053
+ int i0 = int(floor(ft));
1054
+ int i1 = min(i0 + 1, uStopCount - 1);
1055
+ float f = ft - float(i0);
1056
+ vec3 lmsA = LINEAR_SRGB_TO_LMS * uPalette[i0];
1057
+ vec3 lmsB = LINEAR_SRGB_TO_LMS * uPalette[i1];
1058
+ vec3 labA = LMS_TO_OKLAB * (sign(lmsA) * pow(abs(lmsA), vec3(1.0 / 3.0)));
1059
+ vec3 labB = LMS_TO_OKLAB * (sign(lmsB) * pow(abs(lmsB), vec3(1.0 / 3.0)));
1060
+ return oklabToLinearSrgb(mix(labA, labB, f));
453
1061
  }
1062
+
1063
+ void main() {
1064
+ // soft round sprite — a tight hot core (mask² caps the white wash, H2).
1065
+ vec2 pc = gl_PointCoord * 2.0 - 1.0;
1066
+ float r = length(pc);
1067
+ float mask = 1.0 - smoothstep(0.55, 1.0, r);
1068
+ if (mask < 0.002) discard;
1069
+ float core = mask * mask;
1070
+ float bright = (0.35 + vSpeedNorm * uSpeedGlow) * vFade;
1071
+ vec3 lin = samplePaletteLin(vSpeedNorm) * bright;
1072
+ vec3 rgb = clamp(linearToSrgb(lin), vec3(0.0), vec3(1.0));
1073
+ float a = core * clamp(bright, 0.0, 1.0);
1074
+ fragColor = vec4(rgb * a, a); // additive premultiplied (the trail braids the ribbons)
1075
+ }`, Me = "#version 300 es\nprecision highp float;\nin vec2 vUv;\nout vec4 fragColor;\nuniform sampler2D uPrev;\nuniform float uDecay; // per-frame trail persistence (DERIVED from trailHalfLife)\nvoid main() {\n vec4 prev = texture(uPrev, vUv);\n fragColor = prev * uDecay; // fade toward black; the warm floor is the present-blit's\n}", Ne = `#version 300 es
1076
+ precision highp float;
1077
+ in vec2 vUv;
1078
+ out vec4 fragColor;
1079
+ uniform sampler2D uTrail;
1080
+ uniform vec3 uFloor; // the deep warm-near-black floor (linear-sRGB)
1081
+ uniform vec3 uBloomColor; // the warm rose/magenta corner-bloom (linear-sRGB)
1082
+ uniform float uHasGround; // 0 → transparent (compose over the page field); 1 → opaque floor
1083
+
1084
+ ${r}
1085
+
1086
+ void main() {
1087
+ vec3 trail = texture(uTrail, vUv).rgb;
1088
+ // soft tone-map the accumulated additive trail (Reinhard — hot cores, not white wash).
1089
+ vec3 mapped = trail / (trail + vec3(0.85));
1090
+ if (uHasGround < 0.5) {
1091
+ // compose OVER the page's warm field: emit the lit ribbons premultiplied, no floor.
1092
+ vec3 rgb = clamp(linearToSrgb(mapped), vec3(0.0), vec3(1.0));
1093
+ float a = clamp(max(mapped.r, max(mapped.g, mapped.b)), 0.0, 1.0);
1094
+ fragColor = vec4(rgb * a, a);
1095
+ return;
1096
+ }
1097
+ // the corner-bloom: a faint warm rose radial in one corner (NOT teal).
1098
+ float bloom = smoothstep(1.3, 0.0, distance(vUv, vec2(0.12, 0.88)));
1099
+ vec3 floorLin = uFloor + uBloomColor * bloom * 0.5;
1100
+ vec3 lin = floorLin + mapped; // the ribbons sit OVER the warm floor
1101
+ vec3 rgb = clamp(linearToSrgb(lin), vec3(0.0), vec3(1.0));
1102
+ fragColor = vec4(rgb, 1.0);
1103
+ }`;
454
1104
  //#endregion
455
- //#region src/components/custom/dot-flow-field/constants.ts
456
- var te = 16384, ne = 8, re = 4, z = [{
457
- L: .92,
458
- C: .03,
459
- h: 78
460
- }, {
461
- L: .84,
462
- C: .07,
463
- h: 62
464
- }], B = R(35, 3, 2.5), V = {
465
- waveComponents: B,
466
- windSpeed: .3,
467
- curlStrength: .12,
468
- gridPitch: 26,
469
- dotSize: 2,
470
- displaceAmp: .18,
471
- springK: 6,
472
- waveBandCenter: 0,
473
- waveBandWidth: .55,
474
- contrast: .6,
475
- coherence: .8,
476
- globeMask: !1,
477
- palette: z,
478
- background: "transparent",
479
- interactive: !1,
480
- respectReducedMotion: !0
481
- }, H = N, ie = 16384;
482
- function U(e, t) {
483
- let n = Math.min(Math.max(Math.ceil((t || 320) / Math.max(e, 4)) + 2, 4), 128);
484
- return {
485
- cols: n,
486
- count: Math.min(n * n, ie),
487
- pitchDomain: 2 * H / Math.max(n, 1)
488
- };
489
- }
490
- var ae = 176, W = {
491
- p0: 0,
492
- p1: 4,
493
- ints: 8,
494
- waves: 12
495
- };
496
- function G() {
497
- let e = new ArrayBuffer(ae);
498
- return {
499
- buffer: e,
500
- f32: new Float32Array(e),
501
- i32: new Int32Array(e)
502
- };
503
- }
504
- function oe(e, t, n, r, i) {
505
- let { f32: a, i32: o } = e;
506
- a[W.p0 + 0] = n, a[W.p0 + 1] = r, a[W.p0 + 2] = t.windSpeed, a[W.p0 + 3] = t.curlStrength, a[W.p1 + 0] = i.pitchDomain, a[W.p1 + 1] = t.displaceAmp, a[W.p1 + 2] = t.springK, a[W.p1 + 3] = i.cols;
507
- let s = Math.min(t.waveComponents.length, 8);
508
- return o[W.ints + 0] = s, o[W.ints + 1] = i.count, o[W.ints + 2] = i.cols, o[W.ints + 3] = 0, de(a, W.waves, t.waveComponents), e;
509
- }
510
- var se = 144, K = {
511
- r0: 0,
512
- r1: 4,
513
- r2: 8,
514
- ints: 12,
515
- bg: 16,
516
- palette: 20
517
- };
518
- function q() {
519
- let e = new ArrayBuffer(se);
520
- return {
521
- buffer: e,
522
- f32: new Float32Array(e),
523
- i32: new Int32Array(e)
524
- };
1105
+ //#region src/components/custom/dot-flow-field/composables/flowGLProgram.ts
1106
+ function Pe(e, t, n) {
1107
+ let r = e.createShader(t);
1108
+ if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
1109
+ let t = e.getShaderInfoLog(r);
1110
+ throw e.deleteShader(r), Error(`[DotFlowField] shader compile failed: ${t}`);
1111
+ }
1112
+ return r;
525
1113
  }
526
- var J = .22, ce = .4;
527
- function le(e, t) {
528
- let n = (t || 320) / (2 * H);
529
- return e / Math.max(n, 1e-4);
1114
+ function Q(e, t, n) {
1115
+ let r = Pe(e, e.VERTEX_SHADER, t), i = Pe(e, e.FRAGMENT_SHADER, n), a = e.createProgram();
1116
+ if (e.attachShader(a, r), e.attachShader(a, i), e.linkProgram(a), !e.getProgramParameter(a, e.LINK_STATUS)) throw Error(`[DotFlowField] link failed: ${e.getProgramInfoLog(a)}`);
1117
+ return e.deleteShader(r), e.deleteShader(i), a;
530
1118
  }
531
- function ue(e, t, n, r, i, a, o) {
532
- let { f32: s, i32: l } = e;
533
- s[K.r0 + 0] = n, s[K.r0 + 1] = t.contrast, s[K.r0 + 2] = J, s[K.r0 + 3] = H, s[K.r1 + 0] = le(t.dotSize, i), s[K.r1 + 1] = ce, s[K.r1 + 2] = r, s[K.r1 + 3] = a.pitchDomain, s[K.r2 + 0] = t.waveBandCenter, s[K.r2 + 1] = t.waveBandWidth, s[K.r2 + 2] = +!!t.globeMask, s[K.r2 + 3] = 0;
534
- let u = Math.min(o.length, 4);
535
- if (l[K.ints + 0] = u, l[K.ints + 1] = a.count, l[K.ints + 2] = 0, l[K.ints + 3] = 0, t.background === "transparent") s[K.bg + 0] = 0, s[K.bg + 1] = 0, s[K.bg + 2] = 0, s[K.bg + 3] = 0;
536
- else {
537
- let e = c(t.background);
538
- s[K.bg + 0] = e[0], s[K.bg + 1] = e[1], s[K.bg + 2] = e[2], s[K.bg + 3] = 1;
539
- }
540
- for (let e = 0; e < 4; e++) {
541
- let t = K.palette + e * 4, n = c(o[Math.min(e, u - 1)] ?? o[0]);
542
- s[t + 0] = n[0], s[t + 1] = n[1], s[t + 2] = n[2], s[t + 3] = 0;
543
- }
544
- return e;
1119
+ function Fe(e, t, n) {
1120
+ let r = e.createTexture(), i = e.createFramebuffer();
1121
+ e.bindTexture(e.TEXTURE_2D, r), e.texImage2D(e.TEXTURE_2D, 0, t, 2, 2, 0, e.RGBA, n, null), e.bindFramebuffer(e.FRAMEBUFFER, i), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, r, 0);
1122
+ let a = e.checkFramebufferStatus(e.FRAMEBUFFER) === e.FRAMEBUFFER_COMPLETE;
1123
+ return e.bindFramebuffer(e.FRAMEBUFFER, null), e.deleteFramebuffer(i), e.deleteTexture(r), a;
545
1124
  }
546
- function de(e, t, n) {
547
- for (let r = 0; r < 8; r++) {
548
- let i = t + r * 4, a = n[r];
549
- a ? (e[i + 0] = a.amplitude, e[i + 1] = a.wavelength, e[i + 2] = a.direction, e[i + 3] = a.phase) : (e[i + 0] = 0, e[i + 1] = 1, e[i + 2] = 0, e[i + 3] = 0);
550
- }
1125
+ function Ie(e) {
1126
+ let t = new Uint16Array(e.length);
1127
+ for (let n = 0; n < e.length; n++) t[n] = Le(e[n]);
1128
+ return t;
551
1129
  }
552
- function fe(e) {
553
- let { cols: t, count: n, pitchDomain: r } = e, i = new Float32Array(n * 4), a = (t - 1) * r / 2;
554
- for (let e = 0; e < n; e++) {
555
- let n = e % t, o = Math.floor(e / t), s = e * 4;
556
- i[s + 0] = n * r - a, i[s + 1] = o * r - a, i[s + 2] = 0, i[s + 3] = 0;
557
- }
558
- return i;
1130
+ function Le(e) {
1131
+ let t = new Float32Array(1), n = new Int32Array(t.buffer);
1132
+ t[0] = e;
1133
+ let r = n[0], i = r >> 16 & 32768, a = (r >> 23 & 255) - 127 + 15, o = r & 8388607;
1134
+ return a <= 0 ? i : a >= 31 ? i | 31744 : (o >>= 13, i | a << 10 | o);
559
1135
  }
560
1136
  //#endregion
561
- //#region src/components/custom/dot-flow-field/composables/useFlowParticles.ts
562
- var Y = 64, pe = 128, X = 8, Z = 1, me = 2, Q = 4, he = 64;
563
- function $(e) {
564
- return Math.min(e.clientWidth || 320, e.clientHeight || 320);
565
- }
566
- function ge(e) {
567
- let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a } = e;
568
- return function(e, s, c) {
569
- let l = U(n.gridPitch, $(t)), u = e.createShaderModule({
570
- label: "[DotFlowField] flow-field.compute.wgsl",
571
- code: v
572
- }), d = e.createShaderModule({
573
- label: "[DotFlowField] flow-field.render.wgsl",
574
- code: y
575
- }), f = fe(l), p = e.createBuffer({
576
- label: "[DotFlowField] lattice",
577
- size: l.count * 16,
578
- usage: pe | X,
579
- mappedAtCreation: !0
580
- });
581
- new Float32Array(p.getMappedRange()).set(f), p.unmap();
582
- let m = e.createBuffer({
583
- label: "[DotFlowField] compute-uniforms",
584
- size: G().buffer.byteLength,
585
- usage: Y | X
586
- }), h = e.createBuffer({
587
- label: "[DotFlowField] render-uniforms",
588
- size: q().buffer.byteLength,
589
- usage: Y | X
590
- }), g = e.createBindGroupLayout({
591
- label: "[DotFlowField] compute-bgl",
592
- entries: [{
593
- binding: 0,
594
- visibility: Q,
595
- buffer: { type: "uniform" }
596
- }, {
597
- binding: 1,
598
- visibility: Q,
599
- buffer: { type: "storage" }
600
- }]
601
- }), _ = e.createComputePipeline({
602
- label: "[DotFlowField] compute-pipeline",
603
- layout: e.createPipelineLayout({ bindGroupLayouts: [g] }),
604
- compute: {
605
- module: u,
606
- entryPoint: "cs_main"
607
- }
608
- }), b = e.createBindGroup({
609
- label: "[DotFlowField] compute-bg",
610
- layout: g,
611
- entries: [{
612
- binding: 0,
613
- resource: { buffer: m }
614
- }, {
615
- binding: 1,
616
- resource: { buffer: p }
617
- }]
618
- }), x = e.createBindGroupLayout({
619
- label: "[DotFlowField] render-bgl",
620
- entries: [{
621
- binding: 0,
622
- visibility: Z | me,
623
- buffer: { type: "uniform" }
624
- }, {
625
- binding: 1,
626
- visibility: Z,
627
- buffer: { type: "read-only-storage" }
628
- }]
629
- }), S = e.createRenderPipeline({
630
- label: "[DotFlowField] render-pipeline",
631
- layout: e.createPipelineLayout({ bindGroupLayouts: [x] }),
632
- vertex: {
633
- module: d,
634
- entryPoint: "vs_main"
635
- },
636
- fragment: {
637
- module: d,
638
- entryPoint: "fs_main",
639
- targets: [{
640
- format: c,
641
- blend: {
642
- color: {
643
- srcFactor: "one",
644
- dstFactor: "one-minus-src-alpha",
645
- operation: "add"
646
- },
647
- alpha: {
648
- srcFactor: "one",
649
- dstFactor: "one-minus-src-alpha",
650
- operation: "add"
651
- }
652
- }
653
- }]
654
- },
655
- primitive: { topology: "triangle-list" }
656
- }), C = e.createBindGroup({
657
- label: "[DotFlowField] render-bg",
658
- layout: x,
659
- entries: [{
660
- binding: 0,
661
- resource: { buffer: h }
662
- }, {
663
- binding: 1,
664
- resource: { buffer: p }
665
- }]
666
- }), w = G(), T = q(), E = -1;
667
- function D() {
668
- let e = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * e)), s = Math.max(1, Math.round(i * e));
669
- (t.width !== a || t.height !== s) && (t.width = a, t.height = s);
670
- let c = U(n.gridPitch, $(t));
671
- l = {
672
- ...c,
673
- count: Math.min(c.count, f.length / 4)
674
- };
1137
+ //#region src/components/custom/dot-flow-field/composables/flowSetupGLFlow.ts
1138
+ function Re(e) {
1139
+ let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a, getPointer: s } = e;
1140
+ return function(e) {
1141
+ let l = He(n), u = Ue(l);
1142
+ e.getExtension("EXT_color_buffer_float"), e.getExtension("EXT_color_buffer_half_float"), e.getExtension("OES_texture_float_linear");
1143
+ let d = Fe(e, e.RGBA32F, e.FLOAT) ? {
1144
+ internal: e.RGBA32F,
1145
+ type: e.FLOAT
1146
+ } : {
1147
+ internal: e.RGBA16F,
1148
+ type: e.HALF_FLOAT
1149
+ }, f = Fe(e, e.RGBA16F, e.HALF_FLOAT) ? {
1150
+ internal: e.RGBA16F,
1151
+ type: e.HALF_FLOAT
1152
+ } : {
1153
+ internal: e.RGBA8,
1154
+ type: e.UNSIGNED_BYTE
1155
+ }, p = Q(e, Z, ke), m = Q(e, Ae, je), h = Q(e, Z, Me), g = Q(e, Z, Ne), _ = e.createVertexArray();
1156
+ e.bindVertexArray(_);
1157
+ let v = e.createBuffer();
1158
+ e.bindBuffer(e.ARRAY_BUFFER, v), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
1159
+ -1,
1160
+ -1,
1161
+ 3,
1162
+ -1,
1163
+ -1,
1164
+ 3
1165
+ ]), e.STATIC_DRAW);
1166
+ for (let t of [
1167
+ p,
1168
+ h,
1169
+ g
1170
+ ]) {
1171
+ let n = e.getAttribLocation(t, "aPosition");
1172
+ n >= 0 && (e.enableVertexAttribArray(n), e.vertexAttribPointer(n, 2, e.FLOAT, !1, 0, 0));
675
1173
  }
676
- function O(i) {
677
- a?.(i);
678
- let o = E < 0 ? 0 : Math.min(Math.max(i - E, 0), .05);
679
- E = i;
680
- let c = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1);
681
- oe(w, n, i, o, l), e.queue.writeBuffer(m, 0, w.buffer), ue(T, n, i, c, $(t), l, r()), e.queue.writeBuffer(h, 0, T.buffer);
682
- let u = Math.ceil(l.count / he), d = e.createCommandEncoder({ label: "[DotFlowField] frame" }), f = d.beginComputePass();
683
- f.setPipeline(_), f.setBindGroup(0, b), f.dispatchWorkgroups(u), f.end();
684
- let p = s.getCurrentTexture().createView(), g = d.beginRenderPass({ colorAttachments: [{
685
- view: p,
686
- clearValue: {
687
- r: 0,
688
- g: 0,
689
- b: 0,
690
- a: 0
691
- },
692
- loadOp: "clear",
693
- storeOp: "store"
694
- }] });
695
- g.setPipeline(S), g.setBindGroup(0, C), g.draw(6, l.count, 0, 0), g.end(), e.queue.submit([d.finish()]);
1174
+ e.bindVertexArray(null);
1175
+ let y = e.createVertexArray(), b = he(l, n.lifetimeSec), x = new Float32Array(u * u * 4);
1176
+ x.set(b.subarray(0, Math.min(b.length, x.length)));
1177
+ function S(t) {
1178
+ let n = e.createTexture();
1179
+ e.bindTexture(e.TEXTURE_2D, n), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE);
1180
+ let r = t && d.type === e.FLOAT ? t : t ? Ie(t) : null;
1181
+ return e.texImage2D(e.TEXTURE_2D, 0, d.internal, u, u, 0, e.RGBA, d.type, r), n;
1182
+ }
1183
+ let C = [S(x), S(null)], w = [e.createFramebuffer(), e.createFramebuffer()];
1184
+ for (let t = 0; t < 2; t++) e.bindFramebuffer(e.FRAMEBUFFER, w[t]), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, C[t], 0);
1185
+ e.bindFramebuffer(e.FRAMEBUFFER, null);
1186
+ let T = null, E = null, D = 2, O = 2;
1187
+ function k() {
1188
+ let r = Math.min(Math.max(n.trailScale, .25), 1);
1189
+ D = Math.max(2, Math.round(t.width * r)), O = Math.max(2, Math.round(t.height * r)), T?.forEach((t) => e.deleteTexture(t)), E?.forEach((t) => e.deleteFramebuffer(t));
1190
+ let i = () => {
1191
+ let t = e.createTexture();
1192
+ return e.bindTexture(e.TEXTURE_2D, t), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texImage2D(e.TEXTURE_2D, 0, f.internal, D, O, 0, e.RGBA, f.type, null), t;
1193
+ }, a = i(), o = i();
1194
+ T = [a, o];
1195
+ let s = e.createFramebuffer(), c = e.createFramebuffer();
1196
+ e.bindFramebuffer(e.FRAMEBUFFER, s), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, a, 0), e.bindFramebuffer(e.FRAMEBUFFER, c), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, o, 0), e.bindFramebuffer(e.FRAMEBUFFER, null);
1197
+ for (let t of [s, c]) e.bindFramebuffer(e.FRAMEBUFFER, t), e.viewport(0, 0, D, O), e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT);
1198
+ e.bindFramebuffer(e.FRAMEBUFFER, null), E = [s, c];
1199
+ }
1200
+ let A = (t) => e.getUniformLocation(p, t), j = {
1201
+ uState: A("uState"),
1202
+ uDt: A("uDt"),
1203
+ uDomainHalf: A("uDomainHalf"),
1204
+ uTurnRate: A("uTurnRate"),
1205
+ uSpeedScale: A("uSpeedScale"),
1206
+ uLifetimeSec: A("uLifetimeSec"),
1207
+ uEdgeBias: A("uEdgeBias"),
1208
+ uCursor: A("uCursor"),
1209
+ uPointerVel: A("uPointerVel"),
1210
+ uBurst: A("uBurst"),
1211
+ uPointerActive: A("uPointerActive"),
1212
+ uVortexRadius: A("uVortexRadius"),
1213
+ uVortexSpin: A("uVortexSpin"),
1214
+ uDragGain: A("uDragGain"),
1215
+ uBurstShove: A("uBurstShove"),
1216
+ uTime: A("uTime"),
1217
+ uWindSpeed: A("uWindSpeed"),
1218
+ uCurlStrength: A("uCurlStrength"),
1219
+ uWaveCount: A("uWaveCount"),
1220
+ uWaves: A("uWaves[0]")
1221
+ }, M = (t) => e.getUniformLocation(m, t), N = {
1222
+ uState: M("uState"),
1223
+ uStateCols: M("uStateCols"),
1224
+ uDomainHalf: M("uDomainHalf"),
1225
+ uPointSize: M("uPointSize"),
1226
+ uSpeedNorm: M("uSpeedNorm"),
1227
+ uStretchAmp: M("uStretchAmp"),
1228
+ uStopCount: M("uStopCount"),
1229
+ uPalette: M("uPalette[0]"),
1230
+ uSpeedGlow: M("uSpeedGlow")
1231
+ }, P = (t) => e.getUniformLocation(h, t), F = {
1232
+ uPrev: P("uPrev"),
1233
+ uDecay: P("uDecay")
1234
+ }, I = (t) => e.getUniformLocation(g, t), L = {
1235
+ uTrail: I("uTrail"),
1236
+ uFloor: I("uFloor"),
1237
+ uBloom: I("uBloomColor"),
1238
+ uHasGround: I("uHasGround")
1239
+ }, R = 0, z = -1;
1240
+ function B() {
1241
+ let e = o(), n = t.clientWidth || 320, r = t.clientHeight || 320, i = Math.max(1, Math.round(n * e)), a = Math.max(1, Math.round(r * e));
1242
+ (t.width !== i || t.height !== a) && (t.width = i, t.height = a), k();
1243
+ }
1244
+ function V(i) {
1245
+ a?.(i), (!E || !T) && k();
1246
+ let d = z < 0 ? 0 : Math.min(Math.max(i - z, 0), .05);
1247
+ z = i;
1248
+ let f = s?.(), v = R, b = 1 - R;
1249
+ e.disable(e.BLEND), e.bindFramebuffer(e.FRAMEBUFFER, w[v]), e.viewport(0, 0, u, u), e.useProgram(p), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, C[b]), e.uniform1i(j.uState, 0), e.uniform1f(j.uDt, d), e.uniform1f(j.uDomainHalf, W), e.uniform1f(j.uTurnRate, n.turnRate), e.uniform1f(j.uSpeedScale, n.speedScale), e.uniform1f(j.uLifetimeSec, n.lifetimeSec), e.uniform1f(j.uEdgeBias, n.edgeBias), e.uniform1f(j.uTime, i), e.uniform1f(j.uWindSpeed, n.windSpeed), e.uniform1f(j.uCurlStrength, n.curlStrength), e.uniform1f(j.uVortexRadius, n.vortexRadius), e.uniform1f(j.uVortexSpin, n.vortexSpin), e.uniform1f(j.uDragGain, n.dragGain), e.uniform1f(j.uBurstShove, n.burstShove), f ? (e.uniform2f(j.uCursor, f.cursorX, f.cursorY), e.uniform2f(j.uPointerVel, f.velX, f.velY), e.uniform1f(j.uBurst, f.burst), e.uniform1f(j.uPointerActive, f.active)) : e.uniform1f(j.uPointerActive, 0);
1250
+ let x = Math.min(n.waveComponents.length, 8);
1251
+ e.uniform1i(j.uWaveCount, x);
1252
+ let S = new Float32Array(32);
1253
+ for (let e = 0; e < 8; e++) {
1254
+ let t = n.waveComponents[e];
1255
+ S[e * 4 + 0] = t?.amplitude ?? 0, S[e * 4 + 1] = t?.wavelength ?? 1, S[e * 4 + 2] = t?.direction ?? 0, S[e * 4 + 3] = t?.phase ?? 0;
1256
+ }
1257
+ e.uniform4fv(j.uWaves, S), e.drawArrays(e.TRIANGLES, 0, 3), e.bindFramebuffer(e.FRAMEBUFFER, E[v]), e.viewport(0, 0, D, O), e.disable(e.BLEND), e.useProgram(h), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, T[b]), e.uniform1i(F.uPrev, 0), e.uniform1f(F.uDecay, ee(n.trailHalfLife)), e.drawArrays(e.TRIANGLES, 0, 3), e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE), e.useProgram(m), e.bindVertexArray(y), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, C[v]), e.uniform1i(N.uState, 0), e.uniform1i(N.uStateCols, u), e.uniform1f(N.uDomainHalf, W);
1258
+ let A = o();
1259
+ e.uniform1f(N.uPointSize, Math.max(n.dotSize * A * 1.5, 1)), e.uniform1f(N.uSpeedNorm, se), e.uniform1f(N.uStretchAmp, n.stretchAmp), e.uniform1f(N.uSpeedGlow, n.speedGlow);
1260
+ let M = r(), P = Math.min(M.length, 4);
1261
+ e.uniform1i(N.uStopCount, P);
1262
+ let I = new Float32Array(12);
1263
+ for (let e = 0; e < 4; e++) {
1264
+ let t = c(M[Math.min(e, P - 1)] ?? M[0]);
1265
+ I[e * 3 + 0] = t[0], I[e * 3 + 1] = t[1], I[e * 3 + 2] = t[2];
1266
+ }
1267
+ e.uniform3fv(N.uPalette, I), e.drawArrays(e.POINTS, 0, l), e.bindFramebuffer(e.FRAMEBUFFER, null), e.viewport(0, 0, t.width, t.height), e.disable(e.BLEND), e.useProgram(g), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, T[v]), e.uniform1i(L.uTrail, 0);
1268
+ let B = n.background === "transparent" ? 0 : 1, V = c(n.background === "transparent" ? Be : n.background), H = c(Ve);
1269
+ e.uniform3f(L.uFloor, V[0], V[1], V[2]), e.uniform3f(L.uBloom, H[0], H[1], H[2]), e.uniform1f(L.uHasGround, B), e.drawArrays(e.TRIANGLES, 0, 3), e.bindVertexArray(null), R = b;
696
1270
  }
697
1271
  return {
698
- frame: O,
1272
+ frame: V,
699
1273
  shouldContinue: i,
700
- resize: D,
1274
+ resize: B,
701
1275
  teardown: () => {
702
- p.destroy(), m.destroy(), h.destroy();
1276
+ e.deleteProgram(p), e.deleteProgram(m), e.deleteProgram(h), e.deleteProgram(g), e.deleteVertexArray(_), e.deleteVertexArray(y), e.deleteBuffer(v), C.forEach((t) => e.deleteTexture(t)), w.forEach((t) => e.deleteFramebuffer(t)), T?.forEach((t) => e.deleteTexture(t)), E?.forEach((t) => e.deleteFramebuffer(t));
703
1277
  }
704
1278
  };
705
1279
  };
706
1280
  }
707
- function _e(e, t, n) {
708
- let r = e.createShader(t);
709
- if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
710
- let t = e.getShaderInfoLog(r);
711
- throw e.deleteShader(r), Error(`[DotFlowField] shader compile failed: ${t}`);
712
- }
713
- return r;
714
- }
715
- function ve(e) {
1281
+ //#endregion
1282
+ //#region src/components/custom/dot-flow-field/composables/flowSetupGL.ts
1283
+ function ze(e) {
1284
+ if (e.config.mode === "flow") return Re(e);
716
1285
  let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a } = e;
717
1286
  return function(e) {
718
- let s = _e(e, e.VERTEX_SHADER, b), l = _e(e, e.FRAGMENT_SHADER, x), u = e.createProgram();
719
- if (e.attachShader(u, s), e.attachShader(u, l), e.linkProgram(u), !e.getProgramParameter(u, e.LINK_STATUS)) throw Error(`[DotFlowField] link failed: ${e.getProgramInfoLog(u)}`);
720
- e.deleteShader(s), e.deleteShader(l);
721
- let d = e.createVertexArray();
722
- e.bindVertexArray(d);
723
- let f = e.createBuffer();
724
- e.bindBuffer(e.ARRAY_BUFFER, f), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
1287
+ let s = Q(e, Ee, De), l = e.createVertexArray();
1288
+ e.bindVertexArray(l);
1289
+ let u = e.createBuffer();
1290
+ e.bindBuffer(e.ARRAY_BUFFER, u), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
725
1291
  -1,
726
1292
  -1,
727
1293
  3,
@@ -729,134 +1295,159 @@ function ve(e) {
729
1295
  -1,
730
1296
  3
731
1297
  ]), e.STATIC_DRAW);
732
- let p = e.getAttribLocation(u, "aPosition");
733
- e.enableVertexAttribArray(p), e.vertexAttribPointer(p, 2, e.FLOAT, !1, 0, 0), e.bindVertexArray(null);
734
- let m = (t) => e.getUniformLocation(u, t), h = m("uTime"), g = m("uWindSpeed"), _ = m("uCurlStrength"), v = m("uDomainHalf"), y = m("uAspect"), S = m("uGridPitchDomain"), C = m("uDotRadiusDomain"), w = m("uDisplaceAmp"), T = m("uContrast"), E = m("uBaseBright"), D = m("uWaveBandCenter"), O = m("uWaveBandWidth"), k = m("uGlobeMask"), A = m("uWaveCount"), j = m("uStopCount"), M = m("uHasBackground"), N = m("uBg"), P = m("uWaves[0]"), F = m("uPalette[0]");
735
- function I() {
1298
+ let d = e.getAttribLocation(s, "aPosition");
1299
+ e.enableVertexAttribArray(d), e.vertexAttribPointer(d, 2, e.FLOAT, !1, 0, 0), e.bindVertexArray(null);
1300
+ let f = (t) => e.getUniformLocation(s, t), p = f("uTime"), m = f("uWindSpeed"), h = f("uCurlStrength"), g = f("uDomainHalf"), _ = f("uAspect"), v = f("uGridPitchDomain"), y = f("uDotRadiusDomain"), b = f("uDisplaceAmp"), x = f("uContrast"), S = f("uBaseBright"), C = f("uWaveBandCenter"), w = f("uWaveBandWidth"), T = f("uGlobeMask"), E = f("uWaveCount"), D = f("uStopCount"), O = f("uHasBackground"), k = f("uBg"), A = f("uWaves[0]"), j = f("uPalette[0]");
1301
+ function M() {
736
1302
  let n = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * n)), s = Math.max(1, Math.round(i * n));
737
1303
  (t.width !== a || t.height !== s) && (t.width = a, t.height = s), e.viewport(0, 0, t.width, t.height);
738
1304
  }
739
- function L(i) {
1305
+ function N(i) {
740
1306
  a?.(i);
741
- let o = $(t), s = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1), l = U(n.gridPitch, o), f = o / (2 * H), p = n.dotSize / Math.max(f, 1e-4);
742
- e.useProgram(u), e.bindVertexArray(d), e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE_MINUS_SRC_ALPHA), e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT), e.uniform1f(h, i), e.uniform1f(g, n.windSpeed), e.uniform1f(_, n.curlStrength), e.uniform1f(v, H), e.uniform1f(y, s), e.uniform1f(S, l.pitchDomain), e.uniform1f(C, p), e.uniform1f(w, n.displaceAmp), e.uniform1f(T, n.contrast), e.uniform1f(E, J), e.uniform1f(D, n.waveBandCenter), e.uniform1f(O, n.waveBandWidth), e.uniform1f(k, +!!n.globeMask);
743
- let m = Math.min(n.waveComponents.length, 8), b = r(), x = Math.min(b.length, 4);
744
- if (e.uniform1i(A, m), e.uniform1i(j, x), n.background === "transparent") e.uniform1f(M, 0), e.uniform3f(N, 0, 0, 0);
1307
+ let o = $(t), u = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1), d = G(n.gridPitch, o), f = o / (2 * W), M = n.dotSize / Math.max(f, 1e-4);
1308
+ e.useProgram(s), e.bindVertexArray(l), e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE_MINUS_SRC_ALPHA), e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT), e.uniform1f(p, i), e.uniform1f(m, n.windSpeed), e.uniform1f(h, n.curlStrength), e.uniform1f(g, W), e.uniform1f(_, u), e.uniform1f(v, d.pitchDomain), e.uniform1f(y, M), e.uniform1f(b, n.displaceAmp), e.uniform1f(x, n.contrast), e.uniform1f(S, le), e.uniform1f(C, n.waveBandCenter), e.uniform1f(w, n.waveBandWidth), e.uniform1f(T, +!!n.globeMask);
1309
+ let N = Math.min(n.waveComponents.length, 8), P = r(), F = Math.min(P.length, 4);
1310
+ if (e.uniform1i(E, N), e.uniform1i(D, F), n.background === "transparent") e.uniform1f(O, 0), e.uniform3f(k, 0, 0, 0);
745
1311
  else {
746
- e.uniform1f(M, 1);
1312
+ e.uniform1f(O, 1);
747
1313
  let t = c(n.background);
748
- e.uniform3f(N, t[0], t[1], t[2]);
1314
+ e.uniform3f(k, t[0], t[1], t[2]);
749
1315
  }
750
1316
  let I = new Float32Array(32);
751
1317
  for (let e = 0; e < 8; e++) {
752
1318
  let t = n.waveComponents[e];
753
1319
  I[e * 4 + 0] = t?.amplitude ?? 0, I[e * 4 + 1] = t?.wavelength ?? 1, I[e * 4 + 2] = t?.direction ?? 0, I[e * 4 + 3] = t?.phase ?? 0;
754
1320
  }
755
- e.uniform4fv(P, I);
1321
+ e.uniform4fv(A, I);
756
1322
  let L = new Float32Array(12);
757
1323
  for (let e = 0; e < 4; e++) {
758
- let t = c(b[Math.min(e, x - 1)] ?? b[0]);
1324
+ let t = c(P[Math.min(e, F - 1)] ?? P[0]);
759
1325
  L[e * 3 + 0] = t[0], L[e * 3 + 1] = t[1], L[e * 3 + 2] = t[2];
760
1326
  }
761
- e.uniform3fv(F, L), e.drawArrays(e.TRIANGLES, 0, 3), e.bindVertexArray(null);
1327
+ e.uniform3fv(j, L), e.drawArrays(e.TRIANGLES, 0, 3), e.bindVertexArray(null);
762
1328
  }
763
1329
  return {
764
- frame: L,
1330
+ frame: N,
765
1331
  shouldContinue: i,
766
- resize: I,
1332
+ resize: M,
767
1333
  teardown: () => {
768
- e.deleteProgram(u), e.deleteVertexArray(d), e.deleteBuffer(f);
1334
+ e.deleteProgram(s), e.deleteVertexArray(l), e.deleteBuffer(u);
769
1335
  }
770
1336
  };
771
1337
  };
772
1338
  }
773
1339
  //#endregion
1340
+ //#region src/components/custom/dot-flow-field/composables/useFlowParticles.ts
1341
+ var Be = {
1342
+ L: .11,
1343
+ C: .012,
1344
+ h: 50
1345
+ }, Ve = {
1346
+ L: .5,
1347
+ C: .16,
1348
+ h: 330
1349
+ };
1350
+ function $(e) {
1351
+ return Math.min(e.clientWidth || 320, e.clientHeight || 320);
1352
+ }
1353
+ function He(e) {
1354
+ return Math.min(Math.max(Math.floor(e.particleCount), 1), te);
1355
+ }
1356
+ function Ue(e) {
1357
+ return Math.max(1, Math.ceil(Math.sqrt(e)));
1358
+ }
1359
+ //#endregion
774
1360
  //#region src/components/custom/dot-flow-field/composables/useDotFlowField.ts
775
- function ye(e, n) {
1361
+ function We(e, n) {
776
1362
  let { config: r, getPalette: i } = n, a = n.mode ?? "live", o = t({ respectReducedMotion: r.respectReducedMotion }), c = {
777
1363
  displaceBoost: 1,
778
1364
  bloom: 0
779
- }, l = { ...r }, u = () => (Object.assign(l, r), l.displaceAmp = r.displaceAmp * c.displaceBoost, l.contrast = r.contrast * (1 + c.bloom * .8), l), d = null, f = 0;
780
- function p(e) {
781
- let t = f > 0 ? (e - f) * 1e3 : 16.7;
782
- if (f = e, o.tick(t), !r.interactive || !o.active.value) {
1365
+ }, l = { ...re }, u = () => {
1366
+ if (!r.interactive || !o.active.value) return l.active = 0, l;
1367
+ let e = o.position.value, t = o.velocity.value, n = 2 * W;
1368
+ return l.cursorX = (e.x * 2 - 1) * W, l.cursorY = (1 - e.y * 2) * W, l.velX = t.x * n, l.velY = -t.y * n, l.burst = o.burst.value, l.active = 1, l;
1369
+ }, d = { ...r }, f = () => (Object.assign(d, r), d.displaceAmp = r.displaceAmp * c.displaceBoost, d.contrast = r.contrast * (1 + c.bloom * .8), d), p = null, h = 0;
1370
+ function g(e) {
1371
+ let t = h > 0 ? (e - h) * 1e3 : 16.7;
1372
+ if (h = e, o.tick(t), !r.interactive || !o.active.value) {
783
1373
  c.displaceBoost += (1 - c.displaceBoost) * .1, c.bloom *= .9;
784
1374
  return;
785
1375
  }
786
1376
  let n = o.speed.value, i = 1 + Math.min(2.5, n * 3);
787
1377
  c.displaceBoost += (i - c.displaceBoost) * .2, c.bloom = Math.max(c.bloom * .9, o.burst.value);
788
1378
  }
789
- let h = () => {
790
- o.onPointerEnter(), r.interactive && d?.wake();
791
- }, g = (e) => {
792
- o.onPointerMove(e), r.interactive && d?.wake();
793
- }, _ = (e) => e.parentElement ?? e;
794
- function v(e) {
795
- let t = _(e);
796
- t.addEventListener("pointermove", g), t.addEventListener("pointerenter", h), t.addEventListener("pointerleave", o.onPointerLeave);
1379
+ let _ = () => {
1380
+ o.onPointerEnter(), r.interactive && p?.wake();
1381
+ }, v = (e) => {
1382
+ o.onPointerMove(e), r.interactive && p?.wake();
1383
+ }, y = (e) => e.parentElement ?? e;
1384
+ function b(e) {
1385
+ let t = y(e);
1386
+ t.addEventListener("pointermove", v), t.addEventListener("pointerenter", _), t.addEventListener("pointerleave", o.onPointerLeave);
797
1387
  }
798
- function y(e) {
799
- let t = _(e);
800
- t.removeEventListener("pointermove", g), t.removeEventListener("pointerenter", h), t.removeEventListener("pointerleave", o.onPointerLeave);
1388
+ function x(e) {
1389
+ let t = y(e);
1390
+ t.removeEventListener("pointermove", v), t.removeEventListener("pointerenter", _), t.removeEventListener("pointerleave", o.onPointerLeave);
801
1391
  }
802
- let b = () => {
1392
+ let S = () => {
803
1393
  let t = e.value;
804
1394
  if (!t) return null;
805
- if (!d) {
806
- v(t);
1395
+ if (!p) {
1396
+ b(t);
807
1397
  let e = {
808
1398
  canvas: t,
809
- config: u(),
1399
+ config: f(),
810
1400
  getPalette: i,
1401
+ getPointer: u,
811
1402
  shouldContinue: () => !0,
812
- onFrame: p
1403
+ onFrame: g
813
1404
  };
814
- d = s(t, {
1405
+ p = s(t, {
815
1406
  mode: a,
816
1407
  respectReducedMotion: r.respectReducedMotion,
817
- setupWGPU: ge({
1408
+ setupWGPU: Te({
818
1409
  ...e,
819
- config: l,
1410
+ config: d,
820
1411
  onFrame: (e) => {
821
- p(e), u();
1412
+ g(e), f();
822
1413
  }
823
1414
  }),
824
- setupGL: ve({
1415
+ setupGL: ze({
825
1416
  ...e,
826
- config: l,
1417
+ config: d,
827
1418
  onFrame: (e) => {
828
- p(e), u();
1419
+ g(e), f();
829
1420
  }
830
1421
  })
831
- }), d.armAsync();
1422
+ }), p.armAsync();
832
1423
  }
833
- return d;
1424
+ return p;
834
1425
  };
835
- queueMicrotask(() => b());
836
- let x = {
1426
+ queueMicrotask(() => S());
1427
+ let C = {
837
1428
  get backend() {
838
- return b()?.backend ?? "webgpu";
1429
+ return S()?.backend ?? "webgpu";
839
1430
  },
840
- pause: () => b()?.suspend("manual"),
841
- resume: () => b()?.resume("manual"),
842
- wake: () => b()?.wake(),
843
- renderAt: (e) => b()?.renderAt(e),
1431
+ pause: () => S()?.suspend("manual"),
1432
+ resume: () => S()?.resume("manual"),
1433
+ wake: () => S()?.wake(),
1434
+ renderAt: (e) => S()?.renderAt(e),
844
1435
  get reducedMotion() {
845
- return d?.reducedMotion ?? !1;
1436
+ return p?.reducedMotion ?? !1;
846
1437
  },
847
1438
  dispose: () => {
848
1439
  let t = e.value;
849
- t && y(t), o.dispose(), d?.dispose();
1440
+ t && x(t), o.dispose(), p?.dispose();
850
1441
  }
851
1442
  };
852
- return m(() => x.dispose()), x;
1443
+ return m(() => C.dispose()), C;
853
1444
  }
854
1445
  //#endregion
855
1446
  //#region src/components/custom/dot-flow-field/DotFlowField.vue
856
- var be = /* @__PURE__ */ e(/* @__PURE__ */ f({
1447
+ var Ge = /* @__PURE__ */ e(/* @__PURE__ */ f({
857
1448
  __name: "DotFlowField",
858
1449
  props: {
859
- config: { default: () => V },
1450
+ config: { default: () => U },
860
1451
  paused: {
861
1452
  type: Boolean,
862
1453
  default: !1
@@ -864,7 +1455,7 @@ var be = /* @__PURE__ */ e(/* @__PURE__ */ f({
864
1455
  },
865
1456
  emits: ["update:paused"],
866
1457
  setup(e, { expose: t }) {
867
- let n = g("canvasRef"), r = ye(n, {
1458
+ let n = g("canvasRef"), r = We(n, {
868
1459
  config: e.config,
869
1460
  getPalette: () => e.config.palette
870
1461
  });
@@ -891,4 +1482,4 @@ var be = /* @__PURE__ */ e(/* @__PURE__ */ f({
891
1482
  }
892
1483
  }), [["__scopeId", "data-v-01c7721a"]]);
893
1484
  //#endregion
894
- export { V as DEFAULT_FLOW_CONFIG, B as DEFAULT_WAVE_COMPONENTS, be as DotFlowField, N as FLOW_DOMAIN_HALF, S as FLOW_GRAVITY, re as MAX_FLOW_STOPS, te as MAX_PARTICLES, ne as MAX_WAVE_COMPONENTS, z as WARM_IDENTITY_PALETTE, R as buildWaveLadder, j as curlFBM, T as gerstnerVelocity, P as gridOrigin, I as sampleDisplacement, F as sampleHeight, M as sampleVelocity, ye as useDotFlowField, L as waveBand };
1485
+ export { U as DEFAULT_FLOW_CONFIG, H as DEFAULT_WAVE_COMPONENTS, Ge as DotFlowField, A as FLOW_DOMAIN_HALF, v as FLOW_GRAVITY, z as MAX_FLOW_STOPS, L as MAX_PARTICLES, R as MAX_WAVE_COMPONENTS, V as WARM_IDENTITY_PALETTE, I as buildWaveLadder, D as curlFBM, x as gerstnerVelocity, j as gridOrigin, k as pointerVortex, N as sampleDisplacement, M as sampleHeight, O as sampleVelocity, We as useDotFlowField, P as waveBand };