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,307 @@
1
+ import { componentSchema, type JsonSchema } from './schema-builder.js'
2
+
3
+ /** Deterministic component contracts for LLM / Generative UI consumption. */
4
+ export const componentSchemas = {
5
+ button: componentSchema({
6
+ id: 'https://aeon-ui.com/schemas/button.json',
7
+ title: 'Button',
8
+ description:
9
+ 'Action control. status is a prop projection (not an in-tree machine). Never invent parallel useState for lifecycle.',
10
+ scope: 'button',
11
+ parts: ['root', 'group', 'label', 'icon'],
12
+ states: ['idle', 'pending', 'success', 'failure', 'disabled'],
13
+ machine: 'buttonLifecycleMachine',
14
+ runtime: 'status prop',
15
+ props: {
16
+ status: {
17
+ type: 'string',
18
+ enum: ['idle', 'pending', 'success', 'failure', 'disabled'],
19
+ default: 'idle',
20
+ },
21
+ variant: { type: 'string', enum: ['solid', 'outline', 'ghost', 'link'] },
22
+ size: { type: 'string', enum: ['sm', 'md', 'lg'] },
23
+ disabled: { type: 'boolean' },
24
+ },
25
+ slots: { Root: 'button.root', Group: 'button.group', Label: 'button.label', Icon: 'button.icon' },
26
+ examples: [
27
+ '<Button.Root status="pending" aria-busy>Saving…</Button.Root>',
28
+ "const [snap, send] = useAeonMachine(buttonLifecycleMachine)\n<Button.Root status={snap.value as ButtonStatus} onClick={() => send({ type: 'PRESS' })} />",
29
+ ],
30
+ }),
31
+
32
+ async: componentSchema({
33
+ id: 'https://aeon-ui.com/schemas/async.json',
34
+ title: 'Async',
35
+ description:
36
+ 'Fetch region with full lifecycle totality: idle → loading → success|empty|failure. Always render every stable state in demos.',
37
+ scope: 'async',
38
+ parts: ['root', 'track', 'segment', 'readout', 'readoutRail', 'readoutBody', 'actions'],
39
+ states: ['idle', 'loading', 'success', 'empty', 'failure'],
40
+ machine: 'createAsyncMachine',
41
+ runtime: 'useAeonMachine',
42
+ events: ['FETCH', 'RESOLVE', 'REJECT', 'RESET', 'STALE', 'REFRESH'],
43
+ slots: {
44
+ Root: 'async.root',
45
+ Track: 'async.track',
46
+ Segment: 'async.segment',
47
+ Readout: 'async.readout',
48
+ Actions: 'async.actions',
49
+ },
50
+ examples: [
51
+ '<Async.Root>\n {/* Content faces via asyncStatusToContentState — not Track */}\n <Async.Actions />\n</Async.Root>',
52
+ ],
53
+ }),
54
+
55
+ field: componentSchema({
56
+ id: 'https://aeon-ui.com/schemas/field.json',
57
+ title: 'Field',
58
+ description:
59
+ 'Parallel regions: interaction × validation × submission. Do not collapse into a single error boolean.',
60
+ scope: 'field',
61
+ parts: ['root', 'label', 'control', 'textarea', 'message', 'hint'],
62
+ states: [
63
+ 'pristine',
64
+ 'dirty',
65
+ 'valid',
66
+ 'invalid',
67
+ 'idle',
68
+ 'pending',
69
+ 'interaction.pristine',
70
+ 'interaction.dirty',
71
+ 'validation.valid',
72
+ 'validation.invalid',
73
+ 'submission.idle',
74
+ 'submission.pending',
75
+ ],
76
+ machine: 'fieldMachine',
77
+ runtime: 'useAeonMachine',
78
+ events: ['INPUT', 'BLUR', 'VALIDATE', 'SUBMIT', 'SUBMIT_DONE', 'SUBMIT_FAIL', 'RESET'],
79
+ slots: {
80
+ Root: 'field.root',
81
+ Label: 'field.label',
82
+ Control: 'field.control',
83
+ Message: 'field.message',
84
+ Hint: 'field.hint',
85
+ },
86
+ }),
87
+
88
+ dialog: componentSchema({
89
+ id: 'https://aeon-ui.com/schemas/dialog.json',
90
+ title: 'Dialog',
91
+ description: 'Modal open/closed via dialogMachine. Dismissal is a transition, not ad hoc flags.',
92
+ scope: 'dialog',
93
+ parts: [
94
+ 'root',
95
+ 'trigger',
96
+ 'portal',
97
+ 'backdrop',
98
+ 'positioner',
99
+ 'content',
100
+ 'title',
101
+ 'description',
102
+ 'closeTrigger',
103
+ ],
104
+ states: ['open', 'closed'],
105
+ machine: 'dialogMachine',
106
+ runtime: 'useAeonMachine',
107
+ events: ['OPEN', 'CLOSE', 'TOGGLE'],
108
+ slots: {
109
+ Root: 'dialog.root',
110
+ Trigger: 'dialog.trigger',
111
+ Content: 'dialog.content',
112
+ Title: 'dialog.title',
113
+ Description: 'dialog.description',
114
+ CloseTrigger: 'dialog.closeTrigger',
115
+ },
116
+ }),
117
+
118
+ switch: componentSchema({
119
+ id: 'https://aeon-ui.com/schemas/switch.json',
120
+ title: 'Switch',
121
+ description: 'Binary toggle via toggleMachine.',
122
+ scope: 'switch',
123
+ parts: ['root', 'control', 'thumb', 'label', 'hiddenInput'],
124
+ states: ['checked', 'unchecked'],
125
+ machine: 'toggleMachine',
126
+ runtime: 'useAeonMachine',
127
+ events: ['TOGGLE', 'CHECK', 'UNCHECK'],
128
+ slots: { Root: 'switch.root', Control: 'switch.control', Thumb: 'switch.thumb', Label: 'switch.label' },
129
+ }),
130
+
131
+ checkbox: componentSchema({
132
+ id: 'https://aeon-ui.com/schemas/checkbox.json',
133
+ title: 'Checkbox',
134
+ description: 'Binary toggle via toggleMachine (same chart family as Switch).',
135
+ scope: 'checkbox',
136
+ parts: ['root', 'control', 'indicator', 'label', 'hiddenInput'],
137
+ states: ['checked', 'unchecked'],
138
+ machine: 'toggleMachine',
139
+ runtime: 'useAeonMachine',
140
+ events: ['TOGGLE', 'CHECK', 'UNCHECK'],
141
+ slots: {
142
+ Root: 'checkbox.root',
143
+ Control: 'checkbox.control',
144
+ Indicator: 'checkbox.indicator',
145
+ Label: 'checkbox.label',
146
+ },
147
+ }),
148
+
149
+ tabs: componentSchema({
150
+ id: 'https://aeon-ui.com/schemas/tabs.json',
151
+ title: 'Tabs',
152
+ description: 'Selected tab value from tabsMachine.',
153
+ scope: 'tabs',
154
+ parts: ['root', 'list', 'trigger', 'content', 'indicator'],
155
+ states: ['selected'],
156
+ machine: 'tabsMachine',
157
+ runtime: 'useAeonMachine',
158
+ events: ['SELECT'],
159
+ props: {
160
+ value: { type: 'string', description: 'Selected tab id — becomes data-aeon-state' },
161
+ },
162
+ slots: { Root: 'tabs.root', List: 'tabs.list', Trigger: 'tabs.trigger', Content: 'tabs.content' },
163
+ }),
164
+
165
+ accordion: componentSchema({
166
+ id: 'https://aeon-ui.com/schemas/accordion.json',
167
+ title: 'Accordion',
168
+ description: 'Per-item open state via accordionMachine.',
169
+ scope: 'accordion',
170
+ parts: ['root', 'item', 'itemTrigger', 'itemContent', 'itemIndicator'],
171
+ states: ['open', 'closed'],
172
+ machine: 'accordionMachine',
173
+ runtime: 'useAeonMachine',
174
+ events: ['TOGGLE'],
175
+ slots: {
176
+ Root: 'accordion.root',
177
+ Item: 'accordion.item',
178
+ ItemTrigger: 'accordion.itemTrigger',
179
+ ItemContent: 'accordion.itemContent',
180
+ },
181
+ }),
182
+
183
+ popover: componentSchema({
184
+ id: 'https://aeon-ui.com/schemas/popover.json',
185
+ title: 'Popover',
186
+ description: 'Floating surface — shares popoverMachine. Do not fork a duplicate open/closed chart.',
187
+ scope: 'popover',
188
+ parts: ['root', 'trigger', 'positioner', 'content', 'arrow', 'closeTrigger'],
189
+ states: ['open', 'closed'],
190
+ machine: 'popoverMachine',
191
+ runtime: 'useAeonMachine',
192
+ events: ['OPEN', 'CLOSE', 'TOGGLE'],
193
+ slots: { Root: 'popover.root', Trigger: 'popover.trigger', Content: 'popover.content' },
194
+ }),
195
+
196
+ menu: componentSchema({
197
+ id: 'https://aeon-ui.com/schemas/menu.json',
198
+ title: 'Menu',
199
+ description: 'Shares popoverMachine with Popover/Select open state.',
200
+ scope: 'menu',
201
+ parts: ['root', 'trigger', 'positioner', 'content', 'item', 'separator'],
202
+ states: ['open', 'closed'],
203
+ machine: 'popoverMachine',
204
+ runtime: 'useAeonMachine',
205
+ events: ['OPEN', 'CLOSE', 'TOGGLE'],
206
+ slots: { Root: 'menu.root', Trigger: 'menu.trigger', Content: 'menu.content', Item: 'menu.item' },
207
+ }),
208
+
209
+ select: componentSchema({
210
+ id: 'https://aeon-ui.com/schemas/select.json',
211
+ title: 'Select',
212
+ description: 'Open/closed via popoverMachine; highlight may be React-local. Do not invent a new open machine.',
213
+ scope: 'select',
214
+ parts: ['root', 'trigger', 'value', 'icon', 'positioner', 'content', 'item'],
215
+ states: ['open', 'closed'],
216
+ machine: 'popoverMachine',
217
+ runtime: 'useAeonMachine',
218
+ events: ['OPEN', 'CLOSE', 'TOGGLE'],
219
+ slots: { Root: 'select.root', Trigger: 'select.trigger', Content: 'select.content', Item: 'select.item' },
220
+ }),
221
+
222
+ combobox: componentSchema({
223
+ id: 'https://aeon-ui.com/schemas/combobox.json',
224
+ title: 'Combobox',
225
+ description: 'Typeahead — React useState for open/query/highlight today. Do not add a duplicate floating machine without COMPONENT_CHECKLIST.',
226
+ scope: 'combobox',
227
+ parts: ['root', 'input', 'icon', 'content', 'item', 'empty'],
228
+ states: ['open', 'closed'],
229
+ machine: null,
230
+ runtime: 'useState',
231
+ slots: { Root: 'combobox.root', Input: 'combobox.input', Content: 'combobox.content', Item: 'combobox.item' },
232
+ }),
233
+
234
+ tooltip: componentSchema({
235
+ id: 'https://aeon-ui.com/schemas/tooltip.json',
236
+ title: 'Tooltip',
237
+ description: 'Open via React useState. Touch tap toggles.',
238
+ scope: 'tooltip',
239
+ parts: ['root', 'trigger', 'positioner', 'content', 'arrow'],
240
+ states: ['open', 'closed'],
241
+ machine: null,
242
+ runtime: 'useState',
243
+ slots: { Root: 'tooltip.root', Trigger: 'tooltip.trigger', Content: 'tooltip.content' },
244
+ }),
245
+
246
+ toast: componentSchema({
247
+ id: 'https://aeon-ui.com/schemas/toast.json',
248
+ title: 'Toast',
249
+ description: 'Per-item visibility via toastMachine.',
250
+ scope: 'toast',
251
+ parts: ['viewport', 'root', 'title', 'description', 'closeTrigger'],
252
+ states: ['visible', 'hidden'],
253
+ machine: 'toastMachine',
254
+ runtime: 'useAeonMachine',
255
+ events: ['SHOW', 'HIDE', 'DISMISS'],
256
+ slots: {
257
+ Provider: 'toast.provider',
258
+ Viewport: 'toast.viewport',
259
+ Root: 'toast.root',
260
+ Title: 'toast.title',
261
+ Description: 'toast.description',
262
+ },
263
+ }),
264
+
265
+ scroll: componentSchema({
266
+ id: 'https://aeon-ui.com/schemas/scroll.json',
267
+ title: 'Scroll',
268
+ description: 'Derived overflow/edge snapshot via getScrollSnapshot() — no XState machine.',
269
+ scope: 'scroll',
270
+ parts: ['root', 'viewport', 'content'],
271
+ states: ['idle', 'start', 'middle', 'end', 'overflow-x', 'overflow-y', 'overflow-both'],
272
+ machine: null,
273
+ runtime: 'getScrollSnapshot',
274
+ slots: { Root: 'scroll.root', Viewport: 'scroll.viewport', Content: 'scroll.content' },
275
+ }),
276
+
277
+ progress: componentSchema({
278
+ id: 'https://aeon-ui.com/schemas/progress.json',
279
+ title: 'Progress',
280
+ description: 'Prop-driven progress: value + indeterminate → idle | loading | complete.',
281
+ scope: 'progress',
282
+ parts: ['root', 'track', 'range', 'label'],
283
+ states: ['idle', 'loading', 'complete'],
284
+ machine: null,
285
+ runtime: 'props',
286
+ props: {
287
+ value: { type: 'number', minimum: 0, maximum: 100 },
288
+ indeterminate: { type: 'boolean' },
289
+ },
290
+ slots: { Root: 'progress.root', Track: 'progress.track', Range: 'progress.range', Label: 'progress.label' },
291
+ }),
292
+ } as const satisfies Record<string, JsonSchema>
293
+
294
+ export type ComponentSchemaId = keyof typeof componentSchemas
295
+
296
+ export const catalog = {
297
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
298
+ $id: 'https://aeon-ui.com/schemas/catalog.json',
299
+ title: 'Aeon UI Component Catalog',
300
+ description:
301
+ 'Machine-legible index of Aeon UI components. Prefer these schemas over inventing props, states, or boolean UI flags.',
302
+ version: '0.1.0',
303
+ principle: 'UI = f(state)',
304
+ attributes: ['data-aeon-scope', 'data-aeon-part', 'data-aeon-state'],
305
+ components: Object.keys(componentSchemas),
306
+ schemas: componentSchemas,
307
+ } as const
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { catalog, componentSchemas } from './components.js'
3
+ import { AEON_SYSTEM_PROMPT } from './prompts.js'
4
+
5
+ describe('@aeon-ui/schemas', () => {
6
+ it('exposes a catalog of every component schema', () => {
7
+ expect(catalog.components.length).toBeGreaterThan(10)
8
+ expect(catalog.components).toContain('button')
9
+ expect(componentSchemas.button['x-aeon']).toMatchObject({
10
+ scope: 'button',
11
+ runtime: 'status prop',
12
+ })
13
+ })
14
+
15
+ it('keeps button statuses exhaustive for agents', () => {
16
+ const states = (componentSchemas.button['x-aeon'] as { states: string[] }).states
17
+ expect(states).toEqual(['idle', 'pending', 'success', 'failure', 'disabled'])
18
+ })
19
+
20
+ it('ships a non-empty system prompt', () => {
21
+ expect(AEON_SYSTEM_PROMPT).toContain('UI = f(state)')
22
+ expect(AEON_SYSTEM_PROMPT).toContain('Build the state machines first')
23
+ expect(AEON_SYSTEM_PROMPT).toContain('data-aeon-state')
24
+ })
25
+ })
@@ -0,0 +1,25 @@
1
+ export { componentSchema, type JsonSchema } from './schema-builder.js'
2
+ export { catalog, componentSchemas, type ComponentSchemaId } from './components.js'
3
+ export {
4
+ AEON_SYSTEM_PROMPT,
5
+ CURSOR_RULES_SNIPPET,
6
+ GENERATIVE_UI_EXAMPLE,
7
+ STATECHART_PROMPTS,
8
+ } from './prompts.js'
9
+ export {
10
+ aeonToSchema,
11
+ aeonToPrompt,
12
+ aeonSnapshotSchema,
13
+ aeonInitialAgentContext,
14
+ type AeonMachineSchema,
15
+ type AeonSnapshotSchema,
16
+ type AeonStateTreeNode,
17
+ } from './aeon-to-schema.js'
18
+ export {
19
+ createAgentEventBridge,
20
+ type AgentStreamEvent,
21
+ type AgentEventMap,
22
+ type AgentBridgeOptions,
23
+ type AgentEventBridge,
24
+ } from './agent-bridge.js'
25
+ export { registryCatalog, REGISTRY_BASE, type RegistryEntry } from './registry.js'
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Statecharts packaged as system-prompt fragments for AI coding agents.
3
+ * Embed before code generation so agents cannot invent impossible UI states.
4
+ */
5
+
6
+ export const AEON_SYSTEM_PROMPT = `# Aeon UI — agent system prompt
7
+
8
+ You are building UI with **Aeon UI**, a React component library powered by finite statecharts.
9
+
10
+ ## Order of work (mandatory)
11
+ 1. **Build the state machines first** — name every lifecycle the UX needs (states + events). Prefer machines from \`@aeon-ui/primitives\` (or documented prop projections such as Button \`status\`).
12
+ 2. **Then project UI from those machines** — compound parts, copy, and layout exist only to reflect the chart. Never invent UI for states that are not in a machine.
13
+ 3. **UI = f(state)** — the DOM exposes \`data-aeon-scope\`, \`data-aeon-part\`, \`data-aeon-state\`. Style targets those attributes. Do not drive the same concern with parallel React \`useState\` flags.
14
+
15
+ ## Non-negotiable rules
16
+ 1. Do not duplicate open/checked/lifecycle in \`useState\` when a machine exists in \`@aeon-ui/primitives\`.
17
+ 2. **Button \`status\` is a prop** (\`idle|pending|success|failure|disabled\`). Optional: drive it from \`buttonLifecycleMachine\` via \`useAeonMachine\` in app code.
18
+ 3. **Select / Menu / Popover** share \`popoverMachine\` — never fork another open/closed chart.
19
+ 4. **Combobox** and **Tooltip** use React state today — do not add floating machines without the component checklist.
20
+ 5. **Scroll** uses \`getScrollSnapshot()\` — no XState machine.
21
+ 6. If a machine lists N stable states, the UI must represent all N (totality).
22
+ 7. Prefer \`@aeon-ui/react\` (headless) or \`@aeon-ui/ui\` (styled). Relative TS imports use \`.js\` extensions inside the Aeon monorepo only.
23
+ 8. Primitives stay **universal** — never invent niche components (dating, colour-blind test, pong). Compose from generic parts.
24
+
25
+ ## DOM contract
26
+ Every interactive surface sets anatomy via \`partAttrs\` from \`@aeon-ui/core\`:
27
+ - \`data-aeon-scope\` — family (\`button\`, \`async\`, \`field\`, …)
28
+ - \`data-aeon-part\` — anatomy key (\`root\`, \`trigger\`, …)
29
+ - \`data-aeon-state\` — allowed snapshot / prop state only
30
+
31
+ ## Before writing JSX
32
+ 1. Enumerate machines (or documented status props) for the flow — states and events.
33
+ 2. Read the component JSON Schema from \`@aeon-ui/schemas\` (or pasted catalog) and match parts to those charts.
34
+ 3. Compose with documented compound parts (\`Dialog.Root\`, \`Field.Control\`, …).
35
+ 4. Wire events to machine events or documented props — never invent \`isLoading && !isError && hasData\` spaghetti when a named state exists.
36
+ `
37
+
38
+ export const STATECHART_PROMPTS = {
39
+ async: `## Async region statechart
40
+ States: idle → loading → (success | empty | failure); REFRESH from success/empty/failure; STALE flag while success.
41
+ Events: FETCH, RESOLVE{data}, REJECT{error}, RESET, STALE, REFRESH.
42
+ Rule: Render track segments for idle, loading, success, empty, failure. Never hide empty/failure behind a generic spinner.`,
43
+
44
+ field: `## Field parallel statechart
45
+ Regions:
46
+ - interaction: pristine | dirty
47
+ - validation: valid | invalid
48
+ - submission: idle | pending
49
+ Events: INPUT, BLUR, VALIDATE{valid}, SUBMIT, SUBMIT_DONE, SUBMIT_FAIL, RESET.
50
+ Rule: Do not collapse validation + submission into one \`error\` boolean. Message UI follows validation region; pending follows submission.`,
51
+
52
+ button: `## Button lifecycle
53
+ Preferred headless API: \`status\` prop ∈ idle | pending | success | failure | disabled.
54
+ Optional machine: buttonLifecycleMachine with PRESS / RESOLVE / REJECT / RESET.
55
+ Rule: Pending must set aria-busy. Do not use disabled alone to mean "saving".`,
56
+
57
+ dialog: `## Dialog statechart
58
+ States: open | closed. Events: OPEN, CLOSE, TOGGLE.
59
+ Rule: Backdrop click and Escape are CLOSE transitions. Title/Description are required for a11y when open.`,
60
+
61
+ popoverFamily: `## Popover family (Popover, Menu, Select open state)
62
+ Machine: popoverMachine — states open | closed.
63
+ Rule: Reuse this chart. Never create selectOpenMachine / menuOpenMachine forks.`,
64
+
65
+ toggle: `## Switch / Checkbox
66
+ Machine: toggleMachine — checked | unchecked. Events: TOGGLE, CHECK, UNCHECK.
67
+ Rule: Hidden input stays in sync with snapshot for forms.`,
68
+ } as const
69
+
70
+ /** Checkout-form example used on the landing "AI playground" proof. */
71
+ export const GENERATIVE_UI_EXAMPLE = {
72
+ prompt: 'Create a multi-step checkout form with error handling.',
73
+ schemaOutput: {
74
+ component: 'CheckoutFlow',
75
+ steps: [
76
+ {
77
+ id: 'shipping',
78
+ fields: [
79
+ { component: 'Field', name: 'email', states: ['interaction', 'validation', 'submission'] },
80
+ { component: 'Field', name: 'address', states: ['interaction', 'validation', 'submission'] },
81
+ ],
82
+ },
83
+ {
84
+ id: 'payment',
85
+ fields: [{ component: 'Field', name: 'card', states: ['interaction', 'validation', 'submission'] }],
86
+ },
87
+ ],
88
+ submit: {
89
+ component: 'Button',
90
+ statusMachine: 'buttonLifecycleMachine',
91
+ allowedStatuses: ['idle', 'pending', 'success', 'failure'],
92
+ },
93
+ asyncRegion: {
94
+ component: 'Async',
95
+ allowedStates: ['idle', 'loading', 'success', 'empty', 'failure'],
96
+ onFailure: 'show Field.message + Button status=failure',
97
+ },
98
+ },
99
+ renderedHint:
100
+ 'Aeon maps each step to Field (parallel regions) + Button status + Async lifecycle — named states throughout.',
101
+ } as const
102
+
103
+ export const CURSOR_RULES_SNIPPET = `${AEON_SYSTEM_PROMPT}
104
+
105
+ ## Schemas
106
+ When generating Aeon UI, constrain props/parts/states to @aeon-ui/schemas catalog.
107
+ Import headless from @aeon-ui/react or styled from @aeon-ui/ui.
108
+ Install: npm install aeon-ui-engine react react-dom xstate @xstate/react
109
+ CSS: import 'aeon-ui-engine/aeon.css'
110
+ Vite: aeonUiVitePlugin() from aeon-ui-engine/vite
111
+
112
+ ${STATECHART_PROMPTS.async}
113
+
114
+ ${STATECHART_PROMPTS.field}
115
+
116
+ ${STATECHART_PROMPTS.button}
117
+
118
+ ${STATECHART_PROMPTS.dialog}
119
+
120
+ ${STATECHART_PROMPTS.popoverFamily}
121
+ `
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Aeon UI agent registry — machine-legible component contracts for Generative UI.
3
+ * Fetch at runtime: GET https://aeon-ui.com/registry/catalog.json
4
+ * Per component: GET https://aeon-ui.com/registry/components/{id}.json
5
+ * Machines: GET https://aeon-ui.com/registry/machines/{id}.json
6
+ */
7
+ export type RegistryEntry = {
8
+ id: string
9
+ title: string
10
+ scope: string
11
+ schemaUrl: string
12
+ machineUrl?: string
13
+ runtime: string
14
+ description: string
15
+ }
16
+
17
+ export const REGISTRY_BASE = 'https://aeon-ui.com/registry' as const
18
+
19
+ export const registryCatalog = {
20
+ $id: `${REGISTRY_BASE}/catalog.json`,
21
+ version: '0.1.0',
22
+ principle: 'UI = f(state)',
23
+ description:
24
+ 'Lightweight runtime registry — fetch Aeon component schemas and state-tree JSON on demand instead of bundling every primitive.',
25
+ endpoints: {
26
+ catalog: `${REGISTRY_BASE}/catalog.json`,
27
+ component: `${REGISTRY_BASE}/components/{id}.json`,
28
+ machine: `${REGISTRY_BASE}/machines/{id}.json`,
29
+ },
30
+ components: [
31
+ {
32
+ id: 'button',
33
+ title: 'Button',
34
+ scope: 'button',
35
+ schemaUrl: `${REGISTRY_BASE}/components/button.json`,
36
+ machineUrl: `${REGISTRY_BASE}/machines/buttonLifecycle.json`,
37
+ runtime: 'status prop',
38
+ description: 'Action control with idle|pending|success|failure|disabled',
39
+ },
40
+ {
41
+ id: 'async',
42
+ title: 'Async',
43
+ scope: 'async',
44
+ schemaUrl: `${REGISTRY_BASE}/components/async.json`,
45
+ machineUrl: `${REGISTRY_BASE}/machines/async.json`,
46
+ runtime: 'useAeonMachine',
47
+ description: 'Fetch lifecycle region with full totality',
48
+ },
49
+ {
50
+ id: 'field',
51
+ title: 'Field',
52
+ scope: 'field',
53
+ schemaUrl: `${REGISTRY_BASE}/components/field.json`,
54
+ machineUrl: `${REGISTRY_BASE}/machines/field.json`,
55
+ runtime: 'useAeonMachine',
56
+ description: 'Parallel interaction × validation × submission',
57
+ },
58
+ {
59
+ id: 'dialog',
60
+ title: 'Dialog',
61
+ scope: 'dialog',
62
+ schemaUrl: `${REGISTRY_BASE}/components/dialog.json`,
63
+ machineUrl: `${REGISTRY_BASE}/machines/dialog.json`,
64
+ runtime: 'useAeonMachine',
65
+ description: 'Modal open/closed',
66
+ },
67
+ ] satisfies RegistryEntry[],
68
+ client: {
69
+ fetchCatalog: `fetch('${REGISTRY_BASE}/catalog.json').then(r => r.json())`,
70
+ fetchComponent: `id => fetch(\`${REGISTRY_BASE}/components/\${id}.json\`).then(r => r.json())`,
71
+ fetchMachine: `id => fetch(\`${REGISTRY_BASE}/machines/\${id}.json\`).then(r => r.json())`,
72
+ },
73
+ } as const
@@ -0,0 +1,87 @@
1
+ /** JSON Schema 2020-12 helpers for Aeon component contracts. */
2
+
3
+ export type JsonSchema = Record<string, unknown>
4
+
5
+ export function componentSchema(opts: {
6
+ id: string
7
+ title: string
8
+ description: string
9
+ scope: string
10
+ parts: readonly string[]
11
+ states: readonly string[]
12
+ props?: Record<string, JsonSchema>
13
+ slots?: Record<string, string>
14
+ machine?: string | null
15
+ runtime?: string
16
+ events?: readonly string[]
17
+ examples?: readonly string[]
18
+ }): JsonSchema {
19
+ const props = opts.props ?? {}
20
+ return {
21
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
22
+ $id: opts.id,
23
+ title: opts.title,
24
+ description: opts.description,
25
+ type: 'object',
26
+ additionalProperties: false,
27
+ required: ['component', 'scope'],
28
+ properties: {
29
+ component: { const: opts.title.replace(/\s+/g, '') },
30
+ scope: { const: opts.scope },
31
+ parts: {
32
+ type: 'array',
33
+ description: 'Anatomy part keys — map to data-aeon-part',
34
+ items: { type: 'string', enum: [...opts.parts] },
35
+ uniqueItems: true,
36
+ },
37
+ states: {
38
+ type: 'array',
39
+ description: 'Allowed data-aeon-state values (stable states only)',
40
+ items: { type: 'string', enum: [...opts.states] },
41
+ uniqueItems: true,
42
+ },
43
+ props: {
44
+ type: 'object',
45
+ additionalProperties: false,
46
+ properties: props,
47
+ },
48
+ slots: {
49
+ type: 'object',
50
+ description: 'Named composition slots / compound parts',
51
+ additionalProperties: { type: 'string' },
52
+ properties: Object.fromEntries(
53
+ Object.entries(opts.slots ?? {}).map(([k, v]) => [k, { const: v, description: v }]),
54
+ ),
55
+ },
56
+ machine: {
57
+ type: ['string', 'null'],
58
+ description: 'XState machine export from @aeon-ui/primitives, or null if prop/React driven',
59
+ const: opts.machine ?? null,
60
+ },
61
+ runtime: {
62
+ type: 'string',
63
+ description: 'How headless state is driven at runtime',
64
+ const: opts.runtime ?? 'useAeonMachine',
65
+ },
66
+ events: {
67
+ type: 'array',
68
+ items: { type: 'string', enum: [...(opts.events ?? [])] },
69
+ },
70
+ examples: {
71
+ type: 'array',
72
+ items: { type: 'string' },
73
+ default: opts.examples ?? [],
74
+ },
75
+ },
76
+ 'x-aeon': {
77
+ scope: opts.scope,
78
+ parts: [...opts.parts],
79
+ states: [...opts.states],
80
+ machine: opts.machine ?? null,
81
+ runtime: opts.runtime ?? 'useAeonMachine',
82
+ events: [...(opts.events ?? [])],
83
+ slots: opts.slots ?? {},
84
+ examples: [...(opts.examples ?? [])],
85
+ },
86
+ }
87
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src",
6
+ "noEmit": true
7
+ },
8
+ "include": ["src", "scripts"]
9
+ }
@@ -8,7 +8,7 @@
8
8
  "url": "https://github.com/GenericCPU/aeon-ui.git",
9
9
  "directory": "packages/solid"
10
10
  },
11
- "publishConfig": { "access": "public" },
11
+ "private": true,
12
12
  "files": ["dist", "README.md"],
13
13
  "keywords": ["aeon-ui", "solid", "solidjs", "headless", "xstate", "statechart"],
14
14
  "type": "module",
@@ -29,7 +29,7 @@
29
29
  "@aeon-ui/core": "workspace:*",
30
30
  "@aeon-ui/primitives": "workspace:*",
31
31
  "@xstate/solid": "^2.0.0",
32
- "xstate": "^5.19.2"
32
+ "xstate": "^5.32.0"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "solid-js": "^1.8.0"