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.
- package/.changeset/README.md +23 -0
- package/.changeset/combobox-and-changesets.md +9 -0
- package/.changeset/config.json +30 -0
- package/.changeset/framework-adapters.md +12 -0
- package/.changeset/scene-3d.md +6 -0
- package/.changeset/scene-plane.md +8 -0
- package/.changeset/site-og.md +5 -0
- package/.cursor/rules/aeon-ui.mdc +22 -0
- package/ACCESSIBILITY.md +32 -0
- package/AGENTS.md +226 -0
- package/COMPONENTS.md +36 -0
- package/FRAMEWORKS.md +57 -0
- package/INTEGRATION.md +89 -0
- package/LICENSE +21 -0
- package/PHILOSOPHY.md +71 -0
- package/PUBLISHING.md +85 -0
- package/README.md +154 -0
- package/SCENE.md +113 -0
- package/STATES.md +243 -0
- package/apps/demo/index.html +31 -0
- package/apps/demo/og.config.mjs +15 -0
- package/apps/demo/package.json +41 -0
- package/apps/demo/public/favicon.svg +16 -0
- package/apps/demo/public/og.png +0 -0
- package/apps/demo/public/og.svg +35 -0
- package/apps/demo/scripts/generate-og-png.mjs +60 -0
- package/apps/demo/src/App.tsx +31 -0
- package/apps/demo/src/aeonDiagrams.ts +100 -0
- package/apps/demo/src/app.css +16 -0
- package/apps/demo/src/components/ActionCluster.tsx +20 -0
- package/apps/demo/src/components/AsyncMachineDemo.tsx +97 -0
- package/apps/demo/src/components/ButtonLifecycleDemo.tsx +63 -0
- package/apps/demo/src/components/CodeExample.tsx +7 -0
- package/apps/demo/src/components/ComboboxDemo.tsx +30 -0
- package/apps/demo/src/components/DiagramsSection.tsx +38 -0
- package/apps/demo/src/components/FieldStateDemo.tsx +51 -0
- package/apps/demo/src/components/GridMesh.tsx +8 -0
- package/apps/demo/src/components/HeroInstall.tsx +10 -0
- package/apps/demo/src/components/LandingFaq.tsx +29 -0
- package/apps/demo/src/components/LandingFooter.tsx +22 -0
- package/apps/demo/src/components/LandingHeader.tsx +60 -0
- package/apps/demo/src/components/LandingHero.tsx +55 -0
- package/apps/demo/src/components/LayersSection.tsx +51 -0
- package/apps/demo/src/components/MermaidDiagram.tsx +84 -0
- package/apps/demo/src/components/PhilosophySection.tsx +33 -0
- package/apps/demo/src/components/PlaygroundBlock.tsx +23 -0
- package/apps/demo/src/components/PlaygroundSection.tsx +204 -0
- package/apps/demo/src/components/SceneSection.tsx +157 -0
- package/apps/demo/src/components/ScrollRegionDemo.tsx +74 -0
- package/apps/demo/src/components/ThemeSwitcher.tsx +76 -0
- package/apps/demo/src/demo-layout.css +264 -0
- package/apps/demo/src/landing.css +1094 -0
- package/apps/demo/src/main.tsx +14 -0
- package/apps/demo/src/nav.ts +9 -0
- package/apps/demo/src/site.ts +347 -0
- package/apps/demo/tsconfig.json +17 -0
- package/apps/demo/vite-plugins/og-meta.ts +30 -0
- package/apps/demo/vite.config.ts +69 -0
- package/docs/API_PATTERNS.md +234 -0
- package/docs/ARCHITECTURE.md +125 -0
- package/docs/COMPONENT_CHECKLIST.md +103 -0
- package/docs/FILE_MAP.md +122 -0
- package/docs/GLOSSARY.md +125 -0
- package/docs/INDEX.md +53 -0
- package/docs/LAYOUT_COORDINATES.md +178 -0
- package/docs/MACHINES.md +166 -0
- package/docs/MIGRATION_FROM_ARK.md +295 -0
- package/docs/VITE_CONSUMER.md +114 -0
- package/package.json +25 -0
- package/packages/core/README.md +69 -0
- package/packages/core/package.json +37 -0
- package/packages/core/src/anatomy.ts +144 -0
- package/packages/core/src/attrs.ts +47 -0
- package/packages/core/src/index.ts +8 -0
- package/packages/core/src/layout.ts +176 -0
- package/packages/core/src/machine.test.ts +18 -0
- package/packages/core/src/machine.ts +15 -0
- package/packages/core/src/philosophy.ts +10 -0
- package/packages/core/src/scroll.ts +72 -0
- package/packages/core/src/theme.test.ts +14 -0
- package/packages/core/src/theme.ts +53 -0
- package/packages/core/src/types.ts +25 -0
- package/packages/core/theme-transition.css +58 -0
- package/packages/core/tsconfig.json +8 -0
- package/packages/core/vitest.config.ts +8 -0
- package/packages/geometry/README.md +7 -0
- package/packages/geometry/package.json +35 -0
- package/packages/geometry/src/index.ts +3 -0
- package/packages/geometry/src/patterns.ts +55 -0
- package/packages/geometry/src/scene-attrs.ts +11 -0
- package/packages/geometry/src/svg.ts +60 -0
- package/packages/geometry/tsconfig.json +8 -0
- package/packages/panda/README.md +66 -0
- package/packages/panda/package.json +40 -0
- package/packages/panda/panda.config.ts +229 -0
- package/packages/panda/scripts/emit-theme-runtime.ts +37 -0
- package/packages/panda/src/recipes/accordion.ts +95 -0
- package/packages/panda/src/recipes/async.ts +76 -0
- package/packages/panda/src/recipes/badge.ts +44 -0
- package/packages/panda/src/recipes/button-group.ts +33 -0
- package/packages/panda/src/recipes/button.ts +91 -0
- package/packages/panda/src/recipes/checkbox.ts +41 -0
- package/packages/panda/src/recipes/combobox.ts +121 -0
- package/packages/panda/src/recipes/dialog.ts +96 -0
- package/packages/panda/src/recipes/field-shared.ts +29 -0
- package/packages/panda/src/recipes/field.ts +72 -0
- package/packages/panda/src/recipes/floating.ts +170 -0
- package/packages/panda/src/recipes/index.ts +14 -0
- package/packages/panda/src/recipes/scroll-region.ts +55 -0
- package/packages/panda/src/recipes/select.ts +111 -0
- package/packages/panda/src/recipes/switch.ts +51 -0
- package/packages/panda/src/recipes/tabs.ts +50 -0
- package/packages/panda/src/theme/catalog-types.ts +24 -0
- package/packages/panda/src/theme/catalog.ts +73 -0
- package/packages/panda/src/theme/chrome.css +75 -0
- package/packages/panda/src/theme/global-theme-css.ts +42 -0
- package/packages/panda/src/theme/index.ts +5 -0
- package/packages/panda/src/theme/palette.ts +65 -0
- package/packages/panda/src/theme/scrollbars.css +96 -0
- package/packages/panda/src/theme/semantic-tokens.ts +17 -0
- package/packages/panda/src/theme/themes.config.ts +516 -0
- package/packages/panda/src/theme/tokens.ts +51 -0
- package/packages/panda/styled-system/css/conditions.mjs +36 -0
- package/packages/panda/styled-system/css/css.d.ts +22 -0
- package/packages/panda/styled-system/css/css.mjs +45 -0
- package/packages/panda/styled-system/css/cva.d.ts +6 -0
- package/packages/panda/styled-system/css/cva.mjs +87 -0
- package/packages/panda/styled-system/css/cx.d.ts +5 -0
- package/packages/panda/styled-system/css/cx.mjs +15 -0
- package/packages/panda/styled-system/css/index.d.ts +5 -0
- package/packages/panda/styled-system/css/index.mjs +4 -0
- package/packages/panda/styled-system/css/sva.d.ts +4 -0
- package/packages/panda/styled-system/css/sva.mjs +41 -0
- package/packages/panda/styled-system/helpers.mjs +339 -0
- package/packages/panda/styled-system/jsx/aspect-ratio.d.ts +10 -0
- package/packages/panda/styled-system/jsx/aspect-ratio.mjs +14 -0
- package/packages/panda/styled-system/jsx/bleed.d.ts +10 -0
- package/packages/panda/styled-system/jsx/bleed.mjs +14 -0
- package/packages/panda/styled-system/jsx/box.d.ts +10 -0
- package/packages/panda/styled-system/jsx/box.mjs +14 -0
- package/packages/panda/styled-system/jsx/center.d.ts +10 -0
- package/packages/panda/styled-system/jsx/center.mjs +14 -0
- package/packages/panda/styled-system/jsx/circle.d.ts +10 -0
- package/packages/panda/styled-system/jsx/circle.mjs +14 -0
- package/packages/panda/styled-system/jsx/container.d.ts +10 -0
- package/packages/panda/styled-system/jsx/container.mjs +14 -0
- package/packages/panda/styled-system/jsx/cq.d.ts +10 -0
- package/packages/panda/styled-system/jsx/cq.mjs +14 -0
- package/packages/panda/styled-system/jsx/divider.d.ts +10 -0
- package/packages/panda/styled-system/jsx/divider.mjs +14 -0
- package/packages/panda/styled-system/jsx/factory-helper.mjs +22 -0
- package/packages/panda/styled-system/jsx/factory.d.ts +3 -0
- package/packages/panda/styled-system/jsx/factory.mjs +80 -0
- package/packages/panda/styled-system/jsx/flex.d.ts +10 -0
- package/packages/panda/styled-system/jsx/flex.mjs +14 -0
- package/packages/panda/styled-system/jsx/float.d.ts +10 -0
- package/packages/panda/styled-system/jsx/float.mjs +14 -0
- package/packages/panda/styled-system/jsx/grid-item.d.ts +10 -0
- package/packages/panda/styled-system/jsx/grid-item.mjs +14 -0
- package/packages/panda/styled-system/jsx/grid.d.ts +10 -0
- package/packages/panda/styled-system/jsx/grid.mjs +14 -0
- package/packages/panda/styled-system/jsx/hstack.d.ts +10 -0
- package/packages/panda/styled-system/jsx/hstack.mjs +14 -0
- package/packages/panda/styled-system/jsx/index.d.ts +24 -0
- package/packages/panda/styled-system/jsx/index.mjs +22 -0
- package/packages/panda/styled-system/jsx/is-valid-prop.d.ts +11 -0
- package/packages/panda/styled-system/jsx/is-valid-prop.mjs +17 -0
- package/packages/panda/styled-system/jsx/link-overlay.d.ts +10 -0
- package/packages/panda/styled-system/jsx/link-overlay.mjs +14 -0
- package/packages/panda/styled-system/jsx/spacer.d.ts +10 -0
- package/packages/panda/styled-system/jsx/spacer.mjs +14 -0
- package/packages/panda/styled-system/jsx/square.d.ts +10 -0
- package/packages/panda/styled-system/jsx/square.mjs +14 -0
- package/packages/panda/styled-system/jsx/stack.d.ts +10 -0
- package/packages/panda/styled-system/jsx/stack.mjs +14 -0
- package/packages/panda/styled-system/jsx/visually-hidden.d.ts +10 -0
- package/packages/panda/styled-system/jsx/visually-hidden.mjs +14 -0
- package/packages/panda/styled-system/jsx/vstack.d.ts +10 -0
- package/packages/panda/styled-system/jsx/vstack.mjs +14 -0
- package/packages/panda/styled-system/jsx/wrap.d.ts +10 -0
- package/packages/panda/styled-system/jsx/wrap.mjs +14 -0
- package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +21 -0
- package/packages/panda/styled-system/patterns/aspect-ratio.mjs +38 -0
- package/packages/panda/styled-system/patterns/bleed.d.ts +22 -0
- package/packages/panda/styled-system/patterns/bleed.mjs +24 -0
- package/packages/panda/styled-system/patterns/box.d.ts +21 -0
- package/packages/panda/styled-system/patterns/box.mjs +15 -0
- package/packages/panda/styled-system/patterns/center.d.ts +21 -0
- package/packages/panda/styled-system/patterns/center.mjs +21 -0
- package/packages/panda/styled-system/patterns/circle.d.ts +21 -0
- package/packages/panda/styled-system/patterns/circle.mjs +25 -0
- package/packages/panda/styled-system/patterns/container.d.ts +21 -0
- package/packages/panda/styled-system/patterns/container.mjs +21 -0
- package/packages/panda/styled-system/patterns/cq.d.ts +22 -0
- package/packages/panda/styled-system/patterns/cq.mjs +21 -0
- package/packages/panda/styled-system/patterns/divider.d.ts +23 -0
- package/packages/panda/styled-system/patterns/divider.mjs +25 -0
- package/packages/panda/styled-system/patterns/flex.d.ts +27 -0
- package/packages/panda/styled-system/patterns/flex.mjs +26 -0
- package/packages/panda/styled-system/patterns/float.d.ts +24 -0
- package/packages/panda/styled-system/patterns/float.mjs +52 -0
- package/packages/panda/styled-system/patterns/grid-item.d.ts +26 -0
- package/packages/panda/styled-system/patterns/grid-item.mjs +25 -0
- package/packages/panda/styled-system/patterns/grid.d.ts +25 -0
- package/packages/panda/styled-system/patterns/grid.mjs +27 -0
- package/packages/panda/styled-system/patterns/hstack.d.ts +22 -0
- package/packages/panda/styled-system/patterns/hstack.mjs +24 -0
- package/packages/panda/styled-system/patterns/index.d.ts +21 -0
- package/packages/panda/styled-system/patterns/index.mjs +20 -0
- package/packages/panda/styled-system/patterns/link-overlay.d.ts +21 -0
- package/packages/panda/styled-system/patterns/link-overlay.mjs +24 -0
- package/packages/panda/styled-system/patterns/spacer.d.ts +21 -0
- package/packages/panda/styled-system/patterns/spacer.mjs +21 -0
- package/packages/panda/styled-system/patterns/square.d.ts +21 -0
- package/packages/panda/styled-system/patterns/square.mjs +24 -0
- package/packages/panda/styled-system/patterns/stack.d.ts +24 -0
- package/packages/panda/styled-system/patterns/stack.mjs +24 -0
- package/packages/panda/styled-system/patterns/visually-hidden.d.ts +21 -0
- package/packages/panda/styled-system/patterns/visually-hidden.mjs +18 -0
- package/packages/panda/styled-system/patterns/vstack.d.ts +22 -0
- package/packages/panda/styled-system/patterns/vstack.mjs +24 -0
- package/packages/panda/styled-system/patterns/wrap.d.ts +25 -0
- package/packages/panda/styled-system/patterns/wrap.mjs +25 -0
- package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +32 -0
- package/packages/panda/styled-system/recipes/aeon-accordion.mjs +48 -0
- package/packages/panda/styled-system/recipes/aeon-async.d.ts +32 -0
- package/packages/panda/styled-system/recipes/aeon-async.mjs +56 -0
- package/packages/panda/styled-system/recipes/aeon-badge.d.ts +31 -0
- package/packages/panda/styled-system/recipes/aeon-badge.mjs +32 -0
- package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +39 -0
- package/packages/panda/styled-system/recipes/aeon-button-group.mjs +37 -0
- package/packages/panda/styled-system/recipes/aeon-button.d.ts +39 -0
- package/packages/panda/styled-system/recipes/aeon-button.mjs +39 -0
- package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +48 -0
- package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +32 -0
- package/packages/panda/styled-system/recipes/aeon-combobox.mjs +52 -0
- package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-dialog.mjs +60 -0
- package/packages/panda/styled-system/recipes/aeon-field.d.ts +32 -0
- package/packages/panda/styled-system/recipes/aeon-field.mjs +52 -0
- package/packages/panda/styled-system/recipes/aeon-menu.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-menu.mjs +52 -0
- package/packages/panda/styled-system/recipes/aeon-popover.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-popover.mjs +52 -0
- package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +43 -0
- package/packages/panda/styled-system/recipes/aeon-scroll.mjs +63 -0
- package/packages/panda/styled-system/recipes/aeon-select.d.ts +32 -0
- package/packages/panda/styled-system/recipes/aeon-select.mjs +56 -0
- package/packages/panda/styled-system/recipes/aeon-switch.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-switch.mjs +48 -0
- package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-tabs.mjs +48 -0
- package/packages/panda/styled-system/recipes/aeon-toast.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-toast.mjs +48 -0
- package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +28 -0
- package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +48 -0
- package/packages/panda/styled-system/recipes/create-recipe.mjs +82 -0
- package/packages/panda/styled-system/recipes/index.d.ts +18 -0
- package/packages/panda/styled-system/recipes/index.mjs +17 -0
- package/packages/panda/styled-system/styles.css +2157 -0
- package/packages/panda/styled-system/tokens/index.d.ts +9 -0
- package/packages/panda/styled-system/tokens/index.mjs +2156 -0
- package/packages/panda/styled-system/tokens/tokens.d.ts +60 -0
- package/packages/panda/styled-system/types/composition.d.ts +164 -0
- package/packages/panda/styled-system/types/conditions.d.ts +322 -0
- package/packages/panda/styled-system/types/csstype.d.ts +21298 -0
- package/packages/panda/styled-system/types/global.d.ts +20 -0
- package/packages/panda/styled-system/types/index.d.ts +8 -0
- package/packages/panda/styled-system/types/jsx.d.ts +52 -0
- package/packages/panda/styled-system/types/parts.d.ts +8 -0
- package/packages/panda/styled-system/types/pattern.d.ts +78 -0
- package/packages/panda/styled-system/types/prop-type.d.ts +240 -0
- package/packages/panda/styled-system/types/recipe.d.ts +181 -0
- package/packages/panda/styled-system/types/selectors.d.ts +59 -0
- package/packages/panda/styled-system/types/static-css.d.ts +56 -0
- package/packages/panda/styled-system/types/style-props.d.ts +7491 -0
- package/packages/panda/styled-system/types/system-types.d.ts +193 -0
- package/packages/panda/theme-runtime.css +842 -0
- package/packages/panda/tsconfig.json +8 -0
- package/packages/primitives/README.md +54 -0
- package/packages/primitives/package.json +41 -0
- package/packages/primitives/src/__tests__/floating-surface.test.ts +29 -0
- package/packages/primitives/src/index.ts +9 -0
- package/packages/primitives/src/machines/accordion.ts +56 -0
- package/packages/primitives/src/machines/async.ts +108 -0
- package/packages/primitives/src/machines/button.ts +66 -0
- package/packages/primitives/src/machines/dialog.ts +61 -0
- package/packages/primitives/src/machines/field.ts +85 -0
- package/packages/primitives/src/machines/popover.ts +52 -0
- package/packages/primitives/src/machines/tabs.ts +46 -0
- package/packages/primitives/src/machines/toast.ts +48 -0
- package/packages/primitives/src/machines/toggle.ts +61 -0
- package/packages/primitives/tsconfig.json +8 -0
- package/packages/primitives/vitest.config.ts +8 -0
- package/packages/react/README.md +65 -0
- package/packages/react/package.json +52 -0
- package/packages/react/src/accordion/index.tsx +179 -0
- package/packages/react/src/async/actions.tsx +22 -0
- package/packages/react/src/async/context.tsx +54 -0
- package/packages/react/src/async/index.tsx +21 -0
- package/packages/react/src/async/legacy-region.tsx +38 -0
- package/packages/react/src/async/readout.tsx +34 -0
- package/packages/react/src/async/root.tsx +39 -0
- package/packages/react/src/async/track.tsx +59 -0
- package/packages/react/src/avatar/avatar.test.tsx +27 -0
- package/packages/react/src/avatar/index.tsx +122 -0
- package/packages/react/src/button/index.tsx +70 -0
- package/packages/react/src/checkbox/index.tsx +180 -0
- package/packages/react/src/combobox/index.tsx +430 -0
- package/packages/react/src/dialog/dialog.test.tsx +50 -0
- package/packages/react/src/dialog/index.tsx +275 -0
- package/packages/react/src/field/index.tsx +172 -0
- package/packages/react/src/hooks/use-aeon-machine.ts +10 -0
- package/packages/react/src/hooks/use-anchor-position.ts +33 -0
- package/packages/react/src/hooks/use-focus-trap.ts +51 -0
- package/packages/react/src/hooks/use-layout-mode.ts +22 -0
- package/packages/react/src/hooks/use-outside-click.ts +19 -0
- package/packages/react/src/hooks/use-portalled.ts +16 -0
- package/packages/react/src/hooks/use-scroll-lock.ts +13 -0
- package/packages/react/src/index.ts +18 -0
- package/packages/react/src/menu/index.tsx +195 -0
- package/packages/react/src/popover/index.tsx +191 -0
- package/packages/react/src/scroll/index.tsx +98 -0
- package/packages/react/src/scroll/use-scroll-state.ts +30 -0
- package/packages/react/src/select/index.tsx +372 -0
- package/packages/react/src/select/select.test.tsx +60 -0
- package/packages/react/src/switch/index.tsx +215 -0
- package/packages/react/src/tabs/index.tsx +140 -0
- package/packages/react/src/toast/context.tsx +28 -0
- package/packages/react/src/toast/index.tsx +20 -0
- package/packages/react/src/toast/primitives.tsx +129 -0
- package/packages/react/src/toast/provider.tsx +111 -0
- package/packages/react/src/toast/toast-item.tsx +32 -0
- package/packages/react/src/tooltip/index.tsx +191 -0
- package/packages/react/src/utils/merge-props.ts +24 -0
- package/packages/react/tsconfig.json +8 -0
- package/packages/react/vitest.config.ts +9 -0
- package/packages/react/vitest.setup.ts +5 -0
- package/packages/react-scene/README.md +11 -0
- package/packages/react-scene/package.json +47 -0
- package/packages/react-scene/scene-3d.css +37 -0
- package/packages/react-scene/scene-room.css +95 -0
- package/packages/react-scene/src/index.ts +20 -0
- package/packages/react-scene/src/procedural-grid.tsx +35 -0
- package/packages/react-scene/src/scene-layer.tsx +38 -0
- package/packages/react-scene/src/scene-plane.tsx +69 -0
- package/packages/react-scene/src/scene-room.tsx +81 -0
- package/packages/react-scene/src/scene-root.tsx +49 -0
- package/packages/react-scene/src/scene-slot.tsx +41 -0
- package/packages/react-scene/src/scene-stage.tsx +37 -0
- package/packages/react-scene/src/scene-surface.tsx +20 -0
- package/packages/react-scene/src/signal-bars.tsx +57 -0
- package/packages/react-scene/src/use-signal-visualizer.ts +103 -0
- package/packages/react-scene/tsconfig.json +8 -0
- package/packages/scene/README.md +5 -0
- package/packages/scene/package.json +32 -0
- package/packages/scene/src/index.ts +2 -0
- package/packages/scene/src/room.ts +40 -0
- package/packages/scene/src/transform.ts +60 -0
- package/packages/scene/tsconfig.json +8 -0
- package/packages/signal/README.md +9 -0
- package/packages/signal/package.json +32 -0
- package/packages/signal/src/analyser.ts +113 -0
- package/packages/signal/src/bands.ts +33 -0
- package/packages/signal/src/index.ts +3 -0
- package/packages/signal/src/motion.ts +80 -0
- package/packages/signal/tsconfig.json +8 -0
- package/packages/site/README.md +19 -0
- package/packages/site/package.json +32 -0
- package/packages/site/src/index.ts +8 -0
- package/packages/site/src/open-graph.ts +90 -0
- package/packages/site/tsconfig.json +8 -0
- package/packages/solid/README.md +30 -0
- package/packages/solid/package.json +42 -0
- package/packages/solid/src/hooks/use-aeon-machine.ts +10 -0
- package/packages/solid/src/index.ts +2 -0
- package/packages/solid/src/switch/index.tsx +191 -0
- package/packages/solid/src/utils/merge-props.ts +3 -0
- package/packages/solid/tsconfig.json +10 -0
- package/packages/surface/README.md +10 -0
- package/packages/surface/package.json +33 -0
- package/packages/surface/src/index.ts +1 -0
- package/packages/surface/src/materials.ts +14 -0
- package/packages/surface/surface.css +113 -0
- package/packages/surface/tsconfig.json +8 -0
- package/packages/svelte/README.md +45 -0
- package/packages/svelte/package.json +49 -0
- package/packages/svelte/src/Switch.svelte +86 -0
- package/packages/svelte/src/SwitchControl.svelte +45 -0
- package/packages/svelte/src/SwitchHiddenInput.svelte +12 -0
- package/packages/svelte/src/SwitchLabel.svelte +9 -0
- package/packages/svelte/src/SwitchThumb.svelte +16 -0
- package/packages/svelte/src/hooks/use-aeon-machine.ts +23 -0
- package/packages/svelte/src/index.ts +2 -0
- package/packages/svelte/src/switch-context.ts +13 -0
- package/packages/svelte/tsconfig.json +8 -0
- package/packages/ui/README.md +63 -0
- package/packages/ui/package.json +45 -0
- package/packages/ui/src/accordion.tsx +27 -0
- package/packages/ui/src/async.tsx +43 -0
- package/packages/ui/src/badge.tsx +18 -0
- package/packages/ui/src/button.tsx +38 -0
- package/packages/ui/src/checkbox.tsx +24 -0
- package/packages/ui/src/cn.ts +1 -0
- package/packages/ui/src/combobox.tsx +29 -0
- package/packages/ui/src/dialog.tsx +32 -0
- package/packages/ui/src/field.tsx +33 -0
- package/packages/ui/src/index.ts +17 -0
- package/packages/ui/src/menu.tsx +25 -0
- package/packages/ui/src/popover.tsx +22 -0
- package/packages/ui/src/scroll.tsx +51 -0
- package/packages/ui/src/select.tsx +33 -0
- package/packages/ui/src/styles.css +2 -0
- package/packages/ui/src/switch.tsx +22 -0
- package/packages/ui/src/tabs.tsx +22 -0
- package/packages/ui/src/toast.tsx +36 -0
- package/packages/ui/src/tooltip.tsx +19 -0
- package/packages/ui/tsconfig.json +12 -0
- package/packages/vue/README.md +40 -0
- package/packages/vue/package.json +42 -0
- package/packages/vue/src/hooks/use-aeon-machine.ts +10 -0
- package/packages/vue/src/index.ts +2 -0
- package/packages/vue/src/switch/index.ts +208 -0
- package/packages/vue/src/utils/part-props.ts +8 -0
- package/packages/vue/tsconfig.json +8 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/ensure-headless-built.mjs +25 -0
- package/tsconfig.base.json +21 -0
- 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,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,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,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
|
+
}
|