aeon-ui-engine 1.0.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 (430) hide show
  1. package/.changeset/README.md +23 -0
  2. package/.changeset/combobox-and-changesets.md +9 -0
  3. package/.changeset/config.json +30 -0
  4. package/.changeset/framework-adapters.md +12 -0
  5. package/.changeset/scene-3d.md +6 -0
  6. package/.changeset/scene-plane.md +8 -0
  7. package/.changeset/site-og.md +5 -0
  8. package/.cursor/rules/aeon-ui.mdc +22 -0
  9. package/ACCESSIBILITY.md +32 -0
  10. package/AGENTS.md +226 -0
  11. package/COMPONENTS.md +36 -0
  12. package/FRAMEWORKS.md +57 -0
  13. package/INTEGRATION.md +89 -0
  14. package/LICENSE +21 -0
  15. package/PHILOSOPHY.md +71 -0
  16. package/PUBLISHING.md +85 -0
  17. package/README.md +154 -0
  18. package/SCENE.md +113 -0
  19. package/STATES.md +243 -0
  20. package/apps/demo/index.html +31 -0
  21. package/apps/demo/og.config.mjs +15 -0
  22. package/apps/demo/package.json +41 -0
  23. package/apps/demo/public/favicon.svg +16 -0
  24. package/apps/demo/public/og.png +0 -0
  25. package/apps/demo/public/og.svg +35 -0
  26. package/apps/demo/scripts/generate-og-png.mjs +60 -0
  27. package/apps/demo/src/App.tsx +31 -0
  28. package/apps/demo/src/aeonDiagrams.ts +100 -0
  29. package/apps/demo/src/app.css +16 -0
  30. package/apps/demo/src/components/ActionCluster.tsx +20 -0
  31. package/apps/demo/src/components/AsyncMachineDemo.tsx +97 -0
  32. package/apps/demo/src/components/ButtonLifecycleDemo.tsx +63 -0
  33. package/apps/demo/src/components/CodeExample.tsx +7 -0
  34. package/apps/demo/src/components/ComboboxDemo.tsx +30 -0
  35. package/apps/demo/src/components/DiagramsSection.tsx +38 -0
  36. package/apps/demo/src/components/FieldStateDemo.tsx +51 -0
  37. package/apps/demo/src/components/GridMesh.tsx +8 -0
  38. package/apps/demo/src/components/HeroInstall.tsx +10 -0
  39. package/apps/demo/src/components/LandingFaq.tsx +29 -0
  40. package/apps/demo/src/components/LandingFooter.tsx +22 -0
  41. package/apps/demo/src/components/LandingHeader.tsx +60 -0
  42. package/apps/demo/src/components/LandingHero.tsx +55 -0
  43. package/apps/demo/src/components/LayersSection.tsx +51 -0
  44. package/apps/demo/src/components/MermaidDiagram.tsx +84 -0
  45. package/apps/demo/src/components/PhilosophySection.tsx +33 -0
  46. package/apps/demo/src/components/PlaygroundBlock.tsx +23 -0
  47. package/apps/demo/src/components/PlaygroundSection.tsx +204 -0
  48. package/apps/demo/src/components/SceneSection.tsx +157 -0
  49. package/apps/demo/src/components/ScrollRegionDemo.tsx +74 -0
  50. package/apps/demo/src/components/ThemeSwitcher.tsx +76 -0
  51. package/apps/demo/src/demo-layout.css +264 -0
  52. package/apps/demo/src/landing.css +1094 -0
  53. package/apps/demo/src/main.tsx +14 -0
  54. package/apps/demo/src/nav.ts +9 -0
  55. package/apps/demo/src/site.ts +347 -0
  56. package/apps/demo/tsconfig.json +17 -0
  57. package/apps/demo/vite-plugins/og-meta.ts +30 -0
  58. package/apps/demo/vite.config.ts +69 -0
  59. package/docs/API_PATTERNS.md +234 -0
  60. package/docs/ARCHITECTURE.md +125 -0
  61. package/docs/COMPONENT_CHECKLIST.md +103 -0
  62. package/docs/FILE_MAP.md +122 -0
  63. package/docs/GLOSSARY.md +125 -0
  64. package/docs/INDEX.md +53 -0
  65. package/docs/LAYOUT_COORDINATES.md +178 -0
  66. package/docs/MACHINES.md +166 -0
  67. package/docs/MIGRATION_FROM_ARK.md +295 -0
  68. package/docs/VITE_CONSUMER.md +114 -0
  69. package/package.json +25 -0
  70. package/packages/core/README.md +69 -0
  71. package/packages/core/package.json +37 -0
  72. package/packages/core/src/anatomy.ts +144 -0
  73. package/packages/core/src/attrs.ts +47 -0
  74. package/packages/core/src/index.ts +8 -0
  75. package/packages/core/src/layout.ts +176 -0
  76. package/packages/core/src/machine.test.ts +18 -0
  77. package/packages/core/src/machine.ts +15 -0
  78. package/packages/core/src/philosophy.ts +10 -0
  79. package/packages/core/src/scroll.ts +72 -0
  80. package/packages/core/src/theme.test.ts +14 -0
  81. package/packages/core/src/theme.ts +53 -0
  82. package/packages/core/src/types.ts +25 -0
  83. package/packages/core/theme-transition.css +58 -0
  84. package/packages/core/tsconfig.json +8 -0
  85. package/packages/core/vitest.config.ts +8 -0
  86. package/packages/geometry/README.md +7 -0
  87. package/packages/geometry/package.json +35 -0
  88. package/packages/geometry/src/index.ts +3 -0
  89. package/packages/geometry/src/patterns.ts +55 -0
  90. package/packages/geometry/src/scene-attrs.ts +11 -0
  91. package/packages/geometry/src/svg.ts +60 -0
  92. package/packages/geometry/tsconfig.json +8 -0
  93. package/packages/panda/README.md +66 -0
  94. package/packages/panda/package.json +40 -0
  95. package/packages/panda/panda.config.ts +229 -0
  96. package/packages/panda/scripts/emit-theme-runtime.ts +37 -0
  97. package/packages/panda/src/recipes/accordion.ts +95 -0
  98. package/packages/panda/src/recipes/async.ts +76 -0
  99. package/packages/panda/src/recipes/badge.ts +44 -0
  100. package/packages/panda/src/recipes/button-group.ts +33 -0
  101. package/packages/panda/src/recipes/button.ts +91 -0
  102. package/packages/panda/src/recipes/checkbox.ts +41 -0
  103. package/packages/panda/src/recipes/combobox.ts +121 -0
  104. package/packages/panda/src/recipes/dialog.ts +96 -0
  105. package/packages/panda/src/recipes/field-shared.ts +29 -0
  106. package/packages/panda/src/recipes/field.ts +72 -0
  107. package/packages/panda/src/recipes/floating.ts +170 -0
  108. package/packages/panda/src/recipes/index.ts +14 -0
  109. package/packages/panda/src/recipes/scroll-region.ts +55 -0
  110. package/packages/panda/src/recipes/select.ts +111 -0
  111. package/packages/panda/src/recipes/switch.ts +51 -0
  112. package/packages/panda/src/recipes/tabs.ts +50 -0
  113. package/packages/panda/src/theme/catalog-types.ts +24 -0
  114. package/packages/panda/src/theme/catalog.ts +73 -0
  115. package/packages/panda/src/theme/chrome.css +75 -0
  116. package/packages/panda/src/theme/global-theme-css.ts +42 -0
  117. package/packages/panda/src/theme/index.ts +5 -0
  118. package/packages/panda/src/theme/palette.ts +65 -0
  119. package/packages/panda/src/theme/scrollbars.css +96 -0
  120. package/packages/panda/src/theme/semantic-tokens.ts +17 -0
  121. package/packages/panda/src/theme/themes.config.ts +516 -0
  122. package/packages/panda/src/theme/tokens.ts +51 -0
  123. package/packages/panda/styled-system/css/conditions.mjs +36 -0
  124. package/packages/panda/styled-system/css/css.d.ts +22 -0
  125. package/packages/panda/styled-system/css/css.mjs +45 -0
  126. package/packages/panda/styled-system/css/cva.d.ts +6 -0
  127. package/packages/panda/styled-system/css/cva.mjs +87 -0
  128. package/packages/panda/styled-system/css/cx.d.ts +5 -0
  129. package/packages/panda/styled-system/css/cx.mjs +15 -0
  130. package/packages/panda/styled-system/css/index.d.ts +5 -0
  131. package/packages/panda/styled-system/css/index.mjs +4 -0
  132. package/packages/panda/styled-system/css/sva.d.ts +4 -0
  133. package/packages/panda/styled-system/css/sva.mjs +41 -0
  134. package/packages/panda/styled-system/helpers.mjs +339 -0
  135. package/packages/panda/styled-system/jsx/aspect-ratio.d.ts +10 -0
  136. package/packages/panda/styled-system/jsx/aspect-ratio.mjs +14 -0
  137. package/packages/panda/styled-system/jsx/bleed.d.ts +10 -0
  138. package/packages/panda/styled-system/jsx/bleed.mjs +14 -0
  139. package/packages/panda/styled-system/jsx/box.d.ts +10 -0
  140. package/packages/panda/styled-system/jsx/box.mjs +14 -0
  141. package/packages/panda/styled-system/jsx/center.d.ts +10 -0
  142. package/packages/panda/styled-system/jsx/center.mjs +14 -0
  143. package/packages/panda/styled-system/jsx/circle.d.ts +10 -0
  144. package/packages/panda/styled-system/jsx/circle.mjs +14 -0
  145. package/packages/panda/styled-system/jsx/container.d.ts +10 -0
  146. package/packages/panda/styled-system/jsx/container.mjs +14 -0
  147. package/packages/panda/styled-system/jsx/cq.d.ts +10 -0
  148. package/packages/panda/styled-system/jsx/cq.mjs +14 -0
  149. package/packages/panda/styled-system/jsx/divider.d.ts +10 -0
  150. package/packages/panda/styled-system/jsx/divider.mjs +14 -0
  151. package/packages/panda/styled-system/jsx/factory-helper.mjs +22 -0
  152. package/packages/panda/styled-system/jsx/factory.d.ts +3 -0
  153. package/packages/panda/styled-system/jsx/factory.mjs +80 -0
  154. package/packages/panda/styled-system/jsx/flex.d.ts +10 -0
  155. package/packages/panda/styled-system/jsx/flex.mjs +14 -0
  156. package/packages/panda/styled-system/jsx/float.d.ts +10 -0
  157. package/packages/panda/styled-system/jsx/float.mjs +14 -0
  158. package/packages/panda/styled-system/jsx/grid-item.d.ts +10 -0
  159. package/packages/panda/styled-system/jsx/grid-item.mjs +14 -0
  160. package/packages/panda/styled-system/jsx/grid.d.ts +10 -0
  161. package/packages/panda/styled-system/jsx/grid.mjs +14 -0
  162. package/packages/panda/styled-system/jsx/hstack.d.ts +10 -0
  163. package/packages/panda/styled-system/jsx/hstack.mjs +14 -0
  164. package/packages/panda/styled-system/jsx/index.d.ts +24 -0
  165. package/packages/panda/styled-system/jsx/index.mjs +22 -0
  166. package/packages/panda/styled-system/jsx/is-valid-prop.d.ts +11 -0
  167. package/packages/panda/styled-system/jsx/is-valid-prop.mjs +17 -0
  168. package/packages/panda/styled-system/jsx/link-overlay.d.ts +10 -0
  169. package/packages/panda/styled-system/jsx/link-overlay.mjs +14 -0
  170. package/packages/panda/styled-system/jsx/spacer.d.ts +10 -0
  171. package/packages/panda/styled-system/jsx/spacer.mjs +14 -0
  172. package/packages/panda/styled-system/jsx/square.d.ts +10 -0
  173. package/packages/panda/styled-system/jsx/square.mjs +14 -0
  174. package/packages/panda/styled-system/jsx/stack.d.ts +10 -0
  175. package/packages/panda/styled-system/jsx/stack.mjs +14 -0
  176. package/packages/panda/styled-system/jsx/visually-hidden.d.ts +10 -0
  177. package/packages/panda/styled-system/jsx/visually-hidden.mjs +14 -0
  178. package/packages/panda/styled-system/jsx/vstack.d.ts +10 -0
  179. package/packages/panda/styled-system/jsx/vstack.mjs +14 -0
  180. package/packages/panda/styled-system/jsx/wrap.d.ts +10 -0
  181. package/packages/panda/styled-system/jsx/wrap.mjs +14 -0
  182. package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +21 -0
  183. package/packages/panda/styled-system/patterns/aspect-ratio.mjs +38 -0
  184. package/packages/panda/styled-system/patterns/bleed.d.ts +22 -0
  185. package/packages/panda/styled-system/patterns/bleed.mjs +24 -0
  186. package/packages/panda/styled-system/patterns/box.d.ts +21 -0
  187. package/packages/panda/styled-system/patterns/box.mjs +15 -0
  188. package/packages/panda/styled-system/patterns/center.d.ts +21 -0
  189. package/packages/panda/styled-system/patterns/center.mjs +21 -0
  190. package/packages/panda/styled-system/patterns/circle.d.ts +21 -0
  191. package/packages/panda/styled-system/patterns/circle.mjs +25 -0
  192. package/packages/panda/styled-system/patterns/container.d.ts +21 -0
  193. package/packages/panda/styled-system/patterns/container.mjs +21 -0
  194. package/packages/panda/styled-system/patterns/cq.d.ts +22 -0
  195. package/packages/panda/styled-system/patterns/cq.mjs +21 -0
  196. package/packages/panda/styled-system/patterns/divider.d.ts +23 -0
  197. package/packages/panda/styled-system/patterns/divider.mjs +25 -0
  198. package/packages/panda/styled-system/patterns/flex.d.ts +27 -0
  199. package/packages/panda/styled-system/patterns/flex.mjs +26 -0
  200. package/packages/panda/styled-system/patterns/float.d.ts +24 -0
  201. package/packages/panda/styled-system/patterns/float.mjs +52 -0
  202. package/packages/panda/styled-system/patterns/grid-item.d.ts +26 -0
  203. package/packages/panda/styled-system/patterns/grid-item.mjs +25 -0
  204. package/packages/panda/styled-system/patterns/grid.d.ts +25 -0
  205. package/packages/panda/styled-system/patterns/grid.mjs +27 -0
  206. package/packages/panda/styled-system/patterns/hstack.d.ts +22 -0
  207. package/packages/panda/styled-system/patterns/hstack.mjs +24 -0
  208. package/packages/panda/styled-system/patterns/index.d.ts +21 -0
  209. package/packages/panda/styled-system/patterns/index.mjs +20 -0
  210. package/packages/panda/styled-system/patterns/link-overlay.d.ts +21 -0
  211. package/packages/panda/styled-system/patterns/link-overlay.mjs +24 -0
  212. package/packages/panda/styled-system/patterns/spacer.d.ts +21 -0
  213. package/packages/panda/styled-system/patterns/spacer.mjs +21 -0
  214. package/packages/panda/styled-system/patterns/square.d.ts +21 -0
  215. package/packages/panda/styled-system/patterns/square.mjs +24 -0
  216. package/packages/panda/styled-system/patterns/stack.d.ts +24 -0
  217. package/packages/panda/styled-system/patterns/stack.mjs +24 -0
  218. package/packages/panda/styled-system/patterns/visually-hidden.d.ts +21 -0
  219. package/packages/panda/styled-system/patterns/visually-hidden.mjs +18 -0
  220. package/packages/panda/styled-system/patterns/vstack.d.ts +22 -0
  221. package/packages/panda/styled-system/patterns/vstack.mjs +24 -0
  222. package/packages/panda/styled-system/patterns/wrap.d.ts +25 -0
  223. package/packages/panda/styled-system/patterns/wrap.mjs +25 -0
  224. package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +32 -0
  225. package/packages/panda/styled-system/recipes/aeon-accordion.mjs +48 -0
  226. package/packages/panda/styled-system/recipes/aeon-async.d.ts +32 -0
  227. package/packages/panda/styled-system/recipes/aeon-async.mjs +56 -0
  228. package/packages/panda/styled-system/recipes/aeon-badge.d.ts +31 -0
  229. package/packages/panda/styled-system/recipes/aeon-badge.mjs +32 -0
  230. package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +39 -0
  231. package/packages/panda/styled-system/recipes/aeon-button-group.mjs +37 -0
  232. package/packages/panda/styled-system/recipes/aeon-button.d.ts +39 -0
  233. package/packages/panda/styled-system/recipes/aeon-button.mjs +39 -0
  234. package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +28 -0
  235. package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +48 -0
  236. package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +32 -0
  237. package/packages/panda/styled-system/recipes/aeon-combobox.mjs +52 -0
  238. package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +28 -0
  239. package/packages/panda/styled-system/recipes/aeon-dialog.mjs +60 -0
  240. package/packages/panda/styled-system/recipes/aeon-field.d.ts +32 -0
  241. package/packages/panda/styled-system/recipes/aeon-field.mjs +52 -0
  242. package/packages/panda/styled-system/recipes/aeon-menu.d.ts +28 -0
  243. package/packages/panda/styled-system/recipes/aeon-menu.mjs +52 -0
  244. package/packages/panda/styled-system/recipes/aeon-popover.d.ts +28 -0
  245. package/packages/panda/styled-system/recipes/aeon-popover.mjs +52 -0
  246. package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +43 -0
  247. package/packages/panda/styled-system/recipes/aeon-scroll.mjs +63 -0
  248. package/packages/panda/styled-system/recipes/aeon-select.d.ts +32 -0
  249. package/packages/panda/styled-system/recipes/aeon-select.mjs +56 -0
  250. package/packages/panda/styled-system/recipes/aeon-switch.d.ts +28 -0
  251. package/packages/panda/styled-system/recipes/aeon-switch.mjs +48 -0
  252. package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +28 -0
  253. package/packages/panda/styled-system/recipes/aeon-tabs.mjs +48 -0
  254. package/packages/panda/styled-system/recipes/aeon-toast.d.ts +28 -0
  255. package/packages/panda/styled-system/recipes/aeon-toast.mjs +48 -0
  256. package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +28 -0
  257. package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +48 -0
  258. package/packages/panda/styled-system/recipes/create-recipe.mjs +82 -0
  259. package/packages/panda/styled-system/recipes/index.d.ts +18 -0
  260. package/packages/panda/styled-system/recipes/index.mjs +17 -0
  261. package/packages/panda/styled-system/styles.css +2157 -0
  262. package/packages/panda/styled-system/tokens/index.d.ts +9 -0
  263. package/packages/panda/styled-system/tokens/index.mjs +2156 -0
  264. package/packages/panda/styled-system/tokens/tokens.d.ts +60 -0
  265. package/packages/panda/styled-system/types/composition.d.ts +164 -0
  266. package/packages/panda/styled-system/types/conditions.d.ts +322 -0
  267. package/packages/panda/styled-system/types/csstype.d.ts +21298 -0
  268. package/packages/panda/styled-system/types/global.d.ts +20 -0
  269. package/packages/panda/styled-system/types/index.d.ts +8 -0
  270. package/packages/panda/styled-system/types/jsx.d.ts +52 -0
  271. package/packages/panda/styled-system/types/parts.d.ts +8 -0
  272. package/packages/panda/styled-system/types/pattern.d.ts +78 -0
  273. package/packages/panda/styled-system/types/prop-type.d.ts +240 -0
  274. package/packages/panda/styled-system/types/recipe.d.ts +181 -0
  275. package/packages/panda/styled-system/types/selectors.d.ts +59 -0
  276. package/packages/panda/styled-system/types/static-css.d.ts +56 -0
  277. package/packages/panda/styled-system/types/style-props.d.ts +7491 -0
  278. package/packages/panda/styled-system/types/system-types.d.ts +193 -0
  279. package/packages/panda/theme-runtime.css +842 -0
  280. package/packages/panda/tsconfig.json +8 -0
  281. package/packages/primitives/README.md +54 -0
  282. package/packages/primitives/package.json +41 -0
  283. package/packages/primitives/src/__tests__/floating-surface.test.ts +29 -0
  284. package/packages/primitives/src/index.ts +9 -0
  285. package/packages/primitives/src/machines/accordion.ts +56 -0
  286. package/packages/primitives/src/machines/async.ts +108 -0
  287. package/packages/primitives/src/machines/button.ts +66 -0
  288. package/packages/primitives/src/machines/dialog.ts +61 -0
  289. package/packages/primitives/src/machines/field.ts +85 -0
  290. package/packages/primitives/src/machines/popover.ts +52 -0
  291. package/packages/primitives/src/machines/tabs.ts +46 -0
  292. package/packages/primitives/src/machines/toast.ts +48 -0
  293. package/packages/primitives/src/machines/toggle.ts +61 -0
  294. package/packages/primitives/tsconfig.json +8 -0
  295. package/packages/primitives/vitest.config.ts +8 -0
  296. package/packages/react/README.md +65 -0
  297. package/packages/react/package.json +52 -0
  298. package/packages/react/src/accordion/index.tsx +179 -0
  299. package/packages/react/src/async/actions.tsx +22 -0
  300. package/packages/react/src/async/context.tsx +54 -0
  301. package/packages/react/src/async/index.tsx +21 -0
  302. package/packages/react/src/async/legacy-region.tsx +38 -0
  303. package/packages/react/src/async/readout.tsx +34 -0
  304. package/packages/react/src/async/root.tsx +39 -0
  305. package/packages/react/src/async/track.tsx +59 -0
  306. package/packages/react/src/avatar/avatar.test.tsx +27 -0
  307. package/packages/react/src/avatar/index.tsx +122 -0
  308. package/packages/react/src/button/index.tsx +70 -0
  309. package/packages/react/src/checkbox/index.tsx +180 -0
  310. package/packages/react/src/combobox/index.tsx +430 -0
  311. package/packages/react/src/dialog/dialog.test.tsx +50 -0
  312. package/packages/react/src/dialog/index.tsx +275 -0
  313. package/packages/react/src/field/index.tsx +172 -0
  314. package/packages/react/src/hooks/use-aeon-machine.ts +10 -0
  315. package/packages/react/src/hooks/use-anchor-position.ts +33 -0
  316. package/packages/react/src/hooks/use-focus-trap.ts +51 -0
  317. package/packages/react/src/hooks/use-layout-mode.ts +22 -0
  318. package/packages/react/src/hooks/use-outside-click.ts +19 -0
  319. package/packages/react/src/hooks/use-portalled.ts +16 -0
  320. package/packages/react/src/hooks/use-scroll-lock.ts +13 -0
  321. package/packages/react/src/index.ts +18 -0
  322. package/packages/react/src/menu/index.tsx +195 -0
  323. package/packages/react/src/popover/index.tsx +191 -0
  324. package/packages/react/src/scroll/index.tsx +98 -0
  325. package/packages/react/src/scroll/use-scroll-state.ts +30 -0
  326. package/packages/react/src/select/index.tsx +372 -0
  327. package/packages/react/src/select/select.test.tsx +60 -0
  328. package/packages/react/src/switch/index.tsx +215 -0
  329. package/packages/react/src/tabs/index.tsx +140 -0
  330. package/packages/react/src/toast/context.tsx +28 -0
  331. package/packages/react/src/toast/index.tsx +20 -0
  332. package/packages/react/src/toast/primitives.tsx +129 -0
  333. package/packages/react/src/toast/provider.tsx +111 -0
  334. package/packages/react/src/toast/toast-item.tsx +32 -0
  335. package/packages/react/src/tooltip/index.tsx +191 -0
  336. package/packages/react/src/utils/merge-props.ts +24 -0
  337. package/packages/react/tsconfig.json +8 -0
  338. package/packages/react/vitest.config.ts +9 -0
  339. package/packages/react/vitest.setup.ts +5 -0
  340. package/packages/react-scene/README.md +11 -0
  341. package/packages/react-scene/package.json +47 -0
  342. package/packages/react-scene/scene-3d.css +37 -0
  343. package/packages/react-scene/scene-room.css +95 -0
  344. package/packages/react-scene/src/index.ts +20 -0
  345. package/packages/react-scene/src/procedural-grid.tsx +35 -0
  346. package/packages/react-scene/src/scene-layer.tsx +38 -0
  347. package/packages/react-scene/src/scene-plane.tsx +69 -0
  348. package/packages/react-scene/src/scene-room.tsx +81 -0
  349. package/packages/react-scene/src/scene-root.tsx +49 -0
  350. package/packages/react-scene/src/scene-slot.tsx +41 -0
  351. package/packages/react-scene/src/scene-stage.tsx +37 -0
  352. package/packages/react-scene/src/scene-surface.tsx +20 -0
  353. package/packages/react-scene/src/signal-bars.tsx +57 -0
  354. package/packages/react-scene/src/use-signal-visualizer.ts +103 -0
  355. package/packages/react-scene/tsconfig.json +8 -0
  356. package/packages/scene/README.md +5 -0
  357. package/packages/scene/package.json +32 -0
  358. package/packages/scene/src/index.ts +2 -0
  359. package/packages/scene/src/room.ts +40 -0
  360. package/packages/scene/src/transform.ts +60 -0
  361. package/packages/scene/tsconfig.json +8 -0
  362. package/packages/signal/README.md +9 -0
  363. package/packages/signal/package.json +32 -0
  364. package/packages/signal/src/analyser.ts +113 -0
  365. package/packages/signal/src/bands.ts +33 -0
  366. package/packages/signal/src/index.ts +3 -0
  367. package/packages/signal/src/motion.ts +80 -0
  368. package/packages/signal/tsconfig.json +8 -0
  369. package/packages/site/README.md +19 -0
  370. package/packages/site/package.json +32 -0
  371. package/packages/site/src/index.ts +8 -0
  372. package/packages/site/src/open-graph.ts +90 -0
  373. package/packages/site/tsconfig.json +8 -0
  374. package/packages/solid/README.md +30 -0
  375. package/packages/solid/package.json +42 -0
  376. package/packages/solid/src/hooks/use-aeon-machine.ts +10 -0
  377. package/packages/solid/src/index.ts +2 -0
  378. package/packages/solid/src/switch/index.tsx +191 -0
  379. package/packages/solid/src/utils/merge-props.ts +3 -0
  380. package/packages/solid/tsconfig.json +10 -0
  381. package/packages/surface/README.md +10 -0
  382. package/packages/surface/package.json +33 -0
  383. package/packages/surface/src/index.ts +1 -0
  384. package/packages/surface/src/materials.ts +14 -0
  385. package/packages/surface/surface.css +113 -0
  386. package/packages/surface/tsconfig.json +8 -0
  387. package/packages/svelte/README.md +45 -0
  388. package/packages/svelte/package.json +49 -0
  389. package/packages/svelte/src/Switch.svelte +86 -0
  390. package/packages/svelte/src/SwitchControl.svelte +45 -0
  391. package/packages/svelte/src/SwitchHiddenInput.svelte +12 -0
  392. package/packages/svelte/src/SwitchLabel.svelte +9 -0
  393. package/packages/svelte/src/SwitchThumb.svelte +16 -0
  394. package/packages/svelte/src/hooks/use-aeon-machine.ts +23 -0
  395. package/packages/svelte/src/index.ts +2 -0
  396. package/packages/svelte/src/switch-context.ts +13 -0
  397. package/packages/svelte/tsconfig.json +8 -0
  398. package/packages/ui/README.md +63 -0
  399. package/packages/ui/package.json +45 -0
  400. package/packages/ui/src/accordion.tsx +27 -0
  401. package/packages/ui/src/async.tsx +43 -0
  402. package/packages/ui/src/badge.tsx +18 -0
  403. package/packages/ui/src/button.tsx +38 -0
  404. package/packages/ui/src/checkbox.tsx +24 -0
  405. package/packages/ui/src/cn.ts +1 -0
  406. package/packages/ui/src/combobox.tsx +29 -0
  407. package/packages/ui/src/dialog.tsx +32 -0
  408. package/packages/ui/src/field.tsx +33 -0
  409. package/packages/ui/src/index.ts +17 -0
  410. package/packages/ui/src/menu.tsx +25 -0
  411. package/packages/ui/src/popover.tsx +22 -0
  412. package/packages/ui/src/scroll.tsx +51 -0
  413. package/packages/ui/src/select.tsx +33 -0
  414. package/packages/ui/src/styles.css +2 -0
  415. package/packages/ui/src/switch.tsx +22 -0
  416. package/packages/ui/src/tabs.tsx +22 -0
  417. package/packages/ui/src/toast.tsx +36 -0
  418. package/packages/ui/src/tooltip.tsx +19 -0
  419. package/packages/ui/tsconfig.json +12 -0
  420. package/packages/vue/README.md +40 -0
  421. package/packages/vue/package.json +42 -0
  422. package/packages/vue/src/hooks/use-aeon-machine.ts +10 -0
  423. package/packages/vue/src/index.ts +2 -0
  424. package/packages/vue/src/switch/index.ts +208 -0
  425. package/packages/vue/src/utils/part-props.ts +8 -0
  426. package/packages/vue/tsconfig.json +8 -0
  427. package/pnpm-workspace.yaml +3 -0
  428. package/scripts/ensure-headless-built.mjs +25 -0
  429. package/tsconfig.base.json +21 -0
  430. package/vercel.json +12 -0
