@flanksource/clicky-ui 0.3.17 → 0.3.18
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/dist/ai.cjs +12 -6
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -4
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +36 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +37 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +122 -153
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +124 -155
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxControl.cjs +145 -0
- package/dist/components/ComboboxControl.cjs.map +1 -0
- package/dist/components/ComboboxControl.d.ts +37 -0
- package/dist/components/ComboboxControl.d.ts.map +1 -0
- package/dist/components/ComboboxControl.js +145 -0
- package/dist/components/ComboboxControl.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +31 -14
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +31 -14
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxTags.cjs +40 -0
- package/dist/components/ComboboxTags.cjs.map +1 -0
- package/dist/components/ComboboxTags.d.ts +8 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -0
- package/dist/components/ComboboxTags.js +40 -0
- package/dist/components/ComboboxTags.js.map +1 -0
- package/dist/components/ErrorWrapper.cjs +168 -0
- package/dist/components/ErrorWrapper.cjs.map +1 -0
- package/dist/components/ErrorWrapper.d.ts +19 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -0
- package/dist/components/ErrorWrapper.js +168 -0
- package/dist/components/ErrorWrapper.js.map +1 -0
- package/dist/components/FilterBar.cjs +64 -2
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +18 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +64 -2
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JSONPathField.cjs +91 -0
- package/dist/components/JSONPathField.cjs.map +1 -0
- package/dist/components/JSONPathField.d.ts +19 -0
- package/dist/components/JSONPathField.d.ts.map +1 -0
- package/dist/components/JSONPathField.js +91 -0
- package/dist/components/JSONPathField.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +8 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -4
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/TreePickerField.cjs +22 -4
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +22 -2
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +22 -4
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/TriStateToggle.cjs +53 -0
- package/dist/components/TriStateToggle.cjs.map +1 -0
- package/dist/components/TriStateToggle.d.ts +27 -0
- package/dist/components/TriStateToggle.d.ts.map +1 -0
- package/dist/components/TriStateToggle.js +53 -0
- package/dist/components/TriStateToggle.js.map +1 -0
- package/dist/components/combobox-types.d.ts +16 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/combobox-utils.cjs +26 -0
- package/dist/components/combobox-utils.cjs.map +1 -1
- package/dist/components/combobox-utils.d.ts +10 -0
- package/dist/components/combobox-utils.d.ts.map +1 -1
- package/dist/components/combobox-utils.js +26 -0
- package/dist/components/combobox-utils.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +5 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -1
- package/dist/components/filter-bar-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-utils.js +5 -0
- package/dist/components/filter-bar-utils.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +290 -0
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
- package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-accordion-array.js +290 -0
- package/dist/components/json-schema-form-accordion-array.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +99 -110
- 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 +98 -109
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +4 -2
- package/dist/components/json-schema-form-error-display.cjs.map +1 -1
- package/dist/components/json-schema-form-error-display.d.ts +4 -2
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
- package/dist/components/json-schema-form-error-display.js +4 -2
- package/dist/components/json-schema-form-error-display.js.map +1 -1
- package/dist/components/json-schema-form-extensions.cjs +10 -0
- package/dist/components/json-schema-form-extensions.cjs.map +1 -0
- package/dist/components/json-schema-form-extensions.d.ts +8 -0
- package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
- package/dist/components/json-schema-form-extensions.js +10 -0
- package/dist/components/json-schema-form-extensions.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +25 -101
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +1 -32
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +28 -104
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +131 -0
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
- package/dist/components/json-schema-form-item-summary.d.ts +13 -0
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
- package/dist/components/json-schema-form-item-summary.js +131 -0
- package/dist/components/json-schema-form-item-summary.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +156 -0
- package/dist/components/json-schema-form-layout.cjs.map +1 -0
- package/dist/components/json-schema-form-layout.d.ts +43 -0
- package/dist/components/json-schema-form-layout.d.ts.map +1 -0
- package/dist/components/json-schema-form-layout.js +156 -0
- package/dist/components/json-schema-form-layout.js.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
- package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.js +149 -0
- package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +11 -4
- 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 +11 -4
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +51 -28
- 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 +51 -28
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +62 -13
- 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 +62 -13
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +123 -0
- package/dist/components/json-schema-form-table-array.cjs.map +1 -0
- package/dist/components/json-schema-form-table-array.d.ts +7 -0
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.js +123 -0
- package/dist/components/json-schema-form-table-array.js.map +1 -0
- package/dist/components/json-schema-form-tone.cjs +34 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -0
- package/dist/components/json-schema-form-tone.d.ts +8 -0
- package/dist/components/json-schema-form-tone.d.ts.map +1 -0
- package/dist/components/json-schema-form-tone.js +34 -0
- package/dist/components/json-schema-form-tone.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +79 -10
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +47 -4
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +19 -4
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +47 -4
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/tri-state.cjs +8 -0
- package/dist/components/tri-state.cjs.map +1 -0
- package/dist/components/tri-state.d.ts +5 -0
- package/dist/components/tri-state.d.ts.map +1 -0
- package/dist/components/tri-state.js +8 -0
- package/dist/components/tri-state.js.map +1 -0
- package/dist/components/useComboboxLayout.cjs +59 -0
- package/dist/components/useComboboxLayout.cjs.map +1 -0
- package/dist/components/useComboboxLayout.d.ts +5 -0
- package/dist/components/useComboboxLayout.d.ts.map +1 -0
- package/dist/components/useComboboxLayout.js +59 -0
- package/dist/components/useComboboxLayout.js.map +1 -0
- package/dist/components.cjs +21 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +14 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +22 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +51 -2
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +10 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +51 -2
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +185 -53
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +63 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +185 -53
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/LogsTable.cjs +10 -1
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +3 -1
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +10 -1
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TaskManager.cjs +99 -14
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +100 -15
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProgress.cjs +50 -11
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +2 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +50 -11
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.js +289 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.js +120 -0
- package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.js +74 -0
- package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +78 -100
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +80 -102
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.js +120 -0
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +1 -1
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.thread.js +1 -1
- package/dist/data/ai/ChatWindow.thread.js.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +13 -5
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +3 -1
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +3 -1
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +2 -2
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
- package/dist/data/ai/RuntimeModePicker.js +1 -1
- package/dist/data/ai/RuntimeModePicker.js.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +26 -43
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.js +26 -43
- package/dist/data/ai/SessionInspector.files.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +1 -1
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.model.js +1 -1
- package/dist/data/ai/SessionInspector.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +4 -16
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +4 -16
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +65 -3
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +11 -5
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js +65 -3
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +65 -685
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +15 -17
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +64 -683
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +148 -0
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferences.model.js +148 -0
- package/dist/data/ai/ToolPreferences.model.js.map +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs +270 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
- package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferencesList.js +270 -0
- package/dist/data/ai/ToolPreferencesList.js.map +1 -0
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +4 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -0
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +4 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +6 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-tones.cjs +67 -0
- package/dist/data/ai/session-tones.cjs.map +1 -0
- package/dist/data/ai/session-tones.d.ts +34 -0
- package/dist/data/ai/session-tones.d.ts.map +1 -0
- package/dist/data/ai/session-tones.js +67 -0
- package/dist/data/ai/session-tones.js.map +1 -0
- package/dist/data/ai/thread-costs.cjs +39 -0
- package/dist/data/ai/thread-costs.cjs.map +1 -0
- package/dist/data/ai/thread-costs.d.ts +62 -0
- package/dist/data/ai/thread-costs.d.ts.map +1 -0
- package/dist/data/ai/thread-costs.js +39 -0
- package/dist/data/ai/thread-costs.js.map +1 -0
- package/dist/data/cells/CellFilterActions.cjs +68 -0
- package/dist/data/cells/CellFilterActions.cjs.map +1 -0
- package/dist/data/cells/CellFilterActions.d.ts +15 -0
- package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
- package/dist/data/cells/CellFilterActions.js +68 -0
- package/dist/data/cells/CellFilterActions.js.map +1 -0
- package/dist/data/chat/Chat.cjs +156 -113
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +24 -7
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +48 -3
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +48 -3
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +160 -117
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +63 -0
- package/dist/data/chat/Chat.runtime.cjs.map +1 -0
- package/dist/data/chat/Chat.runtime.d.ts +16 -0
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
- package/dist/data/chat/Chat.runtime.js +63 -0
- package/dist/data/chat/Chat.runtime.js.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +86 -24
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +12 -5
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +86 -24
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs +49 -6
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +11 -4
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +49 -6
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/index.d.ts +5 -3
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
- package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.js +50 -0
- package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
- package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.js +155 -0
- package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
- package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.js +140 -0
- package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
- package/dist/data/chat/tool-render/adapter.cjs +48 -0
- package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
- package/dist/data/chat/tool-render/adapter.d.ts +57 -0
- package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
- package/dist/data/chat/tool-render/adapter.js +48 -0
- package/dist/data/chat/tool-render/adapter.js.map +1 -0
- package/dist/data/chat/tool-render/context.cjs +16 -0
- package/dist/data/chat/tool-render/context.cjs.map +1 -0
- package/dist/data/chat/tool-render/context.d.ts +6 -0
- package/dist/data/chat/tool-render/context.d.ts.map +1 -0
- package/dist/data/chat/tool-render/context.js +16 -0
- package/dist/data/chat/tool-render/context.js.map +1 -0
- package/dist/data/chat/tool-render/defaults.cjs +45 -0
- package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
- package/dist/data/chat/tool-render/defaults.d.ts +11 -0
- package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
- package/dist/data/chat/tool-render/defaults.js +45 -0
- package/dist/data/chat/tool-render/defaults.js.map +1 -0
- package/dist/data/chat/tool-render/index.d.ts +13 -0
- package/dist/data/chat/tool-render/index.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.js +208 -0
- package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
- package/dist/data/chat/tool-render/known-tools.cjs +58 -0
- package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
- package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tools.js +58 -0
- package/dist/data/chat/tool-render/known-tools.js.map +1 -0
- package/dist/data/chat/tool-render/normalize.cjs +42 -0
- package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
- package/dist/data/chat/tool-render/normalize.d.ts +13 -0
- package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
- package/dist/data/chat/tool-render/normalize.js +42 -0
- package/dist/data/chat/tool-render/normalize.js.map +1 -0
- package/dist/data/chat/tool-render/registry.cjs +14 -0
- package/dist/data/chat/tool-render/registry.cjs.map +1 -0
- package/dist/data/chat/tool-render/registry.d.ts +7 -0
- package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
- package/dist/data/chat/tool-render/registry.js +14 -0
- package/dist/data/chat/tool-render/registry.js.map +1 -0
- package/dist/data/chat/tool-render/schema.cjs +57 -0
- package/dist/data/chat/tool-render/schema.cjs.map +1 -0
- package/dist/data/chat/tool-render/schema.d.ts +28 -0
- package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
- package/dist/data/chat/tool-render/schema.js +57 -0
- package/dist/data/chat/tool-render/schema.js.map +1 -0
- package/dist/data/chat/tool-render/shape.cjs +94 -0
- package/dist/data/chat/tool-render/shape.cjs.map +1 -0
- package/dist/data/chat/tool-render/shape.d.ts +39 -0
- package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
- package/dist/data/chat/tool-render/shape.js +94 -0
- package/dist/data/chat/tool-render/shape.js.map +1 -0
- package/dist/data/chat/tool-render/summary.cjs +34 -0
- package/dist/data/chat/tool-render/summary.cjs.map +1 -0
- package/dist/data/chat/tool-render/summary.d.ts +8 -0
- package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
- package/dist/data/chat/tool-render/summary.js +34 -0
- package/dist/data/chat/tool-render/summary.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +17 -0
- package/dist/data/chat/usage-snapshot.cjs.map +1 -0
- package/dist/data/chat/usage-snapshot.d.ts +21 -0
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
- package/dist/data/chat/usage-snapshot.js +17 -0
- package/dist/data/chat/usage-snapshot.js.map +1 -0
- package/dist/data/data-table-filter-values.cjs +83 -0
- package/dist/data/data-table-filter-values.cjs.map +1 -0
- package/dist/data/data-table-filter-values.d.ts +18 -0
- package/dist/data/data-table-filter-values.d.ts.map +1 -0
- package/dist/data/data-table-filter-values.js +83 -0
- package/dist/data/data-table-filter-values.js.map +1 -0
- package/dist/data/data-table-server-filters.cjs +171 -0
- package/dist/data/data-table-server-filters.cjs.map +1 -0
- package/dist/data/data-table-server-filters.d.ts +128 -0
- package/dist/data/data-table-server-filters.d.ts.map +1 -0
- package/dist/data/data-table-server-filters.js +171 -0
- package/dist/data/data-table-server-filters.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.cjs +96 -19
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.js +96 -19
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/index.d.ts +1 -1
- package/dist/data/query-browser/index.d.ts.map +1 -1
- package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
- package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.js +187 -0
- package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +147 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.d.ts +8 -6
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +147 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
- package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
- package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +58 -124
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
- package/dist/data/runtime/availability.cjs +11 -0
- package/dist/data/runtime/availability.cjs.map +1 -0
- package/dist/data/runtime/availability.d.ts +6 -0
- package/dist/data/runtime/availability.d.ts.map +1 -0
- package/dist/data/runtime/availability.js +11 -0
- package/dist/data/runtime/availability.js.map +1 -0
- package/dist/data/runtime/model-capabilities.cjs.map +1 -0
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
- package/dist/data/runtime/model-capabilities.js.map +1 -0
- package/dist/data/runtime/provider-status.cjs +106 -0
- package/dist/data/runtime/provider-status.cjs.map +1 -0
- package/dist/data/runtime/provider-status.d.ts +24 -0
- package/dist/data/runtime/provider-status.d.ts.map +1 -0
- package/dist/data/runtime/provider-status.js +106 -0
- package/dist/data/runtime/provider-status.js.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.cjs +119 -27
- package/dist/data/runtime/runtime-mode.cjs.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
- package/dist/data/runtime/runtime-mode.js.map +1 -0
- package/dist/data/task-query-keys.cjs +26 -0
- package/dist/data/task-query-keys.cjs.map +1 -0
- package/dist/data/task-query-keys.d.ts +27 -0
- package/dist/data/task-query-keys.d.ts.map +1 -0
- package/dist/data/task-query-keys.js +26 -0
- package/dist/data/task-query-keys.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +16 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +6 -1
- package/dist/hooks/use-hotkey.cjs.map +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.js +6 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +7 -4
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts +12 -0
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +7 -4
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +692 -0
- package/dist/icons/registry.cjs.map +1 -0
- package/dist/icons/registry.d.ts +21 -0
- package/dist/icons/registry.d.ts.map +1 -0
- package/dist/icons/registry.js +692 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/icons.cjs +3 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +4 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +47 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +49 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +92 -56
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +49 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +92 -56
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +144 -19
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts +6 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +144 -19
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +23 -7
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +3 -1
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +23 -7
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/lib/format.cjs +86 -4
- package/dist/lib/format.cjs.map +1 -1
- package/dist/lib/format.d.ts +69 -0
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +86 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/path-tree.cjs +69 -0
- package/dist/lib/path-tree.cjs.map +1 -0
- package/dist/lib/path-tree.d.ts +54 -0
- package/dist/lib/path-tree.d.ts.map +1 -0
- package/dist/lib/path-tree.js +69 -0
- package/dist/lib/path-tree.js.map +1 -0
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +13 -7
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/overlay/Tour.cjs +173 -0
- package/dist/overlay/Tour.cjs.map +1 -0
- package/dist/overlay/Tour.d.ts +61 -0
- package/dist/overlay/Tour.d.ts.map +1 -0
- package/dist/overlay/Tour.js +173 -0
- package/dist/overlay/Tour.js.map +1 -0
- package/dist/overlay/TourCard.cjs +108 -0
- package/dist/overlay/TourCard.cjs.map +1 -0
- package/dist/overlay/TourCard.d.ts +23 -0
- package/dist/overlay/TourCard.d.ts.map +1 -0
- package/dist/overlay/TourCard.js +108 -0
- package/dist/overlay/TourCard.js.map +1 -0
- package/dist/overlay/TourProvider.cjs +160 -0
- package/dist/overlay/TourProvider.cjs.map +1 -0
- package/dist/overlay/TourProvider.d.ts +31 -0
- package/dist/overlay/TourProvider.d.ts.map +1 -0
- package/dist/overlay/TourProvider.js +160 -0
- package/dist/overlay/TourProvider.js.map +1 -0
- package/dist/overlay/TourSpotlight.cjs +47 -0
- package/dist/overlay/TourSpotlight.cjs.map +1 -0
- package/dist/overlay/TourSpotlight.d.ts +12 -0
- package/dist/overlay/TourSpotlight.d.ts.map +1 -0
- package/dist/overlay/TourSpotlight.js +47 -0
- package/dist/overlay/TourSpotlight.js.map +1 -0
- package/dist/overlay/modalStack.cjs +18 -4
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +10 -2
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +19 -5
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/tour-anchor.cjs +114 -0
- package/dist/overlay/tour-anchor.cjs.map +1 -0
- package/dist/overlay/tour-anchor.d.ts +30 -0
- package/dist/overlay/tour-anchor.d.ts.map +1 -0
- package/dist/overlay/tour-anchor.js +114 -0
- package/dist/overlay/tour-anchor.js.map +1 -0
- package/dist/overlay/tour-context.cjs +12 -0
- package/dist/overlay/tour-context.cjs.map +1 -0
- package/dist/overlay/tour-context.d.ts +40 -0
- package/dist/overlay/tour-context.d.ts.map +1 -0
- package/dist/overlay/tour-context.js +12 -0
- package/dist/overlay/tour-context.js.map +1 -0
- package/dist/overlay/tour-geometry.cjs +65 -0
- package/dist/overlay/tour-geometry.cjs.map +1 -0
- package/dist/overlay/tour-geometry.d.ts +47 -0
- package/dist/overlay/tour-geometry.d.ts.map +1 -0
- package/dist/overlay/tour-geometry.js +65 -0
- package/dist/overlay/tour-geometry.js.map +1 -0
- package/dist/overlay/tour-model.cjs +79 -0
- package/dist/overlay/tour-model.cjs.map +1 -0
- package/dist/overlay/tour-model.d.ts +29 -0
- package/dist/overlay/tour-model.d.ts.map +1 -0
- package/dist/overlay/tour-model.js +79 -0
- package/dist/overlay/tour-model.js.map +1 -0
- package/dist/overlay/tour-progress.cjs +54 -0
- package/dist/overlay/tour-progress.cjs.map +1 -0
- package/dist/overlay/tour-progress.d.ts +40 -0
- package/dist/overlay/tour-progress.d.ts.map +1 -0
- package/dist/overlay/tour-progress.js +54 -0
- package/dist/overlay/tour-progress.js.map +1 -0
- package/dist/overlay/tour-types.d.ts +144 -0
- package/dist/overlay/tour-types.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.cjs +43 -0
- package/dist/overlay/use-tour-anchor.cjs.map +1 -0
- package/dist/overlay/use-tour-anchor.d.ts +23 -0
- package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.js +43 -0
- package/dist/overlay/use-tour-anchor.js.map +1 -0
- package/dist/overlay/use-tour-rect.cjs +33 -0
- package/dist/overlay/use-tour-rect.cjs.map +1 -0
- package/dist/overlay/use-tour-rect.d.ts +12 -0
- package/dist/overlay/use-tour-rect.d.ts.map +1 -0
- package/dist/overlay/use-tour-rect.js +33 -0
- package/dist/overlay/use-tour-rect.js.map +1 -0
- package/dist/overlay/use-tour-step.cjs +66 -0
- package/dist/overlay/use-tour-step.cjs.map +1 -0
- package/dist/overlay/use-tour-step.d.ts +45 -0
- package/dist/overlay/use-tour-step.d.ts.map +1 -0
- package/dist/overlay/use-tour-step.js +66 -0
- package/dist/overlay/use-tour-step.js.map +1 -0
- package/dist/overlay/zIndex.cjs +8 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.d.ts +8 -0
- package/dist/overlay/zIndex.d.ts.map +1 -1
- package/dist/overlay/zIndex.js +8 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +8 -0
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts +4 -1
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +8 -0
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +10 -16
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +10 -16
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +1 -1
- package/dist/rpc/OperationActionBar.cjs.map +1 -1
- package/dist/rpc/OperationActionBar.js +1 -1
- package/dist/rpc/OperationActionBar.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +83 -7
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +84 -8
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +2 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +6 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +2 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/SchemaActionForm.cjs +2 -21
- package/dist/rpc/SchemaActionForm.cjs.map +1 -1
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
- package/dist/rpc/SchemaActionForm.js +3 -22
- package/dist/rpc/SchemaActionForm.js.map +1 -1
- package/dist/rpc/apiClient.cjs +16 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +16 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +89 -49
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +14 -6
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +87 -47
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/operationFilterSearch.cjs +23 -0
- package/dist/rpc/operationFilterSearch.cjs.map +1 -0
- package/dist/rpc/operationFilterSearch.d.ts +22 -0
- package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
- package/dist/rpc/operationFilterSearch.js +23 -0
- package/dist/rpc/operationFilterSearch.js.map +1 -0
- package/dist/rpc/operationLookupFetcher.cjs +28 -0
- package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
- package/dist/rpc/operationLookupFetcher.d.ts +17 -0
- package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
- package/dist/rpc/operationLookupFetcher.js +28 -0
- package/dist/rpc/operationLookupFetcher.js.map +1 -0
- package/dist/rpc/surfaceNav.cjs +77 -0
- package/dist/rpc/surfaceNav.cjs.map +1 -0
- package/dist/rpc/surfaceNav.d.ts +19 -0
- package/dist/rpc/surfaceNav.d.ts.map +1 -0
- package/dist/rpc/surfaceNav.js +77 -0
- package/dist/rpc/surfaceNav.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +12 -1
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +8 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -2
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/data/ai/RuntimeBar.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.js.map +0 -1
- package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.model.js.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.js.map +0 -1
- package/dist/data/ai/model-capabilities.cjs.map +0 -1
- package/dist/data/ai/model-capabilities.d.ts.map +0 -1
- package/dist/data/ai/model-capabilities.js.map +0 -1
- package/dist/data/ai/runtime-mode.cjs.map +0 -1
- package/dist/data/ai/runtime-mode.d.ts.map +0 -1
- package/dist/data/ai/runtime-mode.js.map +0 -1
- /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
- /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.cjs","sources":["../../src/components/Combobox.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { inputSizeClass } from \"./json-schema-form-size\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { ComboboxActions } from \"./ComboboxActions\";\nimport { ComboboxMenu } from \"./ComboboxMenu\";\nimport type {\n ComboboxOption,\n ComboboxProps,\n ComboboxTriStateMode,\n} from \"./combobox-types\";\nimport {\n COMBOBOX_MENU_MAX_HEIGHT_PX,\n COMBOBOX_MENU_MAX_WIDTH_PX,\n comboboxLabelPadding,\n type ComboboxMenuPosition,\n withSelectedComboboxOptions,\n} from \"./combobox-utils\";\n\nexport type {\n ComboboxMultiProps,\n ComboboxOption,\n ComboboxProps,\n ComboboxSingleProps,\n ComboboxTriStateMode,\n ComboboxTriStateProps,\n} from \"./combobox-types\";\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder,\n label,\n ariaLabel: ariaLabelProp,\n disabled,\n required,\n invalid,\n allowCustomValue = true,\n onNew,\n onCreate,\n id,\n size,\n className,\n loading,\n onSearch,\n onKeyDown: onKeyDownProp,\n suffix,\n prefix,\n footer,\n } = props;\n const multiple = props.multiple === true;\n const tristate = props.multiple === true && props.tristate === true;\n const modes = useMemo<Record<string, ComboboxTriStateMode>>(\n () => (props.multiple === true && props.tristate === true ? props.value : {}),\n [props.multiple, props.tristate, props.value],\n );\n const selectedValues = useMemo<string[]>(() => {\n if (props.multiple === true && props.tristate === true) return Object.keys(props.value);\n if (props.multiple === true) return props.value;\n return props.value ? [props.value] : [];\n }, [props.multiple, props.tristate, props.value]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [open, setOpen] = useState(false);\n const floatingZ = useFloatingZIndex();\n const [menuPos, setMenuPos] = useState<ComboboxMenuPosition | null>(null);\n const [query, setQuery] = useState(\"\");\n const [highlighted, setHighlighted] = useState(-1);\n const [labelWidth, setLabelWidth] = useState(0);\n\n const isSelected = (optValue: string) => selectedValues.includes(optValue);\n const selectedOption = useMemo(() => {\n if (multiple) return undefined;\n const selected = selectedValues[0];\n if (!selected) return undefined;\n return (\n options.find((option) => option.value === selected) ??\n (allowCustomValue ? onNew?.(selected) ?? undefined : undefined)\n );\n }, [allowCustomValue, multiple, onNew, options, selectedValues]);\n\n const closedLabel = useMemo(() => {\n if (tristate) {\n const values = Object.values(modes);\n const includes = values.filter((mode) => mode === \"include\").length;\n const excludes = values.length - includes;\n return [includes > 0 && `+${includes}`, excludes > 0 && `-${excludes}`]\n .filter(Boolean)\n .join(\" \");\n }\n if (multiple) {\n const labels = options\n .filter((o) => selectedValues.includes(o.value))\n .map((o) => o.selectedLabel ?? o.label);\n if (labels.length === 0) return \"\";\n if (labels.length <= 2) return labels.join(\", \");\n return `${labels.length} selected`;\n }\n const single = selectedValues[0] ?? \"\";\n return (\n selectedOption?.selectedLabel ?? selectedOption?.label ?? single\n );\n }, [tristate, modes, multiple, options, selectedOption, selectedValues]);\n\n const effectivePrefix =\n prefix ??\n (selectedOption?.icon != null ? (\n <LabelIcon icon={selectedOption.icon} className=\"size-4\" />\n ) : null);\n\n const displayValue = open ? query : closedLabel;\n\n const filtered = useMemo(() => {\n if (onSearch) return withSelectedComboboxOptions(options, selectedValues);\n const q = query.toLowerCase().trim();\n if (!q) return options;\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n );\n }, [onSearch, options, query, selectedValues]);\n\n useEffect(() => {\n if (!onSearch || !open) return;\n const handle = setTimeout(() => onSearch(query.trim()), 250);\n return () => clearTimeout(handle);\n }, [onSearch, open, query]);\n\n const trimmedQuery = query.trim();\n const customEntry = useMemo<ComboboxOption | null>(() => {\n if (\n !allowCustomValue ||\n !trimmedQuery ||\n (!tristate && (multiple || !onNew)) ||\n options.some((option) => option.value === trimmedQuery)\n ) {\n return null;\n }\n if (onNew) return onNew(trimmedQuery);\n return {\n value: trimmedQuery,\n label: `Add \"${trimmedQuery}\"`,\n };\n }, [\n allowCustomValue,\n multiple,\n onNew,\n options,\n trimmedQuery,\n tristate,\n ]);\n const navOptions = useMemo(\n () => (customEntry ? [...filtered, customEntry] : filtered),\n [filtered, customEntry],\n );\n\n useEffect(() => {\n setHighlighted(-1);\n }, [query]);\n useEffect(() => {\n if (highlighted >= navOptions.length) setHighlighted(-1);\n }, [highlighted, navOptions.length]);\n\n useEffect(() => {\n if (!open) return;\n // Dismiss when the pointer goes down, OR focus moves, anywhere outside the\n // control and its portaled listbox — so clicking elsewhere in a dialog (the\n // backdrop never intercepts a document-level listener) or tabbing to another\n // field both close the menu. The listbox is portaled out of rootRef, so a\n // click inside it would otherwise read as \"outside\" and close before select.\n const onAway = (e: Event) => {\n const target = e.target as Node;\n if (!rootRef.current?.contains(target) && !listRef.current?.contains(target)) {\n commitAndClose();\n }\n };\n document.addEventListener(\"mousedown\", onAway);\n document.addEventListener(\"focusin\", onAway);\n return () => {\n document.removeEventListener(\"mousedown\", onAway);\n document.removeEventListener(\"focusin\", onAway);\n };\n });\n\n useLayoutEffect(() => {\n if (label == null) {\n setLabelWidth(0);\n return;\n }\n const el = labelRef.current;\n if (el) setLabelWidth(el.offsetWidth);\n }, [label]);\n\n useLayoutEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n const update = () => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const viewportCap = window.innerWidth - rect.left - 8;\n const maxWidth = Math.max(\n rect.width,\n Math.min(COMBOBOX_MENU_MAX_WIDTH_PX, viewportCap),\n );\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const openUp =\n spaceBelow < COMBOBOX_MENU_MAX_HEIGHT_PX && spaceAbove > spaceBelow;\n const maxHeight = Math.min(\n COMBOBOX_MENU_MAX_HEIGHT_PX,\n openUp ? spaceAbove : spaceBelow,\n );\n setMenuPos({\n ...(openUp\n ? { bottom: window.innerHeight - rect.top + 4 }\n : { top: rect.bottom + 4 }),\n left: rect.left,\n width: rect.width,\n maxWidth,\n maxHeight,\n });\n };\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [open]);\n\n function emit(next: string[]) {\n if (props.multiple === true && props.tristate !== true) {\n props.onChange(next);\n } else if (props.multiple !== true) {\n props.onChange(next[0] ?? \"\");\n }\n }\n\n function emitModes(next: Record<string, ComboboxTriStateMode>) {\n if (props.multiple === true && props.tristate === true) props.onChange(next);\n }\n\n function setMode(value: string, mode: string) {\n const next = { ...modes };\n if (mode === \"include\" || mode === \"exclude\") next[value] = mode;\n else delete next[value];\n emitModes(next);\n }\n\n function cycleOption(value: string) {\n const current = modes[value];\n setMode(\n value,\n current === undefined ? \"include\" : current === \"include\" ? \"exclude\" : \"neutral\",\n );\n }\n\n function openMenu() {\n if (open) return;\n setQuery(\"\");\n setHighlighted(-1);\n setOpen(true);\n }\n\n function commitAndClose() {\n const trimmed = query.trim();\n if (!multiple && allowCustomValue && trimmed && trimmed !== selectedValues[0]) {\n const existing = options.find((option) => option.value === trimmed);\n const candidate = existing ?? (onNew ? onNew(trimmed) : {\n value: trimmed,\n label: trimmed,\n });\n const created = candidate\n ? existing\n ? existing.value\n : onCreate\n ? onCreate(candidate)\n : candidate.value\n : null;\n if (created !== null) emit([created]);\n }\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n\n function selectOption(opt: ComboboxOption) {\n if (opt === customEntry) {\n const created = onCreate ? onCreate(opt) : opt.value;\n if (created !== null) {\n if (tristate) setMode(created, \"include\");\n else emit([created]);\n }\n if (!tristate) {\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n inputRef.current?.focus();\n return;\n }\n if (tristate) {\n cycleOption(opt.value);\n inputRef.current?.focus();\n return;\n }\n if (multiple) {\n const next = isSelected(opt.value)\n ? selectedValues.filter((v) => v !== opt.value)\n : [...selectedValues, opt.value];\n emit(next);\n setHighlighted(-1);\n inputRef.current?.focus();\n return;\n }\n emit([opt.value]);\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function clear() {\n if (selectedValues.length > 0) {\n if (tristate) emitModes({});\n else emit([]);\n }\n setQuery(\"\");\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function scrollToHighlighted(index: number) {\n const list = listRef.current;\n if (!list) return;\n const item = list.querySelectorAll<HTMLElement>('[role=\"option\"]')[index];\n item?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n openMenu();\n return;\n }\n const next = highlighted < navOptions.length - 1 ? highlighted + 1 : 0;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) return;\n const next = highlighted > 0 ? highlighted - 1 : navOptions.length - 1;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"Enter\") {\n if (\n open &&\n highlighted >= 0 &&\n navOptions[highlighted] &&\n !navOptions[highlighted].disabled\n ) {\n e.preventDefault();\n selectOption(navOptions[highlighted]);\n return;\n }\n commitAndClose();\n onKeyDownProp?.(e);\n } else if (e.key === \"Escape\") {\n if (open) {\n e.preventDefault();\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n } else {\n onKeyDownProp?.(e);\n }\n }\n\n const listId = id ? `${id}-listbox` : undefined;\n const ariaLabel = ariaLabelProp ?? (typeof label === \"string\" ? label : undefined);\n const showClear = !required && !loading && !disabled && selectedValues.length > 0;\n\n return (\n <div ref={rootRef} className={cn(\"relative\", className)}>\n <div ref={anchorRef} data-jsf-control className=\"relative flex items-center\">\n {label != null && (\n <span\n ref={labelRef}\n className=\"pointer-events-none absolute left-2 z-10 whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground text-[10px]\"\n >\n {label}\n </span>\n )}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={highlighted >= 0 ? `${listId}-${highlighted}` : undefined}\n aria-label={ariaLabel}\n aria-invalid={invalid || undefined}\n autoComplete=\"off\"\n disabled={disabled}\n placeholder={placeholder}\n value={displayValue}\n {...(!open && closedLabel ? { title: closedLabel } : {})}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={openMenu}\n onClick={() => {\n if (!open) openMenu();\n }}\n onKeyDown={onKeyDown}\n className={cn(\n \"w-full rounded-md border border-input bg-background text-foreground\",\n size ? inputSizeClass[size] : \"h-control-h px-control-px text-sm\",\n effectivePrefix && \"pl-8\",\n suffix ? (showClear ? \"pr-[5.5rem]\" : \"pr-14\") : showClear ? \"pr-14\" : \"pr-8\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n invalid && \"border-destructive focus-visible:ring-destructive\",\n )}\n style={\n label != null\n ? comboboxLabelPadding(label, labelWidth)\n : undefined\n }\n />\n {effectivePrefix && (\n <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{effectivePrefix}</div>\n )}\n {suffix && (\n <div className={cn(\"absolute flex h-full items-center\", showClear ? \"right-[3.75rem]\" : \"right-7\")}>\n {suffix}\n </div>\n )}\n <ComboboxActions\n disabled={disabled}\n loading={loading}\n onClear={clear}\n onToggle={() => {\n if (open) {\n commitAndClose();\n } else {\n openMenu();\n inputRef.current?.focus();\n }\n }}\n showClear={showClear}\n />\n </div>\n {open && menuPos && typeof document !== \"undefined\" && (\n <ComboboxMenu\n customEntry={customEntry}\n filtered={filtered}\n floatingZ={floatingZ}\n footer={footer}\n highlighted={highlighted}\n isSelected={isSelected}\n listId={listId}\n listRef={listRef}\n loading={loading}\n menuPos={menuPos}\n modes={modes}\n multiple={multiple}\n onHighlight={setHighlighted}\n onSelect={selectOption}\n onSetMode={setMode}\n tristate={tristate}\n />\n )}\n </div>\n );\n}\n"],"names":["useMemo","useRef","useState","useFloatingZIndex","jsx","LabelIcon","withSelectedComboboxOptions","useEffect","useLayoutEffect","COMBOBOX_MENU_MAX_WIDTH_PX","COMBOBOX_MENU_MAX_HEIGHT_PX","jsxs","cn","inputSizeClass","comboboxLabelPadding","ComboboxActions","ComboboxMenu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Combobox.cjs","sources":["../../src/components/Combobox.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { ComboboxControl } from \"./ComboboxControl\";\nimport {\n useComboboxLabelWidth,\n useComboboxMenuPosition,\n} from \"./useComboboxLayout\";\nimport { ComboboxMenu } from \"./ComboboxMenu\";\nimport type {\n ComboboxOption,\n ComboboxProps,\n ComboboxTriStateMode,\n} from \"./combobox-types\";\nimport {\n createComboboxCustomEntry,\n multipleComboboxLabel,\n withSelectedComboboxOptions,\n} from \"./combobox-utils\";\n\nexport type {\n ComboboxMultiProps,\n ComboboxOption,\n ComboboxProps,\n ComboboxSingleProps,\n ComboboxTriStateMode,\n ComboboxTriStateProps,\n} from \"./combobox-types\";\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder,\n label,\n ariaLabel: ariaLabelProp,\n disabled,\n required,\n invalid,\n ariaRequired,\n describedBy,\n allowCustomValue = true,\n onNew,\n onCreate,\n id,\n size,\n className,\n loading,\n onSearch,\n onKeyDown: onKeyDownProp,\n suffix,\n prefix,\n footer,\n } = props;\n const multiple = props.multiple === true;\n const tristate = props.multiple === true && props.tristate === true;\n const tags =\n props.multiple === true &&\n props.tristate !== true &&\n props.variant === \"tags\";\n const modes = useMemo<Record<string, ComboboxTriStateMode>>(\n () =>\n props.multiple === true && props.tristate === true ? props.value : {},\n [props.multiple, props.tristate, props.value],\n );\n const selectedValues = useMemo<string[]>(() => {\n if (props.multiple === true && props.tristate === true)\n return Object.keys(props.value);\n if (props.multiple === true) return props.value;\n return props.value ? [props.value] : [];\n }, [props.multiple, props.tristate, props.value]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [open, setOpen] = useState(false);\n const floatingZ = useFloatingZIndex();\n const menuPos = useComboboxMenuPosition(open, anchorRef);\n const [query, setQuery] = useState(\"\");\n const [highlighted, setHighlighted] = useState(-1);\n const labelWidth = useComboboxLabelWidth(label, labelRef);\n\n const isSelected = (optValue: string) => selectedValues.includes(optValue);\n const selectedOption = useMemo(() => {\n if (multiple) return undefined;\n const selected = selectedValues[0];\n if (!selected) return undefined;\n return (\n options.find((option) => option.value === selected) ??\n (allowCustomValue ? (onNew?.(selected) ?? undefined) : undefined)\n );\n }, [allowCustomValue, multiple, onNew, options, selectedValues]);\n\n const closedLabel = useMemo(() => {\n if (tristate) {\n const values = Object.values(modes);\n const includes = values.filter((mode) => mode === \"include\").length;\n const excludes = values.length - includes;\n return [includes > 0 && `+${includes}`, excludes > 0 && `-${excludes}`]\n .filter(Boolean)\n .join(\" \");\n }\n if (multiple) {\n return multipleComboboxLabel(options, selectedValues);\n }\n const single = selectedValues[0] ?? \"\";\n return selectedOption?.selectedLabel ?? selectedOption?.label ?? single;\n }, [tristate, modes, multiple, options, selectedOption, selectedValues]);\n\n const effectivePrefix =\n prefix ??\n (selectedOption?.icon != null ? (\n <LabelIcon icon={selectedOption.icon} className=\"size-4\" />\n ) : null);\n\n const displayValue = tags ? query : open ? query : closedLabel;\n\n const filtered = useMemo(() => {\n if (onSearch) return withSelectedComboboxOptions(options, selectedValues);\n const q = query.toLowerCase().trim();\n if (!q) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q),\n );\n }, [onSearch, options, query, selectedValues]);\n\n useEffect(() => {\n if (!onSearch || !open) return;\n const handle = setTimeout(() => onSearch(query.trim()), 250);\n return () => clearTimeout(handle);\n }, [onSearch, open, query]);\n\n const trimmedQuery = query.trim();\n const customEntry = useMemo<ComboboxOption | null>(\n () =>\n createComboboxCustomEntry({\n allowCustomValue,\n query: trimmedQuery,\n multiple,\n tristate,\n onNew,\n choices: options,\n selectedValues,\n }),\n [\n allowCustomValue,\n multiple,\n onNew,\n options,\n selectedValues,\n trimmedQuery,\n tristate,\n ],\n );\n const navOptions = useMemo(\n () => (customEntry ? [...filtered, customEntry] : filtered),\n [filtered, customEntry],\n );\n\n useEffect(() => {\n setHighlighted(-1);\n }, [query]);\n useEffect(() => {\n if (highlighted >= navOptions.length) setHighlighted(-1);\n }, [highlighted, navOptions.length]);\n\n useEffect(() => {\n if (!open) return;\n // Dismiss when the pointer goes down, OR focus moves, anywhere outside the\n // control and its portaled listbox — so clicking elsewhere in a dialog (the\n // backdrop never intercepts a document-level listener) or tabbing to another\n // field both close the menu. The listbox is portaled out of rootRef, so a\n // click inside it would otherwise read as \"outside\" and close before select.\n const onAway = (e: Event) => {\n const target = e.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !listRef.current?.contains(target)\n ) {\n commitAndClose();\n }\n };\n document.addEventListener(\"mousedown\", onAway);\n document.addEventListener(\"focusin\", onAway);\n return () => {\n document.removeEventListener(\"mousedown\", onAway);\n document.removeEventListener(\"focusin\", onAway);\n };\n });\n\n function emit(next: string[]) {\n if (props.multiple === true && props.tristate !== true) {\n props.onChange(next);\n } else if (props.multiple !== true) {\n props.onChange(next[0] ?? \"\");\n }\n }\n\n function emitModes(next: Record<string, ComboboxTriStateMode>) {\n if (props.multiple === true && props.tristate === true)\n props.onChange(next);\n }\n\n function setMode(value: string, mode: string) {\n const next = { ...modes };\n if (mode === \"include\" || mode === \"exclude\") next[value] = mode;\n else delete next[value];\n emitModes(next);\n }\n\n function cycleOption(value: string) {\n const current = modes[value];\n setMode(\n value,\n current === undefined\n ? \"include\"\n : current === \"include\"\n ? \"exclude\"\n : \"neutral\",\n );\n }\n\n function openMenu() {\n if (open) return;\n setQuery(\"\");\n setHighlighted(-1);\n setOpen(true);\n }\n function createOptionValue(option: ComboboxOption): string | null {\n return onCreate ? onCreate(option) : option.value;\n }\n function emitCustomValue(value: string) {\n if (tristate) {\n setMode(value, \"include\");\n return;\n }\n if (multiple) {\n if (!selectedValues.includes(value)) emit([...selectedValues, value]);\n return;\n }\n emit([value]);\n }\n\n function commitAndClose() {\n const trimmed = query.trim();\n if (customEntry) {\n const created = createOptionValue(customEntry);\n if (created !== null) emitCustomValue(created);\n } else if (\n !multiple &&\n allowCustomValue &&\n trimmed &&\n trimmed !== selectedValues[0]\n ) {\n const existing = options.find((option) => option.value === trimmed);\n const candidate =\n existing ??\n (onNew\n ? onNew(trimmed)\n : {\n value: trimmed,\n label: trimmed,\n });\n const created = candidate\n ? existing\n ? existing.value\n : createOptionValue(candidate)\n : null;\n if (created !== null) emit([created]);\n }\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n\n function selectOption(opt: ComboboxOption) {\n if (opt === customEntry) {\n const created = createOptionValue(opt);\n if (created !== null) emitCustomValue(created);\n setQuery(\"\");\n setHighlighted(-1);\n if (!multiple) {\n setOpen(false);\n }\n inputRef.current?.focus();\n return;\n }\n if (tristate) {\n cycleOption(opt.value);\n inputRef.current?.focus();\n return;\n }\n if (multiple) {\n const next = isSelected(opt.value)\n ? selectedValues.filter((v) => v !== opt.value)\n : [...selectedValues, opt.value];\n emit(next);\n setHighlighted(-1);\n inputRef.current?.focus();\n return;\n }\n emit([opt.value]);\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function clear() {\n if (selectedValues.length > 0) {\n if (tristate) emitModes({});\n else emit([]);\n }\n setQuery(\"\");\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function removeTag(value: string) {\n emit(selectedValues.filter((selected) => selected !== value));\n inputRef.current?.focus();\n }\n\n function scrollToHighlighted(index: number) {\n const list = listRef.current;\n if (!list) return;\n const item = list.querySelectorAll<HTMLElement>('[role=\"option\"]')[index];\n item?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (\n tags &&\n e.key === \"Backspace\" &&\n query === \"\" &&\n selectedValues.length > 0\n ) {\n e.preventDefault();\n emit(selectedValues.slice(0, -1));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n openMenu();\n return;\n }\n const next = highlighted < navOptions.length - 1 ? highlighted + 1 : 0;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) return;\n const next = highlighted > 0 ? highlighted - 1 : navOptions.length - 1;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"Enter\") {\n if (\n open &&\n highlighted >= 0 &&\n navOptions[highlighted] &&\n !navOptions[highlighted].disabled\n ) {\n e.preventDefault();\n selectOption(navOptions[highlighted]);\n return;\n }\n if (open && multiple && customEntry) {\n e.preventDefault();\n selectOption(customEntry);\n return;\n }\n commitAndClose();\n onKeyDownProp?.(e);\n } else if (e.key === \"Escape\") {\n if (open) {\n e.preventDefault();\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n } else {\n onKeyDownProp?.(e);\n }\n }\n\n const listId = id ? `${id}-listbox` : undefined;\n const ariaLabel =\n ariaLabelProp ?? (typeof label === \"string\" ? label : undefined);\n const showClear =\n !required && !loading && !disabled && selectedValues.length > 0;\n\n return (\n <div ref={rootRef} className={cn(\"relative\", className)}>\n <ComboboxControl\n anchorRef={anchorRef}\n ariaLabel={ariaLabel}\n ariaRequired={ariaRequired}\n closedLabel={closedLabel}\n describedBy={describedBy}\n disabled={disabled}\n displayValue={displayValue}\n effectivePrefix={effectivePrefix}\n highlighted={highlighted}\n id={id}\n inputRef={inputRef}\n invalid={invalid}\n label={label}\n labelRef={labelRef}\n labelWidth={labelWidth}\n listId={listId}\n loading={loading}\n onClear={clear}\n onInput={(value) => {\n setQuery(value);\n if (!open) setOpen(true);\n }}\n onKeyDown={onKeyDown}\n onOpen={openMenu}\n onRemoveTag={removeTag}\n onToggle={() => {\n if (open) {\n commitAndClose();\n } else {\n openMenu();\n inputRef.current?.focus();\n }\n }}\n open={open}\n options={options}\n placeholder={placeholder}\n showClear={showClear}\n size={size}\n suffix={suffix}\n tagValues={selectedValues}\n tags={tags}\n />\n {open && menuPos && typeof document !== \"undefined\" && (\n <ComboboxMenu\n customEntry={customEntry}\n filtered={filtered}\n floatingZ={floatingZ}\n footer={footer}\n highlighted={highlighted}\n isSelected={isSelected}\n listId={listId}\n listRef={listRef}\n loading={loading}\n menuPos={menuPos}\n modes={modes}\n multiple={multiple}\n onHighlight={setHighlighted}\n onSelect={selectOption}\n onSetMode={setMode}\n tristate={tristate}\n />\n )}\n </div>\n );\n}\n"],"names":["useMemo","useRef","useState","useFloatingZIndex","useComboboxMenuPosition","useComboboxLabelWidth","multipleComboboxLabel","jsx","LabelIcon","withSelectedComboboxOptions","useEffect","createComboboxCustomEntry","jsxs","cn","ComboboxControl","ComboboxMenu"],"mappings":";;;;;;;;;;;AAoCO,SAAS,SAAS,OAAsB;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,WAAW,MAAM,aAAa;AACpC,QAAM,WAAW,MAAM,aAAa,QAAQ,MAAM,aAAa;AAC/D,QAAM,OACJ,MAAM,aAAa,QACnB,MAAM,aAAa,QACnB,MAAM,YAAY;AACpB,QAAM,QAAQA,MAAAA;AAAAA,IACZ,MACE,MAAM,aAAa,QAAQ,MAAM,aAAa,OAAO,MAAM,QAAQ,CAAA;AAAA,IACrE,CAAC,MAAM,UAAU,MAAM,UAAU,MAAM,KAAK;AAAA,EAAA;AAE9C,QAAM,iBAAiBA,MAAAA,QAAkB,MAAM;AAC7C,QAAI,MAAM,aAAa,QAAQ,MAAM,aAAa;AAChD,aAAO,OAAO,KAAK,MAAM,KAAK;AAChC,QAAI,MAAM,aAAa,KAAM,QAAO,MAAM;AAC1C,WAAO,MAAM,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAA;AAAA,EACvC,GAAG,CAAC,MAAM,UAAU,MAAM,UAAU,MAAM,KAAK,CAAC;AAEhD,QAAM,UAAUC,MAAAA,OAAuB,IAAI;AAC3C,QAAM,YAAYA,MAAAA,OAAuB,IAAI;AAC7C,QAAM,WAAWA,MAAAA,OAAyB,IAAI;AAC9C,QAAM,UAAUA,MAAAA,OAAuB,IAAI;AAC3C,QAAM,WAAWA,MAAAA,OAAwB,IAAI;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAIC,MAAAA,SAAS,KAAK;AACtC,QAAM,YAAYC,WAAAA,kBAAA;AAClB,QAAM,UAAUC,kBAAAA,wBAAwB,MAAM,SAAS;AACvD,QAAM,CAAC,OAAO,QAAQ,IAAIF,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,EAAE;AACjD,QAAM,aAAaG,kBAAAA,sBAAsB,OAAO,QAAQ;AAExD,QAAM,aAAa,CAAC,aAAqB,eAAe,SAAS,QAAQ;AACzE,QAAM,iBAAiBL,MAAAA,QAAQ,MAAM;AACnC,QAAI,SAAU,QAAO;AACrB,UAAM,WAAW,eAAe,CAAC;AACjC,QAAI,CAAC,SAAU,QAAO;AACtB,WACE,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,QAAQ,MACjD,oBAAoB,+BAAQ,cAAa,SAAa;AAAA,EAE3D,GAAG,CAAC,kBAAkB,UAAU,OAAO,SAAS,cAAc,CAAC;AAE/D,QAAM,cAAcA,MAAAA,QAAQ,MAAM;AAChC,QAAI,UAAU;AACZ,YAAM,SAAS,OAAO,OAAO,KAAK;AAClC,YAAM,WAAW,OAAO,OAAO,CAAC,SAAS,SAAS,SAAS,EAAE;AAC7D,YAAM,WAAW,OAAO,SAAS;AACjC,aAAO,CAAC,WAAW,KAAK,IAAI,QAAQ,IAAI,WAAW,KAAK,IAAI,QAAQ,EAAE,EACnE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACb;AACA,QAAI,UAAU;AACZ,aAAOM,cAAAA,sBAAsB,SAAS,cAAc;AAAA,IACtD;AACA,UAAM,SAAS,eAAe,CAAC,KAAK;AACpC,YAAO,iDAAgB,mBAAiB,iDAAgB,UAAS;AAAA,EACnE,GAAG,CAAC,UAAU,OAAO,UAAU,SAAS,gBAAgB,cAAc,CAAC;AAEvE,QAAM,kBACJ,YACC,iDAAgB,SAAQ,OACvBC,2BAAAA,IAACC,KAAAA,WAAA,EAAU,MAAM,eAAe,MAAM,WAAU,SAAA,CAAS,IACvD;AAEN,QAAM,eAAe,OAAO,QAAQ,OAAO,QAAQ;AAEnD,QAAM,WAAWR,MAAAA,QAAQ,MAAM;AAC7B,QAAI,SAAU,QAAOS,0CAA4B,SAAS,cAAc;AACxE,UAAM,IAAI,MAAM,YAAA,EAAc,KAAA;AAC9B,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,QAAQ;AAAA,MACb,CAAC;;AACC,iBAAE,MAAM,cAAc,SAAS,CAAC,OAChC,OAAE,gBAAF,mBAAe,cAAc,SAAS,OACtC,EAAE,MAAM,YAAA,EAAc,SAAS,CAAC;AAAA;AAAA,IAAA;AAAA,EAEtC,GAAG,CAAC,UAAU,SAAS,OAAO,cAAc,CAAC;AAE7CC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,YAAY,CAAC,KAAM;AACxB,UAAM,SAAS,WAAW,MAAM,SAAS,MAAM,KAAA,CAAM,GAAG,GAAG;AAC3D,WAAO,MAAM,aAAa,MAAM;AAAA,EAClC,GAAG,CAAC,UAAU,MAAM,KAAK,CAAC;AAE1B,QAAM,eAAe,MAAM,KAAA;AAC3B,QAAM,cAAcV,MAAAA;AAAAA,IAClB,MACEW,wCAA0B;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IAAA,CACD;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEF,QAAM,aAAaX,MAAAA;AAAAA,IACjB,MAAO,cAAc,CAAC,GAAG,UAAU,WAAW,IAAI;AAAA,IAClD,CAAC,UAAU,WAAW;AAAA,EAAA;AAGxBU,QAAAA,UAAU,MAAM;AACd,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,KAAK,CAAC;AACVA,QAAAA,UAAU,MAAM;AACd,QAAI,eAAe,WAAW,OAAQ,gBAAe,EAAE;AAAA,EACzD,GAAG,CAAC,aAAa,WAAW,MAAM,CAAC;AAEnCA,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAMX,UAAM,SAAS,CAAC,MAAa;;AAC3B,YAAM,SAAS,EAAE;AACjB,UACE,GAAC,aAAQ,YAAR,mBAAiB,SAAS,YAC3B,GAAC,aAAQ,YAAR,mBAAiB,SAAS,UAC3B;AACA,uBAAA;AAAA,MACF;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,MAAM;AAC7C,aAAS,iBAAiB,WAAW,MAAM;AAC3C,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,MAAM;AAChD,eAAS,oBAAoB,WAAW,MAAM;AAAA,IAChD;AAAA,EACF,CAAC;AAED,WAAS,KAAK,MAAgB;AAC5B,QAAI,MAAM,aAAa,QAAQ,MAAM,aAAa,MAAM;AACtD,YAAM,SAAS,IAAI;AAAA,IACrB,WAAW,MAAM,aAAa,MAAM;AAClC,YAAM,SAAS,KAAK,CAAC,KAAK,EAAE;AAAA,IAC9B;AAAA,EACF;AAEA,WAAS,UAAU,MAA4C;AAC7D,QAAI,MAAM,aAAa,QAAQ,MAAM,aAAa;AAChD,YAAM,SAAS,IAAI;AAAA,EACvB;AAEA,WAAS,QAAQ,OAAe,MAAc;AAC5C,UAAM,OAAO,EAAE,GAAG,MAAA;AAClB,QAAI,SAAS,aAAa,SAAS,UAAW,MAAK,KAAK,IAAI;AAAA,QACvD,QAAO,KAAK,KAAK;AACtB,cAAU,IAAI;AAAA,EAChB;AAEA,WAAS,YAAY,OAAe;AAClC,UAAM,UAAU,MAAM,KAAK;AAC3B;AAAA,MACE;AAAA,MACA,YAAY,SACR,YACA,YAAY,YACV,YACA;AAAA,IAAA;AAAA,EAEV;AAEA,WAAS,WAAW;AAClB,QAAI,KAAM;AACV,aAAS,EAAE;AACX,mBAAe,EAAE;AACjB,YAAQ,IAAI;AAAA,EACd;AACA,WAAS,kBAAkB,QAAuC;AAChE,WAAO,WAAW,SAAS,MAAM,IAAI,OAAO;AAAA,EAC9C;AACA,WAAS,gBAAgB,OAAe;AACtC,QAAI,UAAU;AACZ,cAAQ,OAAO,SAAS;AACxB;AAAA,IACF;AACA,QAAI,UAAU;AACZ,UAAI,CAAC,eAAe,SAAS,KAAK,QAAQ,CAAC,GAAG,gBAAgB,KAAK,CAAC;AACpE;AAAA,IACF;AACA,SAAK,CAAC,KAAK,CAAC;AAAA,EACd;AAEA,WAAS,iBAAiB;AACxB,UAAM,UAAU,MAAM,KAAA;AACtB,QAAI,aAAa;AACf,YAAM,UAAU,kBAAkB,WAAW;AAC7C,UAAI,YAAY,KAAM,iBAAgB,OAAO;AAAA,IAC/C,WACE,CAAC,YACD,oBACA,WACA,YAAY,eAAe,CAAC,GAC5B;AACA,YAAM,WAAW,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,OAAO;AAClE,YAAM,YACJ,aACC,QACG,MAAM,OAAO,IACb;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAEf,YAAM,UAAU,YACZ,WACE,SAAS,QACT,kBAAkB,SAAS,IAC7B;AACJ,UAAI,YAAY,KAAM,MAAK,CAAC,OAAO,CAAC;AAAA,IACtC;AACA,aAAS,EAAE;AACX,YAAQ,KAAK;AACb,mBAAe,EAAE;AAAA,EACnB;AAEA,WAAS,aAAa,KAAqB;;AACzC,QAAI,QAAQ,aAAa;AACvB,YAAM,UAAU,kBAAkB,GAAG;AACrC,UAAI,YAAY,KAAM,iBAAgB,OAAO;AAC7C,eAAS,EAAE;AACX,qBAAe,EAAE;AACjB,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK;AAAA,MACf;AACA,qBAAS,YAAT,mBAAkB;AAClB;AAAA,IACF;AACA,QAAI,UAAU;AACZ,kBAAY,IAAI,KAAK;AACrB,qBAAS,YAAT,mBAAkB;AAClB;AAAA,IACF;AACA,QAAI,UAAU;AACZ,YAAM,OAAO,WAAW,IAAI,KAAK,IAC7B,eAAe,OAAO,CAAC,MAAM,MAAM,IAAI,KAAK,IAC5C,CAAC,GAAG,gBAAgB,IAAI,KAAK;AACjC,WAAK,IAAI;AACT,qBAAe,EAAE;AACjB,qBAAS,YAAT,mBAAkB;AAClB;AAAA,IACF;AACA,SAAK,CAAC,IAAI,KAAK,CAAC;AAChB,aAAS,EAAE;AACX,YAAQ,KAAK;AACb,mBAAe,EAAE;AACjB,mBAAS,YAAT,mBAAkB;AAAA,EACpB;AAEA,WAAS,QAAQ;;AACf,QAAI,eAAe,SAAS,GAAG;AAC7B,UAAI,SAAU,WAAU,EAAE;AAAA,UACrB,MAAK,CAAA,CAAE;AAAA,IACd;AACA,aAAS,EAAE;AACX,mBAAe,EAAE;AACjB,mBAAS,YAAT,mBAAkB;AAAA,EACpB;AAEA,WAAS,UAAU,OAAe;;AAChC,SAAK,eAAe,OAAO,CAAC,aAAa,aAAa,KAAK,CAAC;AAC5D,mBAAS,YAAT,mBAAkB;AAAA,EACpB;AAEA,WAAS,oBAAoB,OAAe;;AAC1C,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,KAAK,iBAA8B,iBAAiB,EAAE,KAAK;AACxE,uCAAM,mBAAN,8BAAuB,EAAE,OAAO,UAAA;AAAA,EAClC;AAEA,WAAS,UAAU,GAAoC;AACrD,QACE,QACA,EAAE,QAAQ,eACV,UAAU,MACV,eAAe,SAAS,GACxB;AACA,QAAE,eAAA;AACF,WAAK,eAAe,MAAM,GAAG,EAAE,CAAC;AAAA,IAClC,WAAW,EAAE,QAAQ,aAAa;AAChC,QAAE,eAAA;AACF,UAAI,CAAC,MAAM;AACT,iBAAA;AACA;AAAA,MACF;AACA,YAAM,OAAO,cAAc,WAAW,SAAS,IAAI,cAAc,IAAI;AACrE,qBAAe,IAAI;AACnB,0BAAoB,IAAI;AAAA,IAC1B,WAAW,EAAE,QAAQ,WAAW;AAC9B,QAAE,eAAA;AACF,UAAI,CAAC,KAAM;AACX,YAAM,OAAO,cAAc,IAAI,cAAc,IAAI,WAAW,SAAS;AACrE,qBAAe,IAAI;AACnB,0BAAoB,IAAI;AAAA,IAC1B,WAAW,EAAE,QAAQ,SAAS;AAC5B,UACE,QACA,eAAe,KACf,WAAW,WAAW,KACtB,CAAC,WAAW,WAAW,EAAE,UACzB;AACA,UAAE,eAAA;AACF,qBAAa,WAAW,WAAW,CAAC;AACpC;AAAA,MACF;AACA,UAAI,QAAQ,YAAY,aAAa;AACnC,UAAE,eAAA;AACF,qBAAa,WAAW;AACxB;AAAA,MACF;AACA,qBAAA;AACA,qDAAgB;AAAA,IAClB,WAAW,EAAE,QAAQ,UAAU;AAC7B,UAAI,MAAM;AACR,UAAE,eAAA;AACF,iBAAS,EAAE;AACX,gBAAQ,KAAK;AACb,uBAAe,EAAE;AAAA,MACnB;AAAA,IACF,OAAO;AACL,qDAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAAS,KAAK,GAAG,EAAE,aAAa;AACtC,QAAM,YACJ,kBAAkB,OAAO,UAAU,WAAW,QAAQ;AACxD,QAAM,YACJ,CAAC,YAAY,CAAC,WAAW,CAAC,YAAY,eAAe,SAAS;AAEhE,SACEE,gCAAC,SAAI,KAAK,SAAS,WAAWC,MAAAA,GAAG,YAAY,SAAS,GACpD,UAAA;AAAA,IAAAN,2BAAAA;AAAAA,MAACO,gBAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,SAAS,CAAC,UAAU;AAClB,mBAAS,KAAK;AACd,cAAI,CAAC,KAAM,SAAQ,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,UAAU,MAAM;;AACd,cAAI,MAAM;AACR,2BAAA;AAAA,UACF,OAAO;AACL,qBAAA;AACA,2BAAS,YAAT,mBAAkB;AAAA,UACpB;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MAAA;AAAA,IAAA;AAAA,IAED,QAAQ,WAAW,OAAO,aAAa,eACtCP,2BAAAA;AAAAA,MAACQ,aAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../src/components/Combobox.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../src/components/Combobox.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAEV,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAO1B,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAgb5C"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useRef, useState, useEffect
|
|
2
|
+
import { useMemo, useRef, useState, useEffect } from "react";
|
|
3
3
|
import { cn } from "../lib/utils.js";
|
|
4
4
|
import { LabelIcon } from "../data/Icon.js";
|
|
5
|
-
import { inputSizeClass } from "./json-schema-form-size.js";
|
|
6
5
|
import { useFloatingZIndex } from "../overlay/modalStack.js";
|
|
7
|
-
import {
|
|
6
|
+
import { ComboboxControl } from "./ComboboxControl.js";
|
|
7
|
+
import { useComboboxMenuPosition, useComboboxLabelWidth } from "./useComboboxLayout.js";
|
|
8
8
|
import { ComboboxMenu } from "./ComboboxMenu.js";
|
|
9
|
-
import {
|
|
9
|
+
import { multipleComboboxLabel, withSelectedComboboxOptions, createComboboxCustomEntry } from "./combobox-utils.js";
|
|
10
10
|
function Combobox(props) {
|
|
11
11
|
const {
|
|
12
12
|
options,
|
|
@@ -16,6 +16,8 @@ function Combobox(props) {
|
|
|
16
16
|
disabled,
|
|
17
17
|
required,
|
|
18
18
|
invalid,
|
|
19
|
+
ariaRequired,
|
|
20
|
+
describedBy,
|
|
19
21
|
allowCustomValue = true,
|
|
20
22
|
onNew,
|
|
21
23
|
onCreate,
|
|
@@ -31,12 +33,14 @@ function Combobox(props) {
|
|
|
31
33
|
} = props;
|
|
32
34
|
const multiple = props.multiple === true;
|
|
33
35
|
const tristate = props.multiple === true && props.tristate === true;
|
|
36
|
+
const tags = props.multiple === true && props.tristate !== true && props.variant === "tags";
|
|
34
37
|
const modes = useMemo(
|
|
35
38
|
() => props.multiple === true && props.tristate === true ? props.value : {},
|
|
36
39
|
[props.multiple, props.tristate, props.value]
|
|
37
40
|
);
|
|
38
41
|
const selectedValues = useMemo(() => {
|
|
39
|
-
if (props.multiple === true && props.tristate === true)
|
|
42
|
+
if (props.multiple === true && props.tristate === true)
|
|
43
|
+
return Object.keys(props.value);
|
|
40
44
|
if (props.multiple === true) return props.value;
|
|
41
45
|
return props.value ? [props.value] : [];
|
|
42
46
|
}, [props.multiple, props.tristate, props.value]);
|
|
@@ -47,10 +51,10 @@ function Combobox(props) {
|
|
|
47
51
|
const labelRef = useRef(null);
|
|
48
52
|
const [open, setOpen] = useState(false);
|
|
49
53
|
const floatingZ = useFloatingZIndex();
|
|
50
|
-
const
|
|
54
|
+
const menuPos = useComboboxMenuPosition(open, anchorRef);
|
|
51
55
|
const [query, setQuery] = useState("");
|
|
52
56
|
const [highlighted, setHighlighted] = useState(-1);
|
|
53
|
-
const
|
|
57
|
+
const labelWidth = useComboboxLabelWidth(label, labelRef);
|
|
54
58
|
const isSelected = (optValue) => selectedValues.includes(optValue);
|
|
55
59
|
const selectedOption = useMemo(() => {
|
|
56
60
|
if (multiple) return void 0;
|
|
@@ -66,22 +70,22 @@ function Combobox(props) {
|
|
|
66
70
|
return [includes > 0 && `+${includes}`, excludes > 0 && `-${excludes}`].filter(Boolean).join(" ");
|
|
67
71
|
}
|
|
68
72
|
if (multiple) {
|
|
69
|
-
|
|
70
|
-
if (labels.length === 0) return "";
|
|
71
|
-
if (labels.length <= 2) return labels.join(", ");
|
|
72
|
-
return `${labels.length} selected`;
|
|
73
|
+
return multipleComboboxLabel(options, selectedValues);
|
|
73
74
|
}
|
|
74
75
|
const single = selectedValues[0] ?? "";
|
|
75
76
|
return (selectedOption == null ? void 0 : selectedOption.selectedLabel) ?? (selectedOption == null ? void 0 : selectedOption.label) ?? single;
|
|
76
77
|
}, [tristate, modes, multiple, options, selectedOption, selectedValues]);
|
|
77
78
|
const effectivePrefix = prefix ?? ((selectedOption == null ? void 0 : selectedOption.icon) != null ? /* @__PURE__ */ jsx(LabelIcon, { icon: selectedOption.icon, className: "size-4" }) : null);
|
|
78
|
-
const displayValue = open ? query : closedLabel;
|
|
79
|
+
const displayValue = tags ? query : open ? query : closedLabel;
|
|
79
80
|
const filtered = useMemo(() => {
|
|
80
81
|
if (onSearch) return withSelectedComboboxOptions(options, selectedValues);
|
|
81
82
|
const q = query.toLowerCase().trim();
|
|
82
83
|
if (!q) return options;
|
|
83
84
|
return options.filter(
|
|
84
|
-
(o) =>
|
|
85
|
+
(o) => {
|
|
86
|
+
var _a;
|
|
87
|
+
return o.label.toLowerCase().includes(q) || ((_a = o.description) == null ? void 0 : _a.toLowerCase().includes(q)) || o.value.toLowerCase().includes(q);
|
|
88
|
+
}
|
|
85
89
|
);
|
|
86
90
|
}, [onSearch, options, query, selectedValues]);
|
|
87
91
|
useEffect(() => {
|
|
@@ -90,23 +94,26 @@ function Combobox(props) {
|
|
|
90
94
|
return () => clearTimeout(handle);
|
|
91
95
|
}, [onSearch, open, query]);
|
|
92
96
|
const trimmedQuery = query.trim();
|
|
93
|
-
const customEntry = useMemo(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
97
|
+
const customEntry = useMemo(
|
|
98
|
+
() => createComboboxCustomEntry({
|
|
99
|
+
allowCustomValue,
|
|
100
|
+
query: trimmedQuery,
|
|
101
|
+
multiple,
|
|
102
|
+
tristate,
|
|
103
|
+
onNew,
|
|
104
|
+
choices: options,
|
|
105
|
+
selectedValues
|
|
106
|
+
}),
|
|
107
|
+
[
|
|
108
|
+
allowCustomValue,
|
|
109
|
+
multiple,
|
|
110
|
+
onNew,
|
|
111
|
+
options,
|
|
112
|
+
selectedValues,
|
|
113
|
+
trimmedQuery,
|
|
114
|
+
tristate
|
|
115
|
+
]
|
|
116
|
+
);
|
|
110
117
|
const navOptions = useMemo(
|
|
111
118
|
() => customEntry ? [...filtered, customEntry] : filtered,
|
|
112
119
|
[filtered, customEntry]
|
|
@@ -133,51 +140,6 @@ function Combobox(props) {
|
|
|
133
140
|
document.removeEventListener("focusin", onAway);
|
|
134
141
|
};
|
|
135
142
|
});
|
|
136
|
-
useLayoutEffect(() => {
|
|
137
|
-
if (label == null) {
|
|
138
|
-
setLabelWidth(0);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
const el = labelRef.current;
|
|
142
|
-
if (el) setLabelWidth(el.offsetWidth);
|
|
143
|
-
}, [label]);
|
|
144
|
-
useLayoutEffect(() => {
|
|
145
|
-
if (!open) {
|
|
146
|
-
setMenuPos(null);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
const update = () => {
|
|
150
|
-
const anchor = anchorRef.current;
|
|
151
|
-
if (!anchor) return;
|
|
152
|
-
const rect = anchor.getBoundingClientRect();
|
|
153
|
-
const viewportCap = window.innerWidth - rect.left - 8;
|
|
154
|
-
const maxWidth = Math.max(
|
|
155
|
-
rect.width,
|
|
156
|
-
Math.min(COMBOBOX_MENU_MAX_WIDTH_PX, viewportCap)
|
|
157
|
-
);
|
|
158
|
-
const spaceBelow = window.innerHeight - rect.bottom - 8;
|
|
159
|
-
const spaceAbove = rect.top - 8;
|
|
160
|
-
const openUp = spaceBelow < COMBOBOX_MENU_MAX_HEIGHT_PX && spaceAbove > spaceBelow;
|
|
161
|
-
const maxHeight = Math.min(
|
|
162
|
-
COMBOBOX_MENU_MAX_HEIGHT_PX,
|
|
163
|
-
openUp ? spaceAbove : spaceBelow
|
|
164
|
-
);
|
|
165
|
-
setMenuPos({
|
|
166
|
-
...openUp ? { bottom: window.innerHeight - rect.top + 4 } : { top: rect.bottom + 4 },
|
|
167
|
-
left: rect.left,
|
|
168
|
-
width: rect.width,
|
|
169
|
-
maxWidth,
|
|
170
|
-
maxHeight
|
|
171
|
-
});
|
|
172
|
-
};
|
|
173
|
-
update();
|
|
174
|
-
window.addEventListener("scroll", update, true);
|
|
175
|
-
window.addEventListener("resize", update);
|
|
176
|
-
return () => {
|
|
177
|
-
window.removeEventListener("scroll", update, true);
|
|
178
|
-
window.removeEventListener("resize", update);
|
|
179
|
-
};
|
|
180
|
-
}, [open]);
|
|
181
143
|
function emit(next) {
|
|
182
144
|
if (props.multiple === true && props.tristate !== true) {
|
|
183
145
|
props.onChange(next);
|
|
@@ -186,7 +148,8 @@ function Combobox(props) {
|
|
|
186
148
|
}
|
|
187
149
|
}
|
|
188
150
|
function emitModes(next) {
|
|
189
|
-
if (props.multiple === true && props.tristate === true)
|
|
151
|
+
if (props.multiple === true && props.tristate === true)
|
|
152
|
+
props.onChange(next);
|
|
190
153
|
}
|
|
191
154
|
function setMode(value, mode) {
|
|
192
155
|
const next = { ...modes };
|
|
@@ -207,15 +170,32 @@ function Combobox(props) {
|
|
|
207
170
|
setHighlighted(-1);
|
|
208
171
|
setOpen(true);
|
|
209
172
|
}
|
|
173
|
+
function createOptionValue(option) {
|
|
174
|
+
return onCreate ? onCreate(option) : option.value;
|
|
175
|
+
}
|
|
176
|
+
function emitCustomValue(value) {
|
|
177
|
+
if (tristate) {
|
|
178
|
+
setMode(value, "include");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (multiple) {
|
|
182
|
+
if (!selectedValues.includes(value)) emit([...selectedValues, value]);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
emit([value]);
|
|
186
|
+
}
|
|
210
187
|
function commitAndClose() {
|
|
211
188
|
const trimmed = query.trim();
|
|
212
|
-
if (
|
|
189
|
+
if (customEntry) {
|
|
190
|
+
const created = createOptionValue(customEntry);
|
|
191
|
+
if (created !== null) emitCustomValue(created);
|
|
192
|
+
} else if (!multiple && allowCustomValue && trimmed && trimmed !== selectedValues[0]) {
|
|
213
193
|
const existing = options.find((option) => option.value === trimmed);
|
|
214
194
|
const candidate = existing ?? (onNew ? onNew(trimmed) : {
|
|
215
195
|
value: trimmed,
|
|
216
196
|
label: trimmed
|
|
217
197
|
});
|
|
218
|
-
const created = candidate ? existing ? existing.value :
|
|
198
|
+
const created = candidate ? existing ? existing.value : createOptionValue(candidate) : null;
|
|
219
199
|
if (created !== null) emit([created]);
|
|
220
200
|
}
|
|
221
201
|
setQuery("");
|
|
@@ -225,15 +205,12 @@ function Combobox(props) {
|
|
|
225
205
|
function selectOption(opt) {
|
|
226
206
|
var _a, _b, _c, _d;
|
|
227
207
|
if (opt === customEntry) {
|
|
228
|
-
const created =
|
|
229
|
-
if (created !== null)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
if (!tristate) {
|
|
234
|
-
setQuery("");
|
|
208
|
+
const created = createOptionValue(opt);
|
|
209
|
+
if (created !== null) emitCustomValue(created);
|
|
210
|
+
setQuery("");
|
|
211
|
+
setHighlighted(-1);
|
|
212
|
+
if (!multiple) {
|
|
235
213
|
setOpen(false);
|
|
236
|
-
setHighlighted(-1);
|
|
237
214
|
}
|
|
238
215
|
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
239
216
|
return;
|
|
@@ -266,6 +243,11 @@ function Combobox(props) {
|
|
|
266
243
|
setHighlighted(-1);
|
|
267
244
|
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
268
245
|
}
|
|
246
|
+
function removeTag(value) {
|
|
247
|
+
var _a;
|
|
248
|
+
emit(selectedValues.filter((selected) => selected !== value));
|
|
249
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
250
|
+
}
|
|
269
251
|
function scrollToHighlighted(index) {
|
|
270
252
|
var _a;
|
|
271
253
|
const list = listRef.current;
|
|
@@ -274,7 +256,10 @@ function Combobox(props) {
|
|
|
274
256
|
(_a = item == null ? void 0 : item.scrollIntoView) == null ? void 0 : _a.call(item, { block: "nearest" });
|
|
275
257
|
}
|
|
276
258
|
function onKeyDown(e) {
|
|
277
|
-
if (e.key === "
|
|
259
|
+
if (tags && e.key === "Backspace" && query === "" && selectedValues.length > 0) {
|
|
260
|
+
e.preventDefault();
|
|
261
|
+
emit(selectedValues.slice(0, -1));
|
|
262
|
+
} else if (e.key === "ArrowDown") {
|
|
278
263
|
e.preventDefault();
|
|
279
264
|
if (!open) {
|
|
280
265
|
openMenu();
|
|
@@ -295,6 +280,11 @@ function Combobox(props) {
|
|
|
295
280
|
selectOption(navOptions[highlighted]);
|
|
296
281
|
return;
|
|
297
282
|
}
|
|
283
|
+
if (open && multiple && customEntry) {
|
|
284
|
+
e.preventDefault();
|
|
285
|
+
selectOption(customEntry);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
298
288
|
commitAndClose();
|
|
299
289
|
onKeyDownProp == null ? void 0 : onKeyDownProp(e);
|
|
300
290
|
} else if (e.key === "Escape") {
|
|
@@ -312,74 +302,53 @@ function Combobox(props) {
|
|
|
312
302
|
const ariaLabel = ariaLabelProp ?? (typeof label === "string" ? label : void 0);
|
|
313
303
|
const showClear = !required && !loading && !disabled && selectedValues.length > 0;
|
|
314
304
|
return /* @__PURE__ */ jsxs("div", { ref: rootRef, className: cn("relative", className), children: [
|
|
315
|
-
/* @__PURE__ */
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
effectivePrefix && /* @__PURE__ */ jsx("div", { className: "absolute inset-y-0 left-1.5 flex items-center", children: effectivePrefix }),
|
|
363
|
-
suffix && /* @__PURE__ */ jsx("div", { className: cn("absolute flex h-full items-center", showClear ? "right-[3.75rem]" : "right-7"), children: suffix }),
|
|
364
|
-
/* @__PURE__ */ jsx(
|
|
365
|
-
ComboboxActions,
|
|
366
|
-
{
|
|
367
|
-
disabled,
|
|
368
|
-
loading,
|
|
369
|
-
onClear: clear,
|
|
370
|
-
onToggle: () => {
|
|
371
|
-
var _a;
|
|
372
|
-
if (open) {
|
|
373
|
-
commitAndClose();
|
|
374
|
-
} else {
|
|
375
|
-
openMenu();
|
|
376
|
-
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
377
|
-
}
|
|
378
|
-
},
|
|
379
|
-
showClear
|
|
380
|
-
}
|
|
381
|
-
)
|
|
382
|
-
] }),
|
|
305
|
+
/* @__PURE__ */ jsx(
|
|
306
|
+
ComboboxControl,
|
|
307
|
+
{
|
|
308
|
+
anchorRef,
|
|
309
|
+
ariaLabel,
|
|
310
|
+
ariaRequired,
|
|
311
|
+
closedLabel,
|
|
312
|
+
describedBy,
|
|
313
|
+
disabled,
|
|
314
|
+
displayValue,
|
|
315
|
+
effectivePrefix,
|
|
316
|
+
highlighted,
|
|
317
|
+
id,
|
|
318
|
+
inputRef,
|
|
319
|
+
invalid,
|
|
320
|
+
label,
|
|
321
|
+
labelRef,
|
|
322
|
+
labelWidth,
|
|
323
|
+
listId,
|
|
324
|
+
loading,
|
|
325
|
+
onClear: clear,
|
|
326
|
+
onInput: (value) => {
|
|
327
|
+
setQuery(value);
|
|
328
|
+
if (!open) setOpen(true);
|
|
329
|
+
},
|
|
330
|
+
onKeyDown,
|
|
331
|
+
onOpen: openMenu,
|
|
332
|
+
onRemoveTag: removeTag,
|
|
333
|
+
onToggle: () => {
|
|
334
|
+
var _a;
|
|
335
|
+
if (open) {
|
|
336
|
+
commitAndClose();
|
|
337
|
+
} else {
|
|
338
|
+
openMenu();
|
|
339
|
+
(_a = inputRef.current) == null ? void 0 : _a.focus();
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
open,
|
|
343
|
+
options,
|
|
344
|
+
placeholder,
|
|
345
|
+
showClear,
|
|
346
|
+
size,
|
|
347
|
+
suffix,
|
|
348
|
+
tagValues: selectedValues,
|
|
349
|
+
tags
|
|
350
|
+
}
|
|
351
|
+
),
|
|
383
352
|
open && menuPos && typeof document !== "undefined" && /* @__PURE__ */ jsx(
|
|
384
353
|
ComboboxMenu,
|
|
385
354
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combobox.js","sources":["../../src/components/Combobox.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { inputSizeClass } from \"./json-schema-form-size\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { ComboboxActions } from \"./ComboboxActions\";\nimport { ComboboxMenu } from \"./ComboboxMenu\";\nimport type {\n ComboboxOption,\n ComboboxProps,\n ComboboxTriStateMode,\n} from \"./combobox-types\";\nimport {\n COMBOBOX_MENU_MAX_HEIGHT_PX,\n COMBOBOX_MENU_MAX_WIDTH_PX,\n comboboxLabelPadding,\n type ComboboxMenuPosition,\n withSelectedComboboxOptions,\n} from \"./combobox-utils\";\n\nexport type {\n ComboboxMultiProps,\n ComboboxOption,\n ComboboxProps,\n ComboboxSingleProps,\n ComboboxTriStateMode,\n ComboboxTriStateProps,\n} from \"./combobox-types\";\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder,\n label,\n ariaLabel: ariaLabelProp,\n disabled,\n required,\n invalid,\n allowCustomValue = true,\n onNew,\n onCreate,\n id,\n size,\n className,\n loading,\n onSearch,\n onKeyDown: onKeyDownProp,\n suffix,\n prefix,\n footer,\n } = props;\n const multiple = props.multiple === true;\n const tristate = props.multiple === true && props.tristate === true;\n const modes = useMemo<Record<string, ComboboxTriStateMode>>(\n () => (props.multiple === true && props.tristate === true ? props.value : {}),\n [props.multiple, props.tristate, props.value],\n );\n const selectedValues = useMemo<string[]>(() => {\n if (props.multiple === true && props.tristate === true) return Object.keys(props.value);\n if (props.multiple === true) return props.value;\n return props.value ? [props.value] : [];\n }, [props.multiple, props.tristate, props.value]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [open, setOpen] = useState(false);\n const floatingZ = useFloatingZIndex();\n const [menuPos, setMenuPos] = useState<ComboboxMenuPosition | null>(null);\n const [query, setQuery] = useState(\"\");\n const [highlighted, setHighlighted] = useState(-1);\n const [labelWidth, setLabelWidth] = useState(0);\n\n const isSelected = (optValue: string) => selectedValues.includes(optValue);\n const selectedOption = useMemo(() => {\n if (multiple) return undefined;\n const selected = selectedValues[0];\n if (!selected) return undefined;\n return (\n options.find((option) => option.value === selected) ??\n (allowCustomValue ? onNew?.(selected) ?? undefined : undefined)\n );\n }, [allowCustomValue, multiple, onNew, options, selectedValues]);\n\n const closedLabel = useMemo(() => {\n if (tristate) {\n const values = Object.values(modes);\n const includes = values.filter((mode) => mode === \"include\").length;\n const excludes = values.length - includes;\n return [includes > 0 && `+${includes}`, excludes > 0 && `-${excludes}`]\n .filter(Boolean)\n .join(\" \");\n }\n if (multiple) {\n const labels = options\n .filter((o) => selectedValues.includes(o.value))\n .map((o) => o.selectedLabel ?? o.label);\n if (labels.length === 0) return \"\";\n if (labels.length <= 2) return labels.join(\", \");\n return `${labels.length} selected`;\n }\n const single = selectedValues[0] ?? \"\";\n return (\n selectedOption?.selectedLabel ?? selectedOption?.label ?? single\n );\n }, [tristate, modes, multiple, options, selectedOption, selectedValues]);\n\n const effectivePrefix =\n prefix ??\n (selectedOption?.icon != null ? (\n <LabelIcon icon={selectedOption.icon} className=\"size-4\" />\n ) : null);\n\n const displayValue = open ? query : closedLabel;\n\n const filtered = useMemo(() => {\n if (onSearch) return withSelectedComboboxOptions(options, selectedValues);\n const q = query.toLowerCase().trim();\n if (!q) return options;\n return options.filter(\n (o) => o.label.toLowerCase().includes(q) || o.value.toLowerCase().includes(q),\n );\n }, [onSearch, options, query, selectedValues]);\n\n useEffect(() => {\n if (!onSearch || !open) return;\n const handle = setTimeout(() => onSearch(query.trim()), 250);\n return () => clearTimeout(handle);\n }, [onSearch, open, query]);\n\n const trimmedQuery = query.trim();\n const customEntry = useMemo<ComboboxOption | null>(() => {\n if (\n !allowCustomValue ||\n !trimmedQuery ||\n (!tristate && (multiple || !onNew)) ||\n options.some((option) => option.value === trimmedQuery)\n ) {\n return null;\n }\n if (onNew) return onNew(trimmedQuery);\n return {\n value: trimmedQuery,\n label: `Add \"${trimmedQuery}\"`,\n };\n }, [\n allowCustomValue,\n multiple,\n onNew,\n options,\n trimmedQuery,\n tristate,\n ]);\n const navOptions = useMemo(\n () => (customEntry ? [...filtered, customEntry] : filtered),\n [filtered, customEntry],\n );\n\n useEffect(() => {\n setHighlighted(-1);\n }, [query]);\n useEffect(() => {\n if (highlighted >= navOptions.length) setHighlighted(-1);\n }, [highlighted, navOptions.length]);\n\n useEffect(() => {\n if (!open) return;\n // Dismiss when the pointer goes down, OR focus moves, anywhere outside the\n // control and its portaled listbox — so clicking elsewhere in a dialog (the\n // backdrop never intercepts a document-level listener) or tabbing to another\n // field both close the menu. The listbox is portaled out of rootRef, so a\n // click inside it would otherwise read as \"outside\" and close before select.\n const onAway = (e: Event) => {\n const target = e.target as Node;\n if (!rootRef.current?.contains(target) && !listRef.current?.contains(target)) {\n commitAndClose();\n }\n };\n document.addEventListener(\"mousedown\", onAway);\n document.addEventListener(\"focusin\", onAway);\n return () => {\n document.removeEventListener(\"mousedown\", onAway);\n document.removeEventListener(\"focusin\", onAway);\n };\n });\n\n useLayoutEffect(() => {\n if (label == null) {\n setLabelWidth(0);\n return;\n }\n const el = labelRef.current;\n if (el) setLabelWidth(el.offsetWidth);\n }, [label]);\n\n useLayoutEffect(() => {\n if (!open) {\n setMenuPos(null);\n return;\n }\n const update = () => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const viewportCap = window.innerWidth - rect.left - 8;\n const maxWidth = Math.max(\n rect.width,\n Math.min(COMBOBOX_MENU_MAX_WIDTH_PX, viewportCap),\n );\n const spaceBelow = window.innerHeight - rect.bottom - 8;\n const spaceAbove = rect.top - 8;\n const openUp =\n spaceBelow < COMBOBOX_MENU_MAX_HEIGHT_PX && spaceAbove > spaceBelow;\n const maxHeight = Math.min(\n COMBOBOX_MENU_MAX_HEIGHT_PX,\n openUp ? spaceAbove : spaceBelow,\n );\n setMenuPos({\n ...(openUp\n ? { bottom: window.innerHeight - rect.top + 4 }\n : { top: rect.bottom + 4 }),\n left: rect.left,\n width: rect.width,\n maxWidth,\n maxHeight,\n });\n };\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n };\n }, [open]);\n\n function emit(next: string[]) {\n if (props.multiple === true && props.tristate !== true) {\n props.onChange(next);\n } else if (props.multiple !== true) {\n props.onChange(next[0] ?? \"\");\n }\n }\n\n function emitModes(next: Record<string, ComboboxTriStateMode>) {\n if (props.multiple === true && props.tristate === true) props.onChange(next);\n }\n\n function setMode(value: string, mode: string) {\n const next = { ...modes };\n if (mode === \"include\" || mode === \"exclude\") next[value] = mode;\n else delete next[value];\n emitModes(next);\n }\n\n function cycleOption(value: string) {\n const current = modes[value];\n setMode(\n value,\n current === undefined ? \"include\" : current === \"include\" ? \"exclude\" : \"neutral\",\n );\n }\n\n function openMenu() {\n if (open) return;\n setQuery(\"\");\n setHighlighted(-1);\n setOpen(true);\n }\n\n function commitAndClose() {\n const trimmed = query.trim();\n if (!multiple && allowCustomValue && trimmed && trimmed !== selectedValues[0]) {\n const existing = options.find((option) => option.value === trimmed);\n const candidate = existing ?? (onNew ? onNew(trimmed) : {\n value: trimmed,\n label: trimmed,\n });\n const created = candidate\n ? existing\n ? existing.value\n : onCreate\n ? onCreate(candidate)\n : candidate.value\n : null;\n if (created !== null) emit([created]);\n }\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n\n function selectOption(opt: ComboboxOption) {\n if (opt === customEntry) {\n const created = onCreate ? onCreate(opt) : opt.value;\n if (created !== null) {\n if (tristate) setMode(created, \"include\");\n else emit([created]);\n }\n if (!tristate) {\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n inputRef.current?.focus();\n return;\n }\n if (tristate) {\n cycleOption(opt.value);\n inputRef.current?.focus();\n return;\n }\n if (multiple) {\n const next = isSelected(opt.value)\n ? selectedValues.filter((v) => v !== opt.value)\n : [...selectedValues, opt.value];\n emit(next);\n setHighlighted(-1);\n inputRef.current?.focus();\n return;\n }\n emit([opt.value]);\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function clear() {\n if (selectedValues.length > 0) {\n if (tristate) emitModes({});\n else emit([]);\n }\n setQuery(\"\");\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function scrollToHighlighted(index: number) {\n const list = listRef.current;\n if (!list) return;\n const item = list.querySelectorAll<HTMLElement>('[role=\"option\"]')[index];\n item?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n openMenu();\n return;\n }\n const next = highlighted < navOptions.length - 1 ? highlighted + 1 : 0;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) return;\n const next = highlighted > 0 ? highlighted - 1 : navOptions.length - 1;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"Enter\") {\n if (\n open &&\n highlighted >= 0 &&\n navOptions[highlighted] &&\n !navOptions[highlighted].disabled\n ) {\n e.preventDefault();\n selectOption(navOptions[highlighted]);\n return;\n }\n commitAndClose();\n onKeyDownProp?.(e);\n } else if (e.key === \"Escape\") {\n if (open) {\n e.preventDefault();\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n } else {\n onKeyDownProp?.(e);\n }\n }\n\n const listId = id ? `${id}-listbox` : undefined;\n const ariaLabel = ariaLabelProp ?? (typeof label === \"string\" ? label : undefined);\n const showClear = !required && !loading && !disabled && selectedValues.length > 0;\n\n return (\n <div ref={rootRef} className={cn(\"relative\", className)}>\n <div ref={anchorRef} data-jsf-control className=\"relative flex items-center\">\n {label != null && (\n <span\n ref={labelRef}\n className=\"pointer-events-none absolute left-2 z-10 whitespace-nowrap font-medium uppercase tracking-wide text-muted-foreground text-[10px]\"\n >\n {label}\n </span>\n )}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-activedescendant={highlighted >= 0 ? `${listId}-${highlighted}` : undefined}\n aria-label={ariaLabel}\n aria-invalid={invalid || undefined}\n autoComplete=\"off\"\n disabled={disabled}\n placeholder={placeholder}\n value={displayValue}\n {...(!open && closedLabel ? { title: closedLabel } : {})}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!open) setOpen(true);\n }}\n onFocus={openMenu}\n onClick={() => {\n if (!open) openMenu();\n }}\n onKeyDown={onKeyDown}\n className={cn(\n \"w-full rounded-md border border-input bg-background text-foreground\",\n size ? inputSizeClass[size] : \"h-control-h px-control-px text-sm\",\n effectivePrefix && \"pl-8\",\n suffix ? (showClear ? \"pr-[5.5rem]\" : \"pr-14\") : showClear ? \"pr-14\" : \"pr-8\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n invalid && \"border-destructive focus-visible:ring-destructive\",\n )}\n style={\n label != null\n ? comboboxLabelPadding(label, labelWidth)\n : undefined\n }\n />\n {effectivePrefix && (\n <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{effectivePrefix}</div>\n )}\n {suffix && (\n <div className={cn(\"absolute flex h-full items-center\", showClear ? \"right-[3.75rem]\" : \"right-7\")}>\n {suffix}\n </div>\n )}\n <ComboboxActions\n disabled={disabled}\n loading={loading}\n onClear={clear}\n onToggle={() => {\n if (open) {\n commitAndClose();\n } else {\n openMenu();\n inputRef.current?.focus();\n }\n }}\n showClear={showClear}\n />\n </div>\n {open && menuPos && typeof document !== \"undefined\" && (\n <ComboboxMenu\n customEntry={customEntry}\n filtered={filtered}\n floatingZ={floatingZ}\n footer={footer}\n highlighted={highlighted}\n isSelected={isSelected}\n listId={listId}\n listRef={listRef}\n loading={loading}\n menuPos={menuPos}\n modes={modes}\n multiple={multiple}\n onHighlight={setHighlighted}\n onSelect={selectOption}\n onSetMode={setMode}\n tristate={tristate}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Combobox.js","sources":["../../src/components/Combobox.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { ComboboxControl } from \"./ComboboxControl\";\nimport {\n useComboboxLabelWidth,\n useComboboxMenuPosition,\n} from \"./useComboboxLayout\";\nimport { ComboboxMenu } from \"./ComboboxMenu\";\nimport type {\n ComboboxOption,\n ComboboxProps,\n ComboboxTriStateMode,\n} from \"./combobox-types\";\nimport {\n createComboboxCustomEntry,\n multipleComboboxLabel,\n withSelectedComboboxOptions,\n} from \"./combobox-utils\";\n\nexport type {\n ComboboxMultiProps,\n ComboboxOption,\n ComboboxProps,\n ComboboxSingleProps,\n ComboboxTriStateMode,\n ComboboxTriStateProps,\n} from \"./combobox-types\";\n\nexport function Combobox(props: ComboboxProps) {\n const {\n options,\n placeholder,\n label,\n ariaLabel: ariaLabelProp,\n disabled,\n required,\n invalid,\n ariaRequired,\n describedBy,\n allowCustomValue = true,\n onNew,\n onCreate,\n id,\n size,\n className,\n loading,\n onSearch,\n onKeyDown: onKeyDownProp,\n suffix,\n prefix,\n footer,\n } = props;\n const multiple = props.multiple === true;\n const tristate = props.multiple === true && props.tristate === true;\n const tags =\n props.multiple === true &&\n props.tristate !== true &&\n props.variant === \"tags\";\n const modes = useMemo<Record<string, ComboboxTriStateMode>>(\n () =>\n props.multiple === true && props.tristate === true ? props.value : {},\n [props.multiple, props.tristate, props.value],\n );\n const selectedValues = useMemo<string[]>(() => {\n if (props.multiple === true && props.tristate === true)\n return Object.keys(props.value);\n if (props.multiple === true) return props.value;\n return props.value ? [props.value] : [];\n }, [props.multiple, props.tristate, props.value]);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const labelRef = useRef<HTMLSpanElement>(null);\n const [open, setOpen] = useState(false);\n const floatingZ = useFloatingZIndex();\n const menuPos = useComboboxMenuPosition(open, anchorRef);\n const [query, setQuery] = useState(\"\");\n const [highlighted, setHighlighted] = useState(-1);\n const labelWidth = useComboboxLabelWidth(label, labelRef);\n\n const isSelected = (optValue: string) => selectedValues.includes(optValue);\n const selectedOption = useMemo(() => {\n if (multiple) return undefined;\n const selected = selectedValues[0];\n if (!selected) return undefined;\n return (\n options.find((option) => option.value === selected) ??\n (allowCustomValue ? (onNew?.(selected) ?? undefined) : undefined)\n );\n }, [allowCustomValue, multiple, onNew, options, selectedValues]);\n\n const closedLabel = useMemo(() => {\n if (tristate) {\n const values = Object.values(modes);\n const includes = values.filter((mode) => mode === \"include\").length;\n const excludes = values.length - includes;\n return [includes > 0 && `+${includes}`, excludes > 0 && `-${excludes}`]\n .filter(Boolean)\n .join(\" \");\n }\n if (multiple) {\n return multipleComboboxLabel(options, selectedValues);\n }\n const single = selectedValues[0] ?? \"\";\n return selectedOption?.selectedLabel ?? selectedOption?.label ?? single;\n }, [tristate, modes, multiple, options, selectedOption, selectedValues]);\n\n const effectivePrefix =\n prefix ??\n (selectedOption?.icon != null ? (\n <LabelIcon icon={selectedOption.icon} className=\"size-4\" />\n ) : null);\n\n const displayValue = tags ? query : open ? query : closedLabel;\n\n const filtered = useMemo(() => {\n if (onSearch) return withSelectedComboboxOptions(options, selectedValues);\n const q = query.toLowerCase().trim();\n if (!q) return options;\n return options.filter(\n (o) =>\n o.label.toLowerCase().includes(q) ||\n o.description?.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q),\n );\n }, [onSearch, options, query, selectedValues]);\n\n useEffect(() => {\n if (!onSearch || !open) return;\n const handle = setTimeout(() => onSearch(query.trim()), 250);\n return () => clearTimeout(handle);\n }, [onSearch, open, query]);\n\n const trimmedQuery = query.trim();\n const customEntry = useMemo<ComboboxOption | null>(\n () =>\n createComboboxCustomEntry({\n allowCustomValue,\n query: trimmedQuery,\n multiple,\n tristate,\n onNew,\n choices: options,\n selectedValues,\n }),\n [\n allowCustomValue,\n multiple,\n onNew,\n options,\n selectedValues,\n trimmedQuery,\n tristate,\n ],\n );\n const navOptions = useMemo(\n () => (customEntry ? [...filtered, customEntry] : filtered),\n [filtered, customEntry],\n );\n\n useEffect(() => {\n setHighlighted(-1);\n }, [query]);\n useEffect(() => {\n if (highlighted >= navOptions.length) setHighlighted(-1);\n }, [highlighted, navOptions.length]);\n\n useEffect(() => {\n if (!open) return;\n // Dismiss when the pointer goes down, OR focus moves, anywhere outside the\n // control and its portaled listbox — so clicking elsewhere in a dialog (the\n // backdrop never intercepts a document-level listener) or tabbing to another\n // field both close the menu. The listbox is portaled out of rootRef, so a\n // click inside it would otherwise read as \"outside\" and close before select.\n const onAway = (e: Event) => {\n const target = e.target as Node;\n if (\n !rootRef.current?.contains(target) &&\n !listRef.current?.contains(target)\n ) {\n commitAndClose();\n }\n };\n document.addEventListener(\"mousedown\", onAway);\n document.addEventListener(\"focusin\", onAway);\n return () => {\n document.removeEventListener(\"mousedown\", onAway);\n document.removeEventListener(\"focusin\", onAway);\n };\n });\n\n function emit(next: string[]) {\n if (props.multiple === true && props.tristate !== true) {\n props.onChange(next);\n } else if (props.multiple !== true) {\n props.onChange(next[0] ?? \"\");\n }\n }\n\n function emitModes(next: Record<string, ComboboxTriStateMode>) {\n if (props.multiple === true && props.tristate === true)\n props.onChange(next);\n }\n\n function setMode(value: string, mode: string) {\n const next = { ...modes };\n if (mode === \"include\" || mode === \"exclude\") next[value] = mode;\n else delete next[value];\n emitModes(next);\n }\n\n function cycleOption(value: string) {\n const current = modes[value];\n setMode(\n value,\n current === undefined\n ? \"include\"\n : current === \"include\"\n ? \"exclude\"\n : \"neutral\",\n );\n }\n\n function openMenu() {\n if (open) return;\n setQuery(\"\");\n setHighlighted(-1);\n setOpen(true);\n }\n function createOptionValue(option: ComboboxOption): string | null {\n return onCreate ? onCreate(option) : option.value;\n }\n function emitCustomValue(value: string) {\n if (tristate) {\n setMode(value, \"include\");\n return;\n }\n if (multiple) {\n if (!selectedValues.includes(value)) emit([...selectedValues, value]);\n return;\n }\n emit([value]);\n }\n\n function commitAndClose() {\n const trimmed = query.trim();\n if (customEntry) {\n const created = createOptionValue(customEntry);\n if (created !== null) emitCustomValue(created);\n } else if (\n !multiple &&\n allowCustomValue &&\n trimmed &&\n trimmed !== selectedValues[0]\n ) {\n const existing = options.find((option) => option.value === trimmed);\n const candidate =\n existing ??\n (onNew\n ? onNew(trimmed)\n : {\n value: trimmed,\n label: trimmed,\n });\n const created = candidate\n ? existing\n ? existing.value\n : createOptionValue(candidate)\n : null;\n if (created !== null) emit([created]);\n }\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n\n function selectOption(opt: ComboboxOption) {\n if (opt === customEntry) {\n const created = createOptionValue(opt);\n if (created !== null) emitCustomValue(created);\n setQuery(\"\");\n setHighlighted(-1);\n if (!multiple) {\n setOpen(false);\n }\n inputRef.current?.focus();\n return;\n }\n if (tristate) {\n cycleOption(opt.value);\n inputRef.current?.focus();\n return;\n }\n if (multiple) {\n const next = isSelected(opt.value)\n ? selectedValues.filter((v) => v !== opt.value)\n : [...selectedValues, opt.value];\n emit(next);\n setHighlighted(-1);\n inputRef.current?.focus();\n return;\n }\n emit([opt.value]);\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function clear() {\n if (selectedValues.length > 0) {\n if (tristate) emitModes({});\n else emit([]);\n }\n setQuery(\"\");\n setHighlighted(-1);\n inputRef.current?.focus();\n }\n\n function removeTag(value: string) {\n emit(selectedValues.filter((selected) => selected !== value));\n inputRef.current?.focus();\n }\n\n function scrollToHighlighted(index: number) {\n const list = listRef.current;\n if (!list) return;\n const item = list.querySelectorAll<HTMLElement>('[role=\"option\"]')[index];\n item?.scrollIntoView?.({ block: \"nearest\" });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (\n tags &&\n e.key === \"Backspace\" &&\n query === \"\" &&\n selectedValues.length > 0\n ) {\n e.preventDefault();\n emit(selectedValues.slice(0, -1));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!open) {\n openMenu();\n return;\n }\n const next = highlighted < navOptions.length - 1 ? highlighted + 1 : 0;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n if (!open) return;\n const next = highlighted > 0 ? highlighted - 1 : navOptions.length - 1;\n setHighlighted(next);\n scrollToHighlighted(next);\n } else if (e.key === \"Enter\") {\n if (\n open &&\n highlighted >= 0 &&\n navOptions[highlighted] &&\n !navOptions[highlighted].disabled\n ) {\n e.preventDefault();\n selectOption(navOptions[highlighted]);\n return;\n }\n if (open && multiple && customEntry) {\n e.preventDefault();\n selectOption(customEntry);\n return;\n }\n commitAndClose();\n onKeyDownProp?.(e);\n } else if (e.key === \"Escape\") {\n if (open) {\n e.preventDefault();\n setQuery(\"\");\n setOpen(false);\n setHighlighted(-1);\n }\n } else {\n onKeyDownProp?.(e);\n }\n }\n\n const listId = id ? `${id}-listbox` : undefined;\n const ariaLabel =\n ariaLabelProp ?? (typeof label === \"string\" ? label : undefined);\n const showClear =\n !required && !loading && !disabled && selectedValues.length > 0;\n\n return (\n <div ref={rootRef} className={cn(\"relative\", className)}>\n <ComboboxControl\n anchorRef={anchorRef}\n ariaLabel={ariaLabel}\n ariaRequired={ariaRequired}\n closedLabel={closedLabel}\n describedBy={describedBy}\n disabled={disabled}\n displayValue={displayValue}\n effectivePrefix={effectivePrefix}\n highlighted={highlighted}\n id={id}\n inputRef={inputRef}\n invalid={invalid}\n label={label}\n labelRef={labelRef}\n labelWidth={labelWidth}\n listId={listId}\n loading={loading}\n onClear={clear}\n onInput={(value) => {\n setQuery(value);\n if (!open) setOpen(true);\n }}\n onKeyDown={onKeyDown}\n onOpen={openMenu}\n onRemoveTag={removeTag}\n onToggle={() => {\n if (open) {\n commitAndClose();\n } else {\n openMenu();\n inputRef.current?.focus();\n }\n }}\n open={open}\n options={options}\n placeholder={placeholder}\n showClear={showClear}\n size={size}\n suffix={suffix}\n tagValues={selectedValues}\n tags={tags}\n />\n {open && menuPos && typeof document !== \"undefined\" && (\n <ComboboxMenu\n customEntry={customEntry}\n filtered={filtered}\n floatingZ={floatingZ}\n footer={footer}\n highlighted={highlighted}\n isSelected={isSelected}\n listId={listId}\n listRef={listRef}\n loading={loading}\n menuPos={menuPos}\n modes={modes}\n multiple={multiple}\n onHighlight={setHighlighted}\n onSelect={selectOption}\n onSetMode={setMode}\n tristate={tristate}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|