aeon-ui-engine 1.0.3 → 1.2.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.
- package/CHANGELOG.md +34 -0
- package/CONSUMER.md +82 -40
- package/README.md +47 -16
- package/package.json +9 -2
- package/packages/cli/README.md +17 -0
- package/packages/cli/dist/bin.d.ts +1 -0
- package/packages/cli/dist/bin.js +35 -0
- package/packages/cli/dist/chunk-IW5NT2Z2.js +103 -0
- package/packages/cli/dist/index.d.ts +10 -0
- package/packages/cli/dist/index.js +6 -0
- package/packages/cli/node_modules/.bin/esbuild +21 -0
- package/packages/cli/node_modules/.bin/jiti +21 -0
- package/packages/cli/node_modules/.bin/tsc +21 -0
- package/packages/cli/node_modules/.bin/tsserver +21 -0
- package/packages/cli/node_modules/.bin/tsup +21 -0
- package/packages/cli/node_modules/.bin/tsup-node +21 -0
- package/packages/cli/node_modules/.bin/tsx +21 -0
- package/packages/cli/node_modules/.bin/vite +21 -0
- package/packages/cli/node_modules/.bin/vitest +21 -0
- package/packages/cli/package.json +50 -0
- package/packages/cli/src/bin.ts +34 -0
- package/packages/cli/src/index.ts +1 -0
- package/packages/cli/src/init.ts +107 -0
- package/packages/cli/tsconfig.json +10 -0
- package/packages/core/README.md +7 -1
- package/packages/core/dist/index.d.ts +255 -7
- package/packages/core/dist/index.js +372 -2
- package/packages/core/node_modules/.bin/esbuild +4 -4
- package/packages/core/node_modules/.bin/vite +4 -4
- package/packages/core/node_modules/.bin/vitest +2 -2
- package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/packages/core/package.json +17 -5
- package/packages/core/src/anatomy.ts +234 -5
- package/packages/core/src/brand-theme.ts +172 -0
- package/packages/core/src/index.ts +1 -0
- package/packages/core/src/machine.test.ts +62 -1
- package/packages/core/src/machine.ts +93 -0
- package/packages/core/src/theme.ts +105 -0
- package/packages/panda/aeon.css +8 -0
- package/packages/panda/package.json +1 -1
- package/packages/panda/panda.config.ts +58 -1
- package/packages/panda/src/recipes/app-shell.ts +137 -0
- package/packages/panda/src/recipes/avatar.ts +131 -0
- package/packages/panda/src/recipes/bar.ts +206 -0
- package/packages/panda/src/recipes/button-group.ts +12 -4
- package/packages/panda/src/recipes/button.ts +1 -0
- package/packages/panda/src/recipes/combobox.ts +2 -1
- package/packages/panda/src/recipes/composer.ts +81 -0
- package/packages/panda/src/recipes/content.ts +104 -0
- package/packages/panda/src/recipes/conversation.ts +106 -0
- package/packages/panda/src/recipes/entry.ts +217 -0
- package/packages/panda/src/recipes/field.ts +12 -2
- package/packages/panda/src/recipes/floating.ts +26 -13
- package/packages/panda/src/recipes/identity.ts +73 -0
- package/packages/panda/src/recipes/index.ts +15 -0
- package/packages/panda/src/recipes/list-row.ts +109 -0
- package/packages/panda/src/recipes/metric-strip.ts +80 -0
- package/packages/panda/src/recipes/nav.ts +155 -0
- package/packages/panda/src/recipes/panel.ts +156 -0
- package/packages/panda/src/recipes/pin-input.ts +3 -2
- package/packages/panda/src/recipes/profile-header.ts +120 -0
- package/packages/panda/src/recipes/select.ts +2 -1
- package/packages/panda/src/recipes/slider.ts +6 -4
- package/packages/panda/src/recipes/theme-switcher.ts +110 -0
- package/packages/panda/src/recipes/thread.ts +88 -0
- package/packages/panda/src/theme/catalog-types.ts +2 -0
- package/packages/panda/src/theme/catalog.ts +23 -0
- package/packages/panda/src/theme/chrome.css +2 -1
- package/packages/panda/src/theme/consumer-shell.css +129 -0
- package/packages/panda/src/theme/electron.css +30 -0
- package/packages/panda/src/theme/global-theme-css.ts +9 -0
- package/packages/panda/src/theme/omarchy.themes.ts +607 -0
- package/packages/panda/src/theme/palette.ts +3 -0
- package/packages/panda/src/theme/scrollbars.css +58 -21
- package/packages/panda/src/theme/themes.config.ts +39 -1
- package/packages/panda/styled-system/css/conditions.mjs +1 -1
- package/packages/panda/styled-system/css/css.mjs +1 -1
- package/packages/panda/styled-system/css/sva.mjs +9 -4
- package/packages/panda/styled-system/helpers.mjs +11 -22
- package/packages/panda/styled-system/jsx/create-style-context.d.ts +54 -0
- package/packages/panda/styled-system/jsx/create-style-context.mjs +121 -0
- package/packages/panda/styled-system/jsx/factory.mjs +14 -5
- package/packages/panda/styled-system/jsx/index.d.ts +1 -0
- package/packages/panda/styled-system/jsx/index.mjs +1 -0
- package/packages/panda/styled-system/jsx/is-valid-prop.mjs +2 -2
- package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +0 -1
- package/packages/panda/styled-system/patterns/bleed.d.ts +0 -1
- package/packages/panda/styled-system/patterns/box.d.ts +0 -1
- package/packages/panda/styled-system/patterns/center.d.ts +0 -1
- package/packages/panda/styled-system/patterns/circle.d.ts +0 -1
- package/packages/panda/styled-system/patterns/container.d.ts +0 -1
- package/packages/panda/styled-system/patterns/cq.d.ts +0 -1
- package/packages/panda/styled-system/patterns/divider.d.ts +0 -1
- package/packages/panda/styled-system/patterns/flex.d.ts +0 -1
- package/packages/panda/styled-system/patterns/float.d.ts +0 -1
- package/packages/panda/styled-system/patterns/grid-item.d.ts +0 -1
- package/packages/panda/styled-system/patterns/grid.d.ts +0 -1
- package/packages/panda/styled-system/patterns/grid.mjs +1 -1
- package/packages/panda/styled-system/patterns/hstack.d.ts +0 -1
- package/packages/panda/styled-system/patterns/hstack.mjs +1 -1
- package/packages/panda/styled-system/patterns/link-overlay.d.ts +0 -1
- package/packages/panda/styled-system/patterns/spacer.d.ts +0 -1
- package/packages/panda/styled-system/patterns/spacer.mjs +6 -2
- package/packages/panda/styled-system/patterns/square.d.ts +0 -1
- package/packages/panda/styled-system/patterns/stack.d.ts +0 -1
- package/packages/panda/styled-system/patterns/stack.mjs +1 -1
- package/packages/panda/styled-system/patterns/visually-hidden.d.ts +0 -1
- package/packages/panda/styled-system/patterns/vstack.d.ts +0 -1
- package/packages/panda/styled-system/patterns/vstack.mjs +1 -1
- package/packages/panda/styled-system/patterns/wrap.d.ts +0 -1
- package/packages/panda/styled-system/patterns/wrap.mjs +1 -1
- package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-accordion.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +34 -0
- package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +70 -0
- package/packages/panda/styled-system/recipes/aeon-async.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-async.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +36 -0
- package/packages/panda/styled-system/recipes/aeon-avatar.mjs +57 -0
- package/packages/panda/styled-system/recipes/aeon-badge.d.ts +3 -0
- package/packages/panda/styled-system/recipes/aeon-bar.d.ts +40 -0
- package/packages/panda/styled-system/recipes/aeon-bar.mjs +77 -0
- package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +3 -2
- package/packages/panda/styled-system/recipes/aeon-button.d.ts +3 -2
- package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-combobox.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-composer.d.ts +31 -0
- package/packages/panda/styled-system/recipes/aeon-composer.mjs +45 -0
- package/packages/panda/styled-system/recipes/aeon-content.d.ts +34 -0
- package/packages/panda/styled-system/recipes/aeon-content.mjs +70 -0
- package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +31 -0
- package/packages/panda/styled-system/recipes/aeon-conversation.mjs +61 -0
- package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-dialog.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-entry.d.ts +38 -0
- package/packages/panda/styled-system/recipes/aeon-entry.mjs +100 -0
- package/packages/panda/styled-system/recipes/aeon-field.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-field.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-identity.d.ts +36 -0
- package/packages/panda/styled-system/recipes/aeon-identity.mjs +63 -0
- package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +33 -0
- package/packages/panda/styled-system/recipes/aeon-list-row.mjs +49 -0
- package/packages/panda/styled-system/recipes/aeon-menu.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-menu.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +36 -0
- package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +54 -0
- package/packages/panda/styled-system/recipes/aeon-nav.d.ts +38 -0
- package/packages/panda/styled-system/recipes/aeon-nav.mjs +69 -0
- package/packages/panda/styled-system/recipes/aeon-panel.d.ts +34 -0
- package/packages/panda/styled-system/recipes/aeon-panel.mjs +58 -0
- package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-popover.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-popover.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +36 -0
- package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +62 -0
- package/packages/panda/styled-system/recipes/aeon-progress.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-progress.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-scroll.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-select.d.ts +4 -3
- package/packages/panda/styled-system/recipes/aeon-select.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-separator.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-separator.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-slider.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-slider.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-switch.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-switch.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-tabs.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +34 -0
- package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +59 -0
- package/packages/panda/styled-system/recipes/aeon-thread.d.ts +31 -0
- package/packages/panda/styled-system/recipes/aeon-thread.mjs +53 -0
- package/packages/panda/styled-system/recipes/aeon-toast.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-toast.mjs +1 -0
- package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +4 -1
- package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +1 -0
- package/packages/panda/styled-system/recipes/index.d.ts +16 -1
- package/packages/panda/styled-system/recipes/index.mjs +16 -1
- package/packages/panda/styled-system/styles.css +2317 -450
- package/packages/panda/styled-system/tokens/index.mjs +43 -7
- package/packages/panda/styled-system/tokens/tokens.d.ts +5 -5
- package/packages/panda/styled-system/types/composition.d.ts +86 -23
- package/packages/panda/styled-system/types/conditions.d.ts +34 -10
- package/packages/panda/styled-system/types/csstype.d.ts +6405 -5133
- package/packages/panda/styled-system/types/jsx.d.ts +27 -10
- package/packages/panda/styled-system/types/pattern.d.ts +4 -4
- package/packages/panda/styled-system/types/prop-type.d.ts +11 -1
- package/packages/panda/styled-system/types/style-props.d.ts +2763 -2165
- package/packages/panda/styled-system/types/system-types.d.ts +38 -80
- package/packages/panda/theme-runtime.css +945 -0
- package/packages/primitives/dist/chunk-4NOKRUSG.js +81 -0
- package/packages/primitives/dist/chunk-R25CUHNF.js +46 -0
- package/packages/primitives/dist/chunk-RO2DMFN5.js +89 -0
- package/packages/primitives/dist/chunk-V5D7LS4J.js +61 -0
- package/packages/primitives/dist/chunk-YBPNI2LI.js +70 -0
- package/packages/primitives/dist/index.d.ts +5 -0
- package/packages/primitives/dist/index.js +46 -14
- package/packages/primitives/dist/machines/app-nav.d.ts +96 -0
- package/packages/primitives/dist/machines/app-nav.js +12 -0
- package/packages/primitives/dist/machines/app-shell.d.ts +57 -0
- package/packages/primitives/dist/machines/app-shell.js +8 -0
- package/packages/primitives/dist/machines/async.d.ts +4 -4
- package/packages/primitives/dist/machines/content-region.d.ts +72 -0
- package/packages/primitives/dist/machines/content-region.js +8 -0
- package/packages/primitives/dist/machines/panel.d.ts +50 -0
- package/packages/primitives/dist/machines/panel.js +6 -0
- package/packages/primitives/dist/machines/sticky-bar.d.ts +62 -0
- package/packages/primitives/dist/machines/sticky-bar.js +8 -0
- package/packages/primitives/node_modules/.bin/esbuild +21 -0
- package/packages/primitives/node_modules/.bin/vite +21 -0
- package/packages/primitives/node_modules/.bin/vitest +2 -2
- package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/packages/primitives/package.json +15 -5
- package/packages/primitives/scripts/xstate-introspect.mjs +35 -0
- package/packages/primitives/src/__tests__/app-nav.test.ts +30 -0
- package/packages/primitives/src/index.ts +5 -0
- package/packages/primitives/src/machines/app-nav.ts +107 -0
- package/packages/primitives/src/machines/app-shell.ts +63 -0
- package/packages/primitives/src/machines/content-region.ts +107 -0
- package/packages/primitives/src/machines/panel.ts +71 -0
- package/packages/primitives/src/machines/sticky-bar.ts +89 -0
- package/packages/react/dist/index.d.ts +536 -17
- package/packages/react/dist/index.js +2163 -479
- package/packages/react/node_modules/.bin/esbuild +21 -0
- package/packages/react/node_modules/.bin/vite +21 -0
- package/packages/react/node_modules/.bin/vitest +2 -2
- package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/packages/react/package.json +18 -7
- package/packages/react/src/app-nav/index.tsx +249 -0
- package/packages/react/src/app-shell/index.tsx +154 -0
- package/packages/react/src/async/index.tsx +6 -1
- package/packages/react/src/async/map-content-state.ts +18 -0
- package/packages/react/src/avatar/index.tsx +23 -1
- package/packages/react/src/bar/index.tsx +101 -0
- package/packages/react/src/button/index.tsx +4 -2
- package/packages/react/src/composer/index.tsx +75 -0
- package/packages/react/src/content/index.tsx +149 -0
- package/packages/react/src/conversation/index.tsx +78 -0
- package/packages/react/src/entry/index.tsx +85 -0
- package/packages/react/src/field/index.tsx +31 -18
- package/packages/react/src/hooks/use-fit-text.ts +59 -0
- package/packages/react/src/identity/index.tsx +110 -0
- package/packages/react/src/index.ts +19 -0
- package/packages/react/src/list-row/index.tsx +80 -0
- package/packages/react/src/metric-strip/index.tsx +88 -0
- package/packages/react/src/nav/index.tsx +155 -0
- package/packages/react/src/panel/index.tsx +267 -0
- package/packages/react/src/profile-header/index.tsx +91 -0
- package/packages/react/src/prompt/index.tsx +161 -0
- package/packages/react/src/radio-group/index.tsx +19 -7
- package/packages/react/src/slider/index.tsx +3 -1
- package/packages/react/src/status-banner/index.tsx +84 -0
- package/packages/react/src/sticky-bar/index.tsx +135 -0
- package/packages/react/src/switch/index.tsx +7 -1
- package/packages/react/src/theme-switcher/index.tsx +227 -0
- package/packages/react/src/thread/index.tsx +95 -0
- package/packages/react/src/toast/primitives.tsx +2 -2
- package/packages/react/src/tooltip/tooltip.test.tsx +9 -1
- package/packages/react/tsconfig.json +2 -1
- package/packages/schemas/README.md +52 -0
- package/packages/schemas/dist/index.d.ts +287 -0
- package/packages/schemas/dist/index.js +701 -0
- package/packages/schemas/json/accordion.json +132 -0
- package/packages/schemas/json/async.json +161 -0
- package/packages/schemas/json/button.json +170 -0
- package/packages/schemas/json/catalog.json +2299 -0
- package/packages/schemas/json/checkbox.json +136 -0
- package/packages/schemas/json/combobox.json +130 -0
- package/packages/schemas/json/dialog.json +154 -0
- package/packages/schemas/json/field.json +171 -0
- package/packages/schemas/json/menu.json +138 -0
- package/packages/schemas/json/popover.json +133 -0
- package/packages/schemas/json/progress.json +137 -0
- package/packages/schemas/json/scroll.json +129 -0
- package/packages/schemas/json/select.json +140 -0
- package/packages/schemas/json/switch.json +136 -0
- package/packages/schemas/json/tabs.json +135 -0
- package/packages/schemas/json/toast.json +141 -0
- package/packages/schemas/json/tooltip.json +123 -0
- package/packages/schemas/node_modules/.bin/esbuild +21 -0
- package/packages/schemas/node_modules/.bin/jiti +21 -0
- package/packages/schemas/node_modules/.bin/tsc +21 -0
- package/packages/schemas/node_modules/.bin/tsserver +21 -0
- package/packages/schemas/node_modules/.bin/tsup +21 -0
- package/packages/schemas/node_modules/.bin/tsup-node +21 -0
- package/packages/schemas/node_modules/.bin/tsx +21 -0
- package/packages/schemas/node_modules/.bin/vite +21 -0
- package/packages/schemas/node_modules/.bin/vitest +21 -0
- package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/packages/schemas/package.json +56 -0
- package/packages/schemas/prompts/cursorrules.md +64 -0
- package/packages/schemas/prompts/statecharts.md +31 -0
- package/packages/schemas/prompts/system.md +30 -0
- package/packages/schemas/registry/catalog.json +54 -0
- package/packages/schemas/registry/components/accordion.json +132 -0
- package/packages/schemas/registry/components/async.json +161 -0
- package/packages/schemas/registry/components/button.json +170 -0
- package/packages/schemas/registry/components/checkbox.json +136 -0
- package/packages/schemas/registry/components/combobox.json +130 -0
- package/packages/schemas/registry/components/dialog.json +154 -0
- package/packages/schemas/registry/components/field.json +171 -0
- package/packages/schemas/registry/components/menu.json +138 -0
- package/packages/schemas/registry/components/popover.json +133 -0
- package/packages/schemas/registry/components/progress.json +137 -0
- package/packages/schemas/registry/components/scroll.json +129 -0
- package/packages/schemas/registry/components/select.json +140 -0
- package/packages/schemas/registry/components/switch.json +136 -0
- package/packages/schemas/registry/components/tabs.json +135 -0
- package/packages/schemas/registry/components/toast.json +141 -0
- package/packages/schemas/registry/components/tooltip.json +123 -0
- package/packages/schemas/registry/machines/async.json +219 -0
- package/packages/schemas/registry/machines/buttonLifecycle.json +224 -0
- package/packages/schemas/registry/machines/dialog.json +143 -0
- package/packages/schemas/registry/machines/field.json +275 -0
- package/packages/schemas/scripts/emit.ts +61 -0
- package/packages/schemas/src/aeon-to-schema.test.ts +70 -0
- package/packages/schemas/src/aeon-to-schema.ts +206 -0
- package/packages/schemas/src/agent-bridge.ts +82 -0
- package/packages/schemas/src/components.ts +307 -0
- package/packages/schemas/src/index.test.ts +25 -0
- package/packages/schemas/src/index.ts +25 -0
- package/packages/schemas/src/prompts.ts +121 -0
- package/packages/schemas/src/registry.ts +73 -0
- package/packages/schemas/src/schema-builder.ts +87 -0
- package/packages/schemas/tsconfig.json +9 -0
- package/packages/solid/package.json +2 -2
- package/packages/svelte/node_modules/.bin/esbuild +21 -0
- package/packages/svelte/node_modules/.bin/vite +4 -4
- package/packages/svelte/package.json +15 -5
- package/packages/ui/README.md +19 -6
- package/packages/ui/dist/index.d.ts +254 -9
- package/packages/ui/dist/index.js +690 -139
- package/packages/ui/src/app-nav.tsx +2 -0
- package/packages/ui/src/app-shell.tsx +44 -0
- package/packages/ui/src/async.tsx +2 -1
- package/packages/ui/src/avatar.tsx +35 -0
- package/packages/ui/src/bar.tsx +34 -0
- package/packages/ui/src/composer.tsx +27 -0
- package/packages/ui/src/content.tsx +43 -0
- package/packages/ui/src/conversation.tsx +43 -0
- package/packages/ui/src/entry.tsx +76 -0
- package/packages/ui/src/field.tsx +5 -0
- package/packages/ui/src/identity.tsx +35 -0
- package/packages/ui/src/index.ts +20 -0
- package/packages/ui/src/list-row.tsx +30 -0
- package/packages/ui/src/metric-strip.tsx +29 -0
- package/packages/ui/src/nav.tsx +46 -0
- package/packages/ui/src/panel.tsx +39 -0
- package/packages/ui/src/profile-header.tsx +35 -0
- package/packages/ui/src/prompt.tsx +29 -0
- package/packages/ui/src/status-banner.tsx +1 -0
- package/packages/ui/src/sticky-bar.tsx +42 -0
- package/packages/ui/src/switch.tsx +17 -4
- package/packages/ui/src/theme-switcher.tsx +41 -0
- package/packages/ui/src/thread.tsx +35 -0
- package/packages/vue/package.json +3 -3
- package/scripts/vite-aliases.mjs +65 -3
- package/scripts/xstate-introspect.mjs +68 -0
- package/packages/react/src/async/legacy-region.tsx +0 -38
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,38 @@ All notable changes to **aeon-ui-engine** are documented here.
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.2.0] - 2026-07-30
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Brand palette bridge** — `applyBrandPalette`, `normalizeBrandPalette`, `brandPaletteToCssText` map product tokens onto Aeon CSS vars without a parallel token sheet.
|
|
13
|
+
- **AppNav** — `appNavMachine` + `AppNav` / `useAppNavMachine` for section + detail stack navigation with breadcrumb/back parts.
|
|
14
|
+
- **Prompt** — confirm/permission-style compound on top of Dialog (`eyebrow`, `meta`, `amount`, `actions`).
|
|
15
|
+
- **StatusBanner** — non-blocking top-of-app notice compound.
|
|
16
|
+
- **`useFitText`** — shrink-to-fit metric/title helper.
|
|
17
|
+
- **Consumer shell CSS** — baseline Prompt / StatusBanner / AppNav styles in `aeon.css`.
|
|
18
|
+
- **Electron chrome CSS** — optional `@aeon-ui/panda/electron.css` titlebar drag helpers.
|
|
19
|
+
- Docs: [PRODUCT_SHELL.md](./docs/PRODUCT_SHELL.md).
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Avatar root also projects `ready` alongside `loaded` for friendlier product CSS.
|
|
24
|
+
- `aeonUiVitePlugin` aliases include consumer-shell and electron CSS paths.
|
|
25
|
+
|
|
26
|
+
## [1.1.0] - 2026-07-30
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- App-shell and layout primitives: Panel, Nav, StickyBar, ListRow, MetricStrip, ProfileHeader.
|
|
31
|
+
- Messaging / conversation surfaces: Entry, Field updates, Thread, Identity.
|
|
32
|
+
- ThemeSwitcher and expanded Instant / compose demo tooling.
|
|
33
|
+
- Schema catalog and generative compose improvements for chart-first Instant projection.
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Instant runs as a two-pass chart→faces compiler with real XState.
|
|
38
|
+
- Demo landing and builder aligned to state-first UX and per-page statecharts.
|
|
39
|
+
|
|
8
40
|
## [1.0.3] - 2026-06-02
|
|
9
41
|
|
|
10
42
|
### Added
|
|
@@ -45,6 +77,8 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
45
77
|
|
|
46
78
|
- Initial npm release of **aeon-ui-engine** — monorepo bundle with headless statechart primitives, React bindings, Panda styled layer, and themes.
|
|
47
79
|
|
|
80
|
+
[1.2.0]: https://github.com/GenericCPU/aeon-ui/compare/v1.1.0...v1.2.0
|
|
81
|
+
[1.1.0]: https://github.com/GenericCPU/aeon-ui/compare/v1.0.3...v1.1.0
|
|
48
82
|
[1.0.3]: https://github.com/GenericCPU/aeon-ui/compare/v1.0.2...v1.0.3
|
|
49
83
|
[1.0.2]: https://github.com/GenericCPU/aeon-ui/compare/v1.0.1...v1.0.2
|
|
50
84
|
[1.0.1]: https://github.com/GenericCPU/aeon-ui/compare/v1.0.0...v1.0.1
|
package/CONSUMER.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Using `aeon-ui-engine` from npm
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
One package. One plugin. Done.
|
|
4
4
|
|
|
5
5
|
## 1. Install
|
|
6
6
|
|
|
@@ -8,79 +8,121 @@ The npm package **`aeon-ui-engine`** ships the full `@aeon-ui/*` workspace (sour
|
|
|
8
8
|
npm install aeon-ui-engine react react-dom xstate @xstate/react
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## 2. Vite aliases (required)
|
|
14
|
-
|
|
15
|
-
`@aeon-ui/*` imports resolve through aliases bundled with the engine:
|
|
11
|
+
## 2. Vite plugin
|
|
16
12
|
|
|
17
13
|
```ts
|
|
18
14
|
// vite.config.ts
|
|
19
15
|
import react from '@vitejs/plugin-react'
|
|
20
16
|
import { defineConfig } from 'vite'
|
|
21
|
-
import {
|
|
17
|
+
import { aeonUiVitePlugin } from 'aeon-ui-engine/vite'
|
|
22
18
|
|
|
23
19
|
export default defineConfig({
|
|
24
|
-
plugins: [react()],
|
|
25
|
-
resolve: {
|
|
26
|
-
alias: aeonUiViteAliases(),
|
|
27
|
-
},
|
|
28
|
-
optimizeDeps: aeonUiOptimizeDeps(),
|
|
20
|
+
plugins: [react(), aeonUiVitePlugin()],
|
|
29
21
|
})
|
|
30
22
|
```
|
|
31
23
|
|
|
32
|
-
|
|
24
|
+
## 3. Import CSS (one line)
|
|
33
25
|
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
```tsx
|
|
27
|
+
// main.tsx or app entry
|
|
28
|
+
import 'aeon-ui-engine/aeon.css'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 4. Use components
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
import { Button, Dialog, Menu, Toast } from '@aeon-ui/ui'
|
|
37
35
|
```
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
That's it. The plugin handles all `@aeon-ui/*` aliases, TypeScript paths, and optimizeDeps.
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Optional: TypeScript
|
|
42
|
+
|
|
43
|
+
If your tsconfig doesn't extend the engine base:
|
|
42
44
|
|
|
43
45
|
```json
|
|
44
46
|
{
|
|
45
|
-
"extends": "../node_modules/aeon-ui-engine/tsconfig.base.json",
|
|
46
47
|
"compilerOptions": {
|
|
47
48
|
"paths": {
|
|
48
|
-
"@aeon-ui
|
|
49
|
-
"@aeon-ui/primitives": ["../node_modules/aeon-ui-engine/packages/primitives/src/index.ts"],
|
|
50
|
-
"@aeon-ui/react": ["../node_modules/aeon-ui-engine/packages/react/src/index.ts"],
|
|
51
|
-
"@aeon-ui/ui": ["../node_modules/aeon-ui-engine/packages/ui/src/index.ts"],
|
|
52
|
-
"@aeon-ui/surface": ["../node_modules/aeon-ui-engine/packages/surface/src/index.ts"],
|
|
53
|
-
"@aeon-ui/panda/styled-system/css": [
|
|
54
|
-
"../node_modules/aeon-ui-engine/packages/panda/styled-system/css/index.d.ts"
|
|
55
|
-
],
|
|
56
|
-
"@aeon-ui/panda/styled-system/recipes": [
|
|
57
|
-
"../node_modules/aeon-ui-engine/packages/panda/styled-system/recipes/index.d.ts"
|
|
58
|
-
]
|
|
49
|
+
"@aeon-ui/*": ["./node_modules/aeon-ui-engine/packages/*/src"]
|
|
59
50
|
}
|
|
60
51
|
}
|
|
61
52
|
}
|
|
62
53
|
```
|
|
63
54
|
|
|
64
|
-
|
|
55
|
+
Or extend directly:
|
|
65
56
|
|
|
66
|
-
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"extends": "aeon-ui-engine/tsconfig.base.json"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Optional: Brand palette (skip catalog themes)
|
|
64
|
+
|
|
65
|
+
If your product already has tokens, map them onto Aeon CSS vars once at boot:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { applyBrandPalette } from '@aeon-ui/core'
|
|
69
|
+
|
|
70
|
+
applyBrandPalette(
|
|
71
|
+
{
|
|
72
|
+
bg: '#000000',
|
|
73
|
+
surface: '#0a0a0a',
|
|
74
|
+
border: '#262626',
|
|
75
|
+
text: '#fafafa',
|
|
76
|
+
muted: '#a1a1aa',
|
|
77
|
+
accent: '#57ff97',
|
|
78
|
+
font: "'Archivo', system-ui, sans-serif",
|
|
79
|
+
},
|
|
80
|
+
{ mode: 'dark' },
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then use `@aeon-ui/ui` without maintaining a parallel `--product-*` token sheet
|
|
85
|
+
for Aeon components. See [docs/PRODUCT_SHELL.md](./docs/PRODUCT_SHELL.md).
|
|
86
|
+
|
|
87
|
+
## Optional: Product shell compounds
|
|
67
88
|
|
|
68
89
|
```tsx
|
|
69
|
-
import '@aeon-ui/
|
|
70
|
-
|
|
90
|
+
import { AppNav, Prompt, StatusBanner, AppShell } from '@aeon-ui/ui'
|
|
91
|
+
|
|
92
|
+
// Section + detail stack (replaces ad-hoc nav stores)
|
|
93
|
+
<AppNav.Root defaultSection="home">...</AppNav.Root>
|
|
94
|
+
|
|
95
|
+
// Confirm / permission style dialog (portal + focus trap via Dialog)
|
|
96
|
+
<Prompt.Root open={open} status="pending">...</Prompt.Root>
|
|
97
|
+
|
|
98
|
+
// Non-blocking top banner (updates, sync, offline)
|
|
99
|
+
<StatusBanner.Root status="ready">...</StatusBanner.Root>
|
|
71
100
|
```
|
|
72
101
|
|
|
73
|
-
|
|
102
|
+
Electron titlebar helpers (drag regions, traffic-light padding):
|
|
74
103
|
|
|
75
|
-
|
|
104
|
+
```ts
|
|
105
|
+
import '@aeon-ui/panda/electron.css'
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Optional: Headless only
|
|
109
|
+
|
|
110
|
+
Skip the styled layer and import headless components directly:
|
|
76
111
|
|
|
77
112
|
```tsx
|
|
78
|
-
import {
|
|
79
|
-
import { useAeonMachine } from '@aeon-ui/react'
|
|
113
|
+
import { Menu, Dialog, useAeonMachine } from '@aeon-ui/react'
|
|
80
114
|
```
|
|
81
115
|
|
|
82
|
-
|
|
116
|
+
Style with any CSS system using `data-aeon-scope`, `data-aeon-part`, `data-aeon-state` attributes.
|
|
117
|
+
|
|
118
|
+
## Optional: Local monorepo
|
|
119
|
+
|
|
120
|
+
Point the plugin at a local checkout:
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
aeonUiVitePlugin({ packagesRoot: '/path/to/aeon-ui/packages' })
|
|
124
|
+
```
|
|
83
125
|
|
|
84
126
|
## Reference consumer
|
|
85
127
|
|
|
86
|
-
|
|
128
|
+
[Casino-games](https://github.com/GenericCPU/Casino-games) uses this exact pattern.
|
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Aeon UI
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Statechart-driven UI — clear for humans, precise for agents.**
|
|
4
4
|
|
|
5
5
|
**State is defined first. UI represents the totality of that definition.**
|
|
6
6
|
|
|
7
|
-
> **Coding agents:** read **[AGENTS.md](./AGENTS.md)** first, then [docs/INDEX.md](./docs/INDEX.md). Human overview below.
|
|
7
|
+
> **Coding agents:** read **[AGENTS.md](./AGENTS.md)** first, then [docs/AI.md](./docs/AI.md) and [docs/INDEX.md](./docs/INDEX.md). Human overview below.
|
|
8
8
|
|
|
9
|
-
Aeon UI models interactive behavior as executable [statecharts](https://www.theseus.fi/bitstream/handle/10024/334118/Thanh_Nguyen.pdf?sequence=2&isAllowed=y), exposes production-ready headless compound components, and ships a styled layer powered by **[Panda CSS](https://panda-css.com)** slot recipes aligned with `@aeon-ui/core` anatomy. Every primitive projects a full machine snapshot onto the DOM — structure, copy, and `data-aeon-state` stay in sync.
|
|
9
|
+
Aeon UI models interactive behavior as executable [statecharts](https://www.theseus.fi/bitstream/handle/10024/334118/Thanh_Nguyen.pdf?sequence=2&isAllowed=y), publishes **deterministic JSON schemas** for Generative UI, exposes production-ready headless compound components, and ships a styled layer powered by **[Panda CSS](https://panda-css.com)** slot recipes aligned with `@aeon-ui/core` anatomy. Every primitive projects a full machine snapshot onto the DOM — structure, copy, and `data-aeon-state` stay in sync.
|
|
10
10
|
|
|
11
11
|
## Packages
|
|
12
12
|
|
|
@@ -15,6 +15,8 @@ Aeon UI models interactive behavior as executable [statecharts](https://www.thes
|
|
|
15
15
|
| `@aeon-ui/core` | Anatomy tokens, `data-aeon-*` attributes, machine helpers |
|
|
16
16
|
| `@aeon-ui/primitives` | XState machines (toggle, dialog, tabs, accordion, async, button lifecycle, field) |
|
|
17
17
|
| `@aeon-ui/react` | React headless bindings |
|
|
18
|
+
| `@aeon-ui/schemas` | JSON Schema catalog + agent system prompts |
|
|
19
|
+
| `@aeon-ui/cli` | `npx aeon-ui init` — Cursor rules, schemas, starter |
|
|
18
20
|
| `@aeon-ui/panda` | Design tokens, `defineSlotRecipe` styles, generated `styled-system` |
|
|
19
21
|
| `@aeon-ui/ui` | Styled components (`aeonButton`, `aeonAccordion`, …) |
|
|
20
22
|
| `@aeon-ui/vue` | Vue 3 headless adapter (v0.1: Switch + `useAeonMachine`) |
|
|
@@ -25,24 +27,34 @@ Aeon UI models interactive behavior as executable [statecharts](https://www.thes
|
|
|
25
27
|
|
|
26
28
|
## Quick start
|
|
27
29
|
|
|
30
|
+
Teach an AI agent first (optional but recommended):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npx aeon-ui init
|
|
34
|
+
```
|
|
35
|
+
|
|
28
36
|
The monorepo is published on npm as **`aeon-ui-engine`** (bundles all `@aeon-ui/*` workspace packages):
|
|
29
37
|
|
|
30
38
|
```bash
|
|
31
39
|
npm install aeon-ui-engine react react-dom xstate @xstate/react
|
|
32
40
|
```
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
Add the Vite plugin and import CSS:
|
|
35
43
|
|
|
36
44
|
```ts
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
// vite.config.ts
|
|
46
|
+
import { aeonUiVitePlugin } from 'aeon-ui-engine/vite'
|
|
39
47
|
export default defineConfig({
|
|
40
|
-
|
|
41
|
-
optimizeDeps: aeonUiOptimizeDeps(),
|
|
48
|
+
plugins: [react(), aeonUiVitePlugin()],
|
|
42
49
|
})
|
|
43
50
|
```
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
```tsx
|
|
53
|
+
// main.tsx
|
|
54
|
+
import 'aeon-ui-engine/aeon.css'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Full setup guide: **[CONSUMER.md](./CONSUMER.md)**.
|
|
46
58
|
|
|
47
59
|
Open [https://github.com/GenericCPU/aeon-ui](https://github.com/GenericCPU/aeon-ui) for the repo. The marketing demo lives at [https://aeon-ui.com](https://aeon-ui.com) — set `VITE_SITE_ORIGIN` to that origin in Vercel so Open Graph previews resolve the social image in `apps/demo/public/` correctly.
|
|
48
60
|
|
|
@@ -122,20 +134,39 @@ Read [PHILOSOPHY.md](./PHILOSOPHY.md) and **[STATES.md](./STATES.md)** — gaps
|
|
|
122
134
|
|
|
123
135
|
**UI = f(state).** Define every stable condition in the chart; build UI that expresses the whole definition, not a fragment of it.
|
|
124
136
|
|
|
125
|
-
### Async region (
|
|
137
|
+
### Async region (Content faces)
|
|
126
138
|
|
|
127
139
|
```tsx
|
|
128
|
-
import { Async, Button } from '@aeon-ui/ui'
|
|
140
|
+
import { Async, Content, Button, Progress } from '@aeon-ui/ui'
|
|
141
|
+
import { asyncStatusToContentState, useAsyncContext } from '@aeon-ui/react'
|
|
142
|
+
|
|
143
|
+
function AsyncSurface() {
|
|
144
|
+
const { status, send } = useAsyncContext()
|
|
145
|
+
return (
|
|
146
|
+
<Content.Root state={asyncStatusToContentState(status)} align="center">
|
|
147
|
+
<Content.Pending>
|
|
148
|
+
<Progress.Root indeterminate>
|
|
149
|
+
<Progress.Track>
|
|
150
|
+
<Progress.Range />
|
|
151
|
+
</Progress.Track>
|
|
152
|
+
</Progress.Root>
|
|
153
|
+
</Content.Pending>
|
|
154
|
+
<Content.Empty>Nothing here</Content.Empty>
|
|
155
|
+
<Content.Error>Failed</Content.Error>
|
|
156
|
+
<Content.Success>Done</Content.Success>
|
|
157
|
+
{status === 'idle' ? <Content.Body>Ready when you are</Content.Body> : null}
|
|
158
|
+
<Button.Root onClick={() => send({ type: 'FETCH' })}>Load</Button.Root>
|
|
159
|
+
</Content.Root>
|
|
160
|
+
)
|
|
161
|
+
}
|
|
129
162
|
|
|
130
163
|
<Async.Root>
|
|
131
|
-
<
|
|
132
|
-
<Async.Readout>Ready when you are</Async.Readout>
|
|
133
|
-
<Async.Actions>
|
|
134
|
-
<Button.Root size="sm">Fetch</Button.Root>
|
|
135
|
-
</Async.Actions>
|
|
164
|
+
<AsyncSurface />
|
|
136
165
|
</Async.Root>
|
|
137
166
|
```
|
|
138
167
|
|
|
168
|
+
See [docs/PRIMITIVE_COVERAGE.md](./docs/PRIMITIVE_COVERAGE.md).
|
|
169
|
+
|
|
139
170
|
## Example
|
|
140
171
|
|
|
141
172
|
```tsx
|
package/package.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aeon-ui-engine",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"aeon-ui": "./packages/cli/dist/bin.js"
|
|
8
|
+
},
|
|
6
9
|
"exports": {
|
|
7
10
|
"./vite": "./scripts/vite-aliases.mjs",
|
|
11
|
+
"./aeon.css": "./packages/panda/aeon.css",
|
|
8
12
|
"./tsconfig.base.json": "./tsconfig.base.json",
|
|
9
|
-
"./CONSUMER.md": "./CONSUMER.md"
|
|
13
|
+
"./CONSUMER.md": "./CONSUMER.md",
|
|
14
|
+
"./schemas": "./packages/schemas/dist/index.js",
|
|
15
|
+
"./schemas/catalog.json": "./packages/schemas/json/catalog.json"
|
|
10
16
|
},
|
|
11
17
|
"files": [
|
|
12
18
|
"packages",
|
|
@@ -23,6 +29,7 @@
|
|
|
23
29
|
"build:headless": "pnpm --filter @aeon-ui/core --filter @aeon-ui/primitives --filter @aeon-ui/react run build",
|
|
24
30
|
"codegen": "pnpm --filter @aeon-ui/panda codegen",
|
|
25
31
|
"dev": "pnpm --filter @aeon-ui/demo dev",
|
|
32
|
+
"examples": "pnpm --filter @aeon-ui/examples dev",
|
|
26
33
|
"typecheck": "pnpm -r run typecheck",
|
|
27
34
|
"test": "pnpm run test:headless",
|
|
28
35
|
"test:headless": "pnpm run build:headless && pnpm --filter @aeon-ui/core --filter @aeon-ui/primitives --filter @aeon-ui/react run test",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @aeon-ui/cli
|
|
2
|
+
|
|
3
|
+
AI-optimized CLI for Aeon UI.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx aeon-ui init
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Injects:
|
|
10
|
+
|
|
11
|
+
- `.cursor/rules/aeon-ui.mdc` — always-on Cursor rule
|
|
12
|
+
- `aeon.cursorrules.md` / `aeon.system-prompt.md` — paste into any agent
|
|
13
|
+
- `aeon.schemas/` — deterministic JSON schemas per component
|
|
14
|
+
- `src/components/AeonStarter.tsx` — minimal Field + Button + Async scaffold
|
|
15
|
+
- `AEON_AI.md` — next steps
|
|
16
|
+
|
|
17
|
+
Use `--force` to overwrite.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
initAeon
|
|
4
|
+
} from "./chunk-IW5NT2Z2.js";
|
|
5
|
+
|
|
6
|
+
// src/bin.ts
|
|
7
|
+
var args = process.argv.slice(2);
|
|
8
|
+
var cmd = args[0] ?? "help";
|
|
9
|
+
var force = args.includes("--force") || args.includes("-f");
|
|
10
|
+
function help() {
|
|
11
|
+
console.log(`aeon-ui \u2014 AI-optimized CLI for Aeon UI
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
npx aeon-ui init [--force]
|
|
15
|
+
|
|
16
|
+
Commands:
|
|
17
|
+
init Inject Cursor rules, JSON schemas, system prompt, and a starter component
|
|
18
|
+
help Show this message
|
|
19
|
+
|
|
20
|
+
Options:
|
|
21
|
+
--force, -f Overwrite existing generated files
|
|
22
|
+
`);
|
|
23
|
+
}
|
|
24
|
+
if (cmd === "init") {
|
|
25
|
+
const result = initAeon({ force });
|
|
26
|
+
console.log(`Aeon UI init \u2192 ${result.cwd}`);
|
|
27
|
+
for (const line of result.written) console.log(` ${line}`);
|
|
28
|
+
console.log("\nNext: npm install aeon-ui-engine react react-dom xstate @xstate/react");
|
|
29
|
+
console.log("Docs: AEON_AI.md \xB7 paste aeon.cursorrules.md into your agent system prompt");
|
|
30
|
+
} else {
|
|
31
|
+
help();
|
|
32
|
+
if (cmd !== "help" && cmd !== "--help" && cmd !== "-h") {
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// src/init.ts
|
|
2
|
+
import { mkdirSync, writeFileSync, existsSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import {
|
|
5
|
+
CURSOR_RULES_SNIPPET,
|
|
6
|
+
AEON_SYSTEM_PROMPT,
|
|
7
|
+
catalog,
|
|
8
|
+
componentSchemas
|
|
9
|
+
} from "@aeon-ui/schemas";
|
|
10
|
+
var STARTER = `/**
|
|
11
|
+
* Aeon UI starter \u2014 generated by \`npx aeon-ui init\`
|
|
12
|
+
* Headless: @aeon-ui/react \xB7 Styled: @aeon-ui/ui \xB7 Schemas: @aeon-ui/schemas
|
|
13
|
+
*/
|
|
14
|
+
import { Button, Field } from '@aeon-ui/ui'
|
|
15
|
+
|
|
16
|
+
export function AeonStarter() {
|
|
17
|
+
return (
|
|
18
|
+
<div>
|
|
19
|
+
<Field.Root>
|
|
20
|
+
<Field.Label>Email</Field.Label>
|
|
21
|
+
<Field.Control type="email" placeholder="you@example.com" />
|
|
22
|
+
<Field.Message />
|
|
23
|
+
</Field.Root>
|
|
24
|
+
<Button.Root status="idle">Continue</Button.Root>
|
|
25
|
+
</div>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
function initAeon(options = {}) {
|
|
30
|
+
const cwd = options.cwd ?? process.cwd();
|
|
31
|
+
const force = options.force ?? false;
|
|
32
|
+
const written = [];
|
|
33
|
+
const write = (rel, body) => {
|
|
34
|
+
const path = join(cwd, rel);
|
|
35
|
+
if (existsSync(path) && !force) {
|
|
36
|
+
written.push(`skip ${rel} (exists)`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
40
|
+
writeFileSync(path, body.endsWith("\n") ? body : `${body}
|
|
41
|
+
`);
|
|
42
|
+
written.push(`write ${rel}`);
|
|
43
|
+
};
|
|
44
|
+
write(".cursor/rules/aeon-ui.mdc", `---
|
|
45
|
+
description: Aeon UI \u2014 statechart-driven components for AI agents
|
|
46
|
+
globs: **/*.{tsx,ts,jsx,js}
|
|
47
|
+
alwaysApply: true
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
${CURSOR_RULES_SNIPPET.trim()}
|
|
51
|
+
`);
|
|
52
|
+
write("aeon.cursorrules.md", `${CURSOR_RULES_SNIPPET.trim()}
|
|
53
|
+
`);
|
|
54
|
+
write("aeon.system-prompt.md", `${AEON_SYSTEM_PROMPT.trim()}
|
|
55
|
+
`);
|
|
56
|
+
write(
|
|
57
|
+
"aeon.schemas/catalog.json",
|
|
58
|
+
`${JSON.stringify(
|
|
59
|
+
{
|
|
60
|
+
$id: catalog.$id,
|
|
61
|
+
title: catalog.title,
|
|
62
|
+
description: catalog.description,
|
|
63
|
+
version: catalog.version,
|
|
64
|
+
principle: catalog.principle,
|
|
65
|
+
attributes: catalog.attributes,
|
|
66
|
+
components: catalog.components,
|
|
67
|
+
note: "Full schemas live under aeon.schemas/components/*.json"
|
|
68
|
+
},
|
|
69
|
+
null,
|
|
70
|
+
2
|
|
71
|
+
)}
|
|
72
|
+
`
|
|
73
|
+
);
|
|
74
|
+
for (const [id, schema] of Object.entries(componentSchemas)) {
|
|
75
|
+
write(`aeon.schemas/components/${id}.json`, `${JSON.stringify(schema, null, 2)}
|
|
76
|
+
`);
|
|
77
|
+
}
|
|
78
|
+
write("src/components/AeonStarter.tsx", STARTER);
|
|
79
|
+
write(
|
|
80
|
+
"AEON_AI.md",
|
|
81
|
+
`# Aeon UI \u2014 AI agent setup
|
|
82
|
+
|
|
83
|
+
Generated by \`npx aeon-ui init\`.
|
|
84
|
+
|
|
85
|
+
## Next steps
|
|
86
|
+
|
|
87
|
+
1. Install: \`npm install aeon-ui-engine react react-dom xstate @xstate/react\`
|
|
88
|
+
2. CSS: \`import 'aeon-ui-engine/aeon.css'\`
|
|
89
|
+
3. Vite: add \`aeonUiVitePlugin()\` from \`aeon-ui-engine/vite\`
|
|
90
|
+
4. Paste \`aeon.cursorrules.md\` into Cursor rules / system prompt (already mirrored to \`.cursor/rules/aeon-ui.mdc\`)
|
|
91
|
+
5. Constrain generation with JSON under \`aeon.schemas/\`
|
|
92
|
+
|
|
93
|
+
## Principle
|
|
94
|
+
|
|
95
|
+
**UI = f(state)** \u2014 never invent boolean combinations for states the schema does not list.
|
|
96
|
+
`
|
|
97
|
+
);
|
|
98
|
+
return { cwd, written };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export {
|
|
102
|
+
initAeon
|
|
103
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/jiti@2.7.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-cli.mjs" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../../../../node_modules/.pnpm/jiti@2.7.0/node_modules/jiti/lib/jiti-cli.mjs" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsc" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsserver" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/dist/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules/tsup/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.15_tsx@4.22.3_typescript@5.9.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../tsup/dist/cli-default.js" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../tsup/dist/cli-default.js" "$@"
|
|
21
|
+
fi
|