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,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" role="img" aria-label="Aeon UI">
2
+ <rect width="32" height="32" rx="8" fill="#0a0c10"/>
3
+ <rect
4
+ x="6.5"
5
+ y="6.5"
6
+ width="15"
7
+ height="15"
8
+ rx="3.5"
9
+ fill="none"
10
+ stroke="#5eead4"
11
+ stroke-width="1.75"
12
+ opacity="0.9"
13
+ />
14
+ <rect x="10.5" y="10.5" width="15" height="15" rx="3.5" fill="#e8ecf4"/>
15
+ <circle cx="21" cy="21" r="2.5" fill="#5eead4"/>
16
+ </svg>
Binary file
@@ -0,0 +1,35 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="630" viewBox="0 0 1200 630" role="img" aria-label="Aeon UI - Future-proof UI infrastructure">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#121820"/>
5
+ <stop offset="55%" stop-color="#0c0e12"/>
6
+ <stop offset="100%" stop-color="#080a0e"/>
7
+ </linearGradient>
8
+ <linearGradient id="accent" x1="0%" y1="0%" x2="100%" y2="0%">
9
+ <stop offset="0%" stop-color="#2dd4bf" stop-opacity="0"/>
10
+ <stop offset="45%" stop-color="#5eead4"/>
11
+ <stop offset="100%" stop-color="#2dd4bf" stop-opacity="0"/>
12
+ </linearGradient>
13
+ <pattern id="grid" width="48" height="48" patternUnits="userSpaceOnUse">
14
+ <path d="M 48 0 L 0 0 0 48" fill="none" stroke="#5eead4" stroke-width="0.5" opacity="0.08"/>
15
+ </pattern>
16
+ <radialGradient id="glow" cx="72%" cy="28%" r="45%">
17
+ <stop offset="0%" stop-color="#5eead4" stop-opacity="0.14"/>
18
+ <stop offset="100%" stop-color="#5eead4" stop-opacity="0"/>
19
+ </radialGradient>
20
+ </defs>
21
+ <rect width="1200" height="630" fill="url(#bg)"/>
22
+ <rect width="1200" height="630" fill="url(#grid)"/>
23
+ <rect width="1200" height="630" fill="url(#glow)"/>
24
+
25
+ <text x="80" y="268" fill="#f0f4e8" font-family="Syne" font-size="88" font-weight="700" letter-spacing="-0.04em">Aeon UI</text>
26
+ <text x="80" y="340" fill="#94a3b8" font-family="Instrument Sans" font-size="36" font-weight="500">Future-proof UI infrastructure</text>
27
+ <text x="80" y="400" fill="#64748b" font-family="IBM Plex Mono" font-size="22" font-weight="400">Statecharts / Headless primitives / Panda CSS</text>
28
+
29
+ <rect x="80" y="430" width="220" height="36" rx="6" fill="rgba(94, 234, 212, 0.12)" stroke="rgba(94, 234, 212, 0.35)" stroke-width="1"/>
30
+ <text x="104" y="454" fill="#5eead4" font-family="IBM Plex Mono" font-size="15" font-weight="500">@aeon-ui/ui</text>
31
+
32
+ <text x="80" y="548" fill="#94a3b8" font-family="Instrument Sans" font-size="17" font-weight="500">A project by</text>
33
+ <text x="228" y="548" fill="#5eead4" font-family="Syne" font-size="22" font-weight="700">SpiderCorp</text>
34
+ <text x="80" y="578" fill="#64748b" font-family="IBM Plex Mono" font-size="14" font-weight="400">spidercorp.xyz</text>
35
+ </svg>
@@ -0,0 +1,60 @@
1
+ import { createRequire } from 'node:module'
2
+ import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { dirname, join } from 'node:path'
5
+ import { fileURLToPath } from 'node:url'
6
+ import { Resvg } from '@resvg/resvg-js'
7
+ import wawoff2 from 'wawoff2'
8
+
9
+ const require = createRequire(import.meta.url)
10
+ const root = join(dirname(fileURLToPath(import.meta.url)), '..')
11
+ const svgPath = join(root, 'public', 'og.svg')
12
+ const outPath = join(root, 'public', 'og.png')
13
+
14
+ /** @type {Array<[slug: string, pkg: string, file: string]>} */
15
+ const FONT_SOURCES = [
16
+ ['Syne-700', '@fontsource/syne', 'syne-latin-700-normal.woff2'],
17
+ ['InstrumentSans-500', '@fontsource/instrument-sans', 'instrument-sans-latin-500-normal.woff2'],
18
+ ['InstrumentSans-400', '@fontsource/instrument-sans', 'instrument-sans-latin-400-normal.woff2'],
19
+ ['IBMPlexMono-500', '@fontsource/ibm-plex-mono', 'ibm-plex-mono-latin-500-normal.woff2'],
20
+ ['IBMPlexMono-400', '@fontsource/ibm-plex-mono', 'ibm-plex-mono-latin-400-normal.woff2'],
21
+ ]
22
+
23
+ function woff2Path(pkg, filename) {
24
+ return join(dirname(require.resolve(`${pkg}/package.json`)), 'files', filename)
25
+ }
26
+
27
+ /** resvg `fontFiles` only loads SFNT/TTF — convert @fontsource WOFF2 first. */
28
+ async function loadFontFiles() {
29
+ const dir = mkdtempSync(join(tmpdir(), 'aeon-og-fonts-'))
30
+ const fontFiles = []
31
+
32
+ for (const [slug, pkg, file] of FONT_SOURCES) {
33
+ const woff2 = readFileSync(woff2Path(pkg, file))
34
+ const sfnt = await wawoff2.decompress(woff2)
35
+ const ttfPath = join(dir, `${slug}.ttf`)
36
+ writeFileSync(ttfPath, Buffer.from(sfnt))
37
+ fontFiles.push(ttfPath)
38
+ }
39
+
40
+ return fontFiles
41
+ }
42
+
43
+ const svg = readFileSync(svgPath, 'utf8')
44
+ const fontFiles = await loadFontFiles()
45
+
46
+ const resvg = new Resvg(svg, {
47
+ fitTo: { mode: 'width', value: 1200 },
48
+ font: {
49
+ loadSystemFonts: false,
50
+ fontFiles,
51
+ defaultFontFamily: 'Instrument Sans',
52
+ sansSerifFamily: 'Instrument Sans',
53
+ serifFamily: 'Syne',
54
+ monospaceFamily: 'IBM Plex Mono',
55
+ },
56
+ })
57
+
58
+ const png = resvg.render().asPng()
59
+ writeFileSync(outPath, png)
60
+ console.log(`Wrote ${outPath} (${png.length} bytes)`)
@@ -0,0 +1,31 @@
1
+ import { Toast } from '@aeon-ui/ui'
2
+ import { GridMesh } from './components/GridMesh.js'
3
+ import { LandingFaq } from './components/LandingFaq.js'
4
+ import { LandingFooter } from './components/LandingFooter.js'
5
+ import { LandingHeader } from './components/LandingHeader.js'
6
+ import { LandingHero } from './components/LandingHero.js'
7
+ import { DiagramsSection } from './components/DiagramsSection.js'
8
+ import { LayersSection } from './components/LayersSection.js'
9
+ import { PhilosophySection } from './components/PhilosophySection.js'
10
+ import { PlaygroundSection } from './components/PlaygroundSection.js'
11
+
12
+ export function App() {
13
+ return (
14
+ <Toast.Provider>
15
+ <GridMesh />
16
+ <div className="landing">
17
+ <LandingHeader />
18
+ <main>
19
+ <LandingHero />
20
+ <LayersSection />
21
+ <DiagramsSection />
22
+ <PlaygroundSection />
23
+ <PhilosophySection />
24
+ <LandingFaq />
25
+ </main>
26
+ <LandingFooter />
27
+ </div>
28
+ <Toast.Viewport placement="bottom-end" />
29
+ </Toast.Provider>
30
+ )
31
+ }
@@ -0,0 +1,100 @@
1
+ /** Mermaid sources — kept in sync with @aeon-ui/primitives machines (STATES.md). */
2
+
3
+ export type AeonDiagram = {
4
+ id: string
5
+ title: string
6
+ caption: string
7
+ source: string
8
+ packageRef: string
9
+ }
10
+
11
+ export const aeonNorthStarDiagram = `flowchart LR
12
+ chart["Statechart\\n(XState)"]
13
+ snap["Snapshot"]
14
+ attr["data-aeon-state"]
15
+ ui["UI = f(state)"]
16
+ chart --> snap --> attr --> ui`
17
+
18
+ export const asyncLifecycleDiagram = `stateDiagram-v2
19
+ direction LR
20
+ [*] --> idle
21
+ idle --> loading: FETCH
22
+ idle --> idle: RESET / clear
23
+ loading --> success: RESOLVE
24
+ loading --> empty: RESOLVE (empty)
25
+ loading --> failure: REJECT
26
+ success --> loading: FETCH
27
+ empty --> loading: FETCH
28
+ failure --> loading: FETCH
29
+ success --> idle: RESET
30
+ empty --> idle: RESET
31
+ failure --> idle: RESET`
32
+
33
+ export const buttonLifecycleDiagram = `stateDiagram-v2
34
+ direction LR
35
+ [*] --> idle
36
+ idle --> pending: PRESS
37
+ idle --> disabled: DISABLE
38
+ pending --> success: SUCCEED
39
+ pending --> failure: FAIL
40
+ pending --> disabled: DISABLE
41
+ success --> idle: RESET
42
+ success --> pending: PRESS
43
+ failure --> idle: RESET
44
+ failure --> pending: PRESS
45
+ disabled --> idle: ENABLE`
46
+
47
+ export const fieldOrthogonalDiagram = `stateDiagram-v2
48
+ direction TB
49
+ state "interaction region" as interaction {
50
+ direction LR
51
+ [*] --> pristine
52
+ pristine --> dirty: INPUT / BLUR
53
+ dirty --> pristine: RESET
54
+ }
55
+ state "validation region" as validation {
56
+ direction LR
57
+ [*] --> valid
58
+ valid --> invalid: VALIDATE invalid
59
+ invalid --> valid: VALIDATE valid
60
+ invalid --> valid: RESET
61
+ }
62
+ state "submission region" as submission {
63
+ direction LR
64
+ [*] --> idle
65
+ idle --> pending: SUBMIT
66
+ pending --> idle: SUBMIT_DONE / SUBMIT_FAIL
67
+ }`
68
+
69
+ export const aeonDiagrams: AeonDiagram[] = [
70
+ {
71
+ id: 'north-star',
72
+ title: 'North star',
73
+ caption: 'Behavior is modeled first; the DOM expresses the snapshot — never the other way around.',
74
+ source: aeonNorthStarDiagram,
75
+ packageRef: 'PHILOSOPHY.md',
76
+ },
77
+ {
78
+ id: 'async',
79
+ title: 'Async data region',
80
+ caption:
81
+ 'Sequential lifecycle from createAsyncMachine(): idle · loading · success · failure · empty, plus stale on success.',
82
+ source: asyncLifecycleDiagram,
83
+ packageRef: '@aeon-ui/primitives — createAsyncMachine()',
84
+ },
85
+ {
86
+ id: 'button',
87
+ title: 'Button lifecycle',
88
+ caption: 'Submit controls: pending, success, and failure are real states — not overloaded disabled.',
89
+ source: buttonLifecycleDiagram,
90
+ packageRef: '@aeon-ui/primitives — buttonLifecycleMachine',
91
+ },
92
+ {
93
+ id: 'field',
94
+ title: 'Field (orthogonal regions)',
95
+ caption:
96
+ 'Parallel regions flatten to one attribute: interaction:dirty validation:invalid submission:idle',
97
+ source: fieldOrthogonalDiagram,
98
+ packageRef: '@aeon-ui/primitives — fieldMachine',
99
+ },
100
+ ]
@@ -0,0 +1,16 @@
1
+ @import './landing.css';
2
+ @import './demo-layout.css';
3
+
4
+ html {
5
+ scroll-behavior: smooth;
6
+ }
7
+
8
+ @media (prefers-reduced-motion: reduce) {
9
+ html {
10
+ scroll-behavior: auto;
11
+ }
12
+ }
13
+
14
+ a {
15
+ color: inherit;
16
+ }
@@ -0,0 +1,20 @@
1
+ import { Button, cn } from '@aeon-ui/ui'
2
+ import type { ReactNode } from 'react'
3
+
4
+ export interface ActionClusterProps {
5
+ children: ReactNode
6
+ className?: string
7
+ }
8
+
9
+ /** Machine console actions — spaced buttons by default. */
10
+ export function ActionCluster({ children, className }: ActionClusterProps) {
11
+ return (
12
+ <Button.Group
13
+ className={cn('machine-console__actions', className)}
14
+ data-aeon-scope="machine"
15
+ data-aeon-part="actions"
16
+ >
17
+ {children}
18
+ </Button.Group>
19
+ )
20
+ }
@@ -0,0 +1,97 @@
1
+ import { useAsyncContext } from '@aeon-ui/react'
2
+ import { Async, Button } from '@aeon-ui/ui'
3
+ import { ActionCluster } from './ActionCluster.js'
4
+
5
+ export interface AsyncMachineDemoProps {
6
+ /** Playground shows failure and empty paths; hero always succeeds for a crisp preview. */
7
+ variant?: 'hero' | 'playground'
8
+ }
9
+
10
+ const readouts: Record<string, Record<'hero' | 'playground', string>> = {
11
+ idle: {
12
+ hero: 'Idle — ready to fetch',
13
+ playground: 'Idle — press Simulate fetch when ready',
14
+ },
15
+ loading: {
16
+ hero: 'Loading…',
17
+ playground: 'Loading…',
18
+ },
19
+ success: {
20
+ hero: 'Success',
21
+ playground: 'Success — data on context',
22
+ },
23
+ failure: {
24
+ hero: 'Failure',
25
+ playground: 'Failure — error on context',
26
+ },
27
+ empty: {
28
+ hero: 'Empty',
29
+ playground: 'Empty — resolved with no rows',
30
+ },
31
+ }
32
+
33
+ function AsyncMachineControls({ variant }: { variant: 'hero' | 'playground' }) {
34
+ const { status, send } = useAsyncContext()
35
+ const runFetch = () => {
36
+ send({ type: 'FETCH' })
37
+ const delay = variant === 'hero' ? 700 : 900
38
+ setTimeout(() => {
39
+ if (variant === 'hero') {
40
+ send({ type: 'RESOLVE', data: 'Payload OK' })
41
+ return
42
+ }
43
+ const roll = Math.random()
44
+ if (roll < 0.25) {
45
+ send({ type: 'REJECT', error: 'Network unreachable' })
46
+ } else if (roll < 0.4) {
47
+ send({ type: 'RESOLVE', data: [] })
48
+ } else {
49
+ send({ type: 'RESOLVE', data: 'Aeon payload received' })
50
+ }
51
+ }, delay)
52
+ }
53
+
54
+ return (
55
+ <ActionCluster className="machine-console__actions">
56
+ <Button.Root size="sm" onClick={runFetch} disabled={status === 'loading'}>
57
+ {variant === 'hero' ? 'Run' : 'Simulate fetch'}
58
+ </Button.Root>
59
+ <Button.Root size="sm" variant="outline" onClick={() => send({ type: 'RESET' })}>
60
+ Reset
61
+ </Button.Root>
62
+ {variant === 'playground' && status === 'success' && (
63
+ <Button.Root size="sm" variant="ghost" onClick={() => send({ type: 'STALE' })}>
64
+ Mark stale
65
+ </Button.Root>
66
+ )}
67
+ </ActionCluster>
68
+ )
69
+ }
70
+
71
+ function AsyncMachineReadout({ variant }: { variant: 'hero' | 'playground' }) {
72
+ const { status, data, error, stale } = useAsyncContext()
73
+ const readout =
74
+ status === 'success'
75
+ ? String(data ?? (variant === 'hero' ? 'Payload OK' : 'Aeon payload received'))
76
+ : status === 'failure'
77
+ ? String(error ?? 'Network unreachable')
78
+ : (readouts[status]?.[variant] ?? readouts.idle[variant])
79
+
80
+ return (
81
+ <p className="live-status__text">
82
+ {stale && status === 'success' ? `${readout} (stale — refresh recommended)` : readout}
83
+ </p>
84
+ )
85
+ }
86
+
87
+ export function AsyncMachineDemo({ variant = 'playground' }: AsyncMachineDemoProps) {
88
+ return (
89
+ <Async.Root data-aeon-scope="machine" data-aeon-part="console">
90
+ <Async.Track />
91
+ <Async.Readout>
92
+ <AsyncMachineReadout variant={variant} />
93
+ </Async.Readout>
94
+ <AsyncMachineControls variant={variant} />
95
+ </Async.Root>
96
+ )
97
+ }
@@ -0,0 +1,63 @@
1
+ import { buttonLifecycleMachine } from '@aeon-ui/primitives'
2
+ import { useAeonMachine } from '@aeon-ui/react'
3
+ import { Button } from '@aeon-ui/ui'
4
+ import { useEffect } from 'react'
5
+
6
+ export function ButtonLifecycleDemo() {
7
+ const [snapshot, send] = useAeonMachine(buttonLifecycleMachine)
8
+ const status = snapshot.value as string
9
+
10
+ useEffect(() => {
11
+ if (status !== 'success') return
12
+ const t = setTimeout(() => send({ type: 'RESET' }), 1400)
13
+ return () => clearTimeout(t)
14
+ }, [status, send])
15
+
16
+ const label =
17
+ status === 'pending'
18
+ ? 'Submitting…'
19
+ : status === 'success'
20
+ ? 'Saved'
21
+ : status === 'failure'
22
+ ? 'Try again'
23
+ : 'Submit'
24
+
25
+ return (
26
+ <div className="demo-stack demo-stack--tight" data-aeon-scope="demo" data-aeon-part="button-lifecycle">
27
+ <Button.Group>
28
+ <Button.Root
29
+ status={
30
+ status === 'disabled'
31
+ ? 'disabled'
32
+ : (status as 'idle' | 'pending' | 'success' | 'failure')
33
+ }
34
+ disabled={status === 'disabled'}
35
+ onClick={() => {
36
+ if (status === 'failure') {
37
+ send({ type: 'RESET' })
38
+ return
39
+ }
40
+ if (status === 'idle') {
41
+ send({ type: 'PRESS' })
42
+ setTimeout(() => {
43
+ if (Math.random() > 0.3) send({ type: 'SUCCEED' })
44
+ else send({ type: 'FAIL' })
45
+ }, 900)
46
+ }
47
+ }}
48
+ >
49
+ {label}
50
+ </Button.Root>
51
+ <Button.Root
52
+ variant="outline"
53
+ onClick={() => send({ type: status === 'disabled' ? 'ENABLE' : 'DISABLE' })}
54
+ >
55
+ {status === 'disabled' ? 'Enable' : 'Disable'}
56
+ </Button.Root>
57
+ </Button.Group>
58
+ <p className="playground__block-sub" style={{ marginBottom: 0 }}>
59
+ Active state: <strong>{status}</strong>
60
+ </p>
61
+ </div>
62
+ )
63
+ }
@@ -0,0 +1,7 @@
1
+ export function CodeExample({ code }: { code: string }) {
2
+ return (
3
+ <pre className="code-example">
4
+ <code>{code.trim()}</code>
5
+ </pre>
6
+ )
7
+ }
@@ -0,0 +1,30 @@
1
+ import { Combobox } from '@aeon-ui/ui'
2
+ import { useState } from 'react'
3
+
4
+ const FRUITS = [
5
+ { value: 'apple', label: 'Apple' },
6
+ { value: 'banana', label: 'Banana' },
7
+ { value: 'cherry', label: 'Cherry' },
8
+ { value: 'durian', label: 'Durian' },
9
+ { value: 'elderberry', label: 'Elderberry' },
10
+ { value: 'fig', label: 'Fig' },
11
+ { value: 'grape', label: 'Grape' },
12
+ ] as const
13
+
14
+ export function ComboboxDemo() {
15
+ const [value, setValue] = useState<string>('apple')
16
+
17
+ return (
18
+ <Combobox.Root value={value} onValueChange={setValue} className="demo-combobox">
19
+ <Combobox.Input placeholder="Search fruit…" aria-label="Fruit" />
20
+ <Combobox.Content>
21
+ {FRUITS.map((f) => (
22
+ <Combobox.Item key={f.value} value={f.value} textValue={f.label}>
23
+ {f.label}
24
+ </Combobox.Item>
25
+ ))}
26
+ <Combobox.Empty>No matching fruit</Combobox.Empty>
27
+ </Combobox.Content>
28
+ </Combobox.Root>
29
+ )
30
+ }
@@ -0,0 +1,38 @@
1
+ import { aeonDiagrams } from '../aeonDiagrams.js'
2
+ import { site } from '../site.js'
3
+ import { MermaidDiagram } from './MermaidDiagram.js'
4
+
5
+ export function DiagramsSection() {
6
+ return (
7
+ <section id="diagrams" className="section">
8
+ <div className="container">
9
+ <header className="section-header">
10
+ <p className="section-label">{site.diagramsLabel}</p>
11
+ <h2 className="section-title">{site.diagramsTitle}</h2>
12
+ <p className="section-lead">{site.diagramsLead}</p>
13
+ </header>
14
+
15
+ <div className="diagrams__grid">
16
+ {aeonDiagrams.map((d) => (
17
+ <article key={d.id} className="panel diagram-card" data-aeon-scope="diagrams">
18
+ <header className="diagram-card__head">
19
+ <h3>{d.title}</h3>
20
+ <p>{d.caption}</p>
21
+ <code className="diagram-card__ref">{d.packageRef}</code>
22
+ </header>
23
+ <MermaidDiagram source={d.source} title={d.title} />
24
+ </article>
25
+ ))}
26
+ </div>
27
+
28
+ <p className="diagrams__footnote">
29
+ Charts match executable machines in the repo — see{' '}
30
+ <a href={site.statesDocUrl} target="_blank" rel="noreferrer">
31
+ STATES.md
32
+ </a>{' '}
33
+ and the playground for live snapshots.
34
+ </p>
35
+ </div>
36
+ </section>
37
+ )
38
+ }
@@ -0,0 +1,51 @@
1
+ import { useFieldContext } from '@aeon-ui/react'
2
+ import { Button, Field } from '@aeon-ui/ui'
3
+
4
+ function FieldSnapshot() {
5
+ const { stateAttr } = useFieldContext()
6
+ return (
7
+ <p className="playground__block-sub" style={{ marginBottom: 0 }}>
8
+ <code>{stateAttr}</code>
9
+ </p>
10
+ )
11
+ }
12
+
13
+ function FieldActions() {
14
+ const { send } = useFieldContext()
15
+
16
+ return (
17
+ <Button.Group>
18
+ <Button.Root variant="outline" onClick={() => send({ type: 'RESET' })}>
19
+ Reset
20
+ </Button.Root>
21
+ <Button.Root
22
+ onClick={() => {
23
+ send({ type: 'SUBMIT' })
24
+ setTimeout(() => send({ type: 'SUBMIT_DONE' }), 800)
25
+ }}
26
+ >
27
+ Simulate submit
28
+ </Button.Root>
29
+ </Button.Group>
30
+ )
31
+ }
32
+
33
+ export function FieldStateDemo() {
34
+ return (
35
+ <div className="demo-stack" data-aeon-scope="demo" data-aeon-part="field-states">
36
+ <Field.Root>
37
+ <Field.Label htmlFor="aeon-field-email">Work email</Field.Label>
38
+ <Field.Control
39
+ id="aeon-field-email"
40
+ type="email"
41
+ placeholder="you@studio.com"
42
+ validate={(v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)}
43
+ />
44
+ <Field.Message>Enter a valid email address.</Field.Message>
45
+ <Field.Hint>Type or blur to mark dirty. Invalid email marks validation:invalid.</Field.Hint>
46
+ <FieldActions />
47
+ <FieldSnapshot />
48
+ </Field.Root>
49
+ </div>
50
+ )
51
+ }
@@ -0,0 +1,8 @@
1
+ export function GridMesh() {
2
+ return (
3
+ <div className="grid-mesh" aria-hidden>
4
+ <div className="grid-mesh__lines" />
5
+ <div className="grid-mesh__vignette" />
6
+ </div>
7
+ )
8
+ }
@@ -0,0 +1,10 @@
1
+ import { site } from '../site.js'
2
+
3
+ export function HeroInstallLine() {
4
+ return (
5
+ <p className="hero-install__line" data-aeon-scope="hero" data-aeon-part="install">
6
+ <span className="hero-install__label">{site.heroInstallLabel}</span>
7
+ <span className="hero-install__access">{site.heroInstallAccess}</span>
8
+ </p>
9
+ )
10
+ }
@@ -0,0 +1,29 @@
1
+ import { Accordion } from '@aeon-ui/ui'
2
+ import { faq, site } from '../site.js'
3
+ import { CodeExample } from './CodeExample.js'
4
+
5
+ export function LandingFaq() {
6
+ return (
7
+ <section id="faq" className="section">
8
+ <div className="container">
9
+ <header className="section-header">
10
+ <p className="section-label">{site.faqLabel}</p>
11
+ <h2 className="section-title">{site.faqTitle}</h2>
12
+ <p className="section-lead">{site.faqLead}</p>
13
+ </header>
14
+
15
+ <Accordion.Root defaultValue={[faq[0].id]}>
16
+ {faq.map((item) => (
17
+ <Accordion.Item key={item.id} value={item.id}>
18
+ <Accordion.ItemTrigger value={item.id}>{item.question}</Accordion.ItemTrigger>
19
+ <Accordion.ItemContent value={item.id}>
20
+ <p>{item.answer}</p>
21
+ <CodeExample code={item.example} />
22
+ </Accordion.ItemContent>
23
+ </Accordion.Item>
24
+ ))}
25
+ </Accordion.Root>
26
+ </div>
27
+ </section>
28
+ )
29
+ }
@@ -0,0 +1,22 @@
1
+ import { site } from '../site.js'
2
+
3
+ export function LandingFooter() {
4
+ const year = new Date().getFullYear()
5
+
6
+ return (
7
+ <footer className="landing-footer">
8
+ <div className="container landing-footer__inner">
9
+ <p>
10
+ © {year} {site.brand} · {site.tagline}
11
+ </p>
12
+ <p className="landing-footer__tag">
13
+ A project by{' '}
14
+ <a href={site.studioUrl} target="_blank" rel="noreferrer">
15
+ {site.studio}
16
+ </a>
17
+ <span className="text-accent"> · spidercorp.xyz</span>
18
+ </p>
19
+ </div>
20
+ </footer>
21
+ )
22
+ }