@flanksource/clicky-ui 0.3.54 → 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 +42 -40
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +20 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +43 -42
- 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/index.d.ts +2 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.cjs +2 -11
- package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
- package/dist/data/test-runner/matrix-marks.d.ts +2 -4
- package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.js +3 -11
- package/dist/data/test-runner/matrix-marks.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 +58 -7
- package/dist/data.d.ts +9 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +29 -12
- 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 +76 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -14
- 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
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/lib/breakpoints.ts
|
|
2
|
+
/**
|
|
3
|
+
* The one breakpoint scale for the library: Tailwind's default screens plus the
|
|
4
|
+
* preset's `3xl`. Components that branch in JS (`useMediaQuery`) must phrase
|
|
5
|
+
* their query through `belowBreakpoint` so the JS switch lands on the same pixel
|
|
6
|
+
* as the `sm:`/`md:` classes that style the other side of it.
|
|
7
|
+
*/
|
|
8
|
+
var BREAKPOINTS = {
|
|
9
|
+
sm: 640,
|
|
10
|
+
md: 768,
|
|
11
|
+
lg: 1024,
|
|
12
|
+
xl: 1280,
|
|
13
|
+
"2xl": 1536,
|
|
14
|
+
"3xl": 1920
|
|
15
|
+
};
|
|
16
|
+
/** Matches viewports narrower than `bp` — the complement of Tailwind's `bp:` prefix. */
|
|
17
|
+
function belowBreakpoint(bp) {
|
|
18
|
+
return `(max-width: ${BREAKPOINTS[bp] - 1}px)`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Viewports worth checking a layout at, smallest first. Each sits on a side of a
|
|
22
|
+
* breakpoint that real devices land on, so sweeping the list exercises every
|
|
23
|
+
* branch: 320 (smallest supported phone), 390 (current iPhone), 768 (tablet
|
|
24
|
+
* portrait, exactly `md`), 844×390 (phone landscape: `md` width, phone height),
|
|
25
|
+
* 1024 (tablet landscape / small laptop, exactly `lg`), then desktop widths.
|
|
26
|
+
* Storybook's viewport toolbar, the kitchen-sink sweep and the e2e overflow
|
|
27
|
+
* check all read this list.
|
|
28
|
+
*/
|
|
29
|
+
var VIEWPORT_PRESETS = [
|
|
30
|
+
{
|
|
31
|
+
id: "phone-sm",
|
|
32
|
+
label: "Phone S",
|
|
33
|
+
width: 320,
|
|
34
|
+
height: 568,
|
|
35
|
+
kind: "phone"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "phone",
|
|
39
|
+
label: "Phone",
|
|
40
|
+
width: 390,
|
|
41
|
+
height: 844,
|
|
42
|
+
kind: "phone"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "phone-lg",
|
|
46
|
+
label: "Phone L",
|
|
47
|
+
width: 430,
|
|
48
|
+
height: 932,
|
|
49
|
+
kind: "phone"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "tablet",
|
|
53
|
+
label: "Tablet",
|
|
54
|
+
width: 768,
|
|
55
|
+
height: 1024,
|
|
56
|
+
kind: "tablet"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "phone-landscape",
|
|
60
|
+
label: "Phone landscape",
|
|
61
|
+
width: 844,
|
|
62
|
+
height: 390,
|
|
63
|
+
kind: "phone"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "tablet-landscape",
|
|
67
|
+
label: "Tablet landscape",
|
|
68
|
+
width: 1024,
|
|
69
|
+
height: 768,
|
|
70
|
+
kind: "tablet"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "laptop",
|
|
74
|
+
label: "Laptop",
|
|
75
|
+
width: 1280,
|
|
76
|
+
height: 800,
|
|
77
|
+
kind: "desktop"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "desktop",
|
|
81
|
+
label: "Desktop",
|
|
82
|
+
width: 1440,
|
|
83
|
+
height: 900,
|
|
84
|
+
kind: "desktop"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "wide",
|
|
88
|
+
label: "Wide",
|
|
89
|
+
width: 1920,
|
|
90
|
+
height: 1080,
|
|
91
|
+
kind: "desktop"
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
function findViewportPreset(id) {
|
|
95
|
+
return VIEWPORT_PRESETS.find((preset) => preset.id === id);
|
|
96
|
+
}
|
|
97
|
+
export { BREAKPOINTS, VIEWPORT_PRESETS, belowBreakpoint, findViewportPreset };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=breakpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breakpoints.js","names":[],"sources":["../../src/lib/breakpoints.ts"],"sourcesContent":["/**\n * The one breakpoint scale for the library: Tailwind's default screens plus the\n * preset's `3xl`. Components that branch in JS (`useMediaQuery`) must phrase\n * their query through `belowBreakpoint` so the JS switch lands on the same pixel\n * as the `sm:`/`md:` classes that style the other side of it.\n */\nexport const BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n \"2xl\": 1536,\n \"3xl\": 1920,\n} as const;\n\nexport type Breakpoint = keyof typeof BREAKPOINTS;\n\n/** Matches viewports narrower than `bp` — the complement of Tailwind's `bp:` prefix. */\nexport function belowBreakpoint(bp: Breakpoint): string {\n return `(max-width: ${BREAKPOINTS[bp] - 1}px)`;\n}\n\nexport type ViewportPreset = {\n id: string;\n label: string;\n width: number;\n height: number;\n kind: \"phone\" | \"tablet\" | \"desktop\";\n};\n\n/**\n * Viewports worth checking a layout at, smallest first. Each sits on a side of a\n * breakpoint that real devices land on, so sweeping the list exercises every\n * branch: 320 (smallest supported phone), 390 (current iPhone), 768 (tablet\n * portrait, exactly `md`), 844×390 (phone landscape: `md` width, phone height),\n * 1024 (tablet landscape / small laptop, exactly `lg`), then desktop widths.\n * Storybook's viewport toolbar, the kitchen-sink sweep and the e2e overflow\n * check all read this list.\n */\nexport const VIEWPORT_PRESETS: readonly ViewportPreset[] = [\n { id: \"phone-sm\", label: \"Phone S\", width: 320, height: 568, kind: \"phone\" },\n { id: \"phone\", label: \"Phone\", width: 390, height: 844, kind: \"phone\" },\n { id: \"phone-lg\", label: \"Phone L\", width: 430, height: 932, kind: \"phone\" },\n { id: \"tablet\", label: \"Tablet\", width: 768, height: 1024, kind: \"tablet\" },\n { id: \"phone-landscape\", label: \"Phone landscape\", width: 844, height: 390, kind: \"phone\" },\n { id: \"tablet-landscape\", label: \"Tablet landscape\", width: 1024, height: 768, kind: \"tablet\" },\n { id: \"laptop\", label: \"Laptop\", width: 1280, height: 800, kind: \"desktop\" },\n { id: \"desktop\", label: \"Desktop\", width: 1440, height: 900, kind: \"desktop\" },\n { id: \"wide\", label: \"Wide\", width: 1920, height: 1080, kind: \"desktop\" },\n];\n\nexport function findViewportPreset(id: string | null | undefined): ViewportPreset | undefined {\n return VIEWPORT_PRESETS.find((preset) => preset.id === id);\n}\n"],"mappings":";;;;;;;AAMA,IAAa,cAAc;CACzB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,OAAO;AACT;;AAKA,SAAgB,gBAAgB,IAAwB;CACtD,OAAO,eAAe,YAAY,MAAM,EAAE;AAC5C;;;;;;;;;;AAmBA,IAAa,mBAA8C;CACzD;EAAE,IAAI;EAAY,OAAO;EAAW,OAAO;EAAK,QAAQ;EAAK,MAAM;CAAQ;CAC3E;EAAE,IAAI;EAAS,OAAO;EAAS,OAAO;EAAK,QAAQ;EAAK,MAAM;CAAQ;CACtE;EAAE,IAAI;EAAY,OAAO;EAAW,OAAO;EAAK,QAAQ;EAAK,MAAM;CAAQ;CAC3E;EAAE,IAAI;EAAU,OAAO;EAAU,OAAO;EAAK,QAAQ;EAAM,MAAM;CAAS;CAC1E;EAAE,IAAI;EAAmB,OAAO;EAAmB,OAAO;EAAK,QAAQ;EAAK,MAAM;CAAQ;CAC1F;EAAE,IAAI;EAAoB,OAAO;EAAoB,OAAO;EAAM,QAAQ;EAAK,MAAM;CAAS;CAC9F;EAAE,IAAI;EAAU,OAAO;EAAU,OAAO;EAAM,QAAQ;EAAK,MAAM;CAAU;CAC3E;EAAE,IAAI;EAAW,OAAO;EAAW,OAAO;EAAM,QAAQ;EAAK,MAAM;CAAU;CAC7E;EAAE,IAAI;EAAQ,OAAO;EAAQ,OAAO;EAAM,QAAQ;EAAM,MAAM;CAAU;AAC1E;AAEA,SAAgB,mBAAmB,IAA2D;CAC5F,OAAO,iBAAiB,MAAM,WAAW,OAAO,OAAO,EAAE;AAC3D"}
|
package/dist/lib/combobox.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
const require_breakpoints = require("./breakpoints.cjs");
|
|
1
2
|
// src/lib/combobox.ts
|
|
2
3
|
var COMBOBOX_MENU_MAX_WIDTH_PX = 400;
|
|
3
|
-
var COMBOBOX_MOBILE_QUERY = "
|
|
4
|
+
var COMBOBOX_MOBILE_QUERY = require_breakpoints.belowBreakpoint("sm");
|
|
4
5
|
var COMBOBOX_MENU_EDGE_INSET_PX = 8;
|
|
5
6
|
var COMBOBOX_MENU_ANCHOR_GAP_PX = 4;
|
|
6
7
|
var COMBOBOX_MOBILE_HORIZONTAL_INSET_PX = 16;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.cjs","names":[],"sources":["../../src/lib/combobox.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"combobox.cjs","names":["belowBreakpoint"],"sources":["../../src/lib/combobox.ts"],"sourcesContent":["import { belowBreakpoint } from \"./breakpoints\";\n\nexport const COMBOBOX_MENU_MAX_WIDTH_PX = 400;\nexport const COMBOBOX_MOBILE_QUERY = belowBreakpoint(\"sm\");\n\nconst COMBOBOX_MENU_EDGE_INSET_PX = 8;\nconst COMBOBOX_MENU_ANCHOR_GAP_PX = 4;\nconst COMBOBOX_MOBILE_HORIZONTAL_INSET_PX = 16;\n\nexport type ComboboxMenuPosition = {\n strategy: \"desktop\" | \"mobile\";\n top?: number;\n bottom?: number;\n left: number;\n width: number;\n maxWidth: number;\n maxHeight: number;\n};\n\nexport function calculateComboboxMenuPosition({\n anchor,\n viewportWidth,\n viewportHeight,\n mobile,\n naturalHeight,\n preferredWidth,\n}: {\n anchor: Pick<DOMRect, \"top\" | \"bottom\" | \"left\" | \"width\">;\n viewportWidth: number;\n viewportHeight: number;\n mobile: boolean;\n naturalHeight?: number;\n preferredWidth?: number;\n}): ComboboxMenuPosition {\n if (preferredWidth !== undefined && (!Number.isFinite(preferredWidth) || preferredWidth <= 0)) throw new Error(\"Combobox menu width must be a positive finite number.\");\n if (mobile) {\n const spaceBelow = Math.max(\n 0,\n viewportHeight -\n anchor.bottom -\n COMBOBOX_MENU_ANCHOR_GAP_PX -\n COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const spaceAbove = Math.max(\n 0,\n anchor.top - COMBOBOX_MENU_ANCHOR_GAP_PX - COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const openUp =\n naturalHeight != null &&\n naturalHeight > spaceBelow &&\n spaceAbove > spaceBelow;\n const width = Math.max(\n 0,\n viewportWidth - COMBOBOX_MOBILE_HORIZONTAL_INSET_PX * 2,\n );\n return menuPosition({\n strategy: \"mobile\",\n anchor,\n viewportHeight,\n openUp,\n left: COMBOBOX_MOBILE_HORIZONTAL_INSET_PX,\n width,\n maxWidth: width,\n maxHeight: openUp ? spaceAbove : spaceBelow,\n });\n }\n\n const spaceBelow = Math.max(\n 0,\n viewportHeight -\n anchor.bottom -\n COMBOBOX_MENU_ANCHOR_GAP_PX -\n COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const spaceAbove = Math.max(\n 0,\n anchor.top - COMBOBOX_MENU_ANCHOR_GAP_PX - COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const openUp =\n naturalHeight != null &&\n naturalHeight > spaceBelow &&\n spaceAbove > spaceBelow;\n const preferred = preferredWidth === undefined ? undefined : Math.min(Math.max(anchor.width, preferredWidth), Math.max(0, viewportWidth - COMBOBOX_MENU_EDGE_INSET_PX * 2));\n return menuPosition({\n strategy: \"desktop\",\n anchor,\n viewportHeight,\n openUp,\n left: preferred === undefined ? anchor.left : Math.max(COMBOBOX_MENU_EDGE_INSET_PX, Math.min(anchor.left, viewportWidth - preferred - COMBOBOX_MENU_EDGE_INSET_PX)),\n width: preferred ?? anchor.width,\n maxWidth: preferred ?? Math.max(\n anchor.width,\n Math.min(\n COMBOBOX_MENU_MAX_WIDTH_PX,\n viewportWidth - anchor.left - COMBOBOX_MENU_EDGE_INSET_PX,\n ),\n ),\n maxHeight: openUp ? spaceAbove : spaceBelow,\n });\n}\n\nfunction menuPosition({\n strategy,\n anchor,\n viewportHeight,\n openUp,\n left,\n width,\n maxWidth,\n maxHeight,\n}: Omit<ComboboxMenuPosition, \"top\" | \"bottom\"> & {\n anchor: Pick<DOMRect, \"top\" | \"bottom\">;\n viewportHeight: number;\n openUp: boolean;\n}): ComboboxMenuPosition {\n return {\n strategy,\n ...(openUp\n ? { bottom: viewportHeight - anchor.top + COMBOBOX_MENU_ANCHOR_GAP_PX }\n : { top: anchor.bottom + COMBOBOX_MENU_ANCHOR_GAP_PX }),\n left,\n width,\n maxWidth,\n maxHeight,\n };\n}\n"],"mappings":";;AAEA,IAAa,6BAA6B;AAC1C,IAAa,wBAAwBA,oBAAAA,gBAAgB,IAAI;AAEzD,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AACpC,IAAM,sCAAsC;AAY5C,SAAgB,8BAA8B,EAC5C,QACA,eACA,gBACA,QACA,eACA,kBAQuB;CACvB,IAAI,mBAAmB,KAAA,MAAc,CAAC,OAAO,SAAS,cAAc,KAAK,kBAAkB,IAAI,MAAM,IAAI,MAAM,uDAAuD;CACtK,IAAI,QAAQ;EACV,MAAM,aAAa,KAAK,IACtB,GACA,iBACE,OAAO,SACP,8BACA,2BACJ;EACA,MAAM,aAAa,KAAK,IACtB,GACA,OAAO,MAAM,8BAA8B,2BAC7C;EACA,MAAM,SACJ,iBAAiB,QACjB,gBAAgB,cAChB,aAAa;EACf,MAAM,QAAQ,KAAK,IACjB,GACA,gBAAgB,EAClB;EACA,OAAO,aAAa;GAClB,UAAU;GACV;GACA;GACA;GACA,MAAM;GACN;GACA,UAAU;GACV,WAAW,SAAS,aAAa;EACnC,CAAC;CACH;CAEA,MAAM,aAAa,KAAK,IACtB,GACA,iBACE,OAAO,SACP,8BACA,2BACJ;CACA,MAAM,aAAa,KAAK,IACtB,GACA,OAAO,MAAM,8BAA8B,2BAC7C;CACA,MAAM,SACJ,iBAAiB,QACjB,gBAAgB,cAChB,aAAa;CACf,MAAM,YAAY,mBAAmB,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,cAAc,GAAG,KAAK,IAAI,GAAG,gBAAgB,EAA+B,CAAC;CAC1K,OAAO,aAAa;EAClB,UAAU;EACV;EACA;EACA;EACA,MAAM,cAAc,KAAA,IAAY,OAAO,OAAO,KAAK,IAAI,6BAA6B,KAAK,IAAI,OAAO,MAAM,gBAAgB,YAAY,2BAA2B,CAAC;EAClK,OAAO,aAAa,OAAO;EAC3B,UAAU,aAAa,KAAK,IAC1B,OAAO,OACP,KAAK,IAAA,KAEH,gBAAgB,OAAO,OAAO,2BAChC,CACF;EACA,WAAW,SAAS,aAAa;CACnC,CAAC;AACH;AAEA,SAAS,aAAa,EACpB,UACA,QACA,gBACA,QACA,MACA,OACA,UACA,aAKuB;CACvB,OAAO;EACL;EACA,GAAI,SACA,EAAE,QAAQ,iBAAiB,OAAO,MAAM,4BAA4B,IACpE,EAAE,KAAK,OAAO,SAAS,4BAA4B;EACvD;EACA;EACA;EACA;CACF;AACF"}
|
package/dist/lib/combobox.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/lib/combobox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../src/lib/combobox.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,qBAAqB,QAAwB,CAAC;AAM3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,EAC5C,MAAM,EACN,aAAa,EACb,cAAc,EACd,MAAM,EACN,aAAa,EACb,cAAc,GACf,EAAE;IACD,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,oBAAoB,CAkEvB"}
|
package/dist/lib/combobox.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { belowBreakpoint } from "./breakpoints.js";
|
|
1
2
|
// src/lib/combobox.ts
|
|
2
3
|
var COMBOBOX_MENU_MAX_WIDTH_PX = 400;
|
|
3
|
-
var COMBOBOX_MOBILE_QUERY = "
|
|
4
|
+
var COMBOBOX_MOBILE_QUERY = belowBreakpoint("sm");
|
|
4
5
|
var COMBOBOX_MENU_EDGE_INSET_PX = 8;
|
|
5
6
|
var COMBOBOX_MENU_ANCHOR_GAP_PX = 4;
|
|
6
7
|
var COMBOBOX_MOBILE_HORIZONTAL_INSET_PX = 16;
|
package/dist/lib/combobox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.js","names":[],"sources":["../../src/lib/combobox.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"combobox.js","names":[],"sources":["../../src/lib/combobox.ts"],"sourcesContent":["import { belowBreakpoint } from \"./breakpoints\";\n\nexport const COMBOBOX_MENU_MAX_WIDTH_PX = 400;\nexport const COMBOBOX_MOBILE_QUERY = belowBreakpoint(\"sm\");\n\nconst COMBOBOX_MENU_EDGE_INSET_PX = 8;\nconst COMBOBOX_MENU_ANCHOR_GAP_PX = 4;\nconst COMBOBOX_MOBILE_HORIZONTAL_INSET_PX = 16;\n\nexport type ComboboxMenuPosition = {\n strategy: \"desktop\" | \"mobile\";\n top?: number;\n bottom?: number;\n left: number;\n width: number;\n maxWidth: number;\n maxHeight: number;\n};\n\nexport function calculateComboboxMenuPosition({\n anchor,\n viewportWidth,\n viewportHeight,\n mobile,\n naturalHeight,\n preferredWidth,\n}: {\n anchor: Pick<DOMRect, \"top\" | \"bottom\" | \"left\" | \"width\">;\n viewportWidth: number;\n viewportHeight: number;\n mobile: boolean;\n naturalHeight?: number;\n preferredWidth?: number;\n}): ComboboxMenuPosition {\n if (preferredWidth !== undefined && (!Number.isFinite(preferredWidth) || preferredWidth <= 0)) throw new Error(\"Combobox menu width must be a positive finite number.\");\n if (mobile) {\n const spaceBelow = Math.max(\n 0,\n viewportHeight -\n anchor.bottom -\n COMBOBOX_MENU_ANCHOR_GAP_PX -\n COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const spaceAbove = Math.max(\n 0,\n anchor.top - COMBOBOX_MENU_ANCHOR_GAP_PX - COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const openUp =\n naturalHeight != null &&\n naturalHeight > spaceBelow &&\n spaceAbove > spaceBelow;\n const width = Math.max(\n 0,\n viewportWidth - COMBOBOX_MOBILE_HORIZONTAL_INSET_PX * 2,\n );\n return menuPosition({\n strategy: \"mobile\",\n anchor,\n viewportHeight,\n openUp,\n left: COMBOBOX_MOBILE_HORIZONTAL_INSET_PX,\n width,\n maxWidth: width,\n maxHeight: openUp ? spaceAbove : spaceBelow,\n });\n }\n\n const spaceBelow = Math.max(\n 0,\n viewportHeight -\n anchor.bottom -\n COMBOBOX_MENU_ANCHOR_GAP_PX -\n COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const spaceAbove = Math.max(\n 0,\n anchor.top - COMBOBOX_MENU_ANCHOR_GAP_PX - COMBOBOX_MENU_EDGE_INSET_PX,\n );\n const openUp =\n naturalHeight != null &&\n naturalHeight > spaceBelow &&\n spaceAbove > spaceBelow;\n const preferred = preferredWidth === undefined ? undefined : Math.min(Math.max(anchor.width, preferredWidth), Math.max(0, viewportWidth - COMBOBOX_MENU_EDGE_INSET_PX * 2));\n return menuPosition({\n strategy: \"desktop\",\n anchor,\n viewportHeight,\n openUp,\n left: preferred === undefined ? anchor.left : Math.max(COMBOBOX_MENU_EDGE_INSET_PX, Math.min(anchor.left, viewportWidth - preferred - COMBOBOX_MENU_EDGE_INSET_PX)),\n width: preferred ?? anchor.width,\n maxWidth: preferred ?? Math.max(\n anchor.width,\n Math.min(\n COMBOBOX_MENU_MAX_WIDTH_PX,\n viewportWidth - anchor.left - COMBOBOX_MENU_EDGE_INSET_PX,\n ),\n ),\n maxHeight: openUp ? spaceAbove : spaceBelow,\n });\n}\n\nfunction menuPosition({\n strategy,\n anchor,\n viewportHeight,\n openUp,\n left,\n width,\n maxWidth,\n maxHeight,\n}: Omit<ComboboxMenuPosition, \"top\" | \"bottom\"> & {\n anchor: Pick<DOMRect, \"top\" | \"bottom\">;\n viewportHeight: number;\n openUp: boolean;\n}): ComboboxMenuPosition {\n return {\n strategy,\n ...(openUp\n ? { bottom: viewportHeight - anchor.top + COMBOBOX_MENU_ANCHOR_GAP_PX }\n : { top: anchor.bottom + COMBOBOX_MENU_ANCHOR_GAP_PX }),\n left,\n width,\n maxWidth,\n maxHeight,\n };\n}\n"],"mappings":";;AAEA,IAAa,6BAA6B;AAC1C,IAAa,wBAAwB,gBAAgB,IAAI;AAEzD,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AACpC,IAAM,sCAAsC;AAY5C,SAAgB,8BAA8B,EAC5C,QACA,eACA,gBACA,QACA,eACA,kBAQuB;CACvB,IAAI,mBAAmB,KAAA,MAAc,CAAC,OAAO,SAAS,cAAc,KAAK,kBAAkB,IAAI,MAAM,IAAI,MAAM,uDAAuD;CACtK,IAAI,QAAQ;EACV,MAAM,aAAa,KAAK,IACtB,GACA,iBACE,OAAO,SACP,8BACA,2BACJ;EACA,MAAM,aAAa,KAAK,IACtB,GACA,OAAO,MAAM,8BAA8B,2BAC7C;EACA,MAAM,SACJ,iBAAiB,QACjB,gBAAgB,cAChB,aAAa;EACf,MAAM,QAAQ,KAAK,IACjB,GACA,gBAAgB,EAClB;EACA,OAAO,aAAa;GAClB,UAAU;GACV;GACA;GACA;GACA,MAAM;GACN;GACA,UAAU;GACV,WAAW,SAAS,aAAa;EACnC,CAAC;CACH;CAEA,MAAM,aAAa,KAAK,IACtB,GACA,iBACE,OAAO,SACP,8BACA,2BACJ;CACA,MAAM,aAAa,KAAK,IACtB,GACA,OAAO,MAAM,8BAA8B,2BAC7C;CACA,MAAM,SACJ,iBAAiB,QACjB,gBAAgB,cAChB,aAAa;CACf,MAAM,YAAY,mBAAmB,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,KAAK,IAAI,OAAO,OAAO,cAAc,GAAG,KAAK,IAAI,GAAG,gBAAgB,EAA+B,CAAC;CAC1K,OAAO,aAAa;EAClB,UAAU;EACV;EACA;EACA;EACA,MAAM,cAAc,KAAA,IAAY,OAAO,OAAO,KAAK,IAAI,6BAA6B,KAAK,IAAI,OAAO,MAAM,gBAAgB,YAAY,2BAA2B,CAAC;EAClK,OAAO,aAAa,OAAO;EAC3B,UAAU,aAAa,KAAK,IAC1B,OAAO,OACP,KAAK,IAAA,KAEH,gBAAgB,OAAO,OAAO,2BAChC,CACF;EACA,WAAW,SAAS,aAAa;CACnC,CAAC;AACH;AAEA,SAAS,aAAa,EACpB,UACA,QACA,gBACA,QACA,MACA,OACA,UACA,aAKuB;CACvB,OAAO;EACL;EACA,GAAI,SACA,EAAE,QAAQ,iBAAiB,OAAO,MAAM,4BAA4B,IACpE,EAAE,KAAK,OAAO,SAAS,4BAA4B;EACvD;EACA;EACA;EACA;CACF;AACF"}
|
package/dist/lib/path-tree.cjs
CHANGED
|
@@ -80,10 +80,31 @@ function foldersFirst(left, right) {
|
|
|
80
80
|
if (leftIsParent !== right.children.length > 0) return leftIsParent ? -1 : 1;
|
|
81
81
|
return left.label.localeCompare(right.label);
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Decides whether `path` passes a tree include/exclude selection, where a
|
|
85
|
+
* selection key stands for that path *and everything beneath it*.
|
|
86
|
+
*
|
|
87
|
+
* The deepest selected ancestor-or-self decides, so excluding `a/b` under an
|
|
88
|
+
* included `a` carves `a/b` back out, and including `a/b/c` under an excluded
|
|
89
|
+
* `a/b` restores it. When no ancestor-or-self is selected the path matches only
|
|
90
|
+
* if the selection has no includes at all: with no includes everything matches
|
|
91
|
+
* except excluded subtrees, with any include only included subtrees match.
|
|
92
|
+
*
|
|
93
|
+
* Keys match on whole segments — `acme/bill` does not select `acme/billing`.
|
|
94
|
+
*/
|
|
95
|
+
function matchesTreeSelection(path, selection, separator = "/") {
|
|
96
|
+
const segments = splitPath(path, separator);
|
|
97
|
+
for (let depth = segments.length; depth > 0; depth--) {
|
|
98
|
+
const mode = selection[segments.slice(0, depth).join(separator)];
|
|
99
|
+
if (mode !== void 0) return mode === "include";
|
|
100
|
+
}
|
|
101
|
+
return !Object.values(selection).includes("include");
|
|
102
|
+
}
|
|
83
103
|
exports.PATH_SEPARATOR = PATH_SEPARATOR;
|
|
84
104
|
exports.buildPathTree = buildPathTree;
|
|
85
105
|
exports.foldersFirst = foldersFirst;
|
|
86
106
|
exports.isPathTreeFolder = isPathTreeFolder;
|
|
107
|
+
exports.matchesTreeSelection = matchesTreeSelection;
|
|
87
108
|
exports.splitPath = splitPath;
|
|
88
109
|
|
|
89
110
|
//# sourceMappingURL=path-tree.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-tree.cjs","names":[],"sources":["../../src/lib/path-tree.ts"],"sourcesContent":["// Turns a flat list of items that each carry a path into a tree, without\n// knowing anything about what the items are. Two independent surfaces need\n// exactly this shape — a session's changed-file list and a backend's\n// hierarchical nav surfaces — so the walker lives here rather than a third\n// time inside a component.\n\n/** The wire separator for a joined path. Matches clicky's entity.PathSeparator. */\nexport const PATH_SEPARATOR = \"/\";\n\nexport interface PathTreeNode<T> {\n /** The joined path — stable across rebuilds, so it works as a React/Tree key. */\n key: string;\n /** The node's own last segment. */\n label: string;\n /** Every segment from the root down to and including this node. */\n path: string[];\n /**\n * The items whose *full* path lands on this node. Empty means a pure folder\n * — a node that exists only because something below it does. More than one\n * means several items share a path (e.g. a file that was both read and\n * written), which is why this is a list rather than a single value.\n */\n items: T[];\n children: PathTreeNode<T>[];\n}\n\nexport interface BuildPathTreeOptions<T> {\n /**\n * Orders siblings at every level. Defaults to the order items were first\n * seen, which preserves a already-sorted backend list as-is.\n */\n compare?: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number;\n}\n\n/**\n * Splits `value` into path segments on any character in `delimiters`, dropping\n * empty segments so leading, trailing and repeated separators are harmless.\n *\n * Characters outside `delimiters` are never separators: with `delimiters=\".\"`,\n * `\"remote-debugger.sql-xevent\"` yields two segments, not four — a hyphen is an\n * ordinary name character.\n */\nexport function splitPath(value: string, delimiters: string): string[] {\n if (!value) return [];\n if (!delimiters) return [value];\n const segments: string[] = [];\n let current = \"\";\n for (const character of value) {\n if (delimiters.includes(character)) {\n if (current) segments.push(current);\n current = \"\";\n } else {\n current += character;\n }\n }\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Builds a forest from items keyed by path.\n *\n * A node is created for every path prefix, and an item's full path *binds* to\n * whichever node it lands on — creating it if needed, reusing it if a\n * descendant already forced it into existence. That is what lets a node be both\n * a folder and a leaf: `[\"jms\"]` and `[\"jms\", \"incoming\"]` produce one `jms`\n * node that is simultaneously selectable and expandable.\n *\n * Items whose path is empty are skipped — they have no position in the tree.\n */\nexport function buildPathTree<T>(\n items: readonly T[],\n getPath: (item: T) => readonly string[],\n options: BuildPathTreeOptions<T> = {},\n): PathTreeNode<T>[] {\n const roots: PathTreeNode<T>[] = [];\n const byKey = new Map<string, PathTreeNode<T>>();\n\n for (const item of items) {\n const path = getPath(item);\n if (path.length === 0) continue;\n\n let siblings = roots;\n let key = \"\";\n let node: PathTreeNode<T> | undefined;\n path.forEach((segment, index) => {\n key = key ? `${key}${PATH_SEPARATOR}${segment}` : segment;\n let existing = byKey.get(key);\n if (!existing) {\n existing = {\n key,\n label: segment,\n path: path.slice(0, index + 1),\n items: [],\n children: [],\n };\n byKey.set(key, existing);\n siblings.push(existing);\n }\n siblings = existing.children;\n node = existing;\n });\n node?.items.push(item);\n }\n\n if (options.compare) sortTree(roots, options.compare);\n return roots;\n}\n\nfunction sortTree<T>(\n nodes: PathTreeNode<T>[],\n compare: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number,\n): void {\n nodes.sort(compare);\n for (const node of nodes) sortTree(node.children, compare);\n}\n\n/** True when the node exists only to hold descendants — nothing binds to it. */\nexport function isPathTreeFolder<T>(node: PathTreeNode<T>): boolean {\n return node.items.length === 0;\n}\n\n/**\n * A `compare` that puts nodes with children before plain leaves, then orders\n * each run alphabetically — the conventional file-explorer ordering.\n */\nexport function foldersFirst<T>(\n left: PathTreeNode<T>,\n right: PathTreeNode<T>,\n): number {\n const leftIsParent = left.children.length > 0;\n const rightIsParent = right.children.length > 0;\n if (leftIsParent !== rightIsParent) return leftIsParent ? -1 : 1;\n return left.label.localeCompare(right.label);\n}\n"],"mappings":";;AAOA,IAAa,iBAAiB;;;;;;;;;AAmC9B,SAAgB,UAAU,OAAe,YAA8B;CACrE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK;CAC9B,MAAM,WAAqB,CAAC;CAC5B,IAAI,UAAU;CACd,KAAK,MAAM,aAAa,OACtB,IAAI,WAAW,SAAS,SAAS,GAAG;EAClC,IAAI,SAAS,SAAS,KAAK,OAAO;EAClC,UAAU;CACZ,OACE,WAAW;CAGf,IAAI,SAAS,SAAS,KAAK,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,cACd,OACA,SACA,UAAmC,CAAC,GACjB;CACnB,MAAM,QAA2B,CAAC;CAClC,MAAM,wBAAQ,IAAI,IAA6B;CAE/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,KAAK,WAAW,GAAG;EAEvB,IAAI,WAAW;EACf,IAAI,MAAM;EACV,IAAI;EACJ,KAAK,SAAS,SAAS,UAAU;GAC/B,MAAM,MAAM,GAAG,OAAuB,YAAY;GAClD,IAAI,WAAW,MAAM,IAAI,GAAG;GAC5B,IAAI,CAAC,UAAU;IACb,WAAW;KACT;KACA,OAAO;KACP,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC;KAC7B,OAAO,CAAC;KACR,UAAU,CAAC;IACb;IACA,MAAM,IAAI,KAAK,QAAQ;IACvB,SAAS,KAAK,QAAQ;GACxB;GACA,WAAW,SAAS;GACpB,OAAO;EACT,CAAC;EACD,MAAM,MAAM,KAAK,IAAI;CACvB;CAEA,IAAI,QAAQ,SAAS,SAAS,OAAO,QAAQ,OAAO;CACpD,OAAO;AACT;AAEA,SAAS,SACP,OACA,SACM;CACN,MAAM,KAAK,OAAO;CAClB,KAAK,MAAM,QAAQ,OAAO,SAAS,KAAK,UAAU,OAAO;AAC3D;;AAGA,SAAgB,iBAAoB,MAAgC;CAClE,OAAO,KAAK,MAAM,WAAW;AAC/B;;;;;AAMA,SAAgB,aACd,MACA,OACQ;CACR,MAAM,eAAe,KAAK,SAAS,SAAS;CAE5C,IAAI,iBADkB,MAAM,SAAS,SAAS,GACV,OAAO,eAAe,KAAK;CAC/D,OAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7C"}
|
|
1
|
+
{"version":3,"file":"path-tree.cjs","names":[],"sources":["../../src/lib/path-tree.ts"],"sourcesContent":["// Turns a flat list of items that each carry a path into a tree, without\n// knowing anything about what the items are. Two independent surfaces need\n// exactly this shape — a session's changed-file list and a backend's\n// hierarchical nav surfaces — so the walker lives here rather than a third\n// time inside a component.\n\n/** The wire separator for a joined path. Matches clicky's entity.PathSeparator. */\nexport const PATH_SEPARATOR = \"/\";\n\nexport interface PathTreeNode<T> {\n /** The joined path — stable across rebuilds, so it works as a React/Tree key. */\n key: string;\n /** The node's own last segment. */\n label: string;\n /** Every segment from the root down to and including this node. */\n path: string[];\n /**\n * The items whose *full* path lands on this node. Empty means a pure folder\n * — a node that exists only because something below it does. More than one\n * means several items share a path (e.g. a file that was both read and\n * written), which is why this is a list rather than a single value.\n */\n items: T[];\n children: PathTreeNode<T>[];\n}\n\nexport interface BuildPathTreeOptions<T> {\n /**\n * Orders siblings at every level. Defaults to the order items were first\n * seen, which preserves a already-sorted backend list as-is.\n */\n compare?: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number;\n}\n\n/**\n * Splits `value` into path segments on any character in `delimiters`, dropping\n * empty segments so leading, trailing and repeated separators are harmless.\n *\n * Characters outside `delimiters` are never separators: with `delimiters=\".\"`,\n * `\"remote-debugger.sql-xevent\"` yields two segments, not four — a hyphen is an\n * ordinary name character.\n */\nexport function splitPath(value: string, delimiters: string): string[] {\n if (!value) return [];\n if (!delimiters) return [value];\n const segments: string[] = [];\n let current = \"\";\n for (const character of value) {\n if (delimiters.includes(character)) {\n if (current) segments.push(current);\n current = \"\";\n } else {\n current += character;\n }\n }\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Builds a forest from items keyed by path.\n *\n * A node is created for every path prefix, and an item's full path *binds* to\n * whichever node it lands on — creating it if needed, reusing it if a\n * descendant already forced it into existence. That is what lets a node be both\n * a folder and a leaf: `[\"jms\"]` and `[\"jms\", \"incoming\"]` produce one `jms`\n * node that is simultaneously selectable and expandable.\n *\n * Items whose path is empty are skipped — they have no position in the tree.\n */\nexport function buildPathTree<T>(\n items: readonly T[],\n getPath: (item: T) => readonly string[],\n options: BuildPathTreeOptions<T> = {},\n): PathTreeNode<T>[] {\n const roots: PathTreeNode<T>[] = [];\n const byKey = new Map<string, PathTreeNode<T>>();\n\n for (const item of items) {\n const path = getPath(item);\n if (path.length === 0) continue;\n\n let siblings = roots;\n let key = \"\";\n let node: PathTreeNode<T> | undefined;\n path.forEach((segment, index) => {\n key = key ? `${key}${PATH_SEPARATOR}${segment}` : segment;\n let existing = byKey.get(key);\n if (!existing) {\n existing = {\n key,\n label: segment,\n path: path.slice(0, index + 1),\n items: [],\n children: [],\n };\n byKey.set(key, existing);\n siblings.push(existing);\n }\n siblings = existing.children;\n node = existing;\n });\n node?.items.push(item);\n }\n\n if (options.compare) sortTree(roots, options.compare);\n return roots;\n}\n\nfunction sortTree<T>(\n nodes: PathTreeNode<T>[],\n compare: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number,\n): void {\n nodes.sort(compare);\n for (const node of nodes) sortTree(node.children, compare);\n}\n\n/** True when the node exists only to hold descendants — nothing binds to it. */\nexport function isPathTreeFolder<T>(node: PathTreeNode<T>): boolean {\n return node.items.length === 0;\n}\n\n/**\n * A `compare` that puts nodes with children before plain leaves, then orders\n * each run alphabetically — the conventional file-explorer ordering.\n */\nexport function foldersFirst<T>(\n left: PathTreeNode<T>,\n right: PathTreeNode<T>,\n): number {\n const leftIsParent = left.children.length > 0;\n const rightIsParent = right.children.length > 0;\n if (leftIsParent !== rightIsParent) return leftIsParent ? -1 : 1;\n return left.label.localeCompare(right.label);\n}\n\n/** Include/exclude state keyed by a node's joined path; neutral nodes are absent. */\nexport type TreeSelection = Record<string, \"include\" | \"exclude\">;\n\n/**\n * Decides whether `path` passes a tree include/exclude selection, where a\n * selection key stands for that path *and everything beneath it*.\n *\n * The deepest selected ancestor-or-self decides, so excluding `a/b` under an\n * included `a` carves `a/b` back out, and including `a/b/c` under an excluded\n * `a/b` restores it. When no ancestor-or-self is selected the path matches only\n * if the selection has no includes at all: with no includes everything matches\n * except excluded subtrees, with any include only included subtrees match.\n *\n * Keys match on whole segments — `acme/bill` does not select `acme/billing`.\n */\nexport function matchesTreeSelection(\n path: string,\n selection: TreeSelection,\n separator: string = PATH_SEPARATOR,\n): boolean {\n const segments = splitPath(path, separator);\n for (let depth = segments.length; depth > 0; depth--) {\n const mode = selection[segments.slice(0, depth).join(separator)];\n if (mode !== undefined) return mode === \"include\";\n }\n return !Object.values(selection).includes(\"include\");\n}\n"],"mappings":";;AAOA,IAAa,iBAAiB;;;;;;;;;AAmC9B,SAAgB,UAAU,OAAe,YAA8B;CACrE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK;CAC9B,MAAM,WAAqB,CAAC;CAC5B,IAAI,UAAU;CACd,KAAK,MAAM,aAAa,OACtB,IAAI,WAAW,SAAS,SAAS,GAAG;EAClC,IAAI,SAAS,SAAS,KAAK,OAAO;EAClC,UAAU;CACZ,OACE,WAAW;CAGf,IAAI,SAAS,SAAS,KAAK,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,cACd,OACA,SACA,UAAmC,CAAC,GACjB;CACnB,MAAM,QAA2B,CAAC;CAClC,MAAM,wBAAQ,IAAI,IAA6B;CAE/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,KAAK,WAAW,GAAG;EAEvB,IAAI,WAAW;EACf,IAAI,MAAM;EACV,IAAI;EACJ,KAAK,SAAS,SAAS,UAAU;GAC/B,MAAM,MAAM,GAAG,OAAuB,YAAY;GAClD,IAAI,WAAW,MAAM,IAAI,GAAG;GAC5B,IAAI,CAAC,UAAU;IACb,WAAW;KACT;KACA,OAAO;KACP,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC;KAC7B,OAAO,CAAC;KACR,UAAU,CAAC;IACb;IACA,MAAM,IAAI,KAAK,QAAQ;IACvB,SAAS,KAAK,QAAQ;GACxB;GACA,WAAW,SAAS;GACpB,OAAO;EACT,CAAC;EACD,MAAM,MAAM,KAAK,IAAI;CACvB;CAEA,IAAI,QAAQ,SAAS,SAAS,OAAO,QAAQ,OAAO;CACpD,OAAO;AACT;AAEA,SAAS,SACP,OACA,SACM;CACN,MAAM,KAAK,OAAO;CAClB,KAAK,MAAM,QAAQ,OAAO,SAAS,KAAK,UAAU,OAAO;AAC3D;;AAGA,SAAgB,iBAAoB,MAAgC;CAClE,OAAO,KAAK,MAAM,WAAW;AAC/B;;;;;AAMA,SAAgB,aACd,MACA,OACQ;CACR,MAAM,eAAe,KAAK,SAAS,SAAS;CAE5C,IAAI,iBADkB,MAAM,SAAS,SAAS,GACV,OAAO,eAAe,KAAK;CAC/D,OAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7C;;;;;;;;;;;;;AAiBA,SAAgB,qBACd,MACA,WACA,YAAA,KACS;CACT,MAAM,WAAW,UAAU,MAAM,SAAS;CAC1C,KAAK,IAAI,QAAQ,SAAS,QAAQ,QAAQ,GAAG,SAAS;EACpD,MAAM,OAAO,UAAU,SAAS,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS;EAC9D,IAAI,SAAS,KAAA,GAAW,OAAO,SAAS;CAC1C;CACA,OAAO,CAAC,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,SAAS;AACrD"}
|
package/dist/lib/path-tree.d.ts
CHANGED
|
@@ -51,4 +51,19 @@ export declare function isPathTreeFolder<T>(node: PathTreeNode<T>): boolean;
|
|
|
51
51
|
* each run alphabetically — the conventional file-explorer ordering.
|
|
52
52
|
*/
|
|
53
53
|
export declare function foldersFirst<T>(left: PathTreeNode<T>, right: PathTreeNode<T>): number;
|
|
54
|
+
/** Include/exclude state keyed by a node's joined path; neutral nodes are absent. */
|
|
55
|
+
export type TreeSelection = Record<string, "include" | "exclude">;
|
|
56
|
+
/**
|
|
57
|
+
* Decides whether `path` passes a tree include/exclude selection, where a
|
|
58
|
+
* selection key stands for that path *and everything beneath it*.
|
|
59
|
+
*
|
|
60
|
+
* The deepest selected ancestor-or-self decides, so excluding `a/b` under an
|
|
61
|
+
* included `a` carves `a/b` back out, and including `a/b/c` under an excluded
|
|
62
|
+
* `a/b` restores it. When no ancestor-or-self is selected the path matches only
|
|
63
|
+
* if the selection has no includes at all: with no includes everything matches
|
|
64
|
+
* except excluded subtrees, with any include only included subtrees match.
|
|
65
|
+
*
|
|
66
|
+
* Keys match on whole segments — `acme/bill` does not select `acme/billing`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function matchesTreeSelection(path: string, selection: TreeSelection, separator?: string): boolean;
|
|
54
69
|
//# sourceMappingURL=path-tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-tree.d.ts","sourceRoot":"","sources":["../../src/lib/path-tree.ts"],"names":[],"mappings":"AAMA,mFAAmF;AACnF,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;;OAKG;IACH,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;CACrE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAerE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,MAAM,EAAE,EACvC,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,YAAY,CAAC,CAAC,CAAC,EAAE,CAiCnB;AAUD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GACrB,MAAM,CAKR"}
|
|
1
|
+
{"version":3,"file":"path-tree.d.ts","sourceRoot":"","sources":["../../src/lib/path-tree.ts"],"names":[],"mappings":"AAMA,mFAAmF;AACnF,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;;OAKG;IACH,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;CACrE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAerE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,MAAM,EAAE,EACvC,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,YAAY,CAAC,CAAC,CAAC,EAAE,CAiCnB;AAUD,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAElE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GACrB,MAAM,CAKR;AAED,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EACxB,SAAS,GAAE,MAAuB,GACjC,OAAO,CAOT"}
|
package/dist/lib/path-tree.js
CHANGED
|
@@ -80,6 +80,26 @@ function foldersFirst(left, right) {
|
|
|
80
80
|
if (leftIsParent !== right.children.length > 0) return leftIsParent ? -1 : 1;
|
|
81
81
|
return left.label.localeCompare(right.label);
|
|
82
82
|
}
|
|
83
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Decides whether `path` passes a tree include/exclude selection, where a
|
|
85
|
+
* selection key stands for that path *and everything beneath it*.
|
|
86
|
+
*
|
|
87
|
+
* The deepest selected ancestor-or-self decides, so excluding `a/b` under an
|
|
88
|
+
* included `a` carves `a/b` back out, and including `a/b/c` under an excluded
|
|
89
|
+
* `a/b` restores it. When no ancestor-or-self is selected the path matches only
|
|
90
|
+
* if the selection has no includes at all: with no includes everything matches
|
|
91
|
+
* except excluded subtrees, with any include only included subtrees match.
|
|
92
|
+
*
|
|
93
|
+
* Keys match on whole segments — `acme/bill` does not select `acme/billing`.
|
|
94
|
+
*/
|
|
95
|
+
function matchesTreeSelection(path, selection, separator = "/") {
|
|
96
|
+
const segments = splitPath(path, separator);
|
|
97
|
+
for (let depth = segments.length; depth > 0; depth--) {
|
|
98
|
+
const mode = selection[segments.slice(0, depth).join(separator)];
|
|
99
|
+
if (mode !== void 0) return mode === "include";
|
|
100
|
+
}
|
|
101
|
+
return !Object.values(selection).includes("include");
|
|
102
|
+
}
|
|
103
|
+
export { PATH_SEPARATOR, buildPathTree, foldersFirst, isPathTreeFolder, matchesTreeSelection, splitPath };
|
|
84
104
|
|
|
85
105
|
//# sourceMappingURL=path-tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-tree.js","names":[],"sources":["../../src/lib/path-tree.ts"],"sourcesContent":["// Turns a flat list of items that each carry a path into a tree, without\n// knowing anything about what the items are. Two independent surfaces need\n// exactly this shape — a session's changed-file list and a backend's\n// hierarchical nav surfaces — so the walker lives here rather than a third\n// time inside a component.\n\n/** The wire separator for a joined path. Matches clicky's entity.PathSeparator. */\nexport const PATH_SEPARATOR = \"/\";\n\nexport interface PathTreeNode<T> {\n /** The joined path — stable across rebuilds, so it works as a React/Tree key. */\n key: string;\n /** The node's own last segment. */\n label: string;\n /** Every segment from the root down to and including this node. */\n path: string[];\n /**\n * The items whose *full* path lands on this node. Empty means a pure folder\n * — a node that exists only because something below it does. More than one\n * means several items share a path (e.g. a file that was both read and\n * written), which is why this is a list rather than a single value.\n */\n items: T[];\n children: PathTreeNode<T>[];\n}\n\nexport interface BuildPathTreeOptions<T> {\n /**\n * Orders siblings at every level. Defaults to the order items were first\n * seen, which preserves a already-sorted backend list as-is.\n */\n compare?: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number;\n}\n\n/**\n * Splits `value` into path segments on any character in `delimiters`, dropping\n * empty segments so leading, trailing and repeated separators are harmless.\n *\n * Characters outside `delimiters` are never separators: with `delimiters=\".\"`,\n * `\"remote-debugger.sql-xevent\"` yields two segments, not four — a hyphen is an\n * ordinary name character.\n */\nexport function splitPath(value: string, delimiters: string): string[] {\n if (!value) return [];\n if (!delimiters) return [value];\n const segments: string[] = [];\n let current = \"\";\n for (const character of value) {\n if (delimiters.includes(character)) {\n if (current) segments.push(current);\n current = \"\";\n } else {\n current += character;\n }\n }\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Builds a forest from items keyed by path.\n *\n * A node is created for every path prefix, and an item's full path *binds* to\n * whichever node it lands on — creating it if needed, reusing it if a\n * descendant already forced it into existence. That is what lets a node be both\n * a folder and a leaf: `[\"jms\"]` and `[\"jms\", \"incoming\"]` produce one `jms`\n * node that is simultaneously selectable and expandable.\n *\n * Items whose path is empty are skipped — they have no position in the tree.\n */\nexport function buildPathTree<T>(\n items: readonly T[],\n getPath: (item: T) => readonly string[],\n options: BuildPathTreeOptions<T> = {},\n): PathTreeNode<T>[] {\n const roots: PathTreeNode<T>[] = [];\n const byKey = new Map<string, PathTreeNode<T>>();\n\n for (const item of items) {\n const path = getPath(item);\n if (path.length === 0) continue;\n\n let siblings = roots;\n let key = \"\";\n let node: PathTreeNode<T> | undefined;\n path.forEach((segment, index) => {\n key = key ? `${key}${PATH_SEPARATOR}${segment}` : segment;\n let existing = byKey.get(key);\n if (!existing) {\n existing = {\n key,\n label: segment,\n path: path.slice(0, index + 1),\n items: [],\n children: [],\n };\n byKey.set(key, existing);\n siblings.push(existing);\n }\n siblings = existing.children;\n node = existing;\n });\n node?.items.push(item);\n }\n\n if (options.compare) sortTree(roots, options.compare);\n return roots;\n}\n\nfunction sortTree<T>(\n nodes: PathTreeNode<T>[],\n compare: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number,\n): void {\n nodes.sort(compare);\n for (const node of nodes) sortTree(node.children, compare);\n}\n\n/** True when the node exists only to hold descendants — nothing binds to it. */\nexport function isPathTreeFolder<T>(node: PathTreeNode<T>): boolean {\n return node.items.length === 0;\n}\n\n/**\n * A `compare` that puts nodes with children before plain leaves, then orders\n * each run alphabetically — the conventional file-explorer ordering.\n */\nexport function foldersFirst<T>(\n left: PathTreeNode<T>,\n right: PathTreeNode<T>,\n): number {\n const leftIsParent = left.children.length > 0;\n const rightIsParent = right.children.length > 0;\n if (leftIsParent !== rightIsParent) return leftIsParent ? -1 : 1;\n return left.label.localeCompare(right.label);\n}\n"],"mappings":";;AAOA,IAAa,iBAAiB;;;;;;;;;AAmC9B,SAAgB,UAAU,OAAe,YAA8B;CACrE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK;CAC9B,MAAM,WAAqB,CAAC;CAC5B,IAAI,UAAU;CACd,KAAK,MAAM,aAAa,OACtB,IAAI,WAAW,SAAS,SAAS,GAAG;EAClC,IAAI,SAAS,SAAS,KAAK,OAAO;EAClC,UAAU;CACZ,OACE,WAAW;CAGf,IAAI,SAAS,SAAS,KAAK,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,cACd,OACA,SACA,UAAmC,CAAC,GACjB;CACnB,MAAM,QAA2B,CAAC;CAClC,MAAM,wBAAQ,IAAI,IAA6B;CAE/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,KAAK,WAAW,GAAG;EAEvB,IAAI,WAAW;EACf,IAAI,MAAM;EACV,IAAI;EACJ,KAAK,SAAS,SAAS,UAAU;GAC/B,MAAM,MAAM,GAAG,OAAuB,YAAY;GAClD,IAAI,WAAW,MAAM,IAAI,GAAG;GAC5B,IAAI,CAAC,UAAU;IACb,WAAW;KACT;KACA,OAAO;KACP,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC;KAC7B,OAAO,CAAC;KACR,UAAU,CAAC;IACb;IACA,MAAM,IAAI,KAAK,QAAQ;IACvB,SAAS,KAAK,QAAQ;GACxB;GACA,WAAW,SAAS;GACpB,OAAO;EACT,CAAC;EACD,MAAM,MAAM,KAAK,IAAI;CACvB;CAEA,IAAI,QAAQ,SAAS,SAAS,OAAO,QAAQ,OAAO;CACpD,OAAO;AACT;AAEA,SAAS,SACP,OACA,SACM;CACN,MAAM,KAAK,OAAO;CAClB,KAAK,MAAM,QAAQ,OAAO,SAAS,KAAK,UAAU,OAAO;AAC3D;;AAGA,SAAgB,iBAAoB,MAAgC;CAClE,OAAO,KAAK,MAAM,WAAW;AAC/B;;;;;AAMA,SAAgB,aACd,MACA,OACQ;CACR,MAAM,eAAe,KAAK,SAAS,SAAS;CAE5C,IAAI,iBADkB,MAAM,SAAS,SAAS,GACV,OAAO,eAAe,KAAK;CAC/D,OAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7C"}
|
|
1
|
+
{"version":3,"file":"path-tree.js","names":[],"sources":["../../src/lib/path-tree.ts"],"sourcesContent":["// Turns a flat list of items that each carry a path into a tree, without\n// knowing anything about what the items are. Two independent surfaces need\n// exactly this shape — a session's changed-file list and a backend's\n// hierarchical nav surfaces — so the walker lives here rather than a third\n// time inside a component.\n\n/** The wire separator for a joined path. Matches clicky's entity.PathSeparator. */\nexport const PATH_SEPARATOR = \"/\";\n\nexport interface PathTreeNode<T> {\n /** The joined path — stable across rebuilds, so it works as a React/Tree key. */\n key: string;\n /** The node's own last segment. */\n label: string;\n /** Every segment from the root down to and including this node. */\n path: string[];\n /**\n * The items whose *full* path lands on this node. Empty means a pure folder\n * — a node that exists only because something below it does. More than one\n * means several items share a path (e.g. a file that was both read and\n * written), which is why this is a list rather than a single value.\n */\n items: T[];\n children: PathTreeNode<T>[];\n}\n\nexport interface BuildPathTreeOptions<T> {\n /**\n * Orders siblings at every level. Defaults to the order items were first\n * seen, which preserves a already-sorted backend list as-is.\n */\n compare?: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number;\n}\n\n/**\n * Splits `value` into path segments on any character in `delimiters`, dropping\n * empty segments so leading, trailing and repeated separators are harmless.\n *\n * Characters outside `delimiters` are never separators: with `delimiters=\".\"`,\n * `\"remote-debugger.sql-xevent\"` yields two segments, not four — a hyphen is an\n * ordinary name character.\n */\nexport function splitPath(value: string, delimiters: string): string[] {\n if (!value) return [];\n if (!delimiters) return [value];\n const segments: string[] = [];\n let current = \"\";\n for (const character of value) {\n if (delimiters.includes(character)) {\n if (current) segments.push(current);\n current = \"\";\n } else {\n current += character;\n }\n }\n if (current) segments.push(current);\n return segments;\n}\n\n/**\n * Builds a forest from items keyed by path.\n *\n * A node is created for every path prefix, and an item's full path *binds* to\n * whichever node it lands on — creating it if needed, reusing it if a\n * descendant already forced it into existence. That is what lets a node be both\n * a folder and a leaf: `[\"jms\"]` and `[\"jms\", \"incoming\"]` produce one `jms`\n * node that is simultaneously selectable and expandable.\n *\n * Items whose path is empty are skipped — they have no position in the tree.\n */\nexport function buildPathTree<T>(\n items: readonly T[],\n getPath: (item: T) => readonly string[],\n options: BuildPathTreeOptions<T> = {},\n): PathTreeNode<T>[] {\n const roots: PathTreeNode<T>[] = [];\n const byKey = new Map<string, PathTreeNode<T>>();\n\n for (const item of items) {\n const path = getPath(item);\n if (path.length === 0) continue;\n\n let siblings = roots;\n let key = \"\";\n let node: PathTreeNode<T> | undefined;\n path.forEach((segment, index) => {\n key = key ? `${key}${PATH_SEPARATOR}${segment}` : segment;\n let existing = byKey.get(key);\n if (!existing) {\n existing = {\n key,\n label: segment,\n path: path.slice(0, index + 1),\n items: [],\n children: [],\n };\n byKey.set(key, existing);\n siblings.push(existing);\n }\n siblings = existing.children;\n node = existing;\n });\n node?.items.push(item);\n }\n\n if (options.compare) sortTree(roots, options.compare);\n return roots;\n}\n\nfunction sortTree<T>(\n nodes: PathTreeNode<T>[],\n compare: (left: PathTreeNode<T>, right: PathTreeNode<T>) => number,\n): void {\n nodes.sort(compare);\n for (const node of nodes) sortTree(node.children, compare);\n}\n\n/** True when the node exists only to hold descendants — nothing binds to it. */\nexport function isPathTreeFolder<T>(node: PathTreeNode<T>): boolean {\n return node.items.length === 0;\n}\n\n/**\n * A `compare` that puts nodes with children before plain leaves, then orders\n * each run alphabetically — the conventional file-explorer ordering.\n */\nexport function foldersFirst<T>(\n left: PathTreeNode<T>,\n right: PathTreeNode<T>,\n): number {\n const leftIsParent = left.children.length > 0;\n const rightIsParent = right.children.length > 0;\n if (leftIsParent !== rightIsParent) return leftIsParent ? -1 : 1;\n return left.label.localeCompare(right.label);\n}\n\n/** Include/exclude state keyed by a node's joined path; neutral nodes are absent. */\nexport type TreeSelection = Record<string, \"include\" | \"exclude\">;\n\n/**\n * Decides whether `path` passes a tree include/exclude selection, where a\n * selection key stands for that path *and everything beneath it*.\n *\n * The deepest selected ancestor-or-self decides, so excluding `a/b` under an\n * included `a` carves `a/b` back out, and including `a/b/c` under an excluded\n * `a/b` restores it. When no ancestor-or-self is selected the path matches only\n * if the selection has no includes at all: with no includes everything matches\n * except excluded subtrees, with any include only included subtrees match.\n *\n * Keys match on whole segments — `acme/bill` does not select `acme/billing`.\n */\nexport function matchesTreeSelection(\n path: string,\n selection: TreeSelection,\n separator: string = PATH_SEPARATOR,\n): boolean {\n const segments = splitPath(path, separator);\n for (let depth = segments.length; depth > 0; depth--) {\n const mode = selection[segments.slice(0, depth).join(separator)];\n if (mode !== undefined) return mode === \"include\";\n }\n return !Object.values(selection).includes(\"include\");\n}\n"],"mappings":";;AAOA,IAAa,iBAAiB;;;;;;;;;AAmC9B,SAAgB,UAAU,OAAe,YAA8B;CACrE,IAAI,CAAC,OAAO,OAAO,CAAC;CACpB,IAAI,CAAC,YAAY,OAAO,CAAC,KAAK;CAC9B,MAAM,WAAqB,CAAC;CAC5B,IAAI,UAAU;CACd,KAAK,MAAM,aAAa,OACtB,IAAI,WAAW,SAAS,SAAS,GAAG;EAClC,IAAI,SAAS,SAAS,KAAK,OAAO;EAClC,UAAU;CACZ,OACE,WAAW;CAGf,IAAI,SAAS,SAAS,KAAK,OAAO;CAClC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,cACd,OACA,SACA,UAAmC,CAAC,GACjB;CACnB,MAAM,QAA2B,CAAC;CAClC,MAAM,wBAAQ,IAAI,IAA6B;CAE/C,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,KAAK,WAAW,GAAG;EAEvB,IAAI,WAAW;EACf,IAAI,MAAM;EACV,IAAI;EACJ,KAAK,SAAS,SAAS,UAAU;GAC/B,MAAM,MAAM,GAAG,OAAuB,YAAY;GAClD,IAAI,WAAW,MAAM,IAAI,GAAG;GAC5B,IAAI,CAAC,UAAU;IACb,WAAW;KACT;KACA,OAAO;KACP,MAAM,KAAK,MAAM,GAAG,QAAQ,CAAC;KAC7B,OAAO,CAAC;KACR,UAAU,CAAC;IACb;IACA,MAAM,IAAI,KAAK,QAAQ;IACvB,SAAS,KAAK,QAAQ;GACxB;GACA,WAAW,SAAS;GACpB,OAAO;EACT,CAAC;EACD,MAAM,MAAM,KAAK,IAAI;CACvB;CAEA,IAAI,QAAQ,SAAS,SAAS,OAAO,QAAQ,OAAO;CACpD,OAAO;AACT;AAEA,SAAS,SACP,OACA,SACM;CACN,MAAM,KAAK,OAAO;CAClB,KAAK,MAAM,QAAQ,OAAO,SAAS,KAAK,UAAU,OAAO;AAC3D;;AAGA,SAAgB,iBAAoB,MAAgC;CAClE,OAAO,KAAK,MAAM,WAAW;AAC/B;;;;;AAMA,SAAgB,aACd,MACA,OACQ;CACR,MAAM,eAAe,KAAK,SAAS,SAAS;CAE5C,IAAI,iBADkB,MAAM,SAAS,SAAS,GACV,OAAO,eAAe,KAAK;CAC/D,OAAO,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7C;;;;;;;;;;;;;AAiBA,SAAgB,qBACd,MACA,WACA,YAAA,KACS;CACT,MAAM,WAAW,UAAU,MAAM,SAAS;CAC1C,KAAK,IAAI,QAAQ,SAAS,QAAQ,QAAQ,GAAG,SAAS;EACpD,MAAM,OAAO,UAAU,SAAS,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS;EAC9D,IAAI,SAAS,KAAA,GAAW,OAAO,SAAS;CAC1C;CACA,OAAO,CAAC,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,SAAS;AACrD"}
|
package/dist/overlay/Modal.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_utils = require("../lib/utils.cjs");
|
|
2
|
+
const require_breakpoints = require("../lib/breakpoints.cjs");
|
|
2
3
|
const require_UiClose = require("../icons/components/UiClose.cjs");
|
|
3
4
|
const require_UiFullscreen = require("../icons/components/UiFullscreen.cjs");
|
|
4
5
|
const require_UiArrowLeft = require("../icons/components/UiArrowLeft.cjs");
|
|
@@ -25,7 +26,7 @@ var DEFAULT_CONFIRM = {
|
|
|
25
26
|
confirmLabel: "Discard",
|
|
26
27
|
cancelLabel: "Keep editing"
|
|
27
28
|
};
|
|
28
|
-
var MOBILE_QUERY = "
|
|
29
|
+
var MOBILE_QUERY = require_breakpoints.belowBreakpoint("sm");
|
|
29
30
|
var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
|
|
30
31
|
var MOBILE_TRANSITION_MS = 200;
|
|
31
32
|
var FOCUSABLE_SELECTOR = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.cjs","names":["useRef","useState","useModalStack","mediaMatches","cn","zIndex","Button","Icon","UiArrowLeft","UiFullscreenFilled","UiFullscreen","UiClose","createPortal"],"sources":["../../src/overlay/Modal.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"../components/button\";\nimport {\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiFullscreenFilled,\n} from \"../icons\";\nimport { mediaMatches } from \"../hooks/use-media-query\";\nimport { useEscapeLayer, useModalStack } from \"./modalStack\";\nimport { zIndex } from \"./zIndex\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\n/** Copy for the discard-confirmation prompt shown before a guarded close. */\nexport type ConfirmCloseOptions = {\n /** Heading of the confirmation prompt. */\n title?: ReactNode;\n /** Body explaining what is lost on close. */\n message?: ReactNode;\n /** Label of the button that proceeds with closing. */\n confirmLabel?: string;\n /** Label of the button that dismisses the prompt and keeps the modal open. */\n cancelLabel?: string;\n};\n\nexport type ModalProps = {\n /** Controls whether the modal is mounted. */\n open: boolean;\n /** Called when the modal requests to close. */\n onClose: () => void;\n /**\n * Guard every close path (close button, Escape, backdrop) behind a discard\n * confirmation. `true` uses the default copy; pass options to customise it.\n * `onClose` only fires once the user confirms. Set this while the modal holds\n * unsaved edits and clear it (or pass `false`) once there is nothing to lose.\n */\n confirmClose?: boolean | ConfirmCloseOptions;\n /** Header title and accessible dialog label when it is a string. */\n title?: ReactNode;\n /**\n * Secondary header content rendered on its own row directly beneath the title.\n * The title stays a single row alongside the expand/close buttons, so a tall\n * subtitle (e.g. a tab switcher) never pushes those buttons down.\n */\n subtitle?: ReactNode;\n /** Width/height preset for the dialog. */\n size?: ModalSize;\n /** Close when the backdrop is clicked. Off by default; close via Escape or the close button. */\n closeOnBackdrop?: boolean;\n /** Close when Escape is pressed. */\n closeOnEsc?: boolean;\n /** Hide the close button. */\n hideClose?: boolean;\n /** Show an expand/restore button. */\n expandable?: boolean;\n /** Classes applied to the dialog panel. */\n className?: string;\n /** Extra header content rendered before the expand/close buttons. */\n headerSlot?: ReactNode;\n /** Footer content pinned below the scrollable body. */\n footer?: ReactNode;\n /**\n * Whether the body scrolls its overflow. Default `true`. Set `false` when the\n * body owns a single fill-height child that scrolls internally (e.g. a\n * DataTable with a sticky header): the body becomes a non-scrolling flex\n * column, so only that child's own scroll region moves.\n */\n scrollBody?: boolean;\n /** Modal body content. */\n children: ReactNode;\n};\n\nconst sizeClass: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n \"2xl\": \"max-w-6xl\",\n full: \"max-w-[95vw]\",\n};\n\nconst DEFAULT_CONFIRM: Required<ConfirmCloseOptions> = {\n title: \"Discard changes?\",\n message: \"You have unsaved changes. Closing now will discard them.\",\n confirmLabel: \"Discard\",\n cancelLabel: \"Keep editing\",\n};\n\nconst MOBILE_QUERY = \"(max-width: 639px)\";\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst MOBILE_TRANSITION_MS = 200;\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction visibleFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n const style = window.getComputedStyle(element);\n return (\n !element.hidden &&\n style.display !== \"none\" &&\n style.visibility !== \"hidden\"\n );\n });\n}\n\nexport function Modal({\n open,\n onClose,\n confirmClose = false,\n title,\n subtitle,\n size = \"md\",\n closeOnBackdrop = false,\n closeOnEsc = true,\n hideClose = false,\n expandable = true,\n className,\n headerSlot,\n footer,\n scrollBody = true,\n children,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const closeTimerRef = useRef<number | undefined>(undefined);\n const openFrameRef = useRef<number | undefined>(undefined);\n const [present, setPresent] = useState(open);\n const [mobileVisible, setMobileVisible] = useState(false);\n const { depth } = useModalStack(present);\n const [expanded, setExpanded] = useState(false);\n // When confirmClose is active, a close request opens this prompt instead of\n // closing outright; onClose only fires once the user confirms the discard.\n const [confirming, setConfirming] = useState(false);\n\n // requestClose is the single entry point for every close affordance. With the\n // guard on, it surfaces the confirmation; otherwise it closes immediately.\n const requestClose = () => {\n if (confirmClose) setConfirming(true);\n else onClose();\n };\n\n useEffect(() => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n // Both false where the environment cannot be asked, which lands on the\n // desktop path: mount and unmount immediately, no deferred unmount to wait\n // on. That is the right answer under SSR and in a consumer's jsdom suite.\n const animateMobile =\n mediaMatches(MOBILE_QUERY) && !mediaMatches(REDUCED_MOTION_QUERY);\n\n if (open) {\n setPresent(true);\n if (animateMobile) {\n setMobileVisible(false);\n openFrameRef.current = window.requestAnimationFrame(() => {\n setMobileVisible(true);\n });\n } else {\n setMobileVisible(true);\n }\n } else if (animateMobile) {\n setMobileVisible(false);\n closeTimerRef.current = window.setTimeout(\n () => setPresent(false),\n MOBILE_TRANSITION_MS,\n );\n } else {\n setMobileVisible(false);\n setPresent(false);\n }\n\n return () => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n setExpanded(false);\n setConfirming(false);\n }\n }, [open]);\n\n // A close guard that disappears mid-prompt (changes saved/reverted) should\n // not leave a stale confirmation dialog up.\n useEffect(() => {\n if (!confirmClose) setConfirming(false);\n }, [confirmClose]);\n\n useEscapeLayer(present, () => {\n if (!open || !closeOnEsc) return;\n // While the prompt is up, Escape dismisses the prompt rather than the modal.\n if (confirming) setConfirming(false);\n else requestClose();\n });\n\n useEffect(() => {\n if (!open) return;\n const prev = document.activeElement as HTMLElement | null;\n dialogRef.current?.focus();\n return () => prev?.focus?.();\n }, [open]);\n\n if (!present) return null;\n\n const overlay = (\n <div\n className={cn(\n \"fixed inset-0 flex items-center justify-center p-density-2 sm:p-density-4 max-sm:items-stretch max-sm:justify-end max-sm:p-0 max-sm:!bg-transparent\",\n // Nested modals dim less so the dialog they opened over stays visible.\n depth === 0 ? \"bg-black/40\" : \"bg-black/20\",\n )}\n // Sits in the modal band of the centralized z-index scale; +depth keeps\n // nested modals above their parent. Floating content (dropdowns, tooltips)\n // computes its z relative to this via useFloatingZIndex so it clears the\n // modal instead of rendering behind it.\n style={{ zIndex: zIndex.modal + depth * zIndex.modalStep }}\n onClick={closeOnBackdrop ? requestClose : undefined}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === \"string\" ? title : undefined}\n data-state={mobileVisible ? \"open\" : \"closed\"}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n \"max-sm:!h-dvh max-sm:!max-h-dvh max-sm:!max-w-none max-sm:!rounded-none max-sm:!border-0 max-sm:shadow-none\",\n \"max-sm:transition-transform max-sm:duration-200 max-sm:ease-out max-sm:motion-reduce:transition-none\",\n \"max-sm:data-[state=closed]:translate-x-full max-sm:data-[state=open]:translate-x-0\",\n expanded ? sizeClass.full : sizeClass[size],\n className,\n )}\n // Inline maxHeight (not an arbitrary Tailwind class) so the panel stays\n // viewport-bounded even when a consumer's Tailwind build can't generate\n // the dvh utility — e.g. www aliases clicky-ui to source but scans the\n // published dist. When expanded, fill the viewport.\n style={{\n maxHeight: \"calc(100dvh - 2rem)\",\n ...(expanded ? { height: \"calc(100dvh - 2rem)\" } : {}),\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key !== \"Tab\") return;\n const scope = confirming\n ? dialogRef.current?.querySelector<HTMLElement>(\n \"[role='alertdialog']\",\n )\n : dialogRef.current;\n if (!scope) return;\n const focusable = visibleFocusableElements(scope);\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n event.preventDefault();\n scope.focus();\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }}\n >\n {(title || subtitle || headerSlot || expandable || !hideClose) && (\n <div className=\"shrink-0 px-density-4 py-density-3 border-b border-border max-sm:min-h-14 max-sm:bg-background\">\n <div className=\"flex items-center gap-density-2\">\n {!hideClose && (\n <Button\n type=\"button\"\n onClick={requestClose}\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n className=\"-ml-2 text-foreground sm:hidden\"\n >\n <Icon icon={UiArrowLeft} />\n </Button>\n )}\n {title ? (\n <h2 className=\"text-sm font-semibold flex-1 max-sm:text-base max-sm:leading-6\">\n {title}\n </h2>\n ) : (\n <span className=\"flex-1\" />\n )}\n {headerSlot}\n {expandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={\n expanded ? \"Restore size\" : \"Expand to fullscreen\"\n }\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={expanded ? UiFullscreenFilled : UiFullscreen} />\n </button>\n )}\n {!hideClose && (\n <button\n type=\"button\"\n onClick={requestClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </div>\n {subtitle ? <div className=\"mt-density-2\">{subtitle}</div> : null}\n </div>\n )}\n <div\n data-slot=\"modal-body\"\n className={cn(\n \"min-h-0 flex-1 px-density-4 py-density-3 max-sm:py-density-4\",\n scrollBody ? \"overflow-auto\" : \"flex flex-col overflow-hidden\",\n )}\n >\n {children}\n </div>\n {footer && (\n <div\n data-slot=\"modal-footer\"\n className=\"shrink-0 px-density-4 py-density-3 border-t border-border max-sm:py-density-4\"\n >\n {footer}\n </div>\n )}\n {confirming && (\n <ConfirmClosePrompt\n options={\n confirmClose === true\n ? DEFAULT_CONFIRM\n : { ...DEFAULT_CONFIRM, ...confirmClose }\n }\n onConfirm={() => {\n setConfirming(false);\n onClose();\n }}\n onCancel={() => setConfirming(false)}\n />\n )}\n </div>\n </div>\n );\n\n // Render into document.body so the fixed-position overlay escapes any ancestor\n // transform/overflow (e.g. a dropdown menu positioned via a CSS transform),\n // which would otherwise trap position:fixed inside that ancestor's box and clip\n // the modal to it.\n return typeof document !== \"undefined\"\n ? createPortal(overlay, document.body)\n : null;\n}\n\nfunction ConfirmClosePrompt({\n options,\n onConfirm,\n onCancel,\n}: {\n options: Required<ConfirmCloseOptions>;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center rounded-lg bg-background/80 p-density-4 max-sm:rounded-none\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={\n typeof options.title === \"string\" ? options.title : \"Confirm close\"\n }\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"w-full max-w-sm rounded-lg border border-border bg-background p-density-4 shadow-xl\">\n <h3 className=\"text-sm font-semibold\">{options.title}</h3>\n <p className=\"mt-density-2 text-sm text-muted-foreground\">\n {options.message}\n </p>\n <div className=\"mt-density-4 flex justify-end gap-density-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onConfirm}>\n {options.confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.cjs","names":["belowBreakpoint","useRef","useState","useModalStack","mediaMatches","cn","zIndex","Button","Icon","UiArrowLeft","UiFullscreenFilled","UiFullscreen","UiClose","createPortal"],"sources":["../../src/overlay/Modal.tsx"],"sourcesContent":["import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { Button } from \"../components/button\";\nimport {\n UiArrowLeft,\n UiClose,\n UiFullscreen,\n UiFullscreenFilled,\n} from \"../icons\";\nimport { mediaMatches } from \"../hooks/use-media-query\";\nimport { belowBreakpoint } from \"../lib/breakpoints\";\nimport { useEscapeLayer, useModalStack } from \"./modalStack\";\nimport { zIndex } from \"./zIndex\";\n\nexport type ModalSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n\n/** Copy for the discard-confirmation prompt shown before a guarded close. */\nexport type ConfirmCloseOptions = {\n /** Heading of the confirmation prompt. */\n title?: ReactNode;\n /** Body explaining what is lost on close. */\n message?: ReactNode;\n /** Label of the button that proceeds with closing. */\n confirmLabel?: string;\n /** Label of the button that dismisses the prompt and keeps the modal open. */\n cancelLabel?: string;\n};\n\nexport type ModalProps = {\n /** Controls whether the modal is mounted. */\n open: boolean;\n /** Called when the modal requests to close. */\n onClose: () => void;\n /**\n * Guard every close path (close button, Escape, backdrop) behind a discard\n * confirmation. `true` uses the default copy; pass options to customise it.\n * `onClose` only fires once the user confirms. Set this while the modal holds\n * unsaved edits and clear it (or pass `false`) once there is nothing to lose.\n */\n confirmClose?: boolean | ConfirmCloseOptions;\n /** Header title and accessible dialog label when it is a string. */\n title?: ReactNode;\n /**\n * Secondary header content rendered on its own row directly beneath the title.\n * The title stays a single row alongside the expand/close buttons, so a tall\n * subtitle (e.g. a tab switcher) never pushes those buttons down.\n */\n subtitle?: ReactNode;\n /** Width/height preset for the dialog. */\n size?: ModalSize;\n /** Close when the backdrop is clicked. Off by default; close via Escape or the close button. */\n closeOnBackdrop?: boolean;\n /** Close when Escape is pressed. */\n closeOnEsc?: boolean;\n /** Hide the close button. */\n hideClose?: boolean;\n /** Show an expand/restore button. */\n expandable?: boolean;\n /** Classes applied to the dialog panel. */\n className?: string;\n /** Extra header content rendered before the expand/close buttons. */\n headerSlot?: ReactNode;\n /** Footer content pinned below the scrollable body. */\n footer?: ReactNode;\n /**\n * Whether the body scrolls its overflow. Default `true`. Set `false` when the\n * body owns a single fill-height child that scrolls internally (e.g. a\n * DataTable with a sticky header): the body becomes a non-scrolling flex\n * column, so only that child's own scroll region moves.\n */\n scrollBody?: boolean;\n /** Modal body content. */\n children: ReactNode;\n};\n\nconst sizeClass: Record<ModalSize, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n \"2xl\": \"max-w-6xl\",\n full: \"max-w-[95vw]\",\n};\n\nconst DEFAULT_CONFIRM: Required<ConfirmCloseOptions> = {\n title: \"Discard changes?\",\n message: \"You have unsaved changes. Closing now will discard them.\",\n confirmLabel: \"Discard\",\n cancelLabel: \"Keep editing\",\n};\n\nconst MOBILE_QUERY = belowBreakpoint(\"sm\");\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\nconst MOBILE_TRANSITION_MS = 200;\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"[tabindex]:not([tabindex='-1'])\",\n].join(\",\");\n\nfunction visibleFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((element) => {\n const style = window.getComputedStyle(element);\n return (\n !element.hidden &&\n style.display !== \"none\" &&\n style.visibility !== \"hidden\"\n );\n });\n}\n\nexport function Modal({\n open,\n onClose,\n confirmClose = false,\n title,\n subtitle,\n size = \"md\",\n closeOnBackdrop = false,\n closeOnEsc = true,\n hideClose = false,\n expandable = true,\n className,\n headerSlot,\n footer,\n scrollBody = true,\n children,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const closeTimerRef = useRef<number | undefined>(undefined);\n const openFrameRef = useRef<number | undefined>(undefined);\n const [present, setPresent] = useState(open);\n const [mobileVisible, setMobileVisible] = useState(false);\n const { depth } = useModalStack(present);\n const [expanded, setExpanded] = useState(false);\n // When confirmClose is active, a close request opens this prompt instead of\n // closing outright; onClose only fires once the user confirms the discard.\n const [confirming, setConfirming] = useState(false);\n\n // requestClose is the single entry point for every close affordance. With the\n // guard on, it surfaces the confirmation; otherwise it closes immediately.\n const requestClose = () => {\n if (confirmClose) setConfirming(true);\n else onClose();\n };\n\n useEffect(() => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n // Both false where the environment cannot be asked, which lands on the\n // desktop path: mount and unmount immediately, no deferred unmount to wait\n // on. That is the right answer under SSR and in a consumer's jsdom suite.\n const animateMobile =\n mediaMatches(MOBILE_QUERY) && !mediaMatches(REDUCED_MOTION_QUERY);\n\n if (open) {\n setPresent(true);\n if (animateMobile) {\n setMobileVisible(false);\n openFrameRef.current = window.requestAnimationFrame(() => {\n setMobileVisible(true);\n });\n } else {\n setMobileVisible(true);\n }\n } else if (animateMobile) {\n setMobileVisible(false);\n closeTimerRef.current = window.setTimeout(\n () => setPresent(false),\n MOBILE_TRANSITION_MS,\n );\n } else {\n setMobileVisible(false);\n setPresent(false);\n }\n\n return () => {\n window.clearTimeout(closeTimerRef.current);\n window.cancelAnimationFrame(openFrameRef.current ?? 0);\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) {\n setExpanded(false);\n setConfirming(false);\n }\n }, [open]);\n\n // A close guard that disappears mid-prompt (changes saved/reverted) should\n // not leave a stale confirmation dialog up.\n useEffect(() => {\n if (!confirmClose) setConfirming(false);\n }, [confirmClose]);\n\n useEscapeLayer(present, () => {\n if (!open || !closeOnEsc) return;\n // While the prompt is up, Escape dismisses the prompt rather than the modal.\n if (confirming) setConfirming(false);\n else requestClose();\n });\n\n useEffect(() => {\n if (!open) return;\n const prev = document.activeElement as HTMLElement | null;\n dialogRef.current?.focus();\n return () => prev?.focus?.();\n }, [open]);\n\n if (!present) return null;\n\n const overlay = (\n <div\n className={cn(\n \"fixed inset-0 flex items-center justify-center p-density-2 sm:p-density-4 max-sm:items-stretch max-sm:justify-end max-sm:p-0 max-sm:!bg-transparent\",\n // Nested modals dim less so the dialog they opened over stays visible.\n depth === 0 ? \"bg-black/40\" : \"bg-black/20\",\n )}\n // Sits in the modal band of the centralized z-index scale; +depth keeps\n // nested modals above their parent. Floating content (dropdowns, tooltips)\n // computes its z relative to this via useFloatingZIndex so it clears the\n // modal instead of rendering behind it.\n style={{ zIndex: zIndex.modal + depth * zIndex.modalStep }}\n onClick={closeOnBackdrop ? requestClose : undefined}\n role=\"presentation\"\n >\n <div\n ref={dialogRef}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === \"string\" ? title : undefined}\n data-state={mobileVisible ? \"open\" : \"closed\"}\n className={cn(\n \"relative flex w-full flex-col overflow-hidden rounded-lg border border-border bg-background shadow-xl\",\n \"max-sm:!h-dvh max-sm:!max-h-dvh max-sm:!max-w-none max-sm:!rounded-none max-sm:!border-0 max-sm:shadow-none\",\n \"max-sm:transition-transform max-sm:duration-200 max-sm:ease-out max-sm:motion-reduce:transition-none\",\n \"max-sm:data-[state=closed]:translate-x-full max-sm:data-[state=open]:translate-x-0\",\n expanded ? sizeClass.full : sizeClass[size],\n className,\n )}\n // Inline maxHeight (not an arbitrary Tailwind class) so the panel stays\n // viewport-bounded even when a consumer's Tailwind build can't generate\n // the dvh utility — e.g. www aliases clicky-ui to source but scans the\n // published dist. When expanded, fill the viewport.\n style={{\n maxHeight: \"calc(100dvh - 2rem)\",\n ...(expanded ? { height: \"calc(100dvh - 2rem)\" } : {}),\n }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key !== \"Tab\") return;\n const scope = confirming\n ? dialogRef.current?.querySelector<HTMLElement>(\n \"[role='alertdialog']\",\n )\n : dialogRef.current;\n if (!scope) return;\n const focusable = visibleFocusableElements(scope);\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n event.preventDefault();\n scope.focus();\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n }}\n >\n {(title || subtitle || headerSlot || expandable || !hideClose) && (\n <div className=\"shrink-0 px-density-4 py-density-3 border-b border-border max-sm:min-h-14 max-sm:bg-background\">\n <div className=\"flex items-center gap-density-2\">\n {!hideClose && (\n <Button\n type=\"button\"\n onClick={requestClose}\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Back\"\n className=\"-ml-2 text-foreground sm:hidden\"\n >\n <Icon icon={UiArrowLeft} />\n </Button>\n )}\n {title ? (\n <h2 className=\"text-sm font-semibold flex-1 max-sm:text-base max-sm:leading-6\">\n {title}\n </h2>\n ) : (\n <span className=\"flex-1\" />\n )}\n {headerSlot}\n {expandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={\n expanded ? \"Restore size\" : \"Expand to fullscreen\"\n }\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={expanded ? UiFullscreenFilled : UiFullscreen} />\n </button>\n )}\n {!hideClose && (\n <button\n type=\"button\"\n onClick={requestClose}\n aria-label=\"Close\"\n className=\"text-muted-foreground hover:text-foreground max-sm:hidden\"\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </div>\n {subtitle ? <div className=\"mt-density-2\">{subtitle}</div> : null}\n </div>\n )}\n <div\n data-slot=\"modal-body\"\n className={cn(\n \"min-h-0 flex-1 px-density-4 py-density-3 max-sm:py-density-4\",\n scrollBody ? \"overflow-auto\" : \"flex flex-col overflow-hidden\",\n )}\n >\n {children}\n </div>\n {footer && (\n <div\n data-slot=\"modal-footer\"\n className=\"shrink-0 px-density-4 py-density-3 border-t border-border max-sm:py-density-4\"\n >\n {footer}\n </div>\n )}\n {confirming && (\n <ConfirmClosePrompt\n options={\n confirmClose === true\n ? DEFAULT_CONFIRM\n : { ...DEFAULT_CONFIRM, ...confirmClose }\n }\n onConfirm={() => {\n setConfirming(false);\n onClose();\n }}\n onCancel={() => setConfirming(false)}\n />\n )}\n </div>\n </div>\n );\n\n // Render into document.body so the fixed-position overlay escapes any ancestor\n // transform/overflow (e.g. a dropdown menu positioned via a CSS transform),\n // which would otherwise trap position:fixed inside that ancestor's box and clip\n // the modal to it.\n return typeof document !== \"undefined\"\n ? createPortal(overlay, document.body)\n : null;\n}\n\nfunction ConfirmClosePrompt({\n options,\n onConfirm,\n onCancel,\n}: {\n options: Required<ConfirmCloseOptions>;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n return (\n <div\n className=\"absolute inset-0 z-10 flex items-center justify-center rounded-lg bg-background/80 p-density-4 max-sm:rounded-none\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={\n typeof options.title === \"string\" ? options.title : \"Confirm close\"\n }\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"w-full max-w-sm rounded-lg border border-border bg-background p-density-4 shadow-xl\">\n <h3 className=\"text-sm font-semibold\">{options.title}</h3>\n <p className=\"mt-density-2 text-sm text-muted-foreground\">\n {options.message}\n </p>\n <div className=\"mt-density-4 flex justify-end gap-density-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel}\n </Button>\n <Button variant=\"destructive\" size=\"sm\" onClick={onConfirm}>\n {options.confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/overlay/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../src/overlay/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBpE,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAAG;IAChC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;IAC7C,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,gGAAgG;IAChG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oCAAoC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qCAAqC;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AA2CF,wBAAgB,KAAK,CAAC,EACpB,IAAI,EACJ,OAAO,EACP,YAAoB,EACpB,KAAK,EACL,QAAQ,EACR,IAAW,EACX,eAAuB,EACvB,UAAiB,EACjB,SAAiB,EACjB,UAAiB,EACjB,SAAS,EACT,UAAU,EACV,MAAM,EACN,UAAiB,EACjB,QAAQ,GACT,EAAE,UAAU,sCA6OZ"}
|
package/dist/overlay/Modal.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { belowBreakpoint } from "../lib/breakpoints.js";
|
|
2
3
|
import { UiClose } from "../icons/components/UiClose.js";
|
|
3
4
|
import { UiFullscreen, UiFullscreenFilled } from "../icons/components/UiFullscreen.js";
|
|
4
5
|
import { UiArrowLeft } from "../icons/components/UiArrowLeft.js";
|
|
@@ -25,7 +26,7 @@ var DEFAULT_CONFIRM = {
|
|
|
25
26
|
confirmLabel: "Discard",
|
|
26
27
|
cancelLabel: "Keep editing"
|
|
27
28
|
};
|
|
28
|
-
var MOBILE_QUERY = "
|
|
29
|
+
var MOBILE_QUERY = belowBreakpoint("sm");
|
|
29
30
|
var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
|
|
30
31
|
var MOBILE_TRANSITION_MS = 200;
|
|
31
32
|
var FOCUSABLE_SELECTOR = [
|