@flanksource/clicky-ui 0.3.15 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +10 -0
- package/dist/ai.cjs +33 -4
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +31 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +6 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +7 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +92 -170
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -111
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +95 -173
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxActions.cjs +70 -0
- package/dist/components/ComboboxActions.cjs.map +1 -0
- package/dist/components/ComboboxActions.d.ts +8 -0
- package/dist/components/ComboboxActions.d.ts.map +1 -0
- package/dist/components/ComboboxActions.js +70 -0
- package/dist/components/ComboboxActions.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +160 -0
- package/dist/components/ComboboxMenu.cjs.map +1 -0
- package/dist/components/ComboboxMenu.d.ts +22 -0
- package/dist/components/ComboboxMenu.d.ts.map +1 -0
- package/dist/components/ComboboxMenu.js +160 -0
- package/dist/components/ComboboxMenu.js.map +1 -0
- package/dist/components/EndpointSelector.cjs +407 -0
- package/dist/components/EndpointSelector.cjs.map +1 -0
- package/dist/components/EndpointSelector.d.ts +3 -0
- package/dist/components/EndpointSelector.d.ts.map +1 -0
- package/dist/components/EndpointSelector.js +407 -0
- package/dist/components/EndpointSelector.js.map +1 -0
- package/dist/components/EndpointSelector.model.d.ts +52 -0
- package/dist/components/EndpointSelector.model.d.ts.map +1 -0
- package/dist/components/FilterBar.cjs +12 -0
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +4 -0
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +12 -0
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/InputField.cjs +11 -12
- package/dist/components/InputField.cjs.map +1 -1
- package/dist/components/InputField.d.ts +7 -0
- package/dist/components/InputField.d.ts.map +1 -1
- package/dist/components/InputField.js +12 -13
- package/dist/components/InputField.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -16
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +22 -16
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +3 -3
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +3 -3
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +150 -77
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +151 -78
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/WorkloadPicker.cjs +2 -1
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +6 -1
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +2 -1
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/combobox-types.d.ts +107 -0
- package/dist/components/combobox-types.d.ts.map +1 -0
- package/dist/components/combobox-utils.cjs +21 -0
- package/dist/components/combobox-utils.cjs.map +1 -0
- package/dist/components/combobox-utils.d.ts +15 -0
- package/dist/components/combobox-utils.d.ts.map +1 -0
- package/dist/components/combobox-utils.js +21 -0
- package/dist/components/combobox-utils.js.map +1 -0
- package/dist/components/endpoint-port.cjs +12 -0
- package/dist/components/endpoint-port.cjs.map +1 -0
- package/dist/components/endpoint-port.d.ts +4 -0
- package/dist/components/endpoint-port.d.ts.map +1 -0
- package/dist/components/endpoint-port.js +12 -0
- package/dist/components/endpoint-port.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +12 -23
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +12 -23
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +6 -2
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -1
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -1
- package/dist/components/json-schema-form-discriminator.js +6 -2
- package/dist/components/json-schema-form-discriminator.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +50 -0
- package/dist/components/json-schema-form-error-display.cjs.map +1 -0
- package/dist/components/json-schema-form-error-display.d.ts +12 -0
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -0
- package/dist/components/json-schema-form-error-display.js +50 -0
- package/dist/components/json-schema-form-error-display.js.map +1 -0
- package/dist/components/json-schema-form-error-types.d.ts +26 -0
- package/dist/components/json-schema-form-error-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +169 -0
- package/dist/components/json-schema-form-errors.cjs.map +1 -0
- package/dist/components/json-schema-form-errors.d.ts +14 -0
- package/dist/components/json-schema-form-errors.d.ts.map +1 -0
- package/dist/components/json-schema-form-errors.js +169 -0
- package/dist/components/json-schema-form-errors.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +12 -2
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +12 -2
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +84 -19
- package/dist/components/json-schema-form-refs.cjs.map +1 -1
- package/dist/components/json-schema-form-refs.d.ts.map +1 -1
- package/dist/components/json-schema-form-refs.js +84 -19
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +33 -10
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +34 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +16 -4
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +17 -5
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +4 -3
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components.cjs +13 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +8 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +15 -2
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +205 -14
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +41 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.cjs +21 -0
- package/dist/data/DataTable.grouping.cjs.map +1 -0
- package/dist/data/DataTable.grouping.d.ts +26 -0
- package/dist/data/DataTable.grouping.d.ts.map +1 -0
- package/dist/data/DataTable.grouping.js +21 -0
- package/dist/data/DataTable.grouping.js.map +1 -0
- package/dist/data/DataTable.js +205 -14
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Markdown.cjs +45 -1
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +3 -2
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +45 -1
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MarkdownEditor.cjs +4 -3
- package/dist/data/MarkdownEditor.cjs.map +1 -1
- package/dist/data/MarkdownEditor.d.ts +6 -2
- package/dist/data/MarkdownEditor.d.ts.map +1 -1
- package/dist/data/MarkdownEditor.js +4 -3
- package/dist/data/MarkdownEditor.js.map +1 -1
- package/dist/data/ServerTimingBadge.cjs +64 -0
- package/dist/data/ServerTimingBadge.cjs.map +1 -0
- package/dist/data/ServerTimingBadge.d.ts +9 -0
- package/dist/data/ServerTimingBadge.d.ts.map +1 -0
- package/dist/data/ServerTimingBadge.js +64 -0
- package/dist/data/ServerTimingBadge.js.map +1 -0
- package/dist/data/StatStrip.cjs +99 -0
- package/dist/data/StatStrip.cjs.map +1 -0
- package/dist/data/StatStrip.d.ts +41 -0
- package/dist/data/StatStrip.d.ts.map +1 -0
- package/dist/data/StatStrip.js +99 -0
- package/dist/data/StatStrip.js.map +1 -0
- package/dist/data/TaskManager.cjs +20 -1
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts +3 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +20 -1
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +49 -0
- package/dist/data/TaskManagerButton.cjs.map +1 -0
- package/dist/data/TaskManagerButton.d.ts +8 -0
- package/dist/data/TaskManagerButton.d.ts.map +1 -0
- package/dist/data/TaskManagerButton.js +49 -0
- package/dist/data/TaskManagerButton.js.map +1 -0
- package/dist/data/TaskProcessDetails.cjs +113 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -0
- package/dist/data/TaskProcessDetails.d.ts +6 -0
- package/dist/data/TaskProcessDetails.d.ts.map +1 -0
- package/dist/data/TaskProcessDetails.js +113 -0
- package/dist/data/TaskProcessDetails.js.map +1 -0
- package/dist/data/TaskProgress.cjs +106 -19
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +4 -2
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +107 -20
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +43 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Tree.cjs +91 -82
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +91 -82
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/TreeNode.cjs +3 -0
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts +2 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +3 -0
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +18 -141
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +2 -40
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +15 -138
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.models.cjs +11 -0
- package/dist/data/ai/ChatWindow.models.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.models.d.ts +3 -0
- package/dist/data/ai/ChatWindow.models.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.models.js +11 -0
- package/dist/data/ai/ChatWindow.models.js.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.cjs +57 -0
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts +13 -0
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.preferences.js +57 -0
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.js +14 -0
- package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +68 -0
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
- package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread.js +68 -0
- package/dist/data/ai/ChatWindow.thread.js.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +3 -0
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js +99 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -0
- package/dist/data/ai/ChatWindow.types.d.ts +41 -0
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -0
- package/dist/data/ai/ContextBadges.cjs +76 -46
- package/dist/data/ai/ContextBadges.cjs.map +1 -1
- package/dist/data/ai/ContextBadges.d.ts.map +1 -1
- package/dist/data/ai/ContextBadges.js +77 -47
- package/dist/data/ai/ContextBadges.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +151 -32
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +7 -4
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +152 -33
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts +11 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.d.ts.map +1 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js +133 -0
- package/dist/data/ai/PromptPicker/PromptSourceRepair.js.map +1 -0
- package/dist/data/ai/PromptPicker/index.d.ts +2 -1
- package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.cjs +7 -0
- package/dist/data/ai/PromptPicker/types.cjs.map +1 -0
- package/dist/data/ai/PromptPicker/types.d.ts +18 -2
- package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/types.js +7 -0
- package/dist/data/ai/PromptPicker/types.js.map +1 -0
- package/dist/data/ai/PromptRunEditor/index.cjs +171 -91
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +9 -9
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +175 -95
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.js +47 -0
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
- package/dist/data/ai/RuntimeBar.cjs +408 -0
- package/dist/data/ai/RuntimeBar.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.d.ts +20 -0
- package/dist/data/ai/RuntimeBar.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.js +408 -0
- package/dist/data/ai/RuntimeBar.js.map +1 -0
- package/dist/data/ai/RuntimeBar.model.cjs +14 -0
- package/dist/data/ai/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/ai/RuntimeBar.model.d.ts +10 -0
- package/dist/data/ai/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBar.model.js +14 -0
- package/dist/data/ai/RuntimeBar.model.js.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.cjs +359 -0
- package/dist/data/ai/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts +22 -0
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/ai/RuntimeBarCombo.js +359 -0
- package/dist/data/ai/RuntimeBarCombo.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +56 -0
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -0
- package/dist/data/ai/SessionChatComposer.d.ts +24 -0
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -0
- package/dist/data/ai/SessionChatComposer.js +56 -0
- package/dist/data/ai/SessionChatComposer.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +222 -382
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +55 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.cjs +377 -0
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.collection.d.ts +15 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +377 -0
- package/dist/data/ai/SessionInspector.collection.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +9 -4
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +162 -0
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.files.d.ts +5 -0
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.files.js +162 -0
- package/dist/data/ai/SessionInspector.files.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +15 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js +148 -0
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +9 -0
- package/dist/data/ai/SessionInspector.hierarchy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.hierarchy.js +256 -0
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -0
- package/dist/data/ai/SessionInspector.js +224 -384
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +125 -0
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.model.d.ts +14 -0
- package/dist/data/ai/SessionInspector.model.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.model.js +125 -0
- package/dist/data/ai/SessionInspector.model.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +265 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panels.d.ts +10 -0
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panels.js +265 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -0
- package/dist/data/ai/SessionInspector.plan.cjs +77 -0
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.plan.d.ts +6 -0
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.plan.js +77 -0
- package/dist/data/ai/SessionInspector.plan.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +182 -0
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.summary.d.ts +8 -0
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.summary.js +182 -0
- package/dist/data/ai/SessionInspector.summary.js.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.cjs +94 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts +7 -0
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.transcript.js +94 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -0
- package/dist/data/ai/SessionInspector.turns.d.ts +11 -0
- package/dist/data/ai/SessionInspector.turns.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +86 -121
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +8 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.fixtures.d.ts +2 -0
- package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +118 -0
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.header.d.ts +11 -0
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.header.js +118 -0
- package/dist/data/ai/SessionViewer.header.js.map +1 -0
- package/dist/data/ai/SessionViewer.js +87 -122
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +111 -39
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +6 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +111 -39
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.row-metadata.cjs +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts +14 -0
- package/dist/data/ai/SessionViewer.row-metadata.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-metadata.js +132 -0
- package/dist/data/ai/SessionViewer.row-metadata.js.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.cjs +15 -0
- package/dist/data/ai/SessionViewer.row-time.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts +3 -0
- package/dist/data/ai/SessionViewer.row-time.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.row-time.js +15 -0
- package/dist/data/ai/SessionViewer.row-time.js.map +1 -0
- package/dist/data/ai/SessionViewer.rows.cjs +37 -424
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +5 -2
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +31 -418
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.tool-details.cjs +65 -0
- package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts +20 -0
- package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-details.js +65 -0
- package/dist/data/ai/SessionViewer.tool-details.js.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs +404 -0
- package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts +12 -0
- package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -0
- package/dist/data/ai/SessionViewer.tool-row.js +404 -0
- package/dist/data/ai/SessionViewer.tool-row.js.map +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts +11 -2
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +44 -26
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +47 -29
- package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +45 -153
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +51 -159
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +0 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +0 -5
- package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.cjs +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/update.js +19 -6
- package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +31 -4
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +67 -10
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +2 -0
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +2 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +2 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/agent-action-icons.cjs +7 -10
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.d.ts +1 -2
- package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
- package/dist/data/ai/agent-action-icons.js +8 -11
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +4 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/ai/examples/sessions/claude-complete.cjs +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude-complete.js +513 -0
- package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/claude.cjs +252 -0
- package/dist/data/ai/examples/sessions/claude.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/claude.d.ts +3 -0
- package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/claude.js +252 -0
- package/dist/data/ai/examples/sessions/claude.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex-complete.js +394 -0
- package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -0
- package/dist/data/ai/examples/sessions/codex.cjs +236 -0
- package/dist/data/ai/examples/sessions/codex.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/codex.d.ts +3 -0
- package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/codex.js +236 -0
- package/dist/data/ai/examples/sessions/codex.js.map +1 -0
- package/dist/data/ai/examples/sessions/index.cjs +21 -0
- package/dist/data/ai/examples/sessions/index.cjs.map +1 -0
- package/dist/data/ai/examples/sessions/index.d.ts +10 -0
- package/dist/data/ai/examples/sessions/index.d.ts.map +1 -0
- package/dist/data/ai/examples/sessions/index.js +21 -0
- package/dist/data/ai/examples/sessions/index.js.map +1 -0
- package/dist/data/ai/index.d.ts +9 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.cjs +12 -1
- package/dist/data/ai/model-capabilities.cjs.map +1 -1
- package/dist/data/ai/model-capabilities.d.ts +2 -6
- package/dist/data/ai/model-capabilities.d.ts.map +1 -1
- package/dist/data/ai/model-capabilities.js +12 -1
- package/dist/data/ai/model-capabilities.js.map +1 -1
- package/dist/data/ai/runtime-mode.cjs +72 -1
- package/dist/data/ai/runtime-mode.cjs.map +1 -1
- package/dist/data/ai/runtime-mode.d.ts +28 -0
- package/dist/data/ai/runtime-mode.d.ts.map +1 -1
- package/dist/data/ai/runtime-mode.js +73 -2
- package/dist/data/ai/runtime-mode.js.map +1 -1
- package/dist/data/cells/EntityCell.cjs +64 -0
- package/dist/data/cells/EntityCell.cjs.map +1 -0
- package/dist/data/cells/EntityCell.d.ts +27 -0
- package/dist/data/cells/EntityCell.d.ts.map +1 -0
- package/dist/data/cells/EntityCell.js +64 -0
- package/dist/data/cells/EntityCell.js.map +1 -0
- package/dist/data/chat/Attachment.cjs +53 -13
- package/dist/data/chat/Attachment.cjs.map +1 -1
- package/dist/data/chat/Attachment.d.ts +9 -3
- package/dist/data/chat/Attachment.d.ts.map +1 -1
- package/dist/data/chat/Attachment.js +54 -14
- package/dist/data/chat/Attachment.js.map +1 -1
- package/dist/data/chat/Chat.cjs +113 -36
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +11 -4
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +111 -34
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +240 -66
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +11 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +241 -67
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Conversation.cjs +55 -3
- package/dist/data/chat/Conversation.cjs.map +1 -1
- package/dist/data/chat/Conversation.d.ts +5 -1
- package/dist/data/chat/Conversation.d.ts.map +1 -1
- package/dist/data/chat/Conversation.js +55 -3
- package/dist/data/chat/Conversation.js.map +1 -1
- package/dist/data/chat/ModelSelector.cjs +8 -10
- package/dist/data/chat/ModelSelector.cjs.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts.map +1 -1
- package/dist/data/chat/ModelSelector.js +9 -11
- package/dist/data/chat/ModelSelector.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +56 -5
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +10 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +57 -6
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/approval.cjs +21 -0
- package/dist/data/chat/approval.cjs.map +1 -0
- package/dist/data/chat/approval.d.ts +11 -0
- package/dist/data/chat/approval.d.ts.map +1 -0
- package/dist/data/chat/approval.js +21 -0
- package/dist/data/chat/approval.js.map +1 -0
- package/dist/data/chat/attachment-upload.cjs +33 -0
- package/dist/data/chat/attachment-upload.cjs.map +1 -0
- package/dist/data/chat/attachment-upload.d.ts +21 -0
- package/dist/data/chat/attachment-upload.d.ts.map +1 -0
- package/dist/data/chat/attachment-upload.js +33 -0
- package/dist/data/chat/attachment-upload.js.map +1 -0
- package/dist/data/chat/effort-icons.cjs +36 -6
- package/dist/data/chat/effort-icons.cjs.map +1 -1
- package/dist/data/chat/effort-icons.d.ts +6 -3
- package/dist/data/chat/effort-icons.d.ts.map +1 -1
- package/dist/data/chat/effort-icons.js +37 -7
- package/dist/data/chat/effort-icons.js.map +1 -1
- package/dist/data/chat/index.d.ts +3 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/models.cjs +8 -0
- package/dist/data/chat/models.cjs.map +1 -0
- package/dist/data/chat/models.d.ts +11 -0
- package/dist/data/chat/models.d.ts.map +1 -0
- package/dist/data/chat/models.js +8 -0
- package/dist/data/chat/models.js.map +1 -0
- package/dist/data/chat/provider-icons.cjs +49 -16
- package/dist/data/chat/provider-icons.cjs.map +1 -1
- package/dist/data/chat/provider-icons.d.ts +2 -0
- package/dist/data/chat/provider-icons.d.ts.map +1 -1
- package/dist/data/chat/provider-icons.js +50 -17
- package/dist/data/chat/provider-icons.js.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +21 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/examples/markdown-preview-mock.cjs +45 -0
- package/dist/data/examples/markdown-preview-mock.cjs.map +1 -0
- package/dist/data/examples/markdown-preview-mock.d.ts +23 -0
- package/dist/data/examples/markdown-preview-mock.d.ts.map +1 -0
- package/dist/data/examples/markdown-preview-mock.js +45 -0
- package/dist/data/examples/markdown-preview-mock.js.map +1 -0
- package/dist/data/examples/markdown-syntax.cjs +36 -0
- package/dist/data/examples/markdown-syntax.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.d.ts +12 -0
- package/dist/data/examples/markdown-syntax.d.ts.map +1 -0
- package/dist/data/examples/markdown-syntax.js +36 -0
- package/dist/data/examples/markdown-syntax.js.map +1 -0
- package/dist/data/examples/markdown-syntax.md.cjs +4 -0
- package/dist/data/examples/markdown-syntax.md.cjs.map +1 -0
- package/dist/data/examples/markdown-syntax.md.js +5 -0
- package/dist/data/examples/markdown-syntax.md.js.map +1 -0
- package/dist/data/server-timing.cjs +120 -0
- package/dist/data/server-timing.cjs.map +1 -0
- package/dist/data/server-timing.d.ts +11 -0
- package/dist/data/server-timing.d.ts.map +1 -0
- package/dist/data/server-timing.js +120 -0
- package/dist/data/server-timing.js.map +1 -0
- package/dist/data/task-process-details.cjs +48 -0
- package/dist/data/task-process-details.cjs.map +1 -0
- package/dist/data/task-process-details.d.ts +5 -0
- package/dist/data/task-process-details.d.ts.map +1 -0
- package/dist/data/task-process-details.js +48 -0
- package/dist/data/task-process-details.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +37 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +37 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +98 -0
- package/dist/hooks/use-hotkey.cjs.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +42 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.js +98 -0
- package/dist/hooks/use-hotkey.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +23 -1
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +23 -1
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +1 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/components/UiBank.cjs +15 -0
- package/dist/icons/components/UiBank.cjs.map +1 -0
- package/dist/icons/components/UiBank.d.ts +15 -0
- package/dist/icons/components/UiBank.d.ts.map +1 -0
- package/dist/icons/components/UiBank.js +15 -0
- package/dist/icons/components/UiBank.js.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.cjs +15 -0
- package/dist/icons/components/UiChartOfAccounts.cjs.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts +15 -0
- package/dist/icons/components/UiChartOfAccounts.d.ts.map +1 -0
- package/dist/icons/components/UiChartOfAccounts.js +15 -0
- package/dist/icons/components/UiChartOfAccounts.js.map +1 -0
- package/dist/icons/components/UiCloudUpload.cjs +15 -0
- package/dist/icons/components/UiCloudUpload.cjs.map +1 -0
- package/dist/icons/components/UiCloudUpload.d.ts +15 -0
- package/dist/icons/components/UiCloudUpload.d.ts.map +1 -0
- package/dist/icons/components/UiCloudUpload.js +15 -0
- package/dist/icons/components/UiCloudUpload.js.map +1 -0
- package/dist/icons/components/UiLedger.cjs +15 -0
- package/dist/icons/components/UiLedger.cjs.map +1 -0
- package/dist/icons/components/UiLedger.d.ts +15 -0
- package/dist/icons/components/UiLedger.d.ts.map +1 -0
- package/dist/icons/components/UiLedger.js +15 -0
- package/dist/icons/components/UiLedger.js.map +1 -0
- package/dist/icons/components/UiReceipt.cjs +15 -0
- package/dist/icons/components/UiReceipt.cjs.map +1 -0
- package/dist/icons/components/UiReceipt.d.ts +15 -0
- package/dist/icons/components/UiReceipt.d.ts.map +1 -0
- package/dist/icons/components/UiReceipt.js +15 -0
- package/dist/icons/components/UiReceipt.js.map +1 -0
- package/dist/icons/index.d.ts +10 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons.cjs +15 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +54 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +270 -238
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +9 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.debug.cjs +53 -0
- package/dist/layout/AppShell.debug.cjs.map +1 -0
- package/dist/layout/AppShell.debug.d.ts +6 -0
- package/dist/layout/AppShell.debug.d.ts.map +1 -0
- package/dist/layout/AppShell.debug.js +53 -0
- package/dist/layout/AppShell.debug.js.map +1 -0
- package/dist/layout/AppShell.js +269 -237
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +90 -0
- package/dist/layout/AppShell.nav.cjs.map +1 -0
- package/dist/layout/AppShell.nav.d.ts +7 -0
- package/dist/layout/AppShell.nav.d.ts.map +1 -0
- package/dist/layout/AppShell.nav.js +90 -0
- package/dist/layout/AppShell.nav.js.map +1 -0
- package/dist/layout/AppSidebar.cjs +35 -5
- package/dist/layout/AppSidebar.cjs.map +1 -1
- package/dist/layout/AppSidebar.d.ts +4 -1
- package/dist/layout/AppSidebar.d.ts.map +1 -1
- package/dist/layout/AppSidebar.js +35 -5
- package/dist/layout/AppSidebar.js.map +1 -1
- package/dist/layout/Panel.cjs +25 -41
- package/dist/layout/Panel.cjs.map +1 -1
- package/dist/layout/Panel.d.ts +2 -1
- package/dist/layout/Panel.d.ts.map +1 -1
- package/dist/layout/Panel.js +26 -42
- package/dist/layout/Panel.js.map +1 -1
- package/dist/layout/PanelFrame.cjs +56 -0
- package/dist/layout/PanelFrame.cjs.map +1 -0
- package/dist/layout/PanelFrame.d.ts +15 -0
- package/dist/layout/PanelFrame.d.ts.map +1 -0
- package/dist/layout/PanelFrame.js +56 -0
- package/dist/layout/PanelFrame.js.map +1 -0
- package/dist/layout/Section.cjs +51 -41
- package/dist/layout/Section.cjs.map +1 -1
- package/dist/layout/Section.d.ts +3 -2
- package/dist/layout/Section.d.ts.map +1 -1
- package/dist/layout/Section.js +51 -41
- package/dist/layout/Section.js.map +1 -1
- package/dist/layout/content-width.cjs +8 -0
- package/dist/layout/content-width.cjs.map +1 -0
- package/dist/layout/content-width.d.ts +3 -0
- package/dist/layout/content-width.d.ts.map +1 -0
- package/dist/layout/content-width.js +8 -0
- package/dist/layout/content-width.js.map +1 -0
- package/dist/overlay/CommandPalette.cjs +207 -0
- package/dist/overlay/CommandPalette.cjs.map +1 -0
- package/dist/overlay/CommandPalette.d.ts +71 -0
- package/dist/overlay/CommandPalette.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.js +207 -0
- package/dist/overlay/CommandPalette.js.map +1 -0
- package/dist/overlay/CommandPalette.model.cjs +70 -0
- package/dist/overlay/CommandPalette.model.cjs.map +1 -0
- package/dist/overlay/CommandPalette.model.d.ts +71 -0
- package/dist/overlay/CommandPalette.model.d.ts.map +1 -0
- package/dist/overlay/CommandPalette.model.js +70 -0
- package/dist/overlay/CommandPalette.model.js.map +1 -0
- package/dist/overlay/CommandPaletteList.cjs +88 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -0
- package/dist/overlay/CommandPaletteList.d.ts +23 -0
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteList.js +88 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.cjs +36 -0
- package/dist/overlay/CommandPaletteTrigger.cjs.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts +22 -0
- package/dist/overlay/CommandPaletteTrigger.d.ts.map +1 -0
- package/dist/overlay/CommandPaletteTrigger.js +36 -0
- package/dist/overlay/CommandPaletteTrigger.js.map +1 -0
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts +2 -2
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Modal.cjs +12 -5
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +12 -5
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.js +1 -1
- package/dist/overlay/zIndex.cjs +2 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.js +2 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +6 -0
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +6 -0
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +45 -71
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +12 -2
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +46 -72
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +42 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +2 -1
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +42 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +2 -1
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +2 -1
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +25 -2
- package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +2 -1
- package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +1 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +15 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +15 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.cjs","sources":["../../src/data/DataTable.tsx"],"sourcesContent":["import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TdHTMLAttributes,\n} from \"react\";\nimport { useSort, type SortDir, type SortState } from \"../hooks/use-sort\";\nimport { type Density } from \"../hooks/use-density\";\nimport { DensityValueProvider } from \"../hooks/density-provider\";\nimport { useResolvedTheme, type Theme } from \"../hooks/use-theme\";\nimport { cn } from \"../lib/utils\";\nimport { LoadingBar } from \"../components/loading\";\nimport { useRouter } from \"../rpc/router\";\nimport { Modal, type ModalSize } from \"../overlay/Modal\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport {\n FilterBar,\n FilterBarFilterPanel,\n FilterBarRangePanel,\n type FilterBarFilter,\n type FilterBarMultiFilterMode,\n type FilterBarNumberValue,\n type FilterBarProps,\n type FilterBarRangePreset,\n type FilterBarRangeProps,\n type FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport {\n clearFilterBarFilter,\n isFilterBarFilterActive,\n} from \"../components/filter-bar-utils\";\nimport {\n getFilterCandidate,\n getFilterTokens,\n prettifyKey,\n resolveColumnValue,\n resolvePath,\n} from \"./data-table-utils\";\nimport type { MultiSelectOption } from \"../components/MultiSelect\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport {\n UiClose,\n UiEllipsis,\n UiEyeClosed,\n UiFilterFilled,\n UiFilter,\n UiFullscreen,\n UiResizeVertical,\n UiCheck,\n UiDesktop,\n UiListDashes,\n UiListFlat,\n UiMoon,\n UiArrowLeft,\n UiArrowRight,\n UiRows,\n UiSun,\n} from \"../icons\";\nimport { SortableHeader } from \"./SortableHeader\";\nimport { Timestamp } from \"./cells/Timestamp\";\nimport {\n chooseTimestampFormat,\n modeToFormat,\n parseTimestamp,\n resolveDateMath,\n type TimestampFormat,\n type TimestampOptions,\n} from \"./cells/timestamp-format\";\nimport { TagActionsProvider, TagList } from \"./cells/TagList\";\nimport {\n normalizeTags,\n splitTagToken,\n tagActionsFromRecord,\n tagFilterTokens,\n type TagActionsContextValue,\n type TagFilterMode,\n type TagsOptions,\n type TagsValue,\n} from \"./cells/tag-utils\";\nimport { StatusDot } from \"./cells/StatusDot\";\nimport { normalizeStatus } from \"./cells/status-mapping\";\nimport type { BadgeStatus } from \"./Badge\";\n\nexport type { TimestampOptions, TagsOptions };\n\nexport type DataTableColumnKind = \"timestamp\" | \"tags\" | \"status\";\n\nexport type StatusOptions<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Maps the raw cell value to a badge status. Return null to fall back to text. */\n map?: (raw: unknown, row: T) => BadgeStatus | null;\n /** Show the normalized status label next to the dot. */\n showLabel?: boolean;\n /** Tooltip text for the status cell. */\n title?: (raw: unknown, row: T) => string;\n};\n\ntype FilterValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean>;\n\ntype InternalRow<T> = {\n id: string;\n row: T;\n};\n\ntype GeneratedFilter<T extends Record<string, unknown>> = {\n column: DataTableColumn<T>;\n kind: \"text\" | \"multi\" | \"nested-multi\" | \"number\";\n options: MultiSelectOption[];\n groups?: Array<{\n groupKey: string;\n label?: string;\n options: MultiSelectOption[];\n }>;\n numberBounds?: {\n min: number;\n max: number;\n step: number;\n };\n};\n\nconst DEFAULT_COLUMN_MIN_WIDTH = 64;\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst DEFAULT_GROW_COLUMN_WIDTH = 224;\nconst DEFAULT_SHRINK_COLUMN_WIDTH = 96;\nconst COLUMN_WIDTH_STORAGE_PREFIX = \"clicky-ui-data-table-column-widths\";\nconst COLUMN_VISIBILITY_STORAGE_PREFIX =\n \"clicky-ui-data-table-column-visibility\";\nconst DENSITY_STORAGE_PREFIX = \"clicky-ui-data-table-density\";\n\nconst DENSITY_OPTIONS: Array<{\n value: Density;\n icon: StaticIconComponent;\n label: string;\n}> = [\n { value: \"compact\", icon: UiRows, label: \"Compact\" },\n { value: \"comfortable\", icon: UiListFlat, label: \"Comfortable\" },\n { value: \"spacious\", icon: UiListDashes, label: \"Spacious\" },\n];\n\nconst DATA_TABLE_HEADER_DENSITY_CLASS =\n \"px-2.5 py-1.5 density-compact:px-2 density-compact:py-1 density-comfortable:px-2.5 density-comfortable:py-1.5 density-spacious:px-4 density-spacious:py-3\";\nconst DATA_TABLE_CELL_DENSITY_CLASS =\n \"px-2.5 py-1.5 density-compact:px-2 density-compact:py-0.5 density-comfortable:px-2.5 density-comfortable:py-1.5 density-spacious:px-4 density-spacious:py-3\";\n\ntype ColumnMenuState = {\n x: number;\n y: number;\n columnKey?: string;\n};\n\nexport type DataTableRowDetailContext<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: DataTableColumn<T>[];\n visibleColumns: DataTableColumn<T>[];\n filterActionsByColumn: Record<string, TagActionsContextValue>;\n};\n\n// Mirrors the preset list used by the trace UI's TraceFilters so log/trace\n// tables share the same vocabulary out of the box.\nconst TIMESTAMP_RANGE_PRESETS: FilterBarRangePreset[] = [\n { label: \"Last 5 minutes\", from: \"now-5m\", to: \"now\" },\n { label: \"Last 15 minutes\", from: \"now-15m\", to: \"now\" },\n { label: \"Last 1 hour\", from: \"now-1h\", to: \"now\" },\n { label: \"Last 6 hours\", from: \"now-6h\", to: \"now\" },\n { label: \"Last 24 hours\", from: \"now-24h\", to: \"now\" },\n { label: \"Last 7 days\", from: \"now-7d\", to: \"now\" },\n { label: \"Last 30 days\", from: \"now-30d\", to: \"now\" },\n];\n\nexport type DataTableColumn<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Field path or stable column id. Dotted paths read nested row values. */\n key: string;\n /** Header label. */\n label: ReactNode;\n /**\n * Reads the cell value from the row. When set, it is used for rendering,\n * sorting, and filtering instead of resolving `key` as a (possibly nested)\n * path. Use this for arbitrary SQL columns whose names are empty, contain\n * dots (\"a.b\" as a literal key, not a nested path), or collide — the `key`\n * then only needs to be a stable, unique column id.\n */\n accessor?: (row: T) => unknown;\n /** Enables header click sorting for this column. */\n sortable?: boolean;\n /** Enables a generated column filter when `autoFilter` is true. */\n filterable?: boolean;\n /** Prefer allocating extra width to this column. */\n grow?: boolean;\n /** Prefer keeping this column compact. */\n shrink?: boolean;\n /** Allows users to drag the column separator. */\n resizable?: boolean;\n /** Allows the column to be toggled from the column menu. */\n hideable?: boolean;\n /** Minimum column width in pixels. */\n minWidth?: number;\n /** Maximum column width in pixels. */\n maxWidth?: number;\n /** Cell and header text alignment. */\n align?: \"left\" | \"center\" | \"right\";\n /** Custom cell renderer. */\n render?: (value: unknown, row: T) => ReactNode;\n /** Sort key derived from the raw value and row. */\n sortValue?: (value: unknown, row: T) => unknown;\n /** Filter token or tokens derived from the raw value and row. */\n filterValue?: (value: unknown, row: T) => FilterValue;\n /** Classes applied to cells in this column. */\n cellClassName?: string;\n /** Classes applied to the header cell. */\n headerClassName?: string;\n /**\n * Built-in cell kind. When set, DataTable supplies a default renderer,\n * a default `sortValue` and a default `filterValue` (all overridable).\n * - \"timestamp\": adaptive format (relative / time / short / iso) chosen\n * from the spread of values in `data`.\n * - \"tags\": chip list with `+N` overflow; auto-multi-filter on tag tokens.\n * - \"status\": colored dot with the standard error/warning/success palette\n * (token-mapped — \"ERROR\", \"failed\", \"fatal\" all collapse to \"error\").\n */\n kind?: DataTableColumnKind;\n timestamp?: TimestampOptions;\n tags?: TagsOptions;\n status?: StatusOptions<T>;\n};\n\nexport type DataTableColumnInput<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = DataTableColumn<T> | string;\n\n/**\n * Server-side pagination control surfaced as a footer strip below the table.\n * The DataTable never slices data itself; callers refetch when the page or\n * pageSize changes.\n */\nexport type DataTablePagination = {\n /** Current zero-indexed page. */\n page: number;\n /** Number of rows requested per page. */\n pageSize: number;\n /** Total row count if known; enables \"Page X of Y\". */\n total?: number;\n /** Called when the user moves to another page. */\n onPageChange: (page: number) => void;\n /** Called when the page size select changes. */\n onPageSizeChange: (pageSize: number) => void;\n /** Available page sizes. Defaults to [25, 50, 100, 200]. */\n pageSizeOptions?: number[];\n};\n\nexport type DataTableMenuAction = {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n icon?: StaticIconComponent;\n iconClassName?: string;\n disabled?: boolean;\n /** Heading the action is grouped under in the overflow menu. Actions with\n * the same section render together below one label; defaults to \"Download\"\n * so existing download actions keep their heading. */\n section?: string;\n onSelect: () => void;\n};\n\nexport type DataTableRowSelection<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Controlled set of selected row ids, resolved through `getRowId`. */\n selectedRowIds: readonly string[];\n /** Called with the next ids and the matching rows currently loaded. */\n onSelectionChange: (selectedRowIds: string[], selectedRows: T[]) => void;\n /** Optional predicate for rows that cannot be selected. */\n isRowSelectable?: (row: T) => boolean;\n /** Toggle selection when the user clicks anywhere on a selectable row. */\n toggleOnRowClick?: boolean;\n};\n\ntype DataTableInnerProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Rows to render. The table does not fetch or mutate row data. */\n data: T[];\n /**\n * Column descriptors. Pass a bare string for a default column —\n * `\"foo\"` is equivalent to `{ key: \"foo\", label: \"foo\" }` — handy for\n * ad-hoc query results where the column metadata is just a list of names.\n * Mix and match strings with full descriptors as needed.\n */\n columns: Array<DataTableColumnInput<T>>;\n /** Shows skeleton/loading rows instead of data rows. */\n loading?: boolean;\n /** Message shown while `loading` is true. */\n loadingMessage?: ReactNode;\n /** Number of skeleton rows to render while loading. */\n loadingRowCount?: number;\n /** Message used when there are no rows after filtering. */\n emptyMessage?: string;\n /**\n * Client-side incremental reveal (infinite scroll). When set — and no server\n * `pagination` is provided — the table renders `batchSize` rows at a time and\n * grows by `batchSize` as a trailing sentinel scrolls into view. Use for\n * large in-memory result sets (e.g. ad-hoc SQL output) to keep the first\n * paint cheap without paginating.\n */\n clientReveal?: { batchSize: number };\n /** Classes applied to the table shell. */\n className?: string;\n /**\n * Classes for the scrollable table region. Defaults to `min-h-0 flex-1`\n * (fills a bounded flex parent). Pass e.g. `max-h-[26rem]` to cap height.\n */\n scrollContainerClassName?: string;\n /** Generate filters from filterable columns. */\n autoFilter?: boolean;\n /** Show the global search input. */\n showGlobalFilter?: boolean;\n /** Controlled global search value. */\n globalFilter?: string;\n /** Called when the global search changes. */\n onGlobalFilterChange?: (value: string) => void;\n /** Placeholder for the global search input. */\n globalFilterPlaceholder?: string;\n /** Initial sort state. */\n defaultSort?: { key: string; dir?: SortDir };\n /** Controlled sort state, for server-backed tables. */\n sort?: SortState | null;\n /** Called when a sortable header changes the controlled sort state. */\n onSortChange?: (sort: SortState | null) => void;\n /** When true, header sorting updates state but does not reorder `data`. */\n manualSort?: boolean;\n /** Extra props forwarded to the internal FilterBar. */\n filterBarProps?: Omit<FilterBarProps, \"search\" | \"filters\">;\n /**\n * Caller-owned search input rendered in the FilterBar's search slot. Unlike\n * `globalFilter`, this does NOT filter rows client-side — it is a controlled\n * input the caller wires to a server-side query (e.g., an operation's `q`\n * parameter). Takes precedence over the built-in global filter input.\n */\n externalSearch?: FilterBarSearchProps;\n /**\n * Caller-owned time-range control rendered in the FilterBar. Like\n * `externalSearch`/`externalFilters`, it does NOT filter rows client-side —\n * the caller wires it to a server-side query (e.g. an operation's\n * `time-from`/`time-to` parameters). Takes precedence over any\n * column-derived time range.\n */\n externalTimeRange?: FilterBarRangeProps;\n /**\n * Extra filter pills supplied by the caller (e.g., operation query\n * parameters surfaced via parametersToFormConfig) that should appear in the\n * FilterBar alongside the column-derived filters. Rendered before the\n * column filters so the caller's natural ordering wins.\n */\n externalFilters?: FilterBarFilter[];\n /**\n * Server-side pagination footer. When provided, a small page-size / prev /\n * next strip is rendered below the table; the DataTable does NOT slice\n * `data` itself, callers are expected to refetch when `onPageChange` or\n * `onPageSizeChange` fires.\n */\n pagination?: DataTablePagination;\n /** Stable row id extractor. Defaults to the row index. */\n getRowId?: (row: T, index: number) => string;\n /** Controlled checkbox selection for entity/bulk-action tables. */\n rowSelection?: DataTableRowSelection<T>;\n /** Called when a clickable row is selected. */\n onRowClick?: (row: T) => void;\n /** Predicate controlling whether a row is clickable. */\n isRowClickable?: (row: T) => boolean;\n /** Optional href for row link affordances. */\n getRowHref?: (row: T) => string | undefined;\n /** Detail content rendered for expanded rows or dialog details. */\n renderExpandedRow?: (\n row: T,\n context: DataTableRowDetailContext<T>,\n ) => ReactNode;\n /**\n * How `renderExpandedRow` detail is surfaced when a row is clicked.\n * - \"row\" (default): expands an inline detail row beneath the clicked row.\n * Multiple rows can be open at once.\n * - \"dialog\": opens the detail content in a centered modal; one row at a\n * time. The same `renderExpandedRow` (and its context) drives both styles.\n */\n detailStyle?: \"row\" | \"dialog\";\n /**\n * Title for the detail dialog (detailStyle=\"dialog\"). Pass a function to\n * derive a per-row title, e.g. `(row) => \\`Session ${row.sessionId}\\``.\n */\n detailDialogTitle?: ReactNode | ((row: T) => ReactNode);\n /** Modal size for the detail dialog. Defaults to \"lg\". */\n detailDialogSize?: ModalSize;\n /** Enables column drag resize handles. */\n resizableColumns?: boolean;\n /** Persists column widths to localStorage. */\n persistColumnWidths?: boolean;\n /** Storage key for persisted column widths. */\n columnResizeStorageKey?: string;\n /** Enables column visibility controls. */\n hideableColumns?: boolean;\n /** Persists column visibility to localStorage. */\n persistColumnVisibility?: boolean;\n /** Storage key for persisted column visibility. */\n columnVisibilityStorageKey?: string;\n /** Controlled row density. */\n density?: Density;\n /** Initial row density for uncontrolled usage. */\n defaultDensity?: Density;\n /** Called when density changes. */\n onDensityChange?: (density: Density | undefined) => void;\n /** Persists density to localStorage. */\n persistDensity?: boolean;\n /** Storage key for persisted density. */\n densityStorageKey?: string;\n /** Shows density controls in the column menu. */\n showDensityControl?: boolean;\n /**\n * Current value of the theme menu shown in the column / preferences popover.\n * The inner DataTable does not apply this value itself — it's the menu's\n * displayed selection. The outer `DataTable` wrapper manages this state and\n * paints a wrapper-level `data-theme`.\n */\n themeMenuValue?: Theme;\n onThemeChange?: (theme: Theme) => void;\n /** Shows theme controls in the column menu. */\n showThemeControl?: boolean;\n /** Shows per-column filter buttons in table headers. */\n showHeaderFilters?: boolean;\n /** Extra actions rendered in the table preferences menu. */\n menuActions?: DataTableMenuAction[];\n};\n\nexport type DataTableProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<DataTableInnerProps<T>, \"themeMenuValue\"> & {\n /**\n * Initial / controlled theme value for the column-menu Theme section.\n * When `onThemeChange` is omitted, the DataTable manages this internally\n * (seeded from `theme`) and applies `data-theme` to its root so the table\n * reflects the choice without requiring an enclosing `<ThemeProvider>`.\n */\n theme?: Theme;\n /**\n * Render a fullscreen-toggle button in the FilterBar's trailing slot\n * (just before the column-menu trigger). When clicked, the table re-renders\n * inside a full-viewport `<Modal>`. Defaults to `false`.\n */\n showFullscreenControl?: boolean;\n /** Title shown in the fullscreen modal. */\n fullscreenTitle?: ReactNode;\n /**\n * `aria-label` and `title` for the fullscreen toggle button. Defaults to\n * \"Open table full screen\". LogsTable overrides to \"Open logs full screen\".\n */\n fullscreenButtonLabel?: string;\n};\n\nfunction DataTableInner<T extends Record<string, unknown>>({\n data,\n columns: columnsInput,\n loading = false,\n loadingMessage = \"Loading results…\",\n loadingRowCount = 8,\n emptyMessage: _emptyMessage = \"No data\",\n clientReveal,\n className,\n scrollContainerClassName,\n autoFilter = false,\n showGlobalFilter = true,\n globalFilter,\n onGlobalFilterChange,\n globalFilterPlaceholder = \"Search all columns…\",\n defaultSort,\n sort: controlledSort,\n onSortChange,\n manualSort = false,\n filterBarProps,\n externalSearch,\n externalTimeRange,\n externalFilters,\n pagination,\n getRowId,\n rowSelection,\n onRowClick,\n isRowClickable,\n getRowHref,\n renderExpandedRow,\n detailStyle = \"row\",\n detailDialogTitle,\n detailDialogSize = \"lg\",\n resizableColumns = true,\n persistColumnWidths = true,\n columnResizeStorageKey,\n hideableColumns = true,\n persistColumnVisibility = true,\n columnVisibilityStorageKey,\n density,\n defaultDensity,\n onDensityChange,\n persistDensity = true,\n densityStorageKey,\n showDensityControl,\n themeMenuValue,\n onThemeChange,\n showThemeControl = false,\n showHeaderFilters = true,\n menuActions,\n}: DataTableInnerProps<T>) {\n const columns = useMemo<DataTableColumn<T>[]>(\n () =>\n columnsInput.map((column) =>\n typeof column === \"string\" ? { key: column, label: column } : column,\n ),\n [columnsInput],\n );\n const columnKeysSignature = useMemo(\n () => columns.map((column) => column.key).join(\"|\"),\n [columns],\n );\n const resolvedColumnResizeStorageKey =\n columnResizeStorageKey ??\n `${COLUMN_WIDTH_STORAGE_PREFIX}:${columnKeysSignature}`;\n const resolvedColumnVisibilityStorageKey =\n columnVisibilityStorageKey ??\n `${COLUMN_VISIBILITY_STORAGE_PREFIX}:${columnKeysSignature}`;\n const resolvedDensityStorageKey =\n densityStorageKey ?? `${DENSITY_STORAGE_PREFIX}:${columnKeysSignature}`;\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () =>\n persistColumnWidths\n ? readStoredColumnWidths(resolvedColumnResizeStorageKey, columns)\n : {},\n );\n const [hiddenColumns, setHiddenColumns] = useState<Record<string, boolean>>(\n () =>\n persistColumnVisibility\n ? readStoredHiddenColumns(resolvedColumnVisibilityStorageKey, columns)\n : {},\n );\n const densityControlled = density !== undefined;\n const [localDensityOverride, setLocalDensityOverride] = useState<\n Density | undefined\n >(() => {\n if (densityControlled) return density;\n if (persistDensity)\n return (\n readStoredDensityOverride(resolvedDensityStorageKey) ?? defaultDensity\n );\n return defaultDensity;\n });\n const [columnMenu, setColumnMenu] = useState<ColumnMenuState | null>(null);\n const [headerFilterMenu, setHeaderFilterMenu] =\n useState<ColumnMenuState | null>(null);\n const [textFilters, setTextFilters] = useState<Record<string, string>>({});\n const [multiFilters, setMultiFilters] = useState<\n Record<string, Record<string, FilterBarMultiFilterMode>>\n >({});\n const [numberFilters, setNumberFilters] = useState<\n Record<string, FilterBarNumberValue>\n >({});\n const [expandedRows, setExpandedRows] = useState<Record<string, boolean>>({});\n const [detailRow, setDetailRow] = useState<InternalRow<T> | null>(null);\n const [localGlobalFilter, setLocalGlobalFilter] = useState(\"\");\n const [timeRangeFilter, setTimeRangeFilter] = useState<{\n from: string;\n to: string;\n }>(() => {\n const seed = columns.find(\n (column) => column.kind === \"timestamp\" && column.timestamp?.defaultRange,\n );\n return {\n from: seed?.timestamp?.defaultRange?.from ?? \"\",\n to: seed?.timestamp?.defaultRange?.to ?? \"\",\n };\n });\n\n useEffect(() => {\n setColumnWidths((current) => {\n const stored = persistColumnWidths\n ? readStoredColumnWidths(resolvedColumnResizeStorageKey, columns)\n : {};\n const next = pruneColumnWidths({ ...stored, ...current }, columns);\n return sameColumnWidths(current, next) ? current : next;\n });\n }, [\n columnKeysSignature,\n persistColumnWidths,\n resolvedColumnResizeStorageKey,\n ]);\n\n useEffect(() => {\n if (!persistColumnWidths) return;\n writeStoredColumnWidths(resolvedColumnResizeStorageKey, columnWidths);\n }, [columnWidths, persistColumnWidths, resolvedColumnResizeStorageKey]);\n\n useEffect(() => {\n setHiddenColumns((current) => {\n const stored = persistColumnVisibility\n ? readStoredHiddenColumns(resolvedColumnVisibilityStorageKey, columns)\n : {};\n const next = pruneHiddenColumns({ ...stored, ...current }, columns);\n return sameHiddenColumns(current, next) ? current : next;\n });\n }, [\n columnKeysSignature,\n persistColumnVisibility,\n resolvedColumnVisibilityStorageKey,\n ]);\n\n useEffect(() => {\n if (!persistColumnVisibility) return;\n writeStoredHiddenColumns(resolvedColumnVisibilityStorageKey, hiddenColumns);\n }, [\n hiddenColumns,\n persistColumnVisibility,\n resolvedColumnVisibilityStorageKey,\n ]);\n\n useEffect(() => {\n if (densityControlled) return;\n setLocalDensityOverride(\n persistDensity\n ? (readStoredDensityOverride(resolvedDensityStorageKey) ??\n defaultDensity)\n : defaultDensity,\n );\n }, [\n defaultDensity,\n densityControlled,\n persistDensity,\n resolvedDensityStorageKey,\n ]);\n\n useEffect(() => {\n if (densityControlled || !persistDensity) return;\n writeStoredDensityOverride(resolvedDensityStorageKey, localDensityOverride);\n }, [\n densityControlled,\n localDensityOverride,\n persistDensity,\n resolvedDensityStorageKey,\n ]);\n\n const closeFloatingMenus = useCallback(() => {\n setColumnMenu(null);\n setHeaderFilterMenu(null);\n }, []);\n\n useEscapeLayer(Boolean(columnMenu || headerFilterMenu), closeFloatingMenus);\n\n useEffect(() => {\n if (!columnMenu && !headerFilterMenu) return;\n document.addEventListener(\"click\", closeFloatingMenus);\n return () => {\n document.removeEventListener(\"click\", closeFloatingMenus);\n };\n }, [closeFloatingMenus, columnMenu, headerFilterMenu]);\n\n const rows = useMemo<InternalRow<T>[]>(\n () =>\n data.map((row, index) => ({\n id: getRowId?.(row, index) ?? String(index),\n row,\n })),\n [data, getRowId],\n );\n\n const timestampFormats = useMemo<Record<string, TimestampFormat>>(() => {\n const out: Record<string, TimestampFormat> = {};\n for (const column of columns) {\n if (column.kind !== \"timestamp\") continue;\n const dates: Date[] = [];\n for (const row of data) {\n const raw = resolveColumnValue(row, column);\n const parsed = parseTimestamp(raw);\n if (parsed) dates.push(parsed);\n }\n const dataFormat = chooseTimestampFormat(dates);\n out[column.key] = modeToFormat(\n column.timestamp?.mode ?? \"auto\",\n dataFormat,\n );\n }\n return out;\n }, [columns, data]);\n\n const effectiveColumns = useMemo<DataTableColumn<T>[]>(\n () =>\n columns.map((column) =>\n applyKindDefaults<T>(column, timestampFormats[column.key]),\n ),\n [columns, timestampFormats],\n );\n\n const visibleColumns = useMemo(() => {\n if (!hideableColumns) return effectiveColumns;\n const next = effectiveColumns.filter(\n (column) => !hiddenColumns[column.key],\n );\n return next.length > 0 ? next : effectiveColumns;\n }, [effectiveColumns, hiddenColumns, hideableColumns]);\n\n const hideableColumnCount = useMemo(\n () => effectiveColumns.filter(isColumnHideable).length,\n [effectiveColumns],\n );\n\n const visibleHideableColumnCount = useMemo(\n () => visibleColumns.filter(isColumnHideable).length,\n [visibleColumns],\n );\n\n const showColumnVisibilityControl =\n hideableColumns && hideableColumnCount > 1;\n const resolvedShowDensityControl =\n showDensityControl ?? showColumnVisibilityControl;\n const hasMenuActions = Boolean(menuActions && menuActions.length > 0);\n const showTablePreferencesControl =\n showColumnVisibilityControl ||\n resolvedShowDensityControl ||\n showThemeControl ||\n hasMenuActions;\n const densityOverride = densityControlled ? density : localDensityOverride;\n\n // The first kind:\"timestamp\" column (with autoRangeFilter not disabled) gets\n // the auto-mounted FilterBar time-range picker. The user can override by\n // supplying their own filterBarProps.timeRange.\n const timeRangeColumn = useMemo(() => {\n if (filterBarProps?.timeRange) return null;\n return (\n effectiveColumns.find(\n (column) =>\n column.kind === \"timestamp\" &&\n column.filterable !== false &&\n column.timestamp?.autoRangeFilter !== false,\n ) ?? null\n );\n }, [effectiveColumns, filterBarProps?.timeRange]);\n\n const filterableColumns = useMemo(\n () =>\n effectiveColumns.filter((column) => {\n if (column.filterable === false) return false;\n // Timestamp columns are filtered through the time-range picker, not\n // a per-column text/multi filter. Skip them in auto-filter generation.\n if (column.kind === \"timestamp\") return false;\n return true;\n }),\n [effectiveColumns],\n );\n\n const generatedFilters = useMemo<GeneratedFilter<T>[]>(() => {\n if (!autoFilter || loading) return [];\n\n return filterableColumns.map((column) => {\n const numberBounds = getNumericFilterBounds(rows, column);\n if (numberBounds) {\n return {\n column,\n kind: \"number\" as const,\n options: [],\n numberBounds,\n };\n }\n\n const values = new Set<string>();\n\n for (const record of rows) {\n for (const token of getFilterTokens(record.row, column)) {\n if (token) values.add(token);\n }\n }\n\n const options = Array.from(values)\n .sort((left, right) =>\n left.localeCompare(right, undefined, { numeric: true }),\n )\n .map((value) => ({ value, label: value }));\n\n // Tag columns naturally have higher cardinality (e.g. infra labels);\n // we let the multi-filter scale to 50 distinct values before falling\n // back to free-text search.\n const multiCap = column.kind === \"tags\" ? 50 : 20;\n\n const fitsMulti = options.length >= 2 && options.length <= multiCap;\n\n // For tag columns we group tokens by their key so the filter renders\n // as a two-level submenu (env → prod/staging, tier → edge/core, …).\n // Falls back to a flat multi when there's only one key (or none).\n if (column.kind === \"tags\" && fitsMulti) {\n const separator = column.tags?.separator ?? \"=\";\n const groups = groupTagOptions(options, separator);\n if (groups.length >= 2) {\n return {\n column,\n kind: \"nested-multi\" as const,\n options,\n groups,\n };\n }\n }\n\n return {\n column,\n kind: fitsMulti ? \"multi\" : \"text\",\n options,\n };\n });\n }, [autoFilter, filterableColumns, loading, rows]);\n\n // For every multi / nested-multi column (which includes kind:\"tags\"), expose a\n // TagActions value backed by this table's multiFilters slot. The + / − icons in\n // tag cells and in expanded-row details mutate the same Record<token, mode>\n // shape the filter-bar dropdown uses, so the existing filter pipeline picks up\n // the change. Built from generatedFilters so it stays in lockstep with\n // pruneMultiFilterState (only multi/nested-multi columns honor multiFilters).\n const filterActionsByColumn = useMemo(() => {\n const out: Record<string, TagActionsContextValue> = {};\n for (const filter of generatedFilters) {\n if (filter.kind !== \"multi\" && filter.kind !== \"nested-multi\") continue;\n const columnKey = filter.column.key;\n const current = (multiFilters[columnKey] ?? {}) as Record<\n string,\n TagFilterMode\n >;\n const handler = (next: Record<string, TagFilterMode>) =>\n setMultiFilters((state) => updateFilterRecord(state, columnKey, next));\n out[columnKey] = tagActionsFromRecord(current, handler);\n }\n return out;\n }, [generatedFilters, multiFilters]);\n\n useEffect(() => {\n setTextFilters((current) =>\n pruneTextFilterState(current, generatedFilters),\n );\n setMultiFilters((current) =>\n pruneMultiFilterState(current, generatedFilters),\n );\n setNumberFilters((current) =>\n pruneNumberFilterState(current, generatedFilters),\n );\n }, [generatedFilters]);\n\n const globalFilterControlled = globalFilter !== undefined;\n const effectiveGlobalFilter = globalFilterControlled\n ? globalFilter\n : localGlobalFilter;\n const setEffectiveGlobalFilter = globalFilterControlled\n ? (onGlobalFilterChange ?? (() => {}))\n : setLocalGlobalFilter;\n const nativeFilters = useMemo<FilterBarFilter[]>(\n () =>\n generatedFilters.map((filter): FilterBarFilter => {\n const columnKey = filter.column.key;\n if (filter.kind === \"multi\") {\n return {\n key: columnKey,\n kind: \"multi\",\n label: labelText(filter.column),\n value: multiFilters[columnKey] ?? {},\n onChange: (next) =>\n setMultiFilters((current) =>\n updateFilterRecord(current, columnKey, next),\n ),\n options: filter.options,\n };\n }\n if (filter.kind === \"nested-multi\") {\n return {\n key: columnKey,\n kind: \"nested-multi\",\n label: labelText(filter.column),\n value: multiFilters[columnKey] ?? {},\n onChange: (next) =>\n setMultiFilters((current) =>\n updateFilterRecord(current, columnKey, next),\n ),\n groups: filter.groups ?? [],\n };\n }\n if (filter.kind === \"number\") {\n const numberFilter: Extract<FilterBarFilter, { kind: \"number\" }> = {\n key: columnKey,\n kind: \"number\",\n label: labelText(filter.column),\n value: numberFilters[columnKey] ?? {},\n onChange: (next: FilterBarNumberValue) =>\n setNumberFilters((current) =>\n updateNumberFilterValue(current, columnKey, next),\n ),\n };\n if (filter.numberBounds?.min !== undefined) {\n numberFilter.domainMin = filter.numberBounds.min;\n }\n if (filter.numberBounds?.max !== undefined) {\n numberFilter.domainMax = filter.numberBounds.max;\n }\n if (filter.numberBounds?.step !== undefined) {\n numberFilter.step = filter.numberBounds.step;\n }\n return numberFilter;\n }\n return {\n key: columnKey,\n kind: \"text\",\n label: labelText(filter.column),\n value: textFilters[columnKey] ?? \"\",\n onChange: (next: string) =>\n setTextFilters((current) =>\n updateFilterValue(current, columnKey, next),\n ),\n };\n }),\n [generatedFilters, multiFilters, numberFilters, textFilters],\n );\n const nativeFilterByColumn = useMemo(\n () => new Map(nativeFilters.map((filter) => [filter.key, filter])),\n [nativeFilters],\n );\n const hasCustomFilterBarContent = Boolean(\n filterBarProps?.leading ||\n filterBarProps?.children ||\n filterBarProps?.trailing ||\n filterBarProps?.timeRange ||\n filterBarProps?.dateRange,\n );\n const autoTimeRange = useMemo<FilterBarRangeProps | null>(() => {\n if (!timeRangeColumn) return null;\n const next: FilterBarRangeProps = {\n from: timeRangeFilter.from,\n to: timeRangeFilter.to,\n onApply: (from, to) => setTimeRangeFilter({ from, to }),\n presets:\n timeRangeColumn.timestamp?.rangePresets ?? TIMESTAMP_RANGE_PRESETS,\n fromPlaceholder: \"now-24h\",\n toPlaceholder: \"now\",\n emptyLabel: \"Any time\",\n };\n if (timeRangeColumn.timestamp?.timeEnabled !== undefined) {\n next.timeEnabled = timeRangeColumn.timestamp.timeEnabled;\n }\n if (timeRangeColumn.timestamp?.timeZone) {\n next.timeZone = timeRangeColumn.timestamp.timeZone;\n }\n if (timeRangeColumn.timestamp?.timeZones) {\n next.timeZones = timeRangeColumn.timestamp.timeZones;\n }\n return next;\n }, [timeRangeColumn, timeRangeFilter.from, timeRangeFilter.to]);\n const showFilterBar =\n (autoFilter &&\n (showGlobalFilter || nativeFilters.length > 0)) ||\n !!autoTimeRange ||\n !!externalSearch ||\n !!externalTimeRange ||\n (externalFilters && externalFilters.length > 0) ||\n hasCustomFilterBarContent ||\n showTablePreferencesControl;\n const setDensityOverride = (next: Density | undefined) => {\n if (!densityControlled) setLocalDensityOverride(next);\n onDensityChange?.(next);\n };\n const filterBarTrailing = showTablePreferencesControl ? (\n <>\n {filterBarProps?.trailing}\n <ColumnVisibilityTrigger\n onOpen={(event) => setColumnMenu(menuStateFromTrigger(event))}\n />\n </>\n ) : (\n filterBarProps?.trailing\n );\n const showHeaderFilterControls =\n showHeaderFilters && (autoFilter || !!autoTimeRange);\n\n const filteredRows = useMemo(() => {\n const globalNeedle = effectiveGlobalFilter.trim().toLowerCase();\n const now = new Date();\n const rangeFromDate = timeRangeColumn\n ? resolveDateMath(timeRangeFilter.from, now)\n : null;\n const rangeToDate = timeRangeColumn\n ? resolveDateMath(timeRangeFilter.to, now)\n : null;\n const rangeColumnKey = timeRangeColumn?.key;\n\n return rows.filter(({ row }) => {\n if (rangeColumnKey && (rangeFromDate || rangeToDate)) {\n const raw = resolvePath(row, rangeColumnKey);\n const ts = parseTimestamp(raw);\n if (!ts) return false;\n if (rangeFromDate && ts.getTime() < rangeFromDate.getTime())\n return false;\n if (rangeToDate && ts.getTime() > rangeToDate.getTime()) return false;\n }\n\n if (globalNeedle) {\n const haystack = filterableColumns\n .flatMap((column) => getFilterTokens(row, column))\n .join(\" \")\n .toLowerCase();\n\n if (!haystack.includes(globalNeedle)) {\n return false;\n }\n }\n\n for (const filter of generatedFilters) {\n const tokens = getFilterTokens(row, filter.column);\n\n if (filter.kind === \"text\") {\n const needle = (textFilters[filter.column.key] ?? \"\")\n .trim()\n .toLowerCase();\n if (\n needle &&\n !tokens.some((token) => token.toLowerCase().includes(needle))\n ) {\n return false;\n }\n } else if (filter.kind === \"number\") {\n const range = numberFilters[filter.column.key] ?? {};\n const min = parseNumberInput(range.min);\n const max = parseNumberInput(range.max);\n const hasMin = String(range.min ?? \"\").trim() !== \"\";\n const hasMax = String(range.max ?? \"\").trim() !== \"\";\n\n if (hasMin || hasMax) {\n const values = getFilterNumbers(row, filter.column);\n const matches = values.some(\n (value) =>\n (min == null || value >= min) && (max == null || value <= max),\n );\n\n if (!matches) {\n return false;\n }\n }\n } else {\n const selected = multiFilters[filter.column.key] ?? {};\n const include = Object.entries(selected)\n .filter(([, mode]) => mode === \"include\")\n .map(([value]) => value);\n const exclude = Object.entries(selected)\n .filter(([, mode]) => mode === \"exclude\")\n .map(([value]) => value);\n\n if (\n include.length > 0 &&\n !tokens.some((token) => include.includes(token))\n ) {\n return false;\n }\n\n if (\n exclude.length > 0 &&\n tokens.some((token) => exclude.includes(token))\n ) {\n return false;\n }\n }\n }\n\n return true;\n });\n }, [\n effectiveGlobalFilter,\n filterableColumns,\n generatedFilters,\n multiFilters,\n numberFilters,\n rows,\n textFilters,\n timeRangeColumn,\n timeRangeFilter.from,\n timeRangeFilter.to,\n ]);\n\n const sortResolvers = useMemo(\n () =>\n Object.fromEntries(\n effectiveColumns.map((column) => [\n column.key,\n (record: InternalRow<T>) => getSortValue(record.row, column),\n ]),\n ) as Record<string, (record: InternalRow<T>) => unknown>,\n [effectiveColumns],\n );\n\n const { renderLink } = useRouter();\n\n const { sorted, sort, toggle } = useSort(filteredRows, {\n defaultDir: defaultSort?.dir ?? \"asc\",\n manual: manualSort,\n resolvers: sortResolvers,\n ...(controlledSort !== undefined ? { sort: controlledSort } : {}),\n ...(onSortChange ? { onSortChange } : {}),\n ...(defaultSort?.key ? { defaultKey: defaultSort.key } : {}),\n });\n\n // Client-side incremental reveal: when `clientReveal` is set (and the caller\n // is not doing server pagination), only the first `visibleCount` sorted rows\n // are rendered; a trailing sentinel grows the window as it scrolls into view.\n const revealEnabled = !!clientReveal && !pagination;\n const revealBatchSize = clientReveal?.batchSize ?? 0;\n const [visibleCount, setVisibleCount] = useState(revealBatchSize);\n const revealObserver = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n // Reset the window whenever the filtered/sorted set or batch size changes\n // so a new query starts from the top rather than mid-scroll.\n if (revealEnabled) setVisibleCount(revealBatchSize);\n }, [revealEnabled, revealBatchSize, sorted]);\n\n const visibleSorted = revealEnabled ? sorted.slice(0, visibleCount) : sorted;\n const hasMoreRows = revealEnabled && visibleCount < sorted.length;\n const selectedRowIDs = useMemo(\n () => new Set(rowSelection?.selectedRowIds ?? []),\n [rowSelection?.selectedRowIds],\n );\n const selectableVisibleRows = useMemo(\n () =>\n visibleSorted.filter(\n (record) => rowSelection?.isRowSelectable?.(record.row) ?? true,\n ),\n [rowSelection, visibleSorted],\n );\n const selectedVisibleCount = selectableVisibleRows.filter((record) =>\n selectedRowIDs.has(record.id),\n ).length;\n const allVisibleSelected =\n selectableVisibleRows.length > 0 &&\n selectedVisibleCount === selectableVisibleRows.length;\n const someVisibleSelected = selectedVisibleCount > 0 && !allVisibleSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someVisibleSelected;\n }\n }, [someVisibleSelected]);\n\n const notifySelection = useCallback(\n (nextIDs: Set<string>) => {\n if (!rowSelection) return;\n rowSelection.onSelectionChange(\n Array.from(nextIDs),\n rows\n .filter((record) => nextIDs.has(record.id))\n .map((record) => record.row),\n );\n },\n [rowSelection, rows],\n );\n\n const toggleRowSelection = useCallback(\n (record: InternalRow<T>) => {\n if (!rowSelection) return;\n if (rowSelection.isRowSelectable?.(record.row) === false) return;\n const next = new Set(selectedRowIDs);\n if (next.has(record.id)) next.delete(record.id);\n else next.add(record.id);\n notifySelection(next);\n },\n [notifySelection, rowSelection, selectedRowIDs],\n );\n\n const toggleVisibleSelection = useCallback(() => {\n if (!rowSelection) return;\n const next = new Set(selectedRowIDs);\n if (allVisibleSelected) {\n for (const record of selectableVisibleRows) next.delete(record.id);\n } else {\n for (const record of selectableVisibleRows) next.add(record.id);\n }\n notifySelection(next);\n }, [\n allVisibleSelected,\n notifySelection,\n rowSelection,\n selectableVisibleRows,\n selectedRowIDs,\n ]);\n\n const revealSentinelRef = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (revealObserver.current) revealObserver.current.disconnect();\n if (!node || !hasMoreRows) return;\n revealObserver.current = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n setVisibleCount((current) =>\n Math.min(current + revealBatchSize, sorted.length),\n );\n }\n },\n { rootMargin: \"200px\" },\n );\n revealObserver.current.observe(node);\n },\n [hasMoreRows, revealBatchSize, sorted.length],\n );\n\n const startColumnResize = (\n event: ReactMouseEvent<HTMLElement>,\n column: DataTableColumn<T>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n const header = event.currentTarget.closest(\"th\");\n const measuredWidth = header?.getBoundingClientRect().width ?? 0;\n const startWidth =\n measuredWidth || columnWidths[column.key] || defaultColumnWidth(column);\n\n const onMove = (moveEvent: MouseEvent) => {\n const nextWidth = clampColumnWidth(\n column,\n startWidth + moveEvent.clientX - startX,\n );\n setColumnWidths((current) => ({\n ...current,\n [column.key]: nextWidth,\n }));\n };\n\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n };\n\n const autoFitColumn = (\n event: ReactMouseEvent<HTMLElement>,\n column: DataTableColumn<T>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n const header = event.currentTarget.closest(\"th\");\n const table = event.currentTarget.closest(\"table\");\n if (!header || !table) return;\n\n const columnIndex = Array.from(\n header.parentElement?.children ?? [],\n ).indexOf(header);\n if (columnIndex < 0) return;\n\n const width = measureColumnContentWidth(table, columnIndex, column);\n setColumnWidths((current) => ({\n ...current,\n [column.key]: width,\n }));\n };\n\n const toggleColumnVisibility = (column: DataTableColumn<T>) => {\n if (!isColumnHideable(column)) return;\n\n setHiddenColumns((current) => {\n const hidden = current[column.key] === true;\n if (!hidden && visibleHideableColumnCount <= 1) return current;\n\n const next = { ...current };\n if (hidden) {\n delete next[column.key];\n } else {\n next[column.key] = true;\n }\n\n return pruneHiddenColumns(next, columns);\n });\n };\n\n const showAllColumns = () => setHiddenColumns({});\n\n const openHeaderColumnMenu = (\n event: ReactMouseEvent<HTMLTableCellElement>,\n column: DataTableColumn<T>,\n ) => {\n if (!showColumnVisibilityControl) return;\n event.preventDefault();\n setColumnMenu(menuStateFromPointer(event, column.key));\n };\n\n const openHeaderFilterMenu = (\n event: ReactMouseEvent<HTMLElement>,\n columnKey: string,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setHeaderFilterMenu(menuStateFromTrigger(event, columnKey));\n };\n\n return (\n <DensityValueProvider density={densityOverride ?? \"comfortable\"}>\n <div\n className={cn(\"flex min-h-0 min-w-0 flex-1 flex-col gap-3\", className)}\n data-density={densityOverride}\n >\n {showFilterBar && (\n <FilterBar\n {...filterBarProps}\n {...(externalSearch\n ? { search: externalSearch }\n : autoFilter && showGlobalFilter\n ? {\n search: {\n value: effectiveGlobalFilter,\n onChange: setEffectiveGlobalFilter,\n placeholder: globalFilterPlaceholder,\n },\n }\n : {})}\n {...(externalTimeRange\n ? { timeRange: externalTimeRange }\n : autoTimeRange\n ? { timeRange: autoTimeRange }\n : {})}\n trailing={filterBarTrailing}\n filters={\n externalFilters && externalFilters.length > 0\n ? [...externalFilters, ...nativeFilters]\n : nativeFilters\n }\n />\n )}\n\n <div className=\"relative flex min-h-0 max-w-full flex-1 flex-col\">\n {loading ? (\n <LoadingBar data-testid=\"data-table-loading-bar\" className=\"rounded-t-md\" />\n ) : null}\n <div\n className={cn(\n \"min-h-0 max-w-full flex-1 overflow-auto overscroll-x-contain rounded-md border border-border\",\n scrollContainerClassName,\n )}\n aria-busy={loading || undefined}\n >\n <table className=\"w-max min-w-full table-auto text-left text-sm\">\n <colgroup>\n {rowSelection ? <col className=\"w-10\" /> : null}\n {visibleColumns.map((column) => (\n <col\n key={column.key}\n style={columnStyle(column, columnWidths)}\n className={column.shrink && !column.grow ? \"w-px\" : undefined}\n />\n ))}\n </colgroup>\n <thead className=\"sticky top-0 z-10 bg-muted shadow-[0_1px_0_0_var(--tw-shadow-color)] shadow-border\">\n <tr className=\"border-b border-border text-xs text-muted-foreground\">\n {rowSelection ? (\n <th\n className={cn(\n \"w-10 text-center\",\n DATA_TABLE_HEADER_DENSITY_CLASS,\n )}\n >\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n aria-label=\"Select all visible rows\"\n checked={allVisibleSelected}\n disabled={selectableVisibleRows.length === 0}\n onChange={toggleVisibleSelection}\n className=\"size-3.5 rounded border-border accent-primary\"\n />\n </th>\n ) : null}\n {visibleColumns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"group/header relative whitespace-nowrap font-medium\",\n DATA_TABLE_HEADER_DENSITY_CLASS,\n alignmentClass(column.align),\n resizableColumns &&\n column.resizable !== false &&\n \"select-none\",\n column.headerClassName,\n )}\n onContextMenu={(event) =>\n openHeaderColumnMenu(event, column)\n }\n >\n <div\n className={cn(\n \"flex min-w-0 items-center gap-1\",\n headerAlignmentClass(column.align),\n resizableColumns &&\n column.resizable !== false &&\n \"pr-2\",\n )}\n >\n <span className=\"min-w-0\">\n {column.sortable === false ? (\n <span>{column.label}</span>\n ) : (\n <SortableHeader\n active={sort?.key === column.key}\n {...(sort?.key === column.key\n ? { dir: sort.dir }\n : {})}\n {...(column.align ? { align: column.align } : {})}\n onClick={() => toggle(column.key)}\n >\n {column.label}\n </SortableHeader>\n )}\n </span>\n {showHeaderFilterControls &&\n (nativeFilterByColumn.has(column.key) ||\n (autoTimeRange &&\n timeRangeColumn?.key === column.key)) && (\n <HeaderFilterButton\n column={column}\n active={\n nativeFilterByColumn.has(column.key)\n ? isFilterBarFilterActive(\n nativeFilterByColumn.get(column.key)!,\n )\n : Boolean(\n timeRangeFilter.from || timeRangeFilter.to,\n )\n }\n onOpen={(event) =>\n openHeaderFilterMenu(event, column.key)\n }\n />\n )}\n </div>\n {resizableColumns && column.resizable !== false && (\n <span\n role=\"separator\"\n aria-label={`Resize ${labelText(column)} column`}\n aria-orientation=\"vertical\"\n className=\"absolute right-0 top-0 hidden h-full w-3 cursor-col-resize touch-none items-center justify-center border-r border-border/70 bg-gradient-to-l from-border/30 to-transparent transition-colors hover:border-primary hover:from-primary/20 md:flex\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onDoubleClick={(event) => autoFitColumn(event, column)}\n onMouseDown={(event) =>\n startColumnResize(event, column)\n }\n >\n <span\n aria-hidden\n className=\"h-4 w-0.5 rounded-full bg-border transition-colors group-hover/header:bg-primary/70\"\n />\n </span>\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading && visibleSorted.length === 0 ? (\n <DataTableLoadingRows\n columns={visibleColumns}\n rowCount={loadingRowCount}\n message={loadingMessage}\n selection={!!rowSelection}\n />\n ) : (\n visibleSorted.map((record) => {\n const href = getRowHref?.(record.row);\n const expanded = expandedRows[record.id] ?? false;\n const expandedContent =\n renderExpandedRow?.(record.row, {\n columns: effectiveColumns,\n visibleColumns,\n filterActionsByColumn,\n }) ?? null;\n const expandable = expandedContent !== null;\n const expandsInline = expandable && detailStyle === \"row\";\n const opensDialog = expandable && detailStyle === \"dialog\";\n const rowClickEnabled =\n isRowClickable?.(record.row) ?? !!onRowClick;\n const rowSelectable =\n rowSelection?.isRowSelectable?.(record.row) ?? true;\n const selectionClickEnabled =\n !!rowSelection?.toggleOnRowClick && rowSelectable;\n const clickable =\n !!href ||\n rowClickEnabled ||\n expandable ||\n selectionClickEnabled;\n\n return (\n <Fragment key={record.id}>\n <tr\n className={cn(\n \"relative border-b border-border/60 align-top\",\n clickable && \"cursor-pointer hover:bg-accent/40\",\n selectedRowIDs.has(record.id) && \"bg-accent/50\",\n )}\n onClick={() => {\n if (selectionClickEnabled) toggleRowSelection(record);\n if (expandsInline) {\n setExpandedRows((current) => ({\n ...current,\n [record.id]: !current[record.id],\n }));\n }\n if (opensDialog) {\n setDetailRow(record);\n }\n if (rowClickEnabled) {\n onRowClick?.(record.row);\n }\n }}\n >\n {rowSelection ? (\n <td\n className={cn(\n // relative z-10 keeps the checkbox above the row's\n // stretched-link overlay so it stays clickable.\n \"relative z-10 w-10 text-center\",\n DATA_TABLE_CELL_DENSITY_CLASS,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n aria-label={`Select row ${record.id}`}\n checked={selectedRowIDs.has(record.id)}\n disabled={!rowSelectable}\n onChange={() => toggleRowSelection(record)}\n className=\"size-3.5 rounded border-border accent-primary\"\n />\n </td>\n ) : null}\n {visibleColumns.map((column, index) => {\n const rawValue = resolveColumnValue(\n record.row,\n column,\n );\n let content: ReactNode = column.render\n ? column.render(rawValue, record.row)\n : formatCell(rawValue);\n\n // Tag cells get the + / − filter affordance via\n // context; copy-to-clipboard works without it too.\n if (\n column.kind === \"tags\" &&\n filterActionsByColumn[column.key]\n ) {\n content = (\n <TagActionsProvider\n value={filterActionsByColumn[column.key]!}\n >\n {content}\n </TagActionsProvider>\n );\n }\n\n return (\n <td\n key={column.key}\n className={cn(\n DATA_TABLE_CELL_DENSITY_CLASS,\n alignmentClass(column.align),\n column.cellClassName,\n )}\n >\n <CellContent\n column={column}\n {...(columnWidths[column.key] !== undefined\n ? { width: columnWidths[column.key] }\n : {})}\n >\n {href && index === 0\n ? // One real <a href> per row whose ::after\n // overlay stretches across the whole (relative)\n // row: right/middle-click give native \"open in\n // new tab\", plain left-click routes client-side.\n renderLink({\n to: href,\n className:\n \"hover:underline after:absolute after:inset-0 after:content-['']\",\n children: content,\n })\n : content}\n </CellContent>\n </td>\n );\n })}\n </tr>\n {expandsInline && expanded && expandedContent && (\n <tr>\n <td\n colSpan={\n visibleColumns.length + (rowSelection ? 1 : 0)\n }\n className=\"bg-muted/40 p-density-3\"\n >\n <div className=\"rounded-md border border-border bg-background p-density-3\">\n {expandedContent}\n </div>\n </td>\n </tr>\n )}\n </Fragment>\n );\n })\n )}\n {hasMoreRows && (\n <tr ref={revealSentinelRef} aria-hidden>\n <td\n colSpan={visibleColumns.length + (rowSelection ? 1 : 0)}\n className=\"p-density-2 text-center text-xs text-muted-foreground\"\n >\n Loading more…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n {pagination ? (\n <DataTablePaginationFooter\n pagination={pagination}\n visibleRowCount={sorted.length}\n loading={loading}\n loadingMessage={loadingMessage}\n />\n ) : (\n <div className=\"shrink-0 px-1 text-xs text-muted-foreground\">\n {loading\n ? loadingMessage\n : `${sorted.length} of ${data.length} row${data.length === 1 ? \"\" : \"s\"}`}\n </div>\n )}\n {detailStyle === \"dialog\" && renderExpandedRow && (\n <Modal\n open={detailRow !== null}\n onClose={() => setDetailRow(null)}\n size={detailDialogSize}\n {...(detailRow\n ? {\n title:\n typeof detailDialogTitle === \"function\"\n ? detailDialogTitle(detailRow.row)\n : detailDialogTitle,\n }\n : {})}\n >\n {detailRow\n ? renderExpandedRow(detailRow.row, {\n columns: effectiveColumns,\n visibleColumns,\n filterActionsByColumn,\n })\n : null}\n </Modal>\n )}\n {columnMenu && showTablePreferencesControl && (\n <ColumnVisibilityMenu\n columns={effectiveColumns}\n hiddenColumns={hiddenColumns}\n anchor={columnMenu}\n actions={menuActions ?? []}\n showColumnVisibilityControl={showColumnVisibilityControl}\n showDensityControl={resolvedShowDensityControl}\n showThemeControl={showThemeControl}\n themeMenuValue={themeMenuValue}\n densityOverride={densityOverride}\n visibleHideableColumnCount={visibleHideableColumnCount}\n onToggle={toggleColumnVisibility}\n onShowAll={showAllColumns}\n onDensityChange={setDensityOverride}\n {...(onThemeChange ? { onThemeChange } : {})}\n onClose={() => setColumnMenu(null)}\n />\n )}\n {headerFilterMenu && (\n <HeaderFilterMenu\n filter={nativeFilterByColumn.get(headerFilterMenu.columnKey ?? \"\")}\n {...(autoTimeRange &&\n timeRangeColumn?.key === headerFilterMenu.columnKey\n ? { timeRange: autoTimeRange }\n : {})}\n anchor={headerFilterMenu}\n onClose={() => setHeaderFilterMenu(null)}\n />\n )}\n </div>\n </DensityValueProvider>\n );\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [5, 10, 25, 50, 100, 200];\n\n// DataTablePaginationFooter renders a small page-size selector and prev/next\n// controls below the table. Pure presentation: every interaction routes\n// straight to the caller-supplied callbacks so the data layer (which lives in\n// CommandOutput / OperationCommandPage) stays the source of truth for which\n// rows are visible.\nfunction DataTablePaginationFooter({\n pagination,\n visibleRowCount,\n loading,\n loadingMessage,\n}: {\n pagination: DataTablePagination;\n visibleRowCount: number;\n loading: boolean;\n loadingMessage: ReactNode;\n}) {\n const { page, pageSize, total, onPageChange, onPageSizeChange } = pagination;\n const options = Array.from(\n new Set([\n ...(pagination.pageSizeOptions ?? DEFAULT_PAGE_SIZE_OPTIONS),\n pageSize,\n ]),\n ).sort((a, b) => a - b);\n const safePage = Math.max(0, page);\n const totalPages =\n total != null && pageSize > 0\n ? Math.max(1, Math.ceil(total / pageSize))\n : undefined;\n const atFirst = safePage === 0;\n const atLast =\n totalPages != null\n ? safePage >= totalPages - 1\n : visibleRowCount < pageSize;\n const hasVisibleRows = visibleRowCount > 0;\n const rangeStart =\n total === 0 || !hasVisibleRows ? 0 : safePage * pageSize + 1;\n const rangeEnd =\n total != null && hasVisibleRows\n ? Math.min(total, rangeStart + Math.max(visibleRowCount - 1, 0))\n : visibleRowCount;\n const rangeLabel =\n total != null\n ? `${rangeStart}-${rangeEnd} of ${total}`\n : `${visibleRowCount} row${visibleRowCount === 1 ? \"\" : \"s\"}`;\n\n return (\n <div className=\"flex min-h-9 shrink-0 flex-row items-stretch gap-3 border-t border-border/70 px-1 pt-2 text-xs text-muted-foreground sm:flex-row sm:flex-wrap sm:items-center sm:justify-between\">\n <div aria-live=\"polite\">{loading ? loadingMessage : rangeLabel}</div>\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <label className=\"flex items-center gap-1.5\">\n <span>Rows per page</span>\n <select\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n <span className=\"min-w-20 text-center\">\n Page {safePage + 1}\n {totalPages != null ? ` of ${totalPages}` : \"\"}\n </span>\n <button\n type=\"button\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n disabled={atFirst}\n onClick={() => onPageChange(Math.max(0, safePage - 1))}\n >\n <Icon icon={UiArrowLeft} />\n </button>\n <button\n type=\"button\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Next page\"\n title=\"Next page\"\n disabled={atLast}\n onClick={() => onPageChange(safePage + 1)}\n >\n <Icon icon={UiArrowRight} />\n </button>\n </div>\n </div>\n );\n}\n\nfunction DataTableLoadingRows<T extends Record<string, unknown>>({\n columns,\n rowCount,\n message,\n selection,\n}: {\n columns: DataTableColumn<T>[];\n rowCount: number;\n message: ReactNode;\n selection: boolean;\n}) {\n const safeRowCount = Math.max(1, rowCount);\n const safeColumnCount = Math.max(1, columns.length + (selection ? 1 : 0));\n\n return (\n <>\n <tr className=\"border-b border-border/60 bg-muted/20\">\n <td\n colSpan={safeColumnCount}\n className={cn(DATA_TABLE_CELL_DENSITY_CLASS, \"p-0\")}\n >\n <div className=\"h-0.5 w-full overflow-hidden bg-muted\">\n <div className=\"h-full w-1/2 animate-pulse rounded-full bg-primary/70\" />\n </div>\n <div className=\"flex items-center gap-2 px-3 py-2 text-xs text-muted-foreground\">\n <span\n aria-hidden\n className=\"h-3 w-3 animate-spin rounded-full border-2 border-primary/30 border-t-primary\"\n />\n <span>{message}</span>\n </div>\n </td>\n </tr>\n {Array.from({ length: safeRowCount }).map((_, rowIndex) => (\n <tr key={rowIndex} className=\"border-b border-border/60\">\n {selection ? (\n <td className={cn(\"w-10\", DATA_TABLE_CELL_DENSITY_CLASS)}>\n <span className=\"mx-auto block size-3.5 animate-pulse rounded bg-muted\" />\n </td>\n ) : null}\n {columns.map((column, columnIndex) => (\n <td\n key={column.key}\n className={cn(\n DATA_TABLE_CELL_DENSITY_CLASS,\n alignmentClass(column.align),\n column.cellClassName,\n )}\n >\n <CellContent column={column}>\n <span\n aria-hidden\n className={cn(\n \"block h-3 animate-pulse rounded-full bg-muted\",\n loadingSkeletonWidth(columnIndex),\n )}\n />\n </CellContent>\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\nfunction HeaderFilterButton<T extends Record<string, unknown>>({\n column,\n active,\n onOpen,\n}: {\n column: DataTableColumn<T>;\n active: boolean;\n onOpen: (event: ReactMouseEvent<HTMLButtonElement>) => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${labelText(column)} column filter`}\n aria-haspopup=\"dialog\"\n aria-pressed={active}\n className={cn(\n \"inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active && \"bg-accent text-foreground\",\n )}\n onClick={onOpen}\n >\n <span\n data-filter-icon-state={active ? \"filled\" : \"outline\"}\n className=\"inline-flex\"\n >\n <Icon icon={active ? UiFilterFilled : UiFilter} className=\"text-xs\" />\n </span>\n </button>\n );\n}\n\nfunction HeaderFilterMenu({\n filter,\n timeRange,\n anchor,\n onClose,\n}: {\n filter: FilterBarFilter | undefined;\n timeRange?: FilterBarRangeProps;\n anchor: ColumnMenuState;\n onClose: () => void;\n}) {\n if (!filter && !timeRange) return null;\n\n const label = filter?.label ?? \"Time range\";\n const timeRangeActive = Boolean(timeRange?.from || timeRange?.to);\n\n return (\n <div\n role=\"dialog\"\n aria-label={`${label} column filter`}\n className=\"fixed z-50 max-h-[calc(100vh-1rem)] max-w-[calc(100vw-1rem)] overflow-auto rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n style={{ left: anchor.x, top: anchor.y }}\n onClick={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <div className=\"truncate text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </div>\n <div className=\"flex items-center gap-1\">\n {filter && (\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => clearFilterBarFilter(filter)}\n disabled={!isFilterBarFilterActive(filter)}\n >\n Clear all\n </button>\n )}\n {timeRange && (\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => timeRange.onApply(\"\", \"\")}\n disabled={!timeRangeActive}\n >\n Clear all\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Close column filter\"\n title=\"Close\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={onClose}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n {filter && <FilterBarFilterPanel filter={filter} chrome=\"embedded\" />}\n {timeRange && (\n <FilterBarRangePanel kind=\"time\" label=\"Time range\" {...timeRange} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ColumnVisibilityTrigger({\n onOpen,\n}: {\n onOpen: (event: ReactMouseEvent<HTMLButtonElement>) => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label=\"Open column menu\"\n aria-haspopup=\"menu\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n onClick={(event) => {\n event.stopPropagation();\n onOpen(event);\n }}\n >\n <Icon icon={UiEllipsis} className=\"text-sm\" />\n </button>\n );\n}\n\nfunction ColumnVisibilityMenu<T extends Record<string, unknown>>({\n columns,\n hiddenColumns,\n anchor,\n actions,\n showColumnVisibilityControl,\n showDensityControl,\n showThemeControl,\n themeMenuValue,\n densityOverride,\n visibleHideableColumnCount,\n onToggle,\n onShowAll,\n onDensityChange,\n onThemeChange,\n onClose,\n}: {\n columns: DataTableColumn<T>[];\n hiddenColumns: Record<string, boolean>;\n anchor: ColumnMenuState;\n actions: DataTableMenuAction[];\n showColumnVisibilityControl: boolean;\n showDensityControl: boolean;\n showThemeControl: boolean;\n themeMenuValue: Theme | undefined;\n densityOverride: Density | undefined;\n visibleHideableColumnCount: number;\n onToggle: (column: DataTableColumn<T>) => void;\n onShowAll: () => void;\n onDensityChange: (density: Density | undefined) => void;\n onThemeChange?: (theme: Theme) => void;\n onClose: () => void;\n}) {\n const activeColumn = anchor.columnKey\n ? columns.find((column) => column.key === anchor.columnKey)\n : undefined;\n const canHideActiveColumn =\n activeColumn &&\n isColumnHideable(activeColumn) &&\n visibleHideableColumnCount > 1;\n const hasActions = actions.length > 0;\n\n return (\n <div\n role=\"menu\"\n aria-label=\"Column menu\"\n className=\"fixed z-50 max-h-[calc(100vh-1rem)] min-w-[16rem] max-w-[calc(100vw-1rem)] overflow-auto rounded-md border border-border bg-popover p-1.5 text-popover-foreground shadow-lg shadow-black/5\"\n style={{ left: anchor.x, top: anchor.y }}\n onClick={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n {showColumnVisibilityControl && (\n <>\n <div className=\"flex items-center justify-between gap-3 px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n <span>Columns</span>\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={onShowAll}\n >\n Show all\n </button>\n </div>\n\n {activeColumn && (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canHideActiveColumn}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n !canHideActiveColumn && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => {\n if (!canHideActiveColumn) return;\n onToggle(activeColumn);\n onClose();\n }}\n >\n <Icon\n icon={UiEyeClosed}\n className=\"text-sm text-muted-foreground\"\n />\n <span>Hide {labelText(activeColumn)}</span>\n </button>\n <div className=\"my-1 h-px bg-border\" />\n </>\n )}\n\n <div className=\"max-h-72 overflow-auto\">\n {columns.map((column) => {\n const hideable = isColumnHideable(column);\n const visible = hiddenColumns[column.key] !== true;\n const disabled =\n !hideable || (visible && visibleHideableColumnCount <= 1);\n return (\n <label\n key={column.key}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-accent hover:text-accent-foreground\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-border\"\n checked={visible}\n disabled={disabled}\n onChange={() => onToggle(column)}\n />\n <span className=\"truncate\">{labelText(column)}</span>\n </label>\n );\n })}\n </div>\n </>\n )}\n\n {showDensityControl && (\n <DensityMenuSection\n densityOverride={densityOverride}\n separated={showColumnVisibilityControl}\n onDensityChange={onDensityChange}\n />\n )}\n\n {hasActions && (\n <MenuActionSection\n actions={actions}\n separated={showColumnVisibilityControl || showDensityControl}\n onClose={onClose}\n />\n )}\n\n {showThemeControl && onThemeChange && (\n <ThemeMenuSection\n value={themeMenuValue ?? \"system\"}\n separated={\n showColumnVisibilityControl || showDensityControl || hasActions\n }\n onChange={onThemeChange}\n />\n )}\n </div>\n );\n}\n\n// Groups menu actions by their `section` heading, preserving the order each\n// section first appears. Actions without a section fall under \"Download\" so the\n// existing download menu is unchanged.\nfunction groupMenuActions(\n actions: DataTableMenuAction[],\n): { section: string; actions: DataTableMenuAction[] }[] {\n const groups: { section: string; actions: DataTableMenuAction[] }[] = [];\n for (const action of actions) {\n const section = action.section ?? \"Download\";\n let group = groups.find((g) => g.section === section);\n if (!group) {\n group = { section, actions: [] };\n groups.push(group);\n }\n group.actions.push(action);\n }\n return groups;\n}\n\nfunction MenuActionSection({\n actions,\n separated,\n onClose,\n}: {\n actions: DataTableMenuAction[];\n separated: boolean;\n onClose: () => void;\n}) {\n const groups = groupMenuActions(actions);\n return (\n <>\n {groups.map((group, index) => (\n <div\n key={group.section}\n className={cn(\n (separated || index > 0) && \"mt-1 border-t border-border pt-1\",\n )}\n >\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n {group.section}\n </div>\n {group.actions.map((action) => {\n const hasDescription = Boolean(action.description);\n return (\n <button\n key={action.id}\n type=\"button\"\n role=\"menuitem\"\n disabled={action.disabled}\n className={cn(\n \"flex w-full gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n hasDescription ? \"items-start\" : \"items-center\",\n action.disabled && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => {\n if (action.disabled) return;\n action.onSelect();\n onClose();\n }}\n >\n {action.icon && (\n <Icon\n icon={action.icon}\n className={cn(\n \"shrink-0 text-sm\",\n hasDescription && \"mt-0.5\",\n action.iconClassName ?? \"text-muted-foreground\",\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className={cn(hasDescription && \"font-medium\")}>\n {action.label}\n </span>\n {action.description && (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {action.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n </>\n );\n}\n\nfunction DensityMenuSection({\n densityOverride,\n separated,\n onDensityChange,\n}: {\n densityOverride: Density | undefined;\n separated: boolean;\n onDensityChange: (density: Density | undefined) => void;\n}) {\n const current = densityOverride ?? \"inherit\";\n\n return (\n <div className={cn(separated && \"mt-1 border-t border-border pt-1\")}>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n Density\n </div>\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={current === \"inherit\"}\n className={densityMenuItemClassName(current === \"inherit\")}\n onClick={() => onDensityChange(undefined)}\n >\n <Icon\n icon={UiResizeVertical}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">Use page density</span>\n {current === \"inherit\" ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n {DENSITY_OPTIONS.map((option) => {\n const active = current === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => onDensityChange(option.value)}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction densityMenuItemClassName(active: boolean) {\n return cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n active && \"text-foreground\",\n );\n}\n\nconst THEME_MENU_OPTIONS: Array<{\n value: Theme;\n icon: StaticIconComponent;\n label: string;\n}> = [\n { value: \"system\", icon: UiDesktop, label: \"Use system theme\" },\n { value: \"light\", icon: UiSun, label: \"Light\" },\n { value: \"dark\", icon: UiMoon, label: \"Dark\" },\n];\n\nfunction ThemeMenuSection({\n value,\n separated,\n onChange,\n}: {\n value: Theme;\n separated: boolean;\n onChange: (theme: Theme) => void;\n}) {\n return (\n <div className={cn(separated && \"mt-1 border-t border-border pt-1\")}>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n Theme\n </div>\n {THEME_MENU_OPTIONS.map((option) => {\n const active = value === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => onChange(option.value)}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction CellContent<T extends Record<string, unknown>>({\n column,\n width,\n children,\n}: {\n column: DataTableColumn<T>;\n width?: number;\n children: ReactNode;\n}) {\n return (\n <div\n className={cn(\n cellContentClassName(column, width),\n alignmentClass(column.align),\n )}\n style={cellContentStyle(width)}\n >\n {children}\n </div>\n );\n}\n\nfunction getSortValue<T extends Record<string, unknown>>(\n row: T,\n column: DataTableColumn<T>,\n) {\n const rawValue = resolveColumnValue(row, column);\n return column.sortValue ? column.sortValue(rawValue, row) : rawValue;\n}\n\nfunction getFilterNumbers<T extends Record<string, unknown>>(\n row: T,\n column: DataTableColumn<T>,\n) {\n return normalizeNumbers(getFilterCandidate(row, column));\n}\n\nfunction normalizeNumbers(value: FilterValue | unknown): number[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => normalizeNumbers(item));\n }\n\n const parsed = parseNumberInput(value);\n return parsed == null ? [] : [parsed];\n}\n\nfunction updateFilterValue(\n state: Record<string, string>,\n key: string,\n nextValue: string,\n) {\n const next = { ...state };\n\n if (nextValue.trim()) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction updateFilterRecord(\n state: Record<string, Record<string, FilterBarMultiFilterMode>>,\n key: string,\n nextValue: Record<string, FilterBarMultiFilterMode>,\n) {\n const next = { ...state };\n\n if (Object.keys(nextValue).length > 0) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction updateNumberFilterValue(\n state: Record<string, FilterBarNumberValue>,\n key: string,\n nextValue: FilterBarNumberValue,\n) {\n const next = { ...state };\n const hasMin = String(nextValue.min ?? \"\").trim() !== \"\";\n const hasMax = String(nextValue.max ?? \"\").trim() !== \"\";\n\n if (hasMin || hasMax) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction pruneTextFilterState(\n state: Record<string, string>,\n filters: GeneratedFilter<any>[],\n) {\n return pruneFilterState(\n state,\n filters,\n \"text\",\n (value) => !String(value ?? \"\").trim(),\n );\n}\n\nfunction pruneMultiFilterState(\n state: Record<string, Record<string, FilterBarMultiFilterMode>>,\n filters: GeneratedFilter<any>[],\n) {\n // multi and nested-multi share the same state slot; allow either kind to\n // keep the entry alive.\n const allowed = new Set(\n filters\n .filter(\n (filter) => filter.kind === \"multi\" || filter.kind === \"nested-multi\",\n )\n .map((filter) => filter.column.key),\n );\n return Object.fromEntries(\n Object.entries(state).filter(\n ([key, value]) => allowed.has(key) && Object.keys(value).length > 0,\n ),\n );\n}\n\nfunction pruneNumberFilterState(\n state: Record<string, FilterBarNumberValue>,\n filters: GeneratedFilter<any>[],\n) {\n return pruneFilterState(\n state,\n filters,\n \"number\",\n (value) =>\n !String(value.min ?? \"\").trim() && !String(value.max ?? \"\").trim(),\n );\n}\n\nfunction pruneFilterState<T>(\n state: Record<string, T>,\n filters: GeneratedFilter<any>[],\n kind: GeneratedFilter<any>[\"kind\"],\n isEmpty: (value: T) => boolean,\n) {\n const allowed = new Set(\n filters\n .filter((filter) => filter.kind === kind)\n .map((filter) => filter.column.key),\n );\n return Object.fromEntries(\n Object.entries(state).filter(\n ([key, value]) => allowed.has(key) && !isEmpty(value),\n ),\n ) as Record<string, T>;\n}\n\nfunction formatCell(value: unknown): ReactNode {\n if (value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n if (typeof value === \"boolean\") return value ? \"True\" : \"False\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\n// Groups flat key=value tokens by key for the nested-multi tag filter.\n// Tokens without a separator land in a synthetic \"\" group rendered as\n// \"Other\" by the filter UI.\nfunction groupTagOptions(\n options: MultiSelectOption[],\n separator: string,\n): Array<{ groupKey: string; label?: string; options: MultiSelectOption[] }> {\n const byKey = new Map<string, MultiSelectOption[]>();\n for (const option of options) {\n const { key } = splitTagToken(option.value, separator);\n const list = byKey.get(key) ?? [];\n list.push(option);\n byKey.set(key, list);\n }\n return Array.from(byKey.entries())\n .sort(([a], [b]) => {\n // Bare-tag bucket sinks to the bottom; otherwise alphabetical.\n if (a === \"\" && b !== \"\") return 1;\n if (b === \"\" && a !== \"\") return -1;\n return a.localeCompare(b);\n })\n .map(([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey === \"\" ? \"Other\" : groupKey,\n options: groupOptions,\n }));\n}\n\nfunction applyKindDefaults<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n timestampFormat: TimestampFormat | undefined,\n): DataTableColumn<T> {\n if (!column.kind) return column;\n\n if (column.kind === \"timestamp\") {\n const format = timestampFormat ?? \"iso\";\n return {\n ...column,\n render:\n column.render ??\n ((value) => (\n <Timestamp\n value={value}\n format={format}\n showTitleOnHover={column.timestamp?.alwaysShowFullOnHover !== false}\n />\n )),\n sortValue:\n column.sortValue ??\n ((value) => parseTimestamp(value)?.getTime() ?? null),\n filterValue:\n column.filterValue ??\n ((value) => {\n const parsed = parseTimestamp(value);\n return parsed ? parsed.toISOString() : \"\";\n }),\n };\n }\n\n if (column.kind === \"tags\") {\n const opts = column.tags;\n const separator = opts?.separator ?? \"=\";\n return {\n ...column,\n render:\n column.render ??\n ((value) => (\n <TagList\n tags={normalizeTags(value as TagsValue, separator)}\n maxVisible={opts?.maxVisible ?? 3}\n />\n )),\n filterValue:\n column.filterValue ??\n ((value) => tagFilterTokens(value as TagsValue, separator)),\n sortValue:\n column.sortValue ??\n ((value) => tagFilterTokens(value as TagsValue, separator).length),\n };\n }\n\n if (column.kind === \"status\") {\n const opts = column.status;\n const map = opts?.map ?? ((raw) => normalizeStatus(raw));\n return {\n ...column,\n render:\n column.render ??\n ((value, row) => {\n const status = map(value, row);\n if (!status) return <span className=\"text-muted-foreground\">—</span>;\n const label = opts?.showLabel\n ? typeof value === \"string\"\n ? value\n : status\n : undefined;\n const title =\n opts?.title?.(value, row) ??\n (typeof value === \"string\" ? value : undefined);\n return (\n <StatusDot\n status={status}\n {...(label ? { label } : {})}\n {...(title ? { title } : {})}\n />\n );\n }),\n filterValue:\n column.filterValue ??\n ((value, row) => {\n const status = map(value, row);\n return status ?? \"\";\n }),\n sortValue: column.sortValue ?? ((value, row) => map(value, row) ?? \"\"),\n };\n }\n\n return column;\n}\n\nfunction labelText<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n if (typeof column.label === \"string\") return column.label;\n return prettifyKey(column.key.split(\".\").at(-1) ?? column.key);\n}\n\nfunction isColumnHideable<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n return column.hideable !== false;\n}\n\nfunction menuStateFromPointer(\n event: ReactMouseEvent<HTMLElement>,\n columnKey?: string,\n): ColumnMenuState {\n const padding = 8;\n const width = 256;\n const height = 320;\n const viewportWidth =\n typeof window === \"undefined\" ? event.clientX + width : window.innerWidth;\n const viewportHeight =\n typeof window === \"undefined\" ? event.clientY + height : window.innerHeight;\n\n const position = {\n x: Math.max(\n padding,\n Math.min(event.clientX, viewportWidth - width - padding),\n ),\n y: Math.max(\n padding,\n Math.min(event.clientY, viewportHeight - height - padding),\n ),\n };\n return columnKey ? { ...position, columnKey } : position;\n}\n\nfunction menuStateFromTrigger(\n event: ReactMouseEvent<HTMLElement>,\n columnKey?: string,\n): ColumnMenuState {\n const rect = event.currentTarget.getBoundingClientRect();\n const padding = 8;\n const width = 256;\n const height = 320;\n const viewportWidth =\n typeof window === \"undefined\" ? rect.right + width : window.innerWidth;\n const viewportHeight =\n typeof window === \"undefined\" ? rect.bottom + height : window.innerHeight;\n\n const position = {\n x: Math.max(\n padding,\n Math.min(rect.right - width, viewportWidth - width - padding),\n ),\n y: Math.max(\n padding,\n Math.min(rect.bottom + 6, viewportHeight - height - padding),\n ),\n };\n return columnKey ? { ...position, columnKey } : position;\n}\n\nfunction columnStyle<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n widths: Record<string, number>,\n): CSSProperties | undefined {\n const width = widths[column.key];\n return width ? { width: `${width}px` } : undefined;\n}\n\nfunction measureColumnContentWidth<T extends Record<string, unknown>>(\n table: HTMLTableElement,\n columnIndex: number,\n column: DataTableColumn<T>,\n) {\n const cells = Array.from(table.querySelectorAll(\"th, td\")).filter(\n (cell): cell is HTMLTableCellElement =>\n cell instanceof HTMLTableCellElement &&\n cell.cellIndex === columnIndex &&\n cell.colSpan === 1,\n );\n\n const measured = cells.reduce((current, cell) => {\n const horizontalPadding = getHorizontalPadding(cell);\n const contentWidths = Array.from(cell.children).map((child) =>\n child instanceof HTMLElement ? child.scrollWidth + horizontalPadding : 0,\n );\n return Math.max(current, cell.scrollWidth, ...contentWidths);\n }, 0);\n\n return clampColumnWidth(column, measured || defaultColumnWidth(column));\n}\n\nfunction getHorizontalPadding(element: HTMLElement) {\n if (typeof window === \"undefined\") return 0;\n const styles = window.getComputedStyle(element);\n return (\n parseCssPixelValue(styles.paddingLeft) +\n parseCssPixelValue(styles.paddingRight)\n );\n}\n\nfunction parseCssPixelValue(value: string) {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction readStoredColumnWidths<T extends Record<string, unknown>>(\n storageKey: string,\n columns: DataTableColumn<T>[],\n): Record<string, number> {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n return {};\n\n return pruneColumnWidths(parsed as Record<string, unknown>, columns);\n } catch {\n return {};\n }\n}\n\nfunction writeStoredColumnWidths(\n storageKey: string,\n widths: Record<string, number>,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (Object.keys(widths).length === 0) {\n window.localStorage.removeItem(storageKey);\n } else {\n window.localStorage.setItem(storageKey, JSON.stringify(widths));\n }\n } catch {}\n}\n\nfunction readStoredHiddenColumns<T extends Record<string, unknown>>(\n storageKey: string,\n columns: DataTableColumn<T>[],\n): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n return {};\n\n return pruneHiddenColumns(parsed as Record<string, unknown>, columns);\n } catch {\n return {};\n }\n}\n\nfunction writeStoredHiddenColumns(\n storageKey: string,\n hiddenColumns: Record<string, boolean>,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (Object.keys(hiddenColumns).length === 0) {\n window.localStorage.removeItem(storageKey);\n } else {\n window.localStorage.setItem(storageKey, JSON.stringify(hiddenColumns));\n }\n } catch {}\n}\n\nfunction readStoredDensityOverride(storageKey: string): Density | undefined {\n if (typeof window === \"undefined\") return undefined;\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n return isDensity(raw) ? raw : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredDensityOverride(\n storageKey: string,\n density: Density | undefined,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (density) {\n window.localStorage.setItem(storageKey, density);\n } else {\n window.localStorage.removeItem(storageKey);\n }\n } catch {}\n}\n\nfunction isDensity(value: unknown): value is Density {\n return value === \"compact\" || value === \"comfortable\" || value === \"spacious\";\n}\n\nfunction pruneColumnWidths<T extends Record<string, unknown>>(\n widths: Record<string, unknown>,\n columns: DataTableColumn<T>[],\n): Record<string, number> {\n const byKey = new Map(columns.map((column) => [column.key, column]));\n const next: Record<string, number> = {};\n\n for (const [key, width] of Object.entries(widths)) {\n const column = byKey.get(key);\n if (!column || typeof width !== \"number\" || !Number.isFinite(width))\n continue;\n\n next[key] = clampColumnWidth(column, width);\n }\n\n return next;\n}\n\nfunction pruneHiddenColumns<T extends Record<string, unknown>>(\n hiddenColumns: Record<string, unknown>,\n columns: DataTableColumn<T>[],\n): Record<string, boolean> {\n const byKey = new Map(columns.map((column) => [column.key, column]));\n const next: Record<string, boolean> = {};\n\n for (const [key, hidden] of Object.entries(hiddenColumns)) {\n const column = byKey.get(key);\n if (!column || hidden !== true || !isColumnHideable(column)) continue;\n\n next[key] = true;\n }\n\n const hideable = columns.filter(isColumnHideable);\n const visibleHideableCount = hideable.filter(\n (column) => next[column.key] !== true,\n ).length;\n if (hideable.length > 0 && visibleHideableCount === 0) {\n delete next[hideable[0]!.key];\n }\n\n return next;\n}\n\nfunction sameColumnWidths(\n left: Record<string, number>,\n right: Record<string, number>,\n) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n left[key] === right[key],\n )\n );\n}\n\nfunction sameHiddenColumns(\n left: Record<string, boolean>,\n right: Record<string, boolean>,\n) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n left[key] === right[key],\n )\n );\n}\n\nfunction defaultColumnWidth<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n if (column.grow) return DEFAULT_GROW_COLUMN_WIDTH;\n if (column.shrink) return DEFAULT_SHRINK_COLUMN_WIDTH;\n return DEFAULT_COLUMN_WIDTH;\n}\n\nfunction clampColumnWidth<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n width: number,\n) {\n const minWidth = column.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const maxWidth = column.maxWidth;\n const minimum = Number.isFinite(minWidth)\n ? Math.max(1, minWidth)\n : DEFAULT_COLUMN_MIN_WIDTH;\n const maximum =\n maxWidth != null && Number.isFinite(maxWidth)\n ? Math.max(minimum, maxWidth)\n : Infinity;\n\n return Math.round(Math.max(minimum, Math.min(maximum, width)));\n}\n\nfunction getNumericFilterBounds<T extends Record<string, unknown>>(\n rows: InternalRow<T>[],\n column: DataTableColumn<T>,\n) {\n const values = rows.flatMap((record) =>\n collectFilterValues(getFilterCandidate(record.row, column)),\n );\n const populated = values.filter(hasFilterValue);\n const numericValues = populated\n .map((value) => parseNumberInput(value))\n .filter((value) => value != null);\n\n if (populated.length === 0 || numericValues.length !== populated.length) {\n return null;\n }\n\n return {\n min: Math.min(...numericValues),\n max: Math.max(...numericValues),\n step: inferNumericStep(numericValues),\n };\n}\n\nfunction collectFilterValues(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => collectFilterValues(item));\n }\n\n return [value];\n}\n\nfunction hasFilterValue(value: unknown) {\n return value != null && !(typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction parseNumberInput(value: unknown): number | null {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction inferNumericStep(values: number[]) {\n if (values.every(Number.isInteger)) {\n return 1;\n }\n\n const maxFractionDigits = values.reduce((current, value) => {\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.max(current, fraction.length);\n }, 0);\n\n return 10 ** -Math.min(maxFractionDigits || 2, 6);\n}\n\nfunction alignmentClass(align?: DataTableColumn[\"align\"]) {\n if (align === \"right\") return \"text-right\";\n if (align === \"center\") return \"text-center\";\n return \"text-left\";\n}\n\nfunction headerAlignmentClass(align?: DataTableColumn[\"align\"]) {\n if (align === \"right\") return \"justify-end\";\n if (align === \"center\") return \"justify-center\";\n return \"justify-start\";\n}\n\nfunction loadingSkeletonWidth(index: number) {\n return [\"w-24\", \"w-40\", \"w-28\", \"w-56\", \"w-32\", \"w-48\"][index % 6];\n}\n\nfunction cellContentStyle(\n width: number | undefined,\n): CSSProperties | undefined {\n return width ? { maxWidth: `${width}px` } : undefined;\n}\n\nfunction cellContentClassName<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n width?: number,\n): TdHTMLAttributes<HTMLTableCellElement>[\"className\"] {\n const resized = width !== undefined;\n const base = \"w-full truncate\";\n if (column.grow)\n return cn(base, resized ? \"min-w-0\" : \"min-w-56 max-w-[36rem]\");\n if (column.shrink)\n return cn(base, \"min-w-0 whitespace-nowrap\", !resized && \"max-w-[16rem]\");\n return cn(base, \"min-w-0\", !resized && \"max-w-[18rem]\");\n}\n\nexport function DataTable<T extends Record<string, unknown>>({\n theme: themeProp = \"system\",\n onThemeChange,\n showThemeControl = false,\n showFullscreenControl = false,\n fullscreenTitle = \"Table\",\n fullscreenButtonLabel = \"Open table full screen\",\n className,\n filterBarProps,\n ...inner\n}: DataTableProps<T>) {\n const themeControlled = onThemeChange !== undefined;\n const [internalTheme, setInternalTheme] = useState<Theme>(themeProp);\n const themeValue = themeControlled ? themeProp : internalTheme;\n const resolvedTheme = useResolvedTheme(themeValue);\n const handleThemeChange = (next: Theme) => {\n if (!themeControlled) setInternalTheme(next);\n onThemeChange?.(next);\n };\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n\n const renderTable = ({ inFullscreen }: { inFullscreen: boolean }) => {\n const showFullscreenButton = showFullscreenControl && !inFullscreen;\n const callerTrailing = filterBarProps?.trailing;\n const mergedFilterBarProps = showFullscreenButton\n ? {\n ...filterBarProps,\n trailing: (\n <>\n {callerTrailing}\n <FullscreenButton\n label={fullscreenButtonLabel}\n onClick={() => setFullscreenOpen(true)}\n />\n </>\n ),\n }\n : filterBarProps;\n return (\n <DataTableInner\n {...(inner as DataTableInnerProps<T>)}\n {...(mergedFilterBarProps\n ? { filterBarProps: mergedFilterBarProps }\n : {})}\n themeMenuValue={themeValue}\n showThemeControl={showThemeControl}\n onThemeChange={handleThemeChange}\n />\n );\n };\n\n return (\n <div\n data-theme={resolvedTheme}\n className={cn(\"flex min-h-0 flex-col text-foreground\", className)}\n >\n {renderTable({ inFullscreen: false })}\n {showFullscreenControl && (\n <Modal\n open={fullscreenOpen}\n onClose={() => setFullscreenOpen(false)}\n title={fullscreenTitle}\n size=\"full\"\n className=\"h-[95vh]\"\n >\n <div\n data-theme={resolvedTheme}\n className=\"flex h-full min-h-0 flex-col bg-background text-foreground\"\n >\n {renderTable({ inFullscreen: true })}\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nfunction FullscreenButton({\n label,\n onClick,\n}: {\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n onClick={onClick}\n >\n <Icon icon={UiFullscreen} className=\"text-sm\" />\n </button>\n );\n}\n"],"names":["UiRows","UiListFlat","UiListDashes","loading","useMemo","useState","_a","useEffect","useCallback","useEscapeLayer","resolveColumnValue","parseTimestamp","chooseTimestampFormat","modeToFormat","getFilterTokens","tagActionsFromRecord","jsxs","Fragment","jsx","resolveDateMath","resolvePath","useRouter","useSort","useRef","DensityValueProvider","cn","FilterBar","LoadingBar","SortableHeader","isFilterBarFilterActive","TagActionsProvider","Modal","Icon","UiArrowLeft","UiArrowRight","UiFilterFilled","UiFilter","clearFilterBarFilter","UiClose","FilterBarFilterPanel","FilterBarRangePanel","UiEllipsis","UiEyeClosed","UiResizeVertical","UiCheck","UiDesktop","UiSun","UiMoon","getFilterCandidate","splitTagToken","timestampFormat","Timestamp","TagList","normalizeTags","tagFilterTokens","normalizeStatus","StatusDot","prettifyKey","useResolvedTheme","UiFullscreen"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.cjs","sources":["../../src/data/DataTable.tsx"],"sourcesContent":["import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type TdHTMLAttributes,\n} from \"react\";\nimport { useSort, type SortDir, type SortState } from \"../hooks/use-sort\";\nimport { type Density } from \"../hooks/use-density\";\nimport { DensityValueProvider } from \"../hooks/density-provider\";\nimport { useResolvedTheme, type Theme } from \"../hooks/use-theme\";\nimport { cn } from \"../lib/utils\";\nimport { LoadingBar } from \"../components/loading\";\nimport { useRouter } from \"../rpc/router\";\nimport { Modal, type ModalSize } from \"../overlay/Modal\";\nimport { useEscapeLayer } from \"../overlay/modalStack\";\nimport {\n FilterBar,\n FilterBarFilterPanel,\n FilterBarRangePanel,\n type FilterBarFilter,\n type FilterBarMultiFilterMode,\n type FilterBarNumberValue,\n type FilterBarProps,\n type FilterBarRangePreset,\n type FilterBarRangeProps,\n type FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport {\n clearFilterBarFilter,\n isFilterBarFilterActive,\n} from \"../components/filter-bar-utils\";\nimport {\n getFilterCandidate,\n getFilterTokens,\n prettifyKey,\n resolveColumnValue,\n resolvePath,\n} from \"./data-table-utils\";\nimport type { MultiSelectOption } from \"../components/MultiSelect\";\nimport { Icon, type StaticIconComponent } from \"./Icon\";\nimport {\n UiChevronDown,\n UiChevronRight,\n UiClose,\n UiEllipsis,\n UiEyeClosed,\n UiFilterFilled,\n UiFilter,\n UiFullscreen,\n UiResizeVertical,\n UiCheck,\n UiDesktop,\n UiListDashes,\n UiListFlat,\n UiMoon,\n UiArrowLeft,\n UiArrowRight,\n UiRows,\n UiSun,\n} from \"../icons\";\nimport { SortableHeader } from \"./SortableHeader\";\nimport { Timestamp } from \"./cells/Timestamp\";\nimport {\n chooseTimestampFormat,\n modeToFormat,\n parseTimestamp,\n resolveDateMath,\n type TimestampFormat,\n type TimestampOptions,\n} from \"./cells/timestamp-format\";\nimport { TagActionsProvider, TagList } from \"./cells/TagList\";\nimport {\n normalizeTags,\n splitTagToken,\n tagActionsFromRecord,\n tagFilterTokens,\n type TagActionsContextValue,\n type TagFilterMode,\n type TagsOptions,\n type TagsValue,\n} from \"./cells/tag-utils\";\nimport { StatusDot } from \"./cells/StatusDot\";\nimport { normalizeStatus } from \"./cells/status-mapping\";\nimport type { BadgeStatus } from \"./Badge\";\nimport {\n groupRecords,\n isGroupCollapsedByDefault,\n type DataTableGrouping,\n} from \"./DataTable.grouping\";\n\nexport type { TimestampOptions, TagsOptions };\n\nexport type DataTableColumnKind = \"timestamp\" | \"tags\" | \"status\";\n\nexport type StatusOptions<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Maps the raw cell value to a badge status. Return null to fall back to text. */\n map?: (raw: unknown, row: T) => BadgeStatus | null;\n /** Show the normalized status label next to the dot. */\n showLabel?: boolean;\n /** Tooltip text for the status cell. */\n title?: (raw: unknown, row: T) => string;\n};\n\ntype FilterValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean>;\n\ntype InternalRow<T> = {\n id: string;\n row: T;\n};\n\ntype ResolvedGroup<T> = {\n key: string;\n records: InternalRow<T>[];\n rows: T[];\n label: ReactNode;\n meta: ReactNode;\n collapsed: boolean;\n};\n\ntype RowStreamItem<T> =\n | { kind: \"group\"; group: ResolvedGroup<T> }\n | { kind: \"row\"; record: InternalRow<T> };\n\ntype GeneratedFilter<T extends Record<string, unknown>> = {\n column: DataTableColumn<T>;\n kind: \"text\" | \"multi\" | \"nested-multi\" | \"number\";\n options: MultiSelectOption[];\n groups?: Array<{\n groupKey: string;\n label?: string;\n options: MultiSelectOption[];\n }>;\n numberBounds?: {\n min: number;\n max: number;\n step: number;\n };\n};\n\nconst DEFAULT_COLUMN_MIN_WIDTH = 64;\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst DEFAULT_GROW_COLUMN_WIDTH = 224;\nconst DEFAULT_SHRINK_COLUMN_WIDTH = 96;\nconst COLUMN_WIDTH_STORAGE_PREFIX = \"clicky-ui-data-table-column-widths\";\nconst COLUMN_VISIBILITY_STORAGE_PREFIX =\n \"clicky-ui-data-table-column-visibility\";\nconst DENSITY_STORAGE_PREFIX = \"clicky-ui-data-table-density\";\n\nconst DENSITY_OPTIONS: Array<{\n value: Density;\n icon: StaticIconComponent;\n label: string;\n}> = [\n { value: \"compact\", icon: UiRows, label: \"Compact\" },\n { value: \"comfortable\", icon: UiListFlat, label: \"Comfortable\" },\n { value: \"spacious\", icon: UiListDashes, label: \"Spacious\" },\n];\n\nconst DATA_TABLE_HEADER_DENSITY_CLASS =\n \"px-2.5 py-1.5 density-compact:px-2 density-compact:py-1 density-comfortable:px-2.5 density-comfortable:py-1.5 density-spacious:px-4 density-spacious:py-3\";\nconst DATA_TABLE_CELL_DENSITY_CLASS =\n \"px-2.5 py-1.5 density-compact:px-2 density-compact:py-0.5 density-comfortable:px-2.5 density-comfortable:py-1.5 density-spacious:px-4 density-spacious:py-3\";\n\ntype ColumnMenuState = {\n x: number;\n y: number;\n columnKey?: string;\n};\n\nexport type DataTableRowDetailContext<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: DataTableColumn<T>[];\n visibleColumns: DataTableColumn<T>[];\n filterActionsByColumn: Record<string, TagActionsContextValue>;\n};\n\n// Mirrors the preset list used by the trace UI's TraceFilters so log/trace\n// tables share the same vocabulary out of the box.\nconst TIMESTAMP_RANGE_PRESETS: FilterBarRangePreset[] = [\n { label: \"Last 5 minutes\", from: \"now-5m\", to: \"now\" },\n { label: \"Last 15 minutes\", from: \"now-15m\", to: \"now\" },\n { label: \"Last 1 hour\", from: \"now-1h\", to: \"now\" },\n { label: \"Last 6 hours\", from: \"now-6h\", to: \"now\" },\n { label: \"Last 24 hours\", from: \"now-24h\", to: \"now\" },\n { label: \"Last 7 days\", from: \"now-7d\", to: \"now\" },\n { label: \"Last 30 days\", from: \"now-30d\", to: \"now\" },\n];\n\nexport type DataTableColumn<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Field path or stable column id. Dotted paths read nested row values. */\n key: string;\n /** Header label. */\n label: ReactNode;\n /**\n * Reads the cell value from the row. When set, it is used for rendering,\n * sorting, and filtering instead of resolving `key` as a (possibly nested)\n * path. Use this for arbitrary SQL columns whose names are empty, contain\n * dots (\"a.b\" as a literal key, not a nested path), or collide — the `key`\n * then only needs to be a stable, unique column id.\n */\n accessor?: (row: T) => unknown;\n /** Enables header click sorting for this column. */\n sortable?: boolean;\n /** Enables a generated column filter when `autoFilter` is true. */\n filterable?: boolean;\n /** Prefer allocating extra width to this column. */\n grow?: boolean;\n /** Prefer keeping this column compact. */\n shrink?: boolean;\n /** Allows users to drag the column separator. */\n resizable?: boolean;\n /** Allows the column to be toggled from the column menu. */\n hideable?: boolean;\n /** Minimum column width in pixels. */\n minWidth?: number;\n /** Maximum column width in pixels. */\n maxWidth?: number;\n /** Cell and header text alignment. */\n align?: \"left\" | \"center\" | \"right\";\n /** Custom cell renderer. */\n render?: (value: unknown, row: T) => ReactNode;\n /** Sort key derived from the raw value and row. */\n sortValue?: (value: unknown, row: T) => unknown;\n /** Filter token or tokens derived from the raw value and row. */\n filterValue?: (value: unknown, row: T) => FilterValue;\n /** Classes applied to cells in this column. */\n cellClassName?: string;\n /** Classes applied to the header cell. */\n headerClassName?: string;\n /**\n * Built-in cell kind. When set, DataTable supplies a default renderer,\n * a default `sortValue` and a default `filterValue` (all overridable).\n * - \"timestamp\": adaptive format (relative / time / short / iso) chosen\n * from the spread of values in `data`.\n * - \"tags\": chip list with `+N` overflow; auto-multi-filter on tag tokens.\n * - \"status\": colored dot with the standard error/warning/success palette\n * (token-mapped — \"ERROR\", \"failed\", \"fatal\" all collapse to \"error\").\n */\n kind?: DataTableColumnKind;\n timestamp?: TimestampOptions;\n tags?: TagsOptions;\n status?: StatusOptions<T>;\n};\n\nexport type DataTableColumnInput<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = DataTableColumn<T> | string;\n\n/**\n * Server-side pagination control surfaced as a footer strip below the table.\n * The DataTable never slices data itself; callers refetch when the page or\n * pageSize changes.\n */\nexport type DataTablePagination = {\n /** Current zero-indexed page. */\n page: number;\n /** Number of rows requested per page. */\n pageSize: number;\n /** Total row count if known; enables \"Page X of Y\". */\n total?: number;\n /** Called when the user moves to another page. */\n onPageChange: (page: number) => void;\n /** Called when the page size select changes. */\n onPageSizeChange: (pageSize: number) => void;\n /** Available page sizes. Defaults to [25, 50, 100, 200]. */\n pageSizeOptions?: number[];\n};\n\nexport type DataTableMenuAction = {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n icon?: StaticIconComponent;\n iconClassName?: string;\n disabled?: boolean;\n /** Heading the action is grouped under in the overflow menu. Actions with\n * the same section render together below one label; defaults to \"Download\"\n * so existing download actions keep their heading. */\n section?: string;\n onSelect: () => void;\n};\n\nexport type DataTableRowSelection<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Controlled set of selected row ids, resolved through `getRowId`. */\n selectedRowIds: readonly string[];\n /** Called with the next ids and the matching rows currently loaded. */\n onSelectionChange: (selectedRowIds: string[], selectedRows: T[]) => void;\n /** Optional predicate for rows that cannot be selected. */\n isRowSelectable?: (row: T) => boolean;\n /** Toggle selection when the user clicks anywhere on a selectable row. */\n toggleOnRowClick?: boolean;\n};\n\n/** Passed to `selectionActions` while rows are selected. */\nexport type DataTableSelectionContext<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n selectedRowIds: string[];\n /** The selected rows currently loaded, in render order. */\n selectedRows: T[];\n /** Empties the selection through the same `onSelectionChange` callback. */\n clearSelection: () => void;\n};\n\n/** Passed to a `footer` render function. */\nexport type DataTableFooterContext = {\n /** Rows left after filtering — what the table is showing. */\n visibleRowCount: number;\n /** Rows handed to the table before filtering. */\n totalRowCount: number;\n loading: boolean;\n};\n\ntype DataTableInnerProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = {\n /** Rows to render. The table does not fetch or mutate row data. */\n data: T[];\n /** Error content rendered as an accessible full-width row in the table body. */\n error?: ReactNode;\n /**\n * Column descriptors. Pass a bare string for a default column —\n * `\"foo\"` is equivalent to `{ key: \"foo\", label: \"foo\" }` — handy for\n * ad-hoc query results where the column metadata is just a list of names.\n * Mix and match strings with full descriptors as needed.\n */\n columns: Array<DataTableColumnInput<T>>;\n /** Shows skeleton/loading rows instead of data rows. */\n loading?: boolean;\n /** Message shown while `loading` is true. */\n loadingMessage?: ReactNode;\n /** Number of skeleton rows to render while loading. */\n loadingRowCount?: number;\n /** Message used when there are no rows after filtering. */\n emptyMessage?: string;\n /**\n * Client-side incremental reveal (infinite scroll). When set — and no server\n * `pagination` is provided — the table renders `batchSize` rows at a time and\n * grows by `batchSize` as a trailing sentinel scrolls into view. Use for\n * large in-memory result sets (e.g. ad-hoc SQL output) to keep the first\n * paint cheap without paginating.\n */\n clientReveal?: { batchSize: number };\n /** Classes applied to the table shell. */\n className?: string;\n /**\n * Classes for the scrollable table region. Defaults to `min-h-0 flex-1`\n * (fills a bounded flex parent). Pass e.g. `max-h-[26rem]` to cap height.\n */\n scrollContainerClassName?: string;\n /** Generate filters from filterable columns. */\n autoFilter?: boolean;\n /** Show the global search input. */\n showGlobalFilter?: boolean;\n /** Controlled global search value. */\n globalFilter?: string;\n /** Called when the global search changes. */\n onGlobalFilterChange?: (value: string) => void;\n /** Placeholder for the global search input. */\n globalFilterPlaceholder?: string;\n /** Initial sort state. */\n defaultSort?: { key: string; dir?: SortDir };\n /** Controlled sort state, for server-backed tables. */\n sort?: SortState | null;\n /** Called when a sortable header changes the controlled sort state. */\n onSortChange?: (sort: SortState | null) => void;\n /** When true, header sorting updates state but does not reorder `data`. */\n manualSort?: boolean;\n /** Extra props forwarded to the internal FilterBar. */\n filterBarProps?: Omit<FilterBarProps, \"search\" | \"filters\">;\n /**\n * Caller-owned search input rendered in the FilterBar's search slot. Unlike\n * `globalFilter`, this does NOT filter rows client-side — it is a controlled\n * input the caller wires to a server-side query (e.g., an operation's `q`\n * parameter). Takes precedence over the built-in global filter input.\n */\n externalSearch?: FilterBarSearchProps;\n /**\n * Caller-owned time-range control rendered in the FilterBar. Like\n * `externalSearch`/`externalFilters`, it does NOT filter rows client-side —\n * the caller wires it to a server-side query (e.g. an operation's\n * `time-from`/`time-to` parameters). Takes precedence over any\n * column-derived time range.\n */\n externalTimeRange?: FilterBarRangeProps;\n /**\n * Extra filter pills supplied by the caller (e.g., operation query\n * parameters surfaced via parametersToFormConfig) that should appear in the\n * FilterBar alongside the column-derived filters. Rendered before the\n * column filters so the caller's natural ordering wins.\n */\n externalFilters?: FilterBarFilter[];\n /**\n * Server-side pagination footer. When provided, a small page-size / prev /\n * next strip is rendered below the table; the DataTable does NOT slice\n * `data` itself, callers are expected to refetch when `onPageChange` or\n * `onPageSizeChange` fires.\n */\n pagination?: DataTablePagination;\n /** Stable row id extractor. Defaults to the row index. */\n getRowId?: (row: T, index: number) => string;\n /** Controlled checkbox selection for entity/bulk-action tables. */\n rowSelection?: DataTableRowSelection<T>;\n /**\n * Bulk action bar, pinned to the bottom of the table shell while\n * `rowSelection` holds a non-empty selection. Ignored without `rowSelection`.\n */\n selectionActions?: (context: DataTableSelectionContext<T>) => ReactNode;\n /**\n * Extra classes for a row's `<tr>`, applied last so tailwind-merge lets the\n * caller override the built-in hover / selected backgrounds.\n */\n getRowClassName?: (row: T) => string | undefined;\n /**\n * Replaces the default \"N of M rows\" strip below the table. When\n * `pagination` is also set, this renders directly above the pager instead.\n */\n footer?: ReactNode | ((context: DataTableFooterContext) => ReactNode);\n /**\n * Splits the rendered rows into collapsible groups, each introduced by a\n * full-width header row. Grouping presents what is already on screen: it\n * runs after filtering, sorting and pagination, so it never reorders rows\n * within a group and never pulls in rows from another page.\n */\n grouping?: DataTableGrouping<T>;\n /** Called when a clickable row is selected. */\n onRowClick?: (row: T) => void;\n /** Predicate controlling whether a row is clickable. */\n isRowClickable?: (row: T) => boolean;\n /** Optional href for row link affordances. */\n getRowHref?: (row: T) => string | undefined;\n /** Detail content rendered for expanded rows or dialog details. */\n renderExpandedRow?: (\n row: T,\n context: DataTableRowDetailContext<T>,\n ) => ReactNode;\n /**\n * How `renderExpandedRow` detail is surfaced when a row is clicked.\n * - \"row\" (default): expands an inline detail row beneath the clicked row.\n * Multiple rows can be open at once.\n * - \"dialog\": opens the detail content in a centered modal; one row at a\n * time. The same `renderExpandedRow` (and its context) drives both styles.\n */\n detailStyle?: \"row\" | \"dialog\";\n /**\n * Title for the detail dialog (detailStyle=\"dialog\"). Pass a function to\n * derive a per-row title, e.g. `(row) => \\`Session ${row.sessionId}\\``.\n */\n detailDialogTitle?: ReactNode | ((row: T) => ReactNode);\n /** Modal size for the detail dialog. Defaults to \"lg\". */\n detailDialogSize?: ModalSize;\n /** Enables column drag resize handles. */\n resizableColumns?: boolean;\n /** Persists column widths to localStorage. */\n persistColumnWidths?: boolean;\n /** Storage key for persisted column widths. */\n columnResizeStorageKey?: string;\n /** Enables column visibility controls. */\n hideableColumns?: boolean;\n /** Persists column visibility to localStorage. */\n persistColumnVisibility?: boolean;\n /** Storage key for persisted column visibility. */\n columnVisibilityStorageKey?: string;\n /** Controlled row density. */\n density?: Density;\n /** Initial row density for uncontrolled usage. */\n defaultDensity?: Density;\n /** Called when density changes. */\n onDensityChange?: (density: Density | undefined) => void;\n /** Persists density to localStorage. */\n persistDensity?: boolean;\n /** Storage key for persisted density. */\n densityStorageKey?: string;\n /** Shows density controls in the column menu. */\n showDensityControl?: boolean;\n /**\n * Current value of the theme menu shown in the column / preferences popover.\n * The inner DataTable does not apply this value itself — it's the menu's\n * displayed selection. The outer `DataTable` wrapper manages this state and\n * paints a wrapper-level `data-theme`.\n */\n themeMenuValue?: Theme;\n onThemeChange?: (theme: Theme) => void;\n /** Shows theme controls in the column menu. */\n showThemeControl?: boolean;\n /** Shows per-column filter buttons in table headers. */\n showHeaderFilters?: boolean;\n /** Extra actions rendered in the table preferences menu. */\n menuActions?: DataTableMenuAction[];\n};\n\nexport type DataTableProps<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<DataTableInnerProps<T>, \"themeMenuValue\"> & {\n /**\n * Initial / controlled theme value for the column-menu Theme section.\n * When `onThemeChange` is omitted, the DataTable manages this internally\n * (seeded from `theme`) and applies `data-theme` to its root so the table\n * reflects the choice without requiring an enclosing `<ThemeProvider>`.\n */\n theme?: Theme;\n /**\n * Render a fullscreen-toggle button in the FilterBar's trailing slot\n * (just before the column-menu trigger). When clicked, the table re-renders\n * inside a full-viewport `<Modal>`. Defaults to `false`.\n */\n showFullscreenControl?: boolean;\n /** Title shown in the fullscreen modal. */\n fullscreenTitle?: ReactNode;\n /**\n * `aria-label` and `title` for the fullscreen toggle button. Defaults to\n * \"Open table full screen\". LogsTable overrides to \"Open logs full screen\".\n */\n fullscreenButtonLabel?: string;\n};\n\nfunction DataTableInner<T extends Record<string, unknown>>({\n data,\n error,\n columns: columnsInput,\n loading = false,\n loadingMessage = \"Loading results…\",\n loadingRowCount = 8,\n emptyMessage: _emptyMessage = \"No data\",\n clientReveal,\n className,\n scrollContainerClassName,\n autoFilter = false,\n showGlobalFilter = true,\n globalFilter,\n onGlobalFilterChange,\n globalFilterPlaceholder = \"Search all columns…\",\n defaultSort,\n sort: controlledSort,\n onSortChange,\n manualSort = false,\n filterBarProps,\n externalSearch,\n externalTimeRange,\n externalFilters,\n pagination,\n getRowId,\n rowSelection,\n selectionActions,\n getRowClassName,\n footer,\n grouping,\n onRowClick,\n isRowClickable,\n getRowHref,\n renderExpandedRow,\n detailStyle = \"row\",\n detailDialogTitle,\n detailDialogSize = \"lg\",\n resizableColumns = true,\n persistColumnWidths = true,\n columnResizeStorageKey,\n hideableColumns = true,\n persistColumnVisibility = true,\n columnVisibilityStorageKey,\n density,\n defaultDensity,\n onDensityChange,\n persistDensity = true,\n densityStorageKey,\n showDensityControl,\n themeMenuValue,\n onThemeChange,\n showThemeControl = false,\n showHeaderFilters = true,\n menuActions,\n}: DataTableInnerProps<T>) {\n const columns = useMemo<DataTableColumn<T>[]>(\n () =>\n columnsInput.map((column) =>\n typeof column === \"string\" ? { key: column, label: column } : column,\n ),\n [columnsInput],\n );\n const columnKeysSignature = useMemo(\n () => columns.map((column) => column.key).join(\"|\"),\n [columns],\n );\n const resolvedColumnResizeStorageKey =\n columnResizeStorageKey ??\n `${COLUMN_WIDTH_STORAGE_PREFIX}:${columnKeysSignature}`;\n const resolvedColumnVisibilityStorageKey =\n columnVisibilityStorageKey ??\n `${COLUMN_VISIBILITY_STORAGE_PREFIX}:${columnKeysSignature}`;\n const resolvedDensityStorageKey =\n densityStorageKey ?? `${DENSITY_STORAGE_PREFIX}:${columnKeysSignature}`;\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () =>\n persistColumnWidths\n ? readStoredColumnWidths(resolvedColumnResizeStorageKey, columns)\n : {},\n );\n const [hiddenColumns, setHiddenColumns] = useState<Record<string, boolean>>(\n () =>\n persistColumnVisibility\n ? readStoredHiddenColumns(resolvedColumnVisibilityStorageKey, columns)\n : {},\n );\n const densityControlled = density !== undefined;\n const [localDensityOverride, setLocalDensityOverride] = useState<\n Density | undefined\n >(() => {\n if (densityControlled) return density;\n if (persistDensity)\n return (\n readStoredDensityOverride(resolvedDensityStorageKey) ?? defaultDensity\n );\n return defaultDensity;\n });\n const [columnMenu, setColumnMenu] = useState<ColumnMenuState | null>(null);\n const [headerFilterMenu, setHeaderFilterMenu] =\n useState<ColumnMenuState | null>(null);\n const [textFilters, setTextFilters] = useState<Record<string, string>>({});\n const [multiFilters, setMultiFilters] = useState<\n Record<string, Record<string, FilterBarMultiFilterMode>>\n >({});\n const [numberFilters, setNumberFilters] = useState<\n Record<string, FilterBarNumberValue>\n >({});\n const [expandedRows, setExpandedRows] = useState<Record<string, boolean>>({});\n const [detailRow, setDetailRow] = useState<InternalRow<T> | null>(null);\n const [localGlobalFilter, setLocalGlobalFilter] = useState(\"\");\n const [timeRangeFilter, setTimeRangeFilter] = useState<{\n from: string;\n to: string;\n }>(() => {\n const seed = columns.find(\n (column) => column.kind === \"timestamp\" && column.timestamp?.defaultRange,\n );\n return {\n from: seed?.timestamp?.defaultRange?.from ?? \"\",\n to: seed?.timestamp?.defaultRange?.to ?? \"\",\n };\n });\n\n useEffect(() => {\n setColumnWidths((current) => {\n const stored = persistColumnWidths\n ? readStoredColumnWidths(resolvedColumnResizeStorageKey, columns)\n : {};\n const next = pruneColumnWidths({ ...stored, ...current }, columns);\n return sameColumnWidths(current, next) ? current : next;\n });\n }, [\n columnKeysSignature,\n persistColumnWidths,\n resolvedColumnResizeStorageKey,\n ]);\n\n useEffect(() => {\n if (!persistColumnWidths) return;\n writeStoredColumnWidths(resolvedColumnResizeStorageKey, columnWidths);\n }, [columnWidths, persistColumnWidths, resolvedColumnResizeStorageKey]);\n\n useEffect(() => {\n setHiddenColumns((current) => {\n const stored = persistColumnVisibility\n ? readStoredHiddenColumns(resolvedColumnVisibilityStorageKey, columns)\n : {};\n const next = pruneHiddenColumns({ ...stored, ...current }, columns);\n return sameHiddenColumns(current, next) ? current : next;\n });\n }, [\n columnKeysSignature,\n persistColumnVisibility,\n resolvedColumnVisibilityStorageKey,\n ]);\n\n useEffect(() => {\n if (!persistColumnVisibility) return;\n writeStoredHiddenColumns(resolvedColumnVisibilityStorageKey, hiddenColumns);\n }, [\n hiddenColumns,\n persistColumnVisibility,\n resolvedColumnVisibilityStorageKey,\n ]);\n\n useEffect(() => {\n if (densityControlled) return;\n setLocalDensityOverride(\n persistDensity\n ? (readStoredDensityOverride(resolvedDensityStorageKey) ??\n defaultDensity)\n : defaultDensity,\n );\n }, [\n defaultDensity,\n densityControlled,\n persistDensity,\n resolvedDensityStorageKey,\n ]);\n\n useEffect(() => {\n if (densityControlled || !persistDensity) return;\n writeStoredDensityOverride(resolvedDensityStorageKey, localDensityOverride);\n }, [\n densityControlled,\n localDensityOverride,\n persistDensity,\n resolvedDensityStorageKey,\n ]);\n\n const closeFloatingMenus = useCallback(() => {\n setColumnMenu(null);\n setHeaderFilterMenu(null);\n }, []);\n\n useEscapeLayer(Boolean(columnMenu || headerFilterMenu), closeFloatingMenus);\n\n useEffect(() => {\n if (!columnMenu && !headerFilterMenu) return;\n document.addEventListener(\"click\", closeFloatingMenus);\n return () => {\n document.removeEventListener(\"click\", closeFloatingMenus);\n };\n }, [closeFloatingMenus, columnMenu, headerFilterMenu]);\n\n const rows = useMemo<InternalRow<T>[]>(\n () =>\n data.map((row, index) => ({\n id: getRowId?.(row, index) ?? String(index),\n row,\n })),\n [data, getRowId],\n );\n\n const timestampFormats = useMemo<Record<string, TimestampFormat>>(() => {\n const out: Record<string, TimestampFormat> = {};\n for (const column of columns) {\n if (column.kind !== \"timestamp\") continue;\n const dates: Date[] = [];\n for (const row of data) {\n const raw = resolveColumnValue(row, column);\n const parsed = parseTimestamp(raw);\n if (parsed) dates.push(parsed);\n }\n const dataFormat = chooseTimestampFormat(dates);\n out[column.key] = modeToFormat(\n column.timestamp?.mode ?? \"auto\",\n dataFormat,\n );\n }\n return out;\n }, [columns, data]);\n\n const effectiveColumns = useMemo<DataTableColumn<T>[]>(\n () =>\n columns.map((column) =>\n applyKindDefaults<T>(column, timestampFormats[column.key]),\n ),\n [columns, timestampFormats],\n );\n\n const visibleColumns = useMemo(() => {\n if (!hideableColumns) return effectiveColumns;\n const next = effectiveColumns.filter(\n (column) => !hiddenColumns[column.key],\n );\n return next.length > 0 ? next : effectiveColumns;\n }, [effectiveColumns, hiddenColumns, hideableColumns]);\n\n const hideableColumnCount = useMemo(\n () => effectiveColumns.filter(isColumnHideable).length,\n [effectiveColumns],\n );\n\n const visibleHideableColumnCount = useMemo(\n () => visibleColumns.filter(isColumnHideable).length,\n [visibleColumns],\n );\n\n const showColumnVisibilityControl =\n hideableColumns && hideableColumnCount > 1;\n const resolvedShowDensityControl =\n showDensityControl ?? showColumnVisibilityControl;\n const hasMenuActions = Boolean(menuActions && menuActions.length > 0);\n const showTablePreferencesControl =\n showColumnVisibilityControl ||\n resolvedShowDensityControl ||\n showThemeControl ||\n hasMenuActions;\n const densityOverride = densityControlled ? density : localDensityOverride;\n\n // The first kind:\"timestamp\" column (with autoRangeFilter not disabled) gets\n // the auto-mounted FilterBar time-range picker. The user can override by\n // supplying their own filterBarProps.timeRange.\n const timeRangeColumn = useMemo(() => {\n if (filterBarProps?.timeRange) return null;\n return (\n effectiveColumns.find(\n (column) =>\n column.kind === \"timestamp\" &&\n column.filterable !== false &&\n column.timestamp?.autoRangeFilter !== false,\n ) ?? null\n );\n }, [effectiveColumns, filterBarProps?.timeRange]);\n\n const filterableColumns = useMemo(\n () =>\n effectiveColumns.filter((column) => {\n if (column.filterable === false) return false;\n // Timestamp columns are filtered through the time-range picker, not\n // a per-column text/multi filter. Skip them in auto-filter generation.\n if (column.kind === \"timestamp\") return false;\n return true;\n }),\n [effectiveColumns],\n );\n\n const generatedFilters = useMemo<GeneratedFilter<T>[]>(() => {\n if (!autoFilter || loading) return [];\n\n return filterableColumns.map((column) => {\n const numberBounds = getNumericFilterBounds(rows, column);\n if (numberBounds) {\n return {\n column,\n kind: \"number\" as const,\n options: [],\n numberBounds,\n };\n }\n\n const values = new Set<string>();\n\n for (const record of rows) {\n for (const token of getFilterTokens(record.row, column)) {\n if (token) values.add(token);\n }\n }\n\n const options = Array.from(values)\n .sort((left, right) =>\n left.localeCompare(right, undefined, { numeric: true }),\n )\n .map((value) => ({ value, label: value }));\n\n // Tag columns naturally have higher cardinality (e.g. infra labels);\n // we let the multi-filter scale to 50 distinct values before falling\n // back to free-text search.\n const multiCap = column.kind === \"tags\" ? 50 : 20;\n\n const fitsMulti = options.length >= 2 && options.length <= multiCap;\n\n // For tag columns we group tokens by their key so the filter renders\n // as a two-level submenu (env → prod/staging, tier → edge/core, …).\n // Falls back to a flat multi when there's only one key (or none).\n if (column.kind === \"tags\" && fitsMulti) {\n const separator = column.tags?.separator ?? \"=\";\n const groups = groupTagOptions(options, separator);\n if (groups.length >= 2) {\n return {\n column,\n kind: \"nested-multi\" as const,\n options,\n groups,\n };\n }\n }\n\n return {\n column,\n kind: fitsMulti ? \"multi\" : \"text\",\n options,\n };\n });\n }, [autoFilter, filterableColumns, loading, rows]);\n\n // For every multi / nested-multi column (which includes kind:\"tags\"), expose a\n // TagActions value backed by this table's multiFilters slot. The + / − icons in\n // tag cells and in expanded-row details mutate the same Record<token, mode>\n // shape the filter-bar dropdown uses, so the existing filter pipeline picks up\n // the change. Built from generatedFilters so it stays in lockstep with\n // pruneMultiFilterState (only multi/nested-multi columns honor multiFilters).\n const filterActionsByColumn = useMemo(() => {\n const out: Record<string, TagActionsContextValue> = {};\n for (const filter of generatedFilters) {\n if (filter.kind !== \"multi\" && filter.kind !== \"nested-multi\") continue;\n const columnKey = filter.column.key;\n const current = (multiFilters[columnKey] ?? {}) as Record<\n string,\n TagFilterMode\n >;\n const handler = (next: Record<string, TagFilterMode>) =>\n setMultiFilters((state) => updateFilterRecord(state, columnKey, next));\n out[columnKey] = tagActionsFromRecord(current, handler);\n }\n return out;\n }, [generatedFilters, multiFilters]);\n\n useEffect(() => {\n setTextFilters((current) =>\n pruneTextFilterState(current, generatedFilters),\n );\n setMultiFilters((current) =>\n pruneMultiFilterState(current, generatedFilters),\n );\n setNumberFilters((current) =>\n pruneNumberFilterState(current, generatedFilters),\n );\n }, [generatedFilters]);\n\n const globalFilterControlled = globalFilter !== undefined;\n const effectiveGlobalFilter = globalFilterControlled\n ? globalFilter\n : localGlobalFilter;\n const setEffectiveGlobalFilter = globalFilterControlled\n ? (onGlobalFilterChange ?? (() => {}))\n : setLocalGlobalFilter;\n const nativeFilters = useMemo<FilterBarFilter[]>(\n () =>\n generatedFilters.map((filter): FilterBarFilter => {\n const columnKey = filter.column.key;\n if (filter.kind === \"multi\") {\n return {\n key: columnKey,\n kind: \"multi\",\n label: labelText(filter.column),\n value: multiFilters[columnKey] ?? {},\n onChange: (next) =>\n setMultiFilters((current) =>\n updateFilterRecord(current, columnKey, next),\n ),\n options: filter.options,\n };\n }\n if (filter.kind === \"nested-multi\") {\n return {\n key: columnKey,\n kind: \"nested-multi\",\n label: labelText(filter.column),\n value: multiFilters[columnKey] ?? {},\n onChange: (next) =>\n setMultiFilters((current) =>\n updateFilterRecord(current, columnKey, next),\n ),\n groups: filter.groups ?? [],\n };\n }\n if (filter.kind === \"number\") {\n const numberFilter: Extract<FilterBarFilter, { kind: \"number\" }> = {\n key: columnKey,\n kind: \"number\",\n label: labelText(filter.column),\n value: numberFilters[columnKey] ?? {},\n onChange: (next: FilterBarNumberValue) =>\n setNumberFilters((current) =>\n updateNumberFilterValue(current, columnKey, next),\n ),\n };\n if (filter.numberBounds?.min !== undefined) {\n numberFilter.domainMin = filter.numberBounds.min;\n }\n if (filter.numberBounds?.max !== undefined) {\n numberFilter.domainMax = filter.numberBounds.max;\n }\n if (filter.numberBounds?.step !== undefined) {\n numberFilter.step = filter.numberBounds.step;\n }\n return numberFilter;\n }\n return {\n key: columnKey,\n kind: \"text\",\n label: labelText(filter.column),\n value: textFilters[columnKey] ?? \"\",\n onChange: (next: string) =>\n setTextFilters((current) =>\n updateFilterValue(current, columnKey, next),\n ),\n };\n }),\n [generatedFilters, multiFilters, numberFilters, textFilters],\n );\n const nativeFilterByColumn = useMemo(\n () => new Map(nativeFilters.map((filter) => [filter.key, filter])),\n [nativeFilters],\n );\n const hasCustomFilterBarContent = Boolean(\n filterBarProps?.leading ||\n filterBarProps?.children ||\n filterBarProps?.trailing ||\n filterBarProps?.timeRange ||\n filterBarProps?.dateRange,\n );\n const autoTimeRange = useMemo<FilterBarRangeProps | null>(() => {\n if (!timeRangeColumn) return null;\n const next: FilterBarRangeProps = {\n from: timeRangeFilter.from,\n to: timeRangeFilter.to,\n onApply: (from, to) => setTimeRangeFilter({ from, to }),\n presets:\n timeRangeColumn.timestamp?.rangePresets ?? TIMESTAMP_RANGE_PRESETS,\n fromPlaceholder: \"now-24h\",\n toPlaceholder: \"now\",\n emptyLabel: \"Any time\",\n };\n if (timeRangeColumn.timestamp?.timeEnabled !== undefined) {\n next.timeEnabled = timeRangeColumn.timestamp.timeEnabled;\n }\n if (timeRangeColumn.timestamp?.timeZone) {\n next.timeZone = timeRangeColumn.timestamp.timeZone;\n }\n if (timeRangeColumn.timestamp?.timeZones) {\n next.timeZones = timeRangeColumn.timestamp.timeZones;\n }\n return next;\n }, [timeRangeColumn, timeRangeFilter.from, timeRangeFilter.to]);\n const showFilterBar =\n (autoFilter &&\n (showGlobalFilter || nativeFilters.length > 0)) ||\n !!autoTimeRange ||\n !!externalSearch ||\n !!externalTimeRange ||\n (externalFilters && externalFilters.length > 0) ||\n hasCustomFilterBarContent ||\n showTablePreferencesControl;\n const setDensityOverride = (next: Density | undefined) => {\n if (!densityControlled) setLocalDensityOverride(next);\n onDensityChange?.(next);\n };\n const filterBarTrailing = showTablePreferencesControl ? (\n <>\n {filterBarProps?.trailing}\n <ColumnVisibilityTrigger\n onOpen={(event) => setColumnMenu(menuStateFromTrigger(event))}\n />\n </>\n ) : (\n filterBarProps?.trailing\n );\n const showHeaderFilterControls =\n showHeaderFilters && (autoFilter || !!autoTimeRange);\n\n const filteredRows = useMemo(() => {\n const globalNeedle = effectiveGlobalFilter.trim().toLowerCase();\n const now = new Date();\n const rangeFromDate = timeRangeColumn\n ? resolveDateMath(timeRangeFilter.from, now)\n : null;\n const rangeToDate = timeRangeColumn\n ? resolveDateMath(timeRangeFilter.to, now)\n : null;\n const rangeColumnKey = timeRangeColumn?.key;\n\n return rows.filter(({ row }) => {\n if (rangeColumnKey && (rangeFromDate || rangeToDate)) {\n const raw = resolvePath(row, rangeColumnKey);\n const ts = parseTimestamp(raw);\n if (!ts) return false;\n if (rangeFromDate && ts.getTime() < rangeFromDate.getTime())\n return false;\n if (rangeToDate && ts.getTime() > rangeToDate.getTime()) return false;\n }\n\n if (globalNeedle) {\n const haystack = filterableColumns\n .flatMap((column) => getFilterTokens(row, column))\n .join(\" \")\n .toLowerCase();\n\n if (!haystack.includes(globalNeedle)) {\n return false;\n }\n }\n\n for (const filter of generatedFilters) {\n const tokens = getFilterTokens(row, filter.column);\n\n if (filter.kind === \"text\") {\n const needle = (textFilters[filter.column.key] ?? \"\")\n .trim()\n .toLowerCase();\n if (\n needle &&\n !tokens.some((token) => token.toLowerCase().includes(needle))\n ) {\n return false;\n }\n } else if (filter.kind === \"number\") {\n const range = numberFilters[filter.column.key] ?? {};\n const min = parseNumberInput(range.min);\n const max = parseNumberInput(range.max);\n const hasMin = String(range.min ?? \"\").trim() !== \"\";\n const hasMax = String(range.max ?? \"\").trim() !== \"\";\n\n if (hasMin || hasMax) {\n const values = getFilterNumbers(row, filter.column);\n const matches = values.some(\n (value) =>\n (min == null || value >= min) && (max == null || value <= max),\n );\n\n if (!matches) {\n return false;\n }\n }\n } else {\n const selected = multiFilters[filter.column.key] ?? {};\n const include = Object.entries(selected)\n .filter(([, mode]) => mode === \"include\")\n .map(([value]) => value);\n const exclude = Object.entries(selected)\n .filter(([, mode]) => mode === \"exclude\")\n .map(([value]) => value);\n\n if (\n include.length > 0 &&\n !tokens.some((token) => include.includes(token))\n ) {\n return false;\n }\n\n if (\n exclude.length > 0 &&\n tokens.some((token) => exclude.includes(token))\n ) {\n return false;\n }\n }\n }\n\n return true;\n });\n }, [\n effectiveGlobalFilter,\n filterableColumns,\n generatedFilters,\n multiFilters,\n numberFilters,\n rows,\n textFilters,\n timeRangeColumn,\n timeRangeFilter.from,\n timeRangeFilter.to,\n ]);\n\n const sortResolvers = useMemo(\n () =>\n Object.fromEntries(\n effectiveColumns.map((column) => [\n column.key,\n (record: InternalRow<T>) => getSortValue(record.row, column),\n ]),\n ) as Record<string, (record: InternalRow<T>) => unknown>,\n [effectiveColumns],\n );\n\n const { renderLink } = useRouter();\n\n const { sorted, sort, toggle } = useSort(filteredRows, {\n defaultDir: defaultSort?.dir ?? \"asc\",\n manual: manualSort,\n resolvers: sortResolvers,\n ...(controlledSort !== undefined ? { sort: controlledSort } : {}),\n ...(onSortChange ? { onSortChange } : {}),\n ...(defaultSort?.key ? { defaultKey: defaultSort.key } : {}),\n });\n\n // Client-side incremental reveal: when `clientReveal` is set (and the caller\n // is not doing server pagination), only the first `visibleCount` sorted rows\n // are rendered; a trailing sentinel grows the window as it scrolls into view.\n const revealEnabled = !!clientReveal && !pagination;\n const revealBatchSize = clientReveal?.batchSize ?? 0;\n const [visibleCount, setVisibleCount] = useState(revealBatchSize);\n const revealObserver = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n // Reset the window whenever the filtered/sorted set or batch size changes\n // so a new query starts from the top rather than mid-scroll.\n if (revealEnabled) setVisibleCount(revealBatchSize);\n }, [revealEnabled, revealBatchSize, sorted]);\n\n const visibleSorted = revealEnabled ? sorted.slice(0, visibleCount) : sorted;\n const hasMoreRows = revealEnabled && visibleCount < sorted.length;\n const selectedRowIDs = useMemo(\n () => new Set(rowSelection?.selectedRowIds ?? []),\n [rowSelection?.selectedRowIds],\n );\n const selectableVisibleRows = useMemo(\n () =>\n visibleSorted.filter(\n (record) => rowSelection?.isRowSelectable?.(record.row) ?? true,\n ),\n [rowSelection, visibleSorted],\n );\n const selectedVisibleCount = selectableVisibleRows.filter((record) =>\n selectedRowIDs.has(record.id),\n ).length;\n const allVisibleSelected =\n selectableVisibleRows.length > 0 &&\n selectedVisibleCount === selectableVisibleRows.length;\n const someVisibleSelected = selectedVisibleCount > 0 && !allVisibleSelected;\n const selectAllRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (selectAllRef.current) {\n selectAllRef.current.indeterminate = someVisibleSelected;\n }\n }, [someVisibleSelected]);\n\n const notifySelection = useCallback(\n (nextIDs: Set<string>) => {\n if (!rowSelection) return;\n rowSelection.onSelectionChange(\n Array.from(nextIDs),\n rows\n .filter((record) => nextIDs.has(record.id))\n .map((record) => record.row),\n );\n },\n [rowSelection, rows],\n );\n\n const toggleRowSelection = useCallback(\n (record: InternalRow<T>) => {\n if (!rowSelection) return;\n if (rowSelection.isRowSelectable?.(record.row) === false) return;\n const next = new Set(selectedRowIDs);\n if (next.has(record.id)) next.delete(record.id);\n else next.add(record.id);\n notifySelection(next);\n },\n [notifySelection, rowSelection, selectedRowIDs],\n );\n\n const toggleVisibleSelection = useCallback(() => {\n if (!rowSelection) return;\n const next = new Set(selectedRowIDs);\n if (allVisibleSelected) {\n for (const record of selectableVisibleRows) next.delete(record.id);\n } else {\n for (const record of selectableVisibleRows) next.add(record.id);\n }\n notifySelection(next);\n }, [\n allVisibleSelected,\n notifySelection,\n rowSelection,\n selectableVisibleRows,\n selectedRowIDs,\n ]);\n\n const selectionBar = useMemo(() => {\n if (!rowSelection || !selectionActions) return null;\n const selected = rows.filter((record) => selectedRowIDs.has(record.id));\n if (selected.length === 0) return null;\n return selectionActions({\n selectedRowIds: selected.map((record) => record.id),\n selectedRows: selected.map((record) => record.row),\n clearSelection: () => notifySelection(new Set()),\n });\n }, [notifySelection, rowSelection, rows, selectedRowIDs, selectionActions]);\n\n const renderedFooter =\n error != null\n ? null\n : footer !== undefined\n ? typeof footer === \"function\"\n ? footer({\n visibleRowCount: sorted.length,\n totalRowCount: data.length,\n loading,\n })\n : footer\n : pagination\n ? null\n : loading\n ? loadingMessage\n : `${sorted.length} of ${data.length} row${data.length === 1 ? \"\" : \"s\"}`;\n\n const [collapsedGroups, setCollapsedGroups] = useState<\n Record<string, boolean>\n >({});\n const groups = useMemo(() => {\n if (!grouping) return null;\n const buckets = groupRecords(visibleSorted, (record) =>\n grouping.getGroupKey(record.row),\n );\n const resolved = buckets.map((bucket) => ({\n key: bucket.key,\n records: bucket.rows,\n rows: bucket.rows.map((record) => record.row),\n }));\n if (grouping.compareGroups) {\n resolved.sort((a, b) => grouping.compareGroups!(a, b));\n }\n return resolved.map((group) => ({\n ...group,\n label: grouping.getGroupLabel?.(group.key, group.rows) ?? group.key,\n meta: grouping.getGroupMeta?.(group.key, group.rows),\n collapsed:\n collapsedGroups[group.key] ??\n isGroupCollapsedByDefault(group, grouping.defaultCollapsed),\n }));\n }, [collapsedGroups, grouping, visibleSorted]);\n\n // Group headers and data rows share one flat stream so the <tbody> keeps a\n // single row renderer whether or not grouping is on.\n const rowStream = useMemo<Array<RowStreamItem<T>>>(() => {\n if (!groups) {\n return visibleSorted.map((record) => ({ kind: \"row\", record }) as const);\n }\n return groups.flatMap((group) => [\n { kind: \"group\", group } as const,\n ...(group.collapsed\n ? []\n : group.records.map((record) => ({ kind: \"row\", record }) as const)),\n ]);\n }, [groups, visibleSorted]);\n\n const toggleGroupSelection = useCallback(\n (records: InternalRow<T>[]) => {\n if (!rowSelection) return;\n const selectable = records.filter(\n (record) => rowSelection.isRowSelectable?.(record.row) ?? true,\n );\n const next = new Set(selectedRowIDs);\n const allSelected =\n selectable.length > 0 &&\n selectable.every((record) => next.has(record.id));\n for (const record of selectable) {\n if (allSelected) next.delete(record.id);\n else next.add(record.id);\n }\n notifySelection(next);\n },\n [notifySelection, rowSelection, selectedRowIDs],\n );\n\n const revealSentinelRef = useCallback(\n (node: HTMLTableRowElement | null) => {\n if (revealObserver.current) revealObserver.current.disconnect();\n if (!node || !hasMoreRows) return;\n revealObserver.current = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n setVisibleCount((current) =>\n Math.min(current + revealBatchSize, sorted.length),\n );\n }\n },\n { rootMargin: \"200px\" },\n );\n revealObserver.current.observe(node);\n },\n [hasMoreRows, revealBatchSize, sorted.length],\n );\n\n const startColumnResize = (\n event: ReactMouseEvent<HTMLElement>,\n column: DataTableColumn<T>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n const startX = event.clientX;\n const header = event.currentTarget.closest(\"th\");\n const measuredWidth = header?.getBoundingClientRect().width ?? 0;\n const startWidth =\n measuredWidth || columnWidths[column.key] || defaultColumnWidth(column);\n\n const onMove = (moveEvent: MouseEvent) => {\n const nextWidth = clampColumnWidth(\n column,\n startWidth + moveEvent.clientX - startX,\n );\n setColumnWidths((current) => ({\n ...current,\n [column.key]: nextWidth,\n }));\n };\n\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n };\n\n const autoFitColumn = (\n event: ReactMouseEvent<HTMLElement>,\n column: DataTableColumn<T>,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n\n const header = event.currentTarget.closest(\"th\");\n const table = event.currentTarget.closest(\"table\");\n if (!header || !table) return;\n\n const columnIndex = Array.from(\n header.parentElement?.children ?? [],\n ).indexOf(header);\n if (columnIndex < 0) return;\n\n const width = measureColumnContentWidth(table, columnIndex, column);\n setColumnWidths((current) => ({\n ...current,\n [column.key]: width,\n }));\n };\n\n const toggleColumnVisibility = (column: DataTableColumn<T>) => {\n if (!isColumnHideable(column)) return;\n\n setHiddenColumns((current) => {\n const hidden = current[column.key] === true;\n if (!hidden && visibleHideableColumnCount <= 1) return current;\n\n const next = { ...current };\n if (hidden) {\n delete next[column.key];\n } else {\n next[column.key] = true;\n }\n\n return pruneHiddenColumns(next, columns);\n });\n };\n\n const showAllColumns = () => setHiddenColumns({});\n\n const openHeaderColumnMenu = (\n event: ReactMouseEvent<HTMLTableCellElement>,\n column: DataTableColumn<T>,\n ) => {\n if (!showColumnVisibilityControl) return;\n event.preventDefault();\n setColumnMenu(menuStateFromPointer(event, column.key));\n };\n\n const openHeaderFilterMenu = (\n event: ReactMouseEvent<HTMLElement>,\n columnKey: string,\n ) => {\n event.preventDefault();\n event.stopPropagation();\n setHeaderFilterMenu(menuStateFromTrigger(event, columnKey));\n };\n\n return (\n <DensityValueProvider density={densityOverride ?? \"comfortable\"}>\n <div\n className={cn(\"flex min-h-0 min-w-0 flex-1 flex-col gap-1\", className)}\n data-density={densityOverride}\n >\n {showFilterBar && (\n <FilterBar\n {...filterBarProps}\n {...(externalSearch\n ? { search: externalSearch }\n : autoFilter && showGlobalFilter\n ? {\n search: {\n value: effectiveGlobalFilter,\n onChange: setEffectiveGlobalFilter,\n placeholder: globalFilterPlaceholder,\n },\n }\n : {})}\n {...(externalTimeRange\n ? { timeRange: externalTimeRange }\n : autoTimeRange\n ? { timeRange: autoTimeRange }\n : {})}\n trailing={filterBarTrailing}\n filters={\n externalFilters && externalFilters.length > 0\n ? [...externalFilters, ...nativeFilters]\n : nativeFilters\n }\n />\n )}\n\n <div className=\"relative flex min-h-0 max-w-full flex-1 flex-col\">\n {loading && error == null ? (\n <LoadingBar data-testid=\"data-table-loading-bar\" className=\"rounded-t-md\" />\n ) : null}\n <div\n className={cn(\n \"min-h-0 max-w-full flex-1 overflow-auto overscroll-x-contain rounded-md border border-border\",\n scrollContainerClassName,\n )}\n aria-busy={(loading && error == null) || undefined}\n >\n <table className=\"w-max min-w-full table-auto text-left text-sm\">\n <colgroup>\n {rowSelection && error == null ? <col className=\"w-10\" /> : null}\n {visibleColumns.map((column) => (\n <col\n key={column.key}\n style={columnStyle(column, columnWidths)}\n className={column.shrink && !column.grow ? \"w-px\" : undefined}\n />\n ))}\n </colgroup>\n <thead className=\"sticky top-0 z-10 bg-muted shadow-[0_1px_0_0_var(--tw-shadow-color)] shadow-border\">\n <tr className=\"border-b border-border text-xs text-muted-foreground\">\n {rowSelection && error == null ? (\n <th\n className={cn(\n \"w-10 text-center\",\n DATA_TABLE_HEADER_DENSITY_CLASS,\n )}\n >\n <input\n ref={selectAllRef}\n type=\"checkbox\"\n aria-label=\"Select all visible rows\"\n checked={allVisibleSelected}\n disabled={selectableVisibleRows.length === 0}\n onChange={toggleVisibleSelection}\n className=\"size-3.5 rounded border-border accent-primary\"\n />\n </th>\n ) : null}\n {visibleColumns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"group/header relative whitespace-nowrap font-medium\",\n DATA_TABLE_HEADER_DENSITY_CLASS,\n alignmentClass(column.align),\n resizableColumns &&\n column.resizable !== false &&\n \"select-none\",\n column.headerClassName,\n )}\n onContextMenu={(event) =>\n openHeaderColumnMenu(event, column)\n }\n >\n <div\n className={cn(\n \"flex min-w-0 items-center gap-1\",\n headerAlignmentClass(column.align),\n resizableColumns &&\n column.resizable !== false &&\n \"pr-2\",\n )}\n >\n <span className=\"min-w-0\">\n {column.sortable === false ? (\n <span>{column.label}</span>\n ) : (\n <SortableHeader\n active={sort?.key === column.key}\n {...(sort?.key === column.key\n ? { dir: sort.dir }\n : {})}\n {...(column.align ? { align: column.align } : {})}\n onClick={() => toggle(column.key)}\n >\n {column.label}\n </SortableHeader>\n )}\n </span>\n {showHeaderFilterControls &&\n (nativeFilterByColumn.has(column.key) ||\n (autoTimeRange &&\n timeRangeColumn?.key === column.key)) && (\n <HeaderFilterButton\n column={column}\n active={\n nativeFilterByColumn.has(column.key)\n ? isFilterBarFilterActive(\n nativeFilterByColumn.get(column.key)!,\n )\n : Boolean(\n timeRangeFilter.from || timeRangeFilter.to,\n )\n }\n onOpen={(event) =>\n openHeaderFilterMenu(event, column.key)\n }\n />\n )}\n </div>\n {resizableColumns && column.resizable !== false && (\n <span\n role=\"separator\"\n aria-label={`Resize ${labelText(column)} column`}\n aria-orientation=\"vertical\"\n className=\"absolute right-0 top-0 hidden h-full w-3 cursor-col-resize touch-none items-center justify-center border-r border-border/70 bg-gradient-to-l from-border/30 to-transparent transition-colors hover:border-primary hover:from-primary/20 md:flex\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onDoubleClick={(event) => autoFitColumn(event, column)}\n onMouseDown={(event) =>\n startColumnResize(event, column)\n }\n >\n <span\n aria-hidden\n className=\"h-4 w-0.5 rounded-full bg-border transition-colors group-hover/header:bg-primary/70\"\n />\n </span>\n )}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {error != null ? (\n <DataTableErrorRow\n colSpan={visibleColumns.length}\n error={error}\n />\n ) : loading && visibleSorted.length === 0 ? (\n <DataTableLoadingRows\n columns={visibleColumns}\n rowCount={loadingRowCount}\n message={loadingMessage}\n selection={!!rowSelection}\n />\n ) : (\n rowStream.map((item) => {\n if (item.kind === \"group\") {\n return (\n <DataTableGroupHeaderRow\n key={`group:${item.group.key}`}\n label={item.group.label}\n meta={item.group.meta}\n count={item.group.records.length}\n colSpan={visibleColumns.length + (rowSelection ? 1 : 0)}\n collapsed={item.group.collapsed}\n onToggleCollapsed={() =>\n setCollapsedGroups((current) => ({\n ...current,\n [item.group.key]: !item.group.collapsed,\n }))\n }\n {...(rowSelection\n ? {\n selection: {\n selectableCount: item.group.records.filter(\n (record) =>\n rowSelection.isRowSelectable?.(\n record.row,\n ) ?? true,\n ).length,\n selectedCount: item.group.records.filter(\n (record) => selectedRowIDs.has(record.id),\n ).length,\n onToggle: () =>\n toggleGroupSelection(item.group.records),\n },\n }\n : {})}\n />\n );\n }\n const record = item.record;\n const href = getRowHref?.(record.row);\n const expanded = expandedRows[record.id] ?? false;\n const expandedContent =\n renderExpandedRow?.(record.row, {\n columns: effectiveColumns,\n visibleColumns,\n filterActionsByColumn,\n }) ?? null;\n const expandable = expandedContent !== null;\n const expandsInline = expandable && detailStyle === \"row\";\n const opensDialog = expandable && detailStyle === \"dialog\";\n const rowClickEnabled =\n isRowClickable?.(record.row) ?? !!onRowClick;\n const rowSelectable =\n rowSelection?.isRowSelectable?.(record.row) ?? true;\n const selectionClickEnabled =\n !!rowSelection?.toggleOnRowClick && rowSelectable;\n const clickable =\n !!href ||\n rowClickEnabled ||\n expandable ||\n selectionClickEnabled;\n\n return (\n <Fragment key={record.id}>\n <tr\n className={cn(\n \"relative border-b border-border/60 align-top\",\n clickable && \"cursor-pointer hover:bg-accent/40\",\n selectedRowIDs.has(record.id) && \"bg-accent/50\",\n getRowClassName?.(record.row),\n )}\n onClick={() => {\n if (selectionClickEnabled) toggleRowSelection(record);\n if (expandsInline) {\n setExpandedRows((current) => ({\n ...current,\n [record.id]: !current[record.id],\n }));\n }\n if (opensDialog) {\n setDetailRow(record);\n }\n if (rowClickEnabled) {\n onRowClick?.(record.row);\n }\n }}\n >\n {rowSelection ? (\n <td\n className={cn(\n // relative z-10 keeps the checkbox above the row's\n // stretched-link overlay so it stays clickable.\n \"relative z-10 w-10 text-center\",\n DATA_TABLE_CELL_DENSITY_CLASS,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <input\n type=\"checkbox\"\n aria-label={`Select row ${record.id}`}\n checked={selectedRowIDs.has(record.id)}\n disabled={!rowSelectable}\n onChange={() => toggleRowSelection(record)}\n className=\"size-3.5 rounded border-border accent-primary\"\n />\n </td>\n ) : null}\n {visibleColumns.map((column, index) => {\n const rawValue = resolveColumnValue(\n record.row,\n column,\n );\n let content: ReactNode = column.render\n ? column.render(rawValue, record.row)\n : formatCell(rawValue);\n\n // Tag cells get the + / − filter affordance via\n // context; copy-to-clipboard works without it too.\n if (\n column.kind === \"tags\" &&\n filterActionsByColumn[column.key]\n ) {\n content = (\n <TagActionsProvider\n value={filterActionsByColumn[column.key]!}\n >\n {content}\n </TagActionsProvider>\n );\n }\n\n return (\n <td\n key={column.key}\n className={cn(\n DATA_TABLE_CELL_DENSITY_CLASS,\n alignmentClass(column.align),\n column.cellClassName,\n )}\n >\n <CellContent\n column={column}\n {...(columnWidths[column.key] !== undefined\n ? { width: columnWidths[column.key] }\n : {})}\n >\n {href && index === 0\n ? // One real <a href> per row whose ::after\n // overlay stretches across the whole (relative)\n // row: right/middle-click give native \"open in\n // new tab\", plain left-click routes client-side.\n renderLink({\n to: href,\n className:\n \"hover:underline after:absolute after:inset-0 after:content-['']\",\n children: content,\n })\n : content}\n </CellContent>\n </td>\n );\n })}\n </tr>\n {expandsInline && expanded && expandedContent && (\n <tr>\n <td\n colSpan={\n visibleColumns.length + (rowSelection ? 1 : 0)\n }\n className=\"bg-muted/40 p-density-3\"\n >\n <div className=\"rounded-md border border-border bg-background p-density-3\">\n {expandedContent}\n </div>\n </td>\n </tr>\n )}\n </Fragment>\n );\n })\n )}\n {error == null && hasMoreRows && (\n <tr ref={revealSentinelRef} aria-hidden>\n <td\n colSpan={visibleColumns.length + (rowSelection ? 1 : 0)}\n className=\"p-density-2 text-center text-xs text-muted-foreground\"\n >\n Loading more…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n {error == null && selectionBar ? (\n <div\n data-testid=\"data-table-selection-actions\"\n className=\"sticky bottom-2 z-10 flex shrink-0 items-center justify-between gap-density-3 rounded-md border border-border bg-card p-density-2 shadow-md\"\n >\n {selectionBar}\n </div>\n ) : null}\n\n {renderedFooter !== null && (\n <div className=\"shrink-0 px-1 text-xs text-muted-foreground\">\n {renderedFooter}\n </div>\n )}\n\n {error == null && pagination ? (\n <DataTablePaginationFooter\n pagination={pagination}\n visibleRowCount={sorted.length}\n loading={loading}\n loadingMessage={loadingMessage}\n />\n ) : null}\n {detailStyle === \"dialog\" && renderExpandedRow && (\n <Modal\n open={detailRow !== null}\n onClose={() => setDetailRow(null)}\n size={detailDialogSize}\n {...(detailRow\n ? {\n title:\n typeof detailDialogTitle === \"function\"\n ? detailDialogTitle(detailRow.row)\n : detailDialogTitle,\n }\n : {})}\n >\n {detailRow\n ? renderExpandedRow(detailRow.row, {\n columns: effectiveColumns,\n visibleColumns,\n filterActionsByColumn,\n })\n : null}\n </Modal>\n )}\n {columnMenu && showTablePreferencesControl && (\n <ColumnVisibilityMenu\n columns={effectiveColumns}\n hiddenColumns={hiddenColumns}\n anchor={columnMenu}\n actions={menuActions ?? []}\n showColumnVisibilityControl={showColumnVisibilityControl}\n showDensityControl={resolvedShowDensityControl}\n showThemeControl={showThemeControl}\n themeMenuValue={themeMenuValue}\n densityOverride={densityOverride}\n visibleHideableColumnCount={visibleHideableColumnCount}\n onToggle={toggleColumnVisibility}\n onShowAll={showAllColumns}\n onDensityChange={setDensityOverride}\n {...(onThemeChange ? { onThemeChange } : {})}\n onClose={() => setColumnMenu(null)}\n />\n )}\n {headerFilterMenu && (\n <HeaderFilterMenu\n filter={nativeFilterByColumn.get(headerFilterMenu.columnKey ?? \"\")}\n {...(autoTimeRange &&\n timeRangeColumn?.key === headerFilterMenu.columnKey\n ? { timeRange: autoTimeRange }\n : {})}\n anchor={headerFilterMenu}\n onClose={() => setHeaderFilterMenu(null)}\n />\n )}\n </div>\n </DensityValueProvider>\n );\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [5, 10, 25, 50, 100, 200];\n\n// DataTablePaginationFooter renders a small page-size selector and prev/next\n// controls below the table. Pure presentation: every interaction routes\n// straight to the caller-supplied callbacks so the data layer (which lives in\n// CommandOutput / OperationCommandPage) stays the source of truth for which\n// rows are visible.\nfunction DataTablePaginationFooter({\n pagination,\n visibleRowCount,\n loading,\n loadingMessage,\n}: {\n pagination: DataTablePagination;\n visibleRowCount: number;\n loading: boolean;\n loadingMessage: ReactNode;\n}) {\n const { page, pageSize, total, onPageChange, onPageSizeChange } = pagination;\n const options = Array.from(\n new Set([\n ...(pagination.pageSizeOptions ?? DEFAULT_PAGE_SIZE_OPTIONS),\n pageSize,\n ]),\n ).sort((a, b) => a - b);\n const safePage = Math.max(0, page);\n const totalPages =\n total != null && pageSize > 0\n ? Math.max(1, Math.ceil(total / pageSize))\n : undefined;\n const atFirst = safePage === 0;\n const atLast =\n totalPages != null\n ? safePage >= totalPages - 1\n : visibleRowCount < pageSize;\n const hasVisibleRows = visibleRowCount > 0;\n const rangeStart =\n total === 0 || !hasVisibleRows ? 0 : safePage * pageSize + 1;\n const rangeEnd =\n total != null && hasVisibleRows\n ? Math.min(total, rangeStart + Math.max(visibleRowCount - 1, 0))\n : visibleRowCount;\n const rangeLabel =\n total != null\n ? `${rangeStart}-${rangeEnd} of ${total}`\n : `${visibleRowCount} row${visibleRowCount === 1 ? \"\" : \"s\"}`;\n\n return (\n <div className=\"flex min-h-9 shrink-0 flex-row items-stretch gap-3 border-t border-border/70 px-1 pt-2 text-xs text-muted-foreground sm:flex-row sm:flex-wrap sm:items-center sm:justify-between\">\n <div aria-live=\"polite\">{loading ? loadingMessage : rangeLabel}</div>\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <label className=\"flex items-center gap-1.5\">\n <span>Rows per page</span>\n <select\n className=\"h-7 rounded-md border border-border bg-background px-2 text-xs text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n value={pageSize}\n onChange={(event) => onPageSizeChange(Number(event.target.value))}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </label>\n <span className=\"min-w-20 text-center\">\n Page {safePage + 1}\n {totalPages != null ? ` of ${totalPages}` : \"\"}\n </span>\n <button\n type=\"button\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Previous page\"\n title=\"Previous page\"\n disabled={atFirst}\n onClick={() => onPageChange(Math.max(0, safePage - 1))}\n >\n <Icon icon={UiArrowLeft} />\n </button>\n <button\n type=\"button\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md border border-border bg-background text-foreground hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Next page\"\n title=\"Next page\"\n disabled={atLast}\n onClick={() => onPageChange(safePage + 1)}\n >\n <Icon icon={UiArrowRight} />\n </button>\n </div>\n </div>\n );\n}\n\nfunction DataTableGroupHeaderRow({\n label,\n meta,\n count,\n colSpan,\n collapsed,\n onToggleCollapsed,\n selection,\n}: {\n label: ReactNode;\n meta: ReactNode;\n count: number;\n colSpan: number;\n collapsed: boolean;\n onToggleCollapsed: () => void;\n selection?: {\n selectableCount: number;\n selectedCount: number;\n onToggle: () => void;\n };\n}) {\n const allSelected =\n !!selection &&\n selection.selectableCount > 0 &&\n selection.selectedCount === selection.selectableCount;\n const someSelected =\n !!selection && selection.selectedCount > 0 && !allSelected;\n const checkboxRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (checkboxRef.current) checkboxRef.current.indeterminate = someSelected;\n }, [someSelected]);\n\n return (\n <tr className=\"border-b border-border/60 bg-muted/40\">\n <td colSpan={colSpan} className=\"px-density-2 py-density-1\">\n <div className=\"flex items-center gap-2\">\n {selection ? (\n <input\n ref={checkboxRef}\n type=\"checkbox\"\n aria-label={`Select group ${typeof label === \"string\" ? label : count}`}\n checked={allSelected}\n disabled={selection.selectableCount === 0}\n onChange={selection.onToggle}\n className=\"size-3.5 rounded border-border accent-primary\"\n />\n ) : null}\n <button\n type=\"button\"\n aria-expanded={!collapsed}\n onClick={onToggleCollapsed}\n className=\"flex min-w-0 flex-1 items-center gap-1.5 text-left text-xs font-semibold text-foreground hover:text-primary\"\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"shrink-0 text-muted-foreground\"\n />\n <span className=\"truncate\">{label}</span>\n <span className=\"shrink-0 font-normal text-muted-foreground\">\n {count}\n </span>\n </button>\n {meta ? (\n <div className=\"shrink-0 text-xs text-muted-foreground\">{meta}</div>\n ) : null}\n </div>\n </td>\n </tr>\n );\n}\n\nfunction DataTableLoadingRows<T extends Record<string, unknown>>({\n columns,\n rowCount,\n message,\n selection,\n}: {\n columns: DataTableColumn<T>[];\n rowCount: number;\n message: ReactNode;\n selection: boolean;\n}) {\n const safeRowCount = Math.max(1, rowCount);\n const safeColumnCount = Math.max(1, columns.length + (selection ? 1 : 0));\n\n return (\n <>\n <tr className=\"border-b border-border/60 bg-muted/20\">\n <td\n colSpan={safeColumnCount}\n className={cn(DATA_TABLE_CELL_DENSITY_CLASS, \"p-0\")}\n >\n <div className=\"h-0.5 w-full overflow-hidden bg-muted\">\n <div className=\"h-full w-1/2 animate-pulse rounded-full bg-primary/70\" />\n </div>\n <div className=\"flex items-center gap-2 px-3 py-2 text-xs text-muted-foreground\">\n <span\n aria-hidden\n className=\"h-3 w-3 animate-spin rounded-full border-2 border-primary/30 border-t-primary\"\n />\n <span>{message}</span>\n </div>\n </td>\n </tr>\n {Array.from({ length: safeRowCount }).map((_, rowIndex) => (\n <tr key={rowIndex} className=\"border-b border-border/60\">\n {selection ? (\n <td className={cn(\"w-10\", DATA_TABLE_CELL_DENSITY_CLASS)}>\n <span className=\"mx-auto block size-3.5 animate-pulse rounded bg-muted\" />\n </td>\n ) : null}\n {columns.map((column, columnIndex) => (\n <td\n key={column.key}\n className={cn(\n DATA_TABLE_CELL_DENSITY_CLASS,\n alignmentClass(column.align),\n column.cellClassName,\n )}\n >\n <CellContent column={column}>\n <span\n aria-hidden\n className={cn(\n \"block h-3 animate-pulse rounded-full bg-muted\",\n loadingSkeletonWidth(columnIndex),\n )}\n />\n </CellContent>\n </td>\n ))}\n </tr>\n ))}\n </>\n );\n}\n\nfunction DataTableErrorRow({\n colSpan,\n error,\n}: {\n colSpan: number;\n error: ReactNode;\n}) {\n return (\n <tr className=\"border-b border-border/60\">\n <td\n colSpan={Math.max(1, colSpan)}\n className={cn(DATA_TABLE_CELL_DENSITY_CLASS, \"p-density-3\")}\n >\n <div role=\"alert\">{error}</div>\n </td>\n </tr>\n );\n}\n\nfunction HeaderFilterButton<T extends Record<string, unknown>>({\n column,\n active,\n onOpen,\n}: {\n column: DataTableColumn<T>;\n active: boolean;\n onOpen: (event: ReactMouseEvent<HTMLButtonElement>) => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${labelText(column)} column filter`}\n aria-haspopup=\"dialog\"\n aria-pressed={active}\n className={cn(\n \"inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n active && \"bg-accent text-foreground\",\n )}\n onClick={onOpen}\n >\n <span\n data-filter-icon-state={active ? \"filled\" : \"outline\"}\n className=\"inline-flex\"\n >\n <Icon icon={active ? UiFilterFilled : UiFilter} className=\"text-xs\" />\n </span>\n </button>\n );\n}\n\nfunction HeaderFilterMenu({\n filter,\n timeRange,\n anchor,\n onClose,\n}: {\n filter: FilterBarFilter | undefined;\n timeRange?: FilterBarRangeProps;\n anchor: ColumnMenuState;\n onClose: () => void;\n}) {\n if (!filter && !timeRange) return null;\n\n const label = filter?.label ?? \"Time range\";\n const timeRangeActive = Boolean(timeRange?.from || timeRange?.to);\n\n return (\n <div\n role=\"dialog\"\n aria-label={`${label} column filter`}\n className=\"fixed z-50 max-h-[calc(100vh-1rem)] max-w-[calc(100vw-1rem)] overflow-auto rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-lg shadow-black/5\"\n style={{ left: anchor.x, top: anchor.y }}\n onClick={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <div className=\"truncate text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </div>\n <div className=\"flex items-center gap-1\">\n {filter && (\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => clearFilterBarFilter(filter)}\n disabled={!isFilterBarFilterActive(filter)}\n >\n Clear all\n </button>\n )}\n {timeRange && (\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-primary transition-colors hover:bg-accent focus:bg-accent focus:outline-none disabled:text-muted-foreground\"\n onClick={() => timeRange.onApply(\"\", \"\")}\n disabled={!timeRangeActive}\n >\n Clear all\n </button>\n )}\n <button\n type=\"button\"\n aria-label=\"Close column filter\"\n title=\"Close\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={onClose}\n >\n <Icon icon={UiClose} className=\"text-sm\" />\n </button>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n {filter && <FilterBarFilterPanel filter={filter} chrome=\"embedded\" />}\n {timeRange && (\n <FilterBarRangePanel kind=\"time\" label=\"Time range\" {...timeRange} />\n )}\n </div>\n </div>\n );\n}\n\nfunction ColumnVisibilityTrigger({\n onOpen,\n}: {\n onOpen: (event: ReactMouseEvent<HTMLButtonElement>) => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label=\"Open column menu\"\n aria-haspopup=\"menu\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n onClick={(event) => {\n event.stopPropagation();\n onOpen(event);\n }}\n >\n <Icon icon={UiEllipsis} className=\"text-sm\" />\n </button>\n );\n}\n\nfunction ColumnVisibilityMenu<T extends Record<string, unknown>>({\n columns,\n hiddenColumns,\n anchor,\n actions,\n showColumnVisibilityControl,\n showDensityControl,\n showThemeControl,\n themeMenuValue,\n densityOverride,\n visibleHideableColumnCount,\n onToggle,\n onShowAll,\n onDensityChange,\n onThemeChange,\n onClose,\n}: {\n columns: DataTableColumn<T>[];\n hiddenColumns: Record<string, boolean>;\n anchor: ColumnMenuState;\n actions: DataTableMenuAction[];\n showColumnVisibilityControl: boolean;\n showDensityControl: boolean;\n showThemeControl: boolean;\n themeMenuValue: Theme | undefined;\n densityOverride: Density | undefined;\n visibleHideableColumnCount: number;\n onToggle: (column: DataTableColumn<T>) => void;\n onShowAll: () => void;\n onDensityChange: (density: Density | undefined) => void;\n onThemeChange?: (theme: Theme) => void;\n onClose: () => void;\n}) {\n const activeColumn = anchor.columnKey\n ? columns.find((column) => column.key === anchor.columnKey)\n : undefined;\n const canHideActiveColumn =\n activeColumn &&\n isColumnHideable(activeColumn) &&\n visibleHideableColumnCount > 1;\n const hasActions = actions.length > 0;\n\n return (\n <div\n role=\"menu\"\n aria-label=\"Column menu\"\n className=\"fixed z-50 max-h-[calc(100vh-1rem)] min-w-[16rem] max-w-[calc(100vw-1rem)] overflow-auto rounded-md border border-border bg-popover p-1.5 text-popover-foreground shadow-lg shadow-black/5\"\n style={{ left: anchor.x, top: anchor.y }}\n onClick={(event) => event.stopPropagation()}\n onContextMenu={(event) => event.preventDefault()}\n >\n {showColumnVisibilityControl && (\n <>\n <div className=\"flex items-center justify-between gap-3 px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n <span>Columns</span>\n <button\n type=\"button\"\n className=\"rounded px-1.5 py-0.5 text-xs text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\"\n onClick={onShowAll}\n >\n Show all\n </button>\n </div>\n\n {activeColumn && (\n <>\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canHideActiveColumn}\n className={cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n !canHideActiveColumn && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => {\n if (!canHideActiveColumn) return;\n onToggle(activeColumn);\n onClose();\n }}\n >\n <Icon\n icon={UiEyeClosed}\n className=\"text-sm text-muted-foreground\"\n />\n <span>Hide {labelText(activeColumn)}</span>\n </button>\n <div className=\"my-1 h-px bg-border\" />\n </>\n )}\n\n <div className=\"max-h-72 overflow-auto\">\n {columns.map((column) => {\n const hideable = isColumnHideable(column);\n const visible = hiddenColumns[column.key] !== true;\n const disabled =\n !hideable || (visible && visibleHideableColumnCount <= 1);\n return (\n <label\n key={column.key}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors hover:bg-accent hover:text-accent-foreground\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border-border\"\n checked={visible}\n disabled={disabled}\n onChange={() => onToggle(column)}\n />\n <span className=\"truncate\">{labelText(column)}</span>\n </label>\n );\n })}\n </div>\n </>\n )}\n\n {showDensityControl && (\n <DensityMenuSection\n densityOverride={densityOverride}\n separated={showColumnVisibilityControl}\n onDensityChange={onDensityChange}\n />\n )}\n\n {hasActions && (\n <MenuActionSection\n actions={actions}\n separated={showColumnVisibilityControl || showDensityControl}\n onClose={onClose}\n />\n )}\n\n {showThemeControl && onThemeChange && (\n <ThemeMenuSection\n value={themeMenuValue ?? \"system\"}\n separated={\n showColumnVisibilityControl || showDensityControl || hasActions\n }\n onChange={onThemeChange}\n />\n )}\n </div>\n );\n}\n\n// Groups menu actions by their `section` heading, preserving the order each\n// section first appears. Actions without a section fall under \"Download\" so the\n// existing download menu is unchanged.\nfunction groupMenuActions(\n actions: DataTableMenuAction[],\n): { section: string; actions: DataTableMenuAction[] }[] {\n const groups: { section: string; actions: DataTableMenuAction[] }[] = [];\n for (const action of actions) {\n const section = action.section ?? \"Download\";\n let group = groups.find((g) => g.section === section);\n if (!group) {\n group = { section, actions: [] };\n groups.push(group);\n }\n group.actions.push(action);\n }\n return groups;\n}\n\nfunction MenuActionSection({\n actions,\n separated,\n onClose,\n}: {\n actions: DataTableMenuAction[];\n separated: boolean;\n onClose: () => void;\n}) {\n const groups = groupMenuActions(actions);\n return (\n <>\n {groups.map((group, index) => (\n <div\n key={group.section}\n className={cn(\n (separated || index > 0) && \"mt-1 border-t border-border pt-1\",\n )}\n >\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n {group.section}\n </div>\n {group.actions.map((action) => {\n const hasDescription = Boolean(action.description);\n return (\n <button\n key={action.id}\n type=\"button\"\n role=\"menuitem\"\n disabled={action.disabled}\n className={cn(\n \"flex w-full gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n hasDescription ? \"items-start\" : \"items-center\",\n action.disabled && \"cursor-not-allowed opacity-50\",\n )}\n onClick={() => {\n if (action.disabled) return;\n action.onSelect();\n onClose();\n }}\n >\n {action.icon && (\n <Icon\n icon={action.icon}\n className={cn(\n \"shrink-0 text-sm\",\n hasDescription && \"mt-0.5\",\n action.iconClassName ?? \"text-muted-foreground\",\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className={cn(hasDescription && \"font-medium\")}>\n {action.label}\n </span>\n {action.description && (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {action.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n </>\n );\n}\n\nfunction DensityMenuSection({\n densityOverride,\n separated,\n onDensityChange,\n}: {\n densityOverride: Density | undefined;\n separated: boolean;\n onDensityChange: (density: Density | undefined) => void;\n}) {\n const current = densityOverride ?? \"inherit\";\n\n return (\n <div className={cn(separated && \"mt-1 border-t border-border pt-1\")}>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n Density\n </div>\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={current === \"inherit\"}\n className={densityMenuItemClassName(current === \"inherit\")}\n onClick={() => onDensityChange(undefined)}\n >\n <Icon\n icon={UiResizeVertical}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">Use page density</span>\n {current === \"inherit\" ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n {DENSITY_OPTIONS.map((option) => {\n const active = current === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => onDensityChange(option.value)}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction densityMenuItemClassName(active: boolean) {\n return cn(\n \"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:outline-none\",\n active && \"text-foreground\",\n );\n}\n\nconst THEME_MENU_OPTIONS: Array<{\n value: Theme;\n icon: StaticIconComponent;\n label: string;\n}> = [\n { value: \"system\", icon: UiDesktop, label: \"Use system theme\" },\n { value: \"light\", icon: UiSun, label: \"Light\" },\n { value: \"dark\", icon: UiMoon, label: \"Dark\" },\n];\n\nfunction ThemeMenuSection({\n value,\n separated,\n onChange,\n}: {\n value: Theme;\n separated: boolean;\n onChange: (theme: Theme) => void;\n}) {\n return (\n <div className={cn(separated && \"mt-1 border-t border-border pt-1\")}>\n <div className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\">\n Theme\n </div>\n {THEME_MENU_OPTIONS.map((option) => {\n const active = value === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={densityMenuItemClassName(active)}\n onClick={() => onChange(option.value)}\n >\n <Icon\n icon={option.icon}\n className=\"text-sm text-muted-foreground\"\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n {active ? (\n <Icon icon={UiCheck} className=\"text-sm text-foreground\" />\n ) : (\n <span className=\"inline-block h-4 w-4\" aria-hidden />\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction CellContent<T extends Record<string, unknown>>({\n column,\n width,\n children,\n}: {\n column: DataTableColumn<T>;\n width?: number;\n children: ReactNode;\n}) {\n return (\n <div\n className={cn(\n cellContentClassName(column, width),\n alignmentClass(column.align),\n )}\n style={cellContentStyle(width)}\n >\n {children}\n </div>\n );\n}\n\nfunction getSortValue<T extends Record<string, unknown>>(\n row: T,\n column: DataTableColumn<T>,\n) {\n const rawValue = resolveColumnValue(row, column);\n return column.sortValue ? column.sortValue(rawValue, row) : rawValue;\n}\n\nfunction getFilterNumbers<T extends Record<string, unknown>>(\n row: T,\n column: DataTableColumn<T>,\n) {\n return normalizeNumbers(getFilterCandidate(row, column));\n}\n\nfunction normalizeNumbers(value: FilterValue | unknown): number[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => normalizeNumbers(item));\n }\n\n const parsed = parseNumberInput(value);\n return parsed == null ? [] : [parsed];\n}\n\nfunction updateFilterValue(\n state: Record<string, string>,\n key: string,\n nextValue: string,\n) {\n const next = { ...state };\n\n if (nextValue.trim()) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction updateFilterRecord(\n state: Record<string, Record<string, FilterBarMultiFilterMode>>,\n key: string,\n nextValue: Record<string, FilterBarMultiFilterMode>,\n) {\n const next = { ...state };\n\n if (Object.keys(nextValue).length > 0) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction updateNumberFilterValue(\n state: Record<string, FilterBarNumberValue>,\n key: string,\n nextValue: FilterBarNumberValue,\n) {\n const next = { ...state };\n const hasMin = String(nextValue.min ?? \"\").trim() !== \"\";\n const hasMax = String(nextValue.max ?? \"\").trim() !== \"\";\n\n if (hasMin || hasMax) {\n next[key] = nextValue;\n } else {\n delete next[key];\n }\n\n return next;\n}\n\nfunction pruneTextFilterState(\n state: Record<string, string>,\n filters: GeneratedFilter<any>[],\n) {\n return pruneFilterState(\n state,\n filters,\n \"text\",\n (value) => !String(value ?? \"\").trim(),\n );\n}\n\nfunction pruneMultiFilterState(\n state: Record<string, Record<string, FilterBarMultiFilterMode>>,\n filters: GeneratedFilter<any>[],\n) {\n // multi and nested-multi share the same state slot; allow either kind to\n // keep the entry alive.\n const allowed = new Set(\n filters\n .filter(\n (filter) => filter.kind === \"multi\" || filter.kind === \"nested-multi\",\n )\n .map((filter) => filter.column.key),\n );\n return Object.fromEntries(\n Object.entries(state).filter(\n ([key, value]) => allowed.has(key) && Object.keys(value).length > 0,\n ),\n );\n}\n\nfunction pruneNumberFilterState(\n state: Record<string, FilterBarNumberValue>,\n filters: GeneratedFilter<any>[],\n) {\n return pruneFilterState(\n state,\n filters,\n \"number\",\n (value) =>\n !String(value.min ?? \"\").trim() && !String(value.max ?? \"\").trim(),\n );\n}\n\nfunction pruneFilterState<T>(\n state: Record<string, T>,\n filters: GeneratedFilter<any>[],\n kind: GeneratedFilter<any>[\"kind\"],\n isEmpty: (value: T) => boolean,\n) {\n const allowed = new Set(\n filters\n .filter((filter) => filter.kind === kind)\n .map((filter) => filter.column.key),\n );\n return Object.fromEntries(\n Object.entries(state).filter(\n ([key, value]) => allowed.has(key) && !isEmpty(value),\n ),\n ) as Record<string, T>;\n}\n\nfunction formatCell(value: unknown): ReactNode {\n if (value == null || value === \"\") {\n return <span className=\"text-muted-foreground\">—</span>;\n }\n if (typeof value === \"boolean\") return value ? \"True\" : \"False\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n}\n\n// Groups flat key=value tokens by key for the nested-multi tag filter.\n// Tokens without a separator land in a synthetic \"\" group rendered as\n// \"Other\" by the filter UI.\nfunction groupTagOptions(\n options: MultiSelectOption[],\n separator: string,\n): Array<{ groupKey: string; label?: string; options: MultiSelectOption[] }> {\n const byKey = new Map<string, MultiSelectOption[]>();\n for (const option of options) {\n const { key } = splitTagToken(option.value, separator);\n const list = byKey.get(key) ?? [];\n list.push(option);\n byKey.set(key, list);\n }\n return Array.from(byKey.entries())\n .sort(([a], [b]) => {\n // Bare-tag bucket sinks to the bottom; otherwise alphabetical.\n if (a === \"\" && b !== \"\") return 1;\n if (b === \"\" && a !== \"\") return -1;\n return a.localeCompare(b);\n })\n .map(([groupKey, groupOptions]) => ({\n groupKey,\n label: groupKey === \"\" ? \"Other\" : groupKey,\n options: groupOptions,\n }));\n}\n\nfunction applyKindDefaults<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n timestampFormat: TimestampFormat | undefined,\n): DataTableColumn<T> {\n if (!column.kind) return column;\n\n if (column.kind === \"timestamp\") {\n const format = timestampFormat ?? \"iso\";\n return {\n ...column,\n render:\n column.render ??\n ((value) => (\n <Timestamp\n value={value}\n format={format}\n showTitleOnHover={column.timestamp?.alwaysShowFullOnHover !== false}\n />\n )),\n sortValue:\n column.sortValue ??\n ((value) => parseTimestamp(value)?.getTime() ?? null),\n filterValue:\n column.filterValue ??\n ((value) => {\n const parsed = parseTimestamp(value);\n return parsed ? parsed.toISOString() : \"\";\n }),\n };\n }\n\n if (column.kind === \"tags\") {\n const opts = column.tags;\n const separator = opts?.separator ?? \"=\";\n return {\n ...column,\n render:\n column.render ??\n ((value) => (\n <TagList\n tags={normalizeTags(value as TagsValue, separator)}\n maxVisible={opts?.maxVisible ?? 3}\n />\n )),\n filterValue:\n column.filterValue ??\n ((value) => tagFilterTokens(value as TagsValue, separator)),\n sortValue:\n column.sortValue ??\n ((value) => tagFilterTokens(value as TagsValue, separator).length),\n };\n }\n\n if (column.kind === \"status\") {\n const opts = column.status;\n const map = opts?.map ?? ((raw) => normalizeStatus(raw));\n return {\n ...column,\n render:\n column.render ??\n ((value, row) => {\n const status = map(value, row);\n if (!status) return <span className=\"text-muted-foreground\">—</span>;\n const label = opts?.showLabel\n ? typeof value === \"string\"\n ? value\n : status\n : undefined;\n const title =\n opts?.title?.(value, row) ??\n (typeof value === \"string\" ? value : undefined);\n return (\n <StatusDot\n status={status}\n {...(label ? { label } : {})}\n {...(title ? { title } : {})}\n />\n );\n }),\n filterValue:\n column.filterValue ??\n ((value, row) => {\n const status = map(value, row);\n return status ?? \"\";\n }),\n sortValue: column.sortValue ?? ((value, row) => map(value, row) ?? \"\"),\n };\n }\n\n return column;\n}\n\nfunction labelText<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n if (typeof column.label === \"string\") return column.label;\n return prettifyKey(column.key.split(\".\").at(-1) ?? column.key);\n}\n\nfunction isColumnHideable<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n return column.hideable !== false;\n}\n\nfunction menuStateFromPointer(\n event: ReactMouseEvent<HTMLElement>,\n columnKey?: string,\n): ColumnMenuState {\n const padding = 8;\n const width = 256;\n const height = 320;\n const viewportWidth =\n typeof window === \"undefined\" ? event.clientX + width : window.innerWidth;\n const viewportHeight =\n typeof window === \"undefined\" ? event.clientY + height : window.innerHeight;\n\n const position = {\n x: Math.max(\n padding,\n Math.min(event.clientX, viewportWidth - width - padding),\n ),\n y: Math.max(\n padding,\n Math.min(event.clientY, viewportHeight - height - padding),\n ),\n };\n return columnKey ? { ...position, columnKey } : position;\n}\n\nfunction menuStateFromTrigger(\n event: ReactMouseEvent<HTMLElement>,\n columnKey?: string,\n): ColumnMenuState {\n const rect = event.currentTarget.getBoundingClientRect();\n const padding = 8;\n const width = 256;\n const height = 320;\n const viewportWidth =\n typeof window === \"undefined\" ? rect.right + width : window.innerWidth;\n const viewportHeight =\n typeof window === \"undefined\" ? rect.bottom + height : window.innerHeight;\n\n const position = {\n x: Math.max(\n padding,\n Math.min(rect.right - width, viewportWidth - width - padding),\n ),\n y: Math.max(\n padding,\n Math.min(rect.bottom + 6, viewportHeight - height - padding),\n ),\n };\n return columnKey ? { ...position, columnKey } : position;\n}\n\nfunction columnStyle<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n widths: Record<string, number>,\n): CSSProperties | undefined {\n const width = widths[column.key];\n return width ? { width: `${width}px` } : undefined;\n}\n\nfunction measureColumnContentWidth<T extends Record<string, unknown>>(\n table: HTMLTableElement,\n columnIndex: number,\n column: DataTableColumn<T>,\n) {\n const cells = Array.from(table.querySelectorAll(\"th, td\")).filter(\n (cell): cell is HTMLTableCellElement =>\n cell instanceof HTMLTableCellElement &&\n cell.cellIndex === columnIndex &&\n cell.colSpan === 1,\n );\n\n const measured = cells.reduce((current, cell) => {\n const horizontalPadding = getHorizontalPadding(cell);\n const contentWidths = Array.from(cell.children).map((child) =>\n child instanceof HTMLElement ? child.scrollWidth + horizontalPadding : 0,\n );\n return Math.max(current, cell.scrollWidth, ...contentWidths);\n }, 0);\n\n return clampColumnWidth(column, measured || defaultColumnWidth(column));\n}\n\nfunction getHorizontalPadding(element: HTMLElement) {\n if (typeof window === \"undefined\") return 0;\n const styles = window.getComputedStyle(element);\n return (\n parseCssPixelValue(styles.paddingLeft) +\n parseCssPixelValue(styles.paddingRight)\n );\n}\n\nfunction parseCssPixelValue(value: string) {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction readStoredColumnWidths<T extends Record<string, unknown>>(\n storageKey: string,\n columns: DataTableColumn<T>[],\n): Record<string, number> {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n return {};\n\n return pruneColumnWidths(parsed as Record<string, unknown>, columns);\n } catch {\n return {};\n }\n}\n\nfunction writeStoredColumnWidths(\n storageKey: string,\n widths: Record<string, number>,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (Object.keys(widths).length === 0) {\n window.localStorage.removeItem(storageKey);\n } else {\n window.localStorage.setItem(storageKey, JSON.stringify(widths));\n }\n } catch {}\n}\n\nfunction readStoredHiddenColumns<T extends Record<string, unknown>>(\n storageKey: string,\n columns: DataTableColumn<T>[],\n): Record<string, boolean> {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n return {};\n\n return pruneHiddenColumns(parsed as Record<string, unknown>, columns);\n } catch {\n return {};\n }\n}\n\nfunction writeStoredHiddenColumns(\n storageKey: string,\n hiddenColumns: Record<string, boolean>,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (Object.keys(hiddenColumns).length === 0) {\n window.localStorage.removeItem(storageKey);\n } else {\n window.localStorage.setItem(storageKey, JSON.stringify(hiddenColumns));\n }\n } catch {}\n}\n\nfunction readStoredDensityOverride(storageKey: string): Density | undefined {\n if (typeof window === \"undefined\") return undefined;\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n return isDensity(raw) ? raw : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredDensityOverride(\n storageKey: string,\n density: Density | undefined,\n) {\n if (typeof window === \"undefined\") return;\n\n try {\n if (density) {\n window.localStorage.setItem(storageKey, density);\n } else {\n window.localStorage.removeItem(storageKey);\n }\n } catch {}\n}\n\nfunction isDensity(value: unknown): value is Density {\n return value === \"compact\" || value === \"comfortable\" || value === \"spacious\";\n}\n\nfunction pruneColumnWidths<T extends Record<string, unknown>>(\n widths: Record<string, unknown>,\n columns: DataTableColumn<T>[],\n): Record<string, number> {\n const byKey = new Map(columns.map((column) => [column.key, column]));\n const next: Record<string, number> = {};\n\n for (const [key, width] of Object.entries(widths)) {\n const column = byKey.get(key);\n if (!column || typeof width !== \"number\" || !Number.isFinite(width))\n continue;\n\n next[key] = clampColumnWidth(column, width);\n }\n\n return next;\n}\n\nfunction pruneHiddenColumns<T extends Record<string, unknown>>(\n hiddenColumns: Record<string, unknown>,\n columns: DataTableColumn<T>[],\n): Record<string, boolean> {\n const byKey = new Map(columns.map((column) => [column.key, column]));\n const next: Record<string, boolean> = {};\n\n for (const [key, hidden] of Object.entries(hiddenColumns)) {\n const column = byKey.get(key);\n if (!column || hidden !== true || !isColumnHideable(column)) continue;\n\n next[key] = true;\n }\n\n const hideable = columns.filter(isColumnHideable);\n const visibleHideableCount = hideable.filter(\n (column) => next[column.key] !== true,\n ).length;\n if (hideable.length > 0 && visibleHideableCount === 0) {\n delete next[hideable[0]!.key];\n }\n\n return next;\n}\n\nfunction sameColumnWidths(\n left: Record<string, number>,\n right: Record<string, number>,\n) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n left[key] === right[key],\n )\n );\n}\n\nfunction sameHiddenColumns(\n left: Record<string, boolean>,\n right: Record<string, boolean>,\n) {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n return (\n leftKeys.length === rightKeys.length &&\n leftKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(right, key) &&\n left[key] === right[key],\n )\n );\n}\n\nfunction defaultColumnWidth<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n) {\n if (column.grow) return DEFAULT_GROW_COLUMN_WIDTH;\n if (column.shrink) return DEFAULT_SHRINK_COLUMN_WIDTH;\n return DEFAULT_COLUMN_WIDTH;\n}\n\nfunction clampColumnWidth<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n width: number,\n) {\n const minWidth = column.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n const maxWidth = column.maxWidth;\n const minimum = Number.isFinite(minWidth)\n ? Math.max(1, minWidth)\n : DEFAULT_COLUMN_MIN_WIDTH;\n const maximum =\n maxWidth != null && Number.isFinite(maxWidth)\n ? Math.max(minimum, maxWidth)\n : Infinity;\n\n return Math.round(Math.max(minimum, Math.min(maximum, width)));\n}\n\nfunction getNumericFilterBounds<T extends Record<string, unknown>>(\n rows: InternalRow<T>[],\n column: DataTableColumn<T>,\n) {\n const values = rows.flatMap((record) =>\n collectFilterValues(getFilterCandidate(record.row, column)),\n );\n const populated = values.filter(hasFilterValue);\n const numericValues = populated\n .map((value) => parseNumberInput(value))\n .filter((value) => value != null);\n\n if (populated.length === 0 || numericValues.length !== populated.length) {\n return null;\n }\n\n return {\n min: Math.min(...numericValues),\n max: Math.max(...numericValues),\n step: inferNumericStep(numericValues),\n };\n}\n\nfunction collectFilterValues(value: unknown): unknown[] {\n if (Array.isArray(value)) {\n return value.flatMap((item) => collectFilterValues(item));\n }\n\n return [value];\n}\n\nfunction hasFilterValue(value: unknown) {\n return value != null && !(typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction parseNumberInput(value: unknown): number | null {\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : null;\n }\n\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction inferNumericStep(values: number[]) {\n if (values.every(Number.isInteger)) {\n return 1;\n }\n\n const maxFractionDigits = values.reduce((current, value) => {\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.max(current, fraction.length);\n }, 0);\n\n return 10 ** -Math.min(maxFractionDigits || 2, 6);\n}\n\nfunction alignmentClass(align?: DataTableColumn[\"align\"]) {\n if (align === \"right\") return \"text-right\";\n if (align === \"center\") return \"text-center\";\n return \"text-left\";\n}\n\nfunction headerAlignmentClass(align?: DataTableColumn[\"align\"]) {\n if (align === \"right\") return \"justify-end\";\n if (align === \"center\") return \"justify-center\";\n return \"justify-start\";\n}\n\nfunction loadingSkeletonWidth(index: number) {\n return [\"w-24\", \"w-40\", \"w-28\", \"w-56\", \"w-32\", \"w-48\"][index % 6];\n}\n\nfunction cellContentStyle(\n width: number | undefined,\n): CSSProperties | undefined {\n return width ? { maxWidth: `${width}px` } : undefined;\n}\n\nfunction cellContentClassName<T extends Record<string, unknown>>(\n column: DataTableColumn<T>,\n width?: number,\n): TdHTMLAttributes<HTMLTableCellElement>[\"className\"] {\n const resized = width !== undefined;\n const base = \"w-full truncate\";\n if (column.grow)\n return cn(base, resized ? \"min-w-0\" : \"min-w-56 max-w-[36rem]\");\n if (column.shrink)\n return cn(base, \"min-w-0 whitespace-nowrap\", !resized && \"max-w-[16rem]\");\n return cn(base, \"min-w-0\", !resized && \"max-w-[18rem]\");\n}\n\nexport function DataTable<T extends Record<string, unknown>>({\n theme: themeProp = \"system\",\n onThemeChange,\n showThemeControl = false,\n showFullscreenControl = false,\n fullscreenTitle = \"Table\",\n fullscreenButtonLabel = \"Open table full screen\",\n className,\n filterBarProps,\n ...inner\n}: DataTableProps<T>) {\n const themeControlled = onThemeChange !== undefined;\n const [internalTheme, setInternalTheme] = useState<Theme>(themeProp);\n const themeValue = themeControlled ? themeProp : internalTheme;\n const resolvedTheme = useResolvedTheme(themeValue);\n const handleThemeChange = (next: Theme) => {\n if (!themeControlled) setInternalTheme(next);\n onThemeChange?.(next);\n };\n const [fullscreenOpen, setFullscreenOpen] = useState(false);\n\n const renderTable = ({ inFullscreen }: { inFullscreen: boolean }) => {\n const showFullscreenButton = showFullscreenControl && !inFullscreen;\n const callerTrailing = filterBarProps?.trailing;\n const mergedFilterBarProps = showFullscreenButton\n ? {\n ...filterBarProps,\n trailing: (\n <>\n {callerTrailing}\n <FullscreenButton\n label={fullscreenButtonLabel}\n onClick={() => setFullscreenOpen(true)}\n />\n </>\n ),\n }\n : filterBarProps;\n return (\n <DataTableInner\n {...(inner as DataTableInnerProps<T>)}\n {...(mergedFilterBarProps\n ? { filterBarProps: mergedFilterBarProps }\n : {})}\n themeMenuValue={themeValue}\n showThemeControl={showThemeControl}\n onThemeChange={handleThemeChange}\n />\n );\n };\n\n return (\n <div\n data-theme={resolvedTheme}\n className={cn(\"flex min-h-0 flex-col text-foreground\", className)}\n >\n {renderTable({ inFullscreen: false })}\n {showFullscreenControl && (\n <Modal\n open={fullscreenOpen}\n onClose={() => setFullscreenOpen(false)}\n title={fullscreenTitle}\n size=\"full\"\n className=\"h-[95vh]\"\n >\n <div\n data-theme={resolvedTheme}\n className=\"flex h-full min-h-0 flex-col bg-background text-foreground\"\n >\n {renderTable({ inFullscreen: true })}\n </div>\n </Modal>\n )}\n </div>\n );\n}\n\nfunction FullscreenButton({\n label,\n onClick,\n}: {\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-input bg-background text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n onClick={onClick}\n >\n <Icon icon={UiFullscreen} className=\"text-sm\" />\n </button>\n );\n}\n"],"names":["UiRows","UiListFlat","UiListDashes","loading","useMemo","useState","_a","useEffect","useCallback","useEscapeLayer","resolveColumnValue","parseTimestamp","chooseTimestampFormat","modeToFormat","getFilterTokens","groups","tagActionsFromRecord","jsxs","Fragment","jsx","resolveDateMath","resolvePath","useRouter","useSort","useRef","groupRecords","isGroupCollapsedByDefault","DensityValueProvider","cn","FilterBar","LoadingBar","SortableHeader","isFilterBarFilterActive","record","TagActionsProvider","Modal","Icon","UiArrowLeft","UiArrowRight","UiChevronRight","UiChevronDown","UiFilterFilled","UiFilter","clearFilterBarFilter","UiClose","FilterBarFilterPanel","FilterBarRangePanel","UiEllipsis","UiEyeClosed","UiResizeVertical","UiCheck","UiDesktop","UiSun","UiMoon","getFilterCandidate","splitTagToken","timestampFormat","Timestamp","TagList","normalizeTags","tagFilterTokens","normalizeStatus","StatusDot","prettifyKey","useResolvedTheme","UiFullscreen"],"mappings":"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"}
|