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,135 @@
1
+ import { barAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { stickyBarMachine, type StickyBarState } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useMemo,
8
+ type CSSProperties,
9
+ type HTMLAttributes,
10
+ type ReactNode,
11
+ } from 'react'
12
+ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
13
+ import { mergeProps } from '../utils/merge-props.js'
14
+
15
+ interface StickyBarContextValue {
16
+ state: StickyBarState
17
+ offsetPx: number
18
+ send: ReturnType<typeof useAeonMachine<typeof stickyBarMachine>>[1]
19
+ }
20
+
21
+ const StickyBarCtx = createContext<StickyBarContextValue | null>(null)
22
+
23
+ export function useStickyBarContext() {
24
+ const ctx = useContext(StickyBarCtx)
25
+ if (!ctx) throw new Error('StickyBar parts must be used within StickyBar.Root')
26
+ return ctx
27
+ }
28
+
29
+ export interface StickyBarRootProps extends HTMLAttributes<HTMLElement> {
30
+ as?: 'header' | 'nav' | 'footer' | 'div'
31
+ /** Placement — top | bottom | inline (CSS contract). */
32
+ placement?: 'top' | 'bottom' | 'inline'
33
+ /** Initial machine state. */
34
+ defaultState?: StickyBarState
35
+ children?: ReactNode
36
+ }
37
+
38
+ const Root = forwardRef<HTMLElement, StickyBarRootProps>(function StickyBarRoot(
39
+ {
40
+ /* Default div — AppShell.Header is already the landmark; nested <header> is invalid
41
+ HTML and browsers auto-close the outer header (0-height), so the bar covers content. */
42
+ as: Tag = 'div',
43
+ placement = 'top',
44
+ defaultState = 'floating',
45
+ children,
46
+ style,
47
+ ...rest
48
+ },
49
+ ref,
50
+ ) {
51
+ const [snapshot, send] = useAeonMachine(stickyBarMachine, {
52
+ input: { initial: defaultState },
53
+ })
54
+ const state = snapshot.value as StickyBarState
55
+ const offsetPx = snapshot.context.offsetPx
56
+ const value = useMemo(() => ({ state, offsetPx, send }), [state, offsetPx, send])
57
+
58
+ if (state === 'hidden') return null
59
+
60
+ const stickyStyle: CSSProperties = {
61
+ ...(typeof style === 'object' && style ? style : {}),
62
+ ...(offsetPx > 0 ? ({ ['--aeon-bar-offset' as string]: `${offsetPx}px` } as CSSProperties) : {}),
63
+ }
64
+
65
+ return (
66
+ <StickyBarCtx.Provider value={value}>
67
+ <Tag
68
+ ref={ref as never}
69
+ data-aeon-placement={placement}
70
+ style={stickyStyle}
71
+ {...mergeProps(scopeAttrs(barAnatomy.scope, barAnatomy.root, { state }), rest)}
72
+ >
73
+ {children}
74
+ </Tag>
75
+ </StickyBarCtx.Provider>
76
+ )
77
+ })
78
+
79
+ type Zone = 'leading' | 'center' | 'trailing'
80
+
81
+ const Zone = forwardRef<
82
+ HTMLDivElement,
83
+ HTMLAttributes<HTMLDivElement> & { zone: Zone }
84
+ >(function StickyBarZone({ zone, ...rest }, ref) {
85
+ const { state } = useStickyBarContext()
86
+ return (
87
+ <div
88
+ ref={ref}
89
+ {...mergeProps(partAttrs(barAnatomy.scope, zone, { state }), rest)}
90
+ />
91
+ )
92
+ })
93
+
94
+ const Leading = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
95
+ function StickyBarLeading(props, ref) {
96
+ return <Zone ref={ref} zone="leading" {...props} />
97
+ },
98
+ )
99
+ const Center = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
100
+ function StickyBarCenter(props, ref) {
101
+ return <Zone ref={ref} zone="center" {...props} />
102
+ },
103
+ )
104
+ const Trailing = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
105
+ function StickyBarTrailing(props, ref) {
106
+ return <Zone ref={ref} zone="trailing" {...props} />
107
+ },
108
+ )
109
+
110
+ const Seam = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function StickyBarSeam(
111
+ props,
112
+ ref,
113
+ ) {
114
+ const { state } = useStickyBarContext()
115
+ return (
116
+ <div
117
+ ref={ref}
118
+ aria-hidden
119
+ {...mergeProps(partAttrs(barAnatomy.scope, barAnatomy.seam, { state }), props)}
120
+ />
121
+ )
122
+ })
123
+
124
+ /**
125
+ * StickyBar — sticky/fixed chrome band with machine totality.
126
+ * States: floating | docked | collapsed | hidden
127
+ * Zones reuse bar anatomy (leading / center / trailing / seam).
128
+ */
129
+ export const StickyBar = {
130
+ Root,
131
+ Leading,
132
+ Center,
133
+ Trailing,
134
+ Seam,
135
+ }
@@ -101,7 +101,13 @@ const Root = forwardRef<HTMLLabelElement, SwitchRootProps>(function SwitchRoot(
101
101
  rest as ButtonHTMLAttributes<HTMLLabelElement>,
102
102
  )}
