@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
|
@@ -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":[]}
|
|
@@ -4,10 +4,12 @@ import { fuzzy } from "@k2b/stdlib";
|
|
|
4
4
|
import { createMemo } from "solid-js";
|
|
5
5
|
import { useUiMessages } from "../intl/messages";
|
|
6
6
|
import { resolveMaybeAccessor } from "./field-contract";
|
|
7
|
+
import { useIconMessages } from "./icon-messages";
|
|
7
8
|
import { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from "./icon-options";
|
|
8
9
|
import { Select } from "./Select";
|
|
9
10
|
export function IconInput(props) {
|
|
10
11
|
const messages = useUiMessages();
|
|
12
|
+
const iconMessages = useIconMessages();
|
|
11
13
|
const options = () => props.options ?? DEFAULT_ICON_OPTIONS;
|
|
12
14
|
const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);
|
|
13
15
|
const filterOptions = (source, query) => {
|
|
@@ -57,7 +59,7 @@ export function IconInput(props) {
|
|
|
57
59
|
return props["aria-describedby"];
|
|
58
60
|
},
|
|
59
61
|
get placeholder() {
|
|
60
|
-
return props.placeholder ??
|
|
62
|
+
return props.placeholder ?? iconMessages().pickIcon;
|
|
61
63
|
},
|
|
62
64
|
get disabled() {
|
|
63
65
|
return props.disabled;
|
|
@@ -90,7 +92,7 @@ export function IconInput(props) {
|
|
|
90
92
|
return props.defaultGroup ?? (props.options === undefined ? "recommended" : undefined);
|
|
91
93
|
},
|
|
92
94
|
get groupsAriaLabel() {
|
|
93
|
-
return props.groupsAriaLabel ??
|
|
95
|
+
return props.groupsAriaLabel ?? iconMessages().filterIcons;
|
|
94
96
|
},
|
|
95
97
|
get allGroupLabel() {
|
|
96
98
|
return props.allGroupLabel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/SpecialInputs.tsx"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport { createMemo, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nimport { Select, type SelectGridSize, type SelectGroup, type SelectOption, type SelectView } from \"./Select\";\n\nexport type IconOption = SelectOption & { keywords?: readonly string[] };\nexport type IconInputProps = ValueFieldProps<string | null> & {\n options?: readonly IconOption[];\n placeholder?: string;\n clearable?: boolean;\n searchLimit?: number;\n groups?: readonly SelectGroup[];\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n viewToggle?: boolean;\n defaultView?: SelectView;\n gridSize?: SelectGridSize;\n name?: string;\n};\n\nexport function IconInput(props: IconInputProps): JSX.Element {\n const messages = useUiMessages();\n const options = () => props.options ?? DEFAULT_ICON_OPTIONS;\n const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);\n const filterOptions = (source: readonly SelectOption[], query: string): readonly SelectOption[] => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return [...source].sort((left, right) => String(left.label).localeCompare(String(right.label), undefined, { sensitivity: \"base\" }));\n }\n return fuzzy\n .filter(normalized, source, {\n // Cloud's key is `[label, ...keywords]`. Including `value` as well put\n // the literal \"ti ti-\" in front of every entry, so short queries matched\n // the whole catalogue and fuzzy scores were skewed. The bare glyph name\n // is already the first keyword (see `icon()` in ./icon-options), so\n // nothing is lost by dropping it.\n key: (option) => {\n const keywords = \"keywords\" in option && Array.isArray(option.keywords) ? option.keywords.join(\" \") : \"\";\n return `${String(option.label)} ${keywords}`.toLowerCase();\n },\n limit: props.searchLimit ?? 50,\n })\n .map((match) => match.item);\n };\n const selectedOption = createMemo(() => options().find((option) => option.value === resolveMaybeAccessor(props.value)));\n\n return (\n <Select\n id={props.id}\n name={props.name}\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n aria-label={props[\"aria-label\"]}\n aria-describedby={props[\"aria-describedby\"]}\n placeholder={props.placeholder ??
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/SpecialInputs.tsx"],"sourcesContent":["import { fuzzy } from \"@k2b/stdlib\";\nimport { createMemo, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useIconMessages } from \"./icon-messages\";\nimport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nimport { Select, type SelectGridSize, type SelectGroup, type SelectOption, type SelectView } from \"./Select\";\n\nexport type IconOption = SelectOption & { keywords?: readonly string[] };\nexport type IconInputProps = ValueFieldProps<string | null> & {\n options?: readonly IconOption[];\n placeholder?: string;\n clearable?: boolean;\n searchLimit?: number;\n groups?: readonly SelectGroup[];\n defaultGroup?: string;\n groupsAriaLabel?: string;\n allGroupLabel?: string;\n viewToggle?: boolean;\n defaultView?: SelectView;\n gridSize?: SelectGridSize;\n name?: string;\n};\n\nexport function IconInput(props: IconInputProps): JSX.Element {\n const messages = useUiMessages();\n const iconMessages = useIconMessages();\n const options = () => props.options ?? DEFAULT_ICON_OPTIONS;\n const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);\n const filterOptions = (source: readonly SelectOption[], query: string): readonly SelectOption[] => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return [...source].sort((left, right) => String(left.label).localeCompare(String(right.label), undefined, { sensitivity: \"base\" }));\n }\n return fuzzy\n .filter(normalized, source, {\n // Cloud's key is `[label, ...keywords]`. Including `value` as well put\n // the literal \"ti ti-\" in front of every entry, so short queries matched\n // the whole catalogue and fuzzy scores were skewed. The bare glyph name\n // is already the first keyword (see `icon()` in ./icon-options), so\n // nothing is lost by dropping it.\n key: (option) => {\n const keywords = \"keywords\" in option && Array.isArray(option.keywords) ? option.keywords.join(\" \") : \"\";\n return `${String(option.label)} ${keywords}`.toLowerCase();\n },\n limit: props.searchLimit ?? 50,\n })\n .map((match) => match.item);\n };\n const selectedOption = createMemo(() => options().find((option) => option.value === resolveMaybeAccessor(props.value)));\n\n return (\n <Select\n id={props.id}\n name={props.name}\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n aria-label={props[\"aria-label\"]}\n aria-describedby={props[\"aria-describedby\"]}\n placeholder={props.placeholder ?? iconMessages().pickIcon}\n disabled={props.disabled}\n required={props.required}\n clearable={props.clearable ?? true}\n value={resolveMaybeAccessor(props.value)}\n selectedOption={selectedOption()}\n onValueChange={props.onValueChange}\n onValueCommit={props.onValueCommit}\n options={[...options()]}\n groups={groups()}\n defaultGroup={props.defaultGroup ?? (props.options === undefined ? \"recommended\" : undefined)}\n groupsAriaLabel={props.groupsAriaLabel ?? iconMessages().filterIcons}\n allGroupLabel={props.allGroupLabel}\n viewToggle={props.viewToggle ?? true}\n defaultView={props.defaultView ?? \"grid\"}\n gridSize={props.gridSize ?? \"sm\"}\n searchable\n filterOptions={filterOptions}\n searchPlaceholder={messages().search}\n icon={selectedOption()?.icon ?? \"ti ti-icons\"}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,6 +23,7 @@ import { useUiMessages } from "../intl/messages";
|
|
|
23
23
|
import { Tag } from "../surfaces/Tag";
|
|
24
24
|
import { ColorInput } from "./ChoiceInputs";
|
|
25
25
|
import { TextInput } from "./TextInput";
|
|
26
|
+
import { useTagMessages } from "./tag-messages";
|
|
26
27
|
function EditorForm(props) {
|
|
27
28
|
const initialName = props.initial?.name ?? "";
|
|
28
29
|
const initialColor = props.initial?.color ?? props.defaultColor;
|
|
@@ -132,14 +133,15 @@ function EditorForm(props) {
|
|
|
132
133
|
/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */
|
|
133
134
|
export function TagEditor(props) {
|
|
134
135
|
const messages = useUiMessages();
|
|
136
|
+
const tagMessages = useTagMessages();
|
|
135
137
|
const [mode, setMode] = createSignal(null);
|
|
136
138
|
const [busyId, setBusyId] = createSignal(null);
|
|
137
139
|
const [rowError, setRowError] = createSignal();
|
|
138
140
|
const labels = () => ({
|
|
139
|
-
create:
|
|
140
|
-
empty:
|
|
141
|
+
create: tagMessages().addTag,
|
|
142
|
+
empty: tagMessages().noTagsYet,
|
|
141
143
|
name: messages().name,
|
|
142
|
-
namePlaceholder:
|
|
144
|
+
namePlaceholder: tagMessages().tagName,
|
|
143
145
|
color: messages().color,
|
|
144
146
|
save: messages().save,
|
|
145
147
|
cancel: messages().cancel,
|
|
@@ -158,7 +160,7 @@ export function TagEditor(props) {
|
|
|
158
160
|
} catch (cause) {
|
|
159
161
|
setRowError({
|
|
160
162
|
id,
|
|
161
|
-
message: cause instanceof Error ? cause.message :
|
|
163
|
+
message: cause instanceof Error ? cause.message : tagMessages().tagActionFailed
|
|
162
164
|
});
|
|
163
165
|
throw cause;
|
|
164
166
|
} finally {
|
|
@@ -271,7 +273,7 @@ export function TagEditor(props) {
|
|
|
271
273
|
return busyId() === item.id;
|
|
272
274
|
},
|
|
273
275
|
get saveError() {
|
|
274
|
-
return
|
|
276
|
+
return tagMessages().tagCouldNotBeSaved;
|
|
275
277
|
},
|
|
276
278
|
onCancel: () => setMode(null),
|
|
277
279
|
get onDirtyChange() {
|
|
@@ -330,7 +332,7 @@ export function TagEditor(props) {
|
|
|
330
332
|
return busyId() === "create";
|
|
331
333
|
},
|
|
332
334
|
get saveError() {
|
|
333
|
-
return
|
|
335
|
+
return tagMessages().tagCouldNotBeSaved;
|
|
334
336
|
},
|
|
335
337
|
onCancel: () => setMode(null),
|
|
336
338
|
get onDirtyChange() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: messages().addTag,\n empty: messages().noTagsYet,\n name: messages().name,\n namePlaceholder: messages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : messages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={messages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/TagEditor.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button, IconButton } from \"../actions/Button\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Tag } from \"../surfaces/Tag\";\nimport { ColorInput } from \"./ChoiceInputs\";\nimport { TextInput } from \"./TextInput\";\nimport { useTagMessages } from \"./tag-messages\";\n\nexport type TagEditorItem = {\n id: string;\n name: string;\n color?: string | null;\n};\n\nexport type TagEditorValue = {\n name: string;\n color: string;\n};\n\nexport type TagEditorLabels = {\n create: string;\n empty: string;\n name: string;\n namePlaceholder: string;\n color: string;\n save: string;\n cancel: string;\n edit: string;\n remove: string;\n};\n\nexport type TagEditorProps<T extends TagEditorItem = TagEditorItem> = {\n items: readonly T[];\n onCreate?: (value: TagEditorValue) => void | Promise<void>;\n onUpdate?: (item: T, value: TagEditorValue) => void | Promise<void>;\n onDelete?: (item: T) => void | Promise<void>;\n labels?: Partial<TagEditorLabels>;\n defaultColor?: string;\n disabled?: boolean;\n onDirtyChange?: (dirty: boolean) => void;\n class?: string;\n};\n\ntype EditorFormProps = {\n initial?: TagEditorItem;\n labels: TagEditorLabels;\n defaultColor: string;\n busy: boolean;\n saveError: string;\n onCancel: () => void;\n onDirtyChange?: (dirty: boolean) => void;\n onSave: (value: TagEditorValue) => Promise<void>;\n};\n\nfunction EditorForm(props: EditorFormProps): JSX.Element {\n const initialName = props.initial?.name ?? \"\";\n const initialColor = props.initial?.color ?? props.defaultColor;\n const [name, setName] = createSignal(initialName);\n const [color, setColor] = createSignal(initialColor);\n const [error, setError] = createSignal<string>();\n\n createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));\n onCleanup(() => props.onDirtyChange?.(false));\n\n const submit = async (event: SubmitEvent) => {\n event.preventDefault();\n const normalized = name().trim();\n if (!normalized || props.busy) return;\n setError(undefined);\n try {\n await props.onSave({ name: normalized, color: color() });\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : props.saveError);\n }\n };\n\n return (\n <form class=\"k2b-tag-editor__form\" aria-busy={props.busy ? \"true\" : undefined} onSubmit={submit}>\n <div class=\"k2b-tag-editor__fields\">\n <TextInput\n label={props.labels.name}\n placeholder={props.labels.namePlaceholder}\n value={name}\n onValueChange={setName}\n disabled={props.busy}\n required\n autofocus\n />\n <ColorInput\n aria-label={props.labels.color}\n value={color}\n onValueChange={setColor}\n onValueCommit={setColor}\n disabled={props.busy}\n compact\n />\n </div>\n <Show when={error()}>\n {(message) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {message()}\n </p>\n )}\n </Show>\n <div class=\"k2b-tag-editor__form-actions\">\n <Button type=\"submit\" size=\"sm\" loading={props.busy} disabled={!name().trim()}>\n {props.labels.save}\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={props.busy} onClick={props.onCancel}>\n {props.labels.cancel}\n </Button>\n </div>\n </form>\n );\n}\n\n/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */\nexport function TagEditor<T extends TagEditorItem = TagEditorItem>(props: TagEditorProps<T>): JSX.Element {\n const messages = useUiMessages();\n const tagMessages = useTagMessages();\n const [mode, setMode] = createSignal<\"create\" | string | null>(null);\n const [busyId, setBusyId] = createSignal<string | null>(null);\n const [rowError, setRowError] = createSignal<{ id: string; message: string }>();\n const labels = (): TagEditorLabels => ({\n create: tagMessages().addTag,\n empty: tagMessages().noTagsYet,\n name: messages().name,\n namePlaceholder: tagMessages().tagName,\n color: messages().color,\n save: messages().save,\n cancel: messages().cancel,\n edit: messages().edit,\n remove: messages().delete,\n ...props.labels,\n });\n const defaultColor = () => props.defaultColor ?? \"#6b7280\";\n const run = async (id: string, action: () => void | Promise<void>) => {\n if (busyId()) return;\n setBusyId(id);\n setRowError(undefined);\n try {\n await action();\n setMode(null);\n } catch (cause) {\n setRowError({ id, message: cause instanceof Error ? cause.message : tagMessages().tagActionFailed });\n throw cause;\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div class={`k2b-tag-editor ${props.class ?? \"\"}`} data-disabled={props.disabled ? \"true\" : undefined}>\n <Show when={props.items.length > 0} fallback={<p class=\"k2b-tag-editor__empty\">{labels().empty}</p>}>\n <ul class=\"k2b-tag-editor__list\">\n <For each={props.items}>\n {(item) => (\n <li class=\"k2b-tag-editor__row\">\n <Show\n when={mode() === item.id && props.onUpdate}\n fallback={\n <>\n <Tag color={item.color}>{item.name}</Tag>\n <span class=\"k2b-tag-editor__row-actions\">\n <Show when={props.onUpdate}>\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().edit} ${item.name}`}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => setMode(item.id)}\n >\n <i class=\"ti ti-pencil\" aria-hidden=\"true\" />\n </IconButton>\n </Show>\n <Show when={props.onDelete}>\n {(remove) => (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n label={`${labels().remove} ${item.name}`}\n loading={busyId() === item.id}\n disabled={props.disabled || Boolean(busyId())}\n onClick={() => void run(item.id, () => remove()(item)).catch(() => undefined)}\n >\n <i class=\"ti ti-trash\" aria-hidden=\"true\" />\n </IconButton>\n )}\n </Show>\n </span>\n </>\n }\n >\n <EditorForm\n initial={item}\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === item.id}\n saveError={tagMessages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(item.id, () => props.onUpdate?.(item, value))}\n />\n </Show>\n <Show when={rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined}>\n {(error) => (\n <p class=\"k2b-tag-editor__error\" role=\"alert\">\n {error().message}\n </p>\n )}\n </Show>\n </li>\n )}\n </For>\n </ul>\n </Show>\n\n <Show when={props.onCreate}>\n {(create) => (\n <Show\n when={mode() === \"create\"}\n fallback={\n <Button size=\"xs\" variant=\"subtle\" disabled={props.disabled || Boolean(busyId())} onClick={() => setMode(\"create\")}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n {labels().create}\n </Button>\n }\n >\n <EditorForm\n labels={labels()}\n defaultColor={defaultColor()}\n busy={busyId() === \"create\"}\n saveError={tagMessages().tagCouldNotBeSaved}\n onCancel={() => setMode(null)}\n onDirtyChange={props.onDirtyChange}\n onSave={(value) => run(\"create\", () => create()(value))}\n />\n </Show>\n )}\n </Show>\n </div>\n );\n}\n\nexport default TagEditor;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -19,14 +19,14 @@ var _tmpl$ = /*#__PURE__*/_$template(`<span class=k2b-tags-input__values aria-hi
|
|
|
19
19
|
_tmpl$6 = /*#__PURE__*/_$template(`<input type=hidden>`);
|
|
20
20
|
import { createEffect, createSignal, createUniqueId, Show } from "solid-js";
|
|
21
21
|
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
22
|
-
import { useUiMessages } from "../intl/messages";
|
|
23
22
|
import { resolveMaybeAccessor } from "./field-contract";
|
|
23
|
+
import { useTagMessages } from "./tag-messages";
|
|
24
24
|
export function TagsInput(props) {
|
|
25
|
-
const
|
|
25
|
+
const tagMessages = useTagMessages();
|
|
26
26
|
const meta = createFieldMeta(props.id);
|
|
27
27
|
const announcementId = `k2b-tags-${createUniqueId()}`;
|
|
28
28
|
const error = () => resolveMaybeAccessor(props.error);
|
|
29
|
-
const placeholder = () => props.placeholder ??
|
|
29
|
+
const placeholder = () => props.placeholder ?? tagMessages().tagsPlaceholder;
|
|
30
30
|
const [focused, setFocused] = createSignal(false);
|
|
31
31
|
let focusStartValue = [];
|
|
32
32
|
const normalize = text => text.replace(/\s+/g, " ").trim();
|
|
@@ -55,9 +55,9 @@ export function TagsInput(props) {
|
|
|
55
55
|
const removed = previous.filter(tag => !nextTags.has(tag));
|
|
56
56
|
const announcement = document.getElementById(announcementId);
|
|
57
57
|
if (announcement) {
|
|
58
|
-
announcement.textContent = [added.length ?
|
|
58
|
+
announcement.textContent = [added.length ? tagMessages().tagsAdded({
|
|
59
59
|
tags: added.join(", ")
|
|
60
|
-
}) : "", removed.length ?
|
|
60
|
+
}) : "", removed.length ? tagMessages().tagsRemoved({
|
|
61
61
|
tags: removed.join(", ")
|
|
62
62
|
}) : ""].filter(Boolean).join(" ");
|
|
63
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport {
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/TagsInput.tsx"],"sourcesContent":["import { createEffect, createSignal, createUniqueId, type JSX, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useTagMessages } from \"./tag-messages\";\n\nexport type TagsInputProps = ValueFieldProps<string[]> & {\n placeholder?: string;\n icon?: string;\n activeIcon?: string;\n maxTags?: number;\n name?: string;\n};\n\nexport function TagsInput(props: TagsInputProps): JSX.Element {\n const tagMessages = useTagMessages();\n const meta = createFieldMeta(props.id);\n const announcementId = `k2b-tags-${createUniqueId()}`;\n const error = () => resolveMaybeAccessor(props.error);\n const placeholder = () => props.placeholder ?? tagMessages().tagsPlaceholder;\n const [focused, setFocused] = createSignal(false);\n let focusStartValue: readonly string[] = [];\n const normalize = (text: string) => text.replace(/\\s+/g, \" \").trim();\n const parseTags = (text: string): string[] => {\n const tags: string[] = [];\n const seen = new Set<string>();\n const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));\n for (const rawTag of text.split(\",\")) {\n const tag = normalize(rawTag);\n if (!tag || seen.has(tag)) continue;\n if (tags.length >= limit) break;\n seen.add(tag);\n tags.push(tag);\n }\n return tags;\n };\n const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(\",\"));\n const [draft, setDraft] = createSignal(value().join(\", \"));\n createEffect(() => {\n if (!focused()) setDraft(value().join(\", \"));\n });\n\n const announce = (previous: readonly string[], next: readonly string[]) => {\n const previousTags = new Set(previous);\n const nextTags = new Set(next);\n const added = next.filter((tag) => !previousTags.has(tag));\n const removed = previous.filter((tag) => !nextTags.has(tag));\n const announcement = document.getElementById(announcementId);\n if (announcement) {\n announcement.textContent = [\n added.length ? tagMessages().tagsAdded({ tags: added.join(\", \") }) : \"\",\n removed.length ? tagMessages().tagsRemoved({ tags: removed.join(\", \") }) : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n }\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 class=\"k2b-tags-input\" data-invalid={error() ? \"true\" : undefined} data-disabled={props.disabled ? \"true\" : undefined}>\n <span class=\"k2b-tags-input__icon\" aria-hidden=\"true\">\n <i class={`${props.icon ?? \"ti ti-tag\"} k2b-tags-input__icon-idle`} />\n <i class={`${props.activeIcon ?? \"ti ti-pencil\"} k2b-tags-input__icon-active`} />\n </span>\n <Show when={!focused()}>\n <span class=\"k2b-tags-input__values\" aria-hidden=\"true\">\n <Show when={value().length > 0} fallback={<span class=\"k2b-tags-input__placeholder\">{placeholder()}</span>}>\n {value().map((tag) => (\n <span class=\"k2b-tag\">{tag}</span>\n ))}\n </Show>\n </span>\n </Show>\n <input\n id={meta.controlId}\n type=\"text\"\n {...fieldControlAria(meta, props)}\n disabled={props.disabled}\n placeholder={focused() || value().length === 0 ? placeholder() : undefined}\n value={draft()}\n onFocus={() => {\n if (props.disabled) return;\n focusStartValue = value();\n setDraft(focusStartValue.join(\", \"));\n setFocused(true);\n }}\n onInput={(event) => {\n if (props.disabled) return;\n const nextDraft = event.currentTarget.value;\n setDraft(nextDraft);\n props.onValueChange?.(parseTags(nextDraft));\n }}\n onBlur={() => {\n if (props.disabled) return;\n const next = parseTags(draft());\n announce(focusStartValue, next);\n props.onValueCommit?.(next);\n setFocused(false);\n }}\n onKeyDown={(event) => event.key === \"Enter\" && (event.preventDefault(), event.currentTarget.blur())}\n />\n </div>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value().join(\",\")} />}</Show>\n <div id={announcementId} class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" />\n </Field>\n );\n}\n\nexport default TagsInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,10 +10,10 @@ import { memo as _$memo } from "solid-js/web";
|
|
|
10
10
|
var _tmpl$ = /*#__PURE__*/_$template(`<section><iframe sandbox>`),
|
|
11
11
|
_tmpl$2 = /*#__PURE__*/_$template(`<section>`);
|
|
12
12
|
import { createMemo, For } from "solid-js";
|
|
13
|
-
import { useUiMessages } from "../intl/messages";
|
|
14
13
|
import { PANES_LAYOUT_VERSION } from "../layout/panes-layout";
|
|
15
14
|
import { AutocompleteEditor } from "./AutocompleteEditor";
|
|
16
15
|
import { TextInput } from "./TextInput";
|
|
16
|
+
import { useTemplateMessages } from "./template-messages";
|
|
17
17
|
export const createTemplateEditorPanesLayout = () => ({
|
|
18
18
|
version: PANES_LAYOUT_VERSION,
|
|
19
19
|
root: {
|
|
@@ -124,7 +124,7 @@ const highlightTemplate = text => {
|
|
|
124
124
|
return withTags.replace(/\uE000(\d+)\uE001/g, (_, index) => stashed[Number(index)] ?? "");
|
|
125
125
|
};
|
|
126
126
|
export function TemplateEditor(props) {
|
|
127
|
-
const
|
|
127
|
+
const templateMessages = useTemplateMessages();
|
|
128
128
|
const completions = createMemo(() => templateCompletions(props.variables));
|
|
129
129
|
return _$createComponent(AutocompleteEditor, _$mergeProps(props, {
|
|
130
130
|
get lines() {
|
|
@@ -134,7 +134,7 @@ export function TemplateEditor(props) {
|
|
|
134
134
|
return props.spellcheck ?? false;
|
|
135
135
|
},
|
|
136
136
|
get placeholder() {
|
|
137
|
-
return props.placeholder ??
|
|
137
|
+
return props.placeholder ?? templateMessages().templateEditorPlaceholder;
|
|
138
138
|
},
|
|
139
139
|
highlight: highlightTemplate,
|
|
140
140
|
get completions() {
|
|
@@ -143,14 +143,14 @@ export function TemplateEditor(props) {
|
|
|
143
143
|
}));
|
|
144
144
|
}
|
|
145
145
|
export function TemplatePreview(props) {
|
|
146
|
-
const
|
|
146
|
+
const templateMessages = useTemplateMessages();
|
|
147
147
|
return (() => {
|
|
148
148
|
var _el$ = _$getNextElement(_tmpl$),
|
|
149
149
|
_el$2 = _el$.firstChild;
|
|
150
150
|
_$effect(_p$ => {
|
|
151
151
|
var _v$ = `k2b-template-preview ${props.class ?? ""}`,
|
|
152
152
|
_v$2 = props.html,
|
|
153
|
-
_v$3 = props.title ??
|
|
153
|
+
_v$3 = props.title ?? templateMessages().templatePreview;
|
|
154
154
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
155
155
|
_v$2 !== _p$.t && _$setAttribute(_el$2, "srcdoc", _p$.t = _v$2);
|
|
156
156
|
_v$3 !== _p$.a && _$setAttribute(_el$2, "title", _p$.a = _v$3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(<\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(>)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)("[\\s\\S]*?"|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/<!--[\\s\\S]*?-->|<\\/?[a-zA-Z][\\s\\S]*?>/g, (tag) =>\n tag.startsWith(\"<!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const messages = useUiMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? messages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? messages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/TemplateEditor.tsx"],"sourcesContent":["import { createMemo, For, type JSX } from \"solid-js\";\nimport { PANES_LAYOUT_VERSION, type PanesLayout } from \"../layout/panes-layout\";\nimport { AutocompleteEditor, type AutocompleteEditorProps } from \"./AutocompleteEditor\";\nimport type { Completion, Suggestion } from \"./completion\";\nimport { TextInput } from \"./TextInput\";\nimport { useTemplateMessages } from \"./template-messages\";\n\nexport type TemplateVariableKind = \"string\" | \"email\" | \"url\" | \"number\" | \"boolean\" | \"array\" | \"object\";\n\nexport type TemplateVariable = {\n name: string;\n kind?: TemplateVariableKind;\n description?: string;\n};\n\nexport type TemplateEditorProps = Omit<AutocompleteEditorProps, \"completions\" | \"highlight\"> & {\n variables: readonly TemplateVariable[];\n};\n\nexport type TemplatePreviewProps = {\n html: string;\n title?: string;\n class?: string;\n};\n\nexport type TemplateSampleDataProps = {\n variables: readonly TemplateVariable[];\n values: Readonly<Record<string, string>>;\n onValueChange: (name: string, value: string) => void;\n class?: string;\n};\n\nexport type TemplateEditorLayout = PanesLayout;\n\nexport const createTemplateEditorPanesLayout = (): TemplateEditorLayout => ({\n version: PANES_LAYOUT_VERSION,\n root: {\n type: \"split\",\n direction: \"horizontal\",\n ratio: 0.5,\n first: { type: \"group\", items: [\"html\"], active: \"html\" },\n second: { type: \"group\", items: [\"preview\", \"sample-data\"], active: \"preview\" },\n },\n});\n\nconst HTML_TAGS = [\n { name: \"p\", snippet: \"<p></p>\", hint: \"paragraph\" },\n {\n name: \"a\",\n snippet: '<a href=\"{{ LOGIN_URL }}\">Link</a>',\n hint: \"link\",\n },\n { name: \"strong\", snippet: \"<strong></strong>\", hint: \"bold\" },\n { name: \"em\", snippet: \"<em></em>\", hint: \"emphasis\" },\n { name: \"br\", snippet: \"<br>\", hint: \"line break\" },\n { name: \"ul\", snippet: \"<ul>\\n <li></li>\\n</ul>\", hint: \"list\" },\n {\n name: \"table\",\n snippet: \"<table>\\n <tr><td></td></tr>\\n</table>\",\n hint: \"table\",\n },\n] as const;\n\nconst suggestion = (text: string, hint: string, label?: string): Suggestion => ({ text, hint, label, appendSpace: false });\n\nconst templateCompletions = (variables: readonly TemplateVariable[]): Completion[] => [\n {\n trigger: \"{\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query, context) => {\n const normalized = query.toLowerCase();\n const leadingBrace = context.tokenStart > 0 && context.fullText[context.tokenStart - 1] === \"{\";\n const open = leadingBrace ? \"{ \" : \"{{ \";\n const close = leadingBrace ? \" }}\" : \" }}\";\n const values = variables\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`${open}${variable.name}${close}`, variable.kind ?? \"string\", variable.name));\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`{% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...values, ...conditions, ...loops];\n },\n },\n {\n trigger: \"%\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n const conditions = variables\n .filter((variable) => variable.kind !== \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% if ${variable.name} != blank %}\\n \\n{% endif %}`, \"condition\", `if ${variable.name}`));\n const loops = variables\n .filter((variable) => variable.kind === \"array\")\n .filter((variable) => variable.name.toLowerCase().startsWith(normalized))\n .map((variable) => suggestion(`% for item in ${variable.name} %}\\n {{ item }}\\n{% endfor %}`, \"loop\", `for ${variable.name}`));\n return [...conditions, ...loops];\n },\n },\n {\n trigger: \"<\",\n dropdown: true,\n allowAfterWord: true,\n suggest: (query) => {\n const normalized = query.toLowerCase();\n return HTML_TAGS.filter((tag) => tag.name.startsWith(normalized)).map((tag) => suggestion(tag.snippet, tag.hint, tag.name));\n },\n },\n];\n\nconst escapeHtml = (value: string): string =>\n value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\n\nconst highlightLiquidToken = (token: string): string => {\n const inner = token.replace(/^\\{\\{|\\}\\}$|^\\{%|\\%}$/g, \"\").trim();\n const keyword = inner.split(/\\s+/)[0] ?? \"\";\n const kind = token.startsWith(\"{%\") ? (keyword.startsWith(\"end\") ? \"end\" : \"control\") : inner.includes(\"| raw\") ? \"raw\" : \"value\";\n return `<span class=\"k2b-template-token\" data-kind=\"${kind}\">${escapeHtml(token)}</span>`;\n};\n\nconst highlightTag = (tag: string): string => {\n const match = tag.match(/^(<\\/?)([a-zA-Z][\\w:-]*)([\\s\\S]*?)(>)$/);\n if (!match) return `<span class=\"k2b-template-tag\">${tag}</span>`;\n const attrs = (match[3] ?? \"\").replace(\n /([\\w:-]+)(=)("[\\s\\S]*?"|'[\\s\\S]*?'|[^\\s&]+)/g,\n '<span class=\"k2b-template-attribute\">$1</span><span class=\"k2b-template-punctuation\">$2</span><span class=\"k2b-template-string\">$3</span>',\n );\n return `<span class=\"k2b-template-punctuation\">${match[1]}</span><span class=\"k2b-template-tag\">${match[2]}</span>${attrs}<span class=\"k2b-template-punctuation\">${match[4]}</span>`;\n};\n\nconst highlightTemplate = (text: string): string => {\n const stashed: string[] = [];\n const escaped = escapeHtml(text).replace(/{{[\\s\\S]*?}}|{%[\\s\\S]*?%}/g, (token) => {\n const marker = `\\uE000${stashed.length}\\uE001`;\n stashed.push(highlightLiquidToken(token));\n return marker;\n });\n const withTags = escaped.replace(/<!--[\\s\\S]*?-->|<\\/?[a-zA-Z][\\s\\S]*?>/g, (tag) =>\n tag.startsWith(\"<!--\") ? `<span class=\"k2b-template-comment\">${tag}</span>` : highlightTag(tag),\n );\n return withTags.replace(/\\uE000(\\d+)\\uE001/g, (_, index) => stashed[Number(index)] ?? \"\");\n};\n\nexport function TemplateEditor(props: TemplateEditorProps): JSX.Element {\n const templateMessages = useTemplateMessages();\n const completions = createMemo(() => templateCompletions(props.variables));\n return (\n <AutocompleteEditor\n {...props}\n lines={props.lines ?? 22}\n spellcheck={props.spellcheck ?? false}\n placeholder={props.placeholder ?? templateMessages().templateEditorPlaceholder}\n highlight={highlightTemplate}\n completions={completions()}\n />\n );\n}\n\nexport function TemplatePreview(props: TemplatePreviewProps): JSX.Element {\n const templateMessages = useTemplateMessages();\n return (\n <section class={`k2b-template-preview ${props.class ?? \"\"}`}>\n <iframe sandbox=\"\" srcdoc={props.html} title={props.title ?? templateMessages().templatePreview} />\n </section>\n );\n}\n\nexport function TemplateSampleData(props: TemplateSampleDataProps): JSX.Element {\n return (\n <section class={`k2b-template-sample ${props.class ?? \"\"}`}>\n <For each={props.variables}>\n {(variable) => (\n <TextInput\n label={`{{ ${variable.name} }}`}\n description={variable.description}\n value={props.values[variable.name] ?? \"\"}\n onValueChange={(value) => props.onValueChange(variable.name, value)}\n />\n )}\n </For>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,9 +23,11 @@ import { createSignal, Show, splitProps } from "solid-js";
|
|
|
23
23
|
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
24
24
|
import { useUiMessages } from "../intl/messages";
|
|
25
25
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
26
|
+
import { useInputMessages } from "./input-messages";
|
|
26
27
|
import { MarkdownEditor } from "./markdown/MarkdownEditor";
|
|
27
28
|
export function TextInput(props) {
|
|
28
29
|
const messages = useUiMessages();
|
|
30
|
+
const inputMessages = useInputMessages();
|
|
29
31
|
const [local, rest] = splitProps(props, ["activeIcon", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "completions", "description", "error", "icon", "id", "label", "lines", "markdown", "minLength", "maxLength", "monospace", "multiline", "onClear", "onValueCommit", "onSubmit", "onValueChange", "password", "prefix", "required", "suffix", "type", "value", "variant", "abbreviations"]);
|
|
30
32
|
const meta = createFieldMeta(local.id);
|
|
31
33
|
const value = () => resolveMaybeAccessor(local.value) ?? "";
|
|
@@ -218,7 +220,7 @@ export function TextInput(props) {
|
|
|
218
220
|
_el$0 = _el$9.firstChild;
|
|
219
221
|
_el$9.$$click = () => setPasswordVisible(visible => !visible);
|
|
220
222
|
_$effect(_p$ => {
|
|
221
|
-
var _v$ = passwordVisible() ?
|
|
223
|
+
var _v$ = passwordVisible() ? inputMessages().hidePassword : inputMessages().showPassword,
|
|
222
224
|
_v$2 = passwordVisible(),
|
|
223
225
|
_v$3 = rest.disabled,
|
|
224
226
|
_v$4 = passwordVisible() ? "ti ti-eye-off" : "ti ti-eye";
|