@lostgradient/cinder 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +146 -0
- package/README.md +2 -2
- package/components.json +138 -86
- package/dist/_internal/locale-context.d.ts +9 -0
- package/dist/_internal/text-direction.d.ts +4 -0
- package/dist/_internal/tree-context.d.ts +2 -0
- package/dist/api-contract.d.ts +1 -1
- package/dist/components/_internal/create-command-list-state.svelte.d.ts +43 -0
- package/dist/components/_internal/create-sliding-dialog-state.svelte.d.ts +26 -0
- package/dist/components/access-gate/index.js +379 -513
- package/dist/components/alert/alert.css +1 -1
- package/dist/components/alert/alert.schema.js +4 -4
- package/dist/components/alert/alert.types.d.ts +4 -4
- package/dist/components/alert/index.js +4 -4
- package/dist/components/alert-dialog/index.js +9 -3
- package/dist/components/approval-card/approval-card-state.d.ts +3 -0
- package/dist/components/approval-card/approval-card.css +239 -0
- package/dist/components/approval-card/approval-card.schema.js +236 -0
- package/dist/components/approval-card/approval-card.svelte.d.ts +21 -0
- package/dist/components/approval-card/approval-card.types.d.ts +155 -0
- package/dist/components/{subscription-badge/subscription-badge.variables.js → approval-card/approval-card.variables.js} +4 -4
- package/dist/components/approval-card/index.d.ts +5 -0
- package/dist/components/approval-card/index.js +3794 -0
- package/dist/components/autocomplete/autocomplete.css +12 -1
- package/dist/components/autocomplete/index.js +106 -81
- package/dist/components/avatar-group/index.js +3 -2
- package/dist/components/badge/badge.schema.js +6 -3
- package/dist/components/badge/badge.svelte.d.ts +4 -0
- package/dist/components/badge/badge.types.d.ts +18 -4
- package/dist/components/badge/index.d.ts +1 -1
- package/dist/components/badge/index.js +99 -3
- package/dist/components/banner/banner.schema.js +2 -2
- package/dist/components/banner/banner.types.d.ts +1 -1
- package/dist/components/banner/index.js +3 -3
- package/dist/components/button/button.css +1 -1
- package/dist/components/capability-gate/capability-gate.css +15 -2
- package/dist/components/capability-gate/capability-gate.schema.js +4 -4
- package/dist/components/capability-gate/capability-gate.types.d.ts +6 -6
- package/dist/components/capability-gate/index.js +7 -7
- package/dist/components/chat/chat.schema.js +11 -26
- package/dist/components/chat/chat.types.d.ts +30 -15
- package/dist/components/chat/container/chat-events.d.ts +2 -2
- package/dist/components/chat/container/chat-history-trigger.svelte.d.ts +1 -1
- package/dist/components/chat/container/chat.svelte.d.ts +1 -1
- package/dist/components/chat/container/use-chat-scroll-state.svelte.d.ts +4 -4
- package/dist/components/chat/container/use-chat-unread-state.svelte.d.ts +6 -6
- package/dist/components/chat/index.d.ts +1 -1
- package/dist/components/chat/index.js +2257 -1913
- package/dist/components/chat/input/chat-input.svelte.d.ts +3 -1
- package/dist/components/chat-conversation-header/index.js +261 -29
- package/dist/components/chat-conversation-list/chat-conversation-list.css +13 -0
- package/dist/components/checkbox/checkbox.css +3 -0
- package/dist/components/checkbox/checkbox.schema.js +6 -1
- package/dist/components/checkbox/checkbox.types.d.ts +2 -0
- package/dist/components/checkbox/index.js +78 -22
- package/dist/components/checkbox-group/checkbox-group.css +3 -0
- package/dist/components/checkbox-group/checkbox-group.schema.js +4 -4
- package/dist/components/checkbox-group/checkbox-group.types.d.ts +12 -7
- package/dist/components/checkbox-group/index.js +50 -21
- package/dist/components/choice-grid/index.js +2 -2
- package/dist/components/choice-grid-item/index.js +2 -2
- package/dist/components/click-away-listener/click-away-listener.schema.js +3 -3
- package/dist/components/click-away-listener/click-away-listener.types.d.ts +3 -3
- package/dist/components/click-away-listener/index.js +3 -3
- package/dist/components/code-block/code-block.css +4 -3
- package/dist/components/code-block/index.js +6 -5
- package/dist/components/collapsible/collapsible.schema.js +2 -2
- package/dist/components/collapsible/collapsible.types.d.ts +2 -2
- package/dist/components/collapsible/index.js +3 -3
- package/dist/components/color-field/color-field.schema.js +3 -3
- package/dist/components/color-field/color-field.types.d.ts +2 -2
- package/dist/components/color-field/index.js +133 -69
- package/dist/components/color-picker/index.js +29 -18
- package/dist/components/color-swatch-picker/index.js +29 -18
- package/dist/components/combobox/combobox.schema.js +6 -2
- package/dist/components/combobox/combobox.types.d.ts +7 -1
- package/dist/components/combobox/index.js +112 -60
- package/dist/components/command-item/command-item.css +10 -0
- package/dist/components/command-item/command-item.schema.js +9 -1
- package/dist/components/command-item/command-item.types.d.ts +4 -0
- package/dist/components/command-item/index.js +9 -1
- package/dist/components/command-menu/index.js +257 -161
- package/dist/components/command-palette/command-palette.schema.js +2 -3
- package/dist/components/command-palette/command-palette.types.d.ts +1 -2
- package/dist/components/command-palette/index.js +282 -192
- package/dist/components/confirm-dialog/index.js +9 -3
- package/dist/components/context-menu/context-menu.context.d.ts +2 -0
- package/dist/components/context-menu/index.js +300 -40
- package/dist/components/context-menu-trigger/index.js +11 -8
- package/dist/components/copy-button/index.js +6 -5
- package/dist/components/data-grid/_internal/column-model.svelte.d.ts +1 -0
- package/dist/components/data-grid/data-grid.css +25 -0
- package/dist/components/data-grid/data-grid.schema.js +3 -3
- package/dist/components/data-grid/data-grid.types.d.ts +8 -2
- package/dist/components/data-grid/index.js +11 -8
- package/dist/components/data-list/data-list.schema.js +7 -10
- package/dist/components/data-list/data-list.types.d.ts +5 -9
- package/dist/components/data-list/index.js +15 -39
- package/dist/components/data-table/data-table.css +13 -0
- package/dist/components/data-table/index.js +32 -19
- package/dist/components/date-range-field/date-range-field.schema.js +7 -3
- package/dist/components/date-range-field/date-range-field.svelte.d.ts +2 -2
- package/dist/components/date-range-field/date-range-field.types.d.ts +15 -10
- package/dist/components/date-range-field/index.d.ts +1 -1
- package/dist/components/date-range-field/index.js +160 -17
- package/dist/components/diff-viewer/diff-front-matter.svelte.d.ts +2 -2
- package/dist/components/diff-viewer/diff-line.svelte.d.ts +2 -2
- package/dist/components/diff-viewer/diff-toolbar.svelte.d.ts +2 -2
- package/dist/components/diff-viewer/diff-viewer.svelte.d.ts +1 -1
- package/dist/components/diff-viewer/diff-viewer.types.d.ts +3 -3
- package/dist/components/diff-viewer/index.d.ts +1 -1
- package/dist/components/diff-viewer/index.js +171 -67
- package/dist/components/drawer/index.js +353 -283
- package/dist/components/dropdown/dropdown.css +7 -1
- package/dist/components/dropdown/dropdown.types.d.ts +3 -0
- package/dist/components/dropdown/index.js +267 -35
- package/dist/components/dropdown-group/dropdown-group.schema.js +4 -4
- package/dist/components/dropdown-group/dropdown-group.types.d.ts +4 -4
- package/dist/components/dropdown-group/index.js +7 -7
- package/dist/components/dropdown-item/dropdown-item.schema.js +9 -1
- package/dist/components/dropdown-item/dropdown-item.types.d.ts +5 -0
- package/dist/components/dropdown-item/index.js +13 -8
- package/dist/components/dropdown-menu/index.js +236 -14
- package/dist/components/dropdown-trigger/index.js +11 -12
- package/dist/components/event-stream-viewer/event-stream-viewer-keys.d.ts +6 -0
- package/dist/components/event-stream-viewer/event-stream-viewer.css +46 -0
- package/dist/components/event-stream-viewer/event-stream-viewer.schema.js +83 -10
- package/dist/components/event-stream-viewer/event-stream-viewer.svelte.d.ts +3 -3
- package/dist/components/event-stream-viewer/event-stream-viewer.types.d.ts +124 -3
- package/dist/components/event-stream-viewer/index.d.ts +1 -1
- package/dist/components/event-stream-viewer/index.js +764 -409
- package/dist/components/faceted-filter-bar/faceted-filter-bar.css +9 -0
- package/dist/components/faceted-filter-bar/index.js +25 -6
- package/dist/components/file-upload/file-upload.css +5 -5
- package/dist/components/floating-action-button/floating-action-button.css +22 -22
- package/dist/components/floating-action-button/floating-action-button.schema.js +5 -5
- package/dist/components/floating-action-button/floating-action-button.svelte.d.ts +1 -1
- package/dist/components/floating-action-button/floating-action-button.types.d.ts +21 -21
- package/dist/components/floating-action-button/index.d.ts +1 -1
- package/dist/components/floating-action-button/index.js +8 -8
- package/dist/components/form-field/form-field.css +3 -13
- package/dist/components/form-field/index.js +2 -2
- package/dist/components/hover-card/index.js +3 -2
- package/dist/components/input/index.js +131 -67
- package/dist/components/input/input.schema.js +6 -1
- package/dist/components/input/input.types.d.ts +2 -0
- package/dist/components/invocation-rule-builder/index.d.ts +1 -1
- package/dist/components/invocation-rule-builder/index.js +184 -107
- package/dist/components/invocation-rule-builder/invocation-rule-builder.css +63 -6
- package/dist/components/invocation-rule-builder/invocation-rule-builder.schema.js +133 -35
- package/dist/components/invocation-rule-builder/invocation-rule-builder.svelte.d.ts +2 -2
- package/dist/components/invocation-rule-builder/invocation-rule-builder.types.d.ts +85 -8
- package/dist/components/json-schema-editor/form-view.svelte.d.ts +1 -0
- package/dist/components/json-schema-editor/index.js +677 -357
- package/dist/components/json-schema-editor/json-schema-editor.css +6 -1
- package/dist/components/json-schema-editor/json-schema-toolbar.svelte.d.ts +1 -0
- package/dist/components/json-schema-editor/property-editor.svelte.d.ts +2 -0
- package/dist/components/json-schema-editor/property-list-validation.d.ts +1 -0
- package/dist/components/json-schema-editor/property-list.svelte.d.ts +1 -0
- package/dist/components/json-viewer/_json-viewer-node.svelte.d.ts +3 -0
- package/dist/components/json-viewer/index.js +112 -26
- package/dist/components/json-viewer/json-viewer.css +11 -0
- package/dist/components/kanban-board/index.js +18 -13
- package/dist/components/kanban-board/kanban-board.css +56 -3
- package/dist/components/keyboard-shortcuts/index.js +2 -2
- package/dist/components/keyboard-shortcuts/keyboard-shortcuts.css +2 -2
- package/dist/components/label/index.js +2 -2
- package/dist/components/label/label.css +2 -9
- package/dist/components/load-more/index.js +4 -4
- package/dist/components/load-more/load-more.css +13 -5
- package/dist/components/load-more/load-more.schema.js +4 -4
- package/dist/components/load-more/load-more.types.d.ts +3 -3
- package/dist/components/locale-provider/index.d.ts +4 -0
- package/dist/components/locale-provider/index.js +76 -0
- package/dist/components/{connection-indicator/connection-indicator.schema.js → locale-provider/locale-provider.schema.js} +18 -14
- package/dist/components/locale-provider/locale-provider.svelte.d.ts +17 -0
- package/dist/components/locale-provider/locale-provider.types.d.ts +17 -0
- package/dist/components/{connection-indicator/connection-indicator.variables.js → locale-provider/locale-provider.variables.js} +4 -4
- package/dist/components/markdown-editor/editor-toolbar/editor-toolbar.svelte.d.ts +2 -0
- package/dist/components/markdown-editor/index.js +437 -128
- package/dist/components/markdown-editor/markdown-editor.schema.js +4 -4
- package/dist/components/markdown-editor/markdown-editor.types.d.ts +4 -4
- package/dist/components/masonry/masonry.schema.js +4 -3
- package/dist/components/masonry/masonry.types.d.ts +13 -2
- package/dist/components/matrix-chart/index.js +245 -224
- package/dist/components/media-controls/index.js +7 -7
- package/dist/components/media-controls/media-controls.css +15 -4
- package/dist/components/media-controls/media-controls.schema.js +4 -4
- package/dist/components/media-controls/media-controls.types.d.ts +7 -7
- package/dist/components/menu-bar/menu-bar.css +11 -0
- package/dist/components/menu-bar/menu-bar.svelte.d.ts +1 -0
- package/dist/components/modal/index.js +9 -3
- package/dist/components/navigation-bar/index.js +4 -4
- package/dist/components/navigation-bar/navigation-bar.schema.js +2 -2
- package/dist/components/navigation-bar/navigation-bar.types.d.ts +1 -1
- package/dist/components/number-input/index.js +88 -42
- package/dist/components/number-input/number-input.schema.js +4 -3
- package/dist/components/number-input/number-input.types.d.ts +16 -5
- package/dist/components/payload-inspector/index.d.ts +1 -1
- package/dist/components/payload-inspector/index.js +271 -64
- package/dist/components/payload-inspector/payload-inspector.css +6 -0
- package/dist/components/payload-inspector/payload-inspector.schema.js +27 -15
- package/dist/components/payload-inspector/payload-inspector.svelte.d.ts +2 -2
- package/dist/components/payload-inspector/payload-inspector.types.d.ts +52 -3
- package/dist/components/permission-matrix/permission-matrix.css +10 -0
- package/dist/components/phone-input/index.js +56 -33
- package/dist/components/phone-input/phone-input.schema.js +2 -2
- package/dist/components/phone-input/phone-input.types.d.ts +3 -2
- package/dist/components/pin-input/index.js +46 -41
- package/dist/components/pin-input/pin-input.schema.js +9 -2
- package/dist/components/pin-input/pin-input.types.d.ts +10 -1
- package/dist/components/popover/index.js +11 -4
- package/dist/components/portal/index.js +3 -2
- package/dist/components/pricing-card/index.js +22 -7
- package/dist/components/radio-group/index.js +51 -21
- package/dist/components/radio-group/radio-group.css +3 -0
- package/dist/components/radio-group/radio-group.schema.js +3 -3
- package/dist/components/radio-group/radio-group.types.d.ts +6 -2
- package/dist/components/rating/index.js +1 -6
- package/dist/components/rating/rating.schema.js +9 -2
- package/dist/components/rating/rating.types.d.ts +6 -0
- package/dist/components/review-editor/comment-list.svelte.d.ts +1 -1
- package/dist/components/review-editor/index.d.ts +1 -1
- package/dist/components/review-editor/index.js +789 -314
- package/dist/components/review-editor/review-editor-controls.svelte.d.ts +1 -1
- package/dist/components/review-editor/review-editor-impl.svelte.d.ts +4 -4
- package/dist/components/review-editor/review-editor-selection-types.d.ts +1 -1
- package/dist/components/review-editor/review-editor-state.svelte.d.ts +1 -1
- package/dist/components/review-editor/review-editor-threads.svelte.d.ts +2 -2
- package/dist/components/review-editor/review-editor.svelte.d.ts +2 -1
- package/dist/components/review-editor/review-editor.types.d.ts +77 -3
- package/dist/components/review-editor/thread-popover.svelte.d.ts +1 -1
- package/dist/components/run-step-timeline/index.d.ts +1 -1
- package/dist/components/run-step-timeline/index.js +747 -273
- package/dist/components/run-step-timeline/run-step-timeline.css +25 -5
- package/dist/components/run-step-timeline/run-step-timeline.schema.js +351 -21
- package/dist/components/run-step-timeline/run-step-timeline.svelte.d.ts +1 -1
- package/dist/components/run-step-timeline/run-step-timeline.types.d.ts +184 -3
- package/dist/components/schema-form/index.d.ts +1 -1
- package/dist/components/schema-form/index.js +1916 -474
- package/dist/components/schema-form/schema-form-async.fixture.d.ts +1 -0
- package/dist/components/schema-form/schema-form-body.svelte.d.ts +25 -0
- package/dist/components/schema-form/schema-form-model.d.ts +1 -4
- package/dist/components/schema-form/schema-form-validation.d.ts +1 -2
- package/dist/components/schema-form/schema-form.css +12 -74
- package/dist/components/schema-form/schema-form.schema.js +10 -3
- package/dist/components/schema-form/schema-form.svelte.d.ts +3 -3
- package/dist/components/schema-form/schema-form.types.d.ts +15 -8
- package/dist/components/scroll-area/index.js +3 -3
- package/dist/components/scroll-area/scroll-area.schema.js +2 -2
- package/dist/components/scroll-area/scroll-area.types.d.ts +1 -1
- package/dist/components/secret-value-field/index.js +10 -4
- package/dist/components/secret-value-field/secret-value-field.svelte.d.ts +1 -1
- package/dist/components/segmented-control/segmented-control.css +22 -1
- package/dist/components/select/index.js +37 -24
- package/dist/components/select/select.css +9 -2
- package/dist/components/selection-popover/index.js +11 -4
- package/dist/components/share-card/index.js +3 -4
- package/dist/components/share-card/share-card.css +15 -4
- package/dist/components/sheet/index.js +365 -300
- package/dist/components/shortcut-hint/index.js +3 -3
- package/dist/components/sidebar/index.js +423 -353
- package/dist/components/sidebar/sidebar.schema.js +2 -2
- package/dist/components/sidebar/sidebar.types.d.ts +1 -1
- package/dist/components/slider/index.js +211 -9
- package/dist/components/slider/slider.css +14 -9
- package/dist/components/sortable-list/sortable-list.css +1 -1
- package/dist/components/spectrogram/index.js +224 -203
- package/dist/components/spectrum-chart/index.js +208 -187
- package/dist/components/speed-dial/index.js +11 -11
- package/dist/components/speed-dial/speed-dial.css +3 -3
- package/dist/components/speed-dial-action/index.js +9 -9
- package/dist/components/stat/index.js +26 -4
- package/dist/components/stat/stat.schema.js +2 -2
- package/dist/components/stat/stat.types.d.ts +2 -2
- package/dist/components/stat-group/index.js +26 -4
- package/dist/components/stat-group/stat-group.css +1 -1
- package/dist/components/status-dot/index.d.ts +1 -1
- package/dist/components/status-dot/index.js +47 -8
- package/dist/components/status-dot/status-dot.css +45 -1
- package/dist/components/status-dot/status-dot.schema.js +12 -5
- package/dist/components/status-dot/status-dot.svelte.d.ts +5 -1
- package/dist/components/status-dot/status-dot.types.d.ts +16 -6
- package/dist/components/steps/steps.css +3 -3
- package/dist/components/table/index.js +23 -17
- package/dist/components/table/table.css +10 -0
- package/dist/components/table/table.types.d.ts +3 -3
- package/dist/components/table-header/index.js +5 -5
- package/dist/components/table-header/table-header.schema.js +3 -3
- package/dist/components/table-header/table-header.types.d.ts +2 -2
- package/dist/components/table-header-cell/index.js +11 -5
- package/dist/components/table-row/index.js +7 -7
- package/dist/components/table-row/table-row.schema.js +3 -3
- package/dist/components/table-row/table-row.types.d.ts +6 -6
- package/dist/components/tabs/index.js +17 -4
- package/dist/components/tabs/tabs.schema.js +6 -1
- package/dist/components/tabs/tabs.types.d.ts +2 -0
- package/dist/components/textarea/index.js +37 -24
- package/dist/components/textarea/textarea.css +16 -1
- package/dist/components/time-field/index.d.ts +5 -0
- package/dist/components/time-field/index.js +456 -0
- package/dist/components/time-field/time-field.css +60 -0
- package/dist/components/time-field/time-field.schema.d.ts +3 -0
- package/dist/components/time-field/time-field.schema.js +107 -0
- package/dist/components/time-field/time-field.svelte.d.ts +18 -0
- package/dist/components/time-field/time-field.types.d.ts +63 -0
- package/dist/components/time-field/time-field.variables.d.ts +2 -0
- package/dist/components/{experimental/connection-indicator/index.js → time-field/time-field.variables.js} +5 -14
- package/dist/components/toggle/index.js +39 -7
- package/dist/components/toggle/toggle.schema.js +11 -2
- package/dist/components/toggle/toggle.types.d.ts +2 -0
- package/dist/components/tooltip/index.js +3 -2
- package/dist/components/transfer-list/index.js +41 -11
- package/dist/components/transfer-list/transfer-list.css +22 -0
- package/dist/components/transfer-list/transfer-list.schema.js +2 -2
- package/dist/components/transfer-list/transfer-list.types.d.ts +2 -2
- package/dist/components/tree/index.js +238 -153
- package/dist/components/tree/tree.css +69 -0
- package/dist/components/tree/tree.schema.js +3 -3
- package/dist/components/tree/tree.types.d.ts +2 -2
- package/dist/components/tree-item/index.js +107 -68
- package/dist/components/tree-item/tree-item.schema.js +5 -5
- package/dist/components/tree-item/tree-item.types.d.ts +4 -4
- package/dist/components/virtual-list/index.js +98 -63
- package/dist/components/waveform/index.js +185 -164
- package/dist/editor/attach.d.ts +2 -2
- package/dist/editor/attach.js +10 -16
- package/dist/editor/editor.js +6 -6
- package/dist/editor/keymap-plugin.d.ts +2 -2
- package/dist/editor/keymap-plugin.js +4 -4
- package/dist/editor/types.d.ts +11 -11
- package/dist/index.d.ts +14 -12
- package/dist/index.js +106 -105
- package/dist/server/components/access-gate/index.js +176 -305
- package/dist/server/components/alert/alert.schema.js +4 -4
- package/dist/server/components/alert/index.css +1 -1
- package/dist/server/components/alert/index.js +4 -4
- package/dist/server/components/alert-dialog/index.js +9 -3
- package/dist/server/components/approval-card/approval-card.schema.js +217 -0
- package/dist/server/components/approval-card/approval-card.variables.js +12 -0
- package/dist/server/components/approval-card/index.css +1767 -0
- package/dist/server/components/approval-card/index.js +2499 -0
- package/dist/server/components/autocomplete/index.css +12 -1
- package/dist/server/components/autocomplete/index.js +34 -24
- package/dist/server/components/badge/badge.schema.js +6 -3
- package/dist/server/components/badge/index.js +71 -4
- package/dist/server/components/banner/banner.schema.js +2 -2
- package/dist/server/components/banner/index.js +3 -3
- package/dist/server/components/button/index.css +1 -1
- package/dist/server/components/capability-gate/capability-gate.schema.js +4 -4
- package/dist/server/components/capability-gate/index.css +10 -2
- package/dist/server/components/capability-gate/index.js +5 -5
- package/dist/server/components/chat/chat.schema.js +11 -26
- package/dist/server/components/chat/index.js +695 -438
- package/dist/server/components/chat-conversation-header/index.css +7 -1
- package/dist/server/components/chat-conversation-header/index.js +215 -17
- package/dist/server/components/chat-conversation-list/index.css +8 -0
- package/dist/server/components/checkbox/checkbox.schema.js +6 -1
- package/dist/server/components/checkbox/index.css +3 -0
- package/dist/server/components/checkbox/index.js +41 -4
- package/dist/server/components/checkbox-group/checkbox-group.schema.js +4 -4
- package/dist/server/components/checkbox-group/index.css +3 -0
- package/dist/server/components/checkbox-group/index.js +23 -4
- package/dist/server/components/choice-grid/index.js +2 -2
- package/dist/server/components/choice-grid-item/index.js +2 -2
- package/dist/server/components/click-away-listener/click-away-listener.schema.js +3 -3
- package/dist/server/components/click-away-listener/index.js +2 -2
- package/dist/server/components/code-block/index.css +4 -3
- package/dist/server/components/code-block/index.js +1 -6
- package/dist/server/components/collapsible/collapsible.schema.js +2 -2
- package/dist/server/components/collapsible/index.js +3 -3
- package/dist/server/components/color-field/color-field.schema.js +3 -3
- package/dist/server/components/color-field/index.js +61 -17
- package/dist/server/components/color-picker/index.js +29 -12
- package/dist/server/components/color-swatch-picker/index.js +29 -12
- package/dist/server/components/combobox/combobox.schema.js +6 -2
- package/dist/server/components/combobox/index.js +61 -12
- package/dist/server/components/command-item/command-item.schema.js +9 -1
- package/dist/server/components/command-item/index.css +1 -0
- package/dist/server/components/command-item/index.js +10 -2
- package/dist/server/components/command-menu/index.css +1 -0
- package/dist/server/components/command-menu/index.js +193 -102
- package/dist/server/components/command-palette/command-palette.schema.js +2 -3
- package/dist/server/components/command-palette/index.css +1 -0
- package/dist/server/components/command-palette/index.js +190 -106
- package/dist/server/components/confirm-dialog/index.js +9 -3
- package/dist/server/components/context-menu/index.css +7 -1
- package/dist/server/components/context-menu/index.js +244 -26
- package/dist/server/components/context-menu-trigger/index.js +7 -4
- package/dist/server/components/copy-button/index.js +1 -6
- package/dist/server/components/data-grid/data-grid.schema.js +3 -3
- package/dist/server/components/data-grid/index.css +23 -0
- package/dist/server/components/data-grid/index.js +9 -7
- package/dist/server/components/data-list/data-list.schema.js +7 -10
- package/dist/server/components/data-list/index.js +7 -21
- package/dist/server/components/data-table/index.css +20 -0
- package/dist/server/components/data-table/index.js +26 -16
- package/dist/server/components/date-range-field/date-range-field.schema.js +7 -3
- package/dist/server/components/date-range-field/index.js +146 -12
- package/dist/server/components/diff-viewer/index.js +79 -7
- package/dist/server/components/drawer/index.js +260 -193
- package/dist/server/components/dropdown/index.css +7 -1
- package/dist/server/components/dropdown/index.js +221 -23
- package/dist/server/components/dropdown-group/dropdown-group.schema.js +4 -4
- package/dist/server/components/dropdown-group/index.js +7 -7
- package/dist/server/components/dropdown-item/dropdown-item.schema.js +9 -1
- package/dist/server/components/dropdown-item/index.js +12 -7
- package/dist/server/components/dropdown-menu/index.js +197 -13
- package/dist/server/components/dropdown-trigger/index.js +5 -2
- package/dist/server/components/event-stream-viewer/event-stream-viewer.schema.js +83 -10
- package/dist/server/components/event-stream-viewer/index.css +323 -0
- package/dist/server/components/event-stream-viewer/index.js +406 -139
- package/dist/server/components/faceted-filter-bar/index.css +10 -1
- package/dist/server/components/faceted-filter-bar/index.js +24 -6
- package/dist/server/components/file-upload/index.css +3 -3
- package/dist/server/components/floating-action-button/floating-action-button.schema.js +5 -5
- package/dist/server/components/floating-action-button/index.css +16 -16
- package/dist/server/components/floating-action-button/index.js +5 -5
- package/dist/server/components/form-field/index.css +0 -10
- package/dist/server/components/form-field/index.js +2 -2
- package/dist/server/components/input/index.js +59 -15
- package/dist/server/components/input/input.schema.js +6 -1
- package/dist/server/components/invocation-rule-builder/index.css +51 -6
- package/dist/server/components/invocation-rule-builder/index.js +56 -17
- package/dist/server/components/invocation-rule-builder/invocation-rule-builder.schema.js +133 -35
- package/dist/server/components/json-schema-editor/index.css +4 -1
- package/dist/server/components/json-schema-editor/index.js +282 -52
- package/dist/server/components/json-viewer/index.css +7 -1
- package/dist/server/components/json-viewer/index.js +83 -11
- package/dist/server/components/kanban-board/index.css +42 -3
- package/dist/server/components/kanban-board/index.js +7 -6
- package/dist/server/components/keyboard-shortcuts/index.css +2 -2
- package/dist/server/components/keyboard-shortcuts/index.js +2 -2
- package/dist/server/components/label/index.css +0 -10
- package/dist/server/components/label/index.js +2 -2
- package/dist/server/components/load-more/index.css +12 -4
- package/dist/server/components/load-more/index.js +5 -5
- package/dist/server/components/load-more/load-more.schema.js +4 -4
- package/dist/server/components/locale-provider/index.js +55 -0
- package/dist/server/components/locale-provider/locale-provider.schema.js +35 -0
- package/dist/server/components/locale-provider/locale-provider.variables.js +12 -0
- package/dist/server/components/markdown-editor/index.js +297 -60
- package/dist/server/components/markdown-editor/markdown-editor.schema.js +4 -4
- package/dist/server/components/masonry/masonry.schema.js +4 -3
- package/dist/server/components/matrix-chart/index.js +62 -39
- package/dist/server/components/media-controls/index.css +11 -3
- package/dist/server/components/media-controls/index.js +7 -7
- package/dist/server/components/media-controls/media-controls.schema.js +4 -4
- package/dist/server/components/menu-bar/index.css +15 -1
- package/dist/server/components/modal/index.js +9 -3
- package/dist/server/components/navigation-bar/index.js +3 -3
- package/dist/server/components/navigation-bar/navigation-bar.schema.js +2 -2
- package/dist/server/components/number-input/index.js +56 -18
- package/dist/server/components/number-input/number-input.schema.js +4 -3
- package/dist/server/components/payload-inspector/index.css +616 -0
- package/dist/server/components/payload-inspector/index.js +181 -22
- package/dist/server/components/payload-inspector/payload-inspector.schema.js +27 -15
- package/dist/server/components/permission-matrix/index.css +8 -0
- package/dist/server/components/phone-input/index.js +21 -3
- package/dist/server/components/phone-input/phone-input.schema.js +2 -2
- package/dist/server/components/pin-input/index.js +12 -7
- package/dist/server/components/pin-input/pin-input.schema.js +9 -2
- package/dist/server/components/popover/index.js +9 -3
- package/dist/server/components/pricing-card/index.js +22 -7
- package/dist/server/components/radio-group/index.css +3 -0
- package/dist/server/components/radio-group/index.js +24 -3
- package/dist/server/components/radio-group/radio-group.schema.js +3 -3
- package/dist/server/components/rating/rating.schema.js +9 -2
- package/dist/server/components/review-editor/index.js +426 -80
- package/dist/server/components/run-step-timeline/index.css +503 -6
- package/dist/server/components/run-step-timeline/index.js +455 -109
- package/dist/server/components/run-step-timeline/run-step-timeline.schema.js +351 -21
- package/dist/server/components/schema-form/index.css +11 -69
- package/dist/server/components/schema-form/index.js +1291 -218
- package/dist/server/components/schema-form/schema-form.schema.js +10 -3
- package/dist/server/components/scroll-area/index.js +3 -3
- package/dist/server/components/scroll-area/scroll-area.schema.js +2 -2
- package/dist/server/components/secret-value-field/index.js +4 -4
- package/dist/server/components/segmented-control/index.css +15 -1
- package/dist/server/components/select/index.css +9 -2
- package/dist/server/components/select/index.js +9 -2
- package/dist/server/components/selection-popover/index.js +9 -3
- package/dist/server/components/share-card/index.css +11 -3
- package/dist/server/components/share-card/index.js +1 -5
- package/dist/server/components/sheet/index.js +265 -195
- package/dist/server/components/sidebar/index.js +274 -207
- package/dist/server/components/sidebar/sidebar.schema.js +2 -2
- package/dist/server/components/slider/index.css +13 -9
- package/dist/server/components/slider/index.js +173 -4
- package/dist/server/components/sortable-list/index.css +1 -1
- package/dist/server/components/spectrogram/index.js +68 -45
- package/dist/server/components/spectrum-chart/index.js +54 -31
- package/dist/server/components/speed-dial/index.css +3 -3
- package/dist/server/components/speed-dial/index.js +8 -8
- package/dist/server/components/speed-dial-action/index.js +6 -6
- package/dist/server/components/stat/index.js +26 -4
- package/dist/server/components/stat/stat.schema.js +2 -2
- package/dist/server/components/stat-group/index.css +1 -1
- package/dist/server/components/stat-group/index.js +26 -4
- package/dist/server/components/status-dot/index.css +45 -1
- package/dist/server/components/status-dot/index.js +35 -7
- package/dist/server/components/status-dot/status-dot.schema.js +12 -5
- package/dist/server/components/steps/index.css +3 -3
- package/dist/server/components/table/index.css +8 -0
- package/dist/server/components/table/index.js +22 -16
- package/dist/server/components/table-header/index.js +6 -6
- package/dist/server/components/table-header/table-header.schema.js +3 -3
- package/dist/server/components/table-header-cell/index.js +9 -3
- package/dist/server/components/table-row/index.js +7 -7
- package/dist/server/components/table-row/table-row.schema.js +3 -3
- package/dist/server/components/tabs/index.js +18 -4
- package/dist/server/components/tabs/tabs.schema.js +6 -1
- package/dist/server/components/textarea/index.css +16 -1
- package/dist/server/components/textarea/index.js +9 -2
- package/dist/server/components/time-field/index.css +58 -0
- package/dist/server/components/time-field/index.js +291 -0
- package/dist/server/components/time-field/time-field.schema.js +88 -0
- package/dist/server/components/time-field/time-field.variables.js +12 -0
- package/dist/server/components/toggle/index.js +40 -7
- package/dist/server/components/toggle/toggle.schema.js +11 -2
- package/dist/server/components/transfer-list/index.css +16 -0
- package/dist/server/components/transfer-list/index.js +37 -11
- package/dist/server/components/transfer-list/transfer-list.schema.js +2 -2
- package/dist/server/components/tree/index.css +68 -0
- package/dist/server/components/tree/index.js +67 -20
- package/dist/server/components/tree/tree.schema.js +3 -3
- package/dist/server/components/tree-item/index.js +34 -13
- package/dist/server/components/tree-item/tree-item.schema.js +5 -5
- package/dist/server/components/virtual-list/index.js +36 -13
- package/dist/server/components/waveform/index.js +51 -28
- package/dist/server/editor/attach.d.ts +2 -2
- package/dist/server/editor/attach.js +10 -16
- package/dist/server/editor/editor.js +6 -6
- package/dist/server/editor/keymap-plugin.d.ts +2 -2
- package/dist/server/editor/keymap-plugin.js +4 -4
- package/dist/server/editor/types.d.ts +11 -11
- package/dist/server/index.css +2033 -1463
- package/dist/server/index.js +7203 -5135
- package/dist/utilities/attachments.d.ts +6 -6
- package/dist/utilities/value-change.d.ts +2 -0
- package/package.json +96 -63
- package/src/_internal/locale-context.ts +21 -0
- package/src/_internal/text-direction.ts +213 -0
- package/src/_internal/tree-context.ts +2 -0
- package/src/components/_internal/create-command-list-state.svelte.ts +171 -0
- package/src/components/_internal/create-sliding-dialog-state.svelte.ts +170 -0
- package/src/components/_radio/README.md +1 -1
- package/src/components/access-gate/access-gate-inline.svelte +3 -1
- package/src/components/alert/README.md +8 -8
- package/src/components/alert/alert.css +1 -1
- package/src/components/alert/alert.examples.json +4 -4
- package/src/components/alert/alert.svelte +3 -5
- package/src/components/alert/alert.types.ts +4 -4
- package/src/components/approval-card/README.md +92 -0
- package/src/components/approval-card/approval-card-state.ts +24 -0
- package/src/components/approval-card/approval-card.css +239 -0
- package/src/components/approval-card/approval-card.examples.json +25 -0
- package/src/components/approval-card/approval-card.svelte +583 -0
- package/src/components/approval-card/approval-card.types.ts +180 -0
- package/src/components/approval-card/index.ts +16 -0
- package/src/components/autocomplete/autocomplete.css +12 -1
- package/src/components/autocomplete/autocomplete.svelte +53 -27
- package/src/components/badge/README.md +8 -7
- package/src/components/badge/badge.svelte +80 -3
- package/src/components/badge/badge.types.ts +36 -13
- package/src/components/badge/index.ts +1 -1
- package/src/components/banner/README.md +2 -2
- package/src/components/banner/banner.examples.json +19 -0
- package/src/components/banner/banner.svelte +2 -2
- package/src/components/banner/banner.types.ts +1 -1
- package/src/components/button/button.css +1 -1
- package/src/components/callout/callout.examples.json +19 -0
- package/src/components/capability-gate/README.md +3 -3
- package/src/components/capability-gate/capability-gate.css +15 -2
- package/src/components/capability-gate/capability-gate.examples.json +1 -1
- package/src/components/capability-gate/capability-gate.svelte +7 -7
- package/src/components/capability-gate/capability-gate.types.ts +6 -6
- package/src/components/chat/README.md +6 -10
- package/src/components/chat/chat.examples.json +8 -8
- package/src/components/chat/chat.types.ts +31 -15
- package/src/components/chat/container/chat-events.ts +2 -2
- package/src/components/chat/container/chat-history-trigger.svelte +9 -1
- package/src/components/chat/container/chat.svelte +47 -46
- package/src/components/chat/container/use-chat-scroll-state.svelte.ts +21 -18
- package/src/components/chat/container/use-chat-unread-state.svelte.ts +19 -19
- package/src/components/chat/index.ts +1 -1
- package/src/components/chat/input/chat-input.svelte +35 -13
- package/src/components/chat/message/image-lightbox.svelte +38 -15
- package/src/components/chat/message/message-attachments.svelte +1 -1
- package/src/components/chat/message/parts/reasoning-part.svelte +8 -0
- package/src/components/chat/message/parts/tool-approval-part.svelte +22 -9
- package/src/components/chat-conversation-list/chat-conversation-list.css +13 -0
- package/src/components/checkbox/README.md +1 -0
- package/src/components/checkbox/checkbox.css +3 -0
- package/src/components/checkbox/checkbox.svelte +44 -2
- package/src/components/checkbox/checkbox.types.ts +2 -0
- package/src/components/checkbox-group/README.md +2 -2
- package/src/components/checkbox-group/checkbox-group.css +3 -0
- package/src/components/checkbox-group/checkbox-group.examples.json +13 -0
- package/src/components/checkbox-group/checkbox-group.svelte +23 -2
- package/src/components/checkbox-group/checkbox-group.types.ts +12 -7
- package/src/components/choice-grid-item/choice-grid-item.svelte +1 -1
- package/src/components/click-away-listener/README.md +2 -2
- package/src/components/click-away-listener/click-away-listener.examples.json +1 -1
- package/src/components/click-away-listener/click-away-listener.svelte +2 -2
- package/src/components/click-away-listener/click-away-listener.types.ts +3 -3
- package/src/components/code-block/code-block.css +4 -3
- package/src/components/collapsible/README.md +2 -2
- package/src/components/collapsible/collapsible.svelte +2 -2
- package/src/components/collapsible/collapsible.types.ts +5 -2
- package/src/components/color-field/README.md +18 -18
- package/src/components/color-field/color-field.svelte +2 -2
- package/src/components/color-field/color-field.types.ts +2 -2
- package/src/components/color-swatch-picker/color-swatch-picker.examples.json +13 -0
- package/src/components/color-swatch-picker/color-swatch-picker.svelte +38 -24
- package/src/components/combobox/README.md +2 -1
- package/src/components/combobox/combobox.svelte +38 -17
- package/src/components/combobox/combobox.types.ts +7 -1
- package/src/components/command-item/README.md +13 -11
- package/src/components/command-item/command-item.css +10 -0
- package/src/components/command-item/command-item.svelte +11 -0
- package/src/components/command-item/command-item.types.ts +4 -0
- package/src/components/command-menu/command-menu.svelte +21 -102
- package/src/components/command-palette/README.md +12 -12
- package/src/components/command-palette/command-palette.examples.json +3 -3
- package/src/components/command-palette/command-palette.svelte +17 -134
- package/src/components/command-palette/command-palette.types.ts +1 -2
- package/src/components/context-menu/context-menu.context.ts +2 -0
- package/src/components/context-menu/context-menu.svelte +35 -9
- package/src/components/context-menu-trigger/context-menu-trigger.svelte +9 -6
- package/src/components/copy-button/copy-button.svelte +4 -3
- package/src/components/data-grid/README.md +3 -3
- package/src/components/data-grid/_internal/column-model.svelte.ts +2 -0
- package/src/components/data-grid/data-grid.css +25 -0
- package/src/components/data-grid/data-grid.svelte +7 -7
- package/src/components/data-grid/data-grid.types.ts +8 -2
- package/src/components/data-list/README.md +9 -9
- package/src/components/data-list/data-list.examples.json +1 -1
- package/src/components/data-list/data-list.svelte +3 -9
- package/src/components/data-list/data-list.types.ts +5 -9
- package/src/components/data-table/data-table.css +13 -0
- package/src/components/data-table/data-table.svelte +13 -3
- package/src/components/date-range-field/README.md +9 -8
- package/src/components/date-range-field/date-range-field.svelte +193 -19
- package/src/components/date-range-field/date-range-field.types.ts +16 -10
- package/src/components/date-range-field/index.ts +1 -0
- package/src/components/diff-viewer/diff-front-matter.svelte +2 -2
- package/src/components/diff-viewer/diff-line.svelte +32 -8
- package/src/components/diff-viewer/diff-toolbar.svelte +3 -3
- package/src/components/diff-viewer/diff-viewer.svelte +4 -4
- package/src/components/diff-viewer/diff-viewer.types.ts +3 -3
- package/src/components/diff-viewer/index.ts +1 -1
- package/src/components/drawer/drawer.svelte +26 -145
- package/src/components/dropdown/dropdown.css +7 -1
- package/src/components/dropdown/dropdown.types.ts +3 -0
- package/src/components/dropdown-group/README.md +6 -6
- package/src/components/dropdown-group/dropdown-group.svelte +8 -8
- package/src/components/dropdown-group/dropdown-group.types.ts +4 -4
- package/src/components/dropdown-item/README.md +2 -0
- package/src/components/dropdown-item/dropdown-item.svelte +14 -11
- package/src/components/dropdown-item/dropdown-item.types.ts +5 -0
- package/src/components/dropdown-menu/dropdown-menu.svelte +42 -9
- package/src/components/dropdown-trigger/dropdown-trigger.svelte +4 -6
- package/src/components/event-stream-viewer/README.md +38 -16
- package/src/components/event-stream-viewer/event-stream-viewer-keys.ts +74 -0
- package/src/components/event-stream-viewer/event-stream-viewer.css +46 -0
- package/src/components/event-stream-viewer/event-stream-viewer.examples.json +6 -0
- package/src/components/event-stream-viewer/event-stream-viewer.svelte +262 -69
- package/src/components/event-stream-viewer/event-stream-viewer.types.ts +130 -3
- package/src/components/event-stream-viewer/index.ts +6 -0
- package/src/components/faceted-filter-bar/faceted-filter-bar.css +9 -0
- package/src/components/faceted-filter-bar/faceted-filter-bar.svelte +31 -5
- package/src/components/file-upload/file-upload.css +5 -5
- package/src/components/file-upload/file-upload.examples.json +13 -0
- package/src/components/floating-action-button/README.md +9 -9
- package/src/components/floating-action-button/floating-action-button.css +22 -22
- package/src/components/floating-action-button/floating-action-button.examples.json +1 -1
- package/src/components/floating-action-button/floating-action-button.svelte +7 -7
- package/src/components/floating-action-button/floating-action-button.types.ts +21 -21
- package/src/components/floating-action-button/index.ts +1 -1
- package/src/components/form-field/form-field.css +3 -13
- package/src/components/form-field/form-field.svelte +4 -1
- package/src/components/image/image.examples.json +13 -0
- package/src/components/input/README.md +16 -15
- package/src/components/input/input.examples.json +1 -1
- package/src/components/input/input.svelte +65 -28
- package/src/components/input/input.types.ts +2 -0
- package/src/components/invocation-rule-builder/README.md +14 -14
- package/src/components/invocation-rule-builder/index.ts +1 -0
- package/src/components/invocation-rule-builder/invocation-rule-builder.css +63 -6
- package/src/components/invocation-rule-builder/invocation-rule-builder.svelte +73 -16
- package/src/components/invocation-rule-builder/invocation-rule-builder.types.ts +99 -8
- package/src/components/json-schema-editor/form-view.svelte +3 -1
- package/src/components/json-schema-editor/json-schema-editor-impl.svelte +30 -18
- package/src/components/json-schema-editor/json-schema-editor.css +6 -1
- package/src/components/json-schema-editor/json-schema-toolbar.svelte +6 -0
- package/src/components/json-schema-editor/json-view.svelte +1 -1
- package/src/components/json-schema-editor/property-editor.svelte +38 -2
- package/src/components/json-schema-editor/property-list-validation.ts +10 -0
- package/src/components/json-schema-editor/property-list.svelte +48 -3
- package/src/components/json-viewer/_json-viewer-node.svelte +55 -9
- package/src/components/json-viewer/json-viewer.css +11 -0
- package/src/components/json-viewer/json-viewer.svelte +63 -1
- package/src/components/kanban-board/kanban-board.css +56 -3
- package/src/components/kanban-board/kanban-board.svelte +10 -3
- package/src/components/keyboard-shortcuts/keyboard-shortcuts.css +2 -2
- package/src/components/keyboard-shortcuts/keyboard-shortcuts.svelte +1 -1
- package/src/components/label/README.md +1 -1
- package/src/components/label/label.css +2 -9
- package/src/components/label/label.svelte +4 -2
- package/src/components/load-more/README.md +4 -4
- package/src/components/load-more/load-more.css +13 -5
- package/src/components/load-more/load-more.examples.json +2 -2
- package/src/components/load-more/load-more.svelte +4 -4
- package/src/components/load-more/load-more.types.ts +3 -3
- package/src/components/locale-provider/README.md +43 -0
- package/src/components/locale-provider/index.ts +5 -0
- package/src/components/locale-provider/locale-provider.svelte +40 -0
- package/src/components/locale-provider/locale-provider.types.ts +21 -0
- package/src/components/markdown-editor/README.md +3 -3
- package/src/components/markdown-editor/editor-toolbar/editor-toolbar.svelte +5 -2
- package/src/components/markdown-editor/editor-toolbar/link-popover.svelte +13 -0
- package/src/components/markdown-editor/editor-toolbar/toolbar-dropdown.svelte +2 -0
- package/src/components/markdown-editor/markdown-editor.svelte +14 -12
- package/src/components/markdown-editor/markdown-editor.types.ts +4 -4
- package/src/components/masonry/README.md +7 -7
- package/src/components/masonry/masonry.types.ts +24 -2
- package/src/components/matrix-chart/matrix-chart.svelte +7 -21
- package/src/components/media-controls/README.md +3 -3
- package/src/components/media-controls/media-controls.css +15 -4
- package/src/components/media-controls/media-controls.examples.json +1 -1
- package/src/components/media-controls/media-controls.svelte +6 -6
- package/src/components/media-controls/media-controls.types.ts +10 -7
- package/src/components/menu-bar/menu-bar.css +11 -0
- package/src/components/menu-bar/menu-bar.svelte +81 -12
- package/src/components/navigation-bar/README.md +1 -1
- package/src/components/navigation-bar/navigation-bar.examples.json +1 -1
- package/src/components/navigation-bar/navigation-bar.svelte +2 -2
- package/src/components/navigation-bar/navigation-bar.types.ts +1 -1
- package/src/components/number-input/README.md +18 -18
- package/src/components/number-input/number-input.examples.json +13 -0
- package/src/components/number-input/number-input.svelte +77 -38
- package/src/components/number-input/number-input.types.ts +15 -5
- package/src/components/pagination/README.md +3 -1
- package/src/components/payload-inspector/README.md +11 -11
- package/src/components/payload-inspector/index.ts +2 -0
- package/src/components/payload-inspector/payload-inspector.css +6 -0
- package/src/components/payload-inspector/payload-inspector.svelte +22 -4
- package/src/components/payload-inspector/payload-inspector.types.ts +54 -3
- package/src/components/permission-matrix/permission-matrix.css +10 -0
- package/src/components/phone-input/README.md +1 -1
- package/src/components/phone-input/phone-input.svelte +7 -1
- package/src/components/phone-input/phone-input.types.ts +3 -2
- package/src/components/pin-input/README.md +19 -19
- package/src/components/pin-input/pin-input.svelte +16 -12
- package/src/components/pin-input/pin-input.types.ts +10 -1
- package/src/components/portal/portal.utilities.svelte.ts +4 -1
- package/src/components/pricing-card/pricing-card.svelte +26 -1
- package/src/components/radio-group/README.md +12 -12
- package/src/components/radio-group/radio-group.css +3 -0
- package/src/components/radio-group/radio-group.examples.json +3 -3
- package/src/components/radio-group/radio-group.svelte +22 -2
- package/src/components/radio-group/radio-group.types.ts +6 -2
- package/src/components/rating/README.md +18 -18
- package/src/components/rating/rating.svelte +0 -8
- package/src/components/rating/rating.types.ts +6 -0
- package/src/components/review-editor/comment-list.svelte +1 -1
- package/src/components/review-editor/index.ts +1 -1
- package/src/components/review-editor/review-editor-controls.svelte +8 -3
- package/src/components/review-editor/review-editor-impl.svelte +11 -7
- package/src/components/review-editor/review-editor-selection-types.ts +1 -1
- package/src/components/review-editor/review-editor-selection.svelte.ts +1 -1
- package/src/components/review-editor/review-editor-state.svelte.ts +1 -1
- package/src/components/review-editor/review-editor-threads.svelte.ts +2 -2
- package/src/components/review-editor/review-editor.types.ts +91 -3
- package/src/components/review-editor/thread-popover.svelte +1 -1
- package/src/components/run-step-timeline/README.md +53 -6
- package/src/components/run-step-timeline/index.ts +6 -0
- package/src/components/run-step-timeline/run-step-timeline.css +25 -5
- package/src/components/run-step-timeline/run-step-timeline.examples.json +3 -3
- package/src/components/run-step-timeline/run-step-timeline.svelte +314 -78
- package/src/components/run-step-timeline/run-step-timeline.types.ts +190 -3
- package/src/components/schema-form/README.md +9 -9
- package/src/components/schema-form/index.ts +0 -1
- package/src/components/schema-form/schema-form-async.fixture.ts +101 -0
- package/src/components/schema-form/schema-form-body.svelte +646 -0
- package/src/components/schema-form/schema-form-model.ts +4 -44
- package/src/components/schema-form/schema-form-validation.ts +83 -46
- package/src/components/schema-form/schema-form.css +12 -74
- package/src/components/schema-form/schema-form.examples.json +0 -6
- package/src/components/schema-form/schema-form.svelte +30 -598
- package/src/components/schema-form/schema-form.types.ts +16 -12
- package/src/components/scroll-area/README.md +1 -1
- package/src/components/scroll-area/scroll-area.examples.json +3 -3
- package/src/components/scroll-area/scroll-area.svelte +5 -5
- package/src/components/scroll-area/scroll-area.types.ts +1 -1
- package/src/components/secret-value-field/secret-value-field.svelte +10 -6
- package/src/components/segmented-control/segmented-control.css +22 -1
- package/src/components/segmented-control/segmented-control.examples.json +2 -2
- package/src/components/select/select.css +9 -2
- package/src/components/select/select.svelte +6 -1
- package/src/components/selection-popover/selection-popover.examples.json +1 -1
- package/src/components/share-card/share-card.css +15 -4
- package/src/components/share-card/share-card.svelte +2 -4
- package/src/components/sheet/sheet.svelte +30 -145
- package/src/components/shortcut-hint/shortcut-hint.svelte +1 -1
- package/src/components/side-navigation/side-navigation.examples.json +1 -1
- package/src/components/sidebar/README.md +6 -2
- package/src/components/sidebar/sidebar.examples.json +1 -1
- package/src/components/sidebar/sidebar.svelte +4 -4
- package/src/components/sidebar/sidebar.types.ts +1 -1
- package/src/components/slider/slider.css +14 -9
- package/src/components/slider/slider.svelte +33 -2
- package/src/components/sortable-list/README.md +18 -1
- package/src/components/sortable-list/sortable-list.css +1 -1
- package/src/components/sortable-list/sortable-list.examples.json +13 -0
- package/src/components/spectrogram/spectrogram.examples.json +1 -0
- package/src/components/spectrogram/spectrogram.svelte +7 -19
- package/src/components/spectrum-chart/spectrum-chart.svelte +8 -20
- package/src/components/speed-dial/speed-dial.css +3 -3
- package/src/components/speed-dial/speed-dial.examples.json +1 -1
- package/src/components/speed-dial/speed-dial.svelte +2 -2
- package/src/components/speed-dial-action/speed-dial-action.svelte +1 -1
- package/src/components/stacked-list-item/stacked-list-item.examples.json +1 -1
- package/src/components/stat/README.md +1 -1
- package/src/components/stat/stat.svelte +7 -2
- package/src/components/stat/stat.types.ts +2 -2
- package/src/components/stat-group/stat-group.css +1 -1
- package/src/components/status-dot/README.md +9 -7
- package/src/components/status-dot/index.ts +6 -1
- package/src/components/status-dot/status-dot.css +45 -1
- package/src/components/status-dot/status-dot.examples.json +1 -1
- package/src/components/status-dot/status-dot.svelte +57 -8
- package/src/components/status-dot/status-dot.types.ts +17 -6
- package/src/components/steps/steps.css +3 -3
- package/src/components/table/table.css +10 -0
- package/src/components/table/table.examples.json +1 -1
- package/src/components/table/table.svelte +2 -2
- package/src/components/table/table.types.ts +3 -3
- package/src/components/table-header/README.md +2 -2
- package/src/components/table-header/table-header.svelte +5 -5
- package/src/components/table-header/table-header.types.ts +2 -2
- package/src/components/table-header-cell/table-header-cell.svelte +13 -2
- package/src/components/table-row/README.md +2 -2
- package/src/components/table-row/table-row.svelte +6 -6
- package/src/components/table-row/table-row.types.ts +6 -6
- package/src/components/tabs/README.md +1 -0
- package/src/components/tabs/tabs.svelte +11 -3
- package/src/components/tabs/tabs.types.ts +2 -0
- package/src/components/textarea/textarea.css +16 -1
- package/src/components/textarea/textarea.svelte +6 -1
- package/src/components/time-field/README.md +60 -0
- package/src/components/time-field/index.ts +6 -0
- package/src/components/time-field/time-field.css +60 -0
- package/src/components/time-field/time-field.examples.json +13 -0
- package/src/components/time-field/time-field.svelte +277 -0
- package/src/components/time-field/time-field.types.ts +70 -0
- package/src/components/toggle/README.md +12 -11
- package/src/components/toggle/toggle.svelte +19 -6
- package/src/components/toggle/toggle.types.ts +2 -0
- package/src/components/transfer-list/README.md +1 -1
- package/src/components/transfer-list/transfer-list.css +22 -0
- package/src/components/transfer-list/transfer-list.svelte +44 -10
- package/src/components/transfer-list/transfer-list.types.ts +5 -2
- package/src/components/tree/README.md +2 -2
- package/src/components/tree/tree.css +69 -0
- package/src/components/tree/tree.examples.json +1 -1
- package/src/components/tree/tree.svelte +52 -9
- package/src/components/tree/tree.types.ts +2 -2
- package/src/components/tree-item/README.md +4 -4
- package/src/components/tree-item/tree-item.svelte +42 -12
- package/src/components/tree-item/tree-item.types.ts +4 -4
- package/src/components/virtual-list/virtual-list.svelte +5 -5
- package/src/components/waveform/waveform.svelte +7 -19
- package/src/index.ts +40 -16
- package/src/styles/components/_field-label.css +20 -0
- package/src/styles/components/_input-frame.css +2 -1
- package/src/styles/components.css +3 -2
- package/src/styles/index.css +1 -0
- package/src/styles/tokens-base.css +3 -0
- package/src/utilities/attachments.ts +15 -12
- package/src/utilities/value-change.ts +11 -0
- package/dist/components/connection-indicator/connection-indicator.css +0 -63
- package/dist/components/connection-indicator/connection-indicator.svelte.d.ts +0 -18
- package/dist/components/connection-indicator/connection-indicator.types.d.ts +0 -14
- package/dist/components/connection-indicator/index.d.ts +0 -5
- package/dist/components/connection-indicator/index.js +0 -75
- package/dist/components/experimental/connection-indicator/index.d.ts +0 -2
- package/dist/components/review-editor/review-editor-types.d.ts +0 -77
- package/dist/components/subscription-badge/index.d.ts +0 -5
- package/dist/components/subscription-badge/index.js +0 -353
- package/dist/components/subscription-badge/subscription-badge.css +0 -18
- package/dist/components/subscription-badge/subscription-badge.schema.js +0 -47
- package/dist/components/subscription-badge/subscription-badge.svelte.d.ts +0 -19
- package/dist/components/subscription-badge/subscription-badge.types.d.ts +0 -28
- package/dist/server/components/connection-indicator/connection-indicator.schema.js +0 -31
- package/dist/server/components/connection-indicator/connection-indicator.variables.js +0 -12
- package/dist/server/components/connection-indicator/index.css +0 -60
- package/dist/server/components/connection-indicator/index.js +0 -42
- package/dist/server/components/experimental/connection-indicator/index.js +0 -23
- package/dist/server/components/subscription-badge/index.css +0 -2
- package/dist/server/components/subscription-badge/index.js +0 -308
- package/dist/server/components/subscription-badge/subscription-badge.schema.js +0 -28
- package/dist/server/components/subscription-badge/subscription-badge.variables.js +0 -12
- package/src/components/connection-indicator/README.md +0 -41
- package/src/components/connection-indicator/connection-indicator.css +0 -63
- package/src/components/connection-indicator/connection-indicator.svelte +0 -44
- package/src/components/connection-indicator/connection-indicator.types.ts +0 -18
- package/src/components/connection-indicator/index.ts +0 -6
- package/src/components/experimental/connection-indicator/index.ts +0 -20
- package/src/components/review-editor/review-editor-types.ts +0 -92
- package/src/components/subscription-badge/README.md +0 -50
- package/src/components/subscription-badge/index.ts +0 -6
- package/src/components/subscription-badge/subscription-badge.css +0 -18
- package/src/components/subscription-badge/subscription-badge.examples.json +0 -19
- package/src/components/subscription-badge/subscription-badge.svelte +0 -69
- package/src/components/subscription-badge/subscription-badge.types.ts +0 -37
- /package/dist/components/{connection-indicator/connection-indicator.schema.d.ts → approval-card/approval-card.schema.d.ts} +0 -0
- /package/dist/components/{connection-indicator/connection-indicator.variables.d.ts → approval-card/approval-card.variables.d.ts} +0 -0
- /package/dist/components/{subscription-badge/subscription-badge.schema.d.ts → locale-provider/locale-provider.schema.d.ts} +0 -0
- /package/dist/components/{subscription-badge/subscription-badge.variables.d.ts → locale-provider/locale-provider.variables.d.ts} +0 -0
|
@@ -29,12 +29,8 @@
|
|
|
29
29
|
|
|
30
30
|
import { createAnchoredOverlay } from '../../_internal/anchored-overlay.svelte.ts';
|
|
31
31
|
import { classNames } from '../../utilities/class-names.ts';
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
setCommandListContext,
|
|
35
|
-
type CommandItemRegistrationInput,
|
|
36
|
-
type CommandListContext,
|
|
37
|
-
} from '../_internal/command-list-context.ts';
|
|
32
|
+
import { setCommandListContext } from '../_internal/command-list-context.ts';
|
|
33
|
+
import { createCommandListState } from '../_internal/create-command-list-state.svelte.ts';
|
|
38
34
|
import { createPortalAttachment } from '../portal/index.ts';
|
|
39
35
|
|
|
40
36
|
const listboxId = $props.id();
|
|
@@ -55,7 +51,6 @@
|
|
|
55
51
|
class: className,
|
|
56
52
|
}: CommandMenuProps = $props();
|
|
57
53
|
|
|
58
|
-
type RegistrationRecord = CommandItemRegistrationInput & { id: string; node: HTMLElement };
|
|
59
54
|
const portalAttachment = createPortalAttachment({
|
|
60
55
|
target: () => document.body,
|
|
61
56
|
inheritAttributes: true,
|
|
@@ -64,19 +59,11 @@
|
|
|
64
59
|
|
|
65
60
|
let mounted = $state(false);
|
|
66
61
|
let listElement: HTMLElement | undefined = $state();
|
|
67
|
-
|
|
68
|
-
let activeItemId = $state<string | null>(null);
|
|
69
|
-
let itemCounter = 0;
|
|
70
|
-
let registrationsReady = $state(false);
|
|
71
|
-
let readyCycle = 0;
|
|
62
|
+
const commandList = createCommandListState(listboxId);
|
|
72
63
|
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
.map((registration) => registration.id);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
const showEmpty = $derived(mounted && open && registrationsReady && registrations.length === 0);
|
|
64
|
+
const showEmpty = $derived(
|
|
65
|
+
mounted && open && commandList.registrationsReady && commandList.registrations.length === 0,
|
|
66
|
+
);
|
|
80
67
|
const caretAnchor = $derived.by<VirtualElement | null>(() => {
|
|
81
68
|
const anchorElement = anchor;
|
|
82
69
|
const currentCaretIndex = caretIndex;
|
|
@@ -104,76 +91,34 @@
|
|
|
104
91
|
});
|
|
105
92
|
|
|
106
93
|
$effect(() => {
|
|
107
|
-
const ids = enabledIds;
|
|
108
94
|
if (!open) {
|
|
109
|
-
|
|
95
|
+
commandList.resetActiveItem();
|
|
110
96
|
return;
|
|
111
97
|
}
|
|
112
|
-
if (activeItemId !== null && ids.includes(activeItemId)) return;
|
|
113
|
-
activeItemId = ids[0] ?? null;
|
|
114
98
|
});
|
|
115
99
|
|
|
116
100
|
$effect(() => {
|
|
117
101
|
void query;
|
|
118
|
-
|
|
119
|
-
const cycle = ++readyCycle;
|
|
120
|
-
queueMicrotask(() => {
|
|
121
|
-
if (cycle === readyCycle) registrationsReady = true;
|
|
122
|
-
});
|
|
102
|
+
commandList.refreshRegistrationsReady();
|
|
123
103
|
});
|
|
124
104
|
|
|
125
105
|
$effect(() => {
|
|
126
|
-
onstatechange?.({ listboxId, activeItemId: open ? activeItemId : null });
|
|
106
|
+
onstatechange?.({ listboxId, activeItemId: open ? commandList.activeItemId : null });
|
|
127
107
|
});
|
|
128
108
|
|
|
129
109
|
$effect(() => {
|
|
130
|
-
|
|
131
|
-
document.getElementById(activeItemId)?.scrollIntoView({ block: 'nearest' });
|
|
110
|
+
commandList.scrollActiveItemIntoView();
|
|
132
111
|
});
|
|
133
112
|
|
|
134
113
|
function activateItemById(id: string) {
|
|
135
|
-
const record =
|
|
136
|
-
if (!record
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
// first call, an item's own onselect is silently dropped on activation.
|
|
140
|
-
record.getOnselect()();
|
|
114
|
+
const record = commandList.activateItemById(id);
|
|
115
|
+
if (!record) return;
|
|
116
|
+
// The command list activates the item callback first; the menu-level
|
|
117
|
+
// `onselect` prop then receives the committed value and query.
|
|
141
118
|
onselect?.({ value: record.getValue(), query });
|
|
142
119
|
}
|
|
143
120
|
|
|
144
|
-
|
|
145
|
-
get listboxId() {
|
|
146
|
-
return listboxId;
|
|
147
|
-
},
|
|
148
|
-
get activeItemId() {
|
|
149
|
-
return activeItemId;
|
|
150
|
-
},
|
|
151
|
-
register(input: CommandItemRegistrationInput, node: HTMLElement) {
|
|
152
|
-
const id = `${listboxId}-item-${++itemCounter}`;
|
|
153
|
-
registrations = [
|
|
154
|
-
...registrations,
|
|
155
|
-
{
|
|
156
|
-
id,
|
|
157
|
-
node,
|
|
158
|
-
getValue: input.getValue,
|
|
159
|
-
getOnselect: input.getOnselect,
|
|
160
|
-
getDisabled: input.getDisabled,
|
|
161
|
-
},
|
|
162
|
-
];
|
|
163
|
-
return {
|
|
164
|
-
id,
|
|
165
|
-
unregister: () => {
|
|
166
|
-
registrations = registrations.filter((registration) => registration.id !== id);
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
|
-
},
|
|
170
|
-
setActiveById(id: string) {
|
|
171
|
-
activeItemId = id;
|
|
172
|
-
},
|
|
173
|
-
activateItemById,
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
setCommandListContext(context);
|
|
121
|
+
setCommandListContext(commandList.createContext(activateItemById));
|
|
177
122
|
|
|
178
123
|
function dismiss() {
|
|
179
124
|
if (!open) return;
|
|
@@ -183,38 +128,12 @@
|
|
|
183
128
|
|
|
184
129
|
function handleKeydown(event: KeyboardEvent) {
|
|
185
130
|
if (!open) return;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (ids.length === 0) return;
|
|
193
|
-
const index = activeItemId === null ? -1 : ids.indexOf(activeItemId);
|
|
194
|
-
activeItemId = ids[(index + 1) % ids.length] ?? null;
|
|
195
|
-
} else if (event.key === 'ArrowUp') {
|
|
196
|
-
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
|
|
197
|
-
event.preventDefault();
|
|
198
|
-
if (ids.length === 0) return;
|
|
199
|
-
const index = activeItemId === null ? 0 : ids.indexOf(activeItemId);
|
|
200
|
-
activeItemId = ids[index <= 0 ? ids.length - 1 : index - 1] ?? null;
|
|
201
|
-
} else if (event.key === 'Home') {
|
|
202
|
-
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
|
|
203
|
-
event.preventDefault();
|
|
204
|
-
activeItemId = ids[0] ?? null;
|
|
205
|
-
} else if (event.key === 'End') {
|
|
206
|
-
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
|
|
207
|
-
event.preventDefault();
|
|
208
|
-
activeItemId = ids[ids.length - 1] ?? null;
|
|
209
|
-
} else if (event.key === 'Enter' && activeItemId !== null) {
|
|
210
|
-
event.preventDefault();
|
|
211
|
-
event.stopPropagation();
|
|
212
|
-
activateItemById(activeItemId);
|
|
213
|
-
} else if (event.key === 'Escape') {
|
|
214
|
-
event.preventDefault();
|
|
215
|
-
event.stopPropagation();
|
|
216
|
-
dismiss();
|
|
217
|
-
}
|
|
131
|
+
commandList.handleKeydown({
|
|
132
|
+
event,
|
|
133
|
+
onEnter: activateItemById,
|
|
134
|
+
onEscape: dismiss,
|
|
135
|
+
ignoreModifiedNavigation: true,
|
|
136
|
+
});
|
|
218
137
|
}
|
|
219
138
|
|
|
220
139
|
function handleDocumentPointerdown(event: PointerEvent) {
|
|
@@ -34,18 +34,18 @@ Command items register with the palette by DOM node, so grouped results can use
|
|
|
34
34
|
|
|
35
35
|
<!-- generated:props:start -->
|
|
36
36
|
|
|
37
|
-
| Prop | Type | Required | Default | Description
|
|
38
|
-
| ------------- | ---------- | -------- | ------- |
|
|
39
|
-
| `class` | `string` | no | — | Class merged onto the palette panel.
|
|
40
|
-
| `label` | `string` | no | — | Accessible name for the dialog, wired via `aria-label`.
|
|
41
|
-
| `open` | `boolean` | yes | — | Bindable open state. The component mutates `open = false` on Escape, backdrop click, or any explicit close path, then fires `onclose`.
|
|
42
|
-
| `placeholder` | `string` | no | — | Placeholder rendered inside the search input.
|
|
43
|
-
| `query` | `string` | no | — | Bindable search query. Mutated by the input's oninput handler. Exposed to the items snippet so consumers can filter.
|
|
44
|
-
| `empty` | `(opaque)` | no | — | Rendered when zero items are registered after filtering. Not expressible in JSON Schema; see the component types for the signature.
|
|
45
|
-
| `footer` | `(opaque)` | no | — | Optional footer, e.g. for keybinding hints. Not part of the listbox. Not expressible in JSON Schema; see the component types for the signature.
|
|
46
|
-
| `items` | `(opaque)` | yes | — | Receives the current query so consumers can filter. Not expressible in JSON Schema; see the component types for the signature.
|
|
47
|
-
| `onclose` | `(opaque)` | no | — | Fired after any close path routed through the palette close lifecycle. Not expressible in JSON Schema; see the component types for the signature.
|
|
48
|
-
| `triggerRef` | `(opaque)` | no | — | Element to restore focus to on close. Falls back to `captureFocus()`. Not expressible in JSON Schema; see the component types for the signature.
|
|
37
|
+
| Prop | Type | Required | Default | Description |
|
|
38
|
+
| ------------- | ---------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
39
|
+
| `class` | `string` | no | — | Class merged onto the palette panel. |
|
|
40
|
+
| `label` | `string` | no | — | Accessible name for the dialog, wired via `aria-label`. |
|
|
41
|
+
| `open` | `boolean` | yes | — | Bindable open state. The component mutates `open = false` on Escape, backdrop click, or any explicit close path, then fires `onclose`. |
|
|
42
|
+
| `placeholder` | `string` | no | — | Placeholder rendered inside the search input. |
|
|
43
|
+
| `query` | `string` | no | — | Bindable search query. Mutated by the input's oninput handler. Exposed to the items snippet so consumers can filter. Reset to an empty string each time the palette opens. |
|
|
44
|
+
| `empty` | `(opaque)` | no | — | Rendered when zero items are registered after filtering. Not expressible in JSON Schema; see the component types for the signature. |
|
|
45
|
+
| `footer` | `(opaque)` | no | — | Optional footer, e.g. for keybinding hints. Not part of the listbox. Not expressible in JSON Schema; see the component types for the signature. |
|
|
46
|
+
| `items` | `(opaque)` | yes | — | Receives the current query so consumers can filter. Not expressible in JSON Schema; see the component types for the signature. |
|
|
47
|
+
| `onclose` | `(opaque)` | no | — | Fired after any close path routed through the palette close lifecycle. Not expressible in JSON Schema; see the component types for the signature. |
|
|
48
|
+
| `triggerRef` | `(opaque)` | no | — | Element to restore focus to on close. Falls back to `captureFocus()`. Not expressible in JSON Schema; see the component types for the signature. |
|
|
49
49
|
|
|
50
50
|
<!-- generated:props:end -->
|
|
51
51
|
|
|
@@ -7,19 +7,19 @@
|
|
|
7
7
|
"id": "basic",
|
|
8
8
|
"title": "Basic command palette",
|
|
9
9
|
"description": "A minimal palette with three items opened by a button.",
|
|
10
|
-
"code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const commands = [\n { value: 'new-file', label: 'New file' },\n { value: 'open-settings', label: 'Open settings' },\n { value: 'sign-out', label: 'Sign out' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Basic palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredCommands = commands.filter((command) =>\n command.label.toLowerCase().includes(query.toLowerCase()),\n )}\n {#each filteredCommands as command (command.value)}\n <CommandItem
|
|
10
|
+
"code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const commands = [\n { value: 'new-file', label: 'New file' },\n { value: 'open-settings', label: 'Open settings' },\n { value: 'sign-out', label: 'Sign out' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Basic palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredCommands = commands.filter((command) =>\n command.label.toLowerCase().includes(query.toLowerCase()),\n )}\n {#each filteredCommands as command (command.value)}\n <CommandItem\n value={command.value}\n accessibleLabel={command.label}\n onselect={() => select(command.label)}\n >\n {command.label}\n </CommandItem>\n {/each}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"id": "grouped",
|
|
14
14
|
"title": "Grouped command palette",
|
|
15
15
|
"description": "Command items grouped with named listbox sections.",
|
|
16
|
-
"code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const recentItems = [\n { id: 'roadmap', label: 'Roadmap' },\n { id: 'release-notes', label: 'Release notes' },\n ];\n\n const actions = [\n { id: 'new-project', label: 'New project', description: 'Create a workspace project.' },\n { id: 'invite-teammate', label: 'Invite teammate', description: 'Add a collaborator.' },\n { id: 'open-settings', label: 'Open settings', description: 'Manage preferences.' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n function matchesQuery(label: string, query: string): boolean {\n return label.toLowerCase().includes(query.toLowerCase());\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"margin: 0; color: var(--cinder-text-muted); font-size: var(--cinder-text-sm);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Grouped command palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredRecentItems = recentItems.filter((item) => matchesQuery(item.label, query))}\n {@const filteredActions = actions.filter((action) => matchesQuery(action.label, query))}\n\n {#if filteredRecentItems.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span class=\"cinder-command-group__label\">Recent files</span>\n <ul role=\"group\" aria-
|
|
16
|
+
"code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const recentItems = [\n { id: 'roadmap', label: 'Roadmap' },\n { id: 'release-notes', label: 'Release notes' },\n ];\n\n const actions = [\n { id: 'new-project', label: 'New project', description: 'Create a workspace project.' },\n { id: 'invite-teammate', label: 'Invite teammate', description: 'Add a collaborator.' },\n { id: 'open-settings', label: 'Open settings', description: 'Manage preferences.' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n function matchesQuery(label: string, query: string): boolean {\n return label.toLowerCase().includes(query.toLowerCase());\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"margin: 0; color: var(--cinder-text-muted); font-size: var(--cinder-text-sm);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Grouped command palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredRecentItems = recentItems.filter((item) => matchesQuery(item.label, query))}\n {@const filteredActions = actions.filter((action) => matchesQuery(action.label, query))}\n\n {#if filteredRecentItems.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span id=\"recent-files-heading\" class=\"cinder-command-group__label\">Recent files</span>\n <ul role=\"group\" aria-labelledby=\"recent-files-heading\">\n {#each filteredRecentItems as item (item.id)}\n <CommandItem\n value={item.id}\n accessibleLabel={item.label}\n onselect={() => select(item.label)}\n >\n {item.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n\n {#if filteredActions.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span id=\"actions-heading\" class=\"cinder-command-group__label\">Actions</span>\n <ul role=\"group\" aria-labelledby=\"actions-heading\">\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n accessibleLabel={action.label}\n onselect={() => select(action.label)}\n >\n {action.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"id": "search-recent-actions",
|
|
20
20
|
"title": "Search, recent, and keyed actions",
|
|
21
21
|
"description": "Cmd+K opens the palette. Three sections: filtered search results, recent items, and keyed actions separated by visual group headers.",
|
|
22
|
-
"code": "<script lang=\"ts\">\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n // ── State ──────────────────────────────────────────────────────────────\n let open = $state(false);\n let query = $state('');\n let lastSelected = $state('');\n let triggerRef: HTMLElement | null = $state(null);\n\n // ── Data ──────────────────────────────────────────────────────────────\n const allPages = [\n { id: 'dashboard', label: 'Dashboard', description: 'View product and team metrics.' },\n { id: 'settings', label: 'Settings', description: 'Manage workspace preferences.' },\n { id: 'billing', label: 'Billing', description: 'Review invoices and payment methods.' },\n { id: 'team', label: 'Team members', description: 'Invite or remove collaborators.' },\n { id: 'api-keys', label: 'API keys', description: 'Create and rotate access tokens.' },\n { id: 'integrations', label: 'Integrations', description: 'Connect external services.' },\n ];\n\n const recentItems = [\n { id: 'recent-dashboard', label: 'Dashboard' },\n { id: 'recent-billing', label: 'Billing' },\n ];\n\n const actions = [\n {\n id: 'action-new-project',\n label: 'New project',\n description: 'Create a blank project for a new body of work.',\n icon: '+',\n kbd: '⌘N',\n },\n {\n id: 'action-invite',\n label: 'Invite teammate',\n description: 'Send an invitation to join this workspace.',\n icon: '@',\n kbd: '⌘I',\n },\n {\n id: 'action-sign-out',\n label: 'Sign out',\n description: 'End this browser session.',\n icon: '↪',\n kbd: '',\n },\n ];\n\n // ── Filtering ──────────────────────────────────────────────────────────\n const filteredPages = $derived(\n query ? allPages.filter((p) => p.label.toLowerCase().includes(query.toLowerCase())) : [],\n );\n\n const filteredActions = $derived(\n query ? actions.filter((a) => a.label.toLowerCase().includes(query.toLowerCase())) : actions,\n );\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n // ── Cmd+K / Ctrl+K listener ────────────────────────────────────────────\n function handleGlobalKeydown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n event.preventDefault();\n open = true;\n }\n }\n</script>\n\n<svelte:window onkeydown={handleGlobalKeydown} />\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <button\n bind:this={triggerRef}\n type=\"button\"\n onclick={() => (open = true)}\n style=\"\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--cinder-border);\n border-radius: var(--cinder-radius-md);\n background: var(--cinder-surface);\n color: var(--cinder-text-muted);\n font-size: 0.875rem;\n cursor: pointer;\n \"\n >\n Search…\n <kbd style=\"font-size: 0.75rem; opacity: 0.7;\">⌘K</kbd>\n </button>\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open bind:query label=\"Command palette\" {triggerRef}>\n {#snippet items({ query: paletteQuery })}\n {@const headerBase =\n 'font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--cinder-text-muted); pointer-events: none;'}\n {@const headerFirst = 'padding: 0.625rem 1.25rem 0.375rem;'}\n {@const headerWithDivider =\n 'padding: 0.625rem 1.25rem 0.375rem 1.25rem; padding-block-start: 0.625rem; margin-block-start: 0.25rem; border-block-start: 1px solid var(--cinder-border);'}\n {@const showPages = filteredPages.length > 0}\n {@const showRecent = !paletteQuery}\n {@const showActions = filteredActions.length > 0}\n <!--\n Search results section — only shown while typing.\n `paletteQuery` comes from the snippet parameter and mirrors CommandPalette's query.\n using the snippet parameter keeps the pattern explicit for consumers.\n -->\n {#if showPages}\n <li role=\"none\" style=\"{headerBase} {headerFirst}\">Pages</li>\n {#each filteredPages as page (page.id)}\n <CommandItem\n value={page.id}\n description={page.description}\n onselect={() => select(page.label)}\n >\n {page.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Recent section — shown only when query is empty.\n Uses `role=\"none\"` for the group label (purely visual; children remain in the AT).\n -->\n {#if showRecent}\n <li role=\"none\" style=\"{headerBase} {showPages ? headerWithDivider : headerFirst}\">Recent</li>\n {#each recentItems as item (item.id)}\n <CommandItem
|
|
22
|
+
"code": "<script lang=\"ts\">\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n // ── State ──────────────────────────────────────────────────────────────\n let open = $state(false);\n let query = $state('');\n let lastSelected = $state('');\n let triggerRef: HTMLElement | null = $state(null);\n\n // ── Data ──────────────────────────────────────────────────────────────\n const allPages = [\n { id: 'dashboard', label: 'Dashboard', description: 'View product and team metrics.' },\n { id: 'settings', label: 'Settings', description: 'Manage workspace preferences.' },\n { id: 'billing', label: 'Billing', description: 'Review invoices and payment methods.' },\n { id: 'team', label: 'Team members', description: 'Invite or remove collaborators.' },\n { id: 'api-keys', label: 'API keys', description: 'Create and rotate access tokens.' },\n { id: 'integrations', label: 'Integrations', description: 'Connect external services.' },\n ];\n\n const recentItems = [\n { id: 'recent-dashboard', label: 'Dashboard' },\n { id: 'recent-billing', label: 'Billing' },\n ];\n\n const actions = [\n {\n id: 'action-new-project',\n label: 'New project',\n description: 'Create a blank project for a new body of work.',\n icon: '+',\n kbd: '⌘N',\n },\n {\n id: 'action-invite',\n label: 'Invite teammate',\n description: 'Send an invitation to join this workspace.',\n icon: '@',\n kbd: '⌘I',\n },\n {\n id: 'action-sign-out',\n label: 'Sign out',\n description: 'End this browser session.',\n icon: '↪',\n kbd: '',\n },\n ];\n\n // ── Filtering ──────────────────────────────────────────────────────────\n const filteredPages = $derived(\n query ? allPages.filter((p) => p.label.toLowerCase().includes(query.toLowerCase())) : [],\n );\n\n const filteredActions = $derived(\n query ? actions.filter((a) => a.label.toLowerCase().includes(query.toLowerCase())) : actions,\n );\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n // ── Cmd+K / Ctrl+K listener ────────────────────────────────────────────\n function handleGlobalKeydown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n event.preventDefault();\n open = true;\n }\n }\n</script>\n\n<svelte:window onkeydown={handleGlobalKeydown} />\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <button\n bind:this={triggerRef}\n type=\"button\"\n onclick={() => (open = true)}\n style=\"\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--cinder-border);\n border-radius: var(--cinder-radius-md);\n background: var(--cinder-surface);\n color: var(--cinder-text-muted);\n font-size: 0.875rem;\n cursor: pointer;\n \"\n >\n Search…\n <kbd style=\"font-size: 0.75rem; opacity: 0.7;\">⌘K</kbd>\n </button>\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open bind:query label=\"Command palette\" {triggerRef}>\n {#snippet items({ query: paletteQuery })}\n {@const headerBase =\n 'font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--cinder-text-muted); pointer-events: none;'}\n {@const headerFirst = 'padding: 0.625rem 1.25rem 0.375rem;'}\n {@const headerWithDivider =\n 'padding: 0.625rem 1.25rem 0.375rem 1.25rem; padding-block-start: 0.625rem; margin-block-start: 0.25rem; border-block-start: 1px solid var(--cinder-border);'}\n {@const showPages = filteredPages.length > 0}\n {@const showRecent = !paletteQuery}\n {@const showActions = filteredActions.length > 0}\n <!--\n Search results section — only shown while typing.\n `paletteQuery` comes from the snippet parameter and mirrors CommandPalette's query.\n using the snippet parameter keeps the pattern explicit for consumers.\n -->\n {#if showPages}\n <li role=\"none\" style=\"{headerBase} {headerFirst}\">Pages</li>\n {#each filteredPages as page (page.id)}\n <CommandItem\n value={page.id}\n description={page.description}\n accessibleLabel={page.label}\n onselect={() => select(page.label)}\n >\n {page.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Recent section — shown only when query is empty.\n Uses `role=\"none\"` for the group label (purely visual; children remain in the AT).\n -->\n {#if showRecent}\n <li role=\"none\" style=\"{headerBase} {showPages ? headerWithDivider : headerFirst}\">Recent</li>\n {#each recentItems as item (item.id)}\n <CommandItem\n value={item.id}\n accessibleLabel={item.label}\n onselect={() => select(item.label)}\n >\n {item.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Actions section — always visible (filtered when typing).\n -->\n {#if showActions}\n <li\n role=\"none\"\n style=\"{headerBase} {showPages || showRecent ? headerWithDivider : headerFirst}\"\n >\n Actions\n </li>\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n accessibleLabel={action.label}\n keyboardShortcut={action.kbd === '⌘N'\n ? 'Meta+N'\n : action.kbd === '⌘I'\n ? 'Meta+I'\n : undefined}\n onselect={() => select(action.label)}\n >\n {#snippet leading()}\n <span style=\"font-size: 0.875rem; font-weight: 700; line-height: 1;\">{action.icon}</span\n >\n {/snippet}\n {action.label}\n {#snippet trailing()}\n {#if action.kbd}\n <kbd>{action.kbd}</kbd>\n {/if}\n {/snippet}\n </CommandItem>\n {/each}\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No results for \"<strong>{query}</strong>\".\n {/snippet}\n\n {#snippet footer()}\n <span>\n <kbd>↑↓</kbd> navigate <kbd>↵</kbd> select <kbd>Esc</kbd> close\n </span>\n {/snippet}\n</CommandPalette>\n"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -21,13 +21,9 @@
|
|
|
21
21
|
|
|
22
22
|
import { captureFocus, pushEscapeHandler } from '../../_internal/overlay.ts';
|
|
23
23
|
import { classNames } from '../../utilities/class-names.ts';
|
|
24
|
-
import { inDocumentOrder } from '../../utilities/document-order.ts';
|
|
25
24
|
import { restoreFocusTo } from '../../utilities/focus.ts';
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
type CommandItemRegistrationInput,
|
|
29
|
-
type CommandListContext,
|
|
30
|
-
} from '../_internal/command-list-context.ts';
|
|
25
|
+
import { setCommandListContext } from '../_internal/command-list-context.ts';
|
|
26
|
+
import { createCommandListState } from '../_internal/create-command-list-state.svelte.ts';
|
|
31
27
|
|
|
32
28
|
let {
|
|
33
29
|
open = $bindable(false),
|
|
@@ -62,58 +58,12 @@
|
|
|
62
58
|
// ── Focus capture ─────────────────────────────────────────────────────────
|
|
63
59
|
let capturedFocus: HTMLElement | null = null;
|
|
64
60
|
|
|
65
|
-
|
|
66
|
-
type RegistrationRecord = CommandItemRegistrationInput & { id: string; node: HTMLElement };
|
|
67
|
-
let registrations = $state<RegistrationRecord[]>([]);
|
|
68
|
-
|
|
69
|
-
// Stable incrementing counter for item ids within this palette instance.
|
|
70
|
-
let itemCounter = 0;
|
|
71
|
-
|
|
72
|
-
// ── Active item (virtual focus) ───────────────────────────────────────────
|
|
73
|
-
// `intendedActiveId` is the user's last navigation/hover intent. The resolved
|
|
74
|
-
// `activeItemId` clamps that intent to the currently-enabled set, so it is a
|
|
75
|
-
// pure function of intent + enabledIds rather than a value repaired one tick
|
|
76
|
-
// late inside an $effect. Keyboard/hover handlers write intent; everything
|
|
77
|
-
// downstream reads the resolved derived.
|
|
78
|
-
let intendedActiveId = $state<string | null>(null);
|
|
79
|
-
|
|
80
|
-
// Ordered list of non-disabled item ids. Derived so arrow-key navigation
|
|
81
|
-
// always walks the current set, including after prop changes (e.g. toggling
|
|
82
|
-
// disabled on a mounted item).
|
|
83
|
-
const enabledIds = $derived.by(() => {
|
|
84
|
-
return inDocumentOrder(registrations)
|
|
85
|
-
.filter((r) => !r.getDisabled())
|
|
86
|
-
.map((r) => r.id);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// Resolved active id: preserve the user's intent if it's still in the enabled
|
|
90
|
-
// set, otherwise fall back to the first enabled item (or null). This collapses
|
|
91
|
-
// the previous read-then-write $effect into a single synchronous derivation.
|
|
92
|
-
const activeItemId = $derived(
|
|
93
|
-
intendedActiveId !== null && enabledIds.includes(intendedActiveId)
|
|
94
|
-
? intendedActiveId
|
|
95
|
-
: (enabledIds[0] ?? null),
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
// ── Empty-state flash prevention ─────────────────────────────────────────
|
|
99
|
-
// `registrationsReady` prevents the empty snippet from flashing on initial
|
|
100
|
-
// open or when a query change causes a full key-swap of items. It is set
|
|
101
|
-
// true after one microtask (giving children's $effect registrations time to
|
|
102
|
-
// settle), and reset on every query change.
|
|
103
|
-
//
|
|
104
|
-
// A cycle counter guards against stale microtasks: if the query changes
|
|
105
|
-
// twice in quick succession, only the most recent microtask sets ready=true.
|
|
106
|
-
let registrationsReady = $state(false);
|
|
107
|
-
let readyCycle = 0;
|
|
61
|
+
const commandList = createCommandListState(listboxId);
|
|
108
62
|
|
|
109
63
|
$effect(() => {
|
|
110
64
|
// Track query so this re-runs on every query change.
|
|
111
65
|
void query;
|
|
112
|
-
|
|
113
|
-
const cycle = ++readyCycle;
|
|
114
|
-
queueMicrotask(() => {
|
|
115
|
-
if (cycle === readyCycle) registrationsReady = true;
|
|
116
|
-
});
|
|
66
|
+
commandList.refreshRegistrationsReady();
|
|
117
67
|
});
|
|
118
68
|
|
|
119
69
|
// ── Escape stack ──────────────────────────────────────────────────────────
|
|
@@ -155,6 +105,8 @@
|
|
|
155
105
|
$effect(() => {
|
|
156
106
|
if (!dialogElement) return;
|
|
157
107
|
if (open && !dialogElement.open) {
|
|
108
|
+
query = '';
|
|
109
|
+
commandList.resetActiveItem();
|
|
158
110
|
capturedFocus = captureFocus();
|
|
159
111
|
dialogElement.showModal();
|
|
160
112
|
inputElement?.focus();
|
|
@@ -193,40 +145,11 @@
|
|
|
193
145
|
|
|
194
146
|
// ── Keyboard routing ──────────────────────────────────────────────────────
|
|
195
147
|
function handleKeydown(event: KeyboardEvent) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
if (activeItemId === null) {
|
|
202
|
-
const firstId = ids[0];
|
|
203
|
-
if (firstId !== undefined) intendedActiveId = firstId;
|
|
204
|
-
} else {
|
|
205
|
-
const index = ids.indexOf(activeItemId);
|
|
206
|
-
const nextId = ids[(index + 1) % ids.length];
|
|
207
|
-
if (nextId !== undefined) intendedActiveId = nextId;
|
|
208
|
-
}
|
|
209
|
-
} else if (event.key === 'ArrowUp') {
|
|
210
|
-
event.preventDefault();
|
|
211
|
-
if (ids.length === 0) return;
|
|
212
|
-
if (activeItemId === null) {
|
|
213
|
-
const lastId = ids[ids.length - 1];
|
|
214
|
-
if (lastId !== undefined) intendedActiveId = lastId;
|
|
215
|
-
} else {
|
|
216
|
-
const index = ids.indexOf(activeItemId);
|
|
217
|
-
const previousId = ids[index <= 0 ? ids.length - 1 : index - 1];
|
|
218
|
-
if (previousId !== undefined) intendedActiveId = previousId;
|
|
219
|
-
}
|
|
220
|
-
} else if (event.key === 'Home') {
|
|
221
|
-
event.preventDefault();
|
|
222
|
-
intendedActiveId = ids[0] ?? null;
|
|
223
|
-
} else if (event.key === 'End') {
|
|
224
|
-
event.preventDefault();
|
|
225
|
-
intendedActiveId = ids[ids.length - 1] ?? null;
|
|
226
|
-
} else if (event.key === 'Enter') {
|
|
227
|
-
event.preventDefault();
|
|
228
|
-
if (activeItemId !== null) context.activateItemById(activeItemId);
|
|
229
|
-
}
|
|
148
|
+
commandList.handleKeydown({
|
|
149
|
+
event,
|
|
150
|
+
onEnter: (id) => commandList.activateItemById(id),
|
|
151
|
+
preventDefaultOnEmptyEnter: true,
|
|
152
|
+
});
|
|
230
153
|
}
|
|
231
154
|
|
|
232
155
|
function handleInput(event: Event) {
|
|
@@ -235,55 +158,15 @@
|
|
|
235
158
|
}
|
|
236
159
|
|
|
237
160
|
$effect(() => {
|
|
238
|
-
|
|
239
|
-
// Use the node captured at registration time rather than
|
|
240
|
-
// document.getElementById, which assumes globally-unique ids and breaks in
|
|
241
|
-
// shadow DOM, iframes, or multi-instance scenarios.
|
|
242
|
-
const record = registrations.find((r) => r.id === activeItemId);
|
|
243
|
-
record?.node.scrollIntoView({ block: 'nearest' });
|
|
161
|
+
commandList.scrollActiveItemIntoView();
|
|
244
162
|
});
|
|
245
163
|
|
|
246
164
|
// ── Context ───────────────────────────────────────────────────────────────
|
|
247
|
-
|
|
248
|
-
get listboxId() {
|
|
249
|
-
return listboxId;
|
|
250
|
-
},
|
|
251
|
-
get activeItemId() {
|
|
252
|
-
return activeItemId;
|
|
253
|
-
},
|
|
254
|
-
register(input: CommandItemRegistrationInput, node: HTMLElement) {
|
|
255
|
-
const id = `${listboxId}-item-${++itemCounter}`;
|
|
256
|
-
// Mutate in place: $state wraps the array in a deep reactive proxy that
|
|
257
|
-
// tracks push/splice, so we avoid allocating a fresh array per register.
|
|
258
|
-
registrations.push({
|
|
259
|
-
id,
|
|
260
|
-
node,
|
|
261
|
-
getValue: input.getValue,
|
|
262
|
-
getOnselect: input.getOnselect,
|
|
263
|
-
getDisabled: input.getDisabled,
|
|
264
|
-
});
|
|
265
|
-
return {
|
|
266
|
-
id,
|
|
267
|
-
unregister: () => {
|
|
268
|
-
const index = registrations.findIndex((r) => r.id === id);
|
|
269
|
-
if (index !== -1) registrations.splice(index, 1);
|
|
270
|
-
},
|
|
271
|
-
};
|
|
272
|
-
},
|
|
273
|
-
setActiveById(id: string) {
|
|
274
|
-
intendedActiveId = id;
|
|
275
|
-
},
|
|
276
|
-
activateItemById(id: string) {
|
|
277
|
-
const record = registrations.find((r) => r.id === id);
|
|
278
|
-
if (record && !record.getDisabled()) {
|
|
279
|
-
record.getOnselect()();
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
setCommandListContext(context);
|
|
165
|
+
setCommandListContext(commandList.createContext());
|
|
285
166
|
|
|
286
|
-
const showEmpty = $derived(
|
|
167
|
+
const showEmpty = $derived(
|
|
168
|
+
mounted && commandList.registrationsReady && commandList.registrations.length === 0,
|
|
169
|
+
);
|
|
287
170
|
</script>
|
|
288
171
|
|
|
289
172
|
{#if mounted || open}
|
|
@@ -327,7 +210,7 @@
|
|
|
327
210
|
aria-autocomplete="list"
|
|
328
211
|
aria-expanded="true"
|
|
329
212
|
aria-controls={listboxId}
|
|
330
|
-
aria-activedescendant={activeItemId ?? undefined}
|
|
213
|
+
aria-activedescendant={commandList.activeItemId ?? undefined}
|
|
331
214
|
oninput={handleInput}
|
|
332
215
|
onkeydown={handleKeydown}
|
|
333
216
|
/>
|
|
@@ -12,8 +12,7 @@ export type CommandPaletteProps = {
|
|
|
12
12
|
/**
|
|
13
13
|
* Bindable search query. Mutated by the input's oninput handler.
|
|
14
14
|
* Exposed to the items snippet so consumers can filter.
|
|
15
|
-
*
|
|
16
|
-
* each open should reset it in their `onclose` callback.
|
|
15
|
+
* Reset to an empty string each time the palette opens.
|
|
17
16
|
*/
|
|
18
17
|
query?: string;
|
|
19
18
|
/** Fired after any close path routed through the palette close lifecycle. */
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { createContext } from 'svelte';
|
|
2
|
+
import type { TextDirection } from '../../_internal/locale-context.ts';
|
|
2
3
|
|
|
3
4
|
export type ContextMenuContext = {
|
|
4
5
|
get disabled(): boolean;
|
|
5
6
|
get isOpen(): boolean;
|
|
6
7
|
get longPressDelay(): number;
|
|
8
|
+
get direction(): TextDirection | undefined;
|
|
7
9
|
openAt: (x: number, y: number) => void;
|
|
8
10
|
close: () => void;
|
|
9
11
|
};
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
import type { ContextMenuProps } from './context-menu.types.ts';
|
|
20
20
|
import type { VirtualElement } from '@floating-ui/dom';
|
|
21
21
|
import { createAnchoredOverlay } from '../../_internal/anchored-overlay.svelte.ts';
|
|
22
|
+
import { getLocaleContext } from '../../_internal/locale-context.ts';
|
|
22
23
|
import { captureFocus } from '../../_internal/overlay.ts';
|
|
24
|
+
import { observeTextDirection, resolveTextDirection } from '../../_internal/text-direction.ts';
|
|
23
25
|
import { classNames } from '../../utilities/class-names.ts';
|
|
24
26
|
import { restoreFocusTo } from '../../utilities/focus.ts';
|
|
25
27
|
import { createClickOutside } from '../../utilities/attachments.ts';
|
|
@@ -47,7 +49,9 @@
|
|
|
47
49
|
let capturedFocus: HTMLElement | null = null;
|
|
48
50
|
let requestedX = $state(0);
|
|
49
51
|
let requestedY = $state(0);
|
|
52
|
+
let directionRevision = $state(0);
|
|
50
53
|
let previouslyOpen = false;
|
|
54
|
+
const localeContext = getLocaleContext();
|
|
51
55
|
|
|
52
56
|
function setOpen(nextOpen: boolean) {
|
|
53
57
|
if (open === nextOpen) return;
|
|
@@ -103,12 +107,22 @@
|
|
|
103
107
|
const virtualReference: VirtualElement | null = $derived(
|
|
104
108
|
open ? makeVirtualReference(anchorPoint?.x ?? requestedX, anchorPoint?.y ?? requestedY) : null,
|
|
105
109
|
);
|
|
110
|
+
const resolvedDirection = $derived.by(() => {
|
|
111
|
+
directionRevision;
|
|
112
|
+
return resolveTextDirection(triggerElement, localeContext?.direction);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
$effect(() => {
|
|
116
|
+
return observeTextDirection(triggerElement, () => {
|
|
117
|
+
directionRevision += 1;
|
|
118
|
+
});
|
|
119
|
+
});
|
|
106
120
|
|
|
107
121
|
const anchoredOverlay = createAnchoredOverlay({
|
|
108
122
|
open: () => open,
|
|
109
123
|
anchor: () => virtualReference,
|
|
110
124
|
panel: () => menuElement,
|
|
111
|
-
placement: () => 'right-start',
|
|
125
|
+
placement: () => (resolvedDirection === 'rtl' ? 'left-start' : 'right-start'),
|
|
112
126
|
offset: () => 0,
|
|
113
127
|
widthMode: () => 'menu',
|
|
114
128
|
});
|
|
@@ -133,6 +147,18 @@
|
|
|
133
147
|
get supportsPopover() {
|
|
134
148
|
return false;
|
|
135
149
|
},
|
|
150
|
+
get anchorElement() {
|
|
151
|
+
return triggerElement;
|
|
152
|
+
},
|
|
153
|
+
get fallbackAnchorElement() {
|
|
154
|
+
return null;
|
|
155
|
+
},
|
|
156
|
+
get fallbackPositionStyle() {
|
|
157
|
+
return anchoredOverlay.positionStyle;
|
|
158
|
+
},
|
|
159
|
+
get fallbackPositionReady() {
|
|
160
|
+
return anchoredOverlay.positionReady;
|
|
161
|
+
},
|
|
136
162
|
get initialFocus() {
|
|
137
163
|
return 'first' as const;
|
|
138
164
|
},
|
|
@@ -152,6 +178,9 @@
|
|
|
152
178
|
get longPressDelay() {
|
|
153
179
|
return longPressDelay;
|
|
154
180
|
},
|
|
181
|
+
get direction() {
|
|
182
|
+
return resolvedDirection;
|
|
183
|
+
},
|
|
155
184
|
openAt,
|
|
156
185
|
close,
|
|
157
186
|
});
|
|
@@ -161,17 +190,14 @@
|
|
|
161
190
|
const x = anchorPoint?.x ?? requestedX;
|
|
162
191
|
const y = anchorPoint?.y ?? requestedY;
|
|
163
192
|
const menu = menuElement;
|
|
164
|
-
if (anchoredOverlay.positionStyle) {
|
|
165
|
-
menu.setAttribute('style', anchoredOverlay.positionStyle);
|
|
166
|
-
} else {
|
|
167
|
-
menu.removeAttribute('style');
|
|
168
|
-
}
|
|
169
|
-
menu.setAttribute('data-cinder-position-ready', String(anchoredOverlay.positionReady));
|
|
170
193
|
menu.setAttribute('data-cinder-requested-x', String(x));
|
|
171
194
|
menu.setAttribute('data-cinder-requested-y', String(y));
|
|
195
|
+
const ownsDirection = menu.dataset['cinderExplicitDirection'] !== 'true';
|
|
196
|
+
if (ownsDirection && resolvedDirection) {
|
|
197
|
+
menu.setAttribute('dir', resolvedDirection);
|
|
198
|
+
}
|
|
172
199
|
return () => {
|
|
173
|
-
menu.removeAttribute('
|
|
174
|
-
menu.removeAttribute('data-cinder-position-ready');
|
|
200
|
+
if (ownsDirection) menu.removeAttribute('dir');
|
|
175
201
|
menu.removeAttribute('data-cinder-requested-x');
|
|
176
202
|
menu.removeAttribute('data-cinder-requested-y');
|
|
177
203
|
};
|