aeon-ui-engine 1.0.1 → 1.0.3

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 (227) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/CONSUMER.md +86 -0
  3. package/INTEGRATION.md +2 -0
  4. package/README.md +15 -4
  5. package/package.json +17 -1
  6. package/packages/core/dist/index.d.ts +257 -0
  7. package/packages/core/dist/index.js +378 -0
  8. package/packages/core/node_modules/.bin/esbuild +21 -0
  9. package/packages/core/node_modules/.bin/jiti +21 -0
  10. package/packages/core/node_modules/.bin/tsc +21 -0
  11. package/packages/core/node_modules/.bin/tsserver +21 -0
  12. package/packages/core/node_modules/.bin/tsup +21 -0
  13. package/packages/core/node_modules/.bin/tsup-node +21 -0
  14. package/packages/core/node_modules/.bin/tsx +21 -0
  15. package/packages/core/node_modules/.bin/vite +21 -0
  16. package/packages/core/node_modules/.bin/vitest +21 -0
  17. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  18. package/packages/geometry/dist/index.d.ts +50 -0
  19. package/packages/geometry/dist/index.js +88 -0
  20. package/packages/geometry/node_modules/.bin/esbuild +21 -0
  21. package/packages/geometry/node_modules/.bin/jiti +21 -0
  22. package/packages/geometry/node_modules/.bin/tsc +21 -0
  23. package/packages/geometry/node_modules/.bin/tsserver +21 -0
  24. package/packages/geometry/node_modules/.bin/tsup +21 -0
  25. package/packages/geometry/node_modules/.bin/tsup-node +21 -0
  26. package/packages/geometry/node_modules/.bin/tsx +21 -0
  27. package/packages/panda/src/recipes/button.ts +4 -4
  28. package/packages/panda/src/recipes/combobox.ts +1 -1
  29. package/packages/panda/src/recipes/select.ts +1 -1
  30. package/packages/panda/src/theme/tokens.ts +5 -0
  31. package/packages/panda/styled-system/styles.css +10 -6
  32. package/packages/panda/styled-system/tokens/index.mjs +32 -0
  33. package/packages/panda/styled-system/tokens/tokens.d.ts +2 -2
  34. package/packages/primitives/dist/chunk-5S4DIRL4.js +42 -0
  35. package/packages/primitives/dist/chunk-H4KOEPYC.js +52 -0
  36. package/packages/primitives/dist/chunk-HONROWUG.js +41 -0
  37. package/packages/primitives/dist/chunk-J6JHKMVM.js +90 -0
  38. package/packages/primitives/dist/chunk-JBAG5E6W.js +46 -0
  39. package/packages/primitives/dist/chunk-LVNCD5F2.js +43 -0
  40. package/packages/primitives/dist/chunk-PB3LFHXU.js +72 -0
  41. package/packages/primitives/dist/chunk-SZV6KGXN.js +49 -0
  42. package/packages/primitives/dist/chunk-WVICCOQH.js +56 -0
  43. package/packages/primitives/dist/chunk-ZMGRX64G.js +74 -0
  44. package/packages/primitives/dist/index.d.ts +11 -0
  45. package/packages/primitives/dist/index.js +60 -0
  46. package/packages/primitives/dist/machines/accordion.d.ts +34 -0
  47. package/packages/primitives/dist/machines/accordion.js +6 -0
  48. package/packages/primitives/dist/machines/async.d.ts +111 -0
  49. package/packages/primitives/dist/machines/async.js +12 -0
  50. package/packages/primitives/dist/machines/button.d.ts +45 -0
  51. package/packages/primitives/dist/machines/button.js +8 -0
  52. package/packages/primitives/dist/machines/dialog.d.ts +57 -0
  53. package/packages/primitives/dist/machines/dialog.js +6 -0
  54. package/packages/primitives/dist/machines/field.d.ts +72 -0
  55. package/packages/primitives/dist/machines/field.js +12 -0
  56. package/packages/primitives/dist/machines/popover.d.ts +54 -0
  57. package/packages/primitives/dist/machines/popover.js +6 -0
  58. package/packages/primitives/dist/machines/slider.d.ts +71 -0
  59. package/packages/primitives/dist/machines/slider.js +10 -0
  60. package/packages/primitives/dist/machines/tabs.d.ts +39 -0
  61. package/packages/primitives/dist/machines/tabs.js +6 -0
  62. package/packages/primitives/dist/machines/toast.d.ts +31 -0
  63. package/packages/primitives/dist/machines/toast.js +6 -0
  64. package/packages/primitives/dist/machines/toggle.d.ts +54 -0
  65. package/packages/primitives/dist/machines/toggle.js +6 -0
  66. package/packages/primitives/node_modules/.bin/jiti +21 -0
  67. package/packages/primitives/node_modules/.bin/tsc +21 -0
  68. package/packages/primitives/node_modules/.bin/tsserver +21 -0
  69. package/packages/primitives/node_modules/.bin/tsup +21 -0
  70. package/packages/primitives/node_modules/.bin/tsup-node +21 -0
  71. package/packages/primitives/node_modules/.bin/tsx +21 -0
  72. package/packages/primitives/node_modules/.bin/vitest +21 -0
  73. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  74. package/packages/react/dist/index.d.ts +564 -0
  75. package/packages/react/dist/index.js +3461 -0
  76. package/packages/react/node_modules/.bin/jiti +21 -0
  77. package/packages/react/node_modules/.bin/tsc +21 -0
  78. package/packages/react/node_modules/.bin/tsserver +21 -0
  79. package/packages/react/node_modules/.bin/tsup +21 -0
  80. package/packages/react/node_modules/.bin/tsup-node +21 -0
  81. package/packages/react/node_modules/.bin/tsx +21 -0
  82. package/packages/react/node_modules/.bin/vitest +21 -0
  83. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  84. package/packages/react-scene/dist/index.d.ts +121 -0
  85. package/packages/react-scene/dist/index.js +430 -0
  86. package/packages/react-scene/node_modules/.bin/jiti +21 -0
  87. package/packages/react-scene/node_modules/.bin/tsc +21 -0
  88. package/packages/react-scene/node_modules/.bin/tsserver +21 -0
  89. package/packages/react-scene/node_modules/.bin/tsup +21 -0
  90. package/packages/react-scene/node_modules/.bin/tsup-node +21 -0
  91. package/packages/react-scene/node_modules/.bin/tsx +21 -0
  92. package/packages/scene/dist/index.d.ts +46 -0
  93. package/packages/scene/dist/index.js +54 -0
  94. package/packages/scene/node_modules/.bin/jiti +21 -0
  95. package/packages/scene/node_modules/.bin/tsc +21 -0
  96. package/packages/scene/node_modules/.bin/tsserver +21 -0
  97. package/packages/scene/node_modules/.bin/tsup +21 -0
  98. package/packages/scene/node_modules/.bin/tsup-node +21 -0
  99. package/packages/scene/node_modules/.bin/tsx +21 -0
  100. package/packages/signal/dist/index.d.ts +54 -0
  101. package/packages/signal/dist/index.js +169 -0
  102. package/packages/signal/node_modules/.bin/jiti +21 -0
  103. package/packages/signal/node_modules/.bin/tsc +21 -0
  104. package/packages/signal/node_modules/.bin/tsserver +21 -0
  105. package/packages/signal/node_modules/.bin/tsup +21 -0
  106. package/packages/signal/node_modules/.bin/tsup-node +21 -0
  107. package/packages/signal/node_modules/.bin/tsx +21 -0
  108. package/packages/site/dist/index.d.ts +31 -0
  109. package/packages/site/dist/index.js +62 -0
  110. package/packages/site/node_modules/.bin/jiti +21 -0
  111. package/packages/site/node_modules/.bin/tsc +21 -0
  112. package/packages/site/node_modules/.bin/tsserver +21 -0
  113. package/packages/site/node_modules/.bin/tsup +21 -0
  114. package/packages/site/node_modules/.bin/tsup-node +21 -0
  115. package/packages/site/node_modules/.bin/tsx +21 -0
  116. package/packages/solid/dist/index.d.ts +30 -0
  117. package/packages/solid/dist/index.js +174 -0
  118. package/packages/solid/node_modules/.bin/jiti +21 -0
  119. package/packages/solid/node_modules/.bin/tsc +21 -0
  120. package/packages/solid/node_modules/.bin/tsserver +21 -0
  121. package/packages/solid/node_modules/.bin/tsup +21 -0
  122. package/packages/solid/node_modules/.bin/tsup-node +21 -0
  123. package/packages/solid/node_modules/.bin/tsx +21 -0
  124. package/packages/surface/dist/index.d.ts +8 -0
  125. package/packages/surface/dist/index.js +14 -0
  126. package/packages/surface/node_modules/.bin/jiti +21 -0
  127. package/packages/surface/node_modules/.bin/tsc +21 -0
  128. package/packages/surface/node_modules/.bin/tsserver +21 -0
  129. package/packages/surface/node_modules/.bin/tsup +21 -0
  130. package/packages/surface/node_modules/.bin/tsup-node +21 -0
  131. package/packages/surface/node_modules/.bin/tsx +21 -0
  132. package/packages/svelte/dist/index.d.ts +12 -0
  133. package/packages/svelte/dist/index.js +15 -0
  134. package/packages/svelte/node_modules/.bin/acorn +21 -0
  135. package/packages/svelte/node_modules/.bin/jiti +21 -0
  136. package/packages/svelte/node_modules/.bin/svelte-check +21 -0
  137. package/packages/svelte/node_modules/.bin/tsc +21 -0
  138. package/packages/svelte/node_modules/.bin/tsserver +21 -0
  139. package/packages/svelte/node_modules/.bin/tsup +21 -0
  140. package/packages/svelte/node_modules/.bin/tsup-node +21 -0
  141. package/packages/svelte/node_modules/.bin/tsx +21 -0
  142. package/packages/svelte/node_modules/.bin/vite +21 -0
  143. package/packages/ui/dist/index.d.ts +200 -0
  144. package/packages/ui/dist/index.js +429 -0
  145. package/packages/ui/node_modules/.bin/jiti +21 -0
  146. package/packages/ui/node_modules/.bin/tsc +21 -0
  147. package/packages/ui/node_modules/.bin/tsserver +21 -0
  148. package/packages/ui/node_modules/.bin/tsup +21 -0
  149. package/packages/ui/node_modules/.bin/tsup-node +21 -0
  150. package/packages/ui/node_modules/.bin/tsx +21 -0
  151. package/packages/ui/src/select.tsx +3 -4
  152. package/packages/vue/dist/index.d.ts +71 -0
  153. package/packages/vue/dist/index.js +193 -0
  154. package/packages/vue/node_modules/.bin/jiti +21 -0
  155. package/packages/vue/node_modules/.bin/tsc +21 -0
  156. package/packages/vue/node_modules/.bin/tsserver +21 -0
  157. package/packages/vue/node_modules/.bin/tsup +21 -0
  158. package/packages/vue/node_modules/.bin/tsup-node +21 -0
  159. package/packages/vue/node_modules/.bin/tsx +21 -0
  160. package/scripts/vite-aliases.mjs +125 -0
  161. package/.changeset/README.md +0 -23
  162. package/.changeset/combobox-and-changesets.md +0 -9
  163. package/.changeset/config.json +0 -30
  164. package/.changeset/framework-adapters.md +0 -12
  165. package/.changeset/scene-3d.md +0 -6
  166. package/.changeset/scene-plane.md +0 -8
  167. package/.changeset/site-og.md +0 -5
  168. package/.cursor/rules/aeon-ui.mdc +0 -22
  169. package/ACCESSIBILITY.md +0 -32
  170. package/AGENTS.md +0 -226
  171. package/COMPONENTS.md +0 -41
  172. package/FRAMEWORKS.md +0 -57
  173. package/PHILOSOPHY.md +0 -71
  174. package/PUBLISHING.md +0 -85
  175. package/SCENE.md +0 -113
  176. package/STATES.md +0 -243
  177. package/apps/demo/index.html +0 -31
  178. package/apps/demo/og.config.mjs +0 -20
  179. package/apps/demo/package.json +0 -41
  180. package/apps/demo/public/favicon.svg +0 -16
  181. package/apps/demo/public/og-aeon-ui-engine.png +0 -0
  182. package/apps/demo/public/og.svg +0 -35
  183. package/apps/demo/scripts/generate-og-png.mjs +0 -62
  184. package/apps/demo/src/App.tsx +0 -31
  185. package/apps/demo/src/aeonDiagrams.ts +0 -42
  186. package/apps/demo/src/app.css +0 -16
  187. package/apps/demo/src/components/ActionCluster.tsx +0 -20
  188. package/apps/demo/src/components/AsyncMachineDemo.tsx +0 -97
  189. package/apps/demo/src/components/ButtonLifecycleDemo.tsx +0 -63
  190. package/apps/demo/src/components/CodeExample.tsx +0 -7
  191. package/apps/demo/src/components/ComboboxDemo.tsx +0 -30
  192. package/apps/demo/src/components/DiagramsSection.tsx +0 -37
  193. package/apps/demo/src/components/FieldStateDemo.tsx +0 -51
  194. package/apps/demo/src/components/GridMesh.tsx +0 -8
  195. package/apps/demo/src/components/HeroInstall.tsx +0 -13
  196. package/apps/demo/src/components/LandingFaq.tsx +0 -29
  197. package/apps/demo/src/components/LandingFooter.tsx +0 -30
  198. package/apps/demo/src/components/LandingHeader.tsx +0 -62
  199. package/apps/demo/src/components/LandingHero.tsx +0 -55
  200. package/apps/demo/src/components/LayersSection.tsx +0 -47
  201. package/apps/demo/src/components/MermaidDiagram.tsx +0 -86
  202. package/apps/demo/src/components/PhilosophySection.tsx +0 -31
  203. package/apps/demo/src/components/PlaygroundBlock.tsx +0 -18
  204. package/apps/demo/src/components/PlaygroundControlsDemo.tsx +0 -63
  205. package/apps/demo/src/components/PlaygroundSection.tsx +0 -120
  206. package/apps/demo/src/components/ScrollRegionDemo.tsx +0 -74
  207. package/apps/demo/src/components/ThemeSwitcher.tsx +0 -79
  208. package/apps/demo/src/demo-layout.css +0 -293
  209. package/apps/demo/src/landing.css +0 -1151
  210. package/apps/demo/src/main.tsx +0 -14
  211. package/apps/demo/src/nav.ts +0 -9
  212. package/apps/demo/src/site.ts +0 -218
  213. package/apps/demo/tsconfig.json +0 -17
  214. package/apps/demo/vite-plugins/og-meta.ts +0 -30
  215. package/apps/demo/vite.config.ts +0 -69
  216. package/docs/API_PATTERNS.md +0 -234
  217. package/docs/ARCHITECTURE.md +0 -125
  218. package/docs/COMPONENT_CHECKLIST.md +0 -103
  219. package/docs/FILE_MAP.md +0 -122
  220. package/docs/GLOSSARY.md +0 -125
  221. package/docs/INDEX.md +0 -53
  222. package/docs/LAYOUT_COORDINATES.md +0 -178
  223. package/docs/MACHINES.md +0 -171
  224. package/docs/MIGRATION_FROM_ARK.md +0 -295
  225. package/docs/VITE_CONSUMER.md +0 -114
  226. package/pnpm-workspace.yaml +0 -3
  227. package/vercel.json +0 -12