103
103
  >
104
- {children}
104
+ {children ?? (
105
+ <>
106
+ <Control>
107
+ <Thumb />
108
+ </Control>
109
+ </>
110
+ )}
105
111
  </label>
106
112
  </SwitchCtx.Provider>
107
113
  )
@@ -0,0 +1,227 @@
1
+ import { partAttrs, scopeAttrs, themeSwitcherAnatomy } from '@aeon-ui/core'
2
+ import {
3
+ applyAeonTheme,
4
+ initAeonTheme,
5
+ type AeonColorMode,
6
+ } from '@aeon-ui/core'
7
+ import {
8
+ createContext,
9
+ forwardRef,
10
+ type HTMLAttributes,
11
+ useContext,
12
+ useLayoutEffect,
13
+ useState,
14
+ } from 'react'
15
+ import { mergeProps } from '../utils/merge-props.js'
16
+
17
+ /* ------------------------------------------------------------------ */
18
+ /* Types */
19
+ /* ------------------------------------------------------------------ */
20
+
21
+ export interface ThemeSwitcherRootProps extends HTMLAttributes<HTMLDivElement> {
22
+ /** Initial theme — overridden by localStorage / system preference. */
23
+ defaultTheme?: string
24
+ /** Initial mode — overridden by localStorage / system preference. */
25
+ defaultMode?: AeonColorMode
26
+ /** Called when theme or mode changes. */
27
+ onThemeChange?: (themeId: string, mode: AeonColorMode) => void
28
+ }
29
+
30
+ export interface ThemeSwitcherModesProps extends HTMLAttributes<HTMLDivElement> {}
31
+
32
+ export interface ThemeSwitcherModeBtnProps extends HTMLAttributes<HTMLButtonElement> {
33
+ mode: AeonColorMode
34
+ active: boolean
35
+ }
36
+
37
+ export interface ThemeSwitcherThemeSelectProps extends HTMLAttributes<HTMLDivElement> {}
38
+
39
+ /* ------------------------------------------------------------------ */
40
+ /* Root */
41
+ /* ------------------------------------------------------------------ */
42
+
43
+ const Root = forwardRef<HTMLDivElement, ThemeSwitcherRootProps>(
44
+ function ThemeSwitcherRoot(
45
+ { defaultTheme, defaultMode, onThemeChange, children, ...rest },
46
+ ref,
47
+ ) {
48
+ const [themeId, setThemeId] = useState(defaultTheme ?? 'default')
49
+ const [mode, setMode] = useState<AeonColorMode>(defaultMode ?? 'dark')
50
+
51
+ useLayoutEffect(() => {
52
+ const { themeId: t, mode: m } = initAeonTheme()
53
+ setThemeId(t)
54
+ setMode(m)
55
+ }, [])
56
+
57
+ const handleThemeChange = (next: string) => {
58
+ setThemeId(next)
59
+ applyAeonTheme(next, mode)
60
+ onThemeChange?.(next, mode)
61
+ }
62
+
63
+ const handleModeChange = (next: AeonColorMode) => {
64
+ setMode(next)
65
+ applyAeonTheme(themeId, next)
66
+ onThemeChange?.(themeId, next)
67
+ }
68
+
69
+ return (
70
+ <div
71
+ ref={ref}
72
+ {...mergeProps(
73
+ scopeAttrs(themeSwitcherAnatomy.scope, themeSwitcherAnatomy.root),
74
+ rest,
75
+ )}
76
+ >
77
+ <ThemeSwitcherContext.Provider
78
+ value={{ themeId, mode, handleThemeChange, handleModeChange }}
79
+ >
80
+ {children}
81
+ </ThemeSwitcherContext.Provider>
82
+ </div>
83
+ )
84
+ },
85
+ )
86
+
87
+ /* ------------------------------------------------------------------ */
88
+ /* Context */
89
+ /* ------------------------------------------------------------------ */
90
+
91
+ interface ThemeSwitcherContextValue {
92
+ themeId: string
93
+ mode: AeonColorMode
94
+ handleThemeChange: (id: string) => void
95
+ handleModeChange: (mode: AeonColorMode) => void
96
+ }
97
+
98
+ const ThemeSwitcherContext = createContext<ThemeSwitcherContextValue | null>(null)
99
+
100
+ function useThemeSwitcher() {
101
+ const ctx = useContext(ThemeSwitcherContext)
102
+ if (!ctx) throw new Error('ThemeSwitcher parts must be used inside <ThemeSwitcher.Root>')
103
+ return ctx
104
+ }
105
+
106
+ /* ------------------------------------------------------------------ */
107
+ /* Modes (light/dark button group) */
108
+ /* ------------------------------------------------------------------ */
109
+
110
+ const Modes = forwardRef<HTMLDivElement, ThemeSwitcherModesProps>(
111
+ function ThemeSwitcherModes(props, ref) {
112
+ return (
113
+ <div
114
+ ref={ref}
115
+ role="group"
116
+ aria-label="Color mode"
117
+ {...mergeProps(
118
+ partAttrs(themeSwitcherAnatomy.scope, themeSwitcherAnatomy.modes),
119
+ props,
120
+ )}
121
+ />
122
+ )
123
+ },
124
+ )
125
+
126
+ /* ------------------------------------------------------------------ */
127
+ /* Mode button */
128
+ /* ------------------------------------------------------------------ */
129
+
130
+ const ModeBtn = forwardRef<HTMLButtonElement, ThemeSwitcherModeBtnProps>(
131
+ function ThemeSwitcherModeBtn({ mode, active, ...rest }, ref) {
132
+ const { handleModeChange } = useThemeSwitcher()
133
+ return (
134
+ <button
135
+ ref={ref}
136
+ type="button"
137
+ aria-pressed={active}
138
+ data-active={active ? 'true' : undefined}
139
+ {...mergeProps(
140
+ partAttrs(themeSwitcherAnatomy.scope, themeSwitcherAnatomy.modeBtn),
141
+ rest,
142
+ )}
143
+ onClick={(e) => {
144
+ handleModeChange(mode)
145
+ rest.onClick?.(e)
146
+ }}
147
+ >
148
+ {rest.children ?? (mode === 'light' ? 'Light' : 'Dark')}
149
+ </button>
150
+ )
151
+ },
152
+ )
153
+
154
+ /* ------------------------------------------------------------------ */
155
+ /* Theme select wrapper */
156
+ /* ------------------------------------------------------------------ */
157
+
158
+ const ThemeSelect = forwardRef<HTMLDivElement, ThemeSwitcherThemeSelectProps>(
159
+ function ThemeSwitcherThemeSelect({ children, ...rest }, ref) {
160
+ return (
161
+ <div
162
+ ref={ref}
163
+ {...mergeProps(
164
+ partAttrs(themeSwitcherAnatomy.scope, themeSwitcherAnatomy.themeSelect),
165
+ rest,
166
+ )}
167
+ >
168
+ {children}
169
+ </div>
170
+ )
171
+ },
172
+ )
173
+
174
+ /* ------------------------------------------------------------------ */
175
+ /* Theme trigger (displays current theme label) */
176
+ /* ------------------------------------------------------------------ */
177
+
178
+ const ThemeTrigger = forwardRef<HTMLButtonElement, HTMLAttributes<HTMLButtonElement>>(
179
+ function ThemeSwitcherThemeTrigger(props, ref) {
180
+ const { themeId } = useThemeSwitcher()
181
+ return (
182
+ <button
183
+ ref={ref}
184
+ type="button"
185
+ aria-label={`Theme preset: ${themeId}`}
186
+ {...mergeProps(
187
+ partAttrs(themeSwitcherAnatomy.scope, themeSwitcherAnatomy.themeTrigger),
188
+ props,
189
+ )}
190
+ >
191
+ {props.children ?? themeId}
192
+ </button>
193
+ )
194
+ },
195
+ )
196
+
197
+ /* ------------------------------------------------------------------ */
198
+ /* Public API */
199
+ /* ------------------------------------------------------------------ */
200
+
201
+ /**
202
+ * ThemeSwitcher — headless compound component for theme + mode control.
203
+ *
204
+ * Uses `initAeonTheme()` on mount to read localStorage / system preference.
205
+ * All state changes call `applyAeonTheme()` to update `<html>` dataset attrs.
206
+ *
207
+ * @example
208
+ * <ThemeSwitcher.Root>
209
+ * <ThemeSwitcher.Modes>
210
+ * <ThemeSwitcher.ModeBtn mode="light" active={mode === 'light'} />
211
+ * <ThemeSwitcher.ModeBtn mode="dark" active={mode === 'dark'} />
212
+ * </ThemeSwitcher.Modes>
213
+ * <ThemeSwitcher.ThemeSelect>
214
+ * <ThemeSwitcher.ThemeTrigger />
215
+ * </ThemeSwitcher.ThemeSelect>
216
+ * </ThemeSwitcher.Root>
217
+ */
218
+ export const ThemeSwitcher = {
219
+ Root,
220
+ Modes,
221
+ ModeBtn,
222
+ ThemeSelect,
223
+ ThemeTrigger,
224
+ }
225
+
226
+ /** Re-export theme types for convenience. */
227
+ export type { AeonColorMode as AeonMode }
@@ -0,0 +1,95 @@
1
+ import { partAttrs, scopeAttrs, threadAnatomy } from '@aeon-ui/core'
2
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export type ThreadMessageState = 'mine' | 'theirs' | 'pending' | 'failed'
6
+
7
+ export interface ThreadRootProps extends HTMLAttributes<HTMLElement> {
8
+ children?: ReactNode
9
+ }
10
+
11
+ /**
12
+ * Thread — message stream. Item `state` projects mine | theirs | pending | failed.
13
+ */
14
+ const Root = forwardRef<HTMLElement, ThreadRootProps>(function ThreadRoot(
15
+ { children, ...rest },
16
+ ref,
17
+ ) {
18
+ return (
19
+ <div
20
+ ref={ref as never}
21
+ {...mergeProps(scopeAttrs(threadAnatomy.scope, threadAnatomy.root), rest)}
22
+ >
23
+ {children}
24
+ </div>
25
+ )
26
+ })
27
+
28
+ const List = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ThreadList(
29
+ props,
30
+ ref,
31
+ ) {
32
+ return (
33
+ <div
34
+ ref={ref}
35
+ role="log"
36
+ aria-live="polite"
37
+ {...mergeProps(partAttrs(threadAnatomy.scope, threadAnatomy.list), props)}
38
+ />
39
+ )
40
+ })
41
+
42
+ export interface ThreadItemProps extends HTMLAttributes<HTMLDivElement> {
43
+ state?: ThreadMessageState | `${ThreadMessageState} ${string}`
44
+ }
45
+
46
+ const Item = forwardRef<HTMLDivElement, ThreadItemProps>(function ThreadItem(
47
+ { state = 'theirs', ...rest },
48
+ ref,
49
+ ) {
50
+ return (
51
+ <div
52
+ ref={ref}
53
+ {...mergeProps(partAttrs(threadAnatomy.scope, threadAnatomy.item, { state }), rest)}
54
+ />
55
+ )
56
+ })
57
+
58
+ const Bubble = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ThreadBubble(
59
+ props,
60
+ ref,
61
+ ) {
62
+ return (
63
+ <div
64
+ ref={ref}
65
+ {...mergeProps(partAttrs(threadAnatomy.scope, threadAnatomy.bubble), props)}
66
+ />
67
+ )
68
+ })
69
+
70
+ const Meta = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function ThreadMeta(
71
+ props,
72
+ ref,
73
+ ) {
74
+ return (
75
+ <span ref={ref} {...mergeProps(partAttrs(threadAnatomy.scope, threadAnatomy.meta), props)} />
76
+ )
77
+ })
78
+
79
+ const Day = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ThreadDay(
80
+ props,
81
+ ref,
82
+ ) {
83
+ return (
84
+ <div ref={ref} {...mergeProps(partAttrs(threadAnatomy.scope, threadAnatomy.day), props)} />
85
+ )
86
+ })
87
+
88
+ export const Thread = {
89
+ Root,
90
+ List,
91
+ Item,
92
+ Bubble,
93
+ Meta,
94
+ Day,
95
+ }
@@ -105,7 +105,7 @@ export const CloseTrigger = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<H
105
105
  <button
