@mkbabb/glass-ui 3.1.1 → 3.3.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 (337) hide show
  1. package/dist/{CardFooter-CSGcJkqa.js → CardFooter-C390imy7.js} +3 -3
  2. package/dist/{CollapsibleContent-CVMOcYlV.js → CollapsibleContent-cauTbZEM.js} +1 -1
  3. package/dist/{CommandShortcut-DWT19a2Y.js → CommandShortcut-BiVyqipe.js} +7 -6
  4. package/dist/{ContextMenuSubContent-gAFxJ-qi.js → ContextMenuSubContent-DrWkXKQP.js} +4 -4
  5. package/dist/DataTable-FfkaAg2z.js +465 -0
  6. package/dist/DialogContent-IQ8_BRrC.js +100 -0
  7. package/dist/{DialogFooter-ClrNEOVU.js → DialogFooter-Er0wA3K6.js} +2 -2
  8. package/dist/{DiscoGlyph-C3JfMnRV.js → DiscoGlyph-BaZ8OawK.js} +1 -1
  9. package/dist/{GlyphFace-BRS8vUb7.js → GlyphFace-B_7vOmYn.js} +1 -1
  10. package/dist/HoverPopover-DTSYkJtw.js +96 -0
  11. package/dist/{IconTooltip-BkaA7tZ2.js → IconTooltip-BTyYn4mr.js} +1 -1
  12. package/dist/Input-CU9CNKmo.js +52 -0
  13. package/dist/{MetricBadge-DmAihkXd.js → MetricBadge-BlrdbOGN.js} +2 -2
  14. package/dist/{Notification-OqIpADml.js → Notification-DP_ApJLo.js} +3 -3
  15. package/dist/{NumberFieldContent-DTH9gb_N.js → NumberFieldContent-iOTQ5rGO.js} +9 -5
  16. package/dist/{PopoverContent-EiklFrna.js → PopoverContent-B8WtJECb.js} +1 -1
  17. package/dist/Progress-DjM86vfb.js +254 -0
  18. package/dist/{ScrollingText-BFd0i2zJ.js → ScrollingText-P9o_DuMn.js} +2 -2
  19. package/dist/{SelectScrollDownButton-Dth8-wXQ.js → SelectScrollDownButton-BGn3rjs9.js} +12 -11
  20. package/dist/TabsIndicator-DA0x9gPr.js +97 -0
  21. package/dist/{Toaster-Bjlunvq4.js → Toaster-DdhMKfus.js} +1 -1
  22. package/dist/{ToggleGroupItem-OesUouE7.js → ToggleGroupItem-gyXj998A.js} +37 -40
  23. package/dist/UnderlineTabs-Cq_AD03t.js +39 -0
  24. package/dist/animated-digit.js +3 -3
  25. package/dist/api/index.d.ts +2 -0
  26. package/dist/api.js +1 -1
  27. package/dist/aurora.js +471 -320
  28. package/dist/badge.js +1 -1
  29. package/dist/{button-C0aHmBbt.js → button-Ckn3eDfB.js} +27 -22
  30. package/dist/button.js +1 -1
  31. package/dist/card.js +1 -1
  32. package/dist/carousel.js +6 -6
  33. package/dist/{check-dwgetki8.js → check-CdkxGxXJ.js} +1 -1
  34. package/dist/{chevron-down-DILQA1t6.js → chevron-down-pBY8sYfV.js} +1 -1
  35. package/dist/{chevron-right-fS7fal2t.js → chevron-right-BjeKC22V.js} +1 -1
  36. package/dist/{chevron-up-BtYjYQOS.js → chevron-up-DBeNHUm1.js} +1 -1
  37. package/dist/collapsible.js +1 -1
  38. package/dist/color-rkK4RMx2.js +33 -0
  39. package/dist/color.d.ts +1 -0
  40. package/dist/color.js +2 -0
  41. package/dist/command.js +1 -1
  42. package/dist/compile-DVgAxagk.js +106 -0
  43. package/dist/components/custom/animated-digit/AnimatedDigit.vue.d.ts +7 -7
  44. package/dist/components/custom/aurora/Aurora.vue.d.ts +3 -3
  45. package/dist/components/custom/aurora/composables/color.d.ts +42 -16
  46. package/dist/components/custom/aurora/composables/cursorModel.d.ts +45 -0
  47. package/dist/components/custom/aurora/composables/frameLoop.d.ts +30 -0
  48. package/dist/components/custom/aurora/composables/glSetup.d.ts +29 -0
  49. package/dist/components/custom/aurora/composables/runtime.d.ts +45 -35
  50. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +67 -0
  51. package/dist/components/custom/aurora/composables/useAurora.d.ts +14 -1
  52. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +1 -1
  53. package/dist/components/custom/aurora/constants/budget.d.ts +50 -0
  54. package/dist/components/custom/aurora/{presets.d.ts → constants/presets.d.ts} +3 -6
  55. package/dist/components/custom/aurora/constants/shaders/aurora.frag.d.ts +1 -0
  56. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -0
  57. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -0
  58. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -0
  59. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -0
  60. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -0
  61. package/dist/components/custom/aurora/index.d.ts +4 -3
  62. package/dist/components/custom/configurator/Configurator.vue.d.ts +26 -0
  63. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +14 -7
  64. package/dist/components/custom/configurator/density.d.ts +3 -8
  65. package/dist/components/custom/configurator/index.d.ts +1 -1
  66. package/dist/components/custom/dock/DockBackgroundToggle.vue.d.ts +46 -0
  67. package/dist/components/custom/dock/DockIconButton.vue.d.ts +15 -4
  68. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +2 -2
  69. package/dist/components/custom/dock/GlassDock.vue.d.ts +34 -13
  70. package/dist/components/custom/dock/composables/dockContext.d.ts +4 -4
  71. package/dist/components/custom/dock/composables/dockLayerContext.d.ts +13 -6
  72. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +32 -8
  73. package/dist/components/custom/dock/index.d.ts +1 -0
  74. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +10 -0
  75. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +1 -1
  76. package/dist/components/custom/glyph-face/keys.d.ts +3 -29
  77. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +48 -0
  78. package/dist/components/custom/goo-blob/composables/easing.d.ts +6 -0
  79. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +14 -0
  80. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +18 -0
  81. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +13 -0
  82. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +42 -0
  83. package/dist/components/custom/goo-blob/index.d.ts +7 -0
  84. package/dist/components/custom/goo-blob/shaders/metaball.frag.d.ts +1 -0
  85. package/dist/components/custom/goo-blob/shaders/metaball.vert.d.ts +1 -0
  86. package/dist/components/custom/goo-blob/shaders/oklch-perturb.glsl.d.ts +1 -0
  87. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -0
  88. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -0
  89. package/dist/components/custom/goo-blob/types.d.ts +77 -0
  90. package/dist/components/custom/hover-popover/HoverPopover.vue.d.ts +48 -9
  91. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +2 -0
  92. package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +2 -2
  93. package/dist/components/custom/metric-stack/MetricRow.vue.d.ts +2 -2
  94. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +13 -7
  95. package/dist/components/custom/search/FuzzySearch.vue.d.ts +1 -1
  96. package/dist/components/custom/search/SearchBar.vue.d.ts +1 -1
  97. package/dist/components/custom/sortable-list/SortableHandle.vue.d.ts +7 -1
  98. package/dist/components/custom/sortable-list/context.d.ts +2 -3
  99. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +6 -3
  100. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +7 -3
  101. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +6 -3
  102. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +39 -0
  103. package/dist/components/custom/timeline/ContinuousMarkers.vue.d.ts +49 -0
  104. package/dist/components/custom/timeline/ContinuousRail.vue.d.ts +26 -0
  105. package/dist/components/custom/timeline/ContinuousTimeline.vue.d.ts +4 -4
  106. package/dist/components/custom/typewriter/TypewriterText.vue.d.ts +2 -2
  107. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +45 -0
  108. package/dist/components/custom/watercolor-dot/index.d.ts +3 -0
  109. package/dist/components/custom/watercolor-dot/prng.d.ts +5 -0
  110. package/dist/components/custom/watercolor-dot/useWatercolorBlob.d.ts +24 -0
  111. package/dist/components/ui/_shared/menuItemVariants.d.ts +1 -1
  112. package/dist/components/ui/avatar/Avatar.vue.d.ts +1 -1
  113. package/dist/components/ui/avatar/AvatarImage.vue.d.ts +5 -1
  114. package/dist/components/ui/avatar/index.d.ts +1 -1
  115. package/dist/components/ui/badge/index.d.ts +2 -2
  116. package/dist/components/ui/button/Button.vue.d.ts +3 -1
  117. package/dist/components/ui/button/index.d.ts +2 -2
  118. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
  119. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
  120. package/dist/components/ui/combobox/Combobox.vue.d.ts +2 -2
  121. package/dist/components/ui/combobox/ComboboxInput.vue.d.ts +2 -1
  122. package/dist/components/ui/command/Command.vue.d.ts +3 -3
  123. package/dist/components/ui/command/CommandInput.vue.d.ts +2 -1
  124. package/dist/components/ui/data-table/DataTable.vue.d.ts +5 -4
  125. package/dist/components/ui/dialog/DialogContent.vue.d.ts +8 -0
  126. package/dist/components/ui/drawer/Drawer.vue.d.ts +4 -4
  127. package/dist/components/ui/input/Input.vue.d.ts +19 -1
  128. package/dist/components/ui/multi-select/MultiSelect.vue.d.ts +8 -4
  129. package/dist/components/ui/progress/Progress.vue.d.ts +26 -88
  130. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -0
  131. package/dist/components/ui/progress/ProgressGradient.vue.d.ts +25 -0
  132. package/dist/components/ui/progress/ProgressSectioned.vue.d.ts +36 -0
  133. package/dist/components/ui/progress/index.d.ts +5 -2
  134. package/dist/components/ui/progress/useProgressGeometry.d.ts +60 -0
  135. package/dist/components/ui/select/Select.vue.d.ts +2 -2
  136. package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
  137. package/dist/components/ui/select/SelectTrigger.vue.d.ts +3 -0
  138. package/dist/components/ui/sheet/index.d.ts +1 -1
  139. package/dist/components/ui/slider/index.d.ts +12 -11
  140. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
  141. package/dist/components/ui/textarea/Textarea.vue.d.ts +5 -1
  142. package/dist/components/ui/toast/Toast.vue.d.ts +4 -4
  143. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  144. package/dist/components/ui/toggle/index.d.ts +1 -1
  145. package/dist/components/ui/toggle-group/toggleGroupContext.d.ts +2 -3
  146. package/dist/composables/color/index.d.ts +49 -0
  147. package/dist/composables/context/createContext.d.ts +56 -0
  148. package/dist/composables/context/index.d.ts +1 -0
  149. package/dist/composables/dark/darkModeSyncScript.d.ts +23 -0
  150. package/dist/composables/dark/index.d.ts +3 -0
  151. package/dist/composables/dark/useGlobalDark.d.ts +19 -2
  152. package/dist/composables/dom/index.d.ts +1 -3
  153. package/dist/composables/dom/useClipboard.d.ts +35 -12
  154. package/dist/composables/dom/useDocumentVisibility.d.ts +20 -0
  155. package/dist/composables/dom/useTextHighlight.d.ts +40 -0
  156. package/dist/composables/glass/webgl/compile.d.ts +15 -0
  157. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +3 -0
  158. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +55 -0
  159. package/dist/composables/motion/core/index.d.ts +2 -1
  160. package/dist/composables/motion/index.d.ts +1 -1
  161. package/dist/composables/motion/useCountup.d.ts +29 -0
  162. package/dist/composables/motion/usePrioritizedTask.d.ts +41 -0
  163. package/dist/composables/motion/vReveal.d.ts +2 -0
  164. package/dist/composables/sidebar/useSidebarState.d.ts +2 -2
  165. package/dist/composables/sortable/dragController.d.ts +44 -0
  166. package/dist/composables/sortable/dropResolver.d.ts +34 -0
  167. package/dist/composables/sortable/ghostRenderer.d.ts +44 -0
  168. package/dist/composables/sortable/index.d.ts +1 -1
  169. package/dist/composables/sortable/touchGate.d.ts +26 -0
  170. package/dist/composables/sortable/transitionTiming.d.ts +50 -0
  171. package/dist/composables/sortable/types.d.ts +133 -0
  172. package/dist/composables/sortable/useSortable.d.ts +25 -140
  173. package/dist/configurator.js +1 -1
  174. package/dist/confirm-dialog.js +3 -3
  175. package/dist/context-menu.js +2 -2
  176. package/dist/controls.js +5 -5
  177. package/dist/createContext-DBMGRlx4.js +25 -0
  178. package/dist/dark.d.ts +2 -1
  179. package/dist/dark.js +9 -2
  180. package/dist/data-table.js +1 -1
  181. package/dist/dialog.js +2 -2
  182. package/dist/disco-glyph.js +1 -1
  183. package/dist/dock.js +410 -254
  184. package/dist/dockContext-spUj_-E5.js +9 -0
  185. package/dist/dom.js +6 -5
  186. package/dist/{dropdown-menu-BvRUamNs.js → dropdown-menu-EFjl5iKo.js} +4 -4
  187. package/dist/dropdown-menu.js +1 -1
  188. package/dist/expandable-container.js +28 -22
  189. package/dist/fonts/README.md +21 -0
  190. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  191. package/dist/forms.js +70 -61
  192. package/dist/glass-carousel.js +59 -52
  193. package/dist/glass-panel.js +2 -2
  194. package/dist/glass-ui.css +1 -1
  195. package/dist/glass-ui.js +159 -254
  196. package/dist/glyph-face.js +2 -2
  197. package/dist/goo-blob.d.ts +1 -0
  198. package/dist/goo-blob.js +538 -0
  199. package/dist/header-ribbon.js +3 -3
  200. package/dist/hover-card.js +1 -1
  201. package/dist/hover-popover.js +1 -1
  202. package/dist/icon-tooltip.js +1 -1
  203. package/dist/index.d.ts +1 -0
  204. package/dist/instrument-chassis.js +1 -1
  205. package/dist/instrument-rail.js +1 -1
  206. package/dist/keyboard.js +1 -1
  207. package/dist/keys-BFoma9vm.js +9 -0
  208. package/dist/label.js +1 -1
  209. package/dist/labeled-field.js +57 -39
  210. package/dist/metric-badge.js +1 -1
  211. package/dist/metric-stack.js +1 -1
  212. package/dist/{minimize-2-LsCJ_eNt.js → minimize-2-BP27-qBY.js} +1 -1
  213. package/dist/motion-core.js +154 -135
  214. package/dist/motion.js +63 -15
  215. package/dist/notification.js +1 -1
  216. package/dist/number-field.js +1 -1
  217. package/dist/paper-backdrop.js +1 -1
  218. package/dist/popover.js +1 -1
  219. package/dist/{presets-a-D93K1S.js → presets-1OhFpaIC.js} +5 -5
  220. package/dist/prng-Bz_1Tydc.js +15 -0
  221. package/dist/progress.js +2 -2
  222. package/dist/pulse.js +1 -1
  223. package/dist/reactive.js +2 -2
  224. package/dist/responsive-tabs.js +38 -32
  225. package/dist/scrolling-text.js +1 -1
  226. package/dist/{search-DBAiUABx.js → search-DBG8qaRs.js} +1 -1
  227. package/dist/search.js +153 -149
  228. package/dist/select.js +3 -3
  229. package/dist/separator.js +1 -1
  230. package/dist/{sheet-CukNDezz.js → sheet-CQYYrkr9.js} +3 -3
  231. package/dist/sheet.js +1 -1
  232. package/dist/{slider-DJvHkTRe.js → slider-BOh8ycfZ.js} +8 -12
  233. package/dist/slider.js +1 -1
  234. package/dist/sortable-list.js +37 -39
  235. package/dist/stacked-icons.js +2 -2
  236. package/dist/styles/animations.css +1 -1
  237. package/dist/styles/cards.css +1 -1
  238. package/dist/styles/components.css +45 -0
  239. package/dist/styles/dock-controls.css +486 -0
  240. package/dist/styles/dock.css +325 -431
  241. package/dist/styles/fonts.css +25 -0
  242. package/dist/styles/glass-specular-track.css +154 -0
  243. package/dist/styles/glass.css +74 -2
  244. package/dist/styles/index.css +25 -2
  245. package/dist/styles/instrument-chassis.css +11 -4
  246. package/dist/styles/theme.css +73 -21
  247. package/dist/styles/tokens.css +282 -140
  248. package/dist/styles/typography.css +14 -8
  249. package/dist/styles/utilities.css +92 -8
  250. package/dist/styles/view-transition.css +10 -4
  251. package/dist/switch.js +1 -1
  252. package/dist/tabs.js +148 -106
  253. package/dist/timeline.js +220 -159
  254. package/dist/toast.js +1 -1
  255. package/dist/toggle-group.js +1 -1
  256. package/dist/tokens.d.ts +1 -1
  257. package/dist/tooltip.js +1 -1
  258. package/dist/typewriter.js +1 -1
  259. package/dist/{useAnimatedNumber-DKQYVB7s.js → useAnimatedNumber-BF6r64lA.js} +1 -1
  260. package/dist/useClipboard-D8vFyRCa.js +97 -0
  261. package/dist/useConfiguratorState-DUtC1jxr.js +276 -0
  262. package/dist/useGlobalDark-CWiaCoEw.js +34 -0
  263. package/dist/useIntersectionPause-DAdVPVp4.js +53 -0
  264. package/dist/useSortable-DnyGXKKY.js +246 -0
  265. package/dist/useTextHighlight-Dmtofpk2.js +72 -0
  266. package/dist/{useTouchGate-D9Zvrzyc.js → useTouchGate-CS5Csc2h.js} +1 -1
  267. package/dist/{useViewTransition-DYIK6Gzb.js → useViewTransition-D4ssvnXZ.js} +5 -3
  268. package/dist/utils/index.d.ts +2 -1
  269. package/dist/utils/platformSupport.d.ts +8 -0
  270. package/dist/utils/prng.d.ts +4 -0
  271. package/dist/vReveal-u2wSG2El.js +35 -0
  272. package/dist/watercolor-dot.d.ts +1 -0
  273. package/dist/watercolor-dot.js +129 -0
  274. package/dist/{x-q7pJa83X.js → x-C4pz9nbD.js} +1 -1
  275. package/package.json +110 -16
  276. package/src/fonts/README.md +21 -0
  277. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  278. package/src/styles/animations.css +1 -1
  279. package/src/styles/cards.css +1 -1
  280. package/src/styles/dock-controls.css +486 -0
  281. package/src/styles/dock.css +325 -431
  282. package/src/styles/fonts.css +25 -0
  283. package/src/styles/glass-specular-track.css +154 -0
  284. package/src/styles/glass.css +74 -2
  285. package/src/styles/index.css +21 -2
  286. package/src/styles/instrument-chassis.css +11 -4
  287. package/src/styles/theme.css +73 -21
  288. package/src/styles/tokens.css +282 -140
  289. package/src/styles/typography.css +14 -8
  290. package/src/styles/utilities.css +92 -8
  291. package/src/styles/view-transition.css +10 -4
  292. package/dist/DataTable-R8-Zidms.js +0 -460
  293. package/dist/DialogContent-2fALDSvc.js +0 -93
  294. package/dist/HoverPopover-CWFCfLx3.js +0 -96
  295. package/dist/Input-DDpFn568.js +0 -30
  296. package/dist/Progress-FApA9fm_.js +0 -126
  297. package/dist/UnderlineTabs-DAWMLmJG.js +0 -37
  298. package/dist/components/custom/aurora/shaders/aurora.frag.d.ts +0 -1
  299. package/dist/composables/dom/useBreakpoint.d.ts +0 -38
  300. package/dist/composables/dom/useIdleReady.d.ts +0 -63
  301. package/dist/composables/dom/useViewportReady.d.ts +0 -87
  302. package/dist/composables/glass/webgl/frostShader.d.ts +0 -27
  303. package/dist/composables/motion/useAnimatedNumberMap.d.ts +0 -29
  304. package/dist/composables/motion/useStagger.d.ts +0 -50
  305. package/dist/dockContext-D5NZCWJs.js +0 -16
  306. package/dist/keys-CaTQS-vx.js +0 -11
  307. package/dist/useConfiguratorState-CtRBE0m_.js +0 -268
  308. package/dist/useGlobalDark-B0WvLJE3.js +0 -24
  309. package/dist/useIdleReady-Cmkhm03v.js +0 -162
  310. package/dist/useIntersectionPause-IY2CwPQb.js +0 -39
  311. package/dist/useSortable-Cq2Y1JLO.js +0 -175
  312. /package/dist/{ContextMenuContent-otjFIu8v.js → ContextMenuContent-De01_83g.js} +0 -0
  313. /package/dist/{HoverCardContent-DaGrgJBO.js → HoverCardContent-ICfIMZX1.js} +0 -0
  314. /package/dist/{InstrumentChassis-CnHTMxds.js → InstrumentChassis-DaHIZCqy.js} +0 -0
  315. /package/dist/{InstrumentRail-C6dEbi8E.js → InstrumentRail-B0qqLFN0.js} +0 -0
  316. /package/dist/{Label-DJty89bp.js → Label-CZk-3nTc.js} +0 -0
  317. /package/dist/{ModalOverlay-iWiAgbYH.js → ModalOverlay-B_CBtqcE.js} +0 -0
  318. /package/dist/{PaperBackdrop-CeZ-w0R0.js → PaperBackdrop-D_YZW47j.js} +0 -0
  319. /package/dist/{SelectGroup-DdR4tdDY.js → SelectGroup-CMdoCjRE.js} +0 -0
  320. /package/dist/{SelectSeparator-CXm_hlqA.js → SelectSeparator-CaJnPF3_.js} +0 -0
  321. /package/dist/{Separator-D8AUMhxY.js → Separator-C2XtAXRp.js} +0 -0
  322. /package/dist/{Switch-Cr1t_F_U.js → Switch-x8n6husW.js} +0 -0
  323. /package/dist/{TooltipProvider-DE78vbEP.js → TooltipProvider-D-JrSqDu.js} +0 -0
  324. /package/dist/{_plugin-vue_export-helper-Dq1MygBL.js → _plugin-vue_export-helper-C1je1s0u.js} +0 -0
  325. /package/dist/{badge-x46my_Fo.js → badge-Cl6JZ1B7.js} +0 -0
  326. /package/dist/components/custom/aurora/{renderMode.d.ts → constants/renderMode.d.ts} +0 -0
  327. /package/dist/components/custom/aurora/{shaders → constants/shaders}/aurora.vert.d.ts +0 -0
  328. /package/dist/{constants-DwBwnG8N.js → constants-DsCdlK9I.js} +0 -0
  329. /package/dist/{createLucideIcon-Bn9a1b70.js → createLucideIcon-DuDoe_ra.js} +0 -0
  330. /package/dist/{menuItemVariants-BsbGNq9C.js → menuItemVariants-C2QlXqT3.js} +0 -0
  331. /package/dist/{useGlassRenderer-Ds-nmrGz.js → useGlassRenderer-Dn3WpfG-.js} +0 -0
  332. /package/dist/{useInterval-DVgGUf_y.js → useInterval-CHVYFpXV.js} +0 -0
  333. /package/dist/{useKeyboardShortcuts-Dpw_RUcB.js → useKeyboardShortcuts-BQfnAHHW.js} +0 -0
  334. /package/dist/{useResizeObserver-Cg9npuM3.js → useResizeObserver-DX-STszm.js} +0 -0
  335. /package/dist/{useSpringMount-Cfk1XK1R.js → useSpringMount-CnizvZGm.js} +0 -0
  336. /package/dist/{useTimer-NAaj9zNq.js → useTimer-DGgoxTXL.js} +0 -0
  337. /package/dist/{useUserInvalidAria-DVu1eTXG.js → useUserInvalidAria-DmvZ_6Dx.js} +0 -0
