aeon-ui-engine 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/CONSUMER.md +39 -42
  3. package/README.md +47 -16
  4. package/package.json +9 -2
  5. package/packages/cli/README.md +17 -0
  6. package/packages/cli/dist/bin.d.ts +1 -0
  7. package/packages/cli/dist/bin.js +35 -0
  8. package/packages/cli/dist/chunk-IW5NT2Z2.js +103 -0
  9. package/packages/cli/dist/index.d.ts +10 -0
  10. package/packages/cli/dist/index.js +6 -0
  11. package/packages/cli/node_modules/.bin/esbuild +21 -0
  12. package/packages/cli/node_modules/.bin/jiti +21 -0
  13. package/packages/cli/node_modules/.bin/tsc +21 -0
  14. package/packages/cli/node_modules/.bin/tsserver +21 -0
  15. package/packages/cli/node_modules/.bin/tsup +21 -0
  16. package/packages/cli/node_modules/.bin/tsup-node +21 -0
  17. package/packages/cli/node_modules/.bin/tsx +21 -0
  18. package/packages/cli/node_modules/.bin/vite +21 -0
  19. package/packages/cli/node_modules/.bin/vitest +21 -0
  20. package/packages/cli/package.json +50 -0
  21. package/packages/cli/src/bin.ts +34 -0
  22. package/packages/cli/src/index.ts +1 -0
  23. package/packages/cli/src/init.ts +107 -0
  24. package/packages/cli/tsconfig.json +10 -0
  25. package/packages/core/README.md +7 -1
  26. package/packages/core/dist/index.d.ts +174 -6
  27. package/packages/core/dist/index.js +259 -2
  28. package/packages/core/node_modules/.bin/esbuild +4 -4
  29. package/packages/core/node_modules/.bin/vite +4 -4
  30. package/packages/core/node_modules/.bin/vitest +2 -2
  31. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  32. package/packages/core/package.json +17 -5
  33. package/packages/core/src/anatomy.ts +196 -5
  34. package/packages/core/src/machine.test.ts +62 -1
  35. package/packages/core/src/machine.ts +93 -0
  36. package/packages/core/src/theme.ts +105 -0
  37. package/packages/panda/aeon.css +7 -0
  38. package/packages/panda/package.json +1 -1
  39. package/packages/panda/panda.config.ts +58 -1
  40. package/packages/panda/src/recipes/app-shell.ts +137 -0
  41. package/packages/panda/src/recipes/avatar.ts +131 -0
  42. package/packages/panda/src/recipes/bar.ts +206 -0
  43. package/packages/panda/src/recipes/button-group.ts +12 -4
  44. package/packages/panda/src/recipes/button.ts +1 -0
  45. package/packages/panda/src/recipes/combobox.ts +2 -1
  46. package/packages/panda/src/recipes/composer.ts +81 -0
  47. package/packages/panda/src/recipes/content.ts +104 -0
  48. package/packages/panda/src/recipes/conversation.ts +106 -0
  49. package/packages/panda/src/recipes/entry.ts +217 -0
  50. package/packages/panda/src/recipes/field.ts +12 -2
  51. package/packages/panda/src/recipes/floating.ts +26 -13
  52. package/packages/panda/src/recipes/identity.ts +73 -0
  53. package/packages/panda/src/recipes/index.ts +15 -0
  54. package/packages/panda/src/recipes/list-row.ts +109 -0
  55. package/packages/panda/src/recipes/metric-strip.ts +80 -0
  56. package/packages/panda/src/recipes/nav.ts +155 -0
  57. package/packages/panda/src/recipes/panel.ts +156 -0
  58. package/packages/panda/src/recipes/pin-input.ts +3 -2
  59. package/packages/panda/src/recipes/profile-header.ts +120 -0
  60. package/packages/panda/src/recipes/select.ts +2 -1
  61. package/packages/panda/src/recipes/slider.ts +6 -4
  62. package/packages/panda/src/recipes/theme-switcher.ts +110 -0
  63. package/packages/panda/src/recipes/thread.ts +88 -0
  64. package/packages/panda/src/theme/catalog-types.ts +2 -0
  65. package/packages/panda/src/theme/catalog.ts +23 -0
  66. package/packages/panda/src/theme/chrome.css +2 -1
  67. package/packages/panda/src/theme/global-theme-css.ts +9 -0
  68. package/packages/panda/src/theme/omarchy.themes.ts +607 -0
  69. package/packages/panda/src/theme/palette.ts +3 -0
  70. package/packages/panda/src/theme/scrollbars.css +58 -21
  71. package/packages/panda/src/theme/themes.config.ts +39 -1
  72. package/packages/panda/styled-system/css/conditions.mjs +1 -1
  73. package/packages/panda/styled-system/css/css.mjs +1 -1
  74. package/packages/panda/styled-system/css/sva.mjs +9 -4
  75. package/packages/panda/styled-system/helpers.mjs +11 -22
  76. package/packages/panda/styled-system/jsx/create-style-context.d.ts +54 -0
  77. package/packages/panda/styled-system/jsx/create-style-context.mjs +121 -0
  78. package/packages/panda/styled-system/jsx/factory.mjs +14 -5
  79. package/packages/panda/styled-system/jsx/index.d.ts +1 -0
  80. package/packages/panda/styled-system/jsx/index.mjs +1 -0
  81. package/packages/panda/styled-system/jsx/is-valid-prop.mjs +2 -2
  82. package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +0 -1
  83. package/packages/panda/styled-system/patterns/bleed.d.ts +0 -1
  84. package/packages/panda/styled-system/patterns/box.d.ts +0 -1
  85. package/packages/panda/styled-system/patterns/center.d.ts +0 -1
  86. package/packages/panda/styled-system/patterns/circle.d.ts +0 -1
  87. package/packages/panda/styled-system/patterns/container.d.ts +0 -1
  88. package/packages/panda/styled-system/patterns/cq.d.ts +0 -1
  89. package/packages/panda/styled-system/patterns/divider.d.ts +0 -1
  90. package/packages/panda/styled-system/patterns/flex.d.ts +0 -1
  91. package/packages/panda/styled-system/patterns/float.d.ts +0 -1
  92. package/packages/panda/styled-system/patterns/grid-item.d.ts +0 -1
  93. package/packages/panda/styled-system/patterns/grid.d.ts +0 -1
  94. package/packages/panda/styled-system/patterns/grid.mjs +1 -1
  95. package/packages/panda/styled-system/patterns/hstack.d.ts +0 -1
  96. package/packages/panda/styled-system/patterns/hstack.mjs +1 -1
  97. package/packages/panda/styled-system/patterns/link-overlay.d.ts +0 -1
  98. package/packages/panda/styled-system/patterns/spacer.d.ts +0 -1
  99. package/packages/panda/styled-system/patterns/spacer.mjs +6 -2
  100. package/packages/panda/styled-system/patterns/square.d.ts +0 -1
  101. package/packages/panda/styled-system/patterns/stack.d.ts +0 -1
  102. package/packages/panda/styled-system/patterns/stack.mjs +1 -1
  103. package/packages/panda/styled-system/patterns/visually-hidden.d.ts +0 -1
  104. package/packages/panda/styled-system/patterns/vstack.d.ts +0 -1
  105. package/packages/panda/styled-system/patterns/vstack.mjs +1 -1
  106. package/packages/panda/styled-system/patterns/wrap.d.ts +0 -1
  107. package/packages/panda/styled-system/patterns/wrap.mjs +1 -1
  108. package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +4 -3
  109. package/packages/panda/styled-system/recipes/aeon-accordion.mjs +1 -0
  110. package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +34 -0
  111. package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +70 -0
  112. package/packages/panda/styled-system/recipes/aeon-async.d.ts +4 -3
  113. package/packages/panda/styled-system/recipes/aeon-async.mjs +1 -0
  114. package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +36 -0
  115. package/packages/panda/styled-system/recipes/aeon-avatar.mjs +57 -0
  116. package/packages/panda/styled-system/recipes/aeon-badge.d.ts +3 -0
  117. package/packages/panda/styled-system/recipes/aeon-bar.d.ts +40 -0
  118. package/packages/panda/styled-system/recipes/aeon-bar.mjs +77 -0
  119. package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +3 -2
  120. package/packages/panda/styled-system/recipes/aeon-button.d.ts +3 -2
  121. package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +4 -1
  122. package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +1 -0
  123. package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +4 -3
  124. package/packages/panda/styled-system/recipes/aeon-combobox.mjs +1 -0
  125. package/packages/panda/styled-system/recipes/aeon-composer.d.ts +31 -0
  126. package/packages/panda/styled-system/recipes/aeon-composer.mjs +45 -0
  127. package/packages/panda/styled-system/recipes/aeon-content.d.ts +34 -0
  128. package/packages/panda/styled-system/recipes/aeon-content.mjs +70 -0
  129. package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +31 -0
  130. package/packages/panda/styled-system/recipes/aeon-conversation.mjs +61 -0
  131. package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +4 -1
  132. package/packages/panda/styled-system/recipes/aeon-dialog.mjs +1 -0
  133. package/packages/panda/styled-system/recipes/aeon-entry.d.ts +38 -0
  134. package/packages/panda/styled-system/recipes/aeon-entry.mjs +100 -0
  135. package/packages/panda/styled-system/recipes/aeon-field.d.ts +4 -3
  136. package/packages/panda/styled-system/recipes/aeon-field.mjs +1 -0
  137. package/packages/panda/styled-system/recipes/aeon-identity.d.ts +36 -0
  138. package/packages/panda/styled-system/recipes/aeon-identity.mjs +63 -0
  139. package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +33 -0
  140. package/packages/panda/styled-system/recipes/aeon-list-row.mjs +49 -0
  141. package/packages/panda/styled-system/recipes/aeon-menu.d.ts +4 -1
  142. package/packages/panda/styled-system/recipes/aeon-menu.mjs +1 -0
  143. package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +36 -0
  144. package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +54 -0
  145. package/packages/panda/styled-system/recipes/aeon-nav.d.ts +38 -0
  146. package/packages/panda/styled-system/recipes/aeon-nav.mjs +69 -0
  147. package/packages/panda/styled-system/recipes/aeon-panel.d.ts +34 -0
  148. package/packages/panda/styled-system/recipes/aeon-panel.mjs +58 -0
  149. package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +4 -1
  150. package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +1 -0
  151. package/packages/panda/styled-system/recipes/aeon-popover.d.ts +4 -1
  152. package/packages/panda/styled-system/recipes/aeon-popover.mjs +1 -0
  153. package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +36 -0
  154. package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +62 -0
  155. package/packages/panda/styled-system/recipes/aeon-progress.d.ts +4 -1
  156. package/packages/panda/styled-system/recipes/aeon-progress.mjs +1 -0
  157. package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +4 -1
  158. package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +1 -0
  159. package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +4 -3
  160. package/packages/panda/styled-system/recipes/aeon-scroll.mjs +1 -0
  161. package/packages/panda/styled-system/recipes/aeon-select.d.ts +4 -3
  162. package/packages/panda/styled-system/recipes/aeon-select.mjs +1 -0
  163. package/packages/panda/styled-system/recipes/aeon-separator.d.ts +4 -1
  164. package/packages/panda/styled-system/recipes/aeon-separator.mjs +1 -0
  165. package/packages/panda/styled-system/recipes/aeon-slider.d.ts +4 -1
  166. package/packages/panda/styled-system/recipes/aeon-slider.mjs +1 -0
  167. package/packages/panda/styled-system/recipes/aeon-switch.d.ts +4 -1
  168. package/packages/panda/styled-system/recipes/aeon-switch.mjs +1 -0
  169. package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +4 -1
  170. package/packages/panda/styled-system/recipes/aeon-tabs.mjs +1 -0
  171. package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +34 -0
  172. package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +59 -0
  173. package/packages/panda/styled-system/recipes/aeon-thread.d.ts +31 -0
  174. package/packages/panda/styled-system/recipes/aeon-thread.mjs +53 -0
  175. package/packages/panda/styled-system/recipes/aeon-toast.d.ts +4 -1
  176. package/packages/panda/styled-system/recipes/aeon-toast.mjs +1 -0
  177. package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +4 -1
  178. package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +1 -0
  179. package/packages/panda/styled-system/recipes/index.d.ts +16 -1
  180. package/packages/panda/styled-system/recipes/index.mjs +16 -1
  181. package/packages/panda/styled-system/styles.css +2317 -450
  182. package/packages/panda/styled-system/tokens/index.mjs +43 -7
  183. package/packages/panda/styled-system/tokens/tokens.d.ts +5 -5
  184. package/packages/panda/styled-system/types/composition.d.ts +86 -23
  185. package/packages/panda/styled-system/types/conditions.d.ts +34 -10
  186. package/packages/panda/styled-system/types/csstype.d.ts +6405 -5133
  187. package/packages/panda/styled-system/types/jsx.d.ts +27 -10
  188. package/packages/panda/styled-system/types/pattern.d.ts +4 -4
  189. package/packages/panda/styled-system/types/prop-type.d.ts +11 -1
  190. package/packages/panda/styled-system/types/style-props.d.ts +2763 -2165
  191. package/packages/panda/styled-system/types/system-types.d.ts +38 -80
  192. package/packages/panda/theme-runtime.css +945 -0
  193. package/packages/primitives/dist/chunk-R25CUHNF.js +46 -0
  194. package/packages/primitives/dist/chunk-RO2DMFN5.js +89 -0
  195. package/packages/primitives/dist/chunk-V5D7LS4J.js +61 -0
  196. package/packages/primitives/dist/chunk-YBPNI2LI.js +70 -0
  197. package/packages/primitives/dist/index.d.ts +4 -0
  198. package/packages/primitives/dist/index.js +30 -8
  199. package/packages/primitives/dist/machines/app-shell.d.ts +57 -0
  200. package/packages/primitives/dist/machines/app-shell.js +8 -0
  201. package/packages/primitives/dist/machines/async.d.ts +4 -4
  202. package/packages/primitives/dist/machines/content-region.d.ts +72 -0
  203. package/packages/primitives/dist/machines/content-region.js +8 -0
  204. package/packages/primitives/dist/machines/panel.d.ts +50 -0
  205. package/packages/primitives/dist/machines/panel.js +6 -0
  206. package/packages/primitives/dist/machines/sticky-bar.d.ts +62 -0
  207. package/packages/primitives/dist/machines/sticky-bar.js +8 -0
  208. package/packages/primitives/node_modules/.bin/esbuild +21 -0
  209. package/packages/primitives/node_modules/.bin/vite +21 -0
  210. package/packages/primitives/node_modules/.bin/vitest +2 -2
  211. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  212. package/packages/primitives/package.json +15 -5
  213. package/packages/primitives/scripts/xstate-introspect.mjs +35 -0
  214. package/packages/primitives/src/index.ts +4 -0
  215. package/packages/primitives/src/machines/app-shell.ts +63 -0
  216. package/packages/primitives/src/machines/content-region.ts +107 -0
  217. package/packages/primitives/src/machines/panel.ts +71 -0
  218. package/packages/primitives/src/machines/sticky-bar.ts +89 -0
  219. package/packages/react/dist/index.d.ts +403 -16
  220. package/packages/react/dist/index.js +1505 -227
  221. package/packages/react/node_modules/.bin/esbuild +21 -0
  222. package/packages/react/node_modules/.bin/vite +21 -0
  223. package/packages/react/node_modules/.bin/vitest +2 -2
  224. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  225. package/packages/react/package.json +18 -7
  226. package/packages/react/src/app-shell/index.tsx +154 -0
  227. package/packages/react/src/async/index.tsx +6 -1
  228. package/packages/react/src/async/map-content-state.ts +18 -0
  229. package/packages/react/src/avatar/index.tsx +19 -0
  230. package/packages/react/src/bar/index.tsx +101 -0
  231. package/packages/react/src/button/index.tsx +4 -2
  232. package/packages/react/src/composer/index.tsx +75 -0
  233. package/packages/react/src/content/index.tsx +149 -0
  234. package/packages/react/src/conversation/index.tsx +78 -0
  235. package/packages/react/src/entry/index.tsx +85 -0
  236. package/packages/react/src/field/index.tsx +31 -18
  237. package/packages/react/src/identity/index.tsx +110 -0
  238. package/packages/react/src/index.ts +15 -0
  239. package/packages/react/src/list-row/index.tsx +80 -0
  240. package/packages/react/src/metric-strip/index.tsx +88 -0
  241. package/packages/react/src/nav/index.tsx +155 -0
  242. package/packages/react/src/panel/index.tsx +267 -0
  243. package/packages/react/src/profile-header/index.tsx +91 -0
  244. package/packages/react/src/radio-group/index.tsx +19 -7
  245. package/packages/react/src/slider/index.tsx +3 -1
  246. package/packages/react/src/sticky-bar/index.tsx +135 -0
  247. package/packages/react/src/switch/index.tsx +7 -1
  248. package/packages/react/src/theme-switcher/index.tsx +227 -0
  249. package/packages/react/src/thread/index.tsx +95 -0
  250. package/packages/react/src/toast/primitives.tsx +2 -2
  251. package/packages/react/src/tooltip/tooltip.test.tsx +9 -1
  252. package/packages/react/tsconfig.json +2 -1
  253. package/packages/schemas/README.md +52 -0
  254. package/packages/schemas/dist/index.d.ts +287 -0
  255. package/packages/schemas/dist/index.js +701 -0
  256. package/packages/schemas/json/accordion.json +132 -0
  257. package/packages/schemas/json/async.json +161 -0
  258. package/packages/schemas/json/button.json +170 -0
  259. package/packages/schemas/json/catalog.json +2299 -0
  260. package/packages/schemas/json/checkbox.json +136 -0
  261. package/packages/schemas/json/combobox.json +130 -0
  262. package/packages/schemas/json/dialog.json +154 -0
  263. package/packages/schemas/json/field.json +171 -0
  264. package/packages/schemas/json/menu.json +138 -0
  265. package/packages/schemas/json/popover.json +133 -0
  266. package/packages/schemas/json/progress.json +137 -0
  267. package/packages/schemas/json/scroll.json +129 -0
  268. package/packages/schemas/json/select.json +140 -0
  269. package/packages/schemas/json/switch.json +136 -0
  270. package/packages/schemas/json/tabs.json +135 -0
  271. package/packages/schemas/json/toast.json +141 -0
  272. package/packages/schemas/json/tooltip.json +123 -0
  273. package/packages/schemas/node_modules/.bin/esbuild +21 -0
  274. package/packages/schemas/node_modules/.bin/jiti +21 -0
  275. package/packages/schemas/node_modules/.bin/tsc +21 -0
  276. package/packages/schemas/node_modules/.bin/tsserver +21 -0
  277. package/packages/schemas/node_modules/.bin/tsup +21 -0
  278. package/packages/schemas/node_modules/.bin/tsup-node +21 -0
  279. package/packages/schemas/node_modules/.bin/tsx +21 -0
  280. package/packages/schemas/node_modules/.bin/vite +21 -0
  281. package/packages/schemas/node_modules/.bin/vitest +21 -0
  282. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  283. package/packages/schemas/package.json +56 -0
  284. package/packages/schemas/prompts/cursorrules.md +64 -0
  285. package/packages/schemas/prompts/statecharts.md +31 -0
  286. package/packages/schemas/prompts/system.md +30 -0
  287. package/packages/schemas/registry/catalog.json +54 -0
  288. package/packages/schemas/registry/components/accordion.json +132 -0
  289. package/packages/schemas/registry/components/async.json +161 -0
  290. package/packages/schemas/registry/components/button.json +170 -0
  291. package/packages/schemas/registry/components/checkbox.json +136 -0
  292. package/packages/schemas/registry/components/combobox.json +130 -0
  293. package/packages/schemas/registry/components/dialog.json +154 -0
  294. package/packages/schemas/registry/components/field.json +171 -0
  295. package/packages/schemas/registry/components/menu.json +138 -0
  296. package/packages/schemas/registry/components/popover.json +133 -0
  297. package/packages/schemas/registry/components/progress.json +137 -0
  298. package/packages/schemas/registry/components/scroll.json +129 -0
  299. package/packages/schemas/registry/components/select.json +140 -0
  300. package/packages/schemas/registry/components/switch.json +136 -0
  301. package/packages/schemas/registry/components/tabs.json +135 -0
  302. package/packages/schemas/registry/components/toast.json +141 -0
  303. package/packages/schemas/registry/components/tooltip.json +123 -0
  304. package/packages/schemas/registry/machines/async.json +219 -0
  305. package/packages/schemas/registry/machines/buttonLifecycle.json +224 -0
  306. package/packages/schemas/registry/machines/dialog.json +143 -0
  307. package/packages/schemas/registry/machines/field.json +275 -0
  308. package/packages/schemas/scripts/emit.ts +61 -0
  309. package/packages/schemas/src/aeon-to-schema.test.ts +70 -0
  310. package/packages/schemas/src/aeon-to-schema.ts +206 -0
  311. package/packages/schemas/src/agent-bridge.ts +82 -0
  312. package/packages/schemas/src/components.ts +307 -0
  313. package/packages/schemas/src/index.test.ts +25 -0
  314. package/packages/schemas/src/index.ts +25 -0
  315. package/packages/schemas/src/prompts.ts +121 -0
  316. package/packages/schemas/src/registry.ts +73 -0
  317. package/packages/schemas/src/schema-builder.ts +87 -0
  318. package/packages/schemas/tsconfig.json +9 -0
  319. package/packages/solid/package.json +2 -2
  320. package/packages/svelte/node_modules/.bin/esbuild +21 -0
  321. package/packages/svelte/node_modules/.bin/vite +4 -4
  322. package/packages/svelte/package.json +15 -5
  323. package/packages/ui/README.md +19 -6
  324. package/packages/ui/dist/index.d.ts +254 -9
  325. package/packages/ui/dist/index.js +690 -139
  326. package/packages/ui/src/app-shell.tsx +44 -0
  327. package/packages/ui/src/async.tsx +2 -1
  328. package/packages/ui/src/avatar.tsx +35 -0
  329. package/packages/ui/src/bar.tsx +34 -0
  330. package/packages/ui/src/composer.tsx +27 -0
  331. package/packages/ui/src/content.tsx +43 -0
  332. package/packages/ui/src/conversation.tsx +43 -0
  333. package/packages/ui/src/entry.tsx +76 -0
  334. package/packages/ui/src/field.tsx +5 -0
  335. package/packages/ui/src/identity.tsx +35 -0
  336. package/packages/ui/src/index.ts +16 -0
  337. package/packages/ui/src/list-row.tsx +30 -0
  338. package/packages/ui/src/metric-strip.tsx +29 -0
  339. package/packages/ui/src/nav.tsx +46 -0
  340. package/packages/ui/src/panel.tsx +39 -0
  341. package/packages/ui/src/profile-header.tsx +35 -0
  342. package/packages/ui/src/sticky-bar.tsx +42 -0
  343. package/packages/ui/src/switch.tsx +17 -4
  344. package/packages/ui/src/theme-switcher.tsx +41 -0
  345. package/packages/ui/src/thread.tsx +35 -0
  346. package/packages/vue/package.json +3 -3
  347. package/scripts/vite-aliases.mjs +57 -3
  348. package/scripts/xstate-introspect.mjs +68 -0
  349. package/packages/react/src/async/legacy-region.tsx +0 -38