@@ -0,0 +1,23 @@
1
+ # Changesets
2
+
3
+ This monorepo uses [Changesets](https://github.com/changesets/changesets) to version and publish `@aeon-ui/*` packages together.
4
+
5
+ ## Add a changeset
6
+
7
+ After a meaningful change:
8
+
9
+ ```bash
10
+ pnpm changeset
11
+ ```
12
+
13
+ Choose affected packages (usually all five public packages) and bump type (`patch` / `minor` / `major`).
14
+
15
+ ## Release flow (maintainers)
16
+
17
+ ```bash
18
+ pnpm version-packages # apply changesets → bump versions + CHANGELOGs
19
+ pnpm build
20
+ pnpm release # publish to npm (requires npm login + scope access)
21
+ ```
22
+
23
+ See [PUBLISHING.md](../PUBLISHING.md) for manual publish order and first-time setup.
@@ -0,0 +1,9 @@
1
+ ---
2
+ "@aeon-ui/core": minor
3
+ "@aeon-ui/primitives": minor
4
+ "@aeon-ui/react": minor
5
+ "@aeon-ui/panda": minor
6
+ "@aeon-ui/ui": minor
7
+ ---
8
+
9
+ Add **Combobox** (typeahead listbox extending Select) and **Changesets** for fixed-version npm releases before 0.1.0.
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
3
+ "changelog": "@changesets/cli/changelog",
4
+ "commit": false,
5
+ "fixed": [
6
+ [
7
+ "@aeon-ui/core",
8
+ "@aeon-ui/primitives",
9
+ "@aeon-ui/react",
10
+ "@aeon-ui/panda",
11
+ "@aeon-ui/ui",
12
+ "@aeon-ui/vue",
13
+ "@aeon-ui/solid",
14
+ "@aeon-ui/svelte"
15
+ ],
16
+ [
17
+ "@aeon-ui/signal",
18
+ "@aeon-ui/geometry",
19
+ "@aeon-ui/surface",
20
+ "@aeon-ui/scene",
21
+ "@aeon-ui/react-scene",
22
+ "@aeon-ui/site"
23
+ ]
24
+ ],
25
+ "linked": [],
26
+ "access": "public",
27
+ "baseBranch": "main",
28
+ "updateInternalDependencies": "patch",
29
+ "ignore": ["@aeon-ui/demo", "aeon-ui-monorepo"]
30
+ }
@@ -0,0 +1,12 @@
1
+ ---
2
+ "@aeon-ui/core": minor
3
+ "@aeon-ui/primitives": minor
4
+ "@aeon-ui/react": minor
5
+ "@aeon-ui/panda": minor
6
+ "@aeon-ui/ui": minor
7
+ "@aeon-ui/vue": minor
8
+ "@aeon-ui/solid": minor
9
+ "@aeon-ui/svelte": minor
10
+ ---
11
+
12
+ Add Vue, Solid, and Svelte adapter packages (`useAeonMachine` + reference Switch port). Document publish and framework roadmap.
@@ -0,0 +1,6 @@
1
+ ---
2
+ "@aeon-ui/scene": minor
3
+ "@aeon-ui/react-scene": minor
4
+ ---
5
+
6
+ Add CSS 3D scene construction: `@aeon-ui/scene` transforms, `SceneStage` / `SceneLayer` / `ScenePlane` / `SceneSlot`, and demo alley preview.
@@ -0,0 +1,8 @@
1
+ ---
2
+ "@aeon-ui/signal": minor
3
+ "@aeon-ui/geometry": minor
4
+ "@aeon-ui/surface": minor
5
+ "@aeon-ui/react-scene": minor
6
+ ---
7
+
8
+ Add optional Scene plane: signal, geometry, procedural surface materials (pavement, kraft, brick), react-scene bindings, and SCENE.md.
@@ -0,0 +1,5 @@
1
+ ---
2
+ "@aeon-ui/site": minor
3
+ ---
4
+
5
+ Add `@aeon-ui/site` Open Graph meta helpers for marketing apps and demos.
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Aeon UI conventions — read AGENTS.md before editing this repo
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Aeon UI (agent rules)
7
+
8
+ **Read [AGENTS.md](../../AGENTS.md) before any change.** Full map: [docs/INDEX.md](../../docs/INDEX.md).
9
+
10
+ ## Must follow
11
+
12
+ - **UI = f(state)** — project snapshots to `data-aeon-scope`, `data-aeon-part`, `data-aeon-state` via `partAttrs` from `@aeon-ui/core`.
13
+ - **Machine truth:** [docs/MACHINES.md](../../docs/MACHINES.md) — Button uses `status` prop; Select/Menu/Popover share `popoverMachine`; Combobox/Tooltip use React state; Scroll uses `getScrollSnapshot`.
14
+ - **New components:** [docs/COMPONENT_CHECKLIST.md](../../docs/COMPONENT_CHECKLIST.md) (all steps).
15
+ - **Panda changes:** run `pnpm codegen` from repo root.
16
+ - **Imports:** `.js` extension in TypeScript relative imports.
17
+
18
+ ## Do not
19
+
20
+ - Duplicate state in `useState` and XState for the same concern.
21
+ - Fork duplicate open/closed machines (use `popoverMachine` / `dialogMachine`).
22
+ - Hand-edit `packages/panda/styled-system/` (generated).
@@ -0,0 +1,32 @@
1
+ # Accessibility
2
+
3
+ Aeon targets **WCAG-minded** behavior on headless parts. Styled layers must not remove semantics.
4
+
5
+ ## Patterns in place
6
+
7
+ | Component | Roles / ARIA |
8
+ |-----------|----------------|
9
+ | Dialog | `role="dialog"`, `aria-modal`, `aria-labelledby` / `aria-describedby`, Escape |
10
+ | Avatar | `img` + `hidden` when loaded; fallback `hidden` when image shown; pass `alt` on `Avatar.Image` |
11
+ | Menu | `aria-haspopup="menu"`, `role="menu"`, `role="menuitem"`, Escape, outside click |
12
+ | Popover | `aria-expanded`, `role="dialog"` (non-modal) |
13
+ | Tooltip | `aria-describedby`, `role="tooltip"` |
14
+ | Toast | `role="status"`, `aria-live="polite"` |
15
+ | Select | `aria-haspopup="listbox"`, `aria-expanded`, `aria-activedescendant`, arrow keys + Enter |
16
+ | Dialog | focus trap + body scroll lock when open via `Dialog.Portal` |
17
+ | Combobox | `role="combobox"`, `aria-autocomplete="list"`, `aria-activedescendant`, arrow keys + Enter |
18
+ | Switch / Checkbox | native input + label association |
19
+
20
+ ## Focus
21
+
22
+ - `@aeon-ui/panda` `chrome.css`: focus rings on **keyboard** (`:focus-visible`) only.
23
+ - Selected / pressed / open states use surface tint, not conflated with focus.
24
+
25
+ ## Your checklist when adopting
26
+
27
+ 1. Every `Dialog` includes `Title` (and `Description` when copy is long).
28
+ 2. Menu items are `<button type="button">`, not `<div onClick>`.
29
+ 3. Custom colors meet contrast on `data-aeon-state` variants you add.
30
+ 4. Async regions expose status text in `Readout`, not color alone.
31
+
32
+ Report gaps in GitHub issues with expected keyboard / screen reader steps.
package/AGENTS.md ADDED
@@ -0,0 +1,226 @@
1
+ # Aeon UI — agent instructions
2
+
3
+ **Audience:** Cursor, Copilot, Claude, or any coding agent working in this repo.
4
+ **Goal:** Follow Aeon conventions without guessing. When in doubt, read the linked doc — do not invent patterns.
5
+
6
+ ---
7
+
8
+ ## North star (memorize this)
9
+
10
+ **State is defined first. UI represents the totality of that definition.**
11
+
12
+ - Behavior → XState snapshot (or explicit derived state like Scroll).
13
+ - DOM → `data-aeon-scope`, `data-aeon-part`, `data-aeon-state` from `@aeon-ui/core`.
14
+ - Style → Panda slot recipes keyed on those attributes.
15
+ - **UI = f(snapshot)** — not f(ad hoc React flags).
16
+
17
+ Source: [PHILOSOPHY.md](./PHILOSOPHY.md) · Code: `packages/core/src/philosophy.ts`
18
+
19
+ ---
20
+
21
+ ## Read order (first time in repo)
22
+
23
+ | Order | File | Why |
24
+ |-------|------|-----|
25
+ | 1 | This file (`AGENTS.md`) | Rules, maps, workflows |
26
+ | 2 | [docs/MACHINES.md](./docs/MACHINES.md) | **Which components use machines vs props** — avoid wrong wiring |
27
+ | 3 | [STATES.md](./STATES.md) | Attribute contract, async/button/field/scroll |
28
+ | 4 | [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | Packages, layers, build |
29
+ | 5 | [docs/COMPONENT_CHECKLIST.md](./docs/COMPONENT_CHECKLIST.md) | Adding or changing a component |
30
+ | 6 | [COMPONENTS.md](./COMPONENTS.md) | Shipped catalog |
31
+ | 7 | [INTEGRATION.md](./INTEGRATION.md) | Headless / Panda / styled |
32
+ | 8 | [FRAMEWORKS.md](./FRAMEWORKS.md) | Vue / Solid / Svelte porting |
33
+ | — | [docs/LAYOUT_COORDINATES.md](./docs/LAYOUT_COORDINATES.md) | **Responsive play surfaces — norm coords + layout modes** |
34
+ | — | [docs/API_PATTERNS.md](./docs/API_PATTERNS.md) | Copy-paste snippets |
35
+
36
+ Scene plane (optional): [SCENE.md](./SCENE.md). Publishing: [PUBLISHING.md](./PUBLISHING.md). A11y: [ACCESSIBILITY.md](./ACCESSIBILITY.md).
37
+
38
+ Full index: [docs/INDEX.md](./docs/INDEX.md).
39
+
40
+ ---
41
+
42
+ ## Non-negotiable rules
43
+
44
+ 1. **Do not add `useState` for open/checked/lifecycle** on components that already have a machine in `@aeon-ui/primitives` unless you are intentionally replacing the headless layer (rare).
45
+ 2. **Button `status` is a prop projection**, not the machine. `buttonLifecycleMachine` exists for demos and app logic via `useAeonMachine`; headless `Button.Root` sets `data-aeon-state` from the `status` prop. Wire chart → prop yourself when needed.
46
+ 3. **Select** shares `popoverMachine` (do not fork another open/closed chart). **Combobox** and **Tooltip** still use React state — do not add duplicate floating-surface machines without [COMPONENT_CHECKLIST.md](./docs/COMPONENT_CHECKLIST.md).
47
+ 4. **Scroll** uses `getScrollSnapshot()` from core — **no** XState machine.
48
+ 5. **Every new scope** needs anatomy in `packages/core/src/anatomy.ts`, headless in `packages/react/src/<name>/`, recipe in `packages/panda/src/recipes/`, styled in `packages/ui/src/<name>.tsx`, demo in `apps/demo`.
49
+ 6. **After any Panda recipe or token change**, run from repo root: `pnpm codegen` (then build if verifying).
50
+ 7. **ESM**: TypeScript sources use **`.js` extensions** in relative imports (`import { x } from './foo.js'`).
51
+ 8. **Panda package is private** — apps consume CSS via `@aeon-ui/ui` or direct `@aeon-ui/panda/styles.css` imports; do not publish `@aeon-ui/panda` as a separate product without maintainer intent.
52
+ 9. **Totality**: If the machine lists N stable states, the demo must show all N (e.g. `Async.Track` segments).
53
+ 10. **Do not style with ad hoc class names for state** in product code inside this repo — use `data-aeon-state` + recipes or documented `globalCss`.
54
+
55
+ ---
56
+
57
+ ## Decision tree: which package to edit?
58
+
59
+ ```
60
+ Changing behavior / transitions?
61
+ └─> packages/primitives/src/machines/<topic>.ts
62
+ └─> Update apps/demo/src/aeonDiagrams.ts if diagram exists
63
+
64
+ Changing DOM contract / part names?
65
+ └─> packages/core/src/anatomy.ts
66
+ └─> packages/core/src/attrs.ts (partAttrs, stateToAttr)
67
+
68
+ Changing React API / a11y / events?
69
+ └─> packages/react/src/<component>/
70
+
71
+ Changing default look?
72
+ └─> packages/panda/src/recipes/<component>.ts
73
+ └─> pnpm codegen
74
+
75
+ Shipping styled export?
76
+ └─> packages/ui/src/<component>.tsx
77
+
78
+ Showing behavior to humans?
79
+ └─> apps/demo/src/ (playground sections)
80
+ ```
81
+
82
+ ---
83
+
84
+ ## Decision tree: which layer should the user import?
85
+
86
+ ```
87
+ Need full Aeon styling + themes?
88
+ └─> @aeon-ui/ui (+ panda CSS imports — see INTEGRATION.md)
89
+
90
+ Custom design system, same behavior?
91
+ └─> @aeon-ui/react + CSS on [data-aeon-*]
92
+
93
+ Own XState app machines?
94
+ └─> useAeonMachine from @aeon-ui/react + primitives machines or app machines
95
+
96
+ Only tokens/recipes?
97
+ └─> @aeon-ui/panda/styled-system/recipes (workspace/private; codegen required)
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Repo map (high signal paths)
103
+
104
+ | Path | Contents |
105
+ |------|----------|
106
+ | `packages/core/src/anatomy.ts` | All `*Anatomy` scopes and part keys |
107
+ | `packages/core/src/attrs.ts` | `partAttrs`, `scopeAttrs`, `stateToAttr` |
108
+ | `packages/primitives/src/machines/` | XState machines |
109
+ | `packages/react/src/<component>/` | Headless compound components |
110
+ | `packages/react/src/hooks/use-aeon-machine.ts` | `useAeonMachine` wrapper |
111
+ | `packages/panda/panda.config.ts` | Recipe registration, `aeon*` conditions |
112
+ | `packages/panda/src/recipes/` | Slot + plain recipes |
113
+ | `packages/ui/src/*.tsx` | Styled wrappers (`aeon*` + `cn`) |
114
+ | `apps/demo/src/` | Marketing + playgrounds |
115
+ | `apps/demo/src/aeonDiagrams.ts` | Mermaid ↔ machines (keep in sync) |
116
+
117
+ Detailed map: [docs/FILE_MAP.md](./docs/FILE_MAP.md).
118
+
119
+ ---
120
+
121
+ ## Naming conventions (copy exactly)
122
+
123
+ | Artifact | Pattern | Example |
124
+ |----------|---------|---------|
125
+ | npm package | `@aeon-ui/<name>` | `@aeon-ui/react` |
126
+ | Anatomy export | `{scope}Anatomy` | `asyncAnatomy` |
127
+ | Scope string | lowercase family | `'async'`, `'button'` |
128
+ | Machine export | `{name}Machine` or `create{Name}Machine` | `fieldMachine`, `createAsyncMachine` |
129
+ | Panda recipe key | `aeon{Pascal}` | `aeonAsync`, `aeonButton` |
130
+ | Recipe export | `{name}Recipe` | `asyncRegionRecipe` |
131
+ | React folder | `packages/react/src/<component>/` | `async/`, `dialog/` |
132
+ | Styled file | `packages/ui/src/<component>.tsx` | `button.tsx` |
133
+ | Compound parts | `Root`, `Trigger`, `Content`, … | `Dialog.Root` |
134
+ | Data attrs | `data-aeon-scope`, `data-aeon-part`, `data-aeon-state` | always via `partAttrs` |
135
+
136
+ ---
137
+
138
+ ## Common workflows
139
+
140
+ ### Fix a styling bug on a component
141
+
142
+ 1. Inspect DOM for `data-aeon-scope`, `data-aeon-part`, `data-aeon-state`.
143
+ 2. Find slot recipe: `packages/panda/src/recipes/<component>.ts`.
144
+ 3. Check conditions in `packages/panda/panda.config.ts` (`aeonOpen`, `aeonPending`, …).
145
+ 4. `pnpm codegen` → verify in `apps/demo`.
146
+
147
+ ### Add a new primitive component
148
+
149
+ Follow **[docs/COMPONENT_CHECKLIST.md](./docs/COMPONENT_CHECKLIST.md)** — all 10 steps. Do not skip anatomy or demo rail.
150
+
151
+ ### Port to Vue / Solid / Svelte
152
+
153
+ Follow **[FRAMEWORKS.md](./FRAMEWORKS.md)** — copy React `partAttrs` usage; use `useAeonMachine` equivalent per adapter.
154
+
155
+ ### Change async / field / button lifecycle
156
+
157
+ 1. Machine in `packages/primitives/src/machines/`.
158
+ 2. React projection in `packages/react/src/<async|field|button>/`.
159
+ 3. Mermaid in `apps/demo/src/aeonDiagrams.ts`.
160
+ 4. STATES.md section if user-facing contract changes.
161
+
162
+ ---
163
+
164
+ ## Machine vs implementation (cheat sheet)
165
+
166
+ See full table and events in **[docs/MACHINES.md](./docs/MACHINES.md)**.
167
+
168
+ | Component | Runtime driver |
169
+ |-----------|----------------|
170
+ | Dialog, Tabs, Accordion, Switch, Checkbox | `useAeonMachine` + primitives |
171
+ | Async, Field | `useAeonMachine` + primitives |
172
+ | Menu, Popover | `popoverMachine` |
173
+ | Toast (item) | `toastMachine` |
174
+ | Button | **`status` prop** (machine optional in app) |
175
+ | Select, Combobox, Tooltip | **React `useState`** |
176
+ | Scroll | **`getScrollSnapshot()`** |
177
+
178
+ ---
179
+
180
+ ## Build & verify
181
+
182
+ ```bash
183
+ pnpm install # from repo root
184
+ pnpm codegen # after panda changes
185
+ pnpm dev # demo app
186
+ pnpm build # codegen + all packages
187
+ pnpm typecheck # all packages
188
+ ```
189
+
190
+ Node ≥ 20. Package manager: **pnpm** (workspace: `packages/*`, `apps/*`).
191
+
192
+ ---
193
+
194
+ ## What not to do
195
+
196
+ - Do not duplicate state in React and XState for the same concern.
197
+ - Do not add Tailwind inside `@aeon-ui/ui` — Panda recipes only.
198
+ - Do not export unstyled components from `@aeon-ui/ui`.
199
+ - Do not change `data-aeon-*` names without updating panda conditions and STATES.md.
200
+ - Do not assume COMPONENTS.md “Machine” column is accurate for Select/Combobox — see [docs/MACHINES.md](./docs/MACHINES.md).
201
+
202
+ ---
203
+
204
+ ## Package READMEs (API entry points)
205
+
206
+ | Package | Doc |
207
+ |---------|-----|
208
+ | `@aeon-ui/core` | [packages/core/README.md](./packages/core/README.md) |
209
+ | `@aeon-ui/primitives` | [packages/primitives/README.md](./packages/primitives/README.md) |
210
+ | `@aeon-ui/react` | [packages/react/README.md](./packages/react/README.md) |
211
+ | `@aeon-ui/panda` | [packages/panda/README.md](./packages/panda/README.md) |
212
+ | `@aeon-ui/ui` | [packages/ui/README.md](./packages/ui/README.md) |
213
+
214
+ ---
215
+
216
+ ## Glossary
217
+
218
+ [docs/GLOSSARY.md](./docs/GLOSSARY.md)
219
+
220
+ ---
221
+
222
+ ## Human docs (same truth)
223
+
224
+ [README.md](./README.md) · [PHILOSOPHY.md](./PHILOSOPHY.md) · [STATES.md](./STATES.md) · [COMPONENTS.md](./COMPONENTS.md)
225
+
226
+ When agents and human docs disagree, **source code wins** — then fix the doc in the same PR.
package/COMPONENTS.md ADDED
@@ -0,0 +1,36 @@
1
+ # Component catalog
2
+
3
+ Status key: **Headless** (`@aeon-ui/react`) · **Styled** (`@aeon-ui/ui`) · **State driver** (how runtime state is chosen)
4
+
5
+ **Agents:** authoritative wiring table → [docs/MACHINES.md](./docs/MACHINES.md).
6
+
7
+ | Component | Headless | Styled | State driver | Stable states / notes |
8
+ |-----------|----------|--------|--------------|------------------------|
9
+ | Button | ✓ | ✓ | **`status` prop** (machine optional in app) | idle, pending, success, failure, disabled |
10
+ | Switch | ✓ | ✓ | `toggleMachine` | checked / unchecked |
11
+ | Checkbox | ✓ | ✓ | `toggleMachine` | checked / unchecked |
12
+ | Dialog | ✓ | ✓ | `dialogMachine` | open / closed |
13
+ | Tabs | ✓ | ✓ | `tabsMachine` | per-tab selected |
14
+ | Accordion | ✓ | ✓ | `accordionMachine` | per-item open / closed |
15
+ | Select | ✓ | ✓ | `popoverMachine` | open / closed listbox; keyboard highlight in React |
16
+ | Combobox | ✓ | ✓ | **React state** | open / closed + filter |
17
+ | Async | ✓ | ✓ | `createAsyncMachine` | idle, loading, success, failure, empty + stale |
18
+ | Field | ✓ | ✓ | `fieldMachine` (parallel) | interaction × validation × submission; `Control` + `Textarea` |
19
+ | Scroll | ✓ | ✓ | **`getScrollSnapshot`** | overflow axis + edge position |
20
+ | Menu | ✓ | ✓ | `popoverMachine` | open / closed |
21
+ | Popover | ✓ | ✓ | `popoverMachine` | open / closed |
22
+ | Tooltip | ✓ | ✓ | **React state** | open / closed |
23
+ | Toast | ✓ | ✓ | `toastMachine` | hidden / visible |
24
+ | Avatar | ✓ | — | **React state** | idle / loading / loaded / error |
25
+
26
+ ## Planned (not shipped)
27
+
28
+ Slider, Number Input, Date Picker, Tree View, Pin Input, File Upload, Carousel — tracked as the catalog grows; prefer explicit machines per component.
29
+
30
+ ## Choosing a layer
31
+
32
+ - **App logic & tests** → define or extend machines in `@aeon-ui/primitives`, or app-level XState.
33
+ - **Custom design system** → `@aeon-ui/react` + your CSS targeting `data-aeon-*`.
34
+ - **Ship fast with Aeon look** → `@aeon-ui/ui` + `@aeon-ui/panda` themes.
35
+
36
+ See [INTEGRATION.md](./INTEGRATION.md) for styling without Panda.
package/FRAMEWORKS.md ADDED
@@ -0,0 +1,57 @@
1
+ # Framework support
2
+
3
+ **Agents:** [AGENTS.md](./AGENTS.md) · porting steps mirror React — [docs/COMPONENT_CHECKLIST.md](./docs/COMPONENT_CHECKLIST.md)
4
+
5
+ ## Today
6
+
7
+ | Runtime | Package | Status |
8
+ |---------|---------|--------|
9
+ | React 18+ | `@aeon-ui/react`, `@aeon-ui/ui` | **Full catalog** (Button, Dialog, Select, Combobox, overlays, …) |
10
+ | Vue 3 | `@aeon-ui/vue` | **Adapter v0.1** — `useAeonMachine`, `Switch` |
11
+ | Solid 1.8+ | `@aeon-ui/solid` | **Adapter v0.1** — `useAeonMachine`, `Switch` |
12
+ | Svelte 4/5 | `@aeon-ui/svelte` | **Adapter v0.1** — `useAeonMachine`, `Switch` (`.svelte` parts) |
13
+
14
+ Styled Panda recipes (`@aeon-ui/ui`) remain **React-only** until a second framework needs them.
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ # Vue
20
+ pnpm add @aeon-ui/vue @aeon-ui/core @aeon-ui/primitives xstate vue
21
+
22
+ # Solid
23
+ pnpm add @aeon-ui/solid @aeon-ui/core @aeon-ui/primitives xstate solid-js
24
+
25
+ # Svelte
26
+ pnpm add @aeon-ui/svelte @aeon-ui/core @aeon-ui/primitives xstate svelte
27
+ ```
28
+
29
+ ## Headless contract (all adapters)
30
+
31
+ Any port must preserve:
32
+
33
+ 1. **Machines** from `@aeon-ui/primitives` (XState) — single source of behavior.
34
+ 2. **Anatomy** from `@aeon-ui/core` — `data-aeon-scope`, `data-aeon-part`, `data-aeon-state`.
35
+ 3. **Compound parts** — same names as React (`Root`, `Trigger`, `Content`, …).
36
+ 4. **Controlled APIs** — `open`, `onOpenChange`, `checked`, `onCheckedChange` where applicable.
37
+
38
+ Framework packages bind machine snapshots to their reactivity model (via `@xstate/vue`, `@xstate/solid`, or actor `subscribe` in Svelte). They do **not** reimplement transition tables.
39
+
40
+ ## Porting checklist (new component)
41
+
42
+ 1. Copy behavior from `packages/react/src/<component>/`.
43
+ 2. Reuse `partAttrs` / anatomy from `@aeon-ui/core`.
44
+ 3. Wire `useAeonMachine` (or framework binding) to the primitive machine.
45
+ 4. Add a minimal demo or test in that framework when the API stabilizes.
46
+
47
+ ## Why React stayed first
48
+
49
+ - Largest catalog and Panda styled layer.
50
+ - Demo and docs target JSX.
51
+ - Adapters prove the contract before duplicating every component three times.
52
+
53
+ ## Comparison to Ark / Zag
54
+
55
+ [Ark UI](https://ark-ui.com) ships many frameworks via [Zag.js](https://zag-js.com) with broad component coverage. Aeon optimizes for **explicit XState charts** and **full lifecycle states** on fewer, deeper primitives. Adapters close the framework gap incrementally; they do not yet match Ark’s breadth.
56
+
57
+ Contributors: open a PR adding the next React component port to `@aeon-ui/vue` / `solid` / `svelte` using **Switch** as the template.
package/INTEGRATION.md ADDED
@@ -0,0 +1,89 @@
1
+ # Integration guide
2
+
3
+ **Agents:** [AGENTS.md](./AGENTS.md) · [docs/API_PATTERNS.md](./docs/API_PATTERNS.md)
4
+
5
+ Aeon UI is **three layers**. You can use one or all.
6
+
7
+ ## 1. Headless only (`@aeon-ui/react`)
8
+
9
+ No Panda required. Machines drive behavior; you style with any system.
10
+
11
+ ```tsx
12
+ import { Menu } from '@aeon-ui/react'
13
+
14
+ <Menu.Root>
15
+ <Menu.Trigger>Actions</Menu.Trigger>
16
+ <Menu.Positioner>
17
+ <Menu.Content>
18
+ <Menu.Item onClick={save}>Save</Menu.Item>
19
+ </Menu.Content>
20
+ </Menu.Positioner>
21
+ </Menu.Root>
22
+ ```
23
+
24
+ Target stable hooks:
25
+
26
+ ```css
27
+ [data-aeon-scope="menu"][data-aeon-part="content"][data-aeon-state="open"] {
28
+ /* your panel */
29
+ }
30
+ [data-aeon-scope="menu"][data-aeon-part="item"]:hover {
31
+ background: var(--panel-hover);
32
+ }
33
+ ```
34
+
35
+ Use `partAttrs` / anatomy from `@aeon-ui/core` if you build wrappers.
36
+
37
+ ## 2. Panda recipes (`@aeon-ui/panda`)
38
+
39
+ Slot recipes align with anatomy parts. Run `pnpm codegen` after recipe changes.
40
+
41
+ ```tsx
42
+ import { aeonMenu } from '@aeon-ui/panda/styled-system/recipes'
43
+ const styles = aeonMenu()
44
+ ```
45
+
46
+ Import CSS once:
47
+
48
+ ```tsx
49
+ import '@aeon-ui/panda/styles.css'
50
+ import '@aeon-ui/panda/theme-runtime.css'
51
+ ```
52
+
53
+ ## 3. Styled components (`@aeon-ui/ui`)
54
+
55
+ Batteries included — recipes applied for you.
56
+
57
+ ```tsx
58
+ import { Menu, Button } from '@aeon-ui/ui'
59
+ ```
60
+
61
+ ## Tailwind example
62
+
63
+ ```html
64
+ <button
65
+ data-aeon-scope="button"
66
+ data-aeon-part="root"
67
+ data-aeon-state="pending"
68
+ class="opacity-80 cursor-wait"
69
+ >
70
+ Saving…
71
+ </button>
72
+ ```
73
+
74
+ ## XState in your app
75
+
76
+ Primitives use XState; your features can too. `useAeonMachine` is exported from `@aeon-ui/react` for shared machines.
77
+
78
+ ```tsx
79
+ import { useAeonMachine } from '@aeon-ui/react'
80
+ import { sicBoMachine } from './machines/sic-bo'
81
+ ```
82
+
83
+ ## Vite + custom CSS (no Panda)
84
+
85
+ For apps that keep their own theme (Tailwind, plain CSS, etc.): [docs/VITE_CONSUMER.md](./docs/VITE_CONSUMER.md) — local clone aliases, `build:headless`, `ensure-headless-built.mjs`, and Ark → Aeon mapping.
86
+
87
+ ## Frameworks
88
+
89
+ React is supported today. **Vue, Solid, and Svelte** ship v0.1 adapter packages (`@aeon-ui/vue`, `@aeon-ui/solid`, `@aeon-ui/svelte`) with `useAeonMachine` and a reference **Switch** port. See [FRAMEWORKS.md](./FRAMEWORKS.md) for the headless contract and install commands.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SpiderCorp / Aeon UI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/PHILOSOPHY.md ADDED
@@ -0,0 +1,71 @@
1
+ # Aeon UI — Founding Philosophy
2
+
3
+ Aeon UI is infrastructure for the web, built for interfaces that remain clear as products grow.
4
+
5
+ ## North star
6
+
7
+ **State is defined first. UI represents the totality of that definition.**
8
+
9
+ A region’s behavior is modeled as an explicit set of conditions — named, mutually exclusive at a given depth, with known transitions. The interface’s job is to **fully express** that model: every stable state the chart allows should be visible in the UI (via structure, copy, and `data-aeon-state`), and the UI should never imply a condition the chart does not define (no mystery spinners, no ambiguous half-states, no styling that drifts from the snapshot).
10
+
11
+ In short: **UI = f(state)** — not f(props), not f(local React flags), but f(the executable statechart).
12
+
13
+ ## Primary source
14
+
15
+ **Thanh Nguyen**, *Statecharts for modern web application state management* (Metropolia, 2020).
16
+ [Theseus thesis PDF](https://www.theseus.fi/bitstream/handle/10024/334118/Thanh_Nguyen.pdf?sequence=2&isAllowed=y)
17
+
18
+ ## Core tenets
19
+
20
+ ### 1. Define state, then project UI
21
+
22
+ Separate **behavior** (state evolution in a machine) from **presentation** (markup, style, anatomy). Components read a snapshot and render the corresponding face of the model. When the snapshot changes, the whole affordance updates — trigger, labels, indicators, and `data-aeon-state` together.
23
+
24
+ ### 2. Totality, not fragments
25
+
26
+ If the machine has `idle`, `loading`, `success`, and `failure`, the product surface should account for all four — in layout, messaging, and styling — even when only one is active. Users and developers see the same complete map; nothing is left implicit.
27
+
28
+ ### 3. Explicit, coherent states
29
+
30
+ Application regions benefit from **mutually exclusive states** at a given depth — one stable condition the team can name, test, and extend. That clarity keeps complex flows maintainable as features accumulate.
31
+
32
+ ### 4. Statecharts for lasting complexity
33
+
34
+ When requirements grow, flat state diagrams become hard to follow. Statecharts add:
35
+
36
+ - **Hierarchy** — cluster related states; share transitions at the right level of abstraction
37
+ - **Orthogonality** — independent regions (e.g. playback and shuffle) without combinatorial sprawl
38
+ - **Guards** — conditional transitions that document business rules in the model
39
+ - **Transient states** — routing steps that keep flows readable
40
+ - **Actions and activities** — entry, exit, and transition effects with defined ordering
41
+
42
+ ### 5. Deterministic, diagrammable behavior
43
+
44
+ Every interactive primitive can own an **executable statechart** (via [XState](https://xstate.js.org)). Models can be visualized, reviewed, and extended alongside designers and stakeholders — a shared map for how the product behaves.
45
+
46
+ ### 6. Design systems in control
47
+
48
+ Aeon provides **unstyled headless primitives** with explicit anatomy (`data-aeon-scope`, `data-aeon-part`, `data-aeon-state`) so your team owns every surface. The styled layer (`@aeon-ui/ui`) ships intentional defaults you can adopt or replace — **your brand, fully yours**.
49
+
50
+ ## Production-ready patterns
51
+
52
+ | Concern | Approach |
53
+ |---------|----------|
54
+ | Structure & API | Compound components, part-based anatomy (`data-aeon-scope`, `data-aeon-part`, `data-aeon-state`), accessibility |
55
+ | Styling | Panda CSS slot recipes on headless primitives — tokens and variants keyed to machine state |
56
+ | Execution | XState statecharts (thesis case study) — explicit states and transitions in the browser |
57
+
58
+ ## Library shape
59
+
60
+ ```
61
+ @aeon-ui/core — philosophy, anatomy, machine helpers
62
+ @aeon-ui/primitives — headless, statechart-backed parts
63
+ @aeon-ui/react — React bindings (snapshot → DOM)
64
+ @aeon-ui/ui — styled components with intentional tokens
65
+ ```
66
+
67
+ **Guideline:** Model the statechart first — list every stable state and transition. Then build UI that expresses the **whole** definition at once (track, readout, parts), with exactly one active condition per region.
68
+
69
+ See **[STATES.md](./STATES.md)** for states traditional UI often omits (async empty/stale, button pending/success/failure, orthogonal field regions) and the corresponding Aeon primitives.
70
+
71
+ **Coding agents:** [AGENTS.md](./AGENTS.md) · [docs/INDEX.md](./docs/INDEX.md)