@@ -1,23 +1,34 @@
1
1
  /**
2
- * Aurora v4.1 runtime — port of bundle `runtime.js` to TypeScript.
2
+ * Aurora v4.1 runtime — the GL-lifecycle orchestrator over the `useWebGLCanvas`
3
+ * substrate (AU.W6, the DEC-AT-1 transposition).
3
4
  *
4
- * Compiles the shader, owns the WebGL2 context and RAF loop, translates a
5
- * reactive `AuroraConfig` into uniforms, and exposes an imperative cursor API
6
- * plus a side-effect-safe `renderAt(t)` method for capture baking.
5
+ * This module composes four cohesive seams atop the substrate:
6
+ * - glSetup — compile/link + geometry + the uniform location cache
7
+ * - uniformBridge the reactive-config → GL-uniform translation + enum dispatch
8
+ * - cursorModel — the eased pointer-attraction state + advance
9
+ * - frameLoop — the per-frame draw + the render-demand gate
7
10
  *
8
- * Y-origin convention: config authoring is CSS-top-origin (0 = top). The
9
- * runtime flips Y at the uniform boundary (see AUTHOR_Y_ORIGIN_IS_TOP marks).
11
+ * It owns ONLY the aurora-specific glue: threading the seams through the
12
+ * substrate's `setup`/`frame`/`shouldContinue`/`resize`/`time`/`teardown`
13
+ * callbacks, the reduced-motion frozen-t, the DPR policy, and the imperative
14
+ * setters/pause/resume. The generic WebGL2 lifecycle — context creation, the
15
+ * three-reason suspend/resume model, the demand-driven rAF loop, the tab-visibility
16
+ * owner, the ResizeObserver, and the webglcontextlost/restored robustness — lives
17
+ * in the substrate.
18
+ *
19
+ * Y-origin convention: config authoring is CSS-top-origin (0 = top). The seams
20
+ * flip Y at the uniform boundary (`flipY` in uniformBridge/frameLoop).
10
21
  */
