@k2b/ui 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/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 +18 -19
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +20 -12
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +9 -7
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +4 -2
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +3 -3
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +68 -59
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js +3 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +30 -26
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +9 -7
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +37 -28
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +9 -7
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js +3 -3
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MessageRow.js +24 -22
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/Pagination.js +7 -7
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +15 -13
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js +3 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js +3 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +13 -11
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/VideoPlayer.js +5 -5
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +6 -4
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +10 -7
- package/dist/browser/content/ZoomPanViewport.js.map +1 -1
- package/dist/browser/content/calendar-messages.js +39 -1
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +4 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-messages.js +136 -0
- package/dist/browser/content/chart-messages.js.map +1 -0
- package/dist/browser/content/collection-selection.js +2 -0
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +24 -0
- package/dist/browser/content/data-table-messages.js.map +1 -0
- package/dist/browser/content/docs-messages.js +24 -0
- package/dist/browser/content/docs-messages.js.map +1 -0
- package/dist/browser/content/feed-messages.js +34 -0
- package/dist/browser/content/feed-messages.js.map +1 -0
- package/dist/browser/content/file-browser-messages.js +69 -0
- package/dist/browser/content/file-browser-messages.js.map +1 -0
- package/dist/browser/content/file-view-messages.js +64 -0
- package/dist/browser/content/file-view-messages.js.map +1 -0
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/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 +561 -418
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +6 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/Discussion.js +8 -5
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +8 -5
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js +7 -6
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +370 -0
- package/dist/browser/layout/PageTitle.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +8 -6
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Panes.js +23 -15
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +13 -4
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/Settings.js +14 -12
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js +6 -5
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +3 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +743 -12
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js +3 -2
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-messages.js +28 -0
- package/dist/browser/layout/floating-window-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/page-title-controller.js +169 -0
- package/dist/browser/layout/page-title-controller.js.map +1 -0
- package/dist/browser/layout/panel-dialog-messages.js +20 -0
- package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
- package/dist/browser/layout/panes-messages.js +48 -0
- package/dist/browser/layout/panes-messages.js.map +1 -0
- package/dist/browser/layout/refresh-messages.js +20 -0
- package/dist/browser/layout/refresh-messages.js.map +1 -0
- package/dist/browser/layout/settings-messages.js +54 -0
- package/dist/browser/layout/settings-messages.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +56 -0
- package/dist/browser/layout/workspace-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +5 -5
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +4 -2
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/Tag.js +3 -3
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +26 -0
- package/dist/browser/surfaces/avatar-messages.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +26 -0
- package/dist/browser/surfaces/resource-messages.js.map +1 -0
- package/dist/browser/widgets/Widget.js +6 -0
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/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 +18 -19
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +10 -8
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +9 -7
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +4 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +3 -3
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +10 -4
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +3 -1
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +30 -26
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +9 -7
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +37 -28
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -6
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js +3 -3
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +24 -22
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/Pagination.js +6 -6
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +15 -13
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js +3 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js +3 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +13 -11
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/VideoPlayer.js +5 -5
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +6 -4
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +7 -4
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
- package/dist/ssr/content/calendar-messages.js +39 -1
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +4 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-messages.js +136 -0
- package/dist/ssr/content/chart-messages.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +2 -0
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +24 -0
- package/dist/ssr/content/data-table-messages.js.map +1 -0
- package/dist/ssr/content/docs-messages.js +24 -0
- package/dist/ssr/content/docs-messages.js.map +1 -0
- package/dist/ssr/content/feed-messages.js +34 -0
- package/dist/ssr/content/feed-messages.js.map +1 -0
- package/dist/ssr/content/file-browser-messages.js +69 -0
- package/dist/ssr/content/file-browser-messages.js.map +1 -0
- package/dist/ssr/content/file-view-messages.js +64 -0
- package/dist/ssr/content/file-view-messages.js.map +1 -0
- package/dist/ssr/content/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 +203 -96
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +1 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +8 -5
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +8 -5
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +6 -5
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +253 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +8 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Panes.js +22 -14
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +13 -4
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/Settings.js +14 -12
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +6 -5
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +3 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +743 -12
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js +3 -2
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-messages.js +28 -0
- package/dist/ssr/layout/floating-window-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/page-title-controller.js +169 -0
- package/dist/ssr/layout/page-title-controller.js.map +1 -0
- package/dist/ssr/layout/panel-dialog-messages.js +20 -0
- package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
- package/dist/ssr/layout/panes-messages.js +48 -0
- package/dist/ssr/layout/panes-messages.js.map +1 -0
- package/dist/ssr/layout/refresh-messages.js +20 -0
- package/dist/ssr/layout/refresh-messages.js.map +1 -0
- package/dist/ssr/layout/settings-messages.js +54 -0
- package/dist/ssr/layout/settings-messages.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +56 -0
- package/dist/ssr/layout/workspace-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +5 -5
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +4 -2
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js +3 -3
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +26 -0
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +26 -0
- package/dist/ssr/surfaces/resource-messages.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +6 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/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/DataTable.d.ts +2 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-messages.d.ts +20 -1
- package/dist/types/content/chart-messages.d.ts +32 -0
- package/dist/types/content/data-table-messages.d.ts +10 -0
- package/dist/types/content/docs-messages.d.ts +10 -0
- package/dist/types/content/feed-messages.d.ts +15 -0
- package/dist/types/content/file-browser-messages.d.ts +33 -0
- package/dist/types/content/file-view-messages.d.ts +30 -0
- package/dist/types/content/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 +19 -4
- package/dist/types/layout/PageTitle.d.ts +64 -0
- package/dist/types/layout/app-workspace-controller.d.ts +4 -0
- package/dist/types/layout/app-workspace-state.d.ts +3 -2
- package/dist/types/layout/floating-window-messages.d.ts +12 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +7 -0
- package/dist/types/layout/page-title-controller.d.ts +13 -0
- package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
- package/dist/types/layout/panes-messages.d.ts +22 -0
- package/dist/types/layout/refresh-messages.d.ts +8 -0
- package/dist/types/layout/settings-messages.d.ts +25 -0
- package/dist/types/layout/workspace-messages.d.ts +26 -0
- package/dist/types/surfaces/avatar-messages.d.ts +11 -0
- package/dist/types/surfaces/resource-messages.d.ts +11 -0
- package/dist/types/widgets/Widget.d.ts +5 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const fileViewMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
column: ({
|
|
8
|
+
number
|
|
9
|
+
}) => `Column ${number}`,
|
|
10
|
+
fileSaved: "File saved",
|
|
11
|
+
noPreview: "No preview",
|
|
12
|
+
binaryFile: "Binary file",
|
|
13
|
+
csvSettings: "CSV preview settings",
|
|
14
|
+
csvEncoding: "Encoding",
|
|
15
|
+
csvSeparator: "Separator",
|
|
16
|
+
csvDefaultSeparator: "File type default",
|
|
17
|
+
csvComma: "Comma",
|
|
18
|
+
csvSemicolon: "Semicolon",
|
|
19
|
+
csvTab: "Tab",
|
|
20
|
+
csvView: "Display",
|
|
21
|
+
csvRaw: "Raw text",
|
|
22
|
+
delimitedFileEmpty: "This delimited file contains no rows.",
|
|
23
|
+
emptyFile: "Empty file",
|
|
24
|
+
failedLoadFile: "Failed to load file",
|
|
25
|
+
noInlinePreview: "No inline preview available for this source.",
|
|
26
|
+
previewMoreLines: n => `… ${n} more lines`,
|
|
27
|
+
previewColumnsLimited: "Showing the first 50 columns. Download the file for all columns.",
|
|
28
|
+
textEditor: "Text editor",
|
|
29
|
+
audioUnsupported: "Your browser does not support audio playback."
|
|
30
|
+
},
|
|
31
|
+
de: {
|
|
32
|
+
column: ({
|
|
33
|
+
number
|
|
34
|
+
}) => `Spalte ${number}`,
|
|
35
|
+
fileSaved: "Datei gespeichert",
|
|
36
|
+
noPreview: "Keine Vorschau",
|
|
37
|
+
binaryFile: "Binärdatei",
|
|
38
|
+
csvSettings: "CSV-Vorschau einstellen",
|
|
39
|
+
csvEncoding: "Zeichenkodierung",
|
|
40
|
+
csvSeparator: "Trennzeichen",
|
|
41
|
+
csvDefaultSeparator: "Standard des Dateityps",
|
|
42
|
+
csvComma: "Komma",
|
|
43
|
+
csvSemicolon: "Semikolon",
|
|
44
|
+
csvTab: "Tabulator",
|
|
45
|
+
csvView: "Darstellung",
|
|
46
|
+
csvRaw: "Rohtext",
|
|
47
|
+
delimitedFileEmpty: "Diese Trennzeichen-Datei enthält keine Zeilen.",
|
|
48
|
+
emptyFile: "Leere Datei",
|
|
49
|
+
failedLoadFile: "Datei konnte nicht geladen werden",
|
|
50
|
+
noInlinePreview: "Für diese Quelle ist keine direkte Vorschau verfügbar.",
|
|
51
|
+
previewMoreLines: n => `… ${n} weitere Zeilen`,
|
|
52
|
+
previewColumnsLimited: "Die ersten 50 Spalten werden angezeigt. Lade die Datei für alle Spalten herunter.",
|
|
53
|
+
textEditor: "Texteditor",
|
|
54
|
+
audioUnsupported: "Dein Browser unterstützt keine Audiowiedergabe."
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
/** Resolved from the inherited render locale. */
|
|
59
|
+
export const useFileViewMessages = () => {
|
|
60
|
+
const locale = useLocale();
|
|
61
|
+
return () => fileViewMessages.resolve([locale()]).t;
|
|
62
|
+
};
|
|
63
|
+
export const checkFileViewMessages = () => fileViewMessages.check();
|
|
64
|
+
//# sourceMappingURL=file-view-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/file-view-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst fileViewMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n column: ({ number }: { number: number }) => `Column ${number}`,\n fileSaved: \"File saved\",\n noPreview: \"No preview\",\n binaryFile: \"Binary file\",\n csvSettings: \"CSV preview settings\",\n csvEncoding: \"Encoding\",\n csvSeparator: \"Separator\",\n csvDefaultSeparator: \"File type default\",\n csvComma: \"Comma\",\n csvSemicolon: \"Semicolon\",\n csvTab: \"Tab\",\n csvView: \"Display\",\n csvRaw: \"Raw text\",\n delimitedFileEmpty: \"This delimited file contains no rows.\",\n emptyFile: \"Empty file\",\n failedLoadFile: \"Failed to load file\",\n noInlinePreview: \"No inline preview available for this source.\",\n previewMoreLines: (n: number) => `… ${n} more lines`,\n previewColumnsLimited: \"Showing the first 50 columns. Download the file for all columns.\",\n textEditor: \"Text editor\",\n audioUnsupported: \"Your browser does not support audio playback.\",\n },\n de: {\n column: ({ number }) => `Spalte ${number}`,\n fileSaved: \"Datei gespeichert\",\n noPreview: \"Keine Vorschau\",\n binaryFile: \"Binärdatei\",\n csvSettings: \"CSV-Vorschau einstellen\",\n csvEncoding: \"Zeichenkodierung\",\n csvSeparator: \"Trennzeichen\",\n csvDefaultSeparator: \"Standard des Dateityps\",\n csvComma: \"Komma\",\n csvSemicolon: \"Semikolon\",\n csvTab: \"Tabulator\",\n csvView: \"Darstellung\",\n csvRaw: \"Rohtext\",\n delimitedFileEmpty: \"Diese Trennzeichen-Datei enthält keine Zeilen.\",\n emptyFile: \"Leere Datei\",\n failedLoadFile: \"Datei konnte nicht geladen werden\",\n noInlinePreview: \"Für diese Quelle ist keine direkte Vorschau verfügbar.\",\n previewMoreLines: (n: number) => `… ${n} weitere Zeilen`,\n previewColumnsLimited: \"Die ersten 50 Spalten werden angezeigt. Lade die Datei für alle Spalten herunter.\",\n textEditor: \"Texteditor\",\n audioUnsupported: \"Dein Browser unterstützt keine Audiowiedergabe.\",\n },\n },\n});\n\nexport type FileViewMessages = ReturnType<(typeof fileViewMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useFileViewMessages = (): (() => FileViewMessages) => {\n const locale = useLocale();\n return () => fileViewMessages.resolve([locale()]).t;\n};\n\nexport const checkFileViewMessages = () => fileViewMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,MAAM,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,UAAU,MAAM,EAAE;MAC9D,SAAS,EAAE,YAAY;MACvB,SAAS,EAAE,YAAY;MACvB,UAAU,EAAE,aAAa;MACzB,WAAW,EAAE,sBAAsB;MACnC,WAAW,EAAE,UAAU;MACvB,YAAY,EAAE,WAAW;MACzB,mBAAmB,EAAE,mBAAmB;MACxC,QAAQ,EAAE,OAAO;MACjB,YAAY,EAAE,WAAW;MACzB,MAAM,EAAE,KAAK;MACb,OAAO,EAAE,SAAS;MAClB,MAAM,EAAE,UAAU;MAClB,kBAAkB,EAAE,uCAAuC;MAC3D,SAAS,EAAE,YAAY;MACvB,cAAc,EAAE,qBAAqB;MACrC,eAAe,EAAE,8CAA8C;MAC/D,gBAAgB,EAAG,CAAS,IAAK,KAAK,CAAC,aAAa;MACpD,qBAAqB,EAAE,kEAAkE;MACzF,UAAU,EAAE,aAAa;MACzB,gBAAgB,EAAE;IACpB,CAAC;IACD,EAAE,EAAE;MACF,MAAM,EAAE,CAAC;QAAE;MAAO,CAAC,KAAK,UAAU,MAAM,EAAE;MAC1C,SAAS,EAAE,mBAAmB;MAC9B,SAAS,EAAE,gBAAgB;MAC3B,UAAU,EAAE,YAAY;MACxB,WAAW,EAAE,yBAAyB;MACtC,WAAW,EAAE,kBAAkB;MAC/B,YAAY,EAAE,cAAc;MAC5B,mBAAmB,EAAE,wBAAwB;MAC7C,QAAQ,EAAE,OAAO;MACjB,YAAY,EAAE,WAAW;MACzB,MAAM,EAAE,WAAW;MACnB,OAAO,EAAE,aAAa;MACtB,MAAM,EAAE,SAAS;MACjB,kBAAkB,EAAE,gDAAgD;MACpE,SAAS,EAAE,aAAa;MACxB,cAAc,EAAE,mCAAmC;MACnD,eAAe,EAAE,wDAAwD;MACzE,gBAAgB,EAAG,CAAS,IAAK,KAAK,CAAC,iBAAiB;MACxD,qBAAqB,EAAE,mFAAmF;MAC1G,UAAU,EAAE,YAAY;MACxB,gBAAgB,EAAE;IACpB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const lightboxMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
closeLightbox: "Close lightbox",
|
|
8
|
+
downloadImage: "Download image",
|
|
9
|
+
imageLightbox: "Image lightbox",
|
|
10
|
+
imageNavigation: "Image navigation",
|
|
11
|
+
nextImage: "Next image",
|
|
12
|
+
previousImage: "Previous image",
|
|
13
|
+
goToImage: ({
|
|
14
|
+
index
|
|
15
|
+
}) => `Go to image ${index}`
|
|
16
|
+
},
|
|
17
|
+
de: {
|
|
18
|
+
closeLightbox: "Bildansicht schließen",
|
|
19
|
+
downloadImage: "Bild herunterladen",
|
|
20
|
+
imageLightbox: "Bildansicht",
|
|
21
|
+
imageNavigation: "Bildnavigation",
|
|
22
|
+
nextImage: "Nächstes Bild",
|
|
23
|
+
previousImage: "Vorheriges Bild",
|
|
24
|
+
goToImage: ({
|
|
25
|
+
index
|
|
26
|
+
}) => `Zu Bild ${index} wechseln`
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
/** Resolved from the inherited render locale. */
|
|
31
|
+
export const useLightboxMessages = () => {
|
|
32
|
+
const locale = useLocale();
|
|
33
|
+
return () => lightboxMessages.resolve([locale()]).t;
|
|
34
|
+
};
|
|
35
|
+
export const checkLightboxMessages = () => lightboxMessages.check();
|
|
36
|
+
//# sourceMappingURL=lightbox-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/lightbox-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst lightboxMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n closeLightbox: \"Close lightbox\",\n downloadImage: \"Download image\",\n imageLightbox: \"Image lightbox\",\n imageNavigation: \"Image navigation\",\n nextImage: \"Next image\",\n previousImage: \"Previous image\",\n goToImage: ({ index }: { index: number }) => `Go to image ${index}`,\n },\n de: {\n closeLightbox: \"Bildansicht schließen\",\n downloadImage: \"Bild herunterladen\",\n imageLightbox: \"Bildansicht\",\n imageNavigation: \"Bildnavigation\",\n nextImage: \"Nächstes Bild\",\n previousImage: \"Vorheriges Bild\",\n goToImage: ({ index }) => `Zu Bild ${index} wechseln`,\n },\n },\n});\n\nexport type LightboxMessages = ReturnType<(typeof lightboxMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useLightboxMessages = (): (() => LightboxMessages) => {\n const locale = useLocale();\n return () => lightboxMessages.resolve([locale()]).t;\n};\n\nexport const checkLightboxMessages = () => lightboxMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,aAAa,EAAE,gBAAgB;MAC/B,aAAa,EAAE,gBAAgB;MAC/B,aAAa,EAAE,gBAAgB;MAC/B,eAAe,EAAE,kBAAkB;MACnC,SAAS,EAAE,YAAY;MACvB,aAAa,EAAE,gBAAgB;MAC/B,SAAS,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,eAAe,KAAK;IACnE,CAAC;IACD,EAAE,EAAE;MACF,aAAa,EAAE,uBAAuB;MACtC,aAAa,EAAE,oBAAoB;MACnC,aAAa,EAAE,aAAa;MAC5B,eAAe,EAAE,gBAAgB;MACjC,SAAS,EAAE,eAAe;MAC1B,aAAa,EAAE,iBAAiB;MAChC,SAAS,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,WAAW,KAAK;IAC5C;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const logEntriesMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
noLogEntries: "No log entries found."
|
|
8
|
+
},
|
|
9
|
+
de: {
|
|
10
|
+
noLogEntries: "Keine Logeinträge gefunden."
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
/** Resolved from the inherited render locale. */
|
|
15
|
+
export const useLogEntriesMessages = () => {
|
|
16
|
+
const locale = useLocale();
|
|
17
|
+
return () => logEntriesMessages.resolve([locale()]).t;
|
|
18
|
+
};
|
|
19
|
+
export const checkLogEntriesMessages = () => logEntriesMessages.check();
|
|
20
|
+
//# sourceMappingURL=log-entries-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/log-entries-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst logEntriesMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n noLogEntries: \"No log entries found.\",\n },\n de: {\n noLogEntries: \"Keine Logeinträge gefunden.\",\n },\n },\n});\n\nexport type LogEntriesMessages = ReturnType<(typeof logEntriesMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useLogEntriesMessages = (): (() => LogEntriesMessages) => {\n const locale = useLocale();\n return () => logEntriesMessages.resolve([locale()]).t;\n};\n\nexport const checkLogEntriesMessages = () => logEntriesMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;EACrC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,YAAY,EAAE;IAChB,CAAC;IACD,EAAE,EAAE;MACF,YAAY,EAAE;IAChB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,qBAAqB,GAAG,MAAkC;EACrE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,MAAM,uBAAuB,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
const markdownInfoBlockMessages = i18n.define({
|
|
3
|
+
baseLocale: "en",
|
|
4
|
+
messages: {
|
|
5
|
+
en: {
|
|
6
|
+
infoBlockNote: "Note",
|
|
7
|
+
infoBlockInfo: "Info",
|
|
8
|
+
infoBlockSuccess: "Success",
|
|
9
|
+
infoBlockWarning: "Warning",
|
|
10
|
+
infoBlockDanger: "Danger"
|
|
11
|
+
},
|
|
12
|
+
de: {
|
|
13
|
+
infoBlockNote: "Notiz",
|
|
14
|
+
infoBlockInfo: "Info",
|
|
15
|
+
infoBlockSuccess: "Erfolg",
|
|
16
|
+
infoBlockWarning: "Warnung",
|
|
17
|
+
infoBlockDanger: "Gefahr"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
/** Imperative UI inherits the document locale when no locale is supplied. */
|
|
22
|
+
export const resolveMarkdownInfoBlockMessages = locale => markdownInfoBlockMessages.resolve([locale ?? (typeof document === "undefined" ? markdownInfoBlockMessages.baseLocale : document.documentElement.lang)]).t;
|
|
23
|
+
export const checkMarkdownInfoBlockMessages = () => markdownInfoBlockMessages.check();
|
|
24
|
+
//# sourceMappingURL=markdown-info-block-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/markdown-info-block-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\nconst markdownInfoBlockMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n infoBlockNote: \"Note\",\n infoBlockInfo: \"Info\",\n infoBlockSuccess: \"Success\",\n infoBlockWarning: \"Warning\",\n infoBlockDanger: \"Danger\",\n },\n de: {\n infoBlockNote: \"Notiz\",\n infoBlockInfo: \"Info\",\n infoBlockSuccess: \"Erfolg\",\n infoBlockWarning: \"Warnung\",\n infoBlockDanger: \"Gefahr\",\n },\n },\n});\n\nexport type MarkdownInfoBlockMessages = ReturnType<(typeof markdownInfoBlockMessages)[\"resolve\"]>[\"t\"];\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolveMarkdownInfoBlockMessages = (locale?: string): MarkdownInfoBlockMessages =>\n markdownInfoBlockMessages.resolve([\n locale ?? (typeof document === \"undefined\" ? markdownInfoBlockMessages.baseLocale : document.documentElement.lang),\n ]).t;\n\nexport const checkMarkdownInfoBlockMessages = () => markdownInfoBlockMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAElC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CAAC;EAC5C,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,aAAa,EAAE,MAAM;MACrB,aAAa,EAAE,MAAM;MACrB,gBAAgB,EAAE,SAAS;MAC3B,gBAAgB,EAAE,SAAS;MAC3B,eAAe,EAAE;IACnB,CAAC;IACD,EAAE,EAAE;MACF,aAAa,EAAE,OAAO;MACtB,aAAa,EAAE,MAAM;MACrB,gBAAgB,EAAE,QAAQ;MAC1B,gBAAgB,EAAE,SAAS;MAC3B,eAAe,EAAE;IACnB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,gCAAgC,GAAI,MAAe,IAC9D,yBAAyB,CAAC,OAAO,CAAC,CAChC,MAAM,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,yBAAyB,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CACnH,CAAC,CAAC,CAAC;AAEN,OAAO,MAAM,8BAA8B,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Lexer, Tokenizer } from "marked";
|
|
2
|
-
import { resolveUiMessages } from "../intl/messages";
|
|
3
2
|
import { NOTICE_CARD_CLASSES } from "../surfaces/NoticeCard";
|
|
3
|
+
import { resolveMarkdownInfoBlockMessages } from "./markdown-info-block-messages";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Markdown info blocks: one grammar and one look for every Markdown surface.
|
|
@@ -217,7 +217,7 @@ const renderBlock = (input, messages) => {
|
|
|
217
217
|
* and names the block; without one, the localized type name is announced to
|
|
218
218
|
* screen readers only.
|
|
219
219
|
*/
|
|
220
|
-
export const renderMarkdownInfoBlock = input => renderBlock(input,
|
|
220
|
+
export const renderMarkdownInfoBlock = input => renderBlock(input, resolveMarkdownInfoBlockMessages(input.locale));
|
|
221
221
|
|
|
222
222
|
/**
|
|
223
223
|
* What one `marked` lexer run knows about its document: the opening lines, the
|
|
@@ -355,7 +355,7 @@ const extensions = new WeakMap();
|
|
|
355
355
|
* extension, so a host may cache one `marked` instance per extension.
|
|
356
356
|
*/
|
|
357
357
|
export const markdownInfoBlocks = (options = {}) => {
|
|
358
|
-
const messages =
|
|
358
|
+
const messages = resolveMarkdownInfoBlockMessages(options.locale);
|
|
359
359
|
const extension = extensions.get(messages) ?? createExtension(messages);
|
|
360
360
|
extensions.set(messages, extension);
|
|
361
361
|
return extension;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/markdown-info-blocks.ts"],"sourcesContent":["import { Lexer, type MarkedExtension, Tokenizer, type TokenizerAndRendererExtension } from \"marked\";\nimport { resolveUiMessages, type UiMessages } from \"../intl/messages\";\nimport { NOTICE_CARD_CLASSES, type NoticeTone } from \"../surfaces/NoticeCard\";\n\n/**\n * Markdown info blocks: one grammar and one look for every Markdown surface.\n *\n * ```markdown\n * :::warning Before deleting\n * Deleting an item cannot be undone.\n * :::\n * ```\n *\n * The opening line holds `:::`, a type in any letter case, and an optional\n * plain-text title. The block ends at a line holding only `:::`, indented no\n * deeper than the opener; code, lists, quotes, and HTML inside the body cannot\n * end it. The body is ordinary Markdown. A block that is never closed stays\n * ordinary text.\n */\n\nconst TONES = {\n note: \"neutral\",\n info: \"info\",\n success: \"success\",\n warning: \"warning\",\n danger: \"danger\",\n} as const satisfies Record<string, NoticeTone>;\n\nexport type MarkdownInfoBlockType = keyof typeof TONES;\n\nexport type MarkdownInfoBlock = {\n type: MarkdownInfoBlockType;\n /** Plain-text title from the opening line. */\n title?: string;\n /** Raw Markdown between the opening and closing lines, with `\\n` line breaks. */\n body: string;\n /** Source length through the closing line, or the whole source when the block is not closed. */\n length: number;\n closed: boolean;\n};\n\nexport type MarkdownInfoBlockRenderInput = {\n type: MarkdownInfoBlockType;\n title?: string;\n /** Already rendered body HTML. The caller owns its sanitization. */\n bodyHtml: string;\n /** Locale for the screen-reader name of an untitled block. */\n locale?: string;\n};\n\nconst OPENER = /^( {0,3}):::(note|info|success|warning|danger)(?:[ \\t]+(.*?))?[ \\t]*$/i;\nconst START = /^ {0,3}:::(?:note|info|success|warning|danger)(?=[ \\t\\n]|$)/i;\nconst OPENERS = /(?<=^|\\n) {0,3}:::(?:note|info|success|warning|danger)(?=[ \\t\\n]|$)/gi;\nconst CLOSING = /^( {0,3}):::[ \\t]*$/;\nconst FENCE = /^( *)(`{3,}|~{3,})(.*)$/;\n\ntype ContainerKind = \"code\" | \"fences\" | \"list\" | \"blockquote\" | \"html\";\ntype ContainerToken = NonNullable<ReturnType<Tokenizer[ContainerKind]>>;\n\nconst LABELS: Record<MarkdownInfoBlockType, (t: UiMessages) => string> = {\n note: (t) => t.infoBlockNote,\n info: (t) => t.infoBlockInfo,\n success: (t) => t.infoBlockSuccess,\n warning: (t) => t.infoBlockWarning,\n danger: (t) => t.infoBlockDanger,\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst lineEnd = (source: string, from: number): number => {\n const end = source.indexOf(\"\\n\", from);\n return end < 0 ? source.length : end;\n};\n\nconst closes = (line: string, indent: number): boolean => {\n const closing = CLOSING.exec(line);\n return !!closing && closing[1]!.length <= indent;\n};\n\n/** Column where a list item's text starts, as CommonMark counts it. */\nconst itemTextIndent = (raw: string): number => {\n const [, bullet = \"\", gap = \"\"] = /^( {0,3}(?:[-+*]|\\d{1,9}[.)]))( *)/.exec(raw) ?? [];\n return bullet.length + (gap.length >= 1 && gap.length <= 4 && raw[bullet.length + gap.length] !== \"\\n\" ? gap.length : 1);\n};\n\n/**\n * Offset of the block's closing line inside a list or quote, or -1. Lazy\n * paragraph lines may hold it; a list item's own fenced code cannot.\n */\nconst closingLineIn = (token: ContainerToken, indent: number): number => {\n if (token.type !== \"list\" && token.type !== \"blockquote\") return -1;\n const items = token.type === \"list\" ? token.items : [];\n let item = -1;\n let itemStart = 0;\n let itemEnd = 0;\n let text = 0;\n let fence = \"\";\n for (let from = 0; from < token.raw.length; ) {\n while (item + 1 < items.length && from >= itemEnd) {\n item++;\n itemStart = itemEnd;\n itemEnd += items[item]!.raw.length;\n text = itemTextIndent(items[item]!.raw);\n fence = \"\";\n }\n const end = lineEnd(token.raw, from);\n const line = token.raw.slice(from, end);\n // A line indented less than the item's text has left the item and its fence.\n if (fence && line.trim() && line.length - line.trimStart().length < text) fence = \"\";\n // The first line of an item carries its bullet where the text would be indented.\n const marker = items.length ? FENCE.exec(from === itemStart ? \" \".repeat(text) + line.slice(text) : line) : null;\n if (fence) {\n if (marker && marker[2]![0] === fence[0] && marker[2]!.length >= fence.length && !marker[3]!.trim()) fence = \"\";\n } else if (\n marker &&\n marker[1]!.length >= text &&\n marker[1]!.length <= text + 3 &&\n !(marker[2]![0] === \"`\" && marker[3]!.includes(\"`\"))\n ) {\n fence = marker[2]!;\n } else if (closes(line, indent)) {\n return from;\n }\n from = end + 1;\n }\n return -1;\n};\n\n/** Whether `line` starts a block of its own after a paragraph line instead of continuing the paragraph, as marked decides. */\nconst interruptsParagraph = (line: string): boolean => Lexer.rules.block.gfm.paragraph.exec(`x\\n${line}\\n`)?.[0] === \"x\";\n\n/**\n * Reads info blocks in one `\\n`-separated source. The opening line reads like\n * a paragraph line, so the body continues it: only a block that may interrupt\n * a paragraph, such as a fence, a list, a quote, or block HTML, hides its\n * lines from the closing line. A scan's only state is its line and whether a\n * paragraph is open there, so a later scan that reaches a line an earlier one\n * passed ends the same way; `outcomes` remembers that, which keeps reading\n * many openers of one document linear.\n */\nconst infoBlockReader = (source: string) => {\n const outcomes = new Map<number, number>();\n let tokenizer: Tokenizer | undefined;\n\n /** Code, lists, quotes, and HTML whose lines belong to the body even when one of them reads `:::`. */\n const container = (offset: number, line: string, paragraph: boolean): ContainerToken | undefined => {\n const kind: ContainerKind | undefined = /^(?: {4}| {0,3}\\t)/.test(line)\n ? \"code\"\n : /^ {0,3}(?:`{3,}|~{3,})/.test(line)\n ? \"fences\"\n : /^ {0,3}(?:[-+*][ \\t]|\\d{1,9}[.)][ \\t])/.test(line)\n ? \"list\"\n : /^ {0,3}>/.test(line)\n ? \"blockquote\"\n : /^ {0,3}</.test(line)\n ? \"html\"\n : undefined;\n if (!kind || (paragraph && !interruptsParagraph(line))) return undefined;\n if (!tokenizer) {\n // One tokenizer per document: its lexer queues inline work that nothing drains.\n tokenizer = new Tokenizer({ gfm: true });\n new Lexer({ gfm: true, tokenizer });\n }\n return tokenizer[kind](source.slice(offset));\n };\n\n /** Offset of the closing line for a body that starts at `start`, or -1 when the block never closes. */\n const closingLine = (start: number, indent: number): number => {\n const passed: number[] = [];\n let offset = start;\n let paragraph = true;\n let result = -1;\n while (offset < source.length) {\n const key = offset * 8 + indent * 2 + (paragraph ? 1 : 0);\n const known = outcomes.get(key);\n if (known !== undefined) {\n result = known;\n break;\n }\n passed.push(key);\n const end = lineEnd(source, offset);\n const line = source.slice(offset, end);\n if (closes(line, indent)) {\n result = offset;\n break;\n }\n const token = container(offset, line, paragraph);\n if (token) {\n const closing = closingLineIn(token, indent);\n const length = closing < 0 ? token.raw.length : closing;\n if (length > 0) {\n offset += length;\n paragraph = false;\n continue;\n }\n }\n // A blank line ends a paragraph; any other line continues or starts one.\n paragraph = line.trim() !== \"\";\n offset = Math.min(end + 1, source.length);\n }\n for (const key of passed) outcomes.set(key, result);\n return result;\n };\n\n return (offset: number): MarkdownInfoBlock | null => {\n const firstEnd = lineEnd(source, offset);\n const opener = OPENER.exec(source.slice(offset, firstEnd));\n if (!opener) return null;\n const indent = opener[1]!.length;\n const type = opener[2]!.toLowerCase() as MarkdownInfoBlockType;\n const title = opener[3]?.trim() || undefined;\n const bodyStart = Math.min(firstEnd + 1, source.length);\n const closing = closingLine(bodyStart, indent);\n if (closing < 0) return { type, title, body: source.slice(bodyStart), length: source.length - offset, closed: false };\n const body = source.slice(bodyStart, closing).replace(/\\n$/, \"\");\n return { type, title, body, length: Math.min(lineEnd(source, closing) + 1, source.length) - offset, closed: true };\n };\n};\n\n/**\n * Reads the info block that starts `source`. Returns `null` when the first\n * line is not an info-block opener. Applications with their own Markdown\n * pipeline use this to recognize exactly the blocks `MarkdownView` renders.\n * Any line endings are accepted; `length` counts `source` as given.\n */\nexport const scanMarkdownInfoBlock = (source: string): MarkdownInfoBlock | null => {\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const block = infoBlockReader(normalized)(0);\n if (!block || normalized.length === source.length) return block;\n // Only `\\r\\n` shortens the source; count each one twice up to the block's end.\n let length = 0;\n for (let index = 0; index < block.length; index++) length += source[length] === \"\\r\" && source[length + 1] === \"\\n\" ? 2 : 1;\n return { ...block, length };\n};\n\nconst renderBlock = (input: Omit<MarkdownInfoBlockRenderInput, \"locale\">, messages: UiMessages): string => {\n const name = input.title\n ? `<p class=\"${NOTICE_CARD_CLASSES.title}\">${escapeHtml(input.title)}</p>`\n : `<span class=\"k2b-sr-only\">${escapeHtml(LABELS[input.type](messages))}: </span>`;\n return `<aside class=\"${NOTICE_CARD_CLASSES.root}\" data-tone=\"${TONES[input.type]}\" role=\"note\">${name}<div class=\"${NOTICE_CARD_CLASSES.body}\">${input.bodyHtml}</div></aside>`;\n};\n\n/**\n * Renders an info block as the calm `NoticeCard`: the tone tints the surface,\n * the text stays neutral, and there is no icon. A title is the visible heading\n * and names the block; without one, the localized type name is announced to\n * screen readers only.\n */\nexport const renderMarkdownInfoBlock = (input: MarkdownInfoBlockRenderInput): string => renderBlock(input, resolveUiMessages(input.locale));\n\n/**\n * What one `marked` lexer run knows about its document: the opening lines, the\n * blocks read so far, the length of the last top-level source, and the extent\n * of the last top-level paragraph `start` measured.\n */\ntype DocumentState = {\n source: string;\n read: (offset: number) => MarkdownInfoBlock | null;\n openers: number[];\n blocks: Map<number, MarkdownInfoBlock | null>;\n top: number;\n paragraph: { start: number; end: number };\n};\n\nconst documents = new WeakMap<object, DocumentState>();\n\n/** The closed block that starts at `offset`, read once per document. */\nconst closedBlockAt = (document: DocumentState, offset: number): MarkdownInfoBlock | null => {\n let block = document.blocks.get(offset);\n if (block === undefined) {\n const read = document.read(offset);\n block = read?.closed ? read : null;\n document.blocks.set(offset, block);\n }\n return block;\n};\n\n/** Index of the first of the ascending `offsets` at or after `from`. */\nconst firstAtOrAfter = (offsets: readonly number[], from: number): number => {\n let low = 0;\n let high = offsets.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets[middle]! < from) low = middle + 1;\n else high = middle;\n }\n return low;\n};\n\n/**\n * The first closed block after the top-level `position` inside the paragraph\n * that would start there. Openers further away cannot end that paragraph, and\n * a paragraph that starts inside the last measured one ends where it ends.\n */\nconst nextBlockStart = (document: DocumentState, position: number, rules: RegExp): number | undefined => {\n if (position < document.paragraph.start || position >= document.paragraph.end) {\n const extent = rules.exec(document.source.slice(position))?.[0].length ?? 0;\n document.paragraph = { start: position, end: position + extent };\n }\n for (let index = firstAtOrAfter(document.openers, position + 1); index < document.openers.length; index++) {\n const offset = document.openers[index]!;\n if (offset >= document.paragraph.end) return undefined;\n if (closedBlockAt(document, offset)) return offset;\n }\n return undefined;\n};\n\n/** The paragraph rule of the lexer's own flavour. */\nconst paragraphRule = (lexer: Lexer): RegExp =>\n Lexer.rules.block[lexer.options.pedantic ? \"pedantic\" : lexer.options.gfm ? \"gfm\" : \"normal\"].paragraph;\n\nconst createExtension = (messages: UiMessages): MarkedExtension => {\n const extension: TokenizerAndRendererExtension = {\n name: \"markdownInfoBlock\",\n level: \"block\",\n // marked ends a top-level paragraph where `start` points. Only a block\n // that closes renders, so `start` points at the first one inside the\n // paragraph; a split anywhere else would only make marked lex the rest of\n // the document again.\n start(source) {\n const document = documents.get(this.lexer);\n // marked asks right after the tokenizer below ran at the same top-level position.\n if (!document || source.length + 1 !== document.top) return undefined;\n const position = document.source.length - source.length - 1;\n const next = nextBlockStart(document, position, paragraphRule(this.lexer));\n return next === undefined ? undefined : next - position - 1;\n },\n tokenizer(source, tokens) {\n let document = documents.get(this.lexer);\n if (tokens !== this.lexer.tokens) {\n // Nested sources are rewritten text, not the rest of the document.\n if (document) document.top = -1;\n return undefined;\n }\n // The first top-level call sees the whole document; later ones see what is left of it.\n if (!document) {\n document = {\n source,\n read: infoBlockReader(source),\n openers: Array.from(source.matchAll(OPENERS), (opener) => opener.index),\n blocks: new Map(),\n top: source.length,\n paragraph: { start: -1, end: -1 },\n };\n documents.set(this.lexer, document);\n }\n document.top = source.length;\n if (!START.test(source)) return undefined;\n const block = closedBlockAt(document, document.source.length - source.length);\n if (!block) return undefined;\n return {\n type: \"markdownInfoBlock\",\n raw: source.slice(0, block.length),\n blockType: block.type,\n title: block.title,\n tokens: this.lexer.blockTokens(block.body, []),\n };\n },\n renderer(token) {\n return renderBlock(\n {\n type: token.blockType as MarkdownInfoBlockType,\n title: token.title as string | undefined,\n bodyHtml: this.parser.parse(token.tokens ?? []),\n },\n messages,\n );\n },\n };\n return {\n extensions: [extension],\n tokenizer: {\n // A setext heading's text is a paragraph, so it ends before a block as\n // well; marked does not clip it at `start` itself.\n lheading(source) {\n const document = documents.get(this.lexer);\n if (!document || source.length !== document.top) return false;\n const position = document.source.length - source.length;\n const next = nextBlockStart(document, position, paragraphRule(this.lexer));\n return next === undefined ? false : Tokenizer.prototype.lheading.call(this, source.slice(0, next - position));\n },\n },\n };\n};\n\nconst extensions = new WeakMap<UiMessages, MarkedExtension>();\n\n/**\n * `marked` extension for info blocks at the top level of a document. Blocks\n * inside lists, quotes, or another block stay ordinary text. The body goes\n * through the host's own Markdown renderer, so its escaping and link rules\n * apply unchanged. Locales that share a UI message catalog get the same\n * extension, so a host may cache one `marked` instance per extension.\n */\nexport const markdownInfoBlocks = (options: { locale?: string } = {}): MarkedExtension => {\n const messages = resolveUiMessages(options.locale);\n const extension = extensions.get(messages) ?? createExtension(messages);\n extensions.set(messages, extension);\n return extension;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/markdown-info-blocks.ts"],"sourcesContent":["import { Lexer, type MarkedExtension, Tokenizer, type TokenizerAndRendererExtension } from \"marked\";\nimport { NOTICE_CARD_CLASSES, type NoticeTone } from \"../surfaces/NoticeCard\";\nimport { type MarkdownInfoBlockMessages, resolveMarkdownInfoBlockMessages } from \"./markdown-info-block-messages\";\n\n/**\n * Markdown info blocks: one grammar and one look for every Markdown surface.\n *\n * ```markdown\n * :::warning Before deleting\n * Deleting an item cannot be undone.\n * :::\n * ```\n *\n * The opening line holds `:::`, a type in any letter case, and an optional\n * plain-text title. The block ends at a line holding only `:::`, indented no\n * deeper than the opener; code, lists, quotes, and HTML inside the body cannot\n * end it. The body is ordinary Markdown. A block that is never closed stays\n * ordinary text.\n */\n\nconst TONES = {\n note: \"neutral\",\n info: \"info\",\n success: \"success\",\n warning: \"warning\",\n danger: \"danger\",\n} as const satisfies Record<string, NoticeTone>;\n\nexport type MarkdownInfoBlockType = keyof typeof TONES;\n\nexport type MarkdownInfoBlock = {\n type: MarkdownInfoBlockType;\n /** Plain-text title from the opening line. */\n title?: string;\n /** Raw Markdown between the opening and closing lines, with `\\n` line breaks. */\n body: string;\n /** Source length through the closing line, or the whole source when the block is not closed. */\n length: number;\n closed: boolean;\n};\n\nexport type MarkdownInfoBlockRenderInput = {\n type: MarkdownInfoBlockType;\n title?: string;\n /** Already rendered body HTML. The caller owns its sanitization. */\n bodyHtml: string;\n /** Locale for the screen-reader name of an untitled block. */\n locale?: string;\n};\n\nconst OPENER = /^( {0,3}):::(note|info|success|warning|danger)(?:[ \\t]+(.*?))?[ \\t]*$/i;\nconst START = /^ {0,3}:::(?:note|info|success|warning|danger)(?=[ \\t\\n]|$)/i;\nconst OPENERS = /(?<=^|\\n) {0,3}:::(?:note|info|success|warning|danger)(?=[ \\t\\n]|$)/gi;\nconst CLOSING = /^( {0,3}):::[ \\t]*$/;\nconst FENCE = /^( *)(`{3,}|~{3,})(.*)$/;\n\ntype ContainerKind = \"code\" | \"fences\" | \"list\" | \"blockquote\" | \"html\";\ntype ContainerToken = NonNullable<ReturnType<Tokenizer[ContainerKind]>>;\n\nconst LABELS: Record<MarkdownInfoBlockType, (t: MarkdownInfoBlockMessages) => string> = {\n note: (t) => t.infoBlockNote,\n info: (t) => t.infoBlockInfo,\n success: (t) => t.infoBlockSuccess,\n warning: (t) => t.infoBlockWarning,\n danger: (t) => t.infoBlockDanger,\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst lineEnd = (source: string, from: number): number => {\n const end = source.indexOf(\"\\n\", from);\n return end < 0 ? source.length : end;\n};\n\nconst closes = (line: string, indent: number): boolean => {\n const closing = CLOSING.exec(line);\n return !!closing && closing[1]!.length <= indent;\n};\n\n/** Column where a list item's text starts, as CommonMark counts it. */\nconst itemTextIndent = (raw: string): number => {\n const [, bullet = \"\", gap = \"\"] = /^( {0,3}(?:[-+*]|\\d{1,9}[.)]))( *)/.exec(raw) ?? [];\n return bullet.length + (gap.length >= 1 && gap.length <= 4 && raw[bullet.length + gap.length] !== \"\\n\" ? gap.length : 1);\n};\n\n/**\n * Offset of the block's closing line inside a list or quote, or -1. Lazy\n * paragraph lines may hold it; a list item's own fenced code cannot.\n */\nconst closingLineIn = (token: ContainerToken, indent: number): number => {\n if (token.type !== \"list\" && token.type !== \"blockquote\") return -1;\n const items = token.type === \"list\" ? token.items : [];\n let item = -1;\n let itemStart = 0;\n let itemEnd = 0;\n let text = 0;\n let fence = \"\";\n for (let from = 0; from < token.raw.length; ) {\n while (item + 1 < items.length && from >= itemEnd) {\n item++;\n itemStart = itemEnd;\n itemEnd += items[item]!.raw.length;\n text = itemTextIndent(items[item]!.raw);\n fence = \"\";\n }\n const end = lineEnd(token.raw, from);\n const line = token.raw.slice(from, end);\n // A line indented less than the item's text has left the item and its fence.\n if (fence && line.trim() && line.length - line.trimStart().length < text) fence = \"\";\n // The first line of an item carries its bullet where the text would be indented.\n const marker = items.length ? FENCE.exec(from === itemStart ? \" \".repeat(text) + line.slice(text) : line) : null;\n if (fence) {\n if (marker && marker[2]![0] === fence[0] && marker[2]!.length >= fence.length && !marker[3]!.trim()) fence = \"\";\n } else if (\n marker &&\n marker[1]!.length >= text &&\n marker[1]!.length <= text + 3 &&\n !(marker[2]![0] === \"`\" && marker[3]!.includes(\"`\"))\n ) {\n fence = marker[2]!;\n } else if (closes(line, indent)) {\n return from;\n }\n from = end + 1;\n }\n return -1;\n};\n\n/** Whether `line` starts a block of its own after a paragraph line instead of continuing the paragraph, as marked decides. */\nconst interruptsParagraph = (line: string): boolean => Lexer.rules.block.gfm.paragraph.exec(`x\\n${line}\\n`)?.[0] === \"x\";\n\n/**\n * Reads info blocks in one `\\n`-separated source. The opening line reads like\n * a paragraph line, so the body continues it: only a block that may interrupt\n * a paragraph, such as a fence, a list, a quote, or block HTML, hides its\n * lines from the closing line. A scan's only state is its line and whether a\n * paragraph is open there, so a later scan that reaches a line an earlier one\n * passed ends the same way; `outcomes` remembers that, which keeps reading\n * many openers of one document linear.\n */\nconst infoBlockReader = (source: string) => {\n const outcomes = new Map<number, number>();\n let tokenizer: Tokenizer | undefined;\n\n /** Code, lists, quotes, and HTML whose lines belong to the body even when one of them reads `:::`. */\n const container = (offset: number, line: string, paragraph: boolean): ContainerToken | undefined => {\n const kind: ContainerKind | undefined = /^(?: {4}| {0,3}\\t)/.test(line)\n ? \"code\"\n : /^ {0,3}(?:`{3,}|~{3,})/.test(line)\n ? \"fences\"\n : /^ {0,3}(?:[-+*][ \\t]|\\d{1,9}[.)][ \\t])/.test(line)\n ? \"list\"\n : /^ {0,3}>/.test(line)\n ? \"blockquote\"\n : /^ {0,3}</.test(line)\n ? \"html\"\n : undefined;\n if (!kind || (paragraph && !interruptsParagraph(line))) return undefined;\n if (!tokenizer) {\n // One tokenizer per document: its lexer queues inline work that nothing drains.\n tokenizer = new Tokenizer({ gfm: true });\n new Lexer({ gfm: true, tokenizer });\n }\n return tokenizer[kind](source.slice(offset));\n };\n\n /** Offset of the closing line for a body that starts at `start`, or -1 when the block never closes. */\n const closingLine = (start: number, indent: number): number => {\n const passed: number[] = [];\n let offset = start;\n let paragraph = true;\n let result = -1;\n while (offset < source.length) {\n const key = offset * 8 + indent * 2 + (paragraph ? 1 : 0);\n const known = outcomes.get(key);\n if (known !== undefined) {\n result = known;\n break;\n }\n passed.push(key);\n const end = lineEnd(source, offset);\n const line = source.slice(offset, end);\n if (closes(line, indent)) {\n result = offset;\n break;\n }\n const token = container(offset, line, paragraph);\n if (token) {\n const closing = closingLineIn(token, indent);\n const length = closing < 0 ? token.raw.length : closing;\n if (length > 0) {\n offset += length;\n paragraph = false;\n continue;\n }\n }\n // A blank line ends a paragraph; any other line continues or starts one.\n paragraph = line.trim() !== \"\";\n offset = Math.min(end + 1, source.length);\n }\n for (const key of passed) outcomes.set(key, result);\n return result;\n };\n\n return (offset: number): MarkdownInfoBlock | null => {\n const firstEnd = lineEnd(source, offset);\n const opener = OPENER.exec(source.slice(offset, firstEnd));\n if (!opener) return null;\n const indent = opener[1]!.length;\n const type = opener[2]!.toLowerCase() as MarkdownInfoBlockType;\n const title = opener[3]?.trim() || undefined;\n const bodyStart = Math.min(firstEnd + 1, source.length);\n const closing = closingLine(bodyStart, indent);\n if (closing < 0) return { type, title, body: source.slice(bodyStart), length: source.length - offset, closed: false };\n const body = source.slice(bodyStart, closing).replace(/\\n$/, \"\");\n return { type, title, body, length: Math.min(lineEnd(source, closing) + 1, source.length) - offset, closed: true };\n };\n};\n\n/**\n * Reads the info block that starts `source`. Returns `null` when the first\n * line is not an info-block opener. Applications with their own Markdown\n * pipeline use this to recognize exactly the blocks `MarkdownView` renders.\n * Any line endings are accepted; `length` counts `source` as given.\n */\nexport const scanMarkdownInfoBlock = (source: string): MarkdownInfoBlock | null => {\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const block = infoBlockReader(normalized)(0);\n if (!block || normalized.length === source.length) return block;\n // Only `\\r\\n` shortens the source; count each one twice up to the block's end.\n let length = 0;\n for (let index = 0; index < block.length; index++) length += source[length] === \"\\r\" && source[length + 1] === \"\\n\" ? 2 : 1;\n return { ...block, length };\n};\n\nconst renderBlock = (input: Omit<MarkdownInfoBlockRenderInput, \"locale\">, messages: MarkdownInfoBlockMessages): string => {\n const name = input.title\n ? `<p class=\"${NOTICE_CARD_CLASSES.title}\">${escapeHtml(input.title)}</p>`\n : `<span class=\"k2b-sr-only\">${escapeHtml(LABELS[input.type](messages))}: </span>`;\n return `<aside class=\"${NOTICE_CARD_CLASSES.root}\" data-tone=\"${TONES[input.type]}\" role=\"note\">${name}<div class=\"${NOTICE_CARD_CLASSES.body}\">${input.bodyHtml}</div></aside>`;\n};\n\n/**\n * Renders an info block as the calm `NoticeCard`: the tone tints the surface,\n * the text stays neutral, and there is no icon. A title is the visible heading\n * and names the block; without one, the localized type name is announced to\n * screen readers only.\n */\nexport const renderMarkdownInfoBlock = (input: MarkdownInfoBlockRenderInput): string =>\n renderBlock(input, resolveMarkdownInfoBlockMessages(input.locale));\n\n/**\n * What one `marked` lexer run knows about its document: the opening lines, the\n * blocks read so far, the length of the last top-level source, and the extent\n * of the last top-level paragraph `start` measured.\n */\ntype DocumentState = {\n source: string;\n read: (offset: number) => MarkdownInfoBlock | null;\n openers: number[];\n blocks: Map<number, MarkdownInfoBlock | null>;\n top: number;\n paragraph: { start: number; end: number };\n};\n\nconst documents = new WeakMap<object, DocumentState>();\n\n/** The closed block that starts at `offset`, read once per document. */\nconst closedBlockAt = (document: DocumentState, offset: number): MarkdownInfoBlock | null => {\n let block = document.blocks.get(offset);\n if (block === undefined) {\n const read = document.read(offset);\n block = read?.closed ? read : null;\n document.blocks.set(offset, block);\n }\n return block;\n};\n\n/** Index of the first of the ascending `offsets` at or after `from`. */\nconst firstAtOrAfter = (offsets: readonly number[], from: number): number => {\n let low = 0;\n let high = offsets.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (offsets[middle]! < from) low = middle + 1;\n else high = middle;\n }\n return low;\n};\n\n/**\n * The first closed block after the top-level `position` inside the paragraph\n * that would start there. Openers further away cannot end that paragraph, and\n * a paragraph that starts inside the last measured one ends where it ends.\n */\nconst nextBlockStart = (document: DocumentState, position: number, rules: RegExp): number | undefined => {\n if (position < document.paragraph.start || position >= document.paragraph.end) {\n const extent = rules.exec(document.source.slice(position))?.[0].length ?? 0;\n document.paragraph = { start: position, end: position + extent };\n }\n for (let index = firstAtOrAfter(document.openers, position + 1); index < document.openers.length; index++) {\n const offset = document.openers[index]!;\n if (offset >= document.paragraph.end) return undefined;\n if (closedBlockAt(document, offset)) return offset;\n }\n return undefined;\n};\n\n/** The paragraph rule of the lexer's own flavour. */\nconst paragraphRule = (lexer: Lexer): RegExp =>\n Lexer.rules.block[lexer.options.pedantic ? \"pedantic\" : lexer.options.gfm ? \"gfm\" : \"normal\"].paragraph;\n\nconst createExtension = (messages: MarkdownInfoBlockMessages): MarkedExtension => {\n const extension: TokenizerAndRendererExtension = {\n name: \"markdownInfoBlock\",\n level: \"block\",\n // marked ends a top-level paragraph where `start` points. Only a block\n // that closes renders, so `start` points at the first one inside the\n // paragraph; a split anywhere else would only make marked lex the rest of\n // the document again.\n start(source) {\n const document = documents.get(this.lexer);\n // marked asks right after the tokenizer below ran at the same top-level position.\n if (!document || source.length + 1 !== document.top) return undefined;\n const position = document.source.length - source.length - 1;\n const next = nextBlockStart(document, position, paragraphRule(this.lexer));\n return next === undefined ? undefined : next - position - 1;\n },\n tokenizer(source, tokens) {\n let document = documents.get(this.lexer);\n if (tokens !== this.lexer.tokens) {\n // Nested sources are rewritten text, not the rest of the document.\n if (document) document.top = -1;\n return undefined;\n }\n // The first top-level call sees the whole document; later ones see what is left of it.\n if (!document) {\n document = {\n source,\n read: infoBlockReader(source),\n openers: Array.from(source.matchAll(OPENERS), (opener) => opener.index),\n blocks: new Map(),\n top: source.length,\n paragraph: { start: -1, end: -1 },\n };\n documents.set(this.lexer, document);\n }\n document.top = source.length;\n if (!START.test(source)) return undefined;\n const block = closedBlockAt(document, document.source.length - source.length);\n if (!block) return undefined;\n return {\n type: \"markdownInfoBlock\",\n raw: source.slice(0, block.length),\n blockType: block.type,\n title: block.title,\n tokens: this.lexer.blockTokens(block.body, []),\n };\n },\n renderer(token) {\n return renderBlock(\n {\n type: token.blockType as MarkdownInfoBlockType,\n title: token.title as string | undefined,\n bodyHtml: this.parser.parse(token.tokens ?? []),\n },\n messages,\n );\n },\n };\n return {\n extensions: [extension],\n tokenizer: {\n // A setext heading's text is a paragraph, so it ends before a block as\n // well; marked does not clip it at `start` itself.\n lheading(source) {\n const document = documents.get(this.lexer);\n if (!document || source.length !== document.top) return false;\n const position = document.source.length - source.length;\n const next = nextBlockStart(document, position, paragraphRule(this.lexer));\n return next === undefined ? false : Tokenizer.prototype.lheading.call(this, source.slice(0, next - position));\n },\n },\n };\n};\n\nconst extensions = new WeakMap<MarkdownInfoBlockMessages, MarkedExtension>();\n\n/**\n * `marked` extension for info blocks at the top level of a document. Blocks\n * inside lists, quotes, or another block stay ordinary text. The body goes\n * through the host's own Markdown renderer, so its escaping and link rules\n * apply unchanged. Locales that share a UI message catalog get the same\n * extension, so a host may cache one `marked` instance per extension.\n */\nexport const markdownInfoBlocks = (options: { locale?: string } = {}): MarkedExtension => {\n const messages = resolveMarkdownInfoBlockMessages(options.locale);\n const extension = extensions.get(messages) ?? createExtension(messages);\n extensions.set(messages, extension);\n return extension;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fileIcons } from "@k2b/stdlib";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveMarkdownReferenceMessages } from "./markdown-reference-messages";
|
|
3
3
|
|
|
4
4
|
/** What a reference points to inside the host application. */
|
|
5
5
|
|
|
@@ -89,7 +89,7 @@ const TYPE_LABELS = {
|
|
|
89
89
|
};
|
|
90
90
|
|
|
91
91
|
/** The localized name of a reference type, such as "PDF" or "Überschrift". */
|
|
92
|
-
export const markdownReferenceTypeLabel = (type, locale) => String(
|
|
92
|
+
export const markdownReferenceTypeLabel = (type, locale) => String(resolveMarkdownReferenceMessages(locale)[TYPE_LABELS[type]]);
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* The text of rendered inline HTML, still as HTML: tags go, character references such as `©` stay. One pass,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/markdown-links.ts"],"sourcesContent":["import { fileIcons } from \"@k2b/stdlib\";\nimport type { Token, Tokens } from \"marked\";\nimport { resolveUiMessages, type UiMessages } from \"../intl/messages\";\n\n/** What a reference points to inside the host application. */\nexport type MarkdownReferenceKind = \"file\" | \"note\" | \"heading\" | \"task\" | \"page\";\n\n/** The type a reference shows: a file's type from its extension, or the kind of the referenced content. */\nexport type MarkdownReferenceType = \"pdf\" | \"image\" | \"design\" | \"file\" | \"note\" | \"heading\" | \"task\" | \"page\";\n\n/**\n * A link to content inside the host application, as opposed to a web or mail link.\n * References render as a calm pill whose icon names the type.\n */\nexport type MarkdownReference = {\n kind: MarkdownReferenceKind;\n /** The file's name, which decides its type and icon. Defaults to the link text. */\n fileName?: string;\n /** The file's formatted size. It shows only when the link stands alone on its line. */\n size?: string;\n /** Plain-text title of the document that holds a heading, for a heading in another document. */\n document?: string;\n};\n\nexport type MarkdownLinkInput = {\n /** The final, already validated link destination. */\n href: string;\n /** The rendered link text. It crosses a trust boundary: the caller sanitizes it. */\n html: string;\n /** The link text as plain text, for the accessible name. Defaults to the text of `html`. */\n text?: string;\n title?: string;\n target?: \"_blank\";\n /** Link relations without a new tab, such as `noreferrer`. `target: \"_blank\"` always sets `noopener noreferrer`. */\n rel?: string;\n /** A reference inside the host. Without one, the link is a web link, or a mail link for `mailto:` and `tel:`. */\n reference?: MarkdownReference | null;\n /** The link is the only content of its line. Only then does a file show its size. */\n standalone?: boolean;\n /** Locale of the type name in the accessible name. Defaults to English on the server and the page language in the browser. */\n locale?: string;\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"avif\", \"bmp\", \"ico\", \"svg\", \"heic\", \"heif\", \"tif\", \"tiff\"]);\nconst DESIGN_EXTENSIONS = new Set([\"afdesign\", \"afphoto\", \"afpub\", \"psd\", \"psb\", \"ai\", \"eps\", \"indd\", \"idml\", \"fig\", \"sketch\", \"xd\"]);\n\nconst extensionOf = (name: string): string | null => {\n const match = /\\.([a-z0-9]{1,10})$/i.exec(name.trim());\n return match && /[a-z]/i.test(match[1]!) ? match[1]!.toLowerCase() : null;\n};\n\n/** The type of a file reference, from the extension of its name. */\nexport const markdownFileType = (fileName: string): \"pdf\" | \"image\" | \"design\" | \"file\" => {\n const extension = extensionOf(fileName);\n if (extension === \"pdf\") return \"pdf\";\n if (extension && IMAGE_EXTENSIONS.has(extension)) return \"image\";\n if (extension && DESIGN_EXTENSIONS.has(extension)) return \"design\";\n return \"file\";\n};\n\nconst REFERENCE_BASE = \"https://reference.invalid/\";\n\n/**\n * The reference a link destination names on its own: `#anchor` is a heading in the same document, and any other\n * relative URL is a page of the host, or a file when its last path segment has a file extension. Absolute URLs,\n * every scheme, and relative URLs that a browser resolves to another host, such as `//host` or `/\\host`, are web\n * or mail links; the result is then `null`.\n */\nexport const markdownLinkReference = (href: string): MarkdownReference | null => {\n const url = href.trim();\n if (!url || /^[a-z][a-z\\d+.-]*:/i.test(url)) return null;\n try {\n if (new URL(url, REFERENCE_BASE).origin !== new URL(REFERENCE_BASE).origin) return null;\n } catch {\n return null;\n }\n if (url.startsWith(\"#\")) return { kind: \"heading\" };\n const segment = url.split(/[?#]/, 1)[0]!.split(\"/\").pop() ?? \"\";\n let fileName = segment;\n try {\n fileName = decodeURIComponent(segment);\n } catch {\n /* A malformed escape stays literal text. */\n }\n return extensionOf(fileName) ? { kind: \"file\", fileName } : { kind: \"page\" };\n};\n\n/** The type a reference shows. */\nexport const markdownReferenceType = (reference: MarkdownReference, text: string): MarkdownReferenceType =>\n reference.kind === \"file\" ? markdownFileType(reference.fileName ?? text) : reference.kind;\n\nconst TYPE_ICONS: Record<Exclude<MarkdownReferenceType, \"file\">, string> = {\n pdf: \"ti-file-type-pdf\",\n image: \"ti-photo\",\n design: \"ti-vector-bezier-2\",\n note: \"ti-file-text\",\n heading: \"ti-hash\",\n task: \"ti-circle-check\",\n page: \"ti-link\",\n};\n\n/** The Tabler glyph of a reference type; any other file keeps the glyph of its file family. */\nexport const markdownReferenceIcon = (type: MarkdownReferenceType, fileName = \"\"): string =>\n type === \"file\" ? (fileIcons.getFileIcon({ name: fileName, type: \"file\" }).split(/\\s+/)[0] ?? \"ti-file\") : TYPE_ICONS[type];\n\nconst TYPE_LABELS: Record<MarkdownReferenceType, keyof UiMessages> = {\n pdf: \"referencePdf\",\n image: \"referenceImage\",\n design: \"referenceDesign\",\n file: \"referenceFile\",\n note: \"referenceNote\",\n heading: \"referenceHeading\",\n task: \"referenceTask\",\n page: \"referencePage\",\n};\n\n/** The localized name of a reference type, such as \"PDF\" or \"Überschrift\". */\nexport const markdownReferenceTypeLabel = (type: MarkdownReferenceType, locale?: string): string =>\n String(resolveUiMessages(locale)[TYPE_LABELS[type]]);\n\n/**\n * The text of rendered inline HTML, still as HTML: tags go, character references such as `©` stay. One pass,\n * so a label full of `<` stays linear. The result only ever reaches `textAttribute`, which escapes what is left.\n */\nconst htmlText = (html: string): string => {\n let text = \"\";\n let index = 0;\n for (let open = html.indexOf(\"<\"); open !== -1; open = html.indexOf(\"<\", index)) {\n const close = html.indexOf(\">\", open + 1);\n if (close === -1) break;\n text += html.slice(index, open);\n index = close + 1;\n }\n return text + html.slice(index);\n};\n\n/** HTML text as an attribute value. Character references stay for the browser to decode; nothing can end the value. */\nconst textAttribute = (text: string): string =>\n text\n .replace(/&(?!#\\d+;|#x[\\da-f]+;|[a-z][a-z\\d]*;)/gi, \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n\nconst isMailHref = (href: string) => /^(?:mailto|tel):/i.test(href.trim());\n\n/**\n * One link of rendered Markdown. A reference to content of the host renders as a calm pill: a neutral fill, the\n * text in the prose colour, and an icon whose colour names the type. Its accessible name starts with the type, as\n * in \"PDF: Brand-2026.pdf\". A heading in another document shows that document first (\"Notes › Heading\"). A web\n * link stays prose text with a thin underline in the link accent and a small ↗; a mail link has no arrow. A link\n * around an image is the image: a plain anchor that the image's own text names.\n */\nexport const renderMarkdownLink = (input: MarkdownLinkInput): string => {\n const titleAttribute = input.title ? ` title=\"${escapeHtml(input.title)}\"` : \"\";\n const targetAttributes =\n input.target === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : input.rel ? ` rel=\"${escapeHtml(input.rel)}\"` : \"\";\n const href = escapeHtml(input.href);\n if (/<img\\b/i.test(input.html)) return `<a href=\"${href}\"${titleAttribute}${targetAttributes}>${input.html}</a>`;\n const reference = input.reference;\n if (!reference) {\n const mail = isMailHref(input.href);\n const arrow = mail ? \"\" : '<i class=\"k2b-text-link__external ti ti-arrow-up-right\" aria-hidden=\"true\"></i>';\n return `<a href=\"${href}\" class=\"k2b-text-link\" data-link=\"${mail ? \"mail\" : \"web\"}\"${titleAttribute}${targetAttributes}>${input.html}${arrow}</a>`;\n }\n const text = (input.text ?? htmlText(input.html)).trim();\n const type = markdownReferenceType(reference, text);\n const icon = markdownReferenceIcon(type, reference.fileName ?? text);\n const size = input.standalone && reference.kind === \"file\" && reference.size ? reference.size : \"\";\n const document = reference.kind === \"heading\" ? (reference.document?.trim() ?? \"\") : \"\";\n const name =\n escapeHtml(`${markdownReferenceTypeLabel(type, input.locale)}: ${document ? `${document} › ` : \"\"}`) +\n (input.text === undefined ? textAttribute(text) : escapeHtml(text)) +\n (size ? escapeHtml(`, ${size}`) : \"\");\n return (\n `<a href=\"${href}\" class=\"k2b-reference\" data-reference=\"${type}\" aria-label=\"${name}\"${titleAttribute}${targetAttributes}>` +\n `<i class=\"k2b-reference__icon ti ${icon}\" aria-hidden=\"true\"></i>` +\n (document ? `<span class=\"k2b-reference__document\">${escapeHtml(document)} ›</span> ` : \"\") +\n input.html +\n (size ? `<span class=\"k2b-reference__size\">${escapeHtml(size)}</span>` : \"\") +\n `</a>`\n );\n};\n\nconst isBlank = (token: Token) => (token.type === \"text\" || token.type === \"space\") && !token.raw.trim();\nconst isLink = (token: Token | undefined): token is Tokens.Link => token?.type === \"link\";\n\n/**\n * The links among `tokens` that stand alone on their line: the only content of a paragraph or list item line,\n * between line breaks. Pass the result's check as `standalone` to `renderMarkdownLink`, so a file shows its size\n * in a list of files but not inside a sentence. Call it from `walkTokens` of a renderer with GFM line breaks\n * (`breaks: true`), where every source line is a visual line.\n */\nexport const markStandaloneLinks = (token: Token, standalone: WeakSet<Tokens.Link>): void => {\n if ((token.type !== \"paragraph\" && token.type !== \"text\") || !(\"tokens\" in token) || !token.tokens) return;\n let line: Token[] = [];\n const close = () => {\n const content = line.filter((candidate) => !isBlank(candidate));\n if (content.length === 1 && isLink(content[0])) standalone.add(content[0]);\n line = [];\n };\n for (const child of token.tokens) {\n if (child.type === \"br\") {\n close();\n continue;\n }\n const plain = child.type === \"text\" && !(\"tokens\" in child && child.tokens?.length) ? child.raw : \"\";\n if (plain.includes(\"\\n\")) {\n for (const [index, part] of plain.split(\"\\n\").entries()) {\n if (index > 0) close();\n if (part.trim()) line.push({ type: \"text\", raw: part, text: part });\n }\n continue;\n }\n line.push(child);\n }\n close();\n};\n"],"mappings":"AAAA,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,iBAAiB,QAAyB,kBAAkB;;AAErE;;AAGA;;AAGA;AACA;AACA;AACA;;AA8BA,MAAM,UAAU,GAAI,KAAa,IAC/B,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;AAEnI,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnI,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAErI,MAAM,WAAW,GAAI,IAAY,IAAoB;EACnD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;EACtD,OAAO,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,GAAG,IAAI;AAC3E,CAAC;;AAED;AACA,OAAO,MAAM,gBAAgB,GAAI,QAAgB,IAA0C;EACzF,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC;EACvC,IAAI,SAAS,KAAK,KAAK,EAAE,OAAO,KAAK;EACrC,IAAI,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,OAAO;EAChE,IAAI,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,QAAQ;EAClE,OAAO,MAAM;AACf,CAAC;AAED,MAAM,cAAc,GAAG,4BAA4B;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,qBAAqB,GAAI,IAAY,IAA+B;EAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;EACvB,IAAI,CAAC,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI;EACxD,IAAI;IACF,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI;EACzF,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;EACA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO;IAAE,IAAI,EAAE;EAAU,CAAC;EACnD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;EAC/D,IAAI,QAAQ,GAAG,OAAO;EACtB,IAAI;IACF,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC;EACxC,CAAC,CAAC,MAAM;IACN;EAAA;EAEF,OAAO,WAAW,CAAC,QAAQ,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM;IAAE;EAAS,CAAC,GAAG;IAAE,IAAI,EAAE;EAAO,CAAC;AAC9E,CAAC;;AAED;AACA,OAAO,MAAM,qBAAqB,GAAG,CAAC,SAA4B,EAAE,IAAY,KAC9E,SAAS,CAAC,IAAI,KAAK,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI;AAE3F,MAAM,UAAkE,GAAG;EACzE,GAAG,EAAE,kBAAkB;EACvB,KAAK,EAAE,UAAU;EACjB,MAAM,EAAE,oBAAoB;EAC5B,IAAI,EAAE,cAAc;EACpB,OAAO,EAAE,SAAS;EAClB,IAAI,EAAE,iBAAiB;EACvB,IAAI,EAAE;AACR,CAAC;;AAED;AACA,OAAO,MAAM,qBAAqB,GAAG,CAAC,IAA2B,EAAE,QAAQ,GAAG,EAAE,KAC9E,IAAI,KAAK,MAAM,GAAI,SAAS,CAAC,WAAW,CAAC;EAAE,IAAI,EAAE,QAAQ;EAAE,IAAI,EAAE;AAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,GAAI,UAAU,CAAC,IAAI,CAAC;AAE7H,MAAM,WAA4D,GAAG;EACnE,GAAG,EAAE,cAAc;EACnB,KAAK,EAAE,gBAAgB;EACvB,MAAM,EAAE,iBAAiB;EACzB,IAAI,EAAE,eAAe;EACrB,IAAI,EAAE,eAAe;EACrB,OAAO,EAAE,kBAAkB;EAC3B,IAAI,EAAE,eAAe;EACrB,IAAI,EAAE;AACR,CAAC;;AAED;AACA,OAAO,MAAM,0BAA0B,GAAG,CAAC,IAA2B,EAAE,MAAe,KACrF,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEtD;AACA;AACA;AACA;AACA,MAAM,QAAQ,GAAI,IAAY,IAAa;EACzC,IAAI,IAAI,GAAG,EAAE;EACb,IAAI,KAAK,GAAG,CAAC;EACb,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;IAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;IAClB,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;IAC/B,KAAK,GAAG,KAAK,GAAG,CAAC;EACnB;EACA,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACjC,CAAC;;AAED;AACA,MAAM,aAAa,GAAI,IAAY,IACjC,IAAI,CACD,OAAO,CAAC,yCAAyC,EAAE,OAAO,CAAC,CAC3D,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;AAE9B,MAAM,UAAU,GAAI,IAAY,IAAK,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;AAE1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,kBAAkB,GAAI,KAAwB,IAAa;EACtE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,GAAG,WAAW,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;EAC/E,MAAM,gBAAgB,GACpB,KAAK,CAAC,MAAM,KAAK,QAAQ,GAAG,4CAA4C,GAAG,KAAK,CAAC,GAAG,GAAG,SAAS,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;EAC/H,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;EACnC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,YAAY,IAAI,IAAI,cAAc,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,MAAM;EAChH,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;EACjC,IAAI,CAAC,SAAS,EAAE;IACd,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,GAAG,iFAAiF;IAC3G,OAAO,YAAY,IAAI,sCAAsC,IAAI,GAAG,MAAM,GAAG,KAAK,IAAI,cAAc,GAAG,gBAAgB,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,MAAM;EACrJ;EACA,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;EACxD,MAAM,IAAI,GAAG,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC;EACnD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;EACpE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,EAAE;EAClG,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,GAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,GAAI,EAAE;EACvF,MAAM,IAAI,GACR,UAAU,CAAC,GAAG,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,GAAG,GAAG,QAAQ,KAAK,GAAG,EAAE,EAAE,CAAC,IACnG,KAAK,CAAC,IAAI,KAAK,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAClE,IAAI,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;EACvC,OACE,YAAY,IAAI,2CAA2C,IAAI,iBAAiB,IAAI,IAAI,cAAc,GAAG,gBAAgB,GAAG,GAC5H,oCAAoC,IAAI,2BAA2B,IAClE,QAAQ,GAAG,yCAAyC,UAAU,CAAC,QAAQ,CAAC,YAAY,GAAG,EAAE,CAAC,GAC3F,KAAK,CAAC,IAAI,IACT,IAAI,GAAG,qCAAqC,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,GAC5E,MAAM;AAEV,CAAC;AAED,MAAM,OAAO,GAAI,KAAY,IAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACxG,MAAM,MAAM,GAAI,KAAwB,IAA2B,KAAK,EAAE,IAAI,KAAK,MAAM;;AAEzF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,UAAgC,KAAW;EAC3F,IAAK,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;EACpG,IAAI,IAAa,GAAG,EAAE;EACtB,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAE,SAAS,IAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,GAAG,EAAE;EACX,CAAC;EACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;MACvB,KAAK,CAAC,CAAC;MACP;IACF;IACA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE;IACpG,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACxB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;QACvD,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;UAAE,IAAI,EAAE,MAAM;UAAE,GAAG,EAAE,IAAI;UAAE,IAAI,EAAE;QAAK,CAAC,CAAC;MACrE;MACA;IACF;IACA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;EAClB;EACA,KAAK,CAAC,CAAC;AACT,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/markdown-links.ts"],"sourcesContent":["import { fileIcons } from \"@k2b/stdlib\";\nimport type { Token, Tokens } from \"marked\";\nimport { type MarkdownReferenceMessages, resolveMarkdownReferenceMessages } from \"./markdown-reference-messages\";\n\n/** What a reference points to inside the host application. */\nexport type MarkdownReferenceKind = \"file\" | \"note\" | \"heading\" | \"task\" | \"page\";\n\n/** The type a reference shows: a file's type from its extension, or the kind of the referenced content. */\nexport type MarkdownReferenceType = \"pdf\" | \"image\" | \"design\" | \"file\" | \"note\" | \"heading\" | \"task\" | \"page\";\n\n/**\n * A link to content inside the host application, as opposed to a web or mail link.\n * References render as a calm pill whose icon names the type.\n */\nexport type MarkdownReference = {\n kind: MarkdownReferenceKind;\n /** The file's name, which decides its type and icon. Defaults to the link text. */\n fileName?: string;\n /** The file's formatted size. It shows only when the link stands alone on its line. */\n size?: string;\n /** Plain-text title of the document that holds a heading, for a heading in another document. */\n document?: string;\n};\n\nexport type MarkdownLinkInput = {\n /** The final, already validated link destination. */\n href: string;\n /** The rendered link text. It crosses a trust boundary: the caller sanitizes it. */\n html: string;\n /** The link text as plain text, for the accessible name. Defaults to the text of `html`. */\n text?: string;\n title?: string;\n target?: \"_blank\";\n /** Link relations without a new tab, such as `noreferrer`. `target: \"_blank\"` always sets `noopener noreferrer`. */\n rel?: string;\n /** A reference inside the host. Without one, the link is a web link, or a mail link for `mailto:` and `tel:`. */\n reference?: MarkdownReference | null;\n /** The link is the only content of its line. Only then does a file show its size. */\n standalone?: boolean;\n /** Locale of the type name in the accessible name. Defaults to English on the server and the page language in the browser. */\n locale?: string;\n};\n\nconst escapeHtml = (value: string): string =>\n value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\");\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"avif\", \"bmp\", \"ico\", \"svg\", \"heic\", \"heif\", \"tif\", \"tiff\"]);\nconst DESIGN_EXTENSIONS = new Set([\"afdesign\", \"afphoto\", \"afpub\", \"psd\", \"psb\", \"ai\", \"eps\", \"indd\", \"idml\", \"fig\", \"sketch\", \"xd\"]);\n\nconst extensionOf = (name: string): string | null => {\n const match = /\\.([a-z0-9]{1,10})$/i.exec(name.trim());\n return match && /[a-z]/i.test(match[1]!) ? match[1]!.toLowerCase() : null;\n};\n\n/** The type of a file reference, from the extension of its name. */\nexport const markdownFileType = (fileName: string): \"pdf\" | \"image\" | \"design\" | \"file\" => {\n const extension = extensionOf(fileName);\n if (extension === \"pdf\") return \"pdf\";\n if (extension && IMAGE_EXTENSIONS.has(extension)) return \"image\";\n if (extension && DESIGN_EXTENSIONS.has(extension)) return \"design\";\n return \"file\";\n};\n\nconst REFERENCE_BASE = \"https://reference.invalid/\";\n\n/**\n * The reference a link destination names on its own: `#anchor` is a heading in the same document, and any other\n * relative URL is a page of the host, or a file when its last path segment has a file extension. Absolute URLs,\n * every scheme, and relative URLs that a browser resolves to another host, such as `//host` or `/\\host`, are web\n * or mail links; the result is then `null`.\n */\nexport const markdownLinkReference = (href: string): MarkdownReference | null => {\n const url = href.trim();\n if (!url || /^[a-z][a-z\\d+.-]*:/i.test(url)) return null;\n try {\n if (new URL(url, REFERENCE_BASE).origin !== new URL(REFERENCE_BASE).origin) return null;\n } catch {\n return null;\n }\n if (url.startsWith(\"#\")) return { kind: \"heading\" };\n const segment = url.split(/[?#]/, 1)[0]!.split(\"/\").pop() ?? \"\";\n let fileName = segment;\n try {\n fileName = decodeURIComponent(segment);\n } catch {\n /* A malformed escape stays literal text. */\n }\n return extensionOf(fileName) ? { kind: \"file\", fileName } : { kind: \"page\" };\n};\n\n/** The type a reference shows. */\nexport const markdownReferenceType = (reference: MarkdownReference, text: string): MarkdownReferenceType =>\n reference.kind === \"file\" ? markdownFileType(reference.fileName ?? text) : reference.kind;\n\nconst TYPE_ICONS: Record<Exclude<MarkdownReferenceType, \"file\">, string> = {\n pdf: \"ti-file-type-pdf\",\n image: \"ti-photo\",\n design: \"ti-vector-bezier-2\",\n note: \"ti-file-text\",\n heading: \"ti-hash\",\n task: \"ti-circle-check\",\n page: \"ti-link\",\n};\n\n/** The Tabler glyph of a reference type; any other file keeps the glyph of its file family. */\nexport const markdownReferenceIcon = (type: MarkdownReferenceType, fileName = \"\"): string =>\n type === \"file\" ? (fileIcons.getFileIcon({ name: fileName, type: \"file\" }).split(/\\s+/)[0] ?? \"ti-file\") : TYPE_ICONS[type];\n\nconst TYPE_LABELS: Record<MarkdownReferenceType, keyof MarkdownReferenceMessages> = {\n pdf: \"referencePdf\",\n image: \"referenceImage\",\n design: \"referenceDesign\",\n file: \"referenceFile\",\n note: \"referenceNote\",\n heading: \"referenceHeading\",\n task: \"referenceTask\",\n page: \"referencePage\",\n};\n\n/** The localized name of a reference type, such as \"PDF\" or \"Überschrift\". */\nexport const markdownReferenceTypeLabel = (type: MarkdownReferenceType, locale?: string): string =>\n String(resolveMarkdownReferenceMessages(locale)[TYPE_LABELS[type]]);\n\n/**\n * The text of rendered inline HTML, still as HTML: tags go, character references such as `©` stay. One pass,\n * so a label full of `<` stays linear. The result only ever reaches `textAttribute`, which escapes what is left.\n */\nconst htmlText = (html: string): string => {\n let text = \"\";\n let index = 0;\n for (let open = html.indexOf(\"<\"); open !== -1; open = html.indexOf(\"<\", index)) {\n const close = html.indexOf(\">\", open + 1);\n if (close === -1) break;\n text += html.slice(index, open);\n index = close + 1;\n }\n return text + html.slice(index);\n};\n\n/** HTML text as an attribute value. Character references stay for the browser to decode; nothing can end the value. */\nconst textAttribute = (text: string): string =>\n text\n .replace(/&(?!#\\d+;|#x[\\da-f]+;|[a-z][a-z\\d]*;)/gi, \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n\nconst isMailHref = (href: string) => /^(?:mailto|tel):/i.test(href.trim());\n\n/**\n * One link of rendered Markdown. A reference to content of the host renders as a calm pill: a neutral fill, the\n * text in the prose colour, and an icon whose colour names the type. Its accessible name starts with the type, as\n * in \"PDF: Brand-2026.pdf\". A heading in another document shows that document first (\"Notes › Heading\"). A web\n * link stays prose text with a thin underline in the link accent and a small ↗; a mail link has no arrow. A link\n * around an image is the image: a plain anchor that the image's own text names.\n */\nexport const renderMarkdownLink = (input: MarkdownLinkInput): string => {\n const titleAttribute = input.title ? ` title=\"${escapeHtml(input.title)}\"` : \"\";\n const targetAttributes =\n input.target === \"_blank\" ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : input.rel ? ` rel=\"${escapeHtml(input.rel)}\"` : \"\";\n const href = escapeHtml(input.href);\n if (/<img\\b/i.test(input.html)) return `<a href=\"${href}\"${titleAttribute}${targetAttributes}>${input.html}</a>`;\n const reference = input.reference;\n if (!reference) {\n const mail = isMailHref(input.href);\n const arrow = mail ? \"\" : '<i class=\"k2b-text-link__external ti ti-arrow-up-right\" aria-hidden=\"true\"></i>';\n return `<a href=\"${href}\" class=\"k2b-text-link\" data-link=\"${mail ? \"mail\" : \"web\"}\"${titleAttribute}${targetAttributes}>${input.html}${arrow}</a>`;\n }\n const text = (input.text ?? htmlText(input.html)).trim();\n const type = markdownReferenceType(reference, text);\n const icon = markdownReferenceIcon(type, reference.fileName ?? text);\n const size = input.standalone && reference.kind === \"file\" && reference.size ? reference.size : \"\";\n const document = reference.kind === \"heading\" ? (reference.document?.trim() ?? \"\") : \"\";\n const name =\n escapeHtml(`${markdownReferenceTypeLabel(type, input.locale)}: ${document ? `${document} › ` : \"\"}`) +\n (input.text === undefined ? textAttribute(text) : escapeHtml(text)) +\n (size ? escapeHtml(`, ${size}`) : \"\");\n return (\n `<a href=\"${href}\" class=\"k2b-reference\" data-reference=\"${type}\" aria-label=\"${name}\"${titleAttribute}${targetAttributes}>` +\n `<i class=\"k2b-reference__icon ti ${icon}\" aria-hidden=\"true\"></i>` +\n (document ? `<span class=\"k2b-reference__document\">${escapeHtml(document)} ›</span> ` : \"\") +\n input.html +\n (size ? `<span class=\"k2b-reference__size\">${escapeHtml(size)}</span>` : \"\") +\n `</a>`\n );\n};\n\nconst isBlank = (token: Token) => (token.type === \"text\" || token.type === \"space\") && !token.raw.trim();\nconst isLink = (token: Token | undefined): token is Tokens.Link => token?.type === \"link\";\n\n/**\n * The links among `tokens` that stand alone on their line: the only content of a paragraph or list item line,\n * between line breaks. Pass the result's check as `standalone` to `renderMarkdownLink`, so a file shows its size\n * in a list of files but not inside a sentence. Call it from `walkTokens` of a renderer with GFM line breaks\n * (`breaks: true`), where every source line is a visual line.\n */\nexport const markStandaloneLinks = (token: Token, standalone: WeakSet<Tokens.Link>): void => {\n if ((token.type !== \"paragraph\" && token.type !== \"text\") || !(\"tokens\" in token) || !token.tokens) return;\n let line: Token[] = [];\n const close = () => {\n const content = line.filter((candidate) => !isBlank(candidate));\n if (content.length === 1 && isLink(content[0])) standalone.add(content[0]);\n line = [];\n };\n for (const child of token.tokens) {\n if (child.type === \"br\") {\n close();\n continue;\n }\n const plain = child.type === \"text\" && !(\"tokens\" in child && child.tokens?.length) ? child.raw : \"\";\n if (plain.includes(\"\\n\")) {\n for (const [index, part] of plain.split(\"\\n\").entries()) {\n if (index > 0) close();\n if (part.trim()) line.push({ type: \"text\", raw: part, text: part });\n }\n continue;\n }\n line.push(child);\n }\n close();\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
const markdownReferenceMessages = i18n.define({
|
|
3
|
+
baseLocale: "en",
|
|
4
|
+
messages: {
|
|
5
|
+
en: {
|
|
6
|
+
referencePdf: "PDF",
|
|
7
|
+
referenceImage: "Image",
|
|
8
|
+
referenceDesign: "Design file",
|
|
9
|
+
referenceFile: "File",
|
|
10
|
+
referenceNote: "Note",
|
|
11
|
+
referenceHeading: "Heading",
|
|
12
|
+
referenceTask: "Task",
|
|
13
|
+
referencePage: "Page"
|
|
14
|
+
},
|
|
15
|
+
de: {
|
|
16
|
+
referencePdf: "PDF",
|
|
17
|
+
referenceImage: "Bild",
|
|
18
|
+
referenceDesign: "Designdatei",
|
|
19
|
+
referenceFile: "Datei",
|
|
20
|
+
referenceNote: "Notiz",
|
|
21
|
+
referenceHeading: "Überschrift",
|
|
22
|
+
referenceTask: "Aufgabe",
|
|
23
|
+
referencePage: "Seite"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
/** Imperative UI inherits the document locale when no locale is supplied. */
|
|
28
|
+
export const resolveMarkdownReferenceMessages = locale => markdownReferenceMessages.resolve([locale ?? (typeof document === "undefined" ? markdownReferenceMessages.baseLocale : document.documentElement.lang)]).t;
|
|
29
|
+
export const checkMarkdownReferenceMessages = () => markdownReferenceMessages.check();
|
|
30
|
+
//# sourceMappingURL=markdown-reference-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/markdown-reference-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\nconst markdownReferenceMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n referencePdf: \"PDF\",\n referenceImage: \"Image\",\n referenceDesign: \"Design file\",\n referenceFile: \"File\",\n referenceNote: \"Note\",\n referenceHeading: \"Heading\",\n referenceTask: \"Task\",\n referencePage: \"Page\",\n },\n de: {\n referencePdf: \"PDF\",\n referenceImage: \"Bild\",\n referenceDesign: \"Designdatei\",\n referenceFile: \"Datei\",\n referenceNote: \"Notiz\",\n referenceHeading: \"Überschrift\",\n referenceTask: \"Aufgabe\",\n referencePage: \"Seite\",\n },\n },\n});\n\nexport type MarkdownReferenceMessages = ReturnType<(typeof markdownReferenceMessages)[\"resolve\"]>[\"t\"];\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolveMarkdownReferenceMessages = (locale?: string): MarkdownReferenceMessages =>\n markdownReferenceMessages.resolve([\n locale ?? (typeof document === \"undefined\" ? markdownReferenceMessages.baseLocale : document.documentElement.lang),\n ]).t;\n\nexport const checkMarkdownReferenceMessages = () => markdownReferenceMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAElC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CAAC;EAC5C,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,YAAY,EAAE,KAAK;MACnB,cAAc,EAAE,OAAO;MACvB,eAAe,EAAE,aAAa;MAC9B,aAAa,EAAE,MAAM;MACrB,aAAa,EAAE,MAAM;MACrB,gBAAgB,EAAE,SAAS;MAC3B,aAAa,EAAE,MAAM;MACrB,aAAa,EAAE;IACjB,CAAC;IACD,EAAE,EAAE;MACF,YAAY,EAAE,KAAK;MACnB,cAAc,EAAE,MAAM;MACtB,eAAe,EAAE,aAAa;MAC9B,aAAa,EAAE,OAAO;MACtB,aAAa,EAAE,OAAO;MACtB,gBAAgB,EAAE,aAAa;MAC/B,aAAa,EAAE,SAAS;MACxB,aAAa,EAAE;IACjB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,gCAAgC,GAAI,MAAe,IAC9D,yBAAyB,CAAC,OAAO,CAAC,CAChC,MAAM,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,yBAAyB,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CACnH,CAAC,CAAC,CAAC;AAEN,OAAO,MAAM,8BAA8B,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const paginationMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
pagination: "Pagination",
|
|
8
|
+
pageOf: ({
|
|
9
|
+
page,
|
|
10
|
+
total
|
|
11
|
+
}) => `Page ${page} of ${total}`,
|
|
12
|
+
previousPage: "Previous page",
|
|
13
|
+
nextPage: "Next page",
|
|
14
|
+
goToPage: ({
|
|
15
|
+
page
|
|
16
|
+
}) => `Go to page ${page}`
|
|
17
|
+
},
|
|
18
|
+
de: {
|
|
19
|
+
pagination: "Seitennavigation",
|
|
20
|
+
pageOf: ({
|
|
21
|
+
page,
|
|
22
|
+
total
|
|
23
|
+
}) => `Seite ${page} von ${total}`,
|
|
24
|
+
previousPage: "Vorherige Seite",
|
|
25
|
+
nextPage: "Nächste Seite",
|
|
26
|
+
goToPage: ({
|
|
27
|
+
page
|
|
28
|
+
}) => `Zu Seite ${page}`
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
/** Resolved from the inherited render locale. */
|
|
33
|
+
export const usePaginationMessages = () => {
|
|
34
|
+
const locale = useLocale();
|
|
35
|
+
return () => paginationMessages.resolve([locale()]).t;
|
|
36
|
+
};
|
|
37
|
+
export const checkPaginationMessages = () => paginationMessages.check();
|
|
38
|
+
//# sourceMappingURL=pagination-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/pagination-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst paginationMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n pagination: \"Pagination\",\n pageOf: ({ page, total }: { page: number; total: number }) => `Page ${page} of ${total}`,\n previousPage: \"Previous page\",\n nextPage: \"Next page\",\n goToPage: ({ page }: { page: number }) => `Go to page ${page}`,\n },\n de: {\n pagination: \"Seitennavigation\",\n pageOf: ({ page, total }) => `Seite ${page} von ${total}`,\n previousPage: \"Vorherige Seite\",\n nextPage: \"Nächste Seite\",\n goToPage: ({ page }) => `Zu Seite ${page}`,\n },\n },\n});\n\nexport type PaginationMessages = ReturnType<(typeof paginationMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const usePaginationMessages = (): (() => PaginationMessages) => {\n const locale = useLocale();\n return () => paginationMessages.resolve([locale()]).t;\n};\n\nexport const checkPaginationMessages = () => paginationMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;EACrC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,UAAU,EAAE,YAAY;MACxB,MAAM,EAAE,CAAC;QAAE,IAAI;QAAE;MAAuC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE;MACxF,YAAY,EAAE,eAAe;MAC7B,QAAQ,EAAE,WAAW;MACrB,QAAQ,EAAE,CAAC;QAAE;MAAuB,CAAC,KAAK,cAAc,IAAI;IAC9D,CAAC;IACD,EAAE,EAAE;MACF,UAAU,EAAE,kBAAkB;MAC9B,MAAM,EAAE,CAAC;QAAE,IAAI;QAAE;MAAM,CAAC,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;MACzD,YAAY,EAAE,iBAAiB;MAC/B,QAAQ,EAAE,eAAe;MACzB,QAAQ,EAAE,CAAC;QAAE;MAAK,CAAC,KAAK,YAAY,IAAI;IAC1C;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,qBAAqB,GAAG,MAAkC;EACrE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,MAAM,uBAAuB,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
const pdfMessages = i18n.define({
|
|
4
|
+
baseLocale: "en",
|
|
5
|
+
messages: {
|
|
6
|
+
en: {
|
|
7
|
+
openPreview: "Open preview",
|
|
8
|
+
pdfPreview: "PDF preview",
|
|
9
|
+
pdfPreviewHttpError: ({
|
|
10
|
+
status
|
|
11
|
+
}) => `PDF preview failed with HTTP ${status}`,
|
|
12
|
+
pdfPreviewTabBlocked: "The browser blocked the new tab. Allow pop-ups and try again.",
|
|
13
|
+
pdfPreviewNoViewer: "This PDF cannot be shown here",
|
|
14
|
+
pdfPreviewNoViewerDescription: "Your browser cannot show PDFs inside a page. Open the document to view it.",
|
|
15
|
+
pdfPreviewRendering: "Rendering PDF preview…",
|
|
16
|
+
previewPdf: "Preview PDF",
|
|
17
|
+
renderPdfPreview: "Render a PDF preview to see the final output."
|
|
18
|
+
},
|
|
19
|
+
de: {
|
|
20
|
+
openPreview: "Vorschau öffnen",
|
|
21
|
+
pdfPreview: "PDF-Vorschau",
|
|
22
|
+
pdfPreviewHttpError: ({
|
|
23
|
+
status
|
|
24
|
+
}) => `PDF-Vorschau ist mit HTTP ${status} fehlgeschlagen`,
|
|
25
|
+
pdfPreviewTabBlocked: "Der Browser hat den neuen Tab blockiert. Erlaube Pop-ups und versuche es erneut.",
|
|
26
|
+
pdfPreviewNoViewer: "Dieses PDF kann hier nicht angezeigt werden",
|
|
27
|
+
pdfPreviewNoViewerDescription: "Dein Browser kann PDFs nicht innerhalb einer Seite anzeigen. Öffne das Dokument, um es anzusehen.",
|
|
28
|
+
pdfPreviewRendering: "PDF-Vorschau wird erstellt…",
|
|
29
|
+
previewPdf: "PDF anzeigen",
|
|
30
|
+
renderPdfPreview: "Erzeuge eine PDF-Vorschau, um das Endergebnis zu sehen."
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
/** Resolved from the inherited render locale. */
|
|
35
|
+
export const usePdfMessages = () => {
|
|
36
|
+
const locale = useLocale();
|
|
37
|
+
return () => pdfMessages.resolve([locale()]).t;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** Imperative UI inherits the document locale when no locale is supplied. */
|
|
41
|
+
export const resolvePdfMessages = locale => pdfMessages.resolve([locale ?? (typeof document === "undefined" ? pdfMessages.baseLocale : document.documentElement.lang)]).t;
|
|
42
|
+
export const checkPdfMessages = () => pdfMessages.check();
|
|
43
|
+
//# sourceMappingURL=pdf-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/pdf-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\nconst pdfMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n openPreview: \"Open preview\",\n pdfPreview: \"PDF preview\",\n pdfPreviewHttpError: ({ status }: { status: number }) => `PDF preview failed with HTTP ${status}`,\n pdfPreviewTabBlocked: \"The browser blocked the new tab. Allow pop-ups and try again.\",\n pdfPreviewNoViewer: \"This PDF cannot be shown here\",\n pdfPreviewNoViewerDescription: \"Your browser cannot show PDFs inside a page. Open the document to view it.\",\n pdfPreviewRendering: \"Rendering PDF preview…\",\n previewPdf: \"Preview PDF\",\n renderPdfPreview: \"Render a PDF preview to see the final output.\",\n },\n de: {\n openPreview: \"Vorschau öffnen\",\n pdfPreview: \"PDF-Vorschau\",\n pdfPreviewHttpError: ({ status }) => `PDF-Vorschau ist mit HTTP ${status} fehlgeschlagen`,\n pdfPreviewTabBlocked: \"Der Browser hat den neuen Tab blockiert. Erlaube Pop-ups und versuche es erneut.\",\n pdfPreviewNoViewer: \"Dieses PDF kann hier nicht angezeigt werden\",\n pdfPreviewNoViewerDescription: \"Dein Browser kann PDFs nicht innerhalb einer Seite anzeigen. Öffne das Dokument, um es anzusehen.\",\n pdfPreviewRendering: \"PDF-Vorschau wird erstellt…\",\n previewPdf: \"PDF anzeigen\",\n renderPdfPreview: \"Erzeuge eine PDF-Vorschau, um das Endergebnis zu sehen.\",\n },\n },\n});\n\nexport type PdfMessages = ReturnType<(typeof pdfMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const usePdfMessages = (): (() => PdfMessages) => {\n const locale = useLocale();\n return () => pdfMessages.resolve([locale()]).t;\n};\n\n/** Imperative UI inherits the document locale when no locale is supplied. */\nexport const resolvePdfMessages = (locale?: string): PdfMessages =>\n pdfMessages.resolve([locale ?? (typeof document === \"undefined\" ? pdfMessages.baseLocale : document.documentElement.lang)]).t;\n\nexport const checkPdfMessages = () => pdfMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;AAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;EAC9B,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,WAAW,EAAE,cAAc;MAC3B,UAAU,EAAE,aAAa;MACzB,mBAAmB,EAAE,CAAC;QAAE;MAA2B,CAAC,KAAK,gCAAgC,MAAM,EAAE;MACjG,oBAAoB,EAAE,+DAA+D;MACrF,kBAAkB,EAAE,+BAA+B;MACnD,6BAA6B,EAAE,4EAA4E;MAC3G,mBAAmB,EAAE,wBAAwB;MAC7C,UAAU,EAAE,aAAa;MACzB,gBAAgB,EAAE;IACpB,CAAC;IACD,EAAE,EAAE;MACF,WAAW,EAAE,iBAAiB;MAC9B,UAAU,EAAE,cAAc;MAC1B,mBAAmB,EAAE,CAAC;QAAE;MAAO,CAAC,KAAK,6BAA6B,MAAM,iBAAiB;MACzF,oBAAoB,EAAE,kFAAkF;MACxG,kBAAkB,EAAE,6CAA6C;MACjE,6BAA6B,EAAE,mGAAmG;MAClI,mBAAmB,EAAE,6BAA6B;MAClD,UAAU,EAAE,cAAc;MAC1B,gBAAgB,EAAE;IACpB;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,cAAc,GAAG,MAA2B;EACvD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;;AAED;AACA,OAAO,MAAM,kBAAkB,GAAI,MAAe,IAChD,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,WAAW,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/H,OAAO,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|