aeon-ui-engine 1.0.2 → 1.0.3

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 (219) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/CONSUMER.md +86 -0
  3. package/INTEGRATION.md +2 -0
  4. package/README.md +15 -4
  5. package/package.json +17 -1
  6. package/packages/core/dist/index.d.ts +257 -0
  7. package/packages/core/dist/index.js +378 -0
  8. package/packages/core/node_modules/.bin/esbuild +21 -0
  9. package/packages/core/node_modules/.bin/jiti +21 -0
  10. package/packages/core/node_modules/.bin/tsc +21 -0
  11. package/packages/core/node_modules/.bin/tsserver +21 -0
  12. package/packages/core/node_modules/.bin/tsup +21 -0
  13. package/packages/core/node_modules/.bin/tsup-node +21 -0
  14. package/packages/core/node_modules/.bin/tsx +21 -0
  15. package/packages/core/node_modules/.bin/vite +21 -0
  16. package/packages/core/node_modules/.bin/vitest +21 -0
  17. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  18. package/packages/geometry/dist/index.d.ts +50 -0
  19. package/packages/geometry/dist/index.js +88 -0
  20. package/packages/geometry/node_modules/.bin/esbuild +21 -0
  21. package/packages/geometry/node_modules/.bin/jiti +21 -0
  22. package/packages/geometry/node_modules/.bin/tsc +21 -0
  23. package/packages/geometry/node_modules/.bin/tsserver +21 -0
  24. package/packages/geometry/node_modules/.bin/tsup +21 -0
  25. package/packages/geometry/node_modules/.bin/tsup-node +21 -0
  26. package/packages/geometry/node_modules/.bin/tsx +21 -0
  27. package/packages/primitives/dist/chunk-5S4DIRL4.js +42 -0
  28. package/packages/primitives/dist/chunk-H4KOEPYC.js +52 -0
  29. package/packages/primitives/dist/chunk-HONROWUG.js +41 -0
  30. package/packages/primitives/dist/chunk-J6JHKMVM.js +90 -0
  31. package/packages/primitives/dist/chunk-JBAG5E6W.js +46 -0
  32. package/packages/primitives/dist/chunk-LVNCD5F2.js +43 -0
  33. package/packages/primitives/dist/chunk-PB3LFHXU.js +72 -0
  34. package/packages/primitives/dist/chunk-SZV6KGXN.js +49 -0
  35. package/packages/primitives/dist/chunk-WVICCOQH.js +56 -0
  36. package/packages/primitives/dist/chunk-ZMGRX64G.js +74 -0
  37. package/packages/primitives/dist/index.d.ts +11 -0
  38. package/packages/primitives/dist/index.js +60 -0
  39. package/packages/primitives/dist/machines/accordion.d.ts +34 -0
  40. package/packages/primitives/dist/machines/accordion.js +6 -0
  41. package/packages/primitives/dist/machines/async.d.ts +111 -0
  42. package/packages/primitives/dist/machines/async.js +12 -0
  43. package/packages/primitives/dist/machines/button.d.ts +45 -0
  44. package/packages/primitives/dist/machines/button.js +8 -0
  45. package/packages/primitives/dist/machines/dialog.d.ts +57 -0
  46. package/packages/primitives/dist/machines/dialog.js +6 -0
  47. package/packages/primitives/dist/machines/field.d.ts +72 -0
  48. package/packages/primitives/dist/machines/field.js +12 -0
  49. package/packages/primitives/dist/machines/popover.d.ts +54 -0
  50. package/packages/primitives/dist/machines/popover.js +6 -0
  51. package/packages/primitives/dist/machines/slider.d.ts +71 -0
  52. package/packages/primitives/dist/machines/slider.js +10 -0
  53. package/packages/primitives/dist/machines/tabs.d.ts +39 -0
  54. package/packages/primitives/dist/machines/tabs.js +6 -0
  55. package/packages/primitives/dist/machines/toast.d.ts +31 -0
  56. package/packages/primitives/dist/machines/toast.js +6 -0
  57. package/packages/primitives/dist/machines/toggle.d.ts +54 -0
  58. package/packages/primitives/dist/machines/toggle.js +6 -0
  59. package/packages/primitives/node_modules/.bin/jiti +21 -0
  60. package/packages/primitives/node_modules/.bin/tsc +21 -0
  61. package/packages/primitives/node_modules/.bin/tsserver +21 -0
  62. package/packages/primitives/node_modules/.bin/tsup +21 -0
  63. package/packages/primitives/node_modules/.bin/tsup-node +21 -0
  64. package/packages/primitives/node_modules/.bin/tsx +21 -0
  65. package/packages/primitives/node_modules/.bin/vitest +21 -0
  66. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  67. package/packages/react/dist/index.d.ts +564 -0
  68. package/packages/react/dist/index.js +3461 -0
  69. package/packages/react/node_modules/.bin/jiti +21 -0
  70. package/packages/react/node_modules/.bin/tsc +21 -0
  71. package/packages/react/node_modules/.bin/tsserver +21 -0
  72. package/packages/react/node_modules/.bin/tsup +21 -0
  73. package/packages/react/node_modules/.bin/tsup-node +21 -0
  74. package/packages/react/node_modules/.bin/tsx +21 -0
  75. package/packages/react/node_modules/.bin/vitest +21 -0
  76. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  77. package/packages/react-scene/dist/index.d.ts +121 -0
  78. package/packages/react-scene/dist/index.js +430 -0
  79. package/packages/react-scene/node_modules/.bin/jiti +21 -0
  80. package/packages/react-scene/node_modules/.bin/tsc +21 -0
  81. package/packages/react-scene/node_modules/.bin/tsserver +21 -0
  82. package/packages/react-scene/node_modules/.bin/tsup +21 -0
  83. package/packages/react-scene/node_modules/.bin/tsup-node +21 -0
  84. package/packages/react-scene/node_modules/.bin/tsx +21 -0
  85. package/packages/scene/dist/index.d.ts +46 -0
  86. package/packages/scene/dist/index.js +54 -0
  87. package/packages/scene/node_modules/.bin/jiti +21 -0
  88. package/packages/scene/node_modules/.bin/tsc +21 -0
  89. package/packages/scene/node_modules/.bin/tsserver +21 -0
  90. package/packages/scene/node_modules/.bin/tsup +21 -0
  91. package/packages/scene/node_modules/.bin/tsup-node +21 -0
  92. package/packages/scene/node_modules/.bin/tsx +21 -0
  93. package/packages/signal/dist/index.d.ts +54 -0
  94. package/packages/signal/dist/index.js +169 -0
  95. package/packages/signal/node_modules/.bin/jiti +21 -0
  96. package/packages/signal/node_modules/.bin/tsc +21 -0
  97. package/packages/signal/node_modules/.bin/tsserver +21 -0
  98. package/packages/signal/node_modules/.bin/tsup +21 -0
  99. package/packages/signal/node_modules/.bin/tsup-node +21 -0
  100. package/packages/signal/node_modules/.bin/tsx +21 -0
  101. package/packages/site/dist/index.d.ts +31 -0
  102. package/packages/site/dist/index.js +62 -0
  103. package/packages/site/node_modules/.bin/jiti +21 -0
  104. package/packages/site/node_modules/.bin/tsc +21 -0
  105. package/packages/site/node_modules/.bin/tsserver +21 -0
  106. package/packages/site/node_modules/.bin/tsup +21 -0
  107. package/packages/site/node_modules/.bin/tsup-node +21 -0
  108. package/packages/site/node_modules/.bin/tsx +21 -0
  109. package/packages/solid/dist/index.d.ts +30 -0
  110. package/packages/solid/dist/index.js +174 -0
  111. package/packages/solid/node_modules/.bin/jiti +21 -0
  112. package/packages/solid/node_modules/.bin/tsc +21 -0
  113. package/packages/solid/node_modules/.bin/tsserver +21 -0
  114. package/packages/solid/node_modules/.bin/tsup +21 -0
  115. package/packages/solid/node_modules/.bin/tsup-node +21 -0
  116. package/packages/solid/node_modules/.bin/tsx +21 -0
  117. package/packages/surface/dist/index.d.ts +8 -0
  118. package/packages/surface/dist/index.js +14 -0
  119. package/packages/surface/node_modules/.bin/jiti +21 -0
  120. package/packages/surface/node_modules/.bin/tsc +21 -0
  121. package/packages/surface/node_modules/.bin/tsserver +21 -0
  122. package/packages/surface/node_modules/.bin/tsup +21 -0
  123. package/packages/surface/node_modules/.bin/tsup-node +21 -0
  124. package/packages/surface/node_modules/.bin/tsx +21 -0
  125. package/packages/svelte/dist/index.d.ts +12 -0
  126. package/packages/svelte/dist/index.js +15 -0
  127. package/packages/svelte/node_modules/.bin/acorn +21 -0
  128. package/packages/svelte/node_modules/.bin/jiti +21 -0
  129. package/packages/svelte/node_modules/.bin/svelte-check +21 -0
  130. package/packages/svelte/node_modules/.bin/tsc +21 -0
  131. package/packages/svelte/node_modules/.bin/tsserver +21 -0
  132. package/packages/svelte/node_modules/.bin/tsup +21 -0
  133. package/packages/svelte/node_modules/.bin/tsup-node +21 -0
  134. package/packages/svelte/node_modules/.bin/tsx +21 -0
  135. package/packages/svelte/node_modules/.bin/vite +21 -0
  136. package/packages/ui/dist/index.d.ts +200 -0
  137. package/packages/ui/dist/index.js +429 -0
  138. package/packages/ui/node_modules/.bin/jiti +21 -0
  139. package/packages/ui/node_modules/.bin/tsc +21 -0
  140. package/packages/ui/node_modules/.bin/tsserver +21 -0
  141. package/packages/ui/node_modules/.bin/tsup +21 -0
  142. package/packages/ui/node_modules/.bin/tsup-node +21 -0
  143. package/packages/ui/node_modules/.bin/tsx +21 -0
  144. package/packages/vue/dist/index.d.ts +71 -0
  145. package/packages/vue/dist/index.js +193 -0
  146. package/packages/vue/node_modules/.bin/jiti +21 -0
  147. package/packages/vue/node_modules/.bin/tsc +21 -0
  148. package/packages/vue/node_modules/.bin/tsserver +21 -0
  149. package/packages/vue/node_modules/.bin/tsup +21 -0
  150. package/packages/vue/node_modules/.bin/tsup-node +21 -0
  151. package/packages/vue/node_modules/.bin/tsx +21 -0
  152. package/scripts/vite-aliases.mjs +125 -0
  153. package/.changeset/README.md +0 -23
  154. package/.changeset/combobox-and-changesets.md +0 -9
  155. package/.changeset/config.json +0 -31
  156. package/.changeset/framework-adapters.md +0 -12
  157. package/.changeset/scene-3d.md +0 -6
  158. package/.changeset/scene-plane.md +0 -8
  159. package/.changeset/site-og.md +0 -5
  160. package/.cursor/rules/aeon-ui.mdc +0 -22
  161. package/ACCESSIBILITY.md +0 -32
  162. package/AGENTS.md +0 -226
  163. package/COMPONENTS.md +0 -41
  164. package/FRAMEWORKS.md +0 -57
  165. package/PHILOSOPHY.md +0 -71
  166. package/PUBLISHING.md +0 -105
  167. package/SCENE.md +0 -113
  168. package/STATES.md +0 -243
  169. package/apps/demo/index.html +0 -31
  170. package/apps/demo/og.config.mjs +0 -20
  171. package/apps/demo/package.json +0 -41
  172. package/apps/demo/public/favicon.svg +0 -16
  173. package/apps/demo/public/og-aeon-ui-engine.png +0 -0
  174. package/apps/demo/public/og.svg +0 -35
  175. package/apps/demo/scripts/generate-og-png.mjs +0 -62
  176. package/apps/demo/src/App.tsx +0 -31
  177. package/apps/demo/src/aeonDiagrams.ts +0 -42
  178. package/apps/demo/src/app.css +0 -16
  179. package/apps/demo/src/components/ActionCluster.tsx +0 -20
  180. package/apps/demo/src/components/AsyncMachineDemo.tsx +0 -97
  181. package/apps/demo/src/components/ButtonLifecycleDemo.tsx +0 -63
  182. package/apps/demo/src/components/CodeExample.tsx +0 -7
  183. package/apps/demo/src/components/ComboboxDemo.tsx +0 -30
  184. package/apps/demo/src/components/DiagramsSection.tsx +0 -37
  185. package/apps/demo/src/components/FieldStateDemo.tsx +0 -51
  186. package/apps/demo/src/components/GridMesh.tsx +0 -8
  187. package/apps/demo/src/components/HeroInstall.tsx +0 -13
  188. package/apps/demo/src/components/LandingFaq.tsx +0 -29
  189. package/apps/demo/src/components/LandingFooter.tsx +0 -30
  190. package/apps/demo/src/components/LandingHeader.tsx +0 -62
  191. package/apps/demo/src/components/LandingHero.tsx +0 -55
  192. package/apps/demo/src/components/LayersSection.tsx +0 -47
  193. package/apps/demo/src/components/MermaidDiagram.tsx +0 -86
  194. package/apps/demo/src/components/PhilosophySection.tsx +0 -31
  195. package/apps/demo/src/components/PlaygroundBlock.tsx +0 -18
  196. package/apps/demo/src/components/PlaygroundControlsDemo.tsx +0 -63
  197. package/apps/demo/src/components/PlaygroundSection.tsx +0 -120
  198. package/apps/demo/src/components/ScrollRegionDemo.tsx +0 -74
  199. package/apps/demo/src/components/ThemeSwitcher.tsx +0 -79
  200. package/apps/demo/src/demo-layout.css +0 -293
  201. package/apps/demo/src/landing.css +0 -1143
  202. package/apps/demo/src/main.tsx +0 -14
  203. package/apps/demo/src/nav.ts +0 -9
  204. package/apps/demo/src/site.ts +0 -218
  205. package/apps/demo/tsconfig.json +0 -17
  206. package/apps/demo/vite-plugins/og-meta.ts +0 -30
  207. package/apps/demo/vite.config.ts +0 -69
  208. package/docs/API_PATTERNS.md +0 -234
  209. package/docs/ARCHITECTURE.md +0 -125
  210. package/docs/COMPONENT_CHECKLIST.md +0 -103
  211. package/docs/FILE_MAP.md +0 -122
  212. package/docs/GLOSSARY.md +0 -125
  213. package/docs/INDEX.md +0 -53
  214. package/docs/LAYOUT_COORDINATES.md +0 -178
  215. package/docs/MACHINES.md +0 -171
  216. package/docs/MIGRATION_FROM_ARK.md +0 -295
  217. package/docs/VITE_CONSUMER.md +0 -114
  218. package/pnpm-workspace.yaml +0 -3
  219. package/vercel.json +0 -12
