@mkbabb/glass-ui 3.10.1 → 3.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/dist/{CardAction-DrAcAV4d.js → CardAction-DuArVky-.js} +2 -2
  2. package/dist/{CommandShortcut-mV2e1aG6.js → CommandShortcut-CefCj5mt.js} +2 -2
  3. package/dist/{DataTable-C3E6jZ5B.js → DataTable-CUHMukiQ.js} +2 -2
  4. package/dist/DeckProgress-Dmk4_AKN.js +23 -0
  5. package/dist/{DialogContent-BxaaafFi.js → DialogContent-BRkT1cjP.js} +1 -1
  6. package/dist/{HoverPopover-CDA_SaCe.js → HoverPopover-2LOIW34a.js} +1 -1
  7. package/dist/InstrumentRail-CUJ05YVG.js +44 -0
  8. package/dist/{MetricBadge-idgrkqoP.js → MetricBadge-BZVWIxNy.js} +7 -5
  9. package/dist/{Notification-Cu0nN17_.js → Notification-DLMhblXR.js} +1 -1
  10. package/dist/{NumberFieldContent-CHEWghnY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  11. package/dist/{PopoverContent-DpUvdYY-.js → PopoverContent-BId6ggf_.js} +1 -1
  12. package/dist/{Progress-BW-StFw2.js → Progress-iEuD9pxG.js} +1 -1
  13. package/dist/{ScrollingText-DruYCni_.js → ScrollingText-BPP84wKo.js} +1 -1
  14. package/dist/{SelectScrollDownButton-pirzjm--.js → SelectScrollDownButton-T32cVFeM.js} +3 -3
  15. package/dist/{Switch-DeAqg6pi.js → Switch-Ch-k3Rv-.js} +1 -1
  16. package/dist/{TabsList-BAVzOZpg.js → TabsList-B8CVOQPC.js} +2 -2
  17. package/dist/{Toaster-CvuuW_y9.js → Toaster-1rYWrmAm.js} +46 -49
  18. package/dist/{ToggleGroupItem-DtD37b4G.js → ToggleGroupItem-COu_4IW4.js} +21 -17
  19. package/dist/animated-digit.js +2 -2
  20. package/dist/api/index.d.ts +5 -4
  21. package/dist/api.js +2 -2
  22. package/dist/aurora.js +70 -70
  23. package/dist/{badge-NdCQMvvB.js → badge-CaoFJzRb.js} +1 -1
  24. package/dist/badge.js +1 -1
  25. package/dist/{button-DyiWFAOE.js → button-DN39cGqL.js} +12 -12
  26. package/dist/button.js +1 -1
  27. package/dist/canvas.js +2 -2
  28. package/dist/card.js +1 -1
  29. package/dist/carousel.js +5 -5
  30. package/dist/collapsible.js +1 -1
  31. package/dist/{color-B65wWyQz.js → color-C5ls_QF7.js} +7 -9
  32. package/dist/color.js +1 -1
  33. package/dist/command.js +1 -1
  34. package/dist/components/custom/aurora/constants/presets.d.ts +62 -5
  35. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
  36. package/dist/components/custom/aurora/index.d.ts +1 -1
  37. package/dist/components/custom/constellation/Constellation.vue.d.ts +0 -12
  38. package/dist/components/custom/constellation/constellationField.d.ts +151 -10
  39. package/dist/components/custom/constellation/index.d.ts +1 -3
  40. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +0 -11
  41. package/dist/components/custom/deck-progress/DeckProgress.vue.d.ts +27 -0
  42. package/dist/components/custom/deck-progress/index.d.ts +2 -0
  43. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +57 -0
  44. package/dist/components/custom/dialog-native/index.d.ts +1 -0
  45. package/dist/components/custom/dock/DockTabButton.vue.d.ts +4 -3
  46. package/dist/components/custom/dock/GlassDock.vue.d.ts +115 -3
  47. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +0 -36
  48. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +0 -44
  49. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +37 -5
  50. package/dist/components/custom/fourier-field/index.d.ts +1 -1
  51. package/dist/components/custom/fourier-field/math.d.ts +0 -17
  52. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +41 -0
  53. package/dist/components/custom/glass-panel/index.d.ts +2 -0
  54. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +3 -4
  55. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +8 -11
  56. package/dist/components/custom/handmark/HandMark.vue.d.ts +29 -0
  57. package/dist/components/custom/handmark/brush.d.ts +242 -0
  58. package/dist/components/custom/handmark/freehand.d.ts +69 -0
  59. package/dist/components/custom/handmark/geometry.d.ts +50 -0
  60. package/dist/components/custom/handmark/index.d.ts +21 -0
  61. package/dist/components/custom/handmark/ink.d.ts +11 -0
  62. package/dist/components/custom/handmark/texture.d.ts +39 -0
  63. package/dist/components/custom/handmark/types.d.ts +53 -0
  64. package/dist/components/custom/handmark/useHandMark.d.ts +87 -0
  65. package/dist/components/custom/header-ribbon/HeaderRibbon.vue.d.ts +31 -0
  66. package/dist/components/custom/header-ribbon/index.d.ts +2 -0
  67. package/dist/components/custom/header-ribbon/types.d.ts +7 -0
  68. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +2 -2
  69. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +91 -0
  70. package/dist/components/custom/instrument-rail/index.d.ts +2 -0
  71. package/dist/components/custom/metric-badge/MetricBadge.vue.d.ts +8 -0
  72. package/dist/components/ui/drawer/Drawer.vue.d.ts +0 -1
  73. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +2 -2
  74. package/dist/components/ui/slider/index.d.ts +19 -22
  75. package/dist/components/ui/toast/use-toast.d.ts +2 -2
  76. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  77. package/dist/components/ui/toggle/index.d.ts +1 -1
  78. package/dist/components/ui/toggle-group/ToggleGroup.vue.d.ts +7 -1
  79. package/dist/components/ui/toggle-group/ToggleGroupItem.vue.d.ts +3 -1
  80. package/dist/components/ui/toggle-group/toggleGroupContext.d.ts +13 -0
  81. package/dist/composables/color/index.d.ts +0 -12
  82. package/dist/composables/dark/index.d.ts +1 -1
  83. package/dist/composables/dark/useGlobalDark.d.ts +21 -1
  84. package/dist/composables/glass/useSpecularTracking.d.ts +3 -12
  85. package/dist/composables/motion/core/index.d.ts +1 -0
  86. package/dist/composables/motion/index.d.ts +0 -2
  87. package/dist/composables/motion/useRouteTransition.d.ts +42 -0
  88. package/dist/composables/motion/useSpringMount.d.ts +1 -1
  89. package/dist/configurator.js +1 -1
  90. package/dist/confirm-dialog.js +2 -2
  91. package/dist/constellation.js +225 -260
  92. package/dist/controls.js +14 -48
  93. package/dist/dark.d.ts +1 -1
  94. package/dist/dark.js +1 -1
  95. package/dist/data-table.js +1 -1
  96. package/dist/deck-progress.d.ts +1 -0
  97. package/dist/deck-progress.js +2 -0
  98. package/dist/dialog.js +2 -2
  99. package/dist/dock.js +345 -340
  100. package/dist/dockContext-BKeIMmNk.js +9 -0
  101. package/dist/{dropdown-menu-DVnQcA0E.js → dropdown-menu-D77jX6Df.js} +4 -7
  102. package/dist/dropdown-menu.js +1 -1
  103. package/dist/expandable-container.js +79 -38
  104. package/dist/forms.js +2 -2
  105. package/dist/fourier-field.js +102 -137
  106. package/dist/fourier-math.js +2 -2
  107. package/dist/glass-panel.d.ts +1 -0
  108. package/dist/glass-panel.js +44 -0
  109. package/dist/glass-ui.css +1 -1
  110. package/dist/glass-ui.js +209 -287
  111. package/dist/goo-blob.js +212 -243
  112. package/dist/handmark.d.ts +1 -0
  113. package/dist/handmark.js +663 -0
  114. package/dist/header-ribbon.d.ts +1 -0
  115. package/dist/header-ribbon.js +63 -0
  116. package/dist/hover-popover.js +1 -1
  117. package/dist/icon-tooltip.js +1 -1
  118. package/dist/index.d.ts +3 -0
  119. package/dist/instrument-rail.d.ts +1 -0
  120. package/dist/instrument-rail.js +2 -0
  121. package/dist/keyboard.js +1 -1
  122. package/dist/labeled-field.js +5 -5
  123. package/dist/{math-BUU9hHID.js → math-DTpRVC0e.js} +2 -18
  124. package/dist/metric-badge.js +1 -1
  125. package/dist/metric-stack.js +1 -1
  126. package/dist/motion-core.js +70 -69
  127. package/dist/motion.js +37 -38
  128. package/dist/notification.js +1 -1
  129. package/dist/number-field.js +1 -1
  130. package/dist/popover.js +1 -1
  131. package/dist/{presets-1OhFpaIC.js → presets-BP_ALM0m.js} +14 -1
  132. package/dist/progress.js +1 -1
  133. package/dist/pulse.js +1 -1
  134. package/dist/reactive.js +1 -1
  135. package/dist/scrolling-text.js +1 -1
  136. package/dist/search.js +6 -6
  137. package/dist/select.js +1 -1
  138. package/dist/{sheet-ChSXcJpU.js → sheet-VZEtNFvO.js} +1 -1
  139. package/dist/sheet.js +1 -1
  140. package/dist/{slider-sfl8gFDD.js → slider-ClgpP7EB.js} +4 -4
  141. package/dist/slider.js +1 -1
  142. package/dist/sortable-list.js +2 -2
  143. package/dist/stacked-icons.js +6 -6
  144. package/dist/styles/animations.css +111 -15
  145. package/dist/styles/components.css +1 -1
  146. package/dist/styles/dock/layer-group.css +0 -22
  147. package/dist/styles/dock/layers.css +1 -11
  148. package/dist/styles/dock/morph.css +19 -95
  149. package/dist/styles/dock/shell.css +0 -12
  150. package/dist/styles/dock-controls.css +31 -28
  151. package/dist/styles/drawer.css +0 -2
  152. package/dist/styles/floating-panel.css +0 -2
  153. package/dist/styles/glass-refract.css +0 -2
  154. package/dist/styles/glass.css +1188 -31
  155. package/dist/styles/hover-popover.css +0 -2
  156. package/dist/styles/index.css +6 -24
  157. package/dist/styles/instrument-chassis.css +0 -4
  158. package/dist/styles/paper.css +68 -2
  159. package/dist/styles/theme.css +20 -13
  160. package/dist/styles/tokens.css +2360 -22
  161. package/dist/styles/typography.css +6 -18
  162. package/dist/styles/utilities.css +1291 -19
  163. package/dist/styles/view-transition.css +51 -0
  164. package/dist/switch.js +1 -1
  165. package/dist/tabs.js +98 -98
  166. package/dist/timeline.js +2 -2
  167. package/dist/toast.js +1 -1
  168. package/dist/toggle-group.js +1 -1
  169. package/dist/typewriter.js +1 -1
  170. package/dist/{useAnimatedNumber-DfVgP4te.js → useAnimatedNumber-Bcpy5Etf.js} +1 -1
  171. package/dist/{useConfiguratorState-BdQXh9ie.js → useConfiguratorState-DxAqksK6.js} +1 -1
  172. package/dist/useGlassRenderer-D7YGOYiM.js +69 -0
  173. package/dist/{useGlobalDark-D7R9OypB.js → useGlobalDark-D1wgEqfW.js} +21 -2
  174. package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
  175. package/dist/useSpringMount-BJSHcLl3.js +113 -0
  176. package/dist/useViewTransition-DaN5Zrox.js +21 -0
  177. package/dist/vReveal-zUIQk-rJ.js +53 -0
  178. package/dist/watercolor-dot.js +2 -2
  179. package/package.json +57 -33
  180. package/src/styles/animations.css +111 -15
  181. package/src/styles/dock/layer-group.css +0 -22
  182. package/src/styles/dock/layers.css +1 -11
  183. package/src/styles/dock/morph.css +19 -95
  184. package/src/styles/dock/shell.css +0 -12
  185. package/src/styles/dock-controls.css +31 -28
  186. package/src/styles/glass.css +1188 -31
  187. package/src/styles/index.css +6 -24
  188. package/src/styles/paper.css +68 -2
  189. package/src/styles/theme.css +20 -13
  190. package/src/styles/tokens.css +2360 -22
  191. package/src/styles/typography.css +6 -18
  192. package/src/styles/utilities.css +1291 -19
  193. package/src/styles/view-transition.css +51 -0
  194. package/dist/components/custom/aurora/constants/shaders/vangogh-medium.glsl.d.ts +0 -1
  195. package/dist/components/custom/constellation/composables/createConstellationField.d.ts +0 -35
  196. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +0 -35
  197. package/dist/components/custom/constellation/constants.d.ts +0 -36
  198. package/dist/components/custom/constellation/constellationDraw.d.ts +0 -18
  199. package/dist/components/custom/constellation/constellationInteraction.d.ts +0 -102
  200. package/dist/components/custom/dock/composables/useDockMorphWindow.d.ts +0 -15
  201. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +0 -131
  202. package/dist/components/custom/dock/constants.d.ts +0 -23
  203. package/dist/components/custom/fourier-field/presets.d.ts +0 -54
  204. package/dist/components/custom/goo-blob/composables/buildMetaballProgram.d.ts +0 -18
  205. package/dist/components/custom/goo-blob/composables/uploadBlobUniforms.d.ts +0 -41
  206. package/dist/components/custom/goo-blob/constants.d.ts +0 -52
  207. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +0 -1
  208. package/dist/components/custom/tabs/constants.d.ts +0 -12
  209. package/dist/components/custom/underline/GlassUnderline.vue.d.ts +0 -84
  210. package/dist/components/custom/underline/index.d.ts +0 -2
  211. package/dist/components/custom/underline/types.d.ts +0 -56
  212. package/dist/composables/motion/curves.d.ts +0 -48
  213. package/dist/composables/motion/springPresets.d.ts +0 -33
  214. package/dist/composables/motion/suite.d.ts +0 -2
  215. package/dist/dockContext-bho8B1A4.js +0 -17
  216. package/dist/motion-curves.d.ts +0 -1
  217. package/dist/motion-curves.js +0 -130
  218. package/dist/springPresets-aRSm-4_k.js +0 -40
  219. package/dist/styles/glass/a11y-fallback.css +0 -245
  220. package/dist/styles/glass/ladder.css +0 -304
  221. package/dist/styles/glass/material.css +0 -238
  222. package/dist/styles/glass/progress-rail.css +0 -78
  223. package/dist/styles/glass/squircle.css +0 -66
  224. package/dist/styles/glass/surfaces.css +0 -306
  225. package/dist/styles/tokens/color-radius.css +0 -250
  226. package/dist/styles/tokens/dark-arm.css +0 -194
  227. package/dist/styles/tokens/glass.css +0 -413
  228. package/dist/styles/tokens/light-dark.css +0 -158
  229. package/dist/styles/tokens/offsets-sizing.css +0 -406
  230. package/dist/styles/tokens/property-regs.css +0 -169
  231. package/dist/styles/tokens/scale-paper.css +0 -361
  232. package/dist/styles/tokens/scheme-motion.css +0 -334
  233. package/dist/styles/tokens/shadow.css +0 -132
  234. package/dist/styles/utilities/a11y-overrides.css +0 -140
  235. package/dist/styles/utilities/animate.css +0 -26
  236. package/dist/styles/utilities/base.css +0 -365
  237. package/dist/styles/utilities/btn.css +0 -399
  238. package/dist/styles/utilities/components.css +0 -317
  239. package/dist/underline.d.ts +0 -1
  240. package/dist/underline.js +0 -85
  241. package/dist/useSpecularTracking-DFK_fhpG.js +0 -32
  242. package/dist/useSpringMount-DXUzxBjV.js +0 -108
  243. package/dist/vReveal-CqaCz_mC.js +0 -44
  244. package/src/styles/glass/a11y-fallback.css +0 -245
  245. package/src/styles/glass/ladder.css +0 -304
  246. package/src/styles/glass/material.css +0 -238
  247. package/src/styles/glass/progress-rail.css +0 -78
  248. package/src/styles/glass/squircle.css +0 -66
  249. package/src/styles/glass/surfaces.css +0 -306
  250. package/src/styles/tokens/color-radius.css +0 -250
  251. package/src/styles/tokens/dark-arm.css +0 -194
  252. package/src/styles/tokens/glass.css +0 -413
  253. package/src/styles/tokens/light-dark.css +0 -158
  254. package/src/styles/tokens/offsets-sizing.css +0 -406
  255. package/src/styles/tokens/property-regs.css +0 -169
  256. package/src/styles/tokens/scale-paper.css +0 -361
  257. package/src/styles/tokens/scheme-motion.css +0 -334
  258. package/src/styles/tokens/shadow.css +0 -132
  259. package/src/styles/utilities/a11y-overrides.css +0 -140
  260. package/src/styles/utilities/animate.css +0 -26
  261. package/src/styles/utilities/base.css +0 -365
  262. package/src/styles/utilities/btn.css +0 -399
  263. package/src/styles/utilities/components.css +0 -317
  264. /package/dist/{CollapsibleContent-Drow5WkV.js → CollapsibleContent-CP9qF1v4.js} +0 -0
  265. /package/dist/{DialogFooter-DufLHi0y.js → DialogFooter-Gprw8H_A.js} +0 -0
  266. /package/dist/{IconTooltip-BrQ5p181.js → IconTooltip-Cus0fvK0.js} +0 -0
  267. /package/dist/{Input-B-F818RU.js → Input-xuDwALQR.js} +0 -0
  268. /package/dist/{_plugin-vue_export-helper-DWghtRt7.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
  269. /package/dist/{compile-Ce_V55zi.js → compile-BOXjLUxu.js} +0 -0
  270. /package/dist/{constants-C8NMonuo.js → constants-yKeKnE84.js} +0 -0
  271. /package/dist/{prng-CjVgzjQT.js → prng-D27-B3tK.js} +0 -0
  272. /package/dist/{resolveCanvasColor-CRvVzOvP.js → resolveCanvasColor-BBiYfp8g.js} +0 -0
  273. /package/dist/{useCanvas2D-CSeH8h16.js → useCanvas2D-ClrQuZtp.js} +0 -0
  274. /package/dist/{useIntersectionPause-DAdVPVp4.js → useIntersectionPause-Cck5Uxk8.js} +0 -0
  275. /package/dist/{useInterval-D3USn0yc.js → useInterval-Dsmqwi03.js} +0 -0
  276. /package/dist/{useKeyboardShortcuts-i8tHd5WO.js → useKeyboardShortcuts-CyIYrndH.js} +0 -0
  277. /package/dist/{useScrollProgress-CcgmgMQt.js → useScrollProgress-CffFGLa5.js} +0 -0
  278. /package/dist/{useSortable-DnyGXKKY.js → useSortable-C8ReQ50P.js} +0 -0
  279. /package/dist/{useTextHighlight-B3b10W6r.js → useTextHighlight-CWEi25hf.js} +0 -0
@@ -27,7 +27,7 @@ var c = ["data-variant", "data-size"], l = /* @__PURE__ */ n({
27
27
  }), s.class))
