aeon-ui-engine 1.5.1 → 1.9.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 +140 -0
- package/package.json +6 -3
- package/packages/core/dist/index.d.ts +116 -1
- package/packages/core/dist/index.js +202 -1
- package/packages/core/src/anatomy.ts +13 -1
- package/packages/core/src/index.ts +2 -0
- package/packages/core/src/list-window.ts +149 -0
- package/packages/core/src/sound.ts +154 -0
- package/packages/panda/package.json +6 -3
- package/packages/panda/panda.config.ts +12 -0
- package/packages/panda/src/recipes/clipboard.ts +40 -0
- package/packages/panda/src/recipes/composer.ts +4 -3
- package/packages/panda/src/recipes/index.ts +4 -0
- package/packages/panda/src/recipes/prose.ts +110 -0
- package/packages/panda/src/recipes/segment-group.ts +50 -0
- package/packages/panda/src/recipes/textarea.ts +60 -0
- package/packages/panda/styled-system/css/conditions.d.ts +7 -0
- package/packages/panda/styled-system/css/conditions.js +32 -0
- package/packages/panda/styled-system/css/css.d.ts +6 -6
- package/packages/panda/styled-system/css/css.js +63 -0
- package/packages/panda/styled-system/css/cva.d.ts +2 -3
- package/packages/panda/styled-system/css/cva.js +51 -0
- package/packages/panda/styled-system/css/cx.d.ts +5 -4
- package/packages/panda/styled-system/css/{cx.mjs → cx.js} +5 -4
- package/packages/panda/styled-system/css/first-that-works.d.ts +22 -0
- package/packages/panda/styled-system/css/first-that-works.js +1 -0
- package/packages/panda/styled-system/css/index.d.ts +6 -3
- package/packages/panda/styled-system/css/index.js +8 -0
- package/packages/panda/styled-system/css/keyframes.d.ts +5 -0
- package/packages/panda/styled-system/css/keyframes.js +8 -0
- package/packages/panda/styled-system/css/position-try.d.ts +5 -0
- package/packages/panda/styled-system/css/position-try.js +11 -0
- package/packages/panda/styled-system/css/sva.d.ts +1 -2
- package/packages/panda/styled-system/css/sva.js +49 -0
- package/packages/panda/styled-system/css/view-transition.d.ts +7 -0
- package/packages/panda/styled-system/css/view-transition.js +18 -0
- package/packages/panda/styled-system/helpers.d.ts +67 -0
- package/packages/panda/styled-system/helpers.js +624 -0
- package/packages/panda/styled-system/jsx/aspect-ratio.d.ts +3 -6
- package/packages/panda/styled-system/jsx/aspect-ratio.js +11 -0
- package/packages/panda/styled-system/jsx/bleed.d.ts +4 -7
- package/packages/panda/styled-system/jsx/bleed.js +11 -0
- package/packages/panda/styled-system/jsx/box.d.ts +4 -7
- package/packages/panda/styled-system/jsx/box.js +11 -0
- package/packages/panda/styled-system/jsx/center.d.ts +4 -7
- package/packages/panda/styled-system/jsx/center.js +11 -0
- package/packages/panda/styled-system/jsx/circle.d.ts +4 -7
- package/packages/panda/styled-system/jsx/circle.js +11 -0
- package/packages/panda/styled-system/jsx/container.d.ts +4 -7
- package/packages/panda/styled-system/jsx/container.js +11 -0
- package/packages/panda/styled-system/jsx/cq.d.ts +4 -7
- package/packages/panda/styled-system/jsx/cq.js +11 -0
- package/packages/panda/styled-system/jsx/create-recipe-context.d.ts +31 -0
- package/packages/panda/styled-system/jsx/create-recipe-context.js +38 -0
- package/packages/panda/styled-system/jsx/create-slot-recipe-context.d.ts +49 -0
- package/packages/panda/styled-system/jsx/create-slot-recipe-context.js +124 -0
- package/packages/panda/styled-system/jsx/divider.d.ts +4 -7
- package/packages/panda/styled-system/jsx/divider.js +11 -0
- package/packages/panda/styled-system/jsx/factory.d.ts +2 -2
- package/packages/panda/styled-system/jsx/factory.js +91 -0
- package/packages/panda/styled-system/jsx/flex.d.ts +4 -7
- package/packages/panda/styled-system/jsx/flex.js +11 -0
- package/packages/panda/styled-system/jsx/float.d.ts +4 -7
- package/packages/panda/styled-system/jsx/float.js +11 -0
- package/packages/panda/styled-system/jsx/grid-item.d.ts +4 -7
- package/packages/panda/styled-system/jsx/grid-item.js +11 -0
- package/packages/panda/styled-system/jsx/grid.d.ts +4 -7
- package/packages/panda/styled-system/jsx/grid.js +11 -0
- package/packages/panda/styled-system/jsx/helper.d.ts +34 -0
- package/packages/panda/styled-system/jsx/helper.js +92 -0
- package/packages/panda/styled-system/jsx/hstack.d.ts +4 -7
- package/packages/panda/styled-system/jsx/hstack.js +11 -0
- package/packages/panda/styled-system/jsx/index.d.ts +17 -17
- package/packages/panda/styled-system/jsx/index.js +24 -0
- package/packages/panda/styled-system/jsx/is-valid-prop.d.ts +5 -10
- package/packages/panda/styled-system/jsx/is-valid-prop.js +12 -0
- package/packages/panda/styled-system/jsx/link-overlay.d.ts +4 -7
- package/packages/panda/styled-system/jsx/link-overlay.js +11 -0
- package/packages/panda/styled-system/jsx/spacer.d.ts +4 -7
- package/packages/panda/styled-system/jsx/spacer.js +11 -0
- package/packages/panda/styled-system/jsx/square.d.ts +4 -7
- package/packages/panda/styled-system/jsx/square.js +11 -0
- package/packages/panda/styled-system/jsx/stack.d.ts +4 -7
- package/packages/panda/styled-system/jsx/stack.js +11 -0
- package/packages/panda/styled-system/jsx/visually-hidden.d.ts +4 -7
- package/packages/panda/styled-system/jsx/visually-hidden.js +11 -0
- package/packages/panda/styled-system/jsx/vstack.d.ts +4 -7
- package/packages/panda/styled-system/jsx/vstack.js +11 -0
- package/packages/panda/styled-system/jsx/wrap.d.ts +4 -7
- package/packages/panda/styled-system/jsx/wrap.js +11 -0
- package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +8 -9
- package/packages/panda/styled-system/patterns/aspect-ratio.js +37 -0
- package/packages/panda/styled-system/patterns/bleed.d.ts +9 -10
- package/packages/panda/styled-system/patterns/bleed.js +30 -0
- package/packages/panda/styled-system/patterns/box.d.ts +8 -11
- package/packages/panda/styled-system/patterns/box.js +16 -0
- package/packages/panda/styled-system/patterns/center.d.ts +8 -9
- package/packages/panda/styled-system/patterns/center.js +22 -0
- package/packages/panda/styled-system/patterns/circle.d.ts +8 -9
- package/packages/panda/styled-system/patterns/circle.js +26 -0
- package/packages/panda/styled-system/patterns/container.d.ts +8 -11
- package/packages/panda/styled-system/patterns/container.js +26 -0
- package/packages/panda/styled-system/patterns/cq.d.ts +10 -10
- package/packages/panda/styled-system/patterns/cq.js +24 -0
- package/packages/panda/styled-system/patterns/divider.d.ts +11 -11
- package/packages/panda/styled-system/patterns/divider.js +31 -0
- package/packages/panda/styled-system/patterns/flex.d.ts +14 -15
- package/packages/panda/styled-system/patterns/flex.js +27 -0
- package/packages/panda/styled-system/patterns/float.d.ts +12 -12
- package/packages/panda/styled-system/patterns/float.js +84 -0
- package/packages/panda/styled-system/patterns/grid-item.d.ts +13 -14
- package/packages/panda/styled-system/patterns/grid-item.js +26 -0
- package/packages/panda/styled-system/patterns/grid.d.ts +13 -13
- package/packages/panda/styled-system/patterns/grid.js +30 -0
- package/packages/panda/styled-system/patterns/hstack.d.ts +9 -10
- package/packages/panda/styled-system/patterns/hstack.js +27 -0
- package/packages/panda/styled-system/patterns/index.d.ts +14 -15
- package/packages/panda/styled-system/patterns/index.js +20 -0
- package/packages/panda/styled-system/patterns/link-overlay.d.ts +8 -11
- package/packages/panda/styled-system/patterns/link-overlay.js +25 -0
- package/packages/panda/styled-system/patterns/runtime.js +25 -0
- package/packages/panda/styled-system/patterns/spacer.d.ts +9 -9
- package/packages/panda/styled-system/patterns/spacer.js +26 -0
- package/packages/panda/styled-system/patterns/square.d.ts +8 -9
- package/packages/panda/styled-system/patterns/square.js +25 -0
- package/packages/panda/styled-system/patterns/stack.d.ts +11 -12
- package/packages/panda/styled-system/patterns/stack.js +30 -0
- package/packages/panda/styled-system/patterns/visually-hidden.d.ts +8 -11
- package/packages/panda/styled-system/patterns/visually-hidden.js +19 -0
- package/packages/panda/styled-system/patterns/vstack.d.ts +9 -10
- package/packages/panda/styled-system/patterns/vstack.js +27 -0
- package/packages/panda/styled-system/patterns/wrap.d.ts +12 -13
- package/packages/panda/styled-system/patterns/wrap.js +26 -0
- package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-accordion.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +10 -26
- package/packages/panda/styled-system/recipes/aeon-app-shell.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-async.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-async.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +10 -28
- package/packages/panda/styled-system/recipes/aeon-avatar.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-badge.d.ts +8 -26
- package/packages/panda/styled-system/recipes/aeon-badge.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-bar.d.ts +13 -32
- package/packages/panda/styled-system/recipes/aeon-bar.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +10 -33
- package/packages/panda/styled-system/recipes/aeon-button-group.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-button.d.ts +10 -33
- package/packages/panda/styled-system/recipes/aeon-button.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-checkbox.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-clipboard.d.ts +16 -0
- package/packages/panda/styled-system/recipes/aeon-clipboard.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-combobox.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-composer.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-composer.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-content.d.ts +10 -26
- package/packages/panda/styled-system/recipes/aeon-content.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-conversation.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-dialog.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-entry.d.ts +11 -30
- package/packages/panda/styled-system/recipes/aeon-entry.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-field.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-field.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-file-upload.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-file-upload.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-identity.d.ts +10 -28
- package/packages/panda/styled-system/recipes/aeon-identity.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-list-row.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-menu.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-menu.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +10 -28
- package/packages/panda/styled-system/recipes/aeon-metric-strip.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-nav.d.ts +11 -30
- package/packages/panda/styled-system/recipes/aeon-nav.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-panel.d.ts +10 -26
- package/packages/panda/styled-system/recipes/aeon-panel.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-pin-input.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-popover.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-popover.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +10 -28
- package/packages/panda/styled-system/recipes/aeon-profile-header.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-progress.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-progress.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-prose.d.ts +16 -0
- package/packages/panda/styled-system/recipes/aeon-prose.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-radio-group.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-range-slider.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-range-slider.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +12 -36
- package/packages/panda/styled-system/recipes/aeon-scroll.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-segment-group.d.ts +18 -0
- package/packages/panda/styled-system/recipes/aeon-segment-group.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-select.d.ts +9 -26
- package/packages/panda/styled-system/recipes/aeon-select.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-separator.d.ts +10 -26
- package/packages/panda/styled-system/recipes/aeon-separator.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-slider.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-slider.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-switch.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-switch.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-tabs.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-textarea.d.ts +18 -0
- package/packages/panda/styled-system/recipes/aeon-textarea.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +10 -26
- package/packages/panda/styled-system/recipes/aeon-theme-switcher.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-thread.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-thread.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-toast.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-toast.js +5 -0
- package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +9 -24
- package/packages/panda/styled-system/recipes/aeon-tooltip.js +5 -0
- package/packages/panda/styled-system/recipes/index.d.ts +31 -28
- package/packages/panda/styled-system/recipes/index.js +43 -0
- package/packages/panda/styled-system/recipes/runtime.js +133 -0
- package/packages/panda/styled-system/styles.css +1899 -2110
- package/packages/panda/styled-system/tokens/index.d.ts +4 -5
- package/packages/panda/styled-system/tokens/index.js +18 -0
- package/packages/panda/styled-system/types/index.d.ts +3 -6
- package/packages/panda/styled-system/types/jsx.d.ts +36 -27
- package/packages/panda/styled-system/types/pattern.d.ts +18 -70
- package/packages/panda/styled-system/types/recipe.d.ts +50 -154
- package/packages/panda/styled-system/types/system.d.ts +1826 -0
- package/packages/panda/styled-system/types/tokens.d.ts +65 -0
- package/packages/panda/tsconfig.json +3 -1
- package/packages/primitives/dist/chunk-5BNAV4S2.js +258 -0
- package/packages/primitives/dist/chunk-HYHCIMHC.js +45 -0
- package/packages/primitives/dist/index.d.ts +2 -0
- package/packages/primitives/dist/index.js +30 -12
- package/packages/primitives/dist/machines/app-nav.d.ts +3 -3
- package/packages/primitives/dist/machines/cache.d.ts +223 -0
- package/packages/primitives/dist/machines/cache.js +14 -0
- package/packages/primitives/dist/machines/clipboard.d.ts +46 -0
- package/packages/primitives/dist/machines/clipboard.js +8 -0
- package/packages/primitives/dist/machines/tabs.d.ts +2 -2
- package/packages/primitives/src/index.ts +2 -0
- package/packages/primitives/src/machines/cache.ts +395 -0
- package/packages/primitives/src/machines/clipboard.ts +56 -0
- package/packages/react/dist/index.d.ts +134 -13
- package/packages/react/dist/index.js +1429 -1016
- package/packages/react/src/clipboard/index.tsx +117 -0
- package/packages/react/src/composer/index.tsx +14 -5
- package/packages/react/src/dialog/index.tsx +11 -3
- package/packages/react/src/floating/FloatingPositioner.tsx +11 -1
- package/packages/react/src/index.ts +4 -0
- package/packages/react/src/menu/index.tsx +8 -3
- package/packages/react/src/popover/index.tsx +25 -4
- package/packages/react/src/prose/index.tsx +11 -0
- package/packages/react/src/radio-group/index.tsx +2 -1
- package/packages/react/src/scroll/index.tsx +1 -0
- package/packages/react/src/scroll/use-windowed-range.ts +118 -0
- package/packages/react/src/segment-group/index.tsx +171 -0
- package/packages/react/src/select/index.tsx +11 -2
- package/packages/react/src/slider/index.tsx +13 -6
- package/packages/react/src/tabs/index.tsx +19 -7
- package/packages/react/src/textarea/index.tsx +75 -0
- package/packages/react/src/utils/assign-ref.ts +7 -0
- package/packages/schemas/dist/index.d.ts +8 -0
- package/packages/schemas/dist/index.js +62 -1
- package/packages/schemas/json/catalog.json +493 -0
- package/packages/schemas/json/clipboard.json +136 -0
- package/packages/schemas/json/prose.json +103 -0
- package/packages/schemas/json/segmentGroup.json +131 -0
- package/packages/schemas/json/textarea.json +119 -0
- package/packages/schemas/prompts/statecharts.md +1 -1
- package/packages/schemas/registry/catalog.json +34 -0
- package/packages/schemas/registry/components/clipboard.json +136 -0
- package/packages/schemas/registry/components/prose.json +103 -0
- package/packages/schemas/registry/components/segmentGroup.json +131 -0
- package/packages/schemas/registry/components/textarea.json +119 -0
- package/packages/schemas/registry/machines/clipboard.json +110 -0
- package/packages/schemas/registry/machines/slider.json +18 -1
- package/packages/schemas/scripts/emit.ts +2 -0
- package/packages/schemas/src/components.ts +63 -0
- package/packages/tree/README.md +29 -0
- package/packages/tree/dist/index.d.ts +97 -0
- package/packages/tree/dist/index.js +107 -0
- package/packages/tree/package.json +42 -0
- package/packages/tree/src/exclusive-action.ts +104 -0
- package/packages/tree/src/index.ts +7 -0
- package/packages/tree/src/interpret.tsx +45 -0
- package/packages/tree/src/totality.ts +20 -0
- package/packages/tree/src/widget.ts +31 -0
- package/packages/tree/tsconfig.json +8 -0
- package/packages/tree/vitest.config.ts +8 -0
- package/packages/ui/dist/index.d.ts +27 -3
- package/packages/ui/dist/index.js +232 -165
- package/packages/ui/src/clipboard.tsx +51 -0
- package/packages/ui/src/index.ts +4 -0
- package/packages/ui/src/prose.tsx +15 -0
- package/packages/ui/src/segment-group.tsx +28 -0
- package/packages/ui/src/textarea.tsx +17 -0
- package/scripts/vite-aliases.mjs +5 -2
- package/packages/cli/node_modules/.bin/esbuild +0 -21
- package/packages/cli/node_modules/.bin/jiti +0 -21
- package/packages/cli/node_modules/.bin/tsc +0 -21
- package/packages/cli/node_modules/.bin/tsserver +0 -21
- package/packages/cli/node_modules/.bin/tsup +0 -21
- package/packages/cli/node_modules/.bin/tsup-node +0 -21
- package/packages/cli/node_modules/.bin/tsx +0 -21
- package/packages/cli/node_modules/.bin/vite +0 -21
- package/packages/cli/node_modules/.bin/vitest +0 -21
- package/packages/core/node_modules/.bin/esbuild +0 -21
- package/packages/core/node_modules/.bin/jiti +0 -21
- package/packages/core/node_modules/.bin/tsc +0 -21
- package/packages/core/node_modules/.bin/tsserver +0 -21
- package/packages/core/node_modules/.bin/tsup +0 -21
- package/packages/core/node_modules/.bin/tsup-node +0 -21
- package/packages/core/node_modules/.bin/tsx +0 -21
- package/packages/core/node_modules/.bin/vite +0 -21
- package/packages/core/node_modules/.bin/vitest +0 -21
- package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/core/src/identicon.test.ts +0 -39
- package/packages/core/src/machine.test.ts +0 -79
- package/packages/core/src/theme.test.ts +0 -14
- package/packages/geometry/node_modules/.bin/esbuild +0 -21
- package/packages/geometry/node_modules/.bin/jiti +0 -21
- package/packages/geometry/node_modules/.bin/tsc +0 -21
- package/packages/geometry/node_modules/.bin/tsserver +0 -21
- package/packages/geometry/node_modules/.bin/tsup +0 -21
- package/packages/geometry/node_modules/.bin/tsup-node +0 -21
- package/packages/geometry/node_modules/.bin/tsx +0 -21
- package/packages/panda/styled-system/css/conditions.mjs +0 -36
- package/packages/panda/styled-system/css/css.mjs +0 -45
- package/packages/panda/styled-system/css/cva.mjs +0 -87
- package/packages/panda/styled-system/css/index.mjs +0 -4
- package/packages/panda/styled-system/css/sva.mjs +0 -46
- package/packages/panda/styled-system/helpers.mjs +0 -328
- package/packages/panda/styled-system/jsx/aspect-ratio.mjs +0 -14
- package/packages/panda/styled-system/jsx/bleed.mjs +0 -14
- package/packages/panda/styled-system/jsx/box.mjs +0 -14
- package/packages/panda/styled-system/jsx/center.mjs +0 -14
- package/packages/panda/styled-system/jsx/circle.mjs +0 -14
- package/packages/panda/styled-system/jsx/container.mjs +0 -14
- package/packages/panda/styled-system/jsx/cq.mjs +0 -14
- package/packages/panda/styled-system/jsx/create-style-context.d.ts +0 -54
- package/packages/panda/styled-system/jsx/create-style-context.mjs +0 -121
- package/packages/panda/styled-system/jsx/divider.mjs +0 -14
- package/packages/panda/styled-system/jsx/factory-helper.mjs +0 -22
- package/packages/panda/styled-system/jsx/factory.mjs +0 -89
- package/packages/panda/styled-system/jsx/flex.mjs +0 -14
- package/packages/panda/styled-system/jsx/float.mjs +0 -14
- package/packages/panda/styled-system/jsx/grid-item.mjs +0 -14
- package/packages/panda/styled-system/jsx/grid.mjs +0 -14
- package/packages/panda/styled-system/jsx/hstack.mjs +0 -14
- package/packages/panda/styled-system/jsx/index.mjs +0 -23
- package/packages/panda/styled-system/jsx/is-valid-prop.mjs +0 -17
- package/packages/panda/styled-system/jsx/link-overlay.mjs +0 -14
- package/packages/panda/styled-system/jsx/spacer.mjs +0 -14
- package/packages/panda/styled-system/jsx/square.mjs +0 -14
- package/packages/panda/styled-system/jsx/stack.mjs +0 -14
- package/packages/panda/styled-system/jsx/visually-hidden.mjs +0 -14
- package/packages/panda/styled-system/jsx/vstack.mjs +0 -14
- package/packages/panda/styled-system/jsx/wrap.mjs +0 -14
- package/packages/panda/styled-system/patterns/aspect-ratio.mjs +0 -38
- package/packages/panda/styled-system/patterns/bleed.mjs +0 -24
- package/packages/panda/styled-system/patterns/box.mjs +0 -15
- package/packages/panda/styled-system/patterns/center.mjs +0 -21
- package/packages/panda/styled-system/patterns/circle.mjs +0 -25
- package/packages/panda/styled-system/patterns/container.mjs +0 -21
- package/packages/panda/styled-system/patterns/cq.mjs +0 -21
- package/packages/panda/styled-system/patterns/divider.mjs +0 -25
- package/packages/panda/styled-system/patterns/flex.mjs +0 -26
- package/packages/panda/styled-system/patterns/float.mjs +0 -52
- package/packages/panda/styled-system/patterns/grid-item.mjs +0 -25
- package/packages/panda/styled-system/patterns/grid.mjs +0 -27
- package/packages/panda/styled-system/patterns/hstack.mjs +0 -24
- package/packages/panda/styled-system/patterns/index.mjs +0 -20
- package/packages/panda/styled-system/patterns/link-overlay.mjs +0 -24
- package/packages/panda/styled-system/patterns/spacer.mjs +0 -25
- package/packages/panda/styled-system/patterns/square.mjs +0 -24
- package/packages/panda/styled-system/patterns/stack.mjs +0 -24
- package/packages/panda/styled-system/patterns/visually-hidden.mjs +0 -18
- package/packages/panda/styled-system/patterns/vstack.mjs +0 -24
- package/packages/panda/styled-system/patterns/wrap.mjs +0 -25
- package/packages/panda/styled-system/recipes/aeon-accordion.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +0 -70
- package/packages/panda/styled-system/recipes/aeon-async.mjs +0 -57
- package/packages/panda/styled-system/recipes/aeon-avatar.mjs +0 -57
- package/packages/panda/styled-system/recipes/aeon-badge.mjs +0 -32
- package/packages/panda/styled-system/recipes/aeon-bar.mjs +0 -77
- package/packages/panda/styled-system/recipes/aeon-button-group.mjs +0 -37
- package/packages/panda/styled-system/recipes/aeon-button.mjs +0 -39
- package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-combobox.mjs +0 -53
- package/packages/panda/styled-system/recipes/aeon-composer.mjs +0 -57
- package/packages/panda/styled-system/recipes/aeon-content.mjs +0 -70
- package/packages/panda/styled-system/recipes/aeon-conversation.mjs +0 -61
- package/packages/panda/styled-system/recipes/aeon-dialog.mjs +0 -61
- package/packages/panda/styled-system/recipes/aeon-entry.mjs +0 -100
- package/packages/panda/styled-system/recipes/aeon-field.mjs +0 -53
- package/packages/panda/styled-system/recipes/aeon-file-upload.mjs +0 -61
- package/packages/panda/styled-system/recipes/aeon-identity.mjs +0 -63
- package/packages/panda/styled-system/recipes/aeon-list-row.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-menu.mjs +0 -53
- package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +0 -54
- package/packages/panda/styled-system/recipes/aeon-nav.mjs +0 -69
- package/packages/panda/styled-system/recipes/aeon-panel.mjs +0 -58
- package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +0 -37
- package/packages/panda/styled-system/recipes/aeon-popover.mjs +0 -53
- package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +0 -62
- package/packages/panda/styled-system/recipes/aeon-progress.mjs +0 -45
- package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-range-slider.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-scroll.mjs +0 -64
- package/packages/panda/styled-system/recipes/aeon-select.mjs +0 -57
- package/packages/panda/styled-system/recipes/aeon-separator.mjs +0 -42
- package/packages/panda/styled-system/recipes/aeon-slider.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-switch.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-tabs.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +0 -59
- package/packages/panda/styled-system/recipes/aeon-thread.mjs +0 -73
- package/packages/panda/styled-system/recipes/aeon-toast.mjs +0 -49
- package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +0 -49
- package/packages/panda/styled-system/recipes/create-recipe.mjs +0 -82
- package/packages/panda/styled-system/recipes/index.mjs +0 -39
- package/packages/panda/styled-system/tokens/index.mjs +0 -2224
- package/packages/panda/styled-system/tokens/tokens.d.ts +0 -60
- package/packages/panda/styled-system/types/composition.d.ts +0 -227
- package/packages/panda/styled-system/types/conditions.d.ts +0 -346
- package/packages/panda/styled-system/types/csstype.d.ts +0 -22570
- package/packages/panda/styled-system/types/global.d.ts +0 -20
- package/packages/panda/styled-system/types/parts.d.ts +0 -8
- package/packages/panda/styled-system/types/prop-type.d.ts +0 -250
- package/packages/panda/styled-system/types/selectors.d.ts +0 -59
- package/packages/panda/styled-system/types/static-css.d.ts +0 -56
- package/packages/panda/styled-system/types/style-props.d.ts +0 -8089
- package/packages/panda/styled-system/types/system-types.d.ts +0 -151
- package/packages/primitives/node_modules/.bin/esbuild +0 -21
- package/packages/primitives/node_modules/.bin/jiti +0 -21
- package/packages/primitives/node_modules/.bin/tsc +0 -21
- package/packages/primitives/node_modules/.bin/tsserver +0 -21
- package/packages/primitives/node_modules/.bin/tsup +0 -21
- package/packages/primitives/node_modules/.bin/tsup-node +0 -21
- package/packages/primitives/node_modules/.bin/tsx +0 -21
- package/packages/primitives/node_modules/.bin/vite +0 -21
- package/packages/primitives/node_modules/.bin/vitest +0 -21
- package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/primitives/src/__tests__/app-nav.test.ts +0 -30
- package/packages/primitives/src/__tests__/file-upload.test.ts +0 -25
- package/packages/primitives/src/__tests__/floating-surface.test.ts +0 -29
- package/packages/primitives/src/__tests__/range-slider.test.ts +0 -39
- package/packages/react/node_modules/.bin/esbuild +0 -21
- package/packages/react/node_modules/.bin/jiti +0 -21
- package/packages/react/node_modules/.bin/tsc +0 -21
- package/packages/react/node_modules/.bin/tsserver +0 -21
- package/packages/react/node_modules/.bin/tsup +0 -21
- package/packages/react/node_modules/.bin/tsup-node +0 -21
- package/packages/react/node_modules/.bin/tsx +0 -21
- package/packages/react/node_modules/.bin/vite +0 -21
- package/packages/react/node_modules/.bin/vitest +0 -21
- package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/react/src/avatar/avatar.test.tsx +0 -27
- package/packages/react/src/dialog/dialog.test.tsx +0 -50
- package/packages/react/src/select/select.test.tsx +0 -81
- package/packages/react/src/toast/toast.test.tsx +0 -40
- package/packages/react/src/tooltip/tooltip.test.tsx +0 -122
- package/packages/react-scene/node_modules/.bin/jiti +0 -21
- package/packages/react-scene/node_modules/.bin/tsc +0 -21
- package/packages/react-scene/node_modules/.bin/tsserver +0 -21
- package/packages/react-scene/node_modules/.bin/tsup +0 -21
- package/packages/react-scene/node_modules/.bin/tsup-node +0 -21
- package/packages/react-scene/node_modules/.bin/tsx +0 -21
- package/packages/scene/node_modules/.bin/jiti +0 -21
- package/packages/scene/node_modules/.bin/tsc +0 -21
- package/packages/scene/node_modules/.bin/tsserver +0 -21
- package/packages/scene/node_modules/.bin/tsup +0 -21
- package/packages/scene/node_modules/.bin/tsup-node +0 -21
- package/packages/scene/node_modules/.bin/tsx +0 -21
- package/packages/schemas/node_modules/.bin/esbuild +0 -21
- package/packages/schemas/node_modules/.bin/jiti +0 -21
- package/packages/schemas/node_modules/.bin/tsc +0 -21
- package/packages/schemas/node_modules/.bin/tsserver +0 -21
- package/packages/schemas/node_modules/.bin/tsup +0 -21
- package/packages/schemas/node_modules/.bin/tsup-node +0 -21
- package/packages/schemas/node_modules/.bin/tsx +0 -21
- package/packages/schemas/node_modules/.bin/vite +0 -21
- package/packages/schemas/node_modules/.bin/vitest +0 -21
- package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/packages/schemas/src/aeon-to-schema.test.ts +0 -70
- package/packages/schemas/src/index.test.ts +0 -108
- package/packages/signal/node_modules/.bin/jiti +0 -21
- package/packages/signal/node_modules/.bin/tsc +0 -21
- package/packages/signal/node_modules/.bin/tsserver +0 -21
- package/packages/signal/node_modules/.bin/tsup +0 -21
- package/packages/signal/node_modules/.bin/tsup-node +0 -21
- package/packages/signal/node_modules/.bin/tsx +0 -21
- package/packages/site/node_modules/.bin/jiti +0 -21
- package/packages/site/node_modules/.bin/tsc +0 -21
- package/packages/site/node_modules/.bin/tsserver +0 -21
- package/packages/site/node_modules/.bin/tsup +0 -21
- package/packages/site/node_modules/.bin/tsup-node +0 -21
- package/packages/site/node_modules/.bin/tsx +0 -21
- package/packages/solid/node_modules/.bin/jiti +0 -21
- package/packages/solid/node_modules/.bin/tsc +0 -21
- package/packages/solid/node_modules/.bin/tsserver +0 -21
- package/packages/solid/node_modules/.bin/tsup +0 -21
- package/packages/solid/node_modules/.bin/tsup-node +0 -21
- package/packages/solid/node_modules/.bin/tsx +0 -21
- package/packages/surface/node_modules/.bin/jiti +0 -21
- package/packages/surface/node_modules/.bin/tsc +0 -21
- package/packages/surface/node_modules/.bin/tsserver +0 -21
- package/packages/surface/node_modules/.bin/tsup +0 -21
- package/packages/surface/node_modules/.bin/tsup-node +0 -21
- package/packages/surface/node_modules/.bin/tsx +0 -21
- package/packages/svelte/node_modules/.bin/acorn +0 -21
- package/packages/svelte/node_modules/.bin/esbuild +0 -21
- package/packages/svelte/node_modules/.bin/jiti +0 -21
- package/packages/svelte/node_modules/.bin/svelte-check +0 -21
- package/packages/svelte/node_modules/.bin/tsc +0 -21
- package/packages/svelte/node_modules/.bin/tsserver +0 -21
- package/packages/svelte/node_modules/.bin/tsup +0 -21
- package/packages/svelte/node_modules/.bin/tsup-node +0 -21
- package/packages/svelte/node_modules/.bin/tsx +0 -21
- package/packages/svelte/node_modules/.bin/vite +0 -21
- package/packages/ui/node_modules/.bin/jiti +0 -21
- package/packages/ui/node_modules/.bin/tsc +0 -21
- package/packages/ui/node_modules/.bin/tsserver +0 -21
- package/packages/ui/node_modules/.bin/tsup +0 -21
- package/packages/ui/node_modules/.bin/tsup-node +0 -21
- package/packages/ui/node_modules/.bin/tsx +0 -21
- package/packages/vue/node_modules/.bin/jiti +0 -21
- package/packages/vue/node_modules/.bin/tsc +0 -21
- package/packages/vue/node_modules/.bin/tsserver +0 -21
- package/packages/vue/node_modules/.bin/tsup +0 -21
- package/packages/vue/node_modules/.bin/tsup-node +0 -21
- package/packages/vue/node_modules/.bin/tsx +0 -21
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,145 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## [1.9.0] - 2026-10-21
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Chart cache (`@aeon-ui/primitives`).** `createChartCache({ id, load, ttl, tags? })` is a keyed cache charts invoke as `cache.actor`, shared by every chart instance. Each key is a `cacheEntryMachine` (`idle`, `loading`, `ready`, `stale`, `refreshing`, `failed`): one load per key, a time-to-live per key, stale data served while it revalidates, and `CACHE.INVALIDATE` by key or tag. `peek()` returns a stable view for selectors. Ids naming secrets, keys or spend decisions are refused.
|
|
10
|
+
- **Windowed lists.** `computeListWindow` (`@aeon-ui/core`) and `useWindowedRange` (`@aeon-ui/react`) mount only the rows in view, for vertical lists and horizontal strips.
|
|
11
|
+
- **Sounds (`@aeon-ui/core`).** `playSound(name)` plays short UI sounds synthesized with Web Audio (`tap`, `copy`, `send`, `success`, `attention`, `error`, `ready`); no audio files. Silent until the app calls `configureSounds({ enabled: true, volume })`. The same sound fired twice within 60 ms plays once. `createSoundPlayer` takes a context factory for tests.
|
|
12
|
+
- **`Clipboard` sounds.** `clipboardMachine` plays `copy` on entering `copied` and `error` on entering `failed`, through the `soundCopied` / `soundFailed` actions.
|
|
13
|
+
- **`Clipboard`.** One-click copy on `clipboardMachine` (idle, copying, copied, failed); the styled trigger swaps a copy icon for a check and a live region announces the result.
|
|
14
|
+
- **`Prose`.** Styles rendered markdown in em, so it follows the surrounding font size; draws list markers the reset strips, and `<ol start>` numbers correctly.
|
|
15
|
+
- **`Textarea`.** Grows with its content between `minRows` and `maxRows`; `outline` and `ghost` variants.
|
|
16
|
+
- **`SegmentGroup`.** Compact single choice on `tabsMachine`; arrow keys, Home and End move the selection and skip disabled items.
|
|
17
|
+
- **`Composer.Input` `minRows` / `maxRows`.** The input grows with its text (default 1 to 4 lines) instead of staying one fixed height.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- **Panda CSS 2.** `@aeon-ui/panda` runs on `@pandacss/dev` 2.3 and lists `preset-base` and `preset-panda` itself, since v2 adds no presets on its own. Generated `styled-system` files are `.js` instead of `.mjs`.
|
|
22
|
+
|
|
23
|
+
- **`Select.Positioner` `anchorRef`, `placement`, `matchAnchorWidth`.** The same options `Popover.Positioner` takes: a compact trigger pinned to the end of a row can open its listbox across the row it belongs to, so option labels and details are not squeezed to the trigger's width.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **Controlled `Tabs.Root` reports clicks.** With `value` set, a trigger click calls `onValueChange` with the clicked value; before, it changed only machine state the controlled value ignored, so the tab never switched. `Tabs.Root` also takes div attributes.
|
|
28
|
+
- **`RadioGroup.Root` takes `aria-label`.** Its props extend div attributes, so `aria-label`, `id` and the rest type-check (the root already passed them through).
|
|
29
|
+
- **`anatomy()` carries its `scope` at runtime.** The type promised `.scope`, but the object had none, so `scopeAttrs(x.scope, …)` emitted `data-aeon-scope="undefined"`.
|
|
30
|
+
|
|
31
|
+
## [1.8.0] - 2026-09-27
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- **`Popover.Positioner` / `FloatingPositioner` `anchorRef` + `matchAnchorWidth`.** Position a surface against the region it belongs to instead of the small trigger pinned to its edge, so a wide panel lands where the eye already is rather than being clamped back from the viewport edge.
|
|
36
|
+
- **Optional philosophy note:** [docs/ANALOGY.md](./docs/ANALOGY.md) — Aeon as metaphor for formless truth and sensory projection (not product doctrine). Linked from [PHILOSOPHY.md](./PHILOSOPHY.md) and the docs index.
|
|
37
|
+
- `@aeon-ui/tree` — widget trees. A widget is immutable data describing one face
|
|
38
|
+
of a chart, interpreted into DOM with `data-aeon-scope|part|state`. Flutter's
|
|
39
|
+
Widget and Element layers only: no RenderObject (layout stays CSS), no
|
|
40
|
+
`StatefulWidget` (the chart is the only state).
|
|
41
|
+
- `exclusiveActionWidget` — the shared face for "confirm, then await" regions
|
|
42
|
+
(`idle → confirming → busy → idle | failure`): pending label, disabled set,
|
|
43
|
+
failure copy and confirm slot are functions of the snapshot.
|
|
44
|
+
- `uncoveredStates(states, project)` — totality as a test: every state the chart
|
|
45
|
+
names must appear on the tree projected for it.
|
|
46
|
+
- `interpret(tree, hosts)` — element layer; hosts slot existing compounds
|
|
47
|
+
(`Prompt`, fields) into names the tree declares.
|
|
48
|
+
- Vite aliases, optimizeDeps exclude and tsconfig paths include `@aeon-ui/tree`.
|
|
49
|
+
|
|
50
|
+
## [1.7.7] - 2026-08-18
|
|
51
|
+
|
|
52
|
+
### Added
|
|
53
|
+
|
|
54
|
+
- **Three more primitives in the live section, chosen for chart complexity.** `Slider` is hierarchical — the snapshot reports `interaction.dragging`, so the chart lights the region *and* the leaf inside it while you drag, and an arrow key shows `SET_VALUE` writing context without leaving the state. `FileUpload` runs a real drag-and-drop lifecycle (`idle` / `dragging` / `rejected`), driveable by dragging a file or by sending the same events from buttons. `Toast` is the one chart that moves without you: `visible` carries a delayed `TIMEOUT` that retires it on the machine's own clock.
|
|
55
|
+
- **`useSliderContext`** exported from `@aeon-ui/react`, so a slider's live machine state (including the nested `interaction` value) is readable from inside `Slider.Root` — matching `useAsyncContext` / `useFieldContext` / `useStickyBarContext`.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- **The live chart never highlighted a component's *initial* state.** A late SVG swap replaced the diagram after the highlight was painted, so the first snapshot silently went dark until you interacted. The explorer now repaints when the rendered chart changes.
|
|
60
|
+
- **`valid` also lit up `invalid`.** Node matching compared id substrings, so any state whose name contained another's was highlighted too. Matching is now segment-aware, and a region's `[*]` marker no longer inherits its parent's highlight.
|
|
61
|
+
- **Nested snapshot values are highlighted properly.** A dotted path such as `interaction.dragging` now lights every node on the path, since the ancestors are genuinely active.
|
|
62
|
+
- **Live charts are readable.** The explorer box was short enough that parallel and nested diagrams auto-fit to ~30%; it now has room, and the slider's nested region lays out left-to-right.
|
|
63
|
+
|
|
64
|
+
## [1.7.6] - 2026-08-18
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
|
|
68
|
+
- **Hero video: resolved an apparent contradiction in the narration.** "Nothing else exists" (about the async machine) could read as conflicting with the later child-machine states (broadcasting, seen, mined). The closed-world line is now scoped — "that's this machine's entire world" — and the hierarchy scene opens with the bridge: "Need more states? Charts nest." Transcript re-aligned (61s).
|
|
69
|
+
|
|
70
|
+
## [1.7.5] - 2026-08-18
|
|
71
|
+
|
|
72
|
+
### Changed
|
|
73
|
+
|
|
74
|
+
- **Hero video narration re-recorded for clarity.** "Statechart" is now fed to TTS as "state chart" so it isn't mispronounced (the on-screen subtitle keeps the correct spelling — `speak` overrides audio only, the same mechanism the closing URL already used). The parallel-regions explanation is rebuilt around three plain questions — "Has it been edited? Does it pass? Is it sending?" — and each chart lane now prints its question next to the region name, so the words and the diagram agree. Also clearer: "no in-between states" replaces "no half states", "your CSS targets that attribute" replaces "your styles key off it", and the child machine's middle state is spoken as "seen on the network" rather than a bare "seen". Transcript re-aligned (59s).
|
|
75
|
+
|
|
76
|
+
## [1.7.4] - 2026-08-18
|
|
77
|
+
|
|
78
|
+
### Changed
|
|
79
|
+
|
|
80
|
+
- **Hero video intro now shows the pain, and the ending is de-branded.** The opening scene names the actual symptoms of boolean soup — a mystery spinner with no context, two buttons wired to the same job (`Retry` / `Reload`), and "state is a mess" — instead of an abstract truth count. The narration no longer says the word "dirty" (the state node still shows it, since that's the real machine state). The hierarchy scene presents the nested send flow as "a real example / wallet · send" without naming the product. Transcript re-aligned (57s).
|
|
81
|
+
|
|
82
|
+
## [1.7.3] - 2026-08-18
|
|
83
|
+
|
|
84
|
+
### Changed
|
|
85
|
+
|
|
86
|
+
- **Hero video: plainer intro, glossed jargon, and a real hierarchical chart from a shipping product.** The intro now shows three plain `loading` / `empty` / `error` toggles with what each means in English, instead of prop-name jargon. The parallel-regions scene explains `dirty` outright ("dirty just means the user typed") and prints a plain-English gloss under the composite value. The machine catalog scene is replaced with the send flow from HandCash Desktop: the `sendPayment` chart (`editing → confirming → handoff`) with the `txLifecycle` child machine (`broadcasting → seenInMempool → mined`) nested inside `handoff` — the wallet surface and the breadcrumb (`handoff › broadcasting`) stay in lockstep with the chart. Also fixed a renderer bug where PIL ignored text alpha, so every text fade-in had been popping at full opacity (visible as floating state labels before their nodes appeared). Transcript re-aligned (55s).
|
|
87
|
+
|
|
88
|
+
## [1.7.2] - 2026-08-18
|
|
89
|
+
|
|
90
|
+
### Changed
|
|
91
|
+
|
|
92
|
+
- **New hero video, built from scratch to teach statecharts — not one animated state.** Seven scenes: three booleans producing a screen with a spinner and an error at once; the async machine with every state named and every edge labelled with its event; an event with no matching edge blocked at the door; the field machine's three parallel regions all true at once beside the surface that projects them; `state → data-aeon-state → pixels`; and four components each running their own machine on their own clock. Real system typography (SF / SF Mono), a poster frame from the chart scene, faststart streaming, and re-aligned transcript cues (52s).
|
|
93
|
+
|
|
94
|
+
## [1.7.1] - 2026-08-18
|
|
95
|
+
|
|
96
|
+
### Changed
|
|
97
|
+
|
|
98
|
+
- **Hero video now shows the actual thesis.** Previously the statechart node swept on its own float while the phone face animated separately, so the chart and the screen never agreed. The centrepiece is now one coupled demo: the component face and the highlighted chart node are the same state, driven by a single step timeline, with the causing event (`FETCH`, `RESOLVE`, `REJECT`, `REFRESH`) labelled on the transition edge — the same idea as the live section. The closing card points at "See it live" instead of the removed builder; transcript cues re-aligned.
|
|
99
|
+
|
|
100
|
+
## [1.7.0] - 2026-08-18
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
|
|
104
|
+
- **Live section: real components beside the chart that tracks them.** Async, Button, Field, and Dialog run their shipped machines; the Mermaid chart highlights the state the component is actually in and names the event that caused the move. Field reports all three regions at once, because a field has no single state.
|
|
105
|
+
- Machine-accurate diagrams for `buttonLifecycleMachine`, `dialogMachine`, and `fieldMachine`; the async chart now shows its `REFRESH` and re-fetch edges. `aeonDiagrams.test.ts` fails if a chart misses a machine state or invents one.
|
|
106
|
+
|
|
107
|
+
### Fixed
|
|
108
|
+
|
|
109
|
+
- **A controlled `Dialog`, `Popover`, or `Menu` could never be opened by its own trigger.** `onOpenChange` reported the resolved prop, so an owner holding `open` never heard the machine's intent — the trigger, escape key, and outside click were all dead. Each root now reports the machine's own transition (and no longer fires on mount).
|
|
110
|
+
|
|
111
|
+
### Removed
|
|
112
|
+
|
|
113
|
+
- **The generative app builder is gone** — sandbox, chart→schema compiler, live composer, model client, cost meter, and the `/api/aeon-generate` and `/api/aeon-scrape` endpoints, plus the OpenRouter proxy plugin and its env keys (~6,000 lines). Landing nav, hero, and header CTAs point at the live section.
|
|
114
|
+
- The static "Determinism" diagram section, now that the live charts replace it. `expandActiveStates` lost its builder-specific token aliases.
|
|
115
|
+
|
|
116
|
+
## [1.6.1] - 2026-08-18
|
|
117
|
+
|
|
118
|
+
### Changed
|
|
119
|
+
|
|
120
|
+
- **Builder previews read like designs, not state dumps.** The first screen now leads with the site's own hero headline and description (scraped, never invented); other screens are titled by their state once. Actions promote one primary button and group the rest instead of stacking equal buttons. The app bar no longer repeats the state label the dock already shows.
|
|
121
|
+
- **Device selector is back** — phone / tablet / desktop toggle above the preview, with the desktop frame showing the scraped host in its address bar.
|
|
122
|
+
|
|
123
|
+
## [1.6.0] - 2026-08-18
|
|
124
|
+
|
|
125
|
+
### Added
|
|
126
|
+
|
|
127
|
+
- **Redesign any site from its URL** — paste a domain into the builder and `/api/aeon-scrape` reads the page for its name, description, nav, actions, logo, and `theme-color`. The brand becomes chrome (logo in the app bar, accent palette scoped to the preview) and the page content becomes the prompt. Private and non-HTTP hosts are refused.
|
|
128
|
+
- `builder/projectFaces.ts` — generic chart projection: states become screens, transitions become actions, `collect` demos add a field, `async` demos add an async region.
|
|
129
|
+
- Demo tests now run in CI (`pnpm test`), covering projection, scraping, palette derivation, and a server render of the builder output.
|
|
130
|
+
|
|
131
|
+
### Changed
|
|
132
|
+
|
|
133
|
+
- **App builder rebuilt around one input.** Prompt or URL, Build, preview. The starter chips, engine bar, cost meter, inspector tabs, device picker, and build loader are gone.
|
|
134
|
+
- **The model returns a chart and nothing else; the UI is projected from it.** Previously ~1,900 lines of prompt keyword matching decided that "match" meant a dating app, "faq" meant an accordion, and "pong" meant paddles, then filled screens with seeded catalogs, listings, and test stimuli. All of it is deleted, along with the preset app schemas it produced.
|
|
135
|
+
- Empty nav tabs are dropped instead of being filled with placeholder screens, and the offline fallback chart is deliberately shapeless rather than a product guess.
|
|
136
|
+
|
|
137
|
+
## [1.5.2] - 2026-08-18
|
|
138
|
+
|
|
139
|
+
### Changed
|
|
140
|
+
|
|
141
|
+
- **Landing page trimmed to essentials** — removed the pillars grid, the numbered setup box, and the full rule-file dump; the Cursor section is now one command plus a copy button. Hero shows a single install line, the why section keeps only the same-prompt contrast, specs show one chart, and the FAQ is four questions.
|
|
142
|
+
|
|
3
143
|
## [1.5.1] - 2026-08-18
|
|
4
144
|
|
|
5
145
|
### Added
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aeon-ui-engine",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"aeon-ui": "
|
|
7
|
+
"aeon-ui": "packages/cli/dist/bin.js"
|
|
8
8
|
},
|
|
9
9
|
"exports": {
|
|
10
10
|
"./vite": "./scripts/vite-aliases.mjs",
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"packages",
|
|
20
|
+
"!packages/*/node_modules",
|
|
21
|
+
"!packages/**/*.test.ts",
|
|
22
|
+
"!packages/**/*.test.tsx",
|
|
20
23
|
"scripts",
|
|
21
24
|
"tsconfig.base.json",
|
|
22
25
|
"CONSUMER.md",
|
|
@@ -34,7 +37,7 @@
|
|
|
34
37
|
"dev": "pnpm --filter @aeon-ui/demo dev",
|
|
35
38
|
"examples": "pnpm --filter @aeon-ui/examples dev",
|
|
36
39
|
"typecheck": "pnpm -r run typecheck",
|
|
37
|
-
"test": "pnpm run test:headless",
|
|
40
|
+
"test": "pnpm run test:headless && pnpm --filter @aeon-ui/demo run test",
|
|
38
41
|
"test:headless": "pnpm run build:headless && pnpm --filter @aeon-ui/core --filter @aeon-ui/primitives --filter @aeon-ui/react run test",
|
|
39
42
|
"changeset": "changeset",
|
|
40
43
|
"version-packages": "changeset version",
|
|
@@ -159,6 +159,22 @@ declare const composerAnatomy: Record<"root" | "actions" | "input" | "send" | "s
|
|
|
159
159
|
declare const separatorAnatomy: Record<"root", "root"> & {
|
|
160
160
|
scope: string;
|
|
161
161
|
};
|
|
162
|
+
/** Long-form rich text (rendered markdown). Styles its descendants; no state of its own. */
|
|
163
|
+
declare const proseAnatomy: Record<"root", "root"> & {
|
|
164
|
+
scope: string;
|
|
165
|
+
};
|
|
166
|
+
/** Multi-line input that grows with its content between `minRows` and `maxRows`. */
|
|
167
|
+
declare const textareaAnatomy: Record<"root", "root"> & {
|
|
168
|
+
scope: string;
|
|
169
|
+
};
|
|
170
|
+
/** Compact single choice rendered as adjacent buttons; same chart family as Tabs / RadioGroup. */
|
|
171
|
+
declare const segmentGroupAnatomy: Record<"root" | "item", "root" | "item"> & {
|
|
172
|
+
scope: string;
|
|
173
|
+
};
|
|
174
|
+
/** Copy a value to the clipboard; root state idle | copying | copied | failed. */
|
|
175
|
+
declare const clipboardAnatomy: Record<"root" | "indicator" | "trigger" | "status", "root" | "indicator" | "trigger" | "status"> & {
|
|
176
|
+
scope: string;
|
|
177
|
+
};
|
|
162
178
|
/** Progress bar — idle / loading / complete on root `data-aeon-state`. */
|
|
163
179
|
declare const progressAnatomy: Record<"root" | "label" | "track" | "range", "root" | "label" | "track" | "range"> & {
|
|
164
180
|
scope: string;
|
|
@@ -308,6 +324,67 @@ interface ScrollSnapshot {
|
|
|
308
324
|
/** Derive overflow + edge states from a scrollable element. */
|
|
309
325
|
declare function getScrollSnapshot(el: HTMLElement): ScrollSnapshot;
|
|
310
326
|
|
|
327
|
+
/**
|
|
328
|
+
* Windowed slice of a long list or grid: which items to mount and how much
|
|
329
|
+
* space stands in for the rest. Geometry, not lifecycle, so like Scroll it is
|
|
330
|
+
* a pure function over measurements, never a machine.
|
|
331
|
+
*/
|
|
332
|
+
interface ListWindow {
|
|
333
|
+
/** First mounted item index. */
|
|
334
|
+
start: number;
|
|
335
|
+
/** One past the last mounted item index. */
|
|
336
|
+
end: number;
|
|
337
|
+
/** Pixels standing in for the rows above the window. */
|
|
338
|
+
padStart: number;
|
|
339
|
+
/** Pixels standing in for the rows below the window. */
|
|
340
|
+
padEnd: number;
|
|
341
|
+
}
|
|
342
|
+
/** The direction a list scrolls: rows down a column, or items along a strip. */
|
|
343
|
+
type ListWindowAxis = 'y' | 'x';
|
|
344
|
+
interface ListWindowInput {
|
|
345
|
+
total: number;
|
|
346
|
+
/** Row pitch in pixels along the scroll axis, gap included. */
|
|
347
|
+
rowExtent: number;
|
|
348
|
+
/** Items per row; 1 for a list. */
|
|
349
|
+
columns?: number;
|
|
350
|
+
/** Rows mounted beyond each edge of the viewport. */
|
|
351
|
+
overscan?: number;
|
|
352
|
+
/** How far the list's content has moved past the start of its viewport. */
|
|
353
|
+
scrolledPast: number;
|
|
354
|
+
/** Viewport length along the scroll axis. */
|
|
355
|
+
viewportHeight: number;
|
|
356
|
+
/** Below this many items the whole list mounts. */
|
|
357
|
+
minItems?: number;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Below this, windowing costs more than it saves and a mis-measured row would
|
|
361
|
+
* visibly shift a short list.
|
|
362
|
+
*/
|
|
363
|
+
declare const LIST_WINDOW_MIN_ITEMS = 60;
|
|
364
|
+
declare function fullListWindow(total: number): ListWindow;
|
|
365
|
+
declare function sameListWindow(a: ListWindow, b: ListWindow): boolean;
|
|
366
|
+
declare function computeListWindow(input: ListWindowInput): ListWindow;
|
|
367
|
+
/** Attribute that marks a spacer, so row measuring skips it. */
|
|
368
|
+
declare const LIST_WINDOW_PAD_ATTR = "data-aeon-window-pad";
|
|
369
|
+
declare function listWindowPadAttrs(edge: 'start' | 'end'): Record<string, string | boolean>;
|
|
370
|
+
/** The element that actually scrolls a list: the nearest ancestor overflowing on the axis, else the window. */
|
|
371
|
+
declare function resolveScrollRoot(el: HTMLElement | null, axis?: ListWindowAxis): HTMLElement | Window;
|
|
372
|
+
declare function scrollRootHeight(root: HTMLElement | Window): number;
|
|
373
|
+
/** Viewport length along the axis. */
|
|
374
|
+
declare function scrollRootExtent(root: HTMLElement | Window, axis?: ListWindowAxis): number;
|
|
375
|
+
declare function scrollRootTop(root: HTMLElement | Window): number;
|
|
376
|
+
/**
|
|
377
|
+
* How far the list's content has moved past the viewport. A list that is its
|
|
378
|
+
* own scroll root reports its scroll offset: subtracting its own edge from
|
|
379
|
+
* itself is always 0, which kept the first rows mounted while the scrollbar
|
|
380
|
+
* travelled through the end spacer.
|
|
381
|
+
*/
|
|
382
|
+
declare function scrollRootScrolledPast(root: HTMLElement | Window, list: HTMLElement, axis?: ListWindowAxis): number;
|
|
383
|
+
/** Real column count for a grid; 1 for a list. The hint is only a fallback. */
|
|
384
|
+
declare function measureListColumns(style: CSSStyleDeclaration, hint?: number): number;
|
|
385
|
+
/** Row pitch along the axis from a rendered row, so spacers match what is on screen. */
|
|
386
|
+
declare function measureListRowExtent(list: HTMLElement, style: CSSStyleDeclaration, hint: number, rowSelector?: string, axis?: ListWindowAxis): number;
|
|
387
|
+
|
|
311
388
|
/**
|
|
312
389
|
* Responsive play-surface layout — logical coordinate plane + composition modes.
|
|
313
390
|
*
|
|
@@ -530,4 +607,42 @@ declare function identiconColor(seed: string): {
|
|
|
530
607
|
/** SVG data URL for `<img src>` / CSS background. */
|
|
531
608
|
declare function identiconDataUrl(seed: string, size?: number): string;
|
|
532
609
|
|
|
533
|
-
|
|
610
|
+
/**
|
|
611
|
+
* Short UI sounds synthesized with Web Audio: no files to ship or license.
|
|
612
|
+
* Silent until an app calls `configureSounds({ enabled: true })`.
|
|
613
|
+
*/
|
|
614
|
+
type SoundName = 'tap' | 'copy' | 'send' | 'success' | 'attention' | 'error' | 'ready';
|
|
615
|
+
interface Tone {
|
|
616
|
+
/** Start frequency in Hz. */
|
|
617
|
+
freq: number;
|
|
618
|
+
/** End frequency in Hz; glides from `freq` over the tone. */
|
|
619
|
+
to?: number;
|
|
620
|
+
/** Offset from the sound's start, in seconds. */
|
|
621
|
+
at: number;
|
|
622
|
+
/** Time to fade out, in seconds. */
|
|
623
|
+
duration: number;
|
|
624
|
+
type?: OscillatorType;
|
|
625
|
+
/** Peak gain before the master volume, 0 to 1. */
|
|
626
|
+
gain: number;
|
|
627
|
+
}
|
|
628
|
+
declare const soundPresets: Record<SoundName, readonly Tone[]>;
|
|
629
|
+
interface SoundSettings {
|
|
630
|
+
enabled: boolean;
|
|
631
|
+
/** Master volume, 0 to 1. */
|
|
632
|
+
volume: number;
|
|
633
|
+
}
|
|
634
|
+
/** The slice of `AudioContext` the player uses; tests pass a fake. */
|
|
635
|
+
type SoundContext = Pick<AudioContext, 'currentTime' | 'state' | 'resume' | 'createOscillator' | 'createGain' | 'createBiquadFilter' | 'destination'>;
|
|
636
|
+
interface SoundPlayer {
|
|
637
|
+
play(name: SoundName): void;
|
|
638
|
+
configure(settings: Partial<SoundSettings>): void;
|
|
639
|
+
settings(): SoundSettings;
|
|
640
|
+
}
|
|
641
|
+
declare function createSoundPlayer(createContext?: () => SoundContext | null, initial?: Partial<SoundSettings>): SoundPlayer;
|
|
642
|
+
/** Play a preset through the shared player; a no-op while sounds are off. */
|
|
643
|
+
declare const playSound: (name: SoundName) => void;
|
|
644
|
+
/** Turn the shared player on or off and set its volume. */
|
|
645
|
+
declare const configureSounds: (settings: Partial<SoundSettings>) => void;
|
|
646
|
+
declare const soundSettings: () => SoundSettings;
|
|
647
|
+
|
|
648
|
+
export { AEON_PRINCIPLE, AEON_THEME_TRANSITION_CLASS, type AeonActor, type AeonColorMode, type AeonContext, type AeonDataAttrs, type AeonEvent, type AeonPalette, type AeonSnapshot, type AeonStateValue, type AeonThemeDefinition, type ApplyBrandPaletteOptions, type BrandPalette, type BrandPaletteInput, DEFAULT_COMPACT_MQ, type FieldFace, LIST_WINDOW_MIN_ITEMS, LIST_WINDOW_PAD_ATTR, type LayoutComposition, type LayoutCompositionSpec, type LayoutMode, type ListWindow, type ListWindowAxis, type ListWindowInput, NORM_PLANE, type NormOrigin, type NormPoint, type NormRect, type RegionLayoutSlot, type ResponsiveLayoutSpec, type ScrollOverflow, type ScrollSnapshot, type SoundContext, type SoundName, type SoundPlayer, type SoundSettings, type Tone, UI_IS_FUNCTION_OF_STATE, accordionAnatomy, anatomy, appNavAnatomy, appShellAnatomy, applyAeonTheme, applyBrandPalette, asyncAnatomy, avatarAnatomy, barAnatomy, brandPaletteToCssText, brandPaletteToCssVars, buttonAnatomy, checkboxAnatomy, clampNorm, clientFromNorm, clipboardAnatomy, comboboxAnatomy, composerAnatomy, computeListWindow, configureSounds, contentAnatomy, conversationAnatomy, createSoundPlayer, dialogAnatomy, entryAnatomy, fieldAnatomy, fieldFace, fieldRegions, fileUploadAnatomy, fullListWindow, getCompactMq, getRegionValue, getScrollSnapshot, identiconColor, identiconDataUrl, identiconGrid, identiconSeedBytes, identityAnatomy, initAeonTheme, insetNormCluster, isAeonColorMode, isAeonMode, isAeonThemeId, layoutCompositionForMode, layoutModeAttrs, listRowAnatomy, listWindowPadAttrs, matchLayoutMode, measureElement, measureListColumns, measureListRowExtent, menuAnatomy, metricStripAnatomy, navAnatomy, normFromClient, normalizeBrandPalette, panelAnatomy, partAttrs, partOnlyAttrs, pinInputAnatomy, playSound, playSurfaceAnatomy, popoverAnatomy, profileHeaderAnatomy, progressAnatomy, promptAnatomy, proseAnatomy, radioGroupAnatomy, rangeSliderAnatomy, regionBoundsForMode, regionLeaf, regionMatches, regionPath, registerAeonThemes, resolveAeonColorMode, resolveRegionRect, resolveScrollRoot, runAeonThemeTransition, sameListWindow, scopeAttrs, scrollAnatomy, scrollRootExtent, scrollRootHeight, scrollRootScrolledPast, scrollRootTop, segmentGroupAnatomy, selectAnatomy, separatorAnatomy, sliderAnatomy, soundPresets, soundSettings, stateToAttr, statusBannerAnatomy, switchAnatomy, syncAeonColorMode, tabsAnatomy, textareaAnatomy, themeSwitcherAnatomy, threadAnatomy, toastAnatomy, tooltipAnatomy };
|
|
@@ -4,7 +4,7 @@ var UI_IS_FUNCTION_OF_STATE = "UI = f(state)";
|
|
|
4
4
|
|
|
5
5
|
// src/anatomy.ts
|
|
6
6
|
function anatomy(scope, parts) {
|
|
7
|
-
return Object.fromEntries(parts.map((p) => [p, p]));
|
|
7
|
+
return { ...Object.fromEntries(parts.map((p) => [p, p])), scope };
|
|
8
8
|
}
|
|
9
9
|
var buttonAnatomy = anatomy("button", [
|
|
10
10
|
"root",
|
|
@@ -224,6 +224,10 @@ var composerAnatomy = anatomy("composer", [
|
|
|
224
224
|
"toolbar"
|
|
225
225
|
]);
|
|
226
226
|
var separatorAnatomy = anatomy("separator", ["root"]);
|
|
227
|
+
var proseAnatomy = anatomy("prose", ["root"]);
|
|
228
|
+
var textareaAnatomy = anatomy("textarea", ["root"]);
|
|
229
|
+
var segmentGroupAnatomy = anatomy("segmentGroup", ["root", "item"]);
|
|
230
|
+
var clipboardAnatomy = anatomy("clipboard", ["root", "trigger", "indicator", "status"]);
|
|
227
231
|
var progressAnatomy = anatomy("progress", ["root", "track", "range", "label"]);
|
|
228
232
|
var radioGroupAnatomy = anatomy("radioGroup", [
|
|
229
233
|
"root",
|
|
@@ -453,6 +457,81 @@ function getScrollSnapshot(el) {
|
|
|
453
457
|
};
|
|
454
458
|
}
|
|
455
459
|
|
|
460
|
+
// src/list-window.ts
|
|
461
|
+
var LIST_WINDOW_MIN_ITEMS = 60;
|
|
462
|
+
function fullListWindow(total) {
|
|
463
|
+
return { start: 0, end: Math.max(0, total), padStart: 0, padEnd: 0 };
|
|
464
|
+
}
|
|
465
|
+
function sameListWindow(a, b) {
|
|
466
|
+
return a.start === b.start && a.end === b.end && a.padStart === b.padStart && a.padEnd === b.padEnd;
|
|
467
|
+
}
|
|
468
|
+
function computeListWindow(input) {
|
|
469
|
+
const total = Math.max(0, Math.floor(input.total));
|
|
470
|
+
const minItems = input.minItems ?? LIST_WINDOW_MIN_ITEMS;
|
|
471
|
+
const rowExtent = input.rowExtent;
|
|
472
|
+
if (total < minItems || !(rowExtent > 0)) return fullListWindow(total);
|
|
473
|
+
const columns = Math.max(1, Math.floor(input.columns ?? 1));
|
|
474
|
+
const overscan = Math.max(0, Math.floor(input.overscan ?? 8));
|
|
475
|
+
const rows = Math.ceil(total / columns);
|
|
476
|
+
const firstRow = Math.max(0, Math.floor(Math.max(0, input.scrolledPast) / rowExtent) - overscan);
|
|
477
|
+
const visibleRows = Math.ceil(Math.max(0, input.viewportHeight) / rowExtent) + overscan * 2;
|
|
478
|
+
const startRow = Math.min(firstRow, Math.max(0, rows - visibleRows));
|
|
479
|
+
const endRow = Math.min(rows, startRow + visibleRows);
|
|
480
|
+
return {
|
|
481
|
+
start: startRow * columns,
|
|
482
|
+
end: Math.min(total, endRow * columns),
|
|
483
|
+
padStart: startRow * rowExtent,
|
|
484
|
+
padEnd: Math.max(0, (rows - endRow) * rowExtent)
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
var LIST_WINDOW_PAD_ATTR = "data-aeon-window-pad";
|
|
488
|
+
function listWindowPadAttrs(edge) {
|
|
489
|
+
return { [LIST_WINDOW_PAD_ATTR]: edge, "aria-hidden": true };
|
|
490
|
+
}
|
|
491
|
+
function resolveScrollRoot(el, axis = "y") {
|
|
492
|
+
let node = el;
|
|
493
|
+
while (node) {
|
|
494
|
+
const style = getComputedStyle(node);
|
|
495
|
+
const overflow = axis === "x" ? style.overflowX : style.overflowY;
|
|
496
|
+
if (overflow === "auto" || overflow === "scroll") return node;
|
|
497
|
+
node = node.parentElement;
|
|
498
|
+
}
|
|
499
|
+
return window;
|
|
500
|
+
}
|
|
501
|
+
function scrollRootHeight(root) {
|
|
502
|
+
return root === window ? window.innerHeight : root.clientHeight;
|
|
503
|
+
}
|
|
504
|
+
function scrollRootExtent(root, axis = "y") {
|
|
505
|
+
if (axis === "y") return scrollRootHeight(root);
|
|
506
|
+
return root === window ? window.innerWidth : root.clientWidth;
|
|
507
|
+
}
|
|
508
|
+
function scrollRootTop(root) {
|
|
509
|
+
return root === window ? 0 : root.getBoundingClientRect().top;
|
|
510
|
+
}
|
|
511
|
+
function scrollRootScrolledPast(root, list, axis = "y") {
|
|
512
|
+
if (root === list) return axis === "x" ? list.scrollLeft : list.scrollTop;
|
|
513
|
+
if (axis === "y") return Math.max(0, scrollRootTop(root) - list.getBoundingClientRect().top);
|
|
514
|
+
const rootLeft = root === window ? 0 : root.getBoundingClientRect().left;
|
|
515
|
+
return Math.max(0, rootLeft - list.getBoundingClientRect().left);
|
|
516
|
+
}
|
|
517
|
+
function measureListColumns(style, hint = 1) {
|
|
518
|
+
if (!style.display.includes("grid")) return 1;
|
|
519
|
+
const tracks = style.gridTemplateColumns.trim();
|
|
520
|
+
if (!tracks || tracks === "none") return Math.max(1, hint);
|
|
521
|
+
return Math.max(1, tracks.split(/\s+/).length);
|
|
522
|
+
}
|
|
523
|
+
function measureListRowExtent(list, style, hint, rowSelector, axis = "y") {
|
|
524
|
+
const row = Array.from(list.children).find(
|
|
525
|
+
(node) => node instanceof HTMLElement && !node.hasAttribute(LIST_WINDOW_PAD_ATTR) && (!rowSelector || node.matches(rowSelector))
|
|
526
|
+
);
|
|
527
|
+
if (!row) return hint;
|
|
528
|
+
const rect = row.getBoundingClientRect();
|
|
529
|
+
const size = axis === "x" ? rect.width : rect.height;
|
|
530
|
+
if (size <= 0) return hint;
|
|
531
|
+
const gap = Number.parseFloat(axis === "x" ? style.columnGap : style.rowGap);
|
|
532
|
+
return size + (Number.isFinite(gap) ? gap : 0);
|
|
533
|
+
}
|
|
534
|
+
|
|
456
535
|
// src/layout.ts
|
|
457
536
|
var NORM_PLANE = {
|
|
458
537
|
bottomLeft: "bottom-left",
|
|
@@ -767,10 +846,112 @@ function identiconDataUrl(seed, size = 128) {
|
|
|
767
846
|
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><rect width="${size}" height="${size}" fill="${bg}"/>` + rects + `</svg>`;
|
|
768
847
|
return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
769
848
|
}
|
|
849
|
+
|
|
850
|
+
// src/sound.ts
|
|
851
|
+
var pluck = (freq, at, duration, gain) => [
|
|
852
|
+
{ freq, at, duration, type: "sine", gain },
|
|
853
|
+
{ freq: freq * 2.76, at, duration: duration * 0.4, type: "sine", gain: gain * 0.05 },
|
|
854
|
+
{ freq: freq * 5.4, at, duration: Math.min(0.03, duration * 0.2), type: "sine", gain: gain * 0.02 }
|
|
855
|
+
];
|
|
856
|
+
var soundPresets = {
|
|
857
|
+
tap: pluck(880, 0, 0.07, 0.28),
|
|
858
|
+
copy: [...pluck(784, 0, 0.09, 0.3), ...pluck(1175, 0.06, 0.16, 0.26)],
|
|
859
|
+
send: [...pluck(587, 0, 0.1, 0.3), ...pluck(880, 0.05, 0.18, 0.26)],
|
|
860
|
+
success: [...pluck(523, 0, 0.22, 0.28), ...pluck(659, 0.08, 0.24, 0.25), ...pluck(784, 0.16, 0.42, 0.24)],
|
|
861
|
+
attention: [...pluck(988, 0, 0.16, 0.24), ...pluck(988, 0.15, 0.3, 0.18)],
|
|
862
|
+
error: [
|
|
863
|
+
{ freq: 392, at: 0, duration: 0.14, type: "triangle", gain: 0.3 },
|
|
864
|
+
{ freq: 311, at: 0.12, duration: 0.24, type: "triangle", gain: 0.28 }
|
|
865
|
+
],
|
|
866
|
+
ready: [...pluck(659, 0, 0.16, 0.22), ...pluck(784, 0.07, 0.18, 0.22), ...pluck(988, 0.14, 0.2, 0.22), ...pluck(1319, 0.21, 0.5, 0.2)]
|
|
867
|
+
};
|
|
868
|
+
var ATTACK = 4e-3;
|
|
869
|
+
var LOWPASS_HZ = 4600;
|
|
870
|
+
var FLOOR = 1e-4;
|
|
871
|
+
var REPEAT_GAP = 0.06;
|
|
872
|
+
var clamp01 = (n) => Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 0;
|
|
873
|
+
function browserContext() {
|
|
874
|
+
const Ctor = typeof window === "undefined" ? void 0 : window.AudioContext ?? window.webkitAudioContext;
|
|
875
|
+
return Ctor ? new Ctor() : null;
|
|
876
|
+
}
|
|
877
|
+
function resumeOnGesture(ctx) {
|
|
878
|
+
if (typeof window === "undefined") return;
|
|
879
|
+
const resume = () => {
|
|
880
|
+
void ctx.resume().catch(() => {
|
|
881
|
+
});
|
|
882
|
+
window.removeEventListener("pointerdown", resume, true);
|
|
883
|
+
window.removeEventListener("keydown", resume, true);
|
|
884
|
+
};
|
|
885
|
+
window.addEventListener("pointerdown", resume, true);
|
|
886
|
+
window.addEventListener("keydown", resume, true);
|
|
887
|
+
}
|
|
888
|
+
function createSoundPlayer(createContext = browserContext, initial = {}) {
|
|
889
|
+
let current = { enabled: false, volume: 0.5, ...initial };
|
|
890
|
+
current.volume = clamp01(current.volume);
|
|
891
|
+
let ctx;
|
|
892
|
+
let output = null;
|
|
893
|
+
const lastPlayed = /* @__PURE__ */ new Map();
|
|
894
|
+
const context = () => {
|
|
895
|
+
if (ctx === void 0) {
|
|
896
|
+
try {
|
|
897
|
+
ctx = createContext();
|
|
898
|
+
} catch {
|
|
899
|
+
ctx = null;
|
|
900
|
+
}
|
|
901
|
+
if (ctx) {
|
|
902
|
+
const filter = ctx.createBiquadFilter();
|
|
903
|
+
filter.type = "lowpass";
|
|
904
|
+
filter.frequency.value = LOWPASS_HZ;
|
|
905
|
+
filter.connect(ctx.destination);
|
|
906
|
+
output = filter;
|
|
907
|
+
if (ctx.state === "suspended") resumeOnGesture(ctx);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
return ctx;
|
|
911
|
+
};
|
|
912
|
+
return {
|
|
913
|
+
play(name) {
|
|
914
|
+
if (!current.enabled || current.volume === 0) return;
|
|
915
|
+
const audio = context();
|
|
916
|
+
if (!audio || !output || audio.state === "closed") return;
|
|
917
|
+
const now = audio.currentTime;
|
|
918
|
+
const last = lastPlayed.get(name);
|
|
919
|
+
if (last !== void 0 && now - last < REPEAT_GAP) return;
|
|
920
|
+
lastPlayed.set(name, now);
|
|
921
|
+
for (const tone of soundPresets[name]) {
|
|
922
|
+
const start = now + tone.at;
|
|
923
|
+
const end = start + tone.duration;
|
|
924
|
+
const osc = audio.createOscillator();
|
|
925
|
+
const gain = audio.createGain();
|
|
926
|
+
osc.type = tone.type ?? "sine";
|
|
927
|
+
osc.frequency.setValueAtTime(tone.freq, start);
|
|
928
|
+
if (tone.to !== void 0) osc.frequency.exponentialRampToValueAtTime(tone.to, end);
|
|
929
|
+
gain.gain.setValueAtTime(FLOOR, start);
|
|
930
|
+
gain.gain.linearRampToValueAtTime(Math.max(FLOOR, tone.gain * current.volume), start + ATTACK);
|
|
931
|
+
gain.gain.exponentialRampToValueAtTime(FLOOR, end);
|
|
932
|
+
osc.connect(gain);
|
|
933
|
+
gain.connect(output);
|
|
934
|
+
osc.start(start);
|
|
935
|
+
osc.stop(end + 0.02);
|
|
936
|
+
}
|
|
937
|
+
},
|
|
938
|
+
configure(settings) {
|
|
939
|
+
current = { ...current, ...settings };
|
|
940
|
+
current.volume = clamp01(current.volume);
|
|
941
|
+
},
|
|
942
|
+
settings: () => ({ ...current })
|
|
943
|
+
};
|
|
944
|
+
}
|
|
945
|
+
var shared = createSoundPlayer();
|
|
946
|
+
var playSound = (name) => shared.play(name);
|
|
947
|
+
var configureSounds = (settings) => shared.configure(settings);
|
|
948
|
+
var soundSettings = () => shared.settings();
|
|
770
949
|
export {
|
|
771
950
|
AEON_PRINCIPLE,
|
|
772
951
|
AEON_THEME_TRANSITION_CLASS,
|
|
773
952
|
DEFAULT_COMPACT_MQ,
|
|
953
|
+
LIST_WINDOW_MIN_ITEMS,
|
|
954
|
+
LIST_WINDOW_PAD_ATTR,
|
|
774
955
|
NORM_PLANE,
|
|
775
956
|
UI_IS_FUNCTION_OF_STATE,
|
|
776
957
|
accordionAnatomy,
|
|
@@ -788,17 +969,22 @@ export {
|
|
|
788
969
|
checkboxAnatomy,
|
|
789
970
|
clampNorm,
|
|
790
971
|
clientFromNorm,
|
|
972
|
+
clipboardAnatomy,
|
|
791
973
|
comboboxAnatomy,
|
|
792
974
|
composerAnatomy,
|
|
975
|
+
computeListWindow,
|
|
976
|
+
configureSounds,
|
|
793
977
|
contentAnatomy,
|
|
794
978
|
conversationAnatomy,
|
|
795
979
|
setup as createAeonMachine,
|
|
980
|
+
createSoundPlayer,
|
|
796
981
|
dialogAnatomy,
|
|
797
982
|
entryAnatomy,
|
|
798
983
|
fieldAnatomy,
|
|
799
984
|
fieldFace,
|
|
800
985
|
fieldRegions,
|
|
801
986
|
fileUploadAnatomy,
|
|
987
|
+
fullListWindow,
|
|
802
988
|
getCompactMq,
|
|
803
989
|
getRegionValue,
|
|
804
990
|
getScrollSnapshot,
|
|
@@ -815,8 +1001,11 @@ export {
|
|
|
815
1001
|
layoutCompositionForMode,
|
|
816
1002
|
layoutModeAttrs,
|
|
817
1003
|
listRowAnatomy,
|
|
1004
|
+
listWindowPadAttrs,
|
|
818
1005
|
matchLayoutMode,
|
|
819
1006
|
measureElement,
|
|
1007
|
+
measureListColumns,
|
|
1008
|
+
measureListRowExtent,
|
|
820
1009
|
menuAnatomy,
|
|
821
1010
|
metricStripAnatomy,
|
|
822
1011
|
navAnatomy,
|
|
@@ -826,11 +1015,13 @@ export {
|
|
|
826
1015
|
partAttrs,
|
|
827
1016
|
partOnlyAttrs,
|
|
828
1017
|
pinInputAnatomy,
|
|
1018
|
+
playSound,
|
|
829
1019
|
playSurfaceAnatomy,
|
|
830
1020
|
popoverAnatomy,
|
|
831
1021
|
profileHeaderAnatomy,
|
|
832
1022
|
progressAnatomy,
|
|
833
1023
|
promptAnatomy,
|
|
1024
|
+
proseAnatomy,
|
|
834
1025
|
radioGroupAnatomy,
|
|
835
1026
|
rangeSliderAnatomy,
|
|
836
1027
|
regionBoundsForMode,
|
|
@@ -840,17 +1031,27 @@ export {
|
|
|
840
1031
|
registerAeonThemes,
|
|
841
1032
|
resolveAeonColorMode,
|
|
842
1033
|
resolveRegionRect,
|
|
1034
|
+
resolveScrollRoot,
|
|
843
1035
|
runAeonThemeTransition,
|
|
1036
|
+
sameListWindow,
|
|
844
1037
|
scopeAttrs,
|
|
845
1038
|
scrollAnatomy,
|
|
1039
|
+
scrollRootExtent,
|
|
1040
|
+
scrollRootHeight,
|
|
1041
|
+
scrollRootScrolledPast,
|
|
1042
|
+
scrollRootTop,
|
|
1043
|
+
segmentGroupAnatomy,
|
|
846
1044
|
selectAnatomy,
|
|
847
1045
|
separatorAnatomy,
|
|
848
1046
|
sliderAnatomy,
|
|
1047
|
+
soundPresets,
|
|
1048
|
+
soundSettings,
|
|
849
1049
|
stateToAttr,
|
|
850
1050
|
statusBannerAnatomy,
|
|
851
1051
|
switchAnatomy,
|
|
852
1052
|
syncAeonColorMode,
|
|
853
1053
|
tabsAnatomy,
|
|
1054
|
+
textareaAnatomy,
|
|
854
1055
|
themeSwitcherAnatomy,
|
|
855
1056
|
threadAnatomy,
|
|
856
1057
|
toastAnatomy,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Part keys for compound components — scope + named parts for styling and docs. */
|
|
2
2
|
export function anatomy<const T extends readonly string[]>(scope: string, parts: T) {
|
|
3
|
-
return Object.fromEntries(parts.map((p) => [p, p])) as Record<T[number], T[number]> & {
|
|
3
|
+
return { ...Object.fromEntries(parts.map((p) => [p, p])), scope } as Record<T[number], T[number]> & {
|
|
4
4
|
scope: typeof scope
|
|
5
5
|
}
|
|
6
6
|
}
|
|
@@ -310,6 +310,18 @@ export const composerAnatomy = anatomy('composer', [
|
|
|
310
310
|
|
|
311
311
|
export const separatorAnatomy = anatomy('separator', ['root'] as const)
|
|
312
312
|
|
|
313
|
+
/** Long-form rich text (rendered markdown). Styles its descendants; no state of its own. */
|
|
314
|
+
export const proseAnatomy = anatomy('prose', ['root'] as const)
|
|
315
|
+
|
|
316
|
+
/** Multi-line input that grows with its content between `minRows` and `maxRows`. */
|
|
317
|
+
export const textareaAnatomy = anatomy('textarea', ['root'] as const)
|
|
318
|
+
|
|
319
|
+
/** Compact single choice rendered as adjacent buttons; same chart family as Tabs / RadioGroup. */
|
|
320
|
+
export const segmentGroupAnatomy = anatomy('segmentGroup', ['root', 'item'] as const)
|
|
321
|
+
|
|
322
|
+
/** Copy a value to the clipboard; root state idle | copying | copied | failed. */
|
|
323
|
+
export const clipboardAnatomy = anatomy('clipboard', ['root', 'trigger', 'indicator', 'status'] as const)
|
|
324
|
+
|
|
313
325
|
/** Progress bar — idle / loading / complete on root `data-aeon-state`. */
|
|
314
326
|
export const progressAnatomy = anatomy('progress', ['root', 'track', 'range', 'label'] as const)
|
|
315
327
|
|
|
@@ -4,7 +4,9 @@ export * from './attrs.js'
|
|
|
4
4
|
export * from './machine.js'
|
|
5
5
|
export * from './types.js'
|
|
6
6
|
export * from './scroll.js'
|
|
7
|
+
export * from './list-window.js'
|
|
7
8
|
export * from './layout.js'
|
|
8
9
|
export * from './theme.js'
|
|
9
10
|
export * from './brand-theme.js'
|
|
10
11
|
export * from './identicon.js'
|
|
12
|
+
export * from './sound.js'
|