@flanksource/clicky-ui 0.3.15 → 0.3.17
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/NOTICE.md +10 -0
- package/dist/ai.cjs +33 -4
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +31 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +6 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +7 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +92 -170
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -111
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +95 -173
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxActions.cjs +70 -0
- package/dist/components/ComboboxActions.cjs.map +1 -0
- package/dist/components/ComboboxActions.d.ts +8 -0
- package/dist/components/ComboboxActions.d.ts.map +1 -0
- package/dist/components/ComboboxActions.js +70 -0
- package/dist/components/ComboboxActions.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +160 -0
- package/dist/components/ComboboxMenu.cjs.map +1 -0
- package/dist/components/ComboboxMenu.d.ts +22 -0
- package/dist/components/ComboboxMenu.d.ts.map +1 -0
- package/dist/components/ComboboxMenu.js +160 -0
- package/dist/components/ComboboxMenu.js.map +1 -0
- package/dist/components/EndpointSelector.cjs +407 -0
- package/dist/components/EndpointSelector.cjs.map +1 -0
- package/dist/components/EndpointSelector.d.ts +3 -0
- package/dist/components/EndpointSelector.d.ts.map +1 -0
- package/dist/components/EndpointSelector.js +407 -0
- package/dist/components/EndpointSelector.js.map +1 -0
- package/dist/components/EndpointSelector.model.d.ts +52 -0
- package/dist/components/EndpointSelector.model.d.ts.map +1 -0
- package/dist/components/FilterBar.cjs +12 -0
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +4 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +12 -0
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/InputField.cjs +11 -12
- package/dist/components/InputField.cjs.map +1 -1
- package/dist/components/InputField.d.ts +7 -0
- package/dist/components/InputField.d.ts.map +1 -1
- package/dist/components/InputField.js +12 -13
- package/dist/components/InputField.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -16
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +22 -16
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +3 -3
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +3 -3
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +150 -77
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +151 -78
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/WorkloadPicker.cjs +2 -1
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +6 -1
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +2 -1
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/combobox-types.d.ts +107 -0
- package/dist/components/combobox-types.d.ts.map +1 -0
- package/dist/components/combobox-utils.cjs +21 -0
- package/dist/components/combobox-utils.cjs.map +1 -0
- package/dist/components/combobox-utils.d.ts +15 -0
- package/dist/components/combobox-utils.d.ts.map +1 -0
- package/dist/components/combobox-utils.js +21 -0
- package/dist/components/combobox-utils.js.map +1 -0
- package/dist/components/endpoint-port.cjs +12 -0
- package/dist/components/endpoint-port.cjs.map +1 -0
- package/dist/components/endpoint-port.d.ts +4 -0
- package/dist/components/endpoint-port.d.ts.map +1 -0
- package/dist/components/endpoint-port.js +12 -0
- package/dist/components/endpoint-port.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +12 -23
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +12 -23
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +6 -2
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -1
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -1
- package/dist/components/json-schema-form-discriminator.js +6 -2
- package/dist/components/json-schema-form-discriminator.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +50 -0
- package/dist/components/json-schema-form-error-display.cjs.map +1 -0
- package/dist/components/json-schema-form-error-display.d.ts +12 -0
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -0
- package/dist/components/json-schema-form-error-display.js +50 -0
- package/dist/components/json-schema-form-error-display.js.map +1 -0
- package/dist/components/json-schema-form-error-types.d.ts +26 -0
- package/dist/components/json-schema-form-error-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +169 -0
- package/dist/components/json-schema-form-errors.cjs.map +1 -0
- package/dist/components/json-schema-form-errors.d.ts +14 -0
- package/dist/components/json-schema-form-errors.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.js +169 -0
- package/dist/components/json-schema-form-errors.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +12 -2
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +12 -2
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +84 -19
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +84 -19
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +33 -10
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +34 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +16 -4
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +17 -5
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -3
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +13 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +8 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +15 -2
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +205 -14
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +41 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +21 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -0
- package/dist/data/DataTable.grouping.d.ts +26 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -0
- package/dist/data/DataTable.grouping.js +21 -0
- package/dist/data/DataTable.grouping.js.map +1 -0
- package/dist/data/DataTable.js +205 -14
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Markdown.cjs +45 -1
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +3 -2
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +45 -1
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +4 -3
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.d.ts +6 -2
- package/dist/data/MarkdownEditor.d.ts.map +1 -1
- package/dist/data/MarkdownEditor.js +4 -3
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ServerTimingBadge.cjs +64 -0
- package/dist/data/ServerTimingBadge.cjs.map +1 -0
- package/dist/data/ServerTimingBadge.d.ts +9 -0
- package/dist/data/ServerTimingBadge.d.ts.map +1 -0
- package/dist/data/ServerTimingBadge.js +64 -0
- package/dist/data/ServerTimingBadge.js.map +1 -0
- package/dist/data/StatStrip.cjs +99 -0
- package/dist/data/StatStrip.cjs.map +1 -0
- package/dist/data/StatStrip.d.ts +41 -0
- package/dist/data/StatStrip.d.ts.map +1 -0
- package/dist/data/StatStrip.js +99 -0
- package/dist/data/StatStrip.js.map +1 -0
- package/dist/data/TaskManager.cjs +20 -1
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +3 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +20 -1
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +49 -0
- package/dist/data/TaskManagerButton.cjs.map +1 -0
- package/dist/data/TaskManagerButton.d.ts +8 -0
- package/dist/data/TaskManagerButton.d.ts.map +1 -0
- package/dist/data/TaskManagerButton.js +49 -0
- package/dist/data/TaskManagerButton.js.map +1 -0
- package/dist/data/TaskProcessDetails.cjs +113 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -0
- package/dist/data/TaskProcessDetails.d.ts +6 -0
- package/dist/data/TaskProcessDetails.d.ts.map +1 -0
- package/dist/data/TaskProcessDetails.js +113 -0
- package/dist/data/TaskProcessDetails.js.map +1 -0
- package/dist/data/TaskProgress.cjs +106 -19
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +4 -2
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +107 -20
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +43 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Tree.cjs +91 -82
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +91 -82
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +3 -0
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts +2 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +3 -0
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +18 -141
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +2 -40
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +15 -138
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.models.cjs +11 -0
- package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.models.d.ts +3 -0
- package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.models.js +11 -0
- package/dist/data/ai/ChatWindow.models.js.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.js +57 -0
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.js +14 -0
- package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +68 -0
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
- package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread.js +68 -0
- package/dist/data/ai/ChatWindow.thread.js.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
- package/dist/data/ai/ChatWindow.types.d.ts +41 -0
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
- package/dist/data/ai/ContextBadges.cjs +76 -46
- package/dist/data/ai/ContextBadges.cjs.map +1 -1
- package/dist/data/ai/ContextBadges.d.ts.map +1 -1
- package/dist/data/ai/ContextBadges.js +77 -47
- package/dist/data/ai/ContextBadges.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
- package/dist/data/ai/PromptPicker/index.d.ts +2 -1
- package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.cjs +7 -0
- package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/types.d.ts +18 -2
- package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.js +7 -0
- package/dist/data/ai/PromptPicker/types.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +171 -91
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +9 -9
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +175 -95
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.js +47 -0
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
- package/dist/data/ai/RuntimeBar.cjs +408 -0
- package/dist/data/ai/RuntimeBar.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.d.ts +20 -0
- package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.js +408 -0
- package/dist/data/ai/RuntimeBar.js.map +1 -0
- package/dist/data/ai/RuntimeBar.model.cjs +14 -0
- package/dist/data/ai/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.model.d.ts +10 -0
- package/dist/data/ai/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.model.js +14 -0
- package/dist/data/ai/RuntimeBar.model.js.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.cjs +359 -0
- package/dist/data/ai/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts +22 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.js +359 -0
- package/dist/data/ai/RuntimeBarCombo.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +56 -0
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
- package/dist/data/ai/SessionChatComposer.d.ts +24 -0
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
- package/dist/data/ai/SessionChatComposer.js +56 -0
- package/dist/data/ai/SessionChatComposer.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +222 -382
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.cjs +377 -0
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +377 -0
- package/dist/data/ai/SessionInspector.collection.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +9 -4
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +162 -0
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.files.d.ts +5 -0
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.files.js +162 -0
- package/dist/data/ai/SessionInspector.files.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
- package/dist/data/ai/SessionInspector.js +224 -384
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +125 -0
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.model.d.ts +14 -0
- package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.model.js +125 -0
- package/dist/data/ai/SessionInspector.model.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +265 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panels.js +265 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -0
- package/dist/data/ai/SessionInspector.plan.cjs +77 -0
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.plan.js +77 -0
- package/dist/data/ai/SessionInspector.plan.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +182 -0
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.summary.js +182 -0
- package/dist/data/ai/SessionInspector.summary.js.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.js +94 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
- package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
- package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +86 -121
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +8 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +118 -0
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.header.d.ts +11 -0
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.header.js +118 -0
- package/dist/data/ai/SessionViewer.header.js.map +1 -0
- package/dist/data/ai/SessionViewer.js +87 -122
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +111 -39
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +6 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +111 -39
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
- package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.js +15 -0
- package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
- package/dist/data/ai/SessionViewer.rows.cjs +37 -424
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +31 -418
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.js +65 -0
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.js +404 -0
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts +11 -2
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +2 -0
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +2 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +2 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/agent-action-icons.cjs +7 -10
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.d.ts +1 -2
- package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
- package/dist/data/ai/agent-action-icons.js +8 -11
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +4 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/claude.cjs +252 -0
- package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude.js +252 -0
- package/dist/data/ai/examples/sessions/claude.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex.cjs +236 -0
- package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex.js +236 -0
- package/dist/data/ai/examples/sessions/codex.js.map +1 -0
- package/dist/data/ai/examples/sessions/index.cjs +21 -0
- package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/index.d.ts +10 -0
- package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/index.js +21 -0
- package/dist/data/ai/examples/sessions/index.js.map +1 -0
- package/dist/data/ai/index.d.ts +9 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.cjs +12 -1
- package/dist/data/ai/model-capabilities.cjs.map +1 -1
- package/dist/data/ai/model-capabilities.d.ts +2 -6
- package/dist/data/ai/model-capabilities.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.js +12 -1
- package/dist/data/ai/model-capabilities.js.map +1 -1
- package/dist/data/ai/runtime-mode.cjs +72 -1
- package/dist/data/ai/runtime-mode.cjs.map +1 -1
- package/dist/data/ai/runtime-mode.d.ts +28 -0
- package/dist/data/ai/runtime-mode.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.js +73 -2
- package/dist/data/ai/runtime-mode.js.map +1 -1
- package/dist/data/cells/EntityCell.cjs +64 -0
- package/dist/data/cells/EntityCell.cjs.map +1 -0
- package/dist/data/cells/EntityCell.d.ts +27 -0
- package/dist/data/cells/EntityCell.d.ts.map +1 -0
- package/dist/data/cells/EntityCell.js +64 -0
- package/dist/data/cells/EntityCell.js.map +1 -0
- package/dist/data/chat/Attachment.cjs +53 -13
- package/dist/data/chat/Attachment.cjs.map +1 -1
- package/dist/data/chat/Attachment.d.ts +9 -3
- package/dist/data/chat/Attachment.d.ts.map +1 -1
- package/dist/data/chat/Attachment.js +54 -14
- package/dist/data/chat/Attachment.js.map +1 -1
- package/dist/data/chat/Chat.cjs +113 -36
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +11 -4
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +111 -34
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +240 -66
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +11 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +241 -67
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +55 -3
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +5 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +55 -3
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/ModelSelector.cjs +8 -10
- package/dist/data/chat/ModelSelector.cjs.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts.map +1 -1
- package/dist/data/chat/ModelSelector.js +9 -11
- package/dist/data/chat/ModelSelector.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +56 -5
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +10 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +57 -6
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/approval.cjs +21 -0
- package/dist/data/chat/approval.cjs.map +1 -0
- package/dist/data/chat/approval.d.ts +11 -0
- package/dist/data/chat/approval.d.ts.map +1 -0
- package/dist/data/chat/approval.js +21 -0
- package/dist/data/chat/approval.js.map +1 -0
- package/dist/data/chat/attachment-upload.cjs +33 -0
- package/dist/data/chat/attachment-upload.cjs.map +1 -0
- package/dist/data/chat/attachment-upload.d.ts +21 -0
- package/dist/data/chat/attachment-upload.d.ts.map +1 -0
- package/dist/data/chat/attachment-upload.js +33 -0
- package/dist/data/chat/attachment-upload.js.map +1 -0
- package/dist/data/chat/effort-icons.cjs +36 -6
- package/dist/data/chat/effort-icons.cjs.map +1 -1
- package/dist/data/chat/effort-icons.d.ts +6 -3
- package/dist/data/chat/effort-icons.d.ts.map +1 -1
- package/dist/data/chat/effort-icons.js +37 -7
- package/dist/data/chat/effort-icons.js.map +1 -1
- package/dist/data/chat/index.d.ts +3 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/models.cjs +8 -0
- package/dist/data/chat/models.cjs.map +1 -0
- package/dist/data/chat/models.d.ts +11 -0
- package/dist/data/chat/models.d.ts.map +1 -0
- package/dist/data/chat/models.js +8 -0
- package/dist/data/chat/models.js.map +1 -0
- package/dist/data/chat/provider-icons.cjs +49 -16
- package/dist/data/chat/provider-icons.cjs.map +1 -1
- package/dist/data/chat/provider-icons.d.ts +2 -0
- package/dist/data/chat/provider-icons.d.ts.map +1 -1
- package/dist/data/chat/provider-icons.js +50 -17
- package/dist/data/chat/provider-icons.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +21 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/examples/markdown-preview-mock.cjs +45 -0
- package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
- package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
- package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
- package/dist/data/examples/markdown-preview-mock.js +45 -0
- package/dist/data/examples/markdown-preview-mock.js.map +1 -0
- package/dist/data/examples/markdown-syntax.cjs +36 -0
- package/dist/data/examples/markdown-syntax.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.d.ts +12 -0
- package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
- package/dist/data/examples/markdown-syntax.js +36 -0
- package/dist/data/examples/markdown-syntax.js.map +1 -0
- package/dist/data/examples/markdown-syntax.md.cjs +4 -0
- package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.md.js +5 -0
- package/dist/data/examples/markdown-syntax.md.js.map +1 -0
- package/dist/data/server-timing.cjs +120 -0
- package/dist/data/server-timing.cjs.map +1 -0
- package/dist/data/server-timing.d.ts +11 -0
- package/dist/data/server-timing.d.ts.map +1 -0
- package/dist/data/server-timing.js +120 -0
- package/dist/data/server-timing.js.map +1 -0
- package/dist/data/task-process-details.cjs +48 -0
- package/dist/data/task-process-details.cjs.map +1 -0
- package/dist/data/task-process-details.d.ts +5 -0
- package/dist/data/task-process-details.d.ts.map +1 -0
- package/dist/data/task-process-details.js +48 -0
- package/dist/data/task-process-details.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +37 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +37 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +98 -0
- package/dist/hooks/use-hotkey.cjs.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +42 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.js +98 -0
- package/dist/hooks/use-hotkey.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +23 -1
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +23 -1
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/components/UiBank.cjs +15 -0
- package/dist/icons/components/UiBank.cjs.map +1 -0
- package/dist/icons/components/UiBank.d.ts +15 -0
- package/dist/icons/components/UiBank.d.ts.map +1 -0
- package/dist/icons/components/UiBank.js +15 -0
- package/dist/icons/components/UiBank.js.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
- package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.js +15 -0
- package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
- package/dist/icons/components/UiCloudUpload.cjs +15 -0
- package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
- package/dist/icons/components/UiCloudUpload.d.ts +15 -0
- package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
- package/dist/icons/components/UiCloudUpload.js +15 -0
- package/dist/icons/components/UiCloudUpload.js.map +1 -0
- package/dist/icons/components/UiLedger.cjs +15 -0
- package/dist/icons/components/UiLedger.cjs.map +1 -0
- package/dist/icons/components/UiLedger.d.ts +15 -0
- package/dist/icons/components/UiLedger.d.ts.map +1 -0
- package/dist/icons/components/UiLedger.js +15 -0
- package/dist/icons/components/UiLedger.js.map +1 -0
- package/dist/icons/components/UiReceipt.cjs +15 -0
- package/dist/icons/components/UiReceipt.cjs.map +1 -0
- package/dist/icons/components/UiReceipt.d.ts +15 -0
- package/dist/icons/components/UiReceipt.d.ts.map +1 -0
- package/dist/icons/components/UiReceipt.js +15 -0
- package/dist/icons/components/UiReceipt.js.map +1 -0
- package/dist/icons/index.d.ts +10 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons.cjs +15 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +54 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +270 -238
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +9 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.debug.cjs +53 -0
- package/dist/layout/AppShell.debug.cjs.map +1 -0
- package/dist/layout/AppShell.debug.d.ts +6 -0
- package/dist/layout/AppShell.debug.d.ts.map +1 -0
- package/dist/layout/AppShell.debug.js +53 -0
- package/dist/layout/AppShell.debug.js.map +1 -0
- package/dist/layout/AppShell.js +269 -237
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +90 -0
- package/dist/layout/AppShell.nav.cjs.map +1 -0
- package/dist/layout/AppShell.nav.d.ts +7 -0
- package/dist/layout/AppShell.nav.d.ts.map +1 -0
- package/dist/layout/AppShell.nav.js +90 -0
- package/dist/layout/AppShell.nav.js.map +1 -0
- package/dist/layout/AppSidebar.cjs +35 -5
- package/dist/layout/AppSidebar.cjs.map +1 -1
- package/dist/layout/AppSidebar.d.ts +4 -1
- package/dist/layout/AppSidebar.d.ts.map +1 -1
- package/dist/layout/AppSidebar.js +35 -5
- package/dist/layout/AppSidebar.js.map +1 -1
- package/dist/layout/Panel.cjs +25 -41
- package/dist/layout/Panel.cjs.map +1 -1
- package/dist/layout/Panel.d.ts +2 -1
- package/dist/layout/Panel.d.ts.map +1 -1
- package/dist/layout/Panel.js +26 -42
- package/dist/layout/Panel.js.map +1 -1
- package/dist/layout/PanelFrame.cjs +56 -0
- package/dist/layout/PanelFrame.cjs.map +1 -0
- package/dist/layout/PanelFrame.d.ts +15 -0
- package/dist/layout/PanelFrame.d.ts.map +1 -0
- package/dist/layout/PanelFrame.js +56 -0
- package/dist/layout/PanelFrame.js.map +1 -0
- package/dist/layout/Section.cjs +51 -41
- package/dist/layout/Section.cjs.map +1 -1
- package/dist/layout/Section.d.ts +3 -2
- package/dist/layout/Section.d.ts.map +1 -1
- package/dist/layout/Section.js +51 -41
- package/dist/layout/Section.js.map +1 -1
- package/dist/layout/content-width.cjs +8 -0
- package/dist/layout/content-width.cjs.map +1 -0
- package/dist/layout/content-width.d.ts +3 -0
- package/dist/layout/content-width.d.ts.map +1 -0
- package/dist/layout/content-width.js +8 -0
- package/dist/layout/content-width.js.map +1 -0
- package/dist/overlay/CommandPalette.cjs +207 -0
- package/dist/overlay/CommandPalette.cjs.map +1 -0
- package/dist/overlay/CommandPalette.d.ts +71 -0
- package/dist/overlay/CommandPalette.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.js +207 -0
- package/dist/overlay/CommandPalette.js.map +1 -0
- package/dist/overlay/CommandPalette.model.cjs +70 -0
- package/dist/overlay/CommandPalette.model.cjs.map +1 -0
- package/dist/overlay/CommandPalette.model.d.ts +71 -0
- package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.model.js +70 -0
- package/dist/overlay/CommandPalette.model.js.map +1 -0
- package/dist/overlay/CommandPaletteList.cjs +88 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -0
- package/dist/overlay/CommandPaletteList.d.ts +23 -0
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteList.js +88 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
- package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.js +36 -0
- package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts +2 -2
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Modal.cjs +12 -5
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +12 -5
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.js +1 -1
- package/dist/overlay/zIndex.cjs +2 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.js +2 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +6 -0
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +6 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +45 -71
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +12 -2
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +46 -72
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +42 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +2 -1
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +42 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +2 -1
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +2 -1
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +15 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +15 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState, useRef, useCallback, useMemo, useEffect } from "react";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { Icon } from "../data/Icon.js";
|
|
6
|
+
import { useHotkey } from "../hooks/use-hotkey.js";
|
|
7
|
+
import { useEscapeLayer, useModalStack } from "./modalStack.js";
|
|
8
|
+
import { zIndex } from "./zIndex.js";
|
|
9
|
+
import { CommandPaletteList } from "./CommandPaletteList.js";
|
|
10
|
+
import { filterCommandGroups, defaultCommandFilter, flattenCommands, firstEnabledIndex, lastEnabledIndex, nextEnabledIndex } from "./CommandPalette.model.js";
|
|
11
|
+
import { UiSearch } from "../icons/components/UiSearch.js";
|
|
12
|
+
const SIZE_CLASS = {
|
|
13
|
+
md: "max-w-[40rem]",
|
|
14
|
+
lg: "max-w-[48rem]"
|
|
15
|
+
};
|
|
16
|
+
function CommandPalette({
|
|
17
|
+
open,
|
|
18
|
+
onOpenChange,
|
|
19
|
+
groups,
|
|
20
|
+
query,
|
|
21
|
+
onQueryChange,
|
|
22
|
+
hotkey = "mod+k",
|
|
23
|
+
placeholder = "Type a command or search…",
|
|
24
|
+
loading,
|
|
25
|
+
emptyState,
|
|
26
|
+
footer,
|
|
27
|
+
filter = defaultCommandFilter,
|
|
28
|
+
onSelect,
|
|
29
|
+
closeOnSelect = true,
|
|
30
|
+
resetQueryOnClose = true,
|
|
31
|
+
size = "md",
|
|
32
|
+
topOffset = "12vh",
|
|
33
|
+
listMaxHeight = "min(24rem, 50dvh)",
|
|
34
|
+
ariaLabel = "Command palette",
|
|
35
|
+
className
|
|
36
|
+
}) {
|
|
37
|
+
const baseId = useId();
|
|
38
|
+
const [selfOpen, setSelfOpen] = useState(false);
|
|
39
|
+
const [selfQuery, setSelfQuery] = useState("");
|
|
40
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
41
|
+
const inputRef = useRef(null);
|
|
42
|
+
const listRef = useRef(null);
|
|
43
|
+
const restoreFocusRef = useRef(null);
|
|
44
|
+
const isOpen = open ?? selfOpen;
|
|
45
|
+
const currentQuery = query ?? selfQuery;
|
|
46
|
+
const setOpen = useCallback(
|
|
47
|
+
(next) => {
|
|
48
|
+
if (open === void 0) setSelfOpen(next);
|
|
49
|
+
onOpenChange == null ? void 0 : onOpenChange(next);
|
|
50
|
+
},
|
|
51
|
+
[open, onOpenChange]
|
|
52
|
+
);
|
|
53
|
+
const setQuery = useCallback(
|
|
54
|
+
(next) => {
|
|
55
|
+
if (query === void 0) setSelfQuery(next);
|
|
56
|
+
onQueryChange == null ? void 0 : onQueryChange(next);
|
|
57
|
+
},
|
|
58
|
+
[query, onQueryChange]
|
|
59
|
+
);
|
|
60
|
+
const visibleGroups = useMemo(
|
|
61
|
+
() => filterCommandGroups(groups, currentQuery, filter),
|
|
62
|
+
[groups, currentQuery, filter]
|
|
63
|
+
);
|
|
64
|
+
const items = useMemo(() => flattenCommands(visibleGroups), [visibleGroups]);
|
|
65
|
+
useHotkey(hotkey, () => setOpen(!isOpen), { priority: 10 });
|
|
66
|
+
useEscapeLayer(isOpen, () => setOpen(false));
|
|
67
|
+
const { depth } = useModalStack(isOpen);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
setActiveIndex(firstEnabledIndex(items));
|
|
70
|
+
}, [items]);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
var _a, _b, _c;
|
|
73
|
+
if (!isOpen) {
|
|
74
|
+
if (resetQueryOnClose && query === void 0) setSelfQuery("");
|
|
75
|
+
(_b = (_a = restoreFocusRef.current) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a);
|
|
76
|
+
restoreFocusRef.current = null;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
restoreFocusRef.current = document.activeElement;
|
|
80
|
+
(_c = inputRef.current) == null ? void 0 : _c.focus();
|
|
81
|
+
}, [isOpen, resetQueryOnClose, query]);
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
var _a;
|
|
84
|
+
if (activeIndex < 0) return;
|
|
85
|
+
const option = (_a = listRef.current) == null ? void 0 : _a.querySelectorAll('[role="option"]')[activeIndex];
|
|
86
|
+
if (option instanceof HTMLElement && typeof option.scrollIntoView === "function") {
|
|
87
|
+
option.scrollIntoView({ block: "nearest" });
|
|
88
|
+
}
|
|
89
|
+
}, [activeIndex]);
|
|
90
|
+
const optionId = useCallback((item) => `${baseId}-option-${item.id}`, [baseId]);
|
|
91
|
+
const activate = useCallback(
|
|
92
|
+
(item) => {
|
|
93
|
+
if (item.disabled) return;
|
|
94
|
+
const close = () => setOpen(false);
|
|
95
|
+
const context = { item, query: currentQuery.trim(), close };
|
|
96
|
+
if (item.onSelect) item.onSelect(context);
|
|
97
|
+
else onSelect == null ? void 0 : onSelect(context);
|
|
98
|
+
if (closeOnSelect) close();
|
|
99
|
+
},
|
|
100
|
+
[currentQuery, onSelect, closeOnSelect, setOpen]
|
|
101
|
+
);
|
|
102
|
+
const onKeyDown = (event) => {
|
|
103
|
+
switch (event.key) {
|
|
104
|
+
case "ArrowDown":
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
setActiveIndex((current) => nextEnabledIndex(items, current, 1));
|
|
107
|
+
break;
|
|
108
|
+
case "ArrowUp":
|
|
109
|
+
event.preventDefault();
|
|
110
|
+
setActiveIndex((current) => nextEnabledIndex(items, current, -1));
|
|
111
|
+
break;
|
|
112
|
+
case "Home":
|
|
113
|
+
event.preventDefault();
|
|
114
|
+
setActiveIndex(firstEnabledIndex(items));
|
|
115
|
+
break;
|
|
116
|
+
case "End":
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
setActiveIndex(lastEnabledIndex(items));
|
|
119
|
+
break;
|
|
120
|
+
case "Enter": {
|
|
121
|
+
event.preventDefault();
|
|
122
|
+
const index = activeIndex >= 0 ? activeIndex : firstEnabledIndex(items);
|
|
123
|
+
const item = index >= 0 ? items[index] : void 0;
|
|
124
|
+
if (item) activate(item);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case "Tab":
|
|
128
|
+
if (!footer) event.preventDefault();
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
if (!isOpen || typeof document === "undefined") return null;
|
|
133
|
+
const activeItem = activeIndex >= 0 ? items[activeIndex] : void 0;
|
|
134
|
+
const listId = `${baseId}-list`;
|
|
135
|
+
const overlay = /* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
className: cn(
|
|
139
|
+
"fixed inset-0 flex justify-center p-density-4",
|
|
140
|
+
depth === 0 ? "bg-black/40" : "bg-black/20"
|
|
141
|
+
),
|
|
142
|
+
style: { zIndex: zIndex.modal + depth * zIndex.modalStep },
|
|
143
|
+
role: "presentation",
|
|
144
|
+
onClick: () => setOpen(false),
|
|
145
|
+
children: /* @__PURE__ */ jsxs(
|
|
146
|
+
"div",
|
|
147
|
+
{
|
|
148
|
+
role: "dialog",
|
|
149
|
+
"aria-modal": "true",
|
|
150
|
+
"aria-label": ariaLabel,
|
|
151
|
+
className: cn(
|
|
152
|
+
"flex h-fit w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl",
|
|
153
|
+
SIZE_CLASS[size],
|
|
154
|
+
className
|
|
155
|
+
),
|
|
156
|
+
style: { marginTop: topOffset },
|
|
157
|
+
onClick: (event) => event.stopPropagation(),
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-density-2 border-b border-border px-density-3", children: [
|
|
160
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiSearch, className: "shrink-0 text-muted-foreground" }),
|
|
161
|
+
/* @__PURE__ */ jsx(
|
|
162
|
+
"input",
|
|
163
|
+
{
|
|
164
|
+
ref: inputRef,
|
|
165
|
+
type: "text",
|
|
166
|
+
role: "combobox",
|
|
167
|
+
"aria-expanded": true,
|
|
168
|
+
"aria-controls": listId,
|
|
169
|
+
"aria-autocomplete": "list",
|
|
170
|
+
"aria-activedescendant": activeItem ? optionId(activeItem) : void 0,
|
|
171
|
+
"aria-label": ariaLabel,
|
|
172
|
+
value: currentQuery,
|
|
173
|
+
placeholder,
|
|
174
|
+
onChange: (event) => setQuery(event.target.value),
|
|
175
|
+
onKeyDown,
|
|
176
|
+
className: "h-12 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
] }),
|
|
180
|
+
/* @__PURE__ */ jsx(
|
|
181
|
+
CommandPaletteList,
|
|
182
|
+
{
|
|
183
|
+
groups: visibleGroups,
|
|
184
|
+
items,
|
|
185
|
+
activeIndex,
|
|
186
|
+
listId,
|
|
187
|
+
optionId,
|
|
188
|
+
onActivate: activate,
|
|
189
|
+
onHover: setActiveIndex,
|
|
190
|
+
listRef,
|
|
191
|
+
loading,
|
|
192
|
+
emptyState,
|
|
193
|
+
listMaxHeight
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
footer && /* @__PURE__ */ jsx("div", { className: "border-t border-border px-density-3 py-density-2 text-xs text-muted-foreground", children: footer })
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
return createPortal(overlay, document.body);
|
|
203
|
+
}
|
|
204
|
+
export {
|
|
205
|
+
CommandPalette
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sources":["../../src/overlay/CommandPalette.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\nimport { useHotkey } from \"../hooks/use-hotkey\";\nimport { useEscapeLayer, useModalStack } from \"./modalStack\";\nimport { zIndex } from \"./zIndex\";\nimport { CommandPaletteList } from \"./CommandPaletteList\";\nimport {\n defaultCommandFilter,\n filterCommandGroups,\n firstEnabledIndex,\n flattenCommands,\n lastEnabledIndex,\n nextEnabledIndex,\n type CommandFilter,\n type CommandGroup,\n type CommandItem,\n} from \"./CommandPalette.model\";\n\nexport type {\n CommandFilter,\n CommandGroup,\n CommandItem,\n CommandSelectContext,\n} from \"./CommandPalette.model\";\n\nconst SIZE_CLASS = {\n md: \"max-w-[40rem]\",\n lg: \"max-w-[48rem]\",\n} as const;\n\nexport type CommandPaletteProps = {\n /**\n * Controls visibility. Omit to run uncontrolled — the palette then owns its\n * open state and the built-in hotkey works with no wiring beyond mounting it.\n */\n open?: boolean;\n /** Called with the next open state on hotkey, Escape, backdrop click, and selection. */\n onOpenChange?: (open: boolean) => void;\n /** Command groups, rendered top to bottom in array order. */\n groups: CommandGroup[];\n /** Controlled query. Omit to let the palette own the input. */\n query?: string;\n /** Called with the next query on every keystroke. Required for server-side search. */\n onQueryChange?: (query: string) => void;\n /**\n * Global shortcut that opens (and, while open, closes) the palette, in\n * `useHotkey` syntax — `\"mod+k\"` by default, where `mod` is ⌘ on macOS and\n * Ctrl elsewhere. Pass `null` when an ancestor owns the binding.\n */\n hotkey?: string | null;\n /** Ghost text in the search input. Defaults to \"Type a command or search…\". */\n placeholder?: string;\n /** Shows a loading row instead of the empty state while results are in flight. */\n loading?: boolean;\n /** Replaces the default \"No results\" body. */\n emptyState?: ReactNode;\n /** Non-interactive hint strip pinned below the list. */\n footer?: ReactNode;\n /**\n * How rows are matched. Defaults to a case-insensitive substring match over\n * label, description and keywords, ranked by hit position. Pass `false` when\n * the caller already filtered `groups` server-side.\n */\n filter?: CommandFilter | false;\n /** Fallback handler for items with no own `onSelect`. */\n onSelect?: (context: { item: CommandItem; query: string; close: () => void }) => void;\n /** Close after a successful activation. Defaults to true. */\n closeOnSelect?: boolean;\n /** Clear the query when the palette closes. Defaults to true. */\n resetQueryOnClose?: boolean;\n /** Panel width preset. Defaults to \"md\". */\n size?: \"md\" | \"lg\";\n /** Distance from the viewport top. Defaults to \"12vh\". Applied as an inline style. */\n topOffset?: string | number;\n /** Max height of the scrolling list. Defaults to \"min(24rem, 50dvh)\". Inline style. */\n listMaxHeight?: string | number;\n /** Accessible name for the dialog. Defaults to \"Command palette\". */\n ariaLabel?: string;\n /** Classes applied to the palette panel. */\n className?: string;\n};\n\n/**\n * A ⌘K command palette: a top-anchored overlay with a search field over a\n * grouped, keyboard-navigable command list.\n *\n * It renders its own portal rather than building on `Modal`, which centres its\n * panel, focuses the dialog element instead of an input, forces body padding,\n * and pins an inline max-height — none of which a palette can override. The\n * stacking primitives are shared though (`useModalStack`, `useEscapeLayer`, the\n * `zIndex` scale), so a palette opened over a modal sits above it and Escape\n * still dismisses exactly one layer.\n */\nexport function CommandPalette({\n open,\n onOpenChange,\n groups,\n query,\n onQueryChange,\n hotkey = \"mod+k\",\n placeholder = \"Type a command or search…\",\n loading,\n emptyState,\n footer,\n filter = defaultCommandFilter,\n onSelect,\n closeOnSelect = true,\n resetQueryOnClose = true,\n size = \"md\",\n topOffset = \"12vh\",\n listMaxHeight = \"min(24rem, 50dvh)\",\n ariaLabel = \"Command palette\",\n className,\n}: CommandPaletteProps) {\n const baseId = useId();\n const [selfOpen, setSelfOpen] = useState(false);\n const [selfQuery, setSelfQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n\n const isOpen = open ?? selfOpen;\n const currentQuery = query ?? selfQuery;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (open === undefined) setSelfOpen(next);\n onOpenChange?.(next);\n },\n [open, onOpenChange],\n );\n\n const setQuery = useCallback(\n (next: string) => {\n if (query === undefined) setSelfQuery(next);\n onQueryChange?.(next);\n },\n [query, onQueryChange],\n );\n\n const visibleGroups = useMemo(\n () => filterCommandGroups(groups, currentQuery, filter),\n [groups, currentQuery, filter],\n );\n const items = useMemo(() => flattenCommands(visibleGroups), [visibleGroups]);\n\n // Priority keeps the palette ahead of any page-level ⌘K search field, whose\n // binding would otherwise win purely by mounting later.\n useHotkey(hotkey, () => setOpen(!isOpen), { priority: 10 });\n useEscapeLayer(isOpen, () => setOpen(false));\n\n const { depth } = useModalStack(isOpen);\n\n // Enter-runs-the-top-result is the point of a palette, so the active row\n // resets to the first selectable one whenever the result set changes.\n useEffect(() => {\n setActiveIndex(firstEnabledIndex(items));\n }, [items]);\n\n useEffect(() => {\n if (!isOpen) {\n if (resetQueryOnClose && query === undefined) setSelfQuery(\"\");\n restoreFocusRef.current?.focus?.();\n restoreFocusRef.current = null;\n return;\n }\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n inputRef.current?.focus();\n }, [isOpen, resetQueryOnClose, query]);\n\n // Keep the active row in view without stealing focus from the input.\n useEffect(() => {\n if (activeIndex < 0) return;\n const option = listRef.current?.querySelectorAll('[role=\"option\"]')[activeIndex];\n // jsdom does not implement scrollIntoView; scrolling is a progressive\n // enhancement, so skip it rather than crash a consumer's test run.\n if (option instanceof HTMLElement && typeof option.scrollIntoView === \"function\") {\n option.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n const optionId = useCallback((item: CommandItem) => `${baseId}-option-${item.id}`, [baseId]);\n\n const activate = useCallback(\n (item: CommandItem) => {\n if (item.disabled) return;\n const close = () => setOpen(false);\n const context = { item, query: currentQuery.trim(), close };\n if (item.onSelect) item.onSelect(context);\n else onSelect?.(context);\n if (closeOnSelect) close();\n },\n [currentQuery, onSelect, closeOnSelect, setOpen],\n );\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n setActiveIndex((current) => nextEnabledIndex(items, current, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex((current) => nextEnabledIndex(items, current, -1));\n break;\n case \"Home\":\n event.preventDefault();\n setActiveIndex(firstEnabledIndex(items));\n break;\n case \"End\":\n event.preventDefault();\n setActiveIndex(lastEnabledIndex(items));\n break;\n case \"Enter\": {\n event.preventDefault();\n const index = activeIndex >= 0 ? activeIndex : firstEnabledIndex(items);\n const item = index >= 0 ? items[index] : undefined;\n if (item) activate(item);\n break;\n }\n case \"Tab\":\n // Nothing else in the panel is focusable, and letting Tab escape an\n // aria-modal dialog would strand focus behind the backdrop.\n if (!footer) event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n if (!isOpen || typeof document === \"undefined\") return null;\n\n const activeItem = activeIndex >= 0 ? items[activeIndex] : undefined;\n const listId = `${baseId}-list`;\n\n const overlay = (\n <div\n className={cn(\n \"fixed inset-0 flex justify-center p-density-4\",\n depth === 0 ? \"bg-black/40\" : \"bg-black/20\",\n )}\n style={{ zIndex: zIndex.modal + depth * zIndex.modalStep }}\n role=\"presentation\"\n onClick={() => setOpen(false)}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n className={cn(\n \"flex h-fit w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n SIZE_CLASS[size],\n className,\n )}\n style={{ marginTop: topOffset }}\n onClick={(event) => event.stopPropagation()}\n >\n <div className=\"flex items-center gap-density-2 border-b border-border px-density-3\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n type=\"text\"\n role=\"combobox\"\n aria-expanded\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? optionId(activeItem) : undefined}\n aria-label={ariaLabel}\n value={currentQuery}\n placeholder={placeholder}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={onKeyDown}\n className=\"h-12 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n />\n </div>\n\n <CommandPaletteList\n groups={visibleGroups}\n items={items}\n activeIndex={activeIndex}\n listId={listId}\n optionId={optionId}\n onActivate={activate}\n onHover={setActiveIndex}\n listRef={listRef}\n loading={loading}\n emptyState={emptyState}\n listMaxHeight={listMaxHeight}\n />\n\n {footer && (\n <div className=\"border-t border-border px-density-3 py-density-2 text-xs text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(overlay, document.body);\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA4BA,MAAM,aAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI;AACN;AAiEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ;AACF,GAAwB;AACtB,QAAM,SAAS,MAAA;AACf,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,EAAE;AAC7C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,WAAW,OAAgC,IAAI;AACrD,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,kBAAkB,OAA2B,IAAI;AAEvD,QAAM,SAAS,QAAQ;AACvB,QAAM,eAAe,SAAS;AAE9B,QAAM,UAAU;AAAA,IACd,CAAC,SAAkB;AACjB,UAAI,SAAS,OAAW,aAAY,IAAI;AACxC,mDAAe;AAAA,IACjB;AAAA,IACA,CAAC,MAAM,YAAY;AAAA,EAAA;AAGrB,QAAM,WAAW;AAAA,IACf,CAAC,SAAiB;AAChB,UAAI,UAAU,OAAW,cAAa,IAAI;AAC1C,qDAAgB;AAAA,IAClB;AAAA,IACA,CAAC,OAAO,aAAa;AAAA,EAAA;AAGvB,QAAM,gBAAgB;AAAA,IACpB,MAAM,oBAAoB,QAAQ,cAAc,MAAM;AAAA,IACtD,CAAC,QAAQ,cAAc,MAAM;AAAA,EAAA;AAE/B,QAAM,QAAQ,QAAQ,MAAM,gBAAgB,aAAa,GAAG,CAAC,aAAa,CAAC;AAI3E,YAAU,QAAQ,MAAM,QAAQ,CAAC,MAAM,GAAG,EAAE,UAAU,IAAI;AAC1D,iBAAe,QAAQ,MAAM,QAAQ,KAAK,CAAC;AAE3C,QAAM,EAAE,MAAA,IAAU,cAAc,MAAM;AAItC,YAAU,MAAM;AACd,mBAAe,kBAAkB,KAAK,CAAC;AAAA,EACzC,GAAG,CAAC,KAAK,CAAC;AAEV,YAAU,MAAM;;AACd,QAAI,CAAC,QAAQ;AACX,UAAI,qBAAqB,UAAU,OAAW,cAAa,EAAE;AAC7D,kCAAgB,YAAhB,mBAAyB,UAAzB;AACA,sBAAgB,UAAU;AAC1B;AAAA,IACF;AACA,oBAAgB,UAAU,SAAS;AACnC,mBAAS,YAAT,mBAAkB;AAAA,EACpB,GAAG,CAAC,QAAQ,mBAAmB,KAAK,CAAC;AAGrC,YAAU,MAAM;;AACd,QAAI,cAAc,EAAG;AACrB,UAAM,UAAS,aAAQ,YAAR,mBAAiB,iBAAiB,mBAAmB;AAGpE,QAAI,kBAAkB,eAAe,OAAO,OAAO,mBAAmB,YAAY;AAChF,aAAO,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,WAAW,YAAY,CAAC,SAAsB,GAAG,MAAM,WAAW,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAE3F,QAAM,WAAW;AAAA,IACf,CAAC,SAAsB;AACrB,UAAI,KAAK,SAAU;AACnB,YAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,YAAM,UAAU,EAAE,MAAM,OAAO,aAAa,KAAA,GAAQ,MAAA;AACpD,UAAI,KAAK,SAAU,MAAK,SAAS,OAAO;AAAA,gDACxB;AAChB,UAAI,cAAe,OAAA;AAAA,IACrB;AAAA,IACA,CAAC,cAAc,UAAU,eAAe,OAAO;AAAA,EAAA;AAGjD,QAAM,YAAY,CAAC,UAAiD;AAClE,YAAQ,MAAM,KAAA;AAAA,MACZ,KAAK;AACH,cAAM,eAAA;AACN,uBAAe,CAAC,YAAY,iBAAiB,OAAO,SAAS,CAAC,CAAC;AAC/D;AAAA,MACF,KAAK;AACH,cAAM,eAAA;AACN,uBAAe,CAAC,YAAY,iBAAiB,OAAO,SAAS,EAAE,CAAC;AAChE;AAAA,MACF,KAAK;AACH,cAAM,eAAA;AACN,uBAAe,kBAAkB,KAAK,CAAC;AACvC;AAAA,MACF,KAAK;AACH,cAAM,eAAA;AACN,uBAAe,iBAAiB,KAAK,CAAC;AACtC;AAAA,MACF,KAAK,SAAS;AACZ,cAAM,eAAA;AACN,cAAM,QAAQ,eAAe,IAAI,cAAc,kBAAkB,KAAK;AACtE,cAAM,OAAO,SAAS,IAAI,MAAM,KAAK,IAAI;AACzC,YAAI,eAAe,IAAI;AACvB;AAAA,MACF;AAAA,MACA,KAAK;AAGH,YAAI,CAAC,OAAQ,OAAM,eAAA;AACnB;AAAA,IAEA;AAAA,EAEN;AAEA,MAAI,CAAC,UAAU,OAAO,aAAa,YAAa,QAAO;AAEvD,QAAM,aAAa,eAAe,IAAI,MAAM,WAAW,IAAI;AAC3D,QAAM,SAAS,GAAG,MAAM;AAExB,QAAM,UACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,UAAU,IAAI,gBAAgB;AAAA,MAAA;AAAA,MAEhC,OAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,UAAA;AAAA,MAC/C,MAAK;AAAA,MACL,SAAS,MAAM,QAAQ,KAAK;AAAA,MAE5B,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,cAAY;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA,WAAW,IAAI;AAAA,YACf;AAAA,UAAA;AAAA,UAEF,OAAO,EAAE,WAAW,UAAA;AAAA,UACpB,SAAS,CAAC,UAAU,MAAM,gBAAA;AAAA,UAE1B,UAAA;AAAA,YAAA,qBAAC,OAAA,EAAI,WAAU,uEACb,UAAA;AAAA,cAAA,oBAAC,MAAA,EAAK,MAAM,UAAU,WAAU,kCAAiC;AAAA,cACjE;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,iBAAa;AAAA,kBACb,iBAAe;AAAA,kBACf,qBAAkB;AAAA,kBAClB,yBAAuB,aAAa,SAAS,UAAU,IAAI;AAAA,kBAC3D,cAAY;AAAA,kBACZ,OAAO;AAAA,kBACP;AAAA,kBACA,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,kBAChD;AAAA,kBACA,WAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,YACZ,GACF;AAAA,YAEA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,YAAY;AAAA,gBACZ,SAAS;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,UACC,oBAAC,OAAA,EAAI,WAAU,kFACZ,UAAA,OAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAIJ,SAAO,aAAa,SAAS,SAAS,IAAI;AAC5C;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function defaultCommandFilter(item, query) {
|
|
4
|
+
var _a;
|
|
5
|
+
const needle = query.trim().toLowerCase();
|
|
6
|
+
if (!needle) return 1;
|
|
7
|
+
const label = item.label.toLowerCase();
|
|
8
|
+
const labelIndex = label.indexOf(needle);
|
|
9
|
+
if (labelIndex === 0) return 1e3;
|
|
10
|
+
if (labelIndex > 0) return 800 - Math.min(labelIndex, 100);
|
|
11
|
+
const description = ((_a = item.description) == null ? void 0 : _a.toLowerCase()) ?? "";
|
|
12
|
+
const descriptionIndex = description.indexOf(needle);
|
|
13
|
+
if (descriptionIndex >= 0) return 500 - Math.min(descriptionIndex, 100);
|
|
14
|
+
const keywordHit = (item.keywords ?? []).some(
|
|
15
|
+
(keyword) => keyword.toLowerCase().includes(needle)
|
|
16
|
+
);
|
|
17
|
+
return keywordHit ? 300 : 0;
|
|
18
|
+
}
|
|
19
|
+
function score(filter, item, query) {
|
|
20
|
+
const result = filter(item, query);
|
|
21
|
+
if (result === true) return 1;
|
|
22
|
+
if (result === false) return 0;
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
function filterCommandGroups(groups, query, filter = defaultCommandFilter) {
|
|
26
|
+
const result = [];
|
|
27
|
+
for (const group of groups) {
|
|
28
|
+
let items;
|
|
29
|
+
if (filter === false) {
|
|
30
|
+
items = group.items;
|
|
31
|
+
} else {
|
|
32
|
+
const scored = group.items.map((item) => ({ item, value: score(filter, item, query) })).filter((entry) => entry.value > 0);
|
|
33
|
+
scored.sort((a, b) => b.value - a.value);
|
|
34
|
+
items = scored.map((entry) => entry.item);
|
|
35
|
+
}
|
|
36
|
+
if (group.limit !== void 0) items = items.slice(0, group.limit);
|
|
37
|
+
if (items.length > 0) result.push({ ...group, items });
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
function flattenCommands(groups) {
|
|
42
|
+
return groups.flatMap((group) => group.items);
|
|
43
|
+
}
|
|
44
|
+
function nextEnabledIndex(items, from, direction) {
|
|
45
|
+
var _a;
|
|
46
|
+
if (items.length === 0) return -1;
|
|
47
|
+
for (let step = 1; step <= items.length; step += 1) {
|
|
48
|
+
const index = ((from + direction * step) % items.length + items.length) % items.length;
|
|
49
|
+
if (!((_a = items[index]) == null ? void 0 : _a.disabled)) return index;
|
|
50
|
+
}
|
|
51
|
+
return -1;
|
|
52
|
+
}
|
|
53
|
+
function firstEnabledIndex(items) {
|
|
54
|
+
const index = items.findIndex((item) => !item.disabled);
|
|
55
|
+
return index;
|
|
56
|
+
}
|
|
57
|
+
function lastEnabledIndex(items) {
|
|
58
|
+
var _a;
|
|
59
|
+
for (let index = items.length - 1; index >= 0; index -= 1) {
|
|
60
|
+
if (!((_a = items[index]) == null ? void 0 : _a.disabled)) return index;
|
|
61
|
+
}
|
|
62
|
+
return -1;
|
|
63
|
+
}
|
|
64
|
+
exports.defaultCommandFilter = defaultCommandFilter;
|
|
65
|
+
exports.filterCommandGroups = filterCommandGroups;
|
|
66
|
+
exports.firstEnabledIndex = firstEnabledIndex;
|
|
67
|
+
exports.flattenCommands = flattenCommands;
|
|
68
|
+
exports.lastEnabledIndex = lastEnabledIndex;
|
|
69
|
+
exports.nextEnabledIndex = nextEnabledIndex;
|
|
70
|
+
//# sourceMappingURL=CommandPalette.model.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.model.cjs","sources":["../../src/overlay/CommandPalette.model.ts"],"sourcesContent":["// Types and pure helpers for CommandPalette. Kept React-free so the filtering,\n// ranking, and keyboard-index math are unit-testable without a DOM.\n\nimport type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Context handed to a command's `onSelect`. */\nexport type CommandSelectContext = {\n /** The item that was activated. */\n item: CommandItem;\n /** The query at the moment of activation, trimmed. */\n query: string;\n /** Closes the palette — call this from a handler that opted out of `closeOnSelect`. */\n close: () => void;\n};\n\n/** A single runnable command row. */\nexport type CommandItem = {\n /** Stable identity; the React key and the `aria-activedescendant` target. Must be unique across all groups. */\n id: string;\n /** Primary text, and the main field the default filter matches. */\n label: string;\n /** Secondary text rendered muted after the label. Also matched, at lower weight. */\n description?: string;\n /** Extra match terms that are never displayed — aliases, verbs, ids. */\n keywords?: string[];\n /** Leading glyph: a runtime icon name or a generated `Ui*` component. */\n icon?: string | StaticIconComponent;\n /** Keyboard hint rendered as a trailing `<kbd>`. Display only — the palette does not bind it. */\n shortcut?: string;\n /** Trailing content (a badge, a count). Must not be focusable: it lives inside `role=\"option\"`. */\n trailing?: ReactNode;\n /** Dims the row, skips it during arrow navigation, and blocks Enter. */\n disabled?: boolean;\n /** Runs when the row is activated. Falls back to the palette's `onSelect`. */\n onSelect?: (context: CommandSelectContext) => void;\n};\n\n/** A titled block of commands. Groups render in array order regardless of match quality. */\nexport type CommandGroup = {\n /** Stable identity; the React key and the heading's element id. */\n id: string;\n /** Section header. Omit for an unlabelled block. */\n heading?: string;\n items: CommandItem[];\n /** Cap on rows shown after filtering. Use for \"top N results\" sources. */\n limit?: number;\n};\n\n/** Scores an item against a query. Higher wins; `0`/`false` hides the row. */\nexport type CommandFilter = (item: CommandItem, query: string) => number | boolean;\n\n/**\n * Default matcher: case-insensitive substring over label, description, and\n * keywords. A hit earlier in the label outranks a later one, and a label hit\n * outranks a description or keyword hit, so the most obvious match sorts first.\n */\nexport function defaultCommandFilter(item: CommandItem, query: string): number {\n const needle = query.trim().toLowerCase();\n if (!needle) return 1;\n\n const label = item.label.toLowerCase();\n const labelIndex = label.indexOf(needle);\n if (labelIndex === 0) return 1000;\n if (labelIndex > 0) return 800 - Math.min(labelIndex, 100);\n\n const description = item.description?.toLowerCase() ?? \"\";\n const descriptionIndex = description.indexOf(needle);\n if (descriptionIndex >= 0) return 500 - Math.min(descriptionIndex, 100);\n\n const keywordHit = (item.keywords ?? []).some((keyword) =>\n keyword.toLowerCase().includes(needle),\n );\n return keywordHit ? 300 : 0;\n}\n\nfunction score(filter: CommandFilter, item: CommandItem, query: string): number {\n const result = filter(item, query);\n if (result === true) return 1;\n if (result === false) return 0;\n return result;\n}\n\n/**\n * Filters and ranks each group, dropping groups left empty. Group order is\n * preserved — only items move — so the palette's sections stay where the\n * consumer put them. Pass `filter: false` when the caller already filtered\n * server-side; groups then pass through untouched apart from `limit`.\n */\nexport function filterCommandGroups(\n groups: CommandGroup[],\n query: string,\n filter: CommandFilter | false = defaultCommandFilter,\n): CommandGroup[] {\n const result: CommandGroup[] = [];\n\n for (const group of groups) {\n let items: CommandItem[];\n\n if (filter === false) {\n items = group.items;\n } else {\n const scored = group.items\n .map((item) => ({ item, value: score(filter, item, query) }))\n .filter((entry) => entry.value > 0);\n // Stable within equal scores: sort() is stable in every engine we target,\n // so equally-ranked items keep their authored order.\n scored.sort((a, b) => b.value - a.value);\n items = scored.map((entry) => entry.item);\n }\n\n if (group.limit !== undefined) items = items.slice(0, group.limit);\n if (items.length > 0) result.push({ ...group, items });\n }\n\n return result;\n}\n\n/** Flattens groups to the row order the listbox renders, for index math. */\nexport function flattenCommands(groups: CommandGroup[]): CommandItem[] {\n return groups.flatMap((group) => group.items);\n}\n\n/**\n * Next selectable index in `direction`, skipping disabled rows and wrapping at\n * both ends. Returns `-1` when nothing is selectable. Wrapping suits a palette:\n * lists are query-scoped and short, so \"up from the top\" should reach the last\n * row in one press.\n */\nexport function nextEnabledIndex(\n items: CommandItem[],\n from: number,\n direction: 1 | -1,\n): number {\n if (items.length === 0) return -1;\n\n for (let step = 1; step <= items.length; step += 1) {\n const index = (((from + direction * step) % items.length) + items.length) % items.length;\n if (!items[index]?.disabled) return index;\n }\n return -1;\n}\n\n/** First selectable index, or `-1` when every row is disabled. */\nexport function firstEnabledIndex(items: CommandItem[]): number {\n const index = items.findIndex((item) => !item.disabled);\n return index;\n}\n\n/** Last selectable index, or `-1` when every row is disabled. */\nexport function lastEnabledIndex(items: CommandItem[]): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (!items[index]?.disabled) return index;\n }\n return -1;\n}\n"],"names":[],"mappings":";;AAyDO,SAAS,qBAAqB,MAAmB,OAAuB;;AAC7E,QAAM,SAAS,MAAM,KAAA,EAAO,YAAA;AAC5B,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,KAAK,MAAM,YAAA;AACzB,QAAM,aAAa,MAAM,QAAQ,MAAM;AACvC,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,aAAa,EAAG,QAAO,MAAM,KAAK,IAAI,YAAY,GAAG;AAEzD,QAAM,gBAAc,UAAK,gBAAL,mBAAkB,kBAAiB;AACvD,QAAM,mBAAmB,YAAY,QAAQ,MAAM;AACnD,MAAI,oBAAoB,EAAG,QAAO,MAAM,KAAK,IAAI,kBAAkB,GAAG;AAEtE,QAAM,cAAc,KAAK,YAAY,CAAA,GAAI;AAAA,IAAK,CAAC,YAC7C,QAAQ,YAAA,EAAc,SAAS,MAAM;AAAA,EAAA;AAEvC,SAAO,aAAa,MAAM;AAC5B;AAEA,SAAS,MAAM,QAAuB,MAAmB,OAAuB;AAC9E,QAAM,SAAS,OAAO,MAAM,KAAK;AACjC,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO;AACT;AAQO,SAAS,oBACd,QACA,OACA,SAAgC,sBAChB;AAChB,QAAM,SAAyB,CAAA;AAE/B,aAAW,SAAS,QAAQ;AAC1B,QAAI;AAEJ,QAAI,WAAW,OAAO;AACpB,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,YAAM,SAAS,MAAM,MAClB,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,EAC3D,OAAO,CAAC,UAAU,MAAM,QAAQ,CAAC;AAGpC,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACvC,cAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,IAC1C;AAEA,QAAI,MAAM,UAAU,OAAW,SAAQ,MAAM,MAAM,GAAG,MAAM,KAAK;AACjE,QAAI,MAAM,SAAS,EAAG,QAAO,KAAK,EAAE,GAAG,OAAO,OAAO;AAAA,EACvD;AAEA,SAAO;AACT;AAGO,SAAS,gBAAgB,QAAuC;AACrE,SAAO,OAAO,QAAQ,CAAC,UAAU,MAAM,KAAK;AAC9C;AAQO,SAAS,iBACd,OACA,MACA,WACQ;;AACR,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,WAAS,OAAO,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG;AAClD,UAAM,UAAW,OAAO,YAAY,QAAQ,MAAM,SAAU,MAAM,UAAU,MAAM;AAClF,QAAI,GAAC,WAAM,KAAK,MAAX,mBAAc,UAAU,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,QAAQ;AACtD,SAAO;AACT;AAGO,SAAS,iBAAiB,OAA8B;;AAC7D,WAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACzD,QAAI,GAAC,WAAM,KAAK,MAAX,mBAAc,UAAU,QAAO;AAAA,EACtC;AACA,SAAO;AACT;;;;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { StaticIconComponent } from '../data/Icon';
|
|
3
|
+
/** Context handed to a command's `onSelect`. */
|
|
4
|
+
export type CommandSelectContext = {
|
|
5
|
+
/** The item that was activated. */
|
|
6
|
+
item: CommandItem;
|
|
7
|
+
/** The query at the moment of activation, trimmed. */
|
|
8
|
+
query: string;
|
|
9
|
+
/** Closes the palette — call this from a handler that opted out of `closeOnSelect`. */
|
|
10
|
+
close: () => void;
|
|
11
|
+
};
|
|
12
|
+
/** A single runnable command row. */
|
|
13
|
+
export type CommandItem = {
|
|
14
|
+
/** Stable identity; the React key and the `aria-activedescendant` target. Must be unique across all groups. */
|
|
15
|
+
id: string;
|
|
16
|
+
/** Primary text, and the main field the default filter matches. */
|
|
17
|
+
label: string;
|
|
18
|
+
/** Secondary text rendered muted after the label. Also matched, at lower weight. */
|
|
19
|
+
description?: string;
|
|
20
|
+
/** Extra match terms that are never displayed — aliases, verbs, ids. */
|
|
21
|
+
keywords?: string[];
|
|
22
|
+
/** Leading glyph: a runtime icon name or a generated `Ui*` component. */
|
|
23
|
+
icon?: string | StaticIconComponent;
|
|
24
|
+
/** Keyboard hint rendered as a trailing `<kbd>`. Display only — the palette does not bind it. */
|
|
25
|
+
shortcut?: string;
|
|
26
|
+
/** Trailing content (a badge, a count). Must not be focusable: it lives inside `role="option"`. */
|
|
27
|
+
trailing?: ReactNode;
|
|
28
|
+
/** Dims the row, skips it during arrow navigation, and blocks Enter. */
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** Runs when the row is activated. Falls back to the palette's `onSelect`. */
|
|
31
|
+
onSelect?: (context: CommandSelectContext) => void;
|
|
32
|
+
};
|
|
33
|
+
/** A titled block of commands. Groups render in array order regardless of match quality. */
|
|
34
|
+
export type CommandGroup = {
|
|
35
|
+
/** Stable identity; the React key and the heading's element id. */
|
|
36
|
+
id: string;
|
|
37
|
+
/** Section header. Omit for an unlabelled block. */
|
|
38
|
+
heading?: string;
|
|
39
|
+
items: CommandItem[];
|
|
40
|
+
/** Cap on rows shown after filtering. Use for "top N results" sources. */
|
|
41
|
+
limit?: number;
|
|
42
|
+
};
|
|
43
|
+
/** Scores an item against a query. Higher wins; `0`/`false` hides the row. */
|
|
44
|
+
export type CommandFilter = (item: CommandItem, query: string) => number | boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Default matcher: case-insensitive substring over label, description, and
|
|
47
|
+
* keywords. A hit earlier in the label outranks a later one, and a label hit
|
|
48
|
+
* outranks a description or keyword hit, so the most obvious match sorts first.
|
|
49
|
+
*/
|
|
50
|
+
export declare function defaultCommandFilter(item: CommandItem, query: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Filters and ranks each group, dropping groups left empty. Group order is
|
|
53
|
+
* preserved — only items move — so the palette's sections stay where the
|
|
54
|
+
* consumer put them. Pass `filter: false` when the caller already filtered
|
|
55
|
+
* server-side; groups then pass through untouched apart from `limit`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function filterCommandGroups(groups: CommandGroup[], query: string, filter?: CommandFilter | false): CommandGroup[];
|
|
58
|
+
/** Flattens groups to the row order the listbox renders, for index math. */
|
|
59
|
+
export declare function flattenCommands(groups: CommandGroup[]): CommandItem[];
|
|
60
|
+
/**
|
|
61
|
+
* Next selectable index in `direction`, skipping disabled rows and wrapping at
|
|
62
|
+
* both ends. Returns `-1` when nothing is selectable. Wrapping suits a palette:
|
|
63
|
+
* lists are query-scoped and short, so "up from the top" should reach the last
|
|
64
|
+
* row in one press.
|
|
65
|
+
*/
|
|
66
|
+
export declare function nextEnabledIndex(items: CommandItem[], from: number, direction: 1 | -1): number;
|
|
67
|
+
/** First selectable index, or `-1` when every row is disabled. */
|
|
68
|
+
export declare function firstEnabledIndex(items: CommandItem[]): number;
|
|
69
|
+
/** Last selectable index, or `-1` when every row is disabled. */
|
|
70
|
+
export declare function lastEnabledIndex(items: CommandItem[]): number;
|
|
71
|
+
//# sourceMappingURL=CommandPalette.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.model.d.ts","sourceRoot":"","sources":["../../src/overlay/CommandPalette.model.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,gDAAgD;AAChD,MAAM,MAAM,oBAAoB,GAAG;IACjC,mCAAmC;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG;IACxB,+GAA+G;IAC/G,EAAE,EAAE,MAAM,CAAC;IACX,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,YAAY,GAAG;IACzB,mEAAmE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB7E;AASD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,aAAa,GAAG,KAA4B,GACnD,YAAY,EAAE,CAuBhB;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAErE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAChB,MAAM,CAQR;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAG9D;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAK7D"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
function defaultCommandFilter(item, query) {
|
|
2
|
+
var _a;
|
|
3
|
+
const needle = query.trim().toLowerCase();
|
|
4
|
+
if (!needle) return 1;
|
|
5
|
+
const label = item.label.toLowerCase();
|
|
6
|
+
const labelIndex = label.indexOf(needle);
|
|
7
|
+
if (labelIndex === 0) return 1e3;
|
|
8
|
+
if (labelIndex > 0) return 800 - Math.min(labelIndex, 100);
|
|
9
|
+
const description = ((_a = item.description) == null ? void 0 : _a.toLowerCase()) ?? "";
|
|
10
|
+
const descriptionIndex = description.indexOf(needle);
|
|
11
|
+
if (descriptionIndex >= 0) return 500 - Math.min(descriptionIndex, 100);
|
|
12
|
+
const keywordHit = (item.keywords ?? []).some(
|
|
13
|
+
(keyword) => keyword.toLowerCase().includes(needle)
|
|
14
|
+
);
|
|
15
|
+
return keywordHit ? 300 : 0;
|
|
16
|
+
}
|
|
17
|
+
function score(filter, item, query) {
|
|
18
|
+
const result = filter(item, query);
|
|
19
|
+
if (result === true) return 1;
|
|
20
|
+
if (result === false) return 0;
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
function filterCommandGroups(groups, query, filter = defaultCommandFilter) {
|
|
24
|
+
const result = [];
|
|
25
|
+
for (const group of groups) {
|
|
26
|
+
let items;
|
|
27
|
+
if (filter === false) {
|
|
28
|
+
items = group.items;
|
|
29
|
+
} else {
|
|
30
|
+
const scored = group.items.map((item) => ({ item, value: score(filter, item, query) })).filter((entry) => entry.value > 0);
|
|
31
|
+
scored.sort((a, b) => b.value - a.value);
|
|
32
|
+
items = scored.map((entry) => entry.item);
|
|
33
|
+
}
|
|
34
|
+
if (group.limit !== void 0) items = items.slice(0, group.limit);
|
|
35
|
+
if (items.length > 0) result.push({ ...group, items });
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function flattenCommands(groups) {
|
|
40
|
+
return groups.flatMap((group) => group.items);
|
|
41
|
+
}
|
|
42
|
+
function nextEnabledIndex(items, from, direction) {
|
|
43
|
+
var _a;
|
|
44
|
+
if (items.length === 0) return -1;
|
|
45
|
+
for (let step = 1; step <= items.length; step += 1) {
|
|
46
|
+
const index = ((from + direction * step) % items.length + items.length) % items.length;
|
|
47
|
+
if (!((_a = items[index]) == null ? void 0 : _a.disabled)) return index;
|
|
48
|
+
}
|
|
49
|
+
return -1;
|
|
50
|
+
}
|
|
51
|
+
function firstEnabledIndex(items) {
|
|
52
|
+
const index = items.findIndex((item) => !item.disabled);
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
function lastEnabledIndex(items) {
|
|
56
|
+
var _a;
|
|
57
|
+
for (let index = items.length - 1; index >= 0; index -= 1) {
|
|
58
|
+
if (!((_a = items[index]) == null ? void 0 : _a.disabled)) return index;
|
|
59
|
+
}
|
|
60
|
+
return -1;
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
defaultCommandFilter,
|
|
64
|
+
filterCommandGroups,
|
|
65
|
+
firstEnabledIndex,
|
|
66
|
+
flattenCommands,
|
|
67
|
+
lastEnabledIndex,
|
|
68
|
+
nextEnabledIndex
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=CommandPalette.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.model.js","sources":["../../src/overlay/CommandPalette.model.ts"],"sourcesContent":["// Types and pure helpers for CommandPalette. Kept React-free so the filtering,\n// ranking, and keyboard-index math are unit-testable without a DOM.\n\nimport type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Context handed to a command's `onSelect`. */\nexport type CommandSelectContext = {\n /** The item that was activated. */\n item: CommandItem;\n /** The query at the moment of activation, trimmed. */\n query: string;\n /** Closes the palette — call this from a handler that opted out of `closeOnSelect`. */\n close: () => void;\n};\n\n/** A single runnable command row. */\nexport type CommandItem = {\n /** Stable identity; the React key and the `aria-activedescendant` target. Must be unique across all groups. */\n id: string;\n /** Primary text, and the main field the default filter matches. */\n label: string;\n /** Secondary text rendered muted after the label. Also matched, at lower weight. */\n description?: string;\n /** Extra match terms that are never displayed — aliases, verbs, ids. */\n keywords?: string[];\n /** Leading glyph: a runtime icon name or a generated `Ui*` component. */\n icon?: string | StaticIconComponent;\n /** Keyboard hint rendered as a trailing `<kbd>`. Display only — the palette does not bind it. */\n shortcut?: string;\n /** Trailing content (a badge, a count). Must not be focusable: it lives inside `role=\"option\"`. */\n trailing?: ReactNode;\n /** Dims the row, skips it during arrow navigation, and blocks Enter. */\n disabled?: boolean;\n /** Runs when the row is activated. Falls back to the palette's `onSelect`. */\n onSelect?: (context: CommandSelectContext) => void;\n};\n\n/** A titled block of commands. Groups render in array order regardless of match quality. */\nexport type CommandGroup = {\n /** Stable identity; the React key and the heading's element id. */\n id: string;\n /** Section header. Omit for an unlabelled block. */\n heading?: string;\n items: CommandItem[];\n /** Cap on rows shown after filtering. Use for \"top N results\" sources. */\n limit?: number;\n};\n\n/** Scores an item against a query. Higher wins; `0`/`false` hides the row. */\nexport type CommandFilter = (item: CommandItem, query: string) => number | boolean;\n\n/**\n * Default matcher: case-insensitive substring over label, description, and\n * keywords. A hit earlier in the label outranks a later one, and a label hit\n * outranks a description or keyword hit, so the most obvious match sorts first.\n */\nexport function defaultCommandFilter(item: CommandItem, query: string): number {\n const needle = query.trim().toLowerCase();\n if (!needle) return 1;\n\n const label = item.label.toLowerCase();\n const labelIndex = label.indexOf(needle);\n if (labelIndex === 0) return 1000;\n if (labelIndex > 0) return 800 - Math.min(labelIndex, 100);\n\n const description = item.description?.toLowerCase() ?? \"\";\n const descriptionIndex = description.indexOf(needle);\n if (descriptionIndex >= 0) return 500 - Math.min(descriptionIndex, 100);\n\n const keywordHit = (item.keywords ?? []).some((keyword) =>\n keyword.toLowerCase().includes(needle),\n );\n return keywordHit ? 300 : 0;\n}\n\nfunction score(filter: CommandFilter, item: CommandItem, query: string): number {\n const result = filter(item, query);\n if (result === true) return 1;\n if (result === false) return 0;\n return result;\n}\n\n/**\n * Filters and ranks each group, dropping groups left empty. Group order is\n * preserved — only items move — so the palette's sections stay where the\n * consumer put them. Pass `filter: false` when the caller already filtered\n * server-side; groups then pass through untouched apart from `limit`.\n */\nexport function filterCommandGroups(\n groups: CommandGroup[],\n query: string,\n filter: CommandFilter | false = defaultCommandFilter,\n): CommandGroup[] {\n const result: CommandGroup[] = [];\n\n for (const group of groups) {\n let items: CommandItem[];\n\n if (filter === false) {\n items = group.items;\n } else {\n const scored = group.items\n .map((item) => ({ item, value: score(filter, item, query) }))\n .filter((entry) => entry.value > 0);\n // Stable within equal scores: sort() is stable in every engine we target,\n // so equally-ranked items keep their authored order.\n scored.sort((a, b) => b.value - a.value);\n items = scored.map((entry) => entry.item);\n }\n\n if (group.limit !== undefined) items = items.slice(0, group.limit);\n if (items.length > 0) result.push({ ...group, items });\n }\n\n return result;\n}\n\n/** Flattens groups to the row order the listbox renders, for index math. */\nexport function flattenCommands(groups: CommandGroup[]): CommandItem[] {\n return groups.flatMap((group) => group.items);\n}\n\n/**\n * Next selectable index in `direction`, skipping disabled rows and wrapping at\n * both ends. Returns `-1` when nothing is selectable. Wrapping suits a palette:\n * lists are query-scoped and short, so \"up from the top\" should reach the last\n * row in one press.\n */\nexport function nextEnabledIndex(\n items: CommandItem[],\n from: number,\n direction: 1 | -1,\n): number {\n if (items.length === 0) return -1;\n\n for (let step = 1; step <= items.length; step += 1) {\n const index = (((from + direction * step) % items.length) + items.length) % items.length;\n if (!items[index]?.disabled) return index;\n }\n return -1;\n}\n\n/** First selectable index, or `-1` when every row is disabled. */\nexport function firstEnabledIndex(items: CommandItem[]): number {\n const index = items.findIndex((item) => !item.disabled);\n return index;\n}\n\n/** Last selectable index, or `-1` when every row is disabled. */\nexport function lastEnabledIndex(items: CommandItem[]): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (!items[index]?.disabled) return index;\n }\n return -1;\n}\n"],"names":[],"mappings":"AAyDO,SAAS,qBAAqB,MAAmB,OAAuB;AAAxE;AACL,QAAM,SAAS,MAAM,KAAA,EAAO,YAAA;AAC5B,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,KAAK,MAAM,YAAA;AACzB,QAAM,aAAa,MAAM,QAAQ,MAAM;AACvC,MAAI,eAAe,EAAG,QAAO;AAC7B,MAAI,aAAa,EAAG,QAAO,MAAM,KAAK,IAAI,YAAY,GAAG;AAEzD,QAAM,gBAAc,UAAK,gBAAL,mBAAkB,kBAAiB;AACvD,QAAM,mBAAmB,YAAY,QAAQ,MAAM;AACnD,MAAI,oBAAoB,EAAG,QAAO,MAAM,KAAK,IAAI,kBAAkB,GAAG;AAEtE,QAAM,cAAc,KAAK,YAAY,CAAA,GAAI;AAAA,IAAK,CAAC,YAC7C,QAAQ,YAAA,EAAc,SAAS,MAAM;AAAA,EAAA;AAEvC,SAAO,aAAa,MAAM;AAC5B;AAEA,SAAS,MAAM,QAAuB,MAAmB,OAAuB;AAC9E,QAAM,SAAS,OAAO,MAAM,KAAK;AACjC,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,WAAW,MAAO,QAAO;AAC7B,SAAO;AACT;AAQO,SAAS,oBACd,QACA,OACA,SAAgC,sBAChB;AAChB,QAAM,SAAyB,CAAA;AAE/B,aAAW,SAAS,QAAQ;AAC1B,QAAI;AAEJ,QAAI,WAAW,OAAO;AACpB,cAAQ,MAAM;AAAA,IAChB,OAAO;AACL,YAAM,SAAS,MAAM,MAClB,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,EAC3D,OAAO,CAAC,UAAU,MAAM,QAAQ,CAAC;AAGpC,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACvC,cAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,IAC1C;AAEA,QAAI,MAAM,UAAU,OAAW,SAAQ,MAAM,MAAM,GAAG,MAAM,KAAK;AACjE,QAAI,MAAM,SAAS,EAAG,QAAO,KAAK,EAAE,GAAG,OAAO,OAAO;AAAA,EACvD;AAEA,SAAO;AACT;AAGO,SAAS,gBAAgB,QAAuC;AACrE,SAAO,OAAO,QAAQ,CAAC,UAAU,MAAM,KAAK;AAC9C;AAQO,SAAS,iBACd,OACA,MACA,WACQ;AA5EH;AA6EL,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,WAAS,OAAO,GAAG,QAAQ,MAAM,QAAQ,QAAQ,GAAG;AAClD,UAAM,UAAW,OAAO,YAAY,QAAQ,MAAM,SAAU,MAAM,UAAU,MAAM;AAClF,QAAI,GAAC,WAAM,KAAK,MAAX,mBAAc,UAAU,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,OAA8B;AAC9D,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,QAAQ;AACtD,SAAO;AACT;AAGO,SAAS,iBAAiB,OAA8B;AA7FxD;AA8FL,WAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACzD,QAAI,GAAC,WAAM,KAAK,MAAX,mBAAc,UAAU,QAAO;AAAA,EACtC;AACA,SAAO;AACT;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const utils = require("../lib/utils.cjs");
|
|
6
|
+
const Icon = require("../data/Icon.cjs");
|
|
7
|
+
function CommandPaletteList({
|
|
8
|
+
groups,
|
|
9
|
+
items,
|
|
10
|
+
activeIndex,
|
|
11
|
+
listId,
|
|
12
|
+
optionId,
|
|
13
|
+
onActivate,
|
|
14
|
+
onHover,
|
|
15
|
+
listRef,
|
|
16
|
+
loading,
|
|
17
|
+
emptyState,
|
|
18
|
+
listMaxHeight
|
|
19
|
+
}) {
|
|
20
|
+
let flatIndex = -1;
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
ref: listRef,
|
|
25
|
+
id: listId,
|
|
26
|
+
role: "listbox",
|
|
27
|
+
"aria-label": "Commands",
|
|
28
|
+
className: "overflow-y-auto overscroll-contain py-density-1",
|
|
29
|
+
style: { maxHeight: listMaxHeight },
|
|
30
|
+
children: loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-density-3 py-density-3 text-sm text-muted-foreground", children: "Searching…" }) : items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-density-3 py-density-4 text-center text-sm text-muted-foreground", children: emptyState ?? "No results" }) : groups.map((group) => {
|
|
31
|
+
const headingId = `${listId}-group-${group.id}`;
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsx(react.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { role: "group", "aria-labelledby": group.heading ? headingId : void 0, children: [
|
|
33
|
+
group.heading && /* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
id: headingId,
|
|
37
|
+
role: "presentation",
|
|
38
|
+
className: "px-density-3 pb-1 pt-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-muted-foreground",
|
|
39
|
+
children: group.heading
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
group.items.map((item) => {
|
|
43
|
+
flatIndex += 1;
|
|
44
|
+
const index = flatIndex;
|
|
45
|
+
const active = index === activeIndex;
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
id: optionId(item),
|
|
50
|
+
role: "option",
|
|
51
|
+
"aria-selected": active,
|
|
52
|
+
"aria-disabled": item.disabled || void 0,
|
|
53
|
+
onMouseMove: () => {
|
|
54
|
+
if (!item.disabled) onHover(index);
|
|
55
|
+
},
|
|
56
|
+
onClick: () => {
|
|
57
|
+
if (!item.disabled) onActivate(item);
|
|
58
|
+
},
|
|
59
|
+
className: utils.cn(
|
|
60
|
+
"mx-density-1 flex cursor-pointer items-center gap-density-2 rounded-md px-density-2 py-1.5 text-sm",
|
|
61
|
+
active && "bg-accent text-accent-foreground",
|
|
62
|
+
item.disabled && "cursor-not-allowed opacity-50"
|
|
63
|
+
),
|
|
64
|
+
children: [
|
|
65
|
+
item.icon !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
66
|
+
Icon.Icon,
|
|
67
|
+
{
|
|
68
|
+
...typeof item.icon === "string" ? { name: item.icon } : { icon: item.icon }
|
|
69
|
+
}
|
|
70
|
+
) }),
|
|
71
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0 flex-1 truncate", children: [
|
|
72
|
+
item.label,
|
|
73
|
+
item.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-density-2 text-xs text-muted-foreground", children: item.description })
|
|
74
|
+
] }),
|
|
75
|
+
item.trailing,
|
|
76
|
+
item.shortcut && /* @__PURE__ */ jsxRuntime.jsx("kbd", { className: "shrink-0 rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground", children: item.shortcut })
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
item.id
|
|
80
|
+
);
|
|
81
|
+
})
|
|
82
|
+
] }) }, group.id);
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
exports.CommandPaletteList = CommandPaletteList;
|
|
88
|
+
//# sourceMappingURL=CommandPaletteList.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPaletteList.cjs","sources":["../../src/overlay/CommandPaletteList.tsx"],"sourcesContent":["import { Fragment, type RefObject } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport type { CommandGroup, CommandItem } from \"./CommandPalette.model\";\n\nexport type CommandPaletteListProps = {\n groups: CommandGroup[];\n /** Flattened rows, in render order — index space for `activeIndex`. */\n items: CommandItem[];\n activeIndex: number;\n listId: string;\n optionId: (item: CommandItem) => string;\n onActivate: (item: CommandItem) => void;\n onHover: (index: number) => void;\n listRef: RefObject<HTMLDivElement>;\n loading?: boolean | undefined;\n emptyState?: React.ReactNode;\n listMaxHeight: string | number;\n};\n\n/**\n * The palette's grouped listbox. Headings are `role=\"presentation\"` so the\n * option index space stays contiguous — the same trick Combobox uses to scroll\n * by `[role=\"option\"]` index.\n */\nexport function CommandPaletteList({\n groups,\n items,\n activeIndex,\n listId,\n optionId,\n onActivate,\n onHover,\n listRef,\n loading,\n emptyState,\n listMaxHeight,\n}: CommandPaletteListProps) {\n // A flat cursor walked alongside the nested render so each row knows its index\n // in the flattened list without a lookup.\n let flatIndex = -1;\n\n return (\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n aria-label=\"Commands\"\n className=\"overflow-y-auto overscroll-contain py-density-1\"\n style={{ maxHeight: listMaxHeight }}\n >\n {loading ? (\n <div className=\"px-density-3 py-density-3 text-sm text-muted-foreground\">Searching…</div>\n ) : items.length === 0 ? (\n <div className=\"px-density-3 py-density-4 text-center text-sm text-muted-foreground\">\n {emptyState ?? \"No results\"}\n </div>\n ) : (\n groups.map((group) => {\n const headingId = `${listId}-group-${group.id}`;\n return (\n <Fragment key={group.id}>\n <div role=\"group\" aria-labelledby={group.heading ? headingId : undefined}>\n {group.heading && (\n <div\n id={headingId}\n role=\"presentation\"\n className=\"px-density-3 pb-1 pt-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-muted-foreground\"\n >\n {group.heading}\n </div>\n )}\n {group.items.map((item) => {\n flatIndex += 1;\n const index = flatIndex;\n const active = index === activeIndex;\n return (\n <div\n key={item.id}\n id={optionId(item)}\n role=\"option\"\n aria-selected={active}\n aria-disabled={item.disabled || undefined}\n // onMouseMove, not onMouseEnter: keyboard navigation\n // scrolls rows under a stationary cursor, and mouseenter\n // would yank the highlight back to wherever it sits.\n onMouseMove={() => {\n if (!item.disabled) onHover(index);\n }}\n onClick={() => {\n if (!item.disabled) onActivate(item);\n }}\n className={cn(\n \"mx-density-1 flex cursor-pointer items-center gap-density-2 rounded-md px-density-2 py-1.5 text-sm\",\n active && \"bg-accent text-accent-foreground\",\n item.disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {item.icon !== undefined && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground\">\n <Icon\n {...(typeof item.icon === \"string\"\n ? { name: item.icon }\n : { icon: item.icon })}\n />\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">\n {item.label}\n {item.description && (\n <span className=\"ml-density-2 text-xs text-muted-foreground\">\n {item.description}\n </span>\n )}\n </span>\n {item.trailing}\n {item.shortcut && (\n <kbd className=\"shrink-0 rounded border border-border bg-muted px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground\">\n {item.shortcut}\n </kbd>\n )}\n </div>\n );\n })}\n </div>\n </Fragment>\n );\n })\n )}\n </div>\n );\n}\n"],"names":["jsx","Fragment","jsxs","cn","Icon"],"mappings":";;;;;;AAyBO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAG1B,MAAI,YAAY;AAEhB,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,cAAW;AAAA,MACX,WAAU;AAAA,MACV,OAAO,EAAE,WAAW,cAAA;AAAA,MAEnB,UAAA,yCACE,OAAA,EAAI,WAAU,2DAA0D,UAAA,aAAA,CAAU,IACjF,MAAM,WAAW,mCAClB,OAAA,EAAI,WAAU,uEACZ,UAAA,cAAc,aAAA,CACjB,IAEA,OAAO,IAAI,CAAC,UAAU;AACpB,cAAM,YAAY,GAAG,MAAM,UAAU,MAAM,EAAE;AAC7C,eACEA,2BAAAA,IAACC,MAAAA,UAAA,EACC,UAAAC,2BAAAA,KAAC,OAAA,EAAI,MAAK,SAAQ,mBAAiB,MAAM,UAAU,YAAY,QAC5D,UAAA;AAAA,UAAA,MAAM,WACLF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,WAAU;AAAA,cAET,UAAA,MAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAGV,MAAM,MAAM,IAAI,CAAC,SAAS;AACzB,yBAAa;AACb,kBAAM,QAAQ;AACd,kBAAM,SAAS,UAAU;AACzB,mBACEE,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,IAAI,SAAS,IAAI;AAAA,gBACjB,MAAK;AAAA,gBACL,iBAAe;AAAA,gBACf,iBAAe,KAAK,YAAY;AAAA,gBAIhC,aAAa,MAAM;AACjB,sBAAI,CAAC,KAAK,SAAU,SAAQ,KAAK;AAAA,gBACnC;AAAA,gBACA,SAAS,MAAM;AACb,sBAAI,CAAC,KAAK,SAAU,YAAW,IAAI;AAAA,gBACrC;AAAA,gBACA,WAAWC,MAAAA;AAAAA,kBACT;AAAA,kBACA,UAAU;AAAA,kBACV,KAAK,YAAY;AAAA,gBAAA;AAAA,gBAGlB,UAAA;AAAA,kBAAA,KAAK,SAAS,UACbH,2BAAAA,IAAC,QAAA,EAAK,WAAU,2EACd,UAAAA,2BAAAA;AAAAA,oBAACI,KAAAA;AAAAA,oBAAA;AAAA,sBACE,GAAI,OAAO,KAAK,SAAS,WACtB,EAAE,MAAM,KAAK,KAAA,IACb,EAAE,MAAM,KAAK,KAAA;AAAA,oBAAK;AAAA,kBAAA,GAE1B;AAAA,kBAEFF,2BAAAA,KAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,oBAAA,KAAK;AAAA,oBACL,KAAK,eACJF,2BAAAA,IAAC,UAAK,WAAU,8CACb,eAAK,YAAA,CACR;AAAA,kBAAA,GAEJ;AAAA,kBACC,KAAK;AAAA,kBACL,KAAK,YACJA,2BAAAA,IAAC,SAAI,WAAU,4GACZ,eAAK,SAAA,CACR;AAAA,gBAAA;AAAA,cAAA;AAAA,cAzCG,KAAK;AAAA,YAAA;AAAA,UA6ChB,CAAC;AAAA,QAAA,GACH,EAAA,GA/Da,MAAM,EAgErB;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAAA;AAIT;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { CommandGroup, CommandItem } from './CommandPalette.model';
|
|
3
|
+
export type CommandPaletteListProps = {
|
|
4
|
+
groups: CommandGroup[];
|
|
5
|
+
/** Flattened rows, in render order — index space for `activeIndex`. */
|
|
6
|
+
items: CommandItem[];
|
|
7
|
+
activeIndex: number;
|
|
8
|
+
listId: string;
|
|
9
|
+
optionId: (item: CommandItem) => string;
|
|
10
|
+
onActivate: (item: CommandItem) => void;
|
|
11
|
+
onHover: (index: number) => void;
|
|
12
|
+
listRef: RefObject<HTMLDivElement>;
|
|
13
|
+
loading?: boolean | undefined;
|
|
14
|
+
emptyState?: React.ReactNode;
|
|
15
|
+
listMaxHeight: string | number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The palette's grouped listbox. Headings are `role="presentation"` so the
|
|
19
|
+
* option index space stays contiguous — the same trick Combobox uses to scroll
|
|
20
|
+
* by `[role="option"]` index.
|
|
21
|
+
*/
|
|
22
|
+
export declare function CommandPaletteList({ groups, items, activeIndex, listId, optionId, onActivate, onHover, listRef, loading, emptyState, listMaxHeight, }: CommandPaletteListProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=CommandPaletteList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPaletteList.d.ts","sourceRoot":"","sources":["../../src/overlay/CommandPaletteList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAExE,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,uEAAuE;IACvE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,UAAU,EACV,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,aAAa,GACd,EAAE,uBAAuB,2CA8FzB"}
|