@flanksource/clicky-ui 0.3.55 → 0.3.56
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 +6 -0
- package/dist/ai.cjs +6 -0
- package/dist/ai.js +3 -1
- package/dist/chat.cjs +2 -0
- package/dist/chat.d.ts +1 -0
- package/dist/chat.d.ts.map +1 -1
- package/dist/chat.js +2 -1
- package/dist/comments/CommentCard.cjs +37 -7
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts +11 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +37 -7
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentCardParts.cjs +9 -4
- package/dist/comments/CommentCardParts.cjs.map +1 -1
- package/dist/comments/CommentCardParts.d.ts.map +1 -1
- package/dist/comments/CommentCardParts.js +9 -4
- package/dist/comments/CommentCardParts.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +8 -8
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +8 -8
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +5 -1
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +5 -1
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +17 -11
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +6 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +17 -11
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +4 -1
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +4 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +4 -1
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +6 -3
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +7 -2
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +6 -3
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/comments/MentionTextarea.cjs +1 -1
- package/dist/comments/MentionTextarea.cjs.map +1 -1
- package/dist/comments/MentionTextarea.d.ts.map +1 -1
- package/dist/comments/MentionTextarea.js +1 -1
- package/dist/comments/MentionTextarea.js.map +1 -1
- package/dist/comments/comment-assign.cjs +68 -0
- package/dist/comments/comment-assign.cjs.map +1 -0
- package/dist/comments/comment-assign.d.ts +31 -0
- package/dist/comments/comment-assign.d.ts.map +1 -0
- package/dist/comments/comment-assign.js +67 -0
- package/dist/comments/comment-assign.js.map +1 -0
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +39 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/comments/comment-utils.cjs +2 -0
- package/dist/comments/comment-utils.cjs.map +1 -1
- package/dist/comments/comment-utils.d.ts +2 -0
- package/dist/comments/comment-utils.d.ts.map +1 -1
- package/dist/comments/comment-utils.js +2 -0
- package/dist/comments/comment-utils.js.map +1 -1
- package/dist/comments.cjs +3 -0
- package/dist/comments.d.ts +1 -0
- package/dist/comments.d.ts.map +1 -1
- package/dist/comments.js +2 -1
- package/dist/components/ComboboxMenu.cjs +23 -13
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +23 -13
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/FilterBar.cjs +29 -6
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +3 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +29 -6
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/ItemActions.cjs +1 -1
- package/dist/components/ItemActions.cjs.map +1 -1
- package/dist/components/ItemActions.js +1 -1
- package/dist/components/ItemActions.js.map +1 -1
- package/dist/components/ListMenu.cjs +33 -3
- package/dist/components/ListMenu.cjs.map +1 -1
- package/dist/components/ListMenu.d.ts +4 -1
- package/dist/components/ListMenu.d.ts.map +1 -1
- package/dist/components/ListMenu.js +33 -3
- package/dist/components/ListMenu.js.map +1 -1
- package/dist/components/ListMenuItems.cjs +80 -0
- package/dist/components/ListMenuItems.cjs.map +1 -0
- package/dist/components/ListMenuItems.d.ts +8 -0
- package/dist/components/ListMenuItems.d.ts.map +1 -0
- package/dist/components/ListMenuItems.js +80 -0
- package/dist/components/ListMenuItems.js.map +1 -0
- package/dist/components/LocalPathPicker.cjs +182 -0
- package/dist/components/LocalPathPicker.cjs.map +1 -0
- package/dist/components/LocalPathPicker.d.ts +11 -0
- package/dist/components/LocalPathPicker.d.ts.map +1 -0
- package/dist/components/LocalPathPicker.js +182 -0
- package/dist/components/LocalPathPicker.js.map +1 -0
- package/dist/components/LocalPathTree.cjs +89 -0
- package/dist/components/LocalPathTree.cjs.map +1 -0
- package/dist/components/LocalPathTree.d.ts +9 -0
- package/dist/components/LocalPathTree.d.ts.map +1 -0
- package/dist/components/LocalPathTree.js +89 -0
- package/dist/components/LocalPathTree.js.map +1 -0
- package/dist/components/RangeSlider.cjs +10 -30
- package/dist/components/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider.d.ts.map +1 -1
- package/dist/components/RangeSlider.js +4 -24
- package/dist/components/RangeSlider.js.map +1 -1
- package/dist/components/Slider.cjs +79 -0
- package/dist/components/Slider.cjs.map +1 -0
- package/dist/components/Slider.d.ts +23 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +79 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/combobox-types.d.ts +4 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.cjs +3 -5
- package/dist/components/filter-bar-field-utils.cjs.map +1 -1
- package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-field-utils.js +3 -5
- package/dist/components/filter-bar-field-utils.js.map +1 -1
- package/dist/components/filter-bar-tree-model.cjs +22 -0
- package/dist/components/filter-bar-tree-model.cjs.map +1 -0
- package/dist/components/filter-bar-tree-model.d.ts +33 -0
- package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
- package/dist/components/filter-bar-tree-model.js +21 -0
- package/dist/components/filter-bar-tree-model.js.map +1 -0
- package/dist/components/filter-bar-tree.cjs +84 -0
- package/dist/components/filter-bar-tree.cjs.map +1 -0
- package/dist/components/filter-bar-tree.d.ts +7 -0
- package/dist/components/filter-bar-tree.d.ts.map +1 -0
- package/dist/components/filter-bar-tree.js +84 -0
- package/dist/components/filter-bar-tree.js.map +1 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
- package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
- package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
- package/dist/components/json-schema-form-help-links.cjs +18 -0
- package/dist/components/json-schema-form-help-links.cjs.map +1 -0
- package/dist/components/json-schema-form-help-links.d.ts +5 -0
- package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-links.js +18 -0
- package/dist/components/json-schema-form-help-links.js.map +1 -0
- package/dist/components/json-schema-form-help-model.cjs +7 -0
- package/dist/components/json-schema-form-help-model.cjs.map +1 -0
- package/dist/components/json-schema-form-help-model.d.ts +3 -0
- package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-help-model.js +7 -0
- package/dist/components/json-schema-form-help-model.js.map +1 -0
- package/dist/components/json-schema-form-json.cjs +48 -0
- package/dist/components/json-schema-form-json.cjs.map +1 -0
- package/dist/components/json-schema-form-json.d.ts +7 -0
- package/dist/components/json-schema-form-json.d.ts.map +1 -0
- package/dist/components/json-schema-form-json.js +48 -0
- package/dist/components/json-schema-form-json.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +7 -5
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +2 -2
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +7 -5
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +2 -13
- 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 +2 -13
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-refs.cjs +1 -1
- 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 +1 -1
- package/dist/components/json-schema-form-refs.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +20 -6
- 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 +20 -6
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +22 -2
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +22 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +5 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-union-model.cjs +46 -0
- package/dist/components/json-schema-form-union-model.cjs.map +1 -0
- package/dist/components/json-schema-form-union-model.d.ts +6 -0
- package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
- package/dist/components/json-schema-form-union-model.js +43 -0
- package/dist/components/json-schema-form-union-model.js.map +1 -0
- package/dist/components/json-schema-form-union.cjs +52 -0
- package/dist/components/json-schema-form-union.cjs.map +1 -0
- package/dist/components/json-schema-form-union.d.ts +7 -0
- package/dist/components/json-schema-form-union.d.ts.map +1 -0
- package/dist/components/json-schema-form-union.js +52 -0
- package/dist/components/json-schema-form-union.js.map +1 -0
- package/dist/components/list-menu-virtual.cjs +5 -0
- package/dist/components/list-menu-virtual.cjs.map +1 -0
- package/dist/components/list-menu-virtual.d.ts +12 -0
- package/dist/components/list-menu-virtual.d.ts.map +1 -0
- package/dist/components/list-menu-virtual.js +6 -0
- package/dist/components/list-menu-virtual.js.map +1 -0
- package/dist/components/local-path.cjs +12 -0
- package/dist/components/local-path.cjs.map +1 -0
- package/dist/components/local-path.d.ts +14 -0
- package/dist/components/local-path.d.ts.map +1 -0
- package/dist/components/local-path.js +12 -0
- package/dist/components/local-path.js.map +1 -0
- package/dist/components/slider-shared.cjs +32 -0
- package/dist/components/slider-shared.cjs.map +1 -0
- package/dist/components/slider-shared.d.ts +18 -0
- package/dist/components/slider-shared.d.ts.map +1 -0
- package/dist/components/slider-shared.js +27 -0
- package/dist/components/slider-shared.js.map +1 -0
- package/dist/components.cjs +8 -0
- package/dist/components.d.ts +6 -1
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +5 -1
- package/dist/connections/ConnectionsPage.cjs +51 -19
- package/dist/connections/ConnectionsPage.cjs.map +1 -1
- package/dist/connections/ConnectionsPage.d.ts +9 -1
- package/dist/connections/ConnectionsPage.d.ts.map +1 -1
- package/dist/connections/ConnectionsPage.js +52 -20
- package/dist/connections/ConnectionsPage.js.map +1 -1
- package/dist/connections/connectionDashboard.cjs +13 -8
- package/dist/connections/connectionDashboard.cjs.map +1 -1
- package/dist/connections/connectionDashboard.d.ts +8 -3
- package/dist/connections/connectionDashboard.d.ts.map +1 -1
- package/dist/connections/connectionDashboard.js +14 -9
- package/dist/connections/connectionDashboard.js.map +1 -1
- package/dist/connections/connectionDashboardModel.cjs.map +1 -1
- package/dist/connections/connectionDashboardModel.d.ts +4 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
- package/dist/connections/connectionDashboardModel.js.map +1 -1
- package/dist/connections/connectionDashboardRow.cjs +75 -55
- package/dist/connections/connectionDashboardRow.cjs.map +1 -1
- package/dist/connections/connectionDashboardRow.d.ts +3 -2
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
- package/dist/connections/connectionDashboardRow.js +75 -55
- package/dist/connections/connectionDashboardRow.js.map +1 -1
- package/dist/connections/connectionNamespaceField.cjs +17 -0
- package/dist/connections/connectionNamespaceField.cjs.map +1 -0
- package/dist/connections/connectionNamespaceField.d.ts +10 -0
- package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
- package/dist/connections/connectionNamespaceField.js +17 -0
- package/dist/connections/connectionNamespaceField.js.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
- package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
- package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
- package/dist/connections/connectionSchemaFormExtensions.js +96 -0
- package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +11 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -1
- package/dist/connections/connectionsPageModel.d.ts +5 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -1
- package/dist/connections/connectionsPageModel.js +11 -1
- package/dist/connections/connectionsPageModel.js.map +1 -1
- package/dist/connections.cjs +5 -0
- package/dist/connections.d.ts +2 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +3 -2
- package/dist/data/AvatarBadge.cjs +3 -3
- package/dist/data/AvatarBadge.cjs.map +1 -1
- package/dist/data/AvatarBadge.js +3 -3
- package/dist/data/AvatarBadge.js.map +1 -1
- package/dist/data/CodeDiff.cjs +2 -0
- package/dist/data/CodeDiff.cjs.map +1 -1
- package/dist/data/CodeDiff.js +2 -0
- package/dist/data/CodeDiff.js.map +1 -1
- package/dist/data/DataTable.cjs +3 -2
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +3 -2
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/Gauge.cjs +1 -1
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.js +1 -1
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/HighlightedTokens.cjs +2 -10
- package/dist/data/HighlightedTokens.cjs.map +1 -1
- package/dist/data/HighlightedTokens.d.ts.map +1 -1
- package/dist/data/HighlightedTokens.js +1 -9
- package/dist/data/HighlightedTokens.js.map +1 -1
- package/dist/data/Markdown.cjs +38 -11
- package/dist/data/Markdown.cjs.map +1 -1
- package/dist/data/Markdown.d.ts +9 -1
- package/dist/data/Markdown.d.ts.map +1 -1
- package/dist/data/Markdown.js +39 -12
- package/dist/data/Markdown.js.map +1 -1
- package/dist/data/MultiGaugeBar.cjs +157 -0
- package/dist/data/MultiGaugeBar.cjs.map +1 -0
- package/dist/data/MultiGaugeBar.d.ts +29 -0
- package/dist/data/MultiGaugeBar.d.ts.map +1 -0
- package/dist/data/MultiGaugeBar.js +157 -0
- package/dist/data/MultiGaugeBar.js.map +1 -0
- package/dist/data/OpenInFilesLink.cjs +27 -0
- package/dist/data/OpenInFilesLink.cjs.map +1 -0
- package/dist/data/OpenInFilesLink.d.ts +15 -0
- package/dist/data/OpenInFilesLink.d.ts.map +1 -0
- package/dist/data/OpenInFilesLink.js +27 -0
- package/dist/data/OpenInFilesLink.js.map +1 -0
- package/dist/data/ProgressBar.cjs +5 -3
- package/dist/data/ProgressBar.cjs.map +1 -1
- package/dist/data/ProgressBar.d.ts +5 -1
- package/dist/data/ProgressBar.d.ts.map +1 -1
- package/dist/data/ProgressBar.js +5 -3
- package/dist/data/ProgressBar.js.map +1 -1
- package/dist/data/ProgressBars.cjs +13 -5
- package/dist/data/ProgressBars.cjs.map +1 -1
- package/dist/data/ProgressBars.d.ts +6 -1
- package/dist/data/ProgressBars.d.ts.map +1 -1
- package/dist/data/ProgressBars.js +13 -5
- package/dist/data/ProgressBars.js.map +1 -1
- package/dist/data/Properties.cjs +3 -3
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.js +3 -3
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -6
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +3 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +14 -6
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskPrompts.cjs +96 -0
- package/dist/data/TaskPrompts.cjs.map +1 -0
- package/dist/data/TaskPrompts.d.ts +6 -0
- package/dist/data/TaskPrompts.d.ts.map +1 -0
- package/dist/data/TaskPrompts.js +96 -0
- package/dist/data/TaskPrompts.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +3 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +7 -3
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -4
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +12 -5
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +13 -6
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/TimeseriesPanel.cjs +10 -9
- package/dist/data/TimeseriesPanel.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.d.ts +1 -1
- package/dist/data/TimeseriesPanel.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.js +11 -10
- package/dist/data/TimeseriesPanel.js.map +1 -1
- package/dist/data/TimeseriesPanel.model.cjs +62 -10
- package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.model.d.ts +40 -1
- package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
- package/dist/data/TimeseriesPanel.model.js +62 -11
- package/dist/data/TimeseriesPanel.model.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +7 -3
- package/dist/data/WorkloadCard.cjs.map +1 -1
- package/dist/data/WorkloadCard.d.ts +3 -1
- package/dist/data/WorkloadCard.d.ts.map +1 -1
- package/dist/data/WorkloadCard.js +7 -3
- package/dist/data/WorkloadCard.js.map +1 -1
- package/dist/data/WorkloadCard.model.cjs.map +1 -1
- package/dist/data/WorkloadCard.model.d.ts +2 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -1
- package/dist/data/WorkloadCard.model.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +2 -1
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.placement.js +2 -1
- package/dist/data/ai/ChatWindow.placement.js.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
- package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
- package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeBar.js +2 -2
- package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
- package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
- package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +2 -2
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.js +2 -2
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -0
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
- package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
- package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
- package/dist/data/ai/use-prompt-run-stream.js +126 -0
- package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
- package/dist/data/cache-browser/CacheBrowser.js +1 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
- package/dist/data/charts/BarChart.cjs +194 -0
- package/dist/data/charts/BarChart.cjs.map +1 -0
- package/dist/data/charts/BarChart.d.ts +19 -0
- package/dist/data/charts/BarChart.d.ts.map +1 -0
- package/dist/data/charts/BarChart.js +194 -0
- package/dist/data/charts/BarChart.js.map +1 -0
- package/dist/data/charts/ChartLegend.cjs +54 -0
- package/dist/data/charts/ChartLegend.cjs.map +1 -0
- package/dist/data/charts/ChartLegend.d.ts +17 -0
- package/dist/data/charts/ChartLegend.d.ts.map +1 -0
- package/dist/data/charts/ChartLegend.js +54 -0
- package/dist/data/charts/ChartLegend.js.map +1 -0
- package/dist/data/charts/Sparkline.cjs +56 -0
- package/dist/data/charts/Sparkline.cjs.map +1 -0
- package/dist/data/charts/Sparkline.d.ts +15 -0
- package/dist/data/charts/Sparkline.d.ts.map +1 -0
- package/dist/data/charts/Sparkline.js +56 -0
- package/dist/data/charts/Sparkline.js.map +1 -0
- package/dist/data/charts/StackedBarChart.cjs +241 -0
- package/dist/data/charts/StackedBarChart.cjs.map +1 -0
- package/dist/data/charts/StackedBarChart.d.ts +20 -0
- package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
- package/dist/data/charts/StackedBarChart.js +241 -0
- package/dist/data/charts/StackedBarChart.js.map +1 -0
- package/dist/data/charts/TrendChart.cjs +157 -0
- package/dist/data/charts/TrendChart.cjs.map +1 -0
- package/dist/data/charts/TrendChart.d.ts +20 -0
- package/dist/data/charts/TrendChart.d.ts.map +1 -0
- package/dist/data/charts/TrendChart.js +157 -0
- package/dist/data/charts/TrendChart.js.map +1 -0
- package/dist/data/charts/chart-marks.cjs +115 -0
- package/dist/data/charts/chart-marks.cjs.map +1 -0
- package/dist/data/charts/chart-marks.d.ts +39 -0
- package/dist/data/charts/chart-marks.d.ts.map +1 -0
- package/dist/data/charts/chart-marks.js +112 -0
- package/dist/data/charts/chart-marks.js.map +1 -0
- package/dist/data/charts/chart-palette.cjs +74 -0
- package/dist/data/charts/chart-palette.cjs.map +1 -0
- package/dist/data/charts/chart-palette.d.ts +58 -0
- package/dist/data/charts/chart-palette.d.ts.map +1 -0
- package/dist/data/charts/chart-palette.js +72 -0
- package/dist/data/charts/chart-palette.js.map +1 -0
- package/dist/data/charts/chart-scale.cjs +115 -0
- package/dist/data/charts/chart-scale.cjs.map +1 -0
- package/dist/data/charts/chart-scale.d.ts +41 -0
- package/dist/data/charts/chart-scale.d.ts.map +1 -0
- package/dist/data/charts/chart-scale.js +104 -0
- package/dist/data/charts/chart-scale.js.map +1 -0
- package/dist/data/charts/chart.test-utils.d.ts +7 -0
- package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
- package/dist/data/charts/index.d.ts +7 -0
- package/dist/data/charts/index.d.ts.map +1 -0
- package/dist/data/chat/MessageActions.cjs +1 -1
- package/dist/data/chat/MessageActions.cjs.map +1 -1
- package/dist/data/chat/MessageActions.js +1 -1
- package/dist/data/chat/MessageActions.js.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
- package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/ProblemActions.cjs +37 -0
- package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemActions.js +37 -0
- package/dist/data/diagnostics/ProblemActions.js.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
- package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
- package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemFacet.js +33 -0
- package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
- package/dist/data/diagnostics/ProblemRow.cjs +62 -0
- package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
- package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemRow.js +62 -0
- package/dist/data/diagnostics/ProblemRow.js.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
- package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
- package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
- package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
- package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
- package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
- package/dist/data/diagnostics/StackFrameRow.js +1 -1
- package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
- package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
- package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
- package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
- package/dist/data/diagnostics/diagnostic-identity.js +14 -0
- package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
- package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
- package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
- package/dist/data/diagnostics/use-problem-expansion.js +16 -0
- package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +9 -6
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +6 -0
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +9 -6
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
- package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
- package/dist/data/git/pickers/ReferencePicker.js +1 -0
- package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
- package/dist/data/lint/LintDetail.cjs +230 -189
- package/dist/data/lint/LintDetail.cjs.map +1 -1
- package/dist/data/lint/LintDetail.d.ts +25 -3
- package/dist/data/lint/LintDetail.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.js +231 -192
- package/dist/data/lint/LintDetail.js.map +1 -1
- package/dist/data/lint/LintFilterBar.cjs +78 -83
- package/dist/data/lint/LintFilterBar.cjs.map +1 -1
- package/dist/data/lint/LintFilterBar.d.ts +23 -6
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
- package/dist/data/lint/LintFilterBar.js +78 -85
- package/dist/data/lint/LintFilterBar.js.map +1 -1
- package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
- package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
- package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
- package/dist/data/lint/LintIgnoreMenu.js +58 -0
- package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +59 -14
- package/dist/data/lint/LintResults.cjs.map +1 -1
- package/dist/data/lint/LintResults.d.ts +25 -1
- package/dist/data/lint/LintResults.d.ts.map +1 -1
- package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
- package/dist/data/lint/LintResults.js +60 -15
- package/dist/data/lint/LintResults.js.map +1 -1
- package/dist/data/lint/LintTable.cjs +156 -0
- package/dist/data/lint/LintTable.cjs.map +1 -0
- package/dist/data/lint/LintTable.d.ts +13 -0
- package/dist/data/lint/LintTable.d.ts.map +1 -0
- package/dist/data/lint/LintTable.js +156 -0
- package/dist/data/lint/LintTable.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +42 -19
- package/dist/data/lint/LintTreeNode.cjs.map +1 -1
- package/dist/data/lint/LintTreeNode.d.ts +7 -2
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
- package/dist/data/lint/LintTreeNode.js +44 -21
- package/dist/data/lint/LintTreeNode.js.map +1 -1
- package/dist/data/lint/ViolationSnippet.cjs +113 -0
- package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
- package/dist/data/lint/ViolationSnippet.d.ts +20 -0
- package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
- package/dist/data/lint/ViolationSnippet.js +112 -0
- package/dist/data/lint/ViolationSnippet.js.map +1 -0
- package/dist/data/lint/actions.cjs +44 -16
- package/dist/data/lint/actions.cjs.map +1 -1
- package/dist/data/lint/actions.d.ts +7 -3
- package/dist/data/lint/actions.d.ts.map +1 -1
- package/dist/data/lint/actions.js +44 -16
- package/dist/data/lint/actions.js.map +1 -1
- package/dist/data/lint/grouping.cjs +105 -8
- package/dist/data/lint/grouping.cjs.map +1 -1
- package/dist/data/lint/grouping.d.ts +21 -1
- package/dist/data/lint/grouping.d.ts.map +1 -1
- package/dist/data/lint/grouping.js +105 -10
- package/dist/data/lint/grouping.js.map +1 -1
- package/dist/data/lint/ignore-menu-items.cjs +18 -0
- package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
- package/dist/data/lint/ignore-menu-items.d.ts +6 -0
- package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
- package/dist/data/lint/ignore-menu-items.js +17 -0
- package/dist/data/lint/ignore-menu-items.js.map +1 -0
- package/dist/data/lint/index.d.ts +7 -5
- package/dist/data/lint/index.d.ts.map +1 -1
- package/dist/data/lint/stats.cjs +19 -4
- package/dist/data/lint/stats.cjs.map +1 -1
- package/dist/data/lint/stats.d.ts +13 -3
- package/dist/data/lint/stats.d.ts.map +1 -1
- package/dist/data/lint/stats.js +17 -5
- package/dist/data/lint/stats.js.map +1 -1
- package/dist/data/lint/types.cjs +8 -0
- package/dist/data/lint/types.cjs.map +1 -1
- package/dist/data/lint/types.d.ts +47 -0
- package/dist/data/lint/types.d.ts.map +1 -1
- package/dist/data/lint/types.js +8 -1
- package/dist/data/lint/types.js.map +1 -1
- package/dist/data/lint/violation-menu-items.cjs +31 -0
- package/dist/data/lint/violation-menu-items.cjs.map +1 -0
- package/dist/data/lint/violation-menu-items.d.ts +12 -0
- package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
- package/dist/data/lint/violation-menu-items.js +31 -0
- package/dist/data/lint/violation-menu-items.js.map +1 -0
- package/dist/data/markdown-source-blocks.cjs +38 -0
- package/dist/data/markdown-source-blocks.cjs.map +1 -0
- package/dist/data/markdown-source-blocks.d.ts +32 -0
- package/dist/data/markdown-source-blocks.d.ts.map +1 -0
- package/dist/data/markdown-source-blocks.js +35 -0
- package/dist/data/markdown-source-blocks.js.map +1 -0
- package/dist/data/test-runner/FilterFacet.cjs +52 -0
- package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
- package/dist/data/test-runner/FilterFacet.d.ts +13 -0
- package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
- package/dist/data/test-runner/FilterFacet.js +52 -0
- package/dist/data/test-runner/FilterFacet.js.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +19 -29
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +19 -29
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
- package/dist/data/test-runner/TestAttemptDetail.js +1 -1
- package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +11 -0
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +3 -44
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +3 -44
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -1
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +7 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -1
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +3 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/timeseries-query.cjs +98 -2
- package/dist/data/timeseries-query.cjs.map +1 -1
- package/dist/data/timeseries-query.d.ts +31 -5
- package/dist/data/timeseries-query.d.ts.map +1 -1
- package/dist/data/timeseries-query.js +98 -3
- package/dist/data/timeseries-query.js.map +1 -1
- package/dist/data/timeseries-stream-provider.cjs +38 -0
- package/dist/data/timeseries-stream-provider.cjs.map +1 -0
- package/dist/data/timeseries-stream-provider.d.ts +26 -0
- package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
- package/dist/data/timeseries-stream-provider.js +38 -0
- package/dist/data/timeseries-stream-provider.js.map +1 -0
- package/dist/data/timeseries-stream.cjs +304 -0
- package/dist/data/timeseries-stream.cjs.map +1 -0
- package/dist/data/timeseries-stream.d.ts +81 -0
- package/dist/data/timeseries-stream.d.ts.map +1 -0
- package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
- package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
- package/dist/data/timeseries-stream.js +296 -0
- package/dist/data/timeseries-stream.js.map +1 -0
- package/dist/data/token-style.cjs +13 -0
- package/dist/data/token-style.cjs.map +1 -0
- package/dist/data/token-style.d.ts +4 -0
- package/dist/data/token-style.d.ts.map +1 -0
- package/dist/data/token-style.js +13 -0
- package/dist/data/token-style.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
- package/dist/data/traces/ProcessTraceDetail.js +1 -1
- package/dist/data/traces/index.d.ts +1 -1
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/use-data-table-virtual.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data/workload-panel/MemoryStack.cjs +49 -0
- package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
- package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
- package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
- package/dist/data/workload-panel/MemoryStack.js +48 -0
- package/dist/data/workload-panel/MemoryStack.js.map +1 -0
- package/dist/data/workload-panel/Metrics.cjs +197 -0
- package/dist/data/workload-panel/Metrics.cjs.map +1 -0
- package/dist/data/workload-panel/Metrics.d.ts +11 -0
- package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
- package/dist/data/workload-panel/Metrics.js +196 -0
- package/dist/data/workload-panel/Metrics.js.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
- package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
- package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
- package/dist/data/workload-panel/WorkloadPanel.js +66 -0
- package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
- package/dist/data/workload-panel/fixtures.d.ts +60 -0
- package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
- package/dist/data/workload-panel/model.cjs +137 -0
- package/dist/data/workload-panel/model.cjs.map +1 -0
- package/dist/data/workload-panel/model.d.ts +53 -0
- package/dist/data/workload-panel/model.d.ts.map +1 -0
- package/dist/data/workload-panel/model.js +133 -0
- package/dist/data/workload-panel/model.js.map +1 -0
- package/dist/data/workload-panel/types.d.ts +56 -0
- package/dist/data/workload-panel/types.d.ts.map +1 -0
- package/dist/data.cjs +57 -6
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +27 -10
- package/dist/file-findings/AnnotatedCode.cjs +243 -0
- package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/AnnotatedCode.d.ts +30 -0
- package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/AnnotatedCode.js +243 -0
- package/dist/file-findings/AnnotatedCode.js.map +1 -0
- package/dist/file-findings/FileFindingsView.cjs +213 -0
- package/dist/file-findings/FileFindingsView.cjs.map +1 -0
- package/dist/file-findings/FileFindingsView.d.ts +35 -0
- package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
- package/dist/file-findings/FileFindingsView.js +213 -0
- package/dist/file-findings/FileFindingsView.js.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
- package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
- package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
- package/dist/file-findings/LazyAnnotatedCode.js +22 -0
- package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
- package/dist/file-findings/adapters.cjs +155 -0
- package/dist/file-findings/adapters.cjs.map +1 -0
- package/dist/file-findings/adapters.d.ts +24 -0
- package/dist/file-findings/adapters.d.ts.map +1 -0
- package/dist/file-findings/adapters.js +153 -0
- package/dist/file-findings/adapters.js.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
- package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
- package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
- package/dist/file-findings/file-review/CommentDraft.js +97 -0
- package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
- package/dist/file-findings/file-review/FileReview.cjs +863 -0
- package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
- package/dist/file-findings/file-review/FileReview.d.ts +79 -0
- package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
- package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
- package/dist/file-findings/file-review/FileReview.js +863 -0
- package/dist/file-findings/file-review/FileReview.js.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
- package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
- package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineAuthors.js +77 -0
- package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
- package/dist/file-findings/file-review/InlineThread.cjs +77 -0
- package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
- package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
- package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
- package/dist/file-findings/file-review/InlineThread.js +77 -0
- package/dist/file-findings/file-review/InlineThread.js.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
- package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
- package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
- package/dist/file-findings/file-review/ProblemsList.js +164 -0
- package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
- package/dist/file-findings/file-review/SourceView.cjs +179 -0
- package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
- package/dist/file-findings/file-review/SourceView.d.ts +29 -0
- package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
- package/dist/file-findings/file-review/SourceView.js +179 -0
- package/dist/file-findings/file-review/SourceView.js.map +1 -0
- package/dist/file-findings/file-review/blame.cjs +35 -0
- package/dist/file-findings/file-review/blame.cjs.map +1 -0
- package/dist/file-findings/file-review/blame.d.ts +28 -0
- package/dist/file-findings/file-review/blame.d.ts.map +1 -0
- package/dist/file-findings/file-review/blame.js +33 -0
- package/dist/file-findings/file-review/blame.js.map +1 -0
- package/dist/file-findings/file-review/geometry.cjs +101 -0
- package/dist/file-findings/file-review/geometry.cjs.map +1 -0
- package/dist/file-findings/file-review/geometry.d.ts +45 -0
- package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
- package/dist/file-findings/file-review/geometry.js +98 -0
- package/dist/file-findings/file-review/geometry.js.map +1 -0
- package/dist/file-findings/file-review/hooks.cjs +101 -0
- package/dist/file-findings/file-review/hooks.cjs.map +1 -0
- package/dist/file-findings/file-review/hooks.d.ts +22 -0
- package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
- package/dist/file-findings/file-review/hooks.js +99 -0
- package/dist/file-findings/file-review/hooks.js.map +1 -0
- package/dist/file-findings/file-review/marks.cjs +52 -0
- package/dist/file-findings/file-review/marks.cjs.map +1 -0
- package/dist/file-findings/file-review/marks.d.ts +23 -0
- package/dist/file-findings/file-review/marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/marks.js +47 -0
- package/dist/file-findings/file-review/marks.js.map +1 -0
- package/dist/file-findings/file-review/problem-filters.cjs +14 -0
- package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
- package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
- package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
- package/dist/file-findings/file-review/problem-filters.js +13 -0
- package/dist/file-findings/file-review/problem-filters.js.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
- package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
- package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/quote-anchor.js +226 -0
- package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-anchor.cjs +104 -0
- package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
- package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
- package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-anchor.js +99 -0
- package/dist/file-findings/file-review/source-anchor.js.map +1 -0
- package/dist/file-findings/file-review/source-marks.cjs +71 -0
- package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
- package/dist/file-findings/file-review/source-marks.d.ts +27 -0
- package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
- package/dist/file-findings/file-review/source-marks.js +68 -0
- package/dist/file-findings/file-review/source-marks.js.map +1 -0
- package/dist/file-findings/findings-comments.cjs +136 -0
- package/dist/file-findings/findings-comments.cjs.map +1 -0
- package/dist/file-findings/findings-comments.d.ts +28 -0
- package/dist/file-findings/findings-comments.d.ts.map +1 -0
- package/dist/file-findings/findings-comments.js +131 -0
- package/dist/file-findings/findings-comments.js.map +1 -0
- package/dist/file-findings/findings-languages.cjs +53 -0
- package/dist/file-findings/findings-languages.cjs.map +1 -0
- package/dist/file-findings/findings-languages.d.ts +11 -0
- package/dist/file-findings/findings-languages.d.ts.map +1 -0
- package/dist/file-findings/findings-languages.js +53 -0
- package/dist/file-findings/findings-languages.js.map +1 -0
- package/dist/file-findings/mdx-source.cjs +48 -0
- package/dist/file-findings/mdx-source.cjs.map +1 -0
- package/dist/file-findings/mdx-source.d.ts +7 -0
- package/dist/file-findings/mdx-source.d.ts.map +1 -0
- package/dist/file-findings/mdx-source.js +48 -0
- package/dist/file-findings/mdx-source.js.map +1 -0
- package/dist/file-findings/monaco-language.cjs +73 -0
- package/dist/file-findings/monaco-language.cjs.map +1 -0
- package/dist/file-findings/monaco-language.d.ts +11 -0
- package/dist/file-findings/monaco-language.d.ts.map +1 -0
- package/dist/file-findings/monaco-language.js +72 -0
- package/dist/file-findings/monaco-language.js.map +1 -0
- package/dist/file-findings/severity-counts.cjs +20 -0
- package/dist/file-findings/severity-counts.cjs.map +1 -0
- package/dist/file-findings/severity-counts.d.ts +5 -0
- package/dist/file-findings/severity-counts.d.ts.map +1 -0
- package/dist/file-findings/severity-counts.js +19 -0
- package/dist/file-findings/severity-counts.js.map +1 -0
- package/dist/file-findings/types.cjs +12 -0
- package/dist/file-findings/types.cjs.map +1 -0
- package/dist/file-findings/types.d.ts +43 -0
- package/dist/file-findings/types.d.ts.map +1 -0
- package/dist/file-findings/types.js +11 -0
- package/dist/file-findings/types.js.map +1 -0
- package/dist/file-findings.cjs +47 -0
- package/dist/file-findings.d.ts +15 -0
- package/dist/file-findings.d.ts.map +1 -0
- package/dist/file-findings.js +15 -0
- package/dist/hooks/event-hub.cjs +22 -8
- package/dist/hooks/event-hub.cjs.map +1 -1
- package/dist/hooks/event-hub.d.ts.map +1 -1
- package/dist/hooks/event-hub.js +22 -8
- package/dist/hooks/event-hub.js.map +1 -1
- package/dist/icons/components/UiBrowser.cjs +51 -0
- package/dist/icons/components/UiBrowser.cjs.map +1 -0
- package/dist/icons/components/UiBrowser.d.ts +15 -0
- package/dist/icons/components/UiBrowser.d.ts.map +1 -0
- package/dist/icons/components/UiBrowser.js +48 -0
- package/dist/icons/components/UiBrowser.js.map +1 -0
- package/dist/icons/components/UiCreditCard.cjs +51 -0
- package/dist/icons/components/UiCreditCard.cjs.map +1 -0
- package/dist/icons/components/UiCreditCard.d.ts +15 -0
- package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
- package/dist/icons/components/UiCreditCard.js +48 -0
- package/dist/icons/components/UiCreditCard.js.map +1 -0
- package/dist/icons/components/UiShoppingCart.cjs +51 -0
- package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
- package/dist/icons/components/UiShoppingCart.d.ts +15 -0
- package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
- package/dist/icons/components/UiShoppingCart.js +48 -0
- package/dist/icons/components/UiShoppingCart.js.map +1 -0
- package/dist/icons/index.d.ts +6 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +6 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +6 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +9 -0
- package/dist/icons.js +4 -1
- package/dist/index.cjs +75 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -12
- package/dist/layout/AppShell.cjs +37 -21
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +13 -2
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +37 -21
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +7 -6
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +7 -6
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +16 -6
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +12 -2
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +16 -6
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/layout/Workspace.cjs +37 -33
- package/dist/layout/Workspace.cjs.map +1 -1
- package/dist/layout/Workspace.d.ts.map +1 -1
- package/dist/layout/Workspace.js +37 -33
- package/dist/layout/Workspace.js.map +1 -1
- package/dist/layout/Workspace.regions.cjs +3 -3
- package/dist/layout/Workspace.regions.cjs.map +1 -1
- package/dist/layout/Workspace.regions.js +3 -3
- package/dist/layout/Workspace.regions.js.map +1 -1
- package/dist/lib/breakpoints.cjs +102 -0
- package/dist/lib/breakpoints.cjs.map +1 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +99 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/combobox.cjs +2 -1
- package/dist/lib/combobox.cjs.map +1 -1
- package/dist/lib/combobox.d.ts +1 -1
- package/dist/lib/combobox.d.ts.map +1 -1
- package/dist/lib/combobox.js +2 -1
- package/dist/lib/combobox.js.map +1 -1
- package/dist/lib/path-tree.cjs +21 -0
- package/dist/lib/path-tree.cjs.map +1 -1
- package/dist/lib/path-tree.d.ts +15 -0
- package/dist/lib/path-tree.d.ts.map +1 -1
- package/dist/lib/path-tree.js +21 -1
- package/dist/lib/path-tree.js.map +1 -1
- package/dist/overlay/Modal.cjs +2 -1
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +2 -1
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/profiles/editor/profileEditor.cjs +1 -1
- package/dist/profiles/editor/profileEditor.cjs.map +1 -1
- package/dist/profiles/editor/profileEditor.js +1 -1
- package/dist/profiles/editor/profileEditor.js.map +1 -1
- package/dist/profiles/editor/profileEditorSections.cjs +2 -2
- package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
- package/dist/profiles/editor/profileEditorSections.js +2 -2
- package/dist/profiles/editor/profileEditorSections.js.map +1 -1
- package/dist/profiles/query/prometheusResults.cjs +24 -36
- package/dist/profiles/query/prometheusResults.cjs.map +1 -1
- package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
- package/dist/profiles/query/prometheusResults.js +24 -36
- package/dist/profiles/query/prometheusResults.js.map +1 -1
- package/dist/rpc/CommandForm.cjs +1 -1
- package/dist/rpc/CommandForm.cjs.map +1 -1
- package/dist/rpc/CommandForm.js +1 -1
- package/dist/rpc/CommandForm.js.map +1 -1
- package/dist/rpc/classify.cjs +1 -1
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +1 -1
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/useOperations.d.ts +24 -24
- package/dist/rpc.cjs +0 -2
- package/dist/rpc.d.ts +0 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -2
- package/dist/styles.css +1 -1
- package/dist/utils.cjs +6 -0
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/package.json +9 -3
- package/schemas/json-schema-form.schema.json +9 -1
|
@@ -10,7 +10,7 @@ let react_jsx_runtime = require("react/jsx-runtime");
|
|
|
10
10
|
function ItemActions({ label, index, count, onMove, onDuplicate, onRemove, leading, reveal = true, size = "md", className }) {
|
|
11
11
|
const action = require_utils.cn("inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30", require_json_schema_form_size.controlHeightClass[size]);
|
|
12
12
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
13
|
-
className: require_utils.cn("ml-auto flex shrink-0 items-center gap-0.5", reveal && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100", className),
|
|
13
|
+
className: require_utils.cn("ml-auto flex shrink-0 items-center gap-0.5", reveal && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100 [@media(hover:none)]:opacity-100", className),
|
|
14
14
|
children: [
|
|
15
15
|
leading,
|
|
16
16
|
onMove && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemActions.cjs","names":["cn","controlHeightClass","_Fragment","Icon","UiChevronUp","UiChevronDown","UiCopy","UiTrash"],"sources":["../../src/components/ItemActions.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { SizeToken } from \"../lib/size\";\nimport { Icon } from \"../data/Icon\";\nimport { UiChevronDown, UiChevronUp, UiCopy, UiTrash } from \"../icons\";\nimport { controlHeightClass } from \"./json-schema-form-size\";\n\n// The per-row action cluster shared by every editable-list surface: AccordionList\n// and the JsonSchemaForm array displays. Each action is offered ONLY when its\n// handler is supplied, which is how a list opts into reorder without opting into\n// delete — there is no separate flag to keep in sync with the callback.\nexport interface ItemActionsProps {\n /** Names the item in every action's accessible label (\"Move Routes up\"). */\n label: string;\n /** This row's position, used for the reorder targets and the end-disabling. */\n index: number;\n /** Total rows, so the last row's \"down\" disables itself. */\n count: number;\n /**\n * Offers both reorder buttons, called with the destination index. The button\n * at either end of the list renders disabled rather than missing, so the\n * cluster keeps a constant width down a long list.\n */\n onMove?: (to: number) => void;\n /** Offers the duplicate button. */\n onDuplicate?: () => void;\n /** Offers the remove button. */\n onRemove?: () => void;\n /** Consumer actions, rendered before the built-in ones. */\n leading?: ReactNode;\n /**\n * Reveal on row hover / focus-within. Defaults to true, which requires\n * `group` on the row container — a long list is then not a wall of\n * permanently dim icons, while keyboard users still see the actions the\n * moment they arrive. Pass false for a row that must always show them.\n */\n reveal?: boolean;\n size?: SizeToken;\n className?: string;\n}\n\nexport function ItemActions({\n label,\n index,\n count,\n onMove,\n onDuplicate,\n onRemove,\n leading,\n reveal = true,\n size = \"md\",\n className,\n}: ItemActionsProps) {\n const action = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\n return (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5\",\n reveal &&\n \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\",\n className,\n )}\n >\n {leading}\n {onMove && (\n <>\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={index === 0}\n className={action}\n onClick={() => onMove(index - 1)}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={index >= count - 1}\n className={action}\n onClick={() => onMove(index + 1)}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n </>\n )}\n {onDuplicate && (\n <button\n type=\"button\"\n aria-label={`Duplicate ${label}`}\n className={action}\n onClick={onDuplicate}\n >\n <Icon icon={UiCopy} className=\"text-sm\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n className={cn(action, \"hover:bg-destructive/10 hover:text-destructive\")}\n onClick={onRemove}\n data-item-index={index}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAyCA,SAAgB,YAAY,EAC1B,OACA,OACA,OACA,QACA,aACA,UACA,SACA,SAAS,MACT,OAAO,MACP,aACmB;CACnB,MAAM,SAASA,cAAAA,GACb,iJACAC,8BAAAA,mBAAmB,KACrB;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,WAAWD,cAAAA,GACT,8CACA,UACE,
|
|
1
|
+
{"version":3,"file":"ItemActions.cjs","names":["cn","controlHeightClass","_Fragment","Icon","UiChevronUp","UiChevronDown","UiCopy","UiTrash"],"sources":["../../src/components/ItemActions.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { SizeToken } from \"../lib/size\";\nimport { Icon } from \"../data/Icon\";\nimport { UiChevronDown, UiChevronUp, UiCopy, UiTrash } from \"../icons\";\nimport { controlHeightClass } from \"./json-schema-form-size\";\n\n// The per-row action cluster shared by every editable-list surface: AccordionList\n// and the JsonSchemaForm array displays. Each action is offered ONLY when its\n// handler is supplied, which is how a list opts into reorder without opting into\n// delete — there is no separate flag to keep in sync with the callback.\nexport interface ItemActionsProps {\n /** Names the item in every action's accessible label (\"Move Routes up\"). */\n label: string;\n /** This row's position, used for the reorder targets and the end-disabling. */\n index: number;\n /** Total rows, so the last row's \"down\" disables itself. */\n count: number;\n /**\n * Offers both reorder buttons, called with the destination index. The button\n * at either end of the list renders disabled rather than missing, so the\n * cluster keeps a constant width down a long list.\n */\n onMove?: (to: number) => void;\n /** Offers the duplicate button. */\n onDuplicate?: () => void;\n /** Offers the remove button. */\n onRemove?: () => void;\n /** Consumer actions, rendered before the built-in ones. */\n leading?: ReactNode;\n /**\n * Reveal on row hover / focus-within. Defaults to true, which requires\n * `group` on the row container — a long list is then not a wall of\n * permanently dim icons, while keyboard users still see the actions the\n * moment they arrive. Pass false for a row that must always show them.\n */\n reveal?: boolean;\n size?: SizeToken;\n className?: string;\n}\n\nexport function ItemActions({\n label,\n index,\n count,\n onMove,\n onDuplicate,\n onRemove,\n leading,\n reveal = true,\n size = \"md\",\n className,\n}: ItemActionsProps) {\n const action = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\n return (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5\",\n reveal &&\n \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100 [@media(hover:none)]:opacity-100\",\n className,\n )}\n >\n {leading}\n {onMove && (\n <>\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={index === 0}\n className={action}\n onClick={() => onMove(index - 1)}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={index >= count - 1}\n className={action}\n onClick={() => onMove(index + 1)}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n </>\n )}\n {onDuplicate && (\n <button\n type=\"button\"\n aria-label={`Duplicate ${label}`}\n className={action}\n onClick={onDuplicate}\n >\n <Icon icon={UiCopy} className=\"text-sm\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n className={cn(action, \"hover:bg-destructive/10 hover:text-destructive\")}\n onClick={onRemove}\n data-item-index={index}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAyCA,SAAgB,YAAY,EAC1B,OACA,OACA,OACA,QACA,aACA,UACA,SACA,SAAS,MACT,OAAO,MACP,aACmB;CACnB,MAAM,SAASA,cAAAA,GACb,iJACAC,8BAAAA,mBAAmB,KACrB;CACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,WAAWD,cAAAA,GACT,8CACA,UACE,kHACF,SACF;EANF,UAAA;GAQG;GACA,UACC,iBAAA,GAAA,kBAAA,KAAA,CAAAE,kBAAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,cAAY,QAAQ,MAAM;IAC1B,UAAU,UAAU;IACpB,WAAW;IACX,eAAe,OAAO,QAAQ,CAAC;IAE/B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,MAAD;KAAM,MAAMC,oBAAAA;KAAa,WAAU;IAAW,CAAA;GACxC,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,cAAY,QAAQ,MAAM;IAC1B,UAAU,SAAS,QAAQ;IAC3B,WAAW;IACX,eAAe,OAAO,QAAQ,CAAC;IAE/B,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACD,aAAAA,MAAD;KAAM,MAAME,sBAAAA;KAAe,WAAU;IAAW,CAAA;GAC1C,CAAA,CACR,EAAA,CAAA;GAEH,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,cAAY,aAAa;IACzB,WAAW;IACX,SAAS;IAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACF,aAAAA,MAAD;KAAM,MAAMG,eAAAA;KAAQ,WAAU;IAAW,CAAA;GACnC,CAAA;GAET,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IACE,MAAK;IACL,cAAY,UAAU;IACtB,WAAWN,cAAAA,GAAG,QAAQ,gDAAgD;IACtE,SAAS;IACT,mBAAiB;IAEjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,aAAAA,MAAD;KAAM,MAAMI,gBAAAA;KAAS,WAAU;IAAW,CAAA;GACpC,CAAA;EAEP;;AAET"}
|
|
@@ -10,7 +10,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
10
10
|
function ItemActions({ label, index, count, onMove, onDuplicate, onRemove, leading, reveal = true, size = "md", className }) {
|
|
11
11
|
const action = cn("inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30", controlHeightClass[size]);
|
|
12
12
|
return /* @__PURE__ */ jsxs("div", {
|
|
13
|
-
className: cn("ml-auto flex shrink-0 items-center gap-0.5", reveal && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100", className),
|
|
13
|
+
className: cn("ml-auto flex shrink-0 items-center gap-0.5", reveal && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100 [@media(hover:none)]:opacity-100", className),
|
|
14
14
|
children: [
|
|
15
15
|
leading,
|
|
16
16
|
onMove && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("button", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemActions.js","names":["_Fragment"],"sources":["../../src/components/ItemActions.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { SizeToken } from \"../lib/size\";\nimport { Icon } from \"../data/Icon\";\nimport { UiChevronDown, UiChevronUp, UiCopy, UiTrash } from \"../icons\";\nimport { controlHeightClass } from \"./json-schema-form-size\";\n\n// The per-row action cluster shared by every editable-list surface: AccordionList\n// and the JsonSchemaForm array displays. Each action is offered ONLY when its\n// handler is supplied, which is how a list opts into reorder without opting into\n// delete — there is no separate flag to keep in sync with the callback.\nexport interface ItemActionsProps {\n /** Names the item in every action's accessible label (\"Move Routes up\"). */\n label: string;\n /** This row's position, used for the reorder targets and the end-disabling. */\n index: number;\n /** Total rows, so the last row's \"down\" disables itself. */\n count: number;\n /**\n * Offers both reorder buttons, called with the destination index. The button\n * at either end of the list renders disabled rather than missing, so the\n * cluster keeps a constant width down a long list.\n */\n onMove?: (to: number) => void;\n /** Offers the duplicate button. */\n onDuplicate?: () => void;\n /** Offers the remove button. */\n onRemove?: () => void;\n /** Consumer actions, rendered before the built-in ones. */\n leading?: ReactNode;\n /**\n * Reveal on row hover / focus-within. Defaults to true, which requires\n * `group` on the row container — a long list is then not a wall of\n * permanently dim icons, while keyboard users still see the actions the\n * moment they arrive. Pass false for a row that must always show them.\n */\n reveal?: boolean;\n size?: SizeToken;\n className?: string;\n}\n\nexport function ItemActions({\n label,\n index,\n count,\n onMove,\n onDuplicate,\n onRemove,\n leading,\n reveal = true,\n size = \"md\",\n className,\n}: ItemActionsProps) {\n const action = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\n return (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5\",\n reveal &&\n \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\",\n className,\n )}\n >\n {leading}\n {onMove && (\n <>\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={index === 0}\n className={action}\n onClick={() => onMove(index - 1)}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={index >= count - 1}\n className={action}\n onClick={() => onMove(index + 1)}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n </>\n )}\n {onDuplicate && (\n <button\n type=\"button\"\n aria-label={`Duplicate ${label}`}\n className={action}\n onClick={onDuplicate}\n >\n <Icon icon={UiCopy} className=\"text-sm\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n className={cn(action, \"hover:bg-destructive/10 hover:text-destructive\")}\n onClick={onRemove}\n data-item-index={index}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAyCA,SAAgB,YAAY,EAC1B,OACA,OACA,OACA,QACA,aACA,UACA,SACA,SAAS,MACT,OAAO,MACP,aACmB;CACnB,MAAM,SAAS,GACb,iJACA,mBAAmB,KACrB;CACA,OACE,qBAAC,OAAD;EACE,WAAW,GACT,8CACA,UACE,
|
|
1
|
+
{"version":3,"file":"ItemActions.js","names":["_Fragment"],"sources":["../../src/components/ItemActions.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { SizeToken } from \"../lib/size\";\nimport { Icon } from \"../data/Icon\";\nimport { UiChevronDown, UiChevronUp, UiCopy, UiTrash } from \"../icons\";\nimport { controlHeightClass } from \"./json-schema-form-size\";\n\n// The per-row action cluster shared by every editable-list surface: AccordionList\n// and the JsonSchemaForm array displays. Each action is offered ONLY when its\n// handler is supplied, which is how a list opts into reorder without opting into\n// delete — there is no separate flag to keep in sync with the callback.\nexport interface ItemActionsProps {\n /** Names the item in every action's accessible label (\"Move Routes up\"). */\n label: string;\n /** This row's position, used for the reorder targets and the end-disabling. */\n index: number;\n /** Total rows, so the last row's \"down\" disables itself. */\n count: number;\n /**\n * Offers both reorder buttons, called with the destination index. The button\n * at either end of the list renders disabled rather than missing, so the\n * cluster keeps a constant width down a long list.\n */\n onMove?: (to: number) => void;\n /** Offers the duplicate button. */\n onDuplicate?: () => void;\n /** Offers the remove button. */\n onRemove?: () => void;\n /** Consumer actions, rendered before the built-in ones. */\n leading?: ReactNode;\n /**\n * Reveal on row hover / focus-within. Defaults to true, which requires\n * `group` on the row container — a long list is then not a wall of\n * permanently dim icons, while keyboard users still see the actions the\n * moment they arrive. Pass false for a row that must always show them.\n */\n reveal?: boolean;\n size?: SizeToken;\n className?: string;\n}\n\nexport function ItemActions({\n label,\n index,\n count,\n onMove,\n onDuplicate,\n onRemove,\n leading,\n reveal = true,\n size = \"md\",\n className,\n}: ItemActionsProps) {\n const action = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\n return (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5\",\n reveal &&\n \"opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100 [@media(hover:none)]:opacity-100\",\n className,\n )}\n >\n {leading}\n {onMove && (\n <>\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={index === 0}\n className={action}\n onClick={() => onMove(index - 1)}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={index >= count - 1}\n className={action}\n onClick={() => onMove(index + 1)}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n </>\n )}\n {onDuplicate && (\n <button\n type=\"button\"\n aria-label={`Duplicate ${label}`}\n className={action}\n onClick={onDuplicate}\n >\n <Icon icon={UiCopy} className=\"text-sm\" />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n className={cn(action, \"hover:bg-destructive/10 hover:text-destructive\")}\n onClick={onRemove}\n data-item-index={index}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAyCA,SAAgB,YAAY,EAC1B,OACA,OACA,OACA,QACA,aACA,UACA,SACA,SAAS,MACT,OAAO,MACP,aACmB;CACnB,MAAM,SAAS,GACb,iJACA,mBAAmB,KACrB;CACA,OACE,qBAAC,OAAD;EACE,WAAW,GACT,8CACA,UACE,kHACF,SACF;EANF,UAAA;GAQG;GACA,UACC,qBAAAA,UAAA,EAAA,UAAA,CACE,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,QAAQ,MAAM;IAC1B,UAAU,UAAU;IACpB,WAAW;IACX,eAAe,OAAO,QAAQ,CAAC;IAE/B,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAa,WAAU;IAAW,CAAA;GACxC,CAAA,GACR,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,QAAQ,MAAM;IAC1B,UAAU,SAAS,QAAQ;IAC3B,WAAW;IACX,eAAe,OAAO,QAAQ,CAAC;IAE/B,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAe,WAAU;IAAW,CAAA;GAC1C,CAAA,CACR,EAAA,CAAA;GAEH,eACC,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,aAAa;IACzB,WAAW;IACX,SAAS;IAET,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAQ,WAAU;IAAW,CAAA;GACnC,CAAA;GAET,YACC,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,UAAU;IACtB,WAAW,GAAG,QAAQ,gDAAgD;IACtE,SAAS;IACT,mBAAiB;IAEjB,UAAA,oBAAC,MAAD;KAAM,MAAM;KAAS,WAAU;IAAW,CAAA;GACpC,CAAA;EAEP;;AAET"}
|
|
@@ -1,22 +1,52 @@
|
|
|
1
1
|
const require_utils = require("../lib/utils.cjs");
|
|
2
2
|
const require_button = require("./button.cjs");
|
|
3
3
|
const require_Checkbox = require("./Checkbox.cjs");
|
|
4
|
+
const require_list_menu_virtual = require("./list-menu-virtual.cjs");
|
|
4
5
|
const require_use_list_menu_selection = require("./use-list-menu-selection.cjs");
|
|
6
|
+
let react = require("react");
|
|
5
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
8
|
// src/components/ListMenu.tsx
|
|
7
|
-
function ListMenu({ className, selection, showCheckboxes = true, children, ...props }) {
|
|
9
|
+
function ListMenu({ className, selection, showCheckboxes = true, virtualize = false, children, ...props }) {
|
|
10
|
+
const [scrollElement, setScrollElement] = (0, react.useState)(null);
|
|
11
|
+
const [contentElement, setContentElement] = (0, react.useState)(null);
|
|
12
|
+
const estimateRowHeight = typeof virtualize === "object" ? virtualize.estimateRowHeight ?? 40 : 40;
|
|
13
|
+
const overscan = typeof virtualize === "object" ? virtualize.overscan ?? 8 : 8;
|
|
14
|
+
const enabled = Boolean(virtualize);
|
|
15
|
+
if (!Number.isFinite(estimateRowHeight) || estimateRowHeight <= 0 || !Number.isInteger(overscan) || overscan < 0) throw new Error("ListMenu virtualization requires a positive row height and a non-negative integer overscan");
|
|
16
|
+
const virtual = (0, react.useMemo)(() => enabled ? {
|
|
17
|
+
scrollElement,
|
|
18
|
+
contentElement,
|
|
19
|
+
estimateRowHeight,
|
|
20
|
+
overscan
|
|
21
|
+
} : null, [
|
|
22
|
+
enabled,
|
|
23
|
+
scrollElement,
|
|
24
|
+
contentElement,
|
|
25
|
+
estimateRowHeight,
|
|
26
|
+
overscan
|
|
27
|
+
]);
|
|
8
28
|
const menu = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
29
|
+
ref: enabled ? setContentElement : void 0,
|
|
9
30
|
className: require_utils.cn("divide-y divide-border", className),
|
|
10
31
|
...props,
|
|
11
32
|
children
|
|
12
33
|
});
|
|
13
|
-
|
|
34
|
+
const body = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_list_menu_virtual.ListMenuVirtualContext.Provider, {
|
|
35
|
+
value: virtual,
|
|
36
|
+
children: virtualize ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
37
|
+
ref: setScrollElement,
|
|
38
|
+
"data-slot": "list-menu-scroll",
|
|
39
|
+
className: "h-full overflow-y-auto",
|
|
40
|
+
children: menu
|
|
41
|
+
}) : menu
|
|
42
|
+
});
|
|
43
|
+
if (!selection) return body;
|
|
14
44
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_use_list_menu_selection.ListMenuSelectionContext.Provider, {
|
|
15
45
|
value: {
|
|
16
46
|
selection,
|
|
17
47
|
showCheckboxes
|
|
18
48
|
},
|
|
19
|
-
children:
|
|
49
|
+
children: body
|
|
20
50
|
});
|
|
21
51
|
}
|
|
22
52
|
function ListMenuSection({ className, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListMenu.cjs","names":["cn","ListMenuSelectionContext","useListMenuSelectionContext","Checkbox","Button"],"sources":["../../src/components/ListMenu.tsx"],"sourcesContent":["import type { HTMLAttributes, MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./Checkbox\";\nimport {\n ListMenuSelectionContext,\n useListMenuSelectionContext,\n type ListMenuSelection,\n} from \"./use-list-menu-selection\";\n\nexport type ListMenuProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * Enables multi-select. Pass the object returned by `useListMenuSelection`;\n * rows that set `itemKey` then become selectable via checkbox or Shift+Click.\n */\n selection?: ListMenuSelection;\n /** Render a leading checkbox on selectable rows (default true when `selection` is set). */\n showCheckboxes?: boolean;\n};\n\nexport function ListMenu({\n className,\n selection,\n showCheckboxes = true,\n children,\n ...props\n}: ListMenuProps) {\n const menu = (\n <div className={cn(\"divide-y divide-border\", className)} {...props}>\n {children}\n </div>\n );\n if (!selection) return menu;\n return (\n <ListMenuSelectionContext.Provider value={{ selection, showCheckboxes }}>\n {menu}\n </ListMenuSelectionContext.Provider>\n );\n}\n\nexport type ListMenuSectionProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuSection({ className, ...props }: ListMenuSectionProps) {\n return <div className={className} {...props} />;\n}\n\nexport type ListMenuHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuHeader({ className, ...props }: ListMenuHeaderProps) {\n return (\n <div\n className={cn(\n \"sticky top-0 z-10 flex w-full items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ListMenuItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Row density. Compact is intended for single-line values and controls. */\n variant?: \"default\" | \"compact\";\n /** Applies the primary selected-row treatment used for the open/detail row. */\n active?: boolean;\n /** Applies the softer selected treatment used for checkbox or multi-select rows. */\n selected?: boolean;\n /** Left-border class when neither active nor selected. */\n accentClassName?: string;\n /** Whether the row gets pointer and hover affordances. */\n interactive?: boolean;\n /** Stable key that opts the row into `ListMenu` multi-select. */\n itemKey?: string;\n /** Hide the leading checkbox for this row even when selection is enabled. */\n hideCheckbox?: boolean;\n /** Accessible name for the leading checkbox. Defaults to \"Select item\". */\n checkboxLabel?: string;\n};\n\nexport function ListMenuItem({\n variant = \"default\",\n active = false,\n selected = false,\n accentClassName = \"border-transparent\",\n interactive = true,\n itemKey,\n hideCheckbox = false,\n checkboxLabel = \"Select item\",\n className,\n onClick,\n children,\n ...props\n}: ListMenuItemProps) {\n const ctx = useListMenuSelectionContext();\n const selectable = ctx !== null && itemKey !== undefined;\n const rowSelected = selectable ? ctx.selection.isSelected(itemKey) : selected;\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (selectable && event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n return;\n }\n onClick?.(event);\n };\n\n const showCheckbox = selectable && ctx.showCheckboxes && !hideCheckbox;\n const body =\n selectable && showCheckbox ? (\n <div className=\"flex items-start gap-2\">\n <Checkbox\n className=\"mt-0.5\"\n checked={rowSelected}\n aria-label={checkboxLabel}\n onClick={(event) => {\n event.stopPropagation();\n if (event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n }\n }}\n onChange={() => ctx.selection.toggle(itemKey)}\n />\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n className={cn(\n \"min-w-0 overflow-hidden border-l-2 transition-colors\",\n interactive && \"cursor-pointer\",\n active\n ? \"border-primary bg-primary/10\"\n : rowSelected\n ? \"border-primary/40 bg-primary/5 hover:bg-primary/10\"\n : cn(accentClassName, interactive && \"hover:bg-muted\"),\n variant === \"compact\" && \"px-density-2 py-1 text-xs\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {body}\n </div>\n );\n}\n\nexport type ListMenuAction = {\n label: ReactNode;\n /** Receives the currently selected keys (ordered as in the menu). */\n onClick: (selectedKeys: string[]) => void;\n icon?: ReactNode;\n disabled?: boolean;\n variant?: ButtonProps[\"variant\"];\n};\n\nexport type ListMenuActionBarProps = HTMLAttributes<HTMLDivElement> & {\n /** Selection to act on; falls back to the enclosing `ListMenu` selection context. */\n selection?: ListMenuSelection;\n /** Bulk actions executed across every selected key. */\n actions?: ListMenuAction[];\n /** Override the \"{n} selected\" summary. */\n renderLabel?: (count: number) => ReactNode;\n /** Hide the whole bar when nothing is selected (default true). */\n hideWhenEmpty?: boolean;\n /** Label for the clear button; pass null to hide it. */\n clearLabel?: ReactNode;\n};\n\nexport function ListMenuActionBar({\n selection: selectionProp,\n actions = [],\n renderLabel,\n hideWhenEmpty = true,\n clearLabel = \"Clear\",\n className,\n children,\n ...props\n}: ListMenuActionBarProps) {\n const ctx = useListMenuSelectionContext();\n const selection = selectionProp ?? ctx?.selection;\n if (!selection) return null;\n const { count } = selection;\n if (hideWhenEmpty && count === 0) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n >\n <span className=\"text-sm font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((action, i) => (\n <Button\n key={i}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || count === 0}\n onClick={() => action.onClick(selection.selectedKeys)}\n >\n {action.icon}\n {action.label}\n </Button>\n ))}\n {children}\n {clearLabel !== null && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => selection.clear()}>\n {clearLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListMenu.cjs","names":["useState","useMemo","cn","ListMenuVirtualContext","ListMenuSelectionContext","useListMenuSelectionContext","Checkbox","Button"],"sources":["../../src/components/ListMenu.tsx"],"sourcesContent":["import { useMemo, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./Checkbox\";\nimport { ListMenuVirtualContext, type ListMenuVirtualOptions } from \"./list-menu-virtual\";\nimport {\n ListMenuSelectionContext,\n useListMenuSelectionContext,\n type ListMenuSelection,\n} from \"./use-list-menu-selection\";\n\nexport type ListMenuProps = HTMLAttributes<HTMLDivElement> & {\n /** Window ListMenuItems inside this menu's bounded scroll viewport. */\n virtualize?: boolean | ListMenuVirtualOptions;\n /**\n * Enables multi-select. Pass the object returned by `useListMenuSelection`;\n * rows that set `itemKey` then become selectable via checkbox or Shift+Click.\n */\n selection?: ListMenuSelection;\n /** Render a leading checkbox on selectable rows (default true when `selection` is set). */\n showCheckboxes?: boolean;\n};\n\nexport function ListMenu({\n className,\n selection,\n showCheckboxes = true,\n virtualize = false,\n children,\n ...props\n}: ListMenuProps) {\n const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null);\n const [contentElement, setContentElement] = useState<HTMLDivElement | null>(null);\n const estimateRowHeight = typeof virtualize === \"object\" ? virtualize.estimateRowHeight ?? 40 : 40;\n const overscan = typeof virtualize === \"object\" ? virtualize.overscan ?? 8 : 8;\n const enabled = Boolean(virtualize);\n if (!Number.isFinite(estimateRowHeight) || estimateRowHeight <= 0 || !Number.isInteger(overscan) || overscan < 0) {\n throw new Error(\"ListMenu virtualization requires a positive row height and a non-negative integer overscan\");\n }\n const virtual = useMemo(\n () => enabled ? { scrollElement, contentElement, estimateRowHeight, overscan } : null,\n [enabled, scrollElement, contentElement, estimateRowHeight, overscan],\n );\n const menu = (\n <div ref={enabled ? setContentElement : undefined} className={cn(\"divide-y divide-border\", className)} {...props}>\n {children}\n </div>\n );\n const body = (\n <ListMenuVirtualContext.Provider value={virtual}>\n {virtualize ? (\n <div ref={setScrollElement} data-slot=\"list-menu-scroll\" className=\"h-full overflow-y-auto\">\n {menu}\n </div>\n ) : menu}\n </ListMenuVirtualContext.Provider>\n );\n if (!selection) return body;\n return (\n <ListMenuSelectionContext.Provider value={{ selection, showCheckboxes }}>\n {body}\n </ListMenuSelectionContext.Provider>\n );\n}\n\nexport type ListMenuSectionProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuSection({ className, ...props }: ListMenuSectionProps) {\n return <div className={className} {...props} />;\n}\n\nexport type ListMenuHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuHeader({ className, ...props }: ListMenuHeaderProps) {\n return (\n <div\n className={cn(\n \"sticky top-0 z-10 flex w-full items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ListMenuItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Row density. Compact is intended for single-line values and controls. */\n variant?: \"default\" | \"compact\";\n /** Applies the primary selected-row treatment used for the open/detail row. */\n active?: boolean;\n /** Applies the softer selected treatment used for checkbox or multi-select rows. */\n selected?: boolean;\n /** Left-border class when neither active nor selected. */\n accentClassName?: string;\n /** Whether the row gets pointer and hover affordances. */\n interactive?: boolean;\n /** Stable key that opts the row into `ListMenu` multi-select. */\n itemKey?: string;\n /** Hide the leading checkbox for this row even when selection is enabled. */\n hideCheckbox?: boolean;\n /** Accessible name for the leading checkbox. Defaults to \"Select item\". */\n checkboxLabel?: string;\n};\n\nexport function ListMenuItem({\n variant = \"default\",\n active = false,\n selected = false,\n accentClassName = \"border-transparent\",\n interactive = true,\n itemKey,\n hideCheckbox = false,\n checkboxLabel = \"Select item\",\n className,\n onClick,\n children,\n ...props\n}: ListMenuItemProps) {\n const ctx = useListMenuSelectionContext();\n const selectable = ctx !== null && itemKey !== undefined;\n const rowSelected = selectable ? ctx.selection.isSelected(itemKey) : selected;\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (selectable && event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n return;\n }\n onClick?.(event);\n };\n\n const showCheckbox = selectable && ctx.showCheckboxes && !hideCheckbox;\n const body =\n selectable && showCheckbox ? (\n <div className=\"flex items-start gap-2\">\n <Checkbox\n className=\"mt-0.5\"\n checked={rowSelected}\n aria-label={checkboxLabel}\n onClick={(event) => {\n event.stopPropagation();\n if (event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n }\n }}\n onChange={() => ctx.selection.toggle(itemKey)}\n />\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n className={cn(\n \"min-w-0 overflow-hidden border-l-2 transition-colors\",\n interactive && \"cursor-pointer\",\n active\n ? \"border-primary bg-primary/10\"\n : rowSelected\n ? \"border-primary/40 bg-primary/5 hover:bg-primary/10\"\n : cn(accentClassName, interactive && \"hover:bg-muted\"),\n variant === \"compact\" && \"px-density-2 py-1 text-xs\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {body}\n </div>\n );\n}\n\nexport type ListMenuAction = {\n label: ReactNode;\n /** Receives the currently selected keys (ordered as in the menu). */\n onClick: (selectedKeys: string[]) => void;\n icon?: ReactNode;\n disabled?: boolean;\n variant?: ButtonProps[\"variant\"];\n};\n\nexport type ListMenuActionBarProps = HTMLAttributes<HTMLDivElement> & {\n /** Selection to act on; falls back to the enclosing `ListMenu` selection context. */\n selection?: ListMenuSelection;\n /** Bulk actions executed across every selected key. */\n actions?: ListMenuAction[];\n /** Override the \"{n} selected\" summary. */\n renderLabel?: (count: number) => ReactNode;\n /** Hide the whole bar when nothing is selected (default true). */\n hideWhenEmpty?: boolean;\n /** Label for the clear button; pass null to hide it. */\n clearLabel?: ReactNode;\n};\n\nexport function ListMenuActionBar({\n selection: selectionProp,\n actions = [],\n renderLabel,\n hideWhenEmpty = true,\n clearLabel = \"Clear\",\n className,\n children,\n ...props\n}: ListMenuActionBarProps) {\n const ctx = useListMenuSelectionContext();\n const selection = selectionProp ?? ctx?.selection;\n if (!selection) return null;\n const { count } = selection;\n if (hideWhenEmpty && count === 0) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n >\n <span className=\"text-sm font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((action, i) => (\n <Button\n key={i}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || count === 0}\n onClick={() => action.onClick(selection.selectedKeys)}\n >\n {action.icon}\n {action.label}\n </Button>\n ))}\n {children}\n {clearLabel !== null && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => selection.clear()}>\n {clearLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAuBA,SAAgB,SAAS,EACvB,WACA,WACA,iBAAiB,MACjB,aAAa,OACb,UACA,GAAG,SACa;CAChB,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAgC,IAAI;CAC9E,MAAM,CAAC,gBAAgB,sBAAA,GAAqBA,MAAAA,SAAAA,CAAgC,IAAI;CAChF,MAAM,oBAAoB,OAAO,eAAe,WAAW,WAAW,qBAAqB,KAAK;CAChG,MAAM,WAAW,OAAO,eAAe,WAAW,WAAW,YAAY,IAAI;CAC7E,MAAM,UAAU,QAAQ,UAAU;CAClC,IAAI,CAAC,OAAO,SAAS,iBAAiB,KAAK,qBAAqB,KAAK,CAAC,OAAO,UAAU,QAAQ,KAAK,WAAW,GAC7G,MAAM,IAAI,MAAM,4FAA4F;CAE9G,MAAM,WAAA,GAAUC,MAAAA,QAAAA,OACR,UAAU;EAAE;EAAe;EAAgB;EAAmB;CAAS,IAAI,MACjF;EAAC;EAAS;EAAe;EAAgB;EAAmB;CAAQ,CACtE;CACA,MAAM,OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,KAAK,UAAU,oBAAoB,KAAA;EAAW,WAAWC,cAAAA,GAAG,0BAA0B,SAAS;EAAG,GAAI;EACxG;CACE,CAAA;CAEP,MAAM,OACJ,iBAAA,GAAA,kBAAA,IAAA,CAACC,0BAAAA,uBAAuB,UAAxB;EAAiC,OAAO;EACrC,UAAA,aACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,KAAK;GAAkB,aAAU;GAAmB,WAAU;GAChE,UAAA;EACE,CAAA,IACH;CAC2B,CAAA;CAEnC,IAAI,CAAC,WAAW,OAAO;CACvB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,gCAAAA,yBAAyB,UAA1B;EAAmC,OAAO;GAAE;GAAW;EAAe;EACnE,UAAA;CACgC,CAAA;AAEvC;AAIA,SAAgB,gBAAgB,EAAE,WAAW,GAAG,SAA+B;CAC7E,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAgB;EAAW,GAAI;CAAQ,CAAA;AAChD;AAIA,SAAgB,eAAe,EAAE,WAAW,GAAG,SAA8B;CAC3E,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAWF,cAAAA,GACT,gGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;AAqBA,SAAgB,aAAa,EAC3B,UAAU,WACV,SAAS,OACT,WAAW,OACX,kBAAkB,sBAClB,cAAc,MACd,SACA,eAAe,OACf,gBAAgB,eAChB,WACA,SACA,UACA,GAAG,SACiB;CACpB,MAAM,MAAMG,gCAAAA,4BAA4B;CACxC,MAAM,aAAa,QAAQ,QAAQ,YAAY,KAAA;CAC/C,MAAM,cAAc,aAAa,IAAI,UAAU,WAAW,OAAO,IAAI;CAErE,MAAM,eAAe,UAAsC;EACzD,IAAI,cAAc,MAAM,UAAU;GAChC,MAAM,eAAe;GACrB,IAAI,UAAU,OAAO,SAAS,EAAE,UAAU,KAAK,CAAC;GAChD;EACF;EACA,UAAU,KAAK;CACjB;CAEA,MAAM,eAAe,cAAc,IAAI,kBAAkB,CAAC;CAC1D,MAAM,OACJ,cAAc,eACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iBAAAA,UAAD;GACE,WAAU;GACV,SAAS;GACT,cAAY;GACZ,UAAU,UAAU;IAClB,MAAM,gBAAgB;IACtB,IAAI,MAAM,UAAU;KAClB,MAAM,eAAe;KACrB,IAAI,UAAU,OAAO,SAAS,EAAE,UAAU,KAAK,CAAC;IAClD;GACF;GACA,gBAAgB,IAAI,UAAU,OAAO,OAAO;EAC7C,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;GAAK,WAAU;GAAkB;EAAc,CAAA,CAC5C;CAEL,CAAA,IAAA;CAGJ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EACE,WAAWJ,cAAAA,GACT,wDACA,eAAe,kBACf,SACI,iCACA,cACE,uDACAA,cAAAA,GAAG,iBAAiB,eAAe,gBAAgB,GACzD,YAAY,aAAa,6BACzB,SACF;EACA,SAAS;EACT,GAAI;EAEH,UAAA;CACE,CAAA;AAET;AAwBA,SAAgB,kBAAkB,EAChC,WAAW,eACX,UAAU,CAAC,GACX,aACA,gBAAgB,MAChB,aAAa,SACb,WACA,UACA,GAAG,SACsB;CACzB,MAAM,MAAMG,gCAAAA,4BAA4B;CACxC,MAAM,YAAY,iBAAiB,KAAK;CACxC,IAAI,CAAC,WAAW,OAAO;CACvB,MAAM,EAAE,UAAU;CAClB,IAAI,iBAAiB,UAAU,GAAG,OAAO;CAEzC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EACE,WAAWH,cAAAA,GACT,uEACA,SACF;EACA,GAAI;EALN,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GACb,UAAA,cAAc,YAAY,KAAK,IAAI,GAAG,MAAM;EACzC,CAAA,GACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG,QAAQ,KAAK,QAAQ,MACpB,iBAAA,GAAA,kBAAA,KAAA,CAACK,eAAAA,QAAD;KAEE,MAAK;KACL,MAAK;KACL,SAAS,OAAO,WAAW;KAC3B,UAAU,OAAO,YAAY,UAAU;KACvC,eAAe,OAAO,QAAQ,UAAU,YAAY;KANtD,UAAA,CAQG,OAAO,MACP,OAAO,KACF;IATD,GAAA,CASC,CACT;IACA;IACA,eAAe,QACd,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,MAAK;KAAS,MAAK;KAAK,SAAQ;KAAQ,eAAe,UAAU,MAAM;KAC5E,UAAA;IACK,CAAA;GAEP;EACF,CAAA,CAAA;;AAET"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { HTMLAttributes, ReactNode } from 'react';
|
|
2
2
|
import { ButtonProps } from './button.js';
|
|
3
|
+
import { ListMenuVirtualOptions } from './list-menu-virtual.js';
|
|
3
4
|
import { ListMenuSelection } from './use-list-menu-selection.js';
|
|
4
5
|
export type ListMenuProps = HTMLAttributes<HTMLDivElement> & {
|
|
6
|
+
/** Window ListMenuItems inside this menu's bounded scroll viewport. */
|
|
7
|
+
virtualize?: boolean | ListMenuVirtualOptions;
|
|
5
8
|
/**
|
|
6
9
|
* Enables multi-select. Pass the object returned by `useListMenuSelection`;
|
|
7
10
|
* rows that set `itemKey` then become selectable via checkbox or Shift+Click.
|
|
@@ -10,7 +13,7 @@ export type ListMenuProps = HTMLAttributes<HTMLDivElement> & {
|
|
|
10
13
|
/** Render a leading checkbox on selectable rows (default true when `selection` is set). */
|
|
11
14
|
showCheckboxes?: boolean;
|
|
12
15
|
};
|
|
13
|
-
export declare function ListMenu({ className, selection, showCheckboxes, children, ...props }: ListMenuProps): import("react").JSX.Element;
|
|
16
|
+
export declare function ListMenu({ className, selection, showCheckboxes, virtualize, children, ...props }: ListMenuProps): import("react").JSX.Element;
|
|
14
17
|
export type ListMenuSectionProps = HTMLAttributes<HTMLDivElement>;
|
|
15
18
|
export declare function ListMenuSection({ className, ...props }: ListMenuSectionProps): import("react").JSX.Element;
|
|
16
19
|
export type ListMenuHeaderProps = HTMLAttributes<HTMLDivElement>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListMenu.d.ts","sourceRoot":"","sources":["../../src/components/ListMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ListMenu.d.ts","sourceRoot":"","sources":["../../src/components/ListMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,52 @@
|
|
|
1
1
|
import { cn } from "../lib/utils.js";
|
|
2
2
|
import { Button } from "./button.js";
|
|
3
3
|
import { Checkbox } from "./Checkbox.js";
|
|
4
|
+
import { ListMenuVirtualContext } from "./list-menu-virtual.js";
|
|
4
5
|
import { ListMenuSelectionContext, useListMenuSelectionContext } from "./use-list-menu-selection.js";
|
|
6
|
+
import { useMemo, useState } from "react";
|
|
5
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
8
|
// src/components/ListMenu.tsx
|
|
7
|
-
function ListMenu({ className, selection, showCheckboxes = true, children, ...props }) {
|
|
9
|
+
function ListMenu({ className, selection, showCheckboxes = true, virtualize = false, children, ...props }) {
|
|
10
|
+
const [scrollElement, setScrollElement] = useState(null);
|
|
11
|
+
const [contentElement, setContentElement] = useState(null);
|
|
12
|
+
const estimateRowHeight = typeof virtualize === "object" ? virtualize.estimateRowHeight ?? 40 : 40;
|
|
13
|
+
const overscan = typeof virtualize === "object" ? virtualize.overscan ?? 8 : 8;
|
|
14
|
+
const enabled = Boolean(virtualize);
|
|
15
|
+
if (!Number.isFinite(estimateRowHeight) || estimateRowHeight <= 0 || !Number.isInteger(overscan) || overscan < 0) throw new Error("ListMenu virtualization requires a positive row height and a non-negative integer overscan");
|
|
16
|
+
const virtual = useMemo(() => enabled ? {
|
|
17
|
+
scrollElement,
|
|
18
|
+
contentElement,
|
|
19
|
+
estimateRowHeight,
|
|
20
|
+
overscan
|
|
21
|
+
} : null, [
|
|
22
|
+
enabled,
|
|
23
|
+
scrollElement,
|
|
24
|
+
contentElement,
|
|
25
|
+
estimateRowHeight,
|
|
26
|
+
overscan
|
|
27
|
+
]);
|
|
8
28
|
const menu = /* @__PURE__ */ jsx("div", {
|
|
29
|
+
ref: enabled ? setContentElement : void 0,
|
|
9
30
|
className: cn("divide-y divide-border", className),
|
|
10
31
|
...props,
|
|
11
32
|
children
|
|
12
33
|
});
|
|
13
|
-
|
|
34
|
+
const body = /* @__PURE__ */ jsx(ListMenuVirtualContext.Provider, {
|
|
35
|
+
value: virtual,
|
|
36
|
+
children: virtualize ? /* @__PURE__ */ jsx("div", {
|
|
37
|
+
ref: setScrollElement,
|
|
38
|
+
"data-slot": "list-menu-scroll",
|
|
39
|
+
className: "h-full overflow-y-auto",
|
|
40
|
+
children: menu
|
|
41
|
+
}) : menu
|
|
42
|
+
});
|
|
43
|
+
if (!selection) return body;
|
|
14
44
|
return /* @__PURE__ */ jsx(ListMenuSelectionContext.Provider, {
|
|
15
45
|
value: {
|
|
16
46
|
selection,
|
|
17
47
|
showCheckboxes
|
|
18
48
|
},
|
|
19
|
-
children:
|
|
49
|
+
children: body
|
|
20
50
|
});
|
|
21
51
|
}
|
|
22
52
|
function ListMenuSection({ className, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListMenu.js","names":[],"sources":["../../src/components/ListMenu.tsx"],"sourcesContent":["import type { HTMLAttributes, MouseEvent, ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./Checkbox\";\nimport {\n ListMenuSelectionContext,\n useListMenuSelectionContext,\n type ListMenuSelection,\n} from \"./use-list-menu-selection\";\n\nexport type ListMenuProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * Enables multi-select. Pass the object returned by `useListMenuSelection`;\n * rows that set `itemKey` then become selectable via checkbox or Shift+Click.\n */\n selection?: ListMenuSelection;\n /** Render a leading checkbox on selectable rows (default true when `selection` is set). */\n showCheckboxes?: boolean;\n};\n\nexport function ListMenu({\n className,\n selection,\n showCheckboxes = true,\n children,\n ...props\n}: ListMenuProps) {\n const menu = (\n <div className={cn(\"divide-y divide-border\", className)} {...props}>\n {children}\n </div>\n );\n if (!selection) return menu;\n return (\n <ListMenuSelectionContext.Provider value={{ selection, showCheckboxes }}>\n {menu}\n </ListMenuSelectionContext.Provider>\n );\n}\n\nexport type ListMenuSectionProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuSection({ className, ...props }: ListMenuSectionProps) {\n return <div className={className} {...props} />;\n}\n\nexport type ListMenuHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuHeader({ className, ...props }: ListMenuHeaderProps) {\n return (\n <div\n className={cn(\n \"sticky top-0 z-10 flex w-full items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ListMenuItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Row density. Compact is intended for single-line values and controls. */\n variant?: \"default\" | \"compact\";\n /** Applies the primary selected-row treatment used for the open/detail row. */\n active?: boolean;\n /** Applies the softer selected treatment used for checkbox or multi-select rows. */\n selected?: boolean;\n /** Left-border class when neither active nor selected. */\n accentClassName?: string;\n /** Whether the row gets pointer and hover affordances. */\n interactive?: boolean;\n /** Stable key that opts the row into `ListMenu` multi-select. */\n itemKey?: string;\n /** Hide the leading checkbox for this row even when selection is enabled. */\n hideCheckbox?: boolean;\n /** Accessible name for the leading checkbox. Defaults to \"Select item\". */\n checkboxLabel?: string;\n};\n\nexport function ListMenuItem({\n variant = \"default\",\n active = false,\n selected = false,\n accentClassName = \"border-transparent\",\n interactive = true,\n itemKey,\n hideCheckbox = false,\n checkboxLabel = \"Select item\",\n className,\n onClick,\n children,\n ...props\n}: ListMenuItemProps) {\n const ctx = useListMenuSelectionContext();\n const selectable = ctx !== null && itemKey !== undefined;\n const rowSelected = selectable ? ctx.selection.isSelected(itemKey) : selected;\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (selectable && event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n return;\n }\n onClick?.(event);\n };\n\n const showCheckbox = selectable && ctx.showCheckboxes && !hideCheckbox;\n const body =\n selectable && showCheckbox ? (\n <div className=\"flex items-start gap-2\">\n <Checkbox\n className=\"mt-0.5\"\n checked={rowSelected}\n aria-label={checkboxLabel}\n onClick={(event) => {\n event.stopPropagation();\n if (event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n }\n }}\n onChange={() => ctx.selection.toggle(itemKey)}\n />\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n className={cn(\n \"min-w-0 overflow-hidden border-l-2 transition-colors\",\n interactive && \"cursor-pointer\",\n active\n ? \"border-primary bg-primary/10\"\n : rowSelected\n ? \"border-primary/40 bg-primary/5 hover:bg-primary/10\"\n : cn(accentClassName, interactive && \"hover:bg-muted\"),\n variant === \"compact\" && \"px-density-2 py-1 text-xs\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {body}\n </div>\n );\n}\n\nexport type ListMenuAction = {\n label: ReactNode;\n /** Receives the currently selected keys (ordered as in the menu). */\n onClick: (selectedKeys: string[]) => void;\n icon?: ReactNode;\n disabled?: boolean;\n variant?: ButtonProps[\"variant\"];\n};\n\nexport type ListMenuActionBarProps = HTMLAttributes<HTMLDivElement> & {\n /** Selection to act on; falls back to the enclosing `ListMenu` selection context. */\n selection?: ListMenuSelection;\n /** Bulk actions executed across every selected key. */\n actions?: ListMenuAction[];\n /** Override the \"{n} selected\" summary. */\n renderLabel?: (count: number) => ReactNode;\n /** Hide the whole bar when nothing is selected (default true). */\n hideWhenEmpty?: boolean;\n /** Label for the clear button; pass null to hide it. */\n clearLabel?: ReactNode;\n};\n\nexport function ListMenuActionBar({\n selection: selectionProp,\n actions = [],\n renderLabel,\n hideWhenEmpty = true,\n clearLabel = \"Clear\",\n className,\n children,\n ...props\n}: ListMenuActionBarProps) {\n const ctx = useListMenuSelectionContext();\n const selection = selectionProp ?? ctx?.selection;\n if (!selection) return null;\n const { count } = selection;\n if (hideWhenEmpty && count === 0) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n >\n <span className=\"text-sm font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((action, i) => (\n <Button\n key={i}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || count === 0}\n onClick={() => action.onClick(selection.selectedKeys)}\n >\n {action.icon}\n {action.label}\n </Button>\n ))}\n {children}\n {clearLabel !== null && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => selection.clear()}>\n {clearLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListMenu.js","names":[],"sources":["../../src/components/ListMenu.tsx"],"sourcesContent":["import { useMemo, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./Checkbox\";\nimport { ListMenuVirtualContext, type ListMenuVirtualOptions } from \"./list-menu-virtual\";\nimport {\n ListMenuSelectionContext,\n useListMenuSelectionContext,\n type ListMenuSelection,\n} from \"./use-list-menu-selection\";\n\nexport type ListMenuProps = HTMLAttributes<HTMLDivElement> & {\n /** Window ListMenuItems inside this menu's bounded scroll viewport. */\n virtualize?: boolean | ListMenuVirtualOptions;\n /**\n * Enables multi-select. Pass the object returned by `useListMenuSelection`;\n * rows that set `itemKey` then become selectable via checkbox or Shift+Click.\n */\n selection?: ListMenuSelection;\n /** Render a leading checkbox on selectable rows (default true when `selection` is set). */\n showCheckboxes?: boolean;\n};\n\nexport function ListMenu({\n className,\n selection,\n showCheckboxes = true,\n virtualize = false,\n children,\n ...props\n}: ListMenuProps) {\n const [scrollElement, setScrollElement] = useState<HTMLDivElement | null>(null);\n const [contentElement, setContentElement] = useState<HTMLDivElement | null>(null);\n const estimateRowHeight = typeof virtualize === \"object\" ? virtualize.estimateRowHeight ?? 40 : 40;\n const overscan = typeof virtualize === \"object\" ? virtualize.overscan ?? 8 : 8;\n const enabled = Boolean(virtualize);\n if (!Number.isFinite(estimateRowHeight) || estimateRowHeight <= 0 || !Number.isInteger(overscan) || overscan < 0) {\n throw new Error(\"ListMenu virtualization requires a positive row height and a non-negative integer overscan\");\n }\n const virtual = useMemo(\n () => enabled ? { scrollElement, contentElement, estimateRowHeight, overscan } : null,\n [enabled, scrollElement, contentElement, estimateRowHeight, overscan],\n );\n const menu = (\n <div ref={enabled ? setContentElement : undefined} className={cn(\"divide-y divide-border\", className)} {...props}>\n {children}\n </div>\n );\n const body = (\n <ListMenuVirtualContext.Provider value={virtual}>\n {virtualize ? (\n <div ref={setScrollElement} data-slot=\"list-menu-scroll\" className=\"h-full overflow-y-auto\">\n {menu}\n </div>\n ) : menu}\n </ListMenuVirtualContext.Provider>\n );\n if (!selection) return body;\n return (\n <ListMenuSelectionContext.Provider value={{ selection, showCheckboxes }}>\n {body}\n </ListMenuSelectionContext.Provider>\n );\n}\n\nexport type ListMenuSectionProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuSection({ className, ...props }: ListMenuSectionProps) {\n return <div className={className} {...props} />;\n}\n\nexport type ListMenuHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport function ListMenuHeader({ className, ...props }: ListMenuHeaderProps) {\n return (\n <div\n className={cn(\n \"sticky top-0 z-10 flex w-full items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ListMenuItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Row density. Compact is intended for single-line values and controls. */\n variant?: \"default\" | \"compact\";\n /** Applies the primary selected-row treatment used for the open/detail row. */\n active?: boolean;\n /** Applies the softer selected treatment used for checkbox or multi-select rows. */\n selected?: boolean;\n /** Left-border class when neither active nor selected. */\n accentClassName?: string;\n /** Whether the row gets pointer and hover affordances. */\n interactive?: boolean;\n /** Stable key that opts the row into `ListMenu` multi-select. */\n itemKey?: string;\n /** Hide the leading checkbox for this row even when selection is enabled. */\n hideCheckbox?: boolean;\n /** Accessible name for the leading checkbox. Defaults to \"Select item\". */\n checkboxLabel?: string;\n};\n\nexport function ListMenuItem({\n variant = \"default\",\n active = false,\n selected = false,\n accentClassName = \"border-transparent\",\n interactive = true,\n itemKey,\n hideCheckbox = false,\n checkboxLabel = \"Select item\",\n className,\n onClick,\n children,\n ...props\n}: ListMenuItemProps) {\n const ctx = useListMenuSelectionContext();\n const selectable = ctx !== null && itemKey !== undefined;\n const rowSelected = selectable ? ctx.selection.isSelected(itemKey) : selected;\n\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (selectable && event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n return;\n }\n onClick?.(event);\n };\n\n const showCheckbox = selectable && ctx.showCheckboxes && !hideCheckbox;\n const body =\n selectable && showCheckbox ? (\n <div className=\"flex items-start gap-2\">\n <Checkbox\n className=\"mt-0.5\"\n checked={rowSelected}\n aria-label={checkboxLabel}\n onClick={(event) => {\n event.stopPropagation();\n if (event.shiftKey) {\n event.preventDefault();\n ctx.selection.toggle(itemKey, { shiftKey: true });\n }\n }}\n onChange={() => ctx.selection.toggle(itemKey)}\n />\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n className={cn(\n \"min-w-0 overflow-hidden border-l-2 transition-colors\",\n interactive && \"cursor-pointer\",\n active\n ? \"border-primary bg-primary/10\"\n : rowSelected\n ? \"border-primary/40 bg-primary/5 hover:bg-primary/10\"\n : cn(accentClassName, interactive && \"hover:bg-muted\"),\n variant === \"compact\" && \"px-density-2 py-1 text-xs\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {body}\n </div>\n );\n}\n\nexport type ListMenuAction = {\n label: ReactNode;\n /** Receives the currently selected keys (ordered as in the menu). */\n onClick: (selectedKeys: string[]) => void;\n icon?: ReactNode;\n disabled?: boolean;\n variant?: ButtonProps[\"variant\"];\n};\n\nexport type ListMenuActionBarProps = HTMLAttributes<HTMLDivElement> & {\n /** Selection to act on; falls back to the enclosing `ListMenu` selection context. */\n selection?: ListMenuSelection;\n /** Bulk actions executed across every selected key. */\n actions?: ListMenuAction[];\n /** Override the \"{n} selected\" summary. */\n renderLabel?: (count: number) => ReactNode;\n /** Hide the whole bar when nothing is selected (default true). */\n hideWhenEmpty?: boolean;\n /** Label for the clear button; pass null to hide it. */\n clearLabel?: ReactNode;\n};\n\nexport function ListMenuActionBar({\n selection: selectionProp,\n actions = [],\n renderLabel,\n hideWhenEmpty = true,\n clearLabel = \"Clear\",\n className,\n children,\n ...props\n}: ListMenuActionBarProps) {\n const ctx = useListMenuSelectionContext();\n const selection = selectionProp ?? ctx?.selection;\n if (!selection) return null;\n const { count } = selection;\n if (hideWhenEmpty && count === 0) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 border-b border-border bg-muted px-3 py-1.5\",\n className,\n )}\n {...props}\n >\n <span className=\"text-sm font-medium text-foreground\">\n {renderLabel ? renderLabel(count) : `${count} selected`}\n </span>\n <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((action, i) => (\n <Button\n key={i}\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || count === 0}\n onClick={() => action.onClick(selection.selectedKeys)}\n >\n {action.icon}\n {action.label}\n </Button>\n ))}\n {children}\n {clearLabel !== null && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => selection.clear()}>\n {clearLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const require_list_menu_virtual = require("./list-menu-virtual.cjs");
|
|
2
|
+
let react = require("react");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
let _tanstack_react_virtual = require("@tanstack/react-virtual");
|
|
5
|
+
// src/components/ListMenuItems.tsx
|
|
6
|
+
function ListMenuItems(props) {
|
|
7
|
+
const virtual = (0, react.useContext)(require_list_menu_virtual.ListMenuVirtualContext);
|
|
8
|
+
return virtual ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(VirtualMenuItems, {
|
|
9
|
+
...props,
|
|
10
|
+
virtual
|
|
11
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MenuItems, { ...props });
|
|
12
|
+
}
|
|
13
|
+
function MenuItems({ items, getItemKey, children }) {
|
|
14
|
+
return items.map((item, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: children(item, index) }, getItemKey(item)));
|
|
15
|
+
}
|
|
16
|
+
function VirtualMenuItems({ items, getItemKey, children, virtual }) {
|
|
17
|
+
const [container, setContainer] = (0, react.useState)(null);
|
|
18
|
+
const [layout, setLayout] = (0, react.useState)(null);
|
|
19
|
+
const { scrollElement, contentElement, estimateRowHeight, overscan } = virtual;
|
|
20
|
+
const scrollMargin = layout?.count === items.length && layout.estimate === estimateRowHeight ? layout.margin : null;
|
|
21
|
+
(0, react.useLayoutEffect)(() => {
|
|
22
|
+
if (!container || !scrollElement || !contentElement) return;
|
|
23
|
+
const measure = () => {
|
|
24
|
+
const margin = container.getBoundingClientRect().top - scrollElement.getBoundingClientRect().top + scrollElement.scrollTop - scrollElement.clientTop;
|
|
25
|
+
setLayout((previous) => previous?.count === items.length && previous.estimate === estimateRowHeight && previous.margin === margin ? previous : {
|
|
26
|
+
count: items.length,
|
|
27
|
+
estimate: estimateRowHeight,
|
|
28
|
+
margin
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
measure();
|
|
32
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
33
|
+
const observer = new ResizeObserver(measure);
|
|
34
|
+
observer.observe(contentElement);
|
|
35
|
+
observer.observe(scrollElement);
|
|
36
|
+
return () => observer.disconnect();
|
|
37
|
+
}, [
|
|
38
|
+
container,
|
|
39
|
+
scrollElement,
|
|
40
|
+
contentElement,
|
|
41
|
+
items.length,
|
|
42
|
+
estimateRowHeight
|
|
43
|
+
]);
|
|
44
|
+
const virtualizer = (0, _tanstack_react_virtual.useVirtualizer)({
|
|
45
|
+
count: items.length,
|
|
46
|
+
getScrollElement: () => scrollElement,
|
|
47
|
+
estimateSize: () => estimateRowHeight,
|
|
48
|
+
getItemKey: (index) => {
|
|
49
|
+
const item = items[index];
|
|
50
|
+
if (item === void 0) throw new Error(`ListMenu item ${index} is outside its collection`);
|
|
51
|
+
return getItemKey(item);
|
|
52
|
+
},
|
|
53
|
+
overscan,
|
|
54
|
+
scrollMargin: scrollMargin ?? 0,
|
|
55
|
+
enabled: scrollMargin !== null
|
|
56
|
+
});
|
|
57
|
+
const offset = virtualizer.scrollOffset ?? 0;
|
|
58
|
+
const height = virtualizer.scrollRect?.height ?? 0;
|
|
59
|
+
const visible = virtualizer.getVirtualItems().filter((item) => item.end >= offset - overscan * estimateRowHeight && item.start <= offset + height + overscan * estimateRowHeight);
|
|
60
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
61
|
+
ref: setContainer,
|
|
62
|
+
"data-slot": "list-menu-items",
|
|
63
|
+
className: "relative w-full",
|
|
64
|
+
style: { height: scrollMargin === null ? items.length * estimateRowHeight : virtualizer.getTotalSize() },
|
|
65
|
+
children: visible.map((row) => {
|
|
66
|
+
const item = items[row.index];
|
|
67
|
+
if (item === void 0) throw new Error(`ListMenu item ${row.index} is outside its collection`);
|
|
68
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
69
|
+
ref: virtualizer.measureElement,
|
|
70
|
+
"data-index": row.index,
|
|
71
|
+
className: "absolute left-0 top-0 w-full",
|
|
72
|
+
style: { transform: `translateY(${row.start - (scrollMargin ?? 0)}px)` },
|
|
73
|
+
children: children(item, row.index)
|
|
74
|
+
}, row.key);
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
exports.ListMenuItems = ListMenuItems;
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=ListMenuItems.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListMenuItems.cjs","names":["useContext","ListMenuVirtualContext","Fragment","useState","useVirtualizer"],"sources":["../../src/components/ListMenuItems.tsx"],"sourcesContent":["import { Fragment, useContext, useLayoutEffect, useState, type ReactNode } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { ListMenuVirtualContext, type ListMenuVirtualState } from \"./list-menu-virtual\";\n\nexport interface ListMenuItemsProps<T> {\n items: readonly T[];\n getItemKey: (item: T) => string;\n children: (item: T, index: number) => ReactNode;\n}\n\nexport function ListMenuItems<T>(props: ListMenuItemsProps<T>) {\n const virtual = useContext(ListMenuVirtualContext);\n return virtual ? <VirtualMenuItems {...props} virtual={virtual} /> : <MenuItems {...props} />;\n}\n\nfunction MenuItems<T>({ items, getItemKey, children }: ListMenuItemsProps<T>) {\n return items.map((item, index) => <Fragment key={getItemKey(item)}>{children(item, index)}</Fragment>);\n}\n\nfunction VirtualMenuItems<T>({ items, getItemKey, children, virtual }: ListMenuItemsProps<T> & { virtual: ListMenuVirtualState }) {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const [layout, setLayout] = useState<{ count: number; estimate: number; margin: number } | null>(null);\n const { scrollElement, contentElement, estimateRowHeight, overscan } = virtual;\n const scrollMargin = layout?.count === items.length && layout.estimate === estimateRowHeight ? layout.margin : null;\n\n useLayoutEffect(() => {\n if (!container || !scrollElement || !contentElement) return;\n const measure = () => {\n const margin = container.getBoundingClientRect().top - scrollElement.getBoundingClientRect().top + scrollElement.scrollTop - scrollElement.clientTop;\n setLayout(previous => previous?.count === items.length && previous.estimate === estimateRowHeight && previous.margin === margin\n ? previous : { count: items.length, estimate: estimateRowHeight, margin });\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(contentElement);\n observer.observe(scrollElement);\n return () => observer.disconnect();\n }, [container, scrollElement, contentElement, items.length, estimateRowHeight]);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => scrollElement,\n estimateSize: () => estimateRowHeight,\n getItemKey: index => {\n const item = items[index];\n if (item === undefined) throw new Error(`ListMenu item ${index} is outside its collection`);\n return getItemKey(item);\n },\n overscan,\n scrollMargin: scrollMargin ?? 0,\n enabled: scrollMargin !== null,\n });\n const offset = virtualizer.scrollOffset ?? 0;\n const height = virtualizer.scrollRect?.height ?? 0;\n const visible = virtualizer.getVirtualItems().filter(item => (\n item.end >= offset - overscan * estimateRowHeight && item.start <= offset + height + overscan * estimateRowHeight\n ));\n\n return (\n <div ref={setContainer} data-slot=\"list-menu-items\" className=\"relative w-full\" style={{ height: scrollMargin === null ? items.length * estimateRowHeight : virtualizer.getTotalSize() }}>\n {visible.map(row => {\n const item = items[row.index];\n if (item === undefined) throw new Error(`ListMenu item ${row.index} is outside its collection`);\n return (\n <div key={row.key} ref={virtualizer.measureElement} data-index={row.index} className=\"absolute left-0 top-0 w-full\" style={{ transform: `translateY(${row.start - (scrollMargin ?? 0)}px)` }}>\n {children(item, row.index)}\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface ListMenuItemsProps<T> {
|
|
3
|
+
items: readonly T[];
|
|
4
|
+
getItemKey: (item: T) => string;
|
|
5
|
+
children: (item: T, index: number) => ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function ListMenuItems<T>(props: ListMenuItemsProps<T>): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=ListMenuItems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListMenuItems.d.ts","sourceRoot":"","sources":["../../src/components/ListMenuItems.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIxF,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;CACjD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,+BAG5D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ListMenuVirtualContext } from "./list-menu-virtual.js";
|
|
2
|
+
import { Fragment, useContext, useLayoutEffect, useState } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
5
|
+
// src/components/ListMenuItems.tsx
|
|
6
|
+
function ListMenuItems(props) {
|
|
7
|
+
const virtual = useContext(ListMenuVirtualContext);
|
|
8
|
+
return virtual ? /* @__PURE__ */ jsx(VirtualMenuItems, {
|
|
9
|
+
...props,
|
|
10
|
+
virtual
|
|
11
|
+
}) : /* @__PURE__ */ jsx(MenuItems, { ...props });
|
|
12
|
+
}
|
|
13
|
+
function MenuItems({ items, getItemKey, children }) {
|
|
14
|
+
return items.map((item, index) => /* @__PURE__ */ jsx(Fragment, { children: children(item, index) }, getItemKey(item)));
|
|
15
|
+
}
|
|
16
|
+
function VirtualMenuItems({ items, getItemKey, children, virtual }) {
|
|
17
|
+
const [container, setContainer] = useState(null);
|
|
18
|
+
const [layout, setLayout] = useState(null);
|
|
19
|
+
const { scrollElement, contentElement, estimateRowHeight, overscan } = virtual;
|
|
20
|
+
const scrollMargin = layout?.count === items.length && layout.estimate === estimateRowHeight ? layout.margin : null;
|
|
21
|
+
useLayoutEffect(() => {
|
|
22
|
+
if (!container || !scrollElement || !contentElement) return;
|
|
23
|
+
const measure = () => {
|
|
24
|
+
const margin = container.getBoundingClientRect().top - scrollElement.getBoundingClientRect().top + scrollElement.scrollTop - scrollElement.clientTop;
|
|
25
|
+
setLayout((previous) => previous?.count === items.length && previous.estimate === estimateRowHeight && previous.margin === margin ? previous : {
|
|
26
|
+
count: items.length,
|
|
27
|
+
estimate: estimateRowHeight,
|
|
28
|
+
margin
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
measure();
|
|
32
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
33
|
+
const observer = new ResizeObserver(measure);
|
|
34
|
+
observer.observe(contentElement);
|
|
35
|
+
observer.observe(scrollElement);
|
|
36
|
+
return () => observer.disconnect();
|
|
37
|
+
}, [
|
|
38
|
+
container,
|
|
39
|
+
scrollElement,
|
|
40
|
+
contentElement,
|
|
41
|
+
items.length,
|
|
42
|
+
estimateRowHeight
|
|
43
|
+
]);
|
|
44
|
+
const virtualizer = useVirtualizer({
|
|
45
|
+
count: items.length,
|
|
46
|
+
getScrollElement: () => scrollElement,
|
|
47
|
+
estimateSize: () => estimateRowHeight,
|
|
48
|
+
getItemKey: (index) => {
|
|
49
|
+
const item = items[index];
|
|
50
|
+
if (item === void 0) throw new Error(`ListMenu item ${index} is outside its collection`);
|
|
51
|
+
return getItemKey(item);
|
|
52
|
+
},
|
|
53
|
+
overscan,
|
|
54
|
+
scrollMargin: scrollMargin ?? 0,
|
|
55
|
+
enabled: scrollMargin !== null
|
|
56
|
+
});
|
|
57
|
+
const offset = virtualizer.scrollOffset ?? 0;
|
|
58
|
+
const height = virtualizer.scrollRect?.height ?? 0;
|
|
59
|
+
const visible = virtualizer.getVirtualItems().filter((item) => item.end >= offset - overscan * estimateRowHeight && item.start <= offset + height + overscan * estimateRowHeight);
|
|
60
|
+
return /* @__PURE__ */ jsx("div", {
|
|
61
|
+
ref: setContainer,
|
|
62
|
+
"data-slot": "list-menu-items",
|
|
63
|
+
className: "relative w-full",
|
|
64
|
+
style: { height: scrollMargin === null ? items.length * estimateRowHeight : virtualizer.getTotalSize() },
|
|
65
|
+
children: visible.map((row) => {
|
|
66
|
+
const item = items[row.index];
|
|
67
|
+
if (item === void 0) throw new Error(`ListMenu item ${row.index} is outside its collection`);
|
|
68
|
+
return /* @__PURE__ */ jsx("div", {
|
|
69
|
+
ref: virtualizer.measureElement,
|
|
70
|
+
"data-index": row.index,
|
|
71
|
+
className: "absolute left-0 top-0 w-full",
|
|
72
|
+
style: { transform: `translateY(${row.start - (scrollMargin ?? 0)}px)` },
|
|
73
|
+
children: children(item, row.index)
|
|
74
|
+
}, row.key);
|
|
75
|
+
})
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export { ListMenuItems };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=ListMenuItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListMenuItems.js","names":[],"sources":["../../src/components/ListMenuItems.tsx"],"sourcesContent":["import { Fragment, useContext, useLayoutEffect, useState, type ReactNode } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { ListMenuVirtualContext, type ListMenuVirtualState } from \"./list-menu-virtual\";\n\nexport interface ListMenuItemsProps<T> {\n items: readonly T[];\n getItemKey: (item: T) => string;\n children: (item: T, index: number) => ReactNode;\n}\n\nexport function ListMenuItems<T>(props: ListMenuItemsProps<T>) {\n const virtual = useContext(ListMenuVirtualContext);\n return virtual ? <VirtualMenuItems {...props} virtual={virtual} /> : <MenuItems {...props} />;\n}\n\nfunction MenuItems<T>({ items, getItemKey, children }: ListMenuItemsProps<T>) {\n return items.map((item, index) => <Fragment key={getItemKey(item)}>{children(item, index)}</Fragment>);\n}\n\nfunction VirtualMenuItems<T>({ items, getItemKey, children, virtual }: ListMenuItemsProps<T> & { virtual: ListMenuVirtualState }) {\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const [layout, setLayout] = useState<{ count: number; estimate: number; margin: number } | null>(null);\n const { scrollElement, contentElement, estimateRowHeight, overscan } = virtual;\n const scrollMargin = layout?.count === items.length && layout.estimate === estimateRowHeight ? layout.margin : null;\n\n useLayoutEffect(() => {\n if (!container || !scrollElement || !contentElement) return;\n const measure = () => {\n const margin = container.getBoundingClientRect().top - scrollElement.getBoundingClientRect().top + scrollElement.scrollTop - scrollElement.clientTop;\n setLayout(previous => previous?.count === items.length && previous.estimate === estimateRowHeight && previous.margin === margin\n ? previous : { count: items.length, estimate: estimateRowHeight, margin });\n };\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(contentElement);\n observer.observe(scrollElement);\n return () => observer.disconnect();\n }, [container, scrollElement, contentElement, items.length, estimateRowHeight]);\n\n const virtualizer = useVirtualizer({\n count: items.length,\n getScrollElement: () => scrollElement,\n estimateSize: () => estimateRowHeight,\n getItemKey: index => {\n const item = items[index];\n if (item === undefined) throw new Error(`ListMenu item ${index} is outside its collection`);\n return getItemKey(item);\n },\n overscan,\n scrollMargin: scrollMargin ?? 0,\n enabled: scrollMargin !== null,\n });\n const offset = virtualizer.scrollOffset ?? 0;\n const height = virtualizer.scrollRect?.height ?? 0;\n const visible = virtualizer.getVirtualItems().filter(item => (\n item.end >= offset - overscan * estimateRowHeight && item.start <= offset + height + overscan * estimateRowHeight\n ));\n\n return (\n <div ref={setContainer} data-slot=\"list-menu-items\" className=\"relative w-full\" style={{ height: scrollMargin === null ? items.length * estimateRowHeight : virtualizer.getTotalSize() }}>\n {visible.map(row => {\n const item = items[row.index];\n if (item === undefined) throw new Error(`ListMenu item ${row.index} is outside its collection`);\n return (\n <div key={row.key} ref={virtualizer.measureElement} data-index={row.index} className=\"absolute left-0 top-0 w-full\" style={{ transform: `translateY(${row.start - (scrollMargin ?? 0)}px)` }}>\n {children(item, row.index)}\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAUA,SAAgB,cAAiB,OAA8B;CAC7D,MAAM,UAAU,WAAW,sBAAsB;CACjD,OAAO,UAAU,oBAAC,kBAAD;EAAkB,GAAI;EAAgB;CAAU,CAAA,IAAI,oBAAC,WAAD,EAAW,GAAI,MAAQ,CAAA;AAC9F;AAEA,SAAS,UAAa,EAAE,OAAO,YAAY,YAAmC;CAC5E,OAAO,MAAM,KAAK,MAAM,UAAU,oBAAC,UAAD,EAAA,UAAkC,SAAS,MAAM,KAAK,EAAY,GAAnD,WAAW,IAAI,CAAoC,CAAC;AACvG;AAEA,SAAS,iBAAoB,EAAE,OAAO,YAAY,UAAU,WAAsE;CAChI,MAAM,CAAC,WAAW,gBAAgB,SAAgC,IAAI;CACtE,MAAM,CAAC,QAAQ,aAAa,SAAqE,IAAI;CACrG,MAAM,EAAE,eAAe,gBAAgB,mBAAmB,aAAa;CACvE,MAAM,eAAe,QAAQ,UAAU,MAAM,UAAU,OAAO,aAAa,oBAAoB,OAAO,SAAS;CAE/G,sBAAsB;EACpB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB;EACrD,MAAM,gBAAgB;GACpB,MAAM,SAAS,UAAU,sBAAsB,CAAC,CAAC,MAAM,cAAc,sBAAsB,CAAC,CAAC,MAAM,cAAc,YAAY,cAAc;GAC3I,WAAU,aAAY,UAAU,UAAU,MAAM,UAAU,SAAS,aAAa,qBAAqB,SAAS,WAAW,SACrH,WAAW;IAAE,OAAO,MAAM;IAAQ,UAAU;IAAmB;GAAO,CAAC;EAC7E;EACA,QAAQ;EACR,IAAI,OAAO,mBAAmB,aAAa;EAC3C,MAAM,WAAW,IAAI,eAAe,OAAO;EAC3C,SAAS,QAAQ,cAAc;EAC/B,SAAS,QAAQ,aAAa;EAC9B,aAAa,SAAS,WAAW;CACnC,GAAG;EAAC;EAAW;EAAe;EAAgB,MAAM;EAAQ;CAAiB,CAAC;CAE9E,MAAM,cAAc,eAAe;EACjC,OAAO,MAAM;EACb,wBAAwB;EACxB,oBAAoB;EACpB,aAAY,UAAS;GACnB,MAAM,OAAO,MAAM;GACnB,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,iBAAiB,MAAM,2BAA2B;GAC1F,OAAO,WAAW,IAAI;EACxB;EACA;EACA,cAAc,gBAAgB;EAC9B,SAAS,iBAAiB;CAC5B,CAAC;CACD,MAAM,SAAS,YAAY,gBAAgB;CAC3C,MAAM,SAAS,YAAY,YAAY,UAAU;CACjD,MAAM,UAAU,YAAY,gBAAgB,CAAC,CAAC,QAAO,SACnD,KAAK,OAAO,SAAS,WAAW,qBAAqB,KAAK,SAAS,SAAS,SAAS,WAAW,iBACjG;CAED,OACE,oBAAC,OAAD;EAAK,KAAK;EAAc,aAAU;EAAkB,WAAU;EAAkB,OAAO,EAAE,QAAQ,iBAAiB,OAAO,MAAM,SAAS,oBAAoB,YAAY,aAAa,EAAE;EACpL,UAAA,QAAQ,KAAI,QAAO;GAClB,MAAM,OAAO,MAAM,IAAI;GACvB,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,iBAAiB,IAAI,MAAM,2BAA2B;GAC9F,OACE,oBAAC,OAAD;IAAmB,KAAK,YAAY;IAAgB,cAAY,IAAI;IAAO,WAAU;IAA+B,OAAO,EAAE,WAAW,cAAc,IAAI,SAAS,gBAAgB,GAAG,KAAK;IACxL,UAAA,SAAS,MAAM,IAAI,KAAK;GACtB,GAFK,IAAI,GAET;EAET,CAAC;CACE,CAAA;AAET"}
|