@@ -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@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.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@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.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@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
19
+ else
20
+ exec node "$basedir/../../../../node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.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@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3_/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.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@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3_/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.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,50 @@
1
+ {
2
+ "name": "@aeon-ui/cli",
3
+ "version": "0.1.0",
4
+ "description": "AI-optimized CLI for injecting Aeon UI agent rules, schemas, and starter code",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/GenericCPU/aeon-ui.git",
9
+ "directory": "packages/cli"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "templates",
17
+ "README.md"
18
+ ],
19
+ "keywords": [
20
+ "aeon-ui",
21
+ "cli",
22
+ "cursor",
23
+ "generative-ui",
24
+ "ai"
25
+ ],
26
+ "type": "module",
27
+ "bin": {
28
+ "aeon-ui": "./dist/bin.js"
29
+ },
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js"
34
+ }
35
+ },
36
+ "scripts": {
37
+ "build": "tsup src/bin.ts src/index.ts --format esm --dts --clean",
38
+ "typecheck": "tsc --noEmit",
39
+ "test": "vitest run"
40
+ },
41
+ "dependencies": {
42
+ "@aeon-ui/schemas": "workspace:*"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.15.0",
46
+ "tsup": "^8.4.0",
47
+ "typescript": "^5.8.3",
48
+ "vitest": "^4.1.8"
49
+ }
50
+ }
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { initAeon } from './init.js'
3
+
4
+ const args = process.argv.slice(2)
5
+ const cmd = args[0] ?? 'help'
6
+ const force = args.includes('--force') || args.includes('-f')
7
+
8
+ function help() {
9
+ console.log(`aeon-ui — AI-optimized CLI for Aeon UI
10
+
11
+ Usage:
12
+ npx aeon-ui init [--force]
13
+
14
+ Commands:
15
+ init Inject Cursor rules, JSON schemas, system prompt, and a starter component
16
+ help Show this message
17
+
18
+ Options:
19
+ --force, -f Overwrite existing generated files
20
+ `)
21
+ }
22
+
23
+ if (cmd === 'init') {
24
+ const result = initAeon({ force })
25
+ console.log(`Aeon UI init → ${result.cwd}`)
26
+ for (const line of result.written) console.log(` ${line}`)
27
+ console.log('\nNext: npm install aeon-ui-engine react react-dom xstate @xstate/react')
28
+ console.log('Docs: AEON_AI.md · paste aeon.cursorrules.md into your agent system prompt')
29
+ } else {
30
+ help()
31
+ if (cmd !== 'help' && cmd !== '--help' && cmd !== '-h') {
32
+ process.exitCode = 1
33
+ }
34
+ }
@@ -0,0 +1 @@
1
+ export { initAeon, type InitOptions } from './init.js'
@@ -0,0 +1,107 @@
1
+ import { mkdirSync, writeFileSync, existsSync } from 'node:fs'
2
+ import { join } from 'node:path'
3
+ import {
4
+ CURSOR_RULES_SNIPPET,
5
+ AEON_SYSTEM_PROMPT,
6
+ catalog,
7
+ componentSchemas,
8
+ } from '@aeon-ui/schemas'
9
+
10
+ export type InitOptions = {
11
+ cwd?: string
12
+ force?: boolean
13
+ }
14
+
15
+ const STARTER = `/**
16
+ * Aeon UI starter — generated by \`npx aeon-ui init\`
17
+ * Headless: @aeon-ui/react · Styled: @aeon-ui/ui · Schemas: @aeon-ui/schemas
18
+ */
19
+ import { Button, Field } from '@aeon-ui/ui'
20
+
21
+ export function AeonStarter() {
22
+ return (
23
+ <div>
24
+ <Field.Root>
25
+ <Field.Label>Email</Field.Label>
26
+ <Field.Control type="email" placeholder="you@example.com" />
27
+ <Field.Message />
28
+ </Field.Root>
29
+ <Button.Root status="idle">Continue</Button.Root>
30
+ </div>
31
+ )
32
+ }
33
+ `
34
+
35
+ export function initAeon(options: InitOptions = {}) {
36
+ const cwd = options.cwd ?? process.cwd()
37
+ const force = options.force ?? false
38
+ const written: string[] = []
39
+
40
+ const write = (rel: string, body: string) => {
41
+ const path = join(cwd, rel)
42
+ if (existsSync(path) && !force) {
43
+ written.push(`skip ${rel} (exists)`)
44
+ return
45
+ }
46
+ mkdirSync(join(path, '..'), { recursive: true })
47
+ writeFileSync(path, body.endsWith('\n') ? body : `${body}\n`)
48
+ written.push(`write ${rel}`)
49
+ }
50
+
51
+ write('.cursor/rules/aeon-ui.mdc', `---
52
+ description: Aeon UI — statechart-driven components for AI agents
53
+ globs: **/*.{tsx,ts,jsx,js}
54
+ alwaysApply: true
55
+ ---
56
+
57
+ ${CURSOR_RULES_SNIPPET.trim()}
58
+ `)
59
+
60
+ write('aeon.cursorrules.md', `${CURSOR_RULES_SNIPPET.trim()}\n`)
61
+ write('aeon.system-prompt.md', `${AEON_SYSTEM_PROMPT.trim()}\n`)
62
+ write(
63
+ 'aeon.schemas/catalog.json',
64
+ `${JSON.stringify(
65
+ {
66
+ $id: catalog.$id,
67
+ title: catalog.title,
68
+ description: catalog.description,
69
+ version: catalog.version,
70
+ principle: catalog.principle,
71
+ attributes: catalog.attributes,
72
+ components: catalog.components,
73
+ note: 'Full schemas live under aeon.schemas/components/*.json',
74
+ },
75
+ null,
76
+ 2,
77
+ )}\n`,
78
+ )
79
+
80
+ for (const [id, schema] of Object.entries(componentSchemas)) {
81
+ write(`aeon.schemas/components/${id}.json`, `${JSON.stringify(schema, null, 2)}\n`)
82
+ }
83
+
84
+ write('src/components/AeonStarter.tsx', STARTER)
85
+
86
+ write(
87
+ 'AEON_AI.md',
88
+ `# Aeon UI — AI agent setup
89
+
90
+ Generated by \`npx aeon-ui init\`.
91
+
92
+ ## Next steps
93
+
94
+ 1. Install: \`npm install aeon-ui-engine react react-dom xstate @xstate/react\`
95
+ 2. CSS: \`import 'aeon-ui-engine/aeon.css'\`
96
+ 3. Vite: add \`aeonUiVitePlugin()\` from \`aeon-ui-engine/vite\`
97
+ 4. Paste \`aeon.cursorrules.md\` into Cursor rules / system prompt (already mirrored to \`.cursor/rules/aeon-ui.mdc\`)
98
+ 5. Constrain generation with JSON under \`aeon.schemas/\`
99
+
100
+ ## Principle
101
+
102
+ **UI = f(state)** — never invent boolean combinations for states the schema does not list.
103
+ `,
104
+ )
105
+
106
+ return { cwd, written }
107
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src",
6
+ "types": ["node"],
7
+ "noEmit": true
8
+ },
9
+ "include": ["src"]
10
+ }
@@ -51,10 +51,16 @@ partAttrs(asyncAnatomy.scope, asyncAnatomy.readout, {
51
51
  ## Parallel regions
52
52
 
53
53
  ```ts
54
- import { stateToAttr } from '@aeon-ui/core'
54
+ import { fieldFace, fieldRegions, stateToAttr } from '@aeon-ui/core'
55
55
 
56
+ // Debug / serialization — not product UI labels
56
57
  stateToAttr({ interaction: 'dirty', validation: 'invalid', submission: 'idle' })
57
58
  // → "interaction:dirty validation:invalid submission:idle"
59
+
60
+ // Field DOM face (same hierarchy as Button status)
61
+ fieldFace({ interaction: 'dirty', validation: 'invalid', submission: 'idle' }) // "invalid"
62
+ fieldRegions({ interaction: 'dirty', validation: 'invalid', submission: 'idle' })
63
+ // → { interaction: "dirty", validation: "invalid", submission: "idle" }
58
64
  ```
59
65
 
60
66
  ## Adding a scope
@@ -45,10 +45,10 @@ declare const scrollAnatomy: Record<"root" | "content" | "viewport", "root" | "c
45
45
  scope: string;
46
46
  };
47
47
  /**
48
- * Play / game surface — mat shell with table, dice, and bank regions.
49
- * Use with normalized layout coords (@see docs/LAYOUT_COORDINATES.md).
48
+ * Spatial play surface — universal mat + regions + entities (not a specific game).
49
+ * App logic names regions; entity labels come from compose `items`. See LAYOUT_COORDINATES.md.
50
50
  */
51
- declare const playSurfaceAnatomy: Record<"mat" | "table" | "dice" | "bank", "mat" | "table" | "dice" | "bank"> & {
51
+ declare const playSurfaceAnatomy: Record<"root" | "mat" | "region" | "entity", "root" | "mat" | "region" | "entity"> & {
52
52
  scope: string;
53
53
  };
54
54
  declare const selectAnatomy: Record<"root" | "icon" | "trigger" | "positioner" | "content" | "item" | "value", "root" | "icon" | "trigger" | "positioner" | "content" | "item" | "value"> & {
@@ -70,8 +70,65 @@ declare const tooltipAnatomy: Record<"root" | "trigger" | "positioner" | "conten
70
70
  declare const toastAnatomy: Record<"root" | "title" | "description" | "closeTrigger" | "viewport", "root" | "title" | "description" | "closeTrigger" | "viewport"> & {
71
71
  scope: string;
72
72
  };
73
- /** Profile image — loaded / loading / error on root `data-aeon-state`. */
74
- declare const avatarAnatomy: Record<"root" | "image" | "fallback", "root" | "image" | "fallback"> & {
73
+ /** Profile image — loaded / loading / error on root `data-aeon-state`. Badge = presence / status corner. */
74
+ declare const avatarAnatomy: Record<"root" | "image" | "fallback" | "badge", "root" | "image" | "fallback" | "badge"> & {
75
+ scope: string;
76
+ };
77
+ /**
78
+ * Identity strip — avatar + primary/secondary text (items-market AvatarWithName).
79
+ * Presentational; compose into ProfileHeader / ListRow / AccountCluster.
80
+ */
81
+ declare const identityAnatomy: Record<"root" | "title" | "avatar" | "subtitle" | "meta" | "trailing", "root" | "title" | "avatar" | "subtitle" | "meta" | "trailing"> & {
82
+ scope: string;
83
+ };
84
+ /**
85
+ * Profile header — dense account hero (not dating). Media optional; metrics + actions zones.
86
+ * Spatial: identity leading, metrics inline, actions trailing / bottom leading pair.
87
+ */
88
+ declare const profileHeaderAnatomy: Record<"root" | "actions" | "identity" | "media" | "metrics" | "body", "root" | "actions" | "identity" | "media" | "metrics" | "body"> & {
89
+ scope: string;
90
+ };
91
+ /**
92
+ * Entry — compact multi-value content card (feed post, catalog listing, activity item).
93
+ * Universal layout only — not a social/marketplace niche.
94
+ * List stacks cards; Root is one card (idle | selected | muted).
95
+ * Zones: header (leading · heading · meta) · media · body · values · actions · footer.
96
+ */
97
+ declare const entryAnatomy: Record<"values" | "root" | "title" | "list" | "actions" | "value" | "subtitle" | "meta" | "media" | "body" | "header" | "leading" | "heading" | "footer", "values" | "root" | "title" | "list" | "actions" | "value" | "subtitle" | "meta" | "media" | "body" | "header" | "leading" | "heading" | "footer"> & {
98
+ scope: string;
99
+ };
100
+ /**
101
+ * Metric strip — ultra-dense value/label chips (items-market im-stat cluster).
102
+ * Generic stats only — not wallet/currency product niches.
103
+ */
104
+ declare const metricStripAnatomy: Record<"root" | "label" | "value" | "chip", "root" | "label" | "value" | "chip"> & {
105
+ scope: string;
106
+ };
107
+ /**
108
+ * List row — settings / account menu row (h-12 hit target, leading icon, trailing control).
109
+ */
110
+ declare const listRowAnatomy: Record<"root" | "label" | "description" | "trailing" | "leading", "root" | "label" | "description" | "trailing" | "leading"> & {
111
+ scope: string;
112
+ };
113
+ /**
114
+ * Conversation — inbox / DM list row (universal messaging chrome, not dating).
115
+ * Leading avatar · title · preview · meta (time) · badge (unread).
116
+ * Item state: idle | unread | selected.
117
+ */
118
+ declare const conversationAnatomy: Record<"root" | "title" | "item" | "badge" | "meta" | "body" | "leading" | "preview", "root" | "title" | "item" | "badge" | "meta" | "body" | "leading" | "preview"> & {
119
+ scope: string;
120
+ };
121
+ /**
122
+ * Thread — message stream. Items project mine | theirs | pending | failed.
123
+ */
124
+ declare const threadAnatomy: Record<"root" | "list" | "item" | "meta" | "bubble" | "day", "root" | "list" | "item" | "meta" | "bubble" | "day"> & {
125
+ scope: string;
126
+ };
127
+ /**
128
+ * Composer — bottom compose chrome for threads (input + send).
129
+ * Root state: idle | sending | disabled | error.
130
+ */
131
+ declare const composerAnatomy: Record<"root" | "actions" | "input" | "send", "root" | "actions" | "input" | "send"> & {
75
132
  scope: string;
76
133
  };
77
134
  declare const separatorAnatomy: Record<"root", "root"> & {
@@ -90,6 +147,50 @@ declare const sliderAnatomy: Record<"root" | "thumb" | "track" | "range" | "valu
90
147
  declare const pinInputAnatomy: Record<"root" | "input", "root" | "input"> & {
91
148
  scope: string;
92
149
  };
150
+ /**
151
+ * Bar — horizontal layout primitive for toolbars, headers, footers.
152
+ * Enforces safe flex behavior: no overlap, responsive collapse via overflow.
153
+ * Parts: root (flex row), leading, center, trailing, optional seam (sticky stack join).
154
+ * Drive sticky lifecycle with stickyBarMachine → data-aeon-state on root.
155
+ */
156
+ declare const barAnatomy: Record<"root" | "trailing" | "leading" | "center" | "seam", "root" | "trailing" | "leading" | "center" | "seam"> & {
157
+ scope: string;
158
+ };
159
+ /**
160
+ * Panel — collapsible layout region for split views.
161
+ * Group lays out siblings; Root is expanded|collapsed; Label rails vertically when collapsed.
162
+ */
163
+ declare const panelAnatomy: Record<"root" | "group" | "label" | "trigger" | "content", "root" | "group" | "label" | "trigger" | "content"> & {
164
+ scope: string;
165
+ };
166
+ /**
167
+ * App shell — layered application chrome (items-market MainLayout pattern).
168
+ * header / subheader / content / aside / footer / dock / scrim under root.
169
+ */
170
+ declare const appShellAnatomy: Record<"root" | "content" | "header" | "footer" | "subheader" | "aside" | "dock" | "scrim", "root" | "content" | "header" | "footer" | "subheader" | "aside" | "dock" | "scrim"> & {
171
+ scope: string;
172
+ };
173
+ /**
174
+ * Content region — status-slotted body. Every contentRegionMachine state has a part.
175
+ * Pair with Async for fetch; use slots for idle/pending/empty/error/ready/loadingMore/success.
176
+ */
177
+ declare const contentAnatomy: Record<"root" | "empty" | "body" | "toolbar" | "pending" | "error" | "success" | "sentinel", "root" | "empty" | "body" | "toolbar" | "pending" | "error" | "success" | "sentinel"> & {
178
+ scope: string;
179
+ };
180
+ /**
181
+ * Nav — navigational collection (top links, bottom tabs, side rail).
182
+ * Selection reuses tabsMachine; items project inactive|active|disabled.
183
+ */
184
+ declare const navAnatomy: Record<"root" | "label" | "icon" | "indicator" | "item" | "badge", "root" | "label" | "icon" | "indicator" | "item" | "badge"> & {
185
+ scope: string;
186
+ };
187
+ /**
188
+ * ThemeSwitcher — mode toggle (light/dark) + theme preset selector.
189
+ * Parts: root, modes (button group), modeBtn, themeSelect, themeTrigger.
190
+ */
191
+ declare const themeSwitcherAnatomy: Record<"root" | "modes" | "modeBtn" | "themeSelect" | "themeTrigger", "root" | "modes" | "modeBtn" | "themeSelect" | "themeTrigger"> & {
192
+ scope: string;
193
+ };
93
194
 
94
195
  type AttrOptions = {
95
196
  state?: string | string[];
@@ -108,6 +209,30 @@ type AeonSnapshot<M extends AnyStateMachine> = SnapshotFrom<M>;
108
209
  type AeonActor<M extends AnyStateMachine> = ActorRefFrom<M>;
109
210
  /** Flatten nested state value for data-aeon-state attribute. */
110
211
  declare function stateToAttr(value: unknown): string;
212
+ /**
213
+ * Primary visual face for parallel field charts — same hierarchy as Button/Dialog:
214
+ * one leaf on `data-aeon-state`, not a region dump.
215
+ * Priority: pending > invalid > dirty > idle.
216
+ */
217
+ type FieldFace = 'idle' | 'dirty' | 'invalid' | 'pending';
218
+ declare function fieldFace(value: unknown): FieldFace;
219
+ /** Orthogonal field regions for advanced CSS (`data-aeon-interaction`, etc.). */
220
+ declare function fieldRegions(value: unknown): {
221
+ interaction: string;
222
+ validation: string;
223
+ submission: string;
224
+ };
225
+ /** Read one region from a (possibly parallel) snapshot value. */
226
+ declare function getRegionValue(value: unknown, region: string): unknown;
227
+ /**
228
+ * Active path under a region — e.g. `{ deck: { ready: 'matched' } }` →
229
+ * `regionPath(v, 'deck')` → `['ready', 'matched']`.
230
+ */
231
+ declare function regionPath(value: unknown, region: string): string[];
232
+ /** Deepest active key under a region (`['ready','matched']` → `'matched'`). */
233
+ declare function regionLeaf(value: unknown, region: string): string | undefined;
234
+ /** True when the region path equals or ends with the given leaf / path prefix. */
235
+ declare function regionMatches(value: unknown, region: string, match: string | readonly string[]): boolean;
111
236
 
112
237
  /** Stable conditions the machine may occupy — mutually exclusive at a given depth. */
113
238
  type AeonStateValue = string | {
@@ -253,5 +378,48 @@ declare function syncAeonColorMode(root: HTMLElement, mode: AeonColorMode, optio
253
378
  }): void;
254
379
  /** Cross-fade theme changes when View Transitions API is available. */
255
380
  declare function runAeonThemeTransition(apply: () => void): void;
381
+ type AeonPalette = {
382
+ bg: string;
383
+ surface: string;
384
+ surfaceRaised: string;
385
+ border: string;
386
+ text: string;
387
+ muted: string;
388
+ accent: string;
389
+ accentDim: string;
390
+ danger: string;
391
+ dangerDim: string;
392
+ focusRing: string;
393
+ gridLine: string;
394
+ };
395
+ interface AeonThemeDefinition {
396
+ id: string;
397
+ label: string;
398
+ description: string;
399
+ light: AeonPalette;
400
+ dark: AeonPalette;
401
+ }
402
+ /**
403
+ * Register theme definitions. Call once at app init.
404
+ * Returns the registered themes array and lookup map.
405
+ */
406
+ declare function registerAeonThemes(themes: AeonThemeDefinition[]): {
407
+ themes: AeonThemeDefinition[];
408
+ map: Record<string, AeonThemeDefinition>;
409
+ ids: string[];
410
+ };
411
+ declare function isAeonThemeId(value: string): boolean;
412
+ declare function isAeonMode(value: string): value is AeonColorMode;
413
+ /**
414
+ * Apply a theme + mode to `<html>`. Persists to localStorage.
415
+ */
416
+ declare function applyAeonTheme(themeId: string, mode: AeonColorMode, themeMap?: Record<string, AeonThemeDefinition>): void;
417
+ /**
418
+ * Read saved prefs or system preference, apply to `<html>`, return current values.
419
+ */
420
+ declare function initAeonTheme(themeMap?: Record<string, AeonThemeDefinition>): {
421
+ themeId: string;
422
+ mode: AeonColorMode;
423
+ };
256
424
 
257
- export { AEON_PRINCIPLE, AEON_THEME_TRANSITION_CLASS, type AeonActor, type AeonColorMode, type AeonContext, type AeonDataAttrs, type AeonEvent, type AeonSnapshot, type AeonStateValue, DEFAULT_COMPACT_MQ, type LayoutComposition, type LayoutCompositionSpec, type LayoutMode, NORM_PLANE, type NormOrigin, type NormPoint, type NormRect, type RegionLayoutSlot, type ResponsiveLayoutSpec, type ScrollOverflow, type ScrollSnapshot, UI_IS_FUNCTION_OF_STATE, accordionAnatomy, anatomy, asyncAnatomy, avatarAnatomy, buttonAnatomy, checkboxAnatomy, clampNorm, clientFromNorm, comboboxAnatomy, dialogAnatomy, fieldAnatomy, getCompactMq, getScrollSnapshot, insetNormCluster, isAeonColorMode, layoutCompositionForMode, layoutModeAttrs, matchLayoutMode, measureElement, menuAnatomy, normFromClient, partAttrs, partOnlyAttrs, pinInputAnatomy, playSurfaceAnatomy, popoverAnatomy, progressAnatomy, radioGroupAnatomy, regionBoundsForMode, resolveAeonColorMode, resolveRegionRect, runAeonThemeTransition, scopeAttrs, scrollAnatomy, selectAnatomy, separatorAnatomy, sliderAnatomy, stateToAttr, switchAnatomy, syncAeonColorMode, tabsAnatomy, toastAnatomy, tooltipAnatomy };
425
+ export { AEON_PRINCIPLE, AEON_THEME_TRANSITION_CLASS, type AeonActor, type AeonColorMode, type AeonContext, type AeonDataAttrs, type AeonEvent, type AeonPalette, type AeonSnapshot, type AeonStateValue, type AeonThemeDefinition, DEFAULT_COMPACT_MQ, type FieldFace, type LayoutComposition, type LayoutCompositionSpec, type LayoutMode, NORM_PLANE, type NormOrigin, type NormPoint, type NormRect, type RegionLayoutSlot, type ResponsiveLayoutSpec, type ScrollOverflow, type ScrollSnapshot, UI_IS_FUNCTION_OF_STATE, accordionAnatomy, anatomy, appShellAnatomy, applyAeonTheme, asyncAnatomy, avatarAnatomy, barAnatomy, buttonAnatomy, checkboxAnatomy, clampNorm, clientFromNorm, comboboxAnatomy, composerAnatomy, contentAnatomy, conversationAnatomy, dialogAnatomy, entryAnatomy, fieldAnatomy, fieldFace, fieldRegions, getCompactMq, getRegionValue, getScrollSnapshot, identityAnatomy, initAeonTheme, insetNormCluster, isAeonColorMode, isAeonMode, isAeonThemeId, layoutCompositionForMode, layoutModeAttrs, listRowAnatomy, matchLayoutMode, measureElement, menuAnatomy, metricStripAnatomy, navAnatomy, normFromClient, panelAnatomy, partAttrs, partOnlyAttrs, pinInputAnatomy, playSurfaceAnatomy, popoverAnatomy, profileHeaderAnatomy, progressAnatomy, radioGroupAnatomy, regionBoundsForMode, regionLeaf, regionMatches, regionPath, registerAeonThemes, resolveAeonColorMode, resolveRegionRect, runAeonThemeTransition, scopeAttrs, scrollAnatomy, selectAnatomy, separatorAnatomy, sliderAnatomy, stateToAttr, switchAnatomy, syncAeonColorMode, tabsAnatomy, themeSwitcherAnatomy, threadAnatomy, toastAnatomy, tooltipAnatomy };