@@ -0,0 +1,378 @@
1
+ // src/philosophy.ts
2
+ var AEON_PRINCIPLE = "State is defined first. UI represents the totality of that definition.";
3
+ var UI_IS_FUNCTION_OF_STATE = "UI = f(state)";
4
+
5
+ // src/anatomy.ts
6
+ function anatomy(scope, parts) {
7
+ return Object.fromEntries(parts.map((p) => [p, p]));
8
+ }
9
+ var buttonAnatomy = anatomy("button", [
10
+ "root",
11
+ "group",
12
+ "label",
13
+ "icon"
14
+ ]);
15
+ var switchAnatomy = anatomy("switch", [
16
+ "root",
17
+ "control",
18
+ "thumb",
19
+ "label",
20
+ "hiddenInput"
21
+ ]);
22
+ var checkboxAnatomy = anatomy("checkbox", [
23
+ "root",
24
+ "control",
25
+ "indicator",
26
+ "label",
27
+ "hiddenInput"
28
+ ]);
29
+ var dialogAnatomy = anatomy("dialog", [
30
+ "root",
31
+ "trigger",
32
+ "portal",
33
+ "backdrop",
34
+ "positioner",
35
+ "content",
36
+ "title",
37
+ "description",
38
+ "closeTrigger"
39
+ ]);
40
+ var tabsAnatomy = anatomy("tabs", [
41
+ "root",
42
+ "list",
43
+ "trigger",
44
+ "content",
45
+ "indicator"
46
+ ]);
47
+ var accordionAnatomy = anatomy("accordion", [
48
+ "root",
49
+ "item",
50
+ "itemTrigger",
51
+ "itemContent",
52
+ "itemIndicator"
53
+ ]);
54
+ var asyncAnatomy = anatomy("async", [
55
+ "root",
56
+ "track",
57
+ "segment",
58
+ "readout",
59
+ "readoutRail",
60
+ "readoutBody",
61
+ "actions"
62
+ ]);
63
+ var fieldAnatomy = anatomy("field", [
64
+ "root",
65
+ "label",
66
+ "control",
67
+ "textarea",
68
+ "message",
69
+ "hint"
70
+ ]);
71
+ var scrollAnatomy = anatomy("scroll", ["root", "viewport", "content"]);
72
+ var playSurfaceAnatomy = anatomy("play", ["mat", "table", "dice", "bank"]);
73
+ var selectAnatomy = anatomy("select", [
74
+ "root",
75
+ "trigger",
76
+ "value",
77
+ "icon",
78
+ "positioner",
79
+ "content",
80
+ "item"
81
+ ]);
82
+ var comboboxAnatomy = anatomy("combobox", [
83
+ "root",
84
+ "input",
85
+ "icon",
86
+ "content",
87
+ "item",
88
+ "empty"
89
+ ]);
90
+ var popoverAnatomy = anatomy("popover", [
91
+ "root",
92
+ "trigger",
93
+ "positioner",
94
+ "content",
95
+ "arrow",
96
+ "closeTrigger"
97
+ ]);
98
+ var menuAnatomy = anatomy("menu", [
99
+ "root",
100
+ "trigger",
101
+ "positioner",
102
+ "content",
103
+ "item",
104
+ "separator"
105
+ ]);
106
+ var tooltipAnatomy = anatomy("tooltip", [
107
+ "root",
108
+ "trigger",
109
+ "positioner",
110
+ "content",
111
+ "arrow"
112
+ ]);
113
+ var toastAnatomy = anatomy("toast", [
114
+ "viewport",
115
+ "root",
116
+ "title",
117
+ "description",
118
+ "closeTrigger"
119
+ ]);
120
+ var avatarAnatomy = anatomy("avatar", ["root", "image", "fallback"]);
121
+ var separatorAnatomy = anatomy("separator", ["root"]);
122
+ var progressAnatomy = anatomy("progress", ["root", "track", "range", "label"]);
123
+ var radioGroupAnatomy = anatomy("radioGroup", [
124
+ "root",
125
+ "item",
126
+ "itemControl",
127
+ "itemIndicator",
128
+ "itemLabel"
129
+ ]);
130
+ var sliderAnatomy = anatomy("slider", [
131
+ "root",
132
+ "track",
133
+ "range",
134
+ "thumb",
135
+ "valueText"
136
+ ]);
137
+ var pinInputAnatomy = anatomy("pinInput", ["root", "input"]);
138
+
139
+ // src/attrs.ts
140
+ function stateFields(options) {
141
+ const states = options?.state ? Array.isArray(options.state) ? options.state.join(" ") : options.state : void 0;
142
+ return {
143
+ ...states ? { "data-aeon-state": states } : {},
144
+ ...options?.disabled ? { "data-disabled": "" } : {},
145
+ ...options?.focus ? { "data-focus": "" } : {},
146
+ ...options?.highlighted ? { "data-highlighted": "" } : {}
147
+ };
148
+ }
149
+ function scopeAttrs(scope, part = "root", options) {
150
+ return {
151
+ "data-aeon-scope": scope,
152
+ "data-aeon-part": part,
153
+ ...stateFields(options)
154
+ };
155
+ }
156
+ function partOnlyAttrs(part, options) {
157
+ return {
158
+ "data-aeon-part": part,
159
+ ...stateFields(options)
160
+ };
161
+ }
162
+ function partAttrs(scope, part, options) {
163
+ return scopeAttrs(scope, part, options);
164
+ }
165
+
166
+ // src/machine.ts
167
+ import { setup } from "xstate";
168
+ function stateToAttr(value) {
169
+ if (value == null || typeof value === "string") return String(value ?? "");
170
+ return Object.entries(value).map(([k, v]) => `${k}:${stateToAttr(v)}`).join(" ");
171
+ }
172
+
173
+ // src/scroll.ts
174
+ var EPS = 1;
175
+ function canScrollY(el) {
176
+ return el.scrollHeight > el.clientHeight + EPS;
177
+ }
178
+ function canScrollX(el) {
179
+ return el.scrollWidth > el.clientWidth + EPS;
180
+ }
181
+ function getScrollSnapshot(el) {
182
+ const scrollY = canScrollY(el);
183
+ const scrollX = canScrollX(el);
184
+ let overflow = "none";
185
+ if (scrollY && scrollX) overflow = "both";
186
+ else if (scrollY) overflow = "y";
187
+ else if (scrollX) overflow = "x";
188
+ const atStartY = !scrollY || el.scrollTop <= EPS;
189
+ const atEndY = !scrollY || el.scrollTop + el.clientHeight >= el.scrollHeight - EPS;
190
+ const betweenY = scrollY && !atStartY && !atEndY;
191
+ const atStartX = !scrollX || el.scrollLeft <= EPS;
192
+ const atEndX = !scrollX || el.scrollLeft + el.clientWidth >= el.scrollWidth - EPS;
193
+ const betweenX = scrollX && !atStartX && !atEndX;
194
+ const parts = [];
195
+ if (overflow === "none") parts.push("idle");
196
+ else parts.push(`overflow-${overflow}`);
197
+ if (scrollY) {
198
+ if (atStartY && atEndY) parts.push("at-start-y", "at-end-y");
199
+ else if (atStartY) parts.push("at-start-y");
200
+ else if (atEndY) parts.push("at-end-y");
201
+ else parts.push("between-y");
202
+ }
203
+ if (scrollX) {
204
+ if (atStartX && atEndX) parts.push("at-start-x", "at-end-x");
205
+ else if (atStartX) parts.push("at-start-x");
206
+ else if (atEndX) parts.push("at-end-x");
207
+ else parts.push("between-x");
208
+ }
209
+ return {
210
+ overflow,
211
+ stateAttr: parts.join(" "),
212
+ atStartY,
213
+ atEndY,
214
+ betweenY,
215
+ atStartX,
216
+ atEndX,
217
+ betweenX
218
+ };
219
+ }
220
+
221
+ // src/layout.ts
222
+ var NORM_PLANE = {
223
+ bottomLeft: "bottom-left",
224
+ topLeft: "top-left"
225
+ };
226
+ var DEFAULT_COMPACT_MQ = "(max-width: 39.99rem)";
227
+ function clampNorm(point, bounds) {
228
+ return {
229
+ x: Math.min(bounds.xMax, Math.max(bounds.xMin, point.x)),
230
+ y: Math.min(bounds.yMax, Math.max(bounds.yMin, point.y))
231
+ };
232
+ }
233
+ function normFromClient(rect, clientX, clientY, options) {
234
+ const origin = options?.origin ?? NORM_PLANE.bottomLeft;
235
+ const w = rect.width || 1;
236
+ const h = rect.height || 1;
237
+ const x = (clientX - rect.left) / w * 100;
238
+ const yFromTop = (clientY - rect.top) / h;
239
+ const y = origin === NORM_PLANE.bottomLeft ? (1 - yFromTop) * 100 : yFromTop * 100;
240
+ const raw = { x, y };
241
+ return options?.bounds ? clampNorm(raw, options.bounds) : raw;
242
+ }
243
+ function clientFromNorm(rect, point, options) {
244
+ const origin = options?.origin ?? NORM_PLANE.bottomLeft;
245
+ const w = rect.width || 1;
246
+ const h = rect.height || 1;
247
+ const clientX = rect.left + point.x / 100 * w;
248
+ const yFromTop = origin === NORM_PLANE.bottomLeft ? 1 - point.y / 100 : point.y / 100;
249
+ const clientY = rect.top + yFromTop * h;
250
+ return { clientX, clientY };
251
+ }
252
+ function measureElement(el) {
253
+ if (!el || !("getBoundingClientRect" in el)) return null;
254
+ const rect = el.getBoundingClientRect();
255
+ return rect.width > 0 && rect.height > 0 ? rect : null;
256
+ }
257
+ function resolveRegionRect(primary, fallback) {
258
+ if (primary && primary.width > 0 && primary.height > 0) return primary;
259
+ if (fallback && fallback.width > 0 && fallback.height > 0) return fallback;
260
+ return null;
261
+ }
262
+ function matchLayoutMode(spec, mq = getCompactMq(spec)) {
263
+ return mq.matches ? "compact" : "wide";
264
+ }
265
+ function getCompactMq(spec) {
266
+ const query = spec.compactMq ?? DEFAULT_COMPACT_MQ;
267
+ if (typeof window === "undefined" || !window.matchMedia) {
268
+ return { matches: false };
269
+ }
270
+ return window.matchMedia(query);
271
+ }
272
+ function layoutCompositionForMode(spec, mode) {
273
+ return spec.modes[mode];
274
+ }
275
+ function regionBoundsForMode(spec, mode, regionId) {
276
+ return spec.modes[mode].bounds?.[regionId];
277
+ }
278
+ function layoutModeAttrs(mode, composition) {
279
+ return {
280
+ "data-aeon-layout-mode": mode,
281
+ "data-aeon-layout-composition": composition
282
+ };
283
+ }
284
+ function insetNormCluster(point, bounds, inset = {}) {
285
+ const padX = inset.x ?? 0;
286
+ const padY = inset.y ?? 0;
287
+ const halfX = (bounds.xMax - bounds.xMin) / 2;
288
+ const halfY = (bounds.yMax - bounds.yMin) / 2;
289
+ const capX = Math.min(padX, halfX - 0.5);
290
+ const capY = Math.min(padY, halfY - 0.5);
291
+ return {
292
+ x: Math.min(bounds.xMax - capX, Math.max(bounds.xMin + capX, point.x)),
293
+ y: Math.min(bounds.yMax - capY, Math.max(bounds.yMin + capY, point.y))
294
+ };
295
+ }
296
+
297
+ // src/theme.ts
298
+ var AEON_THEME_TRANSITION_CLASS = "aeon-theme-transition";
299
+ function isAeonColorMode(value) {
300
+ return value === "light" || value === "dark";
301
+ }
302
+ function resolveAeonColorMode(theme, systemPrefersDark = false) {
303
+ if (theme === "dark") return "dark";
304
+ if (theme === "light") return "light";
305
+ return systemPrefersDark ? "dark" : "light";
306
+ }
307
+ function syncAeonColorMode(root, mode, options) {
308
+ const themeId = options?.themeId ?? root.dataset.aeonTheme ?? "default";
309
+ root.dataset.aeonTheme = themeId;
310
+ root.dataset.aeonMode = mode;
311
+ root.style.colorScheme = mode;
312
+ if (options?.enableTransitionClass !== false) {
313
+ root.classList.add(AEON_THEME_TRANSITION_CLASS);
314
+ }
315
+ }
316
+ function runAeonThemeTransition(apply) {
317
+ if (typeof document === "undefined") {
318
+ apply();
319
+ return;
320
+ }
321
+ const start = document.startViewTransition;
322
+ if (typeof start === "function") {
323
+ start.call(document, apply);
324
+ return;
325
+ }
326
+ apply();
327
+ }
328
+ export {
329
+ AEON_PRINCIPLE,
330
+ AEON_THEME_TRANSITION_CLASS,
331
+ DEFAULT_COMPACT_MQ,
332
+ NORM_PLANE,
333
+ UI_IS_FUNCTION_OF_STATE,
334
+ accordionAnatomy,
335
+ anatomy,
336
+ asyncAnatomy,
337
+ avatarAnatomy,
338
+ buttonAnatomy,
339
+ checkboxAnatomy,
340
+ clampNorm,
341
+ clientFromNorm,
342
+ comboboxAnatomy,
343
+ setup as createAeonMachine,
344
+ dialogAnatomy,
345
+ fieldAnatomy,
346
+ getCompactMq,
347
+ getScrollSnapshot,
348
+ insetNormCluster,
349
+ isAeonColorMode,
350
+ layoutCompositionForMode,
351
+ layoutModeAttrs,
352
+ matchLayoutMode,
353
+ measureElement,
354
+ menuAnatomy,
355
+ normFromClient,
356
+ partAttrs,
357
+ partOnlyAttrs,
358
+ pinInputAnatomy,
359
+ playSurfaceAnatomy,
360
+ popoverAnatomy,
361
+ progressAnatomy,
362
+ radioGroupAnatomy,
363
+ regionBoundsForMode,
364
+ resolveAeonColorMode,
365
+ resolveRegionRect,
366
+ runAeonThemeTransition,
367
+ scopeAttrs,
368
+ scrollAnatomy,
369
+ selectAnatomy,
370
+ separatorAnatomy,
371
+ sliderAnatomy,
372
+ stateToAttr,
373
+ switchAnatomy,
374
+ syncAeonColorMode,
375
+ tabsAnatomy,
376
+ toastAnatomy,
377
+ tooltipAnatomy
378
+ };
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-cli.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-cli.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsc" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
19
+ else
20
+ exec node "$basedir/../typescript/bin/tsserver" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../tsup/dist/cli-default.js" "$@"
19
+ else
20
+ exec node "$basedir/../tsup/dist/cli-default.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../tsup/dist/cli-node.js" "$@"
19
+ else
20
+ exec node "$basedir/../tsup/dist/cli-node.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/dist/cli.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/tsx@4.22.3/node_modules/tsx/dist/cli.mjs" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
21
+ fi
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
3
+
4
+ case `uname` in
5
+ *CYGWIN*|*MINGW*|*MSYS*)
6
+ if command -v cygpath > /dev/null 2>&1; then
7
+ basedir=`cygpath -w "$basedir"`
8
+ fi
9
+ ;;
10
+ esac
11
+
12
+ if [ -z "$NODE_PATH" ]; then
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
+ else
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
+ fi
17
+ if [ -x "$basedir/node" ]; then
18
+ exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
19
+ else
20
+ exec node "$basedir/../vitest/vitest.mjs" "$@"
21
+ fi
@@ -0,0 +1 @@
1
+ {"version":"3.2.4","results":[[":src/machine.test.ts",{"duration":2.2672079999999823,"failed":false}],[":src/theme.test.ts",{"duration":1.6362909999999715,"failed":false}]]}
@@ -0,0 +1,50 @@
1
+ type SceneState = 'idle' | 'active' | 'paused';
2
+ /** `data-aeon-scope="scene"` for ambient regions (backdrops, visualizers). */
3
+ declare function sceneAttrs(part: string, state?: SceneState): Record<string, unknown>;
4
+
5
+ type GridPatternOptions = {
6
+ cell?: number;
7
+ lineColor?: string;
8
+ lineWidth?: number;
9
+ };
10
+ /** CSS `background-image` for an orthogonal grid (no external assets). */
11
+ declare function gridPatternStyle(options?: GridPatternOptions): {
12
+ backgroundImage: string;
13
+ backgroundSize: string;
14
+ };
15
+ type WavePatternOptions = {
16
+ wavelength?: number;
17
+ amplitude?: number;
18
+ stroke?: string;
19
+ strokeWidth?: number;
20
+ };
21
+ /** SVG path `d` for a horizontal sine wave across `width`. */
22
+ declare function wavePath(width: number, height: number, options?: WavePatternOptions): string;
23
+ /** Radial vignette as CSS gradient for scene overlays. */
24
+ declare function vignetteStyle(options?: {
25
+ strength?: number;
26
+ }): {
27
+ background: string;
28
+ };
29
+
30
+ type BarRect = {
31
+ x: number;
32
+ y: number;
33
+ w: number;
34
+ h: number;
35
+ fill: string;
36
+ };
37
+ type BarLayoutOptions = {
38
+ count: number;
39
+ viewWidth: number;
40
+ viewHeight: number;
41
+ barWidth?: number;
42
+ gap?: number;
43
+ fills?: readonly string[];
44
+ };
45
+ /** Evenly spaced vertical bars for spectrum-style SVG (Soundbase-style layout). */
46
+ declare function barLayout(options: BarLayoutOptions): BarRect[];
47
+ /** Centered Y scale transform for one bar (scale applied around bar center). */
48
+ declare function barScaleTransform(bar: BarRect, scaleY: number): string;
49
+
50
+ export { type BarLayoutOptions, type BarRect, type GridPatternOptions, type SceneState, type WavePatternOptions, barLayout, barScaleTransform, gridPatternStyle, sceneAttrs, vignetteStyle, wavePath };