106
106
  ref={ref}
107
107
  type="button"
108
- aria-label={typeof children === 'string' ? undefined : 'Dismiss'}
108
+ aria-label="Dismiss"
109
109
  {...mergeProps(
110
110
  partAttrs(toastAnatomy.scope, toastAnatomy.closeTrigger),
111
111
  {
@@ -117,7 +117,7 @@ export const CloseTrigger = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<H
117
117
  rest,
118
118
  )}
119
119
  >
120
- {children ?? 'Dismiss'}
120
+ {children ?? '\u00d7'}
121
121
  </button>
122
122
  )
123
123
  },
@@ -4,14 +4,22 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
4
4
  import { Tooltip } from './index.js'
5
5
 
6
6
  function mockPrefersHover(matches: boolean) {
7
+ if (!window.matchMedia) {
8
+ Object.defineProperty(window, 'matchMedia', {
9
+ writable: true,
10
+ value: vi.fn(),
11
+ })
12
+ }
7
13
  vi.spyOn(window, 'matchMedia').mockImplementation((query) => ({
8
14
  matches: query.includes('hover: hover') ? matches : false,
9
15
  media: query,
10
16
  onchange: null,
17
+ addListener: vi.fn(),
18
+ removeListener: vi.fn(),
11
19
  addEventListener: vi.fn(),
12
20
  removeEventListener: vi.fn(),
13
21
  dispatchEvent: vi.fn(),
14
- }))
22
+ }) as unknown as MediaQueryList)
15
23
  }
