@agent-ui-kit/web-components 0.0.7 → 0.0.14
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/README.md +69 -6
- package/dist/agent-ui.css +1 -1
- package/dist/api.colors.json +2 -2
- package/dist/api.colors.yaml +2 -2
- package/dist/{api.json → api.components.json} +2859 -368
- package/dist/api.tokens.json +3 -3
- package/dist/api.tokens.yaml +3 -3
- package/dist/blocks/agent-chat/agent-chat.d.ts +0 -0
- package/dist/blocks/announcement-card/announcement-card.d.ts +0 -0
- package/dist/blocks/bpm-process/bpm-process.d.ts +0 -0
- package/dist/blocks/chart-activity/chart-activity.d.ts +0 -0
- package/dist/blocks/chart-card/chart-card.d.ts +0 -0
- package/dist/blocks/chart-donut/chart-donut.d.ts +0 -0
- package/dist/blocks/chart-grouped/chart-grouped.d.ts +0 -0
- package/dist/blocks/chart-horizontal/chart-horizontal.d.ts +0 -0
- package/dist/blocks/chart-interactive/chart-interactive.d.ts +0 -0
- package/dist/blocks/chart-labeled/chart-labeled.d.ts +0 -0
- package/dist/blocks/checkout-form/checkout-form.d.ts +0 -0
- package/dist/blocks/clinical-trial/clinical-trial.d.ts +0 -0
- package/dist/blocks/contributors/contributors.d.ts +0 -0
- package/dist/blocks/cyber-threat/cyber-threat.d.ts +0 -0
- package/dist/blocks/dashboard-layout/dashboard-layout.d.ts +0 -0
- package/dist/blocks/data-eng-dag/data-eng-dag.d.ts +0 -0
- package/dist/blocks/date-picker/date-picker.d.ts +0 -0
- package/dist/blocks/ddx-workflow/ddx-workflow.d.ts +0 -0
- package/dist/blocks/empty-state/empty-state.d.ts +0 -0
- package/dist/blocks/env-variables/env-variables.d.ts +0 -0
- package/dist/blocks/feature-upgrade/feature-upgrade.d.ts +0 -0
- package/dist/blocks/financial-risk/financial-risk.d.ts +0 -0
- package/dist/blocks/flow-editor/flow-editor.d.ts +0 -0
- package/dist/blocks/gen-ai-pipeline/gen-ai-pipeline.d.ts +0 -0
- package/dist/blocks/index.d.ts +0 -0
- package/dist/blocks/issue-assign/issue-assign.d.ts +0 -0
- package/dist/blocks/keyboard-shortcuts/keyboard-shortcuts.d.ts +0 -0
- package/dist/blocks/login-branded/login-branded.d.ts +0 -0
- package/dist/blocks/login-email-only/login-email-only.d.ts +0 -0
- package/dist/blocks/login-form/login-form.d.ts +0 -0
- package/dist/blocks/login-simple/login-simple.d.ts +0 -0
- package/dist/blocks/login-social/login-social.d.ts +0 -0
- package/dist/blocks/login-two-column/login-two-column.d.ts +0 -0
- package/dist/blocks/marketing-automation/marketing-automation.d.ts +0 -0
- package/dist/blocks/member-list/member-list.d.ts +0 -0
- package/dist/blocks/ml-pipeline/ml-pipeline.d.ts +0 -0
- package/dist/blocks/nav-card/nav-card.d.ts +0 -0
- package/dist/blocks/notification-list/notification-list.d.ts +0 -0
- package/dist/blocks/oncology-pathway/oncology-pathway.d.ts +0 -0
- package/dist/blocks/pricing-card/pricing-card.d.ts +0 -0
- package/dist/blocks/processing-state/processing-state.d.ts +0 -0
- package/dist/blocks/profile-card/profile-card.d.ts +0 -0
- package/dist/blocks/saas-onboarding/saas-onboarding.d.ts +0 -0
- package/dist/blocks/settings-form/settings-form.d.ts +0 -0
- package/dist/blocks/settings-panel/settings-panel.d.ts +0 -0
- package/dist/blocks/sidebar-nav/sidebar-nav.d.ts +0 -0
- package/dist/blocks/signup-form/signup-form.d.ts +0 -0
- package/dist/blocks/stat-cards/stat-cards.d.ts +0 -0
- package/dist/blocks/status-card/status-card.d.ts +0 -0
- package/dist/blocks/suggested-labs/suggested-labs.d.ts +0 -0
- package/dist/blocks/supply-chain/supply-chain.d.ts +0 -0
- package/dist/blocks/survey-card/survey-card.d.ts +0 -0
- package/dist/blocks/tabbed-panel/tabbed-panel.d.ts +0 -0
- package/dist/blocks/team-empty/team-empty.d.ts +0 -0
- package/dist/blocks/usage-billing/usage-billing.d.ts +0 -0
- package/dist/blocks-incoming/action-toolbar/action-toolbar.d.ts +0 -0
- package/dist/blocks-incoming/agent-artifact-card/agent-artifact-card.d.ts +0 -0
- package/dist/blocks-incoming/agent-chat-response/agent-chat-response.d.ts +0 -0
- package/dist/blocks-incoming/agent-code-result/agent-code-result.d.ts +0 -0
- package/dist/blocks-incoming/agent-context-panel/agent-context-panel.d.ts +0 -0
- package/dist/blocks-incoming/agent-feedback-controls/agent-feedback-controls.d.ts +0 -0
- package/dist/blocks-incoming/agent-follow-up-chips/agent-follow-up-chips.d.ts +0 -0
- package/dist/blocks-incoming/agent-model-selector/agent-model-selector.d.ts +0 -0
- package/dist/blocks-incoming/agent-prompt-input/agent-prompt-input.d.ts +0 -0
- package/dist/blocks-incoming/agent-streaming-message/agent-streaming-message.d.ts +0 -0
- package/dist/blocks-incoming/agent-suggestion-card/agent-suggestion-card.d.ts +0 -0
- package/dist/blocks-incoming/agent-task-card/agent-task-card.d.ts +0 -0
- package/dist/blocks-incoming/agent-thinking-state/agent-thinking-state.d.ts +0 -0
- package/dist/blocks-incoming/agent-tool-use-card/agent-tool-use-card.d.ts +0 -0
- package/dist/blocks-incoming/auth-card/auth-card.d.ts +0 -0
- package/dist/blocks-incoming/commerce-pricing-table/commerce-pricing-table.d.ts +0 -0
- package/dist/blocks-incoming/comms-chat-thread/comms-chat-thread.d.ts +0 -0
- package/dist/blocks-incoming/comms-notification-list/comms-notification-list.d.ts +0 -0
- package/dist/blocks-incoming/content-article-card/content-article-card.d.ts +0 -0
- package/dist/blocks-incoming/dashboard-kpi-grid/dashboard-kpi-grid.d.ts +0 -0
- package/dist/blocks-incoming/data-activity-log/data-activity-log.d.ts +0 -0
- package/dist/blocks-incoming/data-metric-card/data-metric-card.d.ts +0 -0
- package/dist/blocks-incoming/data-table/data-table.d.ts +0 -0
- package/dist/blocks-incoming/data-timeline/data-timeline.d.ts +0 -0
- package/dist/blocks-incoming/feedback-alert-banner/feedback-alert-banner.d.ts +0 -0
- package/dist/blocks-incoming/feedback-empty-state/feedback-empty-state.d.ts +0 -0
- package/dist/blocks-incoming/feedback-progress-stepper/feedback-progress-stepper.d.ts +0 -0
- package/dist/blocks-incoming/form-settings-section/form-settings-section.d.ts +0 -0
- package/dist/blocks-incoming/game-battleship/game-battleship.d.ts +0 -0
- package/dist/blocks-incoming/game-chess/game-chess.d.ts +0 -0
- package/dist/blocks-incoming/game-connect-four/game-connect-four.d.ts +0 -0
- package/dist/blocks-incoming/game-tic-tac-toe/game-tic-tac-toe.d.ts +0 -0
- package/dist/blocks-incoming/list-kanban-board/list-kanban-board.d.ts +0 -0
- package/dist/blocks-incoming/media-image-gallery/media-image-gallery.d.ts +0 -0
- package/dist/blocks-incoming/nav-sidebar/nav-sidebar.d.ts +0 -0
- package/dist/blocks-incoming/onboard-stepper/onboard-stepper.d.ts +0 -0
- package/dist/blocks-incoming/overlay-confirmation-modal/overlay-confirmation-modal.d.ts +0 -0
- package/dist/blocks-incoming/overlay-dropdown-menu/overlay-dropdown-menu.d.ts +0 -0
- package/dist/blocks-incoming/user-profile-card/user-profile-card.d.ts +0 -0
- package/dist/blocks-incoming/user-team-list/user-team-list.d.ts +0 -0
- package/dist/chunks/{agent-ciCayeod.js → agent-C72JZNe6.js} +8 -8
- package/dist/chunks/{agent-ciCayeod.js.map → agent-C72JZNe6.js.map} +1 -1
- package/dist/chunks/empty-state-5M3uR5CM.js +5160 -0
- package/dist/chunks/empty-state-5M3uR5CM.js.map +1 -0
- package/dist/components/accordion/accordion-item.d.ts +9 -0
- package/dist/components/accordion/accordion.d.ts +9 -0
- package/dist/components/accordion/index.d.ts +2 -0
- package/dist/components/agent/agent-activity.d.ts +13 -0
- package/dist/components/agent/agent-feed.d.ts +13 -0
- package/dist/components/agent/agent-input.d.ts +18 -0
- package/dist/components/agent/agent-message.d.ts +22 -0
- package/dist/components/agent/agent-panel.d.ts +16 -0
- package/dist/components/agent/agent-prompt.d.ts +7 -0
- package/dist/components/agent/agent-seeds.d.ts +15 -0
- package/dist/components/agent/agent-text.d.ts +14 -0
- package/dist/components/agent/agent-thread.d.ts +11 -0
- package/dist/components/agent/index.d.ts +9 -0
- package/dist/components/agent.js +1 -1
- package/dist/components/alert/alert.d.ts +3 -0
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/app-shell/app-shell.d.ts +4 -0
- package/dist/components/app-shell/index.d.ts +1 -0
- package/dist/components/avatar-group/avatar-group.d.ts +10 -0
- package/dist/components/avatar-group/index.d.ts +1 -0
- package/dist/components/breadcrumb/breadcrumb-item.d.ts +8 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +7 -0
- package/dist/components/breadcrumb/index.d.ts +2 -0
- package/dist/components/button/button.d.ts +17 -0
- package/dist/components/button/index.d.ts +1 -0
- package/dist/components/calendar/calendar.d.ts +26 -0
- package/dist/components/calendar/index.d.ts +3 -0
- package/dist/components/calendar/store/calendar-store.d.ts +60 -0
- package/dist/components/calendar-picker/calendar-picker.d.ts +14 -0
- package/dist/components/calendar-picker/index.d.ts +1 -0
- package/dist/components/calendar-range-picker/calendar-range-picker.d.ts +14 -0
- package/dist/components/calendar-range-picker/index.d.ts +1 -0
- package/dist/components/canvas/canvas.d.ts +19 -0
- package/dist/components/canvas/index.d.ts +1 -0
- package/dist/components/carousel/carousel.d.ts +13 -0
- package/dist/components/carousel/index.d.ts +1 -0
- package/dist/components/checkbox/checkbox.d.ts +18 -0
- package/dist/components/checkbox/index.d.ts +1 -0
- package/dist/components/chip/chip.d.ts +8 -0
- package/dist/components/chip/index.d.ts +1 -0
- package/dist/components/code-block/code-block.d.ts +10 -0
- package/dist/components/code-block/index.d.ts +1 -0
- package/dist/components/color-area/color-area.d.ts +11 -0
- package/dist/components/color-area/index.d.ts +1 -0
- package/dist/components/color-field/color-field.d.ts +10 -0
- package/dist/components/color-field/index.d.ts +1 -0
- package/dist/components/color-picker/color-picker.d.ts +10 -0
- package/dist/components/color-picker/index.d.ts +1 -0
- package/dist/components/color-slider/color-slider.d.ts +15 -0
- package/dist/components/color-slider/index.d.ts +1 -0
- package/dist/components/command/command-empty.d.ts +4 -0
- package/dist/components/command/command-group.d.ts +6 -0
- package/dist/components/command/command-input.d.ts +12 -0
- package/dist/components/command/command-item.d.ts +10 -0
- package/dist/components/command/command-list.d.ts +4 -0
- package/dist/components/command/command.d.ts +6 -0
- package/dist/components/command/index.d.ts +6 -0
- package/dist/components/container/container.d.ts +11 -0
- package/dist/components/container/index.d.ts +1 -0
- package/dist/components/context-menu/context-menu.d.ts +12 -0
- package/dist/components/context-menu/index.d.ts +1 -0
- package/dist/components/copy-button/copy-button.d.ts +10 -0
- package/dist/components/copy-button/index.d.ts +1 -0
- package/dist/components/date-field/date-field.d.ts +13 -0
- package/dist/components/date-field/index.d.ts +1 -0
- package/dist/components/dialog/dialog.d.ts +12 -0
- package/dist/components/dialog/index.d.ts +1 -0
- package/dist/components/disclosure/disclosure.d.ts +10 -0
- package/dist/components/disclosure/index.d.ts +1 -0
- package/dist/components/disclosure-group/disclosure-group.d.ts +8 -0
- package/dist/components/disclosure-group/index.d.ts +1 -0
- package/dist/components/drawer/drawer.d.ts +13 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +12 -0
- package/dist/components/dropdown-menu/index.d.ts +1 -0
- package/dist/components/editor/context.d.ts +15 -0
- package/dist/components/editor/editor-layer.d.ts +11 -0
- package/dist/components/editor/editor.d.ts +32 -0
- package/dist/components/editor/index.d.ts +4 -0
- package/dist/components/editor.js +1 -1
- package/dist/components/empty-state/empty-state.d.ts +10 -0
- package/dist/components/empty-state/index.d.ts +1 -0
- package/dist/components/feed/feed.d.ts +11 -0
- package/dist/components/feed/index.d.ts +1 -0
- package/dist/components/field/index.d.ts +0 -0
- package/dist/components/file-upload/file-upload.d.ts +13 -0
- package/dist/components/file-upload/index.d.ts +1 -0
- package/dist/components/graph/graph-layer.d.ts +3 -0
- package/dist/components/graph/graph-node.d.ts +13 -0
- package/dist/components/graph/graph-noodle.d.ts +19 -0
- package/dist/components/graph/graph-port.d.ts +17 -0
- package/dist/components/graph/graph-ui.d.ts +10 -0
- package/dist/components/graph/index.d.ts +5 -0
- package/dist/components/graph.js +1 -1
- package/dist/components/gripper/gripper.d.ts +9 -0
- package/dist/components/gripper/index.d.ts +1 -0
- package/dist/components/hover-card/hover-card.d.ts +11 -0
- package/dist/components/hover-card/index.d.ts +1 -0
- package/dist/components/icon/icon.d.ts +12 -0
- package/dist/components/icon/index.d.ts +2 -0
- package/dist/components/icon/registry.d.ts +8 -0
- package/dist/components/image/image.d.ts +13 -0
- package/dist/components/image/index.d.ts +1 -0
- package/dist/components/index.d.ts +72 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/input-otp.d.ts +17 -0
- package/dist/components/input/input.d.ts +29 -0
- package/dist/components/link/index.d.ts +1 -0
- package/dist/components/link/link.d.ts +3 -0
- package/dist/components/meter/index.d.ts +1 -0
- package/dist/components/meter/meter.d.ts +8 -0
- package/dist/components/nav-item/index.d.ts +1 -0
- package/dist/components/nav-item/nav-item.d.ts +3 -0
- package/dist/components/noodles/datasets.d.ts +16 -0
- package/dist/components/noodles/index.d.ts +3 -0
- package/dist/components/noodles/noodle-controller.d.ts +71 -0
- package/dist/components/noodles/noodles.d.ts +30 -0
- package/dist/components/notification-center/index.d.ts +2 -0
- package/dist/components/notification-center/notification-center.d.ts +27 -0
- package/dist/components/optgroup/index.d.ts +1 -0
- package/dist/components/optgroup/optgroup.d.ts +9 -0
- package/dist/components/option/index.d.ts +1 -0
- package/dist/components/option/option.d.ts +11 -0
- package/dist/components/page/index.d.ts +3 -0
- package/dist/components/page/page-context.d.ts +4 -0
- package/dist/components/page/page-main.d.ts +3 -0
- package/dist/components/page/page.d.ts +4 -0
- package/dist/components/pagination/index.d.ts +1 -0
- package/dist/components/pagination/pagination.d.ts +10 -0
- package/dist/components/pane/index.d.ts +2 -0
- package/dist/components/pane/pane.d.ts +27 -0
- package/dist/components/pane/panes.d.ts +10 -0
- package/dist/components/preview-app/index.d.ts +1 -0
- package/dist/components/preview-app/preview-app.d.ts +8 -0
- package/dist/components/progress/index.d.ts +1 -0
- package/dist/components/progress/progress.d.ts +6 -0
- package/dist/components/progress-circle/index.d.ts +1 -0
- package/dist/components/progress-circle/progress-circle.d.ts +9 -0
- package/dist/components/radio/index.d.ts +2 -0
- package/dist/components/radio/radio-group.d.ts +10 -0
- package/dist/components/radio/radio.d.ts +17 -0
- package/dist/components/range/index.d.ts +1 -0
- package/dist/components/range/range.d.ts +18 -0
- package/dist/components/root/index.d.ts +1 -0
- package/dist/components/root/root.d.ts +4 -0
- package/dist/components/segmented-control/index.d.ts +2 -0
- package/dist/components/segmented-control/segment.d.ts +8 -0
- package/dist/components/segmented-control/segmented-control.d.ts +13 -0
- package/dist/components/select/index.d.ts +1 -0
- package/dist/components/select/select.d.ts +37 -0
- package/dist/components/sidebar/index.d.ts +4 -0
- package/dist/components/sidebar/sidebar-content.d.ts +4 -0
- package/dist/components/sidebar/sidebar-footer.d.ts +4 -0
- package/dist/components/sidebar/sidebar-header.d.ts +4 -0
- package/dist/components/sidebar/sidebar.d.ts +14 -0
- package/dist/components/skeleton/index.d.ts +1 -0
- package/dist/components/skeleton/skeleton.d.ts +3 -0
- package/dist/components/sparkline/index.d.ts +1 -0
- package/dist/components/sparkline/sparkline.d.ts +8 -0
- package/dist/components/spinner/index.d.ts +1 -0
- package/dist/components/spinner/spinner.d.ts +3 -0
- package/dist/components/stat/index.d.ts +1 -0
- package/dist/components/stat/stat.d.ts +11 -0
- package/dist/components/stepper/index.d.ts +2 -0
- package/dist/components/stepper/step.d.ts +3 -0
- package/dist/components/stepper/stepper.d.ts +3 -0
- package/dist/components/switch/index.d.ts +1 -0
- package/dist/components/switch/switch.d.ts +16 -0
- package/dist/components/tab/index.d.ts +3 -0
- package/dist/components/tab/tab-panel.d.ts +7 -0
- package/dist/components/tab/tab.d.ts +8 -0
- package/dist/components/tab/tabs.d.ts +9 -0
- package/dist/components/table/index.d.ts +7 -0
- package/dist/components/table/table-body.d.ts +3 -0
- package/dist/components/table/table-cell.d.ts +3 -0
- package/dist/components/table/table-column.d.ts +11 -0
- package/dist/components/table/table-head.d.ts +3 -0
- package/dist/components/table/table-header.d.ts +3 -0
- package/dist/components/table/table-row.d.ts +3 -0
- package/dist/components/table/table.d.ts +16 -0
- package/dist/components/tag-group/index.d.ts +1 -0
- package/dist/components/tag-group/tag-group.d.ts +10 -0
- package/dist/components/textarea/index.d.ts +1 -0
- package/dist/components/textarea/textarea.d.ts +23 -0
- package/dist/components/time-field/index.d.ts +1 -0
- package/dist/components/time-field/time-field.d.ts +14 -0
- package/dist/components/toast/index.d.ts +2 -0
- package/dist/components/toast/toast.d.ts +19 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/tooltip.d.ts +9 -0
- package/dist/components/tree/index.d.ts +2 -0
- package/dist/components/tree/tree-item.d.ts +11 -0
- package/dist/components/tree/tree.d.ts +6 -0
- package/dist/components.js +123 -3120
- package/dist/components.js.map +1 -1
- package/dist/docs/blocks/chart-interactive.yaml +4 -10
- package/dist/docs/blocks/checkout-form.yaml +13 -13
- package/dist/docs/blocks/contributors.yaml +25 -26
- package/dist/docs/blocks/dashboard-layout.yaml +24 -42
- package/dist/docs/blocks/empty-state.yaml +4 -9
- package/dist/docs/blocks/env-variables.yaml +2 -2
- package/dist/docs/blocks/feature-upgrade.yaml +4 -4
- package/dist/docs/blocks/issue-assign.yaml +7 -7
- package/dist/docs/blocks/profile-card.yaml +8 -17
- package/dist/docs/blocks/settings-form.yaml +4 -4
- package/dist/docs/blocks/sidebar-nav.yaml +19 -19
- package/dist/docs/blocks/stat-cards.yaml +9 -26
- package/dist/docs/blocks/status-card.yaml +3 -3
- package/dist/docs/blocks/suggested-labs.yaml +4 -4
- package/dist/docs/blocks/survey-card.yaml +9 -9
- package/dist/docs/blocks/tabbed-panel.yaml +1 -1
- package/dist/docs/blocks/team-empty.yaml +6 -14
- package/dist/docs/blocks/usage-billing.yaml +12 -37
- package/dist/docs/components/alert.yaml +79 -0
- package/dist/docs/components/avatar-group.yaml +86 -0
- package/dist/docs/components/calendar-picker.yaml +142 -0
- package/dist/docs/components/calendar-range-picker.yaml +139 -0
- package/dist/docs/components/chip.yaml +91 -0
- package/dist/docs/components/code-block.yaml +126 -0
- package/dist/docs/components/color-picker.yaml +78 -0
- package/dist/docs/components/context-menu.yaml +102 -0
- package/dist/docs/components/date-field.yaml +115 -0
- package/dist/docs/components/disclosure-group.yaml +69 -0
- package/dist/docs/components/disclosure.yaml +81 -0
- package/dist/docs/components/dropdown-menu.yaml +146 -0
- package/dist/docs/components/hover-card.yaml +85 -0
- package/dist/docs/components/index.yaml +168 -0
- package/dist/docs/components/input.yaml +25 -0
- package/dist/docs/components/link.yaml +85 -0
- package/dist/docs/components/meter.yaml +89 -0
- package/dist/docs/components/nav-item.yaml +93 -0
- package/dist/docs/components/progress-circle.yaml +105 -0
- package/dist/docs/components/progress.yaml +104 -0
- package/dist/docs/components/skeleton.yaml +81 -0
- package/dist/docs/components/sparkline.yaml +88 -0
- package/dist/docs/components/spinner.yaml +75 -0
- package/dist/docs/components/step.yaml +91 -0
- package/dist/docs/components/stepper.yaml +91 -0
- package/dist/docs/components/tag-group.yaml +90 -0
- package/dist/docs/components/time-field.yaml +120 -0
- package/dist/element/agent-element.d.ts +29 -0
- package/dist/element/context.d.ts +20 -0
- package/dist/element/define.d.ts +2 -0
- package/dist/element/index.d.ts +4 -0
- package/dist/element/types.d.ts +23 -0
- package/dist/element.js +1 -1
- package/dist/icons.d.ts +1 -0
- package/dist/icons.js +49 -43
- package/dist/icons.js.map +1 -1
- package/dist/reactivity.js +1 -1
- package/dist/register.d.ts +1 -0
- package/dist/register.js +369 -342
- package/dist/register.js.map +1 -1
- package/dist/store.js +1 -1
- package/dist/styles-entry.d.ts +0 -0
- package/dist/traits/attach.d.ts +12 -0
- package/dist/traits/auto-dismiss/auto-dismiss.d.ts +0 -0
- package/dist/traits/auto-dismiss/auto-dismiss.trait.d.ts +2 -0
- package/dist/traits/backtick-wrap/backtick-wrap.d.ts +0 -0
- package/dist/traits/backtick-wrap/backtick-wrap.trait.d.ts +2 -0
- package/dist/traits/clipboard/clipboard.d.ts +0 -0
- package/dist/traits/clipboard/clipboard.trait.d.ts +2 -0
- package/dist/traits/collapsible/collapsible.d.ts +0 -0
- package/dist/traits/collapsible/collapsible.trait.d.ts +2 -0
- package/dist/traits/confetti/confetti.d.ts +0 -0
- package/dist/traits/confetti/confetti.trait.d.ts +2 -0
- package/dist/traits/copy/copy.d.ts +0 -0
- package/dist/traits/copy/copy.trait.d.ts +2 -0
- package/dist/traits/css-inspect/css-inspect-controller.d.ts +38 -0
- package/dist/traits/css-inspect/css-inspect.d.ts +0 -0
- package/dist/traits/css-inspect/css-inspect.trait.d.ts +2 -0
- package/dist/traits/dismiss/dismiss.d.ts +0 -0
- package/dist/traits/dismiss/dismiss.trait.d.ts +2 -0
- package/dist/traits/drag/drag.d.ts +0 -0
- package/dist/traits/drag/drag.trait.d.ts +2 -0
- package/dist/traits/drop-zone/drop-zone.d.ts +0 -0
- package/dist/traits/drop-zone/drop-zone.trait.d.ts +2 -0
- package/dist/traits/edit/edit.d.ts +0 -0
- package/dist/traits/edit/edit.trait.d.ts +2 -0
- package/dist/traits/flip/flip.d.ts +0 -0
- package/dist/traits/flip/flip.trait.d.ts +2 -0
- package/dist/traits/gateway/gateway.d.ts +0 -0
- package/dist/traits/gateway/gateway.trait.d.ts +2 -0
- package/dist/traits/hover/hover.d.ts +0 -0
- package/dist/traits/hover/hover.trait.d.ts +2 -0
- package/dist/traits/index.d.ts +6 -0
- package/dist/traits/intersect/intersect.d.ts +0 -0
- package/dist/traits/intersect/intersect.trait.d.ts +2 -0
- package/dist/traits/link-paste/link-paste.d.ts +0 -0
- package/dist/traits/link-paste/link-paste.trait.d.ts +2 -0
- package/dist/traits/linked-scroll/linked-scroll.d.ts +0 -0
- package/dist/traits/linked-scroll/linked-scroll.trait.d.ts +2 -0
- package/dist/traits/list-navigate/list-navigate.d.ts +0 -0
- package/dist/traits/list-navigate/list-navigate.trait.d.ts +2 -0
- package/dist/traits/magnet/magnet.d.ts +0 -0
- package/dist/traits/magnet/magnet.trait.d.ts +2 -0
- package/dist/traits/mention/mention.d.ts +0 -0
- package/dist/traits/mention/mention.trait.d.ts +2 -0
- package/dist/traits/modal/modal.d.ts +0 -0
- package/dist/traits/modal/modal.trait.d.ts +2 -0
- package/dist/traits/noodle/noodle.d.ts +0 -0
- package/dist/traits/noodle/noodle.trait.d.ts +2 -0
- package/dist/traits/overlay/overlay.d.ts +0 -0
- package/dist/traits/overlay/overlay.trait.d.ts +3 -0
- package/dist/traits/pan-zoom/pan-zoom.d.ts +0 -0
- package/dist/traits/pan-zoom/pan-zoom.trait.d.ts +2 -0
- package/dist/traits/parallax/parallax.d.ts +0 -0
- package/dist/traits/parallax/parallax.trait.d.ts +2 -0
- package/dist/traits/parse.d.ts +3 -0
- package/dist/traits/persist/persist.d.ts +0 -0
- package/dist/traits/persist/persist.trait.d.ts +2 -0
- package/dist/traits/popover/overlay.d.ts +2 -0
- package/dist/traits/popover/popover.d.ts +0 -0
- package/dist/traits/popover/popover.trait.d.ts +2 -0
- package/dist/traits/present/present.d.ts +0 -0
- package/dist/traits/present/present.trait.d.ts +2 -0
- package/dist/traits/press-hold/press-hold.d.ts +0 -0
- package/dist/traits/press-hold/press-hold.trait.d.ts +2 -0
- package/dist/traits/range-select/range-select.d.ts +0 -0
- package/dist/traits/range-select/range-select.trait.d.ts +2 -0
- package/dist/traits/registry.d.ts +17 -0
- package/dist/traits/resize/resize.d.ts +0 -0
- package/dist/traits/resize/resize.trait.d.ts +2 -0
- package/dist/traits/ripple/ripple.d.ts +0 -0
- package/dist/traits/ripple/ripple.trait.d.ts +2 -0
- package/dist/traits/roving-focus/roving-focus.d.ts +0 -0
- package/dist/traits/roving-focus/roving-focus.trait.d.ts +2 -0
- package/dist/traits/search/search.d.ts +0 -0
- package/dist/traits/search/search.trait.d.ts +2 -0
- package/dist/traits/selection/selection.d.ts +0 -0
- package/dist/traits/selection/selection.trait.d.ts +2 -0
- package/dist/traits/shortcut/shortcut.d.ts +0 -0
- package/dist/traits/shortcut/shortcut.trait.d.ts +2 -0
- package/dist/traits/slash-command/slash-command.d.ts +0 -0
- package/dist/traits/slash-command/slash-command.trait.d.ts +2 -0
- package/dist/traits/snap-resize/snap-resize.d.ts +0 -0
- package/dist/traits/snap-resize/snap-resize.trait.d.ts +2 -0
- package/dist/traits/sort/sort.d.ts +0 -0
- package/dist/traits/sort/sort.trait.d.ts +2 -0
- package/dist/traits/store/store.d.ts +0 -0
- package/dist/traits/store/store.trait.d.ts +2 -0
- package/dist/traits/swipe/swipe.d.ts +0 -0
- package/dist/traits/swipe/swipe.trait.d.ts +2 -0
- package/dist/traits/text-trigger/text-trigger.d.ts +0 -0
- package/dist/traits/text-trigger/text-trigger.trait.d.ts +2 -0
- package/dist/traits/toast/toast.d.ts +0 -0
- package/dist/traits/toast/toast.trait.d.ts +2 -0
- package/dist/traits/toggle-scheme/toggle-scheme.d.ts +0 -0
- package/dist/traits/toggle-scheme/toggle-scheme.trait.d.ts +2 -0
- package/dist/traits/toggle-state/toggle-state.d.ts +0 -0
- package/dist/traits/toggle-state/toggle-state.trait.d.ts +2 -0
- package/dist/traits/tooltip/tooltip.d.ts +0 -0
- package/dist/traits/tooltip/tooltip.trait.d.ts +2 -0
- package/dist/traits/toss/toss.d.ts +0 -0
- package/dist/traits/toss/toss.trait.d.ts +2 -0
- package/dist/traits/trap-focus/trap-focus.d.ts +0 -0
- package/dist/traits/trap-focus/trap-focus.trait.d.ts +2 -0
- package/dist/traits/types.d.ts +45 -0
- package/dist/traits/validate/validate.d.ts +0 -0
- package/dist/traits/validate/validate.trait.d.ts +2 -0
- package/dist/traits/virtual-scroll/virtual-scroll.d.ts +0 -0
- package/dist/traits/virtual-scroll/virtual-scroll.trait.d.ts +2 -0
- package/dist/traits.js +45 -45
- package/package.json +53 -14
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../src/components/table/table-column.ts","../src/components/canvas/canvas.ts","../src/components/calendar/store/calendar-store.ts","../src/components/calendar/calendar.ts","../src/components/noodles/noodle-controller.ts","../src/components/noodles/noodles.ts","../src/components/preview-app/preview-app.ts","../src/register.ts"],"sourcesContent":["// ── aui-table-column ──────────────────────────────────────────\n//\n// Declarative column definition for data-driven tables.\n// Config-only element — renders nothing, just holds metadata.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiTableColumn extends AgentElement {\n static override attributes: AttributeSchema = {\n key: { type: 'string', default: '' },\n label: { type: 'string', default: '' },\n sortable: { type: 'boolean', default: false },\n filterable: { type: 'boolean', default: false },\n width: { type: 'string', default: '1fr' },\n type: { type: 'enum', values: ['string', 'number', 'date'] as const, default: 'string' },\n align: { type: 'enum', values: ['start', 'center', 'end'] as const, default: 'start' },\n }\n\n declare key: string\n declare label: string\n declare sortable: boolean\n declare filterable: boolean\n declare width: string\n declare type: 'string' | 'number' | 'date'\n declare align: 'start' | 'center' | 'end'\n}\n","// ── aui-canvas ────────────────────────────────────────────────\n//\n// Versatile preview surface with pan/zoom, backgrounds, and\n// editor layout slots.\n//\n// DOM structure:\n// <aui-canvas>\n// [slot=\"leading\"] (user-provided, optional)\n// [slot=\"content\"] (user-provided or auto-created)\n// [data-viewport] (stamped when pan/zoom needed)\n// [slot=\"float-top\"] (user-provided, optional)\n// [data-transform] (holds panned/zoomed content)\n// ... content ...\n// [slot=\"float-bottom\"]\n// — OR —\n// ... content directly ... (simple mode)\n// [slot=\"trailing\"] (user-provided, optional)\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiCanvas extends AgentElement {\n static override attributes: AttributeSchema = {\n background: { type: 'string', default: 'none' },\n orientation: { type: 'string', default: 'horizontal' },\n 'pan-enabled': { type: 'boolean', default: false },\n 'zoom-enabled': { type: 'boolean', default: false },\n infinite: { type: 'boolean', default: false },\n bordered: { type: 'boolean', default: false },\n }\n\n declare background: string\n declare orientation: string\n declare bordered: boolean\n\n #viewport: HTMLElement | null = null\n #transform: HTMLElement | null = null\n #content: HTMLElement | null = null\n\n // Pan state\n #panX = 0\n #panY = 0\n #panning = false\n #panStartX = 0\n #panStartY = 0\n #panOriginX = 0\n #panOriginY = 0\n\n // Zoom state\n #zoom = 1\n\n // ── Public API ──\n\n get panX(): number { return this.#panX }\n get panY(): number { return this.#panY }\n get zoom(): number { return this.#zoom }\n\n /** Reset pan and zoom to defaults */\n reset(): void {\n this.#panX = 0\n this.#panY = 0\n this.#zoom = 1\n this.#applyTransform()\n this.#emitPan()\n this.#emitZoom()\n }\n\n /** Set pan position programmatically */\n panTo(x: number, y: number): void {\n this.#panX = x\n this.#panY = y\n this.#applyTransform()\n this.#emitPan()\n }\n\n /** Set zoom level programmatically */\n zoomTo(level: number): void {\n this.#zoom = Math.max(0.1, Math.min(10, level))\n this.#applyTransform()\n this.#emitZoom()\n }\n\n // ── Lifecycle ──\n\n protected override activate(): void {\n // Ensure a content slot exists\n this.#content = this.querySelector(':scope > [slot=\"content\"]')\n if (!this.#content) {\n this.#content = document.createElement('div')\n this.#content.setAttribute('slot', 'content')\n // Move all non-panel children into it\n const children = Array.from(this.childNodes)\n for (const child of children) {\n if (child instanceof HTMLElement) {\n const slot = child.getAttribute('slot')\n if (slot === 'leading' || slot === 'trailing') continue\n }\n this.#content.appendChild(child)\n }\n this.appendChild(this.#content)\n }\n\n const needsViewport = this.hasAttribute('pan-enabled')\n || this.hasAttribute('zoom-enabled')\n || this.hasAttribute('infinite')\n || this.#content.querySelector(':scope > [slot^=\"float-\"]')\n\n if (needsViewport) {\n this.#stamp()\n }\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0')\n }\n this.setAttribute('role', 'region')\n\n if (needsViewport) {\n this.addEventListener('keydown', this.#onKeyDown)\n }\n }\n\n protected override dispose(): void {\n const vp = this.#viewport\n if (vp) {\n vp.removeEventListener('pointerdown', this.#onPointerDown)\n vp.removeEventListener('pointermove', this.#onPointerMove)\n vp.removeEventListener('pointerup', this.#onPointerUp)\n vp.removeEventListener('pointercancel', this.#onPointerUp)\n vp.removeEventListener('wheel', this.#onWheel)\n }\n this.removeEventListener('keydown', this.#onKeyDown)\n }\n\n // ── DOM stamping ──\n\n #stamp(): void {\n const content = this.#content!\n\n // Create viewport inside content slot\n const viewport = document.createElement('div')\n viewport.setAttribute('data-viewport', '')\n\n // Create transform container\n const transform = document.createElement('div')\n transform.setAttribute('data-transform', '')\n\n // Move content slot's children into viewport/transform\n const children = Array.from(content.childNodes)\n for (const child of children) {\n if (child instanceof HTMLElement && child.getAttribute('slot')?.startsWith('float-')) {\n // Float slots go inside viewport but outside transform\n viewport.appendChild(child)\n continue\n }\n transform.appendChild(child)\n }\n\n viewport.appendChild(transform)\n content.appendChild(viewport)\n\n this.#viewport = viewport\n this.#transform = transform\n\n // Wire pan/zoom events on content slot (the visible area)\n const canPan = this.hasAttribute('pan-enabled') || this.hasAttribute('infinite')\n const canZoom = this.hasAttribute('zoom-enabled') || this.hasAttribute('infinite')\n\n if (canPan) {\n content.addEventListener('pointerdown', this.#onPointerDown)\n content.addEventListener('pointermove', this.#onPointerMove)\n content.addEventListener('pointerup', this.#onPointerUp)\n content.addEventListener('pointercancel', this.#onPointerUp)\n }\n\n if (canZoom) {\n content.addEventListener('wheel', this.#onWheel, { passive: false })\n }\n\n this.#applyTransform()\n }\n\n // ── Transform ──\n\n #applyTransform(): void {\n this.style.setProperty('--_canvas-x', `${this.#panX}px`)\n this.style.setProperty('--_canvas-y', `${this.#panY}px`)\n this.style.setProperty('--_canvas-zoom', String(this.#zoom))\n }\n\n #emitPan(): void {\n this.dispatchEvent(new CustomEvent('aui:canvas-pan', {\n bubbles: true, composed: true,\n detail: { x: this.#panX, y: this.#panY },\n }))\n }\n\n #emitZoom(): void {\n this.dispatchEvent(new CustomEvent('aui:canvas-zoom', {\n bubbles: true, composed: true,\n detail: { zoom: this.#zoom },\n }))\n }\n\n // ── Pan handlers ──\n\n #onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n\n // Don't start panning if clicking on content inside transform\n const target = e.target as HTMLElement\n const transform = this.#transform\n if (transform && transform.contains(target)) return\n\n this.#panning = true\n this.#panStartX = e.clientX\n this.#panStartY = e.clientY\n this.#panOriginX = this.#panX\n this.#panOriginY = this.#panY\n\n this.#content!.setPointerCapture(e.pointerId)\n this.setAttribute('data-canvas-panning', '')\n }\n\n #onPointerMove = (e: PointerEvent): void => {\n if (!this.#panning) return\n this.#panX = this.#panOriginX + (e.clientX - this.#panStartX)\n this.#panY = this.#panOriginY + (e.clientY - this.#panStartY)\n this.#applyTransform()\n }\n\n #onPointerUp = (_e: PointerEvent): void => {\n if (!this.#panning) return\n this.#panning = false\n this.removeAttribute('data-canvas-panning')\n this.#emitPan()\n }\n\n // ── Zoom handler ──\n\n #onWheel = (e: WheelEvent): void => {\n e.preventDefault()\n const delta = e.deltaY > 0 ? -0.05 : 0.05\n const newZoom = Math.max(0.1, Math.min(10, this.#zoom + delta * this.#zoom))\n\n if (this.#content) {\n const rect = this.#content.getBoundingClientRect()\n const px = (e.clientX - rect.left) / rect.width\n const py = (e.clientY - rect.top) / rect.height\n\n const scale = newZoom / this.#zoom\n this.#panX = px * rect.width * (1 - scale) + this.#panX * scale\n this.#panY = py * rect.height * (1 - scale) + this.#panY * scale\n }\n\n this.#zoom = newZoom\n this.#applyTransform()\n this.#emitZoom()\n }\n\n // ── Keyboard ──\n\n #onKeyDown = (e: KeyboardEvent): void => {\n switch (e.key) {\n case '0':\n e.preventDefault()\n this.#zoom = 1\n this.#applyTransform()\n this.#emitZoom()\n break\n case '+':\n case '=':\n e.preventDefault()\n this.zoomTo(this.#zoom * 1.15)\n break\n case '-':\n e.preventDefault()\n this.zoomTo(this.#zoom / 1.15)\n break\n case 'Escape':\n e.preventDefault()\n this.reset()\n break\n }\n }\n}\n","import { signal, computed, batch } from '#reactivity';\nimport type { Signal, ReadonlySignal } from '#reactivity';\n\nexport type CalendarView = 'day' | 'month' | 'year';\n\nexport interface CalendarStoreOptions {\n value?: string;\n min?: string;\n max?: string;\n rangeStart?: string;\n rangeEnd?: string;\n}\n\nfunction parseDate(str: string | null): Date | null {\n if (!str) return null;\n const d = new Date(str + 'T00:00:00');\n return isNaN(d.getTime()) ? null : d;\n}\n\nfunction toISO(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nexport class CalendarStore {\n readonly view: Signal<CalendarView>;\n readonly focusedYear: Signal<number>;\n readonly focusedMonth: Signal<number>;\n readonly value: Signal<string | null>;\n readonly rangeStart: Signal<string | null>;\n readonly rangeEnd: Signal<string | null>;\n readonly min: Signal<string | null>;\n readonly max: Signal<string | null>;\n\n // WHY: Computed grid of day cells for the focused month view\n readonly days: ReadonlySignal<DayCell[]>;\n readonly months: ReadonlySignal<MonthCell[]>;\n readonly years: ReadonlySignal<YearCell[]>;\n readonly title: ReadonlySignal<string>;\n\n constructor(options: CalendarStoreOptions = {}) {\n const now = new Date();\n const initial = parseDate(options.value ?? null) ?? now;\n\n this.view = signal<CalendarView>('day');\n this.focusedYear = signal(initial.getFullYear());\n this.focusedMonth = signal(initial.getMonth());\n this.value = signal(options.value ?? null);\n this.rangeStart = signal(options.rangeStart ?? null);\n this.rangeEnd = signal(options.rangeEnd ?? null);\n this.min = signal(options.min ?? null);\n this.max = signal(options.max ?? null);\n\n this.days = computed(() => this.#computeDays());\n this.months = computed(() => this.#computeMonths());\n this.years = computed(() => this.#computeYears());\n this.title = computed(() => this.#computeTitle());\n }\n\n // ── Navigation ──\n\n prevMonth(): void {\n batch(() => {\n if (this.focusedMonth.value === 0) {\n this.focusedMonth.value = 11;\n this.focusedYear.value--;\n } else {\n this.focusedMonth.value--;\n }\n });\n }\n\n nextMonth(): void {\n batch(() => {\n if (this.focusedMonth.value === 11) {\n this.focusedMonth.value = 0;\n this.focusedYear.value++;\n } else {\n this.focusedMonth.value++;\n }\n });\n }\n\n prevYear(): void {\n this.focusedYear.value--;\n }\n\n nextYear(): void {\n this.focusedYear.value++;\n }\n\n prevDecade(): void {\n this.focusedYear.value -= 10;\n }\n\n nextDecade(): void {\n this.focusedYear.value += 10;\n }\n\n // ── Selection ──\n\n selectDate(iso: string): void {\n this.value.value = iso;\n }\n\n selectMonth(month: number): void {\n batch(() => {\n this.focusedMonth.value = month;\n this.view.value = 'day';\n });\n }\n\n selectYear(year: number): void {\n batch(() => {\n this.focusedYear.value = year;\n this.view.value = 'month';\n });\n }\n\n // ── Range ──\n\n setRange(start: string | null, end: string | null): void {\n batch(() => {\n this.rangeStart.value = start;\n this.rangeEnd.value = end;\n });\n }\n\n // ── Validation ──\n\n isDateDisabled(iso: string): boolean {\n const minDate = parseDate(this.min.value);\n const maxDate = parseDate(this.max.value);\n const d = parseDate(iso);\n if (!d) return true;\n if (minDate && d < minDate) return true;\n if (maxDate && d > maxDate) return true;\n return false;\n }\n\n // ── Private Computations ──\n\n #computeDays(): DayCell[] {\n const year = this.focusedYear.value;\n const month = this.focusedMonth.value;\n const selected = parseDate(this.value.value);\n const today = new Date();\n const rangeStartDate = parseDate(this.rangeStart.value);\n const rangeEndDate = parseDate(this.rangeEnd.value);\n\n // WHY: Start grid from the Sunday of the week containing the 1st\n const first = new Date(year, month, 1);\n const startDay = first.getDay(); // 0=Sun\n const gridStart = new Date(year, month, 1 - startDay);\n\n const cells: DayCell[] = [];\n for (let i = 0; i < 42; i++) {\n const d = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i);\n const iso = toISO(d);\n const inMonth = d.getMonth() === month;\n const isToday = isSameDay(d, today);\n const isSelected = selected ? isSameDay(d, selected) : false;\n const isDisabled = this.isDateDisabled(iso);\n\n let inRange = false;\n let isRangeStart = false;\n let isRangeEnd = false;\n\n if (rangeStartDate && rangeEndDate) {\n const lo = rangeStartDate <= rangeEndDate ? rangeStartDate : rangeEndDate;\n const hi = rangeStartDate <= rangeEndDate ? rangeEndDate : rangeStartDate;\n inRange = d >= lo && d <= hi;\n isRangeStart = isSameDay(d, lo);\n isRangeEnd = isSameDay(d, hi);\n }\n\n cells.push({\n date: iso,\n day: d.getDate(),\n inMonth,\n isToday,\n isSelected,\n isDisabled,\n inRange,\n isRangeStart,\n isRangeEnd,\n });\n }\n return cells;\n }\n\n #computeMonths(): MonthCell[] {\n const year = this.focusedYear.value;\n const currentMonth = this.focusedMonth.value;\n const names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n return names.map((name, i) => ({\n month: i,\n name,\n isCurrent: i === currentMonth && year === new Date().getFullYear(),\n isSelected: i === currentMonth,\n }));\n }\n\n #computeYears(): YearCell[] {\n const focused = this.focusedYear.value;\n const decadeStart = Math.floor(focused / 10) * 10;\n const thisYear = new Date().getFullYear();\n\n const cells: YearCell[] = [];\n for (let y = decadeStart - 1; y <= decadeStart + 10; y++) {\n cells.push({\n year: y,\n inDecade: y >= decadeStart && y < decadeStart + 10,\n isCurrent: y === thisYear,\n isSelected: y === focused,\n });\n }\n return cells;\n }\n\n #computeTitle(): string {\n const monthNames = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n\n switch (this.view.value) {\n case 'day':\n return `${monthNames[this.focusedMonth.value]} ${this.focusedYear.value}`;\n case 'month':\n return `${this.focusedYear.value}`;\n case 'year': {\n const decadeStart = Math.floor(this.focusedYear.value / 10) * 10;\n return `${decadeStart}–${decadeStart + 9}`;\n }\n }\n }\n}\n\nexport interface DayCell {\n date: string; // ISO string\n day: number; // day of month\n inMonth: boolean; // belongs to focused month\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n inRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\nexport interface MonthCell {\n month: number;\n name: string;\n isCurrent: boolean;\n isSelected: boolean;\n}\n\nexport interface YearCell {\n year: number;\n inDecade: boolean;\n isCurrent: boolean;\n isSelected: boolean;\n}\n\nexport function createCalendarStore(options: CalendarStoreOptions = {}): CalendarStore {\n return new CalendarStore(options);\n}\n","import { AgentElement } from '#element';\nimport type { AttributeSchema } from '#element';\nimport { signal, batch } from '#reactivity';\nimport { CalendarStore } from './store/calendar-store.ts';\n\n/**\n * Calendar date picker with day/month/year views and optional range selection.\n * @attr {string} value - Selected date in ISO format (YYYY-MM-DD)\n * @attr {string} min - Minimum selectable date in ISO format\n * @attr {string} max - Maximum selectable date in ISO format\n * @attr {boolean} disabled - Disables interaction\n * @attr {boolean} range - Enables range selection mode\n * @fires change - Fired on single date selection with `{ value }` detail\n * @fires aui:range-select - Fired on range commit with `{ start, end }` detail\n */\nexport class AuiCalendar extends AgentElement {\n static override attributes: AttributeSchema = {\n value: { type: 'string', default: '' },\n min: { type: 'string', default: '' },\n max: { type: 'string', default: '' },\n disabled: { type: 'boolean', default: false },\n range: { type: 'boolean', default: false },\n };\n\n #internals: ElementInternals;\n #store = new CalendarStore();\n #disabled = signal(false);\n\n // WHY: Track focused cell index for keyboard navigation within the grid\n #focusedIndex = signal(0);\n\n // WHY: 3-phase range cycle: idle → selecting (hover previews) → committed → idle\n #rangePhase: 'idle' | 'selecting' | 'committed' = 'idle';\n\n // WHY: Drag-based range selection — pointerdown starts, pointermove previews, pointerup commits\n #dragging = false;\n\n constructor() {\n super();\n this.#internals = this.attachInternals();\n this.#internals.role = 'group';\n }\n\n get store(): CalendarStore {\n return this.#store;\n }\n\n get value(): string | null {\n return this.#store.value.value;\n }\n\n set value(val: string | null) {\n this.#store.value.value = val;\n if (val) {\n this.setAttribute('value', val);\n } else {\n this.removeAttribute('value');\n }\n }\n\n get disabled(): boolean {\n return this.#disabled.value;\n }\n\n set disabled(val: boolean) {\n this.#disabled.value = val;\n this.toggleAttribute('disabled', val);\n }\n\n get range(): boolean {\n return this.hasAttribute('range');\n }\n\n attributeChangedCallback(name: string, old: string | null, val: string | null): void {\n if (old === val) return;\n switch (name) {\n case 'value':\n this.#store.value.value = val;\n break;\n case 'min':\n this.#store.min.value = val;\n break;\n case 'max':\n this.#store.max.value = val;\n break;\n case 'disabled':\n this.#disabled.value = val !== null;\n break;\n case 'range':\n // WHY: When range mode is toggled, reset the range phase and clear any pending range state\n this.#rangePhase = 'idle';\n this.#store.setRange(null, null);\n break;\n }\n super.attributeChangedCallback?.(name, old, val);\n }\n\n protected override activate(): void {\n super.activate();\n // WHY: Moved from constructor — spec forbids setAttribute in constructor\n if (!this.hasAttribute('tabindex')) this.setAttribute('tabindex', '0');\n\n // WHY: Initialize store from attributes — batch to avoid 3 intermediate recomputes\n const val = this.getAttribute('value');\n const min = this.getAttribute('min');\n const max = this.getAttribute('max');\n batch(() => {\n if (val) this.#store.value.value = val;\n if (min) this.#store.min.value = min;\n if (max) this.#store.max.value = max;\n });\n\n // Stamp internal structure\n this.#stamp();\n\n this.addEventListener('keydown', this.#onKeyDown);\n\n // WHY: Single effect re-renders the calendar whenever store state changes\n this.addEffect(() => this.#render());\n\n // WHY: Label the calendar group with current title (month/year) for screen readers\n this.addEffect(() => {\n this.setAttribute('aria-label', this.#store.title.value);\n });\n }\n\n protected override dispose(): void {\n this.querySelector('aui-button[data-role=\"prev\"]')?.removeEventListener('click', this.#onPrevClick);\n this.querySelector('aui-button[data-role=\"next\"]')?.removeEventListener('click', this.#onNextClick);\n this.querySelector('aui-button[data-role=\"title\"]')?.removeEventListener('click', this.#onTitleClickHandler);\n const grid = this.querySelector('[data-cal-grid]');\n grid?.removeEventListener('click', this.#onGridClickHandler);\n grid?.removeEventListener('pointermove', this.#onGridPointerMoveHandler);\n grid?.removeEventListener('pointerdown', this.#onGridPointerDownHandler);\n grid?.removeEventListener('pointerup', this.#onGridPointerUpHandler);\n this.removeEventListener('keydown', this.#onKeyDown);\n super.dispose();\n }\n\n #stamp(): void {\n this.innerHTML = `\n <div data-cal-header>\n <aui-button data-role=\"prev\" aria-label=\"Previous\" tabindex=\"-1\"><aui-icon name=\"caret-left\"></aui-icon></aui-button>\n <aui-button data-role=\"title\" tabindex=\"-1\"></aui-button>\n <aui-button data-role=\"next\" aria-label=\"Next\" tabindex=\"-1\"><aui-icon name=\"caret-right\"></aui-icon></aui-button>\n </div>\n <div data-cal-weekdays></div>\n <div data-cal-grid role=\"grid\"></div>\n `;\n\n // WHY: aui-button's disabled effect sets tabindex=\"0\" on enabled buttons.\n // Calendar uses roving focus on the container — children must be tabindex=\"-1\".\n for (const btn of this.querySelectorAll('[data-cal-header] aui-button')) {\n btn.setAttribute('tabindex', '-1');\n }\n\n const prev = this.querySelector('aui-button[data-role=\"prev\"]') as HTMLElement | null;\n const next = this.querySelector('aui-button[data-role=\"next\"]') as HTMLElement | null;\n const title = this.querySelector('aui-button[data-role=\"title\"]') as HTMLElement | null;\n\n prev?.addEventListener('click', this.#onPrevClick);\n next?.addEventListener('click', this.#onNextClick);\n title?.addEventListener('click', this.#onTitleClickHandler);\n\n const grid = this.querySelector('[data-cal-grid]') as HTMLElement | null;\n grid?.addEventListener('click', this.#onGridClickHandler);\n grid?.addEventListener('pointermove', this.#onGridPointerMoveHandler);\n grid?.addEventListener('pointerdown', this.#onGridPointerDownHandler);\n grid?.addEventListener('pointerup', this.#onGridPointerUpHandler);\n }\n\n #render(): void {\n const view = this.#store.view.value;\n const title = this.querySelector('aui-button[data-role=\"title\"]') as HTMLElement | null;\n const weekdays = this.querySelector('[data-cal-weekdays]') as HTMLElement | null;\n const grid = this.querySelector('[data-cal-grid]') as HTMLElement | null;\n if (!title || !weekdays || !grid) return;\n\n title.textContent = this.#store.title.value;\n\n if (view === 'day') {\n this.setAttribute('view', 'day');\n weekdays.innerHTML = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n .map(d => `<span data-cal-weekday>${d}</span>`)\n .join('');\n\n const days = this.#store.days.value;\n grid.innerHTML = days.map((cell, i) => {\n let attrs = `data-date=\"${cell.date}\" data-index=\"${i}\" tabindex=\"-1\"`;\n if (!cell.inMonth) attrs += ' data-outside';\n if (cell.isToday) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n if (cell.isDisabled) attrs += ' disabled';\n if (cell.inRange) attrs += ' data-in-range';\n if (cell.isRangeStart) attrs += ' data-range-start';\n if (cell.isRangeEnd) attrs += ' data-range-end';\n\n return `<div data-cal-day ${attrs}>${cell.day}</div>`;\n }).join('');\n\n } else if (view === 'month') {\n this.setAttribute('view', 'month');\n weekdays.innerHTML = '';\n\n const months = this.#store.months.value;\n grid.innerHTML = months.map(cell => {\n let attrs = `data-month=\"${cell.month}\" tabindex=\"-1\"`;\n if (cell.isCurrent) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n\n return `<div data-cal-cell ${attrs}>${cell.name}</div>`;\n }).join('');\n\n } else {\n this.setAttribute('view', 'year');\n weekdays.innerHTML = '';\n\n const years = this.#store.years.value;\n grid.innerHTML = years.map(cell => {\n let attrs = `data-year=\"${cell.year}\" tabindex=\"-1\"`;\n if (!cell.inDecade) attrs += ' data-outside';\n if (cell.isCurrent) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n\n return `<div data-cal-cell ${attrs}>${cell.year}</div>`;\n }).join('');\n }\n\n // WHY: Ensure all interactive cells are not independently tabbable —\n // Calendar uses roving focus on the container.\n for (const cell of grid.querySelectorAll('[data-cal-day]:not([disabled]), [data-cal-cell]')) {\n cell.setAttribute('tabindex', '-1');\n }\n }\n\n #onPrevClick = (): void => { this.#onPrev(); };\n #onNextClick = (): void => { this.#onNext(); };\n #onTitleClickHandler = (): void => { this.#onTitleClick(); };\n #onGridClickHandler = (e: Event): void => { this.#onGridClick(e as MouseEvent); };\n #onGridPointerMoveHandler = (e: Event): void => { this.#onGridPointerMove(e as PointerEvent); };\n #onGridPointerDownHandler = (e: Event): void => { this.#onGridPointerDown(e as PointerEvent); };\n #onGridPointerUpHandler = (e: Event): void => { this.#onGridPointerUp(e as PointerEvent); };\n\n #onPrev(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.prevMonth();\n else if (view === 'month') this.#store.prevYear();\n else this.#store.prevDecade();\n }\n\n #onNext(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.nextMonth();\n else if (view === 'month') this.#store.nextYear();\n else this.#store.nextDecade();\n }\n\n #onTitleClick(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.view.value = 'month';\n else if (view === 'month') this.#store.view.value = 'year';\n }\n\n #onGridClick(e: MouseEvent): void {\n if (this.#disabled.value) return;\n const cell = (e.target as HTMLElement).closest('[data-cal-day], [data-cal-cell]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n\n const date = cell.dataset.date;\n const month = cell.dataset.month;\n const year = cell.dataset.year;\n\n if (date) {\n this.#selectDate(date);\n } else if (month !== undefined) {\n this.#store.selectMonth(Number(month));\n } else if (year !== undefined) {\n this.#store.selectYear(Number(year));\n }\n }\n\n #selectDate(iso: string): void {\n if (this.range) {\n // Range selection supports two interaction modes:\n // 1. Click-click: click start, move to preview, click end\n // 2. Click-drag: pointerdown starts, drag to preview, pointerup commits\n // Both modes allow continued dragging after the second click until mouse release.\n if (this.#rangePhase === 'idle') {\n // Start a new range\n batch(() => {\n this.#store.selectDate(iso);\n this.#store.setRange(iso, null);\n });\n this.setAttribute('value', iso);\n this.#rangePhase = 'selecting';\n } else if (this.#rangePhase === 'selecting') {\n // Commit the range\n this.#commitRange(iso);\n } else {\n // committed → clear everything and start fresh\n batch(() => {\n this.#store.value.value = null;\n this.#store.setRange(null, null);\n });\n this.removeAttribute('value');\n this.#rangePhase = 'idle';\n }\n } else {\n this.#store.selectDate(iso);\n this.setAttribute('value', iso);\n this.dispatchEvent(new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: iso },\n }));\n }\n }\n\n #commitRange(iso: string): void {\n const start = this.#store.rangeStart.value;\n if (!start) return;\n this.#store.setRange(start, iso);\n this.#rangePhase = 'committed';\n this.#dragging = false;\n this.dispatchEvent(new CustomEvent('aui:range-select', {\n bubbles: true,\n composed: true,\n detail: { start: this.#store.rangeStart.value, end: this.#store.rangeEnd.value },\n }));\n }\n\n #onGridPointerDown(e: PointerEvent): void {\n if (this.#disabled.value) return;\n if (!this.range) return;\n if (e.button !== 0) return;\n\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n\n // Start dragging — begin range from this date\n this.#dragging = true;\n\n if (this.#rangePhase === 'idle' || this.#rangePhase === 'committed') {\n // Fresh drag start\n batch(() => {\n this.#store.selectDate(date);\n this.#store.setRange(date, null);\n });\n this.setAttribute('value', date);\n this.#rangePhase = 'selecting';\n }\n // If already selecting (click-click mode), dragging just continues the preview\n }\n\n #onGridPointerUp(e: PointerEvent): void {\n if (!this.#dragging) return;\n this.#dragging = false;\n\n if (this.#rangePhase !== 'selecting') return;\n\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n\n // If pointer up is on a different cell than start, commit the range\n const start = this.#store.rangeStart.value;\n if (start && start !== date) {\n this.#commitRange(date);\n }\n // If same cell, stay in selecting mode (click-click flow continues)\n }\n\n #onGridPointerMove(e: PointerEvent): void {\n if (this.#disabled.value) return;\n if (!this.range) return;\n // Preview range during: selecting phase (click-click hover) OR active drag\n if (this.#rangePhase !== 'selecting') return;\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n const start = this.#store.rangeStart.value;\n if (!start) return;\n this.#store.setRange(start, date);\n }\n\n #onKeyDown = (e: KeyboardEvent): void => {\n if (this.#disabled.value) return;\n\n const view = this.#store.view.value;\n if (view !== 'day') return;\n\n const days = this.#store.days.value;\n let idx = this.#focusedIndex.value;\n let handled = true;\n\n switch (e.key) {\n case 'ArrowRight': idx += 1; break;\n case 'ArrowLeft': idx -= 1; break;\n case 'ArrowDown': idx += 7; break;\n case 'ArrowUp': idx -= 7; break;\n case 'Home':\n // WHY: Jump to first day of current week\n idx = idx - (idx % 7);\n break;\n case 'End':\n idx = idx - (idx % 7) + 6;\n break;\n case 'PageDown':\n e.shiftKey ? this.#store.nextYear() : this.#store.nextMonth();\n break;\n case 'PageUp':\n e.shiftKey ? this.#store.prevYear() : this.#store.prevMonth();\n break;\n case 'Enter':\n case ' ': {\n const cell = days[idx];\n if (cell && !cell.isDisabled) {\n this.#selectDate(cell.date);\n }\n break;\n }\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n idx = Math.max(0, Math.min(41, idx));\n this.#focusedIndex.value = idx;\n\n // WHY: Navigate to prev/next month if focus moves outside current grid\n if (idx < 0) this.#store.prevMonth();\n if (idx > 41) this.#store.nextMonth();\n }\n };\n}\n","// ── NoodleController ─────────────────────────────────────────\n//\n// Pure-JS controller that renders SVG noodle connections between\n// DOM elements within a host container. Handles coordinate math,\n// path rendering, port indicators, and drag-to-connect interactions.\n//\n// Ported from native-ui NoodleController with aui: event prefix\n// and --aui- CSS custom property prefix.\n\n// ── UID helper (no external deps) ──\n\nlet _counter = 0\nfunction uid(prefix: string): string {\n return `${prefix}-${Date.now().toString(36)}-${(++_counter).toString(36)}`\n}\n\n// ── Types ──\n\nexport type PortSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface NoodleConnection {\n /** Unique connection ID (auto-generated via uid if not provided) */\n id: string\n /** Element ID for the source element */\n from: string\n /** Element ID for the target element */\n to: string\n /** Port side on the source element (default: 'right') */\n fromPort: PortSide\n /** Port side on the target element (default: 'left') */\n toPort: PortSide\n /** Optional color override for this specific noodle */\n color?: string\n}\n\nexport interface NoodleOptions {\n /** CSS selector for elements that can be connection endpoints (default: '[data-noodle-port]') */\n selector?: string\n /** Allow interactive creation/deletion of connections (default: false) */\n editable?: boolean\n /** Noodle stroke color (default: 'var(--aui-accent-500)') */\n color?: string\n /** Noodle stroke width in px (default: 2) */\n strokeWidth?: number\n /** Bezier curve tension -- how far control points extend (default: 0.5) */\n tension?: number\n /** Show port indicator dots on connectable elements (default: true when editable) */\n showPorts?: boolean\n /** Port indicator dot size in px (default: 10) */\n portSize?: number\n /** Initial connections (default: []) */\n connections?: NoodleConnection[]\n /** Noodle curve style (default: 'bezier') */\n style?: 'bezier' | 'step' | 'straight'\n /** Animate noodles with a flowing dash pattern (default: false) */\n animated?: boolean\n /** Disable the controller */\n disabled?: boolean\n}\n\n/** Proximity threshold (px) for snap-to-port drop detection */\nconst DROP_SNAP_RADIUS = 50\n\ninterface DragState {\n fromElement: HTMLElement\n fromPort: PortSide\n fromId: string\n pointerId: number\n sourceDot: HTMLElement\n /** Set when reconnecting an existing connection (detached at drag start) */\n reconnectId?: string\n}\n\nconst NS = 'http://www.w3.org/2000/svg'\n\n/** Renders SVG noodle connections between DOM elements within a host container. */\nexport class NoodleController {\n readonly host: HTMLElement\n\n // ── Public mutable options ──\n selector: string\n editable: boolean\n color: string\n strokeWidth: number\n tension: number\n showPorts: boolean\n portSize: number\n style: 'bezier' | 'step' | 'straight'\n animated: boolean\n disabled: boolean\n\n // ── Private state ──\n #attached = false\n #svg: SVGSVGElement | null = null\n #connections: Map<string, NoodleConnection> = new Map()\n #pathGroup: SVGGElement | null = null\n #hitGroup: SVGGElement | null = null\n #portElements: HTMLElement[] = []\n #dragState: DragState | null = null\n #dragPath: SVGPathElement | null = null\n #resizeObserver: ResizeObserver | null = null\n #mutationObserver: MutationObserver | null = null\n #rafId = 0\n #updateQueued = false\n #suppressObserver = false\n #styleEl: HTMLStyleElement | null = null\n\n constructor(host: HTMLElement, options: NoodleOptions = {}) {\n this.host = host\n this.selector = options.selector ?? '[data-noodle-port]'\n this.editable = options.editable ?? false\n this.color = options.color ?? 'var(--aui-accent-500)'\n this.strokeWidth = options.strokeWidth ?? 2\n this.tension = options.tension ?? 0.5\n this.showPorts = options.showPorts ?? this.editable\n this.portSize = options.portSize ?? 10\n this.style = options.style ?? 'bezier'\n this.animated = options.animated ?? false\n this.disabled = options.disabled ?? false\n\n if (options.connections) {\n for (const c of options.connections) {\n this.#connections.set(c.id, {\n ...c,\n fromPort: c.fromPort ?? 'right',\n toPort: c.toPort ?? 'left',\n })\n }\n }\n\n this.attach()\n }\n\n // ── Lifecycle ──\n\n attach(): void {\n if (this.#attached) return\n this.#attached = true\n\n // Ensure host is positioned and establishes a stacking context\n // WHY: isolation prevents the SVG overlay and port dots from bleeding\n // through sibling elements outside the noodle host.\n const pos = getComputedStyle(this.host).position\n if (pos === 'static') this.host.style.position = 'relative'\n this.host.style.isolation = 'isolate'\n\n this.#createSVG()\n this.#injectKeyframes()\n this.#startObserving()\n\n if (this.showPorts) this.#createPortIndicators()\n\n // Listen for drag events from MagnetController / DragController\n this.host.addEventListener('aui:magnet-snap', this.#onExternalMove)\n this.host.addEventListener('aui:magnet-drop', this.#onExternalMove)\n this.host.addEventListener('aui:drag-move', this.#onExternalMove)\n\n this.#renderAllPaths()\n }\n\n detach(): void {\n if (!this.#attached) return\n this.#attached = false\n\n this.#stopObserving()\n this.#removePortIndicators()\n this.#removeSVG()\n this.#removeKeyframes()\n this.host.style.isolation = ''\n\n this.host.removeEventListener('aui:magnet-snap', this.#onExternalMove)\n this.host.removeEventListener('aui:magnet-drop', this.#onExternalMove)\n this.host.removeEventListener('aui:drag-move', this.#onExternalMove)\n\n if (this.#rafId) {\n cancelAnimationFrame(this.#rafId)\n this.#rafId = 0\n }\n this.#updateQueued = false\n }\n\n destroy(): void {\n this.#endDrag()\n this.detach()\n this.#connections.clear()\n }\n\n // ── Public API ──\n\n /** Add a connection. Returns the connection ID. */\n connect(from: string, to: string, fromPort: PortSide = 'right', toPort: PortSide = 'left'): string {\n const id = uid('noodle')\n const conn: NoodleConnection = { id, from, to, fromPort, toPort }\n this.#connections.set(id, conn)\n this.#renderAllPaths()\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-connect', {\n bubbles: true, composed: true,\n detail: { id, from, to, fromPort, toPort },\n }))\n\n return id\n }\n\n /** Remove a connection by ID. */\n disconnect(id: string): boolean {\n const conn = this.#connections.get(id)\n if (!conn) return false\n this.#connections.delete(id)\n this.#renderAllPaths()\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-disconnect', {\n bubbles: true, composed: true,\n detail: { id, from: conn.from, to: conn.to, fromPort: conn.fromPort, toPort: conn.toPort },\n }))\n\n return true\n }\n\n /** Remove all connections. */\n clear(): void {\n const conns = [...this.#connections.values()]\n this.#connections.clear()\n this.#renderAllPaths()\n for (const conn of conns) {\n this.host.dispatchEvent(new CustomEvent('aui:noodle-disconnect', {\n bubbles: true, composed: true,\n detail: { id: conn.id, from: conn.from, to: conn.to, fromPort: conn.fromPort, toPort: conn.toPort },\n }))\n }\n }\n\n /** Get all current connections. */\n getConnections(): NoodleConnection[] {\n return [...this.#connections.values()]\n }\n\n /** Replace all connections. */\n setConnections(connections: NoodleConnection[]): void {\n this.#connections.clear()\n for (const c of connections) {\n this.#connections.set(c.id ?? uid('noodle'), {\n ...c,\n fromPort: c.fromPort ?? 'right',\n toPort: c.toPort ?? 'left',\n })\n }\n this.#renderAllPaths()\n }\n\n /** Force re-render all paths and rebuild port indicators.\n * Call after programmatic element moves or when the set of port elements changes. */\n update(): void {\n this.#renderAllPaths()\n // WHY: Skip port recreation during active drag -- it would destroy\n // data-noodle-droppable attrs and the source dot's pointer capture.\n if (this.showPorts && !this.#dragState) this.#createPortIndicators()\n }\n\n // ── SVG overlay ──\n\n #createSVG(): void {\n const svg = document.createElementNS(NS, 'svg')\n svg.setAttribute('data-noodle-svg', '')\n svg.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;z-index:0;'\n // Groups: hit areas behind visible paths\n this.#hitGroup = document.createElementNS(NS, 'g')\n this.#hitGroup.setAttribute('data-noodle-hits', '')\n svg.appendChild(this.#hitGroup)\n this.#pathGroup = document.createElementNS(NS, 'g')\n this.#pathGroup.setAttribute('data-noodle-paths', '')\n svg.appendChild(this.#pathGroup)\n this.host.appendChild(svg)\n this.#svg = svg\n }\n\n #removeSVG(): void {\n this.#svg?.remove()\n this.#svg = null\n this.#pathGroup = null\n this.#hitGroup = null\n }\n\n #injectKeyframes(): void {\n if (this.#styleEl) return\n const style = document.createElement('style')\n style.textContent = '@keyframes noodle-flow{to{stroke-dashoffset:-12}}'\n this.host.appendChild(style)\n this.#styleEl = style\n }\n\n #removeKeyframes(): void {\n this.#styleEl?.remove()\n this.#styleEl = null\n }\n\n // ── Coordinate helpers ──\n\n /** Convert client (screen) coordinates to the host's layout coordinate space,\n * accounting for CSS transforms (zoom/pan) on the host or its ancestors. */\n #clientToLocal(clientX: number, clientY: number): { x: number; y: number } {\n const hostRect = this.host.getBoundingClientRect()\n // Detect transform scale by comparing visual size to layout size\n const scaleX = hostRect.width / (this.host.clientWidth || 1)\n const scaleY = hostRect.height / (this.host.clientHeight || 1)\n return {\n x: (clientX - hostRect.left) / scaleX,\n y: (clientY - hostRect.top) / scaleY,\n }\n }\n\n // ── Path computation ──\n\n #getPortPosition(elementId: string, port: PortSide): { x: number; y: number } | null {\n const el = this.host.querySelector(`#${CSS.escape(elementId)}`) as HTMLElement | null\n if (!el) return null\n\n // Use offset-based positioning instead of getBoundingClientRect --\n // ports and SVG paths are positioned in the host's layout coordinate space,\n // which must ignore CSS transforms on ancestor elements (e.g. zoom/pan).\n let x = 0, y = 0\n let current: HTMLElement | null = el\n while (current && current !== this.host) {\n x += current.offsetLeft\n y += current.offsetTop\n // Account for inline translate (e.g. MagnetController drag)\n const translate = current.style.translate\n if (translate) {\n const parts = translate.match(/-?[\\d.]+/g)\n if (parts) { x += parseFloat(parts[0]) || 0; y += parseFloat(parts[1]) || 0 }\n }\n current = current.offsetParent as HTMLElement | null\n }\n\n const w = el.offsetWidth\n const h = el.offsetHeight\n\n switch (port) {\n case 'top': return { x: x + w / 2, y }\n case 'right': return { x: x + w, y: y + h / 2 }\n case 'bottom': return { x: x + w / 2, y: y + h }\n case 'left': return { x, y: y + h / 2 }\n }\n }\n\n #controlPoint(x: number, y: number, port: PortSide, offset: number): [number, number] {\n switch (port) {\n case 'right': return [x + offset, y]\n case 'left': return [x - offset, y]\n case 'bottom': return [x, y + offset]\n case 'top': return [x, y - offset]\n }\n }\n\n #computePath(conn: NoodleConnection): string | null {\n const p1 = this.#getPortPosition(conn.from, conn.fromPort)\n const p2 = this.#getPortPosition(conn.to, conn.toPort)\n if (!p1 || !p2) return null\n\n switch (this.style) {\n case 'straight':\n return `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`\n case 'step': {\n const mx = (p1.x + p2.x) / 2\n return `M ${p1.x} ${p1.y} L ${mx} ${p1.y} L ${mx} ${p2.y} L ${p2.x} ${p2.y}`\n }\n case 'bezier':\n default: {\n const dist = Math.max(Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, conn.fromPort, offset)\n const [cx2, cy2] = this.#controlPoint(p2.x, p2.y, conn.toPort, offset)\n return `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${cx2} ${cy2}, ${p2.x} ${p2.y}`\n }\n }\n }\n\n // ── Rendering ──\n\n #renderAllPaths(): void {\n if (!this.#pathGroup || !this.#hitGroup) return\n\n this.#suppressObserver = true\n\n // Clear existing\n this.#pathGroup.textContent = ''\n this.#hitGroup.textContent = ''\n\n // Re-render temp drag path if active\n if (this.#dragPath) this.#pathGroup.appendChild(this.#dragPath)\n\n for (const conn of this.#connections.values()) {\n const d = this.#computePath(conn)\n if (!d) continue\n\n // Hit area (edit mode)\n if (this.editable) {\n const hit = document.createElementNS(NS, 'path')\n hit.setAttribute('d', d)\n hit.setAttribute('stroke', 'transparent')\n hit.setAttribute('stroke-width', '14')\n hit.setAttribute('fill', 'none')\n hit.style.pointerEvents = 'stroke'\n hit.style.cursor = 'pointer'\n hit.dataset.noodleId = conn.id\n hit.addEventListener('pointerdown', this.#onHitPointerDown)\n this.#hitGroup.appendChild(hit)\n }\n\n // Visible path\n const path = document.createElementNS(NS, 'path')\n path.setAttribute('d', d)\n path.setAttribute('fill', 'none')\n path.setAttribute('stroke-linecap', 'round')\n\n if (this.disabled) {\n // Disabled: use muted ink for better contrast, dashed to convey inactive state\n path.setAttribute('stroke', 'var(--aui-ink-muted)')\n path.setAttribute('stroke-width', String(this.strokeWidth))\n path.setAttribute('stroke-dasharray', '6 4')\n path.style.opacity = '0.6'\n } else {\n path.setAttribute('stroke', conn.color ?? this.color)\n path.setAttribute('stroke-width', String(this.strokeWidth))\n if (this.animated) {\n path.setAttribute('stroke-dasharray', '8 4')\n path.style.animation = 'noodle-flow 0.6s linear infinite'\n }\n }\n this.#pathGroup.appendChild(path)\n }\n\n // WHY: Delay restore via microtask -- same reason as #createPortIndicators.\n // The observer microtask must fire while suppression is still active.\n if (!this.#dragState) queueMicrotask(() => { this.#suppressObserver = false })\n }\n\n #queueUpdate(): void {\n if (this.#updateQueued) return\n this.#updateQueued = true\n this.#rafId = requestAnimationFrame(() => {\n this.#updateQueued = false\n this.#renderAllPaths()\n if (this.showPorts) this.#positionPortIndicators()\n })\n }\n\n /** Full update: recreate port indicators (for child list changes). */\n #queueFullUpdate(): void {\n if (this.#updateQueued) return\n this.#updateQueued = true\n this.#rafId = requestAnimationFrame(() => {\n this.#updateQueued = false\n this.#renderAllPaths()\n // WHY: Skip port recreation during active drag -- it would destroy\n // data-noodle-droppable attrs and break proximity detection.\n if (this.showPorts && !this.#dragState) this.#createPortIndicators()\n })\n }\n\n // ── Port indicators (edit mode) ──\n\n #createPortIndicators(): void {\n this.#suppressObserver = true\n this.#removePortIndicators()\n const portElements = this.host.querySelectorAll(this.selector)\n for (const el of portElements) {\n const sides = (el.getAttribute('data-noodle-port') ?? '').split(/\\s+/).filter(Boolean)\n const elId = el.id\n if (!elId) continue\n\n for (const side of sides) {\n const dot = document.createElement('div')\n dot.setAttribute('data-noodle-port-indicator', '')\n dot.setAttribute('data-noodle-side', side)\n dot.setAttribute('data-noodle-target', elId)\n dot.style.cssText = `position:absolute;width:${this.portSize}px;height:${this.portSize}px;border-radius:50%;background:${this.color};border:2px solid white;pointer-events:auto;cursor:crosshair;z-index:5;touch-action:none;transform:translate(-50%,-50%);transition:transform 150ms ease,box-shadow 150ms ease;box-shadow:0 1px 3px rgba(0,0,0,0.2);`\n dot.addEventListener('pointerdown', this.#onPortPointerDown)\n this.host.appendChild(dot)\n this.#portElements.push(dot)\n }\n }\n this.#positionPortIndicators()\n // WHY: Delay restore via microtask so the MutationObserver callback (also a\n // microtask) fires while suppression is still active. Without this, the observer\n // sees childList changes from dot creation and queues #queueFullUpdate, creating\n // an infinite recreation loop that wipes data-noodle-droppable every frame.\n if (!this.#dragState) queueMicrotask(() => { this.#suppressObserver = false })\n }\n\n #positionPortIndicators(): void {\n for (const dot of this.#portElements) {\n const targetId = dot.getAttribute('data-noodle-target')!\n const side = dot.getAttribute('data-noodle-side')! as PortSide\n const pos = this.#getPortPosition(targetId, side)\n if (pos) {\n dot.style.left = `${pos.x}px`\n dot.style.top = `${pos.y}px`\n }\n }\n }\n\n #removePortIndicators(): void {\n for (const dot of this.#portElements) {\n dot.removeEventListener('pointerdown', this.#onPortPointerDown)\n dot.remove()\n }\n this.#portElements = []\n }\n\n // ── Edit mode: drag-to-connect ──\n\n #onPortPointerDown = (e: PointerEvent): void => {\n if (this.disabled || !this.editable || e.button !== 0) return\n const dot = (e.target as HTMLElement).closest('[data-noodle-port-indicator]') as HTMLElement\n if (!dot) return\n\n e.preventDefault()\n e.stopPropagation()\n\n // WHY: Do NOT call setPointerCapture -- it redirects all pointer events to\n // the source dot, preventing :hover from activating on target port dots.\n // Document-level listeners handle move/up correctly without capture.\n\n const targetId = dot.getAttribute('data-noodle-target')!\n const side = dot.getAttribute('data-noodle-side')! as PortSide\n const el = this.host.querySelector(`#${CSS.escape(targetId)}`)\n if (!el) return\n\n this.#dragState = {\n fromElement: el as HTMLElement,\n fromPort: side,\n fromId: targetId,\n pointerId: e.pointerId,\n sourceDot: dot,\n }\n\n // Mark source port as dragging\n dot.setAttribute('data-noodle-dragging', '')\n\n // Mark all other ports as valid drop targets\n for (const portDot of this.#portElements) {\n if (portDot === dot) continue\n const portTargetId = portDot.getAttribute('data-noodle-target')!\n const portSide = portDot.getAttribute('data-noodle-side')!\n // Don't mark same port on same element\n if (portTargetId === targetId && portSide === side) continue\n portDot.setAttribute('data-noodle-droppable', '')\n }\n\n // WHY: Suppress MutationObserver for the entire drag operation.\n // Appending the drag path triggers a childList mutation -> #queueFullUpdate\n // which destroys all port indicators (and their data-noodle-droppable attrs),\n // breaking proximity detection and preventing connections from forming.\n this.#suppressObserver = true\n\n // Create temporary drag path -- visible but muted until near a valid port\n this.#dragPath = document.createElementNS(NS, 'path')\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.setAttribute('stroke-width', String(this.strokeWidth))\n this.#dragPath.setAttribute('fill', 'none')\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n this.#dragPath.setAttribute('stroke-linecap', 'round')\n this.#dragPath.style.opacity = '0.7'\n this.#pathGroup?.appendChild(this.#dragPath)\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-drag', {\n bubbles: true, composed: true,\n detail: { from: targetId, fromPort: side, x: e.clientX, y: e.clientY },\n }))\n\n document.addEventListener('pointermove', this.#onPortPointerMove)\n document.addEventListener('pointerup', this.#onPortPointerUp)\n document.addEventListener('pointercancel', this.#onPortPointerCancel)\n }\n\n #onPortPointerMove = (e: PointerEvent): void => {\n const state = this.#dragState\n if (!state || !this.#dragPath) return\n\n const p1 = this.#getPortPosition(state.fromId, state.fromPort)\n if (!p1) return\n\n // Pointer position in host's layout coordinate space\n const { x: mx, y: my } = this.#clientToLocal(e.clientX, e.clientY)\n\n // Compute bezier from port to pointer\n const dist = Math.max(Math.abs(mx - p1.x), Math.abs(my - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, state.fromPort, offset)\n const d = `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${mx} ${my}, ${mx} ${my}`\n this.#dragPath.setAttribute('d', d)\n\n // Update drop-ready state via proximity detection\n this.#updateDropReady(e.clientX, e.clientY)\n }\n\n #onPortPointerUp = (e: PointerEvent): void => {\n const state = this.#dragState\n if (!state) return\n\n // Proximity-based snap: find nearest port within threshold\n const nearest = this.#findNearestPort(e.clientX, e.clientY)\n if (nearest) {\n const toId = nearest.getAttribute('data-noodle-target')!\n const toPort = nearest.getAttribute('data-noodle-side')! as PortSide\n\n // Don't connect to same port on same element\n if (toId !== state.fromId || toPort !== state.fromPort) {\n this.connect(state.fromId, toId, state.fromPort, toPort)\n }\n }\n\n this.#endDrag()\n }\n\n #onPortPointerCancel = (): void => {\n this.#endDrag()\n }\n\n #endDrag(): void {\n // Clean up interaction state attributes\n for (const dot of this.#portElements) {\n dot.removeAttribute('data-noodle-dragging')\n dot.removeAttribute('data-noodle-droppable')\n dot.removeAttribute('data-noodle-drop-ready')\n }\n\n this.#dragPath?.remove()\n this.#dragPath = null\n this.#dragState = null\n document.removeEventListener('pointermove', this.#onPortPointerMove)\n document.removeEventListener('pointerup', this.#onPortPointerUp)\n document.removeEventListener('pointercancel', this.#onPortPointerCancel)\n\n // Restore observer after drag -- pick up any mutations that were suppressed\n this.#suppressObserver = false\n }\n\n // ── Proximity helpers ──\n\n /** Find the nearest droppable port within DROP_SNAP_RADIUS of a screen point. */\n #findNearestPort(clientX: number, clientY: number): HTMLElement | null {\n let nearest: HTMLElement | null = null\n let minDist = DROP_SNAP_RADIUS\n\n for (const dot of this.#portElements) {\n if (!dot.hasAttribute('data-noodle-droppable')) continue\n const rect = dot.getBoundingClientRect()\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dist = Math.hypot(clientX - cx, clientY - cy)\n if (dist < minDist) {\n minDist = dist\n nearest = dot\n }\n }\n\n return nearest\n }\n\n /** Toggle data-noodle-drop-ready on the nearest droppable port and update drag path color. */\n #updateDropReady(clientX: number, clientY: number): void {\n const nearest = this.#findNearestPort(clientX, clientY)\n\n for (const dot of this.#portElements) {\n if (dot === nearest) {\n dot.setAttribute('data-noodle-drop-ready', '')\n } else {\n dot.removeAttribute('data-noodle-drop-ready')\n }\n }\n\n // Color feedback on the drag path\n if (nearest && this.#dragPath && this.#dragState) {\n // Within snap zone -> alive: solid accent, snap path to target port\n this.#dragPath.setAttribute('stroke', this.color)\n this.#dragPath.style.opacity = '1'\n this.#dragPath.removeAttribute('stroke-dasharray')\n\n const targetId = nearest.getAttribute('data-noodle-target')!\n const targetPort = nearest.getAttribute('data-noodle-side')! as PortSide\n const p2 = this.#getPortPosition(targetId, targetPort)\n const p1 = this.#getPortPosition(this.#dragState.fromId, this.#dragState.fromPort)\n if (p1 && p2) {\n const dist = Math.max(Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, this.#dragState.fromPort, offset)\n const [cx2, cy2] = this.#controlPoint(p2.x, p2.y, targetPort, offset)\n this.#dragPath.setAttribute('d', `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${cx2} ${cy2}, ${p2.x} ${p2.y}`)\n }\n } else if (this.#dragPath) {\n // Outside snap zone -> muted dashed\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.style.opacity = '0.7'\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n }\n }\n\n // ── Reconnect drag (grab existing noodle near endpoint) ──\n\n #onHitPointerDown = (e: PointerEvent): void => {\n if (this.disabled || !this.editable || e.button !== 0) return\n const target = e.target as SVGPathElement\n const connId = target.dataset.noodleId\n if (!connId) return\n const conn = this.#connections.get(connId)\n if (!conn) return\n\n e.preventDefault()\n e.stopPropagation()\n\n // WHY: Suppress BEFORE disconnect() -- disconnect calls #renderAllPaths which\n // modifies SVG DOM. Without early suppression, the MutationObserver would\n // queue #queueFullUpdate that destroys port dots before we mark them droppable.\n this.#suppressObserver = true\n\n // Determine which endpoint is closer to the pointer\n const p1 = this.#getPortPosition(conn.from, conn.fromPort)\n const p2 = this.#getPortPosition(conn.to, conn.toPort)\n if (!p1 || !p2) { this.#suppressObserver = false; return }\n\n const { x: pointerX, y: pointerY } = this.#clientToLocal(e.clientX, e.clientY)\n\n const distFrom = Math.hypot(pointerX - p1.x, pointerY - p1.y)\n const distTo = Math.hypot(pointerX - p2.x, pointerY - p2.y)\n\n // Anchor at the farther endpoint, detach the closer one\n const anchorId = distFrom < distTo ? conn.to : conn.from\n const anchorPort = distFrom < distTo ? conn.toPort : conn.fromPort\n\n // Remove the connection (fires aui:noodle-disconnect)\n this.disconnect(connId)\n\n // Find the anchor port's indicator dot\n const anchorDot = this.#portElements.find(\n d => d.getAttribute('data-noodle-target') === anchorId &&\n d.getAttribute('data-noodle-side') === anchorPort\n )\n if (!anchorDot) { this.#suppressObserver = false; return }\n\n const el = this.host.querySelector(`#${CSS.escape(anchorId)}`)\n if (!el) { this.#suppressObserver = false; return }\n\n // WHY: No setPointerCapture -- same reason as #onPortPointerDown.\n\n this.#dragState = {\n fromElement: el as HTMLElement,\n fromPort: anchorPort,\n fromId: anchorId,\n pointerId: e.pointerId,\n sourceDot: anchorDot,\n reconnectId: connId,\n }\n\n // Mark source port as dragging\n anchorDot.setAttribute('data-noodle-dragging', '')\n\n // Mark all other ports as valid drop targets\n for (const portDot of this.#portElements) {\n if (portDot === anchorDot) continue\n const portTargetId = portDot.getAttribute('data-noodle-target')!\n const portSide = portDot.getAttribute('data-noodle-side')!\n if (portTargetId === anchorId && portSide === anchorPort) continue\n portDot.setAttribute('data-noodle-droppable', '')\n }\n\n // Create temporary drag path -- starts muted\n this.#dragPath = document.createElementNS(NS, 'path')\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.setAttribute('stroke-width', String(this.strokeWidth))\n this.#dragPath.setAttribute('fill', 'none')\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n this.#dragPath.setAttribute('stroke-linecap', 'round')\n this.#dragPath.style.opacity = '0.7'\n\n // Compute initial path from anchor to pointer so the drag is immediately visible\n const anchorPos = this.#getPortPosition(anchorId, anchorPort)\n const { x: mx, y: my } = this.#clientToLocal(e.clientX, e.clientY)\n if (anchorPos) {\n const dist = Math.max(Math.abs(mx - anchorPos.x), Math.abs(my - anchorPos.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(anchorPos.x, anchorPos.y, anchorPort, offset)\n this.#dragPath.setAttribute('d', `M ${anchorPos.x} ${anchorPos.y} C ${cx1} ${cy1}, ${mx} ${my}, ${mx} ${my}`)\n }\n\n this.#pathGroup?.appendChild(this.#dragPath)\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-drag', {\n bubbles: true, composed: true,\n detail: { from: anchorId, fromPort: anchorPort, x: e.clientX, y: e.clientY, reconnect: true },\n }))\n\n document.addEventListener('pointermove', this.#onPortPointerMove)\n document.addEventListener('pointerup', this.#onPortPointerUp)\n document.addEventListener('pointercancel', this.#onPortPointerCancel)\n }\n\n // ── Movement tracking ──\n\n #onExternalMove = (): void => {\n this.#queueUpdate()\n }\n\n #startObserving(): void {\n // ResizeObserver for host size changes\n this.#resizeObserver = new ResizeObserver(() => this.#queueUpdate())\n this.#resizeObserver.observe(this.host)\n\n // MutationObserver for style changes (drag-based movement) + child list changes (dataset load)\n this.#mutationObserver = new MutationObserver((mutations) => {\n if (this.#suppressObserver) return\n const hasChildListChange = mutations.some(m => m.type === 'childList')\n if (hasChildListChange) {\n this.#queueFullUpdate() // Recreate port indicators for new/removed elements\n } else {\n this.#queueUpdate() // Just reposition existing indicators\n }\n })\n this.#mutationObserver.observe(this.host, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'translate', 'data-noodle-port'],\n })\n }\n\n #stopObserving(): void {\n this.#resizeObserver?.disconnect()\n this.#resizeObserver = null\n this.#mutationObserver?.disconnect()\n this.#mutationObserver = null\n }\n}\n","// ── aui-noodles ──────────────────────────────────────────────\n//\n// Declarative SVG noodle canvas. Wraps NoodleController with a\n// zero-config custom element. Children declare ports via\n// `data-noodle-port=\"left right\"` and the element handles the SVG\n// overlay, coordinate system, and stacking context automatically.\n//\n// ```html\n// <aui-noodles editable>\n// <div id=\"a\" data-noodle-port=\"right\">Node A</div>\n// <div id=\"b\" data-noodle-port=\"left\">Node B</div>\n// </aui-noodles>\n// ```\n//\n// @attr {boolean} editable - Allow interactive creation/deletion of connections\n// @attr {string} color - Noodle stroke color (default: accent)\n// @attr {string} stroke-width - Stroke width in px (default: 2)\n// @attr {string} tension - Bezier control point distance 0-1 (default: 0.5)\n// @attr {boolean} show-ports - Show port indicator dots (default: auto from editable)\n// @attr {string} port-size - Port dot size in px (default: 10)\n// @attr {'bezier'|'step'|'straight'} curve - Curve style (default: bezier)\n// @attr {boolean} animated - Flowing dash animation\n// @attr {boolean} disabled - Disable the controller\n// @fires aui:noodle-connect - Connection created. Detail: `{ id, from, to, fromPort, toPort }`\n// @fires aui:noodle-disconnect - Connection removed. Detail: `{ id, from, to, fromPort, toPort }`\n// @fires aui:noodle-drag - Pointer moves during drag. Detail: `{ from, fromPort, x, y, reconnect? }`\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\nimport { NoodleController } from './noodle-controller.ts'\nimport type { NoodleConnection, NoodleOptions, PortSide } from './noodle-controller.ts'\n\nexport class AuiNoodles extends AgentElement {\n static override attributes: AttributeSchema = {\n editable: { type: 'boolean', default: false },\n color: { type: 'string', default: '' },\n 'stroke-width': { type: 'string', default: '2' },\n tension: { type: 'string', default: '0.5' },\n 'show-ports': { type: 'boolean', default: false },\n 'port-size': { type: 'string', default: '10' },\n curve: { type: 'string', default: 'bezier' },\n animated: { type: 'boolean', default: false },\n disabled: { type: 'boolean', default: false },\n }\n\n declare editable: boolean\n declare color: string\n declare 'stroke-width': string\n declare tension: string\n declare 'show-ports': boolean\n declare 'port-size': string\n declare curve: string\n declare animated: boolean\n declare disabled: boolean\n\n #ctrl: NoodleController | null = null\n\n // ── Public API (pass-through) ──\n\n /** Current connections. */\n get connections(): NoodleConnection[] {\n return this.#ctrl?.getConnections() ?? []\n }\n\n /** Create a connection between two elements. Returns the connection ID. */\n connect(from: string, to: string, fromPort?: PortSide, toPort?: PortSide): string {\n return this.#ctrl!.connect(from, to, fromPort, toPort)\n }\n\n /** Remove a connection by ID. */\n disconnect(id: string): boolean {\n return this.#ctrl?.disconnect(id) ?? false\n }\n\n /** Replace all connections. */\n setConnections(connections: NoodleConnection[]): void {\n this.#ctrl?.setConnections(connections)\n }\n\n /** Remove all connections. */\n clear(): void {\n this.#ctrl?.clear()\n }\n\n /** Force re-render paths and port indicators. */\n update(): void {\n this.#ctrl?.update()\n }\n\n // ── Lifecycle ──\n\n protected override activate(): void {\n this.#ctrl = new NoodleController(this, this.#buildOptions())\n }\n\n protected override dispose(): void {\n this.#ctrl?.destroy()\n this.#ctrl = null\n }\n\n attributeChangedCallback(name: string, old: string | null, val: string | null): void {\n if (old === val) return\n super.attributeChangedCallback(name, old, val)\n if (this.#ctrl) this.#syncOption(name, val)\n }\n\n // ── Private ──\n\n #buildOptions(): NoodleOptions {\n const opts: NoodleOptions = {}\n\n if (this.hasAttribute('editable')) opts.editable = true\n if (this.hasAttribute('animated')) opts.animated = true\n if (this.hasAttribute('disabled')) opts.disabled = true\n\n const color = this.getAttribute('color')\n if (color) opts.color = color\n\n const sw = this.getAttribute('stroke-width')\n if (sw) { const n = Number(sw); if (!isNaN(n)) opts.strokeWidth = n }\n\n const tension = this.getAttribute('tension')\n if (tension) { const n = Number(tension); if (!isNaN(n)) opts.tension = n }\n\n if (this.hasAttribute('show-ports')) {\n opts.showPorts = this.getAttribute('show-ports') !== 'false'\n }\n\n const ps = this.getAttribute('port-size')\n if (ps) { const n = Number(ps); if (!isNaN(n)) opts.portSize = n }\n\n const curve = this.getAttribute('curve') as NoodleOptions['style']\n if (curve === 'bezier' || curve === 'step' || curve === 'straight') {\n opts.style = curve\n }\n\n return opts\n }\n\n #syncOption(name: string, val: string | null): void {\n const ctrl = this.#ctrl!\n switch (name) {\n case 'editable':\n ctrl.editable = val !== null\n ctrl.update()\n break\n case 'color':\n ctrl.color = val ?? 'var(--aui-accent-500)'\n ctrl.update()\n break\n case 'stroke-width': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.strokeWidth = n; ctrl.update() }\n break\n }\n case 'tension': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.tension = n; ctrl.update() }\n break\n }\n case 'show-ports':\n ctrl.showPorts = val !== 'false' && val !== null\n ctrl.update()\n break\n case 'port-size': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.portSize = n; ctrl.update() }\n break\n }\n case 'curve':\n if (val === 'bezier' || val === 'step' || val === 'straight') {\n ctrl.style = val\n ctrl.update()\n }\n break\n case 'animated':\n ctrl.animated = val !== null\n ctrl.update()\n break\n case 'disabled':\n ctrl.disabled = val !== null\n ctrl.update()\n break\n }\n }\n}\n","// ── aui-preview-app ─────────────────────────────────────────\n//\n// Full-screen preview shell with nav + pannable canvas.\n// Reads configuration from preview.json in the same directory.\n//\n// Usage:\n// <aui-preview-app src=\"./preview.json\"></aui-preview-app>\n//\n// preview.json format:\n// {\n// \"section\": \"blocks\",\n// \"param\": \"block\",\n// \"items\": [{ \"slug\": \"agent-chat\", \"name\": \"agent-chat\", \"summary\": \"...\" }],\n// \"links\": [{ \"label\": \"Components\", \"href\": \"../components/preview.html\" }]\n// }\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\nimport { attachTrait } from '../../traits/attach.ts'\n\nconst LOGO_SVG = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M92.2671 346.112C88.1711 262.144 202.347 250.88 288.875 237.568C288.363 202.752 290.923 133.12 221.291 133.12C206.955 133.12 197.227 134.144 186.987 137.216L189.547 147.968C228.459 148.992 238.187 173.056 237.163 193.024C235.115 229.888 196.715 242.688 169.579 242.688C141.419 242.688 104.555 227.328 106.091 186.88C107.627 143.872 163.435 112.64 250.987 112.64C348.779 112.64 403.563 139.776 403.563 244.736V351.744C403.563 369.152 407.659 375.296 417.387 375.296C422.507 375.296 427.627 369.664 431.723 361.984L444.523 369.152C423.019 401.408 391.275 415.744 362.603 415.744C302.699 415.744 279.147 377.856 308.331 313.856L296.043 309.76C277.611 386.048 232.555 415.744 180.331 415.744C135.787 415.744 94.3151 391.68 92.2671 346.112ZM202.859 327.168C208.491 348.672 227.435 357.888 245.355 351.232C267.883 343.04 285.291 311.808 288.363 265.216L288.875 257.536C232.555 267.776 191.083 283.136 202.859 327.168Z\" fill=\"currentColor\"/></svg>`\n\nfunction titleCase(slug: string): string {\n return slug.split('-').map(w => w[0].toUpperCase() + w.slice(1)).join(' ')\n}\n\ninterface PreviewItem {\n slug: string\n file?: string // relative path to .html (e.g., \"table/table-head.html\")\n name: string\n group?: string // group label for optgroup\n summary?: string\n category?: string\n}\n\ninterface PreviewConfig {\n section: string\n param: string\n items: PreviewItem[]\n links: { label: string; href: string }[]\n}\n\nexport class AuiPreviewApp extends AgentElement {\n static override attributes: AttributeSchema = {\n src: { type: 'string', default: './preview.json' },\n }\n\n declare src: string\n\n #editor!: HTMLElement\n #content!: HTMLElement\n\n // Navigation state\n #config: PreviewConfig | null = null\n #currentSlug: string | null = null\n #dialog: HTMLElement | null = null\n\n protected override activate(): void {\n this.#boot()\n }\n\n protected override dispose(): void {\n document.removeEventListener('keydown', this.#handleGlobalKeydown)\n }\n\n async #boot(): Promise<void> {\n // Fetch config\n let config: PreviewConfig\n try {\n const res = await fetch(this.src)\n config = await res.json()\n } catch {\n this.textContent = 'Failed to load preview.json'\n return\n }\n\n const { section, param, items, links } = config\n // Resolve basePath as absolute URL so fetch and import use the same base\n const srcUrl = new URL(this.src, window.location.href)\n const basePath = srcUrl.href.replace(/preview\\.json$/, '')\n const params = new URLSearchParams(location.search)\n const current = params.get(param)\n\n // ── Nav bar ──\n const navbar = document.createElement('div')\n navbar.setAttribute('data-role', 'navbar')\n\n const bar = document.createElement('aui-select')\n bar.setAttribute('mode', 'bar')\n bar.setAttribute('width', 'full')\n\n // Logo\n const logo = document.createElement('aui-option')\n logo.setAttribute('value', '')\n logo.setAttribute('overflow-pin', '')\n logo.setAttribute('data-preview-logo', '')\n logo.dataset.href = window.location.pathname\n logo.innerHTML = `${LOGO_SVG} AgentUI`\n bar.appendChild(logo)\n\n // Color scheme toggle (persisted to localStorage)\n const SCHEME_KEY = 'aui-preview-scheme'\n const stored = localStorage.getItem(SCHEME_KEY)\n if (stored) {\n document.documentElement.dataset.theme = stored\n document.documentElement.style.colorScheme = stored\n }\n\n const schemeBtn = document.createElement('aui-button')\n schemeBtn.setAttribute('ghost', '')\n schemeBtn.setAttribute('size', 'sm')\n schemeBtn.setAttribute('hide-label', '')\n schemeBtn.setAttribute('label', 'Toggle color scheme')\n const schemeIcon = document.createElement('aui-icon')\n const isDark = document.documentElement.dataset.theme === 'dark'\n schemeIcon.setAttribute('name', isDark ? 'sun' : 'moon')\n schemeBtn.appendChild(schemeIcon)\n bar.appendChild(schemeBtn)\n\n schemeBtn.addEventListener('click', () => {\n const html = document.documentElement\n const nowDark = html.dataset.theme === 'dark'\n const next = nowDark ? 'light' : 'dark'\n html.dataset.theme = next\n html.style.colorScheme = next\n localStorage.setItem(SCHEME_KEY, next)\n schemeIcon.setAttribute('name', nowDark ? 'moon' : 'sun')\n })\n\n // Page select\n const pageSelect = document.createElement('aui-select')\n pageSelect.setAttribute('placeholder', titleCase(section))\n pageSelect.setAttribute('outline', '')\n pageSelect.setAttribute('data-role', 'page-select')\n\n // Section links\n if (links.length) {\n const linksGroup = document.createElement('aui-optgroup')\n linksGroup.setAttribute('label', 'Sections')\n for (const link of links) {\n const opt = document.createElement('aui-option')\n opt.setAttribute('value', `go-${link.label.toLowerCase()}`)\n opt.dataset.href = link.href\n opt.textContent = link.label\n linksGroup.appendChild(opt)\n }\n pageSelect.appendChild(linksGroup)\n }\n\n // Item options — grouped by item.group\n let currentGroup: HTMLElement | null = null\n let currentGroupLabel = ''\n\n for (const item of items) {\n const groupLabel = item.group || titleCase(section)\n\n if (groupLabel !== currentGroupLabel) {\n currentGroup = document.createElement('aui-optgroup')\n currentGroup.setAttribute('label', groupLabel)\n pageSelect.appendChild(currentGroup)\n currentGroupLabel = groupLabel\n }\n\n const opt = document.createElement('aui-option')\n opt.setAttribute('value', item.slug)\n if (item.file) opt.dataset.file = item.file\n if (item.slug === current) opt.setAttribute('selected', '')\n opt.textContent = item.name || titleCase(item.slug)\n currentGroup!.appendChild(opt)\n }\n\n if (current) pageSelect.setAttribute('value', current)\n\n bar.appendChild(pageSelect)\n navbar.appendChild(bar)\n this.appendChild(navbar)\n\n // ── Canvas (aui-editor) ──\n const editor = document.createElement('aui-editor')\n editor.setAttribute('data-role', 'canvas')\n editor.setAttribute('background', 'dots')\n\n const contentLayer = document.createElement('aui-editor-layer')\n contentLayer.setAttribute('name', 'content')\n\n const content = document.createElement('div')\n content.setAttribute('data-role', 'content')\n\n contentLayer.appendChild(content)\n editor.appendChild(contentLayer)\n this.appendChild(editor)\n\n this.#editor = editor\n this.#content = content\n\n // ── Wire up nav ──\n bar.addEventListener('click', (e: Event) => {\n const option = (e.target as HTMLElement).closest('aui-option') as HTMLElement | null\n const href = option?.dataset?.href\n if (href) window.location.href = href\n })\n\n pageSelect.addEventListener('change', (e: Event) => {\n const val = (e.target as any).value\n const opt = pageSelect.querySelector(`aui-option[value=\"${val}\"]`)\n const href = (opt as HTMLElement | null)?.dataset?.href\n if (href) { window.location.href = href; return }\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, val)\n window.location.href = url.toString()\n })\n\n // ── Load current item ──\n if (current) {\n const currentItem = items.find(i => i.slug === current)\n const filePath = currentItem?.file || `${current}/${current}.html`\n document.title = `${titleCase(current)} — AgentUI ${titleCase(section)}`\n await this.#loadItem(filePath, basePath)\n } else {\n // Home page: load all items as an aggregate gallery\n document.title = `AgentUI — ${titleCase(section)}`\n await this.#loadAllItems(items, basePath)\n }\n\n // ── Store navigation state ──\n this.#config = config\n this.#currentSlug = current\n\n // ── Build command palette ──\n this.#buildCommandPalette(config, param)\n\n // ── Global keyboard shortcuts ──\n document.addEventListener('keydown', this.#handleGlobalKeydown)\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n // ── Command palette ──\n\n #buildCommandPalette(config: PreviewConfig, param: string): void {\n const dialog = document.createElement('aui-dialog')\n dialog.setAttribute('size', 'sm')\n\n const command = document.createElement('aui-command')\n command.setAttribute('max-width', 'full')\n\n const input = document.createElement('aui-command-input')\n input.setAttribute('placeholder', `Go to ${titleCase(config.section)}…`)\n command.appendChild(input)\n\n const list = document.createElement('aui-command-list')\n\n // Section links\n if (config.links.length) {\n const group = document.createElement('aui-command-group')\n group.setAttribute('label', 'Sections')\n for (const link of config.links) {\n const item = document.createElement('aui-command-item')\n item.setAttribute('value', `section:${link.label}`)\n item.dataset.href = link.href\n item.textContent = link.label\n group.appendChild(item)\n }\n list.appendChild(group)\n }\n\n // Items grouped\n let currentGroup: HTMLElement | null = null\n let currentGroupLabel = ''\n\n for (const it of config.items) {\n const groupLabel = it.group || titleCase(config.section)\n if (groupLabel !== currentGroupLabel) {\n currentGroup = document.createElement('aui-command-group')\n currentGroup.setAttribute('label', groupLabel)\n list.appendChild(currentGroup)\n currentGroupLabel = groupLabel\n }\n const item = document.createElement('aui-command-item')\n item.setAttribute('value', it.slug)\n if (it.summary) item.setAttribute('keywords', it.summary)\n item.textContent = it.name || titleCase(it.slug)\n currentGroup!.appendChild(item)\n }\n\n command.appendChild(list)\n\n const empty = document.createElement('aui-command-empty')\n empty.textContent = 'No results.'\n command.appendChild(empty)\n\n // Selection handler\n command.addEventListener('select', (e: Event) => {\n const { value } = (e as CustomEvent).detail\n const opt = command.querySelector(`aui-command-item[value=\"${CSS.escape(value)}\"]`) as HTMLElement | null\n const href = opt?.dataset?.href\n if (href) { window.location.href = href; return }\n\n if (value.startsWith('section:')) return\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, value)\n window.location.href = url.toString()\n })\n\n // Dismiss on escape from command (bubbles to dialog which handles close)\n command.addEventListener('dismiss', () => this.#closeCommandPalette())\n\n // Close event from dialog (backdrop click, escape via native dialog)\n dialog.addEventListener('close', () => {\n this.#dialog?.removeAttribute('open')\n })\n\n dialog.appendChild(command)\n this.appendChild(dialog)\n this.#dialog = dialog\n }\n\n #openCommandPalette(): void {\n if (!this.#dialog) return\n // Clear previous search and open\n const input = this.#dialog.querySelector('aui-command-input') as any\n input?.clear?.()\n this.#dialog.setAttribute('open', '')\n // Focus the input after dialog animation starts\n requestAnimationFrame(() => {\n input?.focus?.()\n })\n }\n\n #closeCommandPalette(): void {\n this.#dialog?.removeAttribute('open')\n }\n\n // ── Keyboard navigation ──\n\n #handleGlobalKeydown = (e: KeyboardEvent): void => {\n // Cmd/Ctrl + K → command palette\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n if (this.#dialog?.hasAttribute('open')) {\n this.#closeCommandPalette()\n } else {\n this.#openCommandPalette()\n }\n return\n }\n\n // [ / ] → prev/next item (no modifier needed)\n // Skip if any modifier is held or if focus is in an editable element\n if (!e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey &&\n (e.key === '[' || e.key === ']')) {\n const tag = (e.target as HTMLElement)?.tagName\n const editable = (e.target as HTMLElement)?.isContentEditable\n if (tag === 'INPUT' || tag === 'TEXTAREA' || editable) return\n e.preventDefault()\n this.#navigateRelative(e.key === ']' ? 1 : -1)\n return\n }\n }\n\n #navigateRelative(direction: 1 | -1): void {\n if (!this.#config) return\n const { items, param } = this.#config\n if (!items.length) return\n\n const currentIdx = this.#currentSlug\n ? items.findIndex(i => i.slug === this.#currentSlug)\n : -1\n\n let nextIdx = currentIdx + direction\n if (nextIdx >= items.length) nextIdx = 0\n if (nextIdx < 0) nextIdx = items.length - 1\n\n const next = items[nextIdx]\n if (!next) return\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, next.slug)\n window.location.href = url.toString()\n }\n\n async #loadItem(filePath: string, basePath: string): Promise<void> {\n // filePath is like \"table/table-head.html\"\n const dir = filePath.split('/')[0]\n const htmlUrl = `${basePath}${filePath}`\n const cssUrl = `${basePath}${dir}/${dir}.css`\n const tsUrl = `${basePath}${dir}/${dir}.ts`\n\n try {\n const res = await fetch(htmlUrl)\n if (res.ok) {\n this.#content.innerHTML = await res.text()\n }\n } catch {}\n\n // Wait for custom elements to upgrade and ::after to render\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n\n // Wait for custom elements to upgrade and render\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n\n const children = Array.from(this.#content.children).filter(\n (c): c is HTMLElement => c.nodeType === 1 && c.tagName !== 'SCRIPT'\n )\n\n const GAP = 96 // 6rem\n const START_Y = 200 // safe distance below nav bar\n\n const measurements = children.map(child => ({\n el: child,\n height: child.offsetHeight,\n width: child.offsetWidth,\n }))\n\n // Position absolutely as a centered vertical list\n let offsetY = START_Y\n let maxWidth = 0\n for (const { el, height, width } of measurements) {\n el.style.position = 'absolute'\n el.style.left = '0px'\n el.style.top = `${offsetY}px`\n\n // Skip drag/resize for interactive editors — they have their own pan/zoom\n const isEditor = el.tagName === 'AUI-GRAPH-UI' || el.tagName === 'AUI-EDITOR'\n if (!isEditor) {\n attachTrait(el, 'drag', { config: { mode: 'free', modifier: 'alt' } })\n attachTrait(el, 'resize', { config: { modifier: 'alt' } })\n }\n\n if (width > maxWidth) maxWidth = width\n offsetY += height + GAP\n }\n\n // Set content dimensions so centering can read them\n this.#content.style.width = `${maxWidth}px`\n this.#content.style.height = `${offsetY}px`\n\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = cssUrl\n document.head.appendChild(link)\n\n try { await import(/* @vite-ignore */ tsUrl) } catch {}\n\n // Re-stamp inline scripts so they execute (innerHTML doesn't run scripts)\n for (const orig of Array.from(this.#content.querySelectorAll('script'))) {\n const s = document.createElement('script')\n for (const attr of orig.attributes) s.setAttribute(attr.name, attr.value)\n s.textContent = orig.textContent\n orig.replaceWith(s)\n }\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n async #loadAllItems(items: PreviewItem[], basePath: string): Promise<void> {\n const GAP = 96\n const SECTION_GAP = 160 // extra gap between different groups\n const START_Y = 200\n const loadedCSS = new Set<string>()\n const loadedTS = new Set<string>()\n let offsetY = START_Y\n let maxWidth = 0\n\n for (const item of items) {\n const filePath = item.file || `${item.slug}/${item.slug}.html`\n const dir = filePath.split('/')[0]\n const htmlUrl = `${basePath}${filePath}`\n const cssUrl = `${basePath}${dir}/${dir}.css`\n const tsUrl = `${basePath}${dir}/${dir}.ts`\n\n // Load CSS once per directory\n if (!loadedCSS.has(cssUrl)) {\n loadedCSS.add(cssUrl)\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = cssUrl\n document.head.appendChild(link)\n }\n\n // Load TS once per directory\n if (!loadedTS.has(tsUrl)) {\n loadedTS.add(tsUrl)\n try { await import(/* @vite-ignore */ tsUrl) } catch {}\n }\n\n // Fetch HTML\n let html = ''\n try {\n const res = await fetch(htmlUrl)\n if (res.ok) html = await res.text()\n } catch { continue }\n\n if (!html.trim()) continue\n\n // Create a wrapper with a heading label\n const wrapper = document.createElement('div')\n wrapper.setAttribute('data-role', 'gallery-item')\n wrapper.innerHTML = `<h3 style=\"margin:0 0 1rem;font-family:var(--aui-font-family);font-size:var(--aui-font-lg);font-weight:var(--aui-font-weight-semibold);color:var(--aui-ink-muted);\">${item.name || titleCase(item.slug)}</h3>${html}`\n\n this.#content.appendChild(wrapper)\n\n // Wait for upgrade\n await new Promise(r => requestAnimationFrame(r))\n\n const height = wrapper.offsetHeight\n const width = wrapper.offsetWidth\n wrapper.style.position = 'absolute'\n wrapper.style.left = '0px'\n wrapper.style.top = `${offsetY}px`\n\n if (width > maxWidth) maxWidth = width\n offsetY += height + GAP\n }\n\n this.#content.style.width = `${maxWidth}px`\n this.#content.style.height = `${offsetY}px`\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n #centerContentHorizontally(): void {\n const ed = this.#editor as any\n const editorWidth = this.#editor.clientWidth\n const contentWidth = this.#content.offsetWidth\n // Center horizontally, pin to top (items start at y: 200px)\n const panX = (editorWidth - contentWidth) / 2\n ed.panTo?.(panX, 0)\n }\n}\n","// ── Auto-register all aui-* custom elements ─────────────────\n//\n// Import this file once to define every component:\n// import '@agent-ui/kit/register'\n\nimport { define } from './element/define.ts'\n\n// Register all traits (must happen before elements activate)\nimport { registerBuiltinTraits } from './traits/index.ts'\nregisterBuiltinTraits()\n\nimport { AuiButton } from './components/button/index.ts'\nimport { AuiInput, AuiInputOtp } from './components/input/index.ts'\nimport { AuiCheckbox } from './components/checkbox/index.ts'\nimport { AuiSwitch } from './components/switch/index.ts'\nimport { AuiRadio, AuiRadioGroup } from './components/radio/index.ts'\nimport { AuiTextarea } from './components/textarea/index.ts'\nimport { AuiContainer } from './components/container/index.ts'\nimport { AuiDialog } from './components/dialog/index.ts'\nimport { AuiDrawer } from './components/drawer/index.ts'\nimport { AuiIcon } from './components/icon/index.ts'\nimport { AuiTooltip } from './components/tooltip/index.ts'\nimport { AuiRange } from './components/range/index.ts'\nimport { AuiGripper } from './components/gripper/index.ts'\nimport { AuiOption } from './components/option/index.ts'\nimport { AuiOptgroup } from './components/optgroup/index.ts'\nimport { AuiSelect } from './components/select/index.ts'\nimport { AuiToast } from './components/toast/index.ts'\nimport { AuiTabs, AuiTab, AuiTabPanel } from './components/tab/index.ts'\nimport { AuiAccordion, AuiAccordionItem } from './components/accordion/index.ts'\nimport { AuiBreadcrumb, AuiBreadcrumbItem } from './components/breadcrumb/index.ts'\nimport { AuiSegmentedControl, AuiSegment } from './components/segmented-control/index.ts'\nimport { AuiPagination } from './components/pagination/index.ts'\nimport { AuiCommand, AuiCommandEmpty, AuiCommandGroup, AuiCommandInput, AuiCommandItem, AuiCommandList } from './components/command/index.ts'\nimport { AuiPanes, AuiPane } from './components/pane/index.ts'\nimport { AuiTable, AuiTableHead, AuiTableBody, AuiTableRow, AuiTableHeader, AuiTableCell, AuiTableColumn } from './components/table/index.ts'\nimport { AuiTree, AuiTreeItem } from './components/tree/index.ts'\nimport { AuiFeed } from './components/feed/index.ts'\nimport { AuiRoot } from './components/root/index.ts'\nimport { AuiCanvas } from './components/canvas/index.ts'\nimport { AuiCalendar } from './components/calendar/index.ts'\nimport { AuiNoodles } from './components/noodles/index.ts'\nimport { AuiAgentActivity, AuiAgentFeed, AuiAgentInput, AuiAgentMessage, AuiAgentPanel, AuiAgentPrompt, AuiAgentSeeds, AuiAgentText, AuiAgentThread } from './components/agent/index.ts'\nimport { AuiAppShell } from './components/app-shell/index.ts'\nimport { AuiPage, AuiPageMain, AuiPageContext } from './components/page/index.ts'\nimport { AuiSidebar, AuiSidebarHeader, AuiSidebarContent, AuiSidebarFooter } from './components/sidebar/index.ts'\nimport { AuiPreviewApp } from './components/preview-app/index.ts'\nimport { AuiEditor, AuiEditorLayer } from './components/editor/index.ts'\nimport { AuiGraphUi, AuiGraphLayer, AuiGraphNode, AuiGraphNoodle, AuiGraphPort } from './components/graph/index.ts'\n\n// ── Define all elements ──────────────────────────────────────\n\ndefine('aui-button', AuiButton)\ndefine('aui-input', AuiInput)\ndefine('aui-checkbox', AuiCheckbox)\ndefine('aui-switch', AuiSwitch)\ndefine('aui-radio', AuiRadio)\ndefine('aui-radio-group', AuiRadioGroup)\ndefine('aui-textarea', AuiTextarea)\ndefine('aui-container', AuiContainer)\ndefine('aui-dialog', AuiDialog)\ndefine('aui-drawer', AuiDrawer)\ndefine('aui-icon', AuiIcon)\ndefine('aui-tooltip', AuiTooltip)\ndefine('aui-range', AuiRange)\ndefine('aui-input-otp', AuiInputOtp)\ndefine('aui-gripper', AuiGripper)\ndefine('aui-option', AuiOption)\ndefine('aui-optgroup', AuiOptgroup)\ndefine('aui-select', AuiSelect)\ndefine('aui-toast', AuiToast)\ndefine('aui-tabs', AuiTabs)\ndefine('aui-tab', AuiTab)\ndefine('aui-tab-panel', AuiTabPanel)\ndefine('aui-accordion', AuiAccordion)\ndefine('aui-accordion-item', AuiAccordionItem)\ndefine('aui-breadcrumb', AuiBreadcrumb)\ndefine('aui-breadcrumb-item', AuiBreadcrumbItem)\ndefine('aui-segmented-control', AuiSegmentedControl)\ndefine('aui-segment', AuiSegment)\ndefine('aui-pagination', AuiPagination)\ndefine('aui-command', AuiCommand)\ndefine('aui-command-input', AuiCommandInput)\ndefine('aui-command-list', AuiCommandList)\ndefine('aui-command-item', AuiCommandItem)\ndefine('aui-command-group', AuiCommandGroup)\ndefine('aui-command-empty', AuiCommandEmpty)\ndefine('aui-panes', AuiPanes)\ndefine('aui-pane', AuiPane)\ndefine('aui-table', AuiTable)\ndefine('aui-table-head', AuiTableHead)\ndefine('aui-table-body', AuiTableBody)\ndefine('aui-table-row', AuiTableRow)\ndefine('aui-table-header', AuiTableHeader)\ndefine('aui-table-cell', AuiTableCell)\ndefine('aui-table-column', AuiTableColumn)\ndefine('aui-tree', AuiTree)\ndefine('aui-tree-item', AuiTreeItem)\ndefine('aui-feed', AuiFeed)\ndefine('aui-root', AuiRoot)\ndefine('aui-canvas', AuiCanvas)\ndefine('aui-calendar', AuiCalendar)\ndefine('aui-noodles', AuiNoodles)\ndefine('aui-agent-feed', AuiAgentFeed)\ndefine('aui-agent-thread', AuiAgentThread)\ndefine('aui-agent-message', AuiAgentMessage)\ndefine('aui-agent-text', AuiAgentText)\ndefine('aui-agent-activity', AuiAgentActivity)\ndefine('aui-agent-seeds', AuiAgentSeeds)\ndefine('aui-agent-panel', AuiAgentPanel)\ndefine('aui-agent-input', AuiAgentInput)\ndefine('aui-agent-prompt', AuiAgentPrompt)\ndefine('aui-app-shell', AuiAppShell)\ndefine('aui-page', AuiPage)\ndefine('aui-page-main', AuiPageMain)\ndefine('aui-page-context', AuiPageContext)\ndefine('aui-sidebar', AuiSidebar)\ndefine('aui-sidebar-header', AuiSidebarHeader)\ndefine('aui-sidebar-content', AuiSidebarContent)\ndefine('aui-sidebar-footer', AuiSidebarFooter)\ndefine('aui-preview-app', AuiPreviewApp)\ndefine('aui-editor', AuiEditor)\ndefine('aui-editor-layer', AuiEditorLayer)\ndefine('aui-graph-ui', AuiGraphUi)\ndefine('aui-graph-layer', AuiGraphLayer)\ndefine('aui-graph-node', AuiGraphNode)\ndefine('aui-graph-noodle', AuiGraphNoodle)\ndefine('aui-graph-port', AuiGraphPort)\n\n// ── Global trait observer for non-AgentElement nodes ─────────\n//\n// AgentElement handles its own traits via #attachTraits(). But CSS-only\n// elements (aui-header, aui-card, etc.) and plain HTML elements with a\n// `traits` attribute never get connectedCallback. This observer picks\n// them up and attaches traits globally.\n\nimport { parseTraitsAttribute } from './traits/parse.ts'\nimport { attachTrait } from './traits/attach.ts'\nimport { validateComposition } from './traits/registry.ts'\nimport { AgentElement } from './element/agent-element.ts'\n\nconst traitDisposers = new WeakMap<Element, Array<() => void>>()\n\nfunction attachTraitsToElement(el: Element): void {\n // Skip AgentElement instances — they handle their own traits\n if (el instanceof AgentElement) return\n // Skip if already processed\n if (traitDisposers.has(el)) return\n\n const raw = el.getAttribute('traits')\n if (!raw) return\n\n const entries = parseTraitsAttribute(raw)\n const validated = validateComposition(entries, el.localName)\n const disposers: Array<() => void> = []\n\n for (const { entry } of validated) {\n const dispose = attachTrait(el as HTMLElement, entry.name, {\n config: entry.config,\n })\n disposers.push(dispose)\n }\n\n traitDisposers.set(el, disposers)\n}\n\nfunction detachTraitsFromElement(el: Element): void {\n const disposers = traitDisposers.get(el)\n if (!disposers) return\n for (const d of disposers) d()\n traitDisposers.delete(el)\n}\n\nfunction initTraitObserver(): void {\n // Process any elements already in the DOM\n for (const el of document.querySelectorAll('[traits]')) {\n attachTraitsToElement(el)\n }\n\n // Watch for new elements with traits\n const traitObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === 'childList') {\n for (const node of m.addedNodes) {\n if (node.nodeType !== 1) continue\n const el = node as Element\n if (el.hasAttribute('traits')) attachTraitsToElement(el)\n for (const child of el.querySelectorAll('[traits]')) {\n attachTraitsToElement(child)\n }\n }\n for (const node of m.removedNodes) {\n if (node.nodeType !== 1) continue\n const el = node as Element\n detachTraitsFromElement(el)\n for (const child of el.querySelectorAll('[traits]')) {\n detachTraitsFromElement(child)\n }\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'traits') {\n const el = m.target as Element\n detachTraitsFromElement(el)\n if (el.hasAttribute('traits')) attachTraitsToElement(el)\n }\n }\n })\n\n traitObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['traits'],\n })\n}\n\n// Start observing once DOM is ready\nif (document.body) {\n initTraitObserver()\n} else {\n document.addEventListener('DOMContentLoaded', initTraitObserver, { once: true })\n}\n\n// ── Global popover trigger delegate ──────────────────────────\n//\n// Any element with [popover-trigger=\"<id>\"] toggles the referenced\n// popover on click. Works on buttons, icons, custom elements, etc.\n//\n// Usage:\n// <aui-button popover-trigger=\"my-menu\">Open Menu</aui-button>\n// <aui-list id=\"my-menu\" popover=\"auto\">...</aui-list>\n\ndocument.addEventListener('click', (e) => {\n const trigger = (e.target as Element)?.closest?.('[popover-trigger]')\n if (!trigger) return\n\n const id = trigger.getAttribute('popover-trigger')\n if (!id) return\n\n const target = document.getElementById(id)\n if (!target || !('togglePopover' in target)) return\n\n // Anchor the popover to the trigger for CSS anchor positioning\n const anchorName = `--aui-popover-${id}`\n ;(trigger as HTMLElement).style.anchorName = anchorName\n ;(target as HTMLElement).style.positionAnchor = anchorName\n\n try { (target as HTMLElement).togglePopover() } catch {}\n})\n\n// ── Global popover event isolation ───────────────────────────\n//\n// Popovers render in the top layer but pointer events still\n// propagate through the DOM tree to elements underneath.\n// Stop propagation on all pointer/mouse events that originate\n// inside a [popover] or <dialog> so underlying elements don't\n// receive hover, proximity, or press events.\n\nfor (const eventName of ['pointermove', 'pointerdown', 'pointerup', 'mouseover', 'mouseenter', 'mouseleave'] as const) {\n document.addEventListener(eventName, (e) => {\n const target = e.target as Element\n if (target?.closest?.('[popover], dialog')) {\n e.stopPropagation()\n }\n }, true) // capture phase — stops before any bubbling listeners see it\n}\n"],"names":["AuiTableColumn","AgentElement","AuiCanvas","#viewport","#transform","#content","#panX","#panY","#panning","#panStartX","#panStartY","#panOriginX","#panOriginY","#zoom","#applyTransform","#emitPan","#emitZoom","x","y","level","children","child","slot","needsViewport","#stamp","#onKeyDown","vp","#onPointerDown","#onPointerMove","#onPointerUp","#onWheel","content","viewport","transform","canPan","canZoom","e","target","_e","delta","newZoom","rect","px","py","scale","parseDate","str","d","toISO","m","day","isSameDay","a","b","CalendarStore","options","now","initial","signal","computed","#computeDays","#computeMonths","#computeYears","#computeTitle","batch","iso","month","year","start","end","minDate","maxDate","selected","today","rangeStartDate","rangeEndDate","startDay","gridStart","cells","i","inMonth","isToday","isSelected","isDisabled","inRange","isRangeStart","isRangeEnd","lo","hi","currentMonth","name","focused","decadeStart","thisYear","monthNames","AuiCalendar","#internals","#store","#disabled","#focusedIndex","#rangePhase","#dragging","val","old","min","max","#render","#onPrevClick","#onNextClick","#onTitleClickHandler","grid","#onGridClickHandler","#onGridPointerMoveHandler","#onGridPointerDownHandler","#onGridPointerUpHandler","btn","prev","next","title","view","weekdays","days","cell","attrs","months","years","#onPrev","#onNext","#onTitleClick","#onGridClick","#onGridPointerMove","#onGridPointerDown","#onGridPointerUp","date","#selectDate","#commitRange","idx","handled","_counter","uid","prefix","DROP_SNAP_RADIUS","NS","NoodleController","#attached","#svg","#connections","#pathGroup","#hitGroup","#portElements","#dragState","#dragPath","#resizeObserver","#mutationObserver","#rafId","#updateQueued","#suppressObserver","#styleEl","host","c","#createSVG","#injectKeyframes","#startObserving","#createPortIndicators","#onExternalMove","#renderAllPaths","#stopObserving","#removePortIndicators","#removeSVG","#removeKeyframes","#endDrag","from","to","fromPort","toPort","id","conn","conns","connections","svg","style","#clientToLocal","clientX","clientY","hostRect","scaleX","scaleY","#getPortPosition","elementId","port","el","current","translate","parts","w","h","#controlPoint","offset","#computePath","p1","p2","mx","dist","cx1","cy1","cx2","cy2","hit","#onHitPointerDown","path","#queueUpdate","#positionPortIndicators","#queueFullUpdate","portElements","sides","elId","side","dot","#onPortPointerDown","targetId","pos","portDot","portTargetId","portSide","#onPortPointerMove","#onPortPointerUp","#onPortPointerCancel","state","my","#updateDropReady","nearest","#findNearestPort","toId","minDist","cx","cy","targetPort","connId","pointerX","pointerY","distFrom","distTo","anchorId","anchorPort","anchorDot","anchorPos","mutations","AuiNoodles","#ctrl","#buildOptions","#syncOption","opts","color","sw","n","tension","ps","curve","ctrl","LOGO_SVG","titleCase","slug","AuiPreviewApp","#editor","#config","#currentSlug","#dialog","#boot","#handleGlobalKeydown","config","section","param","items","links","basePath","navbar","bar","logo","SCHEME_KEY","stored","schemeBtn","schemeIcon","isDark","html","nowDark","pageSelect","linksGroup","link","opt","currentGroup","currentGroupLabel","item","groupLabel","editor","contentLayer","href","url","filePath","#loadItem","#loadAllItems","#buildCommandPalette","#centerContentHorizontally","dialog","command","input","list","group","it","empty","value","#closeCommandPalette","#openCommandPalette","tag","editable","#navigateRelative","direction","nextIdx","dir","htmlUrl","cssUrl","tsUrl","res","r","GAP","START_Y","measurements","offsetY","maxWidth","height","width","attachTrait","orig","s","attr","loadedCSS","loadedTS","wrapper","ed","editorWidth","contentWidth","panX","registerBuiltinTraits","define","AuiButton","AuiInput","AuiCheckbox","AuiSwitch","AuiRadio","AuiRadioGroup","AuiTextarea","AuiContainer","AuiDialog","AuiDrawer","AuiIcon","AuiTooltip","AuiRange","AuiInputOtp","AuiGripper","AuiOption","AuiOptgroup","AuiSelect","AuiToast","AuiTabs","AuiTab","AuiTabPanel","AuiAccordion","AuiAccordionItem","AuiBreadcrumb","AuiBreadcrumbItem","AuiSegmentedControl","AuiSegment","AuiPagination","AuiCommand","AuiCommandInput","AuiCommandList","AuiCommandItem","AuiCommandGroup","AuiCommandEmpty","AuiPanes","AuiPane","AuiTable","AuiTableHead","AuiTableBody","AuiTableRow","AuiTableHeader","AuiTableCell","AuiTree","AuiTreeItem","AuiFeed","AuiRoot","AuiAgentFeed","AuiAgentThread","AuiAgentMessage","AuiAgentText","AuiAgentActivity","AuiAgentSeeds","AuiAgentPanel","AuiAgentInput","AuiAgentPrompt","AuiAppShell","AuiPage","AuiPageMain","AuiPageContext","AuiSidebar","AuiSidebarHeader","AuiSidebarContent","AuiSidebarFooter","AuiEditor","AuiEditorLayer","AuiGraphUi","AuiGraphLayer","AuiGraphNode","AuiGraphNoodle","AuiGraphPort","traitDisposers","attachTraitsToElement","raw","entries","parseTraitsAttribute","validated","validateComposition","disposers","entry","dispose","detachTraitsFromElement","initTraitObserver","node","trigger","anchorName","eventName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../src/components/table/table-column.ts","../src/components/canvas/canvas.ts","../src/components/calendar/store/calendar-store.ts","../src/components/calendar/calendar.ts","../src/components/noodles/noodle-controller.ts","../src/components/noodles/noodles.ts","../src/components/preview-app/preview-app.ts","../src/register.ts"],"sourcesContent":["// ── aui-table-column ──────────────────────────────────────────\n//\n// Declarative column definition for data-driven tables.\n// Config-only element — renders nothing, just holds metadata.\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiTableColumn extends AgentElement {\n static override attributes: AttributeSchema = {\n key: { type: 'string', default: '' },\n label: { type: 'string', default: '' },\n sortable: { type: 'boolean', default: false },\n filterable: { type: 'boolean', default: false },\n width: { type: 'string', default: '1fr' },\n type: { type: 'enum', values: ['string', 'number', 'date'] as const, default: 'string' },\n align: { type: 'enum', values: ['start', 'center', 'end'] as const, default: 'start' },\n }\n\n declare key: string\n declare label: string\n declare sortable: boolean\n declare filterable: boolean\n declare width: string\n declare type: 'string' | 'number' | 'date'\n declare align: 'start' | 'center' | 'end'\n}\n","// ── aui-canvas ────────────────────────────────────────────────\n//\n// Versatile preview surface with pan/zoom, backgrounds, and\n// editor layout slots.\n//\n// DOM structure:\n// <aui-canvas>\n// [slot=\"leading\"] (user-provided, optional)\n// [slot=\"content\"] (user-provided or auto-created)\n// [data-viewport] (stamped when pan/zoom needed)\n// [slot=\"float-top\"] (user-provided, optional)\n// [data-transform] (holds panned/zoomed content)\n// ... content ...\n// [slot=\"float-bottom\"]\n// — OR —\n// ... content directly ... (simple mode)\n// [slot=\"trailing\"] (user-provided, optional)\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\n\nexport class AuiCanvas extends AgentElement {\n static override attributes: AttributeSchema = {\n background: { type: 'string', default: 'none' },\n orientation: { type: 'string', default: 'horizontal' },\n 'pan-enabled': { type: 'boolean', default: false },\n 'zoom-enabled': { type: 'boolean', default: false },\n infinite: { type: 'boolean', default: false },\n bordered: { type: 'boolean', default: false },\n }\n\n declare background: string\n declare orientation: string\n declare bordered: boolean\n\n #viewport: HTMLElement | null = null\n #transform: HTMLElement | null = null\n #content: HTMLElement | null = null\n\n // Pan state\n #panX = 0\n #panY = 0\n #panning = false\n #panStartX = 0\n #panStartY = 0\n #panOriginX = 0\n #panOriginY = 0\n\n // Zoom state\n #zoom = 1\n\n // ── Public API ──\n\n get panX(): number { return this.#panX }\n get panY(): number { return this.#panY }\n get zoom(): number { return this.#zoom }\n\n /** Reset pan and zoom to defaults */\n reset(): void {\n this.#panX = 0\n this.#panY = 0\n this.#zoom = 1\n this.#applyTransform()\n this.#emitPan()\n this.#emitZoom()\n }\n\n /** Set pan position programmatically */\n panTo(x: number, y: number): void {\n this.#panX = x\n this.#panY = y\n this.#applyTransform()\n this.#emitPan()\n }\n\n /** Set zoom level programmatically */\n zoomTo(level: number): void {\n this.#zoom = Math.max(0.1, Math.min(10, level))\n this.#applyTransform()\n this.#emitZoom()\n }\n\n // ── Lifecycle ──\n\n protected override activate(): void {\n // Ensure a content slot exists\n this.#content = this.querySelector(':scope > [slot=\"content\"]')\n if (!this.#content) {\n this.#content = document.createElement('div')\n this.#content.setAttribute('slot', 'content')\n // Move all non-panel children into it\n const children = Array.from(this.childNodes)\n for (const child of children) {\n if (child instanceof HTMLElement) {\n const slot = child.getAttribute('slot')\n if (slot === 'leading' || slot === 'trailing') continue\n }\n this.#content.appendChild(child)\n }\n this.appendChild(this.#content)\n }\n\n const needsViewport = this.hasAttribute('pan-enabled')\n || this.hasAttribute('zoom-enabled')\n || this.hasAttribute('infinite')\n || this.#content.querySelector(':scope > [slot^=\"float-\"]')\n\n if (needsViewport) {\n this.#stamp()\n }\n\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0')\n }\n this.setAttribute('role', 'region')\n\n if (needsViewport) {\n this.addEventListener('keydown', this.#onKeyDown)\n }\n }\n\n protected override dispose(): void {\n const vp = this.#viewport\n if (vp) {\n vp.removeEventListener('pointerdown', this.#onPointerDown)\n vp.removeEventListener('pointermove', this.#onPointerMove)\n vp.removeEventListener('pointerup', this.#onPointerUp)\n vp.removeEventListener('pointercancel', this.#onPointerUp)\n vp.removeEventListener('wheel', this.#onWheel)\n }\n this.removeEventListener('keydown', this.#onKeyDown)\n }\n\n // ── DOM stamping ──\n\n #stamp(): void {\n const content = this.#content!\n\n // Create viewport inside content slot\n const viewport = document.createElement('div')\n viewport.setAttribute('data-viewport', '')\n\n // Create transform container\n const transform = document.createElement('div')\n transform.setAttribute('data-transform', '')\n\n // Move content slot's children into viewport/transform\n const children = Array.from(content.childNodes)\n for (const child of children) {\n if (child instanceof HTMLElement && child.getAttribute('slot')?.startsWith('float-')) {\n // Float slots go inside viewport but outside transform\n viewport.appendChild(child)\n continue\n }\n transform.appendChild(child)\n }\n\n viewport.appendChild(transform)\n content.appendChild(viewport)\n\n this.#viewport = viewport\n this.#transform = transform\n\n // Wire pan/zoom events on content slot (the visible area)\n const canPan = this.hasAttribute('pan-enabled') || this.hasAttribute('infinite')\n const canZoom = this.hasAttribute('zoom-enabled') || this.hasAttribute('infinite')\n\n if (canPan) {\n content.addEventListener('pointerdown', this.#onPointerDown)\n content.addEventListener('pointermove', this.#onPointerMove)\n content.addEventListener('pointerup', this.#onPointerUp)\n content.addEventListener('pointercancel', this.#onPointerUp)\n }\n\n if (canZoom) {\n content.addEventListener('wheel', this.#onWheel, { passive: false })\n }\n\n this.#applyTransform()\n }\n\n // ── Transform ──\n\n #applyTransform(): void {\n this.style.setProperty('--_canvas-x', `${this.#panX}px`)\n this.style.setProperty('--_canvas-y', `${this.#panY}px`)\n this.style.setProperty('--_canvas-zoom', String(this.#zoom))\n }\n\n #emitPan(): void {\n this.dispatchEvent(new CustomEvent('aui:canvas-pan', {\n bubbles: true, composed: true,\n detail: { x: this.#panX, y: this.#panY },\n }))\n }\n\n #emitZoom(): void {\n this.dispatchEvent(new CustomEvent('aui:canvas-zoom', {\n bubbles: true, composed: true,\n detail: { zoom: this.#zoom },\n }))\n }\n\n // ── Pan handlers ──\n\n #onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n\n // Don't start panning if clicking on content inside transform\n const target = e.target as HTMLElement\n const transform = this.#transform\n if (transform && transform.contains(target)) return\n\n this.#panning = true\n this.#panStartX = e.clientX\n this.#panStartY = e.clientY\n this.#panOriginX = this.#panX\n this.#panOriginY = this.#panY\n\n this.#content!.setPointerCapture(e.pointerId)\n this.setAttribute('data-canvas-panning', '')\n }\n\n #onPointerMove = (e: PointerEvent): void => {\n if (!this.#panning) return\n this.#panX = this.#panOriginX + (e.clientX - this.#panStartX)\n this.#panY = this.#panOriginY + (e.clientY - this.#panStartY)\n this.#applyTransform()\n }\n\n #onPointerUp = (_e: PointerEvent): void => {\n if (!this.#panning) return\n this.#panning = false\n this.removeAttribute('data-canvas-panning')\n this.#emitPan()\n }\n\n // ── Zoom handler ──\n\n #onWheel = (e: WheelEvent): void => {\n e.preventDefault()\n const delta = e.deltaY > 0 ? -0.05 : 0.05\n const newZoom = Math.max(0.1, Math.min(10, this.#zoom + delta * this.#zoom))\n\n if (this.#content) {\n const rect = this.#content.getBoundingClientRect()\n const px = (e.clientX - rect.left) / rect.width\n const py = (e.clientY - rect.top) / rect.height\n\n const scale = newZoom / this.#zoom\n this.#panX = px * rect.width * (1 - scale) + this.#panX * scale\n this.#panY = py * rect.height * (1 - scale) + this.#panY * scale\n }\n\n this.#zoom = newZoom\n this.#applyTransform()\n this.#emitZoom()\n }\n\n // ── Keyboard ──\n\n #onKeyDown = (e: KeyboardEvent): void => {\n switch (e.key) {\n case '0':\n e.preventDefault()\n this.#zoom = 1\n this.#applyTransform()\n this.#emitZoom()\n break\n case '+':\n case '=':\n e.preventDefault()\n this.zoomTo(this.#zoom * 1.15)\n break\n case '-':\n e.preventDefault()\n this.zoomTo(this.#zoom / 1.15)\n break\n case 'Escape':\n e.preventDefault()\n this.reset()\n break\n }\n }\n}\n","import { signal, computed, batch } from '#reactivity';\nimport type { Signal, ReadonlySignal } from '#reactivity';\n\nexport type CalendarView = 'day' | 'month' | 'year';\n\nexport interface CalendarStoreOptions {\n value?: string;\n min?: string;\n max?: string;\n rangeStart?: string;\n rangeEnd?: string;\n}\n\nfunction parseDate(str: string | null): Date | null {\n if (!str) return null;\n const d = new Date(str + 'T00:00:00');\n return isNaN(d.getTime()) ? null : d;\n}\n\nfunction toISO(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n}\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nexport class CalendarStore {\n readonly view: Signal<CalendarView>;\n readonly focusedYear: Signal<number>;\n readonly focusedMonth: Signal<number>;\n readonly value: Signal<string | null>;\n readonly rangeStart: Signal<string | null>;\n readonly rangeEnd: Signal<string | null>;\n readonly min: Signal<string | null>;\n readonly max: Signal<string | null>;\n\n // WHY: Computed grid of day cells for the focused month view\n readonly days: ReadonlySignal<DayCell[]>;\n readonly months: ReadonlySignal<MonthCell[]>;\n readonly years: ReadonlySignal<YearCell[]>;\n readonly title: ReadonlySignal<string>;\n\n constructor(options: CalendarStoreOptions = {}) {\n const now = new Date();\n const initial = parseDate(options.value ?? null) ?? now;\n\n this.view = signal<CalendarView>('day');\n this.focusedYear = signal(initial.getFullYear());\n this.focusedMonth = signal(initial.getMonth());\n this.value = signal(options.value ?? null);\n this.rangeStart = signal(options.rangeStart ?? null);\n this.rangeEnd = signal(options.rangeEnd ?? null);\n this.min = signal(options.min ?? null);\n this.max = signal(options.max ?? null);\n\n this.days = computed(() => this.#computeDays());\n this.months = computed(() => this.#computeMonths());\n this.years = computed(() => this.#computeYears());\n this.title = computed(() => this.#computeTitle());\n }\n\n // ── Navigation ──\n\n prevMonth(): void {\n batch(() => {\n if (this.focusedMonth.value === 0) {\n this.focusedMonth.value = 11;\n this.focusedYear.value--;\n } else {\n this.focusedMonth.value--;\n }\n });\n }\n\n nextMonth(): void {\n batch(() => {\n if (this.focusedMonth.value === 11) {\n this.focusedMonth.value = 0;\n this.focusedYear.value++;\n } else {\n this.focusedMonth.value++;\n }\n });\n }\n\n prevYear(): void {\n this.focusedYear.value--;\n }\n\n nextYear(): void {\n this.focusedYear.value++;\n }\n\n prevDecade(): void {\n this.focusedYear.value -= 10;\n }\n\n nextDecade(): void {\n this.focusedYear.value += 10;\n }\n\n // ── Selection ──\n\n selectDate(iso: string): void {\n this.value.value = iso;\n }\n\n selectMonth(month: number): void {\n batch(() => {\n this.focusedMonth.value = month;\n this.view.value = 'day';\n });\n }\n\n selectYear(year: number): void {\n batch(() => {\n this.focusedYear.value = year;\n this.view.value = 'month';\n });\n }\n\n // ── Range ──\n\n setRange(start: string | null, end: string | null): void {\n batch(() => {\n this.rangeStart.value = start;\n this.rangeEnd.value = end;\n });\n }\n\n // ── Validation ──\n\n isDateDisabled(iso: string): boolean {\n const minDate = parseDate(this.min.value);\n const maxDate = parseDate(this.max.value);\n const d = parseDate(iso);\n if (!d) return true;\n if (minDate && d < minDate) return true;\n if (maxDate && d > maxDate) return true;\n return false;\n }\n\n // ── Private Computations ──\n\n #computeDays(): DayCell[] {\n const year = this.focusedYear.value;\n const month = this.focusedMonth.value;\n const selected = parseDate(this.value.value);\n const today = new Date();\n const rangeStartDate = parseDate(this.rangeStart.value);\n const rangeEndDate = parseDate(this.rangeEnd.value);\n\n // WHY: Start grid from the Sunday of the week containing the 1st\n const first = new Date(year, month, 1);\n const startDay = first.getDay(); // 0=Sun\n const gridStart = new Date(year, month, 1 - startDay);\n\n const cells: DayCell[] = [];\n for (let i = 0; i < 42; i++) {\n const d = new Date(gridStart.getFullYear(), gridStart.getMonth(), gridStart.getDate() + i);\n const iso = toISO(d);\n const inMonth = d.getMonth() === month;\n const isToday = isSameDay(d, today);\n const isSelected = selected ? isSameDay(d, selected) : false;\n const isDisabled = this.isDateDisabled(iso);\n\n let inRange = false;\n let isRangeStart = false;\n let isRangeEnd = false;\n\n if (rangeStartDate && rangeEndDate) {\n const lo = rangeStartDate <= rangeEndDate ? rangeStartDate : rangeEndDate;\n const hi = rangeStartDate <= rangeEndDate ? rangeEndDate : rangeStartDate;\n inRange = d >= lo && d <= hi;\n isRangeStart = isSameDay(d, lo);\n isRangeEnd = isSameDay(d, hi);\n }\n\n cells.push({\n date: iso,\n day: d.getDate(),\n inMonth,\n isToday,\n isSelected,\n isDisabled,\n inRange,\n isRangeStart,\n isRangeEnd,\n });\n }\n return cells;\n }\n\n #computeMonths(): MonthCell[] {\n const year = this.focusedYear.value;\n const currentMonth = this.focusedMonth.value;\n const names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n return names.map((name, i) => ({\n month: i,\n name,\n isCurrent: i === currentMonth && year === new Date().getFullYear(),\n isSelected: i === currentMonth,\n }));\n }\n\n #computeYears(): YearCell[] {\n const focused = this.focusedYear.value;\n const decadeStart = Math.floor(focused / 10) * 10;\n const thisYear = new Date().getFullYear();\n\n const cells: YearCell[] = [];\n for (let y = decadeStart - 1; y <= decadeStart + 10; y++) {\n cells.push({\n year: y,\n inDecade: y >= decadeStart && y < decadeStart + 10,\n isCurrent: y === thisYear,\n isSelected: y === focused,\n });\n }\n return cells;\n }\n\n #computeTitle(): string {\n const monthNames = ['January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'];\n\n switch (this.view.value) {\n case 'day':\n return `${monthNames[this.focusedMonth.value]} ${this.focusedYear.value}`;\n case 'month':\n return `${this.focusedYear.value}`;\n case 'year': {\n const decadeStart = Math.floor(this.focusedYear.value / 10) * 10;\n return `${decadeStart}–${decadeStart + 9}`;\n }\n }\n }\n}\n\nexport interface DayCell {\n date: string; // ISO string\n day: number; // day of month\n inMonth: boolean; // belongs to focused month\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n inRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\nexport interface MonthCell {\n month: number;\n name: string;\n isCurrent: boolean;\n isSelected: boolean;\n}\n\nexport interface YearCell {\n year: number;\n inDecade: boolean;\n isCurrent: boolean;\n isSelected: boolean;\n}\n\nexport function createCalendarStore(options: CalendarStoreOptions = {}): CalendarStore {\n return new CalendarStore(options);\n}\n","import { AgentElement } from '#element';\nimport type { AttributeSchema } from '#element';\nimport { signal, batch } from '#reactivity';\nimport { CalendarStore } from './store/calendar-store.ts';\n\n/**\n * Calendar date picker with day/month/year views and optional range selection.\n * @attr {string} value - Selected date in ISO format (YYYY-MM-DD)\n * @attr {string} min - Minimum selectable date in ISO format\n * @attr {string} max - Maximum selectable date in ISO format\n * @attr {boolean} disabled - Disables interaction\n * @attr {boolean} range - Enables range selection mode\n * @fires change - Fired on single date selection with `{ value }` detail\n * @fires aui:range-select - Fired on range commit with `{ start, end }` detail\n */\nexport class AuiCalendar extends AgentElement {\n static override attributes: AttributeSchema = {\n value: { type: 'string', default: '' },\n min: { type: 'string', default: '' },\n max: { type: 'string', default: '' },\n disabled: { type: 'boolean', default: false },\n range: { type: 'boolean', default: false },\n };\n\n #internals: ElementInternals;\n #store = new CalendarStore();\n #disabled = signal(false);\n\n // WHY: Track focused cell index for keyboard navigation within the grid\n #focusedIndex = signal(0);\n\n // WHY: 3-phase range cycle: idle → selecting (hover previews) → committed → idle\n #rangePhase: 'idle' | 'selecting' | 'committed' = 'idle';\n\n // WHY: Drag-based range selection — pointerdown starts, pointermove previews, pointerup commits\n #dragging = false;\n\n constructor() {\n super();\n this.#internals = this.attachInternals();\n this.#internals.role = 'group';\n }\n\n get store(): CalendarStore {\n return this.#store;\n }\n\n get value(): string | null {\n return this.#store.value.value;\n }\n\n set value(val: string | null) {\n this.#store.value.value = val;\n if (val) {\n this.setAttribute('value', val);\n } else {\n this.removeAttribute('value');\n }\n }\n\n get disabled(): boolean {\n return this.#disabled.value;\n }\n\n set disabled(val: boolean) {\n this.#disabled.value = val;\n this.toggleAttribute('disabled', val);\n }\n\n get range(): boolean {\n return this.hasAttribute('range');\n }\n\n attributeChangedCallback(name: string, old: string | null, val: string | null): void {\n if (old === val) return;\n switch (name) {\n case 'value':\n this.#store.value.value = val;\n break;\n case 'min':\n this.#store.min.value = val;\n break;\n case 'max':\n this.#store.max.value = val;\n break;\n case 'disabled':\n this.#disabled.value = val !== null;\n break;\n case 'range':\n // WHY: When range mode is toggled, reset the range phase and clear any pending range state\n this.#rangePhase = 'idle';\n this.#store.setRange(null, null);\n break;\n }\n super.attributeChangedCallback?.(name, old, val);\n }\n\n protected override activate(): void {\n super.activate();\n // WHY: Moved from constructor — spec forbids setAttribute in constructor\n if (!this.hasAttribute('tabindex')) this.setAttribute('tabindex', '0');\n\n // WHY: Initialize store from attributes — batch to avoid 3 intermediate recomputes\n const val = this.getAttribute('value');\n const min = this.getAttribute('min');\n const max = this.getAttribute('max');\n batch(() => {\n if (val) this.#store.value.value = val;\n if (min) this.#store.min.value = min;\n if (max) this.#store.max.value = max;\n });\n\n // Stamp internal structure\n this.#stamp();\n\n this.addEventListener('keydown', this.#onKeyDown);\n\n // WHY: Single effect re-renders the calendar whenever store state changes\n this.addEffect(() => this.#render());\n\n // WHY: Label the calendar group with current title (month/year) for screen readers\n this.addEffect(() => {\n this.setAttribute('aria-label', this.#store.title.value);\n });\n }\n\n protected override dispose(): void {\n this.querySelector('aui-button[data-role=\"prev\"]')?.removeEventListener('click', this.#onPrevClick);\n this.querySelector('aui-button[data-role=\"next\"]')?.removeEventListener('click', this.#onNextClick);\n this.querySelector('aui-button[data-role=\"title\"]')?.removeEventListener('click', this.#onTitleClickHandler);\n const grid = this.querySelector('[data-cal-grid]');\n grid?.removeEventListener('click', this.#onGridClickHandler);\n grid?.removeEventListener('pointermove', this.#onGridPointerMoveHandler);\n grid?.removeEventListener('pointerdown', this.#onGridPointerDownHandler);\n grid?.removeEventListener('pointerup', this.#onGridPointerUpHandler);\n this.removeEventListener('keydown', this.#onKeyDown);\n super.dispose();\n }\n\n #stamp(): void {\n this.innerHTML = `\n <div data-cal-header>\n <aui-button data-role=\"prev\" aria-label=\"Previous\" tabindex=\"-1\"><aui-icon name=\"caret-left\"></aui-icon></aui-button>\n <aui-button data-role=\"title\" tabindex=\"-1\"></aui-button>\n <aui-button data-role=\"next\" aria-label=\"Next\" tabindex=\"-1\"><aui-icon name=\"caret-right\"></aui-icon></aui-button>\n </div>\n <div data-cal-weekdays></div>\n <div data-cal-grid role=\"grid\"></div>\n `;\n\n // WHY: aui-button's disabled effect sets tabindex=\"0\" on enabled buttons.\n // Calendar uses roving focus on the container — children must be tabindex=\"-1\".\n for (const btn of this.querySelectorAll('[data-cal-header] aui-button')) {\n btn.setAttribute('tabindex', '-1');\n }\n\n const prev = this.querySelector('aui-button[data-role=\"prev\"]') as HTMLElement | null;\n const next = this.querySelector('aui-button[data-role=\"next\"]') as HTMLElement | null;\n const title = this.querySelector('aui-button[data-role=\"title\"]') as HTMLElement | null;\n\n prev?.addEventListener('click', this.#onPrevClick);\n next?.addEventListener('click', this.#onNextClick);\n title?.addEventListener('click', this.#onTitleClickHandler);\n\n const grid = this.querySelector('[data-cal-grid]') as HTMLElement | null;\n grid?.addEventListener('click', this.#onGridClickHandler);\n grid?.addEventListener('pointermove', this.#onGridPointerMoveHandler);\n grid?.addEventListener('pointerdown', this.#onGridPointerDownHandler);\n grid?.addEventListener('pointerup', this.#onGridPointerUpHandler);\n }\n\n #render(): void {\n const view = this.#store.view.value;\n const title = this.querySelector('aui-button[data-role=\"title\"]') as HTMLElement | null;\n const weekdays = this.querySelector('[data-cal-weekdays]') as HTMLElement | null;\n const grid = this.querySelector('[data-cal-grid]') as HTMLElement | null;\n if (!title || !weekdays || !grid) return;\n\n title.textContent = this.#store.title.value;\n\n if (view === 'day') {\n this.setAttribute('view', 'day');\n weekdays.innerHTML = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n .map(d => `<span data-cal-weekday>${d}</span>`)\n .join('');\n\n const days = this.#store.days.value;\n grid.innerHTML = days.map((cell, i) => {\n let attrs = `data-date=\"${cell.date}\" data-index=\"${i}\" tabindex=\"-1\"`;\n if (!cell.inMonth) attrs += ' data-outside';\n if (cell.isToday) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n if (cell.isDisabled) attrs += ' disabled';\n if (cell.inRange) attrs += ' data-in-range';\n if (cell.isRangeStart) attrs += ' data-range-start';\n if (cell.isRangeEnd) attrs += ' data-range-end';\n\n return `<div data-cal-day ${attrs}>${cell.day}</div>`;\n }).join('');\n\n } else if (view === 'month') {\n this.setAttribute('view', 'month');\n weekdays.innerHTML = '';\n\n const months = this.#store.months.value;\n grid.innerHTML = months.map(cell => {\n let attrs = `data-month=\"${cell.month}\" tabindex=\"-1\"`;\n if (cell.isCurrent) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n\n return `<div data-cal-cell ${attrs}>${cell.name}</div>`;\n }).join('');\n\n } else {\n this.setAttribute('view', 'year');\n weekdays.innerHTML = '';\n\n const years = this.#store.years.value;\n grid.innerHTML = years.map(cell => {\n let attrs = `data-year=\"${cell.year}\" tabindex=\"-1\"`;\n if (!cell.inDecade) attrs += ' data-outside';\n if (cell.isCurrent) attrs += ' data-today aria-current=\"date\"';\n if (cell.isSelected) attrs += ' data-selected aria-selected=\"true\"';\n\n return `<div data-cal-cell ${attrs}>${cell.year}</div>`;\n }).join('');\n }\n\n // WHY: Ensure all interactive cells are not independently tabbable —\n // Calendar uses roving focus on the container.\n for (const cell of grid.querySelectorAll('[data-cal-day]:not([disabled]), [data-cal-cell]')) {\n cell.setAttribute('tabindex', '-1');\n }\n }\n\n #onPrevClick = (): void => { this.#onPrev(); };\n #onNextClick = (): void => { this.#onNext(); };\n #onTitleClickHandler = (): void => { this.#onTitleClick(); };\n #onGridClickHandler = (e: Event): void => { this.#onGridClick(e as MouseEvent); };\n #onGridPointerMoveHandler = (e: Event): void => { this.#onGridPointerMove(e as PointerEvent); };\n #onGridPointerDownHandler = (e: Event): void => { this.#onGridPointerDown(e as PointerEvent); };\n #onGridPointerUpHandler = (e: Event): void => { this.#onGridPointerUp(e as PointerEvent); };\n\n #onPrev(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.prevMonth();\n else if (view === 'month') this.#store.prevYear();\n else this.#store.prevDecade();\n }\n\n #onNext(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.nextMonth();\n else if (view === 'month') this.#store.nextYear();\n else this.#store.nextDecade();\n }\n\n #onTitleClick(): void {\n const view = this.#store.view.value;\n if (view === 'day') this.#store.view.value = 'month';\n else if (view === 'month') this.#store.view.value = 'year';\n }\n\n #onGridClick(e: MouseEvent): void {\n if (this.#disabled.value) return;\n const cell = (e.target as HTMLElement).closest('[data-cal-day], [data-cal-cell]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n\n const date = cell.dataset.date;\n const month = cell.dataset.month;\n const year = cell.dataset.year;\n\n if (date) {\n this.#selectDate(date);\n } else if (month !== undefined) {\n this.#store.selectMonth(Number(month));\n } else if (year !== undefined) {\n this.#store.selectYear(Number(year));\n }\n }\n\n #selectDate(iso: string): void {\n if (this.range) {\n // Range selection supports two interaction modes:\n // 1. Click-click: click start, move to preview, click end\n // 2. Click-drag: pointerdown starts, drag to preview, pointerup commits\n // Both modes allow continued dragging after the second click until mouse release.\n if (this.#rangePhase === 'idle') {\n // Start a new range\n batch(() => {\n this.#store.selectDate(iso);\n this.#store.setRange(iso, null);\n });\n this.setAttribute('value', iso);\n this.#rangePhase = 'selecting';\n } else if (this.#rangePhase === 'selecting') {\n // Commit the range\n this.#commitRange(iso);\n } else {\n // committed → clear everything and start fresh\n batch(() => {\n this.#store.value.value = null;\n this.#store.setRange(null, null);\n });\n this.removeAttribute('value');\n this.#rangePhase = 'idle';\n }\n } else {\n this.#store.selectDate(iso);\n this.setAttribute('value', iso);\n this.dispatchEvent(new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { value: iso },\n }));\n }\n }\n\n #commitRange(iso: string): void {\n const start = this.#store.rangeStart.value;\n if (!start) return;\n this.#store.setRange(start, iso);\n this.#rangePhase = 'committed';\n this.#dragging = false;\n this.dispatchEvent(new CustomEvent('aui:range-select', {\n bubbles: true,\n composed: true,\n detail: { start: this.#store.rangeStart.value, end: this.#store.rangeEnd.value },\n }));\n }\n\n #onGridPointerDown(e: PointerEvent): void {\n if (this.#disabled.value) return;\n if (!this.range) return;\n if (e.button !== 0) return;\n\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n\n // Start dragging — begin range from this date\n this.#dragging = true;\n\n if (this.#rangePhase === 'idle' || this.#rangePhase === 'committed') {\n // Fresh drag start\n batch(() => {\n this.#store.selectDate(date);\n this.#store.setRange(date, null);\n });\n this.setAttribute('value', date);\n this.#rangePhase = 'selecting';\n }\n // If already selecting (click-click mode), dragging just continues the preview\n }\n\n #onGridPointerUp(e: PointerEvent): void {\n if (!this.#dragging) return;\n this.#dragging = false;\n\n if (this.#rangePhase !== 'selecting') return;\n\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n\n // If pointer up is on a different cell than start, commit the range\n const start = this.#store.rangeStart.value;\n if (start && start !== date) {\n this.#commitRange(date);\n }\n // If same cell, stay in selecting mode (click-click flow continues)\n }\n\n #onGridPointerMove(e: PointerEvent): void {\n if (this.#disabled.value) return;\n if (!this.range) return;\n // Preview range during: selecting phase (click-click hover) OR active drag\n if (this.#rangePhase !== 'selecting') return;\n const cell = (e.target as HTMLElement).closest('[data-cal-day]') as HTMLElement | null;\n if (!cell || cell.hasAttribute('disabled')) return;\n const date = cell.dataset.date;\n if (!date) return;\n const start = this.#store.rangeStart.value;\n if (!start) return;\n this.#store.setRange(start, date);\n }\n\n #onKeyDown = (e: KeyboardEvent): void => {\n if (this.#disabled.value) return;\n\n const view = this.#store.view.value;\n if (view !== 'day') return;\n\n const days = this.#store.days.value;\n let idx = this.#focusedIndex.value;\n let handled = true;\n\n switch (e.key) {\n case 'ArrowRight': idx += 1; break;\n case 'ArrowLeft': idx -= 1; break;\n case 'ArrowDown': idx += 7; break;\n case 'ArrowUp': idx -= 7; break;\n case 'Home':\n // WHY: Jump to first day of current week\n idx = idx - (idx % 7);\n break;\n case 'End':\n idx = idx - (idx % 7) + 6;\n break;\n case 'PageDown':\n e.shiftKey ? this.#store.nextYear() : this.#store.nextMonth();\n break;\n case 'PageUp':\n e.shiftKey ? this.#store.prevYear() : this.#store.prevMonth();\n break;\n case 'Enter':\n case ' ': {\n const cell = days[idx];\n if (cell && !cell.isDisabled) {\n this.#selectDate(cell.date);\n }\n break;\n }\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n idx = Math.max(0, Math.min(41, idx));\n this.#focusedIndex.value = idx;\n\n // WHY: Navigate to prev/next month if focus moves outside current grid\n if (idx < 0) this.#store.prevMonth();\n if (idx > 41) this.#store.nextMonth();\n }\n };\n}\n","// ── NoodleController ─────────────────────────────────────────\n//\n// Pure-JS controller that renders SVG noodle connections between\n// DOM elements within a host container. Handles coordinate math,\n// path rendering, port indicators, and drag-to-connect interactions.\n//\n// Ported from native-ui NoodleController with aui: event prefix\n// and --aui- CSS custom property prefix.\n\n// ── UID helper (no external deps) ──\n\nlet _counter = 0\nfunction uid(prefix: string): string {\n return `${prefix}-${Date.now().toString(36)}-${(++_counter).toString(36)}`\n}\n\n// ── Types ──\n\nexport type PortSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface NoodleConnection {\n /** Unique connection ID (auto-generated via uid if not provided) */\n id: string\n /** Element ID for the source element */\n from: string\n /** Element ID for the target element */\n to: string\n /** Port side on the source element (default: 'right') */\n fromPort: PortSide\n /** Port side on the target element (default: 'left') */\n toPort: PortSide\n /** Optional color override for this specific noodle */\n color?: string\n}\n\nexport interface NoodleOptions {\n /** CSS selector for elements that can be connection endpoints (default: '[data-noodle-port]') */\n selector?: string\n /** Allow interactive creation/deletion of connections (default: false) */\n editable?: boolean\n /** Noodle stroke color (default: 'var(--aui-accent-500)') */\n color?: string\n /** Noodle stroke width in px (default: 2) */\n strokeWidth?: number\n /** Bezier curve tension -- how far control points extend (default: 0.5) */\n tension?: number\n /** Show port indicator dots on connectable elements (default: true when editable) */\n showPorts?: boolean\n /** Port indicator dot size in px (default: 10) */\n portSize?: number\n /** Initial connections (default: []) */\n connections?: NoodleConnection[]\n /** Noodle curve style (default: 'bezier') */\n style?: 'bezier' | 'step' | 'straight'\n /** Animate noodles with a flowing dash pattern (default: false) */\n animated?: boolean\n /** Disable the controller */\n disabled?: boolean\n}\n\n/** Proximity threshold (px) for snap-to-port drop detection */\nconst DROP_SNAP_RADIUS = 50\n\ninterface DragState {\n fromElement: HTMLElement\n fromPort: PortSide\n fromId: string\n pointerId: number\n sourceDot: HTMLElement\n /** Set when reconnecting an existing connection (detached at drag start) */\n reconnectId?: string\n}\n\nconst NS = 'http://www.w3.org/2000/svg'\n\n/** Renders SVG noodle connections between DOM elements within a host container. */\nexport class NoodleController {\n readonly host: HTMLElement\n\n // ── Public mutable options ──\n selector: string\n editable: boolean\n color: string\n strokeWidth: number\n tension: number\n showPorts: boolean\n portSize: number\n style: 'bezier' | 'step' | 'straight'\n animated: boolean\n disabled: boolean\n\n // ── Private state ──\n #attached = false\n #svg: SVGSVGElement | null = null\n #connections: Map<string, NoodleConnection> = new Map()\n #pathGroup: SVGGElement | null = null\n #hitGroup: SVGGElement | null = null\n #portElements: HTMLElement[] = []\n #dragState: DragState | null = null\n #dragPath: SVGPathElement | null = null\n #resizeObserver: ResizeObserver | null = null\n #mutationObserver: MutationObserver | null = null\n #rafId = 0\n #updateQueued = false\n #suppressObserver = false\n #styleEl: HTMLStyleElement | null = null\n\n constructor(host: HTMLElement, options: NoodleOptions = {}) {\n this.host = host\n this.selector = options.selector ?? '[data-noodle-port]'\n this.editable = options.editable ?? false\n this.color = options.color ?? 'var(--aui-accent-500)'\n this.strokeWidth = options.strokeWidth ?? 2\n this.tension = options.tension ?? 0.5\n this.showPorts = options.showPorts ?? this.editable\n this.portSize = options.portSize ?? 10\n this.style = options.style ?? 'bezier'\n this.animated = options.animated ?? false\n this.disabled = options.disabled ?? false\n\n if (options.connections) {\n for (const c of options.connections) {\n this.#connections.set(c.id, {\n ...c,\n fromPort: c.fromPort ?? 'right',\n toPort: c.toPort ?? 'left',\n })\n }\n }\n\n this.attach()\n }\n\n // ── Lifecycle ──\n\n attach(): void {\n if (this.#attached) return\n this.#attached = true\n\n // Ensure host is positioned and establishes a stacking context\n // WHY: isolation prevents the SVG overlay and port dots from bleeding\n // through sibling elements outside the noodle host.\n const pos = getComputedStyle(this.host).position\n if (pos === 'static') this.host.style.position = 'relative'\n this.host.style.isolation = 'isolate'\n\n this.#createSVG()\n this.#injectKeyframes()\n this.#startObserving()\n\n if (this.showPorts) this.#createPortIndicators()\n\n // Listen for drag events from MagnetController / DragController\n this.host.addEventListener('aui:magnet-snap', this.#onExternalMove)\n this.host.addEventListener('aui:magnet-drop', this.#onExternalMove)\n this.host.addEventListener('aui:drag-move', this.#onExternalMove)\n\n this.#renderAllPaths()\n }\n\n detach(): void {\n if (!this.#attached) return\n this.#attached = false\n\n this.#stopObserving()\n this.#removePortIndicators()\n this.#removeSVG()\n this.#removeKeyframes()\n this.host.style.isolation = ''\n\n this.host.removeEventListener('aui:magnet-snap', this.#onExternalMove)\n this.host.removeEventListener('aui:magnet-drop', this.#onExternalMove)\n this.host.removeEventListener('aui:drag-move', this.#onExternalMove)\n\n if (this.#rafId) {\n cancelAnimationFrame(this.#rafId)\n this.#rafId = 0\n }\n this.#updateQueued = false\n }\n\n destroy(): void {\n this.#endDrag()\n this.detach()\n this.#connections.clear()\n }\n\n // ── Public API ──\n\n /** Add a connection. Returns the connection ID. */\n connect(from: string, to: string, fromPort: PortSide = 'right', toPort: PortSide = 'left'): string {\n const id = uid('noodle')\n const conn: NoodleConnection = { id, from, to, fromPort, toPort }\n this.#connections.set(id, conn)\n this.#renderAllPaths()\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-connect', {\n bubbles: true, composed: true,\n detail: { id, from, to, fromPort, toPort },\n }))\n\n return id\n }\n\n /** Remove a connection by ID. */\n disconnect(id: string): boolean {\n const conn = this.#connections.get(id)\n if (!conn) return false\n this.#connections.delete(id)\n this.#renderAllPaths()\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-disconnect', {\n bubbles: true, composed: true,\n detail: { id, from: conn.from, to: conn.to, fromPort: conn.fromPort, toPort: conn.toPort },\n }))\n\n return true\n }\n\n /** Remove all connections. */\n clear(): void {\n const conns = [...this.#connections.values()]\n this.#connections.clear()\n this.#renderAllPaths()\n for (const conn of conns) {\n this.host.dispatchEvent(new CustomEvent('aui:noodle-disconnect', {\n bubbles: true, composed: true,\n detail: { id: conn.id, from: conn.from, to: conn.to, fromPort: conn.fromPort, toPort: conn.toPort },\n }))\n }\n }\n\n /** Get all current connections. */\n getConnections(): NoodleConnection[] {\n return [...this.#connections.values()]\n }\n\n /** Replace all connections. */\n setConnections(connections: NoodleConnection[]): void {\n this.#connections.clear()\n for (const c of connections) {\n this.#connections.set(c.id ?? uid('noodle'), {\n ...c,\n fromPort: c.fromPort ?? 'right',\n toPort: c.toPort ?? 'left',\n })\n }\n this.#renderAllPaths()\n }\n\n /** Force re-render all paths and rebuild port indicators.\n * Call after programmatic element moves or when the set of port elements changes. */\n update(): void {\n this.#renderAllPaths()\n // WHY: Skip port recreation during active drag -- it would destroy\n // data-noodle-droppable attrs and the source dot's pointer capture.\n if (this.showPorts && !this.#dragState) this.#createPortIndicators()\n }\n\n // ── SVG overlay ──\n\n #createSVG(): void {\n const svg = document.createElementNS(NS, 'svg')\n svg.setAttribute('data-noodle-svg', '')\n svg.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;z-index:0;'\n // Groups: hit areas behind visible paths\n this.#hitGroup = document.createElementNS(NS, 'g')\n this.#hitGroup.setAttribute('data-noodle-hits', '')\n svg.appendChild(this.#hitGroup)\n this.#pathGroup = document.createElementNS(NS, 'g')\n this.#pathGroup.setAttribute('data-noodle-paths', '')\n svg.appendChild(this.#pathGroup)\n this.host.appendChild(svg)\n this.#svg = svg\n }\n\n #removeSVG(): void {\n this.#svg?.remove()\n this.#svg = null\n this.#pathGroup = null\n this.#hitGroup = null\n }\n\n #injectKeyframes(): void {\n if (this.#styleEl) return\n const style = document.createElement('style')\n style.textContent = '@keyframes noodle-flow{to{stroke-dashoffset:-12}}'\n this.host.appendChild(style)\n this.#styleEl = style\n }\n\n #removeKeyframes(): void {\n this.#styleEl?.remove()\n this.#styleEl = null\n }\n\n // ── Coordinate helpers ──\n\n /** Convert client (screen) coordinates to the host's layout coordinate space,\n * accounting for CSS transforms (zoom/pan) on the host or its ancestors. */\n #clientToLocal(clientX: number, clientY: number): { x: number; y: number } {\n const hostRect = this.host.getBoundingClientRect()\n // Detect transform scale by comparing visual size to layout size\n const scaleX = hostRect.width / (this.host.clientWidth || 1)\n const scaleY = hostRect.height / (this.host.clientHeight || 1)\n return {\n x: (clientX - hostRect.left) / scaleX,\n y: (clientY - hostRect.top) / scaleY,\n }\n }\n\n // ── Path computation ──\n\n #getPortPosition(elementId: string, port: PortSide): { x: number; y: number } | null {\n const el = this.host.querySelector(`#${CSS.escape(elementId)}`) as HTMLElement | null\n if (!el) return null\n\n // Use offset-based positioning instead of getBoundingClientRect --\n // ports and SVG paths are positioned in the host's layout coordinate space,\n // which must ignore CSS transforms on ancestor elements (e.g. zoom/pan).\n let x = 0, y = 0\n let current: HTMLElement | null = el\n while (current && current !== this.host) {\n x += current.offsetLeft\n y += current.offsetTop\n // Account for inline translate (e.g. MagnetController drag)\n const translate = current.style.translate\n if (translate) {\n const parts = translate.match(/-?[\\d.]+/g)\n if (parts) { x += parseFloat(parts[0]) || 0; y += parseFloat(parts[1]) || 0 }\n }\n current = current.offsetParent as HTMLElement | null\n }\n\n const w = el.offsetWidth\n const h = el.offsetHeight\n\n switch (port) {\n case 'top': return { x: x + w / 2, y }\n case 'right': return { x: x + w, y: y + h / 2 }\n case 'bottom': return { x: x + w / 2, y: y + h }\n case 'left': return { x, y: y + h / 2 }\n }\n }\n\n #controlPoint(x: number, y: number, port: PortSide, offset: number): [number, number] {\n switch (port) {\n case 'right': return [x + offset, y]\n case 'left': return [x - offset, y]\n case 'bottom': return [x, y + offset]\n case 'top': return [x, y - offset]\n }\n }\n\n #computePath(conn: NoodleConnection): string | null {\n const p1 = this.#getPortPosition(conn.from, conn.fromPort)\n const p2 = this.#getPortPosition(conn.to, conn.toPort)\n if (!p1 || !p2) return null\n\n switch (this.style) {\n case 'straight':\n return `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`\n case 'step': {\n const mx = (p1.x + p2.x) / 2\n return `M ${p1.x} ${p1.y} L ${mx} ${p1.y} L ${mx} ${p2.y} L ${p2.x} ${p2.y}`\n }\n case 'bezier':\n default: {\n const dist = Math.max(Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, conn.fromPort, offset)\n const [cx2, cy2] = this.#controlPoint(p2.x, p2.y, conn.toPort, offset)\n return `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${cx2} ${cy2}, ${p2.x} ${p2.y}`\n }\n }\n }\n\n // ── Rendering ──\n\n #renderAllPaths(): void {\n if (!this.#pathGroup || !this.#hitGroup) return\n\n this.#suppressObserver = true\n\n // Clear existing\n this.#pathGroup.textContent = ''\n this.#hitGroup.textContent = ''\n\n // Re-render temp drag path if active\n if (this.#dragPath) this.#pathGroup.appendChild(this.#dragPath)\n\n for (const conn of this.#connections.values()) {\n const d = this.#computePath(conn)\n if (!d) continue\n\n // Hit area (edit mode)\n if (this.editable) {\n const hit = document.createElementNS(NS, 'path')\n hit.setAttribute('d', d)\n hit.setAttribute('stroke', 'transparent')\n hit.setAttribute('stroke-width', '14')\n hit.setAttribute('fill', 'none')\n hit.style.pointerEvents = 'stroke'\n hit.style.cursor = 'pointer'\n hit.dataset.noodleId = conn.id\n hit.addEventListener('pointerdown', this.#onHitPointerDown)\n this.#hitGroup.appendChild(hit)\n }\n\n // Visible path\n const path = document.createElementNS(NS, 'path')\n path.setAttribute('d', d)\n path.setAttribute('fill', 'none')\n path.setAttribute('stroke-linecap', 'round')\n\n if (this.disabled) {\n // Disabled: use muted ink for better contrast, dashed to convey inactive state\n path.setAttribute('stroke', 'var(--aui-ink-muted)')\n path.setAttribute('stroke-width', String(this.strokeWidth))\n path.setAttribute('stroke-dasharray', '6 4')\n path.style.opacity = '0.6'\n } else {\n path.setAttribute('stroke', conn.color ?? this.color)\n path.setAttribute('stroke-width', String(this.strokeWidth))\n if (this.animated) {\n path.setAttribute('stroke-dasharray', '8 4')\n path.style.animation = 'noodle-flow 0.6s linear infinite'\n }\n }\n this.#pathGroup.appendChild(path)\n }\n\n // WHY: Delay restore via microtask -- same reason as #createPortIndicators.\n // The observer microtask must fire while suppression is still active.\n if (!this.#dragState) queueMicrotask(() => { this.#suppressObserver = false })\n }\n\n #queueUpdate(): void {\n if (this.#updateQueued) return\n this.#updateQueued = true\n this.#rafId = requestAnimationFrame(() => {\n this.#updateQueued = false\n this.#renderAllPaths()\n if (this.showPorts) this.#positionPortIndicators()\n })\n }\n\n /** Full update: recreate port indicators (for child list changes). */\n #queueFullUpdate(): void {\n if (this.#updateQueued) return\n this.#updateQueued = true\n this.#rafId = requestAnimationFrame(() => {\n this.#updateQueued = false\n this.#renderAllPaths()\n // WHY: Skip port recreation during active drag -- it would destroy\n // data-noodle-droppable attrs and break proximity detection.\n if (this.showPorts && !this.#dragState) this.#createPortIndicators()\n })\n }\n\n // ── Port indicators (edit mode) ──\n\n #createPortIndicators(): void {\n this.#suppressObserver = true\n this.#removePortIndicators()\n const portElements = this.host.querySelectorAll(this.selector)\n for (const el of portElements) {\n const sides = (el.getAttribute('data-noodle-port') ?? '').split(/\\s+/).filter(Boolean)\n const elId = el.id\n if (!elId) continue\n\n for (const side of sides) {\n const dot = document.createElement('div')\n dot.setAttribute('data-noodle-port-indicator', '')\n dot.setAttribute('data-noodle-side', side)\n dot.setAttribute('data-noodle-target', elId)\n dot.style.cssText = `position:absolute;width:${this.portSize}px;height:${this.portSize}px;border-radius:50%;background:${this.color};border:2px solid white;pointer-events:auto;cursor:crosshair;z-index:5;touch-action:none;transform:translate(-50%,-50%);transition:transform 150ms ease,box-shadow 150ms ease;box-shadow:0 1px 3px rgba(0,0,0,0.2);`\n dot.addEventListener('pointerdown', this.#onPortPointerDown)\n this.host.appendChild(dot)\n this.#portElements.push(dot)\n }\n }\n this.#positionPortIndicators()\n // WHY: Delay restore via microtask so the MutationObserver callback (also a\n // microtask) fires while suppression is still active. Without this, the observer\n // sees childList changes from dot creation and queues #queueFullUpdate, creating\n // an infinite recreation loop that wipes data-noodle-droppable every frame.\n if (!this.#dragState) queueMicrotask(() => { this.#suppressObserver = false })\n }\n\n #positionPortIndicators(): void {\n for (const dot of this.#portElements) {\n const targetId = dot.getAttribute('data-noodle-target')!\n const side = dot.getAttribute('data-noodle-side')! as PortSide\n const pos = this.#getPortPosition(targetId, side)\n if (pos) {\n dot.style.left = `${pos.x}px`\n dot.style.top = `${pos.y}px`\n }\n }\n }\n\n #removePortIndicators(): void {\n for (const dot of this.#portElements) {\n dot.removeEventListener('pointerdown', this.#onPortPointerDown)\n dot.remove()\n }\n this.#portElements = []\n }\n\n // ── Edit mode: drag-to-connect ──\n\n #onPortPointerDown = (e: PointerEvent): void => {\n if (this.disabled || !this.editable || e.button !== 0) return\n const dot = (e.target as HTMLElement).closest('[data-noodle-port-indicator]') as HTMLElement\n if (!dot) return\n\n e.preventDefault()\n e.stopPropagation()\n\n // WHY: Do NOT call setPointerCapture -- it redirects all pointer events to\n // the source dot, preventing :hover from activating on target port dots.\n // Document-level listeners handle move/up correctly without capture.\n\n const targetId = dot.getAttribute('data-noodle-target')!\n const side = dot.getAttribute('data-noodle-side')! as PortSide\n const el = this.host.querySelector(`#${CSS.escape(targetId)}`)\n if (!el) return\n\n this.#dragState = {\n fromElement: el as HTMLElement,\n fromPort: side,\n fromId: targetId,\n pointerId: e.pointerId,\n sourceDot: dot,\n }\n\n // Mark source port as dragging\n dot.setAttribute('data-noodle-dragging', '')\n\n // Mark all other ports as valid drop targets\n for (const portDot of this.#portElements) {\n if (portDot === dot) continue\n const portTargetId = portDot.getAttribute('data-noodle-target')!\n const portSide = portDot.getAttribute('data-noodle-side')!\n // Don't mark same port on same element\n if (portTargetId === targetId && portSide === side) continue\n portDot.setAttribute('data-noodle-droppable', '')\n }\n\n // WHY: Suppress MutationObserver for the entire drag operation.\n // Appending the drag path triggers a childList mutation -> #queueFullUpdate\n // which destroys all port indicators (and their data-noodle-droppable attrs),\n // breaking proximity detection and preventing connections from forming.\n this.#suppressObserver = true\n\n // Create temporary drag path -- visible but muted until near a valid port\n this.#dragPath = document.createElementNS(NS, 'path')\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.setAttribute('stroke-width', String(this.strokeWidth))\n this.#dragPath.setAttribute('fill', 'none')\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n this.#dragPath.setAttribute('stroke-linecap', 'round')\n this.#dragPath.style.opacity = '0.7'\n this.#pathGroup?.appendChild(this.#dragPath)\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-drag', {\n bubbles: true, composed: true,\n detail: { from: targetId, fromPort: side, x: e.clientX, y: e.clientY },\n }))\n\n document.addEventListener('pointermove', this.#onPortPointerMove)\n document.addEventListener('pointerup', this.#onPortPointerUp)\n document.addEventListener('pointercancel', this.#onPortPointerCancel)\n }\n\n #onPortPointerMove = (e: PointerEvent): void => {\n const state = this.#dragState\n if (!state || !this.#dragPath) return\n\n const p1 = this.#getPortPosition(state.fromId, state.fromPort)\n if (!p1) return\n\n // Pointer position in host's layout coordinate space\n const { x: mx, y: my } = this.#clientToLocal(e.clientX, e.clientY)\n\n // Compute bezier from port to pointer\n const dist = Math.max(Math.abs(mx - p1.x), Math.abs(my - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, state.fromPort, offset)\n const d = `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${mx} ${my}, ${mx} ${my}`\n this.#dragPath.setAttribute('d', d)\n\n // Update drop-ready state via proximity detection\n this.#updateDropReady(e.clientX, e.clientY)\n }\n\n #onPortPointerUp = (e: PointerEvent): void => {\n const state = this.#dragState\n if (!state) return\n\n // Proximity-based snap: find nearest port within threshold\n const nearest = this.#findNearestPort(e.clientX, e.clientY)\n if (nearest) {\n const toId = nearest.getAttribute('data-noodle-target')!\n const toPort = nearest.getAttribute('data-noodle-side')! as PortSide\n\n // Don't connect to same port on same element\n if (toId !== state.fromId || toPort !== state.fromPort) {\n this.connect(state.fromId, toId, state.fromPort, toPort)\n }\n }\n\n this.#endDrag()\n }\n\n #onPortPointerCancel = (): void => {\n this.#endDrag()\n }\n\n #endDrag(): void {\n // Clean up interaction state attributes\n for (const dot of this.#portElements) {\n dot.removeAttribute('data-noodle-dragging')\n dot.removeAttribute('data-noodle-droppable')\n dot.removeAttribute('data-noodle-drop-ready')\n }\n\n this.#dragPath?.remove()\n this.#dragPath = null\n this.#dragState = null\n document.removeEventListener('pointermove', this.#onPortPointerMove)\n document.removeEventListener('pointerup', this.#onPortPointerUp)\n document.removeEventListener('pointercancel', this.#onPortPointerCancel)\n\n // Restore observer after drag -- pick up any mutations that were suppressed\n this.#suppressObserver = false\n }\n\n // ── Proximity helpers ──\n\n /** Find the nearest droppable port within DROP_SNAP_RADIUS of a screen point. */\n #findNearestPort(clientX: number, clientY: number): HTMLElement | null {\n let nearest: HTMLElement | null = null\n let minDist = DROP_SNAP_RADIUS\n\n for (const dot of this.#portElements) {\n if (!dot.hasAttribute('data-noodle-droppable')) continue\n const rect = dot.getBoundingClientRect()\n const cx = rect.left + rect.width / 2\n const cy = rect.top + rect.height / 2\n const dist = Math.hypot(clientX - cx, clientY - cy)\n if (dist < minDist) {\n minDist = dist\n nearest = dot\n }\n }\n\n return nearest\n }\n\n /** Toggle data-noodle-drop-ready on the nearest droppable port and update drag path color. */\n #updateDropReady(clientX: number, clientY: number): void {\n const nearest = this.#findNearestPort(clientX, clientY)\n\n for (const dot of this.#portElements) {\n if (dot === nearest) {\n dot.setAttribute('data-noodle-drop-ready', '')\n } else {\n dot.removeAttribute('data-noodle-drop-ready')\n }\n }\n\n // Color feedback on the drag path\n if (nearest && this.#dragPath && this.#dragState) {\n // Within snap zone -> alive: solid accent, snap path to target port\n this.#dragPath.setAttribute('stroke', this.color)\n this.#dragPath.style.opacity = '1'\n this.#dragPath.removeAttribute('stroke-dasharray')\n\n const targetId = nearest.getAttribute('data-noodle-target')!\n const targetPort = nearest.getAttribute('data-noodle-side')! as PortSide\n const p2 = this.#getPortPosition(targetId, targetPort)\n const p1 = this.#getPortPosition(this.#dragState.fromId, this.#dragState.fromPort)\n if (p1 && p2) {\n const dist = Math.max(Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(p1.x, p1.y, this.#dragState.fromPort, offset)\n const [cx2, cy2] = this.#controlPoint(p2.x, p2.y, targetPort, offset)\n this.#dragPath.setAttribute('d', `M ${p1.x} ${p1.y} C ${cx1} ${cy1}, ${cx2} ${cy2}, ${p2.x} ${p2.y}`)\n }\n } else if (this.#dragPath) {\n // Outside snap zone -> muted dashed\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.style.opacity = '0.7'\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n }\n }\n\n // ── Reconnect drag (grab existing noodle near endpoint) ──\n\n #onHitPointerDown = (e: PointerEvent): void => {\n if (this.disabled || !this.editable || e.button !== 0) return\n const target = e.target as SVGPathElement\n const connId = target.dataset.noodleId\n if (!connId) return\n const conn = this.#connections.get(connId)\n if (!conn) return\n\n e.preventDefault()\n e.stopPropagation()\n\n // WHY: Suppress BEFORE disconnect() -- disconnect calls #renderAllPaths which\n // modifies SVG DOM. Without early suppression, the MutationObserver would\n // queue #queueFullUpdate that destroys port dots before we mark them droppable.\n this.#suppressObserver = true\n\n // Determine which endpoint is closer to the pointer\n const p1 = this.#getPortPosition(conn.from, conn.fromPort)\n const p2 = this.#getPortPosition(conn.to, conn.toPort)\n if (!p1 || !p2) { this.#suppressObserver = false; return }\n\n const { x: pointerX, y: pointerY } = this.#clientToLocal(e.clientX, e.clientY)\n\n const distFrom = Math.hypot(pointerX - p1.x, pointerY - p1.y)\n const distTo = Math.hypot(pointerX - p2.x, pointerY - p2.y)\n\n // Anchor at the farther endpoint, detach the closer one\n const anchorId = distFrom < distTo ? conn.to : conn.from\n const anchorPort = distFrom < distTo ? conn.toPort : conn.fromPort\n\n // Remove the connection (fires aui:noodle-disconnect)\n this.disconnect(connId)\n\n // Find the anchor port's indicator dot\n const anchorDot = this.#portElements.find(\n d => d.getAttribute('data-noodle-target') === anchorId &&\n d.getAttribute('data-noodle-side') === anchorPort\n )\n if (!anchorDot) { this.#suppressObserver = false; return }\n\n const el = this.host.querySelector(`#${CSS.escape(anchorId)}`)\n if (!el) { this.#suppressObserver = false; return }\n\n // WHY: No setPointerCapture -- same reason as #onPortPointerDown.\n\n this.#dragState = {\n fromElement: el as HTMLElement,\n fromPort: anchorPort,\n fromId: anchorId,\n pointerId: e.pointerId,\n sourceDot: anchorDot,\n reconnectId: connId,\n }\n\n // Mark source port as dragging\n anchorDot.setAttribute('data-noodle-dragging', '')\n\n // Mark all other ports as valid drop targets\n for (const portDot of this.#portElements) {\n if (portDot === anchorDot) continue\n const portTargetId = portDot.getAttribute('data-noodle-target')!\n const portSide = portDot.getAttribute('data-noodle-side')!\n if (portTargetId === anchorId && portSide === anchorPort) continue\n portDot.setAttribute('data-noodle-droppable', '')\n }\n\n // Create temporary drag path -- starts muted\n this.#dragPath = document.createElementNS(NS, 'path')\n this.#dragPath.setAttribute('stroke', 'var(--aui-ink-muted)')\n this.#dragPath.setAttribute('stroke-width', String(this.strokeWidth))\n this.#dragPath.setAttribute('fill', 'none')\n this.#dragPath.setAttribute('stroke-dasharray', '6 4')\n this.#dragPath.setAttribute('stroke-linecap', 'round')\n this.#dragPath.style.opacity = '0.7'\n\n // Compute initial path from anchor to pointer so the drag is immediately visible\n const anchorPos = this.#getPortPosition(anchorId, anchorPort)\n const { x: mx, y: my } = this.#clientToLocal(e.clientX, e.clientY)\n if (anchorPos) {\n const dist = Math.max(Math.abs(mx - anchorPos.x), Math.abs(my - anchorPos.y))\n const offset = Math.max(50, dist * this.tension)\n const [cx1, cy1] = this.#controlPoint(anchorPos.x, anchorPos.y, anchorPort, offset)\n this.#dragPath.setAttribute('d', `M ${anchorPos.x} ${anchorPos.y} C ${cx1} ${cy1}, ${mx} ${my}, ${mx} ${my}`)\n }\n\n this.#pathGroup?.appendChild(this.#dragPath)\n\n this.host.dispatchEvent(new CustomEvent('aui:noodle-drag', {\n bubbles: true, composed: true,\n detail: { from: anchorId, fromPort: anchorPort, x: e.clientX, y: e.clientY, reconnect: true },\n }))\n\n document.addEventListener('pointermove', this.#onPortPointerMove)\n document.addEventListener('pointerup', this.#onPortPointerUp)\n document.addEventListener('pointercancel', this.#onPortPointerCancel)\n }\n\n // ── Movement tracking ──\n\n #onExternalMove = (): void => {\n this.#queueUpdate()\n }\n\n #startObserving(): void {\n // ResizeObserver for host size changes\n this.#resizeObserver = new ResizeObserver(() => this.#queueUpdate())\n this.#resizeObserver.observe(this.host)\n\n // MutationObserver for style changes (drag-based movement) + child list changes (dataset load)\n this.#mutationObserver = new MutationObserver((mutations) => {\n if (this.#suppressObserver) return\n const hasChildListChange = mutations.some(m => m.type === 'childList')\n if (hasChildListChange) {\n this.#queueFullUpdate() // Recreate port indicators for new/removed elements\n } else {\n this.#queueUpdate() // Just reposition existing indicators\n }\n })\n this.#mutationObserver.observe(this.host, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style', 'class', 'translate', 'data-noodle-port'],\n })\n }\n\n #stopObserving(): void {\n this.#resizeObserver?.disconnect()\n this.#resizeObserver = null\n this.#mutationObserver?.disconnect()\n this.#mutationObserver = null\n }\n}\n","// ── aui-noodles ──────────────────────────────────────────────\n//\n// Declarative SVG noodle canvas. Wraps NoodleController with a\n// zero-config custom element. Children declare ports via\n// `data-noodle-port=\"left right\"` and the element handles the SVG\n// overlay, coordinate system, and stacking context automatically.\n//\n// ```html\n// <aui-noodles editable>\n// <div id=\"a\" data-noodle-port=\"right\">Node A</div>\n// <div id=\"b\" data-noodle-port=\"left\">Node B</div>\n// </aui-noodles>\n// ```\n//\n// @attr {boolean} editable - Allow interactive creation/deletion of connections\n// @attr {string} color - Noodle stroke color (default: accent)\n// @attr {string} stroke-width - Stroke width in px (default: 2)\n// @attr {string} tension - Bezier control point distance 0-1 (default: 0.5)\n// @attr {boolean} show-ports - Show port indicator dots (default: auto from editable)\n// @attr {string} port-size - Port dot size in px (default: 10)\n// @attr {'bezier'|'step'|'straight'} curve - Curve style (default: bezier)\n// @attr {boolean} animated - Flowing dash animation\n// @attr {boolean} disabled - Disable the controller\n// @fires aui:noodle-connect - Connection created. Detail: `{ id, from, to, fromPort, toPort }`\n// @fires aui:noodle-disconnect - Connection removed. Detail: `{ id, from, to, fromPort, toPort }`\n// @fires aui:noodle-drag - Pointer moves during drag. Detail: `{ from, fromPort, x, y, reconnect? }`\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\nimport { NoodleController } from './noodle-controller.ts'\nimport type { NoodleConnection, NoodleOptions, PortSide } from './noodle-controller.ts'\n\nexport class AuiNoodles extends AgentElement {\n static override attributes: AttributeSchema = {\n editable: { type: 'boolean', default: false },\n color: { type: 'string', default: '' },\n 'stroke-width': { type: 'string', default: '2' },\n tension: { type: 'string', default: '0.5' },\n 'show-ports': { type: 'boolean', default: false },\n 'port-size': { type: 'string', default: '10' },\n curve: { type: 'string', default: 'bezier' },\n animated: { type: 'boolean', default: false },\n disabled: { type: 'boolean', default: false },\n }\n\n declare editable: boolean\n declare color: string\n declare 'stroke-width': string\n declare tension: string\n declare 'show-ports': boolean\n declare 'port-size': string\n declare curve: string\n declare animated: boolean\n declare disabled: boolean\n\n #ctrl: NoodleController | null = null\n\n // ── Public API (pass-through) ──\n\n /** Current connections. */\n get connections(): NoodleConnection[] {\n return this.#ctrl?.getConnections() ?? []\n }\n\n /** Create a connection between two elements. Returns the connection ID. */\n connect(from: string, to: string, fromPort?: PortSide, toPort?: PortSide): string {\n return this.#ctrl!.connect(from, to, fromPort, toPort)\n }\n\n /** Remove a connection by ID. */\n disconnect(id: string): boolean {\n return this.#ctrl?.disconnect(id) ?? false\n }\n\n /** Replace all connections. */\n setConnections(connections: NoodleConnection[]): void {\n this.#ctrl?.setConnections(connections)\n }\n\n /** Remove all connections. */\n clear(): void {\n this.#ctrl?.clear()\n }\n\n /** Force re-render paths and port indicators. */\n update(): void {\n this.#ctrl?.update()\n }\n\n // ── Lifecycle ──\n\n protected override activate(): void {\n this.#ctrl = new NoodleController(this, this.#buildOptions())\n }\n\n protected override dispose(): void {\n this.#ctrl?.destroy()\n this.#ctrl = null\n }\n\n attributeChangedCallback(name: string, old: string | null, val: string | null): void {\n if (old === val) return\n super.attributeChangedCallback(name, old, val)\n if (this.#ctrl) this.#syncOption(name, val)\n }\n\n // ── Private ──\n\n #buildOptions(): NoodleOptions {\n const opts: NoodleOptions = {}\n\n if (this.hasAttribute('editable')) opts.editable = true\n if (this.hasAttribute('animated')) opts.animated = true\n if (this.hasAttribute('disabled')) opts.disabled = true\n\n const color = this.getAttribute('color')\n if (color) opts.color = color\n\n const sw = this.getAttribute('stroke-width')\n if (sw) { const n = Number(sw); if (!isNaN(n)) opts.strokeWidth = n }\n\n const tension = this.getAttribute('tension')\n if (tension) { const n = Number(tension); if (!isNaN(n)) opts.tension = n }\n\n if (this.hasAttribute('show-ports')) {\n opts.showPorts = this.getAttribute('show-ports') !== 'false'\n }\n\n const ps = this.getAttribute('port-size')\n if (ps) { const n = Number(ps); if (!isNaN(n)) opts.portSize = n }\n\n const curve = this.getAttribute('curve') as NoodleOptions['style']\n if (curve === 'bezier' || curve === 'step' || curve === 'straight') {\n opts.style = curve\n }\n\n return opts\n }\n\n #syncOption(name: string, val: string | null): void {\n const ctrl = this.#ctrl!\n switch (name) {\n case 'editable':\n ctrl.editable = val !== null\n ctrl.update()\n break\n case 'color':\n ctrl.color = val ?? 'var(--aui-accent-500)'\n ctrl.update()\n break\n case 'stroke-width': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.strokeWidth = n; ctrl.update() }\n break\n }\n case 'tension': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.tension = n; ctrl.update() }\n break\n }\n case 'show-ports':\n ctrl.showPorts = val !== 'false' && val !== null\n ctrl.update()\n break\n case 'port-size': {\n const n = Number(val)\n if (!isNaN(n)) { ctrl.portSize = n; ctrl.update() }\n break\n }\n case 'curve':\n if (val === 'bezier' || val === 'step' || val === 'straight') {\n ctrl.style = val\n ctrl.update()\n }\n break\n case 'animated':\n ctrl.animated = val !== null\n ctrl.update()\n break\n case 'disabled':\n ctrl.disabled = val !== null\n ctrl.update()\n break\n }\n }\n}\n","// ── aui-preview-app ─────────────────────────────────────────\n//\n// Full-screen preview shell with nav + pannable canvas.\n// Reads configuration from preview.json in the same directory.\n//\n// Usage:\n// <aui-preview-app src=\"./preview.json\"></aui-preview-app>\n//\n// preview.json format:\n// {\n// \"section\": \"blocks\",\n// \"param\": \"block\",\n// \"items\": [{ \"slug\": \"agent-chat\", \"name\": \"agent-chat\", \"summary\": \"...\" }],\n// \"links\": [{ \"label\": \"Components\", \"href\": \"../components/preview.html\" }]\n// }\n\nimport { AgentElement } from '#element'\nimport type { AttributeSchema } from '#element'\nimport { attachTrait } from '../../traits/attach.ts'\n\nconst LOGO_SVG = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M92.2671 346.112C88.1711 262.144 202.347 250.88 288.875 237.568C288.363 202.752 290.923 133.12 221.291 133.12C206.955 133.12 197.227 134.144 186.987 137.216L189.547 147.968C228.459 148.992 238.187 173.056 237.163 193.024C235.115 229.888 196.715 242.688 169.579 242.688C141.419 242.688 104.555 227.328 106.091 186.88C107.627 143.872 163.435 112.64 250.987 112.64C348.779 112.64 403.563 139.776 403.563 244.736V351.744C403.563 369.152 407.659 375.296 417.387 375.296C422.507 375.296 427.627 369.664 431.723 361.984L444.523 369.152C423.019 401.408 391.275 415.744 362.603 415.744C302.699 415.744 279.147 377.856 308.331 313.856L296.043 309.76C277.611 386.048 232.555 415.744 180.331 415.744C135.787 415.744 94.3151 391.68 92.2671 346.112ZM202.859 327.168C208.491 348.672 227.435 357.888 245.355 351.232C267.883 343.04 285.291 311.808 288.363 265.216L288.875 257.536C232.555 267.776 191.083 283.136 202.859 327.168Z\" fill=\"currentColor\"/></svg>`\n\nfunction titleCase(slug: string): string {\n return slug.split('-').map(w => w[0].toUpperCase() + w.slice(1)).join(' ')\n}\n\ninterface PreviewItem {\n slug: string\n file?: string // relative path to .html (e.g., \"table/table-head.html\")\n name: string\n group?: string // group label for optgroup\n summary?: string\n category?: string\n}\n\ninterface PreviewConfig {\n section: string\n param: string\n items: PreviewItem[]\n links: { label: string; href: string }[]\n}\n\nexport class AuiPreviewApp extends AgentElement {\n static override attributes: AttributeSchema = {\n src: { type: 'string', default: './preview.json' },\n }\n\n declare src: string\n\n #editor!: HTMLElement\n #content!: HTMLElement\n\n // Navigation state\n #config: PreviewConfig | null = null\n #currentSlug: string | null = null\n #dialog: HTMLElement | null = null\n\n protected override activate(): void {\n this.#boot()\n }\n\n protected override dispose(): void {\n document.removeEventListener('keydown', this.#handleGlobalKeydown)\n }\n\n async #boot(): Promise<void> {\n // Fetch config\n let config: PreviewConfig\n try {\n const res = await fetch(this.src)\n config = await res.json()\n } catch {\n this.textContent = 'Failed to load preview.json'\n return\n }\n\n const { section, param, items, links } = config\n // Resolve basePath as absolute URL so fetch and import use the same base\n const srcUrl = new URL(this.src, window.location.href)\n const basePath = srcUrl.href.replace(/preview\\.json$/, '')\n const params = new URLSearchParams(location.search)\n const current = params.get(param)\n\n // ── Nav bar ──\n const navbar = document.createElement('div')\n navbar.setAttribute('data-role', 'navbar')\n\n const bar = document.createElement('aui-select')\n bar.setAttribute('mode', 'bar')\n bar.setAttribute('width', 'full')\n\n // Logo\n const logo = document.createElement('aui-option')\n logo.setAttribute('value', '')\n logo.setAttribute('overflow-pin', '')\n logo.setAttribute('data-preview-logo', '')\n logo.dataset.href = window.location.pathname\n logo.innerHTML = `${LOGO_SVG} AgentUI`\n bar.appendChild(logo)\n\n // Color scheme toggle (persisted to localStorage)\n const SCHEME_KEY = 'aui-preview-scheme'\n const stored = localStorage.getItem(SCHEME_KEY)\n if (stored) {\n document.documentElement.dataset.theme = stored\n document.documentElement.style.colorScheme = stored\n }\n\n const schemeBtn = document.createElement('aui-button')\n schemeBtn.setAttribute('ghost', '')\n schemeBtn.setAttribute('size', 'sm')\n schemeBtn.setAttribute('hide-label', '')\n schemeBtn.setAttribute('label', 'Toggle color scheme')\n const schemeIcon = document.createElement('aui-icon')\n const isDark = document.documentElement.dataset.theme === 'dark'\n schemeIcon.setAttribute('name', isDark ? 'sun' : 'moon')\n schemeBtn.appendChild(schemeIcon)\n bar.appendChild(schemeBtn)\n\n schemeBtn.addEventListener('click', () => {\n const html = document.documentElement\n const nowDark = html.dataset.theme === 'dark'\n const next = nowDark ? 'light' : 'dark'\n html.dataset.theme = next\n html.style.colorScheme = next\n localStorage.setItem(SCHEME_KEY, next)\n schemeIcon.setAttribute('name', nowDark ? 'moon' : 'sun')\n })\n\n // Page select\n const pageSelect = document.createElement('aui-select')\n pageSelect.setAttribute('placeholder', titleCase(section))\n pageSelect.setAttribute('outline', '')\n pageSelect.setAttribute('data-role', 'page-select')\n\n // Section links\n if (links.length) {\n const linksGroup = document.createElement('aui-optgroup')\n linksGroup.setAttribute('label', 'Sections')\n for (const link of links) {\n const opt = document.createElement('aui-option')\n opt.setAttribute('value', `go-${link.label.toLowerCase()}`)\n opt.dataset.href = link.href\n opt.textContent = link.label\n linksGroup.appendChild(opt)\n }\n pageSelect.appendChild(linksGroup)\n }\n\n // Item options — grouped by item.group\n let currentGroup: HTMLElement | null = null\n let currentGroupLabel = ''\n\n for (const item of items) {\n const groupLabel = item.group || titleCase(section)\n\n if (groupLabel !== currentGroupLabel) {\n currentGroup = document.createElement('aui-optgroup')\n currentGroup.setAttribute('label', groupLabel)\n pageSelect.appendChild(currentGroup)\n currentGroupLabel = groupLabel\n }\n\n const opt = document.createElement('aui-option')\n opt.setAttribute('value', item.slug)\n if (item.file) opt.dataset.file = item.file\n if (item.slug === current) opt.setAttribute('selected', '')\n opt.textContent = item.name || titleCase(item.slug)\n currentGroup!.appendChild(opt)\n }\n\n if (current) pageSelect.setAttribute('value', current)\n\n bar.appendChild(pageSelect)\n navbar.appendChild(bar)\n this.appendChild(navbar)\n\n // ── Canvas (aui-editor) ──\n const editor = document.createElement('aui-editor')\n editor.setAttribute('data-role', 'canvas')\n editor.setAttribute('background', 'dots')\n\n const contentLayer = document.createElement('aui-editor-layer')\n contentLayer.setAttribute('name', 'content')\n\n const content = document.createElement('div')\n content.setAttribute('data-role', 'content')\n\n contentLayer.appendChild(content)\n editor.appendChild(contentLayer)\n this.appendChild(editor)\n\n this.#editor = editor\n this.#content = content\n\n // ── Wire up nav ──\n bar.addEventListener('click', (e: Event) => {\n const option = (e.target as HTMLElement).closest('aui-option') as HTMLElement | null\n const href = option?.dataset?.href\n if (href) window.location.href = href\n })\n\n pageSelect.addEventListener('change', (e: Event) => {\n const val = (e.target as any).value\n const opt = pageSelect.querySelector(`aui-option[value=\"${val}\"]`)\n const href = (opt as HTMLElement | null)?.dataset?.href\n if (href) { window.location.href = href; return }\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, val)\n window.location.href = url.toString()\n })\n\n // ── Load current item ──\n if (current) {\n const currentItem = items.find(i => i.slug === current)\n const filePath = currentItem?.file || `${current}/${current}.html`\n document.title = `${titleCase(current)} — AgentUI ${titleCase(section)}`\n await this.#loadItem(filePath, basePath)\n } else {\n // Home page: load all items as an aggregate gallery\n document.title = `AgentUI — ${titleCase(section)}`\n await this.#loadAllItems(items, basePath)\n }\n\n // ── Store navigation state ──\n this.#config = config\n this.#currentSlug = current\n\n // ── Build command palette ──\n this.#buildCommandPalette(config, param)\n\n // ── Global keyboard shortcuts ──\n document.addEventListener('keydown', this.#handleGlobalKeydown)\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n // ── Command palette ──\n\n #buildCommandPalette(config: PreviewConfig, param: string): void {\n const dialog = document.createElement('aui-dialog')\n dialog.setAttribute('size', 'sm')\n\n const command = document.createElement('aui-command')\n command.setAttribute('max-width', 'full')\n\n const input = document.createElement('aui-command-input')\n input.setAttribute('placeholder', `Go to ${titleCase(config.section)}…`)\n command.appendChild(input)\n\n const list = document.createElement('aui-command-list')\n\n // Section links\n if (config.links.length) {\n const group = document.createElement('aui-command-group')\n group.setAttribute('label', 'Sections')\n for (const link of config.links) {\n const item = document.createElement('aui-command-item')\n item.setAttribute('value', `section:${link.label}`)\n item.dataset.href = link.href\n item.textContent = link.label\n group.appendChild(item)\n }\n list.appendChild(group)\n }\n\n // Items grouped\n let currentGroup: HTMLElement | null = null\n let currentGroupLabel = ''\n\n for (const it of config.items) {\n const groupLabel = it.group || titleCase(config.section)\n if (groupLabel !== currentGroupLabel) {\n currentGroup = document.createElement('aui-command-group')\n currentGroup.setAttribute('label', groupLabel)\n list.appendChild(currentGroup)\n currentGroupLabel = groupLabel\n }\n const item = document.createElement('aui-command-item')\n item.setAttribute('value', it.slug)\n if (it.summary) item.setAttribute('keywords', it.summary)\n item.textContent = it.name || titleCase(it.slug)\n currentGroup!.appendChild(item)\n }\n\n command.appendChild(list)\n\n const empty = document.createElement('aui-command-empty')\n empty.textContent = 'No results.'\n command.appendChild(empty)\n\n // Selection handler\n command.addEventListener('select', (e: Event) => {\n const { value } = (e as CustomEvent).detail\n const opt = command.querySelector(`aui-command-item[value=\"${CSS.escape(value)}\"]`) as HTMLElement | null\n const href = opt?.dataset?.href\n if (href) { window.location.href = href; return }\n\n if (value.startsWith('section:')) return\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, value)\n window.location.href = url.toString()\n })\n\n // Dismiss on escape from command (bubbles to dialog which handles close)\n command.addEventListener('dismiss', () => this.#closeCommandPalette())\n\n // Close event from dialog (backdrop click, escape via native dialog)\n dialog.addEventListener('close', () => {\n this.#dialog?.removeAttribute('open')\n })\n\n dialog.appendChild(command)\n this.appendChild(dialog)\n this.#dialog = dialog\n }\n\n #openCommandPalette(): void {\n if (!this.#dialog) return\n // Clear previous search and open\n const input = this.#dialog.querySelector('aui-command-input') as any\n input?.clear?.()\n this.#dialog.setAttribute('open', '')\n // Focus the input after dialog animation starts\n requestAnimationFrame(() => {\n input?.focus?.()\n })\n }\n\n #closeCommandPalette(): void {\n this.#dialog?.removeAttribute('open')\n }\n\n // ── Keyboard navigation ──\n\n #handleGlobalKeydown = (e: KeyboardEvent): void => {\n // Cmd/Ctrl + K → command palette\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n if (this.#dialog?.hasAttribute('open')) {\n this.#closeCommandPalette()\n } else {\n this.#openCommandPalette()\n }\n return\n }\n\n // [ / ] → prev/next item (no modifier needed)\n // Skip if any modifier is held or if focus is in an editable element\n if (!e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey &&\n (e.key === '[' || e.key === ']')) {\n const tag = (e.target as HTMLElement)?.tagName\n const editable = (e.target as HTMLElement)?.isContentEditable\n if (tag === 'INPUT' || tag === 'TEXTAREA' || editable) return\n e.preventDefault()\n this.#navigateRelative(e.key === ']' ? 1 : -1)\n return\n }\n }\n\n #navigateRelative(direction: 1 | -1): void {\n if (!this.#config) return\n const { items, param } = this.#config\n if (!items.length) return\n\n const currentIdx = this.#currentSlug\n ? items.findIndex(i => i.slug === this.#currentSlug)\n : -1\n\n let nextIdx = currentIdx + direction\n if (nextIdx >= items.length) nextIdx = 0\n if (nextIdx < 0) nextIdx = items.length - 1\n\n const next = items[nextIdx]\n if (!next) return\n\n const url = new URL(window.location.href)\n url.searchParams.set(param, next.slug)\n window.location.href = url.toString()\n }\n\n async #loadItem(filePath: string, basePath: string): Promise<void> {\n // filePath is like \"table/table-head.html\"\n const dir = filePath.split('/')[0]\n const htmlUrl = `${basePath}${filePath}`\n const cssUrl = `${basePath}${dir}/${dir}.css`\n const tsUrl = `${basePath}${dir}/${dir}.ts`\n\n try {\n const res = await fetch(htmlUrl)\n if (res.ok) {\n this.#content.innerHTML = await res.text()\n }\n } catch {}\n\n // Wait for custom elements to upgrade and ::after to render\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n\n // Wait for custom elements to upgrade and render\n await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))\n\n const children = Array.from(this.#content.children).filter(\n (c): c is HTMLElement => c.nodeType === 1 && c.tagName !== 'SCRIPT'\n )\n\n const GAP = 96 // 6rem\n const START_Y = 200 // safe distance below nav bar\n\n const measurements = children.map(child => ({\n el: child,\n height: child.offsetHeight,\n width: child.offsetWidth,\n }))\n\n // Position absolutely as a centered vertical list\n let offsetY = START_Y\n let maxWidth = 0\n for (const { el, height, width } of measurements) {\n el.style.position = 'absolute'\n el.style.left = '0px'\n el.style.top = `${offsetY}px`\n\n // Skip drag/resize for interactive editors — they have their own pan/zoom\n const isEditor = el.tagName === 'AUI-GRAPH-UI' || el.tagName === 'AUI-EDITOR'\n if (!isEditor) {\n attachTrait(el, 'drag', { config: { mode: 'free', modifier: 'alt' } })\n attachTrait(el, 'resize', { config: { modifier: 'alt' } })\n }\n\n if (width > maxWidth) maxWidth = width\n offsetY += height + GAP\n }\n\n // Set content dimensions so centering can read them\n this.#content.style.width = `${maxWidth}px`\n this.#content.style.height = `${offsetY}px`\n\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = cssUrl\n document.head.appendChild(link)\n\n try { await import(/* @vite-ignore */ tsUrl) } catch {}\n\n // Re-stamp inline scripts so they execute (innerHTML doesn't run scripts)\n for (const orig of Array.from(this.#content.querySelectorAll('script'))) {\n const s = document.createElement('script')\n for (const attr of orig.attributes) s.setAttribute(attr.name, attr.value)\n s.textContent = orig.textContent\n orig.replaceWith(s)\n }\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n async #loadAllItems(items: PreviewItem[], basePath: string): Promise<void> {\n const GAP = 96\n const SECTION_GAP = 160 // extra gap between different groups\n const START_Y = 200\n const loadedCSS = new Set<string>()\n const loadedTS = new Set<string>()\n let offsetY = START_Y\n let maxWidth = 0\n\n for (const item of items) {\n const filePath = item.file || `${item.slug}/${item.slug}.html`\n const dir = filePath.split('/')[0]\n const htmlUrl = `${basePath}${filePath}`\n const cssUrl = `${basePath}${dir}/${dir}.css`\n const tsUrl = `${basePath}${dir}/${dir}.ts`\n\n // Load CSS once per directory\n if (!loadedCSS.has(cssUrl)) {\n loadedCSS.add(cssUrl)\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = cssUrl\n document.head.appendChild(link)\n }\n\n // Load TS once per directory\n if (!loadedTS.has(tsUrl)) {\n loadedTS.add(tsUrl)\n try { await import(/* @vite-ignore */ tsUrl) } catch {}\n }\n\n // Fetch HTML\n let html = ''\n try {\n const res = await fetch(htmlUrl)\n if (res.ok) html = await res.text()\n } catch { continue }\n\n if (!html.trim()) continue\n\n // Create a wrapper with a heading label\n const wrapper = document.createElement('div')\n wrapper.setAttribute('data-role', 'gallery-item')\n wrapper.innerHTML = `<h3 style=\"margin:0 0 1rem;font-family:var(--aui-font-family);font-size:var(--aui-font-lg);font-weight:var(--aui-font-weight-semibold);color:var(--aui-ink-muted);\">${item.name || titleCase(item.slug)}</h3>${html}`\n\n this.#content.appendChild(wrapper)\n\n // Wait for upgrade\n await new Promise(r => requestAnimationFrame(r))\n\n const height = wrapper.offsetHeight\n const width = wrapper.offsetWidth\n wrapper.style.position = 'absolute'\n wrapper.style.left = '0px'\n wrapper.style.top = `${offsetY}px`\n\n if (width > maxWidth) maxWidth = width\n offsetY += height + GAP\n }\n\n this.#content.style.width = `${maxWidth}px`\n this.#content.style.height = `${offsetY}px`\n\n requestAnimationFrame(() => this.#centerContentHorizontally())\n }\n\n #centerContentHorizontally(): void {\n const ed = this.#editor as any\n const editorWidth = this.#editor.clientWidth\n const contentWidth = this.#content.offsetWidth\n // Center horizontally, pin to top (items start at y: 200px)\n const panX = (editorWidth - contentWidth) / 2\n ed.panTo?.(panX, 0)\n }\n}\n","// ── Auto-register all aui-* custom elements ─────────────────\n//\n// Import this file once to define every component:\n// import '@agent-ui/kit/register'\n\nimport { define } from './element/define.ts'\n\n// Register all traits (must happen before elements activate)\nimport { registerBuiltinTraits } from './traits/index.ts'\nregisterBuiltinTraits()\n\nimport { AuiButton } from './components/button/index.ts'\nimport { AuiInput, AuiInputOtp } from './components/input/index.ts'\nimport { AuiCheckbox } from './components/checkbox/index.ts'\nimport { AuiSwitch } from './components/switch/index.ts'\nimport { AuiRadio, AuiRadioGroup } from './components/radio/index.ts'\nimport { AuiTextarea } from './components/textarea/index.ts'\nimport { AuiContainer } from './components/container/index.ts'\nimport { AuiDialog } from './components/dialog/index.ts'\nimport { AuiDrawer } from './components/drawer/index.ts'\nimport { AuiIcon } from './components/icon/index.ts'\nimport { AuiTooltip } from './components/tooltip/index.ts'\nimport { AuiRange } from './components/range/index.ts'\nimport { AuiGripper } from './components/gripper/index.ts'\nimport { AuiOption } from './components/option/index.ts'\nimport { AuiOptgroup } from './components/optgroup/index.ts'\nimport { AuiSelect } from './components/select/index.ts'\nimport { AuiToast } from './components/toast/index.ts'\nimport { AuiTabs, AuiTab, AuiTabPanel } from './components/tab/index.ts'\nimport { AuiAccordion, AuiAccordionItem } from './components/accordion/index.ts'\nimport { AuiBreadcrumb, AuiBreadcrumbItem } from './components/breadcrumb/index.ts'\nimport { AuiSegmentedControl, AuiSegment } from './components/segmented-control/index.ts'\nimport { AuiPagination } from './components/pagination/index.ts'\nimport { AuiCommand, AuiCommandEmpty, AuiCommandGroup, AuiCommandInput, AuiCommandItem, AuiCommandList } from './components/command/index.ts'\nimport { AuiPanes, AuiPane } from './components/pane/index.ts'\nimport { AuiTable, AuiTableHead, AuiTableBody, AuiTableRow, AuiTableHeader, AuiTableCell, AuiTableColumn } from './components/table/index.ts'\nimport { AuiTree, AuiTreeItem } from './components/tree/index.ts'\nimport { AuiFeed } from './components/feed/index.ts'\nimport { AuiRoot } from './components/root/index.ts'\nimport { AuiCanvas } from './components/canvas/index.ts'\nimport { AuiCalendar } from './components/calendar/index.ts'\nimport { AuiCalendarPicker } from './components/calendar-picker/index.ts'\nimport { AuiCalendarRangePicker } from './components/calendar-range-picker/index.ts'\nimport { AuiNoodles } from './components/noodles/index.ts'\nimport { AuiAgentActivity, AuiAgentFeed, AuiAgentInput, AuiAgentMessage, AuiAgentPanel, AuiAgentPrompt, AuiAgentSeeds, AuiAgentText, AuiAgentThread } from './components/agent/index.ts'\nimport { AuiAppShell } from './components/app-shell/index.ts'\nimport { AuiPage, AuiPageMain, AuiPageContext } from './components/page/index.ts'\nimport { AuiSidebar, AuiSidebarHeader, AuiSidebarContent, AuiSidebarFooter } from './components/sidebar/index.ts'\nimport { AuiPreviewApp } from './components/preview-app/index.ts'\nimport { AuiEditor, AuiEditorLayer } from './components/editor/index.ts'\nimport { AuiGraphUi, AuiGraphLayer, AuiGraphNode, AuiGraphNoodle, AuiGraphPort } from './components/graph/index.ts'\nimport { AuiProgress } from './components/progress/index.ts'\nimport { AuiCodeBlock } from './components/code-block/index.ts'\nimport { AuiSparkline } from './components/sparkline/index.ts'\nimport { AuiChip } from './components/chip/index.ts'\nimport { AuiDisclosure } from './components/disclosure/index.ts'\nimport { AuiAvatarGroup } from './components/avatar-group/index.ts'\nimport { AuiProgressCircle } from './components/progress-circle/index.ts'\nimport { AuiDisclosureGroup } from './components/disclosure-group/index.ts'\nimport { AuiTagGroup } from './components/tag-group/index.ts'\nimport { AuiColorArea } from './components/color-area/index.ts'\nimport { AuiColorSlider } from './components/color-slider/index.ts'\nimport { AuiColorField } from './components/color-field/index.ts'\nimport { AuiTimeField } from './components/time-field/index.ts'\nimport { AuiDateField } from './components/date-field/index.ts'\nimport { AuiContextMenu } from './components/context-menu/index.ts'\nimport { AuiDropdownMenu } from './components/dropdown-menu/index.ts'\nimport { AuiHoverCard } from './components/hover-card/index.ts'\nimport { AuiColorPicker } from './components/color-picker/index.ts'\nimport { AuiFileUpload } from './components/file-upload/index.ts'\nimport { AuiCopyButton } from './components/copy-button/index.ts'\nimport { AuiStat } from './components/stat/index.ts'\nimport { AuiImage } from './components/image/index.ts'\nimport { AuiCarousel } from './components/carousel/index.ts'\nimport { AuiNotificationCenter } from './components/notification-center/index.ts'\nimport { AuiEmptyState } from './components/empty-state/index.ts'\n\n// ── Define all elements ──────────────────────────────────────\n\ndefine('aui-button', AuiButton)\ndefine('aui-input', AuiInput)\ndefine('aui-checkbox', AuiCheckbox)\ndefine('aui-switch', AuiSwitch)\ndefine('aui-radio', AuiRadio)\ndefine('aui-radio-group', AuiRadioGroup)\ndefine('aui-textarea', AuiTextarea)\ndefine('aui-container', AuiContainer)\ndefine('aui-dialog', AuiDialog)\ndefine('aui-drawer', AuiDrawer)\ndefine('aui-icon', AuiIcon)\ndefine('aui-tooltip', AuiTooltip)\ndefine('aui-range', AuiRange)\ndefine('aui-input-otp', AuiInputOtp)\ndefine('aui-gripper', AuiGripper)\ndefine('aui-option', AuiOption)\ndefine('aui-optgroup', AuiOptgroup)\ndefine('aui-select', AuiSelect)\ndefine('aui-toast', AuiToast)\ndefine('aui-tabs', AuiTabs)\ndefine('aui-tab', AuiTab)\ndefine('aui-tab-panel', AuiTabPanel)\ndefine('aui-accordion', AuiAccordion)\ndefine('aui-accordion-item', AuiAccordionItem)\ndefine('aui-breadcrumb', AuiBreadcrumb)\ndefine('aui-breadcrumb-item', AuiBreadcrumbItem)\ndefine('aui-segmented-control', AuiSegmentedControl)\ndefine('aui-segment', AuiSegment)\ndefine('aui-pagination', AuiPagination)\ndefine('aui-command', AuiCommand)\ndefine('aui-command-input', AuiCommandInput)\ndefine('aui-command-list', AuiCommandList)\ndefine('aui-command-item', AuiCommandItem)\ndefine('aui-command-group', AuiCommandGroup)\ndefine('aui-command-empty', AuiCommandEmpty)\ndefine('aui-panes', AuiPanes)\ndefine('aui-pane', AuiPane)\ndefine('aui-table', AuiTable)\ndefine('aui-table-head', AuiTableHead)\ndefine('aui-table-body', AuiTableBody)\ndefine('aui-table-row', AuiTableRow)\ndefine('aui-table-header', AuiTableHeader)\ndefine('aui-table-cell', AuiTableCell)\ndefine('aui-table-column', AuiTableColumn)\ndefine('aui-tree', AuiTree)\ndefine('aui-tree-item', AuiTreeItem)\ndefine('aui-feed', AuiFeed)\ndefine('aui-root', AuiRoot)\ndefine('aui-canvas', AuiCanvas)\ndefine('aui-calendar', AuiCalendar)\ndefine('aui-calendar-picker', AuiCalendarPicker)\ndefine('aui-calendar-range-picker', AuiCalendarRangePicker)\ndefine('aui-noodles', AuiNoodles)\ndefine('aui-agent-feed', AuiAgentFeed)\ndefine('aui-agent-thread', AuiAgentThread)\ndefine('aui-agent-message', AuiAgentMessage)\ndefine('aui-agent-text', AuiAgentText)\ndefine('aui-agent-activity', AuiAgentActivity)\ndefine('aui-agent-seeds', AuiAgentSeeds)\ndefine('aui-agent-panel', AuiAgentPanel)\ndefine('aui-agent-input', AuiAgentInput)\ndefine('aui-agent-prompt', AuiAgentPrompt)\ndefine('aui-app-shell', AuiAppShell)\ndefine('aui-page', AuiPage)\ndefine('aui-page-main', AuiPageMain)\ndefine('aui-page-context', AuiPageContext)\ndefine('aui-sidebar', AuiSidebar)\ndefine('aui-sidebar-header', AuiSidebarHeader)\ndefine('aui-sidebar-content', AuiSidebarContent)\ndefine('aui-sidebar-footer', AuiSidebarFooter)\ndefine('aui-preview-app', AuiPreviewApp)\ndefine('aui-editor', AuiEditor)\ndefine('aui-editor-layer', AuiEditorLayer)\ndefine('aui-graph-ui', AuiGraphUi)\ndefine('aui-graph-layer', AuiGraphLayer)\ndefine('aui-graph-node', AuiGraphNode)\ndefine('aui-graph-noodle', AuiGraphNoodle)\ndefine('aui-graph-port', AuiGraphPort)\ndefine('aui-progress', AuiProgress)\ndefine('aui-code-block', AuiCodeBlock)\ndefine('aui-sparkline', AuiSparkline)\ndefine('aui-chip', AuiChip)\ndefine('aui-disclosure', AuiDisclosure)\ndefine('aui-avatar-group', AuiAvatarGroup)\ndefine('aui-progress-circle', AuiProgressCircle)\ndefine('aui-disclosure-group', AuiDisclosureGroup)\ndefine('aui-tag-group', AuiTagGroup)\ndefine('aui-color-area', AuiColorArea)\ndefine('aui-color-slider', AuiColorSlider)\ndefine('aui-color-field', AuiColorField)\ndefine('aui-time-field', AuiTimeField)\ndefine('aui-date-field', AuiDateField)\ndefine('aui-context-menu', AuiContextMenu)\ndefine('aui-dropdown-menu', AuiDropdownMenu)\ndefine('aui-hover-card', AuiHoverCard)\ndefine('aui-color-picker', AuiColorPicker)\ndefine('aui-file-upload', AuiFileUpload)\ndefine('aui-copy-button', AuiCopyButton)\ndefine('aui-stat', AuiStat)\ndefine('aui-image', AuiImage)\ndefine('aui-carousel', AuiCarousel)\ndefine('aui-notification-center', AuiNotificationCenter)\ndefine('aui-empty-state', AuiEmptyState)\n\n// ── Global trait observer for non-AgentElement nodes ─────────\n//\n// AgentElement handles its own traits via #attachTraits(). But CSS-only\n// elements (aui-header, aui-card, etc.) and plain HTML elements with a\n// `traits` attribute never get connectedCallback. This observer picks\n// them up and attaches traits globally.\n\nimport { parseTraitsAttribute } from './traits/parse.ts'\nimport { attachTrait } from './traits/attach.ts'\nimport { validateComposition } from './traits/registry.ts'\nimport { AgentElement } from './element/agent-element.ts'\n\nconst traitDisposers = new WeakMap<Element, Array<() => void>>()\n\nfunction attachTraitsToElement(el: Element): void {\n // Skip AgentElement instances — they handle their own traits\n if (el instanceof AgentElement) return\n // Skip if already processed\n if (traitDisposers.has(el)) return\n\n const raw = el.getAttribute('traits')\n if (!raw) return\n\n const entries = parseTraitsAttribute(raw)\n const validated = validateComposition(entries, el.localName)\n const disposers: Array<() => void> = []\n\n for (const { entry } of validated) {\n const dispose = attachTrait(el as HTMLElement, entry.name, {\n config: entry.config,\n })\n disposers.push(dispose)\n }\n\n traitDisposers.set(el, disposers)\n}\n\nfunction detachTraitsFromElement(el: Element): void {\n const disposers = traitDisposers.get(el)\n if (!disposers) return\n for (const d of disposers) d()\n traitDisposers.delete(el)\n}\n\nfunction initTraitObserver(): void {\n // Process any elements already in the DOM\n for (const el of document.querySelectorAll('[traits]')) {\n attachTraitsToElement(el)\n }\n\n // Watch for new elements with traits\n const traitObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === 'childList') {\n for (const node of m.addedNodes) {\n if (node.nodeType !== 1) continue\n const el = node as Element\n if (el.hasAttribute('traits')) attachTraitsToElement(el)\n for (const child of el.querySelectorAll('[traits]')) {\n attachTraitsToElement(child)\n }\n }\n for (const node of m.removedNodes) {\n if (node.nodeType !== 1) continue\n const el = node as Element\n detachTraitsFromElement(el)\n for (const child of el.querySelectorAll('[traits]')) {\n detachTraitsFromElement(child)\n }\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'traits') {\n const el = m.target as Element\n detachTraitsFromElement(el)\n if (el.hasAttribute('traits')) attachTraitsToElement(el)\n }\n }\n })\n\n traitObserver.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['traits'],\n })\n}\n\n// Start observing once DOM is ready\nif (document.body) {\n initTraitObserver()\n} else {\n document.addEventListener('DOMContentLoaded', initTraitObserver, { once: true })\n}\n\n// ── Global popover trigger delegate ──────────────────────────\n//\n// Any element with [popover-trigger=\"<id>\"] toggles the referenced\n// popover on click. Works on buttons, icons, custom elements, etc.\n//\n// Usage:\n// <aui-button popover-trigger=\"my-menu\">Open Menu</aui-button>\n// <aui-list id=\"my-menu\" popover=\"auto\">...</aui-list>\n\ndocument.addEventListener('click', (e) => {\n const trigger = (e.target as Element)?.closest?.('[popover-trigger]')\n if (!trigger) return\n\n const id = trigger.getAttribute('popover-trigger')\n if (!id) return\n\n const target = document.getElementById(id)\n if (!target || !('togglePopover' in target)) return\n\n // Anchor the popover to the trigger for CSS anchor positioning\n const anchorName = `--aui-popover-${id}`\n ;(trigger as HTMLElement).style.anchorName = anchorName\n ;(target as HTMLElement).style.positionAnchor = anchorName\n\n try { (target as HTMLElement).togglePopover() } catch {}\n})\n\n// ── Global popover event isolation ───────────────────────────\n//\n// Popovers render in the top layer but pointer events still\n// propagate through the DOM tree to elements underneath.\n// Stop propagation on all pointer/mouse events that originate\n// inside a [popover] or <dialog> so underlying elements don't\n// receive hover, proximity, or press events.\n\nfor (const eventName of ['pointermove', 'pointerdown', 'pointerup', 'mouseover', 'mouseenter', 'mouseleave'] as const) {\n document.addEventListener(eventName, (e) => {\n const target = e.target as Element\n if (target?.closest?.('[popover], dialog')) {\n e.stopPropagation()\n }\n }, true) // capture phase — stops before any bubbling listeners see it\n}\n"],"names":["AuiTableColumn","AgentElement","AuiCanvas","#viewport","#transform","#content","#panX","#panY","#panning","#panStartX","#panStartY","#panOriginX","#panOriginY","#zoom","#applyTransform","#emitPan","#emitZoom","x","y","level","children","child","slot","needsViewport","#stamp","#onKeyDown","vp","#onPointerDown","#onPointerMove","#onPointerUp","#onWheel","content","viewport","transform","canPan","canZoom","e","target","_e","delta","newZoom","rect","px","py","scale","parseDate","str","d","toISO","m","day","isSameDay","a","b","CalendarStore","options","now","initial","signal","computed","#computeDays","#computeMonths","#computeYears","#computeTitle","batch","iso","month","year","start","end","minDate","maxDate","selected","today","rangeStartDate","rangeEndDate","startDay","gridStart","cells","i","inMonth","isToday","isSelected","isDisabled","inRange","isRangeStart","isRangeEnd","lo","hi","currentMonth","name","focused","decadeStart","thisYear","monthNames","AuiCalendar","#internals","#store","#disabled","#focusedIndex","#rangePhase","#dragging","val","old","min","max","#render","#onPrevClick","#onNextClick","#onTitleClickHandler","grid","#onGridClickHandler","#onGridPointerMoveHandler","#onGridPointerDownHandler","#onGridPointerUpHandler","btn","prev","next","title","view","weekdays","days","cell","attrs","months","years","#onPrev","#onNext","#onTitleClick","#onGridClick","#onGridPointerMove","#onGridPointerDown","#onGridPointerUp","date","#selectDate","#commitRange","idx","handled","_counter","uid","prefix","DROP_SNAP_RADIUS","NS","NoodleController","#attached","#svg","#connections","#pathGroup","#hitGroup","#portElements","#dragState","#dragPath","#resizeObserver","#mutationObserver","#rafId","#updateQueued","#suppressObserver","#styleEl","host","c","#createSVG","#injectKeyframes","#startObserving","#createPortIndicators","#onExternalMove","#renderAllPaths","#stopObserving","#removePortIndicators","#removeSVG","#removeKeyframes","#endDrag","from","to","fromPort","toPort","id","conn","conns","connections","svg","style","#clientToLocal","clientX","clientY","hostRect","scaleX","scaleY","#getPortPosition","elementId","port","el","current","translate","parts","w","#controlPoint","offset","#computePath","p1","p2","mx","dist","cx1","cy1","cx2","cy2","hit","#onHitPointerDown","path","#queueUpdate","#positionPortIndicators","#queueFullUpdate","portElements","sides","elId","side","dot","#onPortPointerDown","targetId","pos","portDot","portTargetId","portSide","#onPortPointerMove","#onPortPointerUp","#onPortPointerCancel","state","my","#updateDropReady","nearest","#findNearestPort","toId","minDist","cx","cy","targetPort","connId","pointerX","pointerY","distFrom","distTo","anchorId","anchorPort","anchorDot","anchorPos","mutations","AuiNoodles","#ctrl","#buildOptions","#syncOption","opts","color","sw","n","tension","ps","curve","ctrl","LOGO_SVG","titleCase","slug","AuiPreviewApp","#editor","#config","#currentSlug","#dialog","#boot","#handleGlobalKeydown","config","section","param","items","links","basePath","navbar","bar","logo","SCHEME_KEY","stored","schemeBtn","schemeIcon","isDark","html","nowDark","pageSelect","linksGroup","link","opt","currentGroup","currentGroupLabel","item","groupLabel","editor","contentLayer","href","url","filePath","#loadItem","#loadAllItems","#buildCommandPalette","#centerContentHorizontally","dialog","command","input","list","group","it","empty","value","#closeCommandPalette","#openCommandPalette","tag","editable","#navigateRelative","direction","nextIdx","dir","htmlUrl","cssUrl","tsUrl","res","r","GAP","START_Y","measurements","offsetY","maxWidth","height","width","attachTrait","orig","s","attr","loadedCSS","loadedTS","wrapper","ed","editorWidth","contentWidth","panX","registerBuiltinTraits","define","AuiButton","AuiInput","AuiCheckbox","AuiSwitch","AuiRadio","AuiRadioGroup","AuiTextarea","AuiContainer","AuiDialog","AuiDrawer","AuiIcon","AuiTooltip","AuiRange","AuiInputOtp","AuiGripper","AuiOption","AuiOptgroup","AuiSelect","AuiToast","AuiTabs","AuiTab","AuiTabPanel","AuiAccordion","AuiAccordionItem","AuiBreadcrumb","AuiBreadcrumbItem","AuiSegmentedControl","AuiSegment","AuiPagination","AuiCommand","AuiCommandInput","AuiCommandList","AuiCommandItem","AuiCommandGroup","AuiCommandEmpty","AuiPanes","AuiPane","AuiTable","AuiTableHead","AuiTableBody","AuiTableRow","AuiTableHeader","AuiTableCell","AuiTree","AuiTreeItem","AuiFeed","AuiRoot","AuiCalendarPicker","AuiCalendarRangePicker","AuiAgentFeed","AuiAgentThread","AuiAgentMessage","AuiAgentText","AuiAgentActivity","AuiAgentSeeds","AuiAgentPanel","AuiAgentInput","AuiAgentPrompt","AuiAppShell","AuiPage","AuiPageMain","AuiPageContext","AuiSidebar","AuiSidebarHeader","AuiSidebarContent","AuiSidebarFooter","AuiEditor","AuiEditorLayer","AuiGraphUi","AuiGraphLayer","AuiGraphNode","AuiGraphNoodle","AuiGraphPort","AuiProgress","AuiCodeBlock","AuiSparkline","AuiChip","AuiDisclosure","AuiAvatarGroup","AuiProgressCircle","AuiDisclosureGroup","AuiTagGroup","AuiColorArea","AuiColorSlider","AuiColorField","AuiTimeField","AuiDateField","AuiContextMenu","AuiDropdownMenu","AuiHoverCard","AuiColorPicker","AuiFileUpload","AuiCopyButton","AuiStat","AuiImage","AuiCarousel","AuiNotificationCenter","AuiEmptyState","traitDisposers","attachTraitsToElement","raw","entries","parseTraitsAttribute","validated","validateComposition","disposers","entry","dispose","detachTraitsFromElement","initTraitObserver","node","trigger","anchorName","eventName"],"mappings":"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"}
|