@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,83 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
6
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
7
|
+
import { insert as _$insert } from "solid-js/web";
|
|
8
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
9
|
+
import { memo as _$memo } from "solid-js/web";
|
|
10
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<nav><!$><!/><!$><!/>`),
|
|
11
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<span class=k2b-range-picker__caption>`),
|
|
12
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<a class=k2b-range-picker__option>`);
|
|
13
|
+
import { For } from "solid-js";
|
|
14
|
+
import { useUiMessages } from "../intl/messages";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* RangePicker — the time window every observability surface needs.
|
|
18
|
+
*
|
|
19
|
+
* Rendered as links rather than buttons on purpose: window selection is a
|
|
20
|
+
* server concern (the query, not the rendering), so it belongs in the URL and
|
|
21
|
+
* works without hydration. Callers supply the href per option, which is what
|
|
22
|
+
* lets each page keep its own other params intact — the hand-rolled copies
|
|
23
|
+
* differed exactly there, with one silently dropping every unrelated filter.
|
|
24
|
+
*
|
|
25
|
+
* The vocabulary stays with the caller too. Traces think in `10m…30d`, request
|
|
26
|
+
* telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong
|
|
27
|
+
* for most of them.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export default function RangePicker(props) {
|
|
31
|
+
const messages = useUiMessages();
|
|
32
|
+
const caption = () => props.label === null ? null : props.label ?? messages().window;
|
|
33
|
+
return (() => {
|
|
34
|
+
var _el$ = _$getNextElement(_tmpl$),
|
|
35
|
+
_el$2 = _el$.firstChild,
|
|
36
|
+
[_el$3, _co$] = _$getNextMarker(_el$2.nextSibling),
|
|
37
|
+
_el$4 = _el$3.nextSibling,
|
|
38
|
+
[_el$5, _co$2] = _$getNextMarker(_el$4.nextSibling);
|
|
39
|
+
_$insert(_el$, (() => {
|
|
40
|
+
var _c$ = _$memo(() => !!caption());
|
|
41
|
+
return () => _c$() ? (() => {
|
|
42
|
+
var _el$6 = _$getNextElement(_tmpl$2);
|
|
43
|
+
_$insert(_el$6, caption);
|
|
44
|
+
return _el$6;
|
|
45
|
+
})() : null;
|
|
46
|
+
})(), _el$3, _co$);
|
|
47
|
+
_$insert(_el$, _$createComponent(For, {
|
|
48
|
+
get each() {
|
|
49
|
+
return props.options;
|
|
50
|
+
},
|
|
51
|
+
children: option => (() => {
|
|
52
|
+
var _el$7 = _$getNextElement(_tmpl$3);
|
|
53
|
+
_$insert(_el$7, () => option.label ?? option.value);
|
|
54
|
+
_$effect(_p$ => {
|
|
55
|
+
var _v$3 = option.href,
|
|
56
|
+
_v$4 = option.value === props.value ? "true" : undefined,
|
|
57
|
+
_v$5 = option.value === props.value ? "true" : undefined;
|
|
58
|
+
_v$3 !== _p$.e && _$setAttribute(_el$7, "href", _p$.e = _v$3);
|
|
59
|
+
_v$4 !== _p$.t && _$setAttribute(_el$7, "data-selected", _p$.t = _v$4);
|
|
60
|
+
_v$5 !== _p$.a && _$setAttribute(_el$7, "aria-current", _p$.a = _v$5);
|
|
61
|
+
return _p$;
|
|
62
|
+
}, {
|
|
63
|
+
e: undefined,
|
|
64
|
+
t: undefined,
|
|
65
|
+
a: undefined
|
|
66
|
+
});
|
|
67
|
+
return _el$7;
|
|
68
|
+
})()
|
|
69
|
+
}), _el$5, _co$2);
|
|
70
|
+
_$effect(_p$ => {
|
|
71
|
+
var _v$ = `k2b-range-picker ${props.class ?? ""}`,
|
|
72
|
+
_v$2 = props.ariaLabel ?? caption() ?? messages().range;
|
|
73
|
+
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
74
|
+
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
|
|
75
|
+
return _p$;
|
|
76
|
+
}, {
|
|
77
|
+
e: undefined,
|
|
78
|
+
t: undefined
|
|
79
|
+
});
|
|
80
|
+
return _el$;
|
|
81
|
+
})();
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=RangePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["For","useUiMessages","RangePicker","props","messages","caption","label","window","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_co$","_$getNextMarker","nextSibling","_el$4","_el$5","_co$2","_$insert","_c$","_$memo","_el$6","_tmpl$2","_$createComponent","each","options","children","option","_el$7","_tmpl$3","value","_$effect","_p$","_v$3","href","_v$4","undefined","_v$5","e","_$setAttribute","t","a","_v$","class","_v$2","ariaLabel","range","_$className"],"sources":["content/RangePicker.tsx"],"sourcesContent":["import { For } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * RangePicker — the time window every observability surface needs.\n *\n * Rendered as links rather than buttons on purpose: window selection is a\n * server concern (the query, not the rendering), so it belongs in the URL and\n * works without hydration. Callers supply the href per option, which is what\n * lets each page keep its own other params intact — the hand-rolled copies\n * differed exactly there, with one silently dropping every unrelated filter.\n *\n * The vocabulary stays with the caller too. Traces think in `10m…30d`, request\n * telemetry in `1h…30d`, audit in days; a single hardcoded list would be wrong\n * for most of them.\n */\nexport type RangeOption<T extends string> = {\n value: T;\n /** Defaults to the value, which is already short by convention (`24h`). */\n label?: string;\n href: string;\n};\n\nexport type RangePickerProps<T extends string> = {\n options: readonly RangeOption<T>[];\n value: T;\n /** Leading caption. Pass `null` to omit it in tight toolbars. */\n label?: string | null;\n /** Names the control for assistive tech; defaults to the visible label. */\n ariaLabel?: string;\n class?: string;\n};\n\nexport default function RangePicker<T extends string>(props: RangePickerProps<T>) {\n const messages = useUiMessages();\n const caption = () => (props.label === null ? null : (props.label ?? messages().window));\n return (\n <nav class={`k2b-range-picker ${props.class ?? \"\"}`} aria-label={props.ariaLabel ?? caption() ?? messages().range}>\n {caption() ? <span class=\"k2b-range-picker__caption\">{caption()}</span> : null}\n <For each={props.options}>\n {(option) => (\n <a\n href={option.href}\n class=\"k2b-range-picker__option\"\n data-selected={option.value === props.value ? \"true\" : undefined}\n aria-current={option.value === props.value ? \"true\" : undefined}\n >\n {option.label ?? option.value}\n </a>\n )}\n </For>\n </nav>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
4
|
+
import { className as _$className } from "solid-js/web";
|
|
5
|
+
import { effect as _$effect } from "solid-js/web";
|
|
6
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
7
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
8
|
+
import { memo as _$memo } from "solid-js/web";
|
|
9
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
10
|
+
import { insert as _$insert } from "solid-js/web";
|
|
11
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
12
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__rows>`),
|
|
13
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<p class=k2b-content-structured-data__hidden><!$><!/> more row<!$><!/> hidden.`),
|
|
14
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__surface>`),
|
|
15
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-content-structured-data__action>`),
|
|
16
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<div><!$><!/><!$><!/><div class=k2b-content-structured-data__footer>`),
|
|
17
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<h2 class=k2b-content-structured-data__title>`),
|
|
18
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__copy>`),
|
|
19
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-content-structured-data__surface data-mode=raw><pre></pre><!$><!/>`),
|
|
20
|
+
_tmpl$9 = /*#__PURE__*/_$template(`<p class=k2b-content-structured-data__empty>`),
|
|
21
|
+
_tmpl$0 = /*#__PURE__*/_$template(`<span class=k2b-content-structured-data__key>`),
|
|
22
|
+
_tmpl$1 = /*#__PURE__*/_$template(`<span class=k2b-content-structured-data__value>`);
|
|
23
|
+
import { createMemo, createSignal, For, Show } from "solid-js";
|
|
24
|
+
import CopyButton from "../actions/CopyButton";
|
|
25
|
+
import { resolveMaybeAccessor } from "../inputs/field-contract";
|
|
26
|
+
import { useUiMessages } from "../intl/messages";
|
|
27
|
+
export const isStructuredDataValue = (value, seen = new WeakSet()) => {
|
|
28
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") return true;
|
|
29
|
+
if (typeof value === "number") return Number.isFinite(value);
|
|
30
|
+
if (typeof value !== "object" || seen.has(value)) return false;
|
|
31
|
+
const prototype = Object.getPrototypeOf(value);
|
|
32
|
+
if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;
|
|
33
|
+
seen.add(value);
|
|
34
|
+
const valid = Array.isArray(value) ? value.every(item => isStructuredDataValue(item, seen)) : Object.values(value).every(item => isStructuredDataValue(item, seen));
|
|
35
|
+
seen.delete(value);
|
|
36
|
+
return valid;
|
|
37
|
+
};
|
|
38
|
+
const toRows = data => {
|
|
39
|
+
if (Array.isArray(data)) return data.map((value, index) => ({
|
|
40
|
+
key: String(index),
|
|
41
|
+
value
|
|
42
|
+
}));
|
|
43
|
+
if (data && typeof data === "object") return Object.entries(data).map(([key, value]) => ({
|
|
44
|
+
key,
|
|
45
|
+
value
|
|
46
|
+
}));
|
|
47
|
+
if (data === null) return [];
|
|
48
|
+
return [{
|
|
49
|
+
key: "value",
|
|
50
|
+
value: data
|
|
51
|
+
}];
|
|
52
|
+
};
|
|
53
|
+
const formatInlineValue = value => {
|
|
54
|
+
if (value === null) return "null";
|
|
55
|
+
if (typeof value === "string") return value;
|
|
56
|
+
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
57
|
+
return JSON.stringify(value);
|
|
58
|
+
};
|
|
59
|
+
const formatJson = data => JSON.stringify(data, null, 2);
|
|
60
|
+
export default function StructuredDataPreview(props) {
|
|
61
|
+
const messages = useUiMessages();
|
|
62
|
+
const [internalMode, setInternalMode] = createSignal(props.defaultMode ?? "formatted");
|
|
63
|
+
const mode = () => props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode);
|
|
64
|
+
const setMode = next => {
|
|
65
|
+
if (props.mode === undefined) setInternalMode(next);
|
|
66
|
+
props.onModeChange?.(next);
|
|
67
|
+
};
|
|
68
|
+
const rows = createMemo(() => toRows(props.data));
|
|
69
|
+
const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));
|
|
70
|
+
const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));
|
|
71
|
+
const raw = createMemo(() => formatJson(props.data));
|
|
72
|
+
const hasData = createMemo(() => rows().length > 0);
|
|
73
|
+
const showRaw = createMemo(() => mode() === "raw");
|
|
74
|
+
return (() => {
|
|
75
|
+
var _el$ = _$getNextElement(_tmpl$5),
|
|
76
|
+
_el$11 = _el$.firstChild,
|
|
77
|
+
[_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling),
|
|
78
|
+
_el$13 = _el$12.nextSibling,
|
|
79
|
+
[_el$14, _co$4] = _$getNextMarker(_el$13.nextSibling),
|
|
80
|
+
_el$1 = _el$14.nextSibling;
|
|
81
|
+
_$insert(_el$, _$createComponent(Show, {
|
|
82
|
+
get when() {
|
|
83
|
+
return props.title;
|
|
84
|
+
},
|
|
85
|
+
children: title => (() => {
|
|
86
|
+
var _el$15 = _$getNextElement(_tmpl$6);
|
|
87
|
+
_$insert(_el$15, title);
|
|
88
|
+
return _el$15;
|
|
89
|
+
})()
|
|
90
|
+
}), _el$12, _co$3);
|
|
91
|
+
_$insert(_el$, _$createComponent(Show, {
|
|
92
|
+
get when() {
|
|
93
|
+
return !showRaw();
|
|
94
|
+
},
|
|
95
|
+
get fallback() {
|
|
96
|
+
return (() => {
|
|
97
|
+
var _el$16 = _$getNextElement(_tmpl$8),
|
|
98
|
+
_el$17 = _el$16.firstChild,
|
|
99
|
+
_el$19 = _el$17.nextSibling,
|
|
100
|
+
[_el$20, _co$5] = _$getNextMarker(_el$19.nextSibling);
|
|
101
|
+
_$insert(_el$17, raw);
|
|
102
|
+
_$insert(_el$16, _$createComponent(Show, {
|
|
103
|
+
get when() {
|
|
104
|
+
return props.copy !== false;
|
|
105
|
+
},
|
|
106
|
+
get children() {
|
|
107
|
+
var _el$18 = _$getNextElement(_tmpl$7);
|
|
108
|
+
_$insert(_el$18, _$createComponent(CopyButton, {
|
|
109
|
+
get text() {
|
|
110
|
+
return raw();
|
|
111
|
+
}
|
|
112
|
+
}));
|
|
113
|
+
return _el$18;
|
|
114
|
+
}
|
|
115
|
+
}), _el$20, _co$5);
|
|
116
|
+
return _el$16;
|
|
117
|
+
})();
|
|
118
|
+
},
|
|
119
|
+
get children() {
|
|
120
|
+
var _el$2 = _$getNextElement(_tmpl$3);
|
|
121
|
+
_$insert(_el$2, _$createComponent(Show, {
|
|
122
|
+
get when() {
|
|
123
|
+
return hasData();
|
|
124
|
+
},
|
|
125
|
+
get fallback() {
|
|
126
|
+
return (() => {
|
|
127
|
+
var _el$21 = _$getNextElement(_tmpl$9);
|
|
128
|
+
_$insert(_el$21, () => props.empty ?? messages().noData);
|
|
129
|
+
return _el$21;
|
|
130
|
+
})();
|
|
131
|
+
},
|
|
132
|
+
get children() {
|
|
133
|
+
return [(() => {
|
|
134
|
+
var _el$3 = _$getNextElement(_tmpl$);
|
|
135
|
+
_$insert(_el$3, _$createComponent(For, {
|
|
136
|
+
get each() {
|
|
137
|
+
return visibleRows();
|
|
138
|
+
},
|
|
139
|
+
children: row => {
|
|
140
|
+
const complex = typeof row.value === "object" && row.value !== null;
|
|
141
|
+
return [(() => {
|
|
142
|
+
var _el$22 = _$getNextElement(_tmpl$0);
|
|
143
|
+
_$insert(_el$22, () => row.key);
|
|
144
|
+
_$effect(() => _$setAttribute(_el$22, "title", row.key));
|
|
145
|
+
return _el$22;
|
|
146
|
+
})(), (() => {
|
|
147
|
+
var _el$23 = _$getNextElement(_tmpl$1);
|
|
148
|
+
_$setAttribute(_el$23, "data-complex", complex ? "true" : undefined);
|
|
149
|
+
_$insert(_el$23, () => formatInlineValue(row.value));
|
|
150
|
+
return _el$23;
|
|
151
|
+
})()];
|
|
152
|
+
}
|
|
153
|
+
}));
|
|
154
|
+
return _el$3;
|
|
155
|
+
})(), _$createComponent(Show, {
|
|
156
|
+
get when() {
|
|
157
|
+
return hiddenCount() > 0;
|
|
158
|
+
},
|
|
159
|
+
get children() {
|
|
160
|
+
var _el$4 = _$getNextElement(_tmpl$2),
|
|
161
|
+
_el$7 = _el$4.firstChild,
|
|
162
|
+
[_el$8, _co$] = _$getNextMarker(_el$7.nextSibling),
|
|
163
|
+
_el$5 = _el$8.nextSibling,
|
|
164
|
+
_el$9 = _el$5.nextSibling,
|
|
165
|
+
[_el$0, _co$2] = _$getNextMarker(_el$9.nextSibling),
|
|
166
|
+
_el$6 = _el$0.nextSibling;
|
|
167
|
+
_$insert(_el$4, hiddenCount, _el$8, _co$);
|
|
168
|
+
_$insert(_el$4, () => hiddenCount() === 1 ? "" : "s", _el$0, _co$2);
|
|
169
|
+
return _el$4;
|
|
170
|
+
}
|
|
171
|
+
})];
|
|
172
|
+
}
|
|
173
|
+
}));
|
|
174
|
+
return _el$2;
|
|
175
|
+
}
|
|
176
|
+
}), _el$14, _co$4);
|
|
177
|
+
_$insert(_el$1, _$createComponent(Show, {
|
|
178
|
+
get when() {
|
|
179
|
+
return hasData();
|
|
180
|
+
},
|
|
181
|
+
get children() {
|
|
182
|
+
var _el$10 = _$getNextElement(_tmpl$4);
|
|
183
|
+
_el$10.$$click = () => setMode(showRaw() ? "formatted" : "raw");
|
|
184
|
+
_$insert(_el$10, () => showRaw() ? "View formatted" : "View raw");
|
|
185
|
+
_$runHydrationEvents();
|
|
186
|
+
return _el$10;
|
|
187
|
+
}
|
|
188
|
+
}));
|
|
189
|
+
_$effect(() => _$className(_el$, ["k2b-content-structured-data", props.class].filter(Boolean).join(" ")));
|
|
190
|
+
return _el$;
|
|
191
|
+
})();
|
|
192
|
+
}
|
|
193
|
+
_$delegateEvents(["click"]);
|
|
194
|
+
//# sourceMappingURL=StructuredDataPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createMemo","createSignal","For","Show","CopyButton","resolveMaybeAccessor","useUiMessages","isStructuredDataValue","value","seen","WeakSet","Number","isFinite","has","prototype","Object","getPrototypeOf","Array","isArray","add","valid","every","item","values","delete","toRows","data","map","index","key","String","entries","formatInlineValue","JSON","stringify","formatJson","StructuredDataPreview","props","messages","internalMode","setInternalMode","defaultMode","mode","undefined","setMode","next","onModeChange","rows","visibleRows","slice","maxRows","length","hiddenCount","Math","max","raw","hasData","showRaw","_el$","_$getNextElement","_tmpl$5","_el$11","firstChild","_el$12","_co$3","_$getNextMarker","nextSibling","_el$13","_el$14","_co$4","_el$1","_$insert","_$createComponent","when","title","children","_el$15","_tmpl$6","fallback","_el$16","_tmpl$8","_el$17","_el$19","_el$20","_co$5","copy","_el$18","_tmpl$7","text","_el$2","_tmpl$3","_el$21","_tmpl$9","empty","noData","_el$3","_tmpl$","each","row","complex","_el$22","_tmpl$0","_$effect","_$setAttribute","_el$23","_tmpl$1","_el$4","_tmpl$2","_el$7","_el$8","_co$","_el$5","_el$9","_el$0","_co$2","_el$6","_el$10","_tmpl$4","$$click","_$runHydrationEvents","_$className","class","filter","Boolean","join","_$delegateEvents"],"sources":["content/StructuredDataPreview.tsx"],"sourcesContent":["import { createMemo, createSignal, For, Show } from \"solid-js\";\nimport CopyButton from \"../actions/CopyButton\";\nimport { type MaybeAccessor, resolveMaybeAccessor } from \"../inputs/field-contract\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type StructuredDataPreviewMode = \"formatted\" | \"raw\";\nexport type StructuredDataValue =\n | null\n | boolean\n | number\n | string\n | readonly StructuredDataValue[]\n | { readonly [key: string]: StructuredDataValue };\n\nexport const isStructuredDataValue = (value: unknown, seen = new WeakSet<object>()): value is StructuredDataValue => {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\" || seen.has(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) return false;\n\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isStructuredDataValue(item, seen))\n : Object.values(value).every((item) => isStructuredDataValue(item, seen));\n seen.delete(value);\n return valid;\n};\n\nexport type StructuredDataPreviewProps = {\n title?: string;\n data: StructuredDataValue;\n /** Controlled display mode. */\n mode?: MaybeAccessor<StructuredDataPreviewMode>;\n onModeChange?: (mode: StructuredDataPreviewMode) => void;\n /** Initial mode for an uncontrolled preview. */\n defaultMode?: StructuredDataPreviewMode;\n copy?: boolean;\n empty?: string;\n maxRows?: number;\n class?: string;\n};\n\ntype Row = {\n key: string;\n value: StructuredDataValue;\n};\n\nconst toRows = (data: StructuredDataValue): Row[] => {\n if (Array.isArray(data)) return data.map((value, index) => ({ key: String(index), value }));\n if (data && typeof data === \"object\") return Object.entries(data).map(([key, value]) => ({ key, value }));\n if (data === null) return [];\n return [{ key: \"value\", value: data }];\n};\n\nconst formatInlineValue = (value: StructuredDataValue): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nconst formatJson = (data: StructuredDataValue): string => JSON.stringify(data, null, 2);\n\nexport default function StructuredDataPreview(props: StructuredDataPreviewProps) {\n const messages = useUiMessages();\n const [internalMode, setInternalMode] = createSignal<StructuredDataPreviewMode>(props.defaultMode ?? \"formatted\");\n const mode = () => (props.mode === undefined ? internalMode() : resolveMaybeAccessor(props.mode));\n const setMode = (next: StructuredDataPreviewMode) => {\n if (props.mode === undefined) setInternalMode(next);\n props.onModeChange?.(next);\n };\n const rows = createMemo(() => toRows(props.data));\n const visibleRows = createMemo(() => rows().slice(0, props.maxRows ?? rows().length));\n const hiddenCount = createMemo(() => Math.max(0, rows().length - visibleRows().length));\n const raw = createMemo(() => formatJson(props.data));\n const hasData = createMemo(() => rows().length > 0);\n const showRaw = createMemo(() => mode() === \"raw\");\n\n return (\n <div class={[\"k2b-content-structured-data\", props.class].filter(Boolean).join(\" \")}>\n <Show when={props.title}>{(title) => <h2 class=\"k2b-content-structured-data__title\">{title()}</h2>}</Show>\n\n <Show\n when={!showRaw()}\n fallback={\n <div class=\"k2b-content-structured-data__surface\" data-mode=\"raw\">\n <pre>{raw()}</pre>\n <Show when={props.copy !== false}>\n <div class=\"k2b-content-structured-data__copy\">\n <CopyButton text={raw()} />\n </div>\n </Show>\n </div>\n }\n >\n <div class=\"k2b-content-structured-data__surface\">\n <Show when={hasData()} fallback={<p class=\"k2b-content-structured-data__empty\">{props.empty ?? messages().noData}</p>}>\n <div class=\"k2b-content-structured-data__rows\">\n <For each={visibleRows()}>\n {(row) => {\n const complex = typeof row.value === \"object\" && row.value !== null;\n return (\n <>\n <span class=\"k2b-content-structured-data__key\" title={row.key}>\n {row.key}\n </span>\n <span class=\"k2b-content-structured-data__value\" data-complex={complex ? \"true\" : undefined}>\n {formatInlineValue(row.value)}\n </span>\n </>\n );\n }}\n </For>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"k2b-content-structured-data__hidden\">\n {hiddenCount()} more row{hiddenCount() === 1 ? \"\" : \"s\"} hidden.\n </p>\n </Show>\n </Show>\n </div>\n </Show>\n\n <div class=\"k2b-content-structured-data__footer\">\n <Show when={hasData()}>\n <button type=\"button\" class=\"k2b-content-structured-data__action\" onClick={() => setMode(showRaw() ? \"formatted\" : \"raw\")}>\n {showRaw() ? \"View formatted\" : \"View raw\"}\n </button>\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const heapPush = (heap, value, before) => {
|
|
2
|
+
heap.push(value);
|
|
3
|
+
let index = heap.length - 1;
|
|
4
|
+
while (index > 0) {
|
|
5
|
+
const parent = Math.floor((index - 1) / 2);
|
|
6
|
+
if (!before(heap[index], heap[parent])) break;
|
|
7
|
+
[heap[parent], heap[index]] = [heap[index], heap[parent]];
|
|
8
|
+
index = parent;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const heapPop = (heap, before) => {
|
|
12
|
+
const first = heap[0];
|
|
13
|
+
const last = heap.pop();
|
|
14
|
+
if (heap.length === 0 || last === undefined) return first;
|
|
15
|
+
heap[0] = last;
|
|
16
|
+
let index = 0;
|
|
17
|
+
while (true) {
|
|
18
|
+
const left = index * 2 + 1;
|
|
19
|
+
const right = left + 1;
|
|
20
|
+
let next = index;
|
|
21
|
+
if (left < heap.length && before(heap[left], heap[next])) next = left;
|
|
22
|
+
if (right < heap.length && before(heap[right], heap[next])) next = right;
|
|
23
|
+
if (next === index) return first;
|
|
24
|
+
[heap[index], heap[next]] = [heap[next], heap[index]];
|
|
25
|
+
index = next;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const layoutGroup = (group, groupId) => {
|
|
29
|
+
const active = [];
|
|
30
|
+
const freeLanes = [];
|
|
31
|
+
const assigned = [];
|
|
32
|
+
let laneCount = 0;
|
|
33
|
+
for (const entry of group) {
|
|
34
|
+
while (active[0] && active[0].end <= entry.start) {
|
|
35
|
+
const released = heapPop(active, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
|
|
36
|
+
if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);
|
|
37
|
+
}
|
|
38
|
+
const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;
|
|
39
|
+
heapPush(active, {
|
|
40
|
+
end: entry.end,
|
|
41
|
+
lane
|
|
42
|
+
}, (left, right) => left.end < right.end || left.end === right.end && left.lane < right.lane);
|
|
43
|
+
assigned.push({
|
|
44
|
+
item: entry.item,
|
|
45
|
+
lane
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const groupStart = group[0]?.start ?? 0;
|
|
49
|
+
const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);
|
|
50
|
+
return assigned.map(({
|
|
51
|
+
item,
|
|
52
|
+
lane
|
|
53
|
+
}) => ({
|
|
54
|
+
item,
|
|
55
|
+
lane,
|
|
56
|
+
lanes: Math.max(1, laneCount),
|
|
57
|
+
groupId,
|
|
58
|
+
groupStart,
|
|
59
|
+
groupEnd
|
|
60
|
+
}));
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Assigns the lowest available visual lane to overlapping intervals.
|
|
65
|
+
* Sorting plus two binary heaps keeps large overlap groups at O(n log n).
|
|
66
|
+
*/
|
|
67
|
+
export const layoutCalendarIntervals = (items, bounds) => {
|
|
68
|
+
const sorted = items.map(item => {
|
|
69
|
+
const interval = bounds(item);
|
|
70
|
+
return {
|
|
71
|
+
item,
|
|
72
|
+
start: interval.start,
|
|
73
|
+
end: Math.max(interval.start, interval.end)
|
|
74
|
+
};
|
|
75
|
+
}).sort((left, right) => left.start - right.start || right.end - left.end);
|
|
76
|
+
const groups = [];
|
|
77
|
+
let group = [];
|
|
78
|
+
let groupEnd = Number.NEGATIVE_INFINITY;
|
|
79
|
+
for (const entry of sorted) {
|
|
80
|
+
if (group.length === 0 || entry.start < groupEnd) {
|
|
81
|
+
group.push(entry);
|
|
82
|
+
groupEnd = Math.max(groupEnd, entry.end);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
groups.push(group);
|
|
86
|
+
group = [entry];
|
|
87
|
+
groupEnd = entry.end;
|
|
88
|
+
}
|
|
89
|
+
if (group.length > 0) groups.push(group);
|
|
90
|
+
return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=calendar-event-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["heapPush","heap","value","before","push","index","length","parent","Math","floor","heapPop","first","last","pop","undefined","left","right","next","layoutGroup","group","groupId","active","freeLanes","assigned","laneCount","entry","end","start","released","lane","item","groupStart","groupEnd","reduce","latest","max","map","lanes","layoutCalendarIntervals","items","bounds","sorted","interval","sort","groups","Number","NEGATIVE_INFINITY","flatMap","entries"],"sources":["content/calendar-event-layout.ts"],"sourcesContent":["export type CalendarIntervalLayout<T> = {\n item: T;\n lane: number;\n lanes: number;\n groupId: number;\n groupStart: number;\n groupEnd: number;\n};\n\ntype BoundedItem<T> = {\n item: T;\n start: number;\n end: number;\n};\n\ntype ActiveLane = {\n end: number;\n lane: number;\n};\n\nconst heapPush = <T>(heap: T[], value: T, before: (left: T, right: T) => boolean): void => {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if (!before(heap[index]!, heap[parent]!)) break;\n [heap[parent], heap[index]] = [heap[index]!, heap[parent]!];\n index = parent;\n }\n};\n\nconst heapPop = <T>(heap: T[], before: (left: T, right: T) => boolean): T | undefined => {\n const first = heap[0];\n const last = heap.pop();\n if (heap.length === 0 || last === undefined) return first;\n heap[0] = last;\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n const right = left + 1;\n let next = index;\n if (left < heap.length && before(heap[left]!, heap[next]!)) next = left;\n if (right < heap.length && before(heap[right]!, heap[next]!)) next = right;\n if (next === index) return first;\n [heap[index], heap[next]] = [heap[next]!, heap[index]!];\n index = next;\n }\n};\n\nconst layoutGroup = <T>(group: readonly BoundedItem<T>[], groupId: number): CalendarIntervalLayout<T>[] => {\n const active: ActiveLane[] = [];\n const freeLanes: number[] = [];\n const assigned: Array<{ item: T; lane: number }> = [];\n let laneCount = 0;\n\n for (const entry of group) {\n while (active[0] && active[0].end <= entry.start) {\n const released = heapPop(active, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n if (released) heapPush(freeLanes, released.lane, (left, right) => left < right);\n }\n const lane = heapPop(freeLanes, (left, right) => left < right) ?? laneCount++;\n heapPush(active, { end: entry.end, lane }, (left, right) => left.end < right.end || (left.end === right.end && left.lane < right.lane));\n assigned.push({ item: entry.item, lane });\n }\n\n const groupStart = group[0]?.start ?? 0;\n const groupEnd = group.reduce((latest, entry) => Math.max(latest, entry.end), groupStart);\n return assigned.map(({ item, lane }) => ({ item, lane, lanes: Math.max(1, laneCount), groupId, groupStart, groupEnd }));\n};\n\n/**\n * Assigns the lowest available visual lane to overlapping intervals.\n * Sorting plus two binary heaps keeps large overlap groups at O(n log n).\n */\nexport const layoutCalendarIntervals = <T>(\n items: readonly T[],\n bounds: (item: T) => { start: number; end: number },\n): CalendarIntervalLayout<T>[] => {\n const sorted = items\n .map((item) => {\n const interval = bounds(item);\n return { item, start: interval.start, end: Math.max(interval.start, interval.end) };\n })\n .sort((left, right) => left.start - right.start || right.end - left.end);\n const groups: Array<Array<BoundedItem<T>>> = [];\n let group: Array<BoundedItem<T>> = [];\n let groupEnd = Number.NEGATIVE_INFINITY;\n\n for (const entry of sorted) {\n if (group.length === 0 || entry.start < groupEnd) {\n group.push(entry);\n groupEnd = Math.max(groupEnd, entry.end);\n continue;\n }\n groups.push(group);\n group = [entry];\n groupEnd = entry.end;\n }\n if (group.length > 0) groups.push(group);\n\n return groups.flatMap((entries, groupId) => layoutGroup(entries, groupId));\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const CALENDAR_SNAP_MINUTES = 15;
|
|
2
|
+
export const snapCalendarMinutes = (minutes, step = CALENDAR_SNAP_MINUTES) => Math.round(minutes / step) * step;
|
|
3
|
+
export const calendarDayIndexAtPoint = (clientX, startX, width, days) => {
|
|
4
|
+
if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;
|
|
5
|
+
return Math.min(days - 1, Math.floor((clientX - startX) / width * days));
|
|
6
|
+
};
|
|
7
|
+
export const calendarMinuteAtPoint = (clientY, top, height, startHour, endHour) => {
|
|
8
|
+
const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);
|
|
9
|
+
const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;
|
|
10
|
+
return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);
|
|
11
|
+
};
|
|
12
|
+
export const calendarAutoScrollSpeed = (clientY, top, bottom, edge = 56, maximum = 18) => {
|
|
13
|
+
if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));
|
|
14
|
+
if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));
|
|
15
|
+
return 0;
|
|
16
|
+
};
|
|
17
|
+
let cancelActiveSession = null;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Owns one pointer gesture from threshold crossing through commit or cancel.
|
|
21
|
+
* Views provide geometry through `resolve`; this helper owns global cleanup,
|
|
22
|
+
* pointer cancellation, Escape handling, and edge auto-scroll.
|
|
23
|
+
*/
|
|
24
|
+
export const startCalendarPointerSession = options => {
|
|
25
|
+
if (options.event.button !== 0 || !options.event.isPrimary) return () => {};
|
|
26
|
+
cancelActiveSession?.();
|
|
27
|
+
const pointerId = options.event.pointerId;
|
|
28
|
+
const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;
|
|
29
|
+
const startX = options.event.clientX;
|
|
30
|
+
const startY = options.event.clientY;
|
|
31
|
+
// Leave enough room for normal click jitter before an event becomes a drag.
|
|
32
|
+
const threshold = options.threshold ?? 6;
|
|
33
|
+
const previousUserSelect = document.body.style.userSelect;
|
|
34
|
+
let clientX = startX;
|
|
35
|
+
let clientY = startY;
|
|
36
|
+
let active = false;
|
|
37
|
+
let finished = false;
|
|
38
|
+
let latest = null;
|
|
39
|
+
let scrollFrame = 0;
|
|
40
|
+
const preview = () => {
|
|
41
|
+
const value = options.resolve(clientX, clientY);
|
|
42
|
+
if (value === null) return;
|
|
43
|
+
latest = value;
|
|
44
|
+
options.onPreview(value);
|
|
45
|
+
};
|
|
46
|
+
const autoScroll = () => {
|
|
47
|
+
scrollFrame = 0;
|
|
48
|
+
if (!active || !options.scrollContainer) return;
|
|
49
|
+
const rect = options.scrollContainer.getBoundingClientRect();
|
|
50
|
+
const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);
|
|
51
|
+
if (speed !== 0) {
|
|
52
|
+
const before = options.scrollContainer.scrollTop;
|
|
53
|
+
options.scrollContainer.scrollTop += speed;
|
|
54
|
+
if (options.scrollContainer.scrollTop !== before) preview();
|
|
55
|
+
}
|
|
56
|
+
scrollFrame = requestAnimationFrame(autoScroll);
|
|
57
|
+
};
|
|
58
|
+
const cleanup = () => {
|
|
59
|
+
if (scrollFrame) cancelAnimationFrame(scrollFrame);
|
|
60
|
+
window.removeEventListener("pointermove", onMove);
|
|
61
|
+
window.removeEventListener("pointerup", onUp);
|
|
62
|
+
window.removeEventListener("pointercancel", cancel);
|
|
63
|
+
window.removeEventListener("blur", cancel);
|
|
64
|
+
window.removeEventListener("keydown", onKeyDown);
|
|
65
|
+
if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);
|
|
66
|
+
document.body.style.userSelect = previousUserSelect;
|
|
67
|
+
if (cancelActiveSession === cancel) cancelActiveSession = null;
|
|
68
|
+
};
|
|
69
|
+
const activate = () => {
|
|
70
|
+
if (active) return;
|
|
71
|
+
active = true;
|
|
72
|
+
document.body.style.userSelect = "none";
|
|
73
|
+
target?.setPointerCapture?.(pointerId);
|
|
74
|
+
options.onActivate?.();
|
|
75
|
+
preview();
|
|
76
|
+
if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);
|
|
77
|
+
};
|
|
78
|
+
function cancel() {
|
|
79
|
+
if (finished) return;
|
|
80
|
+
finished = true;
|
|
81
|
+
cleanup();
|
|
82
|
+
if (active) options.onCancel?.();
|
|
83
|
+
}
|
|
84
|
+
function onMove(event) {
|
|
85
|
+
if (finished || event.pointerId !== pointerId) return;
|
|
86
|
+
clientX = event.clientX;
|
|
87
|
+
clientY = event.clientY;
|
|
88
|
+
if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();
|
|
89
|
+
if (!active) return;
|
|
90
|
+
event.preventDefault();
|
|
91
|
+
preview();
|
|
92
|
+
}
|
|
93
|
+
function onUp(event) {
|
|
94
|
+
if (finished || event.pointerId !== pointerId) return;
|
|
95
|
+
finished = true;
|
|
96
|
+
cleanup();
|
|
97
|
+
if (active && latest !== null) options.onCommit(latest);else if (active) options.onCancel?.();
|
|
98
|
+
}
|
|
99
|
+
function onKeyDown(event) {
|
|
100
|
+
if (event.key !== "Escape") return;
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
cancel();
|
|
103
|
+
}
|
|
104
|
+
window.addEventListener("pointermove", onMove, {
|
|
105
|
+
passive: false
|
|
106
|
+
});
|
|
107
|
+
window.addEventListener("pointerup", onUp);
|
|
108
|
+
window.addEventListener("pointercancel", cancel);
|
|
109
|
+
window.addEventListener("blur", cancel);
|
|
110
|
+
window.addEventListener("keydown", onKeyDown);
|
|
111
|
+
cancelActiveSession = cancel;
|
|
112
|
+
return cancel;
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=calendar-pointer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CALENDAR_SNAP_MINUTES","snapCalendarMinutes","minutes","step","Math","round","calendarDayIndexAtPoint","clientX","startX","width","days","min","floor","calendarMinuteAtPoint","clientY","top","height","startHour","endHour","totalMinutes","max","ratio","calendarAutoScrollSpeed","bottom","edge","maximum","ceil","cancelActiveSession","startCalendarPointerSession","options","event","button","isPrimary","pointerId","target","currentTarget","HTMLElement","startY","threshold","previousUserSelect","document","body","style","userSelect","active","finished","latest","scrollFrame","preview","value","resolve","onPreview","autoScroll","scrollContainer","rect","getBoundingClientRect","speed","before","scrollTop","requestAnimationFrame","cleanup","cancelAnimationFrame","window","removeEventListener","onMove","onUp","cancel","onKeyDown","hasPointerCapture","releasePointerCapture","activate","setPointerCapture","onActivate","onCancel","hypot","preventDefault","onCommit","key","addEventListener","passive"],"sources":["content/calendar-pointer.ts"],"sourcesContent":["export const CALENDAR_SNAP_MINUTES = 15;\n\nexport const snapCalendarMinutes = (minutes: number, step = CALENDAR_SNAP_MINUTES): number => Math.round(minutes / step) * step;\n\nexport const calendarDayIndexAtPoint = (clientX: number, startX: number, width: number, days: number): number | null => {\n if (days <= 0 || width <= 0 || clientX < startX || clientX >= startX + width) return null;\n return Math.min(days - 1, Math.floor(((clientX - startX) / width) * days));\n};\n\nexport const calendarMinuteAtPoint = (clientY: number, top: number, height: number, startHour: number, endHour: number): number => {\n const totalMinutes = Math.max(60, (endHour - startHour + 1) * 60);\n const ratio = height > 0 ? Math.min(1, Math.max(0, (clientY - top) / height)) : 0;\n return snapCalendarMinutes(startHour * 60 + ratio * totalMinutes);\n};\n\nexport const calendarAutoScrollSpeed = (clientY: number, top: number, bottom: number, edge = 56, maximum = 18): number => {\n if (clientY < top + edge) return -Math.ceil(maximum * Math.min(1, (top + edge - clientY) / edge));\n if (clientY > bottom - edge) return Math.ceil(maximum * Math.min(1, (clientY - (bottom - edge)) / edge));\n return 0;\n};\n\ntype CalendarPointerSessionOptions<T> = {\n event: PointerEvent;\n resolve: (clientX: number, clientY: number) => T | null;\n onActivate?: () => void;\n onPreview: (value: T) => void;\n onCommit: (value: T) => void;\n onCancel?: () => void;\n scrollContainer?: HTMLElement;\n threshold?: number;\n};\n\nlet cancelActiveSession: (() => void) | null = null;\n\n/**\n * Owns one pointer gesture from threshold crossing through commit or cancel.\n * Views provide geometry through `resolve`; this helper owns global cleanup,\n * pointer cancellation, Escape handling, and edge auto-scroll.\n */\nexport const startCalendarPointerSession = <T>(options: CalendarPointerSessionOptions<T>): (() => void) => {\n if (options.event.button !== 0 || !options.event.isPrimary) return () => {};\n\n cancelActiveSession?.();\n\n const pointerId = options.event.pointerId;\n const target = options.event.currentTarget instanceof HTMLElement ? options.event.currentTarget : null;\n const startX = options.event.clientX;\n const startY = options.event.clientY;\n // Leave enough room for normal click jitter before an event becomes a drag.\n const threshold = options.threshold ?? 6;\n const previousUserSelect = document.body.style.userSelect;\n let clientX = startX;\n let clientY = startY;\n let active = false;\n let finished = false;\n let latest: T | null = null;\n let scrollFrame = 0;\n\n const preview = () => {\n const value = options.resolve(clientX, clientY);\n if (value === null) return;\n latest = value;\n options.onPreview(value);\n };\n\n const autoScroll = () => {\n scrollFrame = 0;\n if (!active || !options.scrollContainer) return;\n const rect = options.scrollContainer.getBoundingClientRect();\n const speed = calendarAutoScrollSpeed(clientY, rect.top, rect.bottom);\n if (speed !== 0) {\n const before = options.scrollContainer.scrollTop;\n options.scrollContainer.scrollTop += speed;\n if (options.scrollContainer.scrollTop !== before) preview();\n }\n scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n const cleanup = () => {\n if (scrollFrame) cancelAnimationFrame(scrollFrame);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", cancel);\n window.removeEventListener(\"blur\", cancel);\n window.removeEventListener(\"keydown\", onKeyDown);\n if (target?.hasPointerCapture?.(pointerId)) target.releasePointerCapture(pointerId);\n document.body.style.userSelect = previousUserSelect;\n if (cancelActiveSession === cancel) cancelActiveSession = null;\n };\n\n const activate = () => {\n if (active) return;\n active = true;\n document.body.style.userSelect = \"none\";\n target?.setPointerCapture?.(pointerId);\n options.onActivate?.();\n preview();\n if (options.scrollContainer) scrollFrame = requestAnimationFrame(autoScroll);\n };\n\n function cancel() {\n if (finished) return;\n finished = true;\n cleanup();\n if (active) options.onCancel?.();\n }\n\n function onMove(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n clientX = event.clientX;\n clientY = event.clientY;\n if (!active && Math.hypot(clientX - startX, clientY - startY) >= threshold) activate();\n if (!active) return;\n event.preventDefault();\n preview();\n }\n\n function onUp(event: PointerEvent) {\n if (finished || event.pointerId !== pointerId) return;\n finished = true;\n cleanup();\n if (active && latest !== null) options.onCommit(latest);\n else if (active) options.onCancel?.();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n cancel();\n }\n\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", cancel);\n window.addEventListener(\"blur\", cancel);\n window.addEventListener(\"keydown\", onKeyDown);\n cancelActiveSession = cancel;\n return cancel;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const DEFAULT_MAP_VIEWPORT = {
|
|
2
|
+
latitude: 0,
|
|
3
|
+
longitude: 0,
|
|
4
|
+
zoom: 0
|
|
5
|
+
};
|
|
6
|
+
const MIN_ZOOM = 0;
|
|
7
|
+
const MAX_ZOOM = 5;
|
|
8
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
9
|
+
export const normalizeMapViewport = viewport => {
|
|
10
|
+
const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);
|
|
11
|
+
const scale = 2 ** zoom;
|
|
12
|
+
const latitudeLimit = 90 - 90 / scale;
|
|
13
|
+
const longitudeLimit = 180 - 180 / scale;
|
|
14
|
+
return {
|
|
15
|
+
latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),
|
|
16
|
+
longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),
|
|
17
|
+
zoom
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export const zoomMapViewport = (viewport, delta) => normalizeMapViewport({
|
|
21
|
+
...viewport,
|
|
22
|
+
zoom: viewport.zoom + delta
|
|
23
|
+
});
|
|
24
|
+
export const panMapViewport = (viewport, deltaX, deltaY, width, height) => {
|
|
25
|
+
if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);
|
|
26
|
+
const scale = 2 ** viewport.zoom;
|
|
27
|
+
return normalizeMapViewport({
|
|
28
|
+
latitude: viewport.latitude + deltaY / height * (180 / scale),
|
|
29
|
+
longitude: viewport.longitude - deltaX / width * (360 / scale),
|
|
30
|
+
zoom: viewport.zoom
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chart-map-viewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_MAP_VIEWPORT","latitude","longitude","zoom","MIN_ZOOM","MAX_ZOOM","clamp","value","min","max","Math","normalizeMapViewport","viewport","Number","isFinite","scale","latitudeLimit","longitudeLimit","zoomMapViewport","delta","panMapViewport","deltaX","deltaY","width","height"],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (viewport: MapViewport, delta: number): MapViewport =>\n normalizeMapViewport({\n ...viewport,\n zoom: viewport.zoom + delta,\n });\n\nexport const panMapViewport = (viewport: MapViewport, deltaX: number, deltaY: number, width: number, height: number): MapViewport => {\n if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);\n\n const scale = 2 ** viewport.zoom;\n return normalizeMapViewport({\n latitude: viewport.latitude + (deltaY / height) * (180 / scale),\n longitude: viewport.longitude - (deltaX / width) * (360 / scale),\n zoom: viewport.zoom,\n });\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAiC,GAAG;EAC/CC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,CAAC;EACZC,IAAI,EAAE;AACR,CAAC;AAED,MAAMC,QAAQ,GAAG,CAAC;AAClB,MAAMC,QAAQ,GAAG,CAAC;AAElB,MAAMC,KAAK,GAAGA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,KAAaC,IAAI,CAACF,GAAG,CAACC,GAAG,EAAEC,IAAI,CAACD,GAAG,CAACD,GAAG,EAAED,KAAK,CAAC,CAAC;AAEtG,OAAO,MAAMI,oBAAoB,GAAIC,QAAiC,IAAkB;EACtF,MAAMT,IAAI,GAAGG,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACT,IAAI,CAAC,GAAGS,QAAQ,CAACT,IAAI,GAAGC,QAAQ,EAAEA,QAAQ,EAAEC,QAAQ,CAAC;EAC7G,MAAMU,KAAK,GAAG,CAAC,IAAIZ,IAAI;EACvB,MAAMa,aAAa,GAAG,EAAE,GAAG,EAAE,GAAGD,KAAK;EACrC,MAAME,cAAc,GAAG,GAAG,GAAG,GAAG,GAAGF,KAAK;EAExC,OAAO;IACLd,QAAQ,EAAEK,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACX,QAAQ,CAAC,GAAGW,QAAQ,CAACX,QAAQ,GAAG,CAAC,EAAE,CAACe,aAAa,EAAEA,aAAa,CAAC;IACtHd,SAAS,EAAEI,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACV,SAAS,CAAC,GAAGU,QAAQ,CAACV,SAAS,GAAG,CAAC,EAAE,CAACe,cAAc,EAAEA,cAAc,CAAC;IAC3Hd;EACF,CAAC;AACH,CAAC;AAED,OAAO,MAAMe,eAAe,GAAGA,CAACN,QAAqB,EAAEO,KAAa,KAClER,oBAAoB,CAAC;EACnB,GAAGC,QAAQ;EACXT,IAAI,EAAES,QAAQ,CAACT,IAAI,GAAGgB;AACxB,CAAC,CAAC;AAEJ,OAAO,MAAMC,cAAc,GAAGA,CAACR,QAAqB,EAAES,MAAc,EAAEC,MAAc,EAAEC,KAAa,EAAEC,MAAc,KAAkB;EACnI,IAAID,KAAK,IAAI,CAAC,IAAIC,MAAM,IAAI,CAAC,EAAE,OAAOb,oBAAoB,CAACC,QAAQ,CAAC;EAEpE,MAAMG,KAAK,GAAG,CAAC,IAAIH,QAAQ,CAACT,IAAI;EAChC,OAAOQ,oBAAoB,CAAC;IAC1BV,QAAQ,EAAEW,QAAQ,CAACX,QAAQ,GAAIqB,MAAM,GAAGE,MAAM,IAAK,GAAG,GAAGT,KAAK,CAAC;IAC/Db,SAAS,EAAEU,QAAQ,CAACV,SAAS,GAAImB,MAAM,GAAGE,KAAK,IAAK,GAAG,GAAGR,KAAK,CAAC;IAChEZ,IAAI,EAAES,QAAQ,CAACT;EACjB,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
|