11
- import { type AuroraConfig, type AuroraInstance } from "../presets";
22
+ import type { AuroraConfig, AuroraInstance } from "../constants/presets";
12
23
  export type AuroraRuntimeMode = "live" | "capture";
13
24
  /**
14
- * The three independent reasons the RAF loop may be suspended. The runtime
15
- * tracks them in a `Set<SuspendReason>` rather than one boolean, so the loop
16
- * runs IFF the set is empty and each reason is cleared ONLY by the source that
17
- * set it. This makes resume-while-still-suspended structurally unreachable — a
18
- * `resume("tab-hidden")` cannot lift an `"off-screen"` suspension.
25
+ * The three independent reasons the rAF loop may be suspended. Owned by the
26
+ * `useWebGLCanvas` substrate as a `Set<reason>`: the loop runs IFF the set is
27
+ * empty and each reason is cleared ONLY by the source that set it. This makes
28
+ * resume-while-still-suspended structurally unreachable — a `resume("tab-hidden")`
29
+ * cannot lift an `"off-screen"` suspension.
19
30
  *
20
- * - `"tab-hidden"` — the runtime's own `document.visibilitychange` owner.
31
+ * - `"tab-hidden"` — the substrate's `document.visibilitychange` owner.
21
32
  * - `"off-screen"` — viewport-intersection, driven by `useIntersectionPause`.
22
33
  * - `"manual"` — the public `pause()`/`resume()` API (and capture-mode seed).
23
34
  */
@@ -26,15 +37,14 @@ export type SuspendReason = "tab-hidden" | "off-screen" | "manual";
26
37
  * When the expensive WebGL path (context creation, shader compile + GPU link,
27
38
  * first uniform upload, rAF arm) actually runs.
28
39
  *
29
- * - `"deferred"` (default) — `createAurora` constructs a cheap, un-armed
30
- * instance and returns immediately; the GL work is invoked later via
31
- * `instance.arm()`. The Vue wrapper `useAurora` schedules `arm()` past first
32
- * paint on an idle tick, gated on canvas visibility — so the shader
33
- * compile-link never lands on the consumer's first-paint critical path.
34
- * - `"eager"` — `createAurora` arms synchronously before returning, exactly
35
- * as a pre-lazy-arm runtime did. Capture / thumbnail-baking consumers need
36
- * this: `renderAt` must draw a real frame the instant `createAurora`
37
- * returns. `mode: "capture"` forces eager regardless of this field.
40
+ * - `"deferred"` (default) — `createAurora` constructs a cheap, un-armed instance
41
+ * and returns immediately; the GL work is invoked later via `instance.arm()`.
42
+ * The Vue wrapper `useAurora` schedules `arm()` past first paint on an idle
43
+ * tick, gated on canvas visibility — so the shader compile-link never lands on
44
+ * the consumer's first-paint critical path.
45
+ * - `"eager"` — `createAurora` arms synchronously before returning. Capture /
46
+ * thumbnail-baking consumers need this: `renderAt` must draw a real frame the
47
+ * instant `createAurora` returns. `mode: "capture"` forces eager regardless.
38
48
  */
39
49
  export type AuroraInitStrategy = "eager" | "deferred";
