@k2b/ui 0.20.0 → 0.22.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/dist/browser/actions/Button.js +20 -31
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/ContextMenu.js +10 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +10 -8
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +3 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +4 -0
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -1
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/filter-messages.js +20 -0
- package/dist/browser/actions/filter-messages.js.map +1 -0
- package/dist/browser/actions/spotlight-messages.js +16 -0
- package/dist/browser/actions/spotlight-messages.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +47 -41
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +25 -23
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatRoot.js +3 -3
- package/dist/browser/chat/ChatRoot.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +12 -12
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +236 -0
- package/dist/browser/chat/chat-messages.js.map +1 -0
- package/dist/browser/content/Calendar.js +1960 -575
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +20 -12
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +9 -7
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +4 -2
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +3 -3
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +68 -59
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js +3 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +30 -26
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +9 -7
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +37 -28
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +9 -7
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js +3 -3
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MessageRow.js +24 -22
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/Pagination.js +7 -7
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +15 -13
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js +3 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js +3 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +13 -11
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/VideoPlayer.js +5 -5
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +6 -4
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +10 -7
- package/dist/browser/content/ZoomPanViewport.js.map +1 -1
- package/dist/browser/content/calendar-messages.js +121 -0
- package/dist/browser/content/calendar-messages.js.map +1 -0
- package/dist/browser/content/calendar-month-layout.js +108 -0
- package/dist/browser/content/calendar-month-layout.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +4 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-messages.js +136 -0
- package/dist/browser/content/chart-messages.js.map +1 -0
- package/dist/browser/content/collection-selection.js +2 -0
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +24 -0
- package/dist/browser/content/data-table-messages.js.map +1 -0
- package/dist/browser/content/docs-messages.js +24 -0
- package/dist/browser/content/docs-messages.js.map +1 -0
- package/dist/browser/content/feed-messages.js +34 -0
- package/dist/browser/content/feed-messages.js.map +1 -0
- package/dist/browser/content/file-browser-messages.js +69 -0
- package/dist/browser/content/file-browser-messages.js.map +1 -0
- package/dist/browser/content/file-view-messages.js +64 -0
- package/dist/browser/content/file-view-messages.js.map +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +46 -10
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/FileDropTarget.js +6 -6
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +30 -21
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/MultiSelectInput.js +7 -5
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +4 -2
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/QrScanner.js +5 -5
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/inputs/Select.js +7 -5
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -3
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/SignatureInput.js +9 -3
- package/dist/browser/inputs/SignatureInput.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js +4 -2
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/TagEditor.js +8 -6
- package/dist/browser/inputs/TagEditor.js.map +1 -1
- package/dist/browser/inputs/TagsInput.js +5 -5
- package/dist/browser/inputs/TagsInput.js.map +1 -1
- package/dist/browser/inputs/TemplateEditor.js +5 -5
- package/dist/browser/inputs/TemplateEditor.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +3 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/completion-messages.js +24 -0
- package/dist/browser/inputs/completion-messages.js.map +1 -0
- package/dist/browser/inputs/date-picker.js +24 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/inputs/file-drop-messages.js +63 -0
- package/dist/browser/inputs/file-drop-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/inputs/file-input-messages.js +60 -0
- package/dist/browser/inputs/file-input-messages.js.map +1 -0
- package/dist/browser/inputs/icon-messages.js +22 -0
- package/dist/browser/inputs/icon-messages.js.map +1 -0
- package/dist/browser/inputs/input-messages.js +38 -0
- package/dist/browser/inputs/input-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/Toolbar.js +13 -13
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/browser/inputs/markdown/editor-messages.js +43 -0
- package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/browser/inputs/qr-messages.js +26 -0
- package/dist/browser/inputs/qr-messages.js.map +1 -0
- package/dist/browser/inputs/select-messages.js +63 -0
- package/dist/browser/inputs/select-messages.js.map +1 -0
- package/dist/browser/inputs/tag-messages.js +44 -0
- package/dist/browser/inputs/tag-messages.js.map +1 -0
- package/dist/browser/inputs/template-messages.js +22 -0
- package/dist/browser/inputs/template-messages.js.map +1 -0
- package/dist/browser/internal/render-error-messages.js +20 -0
- package/dist/browser/internal/render-error-messages.js.map +1 -0
- package/dist/browser/internal/render-error.js +3 -1
- package/dist/browser/internal/render-error.js.map +1 -1
- package/dist/browser/internal/text-selection.js +101 -0
- package/dist/browser/internal/text-selection.js.map +1 -0
- package/dist/browser/intl/messages.js +12 -1155
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +561 -418
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +6 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/Discussion.js +8 -5
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +8 -5
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js +7 -6
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +370 -0
- package/dist/browser/layout/PageTitle.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +8 -6
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Panes.js +23 -15
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +13 -4
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/Settings.js +14 -12
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js +6 -5
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +3 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +743 -12
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js +3 -2
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-messages.js +28 -0
- package/dist/browser/layout/floating-window-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/page-title-controller.js +169 -0
- package/dist/browser/layout/page-title-controller.js.map +1 -0
- package/dist/browser/layout/panel-dialog-messages.js +20 -0
- package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
- package/dist/browser/layout/panes-messages.js +48 -0
- package/dist/browser/layout/panes-messages.js.map +1 -0
- package/dist/browser/layout/refresh-messages.js +20 -0
- package/dist/browser/layout/refresh-messages.js.map +1 -0
- package/dist/browser/layout/settings-messages.js +54 -0
- package/dist/browser/layout/settings-messages.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +56 -0
- package/dist/browser/layout/workspace-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +5 -5
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +4 -2
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/Tag.js +3 -3
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +26 -0
- package/dist/browser/surfaces/avatar-messages.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +26 -0
- package/dist/browser/surfaces/resource-messages.js.map +1 -0
- package/dist/browser/widgets/Widget.js +6 -0
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/Button.js +21 -32
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +7 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +9 -7
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +3 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +4 -0
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -1
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/filter-messages.js +20 -0
- package/dist/ssr/actions/filter-messages.js.map +1 -0
- package/dist/ssr/actions/spotlight-messages.js +16 -0
- package/dist/ssr/actions/spotlight-messages.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +47 -41
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +23 -21
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatRoot.js +3 -3
- package/dist/ssr/chat/ChatRoot.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +11 -11
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +236 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -0
- package/dist/ssr/content/Calendar.js +1232 -115
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +10 -8
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +9 -7
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +4 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +3 -3
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +10 -4
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +3 -1
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +30 -26
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +9 -7
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +37 -28
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -6
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js +3 -3
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +24 -22
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/Pagination.js +6 -6
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +15 -13
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js +3 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js +3 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +13 -11
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/VideoPlayer.js +5 -5
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +6 -4
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +7 -4
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
- package/dist/ssr/content/calendar-messages.js +121 -0
- package/dist/ssr/content/calendar-messages.js.map +1 -0
- package/dist/ssr/content/calendar-month-layout.js +108 -0
- package/dist/ssr/content/calendar-month-layout.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +4 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-messages.js +136 -0
- package/dist/ssr/content/chart-messages.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +2 -0
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +24 -0
- package/dist/ssr/content/data-table-messages.js.map +1 -0
- package/dist/ssr/content/docs-messages.js +24 -0
- package/dist/ssr/content/docs-messages.js.map +1 -0
- package/dist/ssr/content/feed-messages.js +34 -0
- package/dist/ssr/content/feed-messages.js.map +1 -0
- package/dist/ssr/content/file-browser-messages.js +69 -0
- package/dist/ssr/content/file-browser-messages.js.map +1 -0
- package/dist/ssr/content/file-view-messages.js +64 -0
- package/dist/ssr/content/file-view-messages.js.map +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/lightbox-messages.js +36 -0
- package/dist/ssr/content/lightbox-messages.js.map +1 -0
- package/dist/ssr/content/log-entries-messages.js +20 -0
- package/dist/ssr/content/log-entries-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-block-messages.js +24 -0
- package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-blocks.js +3 -3
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/content/markdown-links.js +2 -2
- package/dist/ssr/content/markdown-links.js.map +1 -1
- package/dist/ssr/content/markdown-reference-messages.js +30 -0
- package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
- package/dist/ssr/content/pagination-messages.js +38 -0
- package/dist/ssr/content/pagination-messages.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +43 -0
- package/dist/ssr/content/pdf-messages.js.map +1 -0
- package/dist/ssr/content/range-picker-messages.js +20 -0
- package/dist/ssr/content/range-picker-messages.js.map +1 -0
- package/dist/ssr/content/structured-data-messages.js +22 -0
- package/dist/ssr/content/structured-data-messages.js.map +1 -0
- package/dist/ssr/content/timeline-messages.js +62 -0
- package/dist/ssr/content/timeline-messages.js.map +1 -0
- package/dist/ssr/content/video-messages.js +24 -0
- package/dist/ssr/content/video-messages.js.map +1 -0
- package/dist/ssr/content/viewport-messages.js +28 -0
- package/dist/ssr/content/viewport-messages.js.map +1 -0
- package/dist/ssr/feedback/HoverPreview.js +34 -6
- package/dist/ssr/feedback/HoverPreview.js.map +1 -1
- package/dist/ssr/feedback/InstallGuide.js +18 -18
- package/dist/ssr/feedback/InstallGuide.js.map +1 -1
- package/dist/ssr/feedback/install-messages.js +104 -0
- package/dist/ssr/feedback/install-messages.js.map +1 -0
- package/dist/ssr/feedback/prompt-messages.js +65 -0
- package/dist/ssr/feedback/prompt-messages.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +14 -11
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast-messages.js +18 -0
- package/dist/ssr/feedback/toast-messages.js.map +1 -0
- package/dist/ssr/feedback/toast.js +4 -3
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +4 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +5 -5
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +3 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +34 -4
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/FileDropTarget.js +6 -6
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +29 -20
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/MultiSelectInput.js +7 -5
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +4 -2
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/QrScanner.js +4 -4
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/inputs/Select.js +7 -5
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/SignatureInput.js +9 -3
- package/dist/ssr/inputs/SignatureInput.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +4 -2
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/TagEditor.js +8 -6
- package/dist/ssr/inputs/TagEditor.js.map +1 -1
- package/dist/ssr/inputs/TagsInput.js +5 -5
- package/dist/ssr/inputs/TagsInput.js.map +1 -1
- package/dist/ssr/inputs/TemplateEditor.js +5 -5
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +3 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/completion-messages.js +24 -0
- package/dist/ssr/inputs/completion-messages.js.map +1 -0
- package/dist/ssr/inputs/date-picker.js +24 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/inputs/file-drop-messages.js +63 -0
- package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/inputs/file-input-messages.js +60 -0
- package/dist/ssr/inputs/file-input-messages.js.map +1 -0
- package/dist/ssr/inputs/icon-messages.js +22 -0
- package/dist/ssr/inputs/icon-messages.js.map +1 -0
- package/dist/ssr/inputs/input-messages.js +38 -0
- package/dist/ssr/inputs/input-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
- package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/ssr/inputs/qr-messages.js +26 -0
- package/dist/ssr/inputs/qr-messages.js.map +1 -0
- package/dist/ssr/inputs/select-messages.js +63 -0
- package/dist/ssr/inputs/select-messages.js.map +1 -0
- package/dist/ssr/inputs/tag-messages.js +44 -0
- package/dist/ssr/inputs/tag-messages.js.map +1 -0
- package/dist/ssr/inputs/template-messages.js +22 -0
- package/dist/ssr/inputs/template-messages.js.map +1 -0
- package/dist/ssr/internal/render-error-messages.js +20 -0
- package/dist/ssr/internal/render-error-messages.js.map +1 -0
- package/dist/ssr/internal/render-error.js +3 -1
- package/dist/ssr/internal/render-error.js.map +1 -1
- package/dist/ssr/internal/text-selection.js +101 -0
- package/dist/ssr/internal/text-selection.js.map +1 -0
- package/dist/ssr/intl/messages.js +12 -1155
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +203 -96
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +1 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +8 -5
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +8 -5
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +6 -5
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +253 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +8 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Panes.js +22 -14
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +13 -4
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/Settings.js +14 -12
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +6 -5
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +3 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +743 -12
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js +3 -2
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-messages.js +28 -0
- package/dist/ssr/layout/floating-window-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/page-title-controller.js +169 -0
- package/dist/ssr/layout/page-title-controller.js.map +1 -0
- package/dist/ssr/layout/panel-dialog-messages.js +20 -0
- package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
- package/dist/ssr/layout/panes-messages.js +48 -0
- package/dist/ssr/layout/panes-messages.js.map +1 -0
- package/dist/ssr/layout/refresh-messages.js +20 -0
- package/dist/ssr/layout/refresh-messages.js.map +1 -0
- package/dist/ssr/layout/settings-messages.js +54 -0
- package/dist/ssr/layout/settings-messages.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +56 -0
- package/dist/ssr/layout/workspace-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +5 -5
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +4 -2
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js +3 -3
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +26 -0
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +26 -0
- package/dist/ssr/surfaces/resource-messages.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +6 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/GestureMenu.d.ts +2 -0
- package/dist/types/actions/filter-messages.d.ts +8 -0
- package/dist/types/actions/spotlight-messages.d.ts +8 -0
- package/dist/types/chat/chat-messages.d.ts +116 -0
- package/dist/types/content/Calendar.d.ts +32 -0
- package/dist/types/content/DataTable.d.ts +2 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-messages.d.ts +60 -0
- package/dist/types/content/calendar-month-layout.d.ts +52 -0
- package/dist/types/content/chart-messages.d.ts +32 -0
- package/dist/types/content/data-table-messages.d.ts +10 -0
- package/dist/types/content/docs-messages.d.ts +10 -0
- package/dist/types/content/feed-messages.d.ts +15 -0
- package/dist/types/content/file-browser-messages.d.ts +33 -0
- package/dist/types/content/file-view-messages.d.ts +30 -0
- package/dist/types/content/index.d.ts +1 -1
- package/dist/types/content/lightbox-messages.d.ts +16 -0
- package/dist/types/content/log-entries-messages.d.ts +8 -0
- package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
- package/dist/types/content/markdown-reference-messages.d.ts +15 -0
- package/dist/types/content/pagination-messages.d.ts +17 -0
- package/dist/types/content/pdf-messages.d.ts +20 -0
- package/dist/types/content/range-picker-messages.d.ts +8 -0
- package/dist/types/content/structured-data-messages.d.ts +9 -0
- package/dist/types/content/timeline-messages.d.ts +29 -0
- package/dist/types/content/video-messages.d.ts +10 -0
- package/dist/types/content/viewport-messages.d.ts +12 -0
- package/dist/types/feedback/install-messages.d.ts +50 -0
- package/dist/types/feedback/prompt-messages.d.ts +31 -0
- package/dist/types/feedback/toast-messages.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/inputs/completion-messages.d.ts +10 -0
- package/dist/types/inputs/date-picker.d.ts +7 -0
- package/dist/types/inputs/file-drop-messages.d.ts +30 -0
- package/dist/types/inputs/file-drop.d.ts +3 -3
- package/dist/types/inputs/file-input-messages.d.ts +28 -0
- package/dist/types/inputs/icon-messages.d.ts +9 -0
- package/dist/types/inputs/input-messages.d.ts +17 -0
- package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
- package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
- package/dist/types/inputs/qr-messages.d.ts +11 -0
- package/dist/types/inputs/select-messages.d.ts +30 -0
- package/dist/types/inputs/tag-messages.d.ts +20 -0
- package/dist/types/inputs/template-messages.d.ts +9 -0
- package/dist/types/internal/render-error-messages.d.ts +8 -0
- package/dist/types/internal/text-selection.d.ts +18 -0
- package/dist/types/intl/messages.d.ts +6 -544
- package/dist/types/layout/AppWorkspace.d.ts +19 -4
- package/dist/types/layout/PageTitle.d.ts +64 -0
- package/dist/types/layout/app-workspace-controller.d.ts +4 -0
- package/dist/types/layout/app-workspace-state.d.ts +3 -2
- package/dist/types/layout/floating-window-messages.d.ts +12 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +7 -0
- package/dist/types/layout/page-title-controller.d.ts +13 -0
- package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
- package/dist/types/layout/panes-messages.d.ts +22 -0
- package/dist/types/layout/refresh-messages.d.ts +8 -0
- package/dist/types/layout/settings-messages.d.ts +25 -0
- package/dist/types/layout/workspace-messages.d.ts +26 -0
- package/dist/types/surfaces/avatar-messages.d.ts +11 -0
- package/dist/types/surfaces/resource-messages.d.ts +11 -0
- package/dist/types/widgets/Widget.d.ts +5 -1
- package/package.json +1 -1
|
@@ -4,61 +4,85 @@ import { ssrElement as _$ssrElement } from "solid-js/web";
|
|
|
4
4
|
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
5
5
|
import { ssrStyle as _$ssrStyle } from "solid-js/web";
|
|
6
6
|
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
7
|
-
import { escape as _$escape } from "solid-js/web";
|
|
8
7
|
import { createComponent as _$createComponent } from "solid-js/web";
|
|
9
8
|
import { ssr as _$ssr } from "solid-js/web";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
_tmpl$
|
|
13
|
-
_tmpl$
|
|
14
|
-
_tmpl$
|
|
15
|
-
_tmpl$
|
|
16
|
-
_tmpl$
|
|
17
|
-
_tmpl$
|
|
18
|
-
_tmpl$
|
|
19
|
-
_tmpl$
|
|
20
|
-
_tmpl$
|
|
21
|
-
_tmpl$
|
|
22
|
-
_tmpl$
|
|
23
|
-
_tmpl$
|
|
24
|
-
_tmpl$
|
|
25
|
-
_tmpl$
|
|
26
|
-
_tmpl$
|
|
27
|
-
_tmpl$
|
|
28
|
-
_tmpl$
|
|
29
|
-
_tmpl$
|
|
30
|
-
_tmpl$
|
|
31
|
-
_tmpl$
|
|
32
|
-
_tmpl$
|
|
33
|
-
_tmpl$
|
|
34
|
-
_tmpl$
|
|
35
|
-
_tmpl$
|
|
36
|
-
_tmpl$
|
|
37
|
-
_tmpl$
|
|
38
|
-
_tmpl$
|
|
39
|
-
_tmpl$
|
|
40
|
-
_tmpl$
|
|
41
|
-
_tmpl$
|
|
42
|
-
_tmpl$
|
|
43
|
-
_tmpl$
|
|
44
|
-
_tmpl$
|
|
45
|
-
_tmpl$
|
|
46
|
-
_tmpl$
|
|
47
|
-
_tmpl$
|
|
48
|
-
_tmpl$
|
|
49
|
-
_tmpl$
|
|
50
|
-
_tmpl$
|
|
51
|
-
_tmpl$
|
|
52
|
-
_tmpl$
|
|
53
|
-
_tmpl$
|
|
9
|
+
import { escape as _$escape } from "solid-js/web";
|
|
10
|
+
var _tmpl$ = ["<span class=\"k2b-calendar-event__time\">", "</span>"],
|
|
11
|
+
_tmpl$2 = "<span class=\"k2b-calendar-event__marker\" aria-hidden=\"true\"></span>",
|
|
12
|
+
_tmpl$3 = ["<span class=\"k2b-calendar-event__title\">", "", "</span>"],
|
|
13
|
+
_tmpl$4 = ["<span class=\"k2b-calendar-event__meta\">", "</span>"],
|
|
14
|
+
_tmpl$5 = ["<span class=\"k2b-calendar-event__description\">", "</span>"],
|
|
15
|
+
_tmpl$6 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"start\" aria-hidden=\"true\">", "</span>"],
|
|
16
|
+
_tmpl$7 = ["<span class=\"k2b-calendar-event__hint\" data-edge=\"end\" aria-hidden=\"true\">", "</span>"],
|
|
17
|
+
_tmpl$8 = ["<a", " class=\"k2b-calendar-event\" data-calendar-event", " style=\"", "\"", ">", "</a>"],
|
|
18
|
+
_tmpl$9 = ["<button type=\"button\" class=\"k2b-calendar-event\" data-calendar-event", " data-interactive=\"true\"", " style=\"", "\"", ">", "</button>"],
|
|
19
|
+
_tmpl$0 = ["<div class=\"k2b-calendar-event\" role=\"group\" data-calendar-event", " style=\"", "\"", ">", "</div>"],
|
|
20
|
+
_tmpl$1 = ["<div role=\"radiogroup\"", " aria-orientation=\"horizontal\" class=\"k2b-segmented-control k2b-calendar-view-switcher\">", "</div>"],
|
|
21
|
+
_tmpl$10 = ["<i class=\"", "\"></i>"],
|
|
22
|
+
_tmpl$11 = ["<button type=\"button\"", " class=\"k2b-calendar-header__nav-button\"><i class=\"", "\"></i></button>"],
|
|
23
|
+
_tmpl$12 = ["<span class=\"k2b-button__label\">", "</span>"],
|
|
24
|
+
_tmpl$13 = ["<div class=\"k2b-calendar-header__content\">", "</div>"],
|
|
25
|
+
_tmpl$14 = "<span class=\"k2b-calendar-header__progress\" aria-hidden=\"true\"></span>",
|
|
26
|
+
_tmpl$15 = ["<header class=\"k2b-calendar-header\"><div class=\"k2b-calendar-header__navigation\">", "", "<div class=\"k2b-calendar-header__title\"><span>", "</span>", "</div></div>", "<div class=\"k2b-calendar-header__actions\">", "", "", "</div>", "</header>"],
|
|
27
|
+
_tmpl$16 = ["<span class=\"k2b-calendar-header__title-size\" aria-hidden=\"true\">", "</span>"],
|
|
28
|
+
_tmpl$17 = ["<div class=\"k2b-calendar-month__weekday\">", "</div>"],
|
|
29
|
+
_tmpl$18 = ["<div class=\"k2b-calendar-month\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\"", ">", "", "</div>", "</div>"],
|
|
30
|
+
_tmpl$19 = ["<div class=\"k2b-calendar-month__week-number\">", "</div>"],
|
|
31
|
+
_tmpl$20 = ["<div class=\"k2b-calendar-month__week\"", ">", "", "</div>"],
|
|
32
|
+
_tmpl$21 = ["<div class=\"k2b-calendar-preview\">", "</div>"],
|
|
33
|
+
_tmpl$22 = ["<div class=\"k2b-calendar-month__day\"", ">", "<div class=\"k2b-calendar-month__day-header\">", "", "</div><div class=\"k2b-calendar-month__events\">", "", "", "</div><div class=\"k2b-calendar-month__dots\">", "</div></div>"],
|
|
34
|
+
_tmpl$23 = ["<span class=\"k2b-calendar-month__day-number\"", ">", "</span>"],
|
|
35
|
+
_tmpl$24 = ["<span class=\"k2b-calendar-month__badge\">", "", "</span>"],
|
|
36
|
+
_tmpl$25 = ["<span class=\"k2b-calendar-dot\"", " style=\"", "\"></span>"],
|
|
37
|
+
_tmpl$26 = ["<div class=\"k2b-calendar-month__weekday\" role=\"columnheader\">", "</div>"],
|
|
38
|
+
_tmpl$27 = ["<div class=\"k2b-calendar-month\" role=\"grid\"", " aria-multiselectable=\"true\" data-lanes=\"true\" style=\"", "\"><div class=\"k2b-calendar-month__weekdays\" role=\"row\"", ">", "", "</div>", "</div>"],
|
|
39
|
+
_tmpl$28 = ["<div class=\"k2b-calendar-month__weekday\" role=\"columnheader\"", ">", "</div>"],
|
|
40
|
+
_tmpl$29 = ["<div class=\"k2b-calendar-month__week-number\" role=\"rowheader\">", "</div>"],
|
|
41
|
+
_tmpl$30 = ["<div class=\"k2b-calendar-month__week\" role=\"row\"", ">", "", "</div>"],
|
|
42
|
+
_tmpl$31 = ["<button type=\"button\" class=\"k2b-calendar-month__week-link\" tabindex=\"-1\"", ">", "</button>"],
|
|
43
|
+
_tmpl$32 = ["<button type=\"button\" class=\"k2b-calendar-month__more\" tabindex=\"-1\" style=\"", "\"", " aria-haspopup=\"dialog\"", "><span class=\"k2b-calendar-month__more-long\">", "</span><span class=\"k2b-calendar-month__more-short\">+", "</span></button>"],
|
|
44
|
+
_tmpl$33 = ["<div class=\"k2b-calendar-month__day\" role=\"gridcell\"", "><div class=\"k2b-calendar-month__day-header\"><span class=\"k2b-calendar-month__day-number\"", ">", "</span>", "</div><div class=\"k2b-calendar-month__lanes\">", "", "", "</div></div>"],
|
|
45
|
+
_tmpl$34 = ["<div class=\"k2b-calendar-month__segment\" style=\"", "\">", "</div>"],
|
|
46
|
+
_tmpl$35 = ["<ul class=\"k2b-calendar-day-list__events\">", "</ul>"],
|
|
47
|
+
_tmpl$36 = "<i class=\"ti ti-plus\" aria-hidden=\"true\"></i>",
|
|
48
|
+
_tmpl$37 = ["<div class=\"k2b-calendar-day-list\"><div class=\"k2b-calendar-day-list__title\">", "</div>", "<div class=\"k2b-calendar-day-list__actions\">", "", "</div></div>"],
|
|
49
|
+
_tmpl$38 = ["<p class=\"k2b-calendar-day-list__empty\">", "</p>"],
|
|
50
|
+
_tmpl$39 = ["<li>", "</li>"],
|
|
51
|
+
_tmpl$40 = "<i class=\"ti ti-zoom-in\" aria-hidden=\"true\"></i>",
|
|
52
|
+
_tmpl$41 = ["<div class=\"k2b-calendar-popover\" popover=\"auto\" role=\"dialog\"", ">", "</div>"],
|
|
53
|
+
_tmpl$42 = ["<div class=\"k2b-calendar-time-grid__all-day\" style=\"", "\"><div class=\"k2b-calendar-time-grid__all-day-label\">", "</div>", "</div>"],
|
|
54
|
+
_tmpl$43 = ["<div class=\"k2b-calendar-time-grid\"><div class=\"k2b-calendar-time-grid__days\" style=\"", "\"><div></div>", "</div>", "<div class=\"k2b-calendar-time-grid__scroll\"><div class=\"k2b-calendar-time-grid__grid\" style=\"", "\"><div class=\"k2b-calendar-time-grid__gutter\" style=\"", "\">", "</div>", "</div></div></div>"],
|
|
55
|
+
_tmpl$44 = ["<span class=\"k2b-calendar-time-grid__day-label\"", ">", "</span>"],
|
|
56
|
+
_tmpl$45 = ["<span class=\"k2b-calendar-time-grid__badge\">", "", "</span>"],
|
|
57
|
+
_tmpl$46 = ["<div class=\"k2b-calendar-time-grid__all-day-events\">", "", "</div>"],
|
|
58
|
+
_tmpl$47 = ["<div class=\"k2b-calendar-time-grid__hour\"", ">", ":00</div>"],
|
|
59
|
+
_tmpl$48 = ["<div class=\"k2b-calendar-time-grid__now\" style=\"", "\"></div>"],
|
|
60
|
+
_tmpl$49 = ["<div class=\"k2b-calendar-time-grid__column\" style=\"", "\">", "", "", "", "", "</div>"],
|
|
61
|
+
_tmpl$50 = ["<div class=\"k2b-calendar-preview__title\">", "</div>"],
|
|
62
|
+
_tmpl$51 = ["<div class=\"k2b-calendar-preview k2b-calendar-preview--timed\"", " style=\"", "\"><div class=\"k2b-calendar-preview__content\">", "<div class=\"k2b-calendar-preview__label\">", " - ", "</div></div></div>"],
|
|
63
|
+
_tmpl$52 = ["<button type=\"button\"", " draggable=\"false\" class=\"k2b-calendar-time-grid__resize\"><span class=\"k2b-calendar-time-grid__resize-icon\" aria-hidden=\"true\"></span></button>"],
|
|
64
|
+
_tmpl$53 = ["<div class=\"k2b-calendar-time-grid__event-position\" style=\"", "\"><div class=\"k2b-calendar-time-grid__event-frame\">", "", "</div></div>"],
|
|
65
|
+
_tmpl$54 = ["<button type=\"button\" class=\"k2b-calendar-time-grid__overflow\" style=\"", "\"", "><span class=\"k2b-calendar-time-grid__overflow-count\">+", "</span></button>"],
|
|
66
|
+
_tmpl$55 = ["<div class=\"k2b-calendar-time-grid__overflow-menu\" style=\"", "\"><div class=\"k2b-calendar-time-grid__overflow-title\">", " - ", "</div>", "</div>"],
|
|
67
|
+
_tmpl$56 = ["<div class=\"k2b-calendar-year\">", "</div>"],
|
|
68
|
+
_tmpl$57 = ["<div class=\"k2b-calendar-year__month\"><div class=\"k2b-calendar-year__title\">", "</div><div class=\"k2b-calendar-year__grid\">", "</div></div>"],
|
|
69
|
+
_tmpl$58 = ["<span class=\"k2b-calendar-year__indicator\"", " style=\"", "\"></span>"],
|
|
70
|
+
_tmpl$59 = ["<div class=\"k2b-calendar-mobile-month__events\">", "</div>"],
|
|
71
|
+
_tmpl$60 = ["<div class=\"k2b-calendar-mobile-month\">", "<div class=\"k2b-calendar-mobile-month__agenda\"><div class=\"k2b-calendar-mobile-month__title\">", "</div>", "</div></div>"],
|
|
72
|
+
_tmpl$61 = ["<div class=\"k2b-calendar-mobile-month__empty\">", "</div>"],
|
|
73
|
+
_tmpl$62 = ["<div class=\"k2b-calendar-body\">", "</div>"],
|
|
74
|
+
_tmpl$63 = ["<section class=\"", "\"", ">", "", "</section>"];
|
|
54
75
|
import { Link } from "@k2b/ssr/nav";
|
|
55
76
|
import { dates as calendar } from "@k2b/stdlib";
|
|
56
|
-
import { createMemo, createSignal, For, mergeProps, onCleanup, onMount, Show } from "solid-js";
|
|
77
|
+
import { createEffect, createMemo, createSignal, For, mergeProps, on, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
57
78
|
import { Button } from "../actions/Button";
|
|
79
|
+
import { GestureMenu } from "../actions/GestureMenu";
|
|
58
80
|
import SegmentedControl from "../actions/SegmentedControl";
|
|
59
81
|
import { useDateConfigLocale } from "../intl/locale";
|
|
60
82
|
import { useUiMessages } from "../intl/messages";
|
|
61
83
|
import { layoutCalendarIntervals } from "./calendar-event-layout";
|
|
84
|
+
import { useCalendarMessages } from "./calendar-messages";
|
|
85
|
+
import { fitMonthWeek, layoutMonthWeek, monthLaneCapacity } from "./calendar-month-layout";
|
|
62
86
|
import { calendarDayIndexAtPoint, calendarMinuteAtPoint, startCalendarPointerSession } from "./calendar-pointer";
|
|
63
87
|
|
|
64
88
|
/** A view the application adds to the switcher; the calendar shows its header and toolbar, the application the body. */
|
|
@@ -220,7 +244,7 @@ const timedEventLayouts = events => {
|
|
|
220
244
|
}));
|
|
221
245
|
};
|
|
222
246
|
const EventChip = props => {
|
|
223
|
-
const
|
|
247
|
+
const calendarMessages = useCalendarMessages();
|
|
224
248
|
const dateConfig = createMemo(() => ownerDateConfig(props.owner));
|
|
225
249
|
const color = () => props.event.color ?? "blue";
|
|
226
250
|
const selected = () => Boolean(props.owner.selectedEventId) && props.owner.selectedEventId === props.event.id;
|
|
@@ -235,7 +259,7 @@ const EventChip = props => {
|
|
|
235
259
|
const showDescription = () => Boolean(props.event.description?.trim() && props.fill && !props.event.allDay && !props.compact && durationHours() >= 1.5);
|
|
236
260
|
const timeLabel = () => `${formatTime(props.event.startDate, dateConfig())} - ${formatTime(props.event.endDate, dateConfig())}`;
|
|
237
261
|
const ariaLabel = () => {
|
|
238
|
-
const label = props.event.allDay ? props.event.title :
|
|
262
|
+
const label = props.label ? props.label : props.event.allDay ? props.event.title : calendarMessages().calendarEventTime({
|
|
239
263
|
title: props.event.title,
|
|
240
264
|
start: formatTime(props.event.startDate, dateConfig()),
|
|
241
265
|
end: formatTime(props.event.endDate, dateConfig())
|
|
@@ -249,38 +273,60 @@ const EventChip = props => {
|
|
|
249
273
|
end: props.event.endDate,
|
|
250
274
|
allDay: props.event.allDay ?? false,
|
|
251
275
|
durationHours: durationHours(),
|
|
252
|
-
timeLabel: timeLabel()
|
|
276
|
+
timeLabel: timeLabel(),
|
|
277
|
+
leadingTime: props.leadingTime
|
|
253
278
|
});
|
|
254
|
-
const defaultContent = [_$
|
|
279
|
+
const defaultContent = [_$createComponent(Show, {
|
|
280
|
+
get when() {
|
|
281
|
+
return props.leadingTime;
|
|
282
|
+
},
|
|
283
|
+
get children() {
|
|
284
|
+
return _$ssr(_tmpl$, _$escape(props.leadingTime));
|
|
285
|
+
}
|
|
286
|
+
}), _$ssr(_tmpl$3, _$escape(_$createComponent(Show, {
|
|
255
287
|
get when() {
|
|
256
288
|
return props.event.display === "marker";
|
|
257
289
|
},
|
|
258
290
|
get children() {
|
|
259
|
-
return _$ssr(_tmpl$);
|
|
291
|
+
return _$ssr(_tmpl$2);
|
|
260
292
|
}
|
|
261
293
|
})), _$escape(props.event.title)), _$createComponent(Show, {
|
|
262
294
|
get when() {
|
|
263
295
|
return showTime();
|
|
264
296
|
},
|
|
265
297
|
get children() {
|
|
266
|
-
return _$ssr(_tmpl$
|
|
298
|
+
return _$ssr(_tmpl$4, _$escape(timeLabel()));
|
|
267
299
|
}
|
|
268
300
|
}), _$createComponent(Show, {
|
|
269
301
|
get when() {
|
|
270
302
|
return showLocation();
|
|
271
303
|
},
|
|
272
304
|
get children() {
|
|
273
|
-
return _$ssr(_tmpl$
|
|
305
|
+
return _$ssr(_tmpl$4, _$escape(props.event.location));
|
|
274
306
|
}
|
|
275
307
|
}), _$createComponent(Show, {
|
|
276
308
|
get when() {
|
|
277
309
|
return showDescription();
|
|
278
310
|
},
|
|
279
311
|
get children() {
|
|
280
|
-
return _$ssr(_tmpl$
|
|
312
|
+
return _$ssr(_tmpl$5, _$escape(props.event.description));
|
|
313
|
+
}
|
|
314
|
+
})];
|
|
315
|
+
const content = () => [_$createComponent(Show, {
|
|
316
|
+
get when() {
|
|
317
|
+
return props.hintStart;
|
|
318
|
+
},
|
|
319
|
+
get children() {
|
|
320
|
+
return _$ssr(_tmpl$6, _$escape(props.hintStart));
|
|
321
|
+
}
|
|
322
|
+
}), renderedEvent() ?? defaultContent, _$createComponent(Show, {
|
|
323
|
+
get when() {
|
|
324
|
+
return props.hintEnd;
|
|
325
|
+
},
|
|
326
|
+
get children() {
|
|
327
|
+
return _$ssr(_tmpl$7, _$escape(props.hintEnd));
|
|
281
328
|
}
|
|
282
329
|
})];
|
|
283
|
-
const content = () => renderedEvent() ?? defaultContent;
|
|
284
330
|
const isActionable = () => isInteractive() || Boolean(props.onMovePointerDown);
|
|
285
331
|
let suppressClickUntil = 0;
|
|
286
332
|
const onClick = event => {
|
|
@@ -312,7 +358,7 @@ const EventChip = props => {
|
|
|
312
358
|
suppressClickUntil = performance.now() + 400;
|
|
313
359
|
});
|
|
314
360
|
};
|
|
315
|
-
return props.href ? _$ssr(_tmpl$
|
|
361
|
+
return props.href ? _$ssr(_tmpl$8, _$ssrAttribute("href", _$escape(props.href, true), false), _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", isInteractive() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false) + _$ssrAttribute("data-space-item-id", _$escape(props.event.dataSpaceItemId, true), false), _$ssrStyle(style()), _$ssrAttribute("draggable", props.onMovePointerDown ? _$escape(false, true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : isActionable() ? _$ssr(_tmpl$9, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content())) : _$ssr(_tmpl$0, _$ssrAttribute("data-color", props.event.colorHex ? _$escape(undefined, true) : _$escape(color(), true), false) + _$ssrAttribute("data-selected", selected() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-compact", props.compact ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-fill", props.fill ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-short", short() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-moving", props.moving ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-before", props.continuesBefore ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-continues-after", props.continuesAfter ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-bar", props.bar ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-interactive", _$escape(undefined, true), false) + _$ssrAttribute("data-display", _$escape(props.event.display, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-label", _$escape(ariaLabel(), true), false), _$escape(content()));
|
|
316
362
|
};
|
|
317
363
|
const slotInteractionProps = (owner, slot, suppressed, nativeControl = false) => {
|
|
318
364
|
const isSlotChild = event => {
|
|
@@ -377,7 +423,7 @@ const CalendarNavigationLink = props => {
|
|
|
377
423
|
}), _$escape(props.children), false);
|
|
378
424
|
};
|
|
379
425
|
const CalendarViewLinks = props => {
|
|
380
|
-
const
|
|
426
|
+
const calendarMessages = useCalendarMessages();
|
|
381
427
|
const refs = [];
|
|
382
428
|
const selectRelative = (currentIndex, direction) => {
|
|
383
429
|
if (props.options.length === 0) return;
|
|
@@ -395,13 +441,17 @@ const CalendarViewLinks = props => {
|
|
|
395
441
|
refs[event.key === "Home" ? 0 : props.options.length - 1]?.click();
|
|
396
442
|
}
|
|
397
443
|
};
|
|
398
|
-
return _$ssr(_tmpl$
|
|
444
|
+
return _$ssr(_tmpl$1, _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarView, true), false), _$escape(_$createComponent(For, {
|
|
399
445
|
get each() {
|
|
400
446
|
return props.options;
|
|
401
447
|
},
|
|
402
448
|
children: (option, index) => {
|
|
403
449
|
const active = () => (props.view === "mobile-month" ? "month" : props.view) === option.value;
|
|
404
|
-
const href = () =>
|
|
450
|
+
const href = () => {
|
|
451
|
+
const day = props.focusDay;
|
|
452
|
+
const atDay = day && !active() ? props.owner.getDateHref?.(day, option.value) : undefined;
|
|
453
|
+
return atDay ?? props.owner.getViewHref?.(option.value) ?? "#";
|
|
454
|
+
};
|
|
405
455
|
return _$createComponent(CalendarNavigationLink, {
|
|
406
456
|
get owner() {
|
|
407
457
|
return props.owner;
|
|
@@ -430,14 +480,30 @@ const CalendarViewLinks = props => {
|
|
|
430
480
|
})));
|
|
431
481
|
};
|
|
432
482
|
|
|
483
|
+
/**
|
|
484
|
+
* The same day some months later, or the last day of that month when it is shorter: a step from January 31 lands on
|
|
485
|
+
* February 28, never in March. stdlib's `addMonths` runs over into the next month.
|
|
486
|
+
*/
|
|
487
|
+
const addMonthsClamped = (date, months, dateConfig) => {
|
|
488
|
+
const moved = calendar.addMonths(date, months, dateConfig);
|
|
489
|
+
if (calendar.formatDateKey(moved, dateConfig).slice(8) === calendar.formatDateKey(date, dateConfig).slice(8)) return moved;
|
|
490
|
+
return calendar.addDays(calendar.startOfMonth(moved, dateConfig), -1, dateConfig);
|
|
491
|
+
};
|
|
492
|
+
|
|
433
493
|
/** Custom views page by day, like the day view. */
|
|
434
494
|
const adjacentCalendarDate = (date, view, direction, dateConfig) => {
|
|
435
|
-
if (view === "year") return
|
|
436
|
-
if (view === "month" || view === "mobile-month") return
|
|
495
|
+
if (view === "year") return addMonthsClamped(date, direction * 12, dateConfig);
|
|
496
|
+
if (view === "month" || view === "mobile-month") return addMonthsClamped(date, direction, dateConfig);
|
|
437
497
|
return calendar.addDays(date, direction * (view === "week" ? 7 : 1), dateConfig);
|
|
438
498
|
};
|
|
499
|
+
|
|
500
|
+
/** Opens a view at a day through the host's callbacks. Hosts may keep the view and the date apart, so both hear it. */
|
|
501
|
+
const openViewAt = (owner, date, view) => {
|
|
502
|
+
owner.onViewChange?.(view);
|
|
503
|
+
owner.onDateChange?.(date, view);
|
|
504
|
+
};
|
|
439
505
|
const CalendarHeader = props => {
|
|
440
|
-
const
|
|
506
|
+
const calendarMessages = useCalendarMessages();
|
|
441
507
|
const dateConfig = () => ownerDateConfig(props.owner);
|
|
442
508
|
const previous = () => adjacentCalendarDate(props.date, props.view, -1, dateConfig());
|
|
443
509
|
const next = () => adjacentCalendarDate(props.date, props.view, 1, dateConfig());
|
|
@@ -456,8 +522,51 @@ const CalendarHeader = props => {
|
|
|
456
522
|
if (props.view === "week") return `${formatDay(calendar.startOfWeek(props.date, dateConfig()), dateConfig())} - ${formatDay(calendar.addDays(calendar.startOfWeek(props.date, dateConfig()), 6, dateConfig()), dateConfig())}`;
|
|
457
523
|
return formatMonth(props.date, dateConfig());
|
|
458
524
|
};
|
|
525
|
+
/**
|
|
526
|
+
* The titles this view can show around the current date: the months of the year, the weeks of the month, or a day
|
|
527
|
+
* of each weekday in every month. Their widest one sets the title's width.
|
|
528
|
+
*/
|
|
529
|
+
const titleWidths = createMemo(() => {
|
|
530
|
+
const context = dateConfig();
|
|
531
|
+
if (props.view === "year") return [];
|
|
532
|
+
const {
|
|
533
|
+
year
|
|
534
|
+
} = zonedYearMonth(props.date, context);
|
|
535
|
+
if (props.view === "month" || props.view === "mobile-month") return Array.from({
|
|
536
|
+
length: 12
|
|
537
|
+
}, (_, month) => formatMonth(zonedMonthDate(year, month, context), context));
|
|
538
|
+
if (props.view === "week") {
|
|
539
|
+
const first = calendar.startOfWeek(calendar.startOfMonth(props.date, context), context);
|
|
540
|
+
return Array.from({
|
|
541
|
+
length: 6
|
|
542
|
+
}, (_, week) => {
|
|
543
|
+
const start = calendar.addDays(first, week * 7, context);
|
|
544
|
+
return `${formatDay(start, context)} - ${formatDay(calendar.addDays(start, 6, context), context)}`;
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
return Array.from({
|
|
548
|
+
length: 12
|
|
549
|
+
}, (_, month) => month).flatMap(month => {
|
|
550
|
+
const first = zonedMonthDate(year, month, context);
|
|
551
|
+
return Array.from({
|
|
552
|
+
length: 7
|
|
553
|
+
}, (_, offset) => calendar.addDays(first, 21 + offset, context).toLocaleDateString(context.locale ?? "en", {
|
|
554
|
+
weekday: "long",
|
|
555
|
+
month: "long",
|
|
556
|
+
day: "numeric",
|
|
557
|
+
year: "numeric",
|
|
558
|
+
timeZone: context.timeZone
|
|
559
|
+
}));
|
|
560
|
+
});
|
|
561
|
+
});
|
|
459
562
|
const goDate = date => props.owner.onDateChange?.(date, props.view);
|
|
460
563
|
const goView = view => {
|
|
564
|
+
// Like the switcher's links, the other views open at the day selected in the month view.
|
|
565
|
+
const day = props.focusDay;
|
|
566
|
+
if (day && props.owner.onDateChange && view !== props.view) {
|
|
567
|
+
openViewAt(props.owner, day, view);
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
461
570
|
if (props.owner.onViewChange) {
|
|
462
571
|
props.owner.onViewChange(view);
|
|
463
572
|
return;
|
|
@@ -478,9 +587,9 @@ const CalendarHeader = props => {
|
|
|
478
587
|
class: "k2b-calendar-header__nav-button"
|
|
479
588
|
},
|
|
480
589
|
get children() {
|
|
481
|
-
return _$ssr(_tmpl$
|
|
590
|
+
return _$ssr(_tmpl$10, `ti ${_$escape(icon, true)}`);
|
|
482
591
|
}
|
|
483
|
-
}) : props.owner.onDateChange ? _$ssr(_tmpl$
|
|
592
|
+
}) : props.owner.onDateChange ? _$ssr(_tmpl$11, _$ssrAttribute("aria-label", _$escape(label, true), false), `ti ${_$escape(icon, true)}`) : _$createComponent(CalendarNavigationLink, {
|
|
484
593
|
get owner() {
|
|
485
594
|
return props.owner;
|
|
486
595
|
},
|
|
@@ -491,14 +600,14 @@ const CalendarHeader = props => {
|
|
|
491
600
|
class: "k2b-calendar-header__nav-button"
|
|
492
601
|
},
|
|
493
602
|
get children() {
|
|
494
|
-
return _$ssr(_tmpl$
|
|
603
|
+
return _$ssr(_tmpl$10, `ti ${_$escape(icon, true)}`);
|
|
495
604
|
}
|
|
496
605
|
});
|
|
497
606
|
};
|
|
498
607
|
const todayButton = () => {
|
|
499
608
|
const today = calendar.today(dateConfig());
|
|
500
609
|
const href = props.owner.getDateHref?.(today, props.view);
|
|
501
|
-
const label = _$ssr(_tmpl$
|
|
610
|
+
const label = _$ssr(_tmpl$12, _$escape(props.labels.today));
|
|
502
611
|
return (props.owner.onNavigateHref || props.owner.onNavigate) && href ? _$createComponent(CalendarNavigationLink, {
|
|
503
612
|
get owner() {
|
|
504
613
|
return props.owner;
|
|
@@ -545,7 +654,19 @@ const CalendarHeader = props => {
|
|
|
545
654
|
value: "year",
|
|
546
655
|
label: props.labels.year
|
|
547
656
|
}].filter(option => !props.owner.views || props.owner.views.includes(option.value)), ...(props.owner.customViews ?? [])]);
|
|
548
|
-
return _$ssr(_tmpl$
|
|
657
|
+
return _$ssr(_tmpl$15, _$escape(navButton(previous(), "ti-chevron-left", props.labels.previous)), _$escape(navButton(next(), "ti-chevron-right", props.labels.next)), _$escape(title()), _$escape(_$createComponent(For, {
|
|
658
|
+
get each() {
|
|
659
|
+
return titleWidths();
|
|
660
|
+
},
|
|
661
|
+
children: candidate => _$ssr(_tmpl$16, _$escape(candidate))
|
|
662
|
+
})), _$escape(_$createComponent(Show, {
|
|
663
|
+
get when() {
|
|
664
|
+
return props.owner.toolbarContent;
|
|
665
|
+
},
|
|
666
|
+
get children() {
|
|
667
|
+
return _$ssr(_tmpl$13, _$escape(props.owner.toolbarContent));
|
|
668
|
+
}
|
|
669
|
+
})), _$escape(todayButton()), _$escape(_$createComponent(Show, {
|
|
549
670
|
get when() {
|
|
550
671
|
return _$memo(() => !!!props.owner.onViewChange)() && props.owner.getViewHref;
|
|
551
672
|
},
|
|
@@ -554,7 +675,7 @@ const CalendarHeader = props => {
|
|
|
554
675
|
value: () => props.view === "mobile-month" ? "month" : props.view,
|
|
555
676
|
onValueChange: goView,
|
|
556
677
|
get ariaLabel() {
|
|
557
|
-
return
|
|
678
|
+
return calendarMessages().calendarView;
|
|
558
679
|
},
|
|
559
680
|
get options() {
|
|
560
681
|
return viewOptions();
|
|
@@ -571,6 +692,9 @@ const CalendarHeader = props => {
|
|
|
571
692
|
},
|
|
572
693
|
get options() {
|
|
573
694
|
return viewOptions();
|
|
695
|
+
},
|
|
696
|
+
get focusDay() {
|
|
697
|
+
return props.focusDay;
|
|
574
698
|
}
|
|
575
699
|
});
|
|
576
700
|
}
|
|
@@ -579,12 +703,14 @@ const CalendarHeader = props => {
|
|
|
579
703
|
return props.owner.navigationPending;
|
|
580
704
|
},
|
|
581
705
|
get children() {
|
|
582
|
-
return _$ssr(_tmpl$
|
|
706
|
+
return _$ssr(_tmpl$14);
|
|
583
707
|
}
|
|
584
708
|
})));
|
|
585
709
|
};
|
|
586
|
-
|
|
587
|
-
|
|
710
|
+
|
|
711
|
+
/** The compact month of `mobile-month`: a picker whose days link to their agenda. */
|
|
712
|
+
const MonthPickerView = props => {
|
|
713
|
+
const calendarMessages = useCalendarMessages();
|
|
588
714
|
const dateConfig = createMemo(() => ownerDateConfig(props.owner));
|
|
589
715
|
const [movePreview, setMovePreview] = createSignal(null);
|
|
590
716
|
const [movingEventId, setMovingEventId] = createSignal("");
|
|
@@ -637,28 +763,28 @@ const MonthView = props => {
|
|
|
637
763
|
});
|
|
638
764
|
};
|
|
639
765
|
onCleanup(() => cancelInteraction?.());
|
|
640
|
-
return _$ssr(_tmpl$
|
|
766
|
+
return _$ssr(_tmpl$18, _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, ${props.compact ? "minmax(2.75rem, auto)" : "minmax(5rem, 1fr)"})`), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
641
767
|
get when() {
|
|
642
768
|
return props.owner.withWeekNumbers;
|
|
643
769
|
},
|
|
644
770
|
get children() {
|
|
645
|
-
return _$ssr(_tmpl$
|
|
771
|
+
return _$ssr(_tmpl$17, _$escape(calendarMessages().weekShort));
|
|
646
772
|
}
|
|
647
773
|
})), _$escape(_$createComponent(For, {
|
|
648
774
|
get each() {
|
|
649
775
|
return weekdays();
|
|
650
776
|
},
|
|
651
|
-
children: day => _$ssr(_tmpl$
|
|
777
|
+
children: day => _$ssr(_tmpl$17, _$escape(day))
|
|
652
778
|
})), _$escape(_$createComponent(For, {
|
|
653
779
|
get each() {
|
|
654
780
|
return weeks();
|
|
655
781
|
},
|
|
656
|
-
children: week => _$ssr(_tmpl$
|
|
782
|
+
children: week => _$ssr(_tmpl$20, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
657
783
|
get when() {
|
|
658
784
|
return props.owner.withWeekNumbers;
|
|
659
785
|
},
|
|
660
786
|
get children() {
|
|
661
|
-
return _$ssr(_tmpl$
|
|
787
|
+
return _$ssr(_tmpl$19, _$escape(zonedWeekNumber(week[0], dateConfig())));
|
|
662
788
|
}
|
|
663
789
|
})), _$escape(_$createComponent(For, {
|
|
664
790
|
each: week,
|
|
@@ -687,7 +813,7 @@ const MonthView = props => {
|
|
|
687
813
|
hiddenCount: Math.max(0, candidates.length - visibleLimit)
|
|
688
814
|
};
|
|
689
815
|
});
|
|
690
|
-
return _$ssr(_tmpl$
|
|
816
|
+
return _$ssr(_tmpl$22, _$ssrAttribute("data-calendar-day-key", _$escape(dayKey, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-drop-preview", movePreview()?.start && calendar.formatDateKey(movePreview().start, dateConfig()) === dayKey ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
691
817
|
get when() {
|
|
692
818
|
return props.owner.onSlotActivate;
|
|
693
819
|
},
|
|
@@ -704,7 +830,7 @@ const MonthView = props => {
|
|
|
704
830
|
get anchorProps() {
|
|
705
831
|
return {
|
|
706
832
|
class: "k2b-calendar-month__day-target",
|
|
707
|
-
"aria-label":
|
|
833
|
+
"aria-label": calendarMessages().openDate({
|
|
708
834
|
label: dayLabel
|
|
709
835
|
})
|
|
710
836
|
};
|
|
@@ -718,7 +844,7 @@ const MonthView = props => {
|
|
|
718
844
|
"class": "k2b-calendar-month__day-target",
|
|
719
845
|
"data-interactive": "true",
|
|
720
846
|
get ["aria-label"]() {
|
|
721
|
-
return
|
|
847
|
+
return calendarMessages().createEventOn({
|
|
722
848
|
label: dayLabel
|
|
723
849
|
});
|
|
724
850
|
}
|
|
@@ -736,7 +862,7 @@ const MonthView = props => {
|
|
|
736
862
|
return props.owner.onSlotActivate && href;
|
|
737
863
|
},
|
|
738
864
|
get fallback() {
|
|
739
|
-
return _$ssr(_tmpl$
|
|
865
|
+
return _$ssr(_tmpl$23, _$ssrAttribute("data-today", isToday ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())));
|
|
740
866
|
},
|
|
741
867
|
children: dayHref => _$createComponent(CalendarNavigationLink, {
|
|
742
868
|
get owner() {
|
|
@@ -750,7 +876,7 @@ const MonthView = props => {
|
|
|
750
876
|
class: "k2b-calendar-month__day-number",
|
|
751
877
|
"data-today": isToday ? "true" : undefined,
|
|
752
878
|
"data-outside": !sameMonth ? "true" : undefined,
|
|
753
|
-
"aria-label":
|
|
879
|
+
"aria-label": calendarMessages().openDate({
|
|
754
880
|
label: dayLabel
|
|
755
881
|
})
|
|
756
882
|
};
|
|
@@ -761,18 +887,18 @@ const MonthView = props => {
|
|
|
761
887
|
})
|
|
762
888
|
})), _$escape(_$createComponent(Show, {
|
|
763
889
|
when: dayBadge,
|
|
764
|
-
children: badge => _$ssr(_tmpl$
|
|
890
|
+
children: badge => _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
|
|
765
891
|
get when() {
|
|
766
892
|
return badge().icon;
|
|
767
893
|
},
|
|
768
|
-
children: icon => _$ssr(_tmpl$
|
|
894
|
+
children: icon => _$ssr(_tmpl$10, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
|
|
769
895
|
})), _$escape(badge().label))
|
|
770
896
|
})), _$escape(_$createComponent(Show, {
|
|
771
897
|
get when() {
|
|
772
898
|
return eventStack().preview;
|
|
773
899
|
},
|
|
774
900
|
get children() {
|
|
775
|
-
return _$ssr(_tmpl$
|
|
901
|
+
return _$ssr(_tmpl$21, _$escape(props.events.find(event => event.id === eventStack().preview.id)?.title ?? calendarMessages().moveEvent));
|
|
776
902
|
}
|
|
777
903
|
})), _$escape(_$createComponent(For, {
|
|
778
904
|
get each() {
|
|
@@ -808,7 +934,9 @@ const MonthView = props => {
|
|
|
808
934
|
class: "k2b-calendar-month__more"
|
|
809
935
|
},
|
|
810
936
|
get children() {
|
|
811
|
-
return
|
|
937
|
+
return calendarMessages().calendarMoreEvents({
|
|
938
|
+
count: eventStack().hiddenCount
|
|
939
|
+
});
|
|
812
940
|
}
|
|
813
941
|
});
|
|
814
942
|
}
|
|
@@ -816,7 +944,7 @@ const MonthView = props => {
|
|
|
816
944
|
get each() {
|
|
817
945
|
return events.slice(0, 4);
|
|
818
946
|
},
|
|
819
|
-
children: event => _$ssr(_tmpl$
|
|
947
|
+
children: event => _$ssr(_tmpl$25, _$ssrAttribute("data-color", event.colorHex ? _$escape(undefined, true) : _$escape(event.color ?? "blue", true), false), _$ssrStyle(event.colorHex ? {
|
|
820
948
|
"background-color": event.colorHex
|
|
821
949
|
} : undefined))
|
|
822
950
|
})));
|
|
@@ -824,8 +952,990 @@ const MonthView = props => {
|
|
|
824
952
|
})))
|
|
825
953
|
})));
|
|
826
954
|
};
|
|
955
|
+
|
|
956
|
+
/** One entry of the month grid: its whole range, and the days it covers as `YYYY-MM-DD` keys. */
|
|
957
|
+
|
|
958
|
+
/** Lane height and gap of the month entries, in rem; the stylesheet reads both from the grid's custom properties. */
|
|
959
|
+
const MONTH_LANE_REM = 1.25;
|
|
960
|
+
const MONTH_LANE_GAP_REM = 0.125;
|
|
961
|
+
/** Rows drawn before the browser has measured the cells, as in the server response. */
|
|
962
|
+
const MONTH_DEFAULT_LANES = 3;
|
|
963
|
+
/** Room a bar keeps beside its title and date hint: padding, torn edge, gap, and an icon such as a task box or a flag. */
|
|
964
|
+
const MONTH_HINT_SLACK_REM = 2.25;
|
|
965
|
+
const dayKeyNumber = key => {
|
|
966
|
+
const [year = "1970", month = "1", day = "1"] = key.split("-");
|
|
967
|
+
return Date.UTC(Number(year), Number(month) - 1, Number(day)) / 86_400_000;
|
|
968
|
+
};
|
|
969
|
+
const orderedSelection = (anchor, focus) => anchor <= focus ? {
|
|
970
|
+
first: anchor,
|
|
971
|
+
last: focus
|
|
972
|
+
} : {
|
|
973
|
+
first: focus,
|
|
974
|
+
last: anchor
|
|
975
|
+
};
|
|
976
|
+
|
|
977
|
+
/** Groups the per-day pieces of the events back into one entry each: bars first, then the others by time. */
|
|
978
|
+
const monthItems = events => {
|
|
979
|
+
const items = new Map();
|
|
980
|
+
for (const piece of events) {
|
|
981
|
+
const key = `${piece.id}\u0000${piece.sourceStartDate.getTime()}`;
|
|
982
|
+
const item = items.get(key);
|
|
983
|
+
if (item) {
|
|
984
|
+
if (piece.dayKey < item.firstKey) item.firstKey = piece.dayKey;
|
|
985
|
+
if (piece.dayKey > item.lastKey) item.lastKey = piece.dayKey;
|
|
986
|
+
item.days.set(piece.dayKey, piece);
|
|
987
|
+
continue;
|
|
988
|
+
}
|
|
989
|
+
items.set(key, {
|
|
990
|
+
key,
|
|
991
|
+
event: {
|
|
992
|
+
...piece,
|
|
993
|
+
startDate: piece.sourceStartDate,
|
|
994
|
+
endDate: piece.sourceEndDate
|
|
995
|
+
},
|
|
996
|
+
firstKey: piece.dayKey,
|
|
997
|
+
lastKey: piece.dayKey,
|
|
998
|
+
bar: false,
|
|
999
|
+
days: new Map([[piece.dayKey, piece]])
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
for (const item of items.values()) item.bar = item.firstKey !== item.lastKey || Boolean(item.event.allDay && item.event.display !== "marker");
|
|
1003
|
+
return [...items.values()].sort((left, right) => Number(right.bar) - Number(left.bar) || left.event.sourceStartDate.getTime() - right.event.sourceStartDate.getTime() || left.event.title.localeCompare(right.event.title));
|
|
1004
|
+
};
|
|
1005
|
+
|
|
1006
|
+
/** Places a calendar popover below its anchor when there is room and above it otherwise, inside the viewport. */
|
|
1007
|
+
const placeCalendarPopover = (anchor, popover) => {
|
|
1008
|
+
const margin = 8;
|
|
1009
|
+
const gap = 4;
|
|
1010
|
+
const rect = anchor.getBoundingClientRect();
|
|
1011
|
+
const width = Math.min(popover.offsetWidth || 288, window.innerWidth - margin * 2);
|
|
1012
|
+
const height = popover.offsetHeight;
|
|
1013
|
+
const left = Math.max(margin, Math.min(rect.left, window.innerWidth - width - margin));
|
|
1014
|
+
const roomBelow = window.innerHeight - rect.bottom - gap - margin;
|
|
1015
|
+
const above = height > roomBelow && rect.top - gap - margin > roomBelow;
|
|
1016
|
+
const top = above ? Math.max(margin, rect.top - height - gap) : Math.min(rect.bottom + gap, window.innerHeight - height - margin);
|
|
1017
|
+
popover.style.left = `${left}px`;
|
|
1018
|
+
popover.style.top = `${Math.max(margin, top)}px`;
|
|
1019
|
+
};
|
|
1020
|
+
let measureContext;
|
|
1021
|
+
/** The width of a text in a font, from a canvas, so a bar can tell whether its title leaves room for a date hint. */
|
|
1022
|
+
const textWidth = (text, font) => {
|
|
1023
|
+
measureContext ??= typeof document === "undefined" ? null : document.createElement("canvas").getContext("2d");
|
|
1024
|
+
if (!measureContext) return Number.POSITIVE_INFINITY;
|
|
1025
|
+
measureContext.font = font;
|
|
1026
|
+
return measureContext.measureText(text).width;
|
|
1027
|
+
};
|
|
1028
|
+
|
|
1029
|
+
/** Follows a calendar link the way the calendar's own links do: through the host's navigation when it has one. */
|
|
1030
|
+
const followCalendarHref = (owner, href) => {
|
|
1031
|
+
if (owner.onNavigateHref) owner.onNavigateHref(href);else window.location.assign(href);
|
|
1032
|
+
};
|
|
1033
|
+
const PRINTABLE_KEY = /^.$/u;
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* The month grid. A click selects a day and never navigates, a drag or Shift selects a range, and the arrow keys move
|
|
1037
|
+
* the selection. The quick create opens at the selection: quietly after a click, with the focus after a drag, a
|
|
1038
|
+
* double-click, Enter, or N. Every event is one bar per week row in a lane it keeps on each of its days, and each
|
|
1039
|
+
* cell shows as many entries as its height holds.
|
|
1040
|
+
*/
|
|
1041
|
+
const MonthView = props => {
|
|
1042
|
+
const calendarMessages = useCalendarMessages();
|
|
1043
|
+
const dateConfig = createMemo(() => ownerDateConfig(props.owner));
|
|
1044
|
+
// The shown month and its grid change only with the month, so a refresh of the same month keeps every cell and its
|
|
1045
|
+
// focus.
|
|
1046
|
+
const month = createMemo(() => zonedYearMonth(props.date, dateConfig()), undefined, {
|
|
1047
|
+
equals: (previous, next) => previous.year === next.year && previous.month === next.month
|
|
1048
|
+
});
|
|
1049
|
+
const weeks = createMemo(() => calendar.getMonthGrid(month().year, month().month, dateConfig()).map(week => week.map(day => ({
|
|
1050
|
+
day,
|
|
1051
|
+
key: calendar.formatDateKey(day, dateConfig())
|
|
1052
|
+
}))), undefined, {
|
|
1053
|
+
equals: (previous, next) => previous.map(week => week[0]?.key).join() === next.map(week => week[0]?.key).join()
|
|
1054
|
+
});
|
|
1055
|
+
const weekdays = createMemo(() => calendar.weekdays(dateConfig()));
|
|
1056
|
+
const todayKey = createMemo(() => calendar.formatDateKey(props.now, dateConfig()));
|
|
1057
|
+
const items = createMemo(() => monthItems(props.events));
|
|
1058
|
+
const weekLayouts = createMemo(() => weeks().map(week => layoutMonthWeek(week.map(entry => entry.key), items().map(item => ({
|
|
1059
|
+
item,
|
|
1060
|
+
firstKey: item.firstKey,
|
|
1061
|
+
lastKey: item.lastKey,
|
|
1062
|
+
bar: item.bar
|
|
1063
|
+
})))));
|
|
1064
|
+
const [capacities, setCapacities] = createSignal([]);
|
|
1065
|
+
const [cellWidth, setCellWidth] = createSignal(0);
|
|
1066
|
+
const [barFont, setBarFont] = createSignal("");
|
|
1067
|
+
const [anchorKey, setAnchorKey] = createSignal(null);
|
|
1068
|
+
const [focusKey, setFocusKey] = createSignal(null);
|
|
1069
|
+
const [popover, setPopover] = createSignal(null);
|
|
1070
|
+
/** Whether the quick create holds the focus; until then the grid keeps it. */
|
|
1071
|
+
const [createActive, setCreateActive] = createSignal(false);
|
|
1072
|
+
const [linkedItem, setLinkedItem] = createSignal("");
|
|
1073
|
+
const [movePreview, setMovePreview] = createSignal(null);
|
|
1074
|
+
const [movingEventId, setMovingEventId] = createSignal("");
|
|
1075
|
+
const cells = new Map();
|
|
1076
|
+
let popoverElement;
|
|
1077
|
+
let cancelInteraction;
|
|
1078
|
+
let suppressClickUntil = 0;
|
|
1079
|
+
let lastPointer = "mouse";
|
|
1080
|
+
let menuKey = null;
|
|
1081
|
+
/** The day to select once paging with Page Up or Page Down has shown its month. */
|
|
1082
|
+
let pendingKey = null;
|
|
1083
|
+
const selection = createMemo(() => {
|
|
1084
|
+
const anchor = anchorKey();
|
|
1085
|
+
const focus = focusKey();
|
|
1086
|
+
return anchor && focus ? orderedSelection(anchor, focus) : null;
|
|
1087
|
+
});
|
|
1088
|
+
const parseKey = key => calendar.parseCalendarDate(key, dateConfig());
|
|
1089
|
+
const rangeOf = range => ({
|
|
1090
|
+
start: parseKey(range.first),
|
|
1091
|
+
end: calendar.addDays(parseKey(range.last), 1, dateConfig()),
|
|
1092
|
+
allDay: true
|
|
1093
|
+
});
|
|
1094
|
+
const visibleKeys = createMemo(() => weeks().flatMap(week => week.map(entry => entry.key)));
|
|
1095
|
+
const rovingKey = createMemo(() => {
|
|
1096
|
+
const keys = visibleKeys();
|
|
1097
|
+
const focus = focusKey();
|
|
1098
|
+
if (focus && keys.includes(focus)) return focus;
|
|
1099
|
+
if (keys.includes(todayKey())) return todayKey();
|
|
1100
|
+
return calendar.formatDateKey(zonedMonthDate(month().year, month().month, dateConfig()), dateConfig());
|
|
1101
|
+
});
|
|
1102
|
+
const dropRange = createMemo(() => {
|
|
1103
|
+
const preview = movePreview();
|
|
1104
|
+
if (!preview) return null;
|
|
1105
|
+
const keys = previewSegments(preview, visibleKeys().map(parseKey), dateConfig()).map(piece => piece.dayKey);
|
|
1106
|
+
if (keys.length === 0) return null;
|
|
1107
|
+
keys.sort();
|
|
1108
|
+
return {
|
|
1109
|
+
first: keys[0],
|
|
1110
|
+
last: keys[keys.length - 1]
|
|
1111
|
+
};
|
|
1112
|
+
});
|
|
1113
|
+
const within = (range, key) => Boolean(range && key >= range.first && key <= range.last);
|
|
1114
|
+
/** Where a day sits in the selection: alone, at its start or end, or in between. */
|
|
1115
|
+
const selectionPart = key => {
|
|
1116
|
+
const range = selection();
|
|
1117
|
+
if (!range || !within(range, key)) return undefined;
|
|
1118
|
+
if (range.first === range.last) return "single";
|
|
1119
|
+
return key === range.first ? "start" : key === range.last ? "end" : "middle";
|
|
1120
|
+
};
|
|
1121
|
+
const select = (anchor, focus = anchor) => {
|
|
1122
|
+
setAnchorKey(anchor);
|
|
1123
|
+
setFocusKey(focus);
|
|
1124
|
+
};
|
|
1125
|
+
// The host learns every change of the selected days, and a new month starts without a selection. The selection
|
|
1126
|
+
// goes with the view, so switching to another view reports that nothing is selected.
|
|
1127
|
+
createEffect(on(selection, range => props.owner.onSelectionChange?.(range ? rangeOf(range) : null), {
|
|
1128
|
+
defer: true
|
|
1129
|
+
}));
|
|
1130
|
+
onCleanup(() => {
|
|
1131
|
+
if (untrack(selection)) props.owner.onSelectionChange?.(null);
|
|
1132
|
+
});
|
|
1133
|
+
createEffect(on(selection, range => props.onFocusDay?.(range ? parseKey(range.first) : null)));
|
|
1134
|
+
createEffect(on(month, () => {
|
|
1135
|
+
setPopover(null);
|
|
1136
|
+
const key = pendingKey;
|
|
1137
|
+
pendingKey = null;
|
|
1138
|
+
if (key && visibleKeys().includes(key)) {
|
|
1139
|
+
select(key);
|
|
1140
|
+
queueMicrotask(() => focusCell(key));
|
|
1141
|
+
} else select(null);
|
|
1142
|
+
}, {
|
|
1143
|
+
defer: true
|
|
1144
|
+
}));
|
|
1145
|
+
const dayLabel = day => day.toLocaleDateString(dateConfig().locale ?? "en", {
|
|
1146
|
+
weekday: "long",
|
|
1147
|
+
year: "numeric",
|
|
1148
|
+
month: "long",
|
|
1149
|
+
day: "numeric",
|
|
1150
|
+
timeZone: dateConfig().timeZone
|
|
1151
|
+
});
|
|
1152
|
+
const shortDayLabel = (key, withMonth = true) => parseKey(key).toLocaleDateString(dateConfig().locale ?? "en", {
|
|
1153
|
+
day: "numeric",
|
|
1154
|
+
...(withMonth ? {
|
|
1155
|
+
month: "short"
|
|
1156
|
+
} : {}),
|
|
1157
|
+
timeZone: dateConfig().timeZone
|
|
1158
|
+
});
|
|
1159
|
+
const monthDayLabel = (date, withTime) => date.toLocaleString(dateConfig().locale ?? "en", {
|
|
1160
|
+
month: "long",
|
|
1161
|
+
day: "numeric",
|
|
1162
|
+
...(withTime ? {
|
|
1163
|
+
hour: "2-digit",
|
|
1164
|
+
minute: "2-digit"
|
|
1165
|
+
} : {}),
|
|
1166
|
+
timeZone: dateConfig().timeZone
|
|
1167
|
+
});
|
|
1168
|
+
/** A long event names the days it spans; a one-day event keeps the chip's own title and time. */
|
|
1169
|
+
const itemLabel = item => {
|
|
1170
|
+
if (item.firstKey === item.lastKey) return undefined;
|
|
1171
|
+
const allDay = Boolean(item.event.allDay);
|
|
1172
|
+
return calendarMessages().calendarEventTime({
|
|
1173
|
+
title: item.event.title,
|
|
1174
|
+
start: monthDayLabel(allDay ? parseKey(item.firstKey) : item.event.sourceStartDate, !allDay),
|
|
1175
|
+
end: monthDayLabel(allDay ? parseKey(item.lastKey) : item.event.sourceEndDate, !allDay)
|
|
1176
|
+
});
|
|
1177
|
+
};
|
|
1178
|
+
/** The start time before the title of a one-day entry; bars and all-day entries show none. */
|
|
1179
|
+
const leadingTime = item => item.bar || item.event.allDay ? undefined : formatTime(item.event.sourceStartDate, dateConfig());
|
|
1180
|
+
/** The day at a torn end of a bar, with its month when that day lies outside the shown month. */
|
|
1181
|
+
const hintDate = target => ({
|
|
1182
|
+
day: Number(target.slice(8, 10)),
|
|
1183
|
+
month: Number(target.slice(0, 4)) === month().year && Number(target.slice(5, 7)) === month().month + 1 ? undefined : parseKey(target).toLocaleDateString(dateConfig().locale ?? "en", {
|
|
1184
|
+
month: "short",
|
|
1185
|
+
timeZone: dateConfig().timeZone
|
|
1186
|
+
}).replace(/\.$/, "")
|
|
1187
|
+
});
|
|
1188
|
+
const selectionHeading = range => {
|
|
1189
|
+
if (range.first === range.last) return parseKey(range.first).toLocaleDateString(dateConfig().locale ?? "en", {
|
|
1190
|
+
weekday: "long",
|
|
1191
|
+
month: "long",
|
|
1192
|
+
day: "numeric",
|
|
1193
|
+
timeZone: dateConfig().timeZone
|
|
1194
|
+
});
|
|
1195
|
+
const days = dayKeyNumber(range.last) - dayKeyNumber(range.first) + 1;
|
|
1196
|
+
return calendarMessages().calendarSelectedDays({
|
|
1197
|
+
start: shortDayLabel(range.first),
|
|
1198
|
+
end: shortDayLabel(range.last),
|
|
1199
|
+
count: days
|
|
1200
|
+
});
|
|
1201
|
+
};
|
|
1202
|
+
const viewAvailable = view => !props.owner.views || props.owner.views.includes(view);
|
|
1203
|
+
const viewHref = (key, view) => viewAvailable(view) ? props.owner.getDateHref?.(parseKey(key), view) : undefined;
|
|
1204
|
+
/** Whether the calendar can open another view at a day: through a link, or through the host's date change. */
|
|
1205
|
+
const canOpenView = view => viewAvailable(view) && Boolean(props.owner.getDateHref || props.owner.onDateChange);
|
|
1206
|
+
const openView = (key, view) => {
|
|
1207
|
+
const href = viewHref(key, view);
|
|
1208
|
+
if (href) followCalendarHref(props.owner, href);else openViewAt(props.owner, parseKey(key), view);
|
|
1209
|
+
};
|
|
1210
|
+
/** The calendar's own entries of the day menu, Open day and Open week, need no application entries. */
|
|
1211
|
+
const hasMenu = () => Boolean(props.owner.selectionMenu) || canOpenView("day") || canOpenView("week");
|
|
1212
|
+
|
|
1213
|
+
/** The day cell under a point, from the cells' boxes: a bar lies over days that are not its parent. */
|
|
1214
|
+
const dayKeyAtPoint = (clientX, clientY) => {
|
|
1215
|
+
for (const [key, cell] of cells) {
|
|
1216
|
+
if (!cell.isConnected) continue;
|
|
1217
|
+
const rect = cell.getBoundingClientRect();
|
|
1218
|
+
if (clientX >= rect.left && clientX < rect.right && clientY >= rect.top && clientY < rect.bottom) return key;
|
|
1219
|
+
}
|
|
1220
|
+
return null;
|
|
1221
|
+
};
|
|
1222
|
+
const focusCell = key => cells.get(key)?.focus({
|
|
1223
|
+
preventScroll: true
|
|
1224
|
+
});
|
|
1225
|
+
const closePopover = (restoreFocus = true) => {
|
|
1226
|
+
if (!popover()) return;
|
|
1227
|
+
setPopover(null);
|
|
1228
|
+
setCreateActive(false);
|
|
1229
|
+
if (restoreFocus) focusCell(rovingKey());
|
|
1230
|
+
};
|
|
1231
|
+
const popoverFocusable = () => popoverElement?.querySelector("input,textarea,select,button,a[href],[tabindex]:not([tabindex='-1'])") ?? null;
|
|
1232
|
+
|
|
1233
|
+
/**
|
|
1234
|
+
* Opens the quick create at the selection. Quietly, it only shows beside the grid, which keeps the focus until the
|
|
1235
|
+
* person types or tabs into it; otherwise it takes the focus at once.
|
|
1236
|
+
*/
|
|
1237
|
+
const openCreate = (range, options) => {
|
|
1238
|
+
if (!props.owner.renderQuickCreate) return false;
|
|
1239
|
+
const anchor = cells.get(focusKey() && within(range, focusKey()) ? focusKey() : range.last);
|
|
1240
|
+
if (!anchor) return false;
|
|
1241
|
+
setCreateActive(options.active);
|
|
1242
|
+
setPopover({
|
|
1243
|
+
kind: "create",
|
|
1244
|
+
range,
|
|
1245
|
+
anchor,
|
|
1246
|
+
create: options.create
|
|
1247
|
+
});
|
|
1248
|
+
return true;
|
|
1249
|
+
};
|
|
1250
|
+
const activateCreate = () => {
|
|
1251
|
+
if (popover()?.kind !== "create") return false;
|
|
1252
|
+
setCreateActive(true);
|
|
1253
|
+
popoverFocusable()?.focus();
|
|
1254
|
+
return true;
|
|
1255
|
+
};
|
|
1256
|
+
/** Enter, a double-click, and N create on the selection, with the quick create or the host's own create action. */
|
|
1257
|
+
const createOnSelection = () => {
|
|
1258
|
+
const range = selection();
|
|
1259
|
+
if (!range) return;
|
|
1260
|
+
if (openCreate(range, {
|
|
1261
|
+
active: true
|
|
1262
|
+
})) return;
|
|
1263
|
+
if (props.owner.onSlotActivate) props.owner.onSlotActivate(rangeOf(range));
|
|
1264
|
+
};
|
|
1265
|
+
const openDayList = key => {
|
|
1266
|
+
const anchor = cells.get(key);
|
|
1267
|
+
if (!anchor) return;
|
|
1268
|
+
setCreateActive(true);
|
|
1269
|
+
setPopover({
|
|
1270
|
+
kind: "day",
|
|
1271
|
+
dayKey: key,
|
|
1272
|
+
anchor
|
|
1273
|
+
});
|
|
1274
|
+
};
|
|
1275
|
+
/** A quiet quick create follows the selection; any other popover closes when the selection changes. */
|
|
1276
|
+
const followSelection = () => {
|
|
1277
|
+
const current = popover();
|
|
1278
|
+
const range = selection();
|
|
1279
|
+
if (!current) return;
|
|
1280
|
+
if (current.kind === "create" && !createActive() && range) openCreate(range, {
|
|
1281
|
+
active: false
|
|
1282
|
+
});else closePopover(false);
|
|
1283
|
+
};
|
|
1284
|
+
const pageTo = target => {
|
|
1285
|
+
const date = parseKey(target);
|
|
1286
|
+
const href = props.owner.getDateHref?.(date, "month");
|
|
1287
|
+
// Only a month that is on its way may select the day, so a host that cannot page never leaves one behind.
|
|
1288
|
+
if (props.owner.onDateChange) {
|
|
1289
|
+
pendingKey = target;
|
|
1290
|
+
props.owner.onDateChange(date, "month");
|
|
1291
|
+
} else if (href) {
|
|
1292
|
+
pendingKey = target;
|
|
1293
|
+
followCalendarHref(props.owner, href);
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
const moveFocus = (key, extend) => {
|
|
1297
|
+
if (!visibleKeys().includes(key)) {
|
|
1298
|
+
pageTo(key);
|
|
1299
|
+
return;
|
|
1300
|
+
}
|
|
1301
|
+
if (extend) select(anchorKey() ?? focusKey() ?? key, key);else select(key);
|
|
1302
|
+
focusCell(key);
|
|
1303
|
+
followSelection();
|
|
1304
|
+
};
|
|
1305
|
+
const onCellKeyDown = (event, key) => {
|
|
1306
|
+
if (event.target !== event.currentTarget || event.ctrlKey || event.metaKey || event.altKey) return;
|
|
1307
|
+
const current = popover();
|
|
1308
|
+
const quiet = current?.kind === "create" && !createActive();
|
|
1309
|
+
// The quiet quick create takes over once the person types or tabs into it. Space stays the grid's key for the day
|
|
1310
|
+
// list; N is a title's first letter like any other, as the quick create it would open is already there.
|
|
1311
|
+
if (quiet && (event.key === "Tab" && !event.shiftKey || PRINTABLE_KEY.test(event.key) && event.key !== " ")) {
|
|
1312
|
+
const field = popoverFocusable();
|
|
1313
|
+
if (field) {
|
|
1314
|
+
if (event.key === "Tab") event.preventDefault();
|
|
1315
|
+
setCreateActive(true);
|
|
1316
|
+
field.focus();
|
|
1317
|
+
return;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
const day = parseKey(key);
|
|
1321
|
+
const shift = days => calendar.formatDateKey(calendar.addDays(day, days, dateConfig()), dateConfig());
|
|
1322
|
+
const weekday = (dayKeyNumber(key) - dayKeyNumber(calendar.formatDateKey(calendar.startOfWeek(day, dateConfig()), dateConfig()))) % 7;
|
|
1323
|
+
const target = event.key === "ArrowLeft" ? shift(-1) : event.key === "ArrowRight" ? shift(1) : event.key === "ArrowUp" ? shift(-7) : event.key === "ArrowDown" ? shift(7) : event.key === "Home" ? shift(-weekday) : event.key === "End" ? shift(6 - weekday) : null;
|
|
1324
|
+
if (target) {
|
|
1325
|
+
event.preventDefault();
|
|
1326
|
+
moveFocus(target, event.shiftKey);
|
|
1327
|
+
return;
|
|
1328
|
+
}
|
|
1329
|
+
if (event.key === "PageUp" || event.key === "PageDown") {
|
|
1330
|
+
event.preventDefault();
|
|
1331
|
+
pageTo(calendar.formatDateKey(addMonthsClamped(day, event.key === "PageUp" ? -1 : 1, dateConfig()), dateConfig()));
|
|
1332
|
+
return;
|
|
1333
|
+
}
|
|
1334
|
+
if (event.key === "Enter" || (event.key === "n" || event.key === "N") && !event.shiftKey) {
|
|
1335
|
+
event.preventDefault();
|
|
1336
|
+
if (!within(selection(), key)) select(key);
|
|
1337
|
+
createOnSelection();
|
|
1338
|
+
return;
|
|
1339
|
+
}
|
|
1340
|
+
if (event.key === " ") {
|
|
1341
|
+
event.preventDefault();
|
|
1342
|
+
if (!within(selection(), key)) select(key);
|
|
1343
|
+
openDayList(key);
|
|
1344
|
+
return;
|
|
1345
|
+
}
|
|
1346
|
+
if (event.key === "Escape") {
|
|
1347
|
+
if (current) closePopover(false);else if (selection()) select(null);else return;
|
|
1348
|
+
event.preventDefault();
|
|
1349
|
+
return;
|
|
1350
|
+
}
|
|
1351
|
+
// The keyboard opens the day's menu where the day is, as a right-click there would.
|
|
1352
|
+
if (hasMenu() && (event.key === "ContextMenu" || event.shiftKey && event.key === "F10")) {
|
|
1353
|
+
event.preventDefault();
|
|
1354
|
+
event.stopPropagation();
|
|
1355
|
+
menuKey = key;
|
|
1356
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
1357
|
+
event.currentTarget?.dispatchEvent(new MouseEvent("contextmenu", {
|
|
1358
|
+
bubbles: true,
|
|
1359
|
+
cancelable: true,
|
|
1360
|
+
clientX: rect.left + 12,
|
|
1361
|
+
clientY: rect.top + 12
|
|
1362
|
+
}));
|
|
1363
|
+
}
|
|
1364
|
+
};
|
|
1365
|
+
const fromControl = event => event.target instanceof Element && Boolean(event.target.closest("a,button,[data-calendar-event],.k2b-calendar-month__lanes > *"));
|
|
1366
|
+
const onCellClick = (event, key) => {
|
|
1367
|
+
if (fromControl(event) || performance.now() < suppressClickUntil) return;
|
|
1368
|
+
// A second tap on the one selected day opens the quick create, as a double-click does with a mouse.
|
|
1369
|
+
if (lastPointer === "touch") {
|
|
1370
|
+
const range = selection();
|
|
1371
|
+
if (range && range.first === key && range.last === key && openCreate(range, {
|
|
1372
|
+
active: true
|
|
1373
|
+
})) return;
|
|
1374
|
+
select(key);
|
|
1375
|
+
closePopover(false);
|
|
1376
|
+
return;
|
|
1377
|
+
}
|
|
1378
|
+
if (event.shiftKey && anchorKey()) select(anchorKey(), key);else select(key);
|
|
1379
|
+
focusCell(key);
|
|
1380
|
+
const range = selection();
|
|
1381
|
+
if (range) openCreate(range, {
|
|
1382
|
+
active: false
|
|
1383
|
+
});
|
|
1384
|
+
};
|
|
1385
|
+
const onCellDoubleClick = (event, key) => {
|
|
1386
|
+
if (fromControl(event) || lastPointer === "touch") return;
|
|
1387
|
+
event.preventDefault();
|
|
1388
|
+
if (!within(selection(), key)) select(key);
|
|
1389
|
+
if (popover()?.kind === "create") activateCreate();else createOnSelection();
|
|
1390
|
+
};
|
|
1391
|
+
/** The day under the pointer: a bar that spans several days sits in the cell of its first day. */
|
|
1392
|
+
const pressedKey = (event, key) => dayKeyAtPoint(event.clientX, event.clientY) ?? key;
|
|
1393
|
+
const onCellPointerDown = (event, key) => {
|
|
1394
|
+
lastPointer = event.pointerType;
|
|
1395
|
+
// The menu acts on the pressed day, or on the selection when the press is inside it.
|
|
1396
|
+
menuKey = pressedKey(event, key);
|
|
1397
|
+
if (event.pointerType !== "mouse" || event.button !== 0 || event.shiftKey || fromControl(event)) return;
|
|
1398
|
+
cancelInteraction?.();
|
|
1399
|
+
cancelInteraction = startCalendarPointerSession({
|
|
1400
|
+
event,
|
|
1401
|
+
resolve: (clientX, clientY) => dayKeyAtPoint(clientX, clientY),
|
|
1402
|
+
onActivate: () => {
|
|
1403
|
+
suppressClickUntil = performance.now() + 400;
|
|
1404
|
+
closePopover(false);
|
|
1405
|
+
select(key);
|
|
1406
|
+
},
|
|
1407
|
+
onPreview: current => select(key, current),
|
|
1408
|
+
onCommit: current => {
|
|
1409
|
+
select(key, current);
|
|
1410
|
+
focusCell(current);
|
|
1411
|
+
const range = orderedSelection(key, current);
|
|
1412
|
+
openCreate(range, {
|
|
1413
|
+
active: range.first !== range.last
|
|
1414
|
+
});
|
|
1415
|
+
},
|
|
1416
|
+
onCancel: () => select(key)
|
|
1417
|
+
});
|
|
1418
|
+
};
|
|
1419
|
+
const onMenuOpen = () => {
|
|
1420
|
+
closePopover(false);
|
|
1421
|
+
const key = menuKey;
|
|
1422
|
+
if (key && !within(selection(), key)) select(key);
|
|
1423
|
+
};
|
|
1424
|
+
// Until a day is selected, the menu acts on the day that takes focus, so it is never empty.
|
|
1425
|
+
const menuItems = createMemo(() => {
|
|
1426
|
+
if (!hasMenu()) return [];
|
|
1427
|
+
const range = selection() ?? {
|
|
1428
|
+
first: rovingKey(),
|
|
1429
|
+
last: rovingKey()
|
|
1430
|
+
};
|
|
1431
|
+
const own = props.owner.selectionMenu?.(rangeOf(range), {
|
|
1432
|
+
quickCreate: create => {
|
|
1433
|
+
select(range.first, range.last);
|
|
1434
|
+
if (!openCreate(range, {
|
|
1435
|
+
active: true,
|
|
1436
|
+
create
|
|
1437
|
+
})) props.owner.onSlotActivate?.(rangeOf(range));
|
|
1438
|
+
}
|
|
1439
|
+
}) ?? [];
|
|
1440
|
+
const actions = own.filter(item => !("items" in item));
|
|
1441
|
+
const sections = own.filter(item => "items" in item);
|
|
1442
|
+
const navigation = [...(canOpenView("day") ? [{
|
|
1443
|
+
label: calendarMessages().calendarOpenDay,
|
|
1444
|
+
icon: "ti ti-zoom-in",
|
|
1445
|
+
action: () => openView(range.first, "day")
|
|
1446
|
+
}] : []), ...(canOpenView("week") ? [{
|
|
1447
|
+
label: calendarMessages().calendarOpenWeek,
|
|
1448
|
+
icon: "ti ti-calendar-week",
|
|
1449
|
+
action: () => openView(range.first, "week")
|
|
1450
|
+
}] : []), ...(range.first !== range.last ? [{
|
|
1451
|
+
label: calendarMessages().calendarClearSelection,
|
|
1452
|
+
icon: "ti ti-x",
|
|
1453
|
+
action: () => select(null)
|
|
1454
|
+
}] : [])];
|
|
1455
|
+
const groups = [{
|
|
1456
|
+
items: actions
|
|
1457
|
+
}, ...sections, {
|
|
1458
|
+
items: navigation
|
|
1459
|
+
}].filter(section => section.items.length > 0);
|
|
1460
|
+
// The first group names the days the menu acts on, also when the calendar's own entries are all it has.
|
|
1461
|
+
const [first, ...rest] = groups;
|
|
1462
|
+
return first && !first.sectionLabel ? [{
|
|
1463
|
+
...first,
|
|
1464
|
+
sectionLabel: selectionHeading(range)
|
|
1465
|
+
}, ...rest] : groups;
|
|
1466
|
+
});
|
|
1467
|
+
const clearMove = () => {
|
|
1468
|
+
setMovePreview(null);
|
|
1469
|
+
setMovingEventId("");
|
|
1470
|
+
};
|
|
1471
|
+
const startMove = (pointerEvent, item, markDragged) => {
|
|
1472
|
+
if (!props.owner.onEventDrop) return;
|
|
1473
|
+
const event = item.event;
|
|
1474
|
+
const grabbed = dayKeyAtPoint(pointerEvent.clientX, pointerEvent.clientY) ?? item.firstKey;
|
|
1475
|
+
const firstDay = startOfDay(event.sourceStartDate, dateConfig());
|
|
1476
|
+
cancelInteraction?.();
|
|
1477
|
+
cancelInteraction = startCalendarPointerSession({
|
|
1478
|
+
event: pointerEvent,
|
|
1479
|
+
resolve: (clientX, clientY) => {
|
|
1480
|
+
const key = dayKeyAtPoint(clientX, clientY);
|
|
1481
|
+
if (!key) return null;
|
|
1482
|
+
// The event moves by as many days as the pointer, wherever on the bar it was grabbed.
|
|
1483
|
+
const day = calendar.addDays(firstDay, dayKeyNumber(key) - dayKeyNumber(grabbed), dateConfig());
|
|
1484
|
+
return {
|
|
1485
|
+
id: event.id,
|
|
1486
|
+
title: event.title,
|
|
1487
|
+
...moveEventToDay(event, day, dateConfig())
|
|
1488
|
+
};
|
|
1489
|
+
},
|
|
1490
|
+
onActivate: () => {
|
|
1491
|
+
markDragged();
|
|
1492
|
+
suppressClickUntil = performance.now() + 400;
|
|
1493
|
+
closePopover(false);
|
|
1494
|
+
setMovingEventId(event.id);
|
|
1495
|
+
},
|
|
1496
|
+
onPreview: setMovePreview,
|
|
1497
|
+
onCommit: next => {
|
|
1498
|
+
clearMove();
|
|
1499
|
+
if (eventTimeChanged(event, next)) props.owner.onEventDrop?.(event, next);
|
|
1500
|
+
},
|
|
1501
|
+
onCancel: clearMove
|
|
1502
|
+
});
|
|
1503
|
+
};
|
|
1504
|
+
|
|
1505
|
+
// Each week row measures the room below its day numbers; the rows only resize with the grid, never with content.
|
|
1506
|
+
let observer;
|
|
1507
|
+
const lanesOf = new WeakMap();
|
|
1508
|
+
const measure = (element, week) => {
|
|
1509
|
+
const style = getComputedStyle(element);
|
|
1510
|
+
const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
|
|
1511
|
+
const capacity = monthLaneCapacity(element.clientHeight, MONTH_LANE_REM * rootSize, MONTH_LANE_GAP_REM * rootSize);
|
|
1512
|
+
setCapacities(current => {
|
|
1513
|
+
if (current[week] === capacity) return current;
|
|
1514
|
+
const next = [...current];
|
|
1515
|
+
next[week] = capacity;
|
|
1516
|
+
return next;
|
|
1517
|
+
});
|
|
1518
|
+
if (week === 0) {
|
|
1519
|
+
setCellWidth(element.clientWidth);
|
|
1520
|
+
setBarFont(`600 ${0.6875 * rootSize}px ${style.fontFamily}`);
|
|
1521
|
+
}
|
|
1522
|
+
};
|
|
1523
|
+
const observeLanes = (element, week) => {
|
|
1524
|
+
lanesOf.set(element, week);
|
|
1525
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
1526
|
+
observer ??= new ResizeObserver(entries => {
|
|
1527
|
+
for (const entry of entries) {
|
|
1528
|
+
const index = lanesOf.get(entry.target);
|
|
1529
|
+
if (index !== undefined) measure(entry.target, index);
|
|
1530
|
+
}
|
|
1531
|
+
});
|
|
1532
|
+
observer.observe(element);
|
|
1533
|
+
onCleanup(() => observer?.unobserve(element));
|
|
1534
|
+
};
|
|
1535
|
+
/** A date hint shows only when the bar holds its title and the hint whole; screen readers get the range anyway. */
|
|
1536
|
+
const hintFits = (title, hint, span) => {
|
|
1537
|
+
const width = cellWidth();
|
|
1538
|
+
const font = barFont();
|
|
1539
|
+
if (width <= 0 || !font) return false;
|
|
1540
|
+
const rootSize = Number.parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
|
|
1541
|
+
return textWidth(title, font) + textWidth(hint, font) + MONTH_HINT_SLACK_REM * rootSize <= span * width;
|
|
1542
|
+
};
|
|
1543
|
+
createEffect(() => {
|
|
1544
|
+
const current = popover();
|
|
1545
|
+
const element = popoverElement;
|
|
1546
|
+
if (!element) return;
|
|
1547
|
+
if (!current) {
|
|
1548
|
+
if (element.matches(":popover-open")) element.hidePopover();
|
|
1549
|
+
return;
|
|
1550
|
+
}
|
|
1551
|
+
if (!element.matches(":popover-open")) element.showPopover();
|
|
1552
|
+
const focus = untrack(createActive);
|
|
1553
|
+
queueMicrotask(() => {
|
|
1554
|
+
if (popover() !== current || !element.isConnected) return;
|
|
1555
|
+
placeCalendarPopover(current.anchor, element);
|
|
1556
|
+
if (focus) popoverFocusable()?.focus();
|
|
1557
|
+
});
|
|
1558
|
+
});
|
|
1559
|
+
onMount(() => {
|
|
1560
|
+
const reposition = () => {
|
|
1561
|
+
const current = popover();
|
|
1562
|
+
if (current && popoverElement) placeCalendarPopover(current.anchor, popoverElement);
|
|
1563
|
+
};
|
|
1564
|
+
window.addEventListener("resize", reposition);
|
|
1565
|
+
window.addEventListener("scroll", reposition, true);
|
|
1566
|
+
onCleanup(() => {
|
|
1567
|
+
window.removeEventListener("resize", reposition);
|
|
1568
|
+
window.removeEventListener("scroll", reposition, true);
|
|
1569
|
+
});
|
|
1570
|
+
});
|
|
1571
|
+
onCleanup(() => {
|
|
1572
|
+
cancelInteraction?.();
|
|
1573
|
+
observer?.disconnect();
|
|
1574
|
+
});
|
|
1575
|
+
const dayEntries = dayKey => items().filter(item => item.days.has(dayKey));
|
|
1576
|
+
/** Every bar of a long entry lights up with the one under the pointer. */
|
|
1577
|
+
const linkProps = item => ({
|
|
1578
|
+
onPointerEnter: event => {
|
|
1579
|
+
if (event.pointerType === "mouse") setLinkedItem(item.key);
|
|
1580
|
+
},
|
|
1581
|
+
onPointerLeave: () => {
|
|
1582
|
+
if (linkedItem() === item.key) setLinkedItem("");
|
|
1583
|
+
}
|
|
1584
|
+
});
|
|
1585
|
+
const grid = () => _$ssr(_tmpl$27, _$ssrAttribute("aria-label", _$escape(formatMonth(props.date, dateConfig()), true), false), _$ssrStyleProperty("grid-template-rows:", `auto repeat(${_$escape(weeks().length, true)}, minmax(5rem, 1fr))`) + _$ssrStyleProperty(";--k2b-calendar-lane:", "1.25rem") + _$ssrStyleProperty(";--k2b-calendar-lane-gap:", "0.125rem"), _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
1586
|
+
get when() {
|
|
1587
|
+
return props.owner.withWeekNumbers;
|
|
1588
|
+
},
|
|
1589
|
+
get children() {
|
|
1590
|
+
return _$ssr(_tmpl$26, _$escape(calendarMessages().weekShort));
|
|
1591
|
+
}
|
|
1592
|
+
})), _$escape(_$createComponent(For, {
|
|
1593
|
+
get each() {
|
|
1594
|
+
return weekdays();
|
|
1595
|
+
},
|
|
1596
|
+
children: (day, index) => _$ssr(_tmpl$28, _$ssrAttribute("data-weekend", index() > 4 ? "true" : _$escape(undefined, true), false), _$escape(day))
|
|
1597
|
+
})), _$escape(_$createComponent(For, {
|
|
1598
|
+
get each() {
|
|
1599
|
+
return weeks();
|
|
1600
|
+
},
|
|
1601
|
+
children: (week, weekIndex) => {
|
|
1602
|
+
const fit = createMemo(() => fitMonthWeek(weekLayouts()[weekIndex()] ?? {
|
|
1603
|
+
bars: [],
|
|
1604
|
+
singles: []
|
|
1605
|
+
}, capacities()[weekIndex()] ?? MONTH_DEFAULT_LANES));
|
|
1606
|
+
const weekHref = () => viewHref(week[0].key, "week");
|
|
1607
|
+
const weekNumber = () => zonedWeekNumber(week[0].day, dateConfig());
|
|
1608
|
+
return _$ssr(_tmpl$30, _$ssrAttribute("data-week-numbers", props.owner.withWeekNumbers ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
1609
|
+
get when() {
|
|
1610
|
+
return props.owner.withWeekNumbers;
|
|
1611
|
+
},
|
|
1612
|
+
get children() {
|
|
1613
|
+
return _$ssr(_tmpl$29, _$escape(_$createComponent(Show, {
|
|
1614
|
+
get when() {
|
|
1615
|
+
return weekHref();
|
|
1616
|
+
},
|
|
1617
|
+
get fallback() {
|
|
1618
|
+
return _$createComponent(Show, {
|
|
1619
|
+
get when() {
|
|
1620
|
+
return canOpenView("week");
|
|
1621
|
+
},
|
|
1622
|
+
get fallback() {
|
|
1623
|
+
return weekNumber();
|
|
1624
|
+
},
|
|
1625
|
+
get children() {
|
|
1626
|
+
return _$ssr(_tmpl$31, _$ssrAttribute("title", _$escape(calendarMessages().calendarOpenWeekNumber({
|
|
1627
|
+
week: weekNumber()
|
|
1628
|
+
}), true), false) + _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarOpenWeekNumber({
|
|
1629
|
+
week: weekNumber()
|
|
1630
|
+
}), true), false), _$escape(weekNumber()));
|
|
1631
|
+
}
|
|
1632
|
+
});
|
|
1633
|
+
},
|
|
1634
|
+
children: href => _$createComponent(CalendarNavigationLink, {
|
|
1635
|
+
get owner() {
|
|
1636
|
+
return props.owner;
|
|
1637
|
+
},
|
|
1638
|
+
get href() {
|
|
1639
|
+
return href();
|
|
1640
|
+
},
|
|
1641
|
+
get anchorProps() {
|
|
1642
|
+
return {
|
|
1643
|
+
class: "k2b-calendar-month__week-link",
|
|
1644
|
+
tabIndex: -1,
|
|
1645
|
+
title: calendarMessages().calendarOpenWeekNumber({
|
|
1646
|
+
week: weekNumber()
|
|
1647
|
+
}),
|
|
1648
|
+
"aria-label": calendarMessages().calendarOpenWeekNumber({
|
|
1649
|
+
week: weekNumber()
|
|
1650
|
+
})
|
|
1651
|
+
};
|
|
1652
|
+
},
|
|
1653
|
+
get children() {
|
|
1654
|
+
return weekNumber();
|
|
1655
|
+
}
|
|
1656
|
+
})
|
|
1657
|
+
})));
|
|
1658
|
+
}
|
|
1659
|
+
})), _$escape(_$createComponent(For, {
|
|
1660
|
+
each: week,
|
|
1661
|
+
children: ({
|
|
1662
|
+
day,
|
|
1663
|
+
key
|
|
1664
|
+
}, column) => {
|
|
1665
|
+
const dayBadge = props.owner.dayBadges?.[key];
|
|
1666
|
+
const sameMonth = calendar.isSameMonth(day, props.date, dateConfig());
|
|
1667
|
+
const label = dayLabel(day);
|
|
1668
|
+
const bars = createMemo(() => fit().bars.filter(bar => bar.startColumn === column()));
|
|
1669
|
+
const cell = () => fit().cells[column()] ?? {
|
|
1670
|
+
top: 0,
|
|
1671
|
+
shown: [],
|
|
1672
|
+
hidden: 0
|
|
1673
|
+
};
|
|
1674
|
+
return _$ssr(_tmpl$33, _$ssrAttribute("tabindex", rovingKey() === key ? 0 : -1, false) + _$ssrAttribute("aria-label", _$escape(label, true), false) + _$ssrAttribute("aria-selected", within(selection(), key) ? "true" : "false", false) + _$ssrAttribute("aria-current", key === todayKey() ? "date" : _$escape(undefined, true), false) + _$ssrAttribute("data-calendar-day-key", _$escape(key, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-weekend", column() > 4 ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-past", key < todayKey() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-selected", _$escape(selectionPart(key), true), false) + _$ssrAttribute("data-drop-preview", within(dropRange(), key) ? "true" : _$escape(undefined, true), false), _$ssrAttribute("data-today", key === todayKey() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", !sameMonth ? "true" : _$escape(undefined, true), false), _$escape(calendar.formatDayNumber(day, dateConfig())), _$escape(_$createComponent(Show, {
|
|
1675
|
+
when: dayBadge,
|
|
1676
|
+
children: badge => _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
|
|
1677
|
+
get when() {
|
|
1678
|
+
return badge().icon;
|
|
1679
|
+
},
|
|
1680
|
+
children: icon => _$ssr(_tmpl$10, `k2b-calendar-month__badge-icon ti ti-${_$escape(icon(), true)}`)
|
|
1681
|
+
})), _$escape(badge().label))
|
|
1682
|
+
})), _$escape(_$createComponent(For, {
|
|
1683
|
+
get each() {
|
|
1684
|
+
return bars();
|
|
1685
|
+
},
|
|
1686
|
+
children: bar => {
|
|
1687
|
+
const span = bar.endColumn - bar.startColumn + 1;
|
|
1688
|
+
const startHint = () => {
|
|
1689
|
+
if (!bar.continuesBefore) return undefined;
|
|
1690
|
+
const hint = calendarMessages().calendarContinuesFrom(hintDate(bar.item.firstKey));
|
|
1691
|
+
return hintFits(bar.item.event.title, hint, span) ? hint : undefined;
|
|
1692
|
+
};
|
|
1693
|
+
const endHint = () => {
|
|
1694
|
+
if (!bar.continuesAfter) return undefined;
|
|
1695
|
+
const hint = calendarMessages().calendarContinuesUntil(hintDate(bar.item.lastKey));
|
|
1696
|
+
return hintFits(`${bar.item.event.title}${startHint() ?? ""}`, hint, span) ? hint : undefined;
|
|
1697
|
+
};
|
|
1698
|
+
return _$ssrElement("div", _$mergeProps({
|
|
1699
|
+
"class": "k2b-calendar-month__segment",
|
|
1700
|
+
get style() {
|
|
1701
|
+
return {
|
|
1702
|
+
"--k2b-calendar-span": String(span),
|
|
1703
|
+
"--k2b-calendar-row": String(bar.lane)
|
|
1704
|
+
};
|
|
1705
|
+
},
|
|
1706
|
+
"data-bar": "true",
|
|
1707
|
+
get ["data-linked"]() {
|
|
1708
|
+
return linkedItem() === bar.item.key && bar.item.firstKey !== bar.item.lastKey ? "true" : undefined;
|
|
1709
|
+
},
|
|
1710
|
+
get ["data-continues-before"]() {
|
|
1711
|
+
return bar.continuesBefore ? "true" : undefined;
|
|
1712
|
+
},
|
|
1713
|
+
get ["data-continues-after"]() {
|
|
1714
|
+
return bar.continuesAfter ? "true" : undefined;
|
|
1715
|
+
}
|
|
1716
|
+
}, () => linkProps(bar.item)), _$escape(_$createComponent(EventChip, {
|
|
1717
|
+
get event() {
|
|
1718
|
+
return bar.item.event;
|
|
1719
|
+
},
|
|
1720
|
+
get owner() {
|
|
1721
|
+
return props.owner;
|
|
1722
|
+
},
|
|
1723
|
+
get href() {
|
|
1724
|
+
return eventHref(props.owner, bar.item.event);
|
|
1725
|
+
},
|
|
1726
|
+
get label() {
|
|
1727
|
+
return itemLabel(bar.item);
|
|
1728
|
+
},
|
|
1729
|
+
compact: true,
|
|
1730
|
+
bar: true,
|
|
1731
|
+
get continuesBefore() {
|
|
1732
|
+
return bar.continuesBefore;
|
|
1733
|
+
},
|
|
1734
|
+
get continuesAfter() {
|
|
1735
|
+
return bar.continuesAfter;
|
|
1736
|
+
},
|
|
1737
|
+
get hintStart() {
|
|
1738
|
+
return startHint();
|
|
1739
|
+
},
|
|
1740
|
+
get hintEnd() {
|
|
1741
|
+
return endHint();
|
|
1742
|
+
},
|
|
1743
|
+
get moving() {
|
|
1744
|
+
return movingEventId() === bar.item.event.id;
|
|
1745
|
+
},
|
|
1746
|
+
get onMovePointerDown() {
|
|
1747
|
+
return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, bar.item, markDragged) : undefined;
|
|
1748
|
+
}
|
|
1749
|
+
})), false);
|
|
1750
|
+
}
|
|
1751
|
+
})), _$escape(_$createComponent(For, {
|
|
1752
|
+
get each() {
|
|
1753
|
+
return cell().shown;
|
|
1754
|
+
},
|
|
1755
|
+
children: (item, index) => _$ssr(_tmpl$34, _$ssrStyleProperty("--k2b-calendar-span:", "1") + _$ssrStyleProperty(";--k2b-calendar-row:", _$escape(String(cell().top + index()), true)), _$escape(_$createComponent(EventChip, {
|
|
1756
|
+
get event() {
|
|
1757
|
+
return item.event;
|
|
1758
|
+
},
|
|
1759
|
+
get owner() {
|
|
1760
|
+
return props.owner;
|
|
1761
|
+
},
|
|
1762
|
+
get href() {
|
|
1763
|
+
return eventHref(props.owner, item.event);
|
|
1764
|
+
},
|
|
1765
|
+
compact: true,
|
|
1766
|
+
get leadingTime() {
|
|
1767
|
+
return leadingTime(item);
|
|
1768
|
+
},
|
|
1769
|
+
get moving() {
|
|
1770
|
+
return movingEventId() === item.event.id;
|
|
1771
|
+
},
|
|
1772
|
+
get onMovePointerDown() {
|
|
1773
|
+
return props.owner.onEventDrop ? (pointerEvent, markDragged) => startMove(pointerEvent, item, markDragged) : undefined;
|
|
1774
|
+
}
|
|
1775
|
+
})))
|
|
1776
|
+
})), _$escape(_$createComponent(Show, {
|
|
1777
|
+
get when() {
|
|
1778
|
+
return cell().hidden > 0;
|
|
1779
|
+
},
|
|
1780
|
+
get children() {
|
|
1781
|
+
return _$ssr(_tmpl$32, _$ssrStyleProperty("--k2b-calendar-row:", _$escape(String(cell().top + cell().shown.length), true)), _$ssrAttribute("aria-label", _$escape(calendarMessages().calendarMoreEventsOn({
|
|
1782
|
+
count: cell().hidden,
|
|
1783
|
+
label
|
|
1784
|
+
}), true), false), _$ssrAttribute("aria-expanded", (() => {
|
|
1785
|
+
const current = popover();
|
|
1786
|
+
return current?.kind === "day" && _$escape(current.dayKey, true) === _$escape(key, true);
|
|
1787
|
+
})(), false), _$escape(calendarMessages().calendarMoreEvents({
|
|
1788
|
+
count: cell().hidden
|
|
1789
|
+
})), _$escape(cell().hidden));
|
|
1790
|
+
}
|
|
1791
|
+
})));
|
|
1792
|
+
}
|
|
1793
|
+
})));
|
|
1794
|
+
}
|
|
1795
|
+
})));
|
|
1796
|
+
const dayList = dayKey => {
|
|
1797
|
+
const day = parseKey(dayKey);
|
|
1798
|
+
const href = viewHref(dayKey, "day");
|
|
1799
|
+
// Read where it renders, so a refresh while the list is open updates it as it does the grid.
|
|
1800
|
+
const entries = () => dayEntries(dayKey);
|
|
1801
|
+
return _$ssr(_tmpl$37, _$escape(dayLabel(day)), _$escape(_$createComponent(Show, {
|
|
1802
|
+
get when() {
|
|
1803
|
+
return entries().length > 0;
|
|
1804
|
+
},
|
|
1805
|
+
get fallback() {
|
|
1806
|
+
return _$ssr(_tmpl$38, _$escape(calendarMessages().calendarNothingPlanned));
|
|
1807
|
+
},
|
|
1808
|
+
get children() {
|
|
1809
|
+
return _$ssr(_tmpl$35, _$escape(_$createComponent(For, {
|
|
1810
|
+
get each() {
|
|
1811
|
+
return entries();
|
|
1812
|
+
},
|
|
1813
|
+
children: item => _$ssr(_tmpl$39, _$escape(_$createComponent(EventChip, {
|
|
1814
|
+
get event() {
|
|
1815
|
+
return item.event;
|
|
1816
|
+
},
|
|
1817
|
+
get owner() {
|
|
1818
|
+
return props.owner;
|
|
1819
|
+
},
|
|
1820
|
+
get href() {
|
|
1821
|
+
return eventHref(props.owner, item.event);
|
|
1822
|
+
},
|
|
1823
|
+
get label() {
|
|
1824
|
+
return itemLabel(item);
|
|
1825
|
+
},
|
|
1826
|
+
compact: true,
|
|
1827
|
+
get bar() {
|
|
1828
|
+
return item.bar;
|
|
1829
|
+
},
|
|
1830
|
+
get leadingTime() {
|
|
1831
|
+
return leadingTime(item);
|
|
1832
|
+
}
|
|
1833
|
+
})))
|
|
1834
|
+
})));
|
|
1835
|
+
}
|
|
1836
|
+
})), _$escape(_$createComponent(Show, {
|
|
1837
|
+
when: href,
|
|
1838
|
+
get fallback() {
|
|
1839
|
+
return _$createComponent(Show, {
|
|
1840
|
+
get when() {
|
|
1841
|
+
return canOpenView("day");
|
|
1842
|
+
},
|
|
1843
|
+
get children() {
|
|
1844
|
+
return _$createComponent(Button, {
|
|
1845
|
+
type: "button",
|
|
1846
|
+
variant: "ghost",
|
|
1847
|
+
size: "sm",
|
|
1848
|
+
onClick: () => openView(dayKey, "day"),
|
|
1849
|
+
get children() {
|
|
1850
|
+
return [_$ssr(_tmpl$40), calendarMessages().calendarOpenDay];
|
|
1851
|
+
}
|
|
1852
|
+
});
|
|
1853
|
+
}
|
|
1854
|
+
});
|
|
1855
|
+
},
|
|
1856
|
+
children: dayHref => _$createComponent(CalendarNavigationLink, {
|
|
1857
|
+
get owner() {
|
|
1858
|
+
return props.owner;
|
|
1859
|
+
},
|
|
1860
|
+
get href() {
|
|
1861
|
+
return dayHref();
|
|
1862
|
+
},
|
|
1863
|
+
anchorProps: {
|
|
1864
|
+
class: "k2b-button",
|
|
1865
|
+
"data-variant": "ghost",
|
|
1866
|
+
"data-size": "sm"
|
|
1867
|
+
},
|
|
1868
|
+
get children() {
|
|
1869
|
+
return [_$ssr(_tmpl$40), calendarMessages().calendarOpenDay];
|
|
1870
|
+
}
|
|
1871
|
+
})
|
|
1872
|
+
})), _$escape(_$createComponent(Show, {
|
|
1873
|
+
get when() {
|
|
1874
|
+
return props.owner.renderQuickCreate;
|
|
1875
|
+
},
|
|
1876
|
+
get children() {
|
|
1877
|
+
return _$createComponent(Button, {
|
|
1878
|
+
type: "button",
|
|
1879
|
+
variant: "ghost",
|
|
1880
|
+
size: "sm",
|
|
1881
|
+
onClick: () => {
|
|
1882
|
+
select(dayKey);
|
|
1883
|
+
openCreate({
|
|
1884
|
+
first: dayKey,
|
|
1885
|
+
last: dayKey
|
|
1886
|
+
}, {
|
|
1887
|
+
active: true
|
|
1888
|
+
});
|
|
1889
|
+
},
|
|
1890
|
+
get children() {
|
|
1891
|
+
return [_$ssr(_tmpl$36), calendarMessages().calendarNewEvent];
|
|
1892
|
+
}
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
})));
|
|
1896
|
+
};
|
|
1897
|
+
return [_$createComponent(Show, {
|
|
1898
|
+
get when() {
|
|
1899
|
+
return hasMenu();
|
|
1900
|
+
},
|
|
1901
|
+
get fallback() {
|
|
1902
|
+
return grid();
|
|
1903
|
+
},
|
|
1904
|
+
get children() {
|
|
1905
|
+
return _$createComponent(GestureMenu, {
|
|
1906
|
+
get items() {
|
|
1907
|
+
return menuItems();
|
|
1908
|
+
},
|
|
1909
|
+
get label() {
|
|
1910
|
+
return calendarMessages().calendarSelectionActions;
|
|
1911
|
+
},
|
|
1912
|
+
tabIndex: -1,
|
|
1913
|
+
onOpen: onMenuOpen,
|
|
1914
|
+
"class": "k2b-calendar-month-menu",
|
|
1915
|
+
get children() {
|
|
1916
|
+
return grid();
|
|
1917
|
+
}
|
|
1918
|
+
});
|
|
1919
|
+
}
|
|
1920
|
+
}), _$ssr(_tmpl$41, _$ssrAttribute("aria-label", (() => {
|
|
1921
|
+
const current = popover();
|
|
1922
|
+
if (current?.kind === "day") return dayLabel(parseKey(current.dayKey));
|
|
1923
|
+
return _$escape(calendarMessages().calendarQuickCreate, true);
|
|
1924
|
+
})(), false) + _$ssrAttribute("data-kind", _$escape(popover()?.kind, true), false) + _$ssrAttribute("data-quiet", popover()?.kind === "create" && !createActive() ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
1925
|
+
get when() {
|
|
1926
|
+
return popover();
|
|
1927
|
+
},
|
|
1928
|
+
keyed: true,
|
|
1929
|
+
children: value => value.kind === "create" ? props.owner.renderQuickCreate?.(rangeOf(value.range), {
|
|
1930
|
+
create: value.create,
|
|
1931
|
+
close: () => {
|
|
1932
|
+
if (popover() === value) closePopover();
|
|
1933
|
+
}
|
|
1934
|
+
}) : dayList(value.dayKey)
|
|
1935
|
+
})))];
|
|
1936
|
+
};
|
|
827
1937
|
const TimeGridView = props => {
|
|
828
|
-
const
|
|
1938
|
+
const calendarMessages = useCalendarMessages();
|
|
829
1939
|
const dateConfig = createMemo(() => ownerDateConfig(props.owner));
|
|
830
1940
|
const gridStartHour = () => props.owner.visibleStartHour ?? 0;
|
|
831
1941
|
const gridEndHour = () => props.owner.visibleEndHour ?? 23;
|
|
@@ -1035,7 +2145,7 @@ const TimeGridView = props => {
|
|
|
1035
2145
|
});
|
|
1036
2146
|
});
|
|
1037
2147
|
});
|
|
1038
|
-
return _$ssr(_tmpl$
|
|
2148
|
+
return _$ssr(_tmpl$43, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`), _$escape(_$createComponent(For, {
|
|
1039
2149
|
get each() {
|
|
1040
2150
|
return props.days;
|
|
1041
2151
|
},
|
|
@@ -1053,13 +2163,13 @@ const TimeGridView = props => {
|
|
|
1053
2163
|
class: "k2b-calendar-time-grid__day"
|
|
1054
2164
|
},
|
|
1055
2165
|
get children() {
|
|
1056
|
-
return [_$ssr(_tmpl$
|
|
2166
|
+
return [_$ssr(_tmpl$44, _$ssrAttribute("data-today", today() ? "true" : _$escape(undefined, true), false), _$escape(formatDay(day, dateConfig()))), _$createComponent(Show, {
|
|
1057
2167
|
when: dayBadge,
|
|
1058
|
-
children: badge => _$ssr(_tmpl$
|
|
2168
|
+
children: badge => _$ssr(_tmpl$45, _$escape(_$createComponent(Show, {
|
|
1059
2169
|
get when() {
|
|
1060
2170
|
return badge().icon;
|
|
1061
2171
|
},
|
|
1062
|
-
children: icon => _$ssr(_tmpl$
|
|
2172
|
+
children: icon => _$ssr(_tmpl$10, `k2b-calendar-time-grid__badge-icon ti ti-${_$escape(icon(), true)}`)
|
|
1063
2173
|
})), _$escape(badge().label))
|
|
1064
2174
|
})];
|
|
1065
2175
|
}
|
|
@@ -1070,7 +2180,7 @@ const TimeGridView = props => {
|
|
|
1070
2180
|
return !props.owner.hideAllDay;
|
|
1071
2181
|
},
|
|
1072
2182
|
get children() {
|
|
1073
|
-
return _$ssr(_tmpl$
|
|
2183
|
+
return _$ssr(_tmpl$42, _$ssrStyleProperty("grid-template-columns:", `4rem repeat(${_$escape(props.days.length, true)}, minmax(0, 1fr))`) + _$ssrStyleProperty(";max-height:", `${_$escape(props.owner.allDayMaxHeightRem ?? 7, true)}rem`), _$escape(props.labels.allDay), _$escape(_$createComponent(For, {
|
|
1074
2184
|
get each() {
|
|
1075
2185
|
return props.days;
|
|
1076
2186
|
},
|
|
@@ -1094,9 +2204,9 @@ const TimeGridView = props => {
|
|
|
1094
2204
|
end: calendar.addDays(start, 1, dateConfig()),
|
|
1095
2205
|
allDay: true
|
|
1096
2206
|
};
|
|
1097
|
-
}, () => performance.now() < suppressSlotClickUntil)), _$ssr(_tmpl$
|
|
2207
|
+
}, () => performance.now() < suppressSlotClickUntil)), _$ssr(_tmpl$46, _$escape(_$createComponent(For, {
|
|
1098
2208
|
each: previewAllDay,
|
|
1099
|
-
children: event => _$ssr(_tmpl$
|
|
2209
|
+
children: event => _$ssr(_tmpl$21, _$escape(event.title))
|
|
1100
2210
|
})), _$escape(_$createComponent(For, {
|
|
1101
2211
|
get each() {
|
|
1102
2212
|
return allDay();
|
|
@@ -1125,7 +2235,7 @@ const TimeGridView = props => {
|
|
|
1125
2235
|
get each() {
|
|
1126
2236
|
return hours();
|
|
1127
2237
|
},
|
|
1128
|
-
children: hour => _$ssr(_tmpl$
|
|
2238
|
+
children: hour => _$ssr(_tmpl$47, _$ssrAttribute("data-outside-business", hour < businessStartHour() || hour > businessEndHour() ? "true" : _$escape(undefined, true), false), _$escape(`${hour}`.padStart(2, "0")))
|
|
1129
2239
|
})), _$escape(_$createComponent(For, {
|
|
1130
2240
|
get each() {
|
|
1131
2241
|
return props.days;
|
|
@@ -1133,12 +2243,12 @@ const TimeGridView = props => {
|
|
|
1133
2243
|
children: day => {
|
|
1134
2244
|
const dayKey = calendar.formatDateKey(day, dateConfig());
|
|
1135
2245
|
const layouts = createMemo(() => timedEventLayouts(eventsByDay().get(dayKey)?.timed ?? []));
|
|
1136
|
-
return _$ssr(_tmpl$
|
|
2246
|
+
return _$ssr(_tmpl$49, _$ssrStyleProperty("min-width:", _$escape(dayColumnMinWidth(layouts()), true)) + _$ssrStyleProperty(";grid-template-rows:", `repeat(${_$escape(hours().length, true)}, minmax(4rem, 1fr))`), _$escape(_$createComponent(Show, {
|
|
1137
2247
|
get when() {
|
|
1138
2248
|
return currentTimeLine(day) !== null;
|
|
1139
2249
|
},
|
|
1140
2250
|
get children() {
|
|
1141
|
-
return _$ssr(_tmpl$
|
|
2251
|
+
return _$ssr(_tmpl$48, _$ssrStyleProperty("top:", `${_$escape(currentTimeLine(day) ?? 0, true)}%`));
|
|
1142
2252
|
}
|
|
1143
2253
|
})), _$escape(_$createComponent(For, {
|
|
1144
2254
|
get each() {
|
|
@@ -1167,12 +2277,12 @@ const TimeGridView = props => {
|
|
|
1167
2277
|
children: event => {
|
|
1168
2278
|
const layout = eventLayout(event);
|
|
1169
2279
|
const short = event.endDate.getTime() - event.startDate.getTime() < 60 * 60_000;
|
|
1170
|
-
return _$ssr(_tmpl$
|
|
2280
|
+
return _$ssr(_tmpl$51, _$ssrAttribute("data-short", short ? "true" : _$escape(undefined, true), false), _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$escape(_$createComponent(Show, {
|
|
1171
2281
|
get when() {
|
|
1172
2282
|
return event.title;
|
|
1173
2283
|
},
|
|
1174
2284
|
get children() {
|
|
1175
|
-
return _$ssr(_tmpl$
|
|
2285
|
+
return _$ssr(_tmpl$50, _$escape(event.title));
|
|
1176
2286
|
}
|
|
1177
2287
|
})), _$escape(formatTime(event.startDate, dateConfig())), _$escape(formatTime(event.endDate, dateConfig())));
|
|
1178
2288
|
}
|
|
@@ -1218,7 +2328,7 @@ const TimeGridView = props => {
|
|
|
1218
2328
|
onCancel: clearInteraction
|
|
1219
2329
|
});
|
|
1220
2330
|
};
|
|
1221
|
-
return _$ssr(_tmpl$
|
|
2331
|
+
return _$ssr(_tmpl$53, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`) + _$ssrStyleProperty(";left:", _$escape(position.left, true)) + _$ssrStyleProperty(";width:", _$escape(position.width, true)) + _$ssrStyleProperty(";z-index:", _$escape(String(20 + layoutItem.lane), true)), _$escape(_$createComponent(EventChip, {
|
|
1222
2332
|
event: event,
|
|
1223
2333
|
get owner() {
|
|
1224
2334
|
return props.owner;
|
|
@@ -1238,7 +2348,7 @@ const TimeGridView = props => {
|
|
|
1238
2348
|
return props.owner.onEventResize;
|
|
1239
2349
|
},
|
|
1240
2350
|
get children() {
|
|
1241
|
-
return _$ssr(_tmpl$
|
|
2351
|
+
return _$ssr(_tmpl$52, _$ssrAttribute("aria-label", _$escape(calendarMessages().resizeEvent, true), false));
|
|
1242
2352
|
}
|
|
1243
2353
|
})));
|
|
1244
2354
|
}
|
|
@@ -1250,14 +2360,14 @@ const TimeGridView = props => {
|
|
|
1250
2360
|
const layout = timeRangeLayout(overflow.groupStartDate, overflow.groupEndDate);
|
|
1251
2361
|
const key = `${dayKey}-${overflow.groupId}`;
|
|
1252
2362
|
const hiddenTitle = () => overflow.hiddenEvents.map(event => `${formatTime(event.startDate, dateConfig())} ${event.title}`).join("\n");
|
|
1253
|
-
return [_$ssr(_tmpl$
|
|
2363
|
+
return [_$ssr(_tmpl$54, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`) + _$ssrStyleProperty(";height:", `${_$escape(layout.height, true)}%`), _$ssrAttribute("title", _$escape(hiddenTitle(), true), false) + _$ssrAttribute("aria-label", _$escape(calendarMessages().hiddenOverlappingEvents({
|
|
1254
2364
|
count: overflow.hiddenEvents.length
|
|
1255
2365
|
}), true), false), _$escape(overflow.hiddenEvents.length)), _$createComponent(Show, {
|
|
1256
2366
|
get when() {
|
|
1257
2367
|
return expandedOverflow() === key;
|
|
1258
2368
|
},
|
|
1259
2369
|
get children() {
|
|
1260
|
-
return _$ssr(_tmpl$
|
|
2370
|
+
return _$ssr(_tmpl$55, _$ssrStyleProperty("top:", `${_$escape(layout.top, true)}%`), _$escape(formatTime(overflow.groupStartDate, dateConfig())), _$escape(formatTime(overflow.groupEndDate, dateConfig())), _$escape(_$createComponent(For, {
|
|
1261
2371
|
get each() {
|
|
1262
2372
|
return overflow.hiddenEvents;
|
|
1263
2373
|
},
|
|
@@ -1316,11 +2426,11 @@ const YearView = props => {
|
|
|
1316
2426
|
};
|
|
1317
2427
|
});
|
|
1318
2428
|
});
|
|
1319
|
-
return _$ssr(_tmpl$
|
|
2429
|
+
return _$ssr(_tmpl$56, _$escape(_$createComponent(For, {
|
|
1320
2430
|
get each() {
|
|
1321
2431
|
return months();
|
|
1322
2432
|
},
|
|
1323
|
-
children: month => _$ssr(_tmpl$
|
|
2433
|
+
children: month => _$ssr(_tmpl$57, _$escape(month.label), _$escape(_$createComponent(For, {
|
|
1324
2434
|
get each() {
|
|
1325
2435
|
return month.days;
|
|
1326
2436
|
},
|
|
@@ -1343,7 +2453,7 @@ const YearView = props => {
|
|
|
1343
2453
|
get when() {
|
|
1344
2454
|
return day.events[0];
|
|
1345
2455
|
},
|
|
1346
|
-
children: event => _$ssr(_tmpl$
|
|
2456
|
+
children: event => _$ssr(_tmpl$58, _$ssrAttribute("data-color", event().colorHex ? _$escape(undefined, true) : _$escape(event().color ?? "blue", true), false) + _$ssrAttribute("data-today", day.isToday ? "true" : _$escape(undefined, true), false), _$ssrStyle(event().colorHex ? {
|
|
1347
2457
|
"background-color": day.isToday ? "white" : event().colorHex
|
|
1348
2458
|
} : undefined))
|
|
1349
2459
|
})];
|
|
@@ -1356,7 +2466,7 @@ const MobileMonthView = props => {
|
|
|
1356
2466
|
const dateConfig = createMemo(() => ownerDateConfig(props.owner));
|
|
1357
2467
|
const selectedDateKey = createMemo(() => calendar.formatDateKey(props.selectedDate, dateConfig()));
|
|
1358
2468
|
const selectedEvents = createMemo(() => props.events.filter(event => event.dayKey === selectedDateKey()));
|
|
1359
|
-
return _$ssr(_tmpl$
|
|
2469
|
+
return _$ssr(_tmpl$60, _$escape(_$createComponent(MonthPickerView, {
|
|
1360
2470
|
get owner() {
|
|
1361
2471
|
return {
|
|
1362
2472
|
...props.owner,
|
|
@@ -1386,10 +2496,10 @@ const MobileMonthView = props => {
|
|
|
1386
2496
|
return selectedEvents().length > 0;
|
|
1387
2497
|
},
|
|
1388
2498
|
get fallback() {
|
|
1389
|
-
return _$ssr(_tmpl$
|
|
2499
|
+
return _$ssr(_tmpl$61, _$escape(props.labels.noEvents));
|
|
1390
2500
|
},
|
|
1391
2501
|
get children() {
|
|
1392
|
-
return _$ssr(_tmpl$
|
|
2502
|
+
return _$ssr(_tmpl$59, _$escape(_$createComponent(For, {
|
|
1393
2503
|
get each() {
|
|
1394
2504
|
return selectedEvents();
|
|
1395
2505
|
},
|
|
@@ -1406,9 +2516,10 @@ const MobileMonthView = props => {
|
|
|
1406
2516
|
}
|
|
1407
2517
|
})));
|
|
1408
2518
|
};
|
|
1409
|
-
const CalendarBody = props => _$ssr(_tmpl$
|
|
2519
|
+
const CalendarBody = props => _$ssr(_tmpl$62, _$escape(props.children));
|
|
1410
2520
|
const CalendarRoot = props => {
|
|
1411
2521
|
const messages = useUiMessages();
|
|
2522
|
+
const calendarMessages = useCalendarMessages();
|
|
1412
2523
|
// Subviews derive their date config from the owner props, so the inherited
|
|
1413
2524
|
// render locale is merged here once; an explicit dateConfig.locale wins.
|
|
1414
2525
|
const localizedConfig = useDateConfigLocale(() => props.dateConfig);
|
|
@@ -1427,6 +2538,8 @@ const CalendarRoot = props => {
|
|
|
1427
2538
|
const date = createMemo(() => safeDate(props.date));
|
|
1428
2539
|
const selectedDate = createMemo(() => safeDate(props.selectedDate ?? props.date));
|
|
1429
2540
|
const [now, setNow] = createSignal(new Date());
|
|
2541
|
+
/** The first day selected in the month view, so the view switcher opens the other views at it. */
|
|
2542
|
+
const [focusDay, setFocusDay] = createSignal(null);
|
|
1430
2543
|
const normalizedEvents = createMemo(() => normalizeEvents(props.events, dateConfig()));
|
|
1431
2544
|
const mergedLabels = createMemo(() => ({
|
|
1432
2545
|
today: messages().today,
|
|
@@ -1435,7 +2548,7 @@ const CalendarRoot = props => {
|
|
|
1435
2548
|
month: messages().month,
|
|
1436
2549
|
year: messages().year,
|
|
1437
2550
|
allDay: messages().allDay,
|
|
1438
|
-
noEvents:
|
|
2551
|
+
noEvents: calendarMessages().noEvents,
|
|
1439
2552
|
previous: messages().previous,
|
|
1440
2553
|
next: messages().next,
|
|
1441
2554
|
...props.labels
|
|
@@ -1453,7 +2566,7 @@ const CalendarRoot = props => {
|
|
|
1453
2566
|
document.removeEventListener("visibilitychange", updateNow);
|
|
1454
2567
|
});
|
|
1455
2568
|
});
|
|
1456
|
-
return _$ssr(_tmpl$
|
|
2569
|
+
return _$ssr(_tmpl$63, `k2b-content-calendar ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-busy", props.navigationPending ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(CalendarHeader, {
|
|
1457
2570
|
get date() {
|
|
1458
2571
|
return date();
|
|
1459
2572
|
},
|
|
@@ -1463,8 +2576,11 @@ const CalendarRoot = props => {
|
|
|
1463
2576
|
get labels() {
|
|
1464
2577
|
return mergedLabels();
|
|
1465
2578
|
},
|
|
1466
|
-
owner: owner
|
|
1467
|
-
|
|
2579
|
+
owner: owner,
|
|
2580
|
+
get focusDay() {
|
|
2581
|
+
return _$memo(() => view() === "month")() ? focusDay() : null;
|
|
2582
|
+
}
|
|
2583
|
+
})), _$escape(_$createComponent(Show, {
|
|
1468
2584
|
get when() {
|
|
1469
2585
|
return !custom();
|
|
1470
2586
|
},
|
|
@@ -1496,7 +2612,8 @@ const CalendarRoot = props => {
|
|
|
1496
2612
|
},
|
|
1497
2613
|
get labels() {
|
|
1498
2614
|
return mergedLabels();
|
|
1499
|
-
}
|
|
2615
|
+
},
|
|
2616
|
+
onFocusDay: setFocusDay
|
|
1500
2617
|
});
|
|
1501
2618
|
}
|
|
1502
2619
|
});
|