@@ -1,63 +0,0 @@
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
- }
@@ -1,7 +0,0 @@
1
- export function CodeExample({ code }: { code: string }) {
2
- return (
3
- <pre className="code-example">
4
- <code>{code.trim()}</code>
5
- </pre>
6
- )
7
- }
@@ -1,30 +0,0 @@
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
- }
@@ -1,37 +0,0 @@
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((diagram) => (
17
- <article key={diagram.id} className="panel diagram-card" data-aeon-scope="diagrams">
18
- <header className="diagram-card__head">
19
- <h3>{diagram.title}</h3>
20
- <p>{diagram.caption}</p>
21
- </header>
22
- <MermaidDiagram source={diagram.source} title={diagram.title} />
23
- </article>
24
- ))}
25
- </div>
26
-
27
- <p className="diagrams__footnote">
28
- Full machine definitions in{' '}
29
- <a href={site.statesDocUrl} target="_blank" rel="noreferrer">
30
- STATES.md
31
- </a>
32
- .
33
- </p>
34
- </div>
35
- </section>
36
- )
37
- }
@@ -1,51 +0,0 @@
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
- }
@@ -1,8 +0,0 @@
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
- }
@@ -1,13 +0,0 @@
1
- import { site } from '../site.js'
2
-
3
- export function HeroInstallLine() {
4
- return (
5
- <div className="hero-install" data-aeon-scope="hero" data-aeon-part="install">
6
- <p className="hero-install__line">
7
- <span className="hero-install__label">{site.heroInstallLabel}</span>
8
- <code className="hero-install__command">{site.heroInstallCommand}</code>
9
- </p>
10
- <p className="hero-install__hint">{site.heroInstallHint}</p>
11
- </div>
12
- )
13
- }
@@ -1,29 +0,0 @@
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
- {'example' in item && item.example ? <CodeExample code={item.example} /> : null}
22
- </Accordion.ItemContent>
23
- </Accordion.Item>
24
- ))}
25
- </Accordion.Root>
26
- </div>
27
- </section>
28
- )
29
- }
@@ -1,30 +0,0 @@
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 href={site.npmRegistryUrl} target="_blank" rel="noreferrer">
14
- {site.npmPackage}
15
- </a>
16
- {' · '}
17
- <a href={site.url} target="_blank" rel="noreferrer">
18
- GitHub
19
- </a>
20
- {' · '}
21
- A project by{' '}
22
- <a href={site.studioUrl} target="_blank" rel="noreferrer">
23
- {site.studio}
24
- </a>
25
- <span className="text-accent"> · spidercorp.xyz</span>
26
- </p>
27
- </div>
28
- </footer>
29
- )
30
- }
@@ -1,62 +0,0 @@
1
- import { useEffect, useState } from 'react'
2
- import { navLinks } from '../nav.js'
3
- import { site } from '../site.js'
4
- import { Button } from '@aeon-ui/ui'
5
- import { ThemeSwitcher } from './ThemeSwitcher.js'
6
-
7
- export function LandingHeader() {
8
- const [scrolled, setScrolled] = useState(false)
9
- const [active, setActive] = useState('')
10
-
11
- useEffect(() => {
12
- const onScroll = () => {
13
- setScrolled(window.scrollY > 4)
14
- const offset = 120
15
- for (const link of [...navLinks].reverse()) {
16
- const el = document.getElementById(link.sectionId)
17
- if (el && el.getBoundingClientRect().top <= offset) {
18
- setActive(link.href)
19
- return
20
- }
21
- }
22
- setActive('')
23
- }
24
- onScroll()
25
- window.addEventListener('scroll', onScroll, { passive: true })
26
- return () => window.removeEventListener('scroll', onScroll)
27
- }, [])
28
-
29
- return (
30
- <header className={`landing-header${scrolled ? ' landing-header--scrolled' : ''}`}>
31
- <div className="landing-header__shell">
32
- <a href="#" className="landing-header__brand" onClick={(e) => e.preventDefault()}>
33
- {site.brand}
34
- </a>
35
- <nav className="landing-header__nav" aria-label="Primary">
36
- {navLinks.map((l) => (
37
- <a
38
- key={l.href}
39
- href={l.href}
40
- className={active === l.href ? 'is-active' : undefined}
41
- >
42
- {l.label}
43
- </a>
44
- ))}
45
- </nav>
46
- <div className="landing-header__utilities">
47
- <ThemeSwitcher />
48
- <a href="#playground" className="landing-header__cta">
49
- <Button.Root size="xs" aria-label={site.heroCtaPrimary}>
50
- <span className="landing-header__cta-label landing-header__cta-label--long">
51
- {site.heroCtaPrimary}
52
- </span>
53
- <span className="landing-header__cta-label landing-header__cta-label--short" aria-hidden="true">
54
- {site.headerCtaShort}
55
- </span>
56
- </Button.Root>
57
- </a>
58
- </div>
59
- </div>
60
- </header>
61
- )
62
- }
@@ -1,55 +0,0 @@
1
- import { Button } from '@aeon-ui/ui'
2
- import { HeroInstallLine } from './HeroInstall.js'
3
- import { site } from '../site.js'
4
- import { AsyncMachineDemo } from './AsyncMachineDemo.js'
5
-
6
- export function LandingHero() {
7
- return (
8
- <section className="hero">
9
- <div className="container hero__grid">
10
- <div className="hero__copy">
11
- <p className="hero__eyebrow">{site.heroEyebrow}</p>
12
- <h1 className="hero__title">
13
- {site.heroTitle}
14
- <br />
15
- <span className="text-accent">{site.heroAccent}</span>
16
- </h1>
17
- <p className="hero__lead">{site.heroLead}</p>
18
- <p className="hero__sub">{site.heroSub}</p>
19
- <HeroInstallLine />
20
- <Button.Group className="hero__actions">
21
- <a href="#playground">
22
- <Button.Root>{site.heroCtaPrimary}</Button.Root>
23
- </a>
24
- <a href="#layers">
25
- <Button.Root variant="outline">{site.heroCtaSecondary}</Button.Root>
26
- </a>
27
- </Button.Group>
28
- <div className="hero__stats panel" role="list">
29
- {site.heroStats.map((s, i) => (
30
- <div
31
- key={s.label}
32
- className="hero__stat"
33
- role="listitem"
34
- data-aeon-scope="hero"
35
- data-aeon-part="stat"
36
- data-aeon-state={i === 0 ? 'active' : 'inactive'}
37
- >
38
- <span className="hero__stat-label">{s.label}</span>
39
- <span className="hero__stat-detail">{s.detail}</span>
40
- <code className="hero__stat-example">{s.example}</code>
41
- </div>
42
- ))}
43
- </div>
44
- </div>
45
- <div className="hero__visual">
46
- <div className="panel state-card" data-aeon-scope="hero" data-aeon-part="preview">
47
- <p className="state-card__label">{site.stateCardLabel}</p>
48
- <p className="state-card__hint">{site.stateCardHint}</p>
49
- <AsyncMachineDemo variant="hero" />
50
- </div>
51
- </div>
52
- </div>
53
- </section>
54
- )
55
- }
@@ -1,47 +0,0 @@
1
- import { commitments, layers, site } from '../site.js'
2
-
3
- export function LayersSection() {
4
- return (
5
- <section id="layers" className="section">
6
- <div className="container">
7
- <header className="section-header">
8
- <p className="section-label">{site.layersLabel}</p>
9
- <h2 className="section-title">{site.layersTitle}</h2>
10
- <p className="section-lead">{site.layersLead}</p>
11
- </header>
12
-
13
- <div className="layers__commitments panel" role="list">
14
- {commitments.map((c) => (
15
- <div key={c.id} className="layers__commitment" role="listitem">
16
- <h3>{c.title}</h3>
17
- <p>{c.description}</p>
18
- </div>
19
- ))}
20
- </div>
21
-
22
- <div className="layers__grid" role="list">
23
- {layers.map((layer, index) => (
24
- <article
25
- key={layer.id}
26
- className="panel layer-card"
27
- role="listitem"
28
- data-aeon-scope="layers"
29
- data-aeon-part="card"
30
- >
31
- <span className="layer-card__index" aria-hidden>
32
- {String(index + 1).padStart(2, '0')}
33
- </span>
34
- <h3>{layer.title}</h3>
35
- <p>{layer.description}</p>
36
- <ul>
37
- {layer.highlights.map((highlight) => (
38
- <li key={highlight}>{highlight}</li>
39
- ))}
40
- </ul>
41
- </article>
42
- ))}
43
- </div>
44
- </div>
45
- </section>
46
- )
47
- }
@@ -1,86 +0,0 @@
1
- import { useEffect, useId, useState } from 'react'
2
-
3
- let mermaidReady = false
4
-
5
- function ensureMermaid(mermaid: typeof import('mermaid').default) {
6
- if (mermaidReady) return
7
- mermaid.initialize({
8
- startOnLoad: false,
9
- theme: 'base',
10
- themeVariables: {
11
- fontFamily: 'Instrument Sans, system-ui, sans-serif',
12
- fontSize: '14px',
13
- primaryColor: '#1a1f2e',
14
- primaryTextColor: '#e8ecf4',
15
- primaryBorderColor: '#5eead4',
16
- lineColor: '#8b95a8',
17
- secondaryColor: '#12161f',
18
- tertiaryColor: '#0e1118',
19
- noteBkgColor: '#12161f',
20
- noteTextColor: '#b8c0d0',
21
- noteBorderColor: '#3d4556',
22
- },
23
- state: {
24
- nodeSpacing: 64,
25
- rankSpacing: 72,
26
- fontSize: 15,
27
- },
28
- flowchart: {
29
- curve: 'basis',
30
- padding: 16,
31
- htmlLabels: true,
32
- },
33
- })
34
- mermaidReady = true
35
- }
36
-
37
- export interface MermaidDiagramProps {
38
- source: string
39
- title?: string
40
- }
41
-
42
- export function MermaidDiagram({ source, title }: MermaidDiagramProps) {
43
- const reactId = useId().replace(/:/g, '')
44
- const [svg, setSvg] = useState<string | null>(null)
45
- const [error, setError] = useState<string | null>(null)
46
-
47
- useEffect(() => {
48
- let cancelled = false
49
- const run = async () => {
50
- try {
51
- const mermaid = (await import('mermaid')).default
52
- ensureMermaid(mermaid)
53
- const { svg: rendered } = await mermaid.render(`aeon-mmd-${reactId}`, source)
54
- if (!cancelled) {
55
- setSvg(rendered)
56
- setError(null)
57
- }
58
- } catch (e) {
59
- if (!cancelled) {
60
- setError(e instanceof Error ? e.message : 'Diagram failed to render')
61
- setSvg(null)
62
- }
63
- }
64
- }
65
-
66
- void run()
67
- return () => {
68
- cancelled = true
69
- }
70
- }, [source, reactId])
71
-
72
- return (
73
- <figure className="diagram-card__figure">
74
- {title ? <figcaption className="sr-only">{title}</figcaption> : null}
75
- <div className="diagram-card__mermaid" aria-hidden={!!error}>
76
- {error ? (
77
- <pre className="diagram-card__error">{error}</pre>
78
- ) : svg ? (
79
- <div dangerouslySetInnerHTML={{ __html: svg }} />
80
- ) : (
81
- <p className="diagram-card__loading">Rendering diagram…</p>
82
- )}
83
- </div>
84
- </figure>
85
- )
86
- }
@@ -1,31 +0,0 @@
1
- import { Button } from '@aeon-ui/ui'
2
- import { philosophyTenets, site } from '../site.js'
3
-
4
- export function PhilosophySection() {
5
- return (
6
- <section id="philosophy" className="section">
7
- <div className="container">
8
- <header className="section-header">
9
- <p className="section-label">{site.philosophyLabel}</p>
10
- <h2 className="section-title">{site.philosophyTitle}</h2>
11
- <p className="section-lead">{site.philosophyLead}</p>
12
- </header>
13
-
14
- <div className="panel thesis__grid">
15
- {philosophyTenets.map((t) => (
16
- <article key={t.title} className="thesis__card">
17
- <h3>{t.title}</h3>
18
- <p>{t.body}</p>
19
- </article>
20
- ))}
21
- </div>
22
-
23
- <div className="thesis__cta">
24
- <a href={site.thesisUrl} target="_blank" rel="noreferrer">
25
- <Button.Root variant="outline">{site.thesisCta}</Button.Root>
26
- </a>
27
- </div>
28
- </div>
29
- </section>
30
- )
31
- }
@@ -1,18 +0,0 @@
1
- import type { ReactNode } from 'react'
2
-
3
- export interface PlaygroundBlockProps {
4
- title: string
5
- description: string
6
- children: ReactNode
7
- last?: boolean
8
- }
9
-
10
- export function PlaygroundBlock({ title, description, children, last }: PlaygroundBlockProps) {
11
- return (
12
- <section className={`playground__block${last ? ' playground__block--last' : ''}`}>
13
- <h3 className="playground__block-title">{title}</h3>
14
- <p className="playground__block-sub">{description}</p>
15
- <div className="playground__block-demo">{children}</div>
16
- </section>
17
- )
18
- }
@@ -1,63 +0,0 @@
1
- import { Button, Checkbox, PinInput, RadioGroup, Slider, Switch } from '@aeon-ui/ui'
2
- import { useState } from 'react'
3
-
4
- export function PlaygroundControlsDemo() {
5
- const [notifications, setNotifications] = useState(true)
6
- const [emailDigest, setEmailDigest] = useState(false)
7
- const [plan, setPlan] = useState('standard')
8
- const [volume, setVolume] = useState(40)
9
- const [pin, setPin] = useState('')
10
-
11
- return (
12
- <div className="playground-controls">
13
- <Button.Group className="playground-button-row">
14
- <Button.Root>Primary</Button.Root>
15
- <Button.Root variant="outline">Outline</Button.Root>
16
- <Button.Root variant="ghost">Ghost</Button.Root>
17
- </Button.Group>
18
-
19
- <div className="playground-controls__toggles">
20
- <Switch.Root checked={notifications} onCheckedChange={setNotifications}>
21
- <Switch.Control>
22
- <Switch.Thumb />
23
- </Switch.Control>
24
- <Switch.Label>Notifications</Switch.Label>
25
- </Switch.Root>
26
-
27
- <Checkbox.Root checked={emailDigest} onCheckedChange={setEmailDigest}>
28
- <Checkbox.Control>
29
- <Checkbox.Indicator />
30
- </Checkbox.Control>
31
- <Checkbox.Label>Email digest</Checkbox.Label>
32
- </Checkbox.Root>
33
- </div>
34
-
35
- <RadioGroup.Root value={plan} onValueChange={setPlan} className="playground-controls__radio">
36
- <RadioGroup.Item value="standard">
37
- <RadioGroup.ItemControl>
38
- <RadioGroup.ItemIndicator />
39
- </RadioGroup.ItemControl>
40
- <RadioGroup.ItemLabel>Standard</RadioGroup.ItemLabel>
41
- </RadioGroup.Item>
42
- <RadioGroup.Item value="pro">
43
- <RadioGroup.ItemControl>
44
- <RadioGroup.ItemIndicator />
45
- </RadioGroup.ItemControl>
46
- <RadioGroup.ItemLabel>Pro</RadioGroup.ItemLabel>
47
- </RadioGroup.Item>
48
- </RadioGroup.Root>
49
-
50
- <Slider.Root value={volume} onValueChange={setVolume} className="playground-controls__slider">
51
- <Slider.Track>
52
- <Slider.Range />
53
- <Slider.Thumb />
54
- </Slider.Track>
55
- <Slider.ValueText>{volume}%</Slider.ValueText>
56
- </Slider.Root>
57
-
58
- <PinInput.Root length={4} value={pin} onValueChange={setPin}>
59
- <PinInput.Group />
60
- </PinInput.Root>
61
- </div>
62
- )
63
- }