28
28
  }, [a(l.$slots, "default")], 10, c));
29
29
  }
30
- }), u = s("focus-ring inline-flex items-center gap-1.5 rounded-badge border font-semibold transition-control wrap-anywhere [&_svg:not([class*=size-])]:size-(--ui-glyph-sm) [&_svg]:shrink-0 [&_svg]:pointer-events-none", {
30
+ }), u = s("focus-ring inline-flex items-center gap-1.5 rounded-badge border font-semibold transition-control wrap-anywhere [&_svg:not([class*=size-])]:size-[var(--ui-glyph-sm)] [&_svg]:shrink-0 [&_svg]:pointer-events-none", {
31
31
  variants: {
32
32
  variant: {
33
33
  default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
package/dist/badge.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./badge-NdCQMvvB.js";
1
+ import { n as e, t } from "./badge-CaoFJzRb.js";
2
2
  export { e as Badge, t as badgeVariants };
@@ -46,30 +46,30 @@ var d = /* @__PURE__ */ r({
46
46
  "class"
47
47
  ]));
48
48
  }
49
- }), f = u("btn-pill tap-squish focus-ring whitespace-nowrap text-[length:var(--control-text)] font-medium cursor-pointer active:scale-(--scale-press-btn) disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-disabled [&_svg:not([class*=size-])]:size-(--ui-glyph) [&_svg]:shrink-0 [&_svg]:pointer-events-none", {
49
+ }), f = u("btn-pill tap-squish focus-ring whitespace-nowrap text-[length:var(--control-text)] font-medium cursor-pointer active:scale-[var(--scale-press-btn)] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-disabled [&_svg:not([class*=size-])]:size-[var(--ui-glyph)] [&_svg]:shrink-0 [&_svg]:pointer-events-none", {
50
50
  variants: {
51
51
  variant: {
52
- default: "glass-wash btn-glass text-foreground hover:bg-(--glass-bg-resting) hover:border-(--glass-border-resting) active:bg-(--glass-bg-floating) active:border-(--glass-border-floating) aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
52
+ default: "glass-wash btn-glass text-foreground hover:bg-[var(--glass-bg-resting)] hover:border-[var(--glass-border-resting)] active:bg-[var(--glass-bg-floating)] active:border-[var(--glass-border-floating)] aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
53
53
  solid: "bg-primary text-primary-foreground hover:bg-primary/90 active:bg-primary/80 aria-pressed:bg-primary/85",
54
- "primary-audacious": "btn-audacious bg-primary text-primary-foreground hover:scale-(--scale-hover-btn) aria-pressed:scale-(--scale-press-btn)",
55
- "gold-audacious": "btn-audacious btn-audacious-gold text-foreground hover:text-white active:text-white aria-pressed:text-white hover:scale-(--scale-hover-btn) aria-pressed:scale-(--scale-press-btn)",
54
+ "primary-audacious": "btn-audacious bg-primary text-primary-foreground hover:scale-[var(--scale-hover-btn)] aria-pressed:scale-[var(--scale-press-btn)]",
55
+ "gold-audacious": "btn-audacious btn-audacious-gold text-foreground hover:text-white active:text-white aria-pressed:text-white hover:scale-[var(--scale-hover-btn)] aria-pressed:scale-[var(--scale-press-btn)]",
56
56
  destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 active:bg-destructive/80 aria-pressed:bg-destructive/85",
57
57
  outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground active:bg-accent/80 aria-pressed:bg-accent aria-pressed:text-accent-foreground",
58
58
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 active:bg-secondary/70 aria-pressed:bg-secondary/60",
59
59
  accent: "bg-accent text-accent-foreground border border-border/40 hover:bg-accent/80 active:bg-accent/70 aria-pressed:bg-accent/60",
60
60
  ghost: "bg-transparent text-foreground/70 hover:bg-foreground/8 hover:text-foreground active:bg-foreground/12 aria-pressed:bg-foreground/10 aria-pressed:text-foreground",
61
- glass: "glass-wash btn-glass text-foreground hover:bg-(--glass-bg-resting) hover:border-(--glass-border-resting) active:bg-(--glass-bg-floating) active:border-(--glass-border-floating) aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
62
- "glass-wash": "glass-wash btn-glass text-foreground/70 hover:bg-foreground/[0.04] hover:border-(--surface-tint-22) hover:text-foreground active:bg-foreground/[0.08] aria-pressed:bg-foreground/[0.1] aria-pressed:text-foreground",
61
+ glass: "glass-wash btn-glass text-foreground hover:bg-[var(--glass-bg-resting)] hover:border-[var(--glass-border-resting)] active:bg-[var(--glass-bg-floating)] active:border-[var(--glass-border-floating)] aria-pressed:bg-[color-mix(in_srgb,var(--foreground)_10%,var(--glass-bg-resting))]",
62
+ "glass-wash": "glass-wash btn-glass text-foreground/70 hover:bg-foreground/[0.04] hover:border-[var(--surface-tint-22)] hover:text-foreground active:bg-foreground/[0.08] aria-pressed:bg-foreground/[0.1] aria-pressed:text-foreground",
63
63
  ai: "bg-amber-500/15 text-amber-700 hover:bg-amber-500/25 active:bg-amber-500/35 dark:text-amber-400 aria-pressed:bg-amber-500/30",
64
64
  link: "text-primary underline-offset-4 hover:underline active:opacity-80 active:scale-100"
65
65
  },
66
66
  size: {
67
- default: "h-(--control-h-md) px-4 py-2 has-[>svg]:px-3",
68
- xs: "h-(--control-h-xs) rounded-pill px-2 text-[length:var(--control-text-sm)]",
69
- sm: "h-(--control-h-sm) rounded-pill px-3",
70
- lg: "h-(--control-h-lg) rounded-pill px-8 has-[>svg]:px-5",
71
- icon: "h-(--control-h-md) w-(--control-h-md) p-0",
72
- "icon-sm": "h-(--control-h-xs) w-(--control-h-xs) p-0"
67
+ default: "h-[var(--control-h-md)] px-4 py-2 has-[>svg]:px-3",
68
+ xs: "h-[var(--control-h-xs)] rounded-pill px-2 text-[length:var(--control-text-sm)]",
69
+ sm: "h-[var(--control-h-sm)] rounded-pill px-3",
70
+ lg: "h-[var(--control-h-lg)] rounded-pill px-8 has-[>svg]:px-5",
71
+ icon: "h-[var(--control-h-md)] w-[var(--control-h-md)] p-0",
72
+ "icon-sm": "h-[var(--control-h-xs)] w-[var(--control-h-xs)] p-0"
73
73
  }
74
74
  },
75
75
  defaultVariants: {
package/dist/button.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./button-DyiWFAOE.js";
1
+ import { n as e, t } from "./button-DN39cGqL.js";
2
2
  export { e as Button, t as buttonVariants };
package/dist/canvas.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as e, t } from "./useCanvas2D-CSeH8h16.js";
2
- import { t as n } from "./resolveCanvasColor-CRvVzOvP.js";
1
+ import { n as e, t } from "./useCanvas2D-ClrQuZtp.js";
2
+ import { t as n } from "./resolveCanvasColor-BBiYfp8g.js";
3
3
  export { n as resolveCanvasColor, t as useCanvas2D, e as useCanvasLifecycle };
package/dist/card.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./CardAction-DrAcAV4d.js";
1
+ import { a as e, i as t, n, o as r, r as i, s as a, t as o } from "./CardAction-DuArVky-.js";
2
2
  export { a as Card, o as CardAction, i as CardContent, t as CardDescription, n as CardFooter, r as CardHeader, e as CardTitle };
package/dist/carousel.js CHANGED
@@ -3,8 +3,8 @@ import { t } from "./createLucideIcon-B6uNAU9G.js";
3
3
  import { t as n } from "./chevron-down-BSkTP2aL.js";
4
4
  import { t as r } from "./chevron-right-sDM0Yvrf.js";
5
5
  import { t as i } from "./chevron-up-CCOD_FTz.js";
6
- import { n as a } from "./button-DyiWFAOE.js";
7
- import { t as o } from "./_plugin-vue_export-helper-DWghtRt7.js";
6
+ import { n as a } from "./button-DN39cGqL.js";
7
+ import { t as o } from "./_plugin-vue_export-helper-ok8pgSl5.js";
8
8
  import { Fragment as s, computed as c, createBlock as l, createCommentVNode as u, createElementBlock as d, createElementVNode as f, createVNode as p, defineComponent as m, mergeProps as h, normalizeClass as g, onMounted as _, openBlock as v, ref as y, renderList as b, renderSlot as x, resolveDynamicComponent as S, toDisplayString as C, unref as w, watch as T, withCtx as E } from "vue";
9
9
  import { createInjectionState as D } from "@vueuse/core";
10
10
  import O from "embla-carousel-vue";
@@ -170,7 +170,7 @@ var F = /* @__PURE__ */ m({
170
170
  onClick: (t) => l(e - 1)
171
171
  }, null, 8, R))), 128))], 10, L)) : u("", !0);