40
50
  export interface AuroraRuntimeOptions {
@@ -49,25 +59,25 @@ export interface AuroraRuntimeOptions {
49
59
  /**
50
60
  * Init-failure handler. A WebGL2/shader-compile/link failure is a
51
61
  * library-internal contract violation (O invariant 24). On the EAGER path
52
- * `createAurora` throws synchronously and `useAurora` rethrows by default
53
- * so the signal reaches the consumer's error boundary / dev console. On
54
- * the DEFERRED path the failure happens on an idle tick — outside any
55
- * mount-time boundary — so the runtime routes it here, and `useAurora`
56
- * re-surfaces it on the microtask queue (so it still reaches the dev
57
- * console / `app.config.errorHandler`) when no handler is supplied.
58
- * Provide this callback to opt into silent handling on either path.
62
+ * `createAurora` throws synchronously and `useAurora` rethrows by default so
63
+ * the signal reaches the consumer's error boundary / dev console. On the
64
+ * DEFERRED path the failure happens on an idle tick — outside any mount-time
65
+ * boundary — so the runtime routes it here, and `useAurora` re-surfaces it on
66
+ * the microtask queue (so it still reaches the dev console /
67
+ * `app.config.errorHandler`) when no handler is supplied. Provide this
68
+ * callback to opt into silent handling on either path.
59
69
  *
60
- * NOTE: this is the `useAurora` Vue-wrapper contract surface. The
61
- * imperative `createAurora(...)` runtime throws on eager init failure and
62
- * — for `instance.arm()` on the deferred path — rethrows from `arm()`.
70
+ * NOTE: this is the `useAurora` Vue-wrapper contract surface. The imperative
71
+ * `createAurora(...)` runtime throws on eager init failure and — for
72
+ * `instance.arm()` on the deferred path — rethrows from `arm()`.
63
73
  */
64
74
  onInitError?: (err: Error) => void;
65
75
  }
66
76
  /**
67
77
  * The concrete `createAurora` return shape. It IS an {@link AuroraInstance}
68
- * (structurally assignable — every member matches) but widens `pause`/`resume`
69
- * to carry an optional {@link SuspendReason}, defaulting to `"manual"`. The
70
- * Vue wrapper passes `"off-screen"` for the intersection seam; a bare
78
+ * (structurally assignable — every member matches) but widens `pause`/`resume` to
79
+ * carry an optional {@link SuspendReason}, defaulting to `"manual"`. The Vue
80
+ * wrapper passes `"off-screen"` for the intersection seam; a bare
71
81
  * `pause()`/`resume()` reads identically to the `AuroraInstance` contract.
72
82
  */
73
83
  export interface AuroraRuntime extends Omit<AuroraInstance, "pause" | "resume"> {
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Aurora uniform bridge — the reactive-config → GL-uniform translation seam.
3
+ *
4
+ * Owns the sealed enum↔shader-int dispatch maps and the per-config uniform upload.
5
+ * Each map is `as const` constrained by a `satisfies Record<Union, number>` so a
6
+ * NEW union member is a COMPILE error until it gets a slot — no silent stale-Record
7
+ * gap where a fresh enum value uploads `undefined`.
8
+ *
9
+ * Crayon is a PEER medium (`uMedium == 4`), NOT a stroke mode: the shader hoists it
10
+ * out of `mediumOil()` (wax-on-tooth, not oil strokes). So `MEDIUM_ID` carries the
11
+ * peer `crayon: 4` slot and `STROKE_MODE_ID` no longer maps `crayon` — a
12
+ * `strokeMode === "crayon"` config resolves to the crayon peer medium via
13
+ * `resolveMediumId` and uploads a benign `uStrokeMode` (oil).
14
+ *
15
+ * The pre-allocated upload buffers live in the bridge: a slider drag refills them
16
+ * in place rather than allocating ~8 Float32Arrays per frame.
17
+ */
18
+ import type { UniformLocations } from "./glSetup";
19
+ import type { CursorState } from "./cursorModel";
20
+ import { type AuroraConfig } from "../constants/presets";
21
+ export declare const MEDIUM_ID: {
22
+ readonly smooth: 0;
23
+ readonly pastel: 1;
24
+ readonly watercolor: 2;
25
+ readonly oil: 3;
26
+ readonly crayon: 4;
27
+ };
28
+ export declare const FLOW_ID: {
29
+ readonly none: 0;
30
+ readonly radial: 1;
31
+ readonly swirl: 2;
32
+ readonly diagonal: 3;
33
+ readonly multi: 4;
34
+ };
35
+ export declare const WARP_ID: {
36
+ readonly fbm: 0;
37
+ readonly cellular: 1;
38
+ readonly hybrid: 2;
39
+ };
40
+ export declare const STROKE_MODE_ID: {
41
+ readonly oil: 0;
42
+ readonly knife: 1;
43
+ readonly chunky: 3;
44
+ };
45
+ /**
46
+ * The effective `uMedium` int for a config. The only non-identity case: a
47
+ * `medium: "oil"` + `strokeMode: "crayon"` config selects the crayon PEER
48
+ * (`uMedium == 4`) rather than oil — behavior-preserving with the pre-hoist
49
+ * `mediumOil()` `mode == 2` branch (same pixel output, dispatched one level up).
50
+ */
51
+ export declare function resolveMediumId(cfg: AuroraConfig): number;
52
+ /**
53
+ * The `uStrokeMode` int for a config. Crayon is not an oil stroke (it routes to
54
+ * the crayon peer medium where `uStrokeMode` is unread), so it uploads the benign
55
+ * oil default; the other modes map directly.
56
+ */
57
+ export declare function resolveStrokeModeId(cfg: AuroraConfig): number;
58
+ /**
59
+ * Build the per-config uniform uploader bound to a program's uniform location
60
+ * cache + cursor state. Returns `uploadConfig` — call it to push a fresh
61
+ * `AuroraConfig` into the live program. The cursor uniforms are initialised here
62
+ * and re-sent per frame by the frame loop.
63
+ *
64
+ * Y-origin: config authoring is CSS-top-origin (0 = top); the bridge flips Y at
65
+ * the uniform boundary (`flipY`).
66
+ */
67
+ export declare function createUniformBridge(gl: WebGL2RenderingContext, prog: WebGLProgram, U: UniformLocations, cursor: CursorState): (cfg: AuroraConfig) => void;
@@ -1,7 +1,7 @@
1
1
  import { type Ref } from "vue";
2
2
  import { type AuroraRuntimeOptions } from "./runtime";
3
3
  import { type ConfigSource } from "./configSource";
4
- import type { AuroraConfig } from "../presets";
4
+ import type { AuroraConfig } from "../constants/presets";
5
5
  /**
6
6
  * Adaptive-substrate options threaded down from `Aurora.vue` (AM.W1). The
7
7
  * render mode is the RESOLVED concrete substrate (`"auto"` already collapsed
@@ -63,5 +63,18 @@ export interface UseAuroraReturn {
63
63
  * placeholder under the canvas so the consumer's first paint is never blocked
64
64
  * on the shader. Capture / `initStrategy: "eager"` consumers arm synchronously
65
65
  * inside `createAurora` and skip the defer entirely.
66
+ *
67
+ * Init-failure contract (O invariant 24 — "fails explicitly by default"). A
68
+ * WebGL2/shader-compile/link failure is a library-internal contract violation.
69
+ * On the DEFERRED path the failure lands on an idle tick, OUTSIDE any
70
+ * mount-time error boundary, so the consumer MUST handle it through exactly one
71
+ * of three paths:
72
+ * 1. pass an `onInitError(err)` handler in `runtimeOptions` (the explicit
73
+ * opt-in — receives the error directly), OR
74
+ * 2. install a Vue global `app.config.errorHandler` (the re-surfaced
75
+ * microtask rejection reaches it), OR
76
+ * 3. knowingly accept the unhandled rejection (the dev console still gets it).
77
+ * Armed deferred with NO `onInitError`, `useAurora` dev-warns ONCE so the
78
+ * silent-by-omission case is visible. WebGL2-unavailable still throws HARD.
66
79
  */
67
80
  export declare function useAurora(canvasRef: Ref<HTMLCanvasElement | null>, configSource: ConfigSource<AuroraConfig>, runtimeOptions?: AuroraRuntimeOptions, adaptiveOptions?: UseAuroraAdaptiveOptions): UseAuroraReturn;
@@ -1,6 +1,6 @@
1
1
  import { type Ref } from "vue";
2
2
  import { type ConfigSource } from "./configSource";
3
- import type { AuroraConfig } from "../presets";
3
+ import type { AuroraConfig } from "../constants/presets";
4
4
  export interface CursorInteractionOptions {
5
5
  /** Fires `setCursor(x,y,strength)` for continuous swirl. */
6
6
  setCursor: (x: number, y: number, strength?: number) => void;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * AV.W7 F6 — the WebGL-surface perf BUDGET constants (the named ceilings).
3
+ *
4
+ * Promotes the formerly-magic `Math.min(dpr, 2)` literal that lived inline in
5
+ * the aurora + goo-blob `resize()` paths (the `2` was un-named in both) to ONE
6
+ * named ceiling, and adds the consumer-preset budget caps the SOTA crosswalk
7
+ * §2.F F6 calls for. A preset that exceeds a cap is CLAMPED at upload, so a
8
+ * consumer cannot blow the frame/VRAM budget by over-authoring a config.
9
+ *
10
+ * Token-first (the wave precept): these are the CPU-side numeric ceilings.
11
+ * They are NOT magic numbers scattered across runtimes — every WebGL surface
12
+ * reads the same export, so a tuning change lands in one place.
13
+ */
14
+ /**
15
+ * The device-pixel-ratio clamp. A retina/4K display reports `devicePixelRatio`
16
+ * 2–3+; rendering a full-viewport `backdrop-filter`-adjacent WebGL surface at
17
+ * 3× is ~2.25× the fill of 2× for no perceptible gain on a drift background.
18
+ * Cap the backing-store resolution at 2× — the single biggest VRAM/fill lever
19
+ * after the offscreen-park. Consumed by aurora's + goo-blob's `resize()`.
20
+ */
21
+ export declare const AV_DPR_MAX = 2;
22
+ /**
23
+ * The maximum animated metaball nuclei (the goo-blob body + its satellites, or
24
+ * an aurora field's count). The goo-blob shader hard-caps satellites at 4; this
25
+ * is the authored-config soft cap (body + ≤2 satellites is the budget-safe
26
+ * register, ≤3 the ceiling). A preset above this is clamped at upload.
27
+ */
28
+ export declare const AV_MAX_BLOBS = 3;
29
+ /**
30
+ * The maximum palette colors a budget-safe field mixes per frame. Aurora's
31
+ * shader caps palette stops at {@link MAX_STOPS} (8) for authoring range; this
32
+ * is the PERF budget — 3–4 colors is the band where the per-pixel mix stays
33
+ * cheap. Above this the gradient cost grows without perceptible richness.
34
+ */
35
+ export declare const AV_MAX_COLORS = 4;
36
+ /**
37
+ * The drift-loop duration band, in seconds. An animation that loops faster than
38
+ * {@link AV_LOOP_DURATION_MIN_S} reads as nervous (and never lets the eye rest →
39
+ * no battery reprieve); slower than {@link AV_LOOP_DURATION_MAX_S} reads as
40
+ * static. The 8–15s band is the SOTA-named budget-safe drift window.
41
+ */
42
+ export declare const AV_LOOP_DURATION_MIN_S = 8;
43
+ export declare const AV_LOOP_DURATION_MAX_S = 15;
44
+ /** Clamp a numeric value into an inclusive `[min, max]` band. */
45
+ export declare function clampBudget(value: number, min: number, max: number): number;
46
+ /**
47
+ * Resolve the budget-clamped backing-store DPR for a surface. SSR-safe (returns
48
+ * `1` when `window` is absent). The single CPU-side reader of {@link AV_DPR_MAX}.
49
+ */
50
+ export declare function resolveBudgetDpr(): number;
@@ -10,11 +10,8 @@
10
10
  * shape + a minimum-viable DEFAULT_AURORA_CONFIG for the component's own
11
11
  * type-check ergonomics.
12
12
  */
13
- export interface OklchStop {
14
- L: number;
15
- C: number;
16
- h: number;
17
- }
13
+ import type { OklchStop } from "../../../../composables/color";
14
+ export type { OklchStop };
18
15
  export interface AuroraNucleus {
19
16
  /** 0..1 in CSS-top-origin space (0 = top, 1 = bottom). Runtime flips Y. */
20
17
  x: number;
@@ -25,7 +22,7 @@ export interface AuroraNucleus {
25
22
  paletteBias: number;
26
23
  /** -0.3..0.3 — lightness pull within the nucleus's zone of influence. */
27
24
  valueBias: number;
28
- /** 0..0.03 — orbit amplitude for slow drift. */
25
+ /** 0..0.08 — orbit amplitude for slow drift (the visible-travel gate). */
29
26
  driftRadius: number;
30
27
  /** 0..2π — phase seed. */
31
28
  driftPhase: number;
@@ -0,0 +1 @@
1
+ export declare const FRAGMENT_SRC: string;
@@ -0,0 +1 @@
1
+ export declare const AURORA_BRUSH_GLSL = "// \u2500\u2500 Curved swept brushstroke primitive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// A stroke is a curved spine from A to B with quadratic bulge K (sideways offset\n// at midpoint). Width varies along length via a shape profile. Edge is ragged\n// (bristle-modulated), ends are rounded blobs, inside has streak modulation.\n//\n// For pixel p, we invert an approximate projection onto the curved spine:\n// 1) project p onto straight AB axis -> along0, cross0\n// 2) at parameter along0, spine offset = 4\u00B7K\u00B7along0\u00B7(1-along0) perpendicular\n// 3) cross = cross0 - spineOffset, refine along one iteration\n// Coverage blends paint atop col based on per-stroke color sampled from the\n// underlying base at spine midpoint \u2014 so overlapping strokes from different\n// palette regions meet at hard, ragged demarcations.\n\nstruct StrokeHit {\n float coverage; // 0..1\n vec3 color;\n float alongT; // 0..1 along spine, for internal modulation\n float crossN; // cross distance / current half-width, signed\n float edgeN; // distance to edge in half-widths (0 = at edge, 1 = at spine)\n};\n\nStrokeHit noHit() { return StrokeHit(0.0, vec3(0.0), 0.0, 0.0, 0.0); }\n\nvec2 rotateDir(vec2 dir, float angle) {\n float ca = cos(angle), sa = sin(angle);\n return vec2(dir.x * ca - dir.y * sa, dir.x * sa + dir.y * ca);\n}\n\nvec2 safeDir(vec2 dir) {\n float len = length(dir);\n return len > 1e-4 ? dir / len : vec2(1.0, 0.0);\n}\n\n// Shape profile along the stroke. type:\n// 0 tapered \u2014 thin-fat-thin (classic brush)\n// 1 load-drag \u2014 fat start, tapers to a point\n// 2 dab \u2014 ellipse-like, round center\n// 3 even \u2014 near-constant, slight end taper\nfloat strokeShape(float t, int type) {\n t = clamp(t, 0.0, 1.0);\n if (type == 1) {\n // loaded at t=0, tapering\n return pow(1.0 - t, 0.55) * smoothstep(0.0, 0.08, t);\n } else if (type == 2) {\n // dab / blob\n float d = t - 0.5;\n return exp(-d * d * 12.0);\n } else if (type == 3) {\n // mostly even, slight end softening\n return smoothstep(0.0, 0.08, t) * smoothstep(1.0, 0.92, t) * 0.95 + 0.05;\n }\n // 0 tapered\n return smoothstep(0.0, 0.22, t) * smoothstep(1.0, 0.78, t);\n}\n\n// A single curved stroke.\n// a, b \u2014 endpoints\n// halfW \u2014 base half-width (world units)\n// bulge \u2014 signed perpendicular midpoint offset, in world units\n// shapeType \u2014 0..3\n// bristleFreq \u2014 spatial frequency of edge raggedness\n// bristleAmp \u2014 0..0.5 fraction of halfW chewed away at edge extrema\n// streakSeed \u2014 uniqueness seed for internal streaks\n// colAtMid \u2014 pre-sampled color at midpoint\nStrokeHit curvedStroke(vec2 p, vec2 a, vec2 b, float halfW,\n float bulge, int shapeType,\n float bristleFreq, float bristleAmp,\n float streakSeed, vec3 colAtMid) {\n vec2 ab = b - a;\n float L = length(ab);\n if (L < 1e-5) return noHit();\n vec2 tang = ab / L;\n vec2 norm = vec2(-tang.y, tang.x);\n\n vec2 rel = p - a;\n float along0 = dot(rel, tang) / L; // straight projection 0..1 along AB\n float cross0 = dot(rel, norm); // signed cross\n\n // Spine sideways offset due to bulge (parabolic)\n float bend = 4.0 * bulge * along0 * (1.0 - along0);\n float cross1 = cross0 - bend;\n\n // One refinement step: as the spine bends, the closest-point along shifts.\n // Spine tangent differs from straight tangent; first-order correction:\n float dBend = 4.0 * bulge * (1.0 - 2.0 * along0); // d(bend)/d(along)\n float along1 = along0 + (cross1 * dBend) / (L * (1.0 + dBend * dBend / (L * L)));\n\n // Bristle-ragged edge: half-width gets chewed by 1D noise along the spine\n float edgeNoise = fbm(vec2(along1 * bristleFreq, streakSeed * 7.3)) - 0.5;\n float edgeNoise2 = fbm(vec2(along1 * bristleFreq * 2.3, streakSeed * 3.1 + 17.0)) - 0.5;\n float edgeMod = 1.0 - bristleAmp * (0.6 + 0.4 * edgeNoise) * (0.5 + edgeNoise2);\n\n // Width profile along the stroke\n float shape = strokeShape(along1, shapeType);\n float halfWNow = halfW * shape * edgeMod;\n\n // Inside-segment coverage\n float cov = 0.0;\n if (along1 >= 0.0 && along1 <= 1.0 && halfWNow > 1e-6) {\n float cn = abs(cross1) / halfWNow;\n // fwidth-derived AA: half-width from the field's screen-space gradient so the\n // edge holds ~1px regardless of zoom/DPR (mirrors metaball.frag.ts:252-255).\n float aaC = max(fwidth(cn), 1e-6);\n cov = 1.0 - smoothstep(1.0 - aaC, 1.0 + aaC, cn);\n }\n\n // End-cap blobs (rounded tips, not perpendicular cuts)\n float capA = 0.0, capB = 0.0;\n {\n vec2 capCenterA = a + norm * (bulge * 0.0); // at a\n vec2 capCenterB = a + tang * L + norm * bend * 0.0 + norm * 0.0; // at b; bend is 0 at endpoints\n capCenterB = b;\n float endShapeA = strokeShape(0.02, shapeType);\n float endShapeB = strokeShape(0.98, shapeType);\n float rA = halfW * endShapeA * (0.9 + 0.2 * fbm(vec2(streakSeed * 13.0)));\n float rB = halfW * endShapeB * (0.9 + 0.2 * fbm(vec2(streakSeed * 19.0 + 5.0)));\n float dA = length(p - capCenterA);\n float dB = length(p - capCenterB);\n // fwidth-derived AA on the clean Euclidean cap distances (mirrors metaball.frag.ts:252-255).\n float aaA = max(fwidth(dA), 1e-6);\n float aaB = max(fwidth(dB), 1e-6);\n capA = 1.0 - smoothstep(rA - aaA, rA + aaA, dA);\n capB = 1.0 - smoothstep(rB - aaB, rB + aaB, dB);\n // Only apply caps if we're BEYOND the segment; otherwise the segment wins.\n capA *= (along1 < 0.05) ? 1.0 : 0.0;\n capB *= (along1 > 0.95) ? 1.0 : 0.0;\n }\n\n float coverage = max(cov, max(capA, capB));\n if (coverage < 0.002) return noHit();\n\n // Edge distance (for impasto later): 0 at edge, 1 at spine\n float edgeDist = halfWNow > 1e-6 ? clamp(1.0 - abs(cross1) / halfWNow, 0.0, 1.0) : 0.0;\n\n return StrokeHit(\n coverage,\n colAtMid,\n clamp(along1, 0.0, 1.0),\n halfWNow > 1e-6 ? cross1 / halfWNow : 0.0,\n edgeDist\n );\n}\n\n// Composite stroke over col with internal streaking + impasto edge highlight.\n// streakAmp \u2014 0..0.2 how much internal streaks darken/lighten\n// impastoAmp \u2014 0..1 edge catch-light strength\n// hardness \u2014 0..1 how crisp the compositing transition is (1 = razor, 0 = creamy)\nvoid paintOver(inout vec3 col, StrokeHit s, float streakFreq, float streakAmp,\n float impastoAmp, float hardness, float streakSeed) {\n if (s.coverage < 0.002) return;\n float strokeOpacity = clamp(uStrokeAmount, 0.0, 1.0);\n if (strokeOpacity <= 0.001) return;\n vec3 c = s.color;\n\n // Internal streaks \u2014 fbm along spine, modulated by cross position. Gives\n // the loaded-brush look: some bristles carry more pigment than others.\n float streakA = fbm(vec2(s.alongT * streakFreq, s.crossN * 2.7 + streakSeed));\n float streakB = fbm(vec2(s.alongT * streakFreq * 0.6 + streakSeed * 3.7, s.crossN * 4.1));\n float streak = 0.6 * (streakA - 0.5) + 0.4 * (streakB - 0.5);\n c *= 1.0 + streak * streakAmp * 2.0;\n\n // Subtle value variance across width (hollow-center catch-light)\n float crossShade = smoothstep(0.0, 0.4, s.edgeN) * (1.0 - smoothstep(0.65, 1.0, s.edgeN));\n c *= 1.0 + crossShade * 0.05;\n\n // Impasto edge highlight \u2014 bright rim on one side of the stroke\n float rim = smoothstep(0.85, 1.0, 1.0 - s.edgeN) * step(0.0, s.crossN);\n c += impastoAmp * rim * vec3(0.18, 0.15, 0.11);\n // Shadow on the other side (darker, cooler)\n float shadow = smoothstep(0.85, 1.0, 1.0 - s.edgeN) * step(0.0, -s.crossN);\n c -= impastoAmp * shadow * 0.25 * vec3(0.10, 0.09, 0.07);\n\n float softLimit = mix(0.35, 0.98, hardness);\n float alpha = smoothstep(0.0, 1.0 - softLimit, s.coverage) * strokeOpacity;\n col = mix(col, c, alpha);\n}\n\n// Best-of-9-neighbor placement: sample 3x3 surrounding cells and take the\n// stroke that covers this pixel most. Breaks the grid by per-cell jitter and\n// sparse density via noise thresholding.\nStrokeHit bestOil(vec2 p, float cellSize, float lenMul, float halfWMul,\n float jitterAmt, float density, int shapeType,\n float bristleAmp, vec2 flow, float t, float seed) {\n vec2 cell = floor(p / cellSize);\n\n StrokeHit best = noHit();\n // 3x3 neighborhood\n for (int dy = -1; dy <= 1; dy++) {\n for (int dx = -1; dx <= 1; dx++) {\n vec2 cc = cell + vec2(float(dx), float(dy));\n vec2 hh = hash22(cc + seed) - 0.5;\n // Density gate \u2014 noise threshold; sparse placement.\n float gate = hash21(cc * 1.7 + seed * 0.3);\n if (gate > density) continue;\n\n vec2 center = (cc + 0.5 + hh * jitterAmt) * cellSize;\n\n // Per-stroke direction: consume the layer-provided flow, then add only\n // deterministic local perturbation so alternate stroke layers stay live.\n vec2 f = safeDir(flow);\n float angJ = (hash21(cc + seed + 11.0) - 0.5) * 0.9; // +/- 0.45 rad\n float localCurl = (fbm(center * (2.6 + seed * 0.11) + seed * 1.9) - 0.5) * 0.55 * uFlowCurl;\n vec2 dir = rotateDir(f, angJ + localCurl);\n\n float lenV = cellSize * lenMul * (0.65 + 0.55 * hash21(cc + seed + 23.0));\n float halfW = cellSize * halfWMul * (0.70 + 0.55 * hash21(cc + seed + 41.0));\n float bulge = (hash21(cc + seed + 53.0) - 0.5) * lenV * 0.35;\n\n vec2 a = center - dir * (lenV * 0.5);\n vec2 b = center + dir * (lenV * 0.5);\n\n vec3 colMid = brokenColorJitter(\n sampleBase(center, t),\n hash21(cc + seed + 89.0),\n hash21(cc * 2.3 + seed + 97.0),\n 1.0\n );\n\n StrokeHit h = curvedStroke(p, a, b, halfW, bulge, shapeType,\n 7.0, bristleAmp,\n hash21(cc + seed + 67.0), colMid);\n if (h.coverage > best.coverage) best = h;\n }\n }\n return best;\n}\n";
@@ -0,0 +1 @@
1
+ export declare const AURORA_COMPOSITION_GLSL = "// \u2500\u2500 Palette LUT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvec3 samplePalette(float id) {\n id = clamp(id, 0.0, 1.0);\n float scaled = id * float(uStopCount - 1);\n int i0 = int(floor(scaled));\n int i1 = min(i0 + 1, uStopCount - 1);\n float t = fract(scaled);\n t = smoothstep(0.0, 1.0, t);\n return mix(uPalette[i0], uPalette[i1], t);\n}\n\n// \u2500\u2500 Nuclei field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvoid nucleiField(vec2 p, float t, out float paletteId, out float valueMod) {\n float accumBias = 0.0;\n float accumValue = 0.0;\n float accumW = 0.0;\n for (int i = 0; i < MAX_NUCLEI; i++) {\n if (i >= uNucleiCount) break;\n vec2 posI = uNucleiPos[i]\n + uNucleiDriftRadius[i] * vec2(\n cos(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i]),\n sin(t * uNucleiDrift * K_NUCLEI + uNucleiDriftPhase[i] * 1.13)\n );\n vec2 diff = p - posI;\n // Anisotropic Gaussian: rotate diff into the nucleus's local frame\n // (major axis along uNucleiAngle), then scale the major-axis component by\n // 1/elongation so the squared distance describes an ellipse. Defaults\n // 1.0/0.0 reduce to the isotropic dot(diff, diff).\n float ca = cos(uNucleiAngle[i]);\n float sa = sin(uNucleiAngle[i]);\n vec2 local = vec2( ca * diff.x + sa * diff.y,\n -sa * diff.x + ca * diff.y);\n float along = local.x / max(uNucleiElong[i], 0.01);\n float across = local.y;\n float d2 = along * along + across * across;\n float r = max(uNucleiRadius[i], 0.01);\n float w = exp(-uSoftmaxBeta * d2 / (r * r));\n accumBias += w * uNucleiPaletteBias[i];\n accumValue += w * uNucleiValueBias[i];\n accumW += w;\n }\n paletteId = accumBias / max(accumW, 1e-4);\n valueMod = accumValue / max(accumW, 1e-4);\n\n // Palette drift \u2014 slow global paletteId breathe between adjacent stops. The\n // rate rides K_PAL (perceptible ~30\u201360s hue cycle at the default coefficient);\n // the amplitude lifts the authored coefficient into a 0.03..0.06 paletteId band\n // so the palette visibly travels rather than dithering within one stop.\n float palAmp = clamp(uPaletteDrift * 6.0, 0.0, 0.06);\n paletteId += palAmp * sin(t * uPaletteDrift * K_PAL);\n paletteId = clamp(paletteId, 0.0, 1.0);\n}\n";
@@ -0,0 +1 @@
1
+ export declare const AURORA_FLOW_GLSL = "// \u2500\u2500 Flow field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvec2 flowField(vec2 p, float t) {\n vec2 dir = vec2(1.0, 0.0);\n if (uFlowPattern == 1) {\n // radial\n dir = normalize(p - uFlowFocal + 1e-4);\n } else if (uFlowPattern == 2) {\n // swirl \u2014 tangent to radial\n vec2 rad = normalize(p - uFlowFocal + 1e-4);\n dir = vec2(-rad.y, rad.x);\n } else if (uFlowPattern == 3) {\n // diagonal\n float a = radians(uFlowAngle);\n dir = vec2(cos(a), sin(a));\n } else if (uFlowPattern == 4) {\n // multi \u2014 curl-noise driven\n float n = fbm(p * 2.0 + t * 0.02);\n float a = n * 6.2831;\n dir = vec2(cos(a), sin(a));\n }\n // curl \u2014 perturb by noise. Radial gets much less curl so rays stay clean.\n if (uFlowCurl > 0.0) {\n float n = fbm(p * 3.0) - 0.5;\n float curlAmt = uFlowCurl;\n if (uFlowPattern == 1) curlAmt *= 0.25; // radial: preserve ray clarity\n if (uFlowPattern == 2) curlAmt *= 0.55; // swirl: allow moderate curl\n float a = atan(dir.y, dir.x) + n * 3.14159 * curlAmt;\n dir = vec2(cos(a), sin(a));\n }\n // cursor influence \u2014 swirl around the cursor position\n if (uCursorStrength > 0.001) {\n vec2 toCur = uCursor - p;\n float d = length(toCur);\n float r = max(uCursorRadius, 0.01);\n float w = exp(-(d * d) / (r * r * 0.5));\n // swirl tangent\n vec2 tangent = vec2(-toCur.y, toCur.x) / max(d, 1e-4);\n float a0 = atan(dir.y, dir.x);\n float a1 = atan(tangent.y, tangent.x);\n // blend angle\n float da = a1 - a0;\n da = atan(sin(da), cos(da)); // wrap to [-pi, pi]\n float a = a0 + da * w * uCursorStrength;\n dir = vec2(cos(a), sin(a));\n }\n return dir;\n}\n";
@@ -0,0 +1,2 @@
1
+ export declare const AURORA_MEDIUMS_PRE_BRUSH_GLSL = "// \u2500\u2500 Medium overlays \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n// A quick re-computation of base color for edge-mask sampling\nvec3 sampleBase(vec2 p, float t) {\n vec2 pw = domainWarp(p, t);\n float id; float vm;\n nucleiField(pw, t, id, vm);\n vec3 c = samplePalette(id);\n c *= 1.0 + uValueVariance * vm;\n return c;\n}\n\nvec3 mediumWatercolor(vec3 col, vec2 p, float t) {\n // Wet-edge cauliflowers via luma-gradient magnitude\n float eps = 0.004;\n vec3 cx1 = sampleBase(p + vec2(eps, 0.0), t);\n vec3 cx2 = sampleBase(p - vec2(eps, 0.0), t);\n vec3 cy1 = sampleBase(p + vec2(0.0, eps), t);\n vec3 cy2 = sampleBase(p - vec2(0.0, eps), t);\n float gx = dot(cx1 - cx2, W_LUMA);\n float gy = dot(cy1 - cy2, W_LUMA);\n float edge = sqrt(gx * gx + gy * gy) / (2.0 * eps);\n float mask = smoothstep(0.0, 2.5, edge);\n col *= mix(1.0, 0.78, mask * uWetEdge);\n\n // Granulation \u2014 pigment settles in paper tooth\n float paper = 0.5 * vnoise(p * 160.0) + 0.5 * vnoise(p * 360.0);\n float pigLoad = 1.0 - dot(col, W_LUMA);\n col *= 1.0 - uGranulation * pigLoad * (paper - 0.5);\n\n // Wash banding \u2014 faint horizontal wet gradient\n float band = fbm(vec2(p.x * 1.5, p.y * 0.4));\n col *= 1.0 + 0.04 * (band - 0.5);\n return col;\n}\n\nvec3 mediumPastel(vec3 col, vec2 p, float t) {\n vec2 flow = flowField(p, t);\n vec2 perp = vec2(-flow.y, flow.x);\n float along = dot(p, flow) * uStrokeScale;\n float across = dot(p, perp) * uStrokeScale;\n across += 0.03 * (vnoise(p * 260.0) - 0.5);\n\n float aniso = mix(1.0, 0.18, uStrokeAnisotropy);\n float stroke = fbm(vec2(along * aniso, across));\n col *= mix(1.0, 0.82 + 0.32 * stroke, uStrokeAmount);\n\n // Pastel tooth \u2014 tiny high-frequency grain\n float tooth = vnoise(p * 800.0);\n col *= 1.0 - 0.08 * uStrokeAmount * (tooth - 0.5);\n return col;\n}\n";
2
+ export declare const AURORA_MEDIUMS_POST_BRUSH_GLSL = "// \u2500\u2500 Crayon / oil-pastel \u2014 paper tooth \u00D7 wax pigment (PEER medium) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Crayon is not strokes. It's pigment crumbs dragged across paper tooth.\n// Model: heavy 2D tooth noise at multiple scales, anisotropically stretched\n// along flow direction, multiplied into the base color. Add a slow \"waxy\n// film\" that slightly unifies hues, and occasional darker \"pressed\" spots\n// where the crayon dug in. NO straight segments. Dispatched at main() level as\n// a peer of pastel/watercolor/oil \u2014 never a branch inside mediumOil().\nvec3 mediumCrayon(vec3 col, vec2 p, float t) {\n vec2 flow = flowField(p, t);\n float ang = atan(flow.y, flow.x);\n float ca = cos(-ang), sa = sin(-ang);\n vec2 pr = vec2(p.x * ca - p.y * sa, p.x * sa + p.y * ca);\n\n // Anisotropic tooth \u2014 squished along flow, coarse cross flow.\n float aniso = mix(0.45, 0.95, uStrokeAnisotropy);\n float scale = max(uStrokeScale * 1.6, 180.0);\n\n float t1 = vnoise(vec2(pr.x * scale * aniso, pr.y * scale));\n float t2 = vnoise(vec2(pr.x * scale * aniso * 0.4, pr.y * scale * 0.4) + 11.0);\n float t3 = vnoise(vec2(pr.x * scale * aniso * 2.1, pr.y * scale * 2.1) + 23.0);\n float tooth = 0.55 * t1 + 0.30 * t2 + 0.15 * t3;\n // Center at 0, amplify\n tooth = (tooth - 0.5) * 1.4;\n\n // Multiplicative darkening where tooth is low (pigment skipped paper valleys)\n float lay = 1.0 + tooth * 0.32 * uStrokeAmount;\n vec3 result = col * lay;\n\n // Occasional pressed-in crumbs \u2014 rare darker crumbs\n float crumbs = smoothstep(0.78, 0.95, vnoise(pr * scale * 3.0));\n result *= 1.0 - crumbs * 0.18 * uStrokeAmount;\n\n // Waxy highlight film \u2014 slight lightening on tooth peaks\n float waxy = smoothstep(0.55, 0.85, t1);\n result += waxy * 0.04 * vec3(1.0);\n\n // Paper tooth overlay (subtler than oil's canvas)\n float paperTooth = vnoise(p * 340.0) - 0.5;\n result *= 1.0 + paperTooth * 0.14 * uCanvasGrain;\n\n // Broken-color pigment: stable wax/pigment patches, not temporal flicker.\n vec2 pigmentCell = floor(pr * max(scale * 0.18, 32.0));\n float pigmentMask = smoothstep(0.28, 0.82, vnoise(pr * scale * 0.21 + 19.0));\n result = brokenColorJitter(\n result,\n hash21(pigmentCell + 17.0),\n hash21(pigmentCell * 2.1 + 31.0),\n 0.45 + 0.55 * pigmentMask\n );\n\n // Crayon is saturation-amplified\n result = saturate3(result, 1.12);\n\n return result;\n}\n\nvec3 mediumOil(vec3 col, vec2 p, float t) {\n // Mode knobs (uStrokeMode) \u2014 oil-stroke modes ONLY (crayon is a peer medium,\n // uMedium==4, dispatched at main()):\n // 0 oil \u2014 balanced modern-abstract/palette-knife hybrid\n // 1 knife \u2014 palette-knife impasto: razor edges, heavy bristle/shadow\n // 3 brushwork \u2014 thick bristle brush\n int mode = uStrokeMode;\n\n // Per-mode parameters\n int shapeType = 0; // tapered\n float bristleAmp = 0.25; // 0..0.5\n float streakFreq = 9.0;\n float streakAmp = 0.09;\n float impastoAmp = 0.9;\n float hardness = 0.80; // edge compositing\n float toothScale = 240.0;\n float toothAmp = 0.09;\n float pigmentSat = 1.03;\n float densityBig = 0.65;\n float densityMed = 0.78;\n float densitySml = 0.90;\n\n if (mode == 1) { // palette knife\n shapeType = 3; // flat, even\n bristleAmp = 0.12;\n streakFreq = 4.0; streakAmp = 0.05;\n impastoAmp = 1.6;\n hardness = 0.95;\n toothAmp = 0.04;\n densityBig = 0.80; densityMed = 0.88; densitySml = 0.70;\n } else if (mode == 3) { // thick brushwork\n shapeType = 0; // tapered\n bristleAmp = 0.32;\n streakFreq = 14.0; streakAmp = 0.14;\n impastoAmp = 1.2;\n hardness = 0.85;\n toothAmp = 0.07;\n }\n\n // Scales & multipliers from uniforms\n float baseScale = max(uStrokeScale * 0.006, 0.008);\n // Three layers: big gestural, medium body, small dabs\n float sBig = baseScale * 2.4;\n float sMed = baseScale * 1.1;\n float sSml = baseScale * 0.45;\n\n float lenMulBig = mix(2.2, 3.8, uStrokeAnisotropy);\n float widMulBig = mix(0.55, 0.32, uStrokeAnisotropy);\n float lenMulMed = mix(2.0, 3.4, uStrokeAnisotropy);\n float widMulMed = mix(0.50, 0.30, uStrokeAnisotropy);\n float lenMulSml = mix(1.6, 2.6, uStrokeAnisotropy);\n float widMulSml = mix(0.45, 0.32, uStrokeAnisotropy);\n\n float jitterAmt = 0.75; // large jitter \u2014 no grid\n vec2 flow = flowField(p, t);\n\n vec3 result = col;\n\n // Layer 1 \u2014 big gestural strokes (sparse, shaping)\n StrokeHit hBig = bestOil(p, sBig, lenMulBig, widMulBig, jitterAmt * 0.55,\n densityBig, shapeType, bristleAmp, flow, t, 1.3);\n paintOver(result, hBig, streakFreq * 0.7, streakAmp,\n uImpasto * impastoAmp * uStrokeAmount, hardness, 1.3);\n\n // Layer 2 \u2014 medium body strokes\n StrokeHit hMed = bestOil(p + vec2(11.3, 3.7), sMed, lenMulMed, widMulMed,\n jitterAmt, densityMed, shapeType, bristleAmp, flow, t, 2.7);\n paintOver(result, hMed, streakFreq, streakAmp,\n uImpasto * impastoAmp * uStrokeAmount, hardness, 2.7);\n\n // Layer 3 \u2014 small dabs (more frequent, smaller)\n int smlShape = (mode == 1) ? 2 : shapeType; // knife uses dabs for sparkle\n StrokeHit hSml = bestOil(p + vec2(-5.1, 8.4), sSml, lenMulSml, widMulSml,\n jitterAmt * 1.3, densitySml, smlShape,\n bristleAmp * 0.85, flow, t, 4.1);\n paintOver(result, hSml, streakFreq * 1.4, streakAmp * 0.8,\n uImpasto * impastoAmp * 0.65 * uStrokeAmount, hardness, 4.1);\n\n // Layer 4 \u2014 fill dabs (very dense, very small) \u2014 covers bald spots\n float sFill = baseScale * 0.22;\n float lenMulFill = mix(1.4, 2.0, uStrokeAnisotropy);\n float widMulFill = mix(0.50, 0.38, uStrokeAnisotropy);\n int fillShape = (mode == 1) ? 3 : 2; // knife=even, others=dab (round fills)\n StrokeHit hFill = bestOil(p + vec2(3.9, -6.2), sFill, lenMulFill, widMulFill,\n jitterAmt * 1.5, 0.95, fillShape,\n bristleAmp * 0.6, flow, t, 8.9);\n paintOver(result, hFill, streakFreq * 1.8, streakAmp * 0.6,\n uImpasto * impastoAmp * 0.4 * uStrokeAmount, hardness * 0.9, 8.9);\n\n // Optional crosshatch layer\n if (uStrokeLayers == 2) {\n vec2 flow2 = vec2(-flow.y, flow.x);\n StrokeHit hX = bestOil(p + vec2(7.3, -2.1), sMed, lenMulMed * 0.9, widMulMed,\n jitterAmt, densityMed * 0.7, shapeType, bristleAmp, flow2, t, 6.5);\n paintOver(result, hX, streakFreq, streakAmp * 0.85,\n uImpasto * impastoAmp * 0.55 * uStrokeAmount, hardness, 6.5);\n }\n\n // Canvas tooth \u2014 linen weave\n float tooth1 = vnoise(p * toothScale);\n float tooth2 = vnoise(p * toothScale * vec2(0.6, 2.4) + 37.0);\n float tooth = (0.6 * tooth1 + 0.4 * tooth2) - 0.5;\n result *= 1.0 + tooth * toothAmp * uCanvasGrain;\n\n // Pigment saturation boost\n result = saturate3(result, pigmentSat);\n\n return result;\n}";
@@ -0,0 +1 @@
1
+ export declare const AURORA_TONEMAP_GLSL = "// ACES approximation\nvec3 aces(vec3 x) {\n float a = 2.51;\n float b = 0.03;\n float c = 2.43;\n float d = 0.59;\n float e = 0.14;\n return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0);\n}\n";
@@ -1,9 +1,10 @@
1
1
  export { default as Aurora } from "./Aurora.vue";
2
- export { resolveRenderMode, type AuroraRenderMode } from "./renderMode";
2
+ export { resolveRenderMode, type AuroraRenderMode } from "./constants/renderMode";
3
3
  export { useAurora } from "./composables/useAurora";
4
4
  export type { UseAuroraReturn } from "./composables/useAurora";
5
5
  export { useCursorInteraction } from "./composables/useCursorInteraction";
6
6
  export { createAurora } from "./composables/runtime";
7
7
  export type { AuroraRuntimeMode, AuroraRuntimeOptions } from "./composables/runtime";
8
- export { DEFAULT_AURORA_CONFIG, MAX_NUCLEI, MAX_STOPS, type AuroraConfig, type AuroraCursorApi, type AuroraFlow, type AuroraInstance, type AuroraMedium, type AuroraNucleus, type FlowPattern, type OklchStop, type StrokeMode, type WarpMode, } from "./presets";
9
- export { cssToOklch, flattenPalette, hexToOklchStop, oklchStopToHex, oklchToLinear, paletteToCssGradient, } from "./composables/color";
8
+ export { DEFAULT_AURORA_CONFIG, MAX_NUCLEI, MAX_STOPS, type AuroraConfig, type AuroraCursorApi, type AuroraFlow, type AuroraInstance, type AuroraMedium, type AuroraNucleus, type FlowPattern, type OklchStop, type StrokeMode, type WarpMode, } from "./constants/presets";
9
+ export { cssToOklch, deriveAurora, flattenPalette, hexToOklchStop, oklchStopToHex, oklchToLinear, paletteToCssGradient, } from "./composables/color";
10
+ export type { AuroraHarmony, DeriveAuroraOptions } from "./composables/color";
@@ -13,6 +13,16 @@ import { type ConfiguratorDensity } from "./density";
13
13
  * overflow.
14
14
  */
15
15
  export type ConfiguratorScrollMode = "auto" | "always" | "never";
16
+ /**
17
+ * Which side the aside (preset row + controls) sits on at `lg`+ width.
18
+ *
19
+ * `right` (default) is the inspector idiom — stage left, controls right.
20
+ * `left` is a reversible, taste-level flip: the aside renders on the
21
+ * left while DOM/tab order stays stage→aside (the flip is grid-column
22
+ * placement + border-side only, no source reorder — no a11y regression).
23
+ * Below `lg` the layout is a single column and the side has no meaning.
24
+ */
25
+ export type ConfiguratorAsideSide = "left" | "right";
16
26
  /**
17
27
  * Generic preset descriptor. Consumers pass `T` as the live config shape.
18
28
  * The primitive carries no preset semantics beyond `key + label` for
@@ -51,6 +61,22 @@ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_se
51
61
  * `gap-1.5 py-2` recipe exactly.
52
62
  */
53
63
  density?: ConfiguratorDensity;
64
+ /**
65
+ * Which side the aside sits on at `lg`+ width. Default `"right"`
66
+ * (the inspector idiom). `"left"` flips the visual column via
67
+ * grid-column placement + border-side swap only — DOM/tab order
68
+ * stays stage→aside. No effect below `lg` (single-column).
69
+ */
70
+ asideSide?: ConfiguratorAsideSide;
71
+ /**
72
+ * Aside width band at `lg`+ width, as a CSS length pair driving
73
+ * `minmax(--configurator-aside-min, --configurator-aside-max)`. The
74
+ * prop sets the two inline custom properties; consumers may instead
75
+ * (or also) set `--configurator-aside-min` / `--configurator-aside-max`
76
+ * via the cascade. Default band is `280px`/`360px`. Pass a single
77
+ * length to pin the band (`min === max`), or a `[min, max]` pair.
78
+ */
79
+ asideWidth?: string | readonly [min: string, max: string];
54
80
  /** Optional outer container override. */
55
81
  class?: HTMLAttributes["class"];
56
82
  } & {
@@ -38,25 +38,32 @@ type __VLS_Props = {
38
38
  sub?: string;
39
39
  /** Optional id used by external state (e.g., a sibling tab row). */
40
40
  id?: string;
41
- /** Controlled open state. Pair with `@update:open`. */
42
- open?: boolean;
43
41
  /** Uncontrolled initial state. */
44
42
  defaultOpen?: boolean;
43
+ /**
44
+ * Opt-in inter-row hairline. When set, sibling rows inside the body
45
+ * are separated by a `border-border/30` top rule (the first row stays
46
+ * flush). Default `false` keeps the body gap-only (pre-AU.W9 visual).
47
+ */
48
+ dividers?: boolean;
45
49
  class?: HTMLAttributes["class"];
46
50
  /** Body wrapper class override. */
47
51
  bodyClass?: HTMLAttributes["class"];
48
52
  };
53
+ type __VLS_ModelProps = {
54
+ "open"?: boolean | undefined;
55
+ };
56
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
49
57
  declare var __VLS_6: {};
50
58
  type __VLS_Slots = {} & {
51
59
  default?: (props: typeof __VLS_6) => any;
52
60
  };
53
- declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
54
- "update:open": (value: boolean) => any;
55
- }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
56
- "onUpdate:open"?: ((value: boolean) => any) | undefined;
61
+ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
62
+ "update:open": (value: boolean | undefined) => any;
63
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
64
+ "onUpdate:open"?: ((value: boolean | undefined) => any) | undefined;
57
65
  }>, {
58
66
  defaultOpen: boolean;
59
- open: boolean;
60
67
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
61
68
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
62
69
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,4 @@
1
- import { type ComputedRef, type InjectionKey } from "vue";
1
+ import type { ComputedRef } from "vue";
2
2
  /**
3
3
  * Density axis for `<Configurator>` + `<ConfiguratorRow>` (N.W2 Lane A).
4
4
  *
@@ -15,16 +15,11 @@ import { type ComputedRef, type InjectionKey } from "vue";
15
15
  * for-bit preserved.
16
16
  */
17
17
  export type ConfiguratorDensity = "mobile" | "compact" | "comfortable" | "spacious";
18
- /**
19
- * Provide / inject key for the cascading density value. Carries a
20
- * `ComputedRef<ConfiguratorDensity>` so descendants stay reactive when
21
- * the host swaps density (e.g., viewport-driven mobile/desktop branch).
22
- */
23
- export declare const CONFIGURATOR_DENSITY_KEY: InjectionKey<ComputedRef<ConfiguratorDensity>>;
18
+ export declare const CONFIGURATOR_DENSITY_KEY: import("vue").InjectionKey<ComputedRef<ConfiguratorDensity>>;
24
19
  export declare function provideConfiguratorDensity(density: ComputedRef<ConfiguratorDensity>): void;
25
20
  /**
26
21
  * Befitting silent default — returns `null` when there is no ancestor
27
22
  * `<Configurator>`. The consumer null-coalesces to `undefined` so the
28
23
  * `:data-density` binding emits no attribute (pre-N.W2 visual preserved).
29
24
  */
30
- export declare function useOptionalConfiguratorDensity(): ComputedRef<ConfiguratorDensity> | null;
25
+ export declare const useOptionalConfiguratorDensity: () => ComputedRef<ConfiguratorDensity> | null;
@@ -1,6 +1,6 @@
1
1
  export { default as Configurator } from "./Configurator.vue";
2
2
  export { default as ConfiguratorLayer } from "./ConfiguratorLayer.vue";
3
3
  export { default as ConfiguratorRow } from "./ConfiguratorRow.vue";
4
- export type { ConfiguratorPreset, ConfiguratorScrollMode, } from "./Configurator.vue";
4
+ export type { ConfiguratorAsideSide, ConfiguratorPreset, ConfiguratorScrollMode, } from "./Configurator.vue";
5
5
  export { CONFIGURATOR_DENSITY_KEY, provideConfiguratorDensity, useOptionalConfiguratorDensity, type ConfiguratorDensity, } from "./density";
6
6
  export { useConfiguratorState, type ConfiguratorCloneMode, type ConfiguratorState, type ConfiguratorStateOptions, } from "./useConfiguratorState";
@@ -0,0 +1,46 @@
1
+ /**
2
+ * <DockBackgroundToggle> — the WCAG 2.2.2 (Pause, Stop, Hide), Level A pause/play
3
+ * control for a continuously-running AV background (Aurora / GooBlob).
4
+ *
5
+ * WCAG 2.2.2 is OBLIGATORY for any auto-starting, >5s, non-essential motion and
6
+ * the control must be available to ALL users — it is NOT gated behind
7
+ * `prefers-reduced-motion` (which the substrate handles separately via the G1
8
+ * freeze). This is the USER-driven stop control any user can reach.
9
+ *
10
+ * Binding contract (KISS — it binds an EXISTING renderer seam, adds no parallel
11
+ * pause path): the consumer holds the paused state and wires it to the renderer's
12
+ * `pause()`/`resume()`. The toggle is a thin `v-model:paused` control over a
13
+ * `<DockIconButton>` host (the dock is the natural home for a background control):
14
+ *
15
+ * ```vue
16
+ * <script setup>
17
+ * const blob = ref<InstanceType<typeof GooBlob>>();
18
+ * const paused = ref(false);
19
+ * watch(paused, (p) => (p ? blob.value?.pause() : blob.value?.resume()));
20
+ * <\/script>
21
+ * <DockBackgroundToggle v-model:paused="paused" />
22
+ * ```
23
+ *
24
+ * The control reflects state via `aria-pressed` (pressed ⇒ paused) and swaps the
25
+ * Pause↔Play glyph + the accessible label, so a screen reader announces both the
26
+ * action and the current state.
27
+ */
28
+ type __VLS_Props = {
29
+ /** Whether the background is currently paused (the controlled state). */
30
+ paused?: boolean;
31
+ /** Accessible label when RUNNING (the action: pause). */
32
+ pauseLabel?: string;
33
+ /** Accessible label when PAUSED (the action: play/resume). */
34
+ playLabel?: string;
35
+ };
36
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
37
+ "update:paused": (value: boolean) => any;
38
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
39
+ "onUpdate:paused"?: ((value: boolean) => any) | undefined;
40
+ }>, {
41
+ paused: boolean;
42
+ pauseLabel: string;
43
+ playLabel: string;
44
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
45
+ declare const _default: typeof __VLS_export;
46
+ export default _default;
@@ -1,23 +1,34 @@
1
- import { type ButtonHTMLAttributes, type HTMLAttributes } from "vue";
1
+ import { type ButtonHTMLAttributes, type Component, type HTMLAttributes } from "vue";
2
2
  /**
3
3
  * <DockIconButton> — fixed-square icon button for use inside GlassDock.
4
4
  *
5
5
  * Emits the dock icon-button class contract. Interactive styling is owned by
6
6
  * src/styles/dock.css so all dock controls share one public style authority.
7
+ *
8
+ * Use `as`/`as-child` to render as a <RouterLink> or <a> without a wrapper:
9
+ * `as="a"` swaps the host tag, `as-child` merges the dock class onto a slotted
10
+ * child (the reka-ui Primitive idiom). `type` is emitted only on a <button>
11
+ * host (an anchor/RouterLink carries no `type`).
7
12
  */
8
13
  type __VLS_Props = {
9
14
  /** Compact variant: auto-sized instead of fixed 2.5rem square. */
10
15
  compact?: boolean;
11
16
  /** Button type attribute (default: "button" to prevent form submission). */
12
17
  type?: ButtonHTMLAttributes["type"];
18
+ /** Host tag/component (reka-ui Primitive `as`; default "button"). */
19
+ as?: string | Component;
20
+ /** Merge props onto a slotted child instead of rendering a host tag. */
21
+ asChild?: boolean;
13
22
  class?: HTMLAttributes["class"];
14
23
  };
15
- declare var __VLS_1: {};
24
+ declare var __VLS_10: {};
16
25
  type __VLS_Slots = {} & {
17
- default?: (props: typeof __VLS_1) => any;
26
+ default?: (props: typeof __VLS_10) => any;
18
27
  };
19
28
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
20
- type: "button" | "reset" | "submit";
29
+ type: "button" | "submit" | "reset";
30
+ asChild: boolean;
31
+ as: string | Component;
21
32
  compact: boolean;
22
33
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
23
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -21,9 +21,9 @@ type __VLS_ModelProps = {
21
21
  "active": string;
22
22
  };
23
23
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
24
- declare var __VLS_6: {};
24
+ declare var __VLS_32: {};
25
25
  type __VLS_Slots = {} & {
26
- default?: (props: typeof __VLS_6) => any;
26
+ default?: (props: typeof __VLS_32) => any;
27
27
  };
28
28
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
29
29
  "update:active": (value: string) => any;