@k2b/ui 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Button.js +20 -31
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/ContextMenu.js +10 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +10 -8
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +3 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +4 -0
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -1
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/filter-messages.js +20 -0
- package/dist/browser/actions/filter-messages.js.map +1 -0
- package/dist/browser/actions/spotlight-messages.js +16 -0
- package/dist/browser/actions/spotlight-messages.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +47 -41
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +25 -23
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatRoot.js +3 -3
- package/dist/browser/chat/ChatRoot.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +12 -12
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +236 -0
- package/dist/browser/chat/chat-messages.js.map +1 -0
- package/dist/browser/content/Calendar.js +1960 -575
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +20 -12
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +9 -7
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +4 -2
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +3 -3
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +68 -59
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js +3 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +30 -26
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +9 -7
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +37 -28
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +9 -7
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js +3 -3
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MessageRow.js +24 -22
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/Pagination.js +7 -7
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +15 -13
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js +3 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js +3 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +13 -11
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/VideoPlayer.js +5 -5
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +6 -4
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +10 -7
- package/dist/browser/content/ZoomPanViewport.js.map +1 -1
- package/dist/browser/content/calendar-messages.js +121 -0
- package/dist/browser/content/calendar-messages.js.map +1 -0
- package/dist/browser/content/calendar-month-layout.js +108 -0
- package/dist/browser/content/calendar-month-layout.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +4 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-messages.js +136 -0
- package/dist/browser/content/chart-messages.js.map +1 -0
- package/dist/browser/content/collection-selection.js +2 -0
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +24 -0
- package/dist/browser/content/data-table-messages.js.map +1 -0
- package/dist/browser/content/docs-messages.js +24 -0
- package/dist/browser/content/docs-messages.js.map +1 -0
- package/dist/browser/content/feed-messages.js +34 -0
- package/dist/browser/content/feed-messages.js.map +1 -0
- package/dist/browser/content/file-browser-messages.js +69 -0
- package/dist/browser/content/file-browser-messages.js.map +1 -0
- package/dist/browser/content/file-view-messages.js +64 -0
- package/dist/browser/content/file-view-messages.js.map +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +46 -10
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/FileDropTarget.js +6 -6
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +30 -21
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/MultiSelectInput.js +7 -5
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +4 -2
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/QrScanner.js +5 -5
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/inputs/Select.js +7 -5
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -3
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/SignatureInput.js +9 -3
- package/dist/browser/inputs/SignatureInput.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js +4 -2
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/TagEditor.js +8 -6
- package/dist/browser/inputs/TagEditor.js.map +1 -1
- package/dist/browser/inputs/TagsInput.js +5 -5
- package/dist/browser/inputs/TagsInput.js.map +1 -1
- package/dist/browser/inputs/TemplateEditor.js +5 -5
- package/dist/browser/inputs/TemplateEditor.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +3 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/completion-messages.js +24 -0
- package/dist/browser/inputs/completion-messages.js.map +1 -0
- package/dist/browser/inputs/date-picker.js +24 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/inputs/file-drop-messages.js +63 -0
- package/dist/browser/inputs/file-drop-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/inputs/file-input-messages.js +60 -0
- package/dist/browser/inputs/file-input-messages.js.map +1 -0
- package/dist/browser/inputs/icon-messages.js +22 -0
- package/dist/browser/inputs/icon-messages.js.map +1 -0
- package/dist/browser/inputs/input-messages.js +38 -0
- package/dist/browser/inputs/input-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/Toolbar.js +13 -13
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/browser/inputs/markdown/editor-messages.js +43 -0
- package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/browser/inputs/qr-messages.js +26 -0
- package/dist/browser/inputs/qr-messages.js.map +1 -0
- package/dist/browser/inputs/select-messages.js +63 -0
- package/dist/browser/inputs/select-messages.js.map +1 -0
- package/dist/browser/inputs/tag-messages.js +44 -0
- package/dist/browser/inputs/tag-messages.js.map +1 -0
- package/dist/browser/inputs/template-messages.js +22 -0
- package/dist/browser/inputs/template-messages.js.map +1 -0
- package/dist/browser/internal/render-error-messages.js +20 -0
- package/dist/browser/internal/render-error-messages.js.map +1 -0
- package/dist/browser/internal/render-error.js +3 -1
- package/dist/browser/internal/render-error.js.map +1 -1
- package/dist/browser/internal/text-selection.js +101 -0
- package/dist/browser/internal/text-selection.js.map +1 -0
- package/dist/browser/intl/messages.js +12 -1155
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +561 -418
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +6 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/Discussion.js +8 -5
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +8 -5
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js +7 -6
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +370 -0
- package/dist/browser/layout/PageTitle.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +8 -6
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Panes.js +23 -15
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +13 -4
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/Settings.js +14 -12
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js +6 -5
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +3 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +743 -12
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js +3 -2
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-messages.js +28 -0
- package/dist/browser/layout/floating-window-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/page-title-controller.js +169 -0
- package/dist/browser/layout/page-title-controller.js.map +1 -0
- package/dist/browser/layout/panel-dialog-messages.js +20 -0
- package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
- package/dist/browser/layout/panes-messages.js +48 -0
- package/dist/browser/layout/panes-messages.js.map +1 -0
- package/dist/browser/layout/refresh-messages.js +20 -0
- package/dist/browser/layout/refresh-messages.js.map +1 -0
- package/dist/browser/layout/settings-messages.js +54 -0
- package/dist/browser/layout/settings-messages.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +56 -0
- package/dist/browser/layout/workspace-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +5 -5
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +4 -2
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/Tag.js +3 -3
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +26 -0
- package/dist/browser/surfaces/avatar-messages.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +26 -0
- package/dist/browser/surfaces/resource-messages.js.map +1 -0
- package/dist/browser/widgets/Widget.js +6 -0
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/Button.js +21 -32
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +7 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +9 -7
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +3 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +4 -0
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -1
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/filter-messages.js +20 -0
- package/dist/ssr/actions/filter-messages.js.map +1 -0
- package/dist/ssr/actions/spotlight-messages.js +16 -0
- package/dist/ssr/actions/spotlight-messages.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +47 -41
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +23 -21
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatRoot.js +3 -3
- package/dist/ssr/chat/ChatRoot.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +11 -11
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +236 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -0
- package/dist/ssr/content/Calendar.js +1232 -115
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +10 -8
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +9 -7
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +4 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +3 -3
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +10 -4
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +3 -1
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +30 -26
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +9 -7
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +37 -28
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -6
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js +3 -3
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +24 -22
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/Pagination.js +6 -6
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +15 -13
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js +3 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js +3 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +13 -11
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/VideoPlayer.js +5 -5
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +6 -4
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +7 -4
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
- package/dist/ssr/content/calendar-messages.js +121 -0
- package/dist/ssr/content/calendar-messages.js.map +1 -0
- package/dist/ssr/content/calendar-month-layout.js +108 -0
- package/dist/ssr/content/calendar-month-layout.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +4 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-messages.js +136 -0
- package/dist/ssr/content/chart-messages.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +2 -0
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +24 -0
- package/dist/ssr/content/data-table-messages.js.map +1 -0
- package/dist/ssr/content/docs-messages.js +24 -0
- package/dist/ssr/content/docs-messages.js.map +1 -0
- package/dist/ssr/content/feed-messages.js +34 -0
- package/dist/ssr/content/feed-messages.js.map +1 -0
- package/dist/ssr/content/file-browser-messages.js +69 -0
- package/dist/ssr/content/file-browser-messages.js.map +1 -0
- package/dist/ssr/content/file-view-messages.js +64 -0
- package/dist/ssr/content/file-view-messages.js.map +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/lightbox-messages.js +36 -0
- package/dist/ssr/content/lightbox-messages.js.map +1 -0
- package/dist/ssr/content/log-entries-messages.js +20 -0
- package/dist/ssr/content/log-entries-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-block-messages.js +24 -0
- package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-blocks.js +3 -3
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/content/markdown-links.js +2 -2
- package/dist/ssr/content/markdown-links.js.map +1 -1
- package/dist/ssr/content/markdown-reference-messages.js +30 -0
- package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
- package/dist/ssr/content/pagination-messages.js +38 -0
- package/dist/ssr/content/pagination-messages.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +43 -0
- package/dist/ssr/content/pdf-messages.js.map +1 -0
- package/dist/ssr/content/range-picker-messages.js +20 -0
- package/dist/ssr/content/range-picker-messages.js.map +1 -0
- package/dist/ssr/content/structured-data-messages.js +22 -0
- package/dist/ssr/content/structured-data-messages.js.map +1 -0
- package/dist/ssr/content/timeline-messages.js +62 -0
- package/dist/ssr/content/timeline-messages.js.map +1 -0
- package/dist/ssr/content/video-messages.js +24 -0
- package/dist/ssr/content/video-messages.js.map +1 -0
- package/dist/ssr/content/viewport-messages.js +28 -0
- package/dist/ssr/content/viewport-messages.js.map +1 -0
- package/dist/ssr/feedback/HoverPreview.js +34 -6
- package/dist/ssr/feedback/HoverPreview.js.map +1 -1
- package/dist/ssr/feedback/InstallGuide.js +18 -18
- package/dist/ssr/feedback/InstallGuide.js.map +1 -1
- package/dist/ssr/feedback/install-messages.js +104 -0
- package/dist/ssr/feedback/install-messages.js.map +1 -0
- package/dist/ssr/feedback/prompt-messages.js +65 -0
- package/dist/ssr/feedback/prompt-messages.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +14 -11
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast-messages.js +18 -0
- package/dist/ssr/feedback/toast-messages.js.map +1 -0
- package/dist/ssr/feedback/toast.js +4 -3
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +4 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +5 -5
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +3 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +34 -4
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/FileDropTarget.js +6 -6
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +29 -20
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/MultiSelectInput.js +7 -5
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +4 -2
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/QrScanner.js +4 -4
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/inputs/Select.js +7 -5
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/SignatureInput.js +9 -3
- package/dist/ssr/inputs/SignatureInput.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +4 -2
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/TagEditor.js +8 -6
- package/dist/ssr/inputs/TagEditor.js.map +1 -1
- package/dist/ssr/inputs/TagsInput.js +5 -5
- package/dist/ssr/inputs/TagsInput.js.map +1 -1
- package/dist/ssr/inputs/TemplateEditor.js +5 -5
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +3 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/completion-messages.js +24 -0
- package/dist/ssr/inputs/completion-messages.js.map +1 -0
- package/dist/ssr/inputs/date-picker.js +24 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/inputs/file-drop-messages.js +63 -0
- package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/inputs/file-input-messages.js +60 -0
- package/dist/ssr/inputs/file-input-messages.js.map +1 -0
- package/dist/ssr/inputs/icon-messages.js +22 -0
- package/dist/ssr/inputs/icon-messages.js.map +1 -0
- package/dist/ssr/inputs/input-messages.js +38 -0
- package/dist/ssr/inputs/input-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
- package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/ssr/inputs/qr-messages.js +26 -0
- package/dist/ssr/inputs/qr-messages.js.map +1 -0
- package/dist/ssr/inputs/select-messages.js +63 -0
- package/dist/ssr/inputs/select-messages.js.map +1 -0
- package/dist/ssr/inputs/tag-messages.js +44 -0
- package/dist/ssr/inputs/tag-messages.js.map +1 -0
- package/dist/ssr/inputs/template-messages.js +22 -0
- package/dist/ssr/inputs/template-messages.js.map +1 -0
- package/dist/ssr/internal/render-error-messages.js +20 -0
- package/dist/ssr/internal/render-error-messages.js.map +1 -0
- package/dist/ssr/internal/render-error.js +3 -1
- package/dist/ssr/internal/render-error.js.map +1 -1
- package/dist/ssr/internal/text-selection.js +101 -0
- package/dist/ssr/internal/text-selection.js.map +1 -0
- package/dist/ssr/intl/messages.js +12 -1155
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +203 -96
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +1 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +8 -5
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +8 -5
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +6 -5
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +253 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +8 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Panes.js +22 -14
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +13 -4
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/Settings.js +14 -12
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +6 -5
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +3 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +743 -12
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js +3 -2
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-messages.js +28 -0
- package/dist/ssr/layout/floating-window-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/page-title-controller.js +169 -0
- package/dist/ssr/layout/page-title-controller.js.map +1 -0
- package/dist/ssr/layout/panel-dialog-messages.js +20 -0
- package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
- package/dist/ssr/layout/panes-messages.js +48 -0
- package/dist/ssr/layout/panes-messages.js.map +1 -0
- package/dist/ssr/layout/refresh-messages.js +20 -0
- package/dist/ssr/layout/refresh-messages.js.map +1 -0
- package/dist/ssr/layout/settings-messages.js +54 -0
- package/dist/ssr/layout/settings-messages.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +56 -0
- package/dist/ssr/layout/workspace-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +5 -5
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +4 -2
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js +3 -3
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +26 -0
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +26 -0
- package/dist/ssr/surfaces/resource-messages.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +6 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/GestureMenu.d.ts +2 -0
- package/dist/types/actions/filter-messages.d.ts +8 -0
- package/dist/types/actions/spotlight-messages.d.ts +8 -0
- package/dist/types/chat/chat-messages.d.ts +116 -0
- package/dist/types/content/Calendar.d.ts +32 -0
- package/dist/types/content/DataTable.d.ts +2 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-messages.d.ts +60 -0
- package/dist/types/content/calendar-month-layout.d.ts +52 -0
- package/dist/types/content/chart-messages.d.ts +32 -0
- package/dist/types/content/data-table-messages.d.ts +10 -0
- package/dist/types/content/docs-messages.d.ts +10 -0
- package/dist/types/content/feed-messages.d.ts +15 -0
- package/dist/types/content/file-browser-messages.d.ts +33 -0
- package/dist/types/content/file-view-messages.d.ts +30 -0
- package/dist/types/content/index.d.ts +1 -1
- package/dist/types/content/lightbox-messages.d.ts +16 -0
- package/dist/types/content/log-entries-messages.d.ts +8 -0
- package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
- package/dist/types/content/markdown-reference-messages.d.ts +15 -0
- package/dist/types/content/pagination-messages.d.ts +17 -0
- package/dist/types/content/pdf-messages.d.ts +20 -0
- package/dist/types/content/range-picker-messages.d.ts +8 -0
- package/dist/types/content/structured-data-messages.d.ts +9 -0
- package/dist/types/content/timeline-messages.d.ts +29 -0
- package/dist/types/content/video-messages.d.ts +10 -0
- package/dist/types/content/viewport-messages.d.ts +12 -0
- package/dist/types/feedback/install-messages.d.ts +50 -0
- package/dist/types/feedback/prompt-messages.d.ts +31 -0
- package/dist/types/feedback/toast-messages.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/inputs/completion-messages.d.ts +10 -0
- package/dist/types/inputs/date-picker.d.ts +7 -0
- package/dist/types/inputs/file-drop-messages.d.ts +30 -0
- package/dist/types/inputs/file-drop.d.ts +3 -3
- package/dist/types/inputs/file-input-messages.d.ts +28 -0
- package/dist/types/inputs/icon-messages.d.ts +9 -0
- package/dist/types/inputs/input-messages.d.ts +17 -0
- package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
- package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
- package/dist/types/inputs/qr-messages.d.ts +11 -0
- package/dist/types/inputs/select-messages.d.ts +30 -0
- package/dist/types/inputs/tag-messages.d.ts +20 -0
- package/dist/types/inputs/template-messages.d.ts +9 -0
- package/dist/types/internal/render-error-messages.d.ts +8 -0
- package/dist/types/internal/text-selection.d.ts +18 -0
- package/dist/types/intl/messages.d.ts +6 -544
- package/dist/types/layout/AppWorkspace.d.ts +19 -4
- package/dist/types/layout/PageTitle.d.ts +64 -0
- package/dist/types/layout/app-workspace-controller.d.ts +4 -0
- package/dist/types/layout/app-workspace-state.d.ts +3 -2
- package/dist/types/layout/floating-window-messages.d.ts +12 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +7 -0
- package/dist/types/layout/page-title-controller.d.ts +13 -0
- package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
- package/dist/types/layout/panes-messages.d.ts +22 -0
- package/dist/types/layout/refresh-messages.d.ts +8 -0
- package/dist/types/layout/settings-messages.d.ts +25 -0
- package/dist/types/layout/workspace-messages.d.ts +26 -0
- package/dist/types/surfaces/avatar-messages.d.ts +11 -0
- package/dist/types/surfaces/resource-messages.d.ts +11 -0
- package/dist/types/widgets/Widget.d.ts +5 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ var _tmpl$ = ["<p class=\"k2b-qr-scanner__note\">", "</p>"],
|
|
|
6
6
|
_tmpl$2 = ["<div", "><div class=\"k2b-qr-scanner__preview\"", "><video muted playsinline", "></video></div><p role=\"status\">", "</p>", "</div>"];
|
|
7
7
|
import { timed } from "@k2b/stdlib/solid";
|
|
8
8
|
import { createSignal, onCleanup, onMount, Show } from "solid-js";
|
|
9
|
-
import {
|
|
9
|
+
import { useQrMessages } from "./qr-messages";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Why the scanner could not start, as far as the browser tells: `"denied"` when camera access is off, `"no-camera"`
|
|
@@ -96,7 +96,7 @@ const stopStream = stream => {
|
|
|
96
96
|
* Decoded content is never logged.
|
|
97
97
|
*/
|
|
98
98
|
export function QrScanner(props) {
|
|
99
|
-
const
|
|
99
|
+
const qrMessages = useQrMessages();
|
|
100
100
|
const [starting, setStarting] = createSignal(true);
|
|
101
101
|
const [invalid, setInvalid] = createSignal(false);
|
|
102
102
|
let lastRejected;
|
|
@@ -195,12 +195,12 @@ export function QrScanner(props) {
|
|
|
195
195
|
}
|
|
196
196
|
})();
|
|
197
197
|
});
|
|
198
|
-
return _$ssr(_tmpl$2, _$ssrAttribute("class", props.class ? `k2b-qr-scanner ${_$escape(props.class, true)}` : "k2b-qr-scanner", false), _$ssrAttribute("data-invalid", _$escape(invalid() || undefined, true), false), _$ssrAttribute("aria-label", _$escape(
|
|
198
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("class", props.class ? `k2b-qr-scanner ${_$escape(props.class, true)}` : "k2b-qr-scanner", false), _$ssrAttribute("data-invalid", _$escape(invalid() || undefined, true), false), _$ssrAttribute("aria-label", _$escape(qrMessages().qrCameraPreview, true), false), starting() ? _$escape(qrMessages().qrCameraStarting) : _$escape(props.instructions ?? qrMessages().qrCameraInstructions), _$escape(_$createComponent(Show, {
|
|
199
199
|
get when() {
|
|
200
200
|
return !starting();
|
|
201
201
|
},
|
|
202
202
|
get children() {
|
|
203
|
-
return _$ssr(_tmpl$, _$escape(
|
|
203
|
+
return _$ssr(_tmpl$, _$escape(qrMessages().qrCameraPrivacy));
|
|
204
204
|
}
|
|
205
205
|
})));
|
|
206
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/QrScanner.tsx"],"sourcesContent":["import { timed } from \"@k2b/stdlib/solid\";\nimport type QrScannerEngine from \"qr-scanner\";\nimport { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/**\n * Why the scanner could not start, as far as the browser tells: `\"denied\"` when camera access is off, `\"no-camera\"`\n * when the device has no camera, `\"in-use\"` when the camera is busy or could not start, most often because another app\n * holds it, and `\"unavailable\"` for anything else, including a scanning engine that cannot load.\n */\nexport type QrScannerError = \"denied\" | \"no-camera\" | \"in-use\" | \"unavailable\";\n\nexport type QrScannerProps = {\n /** Decoded text is untrusted. Return `true` to accept it and stop the camera, `false` to reject it and keep scanning. */\n onResult: (text: string) => boolean;\n /** The page was hidden or left; unmount the scanner. */\n onStop: () => void;\n /**\n * The camera or the scanning engine could not start; the scanner has stopped. Offer another way in. A frame that\n * cannot be decoded never ends here.\n */\n onError: (reason: QrScannerError) => void;\n /** What to point the camera at. Defaults to a generic QR code hint. */\n instructions?: string;\n class?: string;\n};\n\nconst sizes: MediaTrackConstraints[] = [{ width: { min: 1024 } }, { width: { min: 768 } }, {}];\n/** The rear camera at a resolution that keeps small codes readable, then any camera: the order qr-scanner tries. */\nconst cameraRequests: MediaTrackConstraints[] = [...sizes.map((size) => ({ ...size, facingMode: { exact: \"environment\" } })), ...sizes];\n\nconst errorName = (error: unknown): string => (typeof error === \"object\" && error !== null && \"name\" in error ? String(error.name) : \"\");\n\nconst cameraFailure = (name: string): QrScannerError => {\n if (name === \"NotAllowedError\" || name === \"SecurityError\") return \"denied\";\n if (name === \"NotFoundError\" || name === \"OverconstrainedError\") return \"no-camera\";\n if (name === \"NotReadableError\") return \"in-use\";\n return \"unavailable\";\n};\n\n/** The facing a track reports, or else the one its label names, as qr-scanner reads it. */\nconst facingOf = (track: MediaStreamTrack | undefined): string | undefined => {\n if (!track) return undefined;\n const { facingMode } = track.getSettings();\n if (facingMode) return facingMode;\n if (/rear|back|environment/i.test(track.label)) return \"environment\";\n if (/front|user|face/i.test(track.label)) return \"user\";\n return undefined;\n};\n\n/**\n * Opens the camera here rather than in qr-scanner, which turns every failure into \"Camera not found.\". A refusal ends\n * the search, because asking again could show the permission prompt again. Any other failure may belong to the request,\n * such as a camera that cannot start at the larger size, so the next, looser request follows, as in qr-scanner. When\n * none succeeds, a camera that exists but fails outweighs a request no camera could meet. A closed scanner asks no more.\n */\nconst openCamera = async (closed: () => boolean): Promise<{ stream: MediaStream; mirrored: boolean } | { error: QrScannerError }> => {\n if (!navigator.mediaDevices) return { error: \"unavailable\" };\n let error: QrScannerError = \"no-camera\";\n for (const video of cameraRequests) {\n if (closed()) break;\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video, audio: false });\n const facing = facingOf(stream.getVideoTracks()[0]);\n // Like qr-scanner, mirror a front camera, and a camera of unknown facing that the rear request did not find.\n return { stream, mirrored: facing ? facing === \"user\" : !video.facingMode };\n } catch (failure) {\n const reason = cameraFailure(errorName(failure));\n if (reason === \"denied\") return { error: reason };\n if (reason !== \"no-camera\") error = reason;\n }\n }\n return { error };\n};\n\nconst stopStream = (stream: MediaStream) => {\n for (const track of stream.getTracks()) track.stop();\n};\n\n/**\n * Scans a QR code with the rear camera. Each mount owns exactly one camera session, which stops when the scanner\n * unmounts, the page is hidden, or a result is accepted. The scanning engine loads only when the scanner mounts.\n * Decoded content is never logged.\n */\nexport function QrScanner(props: QrScannerProps): JSX.Element {\n const messages = useUiMessages();\n const [starting, setStarting] = createSignal(true);\n const [invalid, setInvalid] = createSignal(false);\n let lastRejected: string | undefined;\n const resetRejected = timed.debounce(() => {\n lastRejected = undefined;\n }, 1000);\n const resetFeedback = timed.debounce(() => setInvalid(false), 1500);\n let video!: HTMLVideoElement;\n let scanner: QrScannerEngine | undefined;\n let closed = false;\n let cleanupMotion: (() => void) | undefined;\n const destroy = () => {\n closed = true;\n cleanupMotion?.();\n resetRejected.cancel();\n resetFeedback.cancel();\n // pause(true) stops the camera stream immediately.\n void scanner?.pause(true);\n scanner?.destroy();\n scanner = undefined;\n };\n // Once closed, the host has unmounted the scanner or heard why it stopped; later failures stay silent.\n const fail = (reason: QrScannerError) => {\n if (closed) return;\n destroy();\n props.onError(reason);\n };\n onMount(() => {\n const hidden = () => {\n if (document.visibilityState !== \"visible\") props.onStop();\n };\n const leaving = () => props.onStop();\n document.addEventListener(\"visibilitychange\", hidden);\n window.addEventListener(\"pagehide\", leaving);\n onCleanup(() => {\n destroy();\n document.removeEventListener(\"visibilitychange\", hidden);\n window.removeEventListener(\"pagehide\", leaving);\n });\n void (async () => {\n try {\n const { default: Engine } = await import(\"qr-scanner\");\n if (closed || document.visibilityState !== \"visible\") return;\n scanner = new Engine(\n video,\n (result) => {\n if (closed) return;\n // Rearm only after a full second without a decoded QR, not between individual frames.\n resetRejected.debouncedFn();\n if (result.data === lastRejected) return;\n if (props.onResult(result.data)) {\n destroy();\n return;\n }\n lastRejected = result.data;\n setInvalid(true);\n resetFeedback.debouncedFn();\n },\n {\n highlightScanRegion: true,\n // A frame that cannot be decoded never ends the session: the camera runs, and the next frame may read.\n // An engine error other than an empty frame, which the native BarcodeDetector reports as \"Scanner error:\n // No QR code found\", means the detector cannot read on this device. Fall back to the bundled worker for\n // the page through the flag qr-scanner 1.4.2 sets itself for \"not implemented\" and \"service unavailable\";\n // it swaps engines after this frame. Worker errors carry the same prefix; the flag changes nothing there.\n // qr-scanner reports frames only as strings: an Error means the engine itself did not load, such as a\n // decoder chunk gone after a deploy or a worker that cannot start, and no later frame can read. Never log\n // decoded content or frame data.\n onDecodeError: (error) => {\n if (typeof error !== \"string\") return fail(\"unavailable\");\n if (error.startsWith(\"Scanner error: \") && !error.endsWith(Engine.NO_QR_CODE_FOUND)) {\n Reflect.set(Engine, \"_disableBarcodeDetector\", true);\n }\n },\n },\n );\n const motion = matchMedia(\"(prefers-reduced-motion: reduce)\");\n const applyMotion = () => {\n for (const animation of scanner?.$overlay?.getAnimations({ subtree: true }) ?? []) {\n if (motion.matches) animation.pause();\n else animation.play();\n }\n };\n applyMotion();\n motion.addEventListener(\"change\", applyMotion);\n cleanupMotion = () => motion.removeEventListener(\"change\", applyMotion);\n const camera = await openCamera(() => closed);\n if (\"error\" in camera) return fail(camera.error);\n if (closed) return stopStream(camera.stream);\n // qr-scanner plays a stream that is already set instead of opening its own.\n video.srcObject = camera.stream;\n video.style.transform = camera.mirrored ? \"scaleX(-1)\" : \"\";\n await scanner.start();\n if (!closed) setStarting(false);\n } catch {\n fail(\"unavailable\");\n }\n })();\n });\n return (\n <div class={props.class ? `k2b-qr-scanner ${props.class}` : \"k2b-qr-scanner\"}>\n <div class=\"k2b-qr-scanner__preview\" data-invalid={invalid() || undefined}>\n {/* Live camera preview contains no prerecorded speech or audio. */}\n <video ref={video} muted playsinline aria-label={messages().qrCameraPreview} />\n </div>\n <p role=\"status\">{starting() ? messages().qrCameraStarting : (props.instructions ?? messages().qrCameraInstructions)}</p>\n <Show when={!starting()}>\n <p class=\"k2b-qr-scanner__note\">{messages().qrCameraPrivacy}</p>\n </Show>\n </div>\n );\n}\n\nexport default QrScanner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/QrScanner.tsx"],"sourcesContent":["import { timed } from \"@k2b/stdlib/solid\";\nimport type QrScannerEngine from \"qr-scanner\";\nimport { createSignal, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { useQrMessages } from \"./qr-messages\";\n\n/**\n * Why the scanner could not start, as far as the browser tells: `\"denied\"` when camera access is off, `\"no-camera\"`\n * when the device has no camera, `\"in-use\"` when the camera is busy or could not start, most often because another app\n * holds it, and `\"unavailable\"` for anything else, including a scanning engine that cannot load.\n */\nexport type QrScannerError = \"denied\" | \"no-camera\" | \"in-use\" | \"unavailable\";\n\nexport type QrScannerProps = {\n /** Decoded text is untrusted. Return `true` to accept it and stop the camera, `false` to reject it and keep scanning. */\n onResult: (text: string) => boolean;\n /** The page was hidden or left; unmount the scanner. */\n onStop: () => void;\n /**\n * The camera or the scanning engine could not start; the scanner has stopped. Offer another way in. A frame that\n * cannot be decoded never ends here.\n */\n onError: (reason: QrScannerError) => void;\n /** What to point the camera at. Defaults to a generic QR code hint. */\n instructions?: string;\n class?: string;\n};\n\nconst sizes: MediaTrackConstraints[] = [{ width: { min: 1024 } }, { width: { min: 768 } }, {}];\n/** The rear camera at a resolution that keeps small codes readable, then any camera: the order qr-scanner tries. */\nconst cameraRequests: MediaTrackConstraints[] = [...sizes.map((size) => ({ ...size, facingMode: { exact: \"environment\" } })), ...sizes];\n\nconst errorName = (error: unknown): string => (typeof error === \"object\" && error !== null && \"name\" in error ? String(error.name) : \"\");\n\nconst cameraFailure = (name: string): QrScannerError => {\n if (name === \"NotAllowedError\" || name === \"SecurityError\") return \"denied\";\n if (name === \"NotFoundError\" || name === \"OverconstrainedError\") return \"no-camera\";\n if (name === \"NotReadableError\") return \"in-use\";\n return \"unavailable\";\n};\n\n/** The facing a track reports, or else the one its label names, as qr-scanner reads it. */\nconst facingOf = (track: MediaStreamTrack | undefined): string | undefined => {\n if (!track) return undefined;\n const { facingMode } = track.getSettings();\n if (facingMode) return facingMode;\n if (/rear|back|environment/i.test(track.label)) return \"environment\";\n if (/front|user|face/i.test(track.label)) return \"user\";\n return undefined;\n};\n\n/**\n * Opens the camera here rather than in qr-scanner, which turns every failure into \"Camera not found.\". A refusal ends\n * the search, because asking again could show the permission prompt again. Any other failure may belong to the request,\n * such as a camera that cannot start at the larger size, so the next, looser request follows, as in qr-scanner. When\n * none succeeds, a camera that exists but fails outweighs a request no camera could meet. A closed scanner asks no more.\n */\nconst openCamera = async (closed: () => boolean): Promise<{ stream: MediaStream; mirrored: boolean } | { error: QrScannerError }> => {\n if (!navigator.mediaDevices) return { error: \"unavailable\" };\n let error: QrScannerError = \"no-camera\";\n for (const video of cameraRequests) {\n if (closed()) break;\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video, audio: false });\n const facing = facingOf(stream.getVideoTracks()[0]);\n // Like qr-scanner, mirror a front camera, and a camera of unknown facing that the rear request did not find.\n return { stream, mirrored: facing ? facing === \"user\" : !video.facingMode };\n } catch (failure) {\n const reason = cameraFailure(errorName(failure));\n if (reason === \"denied\") return { error: reason };\n if (reason !== \"no-camera\") error = reason;\n }\n }\n return { error };\n};\n\nconst stopStream = (stream: MediaStream) => {\n for (const track of stream.getTracks()) track.stop();\n};\n\n/**\n * Scans a QR code with the rear camera. Each mount owns exactly one camera session, which stops when the scanner\n * unmounts, the page is hidden, or a result is accepted. The scanning engine loads only when the scanner mounts.\n * Decoded content is never logged.\n */\nexport function QrScanner(props: QrScannerProps): JSX.Element {\n const qrMessages = useQrMessages();\n const [starting, setStarting] = createSignal(true);\n const [invalid, setInvalid] = createSignal(false);\n let lastRejected: string | undefined;\n const resetRejected = timed.debounce(() => {\n lastRejected = undefined;\n }, 1000);\n const resetFeedback = timed.debounce(() => setInvalid(false), 1500);\n let video!: HTMLVideoElement;\n let scanner: QrScannerEngine | undefined;\n let closed = false;\n let cleanupMotion: (() => void) | undefined;\n const destroy = () => {\n closed = true;\n cleanupMotion?.();\n resetRejected.cancel();\n resetFeedback.cancel();\n // pause(true) stops the camera stream immediately.\n void scanner?.pause(true);\n scanner?.destroy();\n scanner = undefined;\n };\n // Once closed, the host has unmounted the scanner or heard why it stopped; later failures stay silent.\n const fail = (reason: QrScannerError) => {\n if (closed) return;\n destroy();\n props.onError(reason);\n };\n onMount(() => {\n const hidden = () => {\n if (document.visibilityState !== \"visible\") props.onStop();\n };\n const leaving = () => props.onStop();\n document.addEventListener(\"visibilitychange\", hidden);\n window.addEventListener(\"pagehide\", leaving);\n onCleanup(() => {\n destroy();\n document.removeEventListener(\"visibilitychange\", hidden);\n window.removeEventListener(\"pagehide\", leaving);\n });\n void (async () => {\n try {\n const { default: Engine } = await import(\"qr-scanner\");\n if (closed || document.visibilityState !== \"visible\") return;\n scanner = new Engine(\n video,\n (result) => {\n if (closed) return;\n // Rearm only after a full second without a decoded QR, not between individual frames.\n resetRejected.debouncedFn();\n if (result.data === lastRejected) return;\n if (props.onResult(result.data)) {\n destroy();\n return;\n }\n lastRejected = result.data;\n setInvalid(true);\n resetFeedback.debouncedFn();\n },\n {\n highlightScanRegion: true,\n // A frame that cannot be decoded never ends the session: the camera runs, and the next frame may read.\n // An engine error other than an empty frame, which the native BarcodeDetector reports as \"Scanner error:\n // No QR code found\", means the detector cannot read on this device. Fall back to the bundled worker for\n // the page through the flag qr-scanner 1.4.2 sets itself for \"not implemented\" and \"service unavailable\";\n // it swaps engines after this frame. Worker errors carry the same prefix; the flag changes nothing there.\n // qr-scanner reports frames only as strings: an Error means the engine itself did not load, such as a\n // decoder chunk gone after a deploy or a worker that cannot start, and no later frame can read. Never log\n // decoded content or frame data.\n onDecodeError: (error) => {\n if (typeof error !== \"string\") return fail(\"unavailable\");\n if (error.startsWith(\"Scanner error: \") && !error.endsWith(Engine.NO_QR_CODE_FOUND)) {\n Reflect.set(Engine, \"_disableBarcodeDetector\", true);\n }\n },\n },\n );\n const motion = matchMedia(\"(prefers-reduced-motion: reduce)\");\n const applyMotion = () => {\n for (const animation of scanner?.$overlay?.getAnimations({ subtree: true }) ?? []) {\n if (motion.matches) animation.pause();\n else animation.play();\n }\n };\n applyMotion();\n motion.addEventListener(\"change\", applyMotion);\n cleanupMotion = () => motion.removeEventListener(\"change\", applyMotion);\n const camera = await openCamera(() => closed);\n if (\"error\" in camera) return fail(camera.error);\n if (closed) return stopStream(camera.stream);\n // qr-scanner plays a stream that is already set instead of opening its own.\n video.srcObject = camera.stream;\n video.style.transform = camera.mirrored ? \"scaleX(-1)\" : \"\";\n await scanner.start();\n if (!closed) setStarting(false);\n } catch {\n fail(\"unavailable\");\n }\n })();\n });\n return (\n <div class={props.class ? `k2b-qr-scanner ${props.class}` : \"k2b-qr-scanner\"}>\n <div class=\"k2b-qr-scanner__preview\" data-invalid={invalid() || undefined}>\n {/* Live camera preview contains no prerecorded speech or audio. */}\n <video ref={video} muted playsinline aria-label={qrMessages().qrCameraPreview} />\n </div>\n <p role=\"status\">{starting() ? qrMessages().qrCameraStarting : (props.instructions ?? qrMessages().qrCameraInstructions)}</p>\n <Show when={!starting()}>\n <p class=\"k2b-qr-scanner__note\">{qrMessages().qrCameraPrivacy}</p>\n </Show>\n </div>\n );\n}\n\nexport default QrScanner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -28,6 +28,7 @@ import { useUiMessages } from "../intl/messages";
|
|
|
28
28
|
import { ChoiceGroups } from "./ChoiceGroups";
|
|
29
29
|
import { createChoiceLoader, createChoicePopover, filterChoiceOptions, nextEnabledChoiceIndex } from "./choice";
|
|
30
30
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
31
|
+
import { useSelectMessages } from "./select-messages";
|
|
31
32
|
|
|
32
33
|
/**
|
|
33
34
|
* `field` draws the boxed form control. `plain` shows the value as text for
|
|
@@ -48,6 +49,7 @@ const normalize = option => typeof option === "string" ? {
|
|
|
48
49
|
};
|
|
49
50
|
export function Select(props) {
|
|
50
51
|
const messages = useUiMessages();
|
|
52
|
+
const selectMessages = useSelectMessages();
|
|
51
53
|
const meta = createFieldMeta(props.id);
|
|
52
54
|
const listboxId = `${meta.controlId}-listbox`;
|
|
53
55
|
const [query, setQuery] = createSignal("");
|
|
@@ -103,7 +105,7 @@ export function Select(props) {
|
|
|
103
105
|
};
|
|
104
106
|
});
|
|
105
107
|
const hasClearAction = () => Boolean(props.clearable && selected() && !props.disabled && !plain());
|
|
106
|
-
const accessibleLabel = () => props["aria-label"] ?? (typeof props.label === "string" ? undefined : props.placeholder ??
|
|
108
|
+
const accessibleLabel = () => props["aria-label"] ?? (typeof props.label === "string" ? undefined : props.placeholder ?? selectMessages().selectOption);
|
|
107
109
|
const popover = createChoicePopover(() => Boolean(props.disabled));
|
|
108
110
|
const focusedOption = () => listOptions()[focusedIndex()];
|
|
109
111
|
const focus = index => {
|
|
@@ -275,7 +277,7 @@ export function Select(props) {
|
|
|
275
277
|
return isSearchable();
|
|
276
278
|
},
|
|
277
279
|
get children() {
|
|
278
|
-
return _$ssr(_tmpl$4, _$ssrAttribute("value", _$escape(query(), true), false) + _$ssrAttribute("placeholder", _$escape(props.searchPlaceholder ?? messages().search, true), false) + _$ssrAttribute("aria-label", _$escape(props.searchPlaceholder ??
|
|
280
|
+
return _$ssr(_tmpl$4, _$ssrAttribute("value", _$escape(query(), true), false) + _$ssrAttribute("placeholder", _$escape(props.searchPlaceholder ?? messages().search, true), false) + _$ssrAttribute("aria-label", _$escape(props.searchPlaceholder ?? selectMessages().searchOptions, true), false) + _$ssrAttribute("aria-controls", _$escape(listboxId, true), false) + _$ssrAttribute("aria-activedescendant", focusedOption() ? `${_$escape(listboxId, true)}-${_$escape(focusedIndex(), true)}` : _$escape(undefined, true), false));
|
|
279
281
|
}
|
|
280
282
|
})), _$escape(_$createComponent(Show, {
|
|
281
283
|
get when() {
|
|
@@ -296,7 +298,7 @@ export function Select(props) {
|
|
|
296
298
|
},
|
|
297
299
|
onValueChange: chooseGroup,
|
|
298
300
|
get ariaLabel() {
|
|
299
|
-
return props.groupsAriaLabel ??
|
|
301
|
+
return props.groupsAriaLabel ?? selectMessages().filterOptions;
|
|
300
302
|
},
|
|
301
303
|
controls: listboxId
|
|
302
304
|
});
|
|
@@ -306,7 +308,7 @@ export function Select(props) {
|
|
|
306
308
|
return props.viewToggle;
|
|
307
309
|
},
|
|
308
310
|
get children() {
|
|
309
|
-
return _$ssr(_tmpl$5, _$ssrAttribute("aria-label", activeView() === "list" ? _$escape(
|
|
311
|
+
return _$ssr(_tmpl$5, _$ssrAttribute("aria-label", activeView() === "list" ? _$escape(selectMessages().showGridView, true) : _$escape(selectMessages().showListView, true), false) + _$ssrAttribute("aria-controls", _$escape(listboxId, true), false), _$ssrAttribute("class", activeView() === "list" ? "ti ti-category-2" : "ti ti-list-details", false));
|
|
310
312
|
}
|
|
311
313
|
})));
|
|
312
314
|
}
|
|
@@ -332,7 +334,7 @@ export function Select(props) {
|
|
|
332
334
|
return _$memo(() => !!!loader.loading())() && !loader.error();
|
|
333
335
|
},
|
|
334
336
|
get children() {
|
|
335
|
-
return _$ssr(_tmpl$12, isSearchable() ? _$escape(messages().noResults) : _$escape(
|
|
337
|
+
return _$ssr(_tmpl$12, isSearchable() ? _$escape(messages().noResults) : _$escape(selectMessages().noOptions));
|
|
336
338
|
}
|
|
337
339
|
});
|
|
338
340
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/Select.tsx"],"sourcesContent":["import { createMemo, createSignal, For, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChoiceGroups } from \"./ChoiceGroups\";\nimport { type ChoiceOption, createChoiceLoader, createChoicePopover, filterChoiceOptions, nextEnabledChoiceIndex } from \"./choice\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\n\nexport type SelectOption = ChoiceOption<string>;\nexport type SelectGroup = {\n value: string;\n label: string;\n};\nexport type SelectView = \"list\" | \"grid\";\nexport type SelectGridSize = \"sm\" | \"md\" | \"lg\";\n/**\n * `field` draws the boxed form control. `plain` shows the value as text for\n * property rows: no box, no chevron, and a quiet surface on hover or while\n * open. Its surface and hit area cover the nearest positioned ancestor, such as\n * a `DescriptionList` row, so the whole row opens the picker.\n */\nexport type ChoiceAppearance = \"field\" | \"plain\";\nexport type SelectSourceOption =\n | string\n | {\n id: string;\n label?: string;\n description?: string;\n icon?: string;\n color?: string;\n groups?: readonly string[];\n }\n | SelectOption;\n\nexport type SelectProps = ValueFieldProps<string | null> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n options?: SelectSourceOption[];\n fetchData?: (query: string, signal: AbortSignal, group: string | null) => Promise<SelectSourceOption[]>;\n loadOptions?: (query: string, signal: AbortSignal, group: string | null) => Promise<readonly ChoiceOption<string>[]>;\n selectedOption?: ChoiceOption<string>;\n selectedLabel?: () => string | undefined;\n fetchDebounceMs?: number;\n debounceMs?: number;\n searchable?: boolean;\n /** Optional synchronous filter for static options. */\n filterOptions?: (options: readonly SelectOption[], query: string) => readonly SelectOption[];\n /** Optional filters. An option may belong to more than one group. */\n groups?: readonly SelectGroup[];\n /** Group selected when the component is created. Omit to start with all options. */\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n /** Show a local list/grid layout toggle in the dropdown. */\n viewToggle?: boolean;\n /** Initial dropdown layout when `viewToggle` is enabled. */\n defaultView?: SelectView;\n /** Tile density for the grid layout. */\n gridSize?: SelectGridSize;\n searchPlaceholder?: string;\n clearable?: boolean;\n name?: string;\n appearance?: ChoiceAppearance;\n /** Icon class shown before the placeholder while nothing is selected. */\n placeholderIcon?: string;\n};\n\ntype NormalizedOption = ChoiceOption<string>;\n/** The list entry that clears a plain select. It cannot collide with a real option value. */\nconst CLEAR_VALUE = \"\\u0000k2b-select-clear\";\n\nconst normalize = (option: SelectSourceOption): NormalizedOption =>\n typeof option === \"string\"\n ? { value: option, label: option }\n : \"value\" in option\n ? option\n : { ...option, value: option.id, label: option.label || option.id };\n\nexport function Select(props: SelectProps): JSX.Element {\n const messages = useUiMessages();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const [query, setQuery] = createSignal(\"\");\n const [focusedIndex, setFocusedIndex] = createSignal(-1);\n const [cache, setCache] = createSignal<Record<string, NormalizedOption>>({});\n const [selectedGroup, setSelectedGroup] = createSignal<string | null>(props.defaultGroup ?? null);\n const [selectedView, setSelectedView] = createSignal<SelectView>(props.defaultView ?? \"list\");\n let searchRef: HTMLInputElement | undefined;\n let optionRefs: HTMLButtonElement[] = [];\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const activeGroup = createMemo(() => {\n const current = selectedGroup();\n return current && props.groups?.some((group) => group.value === current) ? current : null;\n });\n const groupChoices = createMemo(() => [{ value: null, label: props.allGroupLabel ?? messages().all }, ...(props.groups ?? [])]);\n const activeView = () => (props.viewToggle ? selectedView() : \"list\");\n\n const loader = createChoiceLoader(\n () =>\n props.fetchData\n ? async (value, signal) => (await props.fetchData!(value, signal, activeGroup())).map(normalize)\n : props.loadOptions\n ? (value, signal) => props.loadOptions!(value, signal, activeGroup())\n : undefined,\n () => props.fetchDebounceMs ?? props.debounceMs ?? 200,\n );\n const isAsync = () => Boolean(props.fetchData || props.loadOptions);\n const isSearchable = () => isAsync() || Boolean(props.searchable);\n const sourceOptions = createMemo(() => (isAsync() ? loader.options() : (props.options ?? []).map(normalize)));\n const groupedOptions = createMemo(() => {\n const group = activeGroup();\n return !isAsync() && group ? sourceOptions().filter((option) => option.groups?.includes(group)) : sourceOptions();\n });\n // Remote loaders filter server-side; a static list has to be filtered here or\n // the search field would render but do nothing.\n const options = createMemo(() =>\n isAsync() || !props.searchable\n ? groupedOptions()\n : props.filterOptions\n ? [...props.filterOptions(groupedOptions(), query())]\n : filterChoiceOptions(groupedOptions(), query()),\n );\n const plain = () => props.appearance === \"plain\";\n // A plain select has no room for a clear button beside its value, so\n // clearing becomes the last list entry, named by the placeholder.\n const clearOption = createMemo<NormalizedOption | undefined>(() =>\n plain() && props.clearable && !query() ? { value: CLEAR_VALUE, label: props.placeholder ?? messages().clearSelection } : undefined,\n );\n const listOptions = createMemo(() => {\n const clear = clearOption();\n return clear && !loader.error() ? [...options(), clear] : options();\n });\n // Colour dots mark the options, so an empty plain value keeps the column with a hollow dot.\n const emptyDot = () => plain() && !props.placeholderIcon && sourceOptions().some((option) => option.color);\n const selected = createMemo(() => {\n const current = value();\n if (current === null) return undefined;\n // Resolve against the unfiltered list so typing in the search field never\n // blanks the trigger label of the current selection.\n return (\n sourceOptions().find((option) => option.value === current) ??\n cache()[current] ??\n (props.selectedOption?.value === current ? props.selectedOption : undefined) ?? {\n value: current,\n label: props.selectedLabel?.() ?? current,\n }\n );\n });\n const hasClearAction = () => Boolean(props.clearable && selected() && !props.disabled && !plain());\n const accessibleLabel = () =>\n props[\"aria-label\"] ?? (typeof props.label === \"string\" ? undefined : (props.placeholder ?? messages().selectOption));\n const popover = createChoicePopover(() => Boolean(props.disabled));\n const focusedOption = () => listOptions()[focusedIndex()];\n const focus = (index: number) => {\n setFocusedIndex(index);\n optionRefs[index]?.scrollIntoView({ block: \"nearest\" });\n };\n const move = (direction: 1 | -1) => focus(nextEnabledChoiceIndex(listOptions(), focusedIndex(), direction));\n const chooseGroup = (group: string | null) => {\n if (group === activeGroup()) return;\n setSelectedGroup(group);\n setFocusedIndex(nextEnabledChoiceIndex(listOptions(), -1, 1));\n if (isAsync()) loader.load(query(), true);\n };\n const open = () => {\n if (props.disabled) return;\n setQuery(\"\");\n if (isAsync()) loader.load(\"\", true);\n const selectedIndex = listOptions().findIndex((option) => option.value === (value() ?? CLEAR_VALUE));\n focus(selectedIndex >= 0 ? selectedIndex : nextEnabledChoiceIndex(listOptions(), -1, 1));\n popover.show();\n if (isSearchable()) queueMicrotask(() => searchRef?.focus());\n };\n const close = (restoreFocus = false) => {\n // Hide the top-layer surface before any reactive cleanup or consumer\n // callback can rerender its contents. Selection must feel atomic: the old\n // listbox must never remain visible with the next value.\n popover.hide(restoreFocus);\n loader.cancel();\n setQuery(\"\");\n setFocusedIndex(-1);\n };\n const select = (option: NormalizedOption) => {\n if (option.disabled) return;\n close(true);\n if (option.value === CLEAR_VALUE) {\n commitFieldValue(props, null);\n return;\n }\n setCache({ ...cache(), [option.value]: option });\n commitFieldValue(props, option.value);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const inToolbar = Boolean((event.target as HTMLElement | null)?.closest?.(\".k2b-choice-toolbar\"));\n if (inToolbar && event.key !== \"Escape\" && event.key !== \"Tab\") return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!popover.open()) open();\n else move(event.key === \"ArrowDown\" ? 1 : -1);\n } else if ((event.key === \"Enter\" || event.key === \" \") && !popover.open()) {\n event.preventDefault();\n open();\n } else if (event.key === \"Enter\" && focusedOption()) {\n event.preventDefault();\n select(focusedOption()!);\n } else if (event.key === \"Escape\" && popover.open()) {\n // Only swallow Escape while the list is open — a closed select must let\n // the key bubble to an enclosing dialog or drawer.\n event.preventDefault();\n close(true);\n } else if (event.key === \"Tab\" && popover.open()) close();\n };\n const clear = (event: MouseEvent) => {\n event.stopPropagation();\n commitFieldValue(props, null);\n popover.trigger()?.focus();\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-choice-control\" data-appearance={props.appearance ?? \"field\"} data-invalid={error() ? \"true\" : undefined}>\n <button\n ref={popover.setTrigger}\n id={meta.controlId}\n type=\"button\"\n class=\"k2b-choice-trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={popover.open()}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n data-clearable={hasClearAction() ? \"true\" : undefined}\n {...fieldControlAria(meta, {\n ...props,\n \"aria-label\": accessibleLabel(),\n })}\n disabled={props.disabled}\n onClick={() => (popover.open() ? close() : open())}\n onKeyDown={onKeyDown}\n >\n <Show\n when={selected()}\n fallback={\n <Show\n when={props.placeholderIcon}\n fallback={<Show when={emptyDot()}>{<span class=\"k2b-choice-dot\" data-empty=\"true\" aria-hidden=\"true\" />}</Show>}\n >\n {(icon) => <i class={`${icon()} k2b-choice-trigger__placeholder-icon`} aria-hidden=\"true\" />}\n </Show>\n }\n >\n <Show\n when={selected()?.color}\n fallback={<Show when={selected()?.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(color) => <span class=\"k2b-choice-dot\" style={{ \"background-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n </Show>\n <span class=\"k2b-choice-trigger__value\" data-placeholder={selected() ? undefined : \"true\"}>\n {selected()?.label ?? props.placeholder ?? messages().select}\n </span>\n <i\n class={`${popover.open() ? (props.activeIcon ?? \"ti ti-chevron-up\") : (props.icon ?? \"ti ti-chevron-down\")} k2b-choice-trigger__chevron`}\n aria-hidden=\"true\"\n />\n </button>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value() ?? \"\"} />}</Show>\n <Show when={hasClearAction()}>\n <button\n type=\"button\"\n class=\"k2b-choice-control__clear k2b-input-clear-action\"\n aria-label={messages().clearSelection}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <div\n ref={popover.setPopover}\n popover=\"manual\"\n class=\"k2b-choice-popover\"\n role=\"group\"\n onKeyDown={onKeyDown}\n aria-label={typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? messages().options)}\n >\n <Show when={isSearchable()}>\n <div class=\"k2b-choice-search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? messages().searchOptions}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n if (isAsync()) loader.load(event.currentTarget.value);\n focus(isAsync() ? -1 : nextEnabledChoiceIndex(options(), -1, 1));\n }}\n />\n </div>\n </Show>\n <Show when={(props.groups?.length ?? 0) > 0 || props.viewToggle}>\n <div class=\"k2b-choice-toolbar\">\n <Show when={(props.groups?.length ?? 0) > 0}>\n <ChoiceGroups\n choices={groupChoices()}\n value={activeGroup()}\n onValueChange={chooseGroup}\n ariaLabel={props.groupsAriaLabel ?? messages().filterOptions}\n controls={listboxId}\n />\n </Show>\n <Show when={props.viewToggle}>\n <button\n type=\"button\"\n class=\"k2b-choice-view-toggle\"\n aria-label={activeView() === \"list\" ? messages().showGridView : messages().showListView}\n aria-controls={listboxId}\n onClick={() => setSelectedView(activeView() === \"list\" ? \"grid\" : \"list\")}\n >\n <i class={activeView() === \"list\" ? \"ti ti-category-2\" : \"ti ti-list-details\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Show>\n <div\n id={listboxId}\n class=\"k2b-choice-options\"\n role=\"listbox\"\n data-view={activeView()}\n data-grid-size={activeView() === \"grid\" ? (props.gridSize ?? \"md\") : undefined}\n >\n <Show when={loader.error()}>\n {(message) => (\n <div class=\"k2b-choice-status\" data-tone=\"danger\">\n <span>{message()}</span>\n <button type=\"button\" onClick={loader.retry}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <Show when={loader.loading() && options().length === 0}>\n <div class=\"k2b-choice-status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span>{messages().loading}</span>\n </div>\n </Show>\n <For\n each={loader.error() ? [] : listOptions()}\n fallback={\n <Show when={!loader.loading() && !loader.error()}>\n <div class=\"k2b-choice-status\">{isSearchable() ? messages().noResults : messages().noOptions}</div>\n </Show>\n }\n >\n {(option, index) => (\n <button\n ref={(element) => (optionRefs[index()] = element)}\n type=\"button\"\n id={`${listboxId}-${index()}`}\n class=\"k2b-choice-option\"\n role=\"option\"\n aria-label={option.label}\n aria-selected={option.value === (value() ?? CLEAR_VALUE)}\n data-focused={index() === focusedIndex() ? \"true\" : undefined}\n data-clear={option.value === CLEAR_VALUE ? \"true\" : undefined}\n disabled={option.disabled}\n onPointerMove={() => focus(index())}\n onClick={() => select(option)}\n >\n <Show\n when={option.value === CLEAR_VALUE}\n fallback={\n <Show\n when={option.color}\n fallback={<Show when={option.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(color) => <span class=\"k2b-choice-dot\" style={{ \"background-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n }\n >\n <Show\n when={props.placeholderIcon}\n fallback={<Show when={emptyDot()}>{<span class=\"k2b-choice-dot\" data-empty=\"true\" aria-hidden=\"true\" />}</Show>}\n >\n {(icon) => <i class={icon()} aria-hidden=\"true\" />}\n </Show>\n </Show>\n <span>\n <strong>{option.label}</strong>\n <Show when={option.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </button>\n )}\n </For>\n </div>\n </div>\n </div>\n </Field>\n );\n}\n\nexport default Select;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/Select.tsx"],"sourcesContent":["import { createMemo, createSignal, For, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChoiceGroups } from \"./ChoiceGroups\";\nimport { type ChoiceOption, createChoiceLoader, createChoicePopover, filterChoiceOptions, nextEnabledChoiceIndex } from \"./choice\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectOption = ChoiceOption<string>;\nexport type SelectGroup = {\n value: string;\n label: string;\n};\nexport type SelectView = \"list\" | \"grid\";\nexport type SelectGridSize = \"sm\" | \"md\" | \"lg\";\n/**\n * `field` draws the boxed form control. `plain` shows the value as text for\n * property rows: no box, no chevron, and a quiet surface on hover or while\n * open. Its surface and hit area cover the nearest positioned ancestor, such as\n * a `DescriptionList` row, so the whole row opens the picker.\n */\nexport type ChoiceAppearance = \"field\" | \"plain\";\nexport type SelectSourceOption =\n | string\n | {\n id: string;\n label?: string;\n description?: string;\n icon?: string;\n color?: string;\n groups?: readonly string[];\n }\n | SelectOption;\n\nexport type SelectProps = ValueFieldProps<string | null> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n options?: SelectSourceOption[];\n fetchData?: (query: string, signal: AbortSignal, group: string | null) => Promise<SelectSourceOption[]>;\n loadOptions?: (query: string, signal: AbortSignal, group: string | null) => Promise<readonly ChoiceOption<string>[]>;\n selectedOption?: ChoiceOption<string>;\n selectedLabel?: () => string | undefined;\n fetchDebounceMs?: number;\n debounceMs?: number;\n searchable?: boolean;\n /** Optional synchronous filter for static options. */\n filterOptions?: (options: readonly SelectOption[], query: string) => readonly SelectOption[];\n /** Optional filters. An option may belong to more than one group. */\n groups?: readonly SelectGroup[];\n /** Group selected when the component is created. Omit to start with all options. */\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n /** Show a local list/grid layout toggle in the dropdown. */\n viewToggle?: boolean;\n /** Initial dropdown layout when `viewToggle` is enabled. */\n defaultView?: SelectView;\n /** Tile density for the grid layout. */\n gridSize?: SelectGridSize;\n searchPlaceholder?: string;\n clearable?: boolean;\n name?: string;\n appearance?: ChoiceAppearance;\n /** Icon class shown before the placeholder while nothing is selected. */\n placeholderIcon?: string;\n};\n\ntype NormalizedOption = ChoiceOption<string>;\n/** The list entry that clears a plain select. It cannot collide with a real option value. */\nconst CLEAR_VALUE = \"\\u0000k2b-select-clear\";\n\nconst normalize = (option: SelectSourceOption): NormalizedOption =>\n typeof option === \"string\"\n ? { value: option, label: option }\n : \"value\" in option\n ? option\n : { ...option, value: option.id, label: option.label || option.id };\n\nexport function Select(props: SelectProps): JSX.Element {\n const messages = useUiMessages();\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const [query, setQuery] = createSignal(\"\");\n const [focusedIndex, setFocusedIndex] = createSignal(-1);\n const [cache, setCache] = createSignal<Record<string, NormalizedOption>>({});\n const [selectedGroup, setSelectedGroup] = createSignal<string | null>(props.defaultGroup ?? null);\n const [selectedView, setSelectedView] = createSignal<SelectView>(props.defaultView ?? \"list\");\n let searchRef: HTMLInputElement | undefined;\n let optionRefs: HTMLButtonElement[] = [];\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const activeGroup = createMemo(() => {\n const current = selectedGroup();\n return current && props.groups?.some((group) => group.value === current) ? current : null;\n });\n const groupChoices = createMemo(() => [{ value: null, label: props.allGroupLabel ?? messages().all }, ...(props.groups ?? [])]);\n const activeView = () => (props.viewToggle ? selectedView() : \"list\");\n\n const loader = createChoiceLoader(\n () =>\n props.fetchData\n ? async (value, signal) => (await props.fetchData!(value, signal, activeGroup())).map(normalize)\n : props.loadOptions\n ? (value, signal) => props.loadOptions!(value, signal, activeGroup())\n : undefined,\n () => props.fetchDebounceMs ?? props.debounceMs ?? 200,\n );\n const isAsync = () => Boolean(props.fetchData || props.loadOptions);\n const isSearchable = () => isAsync() || Boolean(props.searchable);\n const sourceOptions = createMemo(() => (isAsync() ? loader.options() : (props.options ?? []).map(normalize)));\n const groupedOptions = createMemo(() => {\n const group = activeGroup();\n return !isAsync() && group ? sourceOptions().filter((option) => option.groups?.includes(group)) : sourceOptions();\n });\n // Remote loaders filter server-side; a static list has to be filtered here or\n // the search field would render but do nothing.\n const options = createMemo(() =>\n isAsync() || !props.searchable\n ? groupedOptions()\n : props.filterOptions\n ? [...props.filterOptions(groupedOptions(), query())]\n : filterChoiceOptions(groupedOptions(), query()),\n );\n const plain = () => props.appearance === \"plain\";\n // A plain select has no room for a clear button beside its value, so\n // clearing becomes the last list entry, named by the placeholder.\n const clearOption = createMemo<NormalizedOption | undefined>(() =>\n plain() && props.clearable && !query() ? { value: CLEAR_VALUE, label: props.placeholder ?? messages().clearSelection } : undefined,\n );\n const listOptions = createMemo(() => {\n const clear = clearOption();\n return clear && !loader.error() ? [...options(), clear] : options();\n });\n // Colour dots mark the options, so an empty plain value keeps the column with a hollow dot.\n const emptyDot = () => plain() && !props.placeholderIcon && sourceOptions().some((option) => option.color);\n const selected = createMemo(() => {\n const current = value();\n if (current === null) return undefined;\n // Resolve against the unfiltered list so typing in the search field never\n // blanks the trigger label of the current selection.\n return (\n sourceOptions().find((option) => option.value === current) ??\n cache()[current] ??\n (props.selectedOption?.value === current ? props.selectedOption : undefined) ?? {\n value: current,\n label: props.selectedLabel?.() ?? current,\n }\n );\n });\n const hasClearAction = () => Boolean(props.clearable && selected() && !props.disabled && !plain());\n const accessibleLabel = () =>\n props[\"aria-label\"] ?? (typeof props.label === \"string\" ? undefined : (props.placeholder ?? selectMessages().selectOption));\n const popover = createChoicePopover(() => Boolean(props.disabled));\n const focusedOption = () => listOptions()[focusedIndex()];\n const focus = (index: number) => {\n setFocusedIndex(index);\n optionRefs[index]?.scrollIntoView({ block: \"nearest\" });\n };\n const move = (direction: 1 | -1) => focus(nextEnabledChoiceIndex(listOptions(), focusedIndex(), direction));\n const chooseGroup = (group: string | null) => {\n if (group === activeGroup()) return;\n setSelectedGroup(group);\n setFocusedIndex(nextEnabledChoiceIndex(listOptions(), -1, 1));\n if (isAsync()) loader.load(query(), true);\n };\n const open = () => {\n if (props.disabled) return;\n setQuery(\"\");\n if (isAsync()) loader.load(\"\", true);\n const selectedIndex = listOptions().findIndex((option) => option.value === (value() ?? CLEAR_VALUE));\n focus(selectedIndex >= 0 ? selectedIndex : nextEnabledChoiceIndex(listOptions(), -1, 1));\n popover.show();\n if (isSearchable()) queueMicrotask(() => searchRef?.focus());\n };\n const close = (restoreFocus = false) => {\n // Hide the top-layer surface before any reactive cleanup or consumer\n // callback can rerender its contents. Selection must feel atomic: the old\n // listbox must never remain visible with the next value.\n popover.hide(restoreFocus);\n loader.cancel();\n setQuery(\"\");\n setFocusedIndex(-1);\n };\n const select = (option: NormalizedOption) => {\n if (option.disabled) return;\n close(true);\n if (option.value === CLEAR_VALUE) {\n commitFieldValue(props, null);\n return;\n }\n setCache({ ...cache(), [option.value]: option });\n commitFieldValue(props, option.value);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n const inToolbar = Boolean((event.target as HTMLElement | null)?.closest?.(\".k2b-choice-toolbar\"));\n if (inToolbar && event.key !== \"Escape\" && event.key !== \"Tab\") return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!popover.open()) open();\n else move(event.key === \"ArrowDown\" ? 1 : -1);\n } else if ((event.key === \"Enter\" || event.key === \" \") && !popover.open()) {\n event.preventDefault();\n open();\n } else if (event.key === \"Enter\" && focusedOption()) {\n event.preventDefault();\n select(focusedOption()!);\n } else if (event.key === \"Escape\" && popover.open()) {\n // Only swallow Escape while the list is open — a closed select must let\n // the key bubble to an enclosing dialog or drawer.\n event.preventDefault();\n close(true);\n } else if (event.key === \"Tab\" && popover.open()) close();\n };\n const clear = (event: MouseEvent) => {\n event.stopPropagation();\n commitFieldValue(props, null);\n popover.trigger()?.focus();\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-choice-control\" data-appearance={props.appearance ?? \"field\"} data-invalid={error() ? \"true\" : undefined}>\n <button\n ref={popover.setTrigger}\n id={meta.controlId}\n type=\"button\"\n class=\"k2b-choice-trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={popover.open()}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n data-clearable={hasClearAction() ? \"true\" : undefined}\n {...fieldControlAria(meta, {\n ...props,\n \"aria-label\": accessibleLabel(),\n })}\n disabled={props.disabled}\n onClick={() => (popover.open() ? close() : open())}\n onKeyDown={onKeyDown}\n >\n <Show\n when={selected()}\n fallback={\n <Show\n when={props.placeholderIcon}\n fallback={<Show when={emptyDot()}>{<span class=\"k2b-choice-dot\" data-empty=\"true\" aria-hidden=\"true\" />}</Show>}\n >\n {(icon) => <i class={`${icon()} k2b-choice-trigger__placeholder-icon`} aria-hidden=\"true\" />}\n </Show>\n }\n >\n <Show\n when={selected()?.color}\n fallback={<Show when={selected()?.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(color) => <span class=\"k2b-choice-dot\" style={{ \"background-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n </Show>\n <span class=\"k2b-choice-trigger__value\" data-placeholder={selected() ? undefined : \"true\"}>\n {selected()?.label ?? props.placeholder ?? messages().select}\n </span>\n <i\n class={`${popover.open() ? (props.activeIcon ?? \"ti ti-chevron-up\") : (props.icon ?? \"ti ti-chevron-down\")} k2b-choice-trigger__chevron`}\n aria-hidden=\"true\"\n />\n </button>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value() ?? \"\"} />}</Show>\n <Show when={hasClearAction()}>\n <button\n type=\"button\"\n class=\"k2b-choice-control__clear k2b-input-clear-action\"\n aria-label={messages().clearSelection}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <div\n ref={popover.setPopover}\n popover=\"manual\"\n class=\"k2b-choice-popover\"\n role=\"group\"\n onKeyDown={onKeyDown}\n aria-label={typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? messages().options)}\n >\n <Show when={isSearchable()}>\n <div class=\"k2b-choice-search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? selectMessages().searchOptions}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n if (isAsync()) loader.load(event.currentTarget.value);\n focus(isAsync() ? -1 : nextEnabledChoiceIndex(options(), -1, 1));\n }}\n />\n </div>\n </Show>\n <Show when={(props.groups?.length ?? 0) > 0 || props.viewToggle}>\n <div class=\"k2b-choice-toolbar\">\n <Show when={(props.groups?.length ?? 0) > 0}>\n <ChoiceGroups\n choices={groupChoices()}\n value={activeGroup()}\n onValueChange={chooseGroup}\n ariaLabel={props.groupsAriaLabel ?? selectMessages().filterOptions}\n controls={listboxId}\n />\n </Show>\n <Show when={props.viewToggle}>\n <button\n type=\"button\"\n class=\"k2b-choice-view-toggle\"\n aria-label={activeView() === \"list\" ? selectMessages().showGridView : selectMessages().showListView}\n aria-controls={listboxId}\n onClick={() => setSelectedView(activeView() === \"list\" ? \"grid\" : \"list\")}\n >\n <i class={activeView() === \"list\" ? \"ti ti-category-2\" : \"ti ti-list-details\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Show>\n <div\n id={listboxId}\n class=\"k2b-choice-options\"\n role=\"listbox\"\n data-view={activeView()}\n data-grid-size={activeView() === \"grid\" ? (props.gridSize ?? \"md\") : undefined}\n >\n <Show when={loader.error()}>\n {(message) => (\n <div class=\"k2b-choice-status\" data-tone=\"danger\">\n <span>{message()}</span>\n <button type=\"button\" onClick={loader.retry}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <Show when={loader.loading() && options().length === 0}>\n <div class=\"k2b-choice-status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span>{messages().loading}</span>\n </div>\n </Show>\n <For\n each={loader.error() ? [] : listOptions()}\n fallback={\n <Show when={!loader.loading() && !loader.error()}>\n <div class=\"k2b-choice-status\">{isSearchable() ? messages().noResults : selectMessages().noOptions}</div>\n </Show>\n }\n >\n {(option, index) => (\n <button\n ref={(element) => (optionRefs[index()] = element)}\n type=\"button\"\n id={`${listboxId}-${index()}`}\n class=\"k2b-choice-option\"\n role=\"option\"\n aria-label={option.label}\n aria-selected={option.value === (value() ?? CLEAR_VALUE)}\n data-focused={index() === focusedIndex() ? \"true\" : undefined}\n data-clear={option.value === CLEAR_VALUE ? \"true\" : undefined}\n disabled={option.disabled}\n onPointerMove={() => focus(index())}\n onClick={() => select(option)}\n >\n <Show\n when={option.value === CLEAR_VALUE}\n fallback={\n <Show\n when={option.color}\n fallback={<Show when={option.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(color) => <span class=\"k2b-choice-dot\" style={{ \"background-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n }\n >\n <Show\n when={props.placeholderIcon}\n fallback={<Show when={emptyDot()}>{<span class=\"k2b-choice-dot\" data-empty=\"true\" aria-hidden=\"true\" />}</Show>}\n >\n {(icon) => <i class={icon()} aria-hidden=\"true\" />}\n </Show>\n </Show>\n <span>\n <strong>{option.label}</strong>\n <Show when={option.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </button>\n )}\n </For>\n </div>\n </div>\n </div>\n </Field>\n );\n}\n\nexport default Select;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,14 +12,14 @@ var _tmpl$ = ["<span", ">", "</span>"],
|
|
|
12
12
|
import { createMemo, Show } from "solid-js";
|
|
13
13
|
import { Dropdown } from "../actions/Dropdown";
|
|
14
14
|
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
15
|
-
import { useUiMessages } from "../intl/messages";
|
|
16
15
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
16
|
+
import { useSelectMessages } from "./select-messages";
|
|
17
17
|
export function SelectChip(props) {
|
|
18
|
-
const
|
|
18
|
+
const selectMessages = useSelectMessages();
|
|
19
19
|
const meta = createFieldMeta(props.id);
|
|
20
20
|
const value = () => resolveMaybeAccessor(props.value);
|
|
21
21
|
const selected = () => props.options.find(option => option.value === value());
|
|
22
|
-
const triggerLabel = () => props["aria-label"] ?? (typeof props.label === "string" ? props.label :
|
|
22
|
+
const triggerLabel = () => props["aria-label"] ?? (typeof props.label === "string" ? props.label : selectMessages().chooseOption);
|
|
23
23
|
const items = createMemo(() => props.options.map(option => ({
|
|
24
24
|
action: () => commitFieldValue(props, option.value),
|
|
25
25
|
checked: () => option.value === value(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createMemo, type JSX, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport {
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/SelectChip.tsx"],"sourcesContent":["import { createMemo, type JSX, Show } from \"solid-js\";\nimport type { ButtonSize } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"../actions/Dropdown\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type SelectChipOption<T extends string | number = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n image?: string;\n disabled?: boolean;\n};\n\nexport type SelectChipProps<T extends string | number = string> = ValueFieldProps<T> & {\n value: MaybeAccessor<T>;\n options: SelectChipOption<T>[];\n icon?: string;\n iconOnly?: boolean;\n size?: ButtonSize;\n placeholder?: string;\n position?: DropdownPosition;\n /** Exact menu width as a CSS length. Without it the menu sizes to its options, at least `10rem`. */\n menuWidth?: string;\n name?: string;\n};\n\nexport function SelectChip<T extends string | number = string>(props: SelectChipProps<T>): JSX.Element {\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const value = () => resolveMaybeAccessor(props.value)!;\n const selected = () => props.options.find((option) => option.value === value());\n const triggerLabel = () => props[\"aria-label\"] ?? (typeof props.label === \"string\" ? props.label : selectMessages().chooseOption);\n const items = createMemo<DropdownItem[]>(() =>\n props.options.map((option) => ({\n action: () => commitFieldValue(props, option.value),\n checked: () => option.value === value(),\n choice: \"radio\" as const,\n class: \"k2b-select-chip__option\",\n description: option.description,\n disabled: option.disabled,\n icon: option.icon,\n image: option.image,\n label: option.label,\n })),\n );\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <Dropdown.Root\n position={props.position ?? \"bottom-right\"}\n /* Cloud opens this menu at `w-40`; the stylesheet keeps that as its floor. */\n width={props.menuWidth}\n menuClass=\"k2b-select-chip__menu\"\n label={triggerLabel()}\n items={items()}\n >\n <Dropdown.Trigger\n appearance={props.iconOnly ? \"button\" : \"plain\"}\n id={meta.controlId}\n class={props.iconOnly ? undefined : \"k2b-select-chip\"}\n disabled={props.disabled}\n iconOnly={props.iconOnly}\n label={triggerLabel()}\n size={props.iconOnly ? props.size : undefined}\n title={props.iconOnly ? triggerLabel() : undefined}\n {...fieldControlAria(meta, props)}\n >\n <Show\n when={selected()?.image}\n fallback={<Show when={selected()?.icon ?? props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(image) => <img src={image()} alt=\"\" />}\n </Show>\n <Show when={!props.iconOnly}>\n <span data-placeholder={selected() ? undefined : \"true\"}>{selected()?.label ?? props.placeholder ?? \"\"}</span>\n <i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value()} />}</Show>\n </Field>\n );\n}\n\nexport default SelectChip;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,6 +16,7 @@ import { createEffect, createSignal, For, on, Show, untrack } from "solid-js";
|
|
|
16
16
|
import { IconButton } from "../actions/Button";
|
|
17
17
|
import { SegmentedControl } from "../actions/SegmentedControl";
|
|
18
18
|
import { createFieldMeta, Field, fieldDescribedBy } from "../internal/field";
|
|
19
|
+
import { suppressTextSelection } from "../internal/text-selection";
|
|
19
20
|
import { useUiMessages } from "../intl/messages";
|
|
20
21
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
21
22
|
import { drawingToSvg, signatureName, strokeOutline, svgToDrawing, typedToSvg } from "./signature";
|
|
@@ -92,9 +93,11 @@ export function SignatureInput(props) {
|
|
|
92
93
|
const abortStroke = () => {
|
|
93
94
|
if (!stroke) return;
|
|
94
95
|
const {
|
|
95
|
-
pointerId
|
|
96
|
+
pointerId,
|
|
97
|
+
releaseTextSelection
|
|
96
98
|
} = stroke;
|
|
97
99
|
stroke = null;
|
|
100
|
+
releaseTextSelection();
|
|
98
101
|
setLive("");
|
|
99
102
|
if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);
|
|
100
103
|
};
|
|
@@ -246,7 +249,8 @@ export function SignatureInput(props) {
|
|
|
246
249
|
pointerId: event.pointerId,
|
|
247
250
|
pointerType: event.pointerType,
|
|
248
251
|
points: [],
|
|
249
|
-
time: event.timeStamp
|
|
252
|
+
time: event.timeStamp,
|
|
253
|
+
releaseTextSelection: suppressTextSelection(event.pointerId)
|
|
250
254
|
};
|
|
251
255
|
addPoint(event, true);
|
|
252
256
|
};
|
|
@@ -260,10 +264,12 @@ export function SignatureInput(props) {
|
|
|
260
264
|
if (!stroke || stroke.pointerId !== event.pointerId) return;
|
|
261
265
|
addPoint(event, false);
|
|
262
266
|
const {
|
|
263
|
-
points
|
|
267
|
+
points,
|
|
268
|
+
releaseTextSelection
|
|
264
269
|
} = stroke;
|
|
265
270
|
const outline = strokeOutline(points, STROKE_SIZE);
|
|
266
271
|
stroke = null;
|
|
272
|
+
releaseTextSelection();
|
|
267
273
|
setLive("");
|
|
268
274
|
if (!outline) return;
|
|
269
275
|
const space = spaceAfter(points);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/SignatureInput.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, on, Show, untrack } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { SegmentedControl } from \"../actions/SegmentedControl\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n drawingToSvg,\n type SignatureDrawing,\n type SignaturePoint,\n type SignatureValue,\n signatureName,\n strokeOutline,\n svgToDrawing,\n typedToSvg,\n} from \"./signature\";\nimport { useSignatureMessages } from \"./signature-messages\";\n\nexport type SignatureInputProps = ValueFieldProps<SignatureValue | null> & {\n /** Submits the value as JSON in a hidden input of this name. */\n name?: string;\n /** Shows the signature without allowing changes. */\n readOnly?: boolean;\n /**\n * Offers typing the name instead of drawing. Defaults to `true`: typing is the\n * keyboard and screen-reader path and helps people who cannot draw. Without\n * it, a typed value is still shown and can be cleared, but not edited.\n */\n allowTyped?: boolean;\n};\n\ntype SignatureMode = \"draw\" | \"type\";\n\n/** Base stroke width in drawing units (CSS pixels at the time of drawing). */\nconst STROKE_SIZE = 3.2;\n/** Points closer than this to the previous one add no shape, only path length. */\nconst MIN_POINT_DISTANCE = 1.2;\nconst EMPTY_SPACE = { x: 0, y: 0, width: 600, height: 200 };\n\nconst sameValue = (left: SignatureValue | null, right: SignatureValue | null) =>\n left === right ||\n (left !== null &&\n right !== null &&\n left.kind === right.kind &&\n left.svg === right.svg &&\n (left.kind === \"typed\" && right.kind === \"typed\" ? left.name === right.name : true));\n\nconst drawingOf = (value: SignatureValue | null): SignatureDrawing =>\n (value?.kind === \"drawn\" ? svgToDrawing(value.svg) : null) ?? { ...EMPTY_SPACE, strokes: [] };\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\nconst measureText = (text: string, font: string): number | undefined => {\n measureContext ??= document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return undefined;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/**\n * A signature field: draw with a finger, pen, or mouse, or type the name. The\n * value is an SVG document plus how it was given; `signatureToPng` turns it\n * into a bitmap. Legal evidence such as timestamps or hashes stays with the app.\n */\nexport function SignatureInput(props: SignatureInputProps): JSX.Element {\n const messages = useUiMessages();\n const text = useSignatureMessages();\n const meta = createFieldMeta(props.id);\n const requiredId = `${meta.controlId}-required`;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const allowTyped = () => props.allowTyped !== false;\n const editable = () => !props.disabled && !props.readOnly;\n\n const initial = untrack(value);\n const [mode, setMode] = createSignal<SignatureMode>(initial?.kind === \"typed\" ? \"type\" : \"draw\");\n const [drawing, setDrawing] = createSignal<SignatureDrawing>(drawingOf(initial));\n const [typedName, setTypedName] = createSignal(initial?.kind === \"typed\" ? initial.name : \"\");\n const [live, setLive] = createSignal(\"\");\n let svg: SVGSVGElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n let lastReported: SignatureValue | null = initial;\n\n const drawnValue = (): SignatureValue | null => {\n const markup = drawingToSvg(drawing());\n return markup ? { kind: \"drawn\", svg: markup } : null;\n };\n const typedValue = (): SignatureValue | null => {\n const name = signatureName(typedName());\n if (!name) return null;\n const family = nameInput ? getComputedStyle(nameInput).fontFamily : \"cursive\";\n return { kind: \"typed\", name, svg: typedToSvg(name, family, measureText) };\n };\n const report = (next: SignatureValue | null, commit: boolean) => {\n if (sameValue(next, lastReported)) return;\n lastReported = next;\n if (commit) commitFieldValue(props, next);\n else props.onValueChange?.(next);\n };\n\n let stroke: { pointerId: number; pointerType: string; points: SignaturePoint[]; time: number } | null = null;\n /** Drops the stroke in progress without keeping its ink. */\n const abortStroke = () => {\n if (!stroke) return;\n const { pointerId } = stroke;\n stroke = null;\n setLive(\"\");\n if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);\n };\n /** After Clear or the last Undo, keyboard focus moves from the now disabled button to the pad instead of the page. */\n const keepFocus = (button: HTMLElement) => {\n if (button.matches(\":focus-visible\")) queueMicrotask(() => svg?.focus());\n };\n\n // A value the parent sets (a stored signature, another record, a reset to null) replaces both inputs, so nothing of an\n // earlier signer stays behind the mode switch. Our own reports echo back unchanged.\n createEffect(\n on(\n value,\n (next) => {\n if (next === lastReported || sameValue(next, lastReported)) return;\n lastReported = next;\n abortStroke();\n setDrawing(drawingOf(next));\n setTypedName(next?.kind === \"typed\" ? next.name : \"\");\n if (next) setMode(next.kind === \"typed\" ? \"type\" : \"draw\");\n },\n { defer: true },\n ),\n );\n // A field that turns disabled or read-only, or leaves drawing, ends the stroke in progress without a value.\n createEffect(() => {\n if (!editable() || mode() !== \"draw\") abortStroke();\n });\n\n const switchMode = (next: SignatureMode) => {\n if (!editable() || next === mode()) return;\n setMode(next);\n report(next === \"draw\" ? drawnValue() : typedValue(), true);\n };\n const undo = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n setDrawing((current) => ({ ...current, strokes: current.strokes.slice(0, -1) }));\n if (drawing().strokes.length === 0) keepFocus(event.currentTarget);\n report(drawnValue(), true);\n };\n const clear = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n abortStroke();\n // Clear starts over in both modes. Without the Type option, a typed value it removes gives way to drawing.\n setTypedName(\"\");\n setDrawing((current) => ({ ...current, strokes: [] }));\n if (mode() === \"type\" && allowTyped()) {\n nameInput?.focus();\n } else {\n setMode(\"draw\");\n keepFocus(event.currentTarget);\n }\n report(null, true);\n };\n\n const toPoint = (event: PointerEvent): { x: number; y: number } | null => {\n const matrix = svg?.getScreenCTM();\n if (!matrix) return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n };\n const addPoint = (event: PointerEvent, force = false) => {\n if (!stroke) return;\n const position = toPoint(event);\n if (!position) return;\n const previous = stroke.points[stroke.points.length - 1];\n const distance = previous ? Math.hypot(position.x - previous.x, position.y - previous.y) : 0;\n if (previous && distance < MIN_POINT_DISTANCE && !force) return;\n let pressure: number;\n if (event.pointerType === \"pen\" && event.pressure > 0) {\n pressure = event.pressure;\n } else {\n // Without real pressure, faster movement draws a thinner line, as ink does.\n const elapsed = Math.max(1, event.timeStamp - stroke.time);\n const target = Math.min(1, Math.max(0.3, 1.1 - (distance / elapsed) * 0.3));\n pressure = previous ? previous.pressure * 0.6 + target * 0.4 : 0.6;\n }\n stroke.time = event.timeStamp;\n stroke.points.push({ ...position, pressure });\n setLive(strokeOutline(stroke.points, STROKE_SIZE));\n };\n /**\n * The drawing space after a stroke. It stays as it is while the ink lies inside it. Ink beyond it, drawn after the\n * pad changed its shape (a rotated phone, a resized window, a drawing from another device), grows the space to the\n * whole visible pad: the stored SVG then holds everything the signer saw, and the ink on the pad does not move.\n */\n const spaceAfter = (points: readonly SignaturePoint[]): Omit<SignatureDrawing, \"strokes\"> => {\n const { strokes: _, ...space } = drawing();\n const matrix = svg?.getScreenCTM();\n if (!svg || !matrix) return space;\n const box = svg.getBoundingClientRect();\n const inverse = matrix.inverse();\n const start = new DOMPoint(box.left, box.top).matrixTransform(inverse);\n const end = new DOMPoint(box.right, box.bottom).matrixTransform(inverse);\n // Ink reaches half the widest stroke past its points; what lies outside the pad was never visible and does not count.\n const reach = STROKE_SIZE / 2;\n let left = end.x;\n let top = end.y;\n let right = start.x;\n let bottom = start.y;\n for (const point of points) {\n left = Math.min(left, Math.max(start.x, point.x - reach));\n top = Math.min(top, Math.max(start.y, point.y - reach));\n right = Math.max(right, Math.min(end.x, point.x + reach));\n bottom = Math.max(bottom, Math.min(end.y, point.y + reach));\n }\n if (left >= space.x && top >= space.y && right <= space.x + space.width && bottom <= space.y + space.height) return space;\n const x = Math.min(space.x, start.x);\n const y = Math.min(space.y, start.y);\n return {\n x,\n y,\n width: Math.max(space.x + space.width, end.x) - x,\n height: Math.max(space.y + space.height, end.y) - y,\n };\n };\n const startStroke = (event: PointerEvent) => {\n // Only the primary contact draws: not a mouse's other buttons, a pen's barrel button, or its eraser.\n if (!editable() || !svg || event.button !== 0) return;\n // A pen takes over from a touch that is still down, such as a palm resting on a tablet.\n if (stroke?.pointerType === \"touch\" && event.pointerType === \"pen\") abortStroke();\n if (stroke) return;\n event.preventDefault();\n try {\n // Capture keeps the stroke when the pointer leaves the pad; a pointer that already ended cannot be captured.\n svg.setPointerCapture(event.pointerId);\n } catch {}\n if (drawing().strokes.length === 0) {\n // An empty pad adopts its current size, so one drawing unit is one CSS pixel while drawing.\n const box = svg.getBoundingClientRect();\n setDrawing({ x: 0, y: 0, width: Math.max(1, box.width), height: Math.max(1, box.height), strokes: [] });\n }\n stroke = { pointerId: event.pointerId, pointerType: event.pointerType, points: [], time: event.timeStamp };\n addPoint(event, true);\n };\n const moveStroke = (event: PointerEvent) => {\n if (stroke?.pointerId !== event.pointerId) return;\n event.preventDefault();\n const events = event.getCoalescedEvents?.() ?? [];\n for (const sample of events.length > 0 ? events : [event]) addPoint(sample);\n };\n const endStroke = (event: PointerEvent) => {\n if (!stroke || stroke.pointerId !== event.pointerId) return;\n addPoint(event, false);\n const { points } = stroke;\n const outline = strokeOutline(points, STROKE_SIZE);\n stroke = null;\n setLive(\"\");\n if (!outline) return;\n const space = spaceAfter(points);\n setDrawing((current) => ({ ...space, strokes: [...current.strokes, outline] }));\n report(drawnValue(), true);\n };\n // A cancelled pointer (an OS gesture, palm rejection) or lost capture is not a finished stroke.\n const cancelStroke = (event: PointerEvent) => {\n if (stroke?.pointerId === event.pointerId) abortStroke();\n };\n\n const empty = () => (mode() === \"draw\" ? drawing().strokes.length === 0 && !live() : !signatureName(typedName()));\n const serialized = () => {\n const current = value();\n return current ? JSON.stringify(current) : \"\";\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n id={meta.controlId}\n class=\"k2b-signature-input\"\n role=\"group\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={[props.required ? requiredId : undefined, fieldDescribedBy(meta, props)].filter(Boolean).join(\" \") || undefined}\n aria-invalid={error() ? \"true\" : undefined}\n data-mode={mode()}\n data-empty={empty() ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-readonly={props.readOnly ? \"true\" : undefined}\n >\n {/* A group cannot be marked required, so the required state is part of its description. */}\n <Show when={props.required}>\n <span id={requiredId} hidden>\n {messages().required}\n </span>\n </Show>\n <div class=\"k2b-signature-input__toolbar\">\n <Show when={allowTyped()}>\n <SegmentedControl\n class=\"k2b-signature-input__modes\"\n size=\"sm\"\n ariaLabel={text().method}\n options={[\n { value: \"draw\", label: text().draw, icon: \"ti ti-signature\" },\n { value: \"type\", label: text().type, icon: \"ti ti-keyboard\" },\n ]}\n value={mode}\n onValueChange={switchMode}\n disabled={!editable()}\n />\n </Show>\n <div class=\"k2b-signature-input__actions\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n label={text().undo}\n data-hidden={mode() === \"type\" ? \"true\" : undefined}\n disabled={!editable() || mode() !== \"draw\" || drawing().strokes.length === 0}\n onClick={undo}\n >\n <i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton size=\"sm\" variant=\"ghost\" label={messages().clear} disabled={!editable() || empty()} onClick={clear}>\n <i class=\"ti ti-eraser\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <div class=\"k2b-signature-input__pad\">\n <span class=\"k2b-signature-input__line\" aria-hidden=\"true\" />\n <Show\n when={mode() === \"draw\"}\n fallback={\n <input\n ref={nameInput}\n class=\"k2b-signature-input__name\"\n type=\"text\"\n value={typedName()}\n placeholder={text().typeName}\n aria-label={text().typeName}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={error() ? \"true\" : undefined}\n aria-required={props.required || undefined}\n autocomplete=\"name\"\n autocapitalize=\"words\"\n spellcheck={false}\n disabled={props.disabled}\n readOnly={props.readOnly || !allowTyped()}\n onInput={(event) => {\n setTypedName(event.currentTarget.value);\n report(typedValue(), false);\n }}\n onChange={() => props.onValueCommit?.(typedValue())}\n />\n }\n >\n <span class=\"k2b-signature-input__placeholder\" aria-hidden=\"true\">\n <i class=\"ti ti-writing-sign\" aria-hidden=\"true\" />\n {text().signHere}\n </span>\n <svg\n ref={svg}\n class=\"k2b-signature-input__canvas\"\n role=\"img\"\n tabindex=\"-1\"\n aria-label={drawing().strokes.length > 0 ? text().drawn : text().drawArea}\n viewBox={`${drawing().x} ${drawing().y} ${drawing().width} ${drawing().height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={startStroke}\n onPointerMove={moveStroke}\n onPointerUp={endStroke}\n onPointerCancel={cancelStroke}\n onLostPointerCapture={(event) => {\n // A child path that held a touch's implicit capture hands it to the pad; only the pad's own loss counts.\n if (event.target === event.currentTarget) cancelStroke(event);\n }}\n >\n <g fill=\"currentColor\">\n <For each={drawing().strokes}>{(outline) => <path d={outline} />}</For>\n <Show when={live()}>\n <path d={live()} />\n </Show>\n </g>\n </svg>\n </Show>\n </div>\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={serialized()} />}</Show>\n </Field>\n );\n}\n\nexport default SignatureInput;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/SignatureInput.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, on, Show, untrack } from \"solid-js\";\nimport { IconButton } from \"../actions/Button\";\nimport { SegmentedControl } from \"../actions/SegmentedControl\";\nimport { createFieldMeta, Field, fieldDescribedBy } from \"../internal/field\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport {\n drawingToSvg,\n type SignatureDrawing,\n type SignaturePoint,\n type SignatureValue,\n signatureName,\n strokeOutline,\n svgToDrawing,\n typedToSvg,\n} from \"./signature\";\nimport { useSignatureMessages } from \"./signature-messages\";\n\nexport type SignatureInputProps = ValueFieldProps<SignatureValue | null> & {\n /** Submits the value as JSON in a hidden input of this name. */\n name?: string;\n /** Shows the signature without allowing changes. */\n readOnly?: boolean;\n /**\n * Offers typing the name instead of drawing. Defaults to `true`: typing is the\n * keyboard and screen-reader path and helps people who cannot draw. Without\n * it, a typed value is still shown and can be cleared, but not edited.\n */\n allowTyped?: boolean;\n};\n\ntype SignatureMode = \"draw\" | \"type\";\n\n/** Base stroke width in drawing units (CSS pixels at the time of drawing). */\nconst STROKE_SIZE = 3.2;\n/** Points closer than this to the previous one add no shape, only path length. */\nconst MIN_POINT_DISTANCE = 1.2;\nconst EMPTY_SPACE = { x: 0, y: 0, width: 600, height: 200 };\n\nconst sameValue = (left: SignatureValue | null, right: SignatureValue | null) =>\n left === right ||\n (left !== null &&\n right !== null &&\n left.kind === right.kind &&\n left.svg === right.svg &&\n (left.kind === \"typed\" && right.kind === \"typed\" ? left.name === right.name : true));\n\nconst drawingOf = (value: SignatureValue | null): SignatureDrawing =>\n (value?.kind === \"drawn\" ? svgToDrawing(value.svg) : null) ?? { ...EMPTY_SPACE, strokes: [] };\n\nlet measureContext: CanvasRenderingContext2D | null | undefined;\nconst measureText = (text: string, font: string): number | undefined => {\n measureContext ??= document.createElement(\"canvas\").getContext(\"2d\");\n if (!measureContext) return undefined;\n measureContext.font = font;\n return measureContext.measureText(text).width;\n};\n\n/**\n * A signature field: draw with a finger, pen, or mouse, or type the name. The\n * value is an SVG document plus how it was given; `signatureToPng` turns it\n * into a bitmap. Legal evidence such as timestamps or hashes stays with the app.\n */\nexport function SignatureInput(props: SignatureInputProps): JSX.Element {\n const messages = useUiMessages();\n const text = useSignatureMessages();\n const meta = createFieldMeta(props.id);\n const requiredId = `${meta.controlId}-required`;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const allowTyped = () => props.allowTyped !== false;\n const editable = () => !props.disabled && !props.readOnly;\n\n const initial = untrack(value);\n const [mode, setMode] = createSignal<SignatureMode>(initial?.kind === \"typed\" ? \"type\" : \"draw\");\n const [drawing, setDrawing] = createSignal<SignatureDrawing>(drawingOf(initial));\n const [typedName, setTypedName] = createSignal(initial?.kind === \"typed\" ? initial.name : \"\");\n const [live, setLive] = createSignal(\"\");\n let svg: SVGSVGElement | undefined;\n let nameInput: HTMLInputElement | undefined;\n let lastReported: SignatureValue | null = initial;\n\n const drawnValue = (): SignatureValue | null => {\n const markup = drawingToSvg(drawing());\n return markup ? { kind: \"drawn\", svg: markup } : null;\n };\n const typedValue = (): SignatureValue | null => {\n const name = signatureName(typedName());\n if (!name) return null;\n const family = nameInput ? getComputedStyle(nameInput).fontFamily : \"cursive\";\n return { kind: \"typed\", name, svg: typedToSvg(name, family, measureText) };\n };\n const report = (next: SignatureValue | null, commit: boolean) => {\n if (sameValue(next, lastReported)) return;\n lastReported = next;\n if (commit) commitFieldValue(props, next);\n else props.onValueChange?.(next);\n };\n\n let stroke: {\n pointerId: number;\n pointerType: string;\n points: SignaturePoint[];\n time: number;\n releaseTextSelection: () => void;\n } | null = null;\n /** Drops the stroke in progress without keeping its ink. */\n const abortStroke = () => {\n if (!stroke) return;\n const { pointerId, releaseTextSelection } = stroke;\n stroke = null;\n releaseTextSelection();\n setLive(\"\");\n if (svg?.hasPointerCapture(pointerId)) svg.releasePointerCapture(pointerId);\n };\n /** After Clear or the last Undo, keyboard focus moves from the now disabled button to the pad instead of the page. */\n const keepFocus = (button: HTMLElement) => {\n if (button.matches(\":focus-visible\")) queueMicrotask(() => svg?.focus());\n };\n\n // A value the parent sets (a stored signature, another record, a reset to null) replaces both inputs, so nothing of an\n // earlier signer stays behind the mode switch. Our own reports echo back unchanged.\n createEffect(\n on(\n value,\n (next) => {\n if (next === lastReported || sameValue(next, lastReported)) return;\n lastReported = next;\n abortStroke();\n setDrawing(drawingOf(next));\n setTypedName(next?.kind === \"typed\" ? next.name : \"\");\n if (next) setMode(next.kind === \"typed\" ? \"type\" : \"draw\");\n },\n { defer: true },\n ),\n );\n // A field that turns disabled or read-only, or leaves drawing, ends the stroke in progress without a value.\n createEffect(() => {\n if (!editable() || mode() !== \"draw\") abortStroke();\n });\n\n const switchMode = (next: SignatureMode) => {\n if (!editable() || next === mode()) return;\n setMode(next);\n report(next === \"draw\" ? drawnValue() : typedValue(), true);\n };\n const undo = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n setDrawing((current) => ({ ...current, strokes: current.strokes.slice(0, -1) }));\n if (drawing().strokes.length === 0) keepFocus(event.currentTarget);\n report(drawnValue(), true);\n };\n const clear = (event: MouseEvent & { currentTarget: HTMLButtonElement }) => {\n if (!editable()) return;\n abortStroke();\n // Clear starts over in both modes. Without the Type option, a typed value it removes gives way to drawing.\n setTypedName(\"\");\n setDrawing((current) => ({ ...current, strokes: [] }));\n if (mode() === \"type\" && allowTyped()) {\n nameInput?.focus();\n } else {\n setMode(\"draw\");\n keepFocus(event.currentTarget);\n }\n report(null, true);\n };\n\n const toPoint = (event: PointerEvent): { x: number; y: number } | null => {\n const matrix = svg?.getScreenCTM();\n if (!matrix) return null;\n const point = new DOMPoint(event.clientX, event.clientY).matrixTransform(matrix.inverse());\n return { x: point.x, y: point.y };\n };\n const addPoint = (event: PointerEvent, force = false) => {\n if (!stroke) return;\n const position = toPoint(event);\n if (!position) return;\n const previous = stroke.points[stroke.points.length - 1];\n const distance = previous ? Math.hypot(position.x - previous.x, position.y - previous.y) : 0;\n if (previous && distance < MIN_POINT_DISTANCE && !force) return;\n let pressure: number;\n if (event.pointerType === \"pen\" && event.pressure > 0) {\n pressure = event.pressure;\n } else {\n // Without real pressure, faster movement draws a thinner line, as ink does.\n const elapsed = Math.max(1, event.timeStamp - stroke.time);\n const target = Math.min(1, Math.max(0.3, 1.1 - (distance / elapsed) * 0.3));\n pressure = previous ? previous.pressure * 0.6 + target * 0.4 : 0.6;\n }\n stroke.time = event.timeStamp;\n stroke.points.push({ ...position, pressure });\n setLive(strokeOutline(stroke.points, STROKE_SIZE));\n };\n /**\n * The drawing space after a stroke. It stays as it is while the ink lies inside it. Ink beyond it, drawn after the\n * pad changed its shape (a rotated phone, a resized window, a drawing from another device), grows the space to the\n * whole visible pad: the stored SVG then holds everything the signer saw, and the ink on the pad does not move.\n */\n const spaceAfter = (points: readonly SignaturePoint[]): Omit<SignatureDrawing, \"strokes\"> => {\n const { strokes: _, ...space } = drawing();\n const matrix = svg?.getScreenCTM();\n if (!svg || !matrix) return space;\n const box = svg.getBoundingClientRect();\n const inverse = matrix.inverse();\n const start = new DOMPoint(box.left, box.top).matrixTransform(inverse);\n const end = new DOMPoint(box.right, box.bottom).matrixTransform(inverse);\n // Ink reaches half the widest stroke past its points; what lies outside the pad was never visible and does not count.\n const reach = STROKE_SIZE / 2;\n let left = end.x;\n let top = end.y;\n let right = start.x;\n let bottom = start.y;\n for (const point of points) {\n left = Math.min(left, Math.max(start.x, point.x - reach));\n top = Math.min(top, Math.max(start.y, point.y - reach));\n right = Math.max(right, Math.min(end.x, point.x + reach));\n bottom = Math.max(bottom, Math.min(end.y, point.y + reach));\n }\n if (left >= space.x && top >= space.y && right <= space.x + space.width && bottom <= space.y + space.height) return space;\n const x = Math.min(space.x, start.x);\n const y = Math.min(space.y, start.y);\n return {\n x,\n y,\n width: Math.max(space.x + space.width, end.x) - x,\n height: Math.max(space.y + space.height, end.y) - y,\n };\n };\n const startStroke = (event: PointerEvent) => {\n // Only the primary contact draws: not a mouse's other buttons, a pen's barrel button, or its eraser.\n if (!editable() || !svg || event.button !== 0) return;\n // A pen takes over from a touch that is still down, such as a palm resting on a tablet.\n if (stroke?.pointerType === \"touch\" && event.pointerType === \"pen\") abortStroke();\n if (stroke) return;\n event.preventDefault();\n try {\n // Capture keeps the stroke when the pointer leaves the pad; a pointer that already ended cannot be captured.\n svg.setPointerCapture(event.pointerId);\n } catch {}\n if (drawing().strokes.length === 0) {\n // An empty pad adopts its current size, so one drawing unit is one CSS pixel while drawing.\n const box = svg.getBoundingClientRect();\n setDrawing({ x: 0, y: 0, width: Math.max(1, box.width), height: Math.max(1, box.height), strokes: [] });\n }\n stroke = {\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n points: [],\n time: event.timeStamp,\n releaseTextSelection: suppressTextSelection(event.pointerId),\n };\n addPoint(event, true);\n };\n const moveStroke = (event: PointerEvent) => {\n if (stroke?.pointerId !== event.pointerId) return;\n event.preventDefault();\n const events = event.getCoalescedEvents?.() ?? [];\n for (const sample of events.length > 0 ? events : [event]) addPoint(sample);\n };\n const endStroke = (event: PointerEvent) => {\n if (!stroke || stroke.pointerId !== event.pointerId) return;\n addPoint(event, false);\n const { points, releaseTextSelection } = stroke;\n const outline = strokeOutline(points, STROKE_SIZE);\n stroke = null;\n releaseTextSelection();\n setLive(\"\");\n if (!outline) return;\n const space = spaceAfter(points);\n setDrawing((current) => ({ ...space, strokes: [...current.strokes, outline] }));\n report(drawnValue(), true);\n };\n // A cancelled pointer (an OS gesture, palm rejection) or lost capture is not a finished stroke.\n const cancelStroke = (event: PointerEvent) => {\n if (stroke?.pointerId === event.pointerId) abortStroke();\n };\n\n const empty = () => (mode() === \"draw\" ? drawing().strokes.length === 0 && !live() : !signatureName(typedName()));\n const serialized = () => {\n const current = value();\n return current ? JSON.stringify(current) : \"\";\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n labelFor={false}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n id={meta.controlId}\n class=\"k2b-signature-input\"\n role=\"group\"\n aria-label={props.label ? undefined : props[\"aria-label\"]}\n aria-labelledby={props.label ? meta.labelId : undefined}\n aria-describedby={[props.required ? requiredId : undefined, fieldDescribedBy(meta, props)].filter(Boolean).join(\" \") || undefined}\n aria-invalid={error() ? \"true\" : undefined}\n data-mode={mode()}\n data-empty={empty() ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-readonly={props.readOnly ? \"true\" : undefined}\n >\n {/* A group cannot be marked required, so the required state is part of its description. */}\n <Show when={props.required}>\n <span id={requiredId} hidden>\n {messages().required}\n </span>\n </Show>\n <div class=\"k2b-signature-input__toolbar\">\n <Show when={allowTyped()}>\n <SegmentedControl\n class=\"k2b-signature-input__modes\"\n size=\"sm\"\n ariaLabel={text().method}\n options={[\n { value: \"draw\", label: text().draw, icon: \"ti ti-signature\" },\n { value: \"type\", label: text().type, icon: \"ti ti-keyboard\" },\n ]}\n value={mode}\n onValueChange={switchMode}\n disabled={!editable()}\n />\n </Show>\n <div class=\"k2b-signature-input__actions\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n label={text().undo}\n data-hidden={mode() === \"type\" ? \"true\" : undefined}\n disabled={!editable() || mode() !== \"draw\" || drawing().strokes.length === 0}\n onClick={undo}\n >\n <i class=\"ti ti-arrow-back-up\" aria-hidden=\"true\" />\n </IconButton>\n <IconButton size=\"sm\" variant=\"ghost\" label={messages().clear} disabled={!editable() || empty()} onClick={clear}>\n <i class=\"ti ti-eraser\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n </div>\n <div class=\"k2b-signature-input__pad\">\n <span class=\"k2b-signature-input__line\" aria-hidden=\"true\" />\n <Show\n when={mode() === \"draw\"}\n fallback={\n <input\n ref={nameInput}\n class=\"k2b-signature-input__name\"\n type=\"text\"\n value={typedName()}\n placeholder={text().typeName}\n aria-label={text().typeName}\n aria-describedby={fieldDescribedBy(meta, props)}\n aria-invalid={error() ? \"true\" : undefined}\n aria-required={props.required || undefined}\n autocomplete=\"name\"\n autocapitalize=\"words\"\n spellcheck={false}\n disabled={props.disabled}\n readOnly={props.readOnly || !allowTyped()}\n onInput={(event) => {\n setTypedName(event.currentTarget.value);\n report(typedValue(), false);\n }}\n onChange={() => props.onValueCommit?.(typedValue())}\n />\n }\n >\n <span class=\"k2b-signature-input__placeholder\" aria-hidden=\"true\">\n <i class=\"ti ti-writing-sign\" aria-hidden=\"true\" />\n {text().signHere}\n </span>\n <svg\n ref={svg}\n class=\"k2b-signature-input__canvas\"\n role=\"img\"\n tabindex=\"-1\"\n aria-label={drawing().strokes.length > 0 ? text().drawn : text().drawArea}\n viewBox={`${drawing().x} ${drawing().y} ${drawing().width} ${drawing().height}`}\n preserveAspectRatio=\"xMidYMid meet\"\n onPointerDown={startStroke}\n onPointerMove={moveStroke}\n onPointerUp={endStroke}\n onPointerCancel={cancelStroke}\n onLostPointerCapture={(event) => {\n // A child path that held a touch's implicit capture hands it to the pad; only the pad's own loss counts.\n if (event.target === event.currentTarget) cancelStroke(event);\n }}\n >\n <g fill=\"currentColor\">\n <For each={drawing().strokes}>{(outline) => <path d={outline} />}</For>\n <Show when={live()}>\n <path d={live()} />\n </Show>\n </g>\n </svg>\n </Show>\n </div>\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={serialized()} />}</Show>\n </Field>\n );\n}\n\nexport default SignatureInput;\n"],"mappings":"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","ignoreList":[]}
|