172
172
  }
173
- }), [["__scopeId", "data-v-e87db23f"]]), B = /* @__PURE__ */ m({
173
+ }), [["__scopeId", "data-v-18c34cd8"]]), B = /* @__PURE__ */ m({
174
174
  __name: "CarouselItem",
175
175
  props: { class: { type: [
176
176
  Boolean,
@@ -206,7 +206,7 @@ var F = /* @__PURE__ */ m({
206
206
  return (s, c) => (v(), l(w(a), {
207
207
  "data-slot": "carousel-next",
208
208
  disabled: !w(i),
209
- class: g(w(e)("absolute h-(--carousel-nav-size) w-(--carousel-nav-size) rounded-pill", w(r) === "horizontal" ? "top-1/2 -translate-y-1/2 right-[calc(-1*var(--carousel-nav-offset))]" : "left-1/2 -translate-x-1/2 rotate-90 bottom-[calc(-1*var(--carousel-nav-offset))]", n.class)),
209
+ class: g(w(e)("absolute h-[var(--carousel-nav-size)] w-[var(--carousel-nav-size)] rounded-pill", w(r) === "horizontal" ? "top-1/2 -translate-y-1/2 right-[calc(-1*var(--carousel-nav-offset))]" : "left-1/2 -translate-x-1/2 rotate-90 bottom-[calc(-1*var(--carousel-nav-offset))]", n.class)),
210
210
  variant: t.variant,
211
211
  size: t.size,
212
212
  onClick: w(o)
@@ -305,7 +305,7 @@ var F = /* @__PURE__ */ m({
305
305
  return (s, c) => (v(), l(w(a), {
306
306
  "data-slot": "carousel-previous",
307
307
  disabled: !w(i),
308
- class: g(w(e)("absolute h-(--carousel-nav-size) w-(--carousel-nav-size) rounded-pill", w(r) === "horizontal" ? "top-1/2 -translate-y-1/2 left-[calc(-1*var(--carousel-nav-offset))]" : "left-1/2 -translate-x-1/2 rotate-90 top-[calc(-1*var(--carousel-nav-offset))]", n.class)),
308
+ class: g(w(e)("absolute h-[var(--carousel-nav-size)] w-[var(--carousel-nav-size)] rounded-pill", w(r) === "horizontal" ? "top-1/2 -translate-y-1/2 left-[calc(-1*var(--carousel-nav-offset))]" : "left-1/2 -translate-x-1/2 rotate-90 top-[calc(-1*var(--carousel-nav-offset))]", n.class)),
309
309
  variant: t.variant,
310
310
  size: t.size,
311
311
  onClick: w(o)
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "./CollapsibleContent-Drow5WkV.js";
1
+ import { n as e, r as t, t as n } from "./CollapsibleContent-CP9qF1v4.js";
2
2
  export { t as Collapsible, n as CollapsibleContent, e as CollapsibleTrigger };
@@ -69,18 +69,16 @@ function y(e) {
69
69
  };
70
70
  }
71
71
  function b(e, t = {}) {
72
- let n = typeof e == "string" ? p(e) : e, { stopCount: r = 3, harmony: i = "analogous", lightnessSpread: a = .18, hueSpread: o = 24, chromaBump: s = .03, chromaCeiling: c } = t, l = Math.max(2, Math.min(4, Math.round(r))), u = [];
73
- for (let e = 0; e < l; e++) {
74
- let t = l === 1 ? 0 : e / (l - 1), r = n.L - a / 2 + a * t, d = Math.max(0, n.C + s * Math.sin(Math.PI * t));
75
- c !== void 0 && (d = Math.min(d, c));
76
- let f = v(n.h, i, o, t);
77
- u.push(y({
72
+ let n = typeof e == "string" ? p(e) : e, { stopCount: r = 3, harmony: i = "analogous", lightnessSpread: a = .18, hueSpread: o = 24, chromaBump: s = .03 } = t, c = Math.max(2, Math.min(4, Math.round(r))), l = [];
73
+ for (let e = 0; e < c; e++) {
74
+ let t = c === 1 ? 0 : e / (c - 1), r = n.L - a / 2 + a * t, u = Math.max(0, n.C + s * Math.sin(Math.PI * t)), d = v(n.h, i, o, t);
75
+ l.push(y({
78
76
  L: Math.min(.98, Math.max(.05, r)),
79
- C: d,
80
- h: f
77
+ C: u,
78
+ h: d
81
79
  }));
82
80
  }
83
- return u;
81
+ return l;
84
82
  }
85
83
  //#endregion
86
84
  export { y as a, u as c, v as i, d as l, h as n, m as o, b as r, f as s, p as t };
package/dist/color.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./color-B65wWyQz.js";
1
+ import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./color-C5ls_QF7.js";
2
2
  export { c as cssToOklch, i as defaultBlobColorResolver, o as deriveBlobPalette, n as deriveHue, e as gamutMapStop, a as oklchStopToHex, s as oklchToGammaRgb, t as oklchToLinear, r as warmCatchLight };
package/dist/command.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./CommandShortcut-mV2e1aG6.js";
1
+ import { a as e, c as t, i as n, l as r, n as i, o as a, r as o, s, t as c } from "./CommandShortcut-CefCj5mt.js";
2
2
  export { r as Command, t as CommandDialog, s as CommandEmpty, a as CommandGroup, e as CommandInput, n as CommandItem, o as CommandList, i as CommandSeparator, c as CommandShortcut };
@@ -1,14 +1,19 @@
1
1
  /**
2
2
  * Aurora v4.1 — library config shape.
3
3
  *
4
- * Authored presets (Sky, Dawn, Meadow, Deliberative, Day9, Oil Impasto,
4
+ * Authored THEMED presets (Sky, Dawn, Meadow, Deliberative, Day9, Oil Impasto,
5
5
  * Oil Gestural, Oil Van Gogh, Crayon Sunset, Crayon Rainbow, Crayon Ocean)
6
6
  * live in the consumer — see demo/stories/aurora/presets.ts.
7
7
  *
8
- * Per memory rule "Presets in consumers": named themed presets belong in
9
- * each consumer project, not in the library. The library exports only the
10
- * shape + a minimum-viable DEFAULT_AURORA_CONFIG for the component's own
11
- * type-check ergonomics.
8
+ * Per memory rule "Presets in consumers": named THEMED presets belong in each
9
+ * consumer project, not in the library. The library exports only the shape, a
10
+ * minimum-viable DEFAULT_AURORA_CONFIG, and — the one deliberate exception
11
+ * (E22 / d-paper-aurora M4) — the `PAPER_WASH_GROUND` CALIBRATION partial: a
12
+ * recessive-ground crayon TUNING (not a themed palette) whose deft tooth dials
13
+ * are LIBRARY CANON so a data-ground aurora reads as paper-on-tooth without each
14
+ * consumer dial-tuning the same recessive calibration by hand (the
15
+ * `proof:aurora-paper-ground` gate locks it). It carries NO palette/nuclei — the
16
+ * consumer spreads it over its own pole-derived pigment (page-glow IS data-glow).
12
17
  */
13
18
  import type { OklchStop } from "../../../../composables/color";
14
19
  export type { OklchStop };
@@ -114,6 +119,14 @@ export interface AuroraConfig {
114
119
  granulation: number;
115
120
  impasto: number;
116
121
  brokenColor: number;
122
+ /**
123
+ * The medium's own paper-tooth multiplier (`uCanvasGrain` — `mediums.glsl.ts`
124
+ * `result *= 1 + tooth*toothAmp*uCanvasGrain`). The themed mediums ride the
125
+ * sub-0.1 band; the RECESSIVE-ground `crayon` preset (PAPER_WASH_GROUND) rides
126
+ * a higher tooth multiplier (~0.5) so the dry tooth is FELT at the clamped
127
+ * ground ceiling where a hue-tint dies — texture is cheap to the eye, flat hue
128
+ * is expensive (the d-paper-aurora load-bearing physics).
129
+ */
117
130
  canvasGrain: number;
118
131
  /**
119
132
  * AW.W4.2 — the impasto relight direction (the movable directional source the
@@ -181,3 +194,47 @@ export declare const MAX_STOPS = 8;
181
194
  * Not a themed preset — the demo's 11 authored presets override every field.
182
195
  */
183
196
  export declare const DEFAULT_AURORA_CONFIG: AuroraConfig;
197
+ /**
198
+ * `PAPER_WASH_GROUND` — the library-canon recessive-ground crayon calibration.
199
+ *
200
+ * The deft tooth dials the paper-aurora hybrid needs, pinned ONCE at the library
201
+ * level so a data-ground aurora reads as pigment-on-paper-tooth — NOT a dead hue
202
+ * tint, NOT a screen-like gradient — without each consumer hand-tuning the same
203
+ * recessive calibration (the root-repo law: the calibration lives in the library;
204
+ * the consumer never dial-tunes it). It is a PARTIAL: it carries NO palette /
205
+ * nuclei / motion — the consumer SPREADS it over its own pole-derived pigment so
206
+ * the page-glow stays the data-glow (the keystone the smooth-medium swap preserves
207
+ * verbatim; only the DEPOSITION changes from a gradient to a dry-tooth multiply).
208
+ *
209
+ * The pinned dials (the named stopping rules, d-paper-aurora M1):
210
+ * - `medium: "crayon"` — the DRY tooth-multiply (a TEXTURE, not strokes;
211
+ * admissible behind data where the four
212
+ * stroke-deposition mediums are forbidden).
213
+ * - `granulation: 0.30` — pigment settles in the paper tooth (felt-at-rest).
214
+ * - `canvasGrain: 0.5` — the medium's tooth multiplier, lifted so the dry
215
+ * tooth survives the clamped ground ceiling.
216
+ * - `strokeAmount: 0.35` — the crayon PRESSURE (how hard the tooth bites);
217
+ * LOW (recessive — the tooth is felt, never a slab).
218
+ * - `strokeAnisotropy: 0.5` — moderate directional squash; never high enough to
219
+ * read as STROKES (crumb-texture, not brushwork).
220
+ * Plus the recessive guards: `saturation < 1` (the ground spends NO chroma budget —
221
+ * the pops live in the icons), no impasto/sheen (`impasto: 0`, single layer), and a
222
+ * felt `paperGrain` floor.
223
+ *
224
+ * Spread it: `const cfg = { ...consumerBase, ...PAPER_WASH_GROUND }` — the
225
+ * calibration wins the deposition dials, the consumer keeps the pigment + nuclei.
226
+ */
227
+ export declare const PAPER_WASH_GROUND: {
228
+ readonly medium: "crayon";
229
+ readonly strokeOrient: "tensor";
230
+ readonly granulation: 0.3;
231
+ readonly canvasGrain: 0.5;
232
+ readonly strokeAmount: 0.35;
233
+ readonly strokeAnisotropy: 0.5;
234
+ readonly strokeLayers: 1;
235
+ readonly impasto: 0;
236
+ readonly brokenColor: 0;
237
+ readonly wetEdge: 0;
238
+ readonly saturation: 0.92;
239
+ readonly paperGrain: 0.008;
240
+ };
@@ -1,2 +1,2 @@
1
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\n// \u2500\u2500 Structure-tensor / edge-tangent-flow (AW.W4.1) \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// The keystone of the painterly engine: derive stroke orientation from the COLOR\n// FIELD's OWN structure, not a hand-authored flow pattern. A 3x3 Sobel over\n// luma(sampleBase) yields the gradient (Gx,Gy); the 2x2 structure tensor\n// J = [[Gx\u00B2, GxGy],[GxGy, Gy\u00B2]] eigen-decomposes closed-form into the MINOR\n// eigenvector (the edge-TANGENT \u2014 least color change, the stroke direction; the\n// MAJOR eigenvector is the gradient/edge-NORMAL and would make strokes cross the\n// bands) and the coherence A = (\u03BB1-\u03BB2)/(\u03BB1+\u03BB2). Low-coherence (flat) zones relax\n// toward the smooth fallbackDir by (1-A) so tensor noise never reads as jitter.\n// Single-pass small-tap WebGL2 form; the Gaussian-smoothed multi-tap + LIC smear\n// is the AW.W7 WebGPU multi-pass fold. Returns vec3(tangent.x, tangent.y, A).\nvec3 structureTensorField(vec2 p, float t, vec2 fallbackDir) {\n float e = 0.0035; // small-tap neighborhood (edge-mask scale)\n // 3x3 luma samples.\n float l00 = dot(sampleBase(p + vec2(-e, -e), t), W_LUMA);\n float l10 = dot(sampleBase(p + vec2( 0.0, -e), t), W_LUMA);\n float l20 = dot(sampleBase(p + vec2( e, -e), t), W_LUMA);\n float l01 = dot(sampleBase(p + vec2(-e, 0.0), t), W_LUMA);\n float l21 = dot(sampleBase(p + vec2( e, 0.0), t), W_LUMA);\n float l02 = dot(sampleBase(p + vec2(-e, e), t), W_LUMA);\n float l12 = dot(sampleBase(p + vec2( 0.0, e), t), W_LUMA);\n float l22 = dot(sampleBase(p + vec2( e, e), t), W_LUMA);\n // Sobel derivatives.\n float Gx = (l20 + 2.0 * l21 + l22) - (l00 + 2.0 * l01 + l02);\n float Gy = (l02 + 2.0 * l12 + l22) - (l00 + 2.0 * l10 + l20);\n // Structure tensor components.\n float Jxx = Gx * Gx;\n float Jyy = Gy * Gy;\n float Jxy = Gx * Gy;\n // Closed-form 2x2 eigenvalues: \u03BB = 0.5(tr \u00B1 sqrt((Jxx-Jyy)\u00B2 + 4Jxy\u00B2)).\n float tr = Jxx + Jyy;\n float disc = sqrt(max((Jxx - Jyy) * (Jxx - Jyy) + 4.0 * Jxy * Jxy, 0.0));\n float lambdaMaj = 0.5 * (tr + disc);\n float lambdaMin = 0.5 * (tr - disc);\n // The MAJOR eigenvector points along the gradient (the edge NORMAL); the MINOR\n // is its perpendicular \u2014 the edge TANGENT (the stroke direction). The principal\n // angle is \u03B8 = 0.5\u00B7atan2(2\u00B7Jxy, Jxx-Jyy); this form is robust at Jxy\u22480 (where the\n // (\u03BB-Jyy, Jxy) eigenvector formula collapses to a zero vector). The tangent is at\n // \u03B8 + 90\u00B0. Guard the fully-isotropic (no-gradient) degenerate case \u2192 fallback dir.\n vec2 tangent;\n if (disc < 1e-7) {\n tangent = fallbackDir;\n } else {\n float theta = 0.5 * atan(2.0 * Jxy, Jxx - Jyy); // major (gradient) angle\n tangent = vec2(-sin(theta), cos(theta)); // perpendicular = tangent\n }\n // Coherence A in [0,1] \u2014 high where one eigenvalue dominates (a strong edge),\n // ~0 in flat zones. Relax toward the smooth fallback by (1 - A).\n float A = (lambdaMaj - lambdaMin) / (lambdaMaj + lambdaMin + 1e-6);\n A = clamp(A, 0.0, 1.0);\n // Coherence-weighted blend: full tensor in coherent zones, smooth in flat ones.\n // Resolve the 180\u00B0 sign ambiguity toward the fallback so the blend is continuous.\n if (dot(tangent, fallbackDir) < 0.0) tangent = -tangent;\n // The blend weight is a low-power curve (A^0.35) so even MODERATE-coherence zones queue\n // strongly along the tangent (a flowing van-Gogh band reads coherent the way the\n // structure-tensor metric measures it; a linear A under-orients the mid-band and the\n // rendered field reads too isotropic \u2014 the \u00A74.2 anisotropy lift). The flat-zone (A\u22480)\n // relax to the fallback survives (0^0.35=0), so tensor noise never reads as jitter.\n float blendW = pow(A, 0.28);\n vec2 dir = normalize(mix(fallbackDir, tangent, blendW) + 1e-6);\n return vec3(dir, A);\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: string;
2
+ export declare const AURORA_MEDIUMS_POST_BRUSH_GLSL = "// \u2500\u2500 Medium id constants (mirror uniformBridge.ts MEDIUM_ID \u2014 the uMedium ladder) \u2500\u2500\n// The StrokeProfile selector (AX.W12 + AX.W13) dispatches on the medium id: oil,\n// van-Gogh, and oil-pastel each AUTHOR a first-class profile in profileFor.\n#define MEDIUM_OIL 3\n#define MEDIUM_CRAYON 4\n#define MEDIUM_VANGOGH 5\n#define MEDIUM_OILPASTEL 6\n\n// \u2500\u2500 Crayon \u2014 DRY wax pigment on paper tooth (first-class medium, uMedium==4) \u2500\u2500\n// Crayon is not strokes. It's dry pigment crumbs dragged across paper tooth \u2014 the\n// DRY tooth-multiply model: anisotropic tooth noise multiplied into the base, a hard\n// SCUMBLE that lets the lower color show through the broken upper layer, and stable\n// OKLCh broken-color pigment patches. NO sheen, NO burnish film \u2014 that waxy gloss is\n// the OIL-PASTEL deposition's signature (mediumOilPastel), distinct from dry crayon\n// (AX.W13 slice 8 F1 \u2014 the split). Crayon shares the SUBSTRATE (the structure-tensor\n// orientation, the tooth noise, OKLCh brokenColorJitter), not the dispatch body.\nvec3 mediumCrayon(vec3 col, vec2 p, float t) {\n // Orient the deposition along the structure-tensor edge-tangent (the bridge forces\n // tensor for crayon, so read the tensor field directly).\n vec2 flow = structureTensorField(p, t, flowField(p, t)).xy;\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 float aniso = mix(0.45, 0.95, uStrokeAnisotropy);\n float scale = max(uStrokeScale * 1.6, 180.0);\n\n // \u2500\u2500 Paper TOOTH height field \u2014 the relief the dry pigment rides. Anisotropic\n // (squished along flow, coarse cross-flow). Peaks = ridges, valleys = paper pits.\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\n // \u2500\u2500 DRY TOOTH-MULTIPLY \u2014 the crayon multiplies the tooth relief into the base\n // color (dark in the pits, bright on the ridges). The pressure (uStrokeAmount) sets\n // how hard the multiply bites. This is the DRY model \u2014 no pigment build-up, no sheen.\n float pressure = clamp(uStrokeAmount, 0.0, 1.0);\n float bite = mix(0.18, 0.46, pressure); // multiply strength\n vec3 result = col * (1.0 - bite * (0.5 - tooth));\n\n // \u2500\u2500 HARD SCUMBLE \u2014 a broken upper layer that lets the lower color show through the\n // gaps. A coarse mask gates a HARD (high-contrast) dragged pass so the dry crayon\n // reads as broken pigment crumbs, not a smooth wash. Drag follows the tensor flow.\n float scumbleMask = smoothstep(0.42, 0.78, vnoise(vec2(pr.x * scale * 0.55, pr.y * scale * 0.22) + 7.0));\n float scumbleCoverage = scumbleMask * pressure * 0.7; // hard broken upper layer\n vec3 paper = col * mix(0.80, 0.94, pressure); // the paper showing through\n result = mix(paper, result, scumbleCoverage);\n\n // \u2500\u2500 Broken-color pigment: stable wax/pigment patches in OKLCh (W5), not 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 (the wax chroma punch \u2014 but DRY, no sheen).\n result = saturate3(result, 1.08);\n\n return result;\n}\n\n// \u2500\u2500 StrokeProfile \u2014 the oil-stroke parameter vector (AX.W12, slice 8 F6) \u2500\u2500\u2500\u2500\u2500\u2500\n// The SBR \"stroke = parameter vector\" canon (facet 11): the per-mode if-ladder knobs\n// become struct FIELDS \u2014 logic-as-DATA, not an imperative branch. profileFor(medium,\n// mode) populates the profile for a (medium, mode) pair; paintStrokeLayers(profile) runs\n// the four-layer bestOil/paintOver cascade off it. A new medium (the W13 van-Gogh /\n// oil-pastel profiles) AUTHORS a profile entry \u2014 it never edits a monolith.\nstruct StrokeProfile {\n int shapeType; // 0 tapered, 1 load-drag, 2 dab, 3 even, 4 comma/crescent\n float bristleAmp; // edge raggedness 0..0.5\n float streakFreq; // internal-streak spatial frequency\n float streakAmp; // internal-streak amplitude\n float impastoAmp; // paint-thickness contribution (the relight reads the height)\n float hardness; // edge-compositing crispness 0..1\n float toothScale; // canvas-tooth (linen weave) spatial frequency\n float toothAmp; // canvas-tooth amplitude\n float pigmentSat; // pigment saturation boost (OKLCh chroma scale)\n float densityBig; // layer-1 (big gestural) placement density gate\n float densityMed; // layer-2 (medium body) placement density gate\n float densitySml; // layer-3 (small dabs) placement density gate\n float energyGrade; // AX.W13 \u2014 SBR energy-grade magnitude (0 off; 1 the van-Gogh\n // Starry-Night length cascade). The energy grade is a PROFILE\n // field, NOT a buried uMedium==5 bestOil branch (slice 8 F0).\n float impastoFloor;// AX.W13 \u2014 the per-stroke height-crown floor (0.4 oil falloff;\n // 1.0 van-Gogh FULL-height crown so each dab catches its glint).\n float densityFill; // AX.W13 \u2014 layer-4 fill-dab density. Oil/oil-pastel fill the\n // bald spots (0.95, full coverage); van-Gogh sets it LOW so the\n // sparse atomic dabs keep their visible inter-stroke ground gaps\n // (the atomicity read \u2014 a 0.95 fill would close every gap to a smear).\n float groundFloor; // AX.W13 \u2014 the bare-ground darken floor. The gaps between strokes\n // (low accumulated height) multiply toward this floor, so van-Gogh's\n // sparse atomic dabs read over a visibly darker underpainting (the\n // Starry-Night visible ground). Oil/oil-pastel keep 1.0 (no darken).\n};\n\n// The (medium, mode) -> StrokeProfile selector. The if-ladder's knobs are the profile's\n// fields; a new medium adds a CASE here (never an edit to a dispatch body). mode is the\n// uStrokeMode oil-stroke sub-mode (0 oil, 1 palette-knife, 3 brushwork). crayon\n// (uMedium==4) is a PEER tooth-multiply medium that never reaches the stroke cascade.\n// The painterly STROKE mediums are oil (MEDIUM_OIL), van-Gogh (MEDIUM_VANGOGH) and\n// oil-pastel (MEDIUM_OILPASTEL) \u2014 each AUTHORS its own profile entry below.\nStrokeProfile profileFor(int medium, int mode) {\n // The oil baseline (mode 0) \u2014 balanced modern-abstract/palette-knife hybrid.\n StrokeProfile prof = StrokeProfile(\n 0, // shapeType \u2014 tapered\n 0.25, // bristleAmp\n 9.0, // streakFreq\n 0.09, // streakAmp\n 0.9, // impastoAmp\n 0.80, // hardness\n 240.0, // toothScale\n 0.09, // toothAmp\n 1.03, // pigmentSat\n 0.65, // densityBig\n 0.78, // densityMed\n 0.90, // densitySml\n 0.0, // energyGrade \u2014 oil is uniform-length (no Starry-Night cascade)\n 0.4, // impastoFloor \u2014 oil's 0.4+0.6\u00B7edgeN crown falloff\n 0.92, // densityFill \u2014 oil fills DENSELY with the directional low-relief fill so the\n // flat-colour regions between the macro strokes are TEXTURED with\n // flow-aligned fine strokes (the \u00A74.2 anisotropy needs every pixel\n // to carry directional gradient; a flat untextured region reads as\n // an isotropic/degenerate tensor and drags mean A down). The fill\n // is now directional + low-streak, so dense coverage textures\n // WITHOUT the prior round-dab speckle.\n 1.0 // groundFloor \u2014 oil keeps the full base (no ground darken; fills everywhere)\n );\n\n // \u2500\u2500 Van-Gogh \u2014 first-class atomic comma/crescent dabs (slice 8 F0). NOT a length\n // modulation of oil: sparse high-contrast SEPARABLE marks with their own asymmetric\n // shape, the full Starry-Night energy cascade (energyGrade=1), and full-height\n // impasto crowns so each dab catches its own glint. The mode sub-modes don't apply\n // (van-Gogh has its own grammar), so this returns early.\n if (medium == MEDIUM_VANGOGH) {\n prof.shapeType = 4; // comma / crescent \u2014 the divisionist atomic dab\n prof.bristleAmp = 0.22; // a touch of raggedness on the loaded head\n prof.streakFreq = 16.0; // within-stroke streaks (the loaded comma) \u2014 kept in the\n // FFT inertial band (a too-fine streak falls past the \u00A74.3\n // resolved-band edge and reads as steeper, not shallower)\n prof.streakAmp = 0.22;\n prof.impastoAmp = 1.1; // paint per atomic dab \u2014 eased off 1.5 so the impasto crown\n // does not push the dab past the PBR-Neutral 0.8 highlight\n // knee (where it compresses + loses the directional contrast\n // the \u00A74.2 anisotropy reads)\n prof.hardness = 0.92; // crisp separable edges (visible inter-stroke gaps)\n prof.toothScale = 220.0;\n prof.toothAmp = 0.06;\n prof.pigmentSat = 0.60; // the van-Gogh chroma \u2014 pulled DOWN off the hand-set 1.12\n // so the rendered colorfulness lands inside [55.67, 95.67]\n // (the hand-set punch + the saturated indigo/cobalt/yellow\n // ramp pushed C past the garish ceiling \u2014 \u00A74.1 bidirectional)\n // SPARSE-BUT-FLOWING placement \u2014 visible inter-stroke canvas gaps (the atomicity read)\n // yet enough directional coverage that the swirl-rows read as coherent flowing bands\n // (the \u00A74.2 anisotropy needs the strokes to dominate the gradient field; too-sparse\n // gates left large flat-ground regions that read isotropic and dragged mean A down).\n prof.densityBig = 0.58;\n prof.densityMed = 0.68;\n prof.densitySml = 0.74;\n prof.energyGrade = 1.0; // the full Starry-Night length cascade (the profile field)\n prof.impastoFloor = 1.0; // FULL-height crowns \u2014 every atomic dab catches its glint\n prof.densityFill = 0.30; // a LIGHT directional fill \u2014 textures the dark ground with\n // flow-aligned fine strokes so the gaps carry directional\n // gradient (the \u00A74.2 A lift: an untextured dark ground reads\n // isotropic) WHILE staying open enough that the bright atomic\n // dabs still read separable over it (the gap-fraction floor\n // stays satisfied \u2014 the fill is fine + dark, not a smear).\n prof.groundFloor = 0.31; // darken the bare-ground gaps to the visible Starry-Night\n // underpainting so the bright impasto dabs read separable \u2014\n // the dab\u2194ground contrast injects MID-scale energy (the \u00A74.3\n // \u03B2-flatten: the PBR-Neutral highlight compression concentrated\n // energy at low-k and steepened \u03B2). 0.31 is the balance point:\n // deep enough to hold \u03B2 in-band, light enough that the textured\n // ground keeps the \u00A74.2 coherence the too-dark 0.26 floor cost.\n return prof;\n }\n\n // \u2500\u2500 Oil-pastel \u2014 broad smeared directional strokes deposited via the brush engine\n // (slice 8 F1). Creamy soft edges (low hardness), heavy build-up, and a chroma punch.\n // Distinct from the dry-crayon tooth-multiply (mediumCrayon): oil-pastel LAYS strokes.\n if (medium == MEDIUM_OILPASTEL) {\n prof.shapeType = 0; // tapered directional smear \u2014 a round dab reads locally\n // isotropic (steep \u03B2 / low A); the creamy oil-pastel mark\n // is a broad DIRECTIONAL smear, which carries the \u00A74.2\n // coherence + adds the directional mid-band the \u00A74.3 slope\n // needs (the round-dab profile rolled \u03B2 off to \u22122.8)\n prof.bristleAmp = 0.10; // smooth creamy edges (waxy pastel, not bristle)\n prof.streakFreq = 18.0; // finer internal smear \u2014 adds the mid/high-band the smooth\n // round-dab profile lacked (the \u03B2-too-steep fix); the\n // directional along-spine streak flattens the \u00A74.3 slope\n // without crossing the strokes\n prof.streakAmp = 0.20;\n prof.impastoAmp = 0.7; // build-up, but flatter than oil impasto\n prof.hardness = 0.42; // CREAMY \u2014 soft compositing, strokes blend on overlap\n prof.toothScale = 280.0;\n prof.toothAmp = 0.12; // the pastel tooth reads stronger\n prof.pigmentSat = 0.80; // the waxy chroma \u2014 eased off 1.16 so the rendered C clears\n // the \u00A74.1 band ceiling with margin while the K-M subtractive\n // overlap path (paintOverOklab) keeps the chroma OFF the grey floor\n prof.hardness = 0.58; // creamy but the strokes still REGISTER \u2014 a too-soft blend\n // (0.42) smeared the marks into the smooth colour zones and\n // the field rolled off too steep (\u03B2\u2248\u22122.9, a near-gradient);\n // a crisper deposit keeps the mid/high-band the \u22125/3 slope needs\n prof.densityBig = 0.62; // broad directional coverage \u2014 but NOT over-dense: too many\n // overlapping creamy strokes point in slightly-varied\n // directions and the local \u00A74.2 coherence DROPS (over-dense\n // measured A=0.57 < the 0.62-density A=0.63). The mid-density\n // flow-aligned deposit is the coherence sweet spot.\n prof.densityMed = 0.78;\n prof.densitySml = 0.90;\n prof.energyGrade = 0.80; // a strong Starry-Night length cascade \u2014 varies stroke length\n // by luma/coherence so the dab-size energy spreads across\n // scales (the \u22125/3 cascade the uniform-length 0.0 grade lacked,\n // the \u00A74.3 \u03B2-too-steep fix). Not the full van-Gogh 1.0 (oil-\n // pastel keeps its creamy broad character).\n prof.impastoFloor = 0.55; // a softer crown than van-Gogh's full-height glint\n return prof;\n }\n\n // \u2500\u2500 Oil sub-modes (mode dispatch on the oil medium).\n if (mode == 1) { // palette knife \u2014 razor edges, heavy impasto\n prof.shapeType = 3; // flat, even\n prof.bristleAmp = 0.12;\n prof.streakFreq = 4.0; prof.streakAmp = 0.05;\n prof.impastoAmp = 1.6;\n prof.hardness = 0.95;\n prof.toothAmp = 0.04;\n prof.densityBig = 0.80; prof.densityMed = 0.88; prof.densitySml = 0.70;\n } else if (mode == 3) { // thick brushwork \u2014 heavy bristle brush\n prof.shapeType = 0; // tapered\n prof.bristleAmp = 0.32;\n prof.streakFreq = 14.0; prof.streakAmp = 0.14;\n prof.impastoAmp = 1.2;\n prof.hardness = 0.85;\n prof.toothAmp = 0.07;\n }\n return prof;\n}\n\n// The single parameterized four-layer stroke cascade (AX.W12). The four hand-unrolled\n// bestOil/paintOver invocations collapse into ONE body driven by the profile + the\n// uniform-derived per-layer scale/anisotropy multipliers (which are mode-INVARIANT \u2014 the\n// per-layer offsets, seeds, and len/wid muls are fixed across modes, so they stay here as\n// the cascade's structure; only the profile's knobs differentiate the medium). The\n// mode passes through for the two mode-special-cased shapes (knife layer-3 dabs +\n// layer-4 fill shape), which are placement details of the cascade, not profile knobs.\nvoid paintStrokeLayers(inout vec3 col, inout float height, StrokeProfile prof,\n int mode, vec2 p, float t) {\n // Scales & multipliers from uniforms (mode-invariant cascade structure).\n float baseScale = max(uStrokeScale * 0.006, 0.008);\n // Three primary layers: big gestural, medium body, small dabs.\n // W-AUR-STUDIO D5 \u2014 the \u22125/3 radii respacing was MEASURED + REVERTED (recorded, not\n // silently struck). The \u03C6-adjacent geometric candidate (2.4 / 1.45 / 0.87, a fixed\n // \u22481.66\u00D7 step) moved oil-pastel \u03B2 \u22122.534 \u2192 \u22122.413 \u2014 TOWARD the \u22125/3 band but NOT into\n // it (floor \u22121.85), so the keep-iff-into-band gate failed. The single-pass WebGL2 path\n // is the true limiter (HC-aurora \u00A75): the oil-pastel \u03B2 + the oil/oil-pastel anisotropy\n // residual is the named AY.W-AUR-T5 multi-pass anisotropic-Kuwahara candidate. The\n // hand-set 2.4 / 1.1 / 0.45 stays \u2014 it is van-Gogh's landed-band spacing.\n float sBig = baseScale * 2.4;\n float sMed = baseScale * 1.1;\n float sSml = baseScale * 0.45;\n\n // Strokes are elongated HARD (long\u00B7thin) so the rendered field reads strongly\n // directional \u2014 the \u00A74.2 structure-tensor anisotropy lift. A short fat dab is locally\n // isotropic and drags the measured A down; a long thin stroke that hugs the tensor\n // tangent is what gives Starry Night its A\u22480.83. The width muls are pulled tighter to\n // keep the long\u00B7thin aspect.\n float lenMulBig = mix(3.0, 5.2, uStrokeAnisotropy);\n float widMulBig = mix(0.42, 0.22, uStrokeAnisotropy);\n float lenMulMed = mix(2.8, 4.8, uStrokeAnisotropy);\n float widMulMed = mix(0.40, 0.21, uStrokeAnisotropy);\n float lenMulSml = mix(2.2, 3.6, uStrokeAnisotropy);\n float widMulSml = mix(0.36, 0.23, uStrokeAnisotropy);\n\n float jitterAmt = 0.75; // large jitter \u2014 no grid\n vec2 flow = flowField(p, t);\n\n // Layer 1 \u2014 big gestural strokes (sparse, shaping)\n StrokeHit hBig = bestOil(p, sBig, lenMulBig, widMulBig, jitterAmt * 0.55,\n prof.densityBig, prof.shapeType, prof.bristleAmp, flow, t, 1.3,\n prof.energyGrade);\n paintOver(col, height, hBig, prof.streakFreq * 0.7, prof.streakAmp,\n uImpasto * prof.impastoAmp * uStrokeAmount, prof.hardness, 1.3, prof.impastoFloor);\n\n // Layer 2 \u2014 medium body strokes\n StrokeHit hMed = bestOil(p + vec2(11.3, 3.7), sMed, lenMulMed, widMulMed,\n jitterAmt, prof.densityMed, prof.shapeType, prof.bristleAmp, flow, t, 2.7,\n prof.energyGrade);\n paintOver(col, height, hMed, prof.streakFreq, prof.streakAmp,\n uImpasto * prof.impastoAmp * uStrokeAmount, prof.hardness, 2.7, prof.impastoFloor);\n\n // Layer 3 \u2014 small strokes (more frequent, smaller). Even the knife layer-3 stays the\n // medium's DIRECTIONAL shape, not a round dab \u2014 the round-dab sparkle was a fine-scale\n // isotropic speckle that dragged the \u00A74.2 anisotropy down + rolled the \u00A74.3 slope shallow.\n int smlShape = prof.shapeType;\n StrokeHit hSml = bestOil(p + vec2(-5.1, 8.4), sSml, lenMulSml, widMulSml,\n jitterAmt * 0.9, prof.densitySml, smlShape,\n prof.bristleAmp * 0.85, flow, t, 4.1, prof.energyGrade);\n paintOver(col, height, hSml, prof.streakFreq * 1.4, prof.streakAmp * 0.6,\n uImpasto * prof.impastoAmp * 0.45 * uStrokeAmount, prof.hardness, 4.1, prof.impastoFloor);\n\n // Layer 4 \u2014 fill strokes (dense, fine) \u2014 cover bald spots. The density is\n // PROFILE-driven (prof.densityFill): oil/oil-pastel fill to full coverage; van-Gogh\n // keeps it sparse so the bare-ground gaps between its atomic dabs survive. The fill is\n // ELONGATED + flow-oriented (NOT a round dab) \u2014 a dense round-dab fill is locally\n // isotropic and was the dominant \u00A74.2 anisotropy sink; an oriented fine stroke keeps the\n // fill directional so the whole field reads coherent.\n float sFill = baseScale * 0.22;\n float lenMulFill = mix(2.0, 3.2, uStrokeAnisotropy);\n float widMulFill = mix(0.34, 0.24, uStrokeAnisotropy);\n int fillShape = (mode == 1) ? 3 : prof.shapeType; // knife=even; others inherit the medium's directional shape\n StrokeHit hFill = bestOil(p + vec2(3.9, -6.2), sFill, lenMulFill, widMulFill,\n jitterAmt * 0.8, prof.densityFill, fillShape,\n prof.bristleAmp * 0.6, flow, t, 8.9, prof.energyGrade);\n // The fill is a low-relief, low-streak base coat \u2014 it covers bald spots WITHOUT adding\n // fine bright speckle (a high-impasto/high-streak fill caught a per-dab glint that read\n // as isotropic noise over the directional macro strokes \u2014 the \u00A74.2/\u00A74.3 sink). Its\n // positional jitter is tamed too so the fill strokes stay flow-aligned, not scattered.\n paintOver(col, height, hFill, prof.streakFreq * 1.2, prof.streakAmp * 0.35,\n uImpasto * prof.impastoAmp * 0.18 * uStrokeAmount, prof.hardness * 0.9, 8.9, prof.impastoFloor);\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, prof.densityMed * 0.7, prof.shapeType, prof.bristleAmp, flow2, t, 6.5,\n prof.energyGrade);\n paintOver(col, height, hX, prof.streakFreq, prof.streakAmp * 0.85,\n uImpasto * prof.impastoAmp * 0.55 * uStrokeAmount, prof.hardness, 6.5, prof.impastoFloor);\n }\n}\n\n// The shared stroke-medium SUBSTRATE finish (AX.W12 + AX.W13): paint the four-layer\n// cascade off the profile, then canvas-tooth + relight + saturation. The three painterly\n// STROKE mediums (oil / van-Gogh / oil-pastel) each AUTHOR their own profile and call\n// this \u2014 the substrate is shared, the PROFILE (not a dispatch-body fork) differentiates\n// the medium (slice 8 F6). mode passes through for the cascade's mode-special-cased shapes.\nvec3 paintStrokeMedium(vec3 col, vec2 p, float t, StrokeProfile prof, int mode) {\n vec3 result = col;\n // AW.W4.2 \u2014 accumulated paint HEIGHT across the stroke layers. The relight reads\n // its gradient for the normal; the canvas tooth seeds the base relief.\n float height = 0.0;\n paintStrokeLayers(result, height, prof, mode, p, t);\n\n // Canvas tooth \u2014 linen weave\n float tooth1 = vnoise(p * prof.toothScale);\n float tooth2 = vnoise(p * prof.toothScale * vec2(0.6, 2.4) + 37.0);\n float tooth = (0.6 * tooth1 + 0.4 * tooth2) - 0.5;\n result *= 1.0 + tooth * prof.toothAmp * uCanvasGrain;\n\n // AW.W4.2 \u2014 relight the accumulated paint height with the movable uLightDir\n // source (diffuse + Blinn specular, in LINEAR before aces()). The canvas tooth\n // is the base relief term so the weave also catches the raking light.\n float canvasBase = tooth * prof.toothAmp * 0.5;\n result = relightImpasto(result, height, canvasBase);\n\n // AX.W13 \u2014 the visible ground. The bare-ground gaps (low accumulated stroke height)\n // multiply toward prof.groundFloor, so van-Gogh's sparse atomic dabs read as separable\n // marks over a darker underpainting (oil/oil-pastel keep groundFloor=1.0 \u2192 no-op). The\n // smoothstep keeps the impasto dabs (high height) at full value; only the open ground\n // between them darkens.\n result *= mix(prof.groundFloor, 1.0, smoothstep(0.0, 0.38, height));\n\n // Pigment saturation boost\n result = saturate3(result, prof.pigmentSat);\n\n return result;\n}\n\nvec3 mediumOil(vec3 col, vec2 p, float t) {\n // The oil medium is a thin body: fetch the oil profile (mode-dispatched), paint via\n // the shared stroke substrate. uStrokeMode: 0 oil (gestural), 1 knife, 3 brushwork.\n int mode = uStrokeMode;\n StrokeProfile prof = profileFor(MEDIUM_OIL, mode);\n return paintStrokeMedium(col, p, t, prof, mode);\n}\n\n// AX.W13 \u2014 the van-Gogh atomic-stroke medium is now a FIRST-CLASS body, NOT a\n// mediumOil passthrough (slice 8 F0). It composes its OWN vangogh StrokeProfile (the\n// comma/crescent shapeType, sparse high-contrast atomic placement with visible\n// inter-stroke gaps, the full Starry-Night energy-grade cascade as a PROFILE field,\n// and full-height impasto crowns) through the shared stroke substrate. The bridge forces\n// the ETF (tensor) orientation so the swirl-rows queue along the color field's tangent;\n// the within-stroke OKLCh broken color (paintOver) + the OKLab stroke OVER-composite\n// give pigment-true atom-level shimmer. No subject matter \u2014 the \"source image\" is the\n// generated nuclei field, so dabs trace its iso-bands (the Starry-Night swirl-rows).\nvec3 mediumVangogh(vec3 col, vec2 p, float t) {\n StrokeProfile prof = profileFor(MEDIUM_VANGOGH, 0);\n return paintStrokeMedium(col, p, t, prof, 0);\n}\n\n// AX.W13 \u2014 the oil-pastel medium (uMedium==6) is a DISTINCT stroke-deposition body,\n// split out of the dry-crayon tooth-multiply (mediumCrayon) (slice 8 F1). It DEPOSITS\n// broad smeared directional strokes via the same brush engine with a creamy soft\n// hardness, heavy pigment build-up where strokes overlap, and a chroma punch \u2014 the\n// stroke-deposition model that gives oil-pastel its depth and less-uniform read.\n// Shares the SUBSTRATE (the stroke cascade + tooth + relight) with oil/van-Gogh, NOT\n// the dispatch body of dry crayon. The bridge forces tensor orientation.\nvec3 mediumOilPastel(vec3 col, vec2 p, float t) {\n StrokeProfile prof = profileFor(MEDIUM_OILPASTEL, 0);\n return paintStrokeMedium(col, p, t, prof, 0);\n}";
@@ -5,7 +5,7 @@ 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 AuroraInteractivity, type AuroraMedium, type AuroraNucleus, type FlowPattern, type OklchStop, type StrokeMode, type StrokeOrient, type WarpMode, } from "./constants/presets";
8
+ export { DEFAULT_AURORA_CONFIG, PAPER_WASH_GROUND, MAX_NUCLEI, MAX_STOPS, type AuroraConfig, type AuroraCursorApi, type AuroraFlow, type AuroraInstance, type AuroraInteractivity, type AuroraMedium, type AuroraNucleus, type FlowPattern, type OklchStop, type StrokeMode, type StrokeOrient, type WarpMode, } from "./constants/presets";
9
9
  export { resolveAtoms, configToAtoms, nucleiPrior, DEFAULT_ATOMS, type AuroraAtoms, type AuroraMotionAtom, type AuroraZones, type AuroraZoneArrangement, type AuroraMediumAtom, type AuroraInteractivityAtom, } from "./composables/atoms";
10
10
  export { cssToOklch, deriveAurora, flattenPalette, hexToOklchStop, oklchStopToHex, oklchToLinear, paletteToCssGradient, } from "./composables/color";
11
11
  export type { AuroraHarmony, DeriveAuroraOptions, DeriveEasing, } from "./composables/color";
@@ -30,18 +30,6 @@ type __VLS_Props = {
30
30
  link?: number;
31
31
  /** Drift speed. Default 0.16. */
32
32
  speed?: number;
33
- /**
34
- * AY.W-COHERE E3 — the per-instance outer-envelope RECESSION knob (the
35
- * aurora `opacityCeiling` / fourier `intensity` sibling — the SAME prop NAME
36
- * the other live substrates carry, so the four-substrate recession contract is
37
- * ONE vocabulary). The painted edge/node/web/ripple alpha scales by this value
38
- * OVER the mode-tuned `--constellation-alpha` base, so a constellation hero can
39
- * RECEDE behind content (StoryHero sets 0.4–0.6) exactly as its aurora + fourier
40
- * siblings do. Default `1` is byte-identical to HEAD (the draw-alpha trace is
41
- * unchanged — the default-OFF canary). NOT a second token: `--constellation-alpha`
42
- * stays the mode recession base, this is the per-instance loudness envelope.
43
- */
44
- opacityCeiling?: number;
45
33
  /**
46
34
  * Seed for a REPRODUCIBLE field. A `number` or `string` (hashed) seeds the
47
35
  * shared `mulberry32`; omit for a fresh `Math.random` field each mount.
@@ -1,4 +1,5 @@
1
- export { BASE_WIDTH } from "./constants";
1
+ /** Reference width the `k` scale factor is keyed to (CSS px). */
2
+ export declare const BASE_WIDTH = 1280;
2
3
  export interface ConstellationNode {
3
4
  x: number;
4
5
  y: number;
@@ -70,6 +71,15 @@ export interface ConstellationWander {
70
71
  /** the random extra idle (ms) added per cadence (so the rhythm is not metronomic). */
71
72
  jitter: number;
72
73
  }
74
+ /**
75
+ * Auto-DRIFT cadence DEFAULTS (AY.W-CON1 source; tokenised in AY.W-CON2). The
76
+ * `--constellation-wander-idle`/`-wander-jitter` tokens override these on mount via
77
+ * `readInteractionConfig` (the SAME numeric `--constellation-*` cohort as the warp
78
+ * spring + the well gains); a prop `{ minIdle, jitter }` still wins over the token.
79
+ * The 8s/8s default rhythm re-targets the focal mark every 8–16s (the slides cadence).
80
+ */
81
+ export declare const DEFAULT_WANDER_IDLE = 8000;
82
+ export declare const DEFAULT_WANDER_JITTER = 8000;
73
83
  /**
74
84
  * The warp-spring tuning the integrator reads (AY.W-CON2). Tokenised numeric (the
75
85
  * `--constellation-warp-*` cohort) so a consumer retunes the warp WITHOUT editing
@@ -196,15 +206,6 @@ export interface ConstellationProps {
196
206
  link?: number;
197
207
  /** Drift speed. Default 0.16. */
198
208
  speed?: number;
199
- /**
200
- * AY.W-COHERE E3 — the per-instance outer-envelope RECESSION knob (the aurora
201
- * `opacityCeiling` / fourier `intensity` sibling — ONE recession vocabulary
202
- * across the four live substrates). Scales the painted edge/node/web/ripple
203
- * alpha OVER the mode-tuned `--constellation-alpha` base so the lattice can
204
- * RECEDE behind content (0.4–0.6 in a hero). Default `1` is byte-identical to
205
- * HEAD.
206
- */
207
- opacityCeiling?: number;
208
209
  /** Seed for a reproducible field (number or hashed string); omit for `Math.random`. */
209
210
  seed?: number | string;
210
211
  /** Steer-toward-cursor + tap ripples. Default true; auto-off under reduced-motion. */
@@ -260,6 +261,31 @@ export interface ConstellationProps {
260
261
  /** The skin seam — paints the consumer's focal mark on the live field. */
261
262
  drawOverlay?: (ctx: CanvasRenderingContext2D, field: ConstellationField, now: number) => void;
262
263
  }
264
+ export declare const DEFAULT_PALETTE: ConstellationPalette;
265
+ /**
266
+ * Resolve the FULL neutral palette + legibility weights off a canvas's resolved
267
+ * custom properties (AX.W17). The colors AND the alpha multipliers route through
268
+ * the same `getComputedStyle` probe, so a dark-mode flip re-resolves BOTH the
269
+ * `:root`/`.dark` color arms AND the per-mode alpha defaults in one read.
270
+ */
271
+ export declare function readPalette(canvas: HTMLCanvasElement): ConstellationPalette;
272
+ /**
273
+ * Read the NUMERIC interaction-tuning tokens (the warp spring + the gravity-well
274
+ * gains) off a canvas's resolved custom properties — ONCE on mount (AY.W-CON2),
275
+ * via `parseFloat`, NOT per-frame `getComputedStyle` (the hot loop stays clean).
276
+ * Returns `{ warp, well }` configs the field carries; every member falls back to
277
+ * the shipped default when the token is absent (an SSR / no-token mount reads the
278
+ * byte-identical spring). The tokens are PLAIN numbers (`0.55`, `12000`), immune
279
+ * to the W30 `light-dark()`-into-Canvas2D leak (they never reach a `fillStyle`).
280
+ */
281
+ export declare function readInteractionConfig(canvas: HTMLCanvasElement): {
282
+ warp: ConstellationWarpConfig;
283
+ well: ConstellationWellConfig;
284
+ wander: {
285
+ minIdle: number;
286
+ jitter: number;
287
+ };
288
+ };
263
289
  /**
264
290
  * Seed `count` drifting nodes inside `w × h`. `rng` is a `() => number` in
265
291
  * `[0, 1)` (the glass-ui `mulberry32`/`Math.random`); a seeded `rng` lays out a
@@ -299,3 +325,118 @@ export declare function refitField(field: ConstellationField, prevW: number, pre
299
325
  * (a click-warp in flight pre-empts the cadence — `warpSettled` reports false).
300
326
  */
301
327
  export declare function stepField(field: ConstellationField, k: number, speed: number, pointer: ConstellationPointer | null, dt?: number, now?: number, rng?: () => number): void;
328
+ /**
329
+ * Advance the gravity-well one `dt` (AY.W-CON2). A transient held-pointer force
330
+ * composed inside `stepField` (NO new rAF): ease `well.strength` toward
331
+ * `well.target` (1 held / 0 released) at `cfg.ramp`/s; while active, add an
332
+ * inverse-square pull toward the held point onto each node within `cfg.reach`
333
+ * (the `max(d, soften)` no-singularity floor + the `cfg.maxSpeed` no-slingshot
334
+ * clamp); ALWAYS ease every node's |v| back toward `speed` (the field-cools
335
+ * invariant — so a released well re-settles). No-ops (entirely skipped) when
336
+ * `field.well` is undefined → the default render is byte-identical to HEAD.
337
+ *
338
+ * `dt` is clamped to {@link WARP_DT_CLAMP} (the same park-resume guard the warp
339
+ * uses) so a tab-throttle gap cannot slingshot the field in one giant step.
340
+ */
341
+ export declare function stepWell(field: ConstellationField, k: number, speed: number, dt: number): void;
342
+ /**
343
+ * Warp spring tuning DEFAULTS — gentle critically-damped (no overshoot on a focal
344
+ * mark). The `--constellation-warp-response`/`-zeta` tokens override these on mount
345
+ * via `field.warpCfg` (AY.W-CON2); these stay the byte-identical fallback.
346
+ *
347
+ * `WARP_RESPONSE` is the keyframes.js `(response, dampingFraction)` model's ANGULAR
348
+ * PERIOD (the SwiftUI `.spring(response:)` axis), `ω₀ = 2π/response` — NOT a
349
+ * settle-duration. At ζ=1 the 2%-settle lands at `t₂ ≈ 5.83/ω₀ ≈ 0.93·response`
350
+ * (the `(1 + ω₀t)e^(−ω₀t)` critically-damped envelope); the shipped 0.55 settles
351
+ * at ≈0.51s. This is the AY.W-CON2 ω-reconcile: the engine keeps the keyframes.js
352
+ * `ω₀ = 2π/response` convention (the shared house model — `regen-spring-tokens.mjs`,
353
+ * `keyframes.d.ts:860-882`) and mints NO second ω formula; the SEMANTIC honesty
354
+ * (period, not settle) lives in this doc + the token comment + the settle-time unit
355
+ * assertion, so a consumer setting the token gets the documented behaviour at ANY ζ.
356
+ */
357
+ export declare const WARP_RESPONSE = 0.55;
358
+ export declare const WARP_ZETA = 1;
359
+ /**
360
+ * Gravity-well tuning DEFAULTS (AY.W-CON2). The `--constellation-well-*` tokens
361
+ * override these on mount via `field.well.cfg`; these stay the fallback. SET by the
362
+ * §6 egg-live π readback (the field-perturbs-then-cools capture is the binding
363
+ * truth) — a moderate gain over a generous reach, a brisk ramp, a tight no-slingshot
364
+ * speed cap, and the singularity-soften floor.
365
+ */
366
+ export declare const DEFAULT_WELL_CONFIG: ConstellationWellConfig;
367
+ /**
368
+ * The nearest DRIFTING node to `(px, py)` in canvas-local px — a linear O(count)
369
+ * min-d² scan (count 64 default — negligible; matches the O(count²) edge pass).
370
+ * "Lattice point" = the nearest drifting NODE (the constellation has NO fixed
371
+ * lattice). `excludeIdx` drops a node from the candidate set (the focal node
372
+ * excludes ITSELF, so a cursor-on-focal warp no-ops). Returns `-1` if no
373
+ * eligible node exists (empty field, or only the excluded node).
374
+ */
375
+ export declare function nearestNode(field: ConstellationField, px: number, py: number, excludeIdx?: number): number;
376
+ /**
377
+ * Advance the focal-node warp spring one `dt` (seconds). A per-axis 2nd-order
378
+ * critically-damped integrator over `field.warp.{x,y}` toward the LIVE position
379
+ * of `field.nodes[field.warp.targetIdx]` — re-read EACH frame, so the spring
380
+ * CHASES a drifting target and arrives ON it (the identity-ride). No-ops when no
381
+ * warp is active (`targetIdx < 0`). `dt` is clamped to {@link WARP_DT_CLAMP} so a
382
+ * tab-throttle / offscreen-park-resume gap cannot teleport the mark.
383
+ *
384
+ * x += v·dt ; v += (−2ζω·v − ω²·(x − target))·dt
385
+ *
386
+ * Reads `(response, ζ)` from `field.warpCfg` (the tokenised override — AY.W-CON2),
387
+ * falling back to the shipped `WARP_RESPONSE`/`WARP_ZETA` defaults. `ω = 2π/response`
388
+ * is the keyframes.js `(response, dampingFraction)` convention (the SHARED house
389
+ * model — `ω₀` is the angular frequency, `response` its ANGULAR PERIOD, NOT a
390
+ * settle-duration; at ζ=1 the 2%-settle is `t₂ ≈ 5.83/ω₀ ≈ 0.93·response`). NO
391
+ * second ω formula is minted (the ω-reconcile). NOT its rAF — the FORBID-useSpring
392
+ * contract (a second rAF would defeat the parked-substrate one-path freeze).
393
+ */
394
+ export declare function warpStep(field: ConstellationField, dt: number): void;
395
+ /**
396
+ * Point the warp at a node INDEX (the live target-source seam). The focal node
397
+ * re-points to `idx`; the spring chases `nodes[idx]`'s LIVE position FROM the
398
+ * focal mark's CURRENT position (`warp.{x,y}`) — a continuous spring-eased path,
399
+ * never a snap. The component seeds `warp.{x,y}` at field-center on first layout,
400
+ * so even the first warp springs from a real start point. `idx < 0` clears the
401
+ * warp (the focal mark is removed). Re-pointing does NOT zero the velocity, so a
402
+ * mid-flight re-target curves smoothly toward the new node.
403
+ */
404
+ export declare function setWarpTarget(field: ConstellationField, idx: number): void;
405
+ /**
406
+ * Warp the focal node to the nearest drifting node to a canvas-LOCAL px point
407
+ * (the `warpTo(point)` primitive). The DEGENERATE case — the click's UNCONSTRAINED
408
+ * nearest node is already the current focal (cursor on/closest to the focal mark)
409
+ * — NO-OPS (returns the current focal; a click on yourself does not re-warp). Any
410
+ * OTHER click re-points to the nearest node, with the focal EXCLUDED from the
411
+ * candidate set (you never re-warp to yourself; the next-nearest wins). Returns
412
+ * the chosen node index, or `-1` when no eligible node exists. The component's
413
+ * `warpTo(clientX, clientY)` sugar maps client→local px via `toLocal` first.
414
+ */
415
+ export declare function warpTo(field: ConstellationField, px: number, py: number): number;
416
+ /**
417
+ * Is the warp spring ARRIVED on its target (AY.W-CON1)? True when there is no
418
+ * active target (`targetIdx < 0`) OR the focal's gap to its LIVE target node is
419
+ * within {@link WARP_SETTLE_BAND}. A click-warp in flight (hundreds of px out)
420
+ * reports NOT arrived, so a user click always PRE-EMPTS the auto-drift cadence
421
+ * (the wander only re-targets a spring that has reached its current node). The
422
+ * gate is POSITION-only by design — a critically-damped spring tracking a drifting
423
+ * node carries a non-zero steady-state velocity forever, so a velocity term would
424
+ * never clear on a live field.
425
+ */
426
+ export declare function warpSettled(field: ConstellationField): boolean;
427
+ /**
428
+ * Pick a random eligible node index for the auto-drift re-target (AY.W-CON1) —
429
+ * any node EXCEPT the current `focalIndex` (so the focal actually MOVES). `rng`
430
+ * is the seeded `() => number` in `[0, 1)`. A degenerate field (≤1 node, or only
431
+ * the current focal) returns the current focal, which `setWarpTarget` no-ops
432
+ * cleanly (no crash, no jump).
433
+ */
434
+ export declare function pickWanderTarget(field: ConstellationField, rng: () => number): number;
435
+ /** Pass 1 — hairline edges between any two nodes within `link` px (alpha falls off with distance). */
436
+ export declare function drawEdges(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette): void;
437
+ /** Pass 2 — ambient node dots. */
438
+ export declare function drawNodes(ctx: CanvasRenderingContext2D, field: ConstellationField, palette: ConstellationPalette): void;
439
+ /** Pass 3 — the cursor joins the web: faint links to nodes within reach + a soft cursor node. */
440
+ export declare function drawPointerWeb(ctx: CanvasRenderingContext2D, field: ConstellationField, link: number, palette: ConstellationPalette, pointer: ConstellationPointer | null): void;
441
+ /** Pass 4 — tap ripples: expanding rings that fade over ~0.9s; consumed entries are spliced. */
442
+ export declare function drawRipples(ctx: CanvasRenderingContext2D, field: ConstellationField, now: number, ripples: ConstellationRipple[], palette: ConstellationPalette): void;
@@ -1,5 +1,3 @@
1
1
  export { default as Constellation } from "./Constellation.vue";
2
- export { seedField, stepField, refitField, BASE_WIDTH, } from "./constellationField";
3
- export { stepWell, nearestNode, readInteractionConfig, warpStep, warpTo, setWarpTarget, warpSettled, pickWanderTarget, DEFAULT_WELL_CONFIG, DEFAULT_WANDER_IDLE, DEFAULT_WANDER_JITTER, WARP_RESPONSE, WARP_ZETA, } from "./constellationInteraction";
4
- export { readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, DEFAULT_PALETTE, } from "./constellationDraw";
2
+ export { seedField, stepField, stepWell, refitField, readPalette, drawEdges, drawNodes, drawPointerWeb, drawRipples, nearestNode, readInteractionConfig, warpStep, warpTo, setWarpTarget, warpSettled, pickWanderTarget, BASE_WIDTH, DEFAULT_PALETTE, DEFAULT_WELL_CONFIG, DEFAULT_WANDER_IDLE, DEFAULT_WANDER_JITTER, WARP_RESPONSE, WARP_ZETA, } from "./constellationField";
5
3
  export type { ConstellationNode, ConstellationRipple, ConstellationPointer, ConstellationPalette, ConstellationField, ConstellationWarp, ConstellationWarpConfig, ConstellationWander, ConstellationWell, ConstellationWellConfig, ConstellationProps, } from "./constellationField";
@@ -13,22 +13,11 @@ type __VLS_Props = {
13
13
  * @default false
14
14
  */
15
15
  disableTransitions?: boolean;
16
- /**
17
- * Opt-in slow-ECLIPSE register: a LONG-PRESS (vs the normal click) flips
18
- * the mode through an indulgent, stretched sun↔moon cross-fade — the
19
- * `--toggle-eclipse-duration` (≈1600ms) over the default 750ms. The bare
20
- * `@click` flip is UNCHANGED (the default-path canary). Under
21
- * `prefers-reduced-motion: reduce` the long-press flips INSTANTLY (no
22
- * eclipse). Default false — the toggle behaves exactly as before.
23
- * @default false
24
- */
25
- eclipse?: boolean;
26
16
  };
27
17
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
28
18
  size: DarkModeToggleSize;
29
19
  passive: boolean;
30
20
  disableTransitions: boolean;
31
- eclipse: boolean;
32
21
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
33
22
  declare const _default: typeof __VLS_export;
34
23
  export default _default;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * DeckProgress — a thin `:value`-only wrapper that renders the shipped
3
+ * `<Progress variant="default">` styled as the `.glass-progress-rail`
4
+ * deck-position rail (AW.W16).
5
+ *
6
+ * It owns the rail LOOK and NOTHING ELSE. The CONSUMER owns:
7
+ * - the position math — `value` is a pre-computed 0..100 percentage
8
+ * (`100·(k+1)/N` is a one-liner every consumer already keeps);
9
+ * - the viewport-pinned chrome — `position: fixed`,
10
+ * `bottom: env(safe-area-inset-bottom)`, the z-index — supplied via the
11
+ * forwarded `class` (a consumer pins it; this wrapper declares no
12
+ * positioning).
13
+ *
14
+ * NO `:index`/`:total` convenience path, NO `deckProgress()` math import, NO
15
+ * `/deck` subpath (the `/deck` name is reserved for the slides deck-engine
16
+ * lift). The wrapper ships on the root barrel like the other cherry-picked
17
+ * custom composites.
18
+ */
19
+ export interface DeckProgressProps {
20
+ /** Pre-computed deck-position percentage (0..100) the consumer supplies. */
21
+ value: number;
22
+ /** Forwarded class — the consumer pins the rail's viewport chrome here. */
23
+ class?: string;
24
+ }
25
+ declare const __VLS_export: import("vue").DefineComponent<DeckProgressProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<DeckProgressProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
26
+ declare const _default: typeof __VLS_export;
27
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export { default as DeckProgress } from "./DeckProgress.vue";
2
+ export type { DeckProgressProps } from "./DeckProgress.vue";