@k2b/ui 0.1.0-rc.0
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/LICENSE +661 -0
- package/README.md +343 -0
- package/dist/.build-complete +0 -0
- package/dist/browser/actions/Button.js +236 -0
- package/dist/browser/actions/Button.js.map +1 -0
- package/dist/browser/actions/ContextMenu.js +199 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -0
- package/dist/browser/actions/CopyButton.js +97 -0
- package/dist/browser/actions/CopyButton.js.map +1 -0
- package/dist/browser/actions/Disclosure.js +83 -0
- package/dist/browser/actions/Disclosure.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +669 -0
- package/dist/browser/actions/Dropdown.js.map +1 -0
- package/dist/browser/actions/FilterChip.js +149 -0
- package/dist/browser/actions/FilterChip.js.map +1 -0
- package/dist/browser/actions/RemoveButton.js +47 -0
- package/dist/browser/actions/RemoveButton.js.map +1 -0
- package/dist/browser/actions/SegmentedControl.js +138 -0
- package/dist/browser/actions/SegmentedControl.js.map +1 -0
- package/dist/browser/actions/SplitButton.js +76 -0
- package/dist/browser/actions/SplitButton.js.map +1 -0
- package/dist/browser/actions/SpotlightSearch.js +87 -0
- package/dist/browser/actions/SpotlightSearch.js.map +1 -0
- package/dist/browser/actions/Tabs.js +185 -0
- package/dist/browser/actions/Tabs.js.map +1 -0
- package/dist/browser/actions/Toolbar.js +87 -0
- package/dist/browser/actions/Toolbar.js.map +1 -0
- package/dist/browser/actions/index.js +13 -0
- package/dist/browser/actions/index.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +760 -0
- package/dist/browser/chat/ChatComposer.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +688 -0
- package/dist/browser/chat/ChatPrimitives.js.map +1 -0
- package/dist/browser/chat/ChatRoot.js +27 -0
- package/dist/browser/chat/ChatRoot.js.map +1 -0
- package/dist/browser/chat/ChatTimeline.js +404 -0
- package/dist/browser/chat/ChatTimeline.js.map +1 -0
- package/dist/browser/chat/chat-behavior.js +53 -0
- package/dist/browser/chat/chat-behavior.js.map +1 -0
- package/dist/browser/chat/index.js +17 -0
- package/dist/browser/chat/index.js.map +1 -0
- package/dist/browser/chat/types.js +2 -0
- package/dist/browser/chat/types.js.map +1 -0
- package/dist/browser/content/Calendar.js +2168 -0
- package/dist/browser/content/Calendar.js.map +1 -0
- package/dist/browser/content/Chart.js +680 -0
- package/dist/browser/content/Chart.js.map +1 -0
- package/dist/browser/content/CodeDisplay.js +104 -0
- package/dist/browser/content/CodeDisplay.js.map +1 -0
- package/dist/browser/content/DataTable.js +724 -0
- package/dist/browser/content/DataTable.js.map +1 -0
- package/dist/browser/content/Docs.js +227 -0
- package/dist/browser/content/Docs.js.map +1 -0
- package/dist/browser/content/FileBrowser.js +462 -0
- package/dist/browser/content/FileBrowser.js.map +1 -0
- package/dist/browser/content/FileTree.js +453 -0
- package/dist/browser/content/FileTree.js.map +1 -0
- package/dist/browser/content/FileView.js +842 -0
- package/dist/browser/content/FileView.js.map +1 -0
- package/dist/browser/content/Lightbox.js +285 -0
- package/dist/browser/content/Lightbox.js.map +1 -0
- package/dist/browser/content/LogEntriesTable.js +139 -0
- package/dist/browser/content/LogEntriesTable.js.map +1 -0
- package/dist/browser/content/MarkdownView.js +138 -0
- package/dist/browser/content/MarkdownView.js.map +1 -0
- package/dist/browser/content/Pagination.js +182 -0
- package/dist/browser/content/Pagination.js.map +1 -0
- package/dist/browser/content/PdfPreview.js +204 -0
- package/dist/browser/content/PdfPreview.js.map +1 -0
- package/dist/browser/content/RangePicker.js +83 -0
- package/dist/browser/content/RangePicker.js.map +1 -0
- package/dist/browser/content/StructuredDataPreview.js +194 -0
- package/dist/browser/content/StructuredDataPreview.js.map +1 -0
- package/dist/browser/content/calendar-event-layout.js +92 -0
- package/dist/browser/content/calendar-event-layout.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +114 -0
- package/dist/browser/content/calendar-pointer.js.map +1 -0
- package/dist/browser/content/chart-map-viewport.js +33 -0
- package/dist/browser/content/chart-map-viewport.js.map +1 -0
- package/dist/browser/content/chart-state-timeline.js +124 -0
- package/dist/browser/content/chart-state-timeline.js.map +1 -0
- package/dist/browser/content/code-highlight.js +144 -0
- package/dist/browser/content/code-highlight.js.map +1 -0
- package/dist/browser/content/file-tree.js +93 -0
- package/dist/browser/content/file-tree.js.map +1 -0
- package/dist/browser/content/file-view-preview.js +112 -0
- package/dist/browser/content/file-view-preview.js.map +1 -0
- package/dist/browser/content/index.js +16 -0
- package/dist/browser/content/index.js.map +1 -0
- package/dist/browser/feedback/InlineGuidance.js +46 -0
- package/dist/browser/feedback/InlineGuidance.js.map +1 -0
- package/dist/browser/feedback/Tooltip.js +189 -0
- package/dist/browser/feedback/Tooltip.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +207 -0
- package/dist/browser/feedback/dialog-core.js.map +1 -0
- package/dist/browser/feedback/index.js +6 -0
- package/dist/browser/feedback/index.js.map +1 -0
- package/dist/browser/feedback/prompts.js +991 -0
- package/dist/browser/feedback/prompts.js.map +1 -0
- package/dist/browser/feedback/toast.js +271 -0
- package/dist/browser/feedback/toast.js.map +1 -0
- package/dist/browser/feedback/tooltip-position.js +25 -0
- package/dist/browser/feedback/tooltip-position.js.map +1 -0
- package/dist/browser/index.js +11 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/inputs/AutocompleteEditor.js +610 -0
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -0
- package/dist/browser/inputs/AutocompleteSelect.js +632 -0
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -0
- package/dist/browser/inputs/Checkbox.js +137 -0
- package/dist/browser/inputs/Checkbox.js.map +1 -0
- package/dist/browser/inputs/CheckboxCard.js +130 -0
- package/dist/browser/inputs/CheckboxCard.js.map +1 -0
- package/dist/browser/inputs/ChoiceGroups.js +174 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -0
- package/dist/browser/inputs/ChoiceInputs.js +400 -0
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -0
- package/dist/browser/inputs/Combobox.js +274 -0
- package/dist/browser/inputs/Combobox.js.map +1 -0
- package/dist/browser/inputs/DatePicker.js +923 -0
- package/dist/browser/inputs/DatePicker.js.map +1 -0
- package/dist/browser/inputs/FileInputs.js +736 -0
- package/dist/browser/inputs/FileInputs.js.map +1 -0
- package/dist/browser/inputs/MultiSelectInput.js +565 -0
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -0
- package/dist/browser/inputs/NumberInput.js +288 -0
- package/dist/browser/inputs/NumberInput.js.map +1 -0
- package/dist/browser/inputs/Select.js +507 -0
- package/dist/browser/inputs/Select.js.map +1 -0
- package/dist/browser/inputs/SelectChip.js +151 -0
- package/dist/browser/inputs/SelectChip.js.map +1 -0
- package/dist/browser/inputs/SpecialInputs.js +117 -0
- package/dist/browser/inputs/SpecialInputs.js.map +1 -0
- package/dist/browser/inputs/Switch.js +117 -0
- package/dist/browser/inputs/Switch.js.map +1 -0
- package/dist/browser/inputs/TagEditor.js +358 -0
- package/dist/browser/inputs/TagEditor.js.map +1 -0
- package/dist/browser/inputs/TagsInput.js +195 -0
- package/dist/browser/inputs/TagsInput.js.map +1 -0
- package/dist/browser/inputs/TemplateEditor.js +190 -0
- package/dist/browser/inputs/TemplateEditor.js.map +1 -0
- package/dist/browser/inputs/TextInput.js +318 -0
- package/dist/browser/inputs/TextInput.js.map +1 -0
- package/dist/browser/inputs/choice.js +188 -0
- package/dist/browser/inputs/choice.js.map +1 -0
- package/dist/browser/inputs/completion/behaviors.js +108 -0
- package/dist/browser/inputs/completion/behaviors.js.map +1 -0
- package/dist/browser/inputs/completion/engine.js +103 -0
- package/dist/browser/inputs/completion/engine.js.map +1 -0
- package/dist/browser/inputs/completion/index.js +4 -0
- package/dist/browser/inputs/completion/index.js.map +1 -0
- package/dist/browser/inputs/completion/overlay.js +25 -0
- package/dist/browser/inputs/completion/overlay.js.map +1 -0
- package/dist/browser/inputs/date-picker.js +123 -0
- package/dist/browser/inputs/date-picker.js.map +1 -0
- package/dist/browser/inputs/editor-dom.js +26 -0
- package/dist/browser/inputs/editor-dom.js.map +1 -0
- package/dist/browser/inputs/field-contract.js +9 -0
- package/dist/browser/inputs/field-contract.js.map +1 -0
- package/dist/browser/inputs/icon-options.js +46 -0
- package/dist/browser/inputs/icon-options.js.map +1 -0
- package/dist/browser/inputs/image-crop.js +145 -0
- package/dist/browser/inputs/image-crop.js.map +1 -0
- package/dist/browser/inputs/index.js +23 -0
- package/dist/browser/inputs/index.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +725 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -0
- package/dist/browser/inputs/markdown/Toolbar.js +172 -0
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -0
- package/dist/browser/inputs/markdown/actions.js +140 -0
- package/dist/browser/inputs/markdown/actions.js.map +1 -0
- package/dist/browser/inputs/markdown/active-formats.js +36 -0
- package/dist/browser/inputs/markdown/active-formats.js.map +1 -0
- package/dist/browser/inputs/markdown/behaviors.js +63 -0
- package/dist/browser/inputs/markdown/behaviors.js.map +1 -0
- package/dist/browser/inputs/markdown/code-zone.js +8 -0
- package/dist/browser/inputs/markdown/code-zone.js.map +1 -0
- package/dist/browser/internal/color.js +18 -0
- package/dist/browser/internal/color.js.map +1 -0
- package/dist/browser/internal/field.js +158 -0
- package/dist/browser/internal/field.js.map +1 -0
- package/dist/browser/internal/portal.js +17 -0
- package/dist/browser/internal/portal.js.map +1 -0
- package/dist/browser/intl/Format.js +273 -0
- package/dist/browser/intl/Format.js.map +1 -0
- package/dist/browser/intl/index.js +3 -0
- package/dist/browser/intl/index.js.map +1 -0
- package/dist/browser/intl/locale.js +63 -0
- package/dist/browser/intl/locale.js.map +1 -0
- package/dist/browser/intl/messages.js +753 -0
- package/dist/browser/intl/messages.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +151 -0
- package/dist/browser/layout/AppOverview.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +1502 -0
- package/dist/browser/layout/AppWorkspace.js.map +1 -0
- package/dist/browser/layout/DataPanel.js +122 -0
- package/dist/browser/layout/DataPanel.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +484 -0
- package/dist/browser/layout/DetailPanel.js.map +1 -0
- package/dist/browser/layout/Discussion.js +511 -0
- package/dist/browser/layout/Discussion.js.map +1 -0
- package/dist/browser/layout/FloatingWindow.js +332 -0
- package/dist/browser/layout/FloatingWindow.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +236 -0
- package/dist/browser/layout/PanelDialog.js.map +1 -0
- package/dist/browser/layout/PanelHeader.js +91 -0
- package/dist/browser/layout/PanelHeader.js.map +1 -0
- package/dist/browser/layout/Panes.js +978 -0
- package/dist/browser/layout/Panes.js.map +1 -0
- package/dist/browser/layout/ScrollArea.js +29 -0
- package/dist/browser/layout/ScrollArea.js.map +1 -0
- package/dist/browser/layout/Settings.js +381 -0
- package/dist/browser/layout/Settings.js.map +1 -0
- package/dist/browser/layout/SettingsCollection.js +212 -0
- package/dist/browser/layout/SettingsCollection.js.map +1 -0
- package/dist/browser/layout/SettingsModal.js +281 -0
- package/dist/browser/layout/SettingsModal.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +419 -0
- package/dist/browser/layout/app-workspace-controller.js.map +1 -0
- package/dist/browser/layout/app-workspace-state.js +125 -0
- package/dist/browser/layout/app-workspace-state.js.map +1 -0
- package/dist/browser/layout/floating-window-geometry.js +15 -0
- package/dist/browser/layout/floating-window-geometry.js.map +1 -0
- package/dist/browser/layout/index.js +17 -0
- package/dist/browser/layout/index.js.map +1 -0
- package/dist/browser/layout/panes-layout.js +436 -0
- package/dist/browser/layout/panes-layout.js.map +1 -0
- package/dist/browser/layout/stable-id.js +17 -0
- package/dist/browser/layout/stable-id.js.map +1 -0
- package/dist/browser/semantics.js +2 -0
- package/dist/browser/semantics.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +97 -0
- package/dist/browser/surfaces/Avatar.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js +66 -0
- package/dist/browser/surfaces/DescriptionList.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +40 -0
- package/dist/browser/surfaces/LinkCard.js.map +1 -0
- package/dist/browser/surfaces/NotFoundState.js +85 -0
- package/dist/browser/surfaces/NotFoundState.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +145 -0
- package/dist/browser/surfaces/NoticeCard.js.map +1 -0
- package/dist/browser/surfaces/Paper.js +33 -0
- package/dist/browser/surfaces/Paper.js.map +1 -0
- package/dist/browser/surfaces/Placeholder.js +90 -0
- package/dist/browser/surfaces/Placeholder.js.map +1 -0
- package/dist/browser/surfaces/ProgressBar.js +58 -0
- package/dist/browser/surfaces/ProgressBar.js.map +1 -0
- package/dist/browser/surfaces/StatCell.js +172 -0
- package/dist/browser/surfaces/StatCell.js.map +1 -0
- package/dist/browser/surfaces/StatGrid.js +80 -0
- package/dist/browser/surfaces/StatGrid.js.map +1 -0
- package/dist/browser/surfaces/StatusBadge.js +70 -0
- package/dist/browser/surfaces/StatusBadge.js.map +1 -0
- package/dist/browser/surfaces/Tag.js +94 -0
- package/dist/browser/surfaces/Tag.js.map +1 -0
- package/dist/browser/surfaces/index.js +13 -0
- package/dist/browser/surfaces/index.js.map +1 -0
- package/dist/browser/widgets/Widget.js +89 -0
- package/dist/browser/widgets/Widget.js.map +1 -0
- package/dist/browser/widgets/WidgetHero.js +47 -0
- package/dist/browser/widgets/WidgetHero.js.map +1 -0
- package/dist/browser/widgets/WidgetList.js +125 -0
- package/dist/browser/widgets/WidgetList.js.map +1 -0
- package/dist/browser/widgets/WidgetPills.js +78 -0
- package/dist/browser/widgets/WidgetPills.js.map +1 -0
- package/dist/browser/widgets/WidgetStat.js +114 -0
- package/dist/browser/widgets/WidgetStat.js.map +1 -0
- package/dist/browser/widgets/WidgetStatus.js +54 -0
- package/dist/browser/widgets/WidgetStatus.js.map +1 -0
- package/dist/browser/widgets/index.js +7 -0
- package/dist/browser/widgets/index.js.map +1 -0
- package/dist/global.css +3 -0
- package/dist/licenses/ibm-plex-mono.txt +93 -0
- package/dist/licenses/ibm-plex-sans.txt +93 -0
- package/dist/licenses/tabler-icons.txt +21 -0
- package/dist/plex.css +1 -0
- package/dist/ssr/actions/Button.js +203 -0
- package/dist/ssr/actions/Button.js.map +1 -0
- package/dist/ssr/actions/ContextMenu.js +128 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -0
- package/dist/ssr/actions/CopyButton.js +79 -0
- package/dist/ssr/actions/CopyButton.js.map +1 -0
- package/dist/ssr/actions/Disclosure.js +26 -0
- package/dist/ssr/actions/Disclosure.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +443 -0
- package/dist/ssr/actions/Dropdown.js.map +1 -0
- package/dist/ssr/actions/FilterChip.js +132 -0
- package/dist/ssr/actions/FilterChip.js.map +1 -0
- package/dist/ssr/actions/RemoveButton.js +45 -0
- package/dist/ssr/actions/RemoveButton.js.map +1 -0
- package/dist/ssr/actions/SegmentedControl.js +57 -0
- package/dist/ssr/actions/SegmentedControl.js.map +1 -0
- package/dist/ssr/actions/SplitButton.js +74 -0
- package/dist/ssr/actions/SplitButton.js.map +1 -0
- package/dist/ssr/actions/SpotlightSearch.js +38 -0
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -0
- package/dist/ssr/actions/Tabs.js +91 -0
- package/dist/ssr/actions/Tabs.js.map +1 -0
- package/dist/ssr/actions/Toolbar.js +33 -0
- package/dist/ssr/actions/Toolbar.js.map +1 -0
- package/dist/ssr/actions/index.js +13 -0
- package/dist/ssr/actions/index.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +392 -0
- package/dist/ssr/chat/ChatComposer.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +377 -0
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -0
- package/dist/ssr/chat/ChatRoot.js +10 -0
- package/dist/ssr/chat/ChatRoot.js.map +1 -0
- package/dist/ssr/chat/ChatTimeline.js +301 -0
- package/dist/ssr/chat/ChatTimeline.js.map +1 -0
- package/dist/ssr/chat/chat-behavior.js +53 -0
- package/dist/ssr/chat/chat-behavior.js.map +1 -0
- package/dist/ssr/chat/index.js +17 -0
- package/dist/ssr/chat/index.js.map +1 -0
- package/dist/ssr/chat/types.js +2 -0
- package/dist/ssr/chat/types.js.map +1 -0
- package/dist/ssr/content/Calendar.js +1542 -0
- package/dist/ssr/content/Calendar.js.map +1 -0
- package/dist/ssr/content/Chart.js +552 -0
- package/dist/ssr/content/Chart.js.map +1 -0
- package/dist/ssr/content/CodeDisplay.js +55 -0
- package/dist/ssr/content/CodeDisplay.js.map +1 -0
- package/dist/ssr/content/DataTable.js +470 -0
- package/dist/ssr/content/DataTable.js.map +1 -0
- package/dist/ssr/content/Docs.js +108 -0
- package/dist/ssr/content/Docs.js.map +1 -0
- package/dist/ssr/content/FileBrowser.js +422 -0
- package/dist/ssr/content/FileBrowser.js.map +1 -0
- package/dist/ssr/content/FileTree.js +299 -0
- package/dist/ssr/content/FileTree.js.map +1 -0
- package/dist/ssr/content/FileView.js +612 -0
- package/dist/ssr/content/FileView.js.map +1 -0
- package/dist/ssr/content/Lightbox.js +164 -0
- package/dist/ssr/content/Lightbox.js.map +1 -0
- package/dist/ssr/content/LogEntriesTable.js +106 -0
- package/dist/ssr/content/LogEntriesTable.js.map +1 -0
- package/dist/ssr/content/MarkdownView.js +119 -0
- package/dist/ssr/content/MarkdownView.js.map +1 -0
- package/dist/ssr/content/Pagination.js +141 -0
- package/dist/ssr/content/Pagination.js.map +1 -0
- package/dist/ssr/content/PdfPreview.js +126 -0
- package/dist/ssr/content/PdfPreview.js.map +1 -0
- package/dist/ssr/content/RangePicker.js +35 -0
- package/dist/ssr/content/RangePicker.js.map +1 -0
- package/dist/ssr/content/StructuredDataPreview.js +127 -0
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -0
- package/dist/ssr/content/calendar-event-layout.js +92 -0
- package/dist/ssr/content/calendar-event-layout.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +114 -0
- package/dist/ssr/content/calendar-pointer.js.map +1 -0
- package/dist/ssr/content/chart-map-viewport.js +33 -0
- package/dist/ssr/content/chart-map-viewport.js.map +1 -0
- package/dist/ssr/content/chart-state-timeline.js +124 -0
- package/dist/ssr/content/chart-state-timeline.js.map +1 -0
- package/dist/ssr/content/code-highlight.js +144 -0
- package/dist/ssr/content/code-highlight.js.map +1 -0
- package/dist/ssr/content/file-tree.js +93 -0
- package/dist/ssr/content/file-tree.js.map +1 -0
- package/dist/ssr/content/file-view-preview.js +112 -0
- package/dist/ssr/content/file-view-preview.js.map +1 -0
- package/dist/ssr/content/index.js +16 -0
- package/dist/ssr/content/index.js.map +1 -0
- package/dist/ssr/feedback/InlineGuidance.js +26 -0
- package/dist/ssr/feedback/InlineGuidance.js.map +1 -0
- package/dist/ssr/feedback/Tooltip.js +156 -0
- package/dist/ssr/feedback/Tooltip.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +207 -0
- package/dist/ssr/feedback/dialog-core.js.map +1 -0
- package/dist/ssr/feedback/index.js +6 -0
- package/dist/ssr/feedback/index.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +703 -0
- package/dist/ssr/feedback/prompts.js.map +1 -0
- package/dist/ssr/feedback/toast.js +271 -0
- package/dist/ssr/feedback/toast.js.map +1 -0
- package/dist/ssr/feedback/tooltip-position.js +25 -0
- package/dist/ssr/feedback/tooltip-position.js.map +1 -0
- package/dist/ssr/index.js +11 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/inputs/AutocompleteEditor.js +463 -0
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -0
- package/dist/ssr/inputs/AutocompleteSelect.js +420 -0
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -0
- package/dist/ssr/inputs/Checkbox.js +75 -0
- package/dist/ssr/inputs/Checkbox.js.map +1 -0
- package/dist/ssr/inputs/CheckboxCard.js +69 -0
- package/dist/ssr/inputs/CheckboxCard.js.map +1 -0
- package/dist/ssr/inputs/ChoiceGroups.js +101 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js +250 -0
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -0
- package/dist/ssr/inputs/Combobox.js +177 -0
- package/dist/ssr/inputs/Combobox.js.map +1 -0
- package/dist/ssr/inputs/DatePicker.js +629 -0
- package/dist/ssr/inputs/DatePicker.js.map +1 -0
- package/dist/ssr/inputs/FileInputs.js +543 -0
- package/dist/ssr/inputs/FileInputs.js.map +1 -0
- package/dist/ssr/inputs/MultiSelectInput.js +347 -0
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -0
- package/dist/ssr/inputs/NumberInput.js +177 -0
- package/dist/ssr/inputs/NumberInput.js.map +1 -0
- package/dist/ssr/inputs/Select.js +308 -0
- package/dist/ssr/inputs/Select.js.map +1 -0
- package/dist/ssr/inputs/SelectChip.js +129 -0
- package/dist/ssr/inputs/SelectChip.js.map +1 -0
- package/dist/ssr/inputs/SpecialInputs.js +116 -0
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -0
- package/dist/ssr/inputs/Switch.js +62 -0
- package/dist/ssr/inputs/Switch.js.map +1 -0
- package/dist/ssr/inputs/TagEditor.js +280 -0
- package/dist/ssr/inputs/TagEditor.js.map +1 -0
- package/dist/ssr/inputs/TagsInput.js +122 -0
- package/dist/ssr/inputs/TagsInput.js.map +1 -0
- package/dist/ssr/inputs/TemplateEditor.js +164 -0
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -0
- package/dist/ssr/inputs/TextInput.js +211 -0
- package/dist/ssr/inputs/TextInput.js.map +1 -0
- package/dist/ssr/inputs/choice.js +188 -0
- package/dist/ssr/inputs/choice.js.map +1 -0
- package/dist/ssr/inputs/completion/behaviors.js +108 -0
- package/dist/ssr/inputs/completion/behaviors.js.map +1 -0
- package/dist/ssr/inputs/completion/engine.js +103 -0
- package/dist/ssr/inputs/completion/engine.js.map +1 -0
- package/dist/ssr/inputs/completion/index.js +4 -0
- package/dist/ssr/inputs/completion/index.js.map +1 -0
- package/dist/ssr/inputs/completion/overlay.js +25 -0
- package/dist/ssr/inputs/completion/overlay.js.map +1 -0
- package/dist/ssr/inputs/date-picker.js +123 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -0
- package/dist/ssr/inputs/editor-dom.js +26 -0
- package/dist/ssr/inputs/editor-dom.js.map +1 -0
- package/dist/ssr/inputs/field-contract.js +9 -0
- package/dist/ssr/inputs/field-contract.js.map +1 -0
- package/dist/ssr/inputs/icon-options.js +46 -0
- package/dist/ssr/inputs/icon-options.js.map +1 -0
- package/dist/ssr/inputs/image-crop.js +145 -0
- package/dist/ssr/inputs/image-crop.js.map +1 -0
- package/dist/ssr/inputs/index.js +23 -0
- package/dist/ssr/inputs/index.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +516 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -0
- package/dist/ssr/inputs/markdown/Toolbar.js +115 -0
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -0
- package/dist/ssr/inputs/markdown/actions.js +140 -0
- package/dist/ssr/inputs/markdown/actions.js.map +1 -0
- package/dist/ssr/inputs/markdown/active-formats.js +36 -0
- package/dist/ssr/inputs/markdown/active-formats.js.map +1 -0
- package/dist/ssr/inputs/markdown/behaviors.js +63 -0
- package/dist/ssr/inputs/markdown/behaviors.js.map +1 -0
- package/dist/ssr/inputs/markdown/code-zone.js +8 -0
- package/dist/ssr/inputs/markdown/code-zone.js.map +1 -0
- package/dist/ssr/internal/color.js +18 -0
- package/dist/ssr/internal/color.js.map +1 -0
- package/dist/ssr/internal/field.js +90 -0
- package/dist/ssr/internal/field.js.map +1 -0
- package/dist/ssr/internal/portal.js +17 -0
- package/dist/ssr/internal/portal.js.map +1 -0
- package/dist/ssr/intl/Format.js +192 -0
- package/dist/ssr/intl/Format.js.map +1 -0
- package/dist/ssr/intl/index.js +3 -0
- package/dist/ssr/intl/index.js.map +1 -0
- package/dist/ssr/intl/locale.js +63 -0
- package/dist/ssr/intl/locale.js.map +1 -0
- package/dist/ssr/intl/messages.js +753 -0
- package/dist/ssr/intl/messages.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +85 -0
- package/dist/ssr/layout/AppOverview.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +976 -0
- package/dist/ssr/layout/AppWorkspace.js.map +1 -0
- package/dist/ssr/layout/DataPanel.js +101 -0
- package/dist/ssr/layout/DataPanel.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +284 -0
- package/dist/ssr/layout/DetailPanel.js.map +1 -0
- package/dist/ssr/layout/Discussion.js +319 -0
- package/dist/ssr/layout/Discussion.js.map +1 -0
- package/dist/ssr/layout/FloatingWindow.js +259 -0
- package/dist/ssr/layout/FloatingWindow.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +136 -0
- package/dist/ssr/layout/PanelDialog.js.map +1 -0
- package/dist/ssr/layout/PanelHeader.js +45 -0
- package/dist/ssr/layout/PanelHeader.js.map +1 -0
- package/dist/ssr/layout/Panes.js +678 -0
- package/dist/ssr/layout/Panes.js.map +1 -0
- package/dist/ssr/layout/ScrollArea.js +18 -0
- package/dist/ssr/layout/ScrollArea.js.map +1 -0
- package/dist/ssr/layout/Settings.js +219 -0
- package/dist/ssr/layout/Settings.js.map +1 -0
- package/dist/ssr/layout/SettingsCollection.js +150 -0
- package/dist/ssr/layout/SettingsCollection.js.map +1 -0
- package/dist/ssr/layout/SettingsModal.js +156 -0
- package/dist/ssr/layout/SettingsModal.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +419 -0
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -0
- package/dist/ssr/layout/app-workspace-state.js +125 -0
- package/dist/ssr/layout/app-workspace-state.js.map +1 -0
- package/dist/ssr/layout/floating-window-geometry.js +15 -0
- package/dist/ssr/layout/floating-window-geometry.js.map +1 -0
- package/dist/ssr/layout/index.js +17 -0
- package/dist/ssr/layout/index.js.map +1 -0
- package/dist/ssr/layout/panes-layout.js +436 -0
- package/dist/ssr/layout/panes-layout.js.map +1 -0
- package/dist/ssr/layout/stable-id.js +17 -0
- package/dist/ssr/layout/stable-id.js.map +1 -0
- package/dist/ssr/semantics.js +2 -0
- package/dist/ssr/semantics.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +43 -0
- package/dist/ssr/surfaces/Avatar.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js +25 -0
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +25 -0
- package/dist/ssr/surfaces/LinkCard.js.map +1 -0
- package/dist/ssr/surfaces/NotFoundState.js +38 -0
- package/dist/ssr/surfaces/NotFoundState.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +83 -0
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -0
- package/dist/ssr/surfaces/Paper.js +32 -0
- package/dist/ssr/surfaces/Paper.js.map +1 -0
- package/dist/ssr/surfaces/Placeholder.js +76 -0
- package/dist/ssr/surfaces/Placeholder.js.map +1 -0
- package/dist/ssr/surfaces/ProgressBar.js +13 -0
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -0
- package/dist/ssr/surfaces/StatCell.js +80 -0
- package/dist/ssr/surfaces/StatCell.js.map +1 -0
- package/dist/ssr/surfaces/StatGrid.js +62 -0
- package/dist/ssr/surfaces/StatGrid.js.map +1 -0
- package/dist/ssr/surfaces/StatusBadge.js +38 -0
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -0
- package/dist/ssr/surfaces/Tag.js +32 -0
- package/dist/ssr/surfaces/Tag.js.map +1 -0
- package/dist/ssr/surfaces/index.js +13 -0
- package/dist/ssr/surfaces/index.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +54 -0
- package/dist/ssr/widgets/Widget.js.map +1 -0
- package/dist/ssr/widgets/WidgetHero.js +23 -0
- package/dist/ssr/widgets/WidgetHero.js.map +1 -0
- package/dist/ssr/widgets/WidgetList.js +73 -0
- package/dist/ssr/widgets/WidgetList.js.map +1 -0
- package/dist/ssr/widgets/WidgetPills.js +40 -0
- package/dist/ssr/widgets/WidgetPills.js.map +1 -0
- package/dist/ssr/widgets/WidgetStat.js +45 -0
- package/dist/ssr/widgets/WidgetStat.js.map +1 -0
- package/dist/ssr/widgets/WidgetStatus.js +23 -0
- package/dist/ssr/widgets/WidgetStatus.js.map +1 -0
- package/dist/ssr/widgets/index.js +7 -0
- package/dist/ssr/widgets/index.js.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
- package/dist/tabler.css +4 -0
- package/package.json +77 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;
|
|
2
|
+
export const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;
|
|
3
|
+
export const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;
|
|
4
|
+
export const APP_WORKSPACE_SIDEBAR_MIN = 176;
|
|
5
|
+
export const APP_WORKSPACE_SIDEBAR_MAX = 360;
|
|
6
|
+
/** Absolute persistence envelope for sidebars with an app-defined wider max. */
|
|
7
|
+
const APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;
|
|
8
|
+
export const APP_WORKSPACE_DETAIL_DEFAULT = 384;
|
|
9
|
+
export const APP_WORKSPACE_DETAIL_MIN = 288;
|
|
10
|
+
export const APP_WORKSPACE_DETAIL_MAX = 640;
|
|
11
|
+
export const APP_WORKSPACE_DRAWER_DEFAULT = 240;
|
|
12
|
+
export const APP_WORKSPACE_DRAWER_MIN = 160;
|
|
13
|
+
export const APP_WORKSPACE_DRAWER_MAX = 560;
|
|
14
|
+
/** Space `appWorkspaceResizeLimits` always reserves for the main region. */
|
|
15
|
+
export const APP_WORKSPACE_MAIN_MIN = 320;
|
|
16
|
+
export const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;
|
|
17
|
+
export const APP_WORKSPACE_PANE_DEFAULT = 320;
|
|
18
|
+
export const APP_WORKSPACE_PANE_MIN = 240;
|
|
19
|
+
export const APP_WORKSPACE_PANE_MAX = 640;
|
|
20
|
+
export const appWorkspaceResizeLimits = options => {
|
|
21
|
+
const min = options.min ?? (options.kind === "sidebar" ? options.sidebarCollapsible ? APP_WORKSPACE_SIDEBAR_COLLAPSED : APP_WORKSPACE_SIDEBAR_MIN : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MIN : options.kind === "pane" ? APP_WORKSPACE_PANE_MIN : APP_WORKSPACE_DRAWER_MIN);
|
|
22
|
+
const configuredMax = options.max ?? (options.kind === "sidebar" ? APP_WORKSPACE_SIDEBAR_MAX : options.kind === "detail" ? APP_WORKSPACE_DETAIL_MAX : options.kind === "pane" ? APP_WORKSPACE_PANE_MAX : APP_WORKSPACE_DRAWER_MAX);
|
|
23
|
+
const mainMinimum = options.kind === "drawer" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;
|
|
24
|
+
return {
|
|
25
|
+
min,
|
|
26
|
+
max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum))
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Fits preferred auxiliary pane widths into a shared budget without giving
|
|
32
|
+
* DOM order priority. Minimums are reserved first; remaining space is shared
|
|
33
|
+
* in proportion to how much each pane still needs to reach its preference.
|
|
34
|
+
*/
|
|
35
|
+
export const fitAppWorkspacePaneSizes = (panes, availableSize) => {
|
|
36
|
+
const sizes = panes.map(pane => pane.min);
|
|
37
|
+
const minimumTotal = sizes.reduce((total, size) => total + size, 0);
|
|
38
|
+
const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);
|
|
39
|
+
const budget = Math.max(0, Math.floor(availableSize));
|
|
40
|
+
if (desiredTotal <= budget) return panes.map(pane => pane.desired);
|
|
41
|
+
if (budget <= minimumTotal) return sizes;
|
|
42
|
+
const extraBudget = budget - minimumTotal;
|
|
43
|
+
const desiredExtra = desiredTotal - minimumTotal;
|
|
44
|
+
const fractions = panes.map((pane, index) => {
|
|
45
|
+
const raw = (pane.desired - pane.min) * extraBudget / desiredExtra;
|
|
46
|
+
const extra = Math.floor(raw);
|
|
47
|
+
sizes[index] += extra;
|
|
48
|
+
return {
|
|
49
|
+
fraction: raw - extra,
|
|
50
|
+
index
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index].min, 0);
|
|
54
|
+
fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);
|
|
55
|
+
for (const {
|
|
56
|
+
index
|
|
57
|
+
} of fractions) {
|
|
58
|
+
if (remainder-- <= 0) break;
|
|
59
|
+
sizes[index] += 1;
|
|
60
|
+
}
|
|
61
|
+
return sizes;
|
|
62
|
+
};
|
|
63
|
+
export const shouldCollapseAppWorkspaceSidebar = (width, collapsible) => collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;
|
|
64
|
+
export const resolveAppWorkspaceSidebarWidth = (width, maxWidth, collapsible) => shouldCollapseAppWorkspaceSidebar(width, collapsible) ? {
|
|
65
|
+
width: APP_WORKSPACE_SIDEBAR_COLLAPSED,
|
|
66
|
+
collapsed: true
|
|
67
|
+
} : {
|
|
68
|
+
width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))),
|
|
69
|
+
collapsed: false
|
|
70
|
+
};
|
|
71
|
+
const finiteSize = (value, min, max) => typeof value === "number" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;
|
|
72
|
+
export const safeAppWorkspacePanelId = panelId => isStableUiId(panelId) ? panelId : "";
|
|
73
|
+
const normalizeSizes = (value, min, max) => {
|
|
74
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
75
|
+
const entries = Object.entries(value).slice(0, 16).flatMap(([key, size]) => {
|
|
76
|
+
const normalized = finiteSize(size, min, max);
|
|
77
|
+
return isStableUiId(key) && normalized !== undefined ? [[key, normalized]] : [];
|
|
78
|
+
});
|
|
79
|
+
return entries.length ? Object.fromEntries(entries) : undefined;
|
|
80
|
+
};
|
|
81
|
+
export const appWorkspacePanelVariable = (kind, panelId) => `--k2b-workspace-${kind}-${assertStableUiId(panelId, "AppWorkspace panel id")}-${kind === "drawer" ? "height" : "width"}`;
|
|
82
|
+
export const normalizeAppWorkspaceLayoutState = value => {
|
|
83
|
+
if (!value || typeof value !== "object") return null;
|
|
84
|
+
const candidate = value;
|
|
85
|
+
if (candidate.version !== 1 && candidate.version !== 2) return null;
|
|
86
|
+
const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);
|
|
87
|
+
const sidebarCollapsed = typeof candidate.sidebarCollapsed === "boolean" ? candidate.sidebarCollapsed : undefined;
|
|
88
|
+
// Keyed panel maps only exist from version 2 on; a version-1 payload that
|
|
89
|
+
// carries them was not written by this component and is not trusted.
|
|
90
|
+
const legacy = candidate.version === 1;
|
|
91
|
+
const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);
|
|
92
|
+
const detailWidths = legacy ? (() => {
|
|
93
|
+
const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);
|
|
94
|
+
return width === undefined ? undefined : {
|
|
95
|
+
primary: width
|
|
96
|
+
};
|
|
97
|
+
})() : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);
|
|
98
|
+
const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);
|
|
99
|
+
return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights ? null : {
|
|
100
|
+
version: 2,
|
|
101
|
+
sidebarWidth,
|
|
102
|
+
sidebarCollapsed,
|
|
103
|
+
paneWidths,
|
|
104
|
+
detailWidths,
|
|
105
|
+
drawerHeights
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
export const parseAppWorkspaceLayoutState = value => {
|
|
109
|
+
if (!value) return null;
|
|
110
|
+
try {
|
|
111
|
+
return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));
|
|
112
|
+
} catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
export const serializeAppWorkspaceLayoutState = state => encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? {
|
|
117
|
+
version: 2
|
|
118
|
+
}));
|
|
119
|
+
export const appWorkspaceLayoutStyle = state => {
|
|
120
|
+
if (!state) return undefined;
|
|
121
|
+
const declarations = [state.sidebarCollapsed ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px` : state.sidebarWidth === undefined ? null : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`, ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable("pane", id)}:${width}px`), ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable("detail", id)}:${width}px`), ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable("drawer", id)}:${height}px`)].filter(Boolean);
|
|
122
|
+
return declarations.length ? declarations.join(";") : undefined;
|
|
123
|
+
};
|
|
124
|
+
import { assertStableUiId, isStableUiId } from "./stable-id";
|
|
125
|
+
//# sourceMappingURL=app-workspace-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["APP_WORKSPACE_SIDEBAR_DEFAULT","APP_WORKSPACE_SIDEBAR_COLLAPSED","APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD","APP_WORKSPACE_SIDEBAR_MIN","APP_WORKSPACE_SIDEBAR_MAX","APP_WORKSPACE_SIDEBAR_STATE_MAX","APP_WORKSPACE_DETAIL_DEFAULT","APP_WORKSPACE_DETAIL_MIN","APP_WORKSPACE_DETAIL_MAX","APP_WORKSPACE_DRAWER_DEFAULT","APP_WORKSPACE_DRAWER_MIN","APP_WORKSPACE_DRAWER_MAX","APP_WORKSPACE_MAIN_MIN","APP_WORKSPACE_MAIN_MIN_HEIGHT","APP_WORKSPACE_PANE_DEFAULT","APP_WORKSPACE_PANE_MIN","APP_WORKSPACE_PANE_MAX","appWorkspaceResizeLimits","options","min","kind","sidebarCollapsible","configuredMax","max","mainMinimum","Math","workspaceSize","reservedSize","fitAppWorkspacePaneSizes","panes","availableSize","sizes","map","pane","minimumTotal","reduce","total","size","desiredTotal","desired","budget","floor","extraBudget","desiredExtra","fractions","index","raw","extra","fraction","remainder","sort","a","b","shouldCollapseAppWorkspaceSidebar","width","collapsible","resolveAppWorkspaceSidebarWidth","maxWidth","collapsed","round","finiteSize","value","Number","isFinite","undefined","safeAppWorkspacePanelId","panelId","isStableUiId","normalizeSizes","Array","isArray","entries","Object","slice","flatMap","key","normalized","length","fromEntries","appWorkspacePanelVariable","assertStableUiId","normalizeAppWorkspaceLayoutState","candidate","version","sidebarWidth","sidebarCollapsed","legacy","paneWidths","detailWidths","detailWidth","primary","drawerHeights","parseAppWorkspaceLayoutState","JSON","parse","decodeURIComponent","serializeAppWorkspaceLayoutState","state","encodeURIComponent","stringify","appWorkspaceLayoutStyle","declarations","id","height","filter","Boolean","join"],"sources":["layout/app-workspace-state.ts"],"sourcesContent":["export type AppWorkspaceLayoutState = {\n version: 2;\n sidebarWidth?: number;\n sidebarCollapsed?: boolean;\n paneWidths?: Record<string, number>;\n detailWidths?: Record<string, number>;\n drawerHeights?: Record<string, number>;\n};\n\nexport const APP_WORKSPACE_SIDEBAR_DEFAULT = 208;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSED = 64;\nexport const APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD = 128;\nexport const APP_WORKSPACE_SIDEBAR_MIN = 176;\nexport const APP_WORKSPACE_SIDEBAR_MAX = 360;\n/** Absolute persistence envelope for sidebars with an app-defined wider max. */\nconst APP_WORKSPACE_SIDEBAR_STATE_MAX = 960;\nexport const APP_WORKSPACE_DETAIL_DEFAULT = 384;\nexport const APP_WORKSPACE_DETAIL_MIN = 288;\nexport const APP_WORKSPACE_DETAIL_MAX = 640;\nexport const APP_WORKSPACE_DRAWER_DEFAULT = 240;\nexport const APP_WORKSPACE_DRAWER_MIN = 160;\nexport const APP_WORKSPACE_DRAWER_MAX = 560;\n/** Space `appWorkspaceResizeLimits` always reserves for the main region. */\nexport const APP_WORKSPACE_MAIN_MIN = 320;\nexport const APP_WORKSPACE_MAIN_MIN_HEIGHT = 240;\nexport const APP_WORKSPACE_PANE_DEFAULT = 320;\nexport const APP_WORKSPACE_PANE_MIN = 240;\nexport const APP_WORKSPACE_PANE_MAX = 640;\n\nexport type AppWorkspaceResizeKind = \"sidebar\" | \"pane\" | \"detail\" | \"drawer\";\n\nexport const appWorkspaceResizeLimits = (options: {\n kind: AppWorkspaceResizeKind;\n workspaceSize: number;\n reservedSize: number;\n min?: number;\n max?: number;\n sidebarCollapsible?: boolean;\n}): { min: number; max: number } => {\n const min =\n options.min ??\n (options.kind === \"sidebar\"\n ? options.sidebarCollapsible\n ? APP_WORKSPACE_SIDEBAR_COLLAPSED\n : APP_WORKSPACE_SIDEBAR_MIN\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MIN\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MIN\n : APP_WORKSPACE_DRAWER_MIN);\n const configuredMax =\n options.max ??\n (options.kind === \"sidebar\"\n ? APP_WORKSPACE_SIDEBAR_MAX\n : options.kind === \"detail\"\n ? APP_WORKSPACE_DETAIL_MAX\n : options.kind === \"pane\"\n ? APP_WORKSPACE_PANE_MAX\n : APP_WORKSPACE_DRAWER_MAX);\n const mainMinimum = options.kind === \"drawer\" ? APP_WORKSPACE_MAIN_MIN_HEIGHT : APP_WORKSPACE_MAIN_MIN;\n return { min, max: Math.max(min, Math.min(configuredMax, options.workspaceSize - options.reservedSize - mainMinimum)) };\n};\n\n/**\n * Fits preferred auxiliary pane widths into a shared budget without giving\n * DOM order priority. Minimums are reserved first; remaining space is shared\n * in proportion to how much each pane still needs to reach its preference.\n */\nexport const fitAppWorkspacePaneSizes = (panes: ReadonlyArray<{ desired: number; min: number }>, availableSize: number): number[] => {\n const sizes = panes.map((pane) => pane.min);\n const minimumTotal = sizes.reduce((total, size) => total + size, 0);\n const desiredTotal = panes.reduce((total, pane) => total + pane.desired, 0);\n const budget = Math.max(0, Math.floor(availableSize));\n if (desiredTotal <= budget) return panes.map((pane) => pane.desired);\n if (budget <= minimumTotal) return sizes;\n\n const extraBudget = budget - minimumTotal;\n const desiredExtra = desiredTotal - minimumTotal;\n const fractions = panes.map((pane, index) => {\n const raw = ((pane.desired - pane.min) * extraBudget) / desiredExtra;\n const extra = Math.floor(raw);\n sizes[index]! += extra;\n return { fraction: raw - extra, index };\n });\n let remainder = extraBudget - sizes.reduce((total, size, index) => total + size - panes[index]!.min, 0);\n fractions.sort((a, b) => b.fraction - a.fraction || a.index - b.index);\n for (const { index } of fractions) {\n if (remainder-- <= 0) break;\n sizes[index]! += 1;\n }\n return sizes;\n};\n\nexport const shouldCollapseAppWorkspaceSidebar = (width: number, collapsible: boolean): boolean =>\n collapsible && width < APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD;\n\nexport const resolveAppWorkspaceSidebarWidth = (\n width: number,\n maxWidth: number,\n collapsible: boolean,\n): { width: number; collapsed: boolean } =>\n shouldCollapseAppWorkspaceSidebar(width, collapsible)\n ? { width: APP_WORKSPACE_SIDEBAR_COLLAPSED, collapsed: true }\n : { width: Math.round(Math.min(maxWidth, Math.max(APP_WORKSPACE_SIDEBAR_MIN, width))), collapsed: false };\n\nconst finiteSize = (value: unknown, min: number, max: number) =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.round(Math.min(max, Math.max(min, value))) : undefined;\n\nexport const safeAppWorkspacePanelId = (panelId: string): string => (isStableUiId(panelId) ? panelId : \"\");\n\nconst normalizeSizes = (value: unknown, min: number, max: number) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined;\n const entries = Object.entries(value)\n .slice(0, 16)\n .flatMap(([key, size]) => {\n const normalized = finiteSize(size, min, max);\n return isStableUiId(key) && normalized !== undefined ? [[key, normalized] as const] : [];\n });\n return entries.length ? Object.fromEntries(entries) : undefined;\n};\n\nexport const appWorkspacePanelVariable = (kind: \"pane\" | \"detail\" | \"drawer\", panelId: string): string =>\n `--k2b-workspace-${kind}-${assertStableUiId(panelId, \"AppWorkspace panel id\")}-${kind === \"drawer\" ? \"height\" : \"width\"}`;\n\nexport const normalizeAppWorkspaceLayoutState = (value: unknown): AppWorkspaceLayoutState | null => {\n if (!value || typeof value !== \"object\") return null;\n const candidate = value as Record<string, unknown>;\n if (candidate.version !== 1 && candidate.version !== 2) return null;\n const sidebarWidth = finiteSize(candidate.sidebarWidth, APP_WORKSPACE_SIDEBAR_MIN, APP_WORKSPACE_SIDEBAR_STATE_MAX);\n const sidebarCollapsed = typeof candidate.sidebarCollapsed === \"boolean\" ? candidate.sidebarCollapsed : undefined;\n // Keyed panel maps only exist from version 2 on; a version-1 payload that\n // carries them was not written by this component and is not trusted.\n const legacy = candidate.version === 1;\n const paneWidths = legacy ? undefined : normalizeSizes(candidate.paneWidths, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_PANE_MAX);\n const detailWidths = legacy\n ? (() => {\n const width = finiteSize(candidate.detailWidth, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n return width === undefined ? undefined : { primary: width };\n })()\n : normalizeSizes(candidate.detailWidths, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DETAIL_MAX);\n const drawerHeights = legacy ? undefined : normalizeSizes(candidate.drawerHeights, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_DRAWER_MAX);\n return sidebarWidth === undefined && sidebarCollapsed === undefined && !paneWidths && !detailWidths && !drawerHeights\n ? null\n : { version: 2, sidebarWidth, sidebarCollapsed, paneWidths, detailWidths, drawerHeights };\n};\n\nexport const parseAppWorkspaceLayoutState = (value: string | null | undefined): AppWorkspaceLayoutState | null => {\n if (!value) return null;\n try {\n return normalizeAppWorkspaceLayoutState(JSON.parse(decodeURIComponent(value)));\n } catch {\n return null;\n }\n};\n\nexport const serializeAppWorkspaceLayoutState = (state: AppWorkspaceLayoutState): string =>\n encodeURIComponent(JSON.stringify(normalizeAppWorkspaceLayoutState(state) ?? { version: 2 }));\n\nexport const appWorkspaceLayoutStyle = (state: AppWorkspaceLayoutState | null | undefined): string | undefined => {\n if (!state) return undefined;\n const declarations = [\n state.sidebarCollapsed\n ? `--k2b-workspace-sidebar-width:${APP_WORKSPACE_SIDEBAR_COLLAPSED}px`\n : state.sidebarWidth === undefined\n ? null\n : `--k2b-workspace-sidebar-width:${state.sidebarWidth}px`,\n ...Object.entries(state.paneWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"pane\", id)}:${width}px`),\n ...Object.entries(state.detailWidths ?? {}).map(([id, width]) => `${appWorkspacePanelVariable(\"detail\", id)}:${width}px`),\n ...Object.entries(state.drawerHeights ?? {}).map(([id, height]) => `${appWorkspacePanelVariable(\"drawer\", id)}:${height}px`),\n ].filter(Boolean);\n return declarations.length ? declarations.join(\";\") : undefined;\n};\nimport { assertStableUiId, isStableUiId } from \"./stable-id\";\n"],"mappings":"AASA,OAAO,MAAMA,6BAA6B,GAAG,GAAG;AAChD,OAAO,MAAMC,+BAA+B,GAAG,EAAE;AACjD,OAAO,MAAMC,wCAAwC,GAAG,GAAG;AAC3D,OAAO,MAAMC,yBAAyB,GAAG,GAAG;AAC5C,OAAO,MAAMC,yBAAyB,GAAG,GAAG;AAC5C;AACA,MAAMC,+BAA+B,GAAG,GAAG;AAC3C,OAAO,MAAMC,4BAA4B,GAAG,GAAG;AAC/C,OAAO,MAAMC,wBAAwB,GAAG,GAAG;AAC3C,OAAO,MAAMC,wBAAwB,GAAG,GAAG;AAC3C,OAAO,MAAMC,4BAA4B,GAAG,GAAG;AAC/C,OAAO,MAAMC,wBAAwB,GAAG,GAAG;AAC3C,OAAO,MAAMC,wBAAwB,GAAG,GAAG;AAC3C;AACA,OAAO,MAAMC,sBAAsB,GAAG,GAAG;AACzC,OAAO,MAAMC,6BAA6B,GAAG,GAAG;AAChD,OAAO,MAAMC,0BAA0B,GAAG,GAAG;AAC7C,OAAO,MAAMC,sBAAsB,GAAG,GAAG;AACzC,OAAO,MAAMC,sBAAsB,GAAG,GAAG;AAIzC,OAAO,MAAMC,wBAAwB,GAAIC,OAOxC,IAAmC;EAClC,MAAMC,GAAG,GACPD,OAAO,CAACC,GAAG,KACVD,OAAO,CAACE,IAAI,KAAK,SAAS,GACvBF,OAAO,CAACG,kBAAkB,GACxBpB,+BAA+B,GAC/BE,yBAAyB,GAC3Be,OAAO,CAACE,IAAI,KAAK,QAAQ,GACvBb,wBAAwB,GACxBW,OAAO,CAACE,IAAI,KAAK,MAAM,GACrBL,sBAAsB,GACtBL,wBAAwB,CAAC;EACnC,MAAMY,aAAa,GACjBJ,OAAO,CAACK,GAAG,KACVL,OAAO,CAACE,IAAI,KAAK,SAAS,GACvBhB,yBAAyB,GACzBc,OAAO,CAACE,IAAI,KAAK,QAAQ,GACvBZ,wBAAwB,GACxBU,OAAO,CAACE,IAAI,KAAK,MAAM,GACrBJ,sBAAsB,GACtBL,wBAAwB,CAAC;EACnC,MAAMa,WAAW,GAAGN,OAAO,CAACE,IAAI,KAAK,QAAQ,GAAGP,6BAA6B,GAAGD,sBAAsB;EACtG,OAAO;IAAEO,GAAG;IAAEI,GAAG,EAAEE,IAAI,CAACF,GAAG,CAACJ,GAAG,EAAEM,IAAI,CAACN,GAAG,CAACG,aAAa,EAAEJ,OAAO,CAACQ,aAAa,GAAGR,OAAO,CAACS,YAAY,GAAGH,WAAW,CAAC;EAAE,CAAC;AACzH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,wBAAwB,GAAGA,CAACC,KAAsD,EAAEC,aAAqB,KAAe;EACnI,MAAMC,KAAK,GAAGF,KAAK,CAACG,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACd,GAAG,CAAC;EAC3C,MAAMe,YAAY,GAAGH,KAAK,CAACI,MAAM,CAAC,CAACC,KAAK,EAAEC,IAAI,KAAKD,KAAK,GAAGC,IAAI,EAAE,CAAC,CAAC;EACnE,MAAMC,YAAY,GAAGT,KAAK,CAACM,MAAM,CAAC,CAACC,KAAK,EAAEH,IAAI,KAAKG,KAAK,GAAGH,IAAI,CAACM,OAAO,EAAE,CAAC,CAAC;EAC3E,MAAMC,MAAM,GAAGf,IAAI,CAACF,GAAG,CAAC,CAAC,EAAEE,IAAI,CAACgB,KAAK,CAACX,aAAa,CAAC,CAAC;EACrD,IAAIQ,YAAY,IAAIE,MAAM,EAAE,OAAOX,KAAK,CAACG,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACM,OAAO,CAAC;EACpE,IAAIC,MAAM,IAAIN,YAAY,EAAE,OAAOH,KAAK;EAExC,MAAMW,WAAW,GAAGF,MAAM,GAAGN,YAAY;EACzC,MAAMS,YAAY,GAAGL,YAAY,GAAGJ,YAAY;EAChD,MAAMU,SAAS,GAAGf,KAAK,CAACG,GAAG,CAAC,CAACC,IAAI,EAAEY,KAAK,KAAK;IAC3C,MAAMC,GAAG,GAAI,CAACb,IAAI,CAACM,OAAO,GAAGN,IAAI,CAACd,GAAG,IAAIuB,WAAW,GAAIC,YAAY;IACpE,MAAMI,KAAK,GAAGtB,IAAI,CAACgB,KAAK,CAACK,GAAG,CAAC;IAC7Bf,KAAK,CAACc,KAAK,CAAC,IAAKE,KAAK;IACtB,OAAO;MAAEC,QAAQ,EAAEF,GAAG,GAAGC,KAAK;MAAEF;IAAM,CAAC;EACzC,CAAC,CAAC;EACF,IAAII,SAAS,GAAGP,WAAW,GAAGX,KAAK,CAACI,MAAM,CAAC,CAACC,KAAK,EAAEC,IAAI,EAAEQ,KAAK,KAAKT,KAAK,GAAGC,IAAI,GAAGR,KAAK,CAACgB,KAAK,CAAC,CAAE1B,GAAG,EAAE,CAAC,CAAC;EACvGyB,SAAS,CAACM,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACJ,QAAQ,GAAGG,CAAC,CAACH,QAAQ,IAAIG,CAAC,CAACN,KAAK,GAAGO,CAAC,CAACP,KAAK,CAAC;EACtE,KAAK,MAAM;IAAEA;EAAM,CAAC,IAAID,SAAS,EAAE;IACjC,IAAIK,SAAS,EAAE,IAAI,CAAC,EAAE;IACtBlB,KAAK,CAACc,KAAK,CAAC,IAAK,CAAC;EACpB;EACA,OAAOd,KAAK;AACd,CAAC;AAED,OAAO,MAAMsB,iCAAiC,GAAGA,CAACC,KAAa,EAAEC,WAAoB,KACnFA,WAAW,IAAID,KAAK,GAAGpD,wCAAwC;AAEjE,OAAO,MAAMsD,+BAA+B,GAAGA,CAC7CF,KAAa,EACbG,QAAgB,EAChBF,WAAoB,KAEpBF,iCAAiC,CAACC,KAAK,EAAEC,WAAW,CAAC,GACjD;EAAED,KAAK,EAAErD,+BAA+B;EAAEyD,SAAS,EAAE;AAAK,CAAC,GAC3D;EAAEJ,KAAK,EAAE7B,IAAI,CAACkC,KAAK,CAAClC,IAAI,CAACN,GAAG,CAACsC,QAAQ,EAAEhC,IAAI,CAACF,GAAG,CAACpB,yBAAyB,EAAEmD,KAAK,CAAC,CAAC,CAAC;EAAEI,SAAS,EAAE;AAAM,CAAC;AAE7G,MAAME,UAAU,GAAGA,CAACC,KAAc,EAAE1C,GAAW,EAAEI,GAAW,KAC1D,OAAOsC,KAAK,KAAK,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,KAAK,CAAC,GAAGpC,IAAI,CAACkC,KAAK,CAAClC,IAAI,CAACN,GAAG,CAACI,GAAG,EAAEE,IAAI,CAACF,GAAG,CAACJ,GAAG,EAAE0C,KAAK,CAAC,CAAC,CAAC,GAAGG,SAAS;AAEnH,OAAO,MAAMC,uBAAuB,GAAIC,OAAe,IAAcC,YAAY,CAACD,OAAO,CAAC,GAAGA,OAAO,GAAG,EAAG;AAE1G,MAAME,cAAc,GAAGA,CAACP,KAAc,EAAE1C,GAAW,EAAEI,GAAW,KAAK;EACnE,IAAI,CAACsC,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIQ,KAAK,CAACC,OAAO,CAACT,KAAK,CAAC,EAAE,OAAOG,SAAS;EACjF,MAAMO,OAAO,GAAGC,MAAM,CAACD,OAAO,CAACV,KAAK,CAAC,CAClCY,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CACZC,OAAO,CAAC,CAAC,CAACC,GAAG,EAAEtC,IAAI,CAAC,KAAK;IACxB,MAAMuC,UAAU,GAAGhB,UAAU,CAACvB,IAAI,EAAElB,GAAG,EAAEI,GAAG,CAAC;IAC7C,OAAO4C,YAAY,CAACQ,GAAG,CAAC,IAAIC,UAAU,KAAKZ,SAAS,GAAG,CAAC,CAACW,GAAG,EAAEC,UAAU,CAAC,CAAU,GAAG,EAAE;EAC1F,CAAC,CAAC;EACJ,OAAOL,OAAO,CAACM,MAAM,GAAGL,MAAM,CAACM,WAAW,CAACP,OAAO,CAAC,GAAGP,SAAS;AACjE,CAAC;AAED,OAAO,MAAMe,yBAAyB,GAAGA,CAAC3D,IAAkC,EAAE8C,OAAe,KAC3F,mBAAmB9C,IAAI,IAAI4D,gBAAgB,CAACd,OAAO,EAAE,uBAAuB,CAAC,IAAI9C,IAAI,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,EAAE;AAE3H,OAAO,MAAM6D,gCAAgC,GAAIpB,KAAc,IAAqC;EAClG,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,IAAI;EACpD,MAAMqB,SAAS,GAAGrB,KAAgC;EAClD,IAAIqB,SAAS,CAACC,OAAO,KAAK,CAAC,IAAID,SAAS,CAACC,OAAO,KAAK,CAAC,EAAE,OAAO,IAAI;EACnE,MAAMC,YAAY,GAAGxB,UAAU,CAACsB,SAAS,CAACE,YAAY,EAAEjF,yBAAyB,EAAEE,+BAA+B,CAAC;EACnH,MAAMgF,gBAAgB,GAAG,OAAOH,SAAS,CAACG,gBAAgB,KAAK,SAAS,GAAGH,SAAS,CAACG,gBAAgB,GAAGrB,SAAS;EACjH;EACA;EACA,MAAMsB,MAAM,GAAGJ,SAAS,CAACC,OAAO,KAAK,CAAC;EACtC,MAAMI,UAAU,GAAGD,MAAM,GAAGtB,SAAS,GAAGI,cAAc,CAACc,SAAS,CAACK,UAAU,EAAExE,sBAAsB,EAAEC,sBAAsB,CAAC;EAC5H,MAAMwE,YAAY,GAAGF,MAAM,GACvB,CAAC,MAAM;IACL,MAAMhC,KAAK,GAAGM,UAAU,CAACsB,SAAS,CAACO,WAAW,EAAElF,wBAAwB,EAAEC,wBAAwB,CAAC;IACnG,OAAO8C,KAAK,KAAKU,SAAS,GAAGA,SAAS,GAAG;MAAE0B,OAAO,EAAEpC;IAAM,CAAC;EAC7D,CAAC,EAAE,CAAC,GACJc,cAAc,CAACc,SAAS,CAACM,YAAY,EAAEjF,wBAAwB,EAAEC,wBAAwB,CAAC;EAC9F,MAAMmF,aAAa,GAAGL,MAAM,GAAGtB,SAAS,GAAGI,cAAc,CAACc,SAAS,CAACS,aAAa,EAAEjF,wBAAwB,EAAEC,wBAAwB,CAAC;EACtI,OAAOyE,YAAY,KAAKpB,SAAS,IAAIqB,gBAAgB,KAAKrB,SAAS,IAAI,CAACuB,UAAU,IAAI,CAACC,YAAY,IAAI,CAACG,aAAa,GACjH,IAAI,GACJ;IAAER,OAAO,EAAE,CAAC;IAAEC,YAAY;IAAEC,gBAAgB;IAAEE,UAAU;IAAEC,YAAY;IAAEG;EAAc,CAAC;AAC7F,CAAC;AAED,OAAO,MAAMC,4BAA4B,GAAI/B,KAAgC,IAAqC;EAChH,IAAI,CAACA,KAAK,EAAE,OAAO,IAAI;EACvB,IAAI;IACF,OAAOoB,gCAAgC,CAACY,IAAI,CAACC,KAAK,CAACC,kBAAkB,CAAClC,KAAK,CAAC,CAAC,CAAC;EAChF,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMmC,gCAAgC,GAAIC,KAA8B,IAC7EC,kBAAkB,CAACL,IAAI,CAACM,SAAS,CAAClB,gCAAgC,CAACgB,KAAK,CAAC,IAAI;EAAEd,OAAO,EAAE;AAAE,CAAC,CAAC,CAAC;AAE/F,OAAO,MAAMiB,uBAAuB,GAAIH,KAAiD,IAAyB;EAChH,IAAI,CAACA,KAAK,EAAE,OAAOjC,SAAS;EAC5B,MAAMqC,YAAY,GAAG,CACnBJ,KAAK,CAACZ,gBAAgB,GAClB,iCAAiCpF,+BAA+B,IAAI,GACpEgG,KAAK,CAACb,YAAY,KAAKpB,SAAS,GAC9B,IAAI,GACJ,iCAAiCiC,KAAK,CAACb,YAAY,IAAI,EAC7D,GAAGZ,MAAM,CAACD,OAAO,CAAC0B,KAAK,CAACV,UAAU,IAAI,CAAC,CAAC,CAAC,CAACvD,GAAG,CAAC,CAAC,CAACsE,EAAE,EAAEhD,KAAK,CAAC,KAAK,GAAGyB,yBAAyB,CAAC,MAAM,EAAEuB,EAAE,CAAC,IAAIhD,KAAK,IAAI,CAAC,EACrH,GAAGkB,MAAM,CAACD,OAAO,CAAC0B,KAAK,CAACT,YAAY,IAAI,CAAC,CAAC,CAAC,CAACxD,GAAG,CAAC,CAAC,CAACsE,EAAE,EAAEhD,KAAK,CAAC,KAAK,GAAGyB,yBAAyB,CAAC,QAAQ,EAAEuB,EAAE,CAAC,IAAIhD,KAAK,IAAI,CAAC,EACzH,GAAGkB,MAAM,CAACD,OAAO,CAAC0B,KAAK,CAACN,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC3D,GAAG,CAAC,CAAC,CAACsE,EAAE,EAAEC,MAAM,CAAC,KAAK,GAAGxB,yBAAyB,CAAC,QAAQ,EAAEuB,EAAE,CAAC,IAAIC,MAAM,IAAI,CAAC,CAC7H,CAACC,MAAM,CAACC,OAAO,CAAC;EACjB,OAAOJ,YAAY,CAACxB,MAAM,GAAGwB,YAAY,CAACK,IAAI,CAAC,GAAG,CAAC,GAAG1C,SAAS;AACjE,CAAC;AACD,SAASgB,gBAAgB,EAAEb,YAAY,QAAQ,aAAa","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const FLOATING_WINDOW_VIEWPORT_GAP = 16;
|
|
2
|
+
const clamp = (value, min, max) => Math.min(Math.max(value, min), Math.max(min, max));
|
|
3
|
+
export const fitFloatingWindowRect = (rect, minWidth, minHeight, viewport) => {
|
|
4
|
+
const maxWidth = Math.max(minWidth, viewport.width - FLOATING_WINDOW_VIEWPORT_GAP * 2);
|
|
5
|
+
const maxHeight = Math.max(minHeight, viewport.height - FLOATING_WINDOW_VIEWPORT_GAP * 2);
|
|
6
|
+
const width = clamp(rect.width, minWidth, maxWidth);
|
|
7
|
+
const height = clamp(rect.height, minHeight, maxHeight);
|
|
8
|
+
return {
|
|
9
|
+
width,
|
|
10
|
+
height,
|
|
11
|
+
x: clamp(rect.x, FLOATING_WINDOW_VIEWPORT_GAP, viewport.width - width - FLOATING_WINDOW_VIEWPORT_GAP),
|
|
12
|
+
y: clamp(rect.y, FLOATING_WINDOW_VIEWPORT_GAP, viewport.height - height - FLOATING_WINDOW_VIEWPORT_GAP)
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=floating-window-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["FLOATING_WINDOW_VIEWPORT_GAP","clamp","value","min","max","Math","fitFloatingWindowRect","rect","minWidth","minHeight","viewport","maxWidth","width","maxHeight","height","x","y"],"sources":["layout/floating-window-geometry.ts"],"sourcesContent":["export type FloatingWindowRect = { x: number; y: number; width: number; height: number };\nexport const FLOATING_WINDOW_VIEWPORT_GAP = 16;\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\nexport const fitFloatingWindowRect = (\n rect: FloatingWindowRect,\n minWidth: number,\n minHeight: number,\n viewport: { width: number; height: number },\n): FloatingWindowRect => {\n const maxWidth = Math.max(minWidth, viewport.width - FLOATING_WINDOW_VIEWPORT_GAP * 2);\n const maxHeight = Math.max(minHeight, viewport.height - FLOATING_WINDOW_VIEWPORT_GAP * 2);\n const width = clamp(rect.width, minWidth, maxWidth);\n const height = clamp(rect.height, minHeight, maxHeight);\n return {\n width,\n height,\n x: clamp(rect.x, FLOATING_WINDOW_VIEWPORT_GAP, viewport.width - width - FLOATING_WINDOW_VIEWPORT_GAP),\n y: clamp(rect.y, FLOATING_WINDOW_VIEWPORT_GAP, viewport.height - height - FLOATING_WINDOW_VIEWPORT_GAP),\n };\n};\n"],"mappings":"AACA,OAAO,MAAMA,4BAA4B,GAAG,EAAE;AAC9C,MAAMC,KAAK,GAAGA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,KAAKC,IAAI,CAACF,GAAG,CAACE,IAAI,CAACD,GAAG,CAACF,KAAK,EAAEC,GAAG,CAAC,EAAEE,IAAI,CAACD,GAAG,CAACD,GAAG,EAAEC,GAAG,CAAC,CAAC;AAE7G,OAAO,MAAME,qBAAqB,GAAGA,CACnCC,IAAwB,EACxBC,QAAgB,EAChBC,SAAiB,EACjBC,QAA2C,KACpB;EACvB,MAAMC,QAAQ,GAAGN,IAAI,CAACD,GAAG,CAACI,QAAQ,EAAEE,QAAQ,CAACE,KAAK,GAAGZ,4BAA4B,GAAG,CAAC,CAAC;EACtF,MAAMa,SAAS,GAAGR,IAAI,CAACD,GAAG,CAACK,SAAS,EAAEC,QAAQ,CAACI,MAAM,GAAGd,4BAA4B,GAAG,CAAC,CAAC;EACzF,MAAMY,KAAK,GAAGX,KAAK,CAACM,IAAI,CAACK,KAAK,EAAEJ,QAAQ,EAAEG,QAAQ,CAAC;EACnD,MAAMG,MAAM,GAAGb,KAAK,CAACM,IAAI,CAACO,MAAM,EAAEL,SAAS,EAAEI,SAAS,CAAC;EACvD,OAAO;IACLD,KAAK;IACLE,MAAM;IACNC,CAAC,EAAEd,KAAK,CAACM,IAAI,CAACQ,CAAC,EAAEf,4BAA4B,EAAEU,QAAQ,CAACE,KAAK,GAAGA,KAAK,GAAGZ,4BAA4B,CAAC;IACrGgB,CAAC,EAAEf,KAAK,CAACM,IAAI,CAACS,CAAC,EAAEhB,4BAA4B,EAAEU,QAAQ,CAACI,MAAM,GAAGA,MAAM,GAAGd,4BAA4B;EACxG,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { default as AppOverview } from "./AppOverview";
|
|
2
|
+
export { default as AppWorkspace } from "./AppWorkspace";
|
|
3
|
+
export { installAppWorkspaceController } from "./app-workspace-controller";
|
|
4
|
+
export { APP_WORKSPACE_DETAIL_DEFAULT, APP_WORKSPACE_DETAIL_MAX, APP_WORKSPACE_DETAIL_MIN, APP_WORKSPACE_DRAWER_DEFAULT, APP_WORKSPACE_DRAWER_MAX, APP_WORKSPACE_DRAWER_MIN, APP_WORKSPACE_MAIN_MIN, APP_WORKSPACE_MAIN_MIN_HEIGHT, APP_WORKSPACE_PANE_DEFAULT, APP_WORKSPACE_PANE_MAX, APP_WORKSPACE_PANE_MIN, APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD, APP_WORKSPACE_SIDEBAR_COLLAPSED, APP_WORKSPACE_SIDEBAR_DEFAULT, APP_WORKSPACE_SIDEBAR_MAX, APP_WORKSPACE_SIDEBAR_MIN, appWorkspaceLayoutStyle, appWorkspacePanelVariable, appWorkspaceResizeLimits, normalizeAppWorkspaceLayoutState, parseAppWorkspaceLayoutState, resolveAppWorkspaceSidebarWidth, safeAppWorkspacePanelId, serializeAppWorkspaceLayoutState, shouldCollapseAppWorkspaceSidebar } from "./app-workspace-state";
|
|
5
|
+
export { DataPanel } from "./DataPanel";
|
|
6
|
+
export { default as DetailPanel } from "./DetailPanel";
|
|
7
|
+
export { default as Discussion } from "./Discussion";
|
|
8
|
+
export { default as FloatingWindow, fitFloatingWindowRect, openFloatingWindow } from "./FloatingWindow";
|
|
9
|
+
export { confirmDiscardIfDirty, default as PanelDialog, panelDialogFixedOptions, panelDialogFixedPanelClass, panelDialogOptions, panelDialogPanelClass, panelDialogWideOptions, panelDialogWidePanelClass, panelDialogWorkspaceOptions, panelDialogWorkspacePanelClass } from "./PanelDialog";
|
|
10
|
+
export { PanelHeader } from "./PanelHeader";
|
|
11
|
+
export { default as Panes } from "./Panes";
|
|
12
|
+
export { activatePanesItem, addPanesItem, applyPanesIntent, createPanesLayout, isPanesItemVisible, PANES_LAYOUT_VERSION, parsePanesLayout, reconcilePanesLayout, removePanesItem, resizePanesSplit } from "./panes-layout";
|
|
13
|
+
export { default as ScrollArea } from "./ScrollArea";
|
|
14
|
+
export { readSettingsError, SettingsField, SettingsGroup, SettingsPage, SettingsPanelFooter, SettingsSaveBar, SettingsSection, sameSettingValue } from "./Settings";
|
|
15
|
+
export { default as SettingsCollection } from "./SettingsCollection";
|
|
16
|
+
export { default as SettingsModal } from "./SettingsModal";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["default","AppOverview","AppWorkspace","installAppWorkspaceController","APP_WORKSPACE_DETAIL_DEFAULT","APP_WORKSPACE_DETAIL_MAX","APP_WORKSPACE_DETAIL_MIN","APP_WORKSPACE_DRAWER_DEFAULT","APP_WORKSPACE_DRAWER_MAX","APP_WORKSPACE_DRAWER_MIN","APP_WORKSPACE_MAIN_MIN","APP_WORKSPACE_MAIN_MIN_HEIGHT","APP_WORKSPACE_PANE_DEFAULT","APP_WORKSPACE_PANE_MAX","APP_WORKSPACE_PANE_MIN","APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD","APP_WORKSPACE_SIDEBAR_COLLAPSED","APP_WORKSPACE_SIDEBAR_DEFAULT","APP_WORKSPACE_SIDEBAR_MAX","APP_WORKSPACE_SIDEBAR_MIN","appWorkspaceLayoutStyle","appWorkspacePanelVariable","appWorkspaceResizeLimits","normalizeAppWorkspaceLayoutState","parseAppWorkspaceLayoutState","resolveAppWorkspaceSidebarWidth","safeAppWorkspacePanelId","serializeAppWorkspaceLayoutState","shouldCollapseAppWorkspaceSidebar","DataPanel","DetailPanel","Discussion","FloatingWindow","fitFloatingWindowRect","openFloatingWindow","confirmDiscardIfDirty","PanelDialog","panelDialogFixedOptions","panelDialogFixedPanelClass","panelDialogOptions","panelDialogPanelClass","panelDialogWideOptions","panelDialogWidePanelClass","panelDialogWorkspaceOptions","panelDialogWorkspacePanelClass","PanelHeader","Panes","activatePanesItem","addPanesItem","applyPanesIntent","createPanesLayout","isPanesItemVisible","PANES_LAYOUT_VERSION","parsePanesLayout","reconcilePanesLayout","removePanesItem","resizePanesSplit","ScrollArea","readSettingsError","SettingsField","SettingsGroup","SettingsPage","SettingsPanelFooter","SettingsSaveBar","SettingsSection","sameSettingValue","SettingsCollection","SettingsModal"],"sources":["layout/index.ts"],"sourcesContent":["export type {\n AppOverviewEmptyStateProps,\n AppOverviewPanelProps,\n AppOverviewProps,\n} from \"./AppOverview\";\nexport { default as AppOverview } from \"./AppOverview\";\nexport type {\n AppWorkspaceBottomDrawerHeight,\n AppWorkspaceBottomDrawerProps,\n AppWorkspaceContentProps,\n AppWorkspaceDetailProps,\n AppWorkspaceDetailWidth,\n AppWorkspaceMainPaneProps,\n AppWorkspaceMainProps,\n AppWorkspaceNavTreeItemProps,\n AppWorkspaceNavTreeProps,\n AppWorkspaceProps,\n AppWorkspaceSidebarAccessoryVisibility,\n AppWorkspaceSidebarBodyProps,\n AppWorkspaceSidebarIconActionProps,\n AppWorkspaceSidebarIconActionTone,\n AppWorkspaceSidebarIconGridProps,\n AppWorkspaceSidebarItemActionProps,\n AppWorkspaceSidebarItemActionsProps,\n AppWorkspaceSidebarItemIconProps,\n AppWorkspaceSidebarItemLabelProps,\n AppWorkspaceSidebarItemMetaProps,\n AppWorkspaceSidebarItemProps,\n AppWorkspaceSidebarItemTone,\n AppWorkspaceSidebarMobileItemsProps,\n AppWorkspaceSidebarMobileProps,\n AppWorkspaceSidebarMobileTriggerProps,\n AppWorkspaceSidebarProps,\n AppWorkspaceSidebarSectionProps,\n AppWorkspaceSidebarVisibility,\n} from \"./AppWorkspace\";\nexport { default as AppWorkspace } from \"./AppWorkspace\";\nexport type { AppWorkspaceControllerOptions } from \"./app-workspace-controller\";\nexport { installAppWorkspaceController } from \"./app-workspace-controller\";\nexport type {\n AppWorkspaceLayoutState,\n AppWorkspaceResizeKind,\n} from \"./app-workspace-state\";\nexport {\n APP_WORKSPACE_DETAIL_DEFAULT,\n APP_WORKSPACE_DETAIL_MAX,\n APP_WORKSPACE_DETAIL_MIN,\n APP_WORKSPACE_DRAWER_DEFAULT,\n APP_WORKSPACE_DRAWER_MAX,\n APP_WORKSPACE_DRAWER_MIN,\n APP_WORKSPACE_MAIN_MIN,\n APP_WORKSPACE_MAIN_MIN_HEIGHT,\n APP_WORKSPACE_PANE_DEFAULT,\n APP_WORKSPACE_PANE_MAX,\n APP_WORKSPACE_PANE_MIN,\n APP_WORKSPACE_SIDEBAR_COLLAPSE_THRESHOLD,\n APP_WORKSPACE_SIDEBAR_COLLAPSED,\n APP_WORKSPACE_SIDEBAR_DEFAULT,\n APP_WORKSPACE_SIDEBAR_MAX,\n APP_WORKSPACE_SIDEBAR_MIN,\n appWorkspaceLayoutStyle,\n appWorkspacePanelVariable,\n appWorkspaceResizeLimits,\n normalizeAppWorkspaceLayoutState,\n parseAppWorkspaceLayoutState,\n resolveAppWorkspaceSidebarWidth,\n safeAppWorkspacePanelId,\n serializeAppWorkspaceLayoutState,\n shouldCollapseAppWorkspaceSidebar,\n} from \"./app-workspace-state\";\nexport type { DataPanelProps } from \"./DataPanel\";\nexport { DataPanel } from \"./DataPanel\";\nexport type {\n DetailPanelActionButtonProps,\n DetailPanelActionLinkProps,\n DetailPanelActionProps,\n DetailPanelBodyProps,\n DetailPanelGroupProps,\n DetailPanelHeaderProps,\n DetailPanelProps,\n DetailPanelSectionProps,\n DetailPanelSummaryProps,\n DetailPanelTone,\n} from \"./DetailPanel\";\nexport { default as DetailPanel } from \"./DetailPanel\";\nexport type { DiscussionComposerProps, DiscussionItemProps, DiscussionListProps, DiscussionProps } from \"./Discussion\";\nexport { default as Discussion } from \"./Discussion\";\nexport type {\n FloatingWindowClose,\n FloatingWindowProps,\n OpenFloatingWindowOptions,\n} from \"./FloatingWindow\";\nexport {\n default as FloatingWindow,\n type FloatingWindowRect,\n fitFloatingWindowRect,\n openFloatingWindow,\n} from \"./FloatingWindow\";\nexport type {\n PanelDialogBodyProps,\n PanelDialogFooterProps,\n PanelDialogHeaderProps,\n PanelDialogProps,\n PanelDialogSectionProps,\n PanelDialogSurface,\n PanelDialogTabOption,\n PanelDialogTabsProps,\n} from \"./PanelDialog\";\nexport {\n confirmDiscardIfDirty,\n default as PanelDialog,\n panelDialogFixedOptions,\n panelDialogFixedPanelClass,\n panelDialogOptions,\n panelDialogPanelClass,\n panelDialogWideOptions,\n panelDialogWidePanelClass,\n panelDialogWorkspaceOptions,\n panelDialogWorkspacePanelClass,\n} from \"./PanelDialog\";\nexport type { PanelHeaderProps } from \"./PanelHeader\";\nexport { PanelHeader } from \"./PanelHeader\";\nexport type { PanesItem, PanesProps } from \"./Panes\";\nexport { default as Panes } from \"./Panes\";\nexport type {\n AddPanesItemOptions,\n PanesDirection,\n PanesGroup,\n PanesIntent,\n PanesLayout,\n PanesNode,\n PanesPath,\n PanesPathSegment,\n PanesSide,\n PanesSplit,\n} from \"./panes-layout\";\nexport {\n activatePanesItem,\n addPanesItem,\n applyPanesIntent,\n createPanesLayout,\n isPanesItemVisible,\n PANES_LAYOUT_VERSION,\n parsePanesLayout,\n reconcilePanesLayout,\n removePanesItem,\n resizePanesSplit,\n} from \"./panes-layout\";\nexport type { ScrollAreaProps } from \"./ScrollArea\";\nexport { default as ScrollArea } from \"./ScrollArea\";\nexport type {\n SettingsFieldControlProps,\n SettingsFieldProps,\n SettingsGroupActionProps,\n SettingsGroupProps,\n SettingsPageProps,\n SettingsPanelFooterProps,\n SettingsSaveBarProps,\n SettingsSectionProps,\n} from \"./Settings\";\nexport {\n readSettingsError,\n SettingsField,\n SettingsGroup,\n SettingsPage,\n SettingsPanelFooter,\n SettingsSaveBar,\n SettingsSection,\n sameSettingValue,\n} from \"./Settings\";\nexport type {\n SettingsCollectionActionProps,\n SettingsCollectionItemActionsProps,\n SettingsCollectionItemProps,\n SettingsCollectionItemReorderProps,\n SettingsCollectionItemStatusProps,\n SettingsCollectionProps,\n} from \"./SettingsCollection\";\nexport { default as SettingsCollection } from \"./SettingsCollection\";\nexport type {\n SettingsModalFooterProps,\n SettingsModalGroupProps,\n SettingsModalProps,\n SettingsModalTabProps,\n SettingsModalTabTone,\n} from \"./SettingsModal\";\nexport { default as SettingsModal } from \"./SettingsModal\";\n"],"mappings":"AAKA,SAASA,OAAO,IAAIC,WAAW,QAAQ,eAAe;AA+BtD,SAASD,OAAO,IAAIE,YAAY,QAAQ,gBAAgB;AAExD,SAASC,6BAA6B,QAAQ,4BAA4B;AAK1E,SACEC,4BAA4B,EAC5BC,wBAAwB,EACxBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,wBAAwB,EACxBC,wBAAwB,EACxBC,sBAAsB,EACtBC,6BAA6B,EAC7BC,0BAA0B,EAC1BC,sBAAsB,EACtBC,sBAAsB,EACtBC,wCAAwC,EACxCC,+BAA+B,EAC/BC,6BAA6B,EAC7BC,yBAAyB,EACzBC,yBAAyB,EACzBC,uBAAuB,EACvBC,yBAAyB,EACzBC,wBAAwB,EACxBC,gCAAgC,EAChCC,4BAA4B,EAC5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,iCAAiC,QAC5B,uBAAuB;AAE9B,SAASC,SAAS,QAAQ,aAAa;AAavC,SAAS7B,OAAO,IAAI8B,WAAW,QAAQ,eAAe;AAEtD,SAAS9B,OAAO,IAAI+B,UAAU,QAAQ,cAAc;AAMpD,SACE/B,OAAO,IAAIgC,cAAc,EAEzBC,qBAAqB,EACrBC,kBAAkB,QACb,kBAAkB;AAWzB,SACEC,qBAAqB,EACrBnC,OAAO,IAAIoC,WAAW,EACtBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,kBAAkB,EAClBC,qBAAqB,EACrBC,sBAAsB,EACtBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,8BAA8B,QACzB,eAAe;AAEtB,SAASC,WAAW,QAAQ,eAAe;AAE3C,SAAS7C,OAAO,IAAI8C,KAAK,QAAQ,SAAS;AAa1C,SACEC,iBAAiB,EACjBC,YAAY,EACZC,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClBC,oBAAoB,EACpBC,gBAAgB,EAChBC,oBAAoB,EACpBC,eAAe,EACfC,gBAAgB,QACX,gBAAgB;AAEvB,SAASxD,OAAO,IAAIyD,UAAU,QAAQ,cAAc;AAWpD,SACEC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,YAAY,EACZC,mBAAmB,EACnBC,eAAe,EACfC,eAAe,EACfC,gBAAgB,QACX,YAAY;AASnB,SAASjE,OAAO,IAAIkE,kBAAkB,QAAQ,sBAAsB;AAQpE,SAASlE,OAAO,IAAImE,aAAa,QAAQ,iBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { assertUniqueStableUiIds, isStableUiId } from "./stable-id";
|
|
2
|
+
export const PANES_LAYOUT_VERSION = 2;
|
|
3
|
+
export const PANES_MIN_RATIO = 0.08;
|
|
4
|
+
export const PANES_MAX_ID_LENGTH = 160;
|
|
5
|
+
const MAX_DEPTH = 12;
|
|
6
|
+
const MAX_NODES = 64;
|
|
7
|
+
const isRecord = value => !!value && typeof value === "object" && !Array.isArray(value);
|
|
8
|
+
const isItemId = value => isStableUiId(value, PANES_MAX_ID_LENGTH);
|
|
9
|
+
const parseNode = (value, usedItems, budget, depth = 0) => {
|
|
10
|
+
if (!isRecord(value) || depth > MAX_DEPTH || budget.nodes >= MAX_NODES) return null;
|
|
11
|
+
budget.nodes += 1;
|
|
12
|
+
if (value.type === "group") {
|
|
13
|
+
if (!Array.isArray(value.items) || value.items.length === 0 || !isItemId(value.active)) return null;
|
|
14
|
+
const items = [];
|
|
15
|
+
for (const item of value.items) {
|
|
16
|
+
if (!isItemId(item) || usedItems.has(item)) return null;
|
|
17
|
+
usedItems.add(item);
|
|
18
|
+
items.push(item);
|
|
19
|
+
}
|
|
20
|
+
if (!items.includes(value.active)) return null;
|
|
21
|
+
return {
|
|
22
|
+
type: "group",
|
|
23
|
+
items,
|
|
24
|
+
active: value.active
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (value.type !== "split" || value.direction !== "horizontal" && value.direction !== "vertical" || typeof value.ratio !== "number" || !Number.isFinite(value.ratio) || value.ratio < PANES_MIN_RATIO || value.ratio > 1 - PANES_MIN_RATIO) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const first = parseNode(value.first, usedItems, budget, depth + 1);
|
|
31
|
+
const second = parseNode(value.second, usedItems, budget, depth + 1);
|
|
32
|
+
if (!first || !second) return null;
|
|
33
|
+
return {
|
|
34
|
+
type: "split",
|
|
35
|
+
direction: value.direction,
|
|
36
|
+
ratio: value.ratio,
|
|
37
|
+
first,
|
|
38
|
+
second
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
export const parsePanesLayout = value => {
|
|
42
|
+
if (!isRecord(value) || value.version !== PANES_LAYOUT_VERSION) return null;
|
|
43
|
+
if (value.root === null) return {
|
|
44
|
+
version: PANES_LAYOUT_VERSION,
|
|
45
|
+
root: null
|
|
46
|
+
};
|
|
47
|
+
const root = parseNode(value.root, new Set(), {
|
|
48
|
+
nodes: 0
|
|
49
|
+
});
|
|
50
|
+
return root ? {
|
|
51
|
+
version: PANES_LAYOUT_VERSION,
|
|
52
|
+
root
|
|
53
|
+
} : null;
|
|
54
|
+
};
|
|
55
|
+
export const createPanesLayout = itemIds => {
|
|
56
|
+
assertUniqueStableUiIds(itemIds, "Panes item id", PANES_MAX_ID_LENGTH);
|
|
57
|
+
return {
|
|
58
|
+
version: PANES_LAYOUT_VERSION,
|
|
59
|
+
root: itemIds.length > 0 ? {
|
|
60
|
+
type: "group",
|
|
61
|
+
items: [...itemIds],
|
|
62
|
+
active: itemIds[0]
|
|
63
|
+
} : null
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
const findItem = (node, itemId, path = []) => {
|
|
67
|
+
if (!node) return null;
|
|
68
|
+
if (node.type === "group") {
|
|
69
|
+
const index = node.items.indexOf(itemId);
|
|
70
|
+
return index >= 0 ? {
|
|
71
|
+
group: node,
|
|
72
|
+
path,
|
|
73
|
+
index
|
|
74
|
+
} : null;
|
|
75
|
+
}
|
|
76
|
+
return findItem(node.first, itemId, [...path, "first"]) ?? findItem(node.second, itemId, [...path, "second"]);
|
|
77
|
+
};
|
|
78
|
+
const firstGroup = node => {
|
|
79
|
+
if (!node) return null;
|
|
80
|
+
return node.type === "group" ? node : firstGroup(node.first);
|
|
81
|
+
};
|
|
82
|
+
const mapAtPath = (node, path, update) => {
|
|
83
|
+
const [segment, ...rest] = path;
|
|
84
|
+
if (!segment) return update(node);
|
|
85
|
+
if (node.type !== "split") return node;
|
|
86
|
+
if (segment === "first") {
|
|
87
|
+
const first = mapAtPath(node.first, rest, update);
|
|
88
|
+
return first === node.first ? node : {
|
|
89
|
+
...node,
|
|
90
|
+
first
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const second = mapAtPath(node.second, rest, update);
|
|
94
|
+
return second === node.second ? node : {
|
|
95
|
+
...node,
|
|
96
|
+
second
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
const removeFromNode = (node, itemId) => {
|
|
100
|
+
if (node.type === "group") {
|
|
101
|
+
const index = node.items.indexOf(itemId);
|
|
102
|
+
if (index < 0) return node;
|
|
103
|
+
const items = node.items.filter(id => id !== itemId);
|
|
104
|
+
if (items.length === 0) return null;
|
|
105
|
+
const active = node.active === itemId ? items[Math.min(index, items.length - 1)] : node.active;
|
|
106
|
+
return {
|
|
107
|
+
...node,
|
|
108
|
+
items,
|
|
109
|
+
active
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const first = removeFromNode(node.first, itemId);
|
|
113
|
+
const second = removeFromNode(node.second, itemId);
|
|
114
|
+
if (!first) return second;
|
|
115
|
+
if (!second) return first;
|
|
116
|
+
if (first === node.first && second === node.second) return node;
|
|
117
|
+
return {
|
|
118
|
+
...node,
|
|
119
|
+
first,
|
|
120
|
+
second
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
const reconcileNode = (node, desiredOpen) => {
|
|
124
|
+
if (node.type === "group") {
|
|
125
|
+
const items = node.items.filter(itemId => desiredOpen.has(itemId));
|
|
126
|
+
if (items.length === 0) return null;
|
|
127
|
+
if (sameItems(items, node.items)) return node;
|
|
128
|
+
const active = items.includes(node.active) ? node.active : items[Math.min(node.items.indexOf(node.active), items.length - 1)];
|
|
129
|
+
return {
|
|
130
|
+
...node,
|
|
131
|
+
items,
|
|
132
|
+
active
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const first = reconcileNode(node.first, desiredOpen);
|
|
136
|
+
const second = reconcileNode(node.second, desiredOpen);
|
|
137
|
+
if (!first) return second;
|
|
138
|
+
if (!second) return first;
|
|
139
|
+
if (first === node.first && second === node.second) return node;
|
|
140
|
+
return {
|
|
141
|
+
...node,
|
|
142
|
+
first,
|
|
143
|
+
second
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
const sameItems = (left, right) => left.length === right.length && left.every((item, index) => item === right[index]);
|
|
147
|
+
const sameNode = (left, right) => {
|
|
148
|
+
if (left.type !== right.type) return false;
|
|
149
|
+
if (left.type === "group" && right.type === "group") {
|
|
150
|
+
return left.active === right.active && sameItems(left.items, right.items);
|
|
151
|
+
}
|
|
152
|
+
if (left.type === "split" && right.type === "split") {
|
|
153
|
+
return left.direction === right.direction && left.ratio === right.ratio && sameNode(left.first, right.first) && sameNode(left.second, right.second);
|
|
154
|
+
}
|
|
155
|
+
return false;
|
|
156
|
+
};
|
|
157
|
+
const isWithinLayoutLimits = (node, budget = {
|
|
158
|
+
nodes: 0
|
|
159
|
+
}, depth = 0) => {
|
|
160
|
+
if (depth > MAX_DEPTH || budget.nodes >= MAX_NODES) return false;
|
|
161
|
+
budget.nodes += 1;
|
|
162
|
+
return node.type === "group" || isWithinLayoutLimits(node.first, budget, depth + 1) && isWithinLayoutLimits(node.second, budget, depth + 1);
|
|
163
|
+
};
|
|
164
|
+
const insertIntoGroup = (group, itemId, beforeItemId) => {
|
|
165
|
+
if (beforeItemId !== null && !group.items.includes(beforeItemId)) return null;
|
|
166
|
+
const items = group.items.filter(id => id !== itemId);
|
|
167
|
+
const index = beforeItemId === null ? items.length : items.indexOf(beforeItemId);
|
|
168
|
+
if (index < 0) return null;
|
|
169
|
+
items.splice(index, 0, itemId);
|
|
170
|
+
if (sameItems(items, group.items)) return group;
|
|
171
|
+
return {
|
|
172
|
+
...group,
|
|
173
|
+
items,
|
|
174
|
+
active: itemId
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
export const activatePanesItem = (layout, itemId) => {
|
|
178
|
+
const located = findItem(layout.root, itemId);
|
|
179
|
+
if (!located || located.group.active === itemId || !layout.root) return layout;
|
|
180
|
+
return {
|
|
181
|
+
version: PANES_LAYOUT_VERSION,
|
|
182
|
+
root: mapAtPath(layout.root, located.path, node => node.type === "group" ? {
|
|
183
|
+
...node,
|
|
184
|
+
active: itemId
|
|
185
|
+
} : node)
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
export const isPanesItemVisible = (layout, itemId) => findItem(layout.root, itemId)?.group.active === itemId;
|
|
189
|
+
export const removePanesItem = (layout, itemId) => {
|
|
190
|
+
if (!layout.root || !findItem(layout.root, itemId)) return layout;
|
|
191
|
+
return {
|
|
192
|
+
version: PANES_LAYOUT_VERSION,
|
|
193
|
+
root: removeFromNode(layout.root, itemId)
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
export const addPanesItem = (layout, options) => {
|
|
197
|
+
if (!isItemId(options.itemId) || findItem(layout.root, options.itemId)) return layout;
|
|
198
|
+
if (!layout.root) {
|
|
199
|
+
return options.targetItemId === null ? createPanesLayout([options.itemId]) : layout;
|
|
200
|
+
}
|
|
201
|
+
if (options.targetItemId === null) return layout;
|
|
202
|
+
const target = findItem(layout.root, options.targetItemId);
|
|
203
|
+
if (!target) return layout;
|
|
204
|
+
const group = insertIntoGroup(target.group, options.itemId, options.beforeItemId ?? null);
|
|
205
|
+
if (!group) return layout;
|
|
206
|
+
return {
|
|
207
|
+
version: PANES_LAYOUT_VERSION,
|
|
208
|
+
root: mapAtPath(layout.root, target.path, () => group)
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
export const applyPanesIntent = (layout, intent) => {
|
|
212
|
+
if (!layout.root || intent.itemId === intent.targetItemId) return layout;
|
|
213
|
+
const source = findItem(layout.root, intent.itemId);
|
|
214
|
+
const target = findItem(layout.root, intent.targetItemId);
|
|
215
|
+
if (!source || !target) return layout;
|
|
216
|
+
if (intent.type === "tab" && source.group === target.group) {
|
|
217
|
+
const group = insertIntoGroup(source.group, intent.itemId, intent.beforeItemId);
|
|
218
|
+
if (!group || group === source.group) return layout;
|
|
219
|
+
return {
|
|
220
|
+
version: PANES_LAYOUT_VERSION,
|
|
221
|
+
root: mapAtPath(layout.root, source.path, () => group)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const rootWithoutSource = removeFromNode(layout.root, intent.itemId);
|
|
225
|
+
if (!rootWithoutSource) return layout;
|
|
226
|
+
const nextTarget = findItem(rootWithoutSource, intent.targetItemId);
|
|
227
|
+
if (!nextTarget) return layout;
|
|
228
|
+
if (intent.type === "tab") {
|
|
229
|
+
const group = insertIntoGroup(nextTarget.group, intent.itemId, intent.beforeItemId);
|
|
230
|
+
if (!group) return layout;
|
|
231
|
+
return {
|
|
232
|
+
version: PANES_LAYOUT_VERSION,
|
|
233
|
+
root: mapAtPath(rootWithoutSource, nextTarget.path, () => group)
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
const direction = intent.side === "left" || intent.side === "right" ? "horizontal" : "vertical";
|
|
237
|
+
const itemGroup = {
|
|
238
|
+
type: "group",
|
|
239
|
+
items: [intent.itemId],
|
|
240
|
+
active: intent.itemId
|
|
241
|
+
};
|
|
242
|
+
const itemFirst = intent.side === "left" || intent.side === "top";
|
|
243
|
+
const nextRoot = mapAtPath(rootWithoutSource, nextTarget.path, node => ({
|
|
244
|
+
type: "split",
|
|
245
|
+
direction,
|
|
246
|
+
ratio: 0.5,
|
|
247
|
+
first: itemFirst ? itemGroup : node,
|
|
248
|
+
second: itemFirst ? node : itemGroup
|
|
249
|
+
}));
|
|
250
|
+
if (!isWithinLayoutLimits(nextRoot) || sameNode(nextRoot, layout.root)) return layout;
|
|
251
|
+
return {
|
|
252
|
+
version: PANES_LAYOUT_VERSION,
|
|
253
|
+
root: nextRoot
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
export const reconcilePanesLayout = (layout, desiredOpenItemIds) => {
|
|
257
|
+
assertUniqueStableUiIds(desiredOpenItemIds, "Panes item id", PANES_MAX_ID_LENGTH);
|
|
258
|
+
const desiredOpen = new Set(desiredOpenItemIds);
|
|
259
|
+
const root = layout.root ? reconcileNode(layout.root, desiredOpen) : null;
|
|
260
|
+
const present = new Set();
|
|
261
|
+
collectPresent(root, present);
|
|
262
|
+
const missing = desiredOpenItemIds.filter(itemId => !present.has(itemId));
|
|
263
|
+
if (missing.length === 0) return root === layout.root ? layout : {
|
|
264
|
+
version: PANES_LAYOUT_VERSION,
|
|
265
|
+
root
|
|
266
|
+
};
|
|
267
|
+
if (!root) return createPanesLayout(missing);
|
|
268
|
+
const target = firstGroup(root);
|
|
269
|
+
if (!target) return createPanesLayout(missing);
|
|
270
|
+
const located = findItem(root, target.active);
|
|
271
|
+
if (!located) return createPanesLayout(missing);
|
|
272
|
+
const group = {
|
|
273
|
+
...located.group,
|
|
274
|
+
items: [...located.group.items, ...missing]
|
|
275
|
+
};
|
|
276
|
+
return {
|
|
277
|
+
version: PANES_LAYOUT_VERSION,
|
|
278
|
+
root: mapAtPath(root, located.path, () => group)
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
const collectPresent = (node, ids) => {
|
|
282
|
+
if (!node) return;
|
|
283
|
+
if (node.type === "group") {
|
|
284
|
+
node.items.forEach(item => ids.add(item));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
collectPresent(node.first, ids);
|
|
288
|
+
collectPresent(node.second, ids);
|
|
289
|
+
};
|
|
290
|
+
export const resizePanesSplit = (layout, path, ratio) => {
|
|
291
|
+
if (!layout.root || !Number.isFinite(ratio)) return layout;
|
|
292
|
+
let target = layout.root;
|
|
293
|
+
for (const segment of path) {
|
|
294
|
+
if (target.type !== "split") return layout;
|
|
295
|
+
target = target[segment];
|
|
296
|
+
}
|
|
297
|
+
if (target.type !== "split") return layout;
|
|
298
|
+
const nextRatio = Math.min(1 - PANES_MIN_RATIO, Math.max(PANES_MIN_RATIO, ratio));
|
|
299
|
+
if (nextRatio === target.ratio) return layout;
|
|
300
|
+
return {
|
|
301
|
+
version: PANES_LAYOUT_VERSION,
|
|
302
|
+
root: mapAtPath(layout.root, path, node => node.type === "split" ? {
|
|
303
|
+
...node,
|
|
304
|
+
ratio: nextRatio
|
|
305
|
+
} : node)
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
const intentKey = intent => intent.type === "tab" ? `tab:${intent.itemId}:${intent.targetItemId}:${intent.beforeItemId === null ? "end:" : `before:${intent.beforeItemId}`}` : `split:${intent.itemId}:${intent.targetItemId}:${intent.side}`;
|
|
309
|
+
export const samePanesIntent = (left, right) => left === right || !!left && !!right && left.type === right.type && left.itemId === right.itemId && left.targetItemId === right.targetItemId && (left.type === "tab" && right.type === "tab" ? left.beforeItemId === right.beforeItemId : left.type === "split" && right.type === "split" && left.side === right.side);
|
|
310
|
+
const canSplitSide = (side, split) => {
|
|
311
|
+
if (split === false) return false;
|
|
312
|
+
const direction = side === "left" || side === "right" ? "horizontal" : "vertical";
|
|
313
|
+
return split === "both" || split === direction;
|
|
314
|
+
};
|
|
315
|
+
const collectGroups = (node, groups = []) => {
|
|
316
|
+
if (!node) return groups;
|
|
317
|
+
if (node.type === "group") groups.push(node);else {
|
|
318
|
+
collectGroups(node.first, groups);
|
|
319
|
+
collectGroups(node.second, groups);
|
|
320
|
+
}
|
|
321
|
+
return groups;
|
|
322
|
+
};
|
|
323
|
+
const nodeAtPath = (node, path) => {
|
|
324
|
+
let current = node;
|
|
325
|
+
for (const segment of path) {
|
|
326
|
+
if (current.type !== "split") return null;
|
|
327
|
+
current = current[segment];
|
|
328
|
+
}
|
|
329
|
+
return current;
|
|
330
|
+
};
|
|
331
|
+
const isExistingSplitPlacement = (layout, source, targetItemId, side) => {
|
|
332
|
+
if (!layout.root || source.group.items.length !== 1 || source.path.length === 0) return false;
|
|
333
|
+
const segment = source.path[source.path.length - 1];
|
|
334
|
+
const parent = nodeAtPath(layout.root, source.path.slice(0, -1));
|
|
335
|
+
if (!parent || parent.type !== "split" || parent.ratio !== 0.5) return false;
|
|
336
|
+
const direction = side === "left" || side === "right" ? "horizontal" : "vertical";
|
|
337
|
+
const sourceFirst = side === "left" || side === "top";
|
|
338
|
+
if (parent.direction !== direction || segment === "first" !== sourceFirst) return false;
|
|
339
|
+
const sibling = parent[segment === "first" ? "second" : "first"];
|
|
340
|
+
return sibling.type === "group" && sibling.items.includes(targetItemId);
|
|
341
|
+
};
|
|
342
|
+
const collectTreeStats = (node, depth = 0, stats = {
|
|
343
|
+
nodes: 0,
|
|
344
|
+
maxDepth: 0,
|
|
345
|
+
itemDepth: new Map()
|
|
346
|
+
}) => {
|
|
347
|
+
stats.nodes += 1;
|
|
348
|
+
stats.maxDepth = Math.max(stats.maxDepth, depth);
|
|
349
|
+
if (node.type === "group") node.items.forEach(itemId => stats.itemDepth.set(itemId, depth));else {
|
|
350
|
+
collectTreeStats(node.first, depth + 1, stats);
|
|
351
|
+
collectTreeStats(node.second, depth + 1, stats);
|
|
352
|
+
}
|
|
353
|
+
return stats;
|
|
354
|
+
};
|
|
355
|
+
export const getPanesDropTargets = (layout, itemId, options) => {
|
|
356
|
+
if (!options.movable || !layout.root) return [];
|
|
357
|
+
const source = findItem(layout.root, itemId);
|
|
358
|
+
if (!source) return [];
|
|
359
|
+
const rootWithoutSource = removeFromNode(layout.root, itemId);
|
|
360
|
+
const splitStats = rootWithoutSource ? collectTreeStats(rootWithoutSource) : null;
|
|
361
|
+
const targets = [];
|
|
362
|
+
const seen = new Set();
|
|
363
|
+
const add = (target, noop = false) => {
|
|
364
|
+
const id = intentKey(target.intent);
|
|
365
|
+
if (noop || seen.has(id)) return;
|
|
366
|
+
seen.add(id);
|
|
367
|
+
targets.push({
|
|
368
|
+
...target,
|
|
369
|
+
id
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
for (const group of collectGroups(layout.root)) {
|
|
373
|
+
const sameGroup = group === source.group;
|
|
374
|
+
const remaining = group.items.filter(id => id !== itemId);
|
|
375
|
+
const targetItemId = sameGroup ? remaining[0] : group.active;
|
|
376
|
+
if (!targetItemId) continue;
|
|
377
|
+
for (const beforeItemId of remaining) {
|
|
378
|
+
const intent = {
|
|
379
|
+
type: "tab",
|
|
380
|
+
itemId,
|
|
381
|
+
targetItemId,
|
|
382
|
+
beforeItemId
|
|
383
|
+
};
|
|
384
|
+
add({
|
|
385
|
+
kind: "tab",
|
|
386
|
+
targetItemId,
|
|
387
|
+
beforeItemId,
|
|
388
|
+
intent
|
|
389
|
+
}, sameGroup && group.items[source.index + 1] === beforeItemId);
|
|
390
|
+
}
|
|
391
|
+
if (sameGroup) {
|
|
392
|
+
const intent = {
|
|
393
|
+
type: "tab",
|
|
394
|
+
itemId,
|
|
395
|
+
targetItemId,
|
|
396
|
+
beforeItemId: null
|
|
397
|
+
};
|
|
398
|
+
add({
|
|
399
|
+
kind: "tab",
|
|
400
|
+
targetItemId,
|
|
401
|
+
beforeItemId: null,
|
|
402
|
+
intent
|
|
403
|
+
}, source.index === group.items.length - 1);
|
|
404
|
+
} else {
|
|
405
|
+
add({
|
|
406
|
+
kind: "group",
|
|
407
|
+
targetItemId,
|
|
408
|
+
intent: {
|
|
409
|
+
type: "tab",
|
|
410
|
+
itemId,
|
|
411
|
+
targetItemId,
|
|
412
|
+
beforeItemId: null
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
for (const side of ["top", "right", "bottom", "left"]) {
|
|
417
|
+
if (!canSplitSide(side, options.split)) continue;
|
|
418
|
+
const intent = {
|
|
419
|
+
type: "split",
|
|
420
|
+
itemId,
|
|
421
|
+
targetItemId,
|
|
422
|
+
side
|
|
423
|
+
};
|
|
424
|
+
const targetDepth = splitStats?.itemDepth.get(targetItemId);
|
|
425
|
+
const exceedsLimits = !splitStats || targetDepth === undefined || splitStats.nodes + 2 > MAX_NODES || Math.max(splitStats.maxDepth, targetDepth + 1) > MAX_DEPTH;
|
|
426
|
+
add({
|
|
427
|
+
kind: "split",
|
|
428
|
+
targetItemId,
|
|
429
|
+
side,
|
|
430
|
+
intent
|
|
431
|
+
}, exceedsLimits || isExistingSplitPlacement(layout, source, targetItemId, side));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return targets;
|
|
435
|
+
};
|
|
436
|
+
//# sourceMappingURL=panes-layout.js.map
|