@k2b/ui 0.21.0 → 0.23.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/ContextMenu.js +3 -1
- package/dist/browser/actions/ContextMenu.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/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 +1096 -1060
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +1187 -0
- package/dist/browser/content/CalendarDayView.js.map +1 -0
- package/dist/browser/content/CalendarWeekView.js +1571 -0
- package/dist/browser/content/CalendarWeekView.js.map +1 -0
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +185 -85
- 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 +93 -34
- 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 +238 -201
- 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-day-scroll.js +98 -0
- package/dist/browser/content/calendar-day-scroll.js.map +1 -0
- package/dist/browser/content/calendar-days.js +408 -0
- package/dist/browser/content/calendar-days.js.map +1 -0
- package/dist/browser/content/calendar-dialogs.js +236 -0
- package/dist/browser/content/calendar-dialogs.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +249 -3
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +19 -6
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +328 -0
- package/dist/browser/content/calendar-shared.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +1649 -0
- package/dist/browser/content/calendar-time-view.js.map +1 -0
- package/dist/browser/content/chart-messages.js +146 -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 -2
- package/dist/browser/inputs/Combobox.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/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 +6 -1155
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +594 -425
- 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 +373 -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 +821 -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/StatCell.js +18 -6
- package/dist/browser/surfaces/StatCell.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/ContextMenu.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/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 +534 -346
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +800 -0
- package/dist/ssr/content/CalendarDayView.js.map +1 -0
- package/dist/ssr/content/CalendarWeekView.js +1069 -0
- package/dist/ssr/content/CalendarWeekView.js.map +1 -0
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +98 -37
- 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 +52 -8
- 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 +77 -53
- 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-day-scroll.js +98 -0
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-days.js +408 -0
- package/dist/ssr/content/calendar-days.js.map +1 -0
- package/dist/ssr/content/calendar-dialogs.js +159 -0
- package/dist/ssr/content/calendar-dialogs.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +249 -3
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +19 -6
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +261 -0
- package/dist/ssr/content/calendar-shared.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +1306 -0
- package/dist/ssr/content/calendar-time-view.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +146 -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/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/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 +6 -1155
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +219 -103
- 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 +256 -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 +821 -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/StatCell.js +2 -2
- package/dist/ssr/surfaces/StatCell.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/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 +91 -0
- package/dist/types/content/CalendarDayView.d.ts +7 -0
- package/dist/types/content/CalendarWeekView.d.ts +7 -0
- package/dist/types/content/ChartExplorer.d.ts +36 -1
- package/dist/types/content/ChartFilterControls.d.ts +6 -1
- package/dist/types/content/DataTable.d.ts +7 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-day-scroll.d.ts +42 -0
- package/dist/types/content/calendar-days.d.ts +192 -0
- package/dist/types/content/calendar-dialogs.d.ts +22 -0
- package/dist/types/content/calendar-messages.d.ts +119 -1
- package/dist/types/content/calendar-pointer.d.ts +9 -0
- package/dist/types/content/calendar-shared.d.ts +69 -0
- package/dist/types/content/calendar-time-view.d.ts +252 -0
- package/dist/types/content/chart-messages.d.ts +37 -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 +2 -2
- 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/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 +3 -544
- package/dist/types/layout/AppWorkspace.d.ts +42 -5
- package/dist/types/layout/PageTitle.d.ts +65 -0
- package/dist/types/layout/app-workspace-controller.d.ts +12 -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/StatCell.d.ts +5 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/Timeline.tsx"],"sourcesContent":["import type { DateContext } from \"@k2b/stdlib\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n Index,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dynamic, isServer } from \"solid-js/web\";\nimport Dropdown, { type DropdownItem } from \"../actions/Dropdown\";\nimport { announce } from \"../feedback/announce\";\nimport { useDateConfigLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n buildTimelineModel,\n parseTimelineTime,\n spanCss,\n spanPx,\n type TimelineEntry,\n type TimelineGroup,\n type TimelineItem,\n type TimelineItemEntry,\n type TimelineModel,\n type TimelineMoreEntry,\n type TimelineUnits,\n timelineDayKey,\n timelineHourOf,\n} from \"./timeline-model\";\n\nexport type { TimelineColor, TimelineItem } from \"./timeline-model\";\n\nexport type TimelineController = {\n /** Scrolls a time into view; `start` (default) puts it near the start edge, `center` in the middle. */\n scrollToTime: (time: Date | string, options?: { align?: \"start\" | \"center\" }) => void;\n /** Scrolls the current time to the middle of the view. */\n scrollToNow: () => void;\n};\n\nexport type TimelineProps = {\n items: readonly TimelineItem[];\n /** Start of the loaded range. The view starts here, so pass the first time the reader should see. */\n from: Date | string;\n /** End of the loaded range (exclusive). */\n to: Date | string;\n /** The current time. Without it the timeline uses the clock and moves the now line every 30 seconds. */\n now?: Date | string;\n /** Accessible name of the region. Defaults to \"Timeline\". */\n label?: string;\n /** stdlib date context: time zone and locale of days, hours, and folds. */\n dateConfig?: DateContext;\n /** Convenience override for `dateConfig.timeZone`. */\n timeZone?: string;\n /** Level of the per-day headings. Defaults to 3. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Opens an item, on click, Enter, or Space. */\n onActivate?: (item: TimelineItem) => void;\n /** Changes the checkbox of an item, on a click on the box or Space. Leave it out when the reader may not change it. */\n onToggle?: (item: TimelineItem, checked: boolean) => void;\n /**\n * Called once when the reader nears the start, again once `from` moved and changed the strip's length. Extend `from`\n * to load earlier days.\n */\n onLoadEarlier?: () => unknown;\n /** Called once when the reader nears the end, again once `to` moved and changed the strip's length. Extend `to` to load later days. */\n onLoadLater?: () => unknown;\n /** Marks the region busy, for example while a range loads. */\n busy?: boolean;\n controller?: (controller: TimelineController) => void;\n class?: string;\n};\n\ntype Axis = \"horizontal\" | \"vertical\";\n\n/** Unit sizes of the horizontal axis, as in the stylesheet; the server and the first render use them. */\nconst HORIZONTAL_UNITS: TimelineUnits = [54, 48, 160, 0, 0];\n/** How far beyond the visible area the first render reaches, in pixels. */\nconst INITIAL_REACH = 3200;\n/** A scroll rests once this many frames passed without a scroll event and no finger is down. */\nconst REST_FRAMES = 8;\n/** A pause between wheel events that starts a new gesture. */\nconst GESTURE_GAP_MS = 150;\n/** Wheel steps from this size on, such as a mouse wheel's notches, glide; smaller ones, such as a trackpad's, apply at once. */\nconst GLIDE_FROM = 50;\nconst COLOR_TOKENS = new Set([\"blue\", \"emerald\", \"amber\", \"red\", \"violet\", \"cyan\", \"zinc\"]);\nconst HEX_COLOR = /^#[0-9a-f]{3,8}$/i;\n\nconst reducedMotion = () => typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst colorAttributes = (color: string | undefined) =>\n color && HEX_COLOR.test(color)\n ? { token: undefined, accent: color }\n : { token: color && COLOR_TOKENS.has(color) ? color : \"blue\", accent: undefined };\n\nconst isAllDay = (entry: TimelineEntry) => entry.kind === \"all-day\" || (entry.kind === \"more\" && entry.area === \"all-day\");\nconst asItem = (entry: TimelineEntry): TimelineItemEntry | undefined => (entry.kind === \"more\" ? undefined : entry);\nconst asMore = (entry: TimelineEntry): TimelineMoreEntry | undefined => (entry.kind === \"more\" ? entry : undefined);\n\n/** The nearest ancestor that scrolls vertically, the page included. */\nconst verticalScroller = (from: Element): Element | undefined => {\n for (let element = from.parentElement; element; element = element.parentElement) {\n if (element.scrollHeight <= element.clientHeight + 1) continue;\n const overflow = getComputedStyle(element).overflowY;\n if (overflow === \"auto\" || overflow === \"scroll\" || element === document.scrollingElement) return element;\n }\n const root = document.scrollingElement;\n return root && root.scrollHeight > root.clientHeight + 1 ? root : undefined;\n};\n\n/**\n * A continuous filmstrip of time: waking hours are proportional, nights and empty days fold, overlapping bands share\n * lanes. Wide containers show it horizontally, narrow ones vertically; both use the same model.\n */\nexport default function Timeline(props: TimelineProps): JSX.Element {\n const messages = useUiMessages();\n const context = useDateConfigLocale(() => ({ ...props.dateConfig, timeZone: props.timeZone ?? props.dateConfig?.timeZone }));\n const baseId = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const [clock, setClock] = createSignal(Date.now());\n const now = createMemo(() => {\n const fixed = parseTimelineTime(props.now, context());\n return Number.isFinite(fixed) ? fixed : clock();\n });\n const today = createMemo(() => timelineDayKey(now(), context()));\n const latest = createMemo<TimelineModel>(() =>\n buildTimelineModel({\n from: parseTimelineTime(props.from, context()),\n to: parseTimelineTime(props.to, context()),\n today: today(),\n items: props.items,\n context: context(),\n }),\n );\n /** The model on screen: the latest one, unless that one waits for the reader's scroll to rest (see `resting`). */\n const [model, setModel] = createSignal<TimelineModel>(untrack(latest));\n const groupsByKey = createMemo(() => new Map(model().groups.map((group) => [group.key, group])));\n\n // Formatting.\n const locale = () => context().locale ?? \"en\";\n const timeFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\", timeZone: context().timeZone }),\n );\n const formatTime = (time: number) => timeFormat().format(time);\n const dayFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { weekday: \"short\", day: \"numeric\", month: \"short\", timeZone: context().timeZone }),\n );\n const longDayFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { weekday: \"long\", day: \"numeric\", month: \"long\", timeZone: context().timeZone }),\n );\n const hoursFormat = createMemo(\n () => new Intl.NumberFormat(locale(), { style: \"unit\", unit: \"hour\", unitDisplay: \"short\", maximumFractionDigits: 1 }),\n );\n const noonOf = (key: string) => new Date(timelineHourOf(key, 12, context()));\n const dayRange = (first: string, last: string, format: Intl.DateTimeFormat) =>\n first === last ? format.format(noonOf(first)) : `${format.format(noonOf(first))} – ${format.format(noonOf(last))}`;\n const nightLabel = createMemo(() => {\n const format = new Intl.DateTimeFormat(locale(), { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\", timeZone: \"UTC\" });\n return messages().timelineNight({ start: format.format(Date.UTC(2000, 0, 1, 22)), end: format.format(Date.UTC(2000, 0, 1, 6)) });\n });\n const spoken = (entry: TimelineItemEntry): string => {\n const item = entry.item;\n const parts = [item.label];\n if (entry.kind === \"all-day\") parts.push(messages().allDay);\n else if (entry.end > entry.start)\n parts.push(messages().timelineTimeRange({ start: formatTime(entry.start), end: formatTime(entry.end) }));\n else parts.push(formatTime(entry.start));\n if (item.detail) parts.push(item.detail);\n parts.push(\n entry.kind === \"all-day\" ? dayRange(entry.firstKey, entry.lastKey, longDayFormat()) : longDayFormat().format(new Date(entry.start)),\n );\n if (item.checked !== undefined) parts.push(item.checked ? messages().timelineDone : messages().timelineOpen);\n return parts.join(\", \");\n };\n /** When an item happens, for a \"+n\" menu row. */\n const when = (entry: TimelineItemEntry): string => {\n if (entry.kind === \"all-day\") return `${messages().allDay}, ${dayRange(entry.firstKey, entry.lastKey, dayFormat())}`;\n return entry.end > entry.start ? `${formatTime(entry.start)}–${formatTime(entry.end)}` : formatTime(entry.start);\n };\n const isPast = (entry: TimelineEntry): boolean => {\n if (entry.kind === \"more\") return entry.hidden.every(isPast);\n if (entry.kind === \"all-day\") return entry.lastKey < today();\n return entry.end <= now();\n };\n\n // Layout of the axis the stylesheet chose, read from the viewport.\n let root: HTMLElement | undefined;\n let viewport: HTMLDivElement | undefined;\n let track: HTMLDivElement | undefined;\n const [layout, setLayout] = createSignal<{ axis: Axis; units: TimelineUnits }>({ axis: \"horizontal\", units: HORIZONTAL_UNITS });\n const readLayout = () => {\n if (!viewport) return layout();\n const style = getComputedStyle(viewport);\n const unit = (name: string) => Number.parseFloat(style.getPropertyValue(`--k2b-timeline-${name}`)) || 0;\n const units: TimelineUnits = [unit(\"hour\"), unit(\"night\"), unit(\"fold\"), unit(\"head\"), unit(\"row\")];\n return {\n axis: style.getPropertyValue(\"--k2b-timeline-axis\").trim() === \"vertical\" ? (\"vertical\" as const) : (\"horizontal\" as const),\n units: units.some((value) => value > 0) ? units : HORIZONTAL_UNITS,\n };\n };\n const px = (time: number) => spanPx(model().posOf(time), layout().units);\n\n /** The visible part of the track in its own pixels, clipped by the viewport and the window. */\n const visible = (): [number, number] => {\n if (!viewport || !track) return [0, INITIAL_REACH];\n const port = viewport.getBoundingClientRect();\n const box = track.getBoundingClientRect();\n const [portStart, portEnd, boxStart, limit] =\n layout().axis === \"horizontal\"\n ? [port.left, port.right, box.left, window.innerWidth]\n : [port.top, port.bottom, box.top, window.innerHeight];\n const start = Math.max(portStart, 0) - boxStart;\n return [start, Math.max(start, Math.min(portEnd, limit) - boxStart)];\n };\n const scrollBy = (distance: number, behavior: ScrollBehavior = \"instant\") => {\n // In device pixels: positions are sums of unit sizes, and an engine that cuts 4671.9999 to 4671 would move the view.\n const delta = Math.round(distance * window.devicePixelRatio) / window.devicePixelRatio;\n if (!viewport || Math.abs(delta) < 0.5) return;\n const horizontal = layout().axis === \"horizontal\";\n const scrollable = horizontal ? viewport.scrollWidth > viewport.clientWidth : viewport.scrollHeight > viewport.clientHeight;\n if (scrollable) viewport.scrollBy({ [horizontal ? \"left\" : \"top\"]: delta, behavior });\n else if (!horizontal) verticalScroller(viewport)?.scrollBy({ top: delta, behavior });\n };\n\n // Bounded rendering: groups whose reach meets the visible time range, widened by a screen, plus the focused group.\n const [range, setRange] = createSignal<[number, number]>();\n const shownRange = (): [number, number] => range() ?? [Number.NEGATIVE_INFINITY, model().timeAt(INITIAL_REACH, HORIZONTAL_UNITS)];\n const [active, setActive] = createSignal<string>();\n /** The item happening now or next. */\n const current = () => {\n const { order, entries } = model();\n return order.find((id) => {\n const entry = entries.get(id)!;\n return !isAllDay(entry) && entry.end >= now();\n });\n };\n const defaultActive = createMemo(() => current() ?? model().order.at(-1));\n const activeId = () => {\n const id = active();\n return id !== undefined && model().entries.has(id) ? id : defaultActive();\n };\n const renderedKeys = createMemo(() => {\n const [low, high] = shownRange();\n const focusGroup = model().entries.get(activeId() ?? \"\")?.group;\n return model()\n .groups.filter((group) => group.index === focusGroup || (group.reach[1] >= low && group.reach[0] <= high))\n .map((group) => group.key);\n });\n\n // Reading position: the time at the start edge stays in place when days load or the axis changes.\n /** The time at the start edge after the last refresh, for an axis change. */\n let edgeTime: number | undefined;\n /**\n * The time to hold in place. A load at the start spreads a leading night or fold over other times, so where the start\n * edge lies in one, the end of that segment holds instead, and with it everything after.\n */\n const anchorAt = (built: TimelineModel, start: number, units: TimelineUnits) => {\n const time = built.timeAt(start, units);\n const first = built.segments.find((segment) => segment.t1 > segment.t0);\n return first && first.kind !== \"wake\" && time < first.t1 ? first.t1 : time;\n };\n /** How far what the reader sees moves from one model to the next. */\n const shiftOf = (before: TimelineModel, after: TimelineModel) => {\n const { units } = layout();\n const time = anchorAt(before, visible()[0], units);\n return spanPx(after.posOf(time), units) - spanPx(before.posOf(time), units);\n };\n /**\n * Where each end of the range was, and how long the strip was, when that end was last asked for. An end is asked\n * again only once the range moved there and the strip's length changed: days that fold into the fold at that end\n * leave the reader where they were, and asking again would load an empty calendar week after week on its own.\n */\n let requestedFrom: { at: number; length: number } | undefined;\n let requestedTo: { at: number; length: number } | undefined;\n let pendingEarlier = false;\n let pendingLater = false;\n const loadEdge = (edge: \"earlier\" | \"later\") => {\n const load = edge === \"earlier\" ? props.onLoadEarlier : props.onLoadLater;\n if (!load) return;\n const settle = () => {\n if (edge === \"earlier\") pendingEarlier = false;\n else pendingLater = false;\n queueMicrotask(refresh);\n };\n if (edge === \"earlier\") pendingEarlier = true;\n else pendingLater = true;\n Promise.resolve().then(load).then(settle, settle);\n };\n const refresh = () => {\n if (!viewport) return;\n const built = model();\n const { units } = layout();\n const [start, end] = visible();\n const reach = Math.max(end - start, 600);\n edgeTime = built.timeAt(start, units);\n const [low, high] = range() ?? [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY];\n if (built.timeAt(start - reach / 2, units) < low || built.timeAt(end + reach / 2, units) > high)\n setRange([built.timeAt(start - reach, units), built.timeAt(end + reach, units)]);\n const length = spanPx(built.total, units);\n const due = (requested: { at: number; length: number } | undefined, at: number) =>\n requested === undefined || (requested.at !== at && requested.length !== length);\n if (start > reach) requestedFrom = undefined;\n else if (!pendingEarlier && due(requestedFrom, built.from)) {\n requestedFrom = { at: built.from, length };\n loadEdge(\"earlier\");\n }\n if (end < length - reach) requestedTo = undefined;\n else if (!pendingLater && due(requestedTo, built.to)) {\n requestedTo = { at: built.to, length };\n loadEdge(\"later\");\n }\n };\n\n const scrollToTime = (time: number, align: \"start\" | \"center\" = \"start\") => {\n if (!viewport) return;\n const [start, end] = visible();\n const target = px(time) - (align === \"center\" ? (end - start) / 2 : 16);\n scrollBy(target - start, ownScrollBehavior());\n };\n\n // Keyboard: one tab stop, moved by the keys of the axis.\n const elementOf = (id: string) =>\n [...(viewport?.querySelectorAll<HTMLElement>(\"[data-entry-id]\") ?? [])].find((element) => element.dataset.entryId === id);\n const focusEntry = (id: string | undefined, message?: string) => {\n if (id === undefined) return;\n setActive(id);\n const element = elementOf(id);\n element?.focus({ preventScroll: true });\n element?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: ownScrollBehavior() });\n if (message) announce(message);\n };\n const groupLabel = (group: TimelineGroup) => dayRange(group.firstKey, group.lastKey, longDayFormat());\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target || target.closest(\"[role='menu']\") || event.altKey || event.ctrlKey || event.metaKey) return;\n const id = target.closest<HTMLElement>(\"[data-entry-id]\")?.dataset.entryId;\n const { order, entries, groups } = model();\n const index = id === undefined ? -1 : order.indexOf(id);\n const entry = id === undefined ? undefined : entries.get(id);\n const [back, forward] = layout().axis === \"horizontal\" ? [\"ArrowLeft\", \"ArrowRight\"] : [\"ArrowUp\", \"ArrowDown\"];\n const key = event.key;\n const handled = () => {\n event.preventDefault();\n event.stopPropagation();\n };\n if (key.toLowerCase() === \"t\") {\n handled();\n const happening = current();\n if (happening) focusEntry(happening);\n else scrollToTime(now(), \"center\");\n announce(messages().timelineNow({ time: formatTime(now()) }));\n return;\n }\n if (!entry) return;\n const group = groups[entry.group]!;\n if (key === back || key === forward) {\n handled();\n focusEntry(order[Math.max(0, Math.min(order.length - 1, index + (key === forward ? 1 : -1)))]);\n } else if (key === \"PageDown\" || key === \"PageUp\") {\n handled();\n const step = key === \"PageDown\" ? 1 : -1;\n for (let next = entry.group + step; next >= 0 && next < groups.length; next += step) {\n const first = groups[next]!.entries[0];\n if (first) return focusEntry(first.id, groupLabel(groups[next]!));\n }\n } else if (key === \"Home\" || key === \"End\") {\n handled();\n focusEntry((key === \"Home\" ? group.entries[0] : group.entries.at(-1))?.id);\n } else if (key === \" \" && entry.kind !== \"more\") {\n handled();\n if (props.onToggle && entry.item.checked !== undefined) props.onToggle(entry.item, !entry.item.checked);\n else if (props.onActivate) props.onActivate(entry.item);\n else if (entry.item.href) target.click();\n }\n };\n\n // The wheel scrolls a horizontal strip sideways only where nothing else scrolls vertically, decided once per gesture.\n let wheelAt = Number.NEGATIVE_INFINITY;\n let primary = false;\n /** Pixels a gliding wheel still moves. Relative, so a scroll from elsewhere, such as days loading, adds to it. */\n let wheelLeft = 0;\n let wheelFrame = 0;\n const glide = () => {\n wheelFrame = 0;\n if (!viewport) return;\n // Whole pixels, so every frame moves until the glide is done or meets an edge.\n const step = Math.abs(wheelLeft) <= 1 ? wheelLeft : Math.trunc(wheelLeft * 0.35) || Math.sign(wheelLeft);\n const before = viewport.scrollLeft;\n viewport.scrollLeft = before + step;\n wheelLeft -= step;\n if (wheelLeft !== 0 && viewport.scrollLeft !== before) wheelFrame = requestAnimationFrame(glide);\n else wheelLeft = 0;\n };\n const onWheel = (event: WheelEvent) => {\n if (!viewport || layout().axis !== \"horizontal\" || event.ctrlKey || event.shiftKey) return;\n if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) return;\n const time = performance.now();\n if (time - wheelAt > GESTURE_GAP_MS) primary = !verticalScroller(viewport);\n wheelAt = time;\n if (!primary) return;\n event.preventDefault();\n const delta = event.deltaY * (event.deltaMode === 1 ? 40 : event.deltaMode === 2 ? viewport.clientWidth : 1);\n if (reducedMotion() || (Math.abs(delta) < GLIDE_FROM && !wheelFrame)) {\n viewport.scrollLeft += delta;\n return;\n }\n wheelLeft += delta;\n if (!wheelFrame) wheelFrame = requestAnimationFrame(glide);\n };\n\n const activate = (event: MouseEvent, entry: TimelineItemEntry) => {\n const onBox = (event.target as Element | null)?.closest(\".k2b-timeline__check\");\n if (onBox && props.onToggle && entry.item.checked !== undefined) {\n event.preventDefault();\n props.onToggle(entry.item, !entry.item.checked);\n return;\n }\n // A modified click on a link keeps its browser meaning, such as opening a new tab.\n if (!props.onActivate || (entry.item.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey))) return;\n event.preventDefault();\n props.onActivate(entry.item);\n };\n\n // While the reader scrolls, a scroll write that keeps the view in place would fight a finger or momentum, as on iOS.\n // So a new model that moves what they see waits until the scroll rests: frames without a scroll event, no finger\n // down. Counted in frames, as scrolling and momentum report every frame, also when a busy page draws slowly.\n const [resting, setResting] = createSignal(true);\n const fingers = new Set<number>();\n let quietFrames = 0;\n let restFrame = 0;\n const countQuiet = () => {\n restFrame = 0;\n if (fingers.size > 0) return;\n if (++quietFrames >= REST_FRAMES) setResting(true);\n else restFrame = requestAnimationFrame(countQuiet);\n };\n const scrolled = () => {\n setResting(false);\n quietFrames = 0;\n if (!restFrame) restFrame = requestAnimationFrame(countQuiet);\n };\n /**\n * How a scroll the timeline starts itself moves. A smooth one reports its first frame only later, and a write that\n * keeps the view in place stops it, so it counts as scrolling from its start: days that load meanwhile wait until it\n * arrives instead of cutting it short.\n */\n const ownScrollBehavior = (): ScrollBehavior => {\n if (reducedMotion()) return \"auto\";\n scrolled();\n return \"smooth\";\n };\n const onTouchStart = (event: TouchEvent) => {\n const target = event.target;\n if (!target) return;\n const touches = [...event.changedTouches].map((touch) => touch.identifier);\n for (const touch of touches) fingers.add(touch);\n setResting(false);\n // Touch events keep going to where they began, also after that element left the timeline.\n const release = (ended: Event) => {\n for (const touch of (ended as TouchEvent).changedTouches) fingers.delete(touch.identifier);\n if (touches.some((touch) => fingers.has(touch))) return;\n target.removeEventListener(\"touchend\", release);\n target.removeEventListener(\"touchcancel\", release);\n scrolled();\n };\n target.addEventListener(\"touchend\", release);\n target.addEventListener(\"touchcancel\", release);\n };\n /** The item that had focus when the model changed, to keep focus in the timeline if its element goes. */\n let focused: string | undefined;\n createEffect(() => {\n const next = latest();\n const rest = resting();\n untrack(() => {\n const shown = model();\n if (next === shown || (!rest && viewport && Math.abs(shiftOf(shown, next)) >= 0.5)) return;\n focused = root?.contains(document.activeElement) && !document.activeElement?.closest(\"[role='menu']\") ? activeId() : undefined;\n setModel(next);\n });\n });\n /** The entry that stands in for `id` in the next model: itself, the \"+n\" entry that hides it, or its nearest neighbour. */\n const successor = (before: TimelineModel, after: TimelineModel, id: string): string | undefined => {\n if (after.entries.has(id)) return id;\n for (const entry of after.entries.values())\n if (entry.kind === \"more\" && entry.hidden.some((hidden) => hidden.id === id)) return entry.id;\n const index = before.order.indexOf(id);\n return [...before.order.slice(index + 1), ...before.order.slice(0, Math.max(0, index)).reverse()].find((other) =>\n after.entries.has(other),\n );\n };\n // Days loading at either end, and items changing, keep what the reader sees in place, and keep focus.\n createEffect(\n on(model, (current, previous) => {\n if (!previous) return;\n scrollBy(shiftOf(previous, current));\n const id = focused === undefined ? undefined : successor(previous, current, focused);\n focused = undefined;\n if (id !== undefined && !root?.contains(document.activeElement)) {\n setActive(id);\n // A day that only now holds the tab stop renders right after this update.\n const focus = () => elementOf(id)?.focus({ preventScroll: true });\n if (!elementOf(id)) queueMicrotask(focus);\n else focus();\n }\n refresh();\n }),\n );\n\n onMount(() => {\n if (isServer || !viewport || !root) return;\n setLayout(readLayout());\n refresh();\n let frame = 0;\n const schedule = () => {\n if (frame) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n refresh();\n });\n };\n // Scrolls of the strip and of the areas around it, which move it too.\n const onScroll = (event: Event) => {\n const target = event.target;\n if (target !== document && !(target instanceof Node && viewport && target.contains(viewport))) return;\n scrolled();\n schedule();\n };\n const resize = new ResizeObserver(() => {\n const next = readLayout();\n const previous = layout();\n if (next.axis !== previous.axis || next.units.some((value, index) => value !== previous.units[index])) {\n setLayout(next);\n if (edgeTime !== undefined) scrollBy(px(edgeTime) - visible()[0]);\n refresh();\n } else schedule();\n });\n resize.observe(viewport);\n viewport.addEventListener(\"wheel\", onWheel, { passive: false });\n viewport.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"keydown\", onKeyDown, true);\n window.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n const timer = props.now === undefined ? setInterval(() => setClock(Date.now()), 30_000) : undefined;\n onCleanup(() => {\n resize.disconnect();\n viewport?.removeEventListener(\"wheel\", onWheel);\n viewport?.removeEventListener(\"touchstart\", onTouchStart);\n root?.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n cancelAnimationFrame(frame);\n cancelAnimationFrame(wheelFrame);\n cancelAnimationFrame(restFrame);\n if (timer) clearInterval(timer);\n });\n props.controller?.({\n scrollToTime: (time, options) => scrollToTime(parseTimelineTime(time, context()), options?.align),\n scrollToNow: () => scrollToTime(now(), \"center\"),\n });\n });\n\n const nowShown = () => now() >= model().from && now() < model().to;\n\n const Heading = (headingProps: { group: TimelineGroup }) => (\n <Dynamic\n component={`h${props.headingLevel ?? 3}`}\n id={`${baseId}-${headingProps.group.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`}\n class=\"k2b-timeline__heading\"\n >\n <Show when={headingProps.group.today}>\n <span class=\"k2b-timeline__today\">{messages().today}</span>\n </Show>\n <span class=\"k2b-timeline__day\">{dayRange(headingProps.group.firstKey, headingProps.group.lastKey, dayFormat())}</span>\n </Dynamic>\n );\n\n const ItemControl = (itemProps: { entry: TimelineItemEntry }) => {\n const entry = () => itemProps.entry;\n const name = createMemo(() => spoken(entry()));\n const time = () => {\n const current = entry();\n if (current.kind === \"all-day\") return \"\";\n if (current.kind !== \"folded\" && current.end > current.start) return `${formatTime(current.start)}–${formatTime(current.end)}`;\n return formatTime(current.start);\n };\n return (\n <Dynamic\n component={entry().item.href ? \"a\" : \"button\"}\n type={entry().item.href ? undefined : \"button\"}\n href={entry().item.href}\n class=\"k2b-timeline__item\"\n data-entry-id={entry().id}\n tabindex={activeId() === entry().id ? 0 : -1}\n aria-label={name()}\n title={name()}\n onClick={(event: MouseEvent) => activate(event, entry())}\n >\n <Show when={entry().item.checked !== undefined}>\n <span class=\"k2b-timeline__check\" data-checked={entry().item.checked ? \"true\" : undefined} aria-hidden=\"true\">\n <i class=\"ti ti-check\" />\n </span>\n </Show>\n <span class=\"k2b-timeline__text\">\n <span class=\"k2b-timeline__label\">{entry().item.label}</span>\n <Show when={time()}>\n <span class=\"k2b-timeline__time\">{time()}</span>\n </Show>\n <Show when={entry().item.detail}>\n <span class=\"k2b-timeline__detail\">{entry().item.detail}</span>\n </Show>\n </span>\n </Dynamic>\n );\n };\n\n const MoreControl = (moreProps: { entry: TimelineMoreEntry }) => {\n const entry = () => moreProps.entry;\n const label = () => {\n const current = entry();\n const count = messages().timelineMore({ count: current.hidden.length });\n return current.area === \"all-day\"\n ? count\n : `${count}, ${messages().timelineTimeRange({ start: formatTime(current.start), end: formatTime(current.end) })}`;\n };\n // A row opens its item as a click on it does. Where only the checkbox may change, the row is that checkbox.\n const items = (): DropdownItem[] =>\n entry().hidden.map((hidden): DropdownItem => {\n const { item } = hidden;\n const parts = [when(hidden), ...(item.detail ? [item.detail] : [])];\n const state = item.checked === undefined ? [] : [item.checked ? messages().timelineDone : messages().timelineOpen];\n const icon = item.checked === undefined ? undefined : item.checked ? \"ti ti-circle-check\" : \"ti ti-circle\";\n const base = { label: item.label, description: [...parts, ...state].join(\", \"), icon };\n const open = props.onActivate;\n if (open) return item.href ? { ...base, href: item.href, action: () => open(item) } : { ...base, action: () => open(item) };\n if (item.href) return { ...base, href: item.href };\n const toggle = props.onToggle;\n if (toggle && item.checked !== undefined) {\n const checked = item.checked;\n return { label: item.label, description: parts.join(\", \"), choice: \"checkbox\", checked, action: () => toggle(item, !checked) };\n }\n return { ...base, disabled: true };\n });\n return (\n <Dropdown.Root items={items()} label={label()} class=\"k2b-timeline__more-root\">\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-timeline__item k2b-timeline__more\"\n data-entry-id={entry().id}\n tabIndex={activeId() === entry().id ? 0 : -1}\n label={label()}\n title={label()}\n >\n +{entry().hidden.length}\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n };\n\n const Slot = (slotProps: { id: string }) => {\n const entry = createMemo<TimelineEntry>(\n (previous) => model().entries.get(slotProps.id) ?? previous,\n model().entries.get(slotProps.id)!,\n );\n const color = () => {\n const current = entry();\n return colorAttributes(current.kind === \"more\" ? undefined : current.item.color);\n };\n const span = () => {\n const current = entry();\n if (current.kind !== \"band\") return undefined;\n const minutes = (current.end - current.start) / 60_000;\n return minutes < 30 ? \"xs\" : minutes < 60 ? \"s\" : minutes < 120 ? \"m\" : \"l\";\n };\n return (\n <li\n class=\"k2b-timeline__slot\"\n data-kind={entry().kind}\n data-area={asMore(entry())?.area}\n data-past={isPast(entry()) ? \"true\" : undefined}\n data-span={span()}\n data-color={color().token}\n style={{\n \"--k2b-timeline-at\": spanCss(entry().at),\n \"--k2b-timeline-size\": spanCss(entry().size),\n \"--k2b-timeline-lane\": String(entry().lane),\n \"--k2b-timeline-lanes\": String(entry().lanes),\n \"--k2b-timeline-accent\": color().accent,\n }}\n >\n <Show when={asMore(entry())} fallback={<ItemControl entry={asItem(entry())!} />}>\n {(more) => <MoreControl entry={more()} />}\n </Show>\n </li>\n );\n };\n\n const Group = (groupProps: { key: string }) => {\n const group = createMemo<TimelineGroup>(\n (previous) => groupsByKey().get(groupProps.key) ?? previous,\n groupsByKey().get(groupProps.key)!,\n );\n const headingId = () => `${baseId}-${group().key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n return (\n <div\n class=\"k2b-timeline__group\"\n data-kind={group().kind}\n data-today={group().today ? \"true\" : undefined}\n data-past={group().past ? \"true\" : undefined}\n data-row={group().row ? \"true\" : undefined}\n style={{ \"--k2b-timeline-at\": spanCss(group().at), \"--k2b-timeline-size\": spanCss(group().size) }}\n >\n <Heading group={group()} />\n <div class=\"k2b-timeline__decor\" aria-hidden=\"true\">\n <Index each={group().folds}>\n {(fold) => (\n <div\n class=\"k2b-timeline__fold\"\n data-kind={fold().kind}\n style={{ \"--k2b-timeline-at\": spanCss(fold().at), \"--k2b-timeline-size\": spanCss(fold().size) }}\n >\n <i class=\"ti ti-moon\" />\n <span class=\"k2b-timeline__fold-label\">{fold().kind === \"night\" ? nightLabel() : messages().timelineNothingPlanned}</span>\n </div>\n )}\n </Index>\n <Index each={group().hours}>\n {(hour) => (\n <span class=\"k2b-timeline__hour\" style={{ \"--k2b-timeline-at\": spanCss(hour().at) }}>\n <span class=\"k2b-timeline__hour-label\">{formatTime(hour().time)}</span>\n </span>\n )}\n </Index>\n <Index each={group().gaps}>\n {(gap) => (\n <span\n class=\"k2b-timeline__gap\"\n data-long={gap().long ? \"true\" : undefined}\n data-past={gap().end <= now() ? \"true\" : undefined}\n style={{ \"--k2b-timeline-at\": spanCss(gap().at) }}\n >\n {messages().timelineFree({ duration: hoursFormat().format(gap().hours) })}\n </span>\n )}\n </Index>\n <Index each={group().echoes}>\n {(echo) => {\n const color = () => {\n const current = echo();\n return colorAttributes(current.kind === \"more\" ? undefined : current.item.color);\n };\n return (\n // A pointer shortcut to an item that the keyboard and screen readers reach on the day it starts.\n // biome-ignore lint/a11y/noStaticElementInteractions: hidden from assistive technology on purpose.\n // biome-ignore lint/a11y/useKeyWithClickEvents: the item itself is the keyboard target.\n <span\n class=\"k2b-timeline__echo\"\n data-color={color().token}\n data-past={isPast(echo()) ? \"true\" : undefined}\n style={{ \"--k2b-timeline-lane\": String(echo().lane), \"--k2b-timeline-accent\": color().accent }}\n onClick={() => elementOf(echo().id)?.click()}\n >\n {asItem(echo())?.item.label ?? `+${asMore(echo())?.hidden.length ?? 0}`}\n </span>\n );\n }}\n </Index>\n </div>\n <Show when={group().entries.length > 0}>\n <ol class=\"k2b-timeline__list\" aria-labelledby={headingId()}>\n <For each={group().entries.map((entry) => entry.id)}>{(id) => <Slot id={id} />}</For>\n </ol>\n </Show>\n </div>\n );\n };\n\n return (\n <section\n ref={root}\n class={`k2b-timeline ${props.class ?? \"\"}`}\n aria-label={props.label ?? messages().timeline}\n aria-describedby={`${baseId}-hint`}\n aria-busy={props.busy ? \"true\" : undefined}\n onFocusIn={(event) => {\n const id = (event.target as HTMLElement).closest<HTMLElement>(\"[data-entry-id]\")?.dataset.entryId;\n if (id !== undefined) setActive(id);\n }}\n >\n <div ref={viewport} class=\"k2b-timeline__viewport\" tabIndex={model().order.length === 0 ? 0 : undefined}>\n <div ref={track} class=\"k2b-timeline__track\" style={{ \"--k2b-timeline-length\": spanCss(model().total) }}>\n <For each={renderedKeys()}>{(key) => <Group key={key} />}</For>\n <div\n class=\"k2b-timeline__now\"\n aria-hidden=\"true\"\n data-hidden={nowShown() ? undefined : \"true\"}\n style={{ \"--k2b-timeline-at\": spanCss(model().posOf(now())) }}\n >\n <span class=\"k2b-timeline__now-time\">{formatTime(now())}</span>\n </div>\n </div>\n </div>\n <span id={`${baseId}-hint`} class=\"k2b-sr-only\">\n {messages().timelineHint}\n </span>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/Timeline.tsx"],"sourcesContent":["import type { DateContext } from \"@k2b/stdlib\";\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n Index,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dynamic, isServer } from \"solid-js/web\";\nimport Dropdown, { type DropdownItem } from \"../actions/Dropdown\";\nimport { announce } from \"../feedback/announce\";\nimport { useDateConfigLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useTimelineMessages } from \"./timeline-messages\";\nimport {\n buildTimelineModel,\n parseTimelineTime,\n spanCss,\n spanPx,\n type TimelineEntry,\n type TimelineGroup,\n type TimelineItem,\n type TimelineItemEntry,\n type TimelineModel,\n type TimelineMoreEntry,\n type TimelineUnits,\n timelineDayKey,\n timelineHourOf,\n} from \"./timeline-model\";\n\nexport type { TimelineColor, TimelineItem } from \"./timeline-model\";\n\nexport type TimelineController = {\n /** Scrolls a time into view; `start` (default) puts it near the start edge, `center` in the middle. */\n scrollToTime: (time: Date | string, options?: { align?: \"start\" | \"center\" }) => void;\n /** Scrolls the current time to the middle of the view. */\n scrollToNow: () => void;\n};\n\nexport type TimelineProps = {\n items: readonly TimelineItem[];\n /** Start of the loaded range. The view starts here, so pass the first time the reader should see. */\n from: Date | string;\n /** End of the loaded range (exclusive). */\n to: Date | string;\n /** The current time. Without it the timeline uses the clock and moves the now line every 30 seconds. */\n now?: Date | string;\n /** Accessible name of the region. Defaults to \"Timeline\". */\n label?: string;\n /** stdlib date context: time zone and locale of days, hours, and folds. */\n dateConfig?: DateContext;\n /** Convenience override for `dateConfig.timeZone`. */\n timeZone?: string;\n /** Level of the per-day headings. Defaults to 3. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Opens an item, on click, Enter, or Space. */\n onActivate?: (item: TimelineItem) => void;\n /** Changes the checkbox of an item, on a click on the box or Space. Leave it out when the reader may not change it. */\n onToggle?: (item: TimelineItem, checked: boolean) => void;\n /**\n * Called once when the reader nears the start, again once `from` moved and changed the strip's length. Extend `from`\n * to load earlier days.\n */\n onLoadEarlier?: () => unknown;\n /** Called once when the reader nears the end, again once `to` moved and changed the strip's length. Extend `to` to load later days. */\n onLoadLater?: () => unknown;\n /** Marks the region busy, for example while a range loads. */\n busy?: boolean;\n controller?: (controller: TimelineController) => void;\n class?: string;\n};\n\ntype Axis = \"horizontal\" | \"vertical\";\n\n/** Unit sizes of the horizontal axis, as in the stylesheet; the server and the first render use them. */\nconst HORIZONTAL_UNITS: TimelineUnits = [54, 48, 160, 0, 0];\n/** How far beyond the visible area the first render reaches, in pixels. */\nconst INITIAL_REACH = 3200;\n/** A scroll rests once this many frames passed without a scroll event and no finger is down. */\nconst REST_FRAMES = 8;\n/** A pause between wheel events that starts a new gesture. */\nconst GESTURE_GAP_MS = 150;\n/** Wheel steps from this size on, such as a mouse wheel's notches, glide; smaller ones, such as a trackpad's, apply at once. */\nconst GLIDE_FROM = 50;\nconst COLOR_TOKENS = new Set([\"blue\", \"emerald\", \"amber\", \"red\", \"violet\", \"cyan\", \"zinc\"]);\nconst HEX_COLOR = /^#[0-9a-f]{3,8}$/i;\n\nconst reducedMotion = () => typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst colorAttributes = (color: string | undefined) =>\n color && HEX_COLOR.test(color)\n ? { token: undefined, accent: color }\n : { token: color && COLOR_TOKENS.has(color) ? color : \"blue\", accent: undefined };\n\nconst isAllDay = (entry: TimelineEntry) => entry.kind === \"all-day\" || (entry.kind === \"more\" && entry.area === \"all-day\");\nconst asItem = (entry: TimelineEntry): TimelineItemEntry | undefined => (entry.kind === \"more\" ? undefined : entry);\nconst asMore = (entry: TimelineEntry): TimelineMoreEntry | undefined => (entry.kind === \"more\" ? entry : undefined);\n\n/** The nearest ancestor that scrolls vertically, the page included. */\nconst verticalScroller = (from: Element): Element | undefined => {\n for (let element = from.parentElement; element; element = element.parentElement) {\n if (element.scrollHeight <= element.clientHeight + 1) continue;\n const overflow = getComputedStyle(element).overflowY;\n if (overflow === \"auto\" || overflow === \"scroll\" || element === document.scrollingElement) return element;\n }\n const root = document.scrollingElement;\n return root && root.scrollHeight > root.clientHeight + 1 ? root : undefined;\n};\n\n/**\n * A continuous filmstrip of time: waking hours are proportional, nights and empty days fold, overlapping bands share\n * lanes. Wide containers show it horizontally, narrow ones vertically; both use the same model.\n */\nexport default function Timeline(props: TimelineProps): JSX.Element {\n const messages = useUiMessages();\n const timelineMessages = useTimelineMessages();\n const context = useDateConfigLocale(() => ({ ...props.dateConfig, timeZone: props.timeZone ?? props.dateConfig?.timeZone }));\n const baseId = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const [clock, setClock] = createSignal(Date.now());\n const now = createMemo(() => {\n const fixed = parseTimelineTime(props.now, context());\n return Number.isFinite(fixed) ? fixed : clock();\n });\n const today = createMemo(() => timelineDayKey(now(), context()));\n const latest = createMemo<TimelineModel>(() =>\n buildTimelineModel({\n from: parseTimelineTime(props.from, context()),\n to: parseTimelineTime(props.to, context()),\n today: today(),\n items: props.items,\n context: context(),\n }),\n );\n /** The model on screen: the latest one, unless that one waits for the reader's scroll to rest (see `resting`). */\n const [model, setModel] = createSignal<TimelineModel>(untrack(latest));\n const groupsByKey = createMemo(() => new Map(model().groups.map((group) => [group.key, group])));\n\n // Formatting.\n const locale = () => context().locale ?? \"en\";\n const timeFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\", timeZone: context().timeZone }),\n );\n const formatTime = (time: number) => timeFormat().format(time);\n const dayFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { weekday: \"short\", day: \"numeric\", month: \"short\", timeZone: context().timeZone }),\n );\n const longDayFormat = createMemo(\n () => new Intl.DateTimeFormat(locale(), { weekday: \"long\", day: \"numeric\", month: \"long\", timeZone: context().timeZone }),\n );\n const hoursFormat = createMemo(\n () => new Intl.NumberFormat(locale(), { style: \"unit\", unit: \"hour\", unitDisplay: \"short\", maximumFractionDigits: 1 }),\n );\n const noonOf = (key: string) => new Date(timelineHourOf(key, 12, context()));\n const dayRange = (first: string, last: string, format: Intl.DateTimeFormat) =>\n first === last ? format.format(noonOf(first)) : `${format.format(noonOf(first))} – ${format.format(noonOf(last))}`;\n const nightLabel = createMemo(() => {\n const format = new Intl.DateTimeFormat(locale(), { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\", timeZone: \"UTC\" });\n return timelineMessages().timelineNight({\n start: format.format(Date.UTC(2000, 0, 1, 22)),\n end: format.format(Date.UTC(2000, 0, 1, 6)),\n });\n });\n const spoken = (entry: TimelineItemEntry): string => {\n const item = entry.item;\n const parts = [item.label];\n if (entry.kind === \"all-day\") parts.push(messages().allDay);\n else if (entry.end > entry.start)\n parts.push(timelineMessages().timelineTimeRange({ start: formatTime(entry.start), end: formatTime(entry.end) }));\n else parts.push(formatTime(entry.start));\n if (item.detail) parts.push(item.detail);\n parts.push(\n entry.kind === \"all-day\" ? dayRange(entry.firstKey, entry.lastKey, longDayFormat()) : longDayFormat().format(new Date(entry.start)),\n );\n if (item.checked !== undefined) parts.push(item.checked ? timelineMessages().timelineDone : timelineMessages().timelineOpen);\n return parts.join(\", \");\n };\n /** When an item happens, for a \"+n\" menu row. */\n const when = (entry: TimelineItemEntry): string => {\n if (entry.kind === \"all-day\") return `${messages().allDay}, ${dayRange(entry.firstKey, entry.lastKey, dayFormat())}`;\n return entry.end > entry.start ? `${formatTime(entry.start)}–${formatTime(entry.end)}` : formatTime(entry.start);\n };\n const isPast = (entry: TimelineEntry): boolean => {\n if (entry.kind === \"more\") return entry.hidden.every(isPast);\n if (entry.kind === \"all-day\") return entry.lastKey < today();\n return entry.end <= now();\n };\n\n // Layout of the axis the stylesheet chose, read from the viewport.\n let root: HTMLElement | undefined;\n let viewport: HTMLDivElement | undefined;\n let track: HTMLDivElement | undefined;\n const [layout, setLayout] = createSignal<{ axis: Axis; units: TimelineUnits }>({ axis: \"horizontal\", units: HORIZONTAL_UNITS });\n const readLayout = () => {\n if (!viewport) return layout();\n const style = getComputedStyle(viewport);\n const unit = (name: string) => Number.parseFloat(style.getPropertyValue(`--k2b-timeline-${name}`)) || 0;\n const units: TimelineUnits = [unit(\"hour\"), unit(\"night\"), unit(\"fold\"), unit(\"head\"), unit(\"row\")];\n return {\n axis: style.getPropertyValue(\"--k2b-timeline-axis\").trim() === \"vertical\" ? (\"vertical\" as const) : (\"horizontal\" as const),\n units: units.some((value) => value > 0) ? units : HORIZONTAL_UNITS,\n };\n };\n const px = (time: number) => spanPx(model().posOf(time), layout().units);\n\n /** The visible part of the track in its own pixels, clipped by the viewport and the window. */\n const visible = (): [number, number] => {\n if (!viewport || !track) return [0, INITIAL_REACH];\n const port = viewport.getBoundingClientRect();\n const box = track.getBoundingClientRect();\n const [portStart, portEnd, boxStart, limit] =\n layout().axis === \"horizontal\"\n ? [port.left, port.right, box.left, window.innerWidth]\n : [port.top, port.bottom, box.top, window.innerHeight];\n const start = Math.max(portStart, 0) - boxStart;\n return [start, Math.max(start, Math.min(portEnd, limit) - boxStart)];\n };\n const scrollBy = (distance: number, behavior: ScrollBehavior = \"instant\") => {\n // In device pixels: positions are sums of unit sizes, and an engine that cuts 4671.9999 to 4671 would move the view.\n const delta = Math.round(distance * window.devicePixelRatio) / window.devicePixelRatio;\n if (!viewport || Math.abs(delta) < 0.5) return;\n const horizontal = layout().axis === \"horizontal\";\n const scrollable = horizontal ? viewport.scrollWidth > viewport.clientWidth : viewport.scrollHeight > viewport.clientHeight;\n if (scrollable) viewport.scrollBy({ [horizontal ? \"left\" : \"top\"]: delta, behavior });\n else if (!horizontal) verticalScroller(viewport)?.scrollBy({ top: delta, behavior });\n };\n\n // Bounded rendering: groups whose reach meets the visible time range, widened by a screen, plus the focused group.\n const [range, setRange] = createSignal<[number, number]>();\n const shownRange = (): [number, number] => range() ?? [Number.NEGATIVE_INFINITY, model().timeAt(INITIAL_REACH, HORIZONTAL_UNITS)];\n const [active, setActive] = createSignal<string>();\n /** The item happening now or next. */\n const current = () => {\n const { order, entries } = model();\n return order.find((id) => {\n const entry = entries.get(id)!;\n return !isAllDay(entry) && entry.end >= now();\n });\n };\n const defaultActive = createMemo(() => current() ?? model().order.at(-1));\n const activeId = () => {\n const id = active();\n return id !== undefined && model().entries.has(id) ? id : defaultActive();\n };\n const renderedKeys = createMemo(() => {\n const [low, high] = shownRange();\n const focusGroup = model().entries.get(activeId() ?? \"\")?.group;\n return model()\n .groups.filter((group) => group.index === focusGroup || (group.reach[1] >= low && group.reach[0] <= high))\n .map((group) => group.key);\n });\n\n // Reading position: the time at the start edge stays in place when days load or the axis changes.\n /** The time at the start edge after the last refresh, for an axis change. */\n let edgeTime: number | undefined;\n /**\n * The time to hold in place. A load at the start spreads a leading night or fold over other times, so where the start\n * edge lies in one, the end of that segment holds instead, and with it everything after.\n */\n const anchorAt = (built: TimelineModel, start: number, units: TimelineUnits) => {\n const time = built.timeAt(start, units);\n const first = built.segments.find((segment) => segment.t1 > segment.t0);\n return first && first.kind !== \"wake\" && time < first.t1 ? first.t1 : time;\n };\n /** How far what the reader sees moves from one model to the next. */\n const shiftOf = (before: TimelineModel, after: TimelineModel) => {\n const { units } = layout();\n const time = anchorAt(before, visible()[0], units);\n return spanPx(after.posOf(time), units) - spanPx(before.posOf(time), units);\n };\n /**\n * Where each end of the range was, and how long the strip was, when that end was last asked for. An end is asked\n * again only once the range moved there and the strip's length changed: days that fold into the fold at that end\n * leave the reader where they were, and asking again would load an empty calendar week after week on its own.\n */\n let requestedFrom: { at: number; length: number } | undefined;\n let requestedTo: { at: number; length: number } | undefined;\n let pendingEarlier = false;\n let pendingLater = false;\n const loadEdge = (edge: \"earlier\" | \"later\") => {\n const load = edge === \"earlier\" ? props.onLoadEarlier : props.onLoadLater;\n if (!load) return;\n const settle = () => {\n if (edge === \"earlier\") pendingEarlier = false;\n else pendingLater = false;\n queueMicrotask(refresh);\n };\n if (edge === \"earlier\") pendingEarlier = true;\n else pendingLater = true;\n Promise.resolve().then(load).then(settle, settle);\n };\n const refresh = () => {\n if (!viewport) return;\n const built = model();\n const { units } = layout();\n const [start, end] = visible();\n const reach = Math.max(end - start, 600);\n edgeTime = built.timeAt(start, units);\n const [low, high] = range() ?? [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY];\n if (built.timeAt(start - reach / 2, units) < low || built.timeAt(end + reach / 2, units) > high)\n setRange([built.timeAt(start - reach, units), built.timeAt(end + reach, units)]);\n const length = spanPx(built.total, units);\n const due = (requested: { at: number; length: number } | undefined, at: number) =>\n requested === undefined || (requested.at !== at && requested.length !== length);\n if (start > reach) requestedFrom = undefined;\n else if (!pendingEarlier && due(requestedFrom, built.from)) {\n requestedFrom = { at: built.from, length };\n loadEdge(\"earlier\");\n }\n if (end < length - reach) requestedTo = undefined;\n else if (!pendingLater && due(requestedTo, built.to)) {\n requestedTo = { at: built.to, length };\n loadEdge(\"later\");\n }\n };\n\n const scrollToTime = (time: number, align: \"start\" | \"center\" = \"start\") => {\n if (!viewport) return;\n const [start, end] = visible();\n const target = px(time) - (align === \"center\" ? (end - start) / 2 : 16);\n scrollBy(target - start, ownScrollBehavior());\n };\n\n // Keyboard: one tab stop, moved by the keys of the axis.\n const elementOf = (id: string) =>\n [...(viewport?.querySelectorAll<HTMLElement>(\"[data-entry-id]\") ?? [])].find((element) => element.dataset.entryId === id);\n const focusEntry = (id: string | undefined, message?: string) => {\n if (id === undefined) return;\n setActive(id);\n const element = elementOf(id);\n element?.focus({ preventScroll: true });\n element?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: ownScrollBehavior() });\n if (message) announce(message);\n };\n const groupLabel = (group: TimelineGroup) => dayRange(group.firstKey, group.lastKey, longDayFormat());\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target || target.closest(\"[role='menu']\") || event.altKey || event.ctrlKey || event.metaKey) return;\n const id = target.closest<HTMLElement>(\"[data-entry-id]\")?.dataset.entryId;\n const { order, entries, groups } = model();\n const index = id === undefined ? -1 : order.indexOf(id);\n const entry = id === undefined ? undefined : entries.get(id);\n const [back, forward] = layout().axis === \"horizontal\" ? [\"ArrowLeft\", \"ArrowRight\"] : [\"ArrowUp\", \"ArrowDown\"];\n const key = event.key;\n const handled = () => {\n event.preventDefault();\n event.stopPropagation();\n };\n if (key.toLowerCase() === \"t\") {\n handled();\n const happening = current();\n if (happening) focusEntry(happening);\n else scrollToTime(now(), \"center\");\n announce(timelineMessages().timelineNow({ time: formatTime(now()) }));\n return;\n }\n if (!entry) return;\n const group = groups[entry.group]!;\n if (key === back || key === forward) {\n handled();\n focusEntry(order[Math.max(0, Math.min(order.length - 1, index + (key === forward ? 1 : -1)))]);\n } else if (key === \"PageDown\" || key === \"PageUp\") {\n handled();\n const step = key === \"PageDown\" ? 1 : -1;\n for (let next = entry.group + step; next >= 0 && next < groups.length; next += step) {\n const first = groups[next]!.entries[0];\n if (first) return focusEntry(first.id, groupLabel(groups[next]!));\n }\n } else if (key === \"Home\" || key === \"End\") {\n handled();\n focusEntry((key === \"Home\" ? group.entries[0] : group.entries.at(-1))?.id);\n } else if (key === \" \" && entry.kind !== \"more\") {\n handled();\n if (props.onToggle && entry.item.checked !== undefined) props.onToggle(entry.item, !entry.item.checked);\n else if (props.onActivate) props.onActivate(entry.item);\n else if (entry.item.href) target.click();\n }\n };\n\n // The wheel scrolls a horizontal strip sideways only where nothing else scrolls vertically, decided once per gesture.\n let wheelAt = Number.NEGATIVE_INFINITY;\n let primary = false;\n /** Pixels a gliding wheel still moves. Relative, so a scroll from elsewhere, such as days loading, adds to it. */\n let wheelLeft = 0;\n let wheelFrame = 0;\n const glide = () => {\n wheelFrame = 0;\n if (!viewport) return;\n // Whole pixels, so every frame moves until the glide is done or meets an edge.\n const step = Math.abs(wheelLeft) <= 1 ? wheelLeft : Math.trunc(wheelLeft * 0.35) || Math.sign(wheelLeft);\n const before = viewport.scrollLeft;\n viewport.scrollLeft = before + step;\n wheelLeft -= step;\n if (wheelLeft !== 0 && viewport.scrollLeft !== before) wheelFrame = requestAnimationFrame(glide);\n else wheelLeft = 0;\n };\n const onWheel = (event: WheelEvent) => {\n if (!viewport || layout().axis !== \"horizontal\" || event.ctrlKey || event.shiftKey) return;\n if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) return;\n const time = performance.now();\n if (time - wheelAt > GESTURE_GAP_MS) primary = !verticalScroller(viewport);\n wheelAt = time;\n if (!primary) return;\n event.preventDefault();\n const delta = event.deltaY * (event.deltaMode === 1 ? 40 : event.deltaMode === 2 ? viewport.clientWidth : 1);\n if (reducedMotion() || (Math.abs(delta) < GLIDE_FROM && !wheelFrame)) {\n viewport.scrollLeft += delta;\n return;\n }\n wheelLeft += delta;\n if (!wheelFrame) wheelFrame = requestAnimationFrame(glide);\n };\n\n const activate = (event: MouseEvent, entry: TimelineItemEntry) => {\n const onBox = (event.target as Element | null)?.closest(\".k2b-timeline__check\");\n if (onBox && props.onToggle && entry.item.checked !== undefined) {\n event.preventDefault();\n props.onToggle(entry.item, !entry.item.checked);\n return;\n }\n // A modified click on a link keeps its browser meaning, such as opening a new tab.\n if (!props.onActivate || (entry.item.href && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey))) return;\n event.preventDefault();\n props.onActivate(entry.item);\n };\n\n // While the reader scrolls, a scroll write that keeps the view in place would fight a finger or momentum, as on iOS.\n // So a new model that moves what they see waits until the scroll rests: frames without a scroll event, no finger\n // down. Counted in frames, as scrolling and momentum report every frame, also when a busy page draws slowly.\n const [resting, setResting] = createSignal(true);\n const fingers = new Set<number>();\n let quietFrames = 0;\n let restFrame = 0;\n const countQuiet = () => {\n restFrame = 0;\n if (fingers.size > 0) return;\n if (++quietFrames >= REST_FRAMES) setResting(true);\n else restFrame = requestAnimationFrame(countQuiet);\n };\n const scrolled = () => {\n setResting(false);\n quietFrames = 0;\n if (!restFrame) restFrame = requestAnimationFrame(countQuiet);\n };\n /**\n * How a scroll the timeline starts itself moves. A smooth one reports its first frame only later, and a write that\n * keeps the view in place stops it, so it counts as scrolling from its start: days that load meanwhile wait until it\n * arrives instead of cutting it short.\n */\n const ownScrollBehavior = (): ScrollBehavior => {\n if (reducedMotion()) return \"auto\";\n scrolled();\n return \"smooth\";\n };\n const onTouchStart = (event: TouchEvent) => {\n const target = event.target;\n if (!target) return;\n const touches = [...event.changedTouches].map((touch) => touch.identifier);\n for (const touch of touches) fingers.add(touch);\n setResting(false);\n // Touch events keep going to where they began, also after that element left the timeline.\n const release = (ended: Event) => {\n for (const touch of (ended as TouchEvent).changedTouches) fingers.delete(touch.identifier);\n if (touches.some((touch) => fingers.has(touch))) return;\n target.removeEventListener(\"touchend\", release);\n target.removeEventListener(\"touchcancel\", release);\n scrolled();\n };\n target.addEventListener(\"touchend\", release);\n target.addEventListener(\"touchcancel\", release);\n };\n /** The item that had focus when the model changed, to keep focus in the timeline if its element goes. */\n let focused: string | undefined;\n createEffect(() => {\n const next = latest();\n const rest = resting();\n untrack(() => {\n const shown = model();\n if (next === shown || (!rest && viewport && Math.abs(shiftOf(shown, next)) >= 0.5)) return;\n focused = root?.contains(document.activeElement) && !document.activeElement?.closest(\"[role='menu']\") ? activeId() : undefined;\n setModel(next);\n });\n });\n /** The entry that stands in for `id` in the next model: itself, the \"+n\" entry that hides it, or its nearest neighbour. */\n const successor = (before: TimelineModel, after: TimelineModel, id: string): string | undefined => {\n if (after.entries.has(id)) return id;\n for (const entry of after.entries.values())\n if (entry.kind === \"more\" && entry.hidden.some((hidden) => hidden.id === id)) return entry.id;\n const index = before.order.indexOf(id);\n return [...before.order.slice(index + 1), ...before.order.slice(0, Math.max(0, index)).reverse()].find((other) =>\n after.entries.has(other),\n );\n };\n // Days loading at either end, and items changing, keep what the reader sees in place, and keep focus.\n createEffect(\n on(model, (current, previous) => {\n if (!previous) return;\n scrollBy(shiftOf(previous, current));\n const id = focused === undefined ? undefined : successor(previous, current, focused);\n focused = undefined;\n if (id !== undefined && !root?.contains(document.activeElement)) {\n setActive(id);\n // A day that only now holds the tab stop renders right after this update.\n const focus = () => elementOf(id)?.focus({ preventScroll: true });\n if (!elementOf(id)) queueMicrotask(focus);\n else focus();\n }\n refresh();\n }),\n );\n\n onMount(() => {\n if (isServer || !viewport || !root) return;\n setLayout(readLayout());\n refresh();\n let frame = 0;\n const schedule = () => {\n if (frame) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n refresh();\n });\n };\n // Scrolls of the strip and of the areas around it, which move it too.\n const onScroll = (event: Event) => {\n const target = event.target;\n if (target !== document && !(target instanceof Node && viewport && target.contains(viewport))) return;\n scrolled();\n schedule();\n };\n const resize = new ResizeObserver(() => {\n const next = readLayout();\n const previous = layout();\n if (next.axis !== previous.axis || next.units.some((value, index) => value !== previous.units[index])) {\n setLayout(next);\n if (edgeTime !== undefined) scrollBy(px(edgeTime) - visible()[0]);\n refresh();\n } else schedule();\n });\n resize.observe(viewport);\n viewport.addEventListener(\"wheel\", onWheel, { passive: false });\n viewport.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"keydown\", onKeyDown, true);\n window.addEventListener(\"scroll\", onScroll, { passive: true, capture: true });\n const timer = props.now === undefined ? setInterval(() => setClock(Date.now()), 30_000) : undefined;\n onCleanup(() => {\n resize.disconnect();\n viewport?.removeEventListener(\"wheel\", onWheel);\n viewport?.removeEventListener(\"touchstart\", onTouchStart);\n root?.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"scroll\", onScroll, { capture: true });\n cancelAnimationFrame(frame);\n cancelAnimationFrame(wheelFrame);\n cancelAnimationFrame(restFrame);\n if (timer) clearInterval(timer);\n });\n props.controller?.({\n scrollToTime: (time, options) => scrollToTime(parseTimelineTime(time, context()), options?.align),\n scrollToNow: () => scrollToTime(now(), \"center\"),\n });\n });\n\n const nowShown = () => now() >= model().from && now() < model().to;\n\n const Heading = (headingProps: { group: TimelineGroup }) => (\n <Dynamic\n component={`h${props.headingLevel ?? 3}`}\n id={`${baseId}-${headingProps.group.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`}\n class=\"k2b-timeline__heading\"\n >\n <Show when={headingProps.group.today}>\n <span class=\"k2b-timeline__today\">{messages().today}</span>\n </Show>\n <span class=\"k2b-timeline__day\">{dayRange(headingProps.group.firstKey, headingProps.group.lastKey, dayFormat())}</span>\n </Dynamic>\n );\n\n const ItemControl = (itemProps: { entry: TimelineItemEntry }) => {\n const entry = () => itemProps.entry;\n const name = createMemo(() => spoken(entry()));\n const time = () => {\n const current = entry();\n if (current.kind === \"all-day\") return \"\";\n if (current.kind !== \"folded\" && current.end > current.start) return `${formatTime(current.start)}–${formatTime(current.end)}`;\n return formatTime(current.start);\n };\n return (\n <Dynamic\n component={entry().item.href ? \"a\" : \"button\"}\n type={entry().item.href ? undefined : \"button\"}\n href={entry().item.href}\n class=\"k2b-timeline__item\"\n data-entry-id={entry().id}\n tabindex={activeId() === entry().id ? 0 : -1}\n aria-label={name()}\n title={name()}\n onClick={(event: MouseEvent) => activate(event, entry())}\n >\n <Show when={entry().item.checked !== undefined}>\n <span class=\"k2b-timeline__check\" data-checked={entry().item.checked ? \"true\" : undefined} aria-hidden=\"true\">\n <i class=\"ti ti-check\" />\n </span>\n </Show>\n <span class=\"k2b-timeline__text\">\n <span class=\"k2b-timeline__label\">{entry().item.label}</span>\n <Show when={time()}>\n <span class=\"k2b-timeline__time\">{time()}</span>\n </Show>\n <Show when={entry().item.detail}>\n <span class=\"k2b-timeline__detail\">{entry().item.detail}</span>\n </Show>\n </span>\n </Dynamic>\n );\n };\n\n const MoreControl = (moreProps: { entry: TimelineMoreEntry }) => {\n const entry = () => moreProps.entry;\n const label = () => {\n const current = entry();\n const count = timelineMessages().timelineMore({ count: current.hidden.length });\n return current.area === \"all-day\"\n ? count\n : `${count}, ${timelineMessages().timelineTimeRange({ start: formatTime(current.start), end: formatTime(current.end) })}`;\n };\n // A row opens its item as a click on it does. Where only the checkbox may change, the row is that checkbox.\n const items = (): DropdownItem[] =>\n entry().hidden.map((hidden): DropdownItem => {\n const { item } = hidden;\n const parts = [when(hidden), ...(item.detail ? [item.detail] : [])];\n const state = item.checked === undefined ? [] : [item.checked ? timelineMessages().timelineDone : timelineMessages().timelineOpen];\n const icon = item.checked === undefined ? undefined : item.checked ? \"ti ti-circle-check\" : \"ti ti-circle\";\n const base = { label: item.label, description: [...parts, ...state].join(\", \"), icon };\n const open = props.onActivate;\n if (open) return item.href ? { ...base, href: item.href, action: () => open(item) } : { ...base, action: () => open(item) };\n if (item.href) return { ...base, href: item.href };\n const toggle = props.onToggle;\n if (toggle && item.checked !== undefined) {\n const checked = item.checked;\n return { label: item.label, description: parts.join(\", \"), choice: \"checkbox\", checked, action: () => toggle(item, !checked) };\n }\n return { ...base, disabled: true };\n });\n return (\n <Dropdown.Root items={items()} label={label()} class=\"k2b-timeline__more-root\">\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-timeline__item k2b-timeline__more\"\n data-entry-id={entry().id}\n tabIndex={activeId() === entry().id ? 0 : -1}\n label={label()}\n title={label()}\n >\n +{entry().hidden.length}\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n };\n\n const Slot = (slotProps: { id: string }) => {\n const entry = createMemo<TimelineEntry>(\n (previous) => model().entries.get(slotProps.id) ?? previous,\n model().entries.get(slotProps.id)!,\n );\n const color = () => {\n const current = entry();\n return colorAttributes(current.kind === \"more\" ? undefined : current.item.color);\n };\n const span = () => {\n const current = entry();\n if (current.kind !== \"band\") return undefined;\n const minutes = (current.end - current.start) / 60_000;\n return minutes < 30 ? \"xs\" : minutes < 60 ? \"s\" : minutes < 120 ? \"m\" : \"l\";\n };\n return (\n <li\n class=\"k2b-timeline__slot\"\n data-kind={entry().kind}\n data-area={asMore(entry())?.area}\n data-past={isPast(entry()) ? \"true\" : undefined}\n data-span={span()}\n data-color={color().token}\n style={{\n \"--k2b-timeline-at\": spanCss(entry().at),\n \"--k2b-timeline-size\": spanCss(entry().size),\n \"--k2b-timeline-lane\": String(entry().lane),\n \"--k2b-timeline-lanes\": String(entry().lanes),\n \"--k2b-timeline-accent\": color().accent,\n }}\n >\n <Show when={asMore(entry())} fallback={<ItemControl entry={asItem(entry())!} />}>\n {(more) => <MoreControl entry={more()} />}\n </Show>\n </li>\n );\n };\n\n const Group = (groupProps: { key: string }) => {\n const group = createMemo<TimelineGroup>(\n (previous) => groupsByKey().get(groupProps.key) ?? previous,\n groupsByKey().get(groupProps.key)!,\n );\n const headingId = () => `${baseId}-${group().key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n return (\n <div\n class=\"k2b-timeline__group\"\n data-kind={group().kind}\n data-today={group().today ? \"true\" : undefined}\n data-past={group().past ? \"true\" : undefined}\n data-row={group().row ? \"true\" : undefined}\n style={{ \"--k2b-timeline-at\": spanCss(group().at), \"--k2b-timeline-size\": spanCss(group().size) }}\n >\n <Heading group={group()} />\n <div class=\"k2b-timeline__decor\" aria-hidden=\"true\">\n <Index each={group().folds}>\n {(fold) => (\n <div\n class=\"k2b-timeline__fold\"\n data-kind={fold().kind}\n style={{ \"--k2b-timeline-at\": spanCss(fold().at), \"--k2b-timeline-size\": spanCss(fold().size) }}\n >\n <i class=\"ti ti-moon\" />\n <span class=\"k2b-timeline__fold-label\">\n {fold().kind === \"night\" ? nightLabel() : timelineMessages().timelineNothingPlanned}\n </span>\n </div>\n )}\n </Index>\n <Index each={group().hours}>\n {(hour) => (\n <span class=\"k2b-timeline__hour\" style={{ \"--k2b-timeline-at\": spanCss(hour().at) }}>\n <span class=\"k2b-timeline__hour-label\">{formatTime(hour().time)}</span>\n </span>\n )}\n </Index>\n <Index each={group().gaps}>\n {(gap) => (\n <span\n class=\"k2b-timeline__gap\"\n data-long={gap().long ? \"true\" : undefined}\n data-past={gap().end <= now() ? \"true\" : undefined}\n style={{ \"--k2b-timeline-at\": spanCss(gap().at) }}\n >\n {timelineMessages().timelineFree({ duration: hoursFormat().format(gap().hours) })}\n </span>\n )}\n </Index>\n <Index each={group().echoes}>\n {(echo) => {\n const color = () => {\n const current = echo();\n return colorAttributes(current.kind === \"more\" ? undefined : current.item.color);\n };\n return (\n // A pointer shortcut to an item that the keyboard and screen readers reach on the day it starts.\n // biome-ignore lint/a11y/noStaticElementInteractions: hidden from assistive technology on purpose.\n // biome-ignore lint/a11y/useKeyWithClickEvents: the item itself is the keyboard target.\n <span\n class=\"k2b-timeline__echo\"\n data-color={color().token}\n data-past={isPast(echo()) ? \"true\" : undefined}\n style={{ \"--k2b-timeline-lane\": String(echo().lane), \"--k2b-timeline-accent\": color().accent }}\n onClick={() => elementOf(echo().id)?.click()}\n >\n {asItem(echo())?.item.label ?? `+${asMore(echo())?.hidden.length ?? 0}`}\n </span>\n );\n }}\n </Index>\n </div>\n <Show when={group().entries.length > 0}>\n <ol class=\"k2b-timeline__list\" aria-labelledby={headingId()}>\n <For each={group().entries.map((entry) => entry.id)}>{(id) => <Slot id={id} />}</For>\n </ol>\n </Show>\n </div>\n );\n };\n\n return (\n <section\n ref={root}\n class={`k2b-timeline ${props.class ?? \"\"}`}\n aria-label={props.label ?? timelineMessages().timeline}\n aria-describedby={`${baseId}-hint`}\n aria-busy={props.busy ? \"true\" : undefined}\n onFocusIn={(event) => {\n const id = (event.target as HTMLElement).closest<HTMLElement>(\"[data-entry-id]\")?.dataset.entryId;\n if (id !== undefined) setActive(id);\n }}\n >\n <div ref={viewport} class=\"k2b-timeline__viewport\" tabIndex={model().order.length === 0 ? 0 : undefined}>\n <div ref={track} class=\"k2b-timeline__track\" style={{ \"--k2b-timeline-length\": spanCss(model().total) }}>\n <For each={renderedKeys()}>{(key) => <Group key={key} />}</For>\n <div\n class=\"k2b-timeline__now\"\n aria-hidden=\"true\"\n data-hidden={nowShown() ? undefined : \"true\"}\n style={{ \"--k2b-timeline-at\": spanCss(model().posOf(now())) }}\n >\n <span class=\"k2b-timeline__now-time\">{formatTime(now())}</span>\n </div>\n </div>\n </div>\n <span id={`${baseId}-hint`} class=\"k2b-sr-only\">\n {timelineMessages().timelineHint}\n </span>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@ import { use as _$use } from "solid-js/web";
|
|
|
12
12
|
var _tmpl$ = /*#__PURE__*/_$template(`<video class=k2b-video-player__video controls playsinline preload=metadata tabindex=0>`),
|
|
13
13
|
_tmpl$2 = /*#__PURE__*/_$template(`<div>`),
|
|
14
14
|
_tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-video-player__fallback>`);
|
|
15
|
+
import { useVideoMessages } from "./video-messages";
|
|
15
16
|
/**
|
|
16
17
|
* VideoPlayer — one video with the browser's own controls inside a frame whose
|
|
17
18
|
* size never depends on the video. The frame fills the height its host gives
|
|
@@ -21,7 +22,6 @@ var _tmpl$ = /*#__PURE__*/_$template(`<video class=k2b-video-player__video contr
|
|
|
21
22
|
*/
|
|
22
23
|
|
|
23
24
|
import { batch, createEffect, createSignal, Match, Switch } from "solid-js";
|
|
24
|
-
import { useUiMessages } from "../intl/messages";
|
|
25
25
|
import Placeholder from "../surfaces/Placeholder";
|
|
26
26
|
/** How far the arrow keys move playback, in seconds. */
|
|
27
27
|
const SEEK_STEP = 5;
|
|
@@ -39,7 +39,7 @@ const RESUME_TOLERANCE = 0.05;
|
|
|
39
39
|
/** Where focus goes when the fallback replaces the focused video. */
|
|
40
40
|
const FALLBACK_FOCUS = ".k2b-video-player__fallback :is(a[href], button:not(:disabled))";
|
|
41
41
|
export function VideoPlayer(props) {
|
|
42
|
-
const
|
|
42
|
+
const videoMessages = useVideoMessages();
|
|
43
43
|
const [source, setSource] = createSignal(props.src);
|
|
44
44
|
/** Where the address in `source` starts, in seconds: 0 from the beginning, otherwise where a renewal continues. */
|
|
45
45
|
const [start, setStart] = createSignal(0);
|
|
@@ -217,10 +217,10 @@ export function VideoPlayer(props) {
|
|
|
217
217
|
state: "error",
|
|
218
218
|
icon: "ti ti-video-off",
|
|
219
219
|
get title() {
|
|
220
|
-
return
|
|
220
|
+
return videoMessages().videoCannotPlay;
|
|
221
221
|
},
|
|
222
222
|
get description() {
|
|
223
|
-
return
|
|
223
|
+
return videoMessages().videoCannotPlayDescription;
|
|
224
224
|
},
|
|
225
225
|
get action() {
|
|
226
226
|
return props.fallbackAction;
|
|
@@ -252,7 +252,7 @@ export function VideoPlayer(props) {
|
|
|
252
252
|
_el$2.$$keydown = onKeyDown;
|
|
253
253
|
var _ref$2 = video;
|
|
254
254
|
typeof _ref$2 === "function" ? _$use(_ref$2, _el$2) : video = _el$2;
|
|
255
|
-
_$insert(_el$2, () =>
|
|
255
|
+
_$insert(_el$2, () => videoMessages().videoUnsupported);
|
|
256
256
|
_$effect(_p$ => {
|
|
257
257
|
var _v$ = videoSource(),
|
|
258
258
|
_v$2 = props.poster,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/VideoPlayer.tsx"],"sourcesContent":["/**\n * VideoPlayer — one video with the browser's own controls inside a frame whose\n * size never depends on the video. The frame fills the height its host gives\n * it, or keeps a ratio where the host leaves the height open. The picture fits\n * inside uncropped, so a portrait reel and a wide recording both show whole and\n * nothing moves while the video loads.\n */\n\nimport { batch, createEffect, createSignal, type JSX, Match, Switch } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\n\nexport type VideoPlayerProps = {\n /**\n * Inline address of the video. Seeking needs a server that answers `Range` requests; Safari plays nothing without.\n * Null while the host still fetches it, for example a signed URL: the frame already shows at its final size.\n */\n src: string | null;\n /** Names the video for assistive technology, for example its file name. */\n label: string;\n /** Picture shown before playback starts. Without one, the player shows the first frame. */\n poster?: string;\n /** Width divided by height of the frame where the host leaves its height open. Defaults to 16 / 9. */\n ratio?: number;\n /** CORS mode for a video on another origin. Omit to keep the browser default. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /**\n * Resolves a fresh address of the same video, for example a renewed signed URL. When playback fails, the player asks\n * for one and continues at the same time, playing if it was. A renewed address that fails before it shows that point,\n * or within ten seconds after, shows the fallback, so a renewed address must stay valid for longer.\n */\n renew?: () => Promise<string>;\n /** Offered with the fallback when the browser cannot play the video, typically a download. */\n fallbackAction?: JSX.Element;\n /**\n * Shown in the frame instead of the video while set, for example the host's own error with a retry when it could not\n * fetch the address. The frame keeps its size.\n */\n error?: JSX.Element;\n /** Called when the player gives up on the video and shows its fallback. */\n onFallback?: () => void;\n class?: string;\n};\n\n/** How far the arrow keys move playback, in seconds. */\nconst SEEK_STEP = 5;\n\n/**\n * How long a renewed address has to hold at the point where its predecessor failed before a failure there counts as\n * new. A video that cannot play at a point fails again within moments, also where the engine reads or decodes ahead of\n * playback; an expired address fails only after its lifetime, which for a signed URL is typically a minute or more.\n */\nconst RENEWED_GRACE_MS = 10_000;\n\n/** How close to the point where a renewed address continues the video has to be to count as there, in seconds. */\nconst RESUME_TOLERANCE = 0.05;\n\n/** Where focus goes when the fallback replaces the focused video. */\nconst FALLBACK_FOCUS = \".k2b-video-player__fallback :is(a[href], button:not(:disabled))\";\n\nexport function VideoPlayer(props: VideoPlayerProps) {\n const messages = useUiMessages();\n const [source, setSource] = createSignal<string | null>(props.src);\n /** Where the address in `source` starts, in seconds: 0 from the beginning, otherwise where a renewal continues. */\n const [start, setStart] = createSignal(0);\n const [failed, setFailed] = createSignal(false);\n let frame: HTMLDivElement | undefined;\n let video: HTMLVideoElement | undefined;\n /**\n * The last renewal: where to continue once the renewed address has loaded, and since when it shows that point. Until\n * it has held there for a while, a failure means the video itself does not play, not that the address expired.\n */\n let renewal: { time: number; rate: number; playing: boolean; loaded: boolean; readyAt: number | null } | null = null;\n /** Playing as the viewer meant it; a failing source may stop without a pause event. */\n let playing = false;\n\n // A new address from the host is another video: start over without resuming. It counts as new against the address\n // the player started with, because the host may change it before this effect first runs, for example on mount.\n let hostSrc = props.src;\n createEffect(() => {\n const src = props.src;\n if (src === hostSrc) return;\n hostSrc = src;\n renewal = null;\n playing = false;\n batch(() => {\n setFailed(false);\n setStart(0);\n setSource(src);\n });\n });\n\n // A media fragment makes the engine start where a renewed address continues, so no seek of the player's own competes\n // with it: WebKit drops a seek that arrives while the fragment's is under way. It replaces a fragment the renewed\n // address brings, which would start the engine at another point. Safari on iOS shows no frame before playback without\n // a poster; a fragment just after the beginning makes it load and show the first one.\n const videoSource = () => {\n const src = source();\n if (!src) return undefined;\n if (start() > 0) return `${src.replace(/#.*$/, \"\")}#t=${start().toFixed(3)}`;\n return src.includes(\"#\") || props.poster ? src : `${src}#t=0.001`;\n };\n\n const giveUp = () => {\n // The fallback replaces the video, so focus on the video would drop to the page; it moves into the fallback.\n const focused = video !== undefined && document.activeElement === video;\n setFailed(true);\n if (focused) (frame?.querySelector<HTMLElement>(FALLBACK_FOCUS) ?? frame)?.focus();\n props.onFallback?.();\n };\n\n const fail = async () => {\n const element = video;\n if (!element || failed()) return;\n const recent = renewal && (renewal.readyAt === null || performance.now() - renewal.readyAt < RENEWED_GRACE_MS);\n if (!props.renew || recent) return giveUp();\n const requested = props.src;\n const time = element.currentTime;\n renewal = { time, rate: element.playbackRate, playing, loaded: false, readyAt: null };\n try {\n const renewed = await props.renew();\n if (requested !== props.src) return;\n const before = videoSource();\n batch(() => {\n setStart(time);\n setSource(renewed);\n });\n if (videoSource() === before) element.load();\n } catch {\n if (requested === props.src) giveUp();\n }\n };\n\n const loaded = () => {\n const element = video;\n if (!element) return;\n // Sound in an empty frame: the browser cannot decode the picture, for example HEVC outside Safari. A fresh address\n // does not change that.\n if (element.videoWidth === 0 && element.videoHeight === 0) return giveUp();\n if (!renewal || renewal.loaded) return;\n renewal.loaded = true;\n // WebKit applies the fragment only once it has a frame, so it may still stand at the beginning here; the player\n // seeks to the same point, and the fragment's seek that follows lands there too.\n if (renewal.time > 0 && Math.abs(element.currentTime - renewal.time) > RESUME_TOLERANCE) element.currentTime = renewal.time;\n element.playbackRate = renewal.rate;\n if (renewal.playing) void element.play().catch(() => undefined);\n };\n\n /** The renewed address holds once the video shows the point where it continues. */\n const ready = (event: Event & { currentTarget: HTMLVideoElement }) => {\n const element = event.currentTarget;\n if (renewal?.loaded && renewal.readyAt === null && !element.seeking && element.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA)\n renewal.readyAt = performance.now();\n };\n\n const fullscreen = (element: HTMLVideoElement) => {\n if (document.fullscreenElement) return void document.exitFullscreen().catch(() => undefined);\n if (element.requestFullscreen) return void element.requestFullscreen().catch(() => undefined);\n // Safari on iOS has no element fullscreen for video, only its own player.\n if (\"webkitEnterFullscreen\" in element && typeof element.webkitEnterFullscreen === \"function\") element.webkitEnterFullscreen();\n };\n\n const toggle = (element: HTMLVideoElement) => {\n if (element.paused) void element.play().catch(() => undefined);\n else element.pause();\n };\n\n /** Whether the video was paused when Space went down; null while no Space press is open. */\n let spacePaused: boolean | null = null;\n\n // Native controls differ per engine: WebKit has no keyboard playback at all, so the player gives every engine the\n // same keys. The keys reach the player only while the video itself has focus, not one of the browser's buttons.\n const onKeyDown = (event: KeyboardEvent & { currentTarget: HTMLVideoElement }) => {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const element = event.currentTarget;\n switch (event.key) {\n case \" \":\n // Chromium toggles on release whatever the page does, so Space waits for it and toggles only if it did not.\n if (!event.repeat) spacePaused = element.paused;\n break;\n case \"k\":\n toggle(element);\n break;\n case \"ArrowLeft\":\n element.currentTime = Math.max(0, element.currentTime - SEEK_STEP);\n break;\n case \"ArrowRight\":\n element.currentTime = Number.isFinite(element.duration)\n ? Math.min(element.duration, element.currentTime + SEEK_STEP)\n : element.currentTime + SEEK_STEP;\n break;\n case \"m\":\n element.muted = !element.muted;\n break;\n case \"f\":\n fullscreen(element);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onKeyUp = (event: KeyboardEvent & { currentTarget: HTMLVideoElement }) => {\n if (event.key !== \" \" || spacePaused === null) return;\n const element = event.currentTarget;\n const paused = spacePaused;\n spacePaused = null;\n setTimeout(() => {\n if (element.paused === paused) toggle(element);\n });\n };\n\n return (\n <div\n ref={frame}\n class={`k2b-video-player ${props.class ?? \"\"}`}\n data-state={failed() ? \"failed\" : undefined}\n tabIndex={failed() ? -1 : undefined}\n style={{ \"aspect-ratio\": String(props.ratio && props.ratio > 0 ? props.ratio : 16 / 9) }}\n >\n <Switch fallback={<Placeholder class=\"k2b-video-player__fallback\" state=\"loading\" />}>\n <Match when={props.error}>{(error) => <div class=\"k2b-video-player__fallback\">{error()}</div>}</Match>\n <Match when={failed()}>\n <Placeholder\n class=\"k2b-video-player__fallback\"\n state=\"error\"\n icon=\"ti ti-video-off\"\n title={messages().videoCannotPlay}\n description={messages().videoCannotPlayDescription}\n action={props.fallbackAction}\n />\n </Match>\n <Match when={source()}>\n <video\n ref={video}\n class=\"k2b-video-player__video\"\n src={videoSource()}\n poster={props.poster}\n crossOrigin={props.crossOrigin}\n controls\n playsinline\n preload=\"metadata\"\n tabIndex={0}\n aria-label={props.label}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n onPlay={() => {\n playing = true;\n }}\n onPause={(event) => {\n // A video that stops because its source failed has not been paused by the viewer.\n if (!event.currentTarget.error) playing = false;\n }}\n onEnded={() => {\n playing = false;\n }}\n onLoadedMetadata={loaded}\n onLoadedData={ready}\n onSeeked={ready}\n onCanPlay={ready}\n onError={() => void fail()}\n >\n {messages().videoUnsupported}\n </video>\n </Match>\n </Switch>\n </div>\n );\n}\n\nexport default VideoPlayer;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/VideoPlayer.tsx"],"sourcesContent":["import { useVideoMessages } from \"./video-messages\";\n/**\n * VideoPlayer — one video with the browser's own controls inside a frame whose\n * size never depends on the video. The frame fills the height its host gives\n * it, or keeps a ratio where the host leaves the height open. The picture fits\n * inside uncropped, so a portrait reel and a wide recording both show whole and\n * nothing moves while the video loads.\n */\n\nimport { batch, createEffect, createSignal, type JSX, Match, Switch } from \"solid-js\";\n\nimport Placeholder from \"../surfaces/Placeholder\";\n\nexport type VideoPlayerProps = {\n /**\n * Inline address of the video. Seeking needs a server that answers `Range` requests; Safari plays nothing without.\n * Null while the host still fetches it, for example a signed URL: the frame already shows at its final size.\n */\n src: string | null;\n /** Names the video for assistive technology, for example its file name. */\n label: string;\n /** Picture shown before playback starts. Without one, the player shows the first frame. */\n poster?: string;\n /** Width divided by height of the frame where the host leaves its height open. Defaults to 16 / 9. */\n ratio?: number;\n /** CORS mode for a video on another origin. Omit to keep the browser default. */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n /**\n * Resolves a fresh address of the same video, for example a renewed signed URL. When playback fails, the player asks\n * for one and continues at the same time, playing if it was. A renewed address that fails before it shows that point,\n * or within ten seconds after, shows the fallback, so a renewed address must stay valid for longer.\n */\n renew?: () => Promise<string>;\n /** Offered with the fallback when the browser cannot play the video, typically a download. */\n fallbackAction?: JSX.Element;\n /**\n * Shown in the frame instead of the video while set, for example the host's own error with a retry when it could not\n * fetch the address. The frame keeps its size.\n */\n error?: JSX.Element;\n /** Called when the player gives up on the video and shows its fallback. */\n onFallback?: () => void;\n class?: string;\n};\n\n/** How far the arrow keys move playback, in seconds. */\nconst SEEK_STEP = 5;\n\n/**\n * How long a renewed address has to hold at the point where its predecessor failed before a failure there counts as\n * new. A video that cannot play at a point fails again within moments, also where the engine reads or decodes ahead of\n * playback; an expired address fails only after its lifetime, which for a signed URL is typically a minute or more.\n */\nconst RENEWED_GRACE_MS = 10_000;\n\n/** How close to the point where a renewed address continues the video has to be to count as there, in seconds. */\nconst RESUME_TOLERANCE = 0.05;\n\n/** Where focus goes when the fallback replaces the focused video. */\nconst FALLBACK_FOCUS = \".k2b-video-player__fallback :is(a[href], button:not(:disabled))\";\n\nexport function VideoPlayer(props: VideoPlayerProps) {\n const videoMessages = useVideoMessages();\n const [source, setSource] = createSignal<string | null>(props.src);\n /** Where the address in `source` starts, in seconds: 0 from the beginning, otherwise where a renewal continues. */\n const [start, setStart] = createSignal(0);\n const [failed, setFailed] = createSignal(false);\n let frame: HTMLDivElement | undefined;\n let video: HTMLVideoElement | undefined;\n /**\n * The last renewal: where to continue once the renewed address has loaded, and since when it shows that point. Until\n * it has held there for a while, a failure means the video itself does not play, not that the address expired.\n */\n let renewal: { time: number; rate: number; playing: boolean; loaded: boolean; readyAt: number | null } | null = null;\n /** Playing as the viewer meant it; a failing source may stop without a pause event. */\n let playing = false;\n\n // A new address from the host is another video: start over without resuming. It counts as new against the address\n // the player started with, because the host may change it before this effect first runs, for example on mount.\n let hostSrc = props.src;\n createEffect(() => {\n const src = props.src;\n if (src === hostSrc) return;\n hostSrc = src;\n renewal = null;\n playing = false;\n batch(() => {\n setFailed(false);\n setStart(0);\n setSource(src);\n });\n });\n\n // A media fragment makes the engine start where a renewed address continues, so no seek of the player's own competes\n // with it: WebKit drops a seek that arrives while the fragment's is under way. It replaces a fragment the renewed\n // address brings, which would start the engine at another point. Safari on iOS shows no frame before playback without\n // a poster; a fragment just after the beginning makes it load and show the first one.\n const videoSource = () => {\n const src = source();\n if (!src) return undefined;\n if (start() > 0) return `${src.replace(/#.*$/, \"\")}#t=${start().toFixed(3)}`;\n return src.includes(\"#\") || props.poster ? src : `${src}#t=0.001`;\n };\n\n const giveUp = () => {\n // The fallback replaces the video, so focus on the video would drop to the page; it moves into the fallback.\n const focused = video !== undefined && document.activeElement === video;\n setFailed(true);\n if (focused) (frame?.querySelector<HTMLElement>(FALLBACK_FOCUS) ?? frame)?.focus();\n props.onFallback?.();\n };\n\n const fail = async () => {\n const element = video;\n if (!element || failed()) return;\n const recent = renewal && (renewal.readyAt === null || performance.now() - renewal.readyAt < RENEWED_GRACE_MS);\n if (!props.renew || recent) return giveUp();\n const requested = props.src;\n const time = element.currentTime;\n renewal = { time, rate: element.playbackRate, playing, loaded: false, readyAt: null };\n try {\n const renewed = await props.renew();\n if (requested !== props.src) return;\n const before = videoSource();\n batch(() => {\n setStart(time);\n setSource(renewed);\n });\n if (videoSource() === before) element.load();\n } catch {\n if (requested === props.src) giveUp();\n }\n };\n\n const loaded = () => {\n const element = video;\n if (!element) return;\n // Sound in an empty frame: the browser cannot decode the picture, for example HEVC outside Safari. A fresh address\n // does not change that.\n if (element.videoWidth === 0 && element.videoHeight === 0) return giveUp();\n if (!renewal || renewal.loaded) return;\n renewal.loaded = true;\n // WebKit applies the fragment only once it has a frame, so it may still stand at the beginning here; the player\n // seeks to the same point, and the fragment's seek that follows lands there too.\n if (renewal.time > 0 && Math.abs(element.currentTime - renewal.time) > RESUME_TOLERANCE) element.currentTime = renewal.time;\n element.playbackRate = renewal.rate;\n if (renewal.playing) void element.play().catch(() => undefined);\n };\n\n /** The renewed address holds once the video shows the point where it continues. */\n const ready = (event: Event & { currentTarget: HTMLVideoElement }) => {\n const element = event.currentTarget;\n if (renewal?.loaded && renewal.readyAt === null && !element.seeking && element.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA)\n renewal.readyAt = performance.now();\n };\n\n const fullscreen = (element: HTMLVideoElement) => {\n if (document.fullscreenElement) return void document.exitFullscreen().catch(() => undefined);\n if (element.requestFullscreen) return void element.requestFullscreen().catch(() => undefined);\n // Safari on iOS has no element fullscreen for video, only its own player.\n if (\"webkitEnterFullscreen\" in element && typeof element.webkitEnterFullscreen === \"function\") element.webkitEnterFullscreen();\n };\n\n const toggle = (element: HTMLVideoElement) => {\n if (element.paused) void element.play().catch(() => undefined);\n else element.pause();\n };\n\n /** Whether the video was paused when Space went down; null while no Space press is open. */\n let spacePaused: boolean | null = null;\n\n // Native controls differ per engine: WebKit has no keyboard playback at all, so the player gives every engine the\n // same keys. The keys reach the player only while the video itself has focus, not one of the browser's buttons.\n const onKeyDown = (event: KeyboardEvent & { currentTarget: HTMLVideoElement }) => {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const element = event.currentTarget;\n switch (event.key) {\n case \" \":\n // Chromium toggles on release whatever the page does, so Space waits for it and toggles only if it did not.\n if (!event.repeat) spacePaused = element.paused;\n break;\n case \"k\":\n toggle(element);\n break;\n case \"ArrowLeft\":\n element.currentTime = Math.max(0, element.currentTime - SEEK_STEP);\n break;\n case \"ArrowRight\":\n element.currentTime = Number.isFinite(element.duration)\n ? Math.min(element.duration, element.currentTime + SEEK_STEP)\n : element.currentTime + SEEK_STEP;\n break;\n case \"m\":\n element.muted = !element.muted;\n break;\n case \"f\":\n fullscreen(element);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n const onKeyUp = (event: KeyboardEvent & { currentTarget: HTMLVideoElement }) => {\n if (event.key !== \" \" || spacePaused === null) return;\n const element = event.currentTarget;\n const paused = spacePaused;\n spacePaused = null;\n setTimeout(() => {\n if (element.paused === paused) toggle(element);\n });\n };\n\n return (\n <div\n ref={frame}\n class={`k2b-video-player ${props.class ?? \"\"}`}\n data-state={failed() ? \"failed\" : undefined}\n tabIndex={failed() ? -1 : undefined}\n style={{ \"aspect-ratio\": String(props.ratio && props.ratio > 0 ? props.ratio : 16 / 9) }}\n >\n <Switch fallback={<Placeholder class=\"k2b-video-player__fallback\" state=\"loading\" />}>\n <Match when={props.error}>{(error) => <div class=\"k2b-video-player__fallback\">{error()}</div>}</Match>\n <Match when={failed()}>\n <Placeholder\n class=\"k2b-video-player__fallback\"\n state=\"error\"\n icon=\"ti ti-video-off\"\n title={videoMessages().videoCannotPlay}\n description={videoMessages().videoCannotPlayDescription}\n action={props.fallbackAction}\n />\n </Match>\n <Match when={source()}>\n <video\n ref={video}\n class=\"k2b-video-player__video\"\n src={videoSource()}\n poster={props.poster}\n crossOrigin={props.crossOrigin}\n controls\n playsinline\n preload=\"metadata\"\n tabIndex={0}\n aria-label={props.label}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n onPlay={() => {\n playing = true;\n }}\n onPause={(event) => {\n // A video that stops because its source failed has not been paused by the viewer.\n if (!event.currentTarget.error) playing = false;\n }}\n onEnded={() => {\n playing = false;\n }}\n onLoadedMetadata={loaded}\n onLoadedData={ready}\n onSeeked={ready}\n onCanPlay={ready}\n onError={() => void fail()}\n >\n {videoMessages().videoUnsupported}\n </video>\n </Match>\n </Switch>\n </div>\n );\n}\n\nexport default VideoPlayer;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,7 @@ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-virtual-feed__marker><span>
|
|
|
21
21
|
_tmpl$8 = /*#__PURE__*/_$template(`<div><div class=k2b-virtual-feed__viewport tabindex=-1><div class=k2b-virtual-feed__feed role=feed></div></div><!$><!/><!$><!/><!$><!/><div class=k2b-sr-only role=log aria-live=polite aria-relevant=additions>`);
|
|
22
22
|
import { createEffect, createRoot, createSignal, getOwner, on, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
23
23
|
import { useUiMessages } from "../intl/messages";
|
|
24
|
+
import { useFeedMessages } from "./feed-messages";
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* The tallest loaded window in px. Firefox renders an element taller than about 17.9 M px with a height of 0, so the
|
|
@@ -72,6 +73,7 @@ const leadOf = node => {
|
|
|
72
73
|
*/
|
|
73
74
|
export function VirtualFeed(props) {
|
|
74
75
|
const messages = useUiMessages();
|
|
76
|
+
const feedMessages = useFeedMessages();
|
|
75
77
|
let viewport;
|
|
76
78
|
let feed;
|
|
77
79
|
let log;
|
|
@@ -294,7 +296,7 @@ export function VirtualFeed(props) {
|
|
|
294
296
|
get children() {
|
|
295
297
|
var _el$2 = _$getNextElement(_tmpl$),
|
|
296
298
|
_el$3 = _el$2.firstChild;
|
|
297
|
-
_$insert(_el$3, () => props.markerLabel ??
|
|
299
|
+
_$insert(_el$3, () => props.markerLabel ?? feedMessages().feedNewMarker);
|
|
298
300
|
return _el$2;
|
|
299
301
|
}
|
|
300
302
|
}), _el$7, _co$2);
|
|
@@ -629,7 +631,7 @@ export function VirtualFeed(props) {
|
|
|
629
631
|
announceTimer = undefined;
|
|
630
632
|
const batch = pendingAnnouncement;
|
|
631
633
|
pendingAnnouncement = [];
|
|
632
|
-
const text = props.announce ? props.announce(batch) :
|
|
634
|
+
const text = props.announce ? props.announce(batch) : feedMessages().feedNewItems({
|
|
633
635
|
count: batch.length
|
|
634
636
|
});
|
|
635
637
|
if (!text) return;
|
|
@@ -1076,7 +1078,7 @@ export function VirtualFeed(props) {
|
|
|
1076
1078
|
preventScroll: true
|
|
1077
1079
|
});else focusRow(list.length - 1);
|
|
1078
1080
|
};
|
|
1079
|
-
_$insert(_el$18, () =>
|
|
1081
|
+
_$insert(_el$18, () => feedMessages().feedJumpToLatest, _el$22, _co$5);
|
|
1080
1082
|
_$insert(_el$18, _$createComponent(Show, {
|
|
1081
1083
|
get when() {
|
|
1082
1084
|
return shownCount() > 0;
|
|
@@ -1088,7 +1090,7 @@ export function VirtualFeed(props) {
|
|
|
1088
1090
|
}
|
|
1089
1091
|
}), _el$24, _co$6);
|
|
1090
1092
|
_$effect(_p$ => {
|
|
1091
|
-
var _v$8 = shownCount() > 0 ?
|
|
1093
|
+
var _v$8 = shownCount() > 0 ? feedMessages().feedJumpToLatestCount({
|
|
1092
1094
|
count: shownCount()
|
|
1093
1095
|
}) : undefined,
|
|
1094
1096
|
_v$9 = loadingNewer() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-down";
|