16
24
 
17
25
  describe('Tooltip', () => {
@@ -2,7 +2,8 @@
2
2
  "extends": "../../tsconfig.base.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "dist",
5
- "rootDir": "src"
5
+ "rootDir": "src",
6
+ "types": ["@testing-library/jest-dom/vitest"]
6
7
  },
7
8
  "include": ["src"]
8
9
  }
@@ -0,0 +1,52 @@
1
+ # @aeon-ui/schemas
2
+
3
+ Deterministic **JSON Schemas**, **statechart → LLM prompts**, and **agent event bridges** for Aeon UI.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @aeon-ui/schemas
9
+ npx aeon-ui init
10
+ ```
11
+
12
+ ## Statechart-as-a-prompt
13
+
14
+ ```ts
15
+ import { createActor } from 'xstate'
16
+ import { asyncMachine } from '@aeon-ui/primitives'
17
+ import { aeonToSchema, aeonToPrompt, aeonSnapshotSchema, createAgentEventBridge } from '@aeon-ui/schemas'
18
+
19
+ const schema = aeonToSchema(asyncMachine)
20
+ // hierarchical tree + events — feed to tools / zod enums
21
+
22
+ const actor = createActor(asyncMachine)
23
+ actor.start()
24
+ const prompt = aeonToPrompt(asyncMachine, actor.getSnapshot())
25
+ const live = aeonSnapshotSchema(asyncMachine, actor.getSnapshot())
26
+ // live.validEvents → only what the agent may send *now*
27
+
28
+ const bridge = createAgentEventBridge(actor, {
29
+ map: {
30
+ AGENT_STREAM_START: 'FETCH',
31
+ AGENT_STREAM_ERROR: (e) =>
32
+ e.type === 'AGENT_STREAM_ERROR' ? { type: 'REJECT', error: e.error } : null,
33
+ },
34
+ })
35
+ bridge.push({ type: 'AGENT_STREAM_START' })
36
+ ```
37
+
38
+ ## Registry
39
+
40
+ Runtime fetch (also mirrored on the demo at `/registry/`):
41
+
42
+ - `https://aeon-ui.com/registry/catalog.json`
43
+ - `https://aeon-ui.com/registry/components/button.json`
44
+ - `https://aeon-ui.com/registry/machines/async.json`
45
+
46
+ ## Cookbook
47
+
48
+ [Vercel AI SDK + streamUI](../../docs/cookbook/vercel-ai-sdk.md)
49
+
50
+ ## Principle
51
+
52
+ **UI = f(state)** — if it is not on the chart / in `validEvents`, do not send it.