@k2b/ui 0.1.0-rc.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/LICENSE +661 -0
- package/README.md +343 -0
- package/dist/.build-complete +0 -0
- package/dist/browser/actions/Button.js +236 -0
- package/dist/browser/actions/Button.js.map +1 -0
- package/dist/browser/actions/ContextMenu.js +199 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -0
- package/dist/browser/actions/CopyButton.js +97 -0
- package/dist/browser/actions/CopyButton.js.map +1 -0
- package/dist/browser/actions/Disclosure.js +83 -0
- package/dist/browser/actions/Disclosure.js.map +1 -0
- package/dist/browser/actions/Dropdown.js +669 -0
- package/dist/browser/actions/Dropdown.js.map +1 -0
- package/dist/browser/actions/FilterChip.js +149 -0
- package/dist/browser/actions/FilterChip.js.map +1 -0
- package/dist/browser/actions/RemoveButton.js +47 -0
- package/dist/browser/actions/RemoveButton.js.map +1 -0
- package/dist/browser/actions/SegmentedControl.js +138 -0
- package/dist/browser/actions/SegmentedControl.js.map +1 -0
- package/dist/browser/actions/SplitButton.js +76 -0
- package/dist/browser/actions/SplitButton.js.map +1 -0
- package/dist/browser/actions/SpotlightSearch.js +87 -0
- package/dist/browser/actions/SpotlightSearch.js.map +1 -0
- package/dist/browser/actions/Tabs.js +185 -0
- package/dist/browser/actions/Tabs.js.map +1 -0
- package/dist/browser/actions/Toolbar.js +87 -0
- package/dist/browser/actions/Toolbar.js.map +1 -0
- package/dist/browser/actions/index.js +13 -0
- package/dist/browser/actions/index.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +760 -0
- package/dist/browser/chat/ChatComposer.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +688 -0
- package/dist/browser/chat/ChatPrimitives.js.map +1 -0
- package/dist/browser/chat/ChatRoot.js +27 -0
- package/dist/browser/chat/ChatRoot.js.map +1 -0
- package/dist/browser/chat/ChatTimeline.js +404 -0
- package/dist/browser/chat/ChatTimeline.js.map +1 -0
- package/dist/browser/chat/chat-behavior.js +53 -0
- package/dist/browser/chat/chat-behavior.js.map +1 -0
- package/dist/browser/chat/index.js +17 -0
- package/dist/browser/chat/index.js.map +1 -0
- package/dist/browser/chat/types.js +2 -0
- package/dist/browser/chat/types.js.map +1 -0
- package/dist/browser/content/Calendar.js +2168 -0
- package/dist/browser/content/Calendar.js.map +1 -0
- package/dist/browser/content/Chart.js +680 -0
- package/dist/browser/content/Chart.js.map +1 -0
- package/dist/browser/content/CodeDisplay.js +104 -0
- package/dist/browser/content/CodeDisplay.js.map +1 -0
- package/dist/browser/content/DataTable.js +724 -0
- package/dist/browser/content/DataTable.js.map +1 -0
- package/dist/browser/content/Docs.js +227 -0
- package/dist/browser/content/Docs.js.map +1 -0
- package/dist/browser/content/FileBrowser.js +462 -0
- package/dist/browser/content/FileBrowser.js.map +1 -0
- package/dist/browser/content/FileTree.js +453 -0
- package/dist/browser/content/FileTree.js.map +1 -0
- package/dist/browser/content/FileView.js +842 -0
- package/dist/browser/content/FileView.js.map +1 -0
- package/dist/browser/content/Lightbox.js +285 -0
- package/dist/browser/content/Lightbox.js.map +1 -0
- package/dist/browser/content/LogEntriesTable.js +139 -0
- package/dist/browser/content/LogEntriesTable.js.map +1 -0
- package/dist/browser/content/MarkdownView.js +138 -0
- package/dist/browser/content/MarkdownView.js.map +1 -0
- package/dist/browser/content/Pagination.js +182 -0
- package/dist/browser/content/Pagination.js.map +1 -0
- package/dist/browser/content/PdfPreview.js +204 -0
- package/dist/browser/content/PdfPreview.js.map +1 -0
- package/dist/browser/content/RangePicker.js +83 -0
- package/dist/browser/content/RangePicker.js.map +1 -0
- package/dist/browser/content/StructuredDataPreview.js +194 -0
- package/dist/browser/content/StructuredDataPreview.js.map +1 -0
- package/dist/browser/content/calendar-event-layout.js +92 -0
- package/dist/browser/content/calendar-event-layout.js.map +1 -0
- package/dist/browser/content/calendar-pointer.js +114 -0
- package/dist/browser/content/calendar-pointer.js.map +1 -0
- package/dist/browser/content/chart-map-viewport.js +33 -0
- package/dist/browser/content/chart-map-viewport.js.map +1 -0
- package/dist/browser/content/chart-state-timeline.js +124 -0
- package/dist/browser/content/chart-state-timeline.js.map +1 -0
- package/dist/browser/content/code-highlight.js +144 -0
- package/dist/browser/content/code-highlight.js.map +1 -0
- package/dist/browser/content/file-tree.js +93 -0
- package/dist/browser/content/file-tree.js.map +1 -0
- package/dist/browser/content/file-view-preview.js +112 -0
- package/dist/browser/content/file-view-preview.js.map +1 -0
- package/dist/browser/content/index.js +16 -0
- package/dist/browser/content/index.js.map +1 -0
- package/dist/browser/feedback/InlineGuidance.js +46 -0
- package/dist/browser/feedback/InlineGuidance.js.map +1 -0
- package/dist/browser/feedback/Tooltip.js +189 -0
- package/dist/browser/feedback/Tooltip.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +207 -0
- package/dist/browser/feedback/dialog-core.js.map +1 -0
- package/dist/browser/feedback/index.js +6 -0
- package/dist/browser/feedback/index.js.map +1 -0
- package/dist/browser/feedback/prompts.js +991 -0
- package/dist/browser/feedback/prompts.js.map +1 -0
- package/dist/browser/feedback/toast.js +271 -0
- package/dist/browser/feedback/toast.js.map +1 -0
- package/dist/browser/feedback/tooltip-position.js +25 -0
- package/dist/browser/feedback/tooltip-position.js.map +1 -0
- package/dist/browser/index.js +11 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/inputs/AutocompleteEditor.js +610 -0
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -0
- package/dist/browser/inputs/AutocompleteSelect.js +632 -0
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -0
- package/dist/browser/inputs/Checkbox.js +137 -0
- package/dist/browser/inputs/Checkbox.js.map +1 -0
- package/dist/browser/inputs/CheckboxCard.js +130 -0
- package/dist/browser/inputs/CheckboxCard.js.map +1 -0
- package/dist/browser/inputs/ChoiceGroups.js +174 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -0
- package/dist/browser/inputs/ChoiceInputs.js +400 -0
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -0
- package/dist/browser/inputs/Combobox.js +274 -0
- package/dist/browser/inputs/Combobox.js.map +1 -0
- package/dist/browser/inputs/DatePicker.js +923 -0
- package/dist/browser/inputs/DatePicker.js.map +1 -0
- package/dist/browser/inputs/FileInputs.js +736 -0
- package/dist/browser/inputs/FileInputs.js.map +1 -0
- package/dist/browser/inputs/MultiSelectInput.js +565 -0
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -0
- package/dist/browser/inputs/NumberInput.js +288 -0
- package/dist/browser/inputs/NumberInput.js.map +1 -0
- package/dist/browser/inputs/Select.js +507 -0
- package/dist/browser/inputs/Select.js.map +1 -0
- package/dist/browser/inputs/SelectChip.js +151 -0
- package/dist/browser/inputs/SelectChip.js.map +1 -0
- package/dist/browser/inputs/SpecialInputs.js +117 -0
- package/dist/browser/inputs/SpecialInputs.js.map +1 -0
- package/dist/browser/inputs/Switch.js +117 -0
- package/dist/browser/inputs/Switch.js.map +1 -0
- package/dist/browser/inputs/TagEditor.js +358 -0
- package/dist/browser/inputs/TagEditor.js.map +1 -0
- package/dist/browser/inputs/TagsInput.js +195 -0
- package/dist/browser/inputs/TagsInput.js.map +1 -0
- package/dist/browser/inputs/TemplateEditor.js +190 -0
- package/dist/browser/inputs/TemplateEditor.js.map +1 -0
- package/dist/browser/inputs/TextInput.js +318 -0
- package/dist/browser/inputs/TextInput.js.map +1 -0
- package/dist/browser/inputs/choice.js +188 -0
- package/dist/browser/inputs/choice.js.map +1 -0
- package/dist/browser/inputs/completion/behaviors.js +108 -0
- package/dist/browser/inputs/completion/behaviors.js.map +1 -0
- package/dist/browser/inputs/completion/engine.js +103 -0
- package/dist/browser/inputs/completion/engine.js.map +1 -0
- package/dist/browser/inputs/completion/index.js +4 -0
- package/dist/browser/inputs/completion/index.js.map +1 -0
- package/dist/browser/inputs/completion/overlay.js +25 -0
- package/dist/browser/inputs/completion/overlay.js.map +1 -0
- package/dist/browser/inputs/date-picker.js +123 -0
- package/dist/browser/inputs/date-picker.js.map +1 -0
- package/dist/browser/inputs/editor-dom.js +26 -0
- package/dist/browser/inputs/editor-dom.js.map +1 -0
- package/dist/browser/inputs/field-contract.js +9 -0
- package/dist/browser/inputs/field-contract.js.map +1 -0
- package/dist/browser/inputs/icon-options.js +46 -0
- package/dist/browser/inputs/icon-options.js.map +1 -0
- package/dist/browser/inputs/image-crop.js +145 -0
- package/dist/browser/inputs/image-crop.js.map +1 -0
- package/dist/browser/inputs/index.js +23 -0
- package/dist/browser/inputs/index.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +725 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -0
- package/dist/browser/inputs/markdown/Toolbar.js +172 -0
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -0
- package/dist/browser/inputs/markdown/actions.js +140 -0
- package/dist/browser/inputs/markdown/actions.js.map +1 -0
- package/dist/browser/inputs/markdown/active-formats.js +36 -0
- package/dist/browser/inputs/markdown/active-formats.js.map +1 -0
- package/dist/browser/inputs/markdown/behaviors.js +63 -0
- package/dist/browser/inputs/markdown/behaviors.js.map +1 -0
- package/dist/browser/inputs/markdown/code-zone.js +8 -0
- package/dist/browser/inputs/markdown/code-zone.js.map +1 -0
- package/dist/browser/internal/color.js +18 -0
- package/dist/browser/internal/color.js.map +1 -0
- package/dist/browser/internal/field.js +158 -0
- package/dist/browser/internal/field.js.map +1 -0
- package/dist/browser/internal/portal.js +17 -0
- package/dist/browser/internal/portal.js.map +1 -0
- package/dist/browser/intl/Format.js +273 -0
- package/dist/browser/intl/Format.js.map +1 -0
- package/dist/browser/intl/index.js +3 -0
- package/dist/browser/intl/index.js.map +1 -0
- package/dist/browser/intl/locale.js +63 -0
- package/dist/browser/intl/locale.js.map +1 -0
- package/dist/browser/intl/messages.js +753 -0
- package/dist/browser/intl/messages.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +151 -0
- package/dist/browser/layout/AppOverview.js.map +1 -0
- package/dist/browser/layout/AppWorkspace.js +1502 -0
- package/dist/browser/layout/AppWorkspace.js.map +1 -0
- package/dist/browser/layout/DataPanel.js +122 -0
- package/dist/browser/layout/DataPanel.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +484 -0
- package/dist/browser/layout/DetailPanel.js.map +1 -0
- package/dist/browser/layout/Discussion.js +511 -0
- package/dist/browser/layout/Discussion.js.map +1 -0
- package/dist/browser/layout/FloatingWindow.js +332 -0
- package/dist/browser/layout/FloatingWindow.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +236 -0
- package/dist/browser/layout/PanelDialog.js.map +1 -0
- package/dist/browser/layout/PanelHeader.js +91 -0
- package/dist/browser/layout/PanelHeader.js.map +1 -0
- package/dist/browser/layout/Panes.js +978 -0
- package/dist/browser/layout/Panes.js.map +1 -0
- package/dist/browser/layout/ScrollArea.js +29 -0
- package/dist/browser/layout/ScrollArea.js.map +1 -0
- package/dist/browser/layout/Settings.js +381 -0
- package/dist/browser/layout/Settings.js.map +1 -0
- package/dist/browser/layout/SettingsCollection.js +212 -0
- package/dist/browser/layout/SettingsCollection.js.map +1 -0
- package/dist/browser/layout/SettingsModal.js +281 -0
- package/dist/browser/layout/SettingsModal.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +419 -0
- package/dist/browser/layout/app-workspace-controller.js.map +1 -0
- package/dist/browser/layout/app-workspace-state.js +125 -0
- package/dist/browser/layout/app-workspace-state.js.map +1 -0
- package/dist/browser/layout/floating-window-geometry.js +15 -0
- package/dist/browser/layout/floating-window-geometry.js.map +1 -0
- package/dist/browser/layout/index.js +17 -0
- package/dist/browser/layout/index.js.map +1 -0
- package/dist/browser/layout/panes-layout.js +436 -0
- package/dist/browser/layout/panes-layout.js.map +1 -0
- package/dist/browser/layout/stable-id.js +17 -0
- package/dist/browser/layout/stable-id.js.map +1 -0
- package/dist/browser/semantics.js +2 -0
- package/dist/browser/semantics.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +97 -0
- package/dist/browser/surfaces/Avatar.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js +66 -0
- package/dist/browser/surfaces/DescriptionList.js.map +1 -0
- package/dist/browser/surfaces/LinkCard.js +40 -0
- package/dist/browser/surfaces/LinkCard.js.map +1 -0
- package/dist/browser/surfaces/NotFoundState.js +85 -0
- package/dist/browser/surfaces/NotFoundState.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +145 -0
- package/dist/browser/surfaces/NoticeCard.js.map +1 -0
- package/dist/browser/surfaces/Paper.js +33 -0
- package/dist/browser/surfaces/Paper.js.map +1 -0
- package/dist/browser/surfaces/Placeholder.js +90 -0
- package/dist/browser/surfaces/Placeholder.js.map +1 -0
- package/dist/browser/surfaces/ProgressBar.js +58 -0
- package/dist/browser/surfaces/ProgressBar.js.map +1 -0
- package/dist/browser/surfaces/StatCell.js +172 -0
- package/dist/browser/surfaces/StatCell.js.map +1 -0
- package/dist/browser/surfaces/StatGrid.js +80 -0
- package/dist/browser/surfaces/StatGrid.js.map +1 -0
- package/dist/browser/surfaces/StatusBadge.js +70 -0
- package/dist/browser/surfaces/StatusBadge.js.map +1 -0
- package/dist/browser/surfaces/Tag.js +94 -0
- package/dist/browser/surfaces/Tag.js.map +1 -0
- package/dist/browser/surfaces/index.js +13 -0
- package/dist/browser/surfaces/index.js.map +1 -0
- package/dist/browser/widgets/Widget.js +89 -0
- package/dist/browser/widgets/Widget.js.map +1 -0
- package/dist/browser/widgets/WidgetHero.js +47 -0
- package/dist/browser/widgets/WidgetHero.js.map +1 -0
- package/dist/browser/widgets/WidgetList.js +125 -0
- package/dist/browser/widgets/WidgetList.js.map +1 -0
- package/dist/browser/widgets/WidgetPills.js +78 -0
- package/dist/browser/widgets/WidgetPills.js.map +1 -0
- package/dist/browser/widgets/WidgetStat.js +114 -0
- package/dist/browser/widgets/WidgetStat.js.map +1 -0
- package/dist/browser/widgets/WidgetStatus.js +54 -0
- package/dist/browser/widgets/WidgetStatus.js.map +1 -0
- package/dist/browser/widgets/index.js +7 -0
- package/dist/browser/widgets/index.js.map +1 -0
- package/dist/global.css +3 -0
- package/dist/licenses/ibm-plex-mono.txt +93 -0
- package/dist/licenses/ibm-plex-sans.txt +93 -0
- package/dist/licenses/tabler-icons.txt +21 -0
- package/dist/plex.css +1 -0
- package/dist/ssr/actions/Button.js +203 -0
- package/dist/ssr/actions/Button.js.map +1 -0
- package/dist/ssr/actions/ContextMenu.js +128 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -0
- package/dist/ssr/actions/CopyButton.js +79 -0
- package/dist/ssr/actions/CopyButton.js.map +1 -0
- package/dist/ssr/actions/Disclosure.js +26 -0
- package/dist/ssr/actions/Disclosure.js.map +1 -0
- package/dist/ssr/actions/Dropdown.js +443 -0
- package/dist/ssr/actions/Dropdown.js.map +1 -0
- package/dist/ssr/actions/FilterChip.js +132 -0
- package/dist/ssr/actions/FilterChip.js.map +1 -0
- package/dist/ssr/actions/RemoveButton.js +45 -0
- package/dist/ssr/actions/RemoveButton.js.map +1 -0
- package/dist/ssr/actions/SegmentedControl.js +57 -0
- package/dist/ssr/actions/SegmentedControl.js.map +1 -0
- package/dist/ssr/actions/SplitButton.js +74 -0
- package/dist/ssr/actions/SplitButton.js.map +1 -0
- package/dist/ssr/actions/SpotlightSearch.js +38 -0
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -0
- package/dist/ssr/actions/Tabs.js +91 -0
- package/dist/ssr/actions/Tabs.js.map +1 -0
- package/dist/ssr/actions/Toolbar.js +33 -0
- package/dist/ssr/actions/Toolbar.js.map +1 -0
- package/dist/ssr/actions/index.js +13 -0
- package/dist/ssr/actions/index.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +392 -0
- package/dist/ssr/chat/ChatComposer.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +377 -0
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -0
- package/dist/ssr/chat/ChatRoot.js +10 -0
- package/dist/ssr/chat/ChatRoot.js.map +1 -0
- package/dist/ssr/chat/ChatTimeline.js +301 -0
- package/dist/ssr/chat/ChatTimeline.js.map +1 -0
- package/dist/ssr/chat/chat-behavior.js +53 -0
- package/dist/ssr/chat/chat-behavior.js.map +1 -0
- package/dist/ssr/chat/index.js +17 -0
- package/dist/ssr/chat/index.js.map +1 -0
- package/dist/ssr/chat/types.js +2 -0
- package/dist/ssr/chat/types.js.map +1 -0
- package/dist/ssr/content/Calendar.js +1542 -0
- package/dist/ssr/content/Calendar.js.map +1 -0
- package/dist/ssr/content/Chart.js +552 -0
- package/dist/ssr/content/Chart.js.map +1 -0
- package/dist/ssr/content/CodeDisplay.js +55 -0
- package/dist/ssr/content/CodeDisplay.js.map +1 -0
- package/dist/ssr/content/DataTable.js +470 -0
- package/dist/ssr/content/DataTable.js.map +1 -0
- package/dist/ssr/content/Docs.js +108 -0
- package/dist/ssr/content/Docs.js.map +1 -0
- package/dist/ssr/content/FileBrowser.js +422 -0
- package/dist/ssr/content/FileBrowser.js.map +1 -0
- package/dist/ssr/content/FileTree.js +299 -0
- package/dist/ssr/content/FileTree.js.map +1 -0
- package/dist/ssr/content/FileView.js +612 -0
- package/dist/ssr/content/FileView.js.map +1 -0
- package/dist/ssr/content/Lightbox.js +164 -0
- package/dist/ssr/content/Lightbox.js.map +1 -0
- package/dist/ssr/content/LogEntriesTable.js +106 -0
- package/dist/ssr/content/LogEntriesTable.js.map +1 -0
- package/dist/ssr/content/MarkdownView.js +119 -0
- package/dist/ssr/content/MarkdownView.js.map +1 -0
- package/dist/ssr/content/Pagination.js +141 -0
- package/dist/ssr/content/Pagination.js.map +1 -0
- package/dist/ssr/content/PdfPreview.js +126 -0
- package/dist/ssr/content/PdfPreview.js.map +1 -0
- package/dist/ssr/content/RangePicker.js +35 -0
- package/dist/ssr/content/RangePicker.js.map +1 -0
- package/dist/ssr/content/StructuredDataPreview.js +127 -0
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -0
- package/dist/ssr/content/calendar-event-layout.js +92 -0
- package/dist/ssr/content/calendar-event-layout.js.map +1 -0
- package/dist/ssr/content/calendar-pointer.js +114 -0
- package/dist/ssr/content/calendar-pointer.js.map +1 -0
- package/dist/ssr/content/chart-map-viewport.js +33 -0
- package/dist/ssr/content/chart-map-viewport.js.map +1 -0
- package/dist/ssr/content/chart-state-timeline.js +124 -0
- package/dist/ssr/content/chart-state-timeline.js.map +1 -0
- package/dist/ssr/content/code-highlight.js +144 -0
- package/dist/ssr/content/code-highlight.js.map +1 -0
- package/dist/ssr/content/file-tree.js +93 -0
- package/dist/ssr/content/file-tree.js.map +1 -0
- package/dist/ssr/content/file-view-preview.js +112 -0
- package/dist/ssr/content/file-view-preview.js.map +1 -0
- package/dist/ssr/content/index.js +16 -0
- package/dist/ssr/content/index.js.map +1 -0
- package/dist/ssr/feedback/InlineGuidance.js +26 -0
- package/dist/ssr/feedback/InlineGuidance.js.map +1 -0
- package/dist/ssr/feedback/Tooltip.js +156 -0
- package/dist/ssr/feedback/Tooltip.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +207 -0
- package/dist/ssr/feedback/dialog-core.js.map +1 -0
- package/dist/ssr/feedback/index.js +6 -0
- package/dist/ssr/feedback/index.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +703 -0
- package/dist/ssr/feedback/prompts.js.map +1 -0
- package/dist/ssr/feedback/toast.js +271 -0
- package/dist/ssr/feedback/toast.js.map +1 -0
- package/dist/ssr/feedback/tooltip-position.js +25 -0
- package/dist/ssr/feedback/tooltip-position.js.map +1 -0
- package/dist/ssr/index.js +11 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/inputs/AutocompleteEditor.js +463 -0
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -0
- package/dist/ssr/inputs/AutocompleteSelect.js +420 -0
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -0
- package/dist/ssr/inputs/Checkbox.js +75 -0
- package/dist/ssr/inputs/Checkbox.js.map +1 -0
- package/dist/ssr/inputs/CheckboxCard.js +69 -0
- package/dist/ssr/inputs/CheckboxCard.js.map +1 -0
- package/dist/ssr/inputs/ChoiceGroups.js +101 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js +250 -0
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -0
- package/dist/ssr/inputs/Combobox.js +177 -0
- package/dist/ssr/inputs/Combobox.js.map +1 -0
- package/dist/ssr/inputs/DatePicker.js +629 -0
- package/dist/ssr/inputs/DatePicker.js.map +1 -0
- package/dist/ssr/inputs/FileInputs.js +543 -0
- package/dist/ssr/inputs/FileInputs.js.map +1 -0
- package/dist/ssr/inputs/MultiSelectInput.js +347 -0
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -0
- package/dist/ssr/inputs/NumberInput.js +177 -0
- package/dist/ssr/inputs/NumberInput.js.map +1 -0
- package/dist/ssr/inputs/Select.js +308 -0
- package/dist/ssr/inputs/Select.js.map +1 -0
- package/dist/ssr/inputs/SelectChip.js +129 -0
- package/dist/ssr/inputs/SelectChip.js.map +1 -0
- package/dist/ssr/inputs/SpecialInputs.js +116 -0
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -0
- package/dist/ssr/inputs/Switch.js +62 -0
- package/dist/ssr/inputs/Switch.js.map +1 -0
- package/dist/ssr/inputs/TagEditor.js +280 -0
- package/dist/ssr/inputs/TagEditor.js.map +1 -0
- package/dist/ssr/inputs/TagsInput.js +122 -0
- package/dist/ssr/inputs/TagsInput.js.map +1 -0
- package/dist/ssr/inputs/TemplateEditor.js +164 -0
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -0
- package/dist/ssr/inputs/TextInput.js +211 -0
- package/dist/ssr/inputs/TextInput.js.map +1 -0
- package/dist/ssr/inputs/choice.js +188 -0
- package/dist/ssr/inputs/choice.js.map +1 -0
- package/dist/ssr/inputs/completion/behaviors.js +108 -0
- package/dist/ssr/inputs/completion/behaviors.js.map +1 -0
- package/dist/ssr/inputs/completion/engine.js +103 -0
- package/dist/ssr/inputs/completion/engine.js.map +1 -0
- package/dist/ssr/inputs/completion/index.js +4 -0
- package/dist/ssr/inputs/completion/index.js.map +1 -0
- package/dist/ssr/inputs/completion/overlay.js +25 -0
- package/dist/ssr/inputs/completion/overlay.js.map +1 -0
- package/dist/ssr/inputs/date-picker.js +123 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -0
- package/dist/ssr/inputs/editor-dom.js +26 -0
- package/dist/ssr/inputs/editor-dom.js.map +1 -0
- package/dist/ssr/inputs/field-contract.js +9 -0
- package/dist/ssr/inputs/field-contract.js.map +1 -0
- package/dist/ssr/inputs/icon-options.js +46 -0
- package/dist/ssr/inputs/icon-options.js.map +1 -0
- package/dist/ssr/inputs/image-crop.js +145 -0
- package/dist/ssr/inputs/image-crop.js.map +1 -0
- package/dist/ssr/inputs/index.js +23 -0
- package/dist/ssr/inputs/index.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +516 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -0
- package/dist/ssr/inputs/markdown/Toolbar.js +115 -0
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -0
- package/dist/ssr/inputs/markdown/actions.js +140 -0
- package/dist/ssr/inputs/markdown/actions.js.map +1 -0
- package/dist/ssr/inputs/markdown/active-formats.js +36 -0
- package/dist/ssr/inputs/markdown/active-formats.js.map +1 -0
- package/dist/ssr/inputs/markdown/behaviors.js +63 -0
- package/dist/ssr/inputs/markdown/behaviors.js.map +1 -0
- package/dist/ssr/inputs/markdown/code-zone.js +8 -0
- package/dist/ssr/inputs/markdown/code-zone.js.map +1 -0
- package/dist/ssr/internal/color.js +18 -0
- package/dist/ssr/internal/color.js.map +1 -0
- package/dist/ssr/internal/field.js +90 -0
- package/dist/ssr/internal/field.js.map +1 -0
- package/dist/ssr/internal/portal.js +17 -0
- package/dist/ssr/internal/portal.js.map +1 -0
- package/dist/ssr/intl/Format.js +192 -0
- package/dist/ssr/intl/Format.js.map +1 -0
- package/dist/ssr/intl/index.js +3 -0
- package/dist/ssr/intl/index.js.map +1 -0
- package/dist/ssr/intl/locale.js +63 -0
- package/dist/ssr/intl/locale.js.map +1 -0
- package/dist/ssr/intl/messages.js +753 -0
- package/dist/ssr/intl/messages.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +85 -0
- package/dist/ssr/layout/AppOverview.js.map +1 -0
- package/dist/ssr/layout/AppWorkspace.js +976 -0
- package/dist/ssr/layout/AppWorkspace.js.map +1 -0
- package/dist/ssr/layout/DataPanel.js +101 -0
- package/dist/ssr/layout/DataPanel.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +284 -0
- package/dist/ssr/layout/DetailPanel.js.map +1 -0
- package/dist/ssr/layout/Discussion.js +319 -0
- package/dist/ssr/layout/Discussion.js.map +1 -0
- package/dist/ssr/layout/FloatingWindow.js +259 -0
- package/dist/ssr/layout/FloatingWindow.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +136 -0
- package/dist/ssr/layout/PanelDialog.js.map +1 -0
- package/dist/ssr/layout/PanelHeader.js +45 -0
- package/dist/ssr/layout/PanelHeader.js.map +1 -0
- package/dist/ssr/layout/Panes.js +678 -0
- package/dist/ssr/layout/Panes.js.map +1 -0
- package/dist/ssr/layout/ScrollArea.js +18 -0
- package/dist/ssr/layout/ScrollArea.js.map +1 -0
- package/dist/ssr/layout/Settings.js +219 -0
- package/dist/ssr/layout/Settings.js.map +1 -0
- package/dist/ssr/layout/SettingsCollection.js +150 -0
- package/dist/ssr/layout/SettingsCollection.js.map +1 -0
- package/dist/ssr/layout/SettingsModal.js +156 -0
- package/dist/ssr/layout/SettingsModal.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +419 -0
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -0
- package/dist/ssr/layout/app-workspace-state.js +125 -0
- package/dist/ssr/layout/app-workspace-state.js.map +1 -0
- package/dist/ssr/layout/floating-window-geometry.js +15 -0
- package/dist/ssr/layout/floating-window-geometry.js.map +1 -0
- package/dist/ssr/layout/index.js +17 -0
- package/dist/ssr/layout/index.js.map +1 -0
- package/dist/ssr/layout/panes-layout.js +436 -0
- package/dist/ssr/layout/panes-layout.js.map +1 -0
- package/dist/ssr/layout/stable-id.js +17 -0
- package/dist/ssr/layout/stable-id.js.map +1 -0
- package/dist/ssr/semantics.js +2 -0
- package/dist/ssr/semantics.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +43 -0
- package/dist/ssr/surfaces/Avatar.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js +25 -0
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -0
- package/dist/ssr/surfaces/LinkCard.js +25 -0
- package/dist/ssr/surfaces/LinkCard.js.map +1 -0
- package/dist/ssr/surfaces/NotFoundState.js +38 -0
- package/dist/ssr/surfaces/NotFoundState.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +83 -0
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -0
- package/dist/ssr/surfaces/Paper.js +32 -0
- package/dist/ssr/surfaces/Paper.js.map +1 -0
- package/dist/ssr/surfaces/Placeholder.js +76 -0
- package/dist/ssr/surfaces/Placeholder.js.map +1 -0
- package/dist/ssr/surfaces/ProgressBar.js +13 -0
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -0
- package/dist/ssr/surfaces/StatCell.js +80 -0
- package/dist/ssr/surfaces/StatCell.js.map +1 -0
- package/dist/ssr/surfaces/StatGrid.js +62 -0
- package/dist/ssr/surfaces/StatGrid.js.map +1 -0
- package/dist/ssr/surfaces/StatusBadge.js +38 -0
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -0
- package/dist/ssr/surfaces/Tag.js +32 -0
- package/dist/ssr/surfaces/Tag.js.map +1 -0
- package/dist/ssr/surfaces/index.js +13 -0
- package/dist/ssr/surfaces/index.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +54 -0
- package/dist/ssr/widgets/Widget.js.map +1 -0
- package/dist/ssr/widgets/WidgetHero.js +23 -0
- package/dist/ssr/widgets/WidgetHero.js.map +1 -0
- package/dist/ssr/widgets/WidgetList.js +73 -0
- package/dist/ssr/widgets/WidgetList.js.map +1 -0
- package/dist/ssr/widgets/WidgetPills.js +40 -0
- package/dist/ssr/widgets/WidgetPills.js.map +1 -0
- package/dist/ssr/widgets/WidgetStat.js +45 -0
- package/dist/ssr/widgets/WidgetStat.js.map +1 -0
- package/dist/ssr/widgets/WidgetStatus.js +23 -0
- package/dist/ssr/widgets/WidgetStatus.js.map +1 -0
- package/dist/ssr/widgets/index.js +7 -0
- package/dist/ssr/widgets/index.js.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
- package/dist/tabler.css +4 -0
- package/package.json +77 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { fuzzy } from "@k2b/stdlib";
|
|
3
|
+
import { createMemo } from "solid-js";
|
|
4
|
+
import { useUiMessages } from "../intl/messages";
|
|
5
|
+
import { resolveMaybeAccessor } from "./field-contract";
|
|
6
|
+
import { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from "./icon-options";
|
|
7
|
+
import { Select } from "./Select";
|
|
8
|
+
export function IconInput(props) {
|
|
9
|
+
const messages = useUiMessages();
|
|
10
|
+
const options = () => props.options ?? DEFAULT_ICON_OPTIONS;
|
|
11
|
+
const groups = () => props.groups ?? (props.options === undefined ? DEFAULT_ICON_GROUPS : undefined);
|
|
12
|
+
const filterOptions = (source, query) => {
|
|
13
|
+
const normalized = query.trim().toLowerCase();
|
|
14
|
+
if (!normalized) {
|
|
15
|
+
return [...source].sort((left, right) => String(left.label).localeCompare(String(right.label), undefined, {
|
|
16
|
+
sensitivity: "base"
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
return fuzzy.filter(normalized, source, {
|
|
20
|
+
// Cloud's key is `[label, ...keywords]`. Including `value` as well put
|
|
21
|
+
// the literal "ti ti-" in front of every entry, so short queries matched
|
|
22
|
+
// the whole catalogue and fuzzy scores were skewed. The bare glyph name
|
|
23
|
+
// is already the first keyword (see `icon()` in ./icon-options), so
|
|
24
|
+
// nothing is lost by dropping it.
|
|
25
|
+
key: option => {
|
|
26
|
+
const keywords = "keywords" in option && Array.isArray(option.keywords) ? option.keywords.join(" ") : "";
|
|
27
|
+
return `${String(option.label)} ${keywords}`.toLowerCase();
|
|
28
|
+
},
|
|
29
|
+
limit: props.searchLimit ?? 50
|
|
30
|
+
}).map(match => match.item);
|
|
31
|
+
};
|
|
32
|
+
const selectedOption = createMemo(() => options().find(option => option.value === resolveMaybeAccessor(props.value)));
|
|
33
|
+
return _$createComponent(Select, {
|
|
34
|
+
get id() {
|
|
35
|
+
return props.id;
|
|
36
|
+
},
|
|
37
|
+
get name() {
|
|
38
|
+
return props.name;
|
|
39
|
+
},
|
|
40
|
+
get ["class"]() {
|
|
41
|
+
return props.class;
|
|
42
|
+
},
|
|
43
|
+
get label() {
|
|
44
|
+
return props.label;
|
|
45
|
+
},
|
|
46
|
+
get description() {
|
|
47
|
+
return props.description;
|
|
48
|
+
},
|
|
49
|
+
get error() {
|
|
50
|
+
return props.error;
|
|
51
|
+
},
|
|
52
|
+
get ["aria-label"]() {
|
|
53
|
+
return props["aria-label"];
|
|
54
|
+
},
|
|
55
|
+
get ["aria-describedby"]() {
|
|
56
|
+
return props["aria-describedby"];
|
|
57
|
+
},
|
|
58
|
+
get placeholder() {
|
|
59
|
+
return props.placeholder ?? messages().pickIcon;
|
|
60
|
+
},
|
|
61
|
+
get disabled() {
|
|
62
|
+
return props.disabled;
|
|
63
|
+
},
|
|
64
|
+
get required() {
|
|
65
|
+
return props.required;
|
|
66
|
+
},
|
|
67
|
+
get clearable() {
|
|
68
|
+
return props.clearable ?? true;
|
|
69
|
+
},
|
|
70
|
+
get value() {
|
|
71
|
+
return resolveMaybeAccessor(props.value);
|
|
72
|
+
},
|
|
73
|
+
get selectedOption() {
|
|
74
|
+
return selectedOption();
|
|
75
|
+
},
|
|
76
|
+
get onValueChange() {
|
|
77
|
+
return props.onValueChange;
|
|
78
|
+
},
|
|
79
|
+
get onValueCommit() {
|
|
80
|
+
return props.onValueCommit;
|
|
81
|
+
},
|
|
82
|
+
get options() {
|
|
83
|
+
return [...options()];
|
|
84
|
+
},
|
|
85
|
+
get groups() {
|
|
86
|
+
return groups();
|
|
87
|
+
},
|
|
88
|
+
get defaultGroup() {
|
|
89
|
+
return props.defaultGroup ?? (props.options === undefined ? "recommended" : undefined);
|
|
90
|
+
},
|
|
91
|
+
get groupsAriaLabel() {
|
|
92
|
+
return props.groupsAriaLabel ?? messages().filterIcons;
|
|
93
|
+
},
|
|
94
|
+
get allGroupLabel() {
|
|
95
|
+
return props.allGroupLabel;
|
|
96
|
+
},
|
|
97
|
+
get viewToggle() {
|
|
98
|
+
return props.viewToggle ?? true;
|
|
99
|
+
},
|
|
100
|
+
get defaultView() {
|
|
101
|
+
return props.defaultView ?? "grid";
|
|
102
|
+
},
|
|
103
|
+
get gridSize() {
|
|
104
|
+
return props.gridSize ?? "sm";
|
|
105
|
+
},
|
|
106
|
+
searchable: true,
|
|
107
|
+
filterOptions: filterOptions,
|
|
108
|
+
get searchPlaceholder() {
|
|
109
|
+
return messages().search;
|
|
110
|
+
},
|
|
111
|
+
get icon() {
|
|
112
|
+
return selectedOption()?.icon ?? "ti ti-icons";
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=SpecialInputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["fuzzy","createMemo","useUiMessages","resolveMaybeAccessor","DEFAULT_ICON_GROUPS","DEFAULT_ICON_OPTIONS","Select","IconInput","props","messages","options","groups","undefined","filterOptions","source","query","normalized","trim","toLowerCase","sort","left","right","String","label","localeCompare","sensitivity","filter","key","option","keywords","Array","isArray","join","limit","searchLimit","map","match","item","selectedOption","find","value","_$createComponent","id","name","class","description","error","aria-label","aria-describedby","placeholder","pickIcon","disabled","required","clearable","onValueChange","onValueCommit","defaultGroup","groupsAriaLabel","filterIcons","allGroupLabel","viewToggle","defaultView","gridSize","searchable","searchPlaceholder","search","icon"],"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 ?? messages().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 ?? messages().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":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
3
|
+
import { ssrElement as _$ssrElement } from "solid-js/web";
|
|
4
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
5
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
6
|
+
import { escape as _$escape } from "solid-js/web";
|
|
7
|
+
var _tmpl$ = ["<span", " class=\"k2b-field__description\">", "</span>"],
|
|
8
|
+
_tmpl$2 = ["<p", " class=\"k2b-field__error\" role=\"alert\" aria-live=\"polite\">", "</p>"],
|
|
9
|
+
_tmpl$3 = ["<div class=\"", "\"", "><label class=\"k2b-switch\">", "<span class=\"k2b-switch__track\" aria-hidden=\"true\"><span class=\"k2b-switch__thumb\"></span></span>", "</label>", "", "</div>"],
|
|
10
|
+
_tmpl$4 = "<span class=\"k2b-field__required\" aria-hidden=\"true\">*</span>",
|
|
11
|
+
_tmpl$5 = ["<span", " class=\"k2b-switch__label\">", "", "</span>"];
|
|
12
|
+
import { Show, splitProps } from "solid-js";
|
|
13
|
+
import { createFieldMeta, fieldControlAria } from "../internal/field";
|
|
14
|
+
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
15
|
+
export function Switch(props) {
|
|
16
|
+
const [local, rest] = splitProps(props, ["label", "onValueChange", "onValueCommit", "value"]);
|
|
17
|
+
const meta = createFieldMeta(props.id);
|
|
18
|
+
const checked = () => resolveMaybeAccessor(local.value) ?? false;
|
|
19
|
+
const error = () => resolveMaybeAccessor(props.error);
|
|
20
|
+
return _$ssr(_tmpl$3, `k2b-switch-field ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-disabled", rest.disabled ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false), _$ssrElement("input", _$mergeProps({
|
|
21
|
+
get id() {
|
|
22
|
+
return meta.controlId;
|
|
23
|
+
},
|
|
24
|
+
get name() {
|
|
25
|
+
return props.name;
|
|
26
|
+
},
|
|
27
|
+
type: "checkbox",
|
|
28
|
+
role: "switch",
|
|
29
|
+
get checked() {
|
|
30
|
+
return checked();
|
|
31
|
+
},
|
|
32
|
+
get disabled() {
|
|
33
|
+
return rest.disabled;
|
|
34
|
+
},
|
|
35
|
+
get required() {
|
|
36
|
+
return rest.required;
|
|
37
|
+
}
|
|
38
|
+
}, () => fieldControlAria(meta, props)), undefined, false), local.label && _$ssr(_tmpl$5, _$ssrAttribute("id", _$escape(meta.labelId, true), false), _$escape(local.label), _$escape(_$createComponent(Show, {
|
|
39
|
+
get when() {
|
|
40
|
+
return rest.required;
|
|
41
|
+
},
|
|
42
|
+
get children() {
|
|
43
|
+
return _$ssr(_tmpl$4);
|
|
44
|
+
}
|
|
45
|
+
}))), _$escape(_$createComponent(Show, {
|
|
46
|
+
get when() {
|
|
47
|
+
return props.description;
|
|
48
|
+
},
|
|
49
|
+
get children() {
|
|
50
|
+
return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(meta.descriptionId, true), false), _$escape(props.description));
|
|
51
|
+
}
|
|
52
|
+
})), _$escape(_$createComponent(Show, {
|
|
53
|
+
get when() {
|
|
54
|
+
return error();
|
|
55
|
+
},
|
|
56
|
+
get children() {
|
|
57
|
+
return _$ssr(_tmpl$2, _$ssrAttribute("id", _$escape(meta.errorId, true), false), _$escape(error()));
|
|
58
|
+
}
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
export default Switch;
|
|
62
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Show","splitProps","createFieldMeta","fieldControlAria","commitFieldValue","resolveMaybeAccessor","Switch","props","local","rest","meta","id","checked","value","error","_$ssr","_tmpl$3","_$escape","class","_$ssrAttribute","disabled","undefined","_$ssrElement","_$mergeProps","controlId","name","type","role","required","label","_tmpl$5","labelId","_$createComponent","when","children","_tmpl$4","description","_tmpl$","descriptionId","_tmpl$2","errorId"],"sources":["inputs/Switch.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, fieldControlAria } from \"../internal/field\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\n\nexport type SwitchProps = ValueFieldProps<boolean> & {\n name?: string;\n};\n\nexport function Switch(props: SwitchProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"label\", \"onValueChange\", \"onValueCommit\", \"value\"]);\n const meta = createFieldMeta(props.id);\n const checked = () => resolveMaybeAccessor(local.value) ?? false;\n const error = () => resolveMaybeAccessor(props.error);\n\n return (\n <div\n class={`k2b-switch-field ${props.class ?? \"\"}`}\n data-disabled={rest.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n >\n <label class=\"k2b-switch\">\n <input\n id={meta.controlId}\n name={props.name}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked()}\n disabled={rest.disabled}\n required={rest.required}\n {...fieldControlAria(meta, props)}\n onChange={(event) => commitFieldValue(local, event.currentTarget.checked)}\n />\n <span class=\"k2b-switch__track\" aria-hidden=\"true\">\n <span class=\"k2b-switch__thumb\" />\n </span>\n {local.label && (\n <span id={meta.labelId} class=\"k2b-switch__label\">\n {local.label}\n <Show when={rest.required}>\n <span class=\"k2b-field__required\" aria-hidden=\"true\">\n *\n </span>\n </Show>\n </span>\n )}\n </label>\n <Show when={props.description}>\n <span id={meta.descriptionId} class=\"k2b-field__description\">\n {props.description}\n </span>\n </Show>\n <Show when={error()}>\n <p id={meta.errorId} class=\"k2b-field__error\" role=\"alert\" aria-live=\"polite\">\n {error()}\n </p>\n </Show>\n </div>\n );\n}\n\nexport default Switch;\n"],"mappings":";;;;;;;;;;;AAAA,SAAmBA,IAAI,EAAEC,UAAU,QAAQ,UAAU;AACrD,SAASC,eAAe,EAAEC,gBAAgB,QAAQ,mBAAmB;AAErE,SAASC,gBAAgB,EAAEC,oBAAoB,QAAQ,kBAAkB;AAMzE,OAAO,SAASC,MAAMA,CAACC,KAAkB,EAAe;EACtD,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGR,UAAU,CAACM,KAAK,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;EAC7F,MAAMG,IAAI,GAAGR,eAAe,CAACK,KAAK,CAACI,EAAE,CAAC;EACtC,MAAMC,OAAO,GAAGA,CAAA,KAAMP,oBAAoB,CAACG,KAAK,CAACK,KAAK,CAAC,IAAI,KAAK;EAChE,MAAMC,KAAK,GAAGA,CAAA,KAAMT,oBAAoB,CAACE,KAAK,CAACO,KAAK,CAAC;EAErD,OAAAC,KAAA,CAAAC,OAAA,EAEW,oBAAAC,QAAA,CAAoBV,KAAK,CAACW,KAAK,IAAI,EAAE,SAAE,EAAAC,cAAA,kBAC/BV,IAAI,CAACW,QAAQ,GAAG,MAAM,GAAAH,QAAA,CAAGI,SAAS,kBAAAF,cAAA,iBACnCL,KAAK,CAAC,CAAC,GAAG,MAAM,GAAAG,QAAA,CAAGI,SAAS,iBAAAC,YAAA,UAAAC,YAAA;IAAA,IAItCZ,EAAEA,CAAA;MAAA,OAAED,IAAI,CAACc,SAAS;IAAA;IAAA,IAClBC,IAAIA,CAAA;MAAA,OAAElB,KAAK,CAACkB,IAAI;IAAA;IAChBC,IAAI,EAAC,UAAU;IACfC,IAAI,EAAC,QAAQ;IAAA,IACbf,OAAOA,CAAA;MAAA,OAAEA,OAAO,CAAC,CAAC;IAAA;IAAA,IAClBQ,QAAQA,CAAA;MAAA,OAAEX,IAAI,CAACW,QAAQ;IAAA;IAAA,IACvBQ,QAAQA,CAAA;MAAA,OAAEnB,IAAI,CAACmB,QAAQ;IAAA;EAAA,SACnBzB,gBAAgB,CAACO,IAAI,EAAEH,KAAK,CAAC,GAAAc,SAAA,UAMlCb,KAAK,CAACqB,KAAK,IAAAd,KAAA,CAAAe,OAAA,EAAAX,cAAA,OAAAF,QAAA,CACAP,IAAI,CAACqB,OAAO,iBAAAd,QAAA,CACnBT,KAAK,CAACqB,KAAK,GAAAZ,QAAA,CAAAe,iBAAA,CACXhC,IAAI;IAAA,IAACiC,IAAIA,CAAA;MAAA,OAAExB,IAAI,CAACmB,QAAQ;IAAA;IAAA,IAAAM,SAAA;MAAA,OAAAnB,KAAA,CAAAoB,OAAA;IAAA;EAAA,IAM5B,EAAAlB,QAAA,CAAAe,iBAAA,CAEFhC,IAAI;IAAA,IAACiC,IAAIA,CAAA;MAAA,OAAE1B,KAAK,CAAC6B,WAAW;IAAA;IAAA,IAAAF,SAAA;MAAA,OAAAnB,KAAA,CAAAsB,MAAA,EAAAlB,cAAA,OAAAF,QAAA,CACjBP,IAAI,CAAC4B,aAAa,iBAAArB,QAAA,CACzBV,KAAK,CAAC6B,WAAW;IAAA;EAAA,KAAAnB,QAAA,CAAAe,iBAAA,CAGrBhC,IAAI;IAAA,IAACiC,IAAIA,CAAA;MAAA,OAAEnB,KAAK,CAAC,CAAC;IAAA;IAAA,IAAAoB,SAAA;MAAA,OAAAnB,KAAA,CAAAwB,OAAA,EAAApB,cAAA,OAAAF,QAAA,CACVP,IAAI,CAAC8B,OAAO,iBAAAvB,QAAA,CAChBH,KAAK,CAAC,CAAC;IAAA;EAAA;AAKlB;AAEA,eAAeR,MAAM","ignoreList":[]}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
3
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
4
|
+
import { escape as _$escape } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<form class=\"k2b-tag-editor__form\"", "><div class=\"k2b-tag-editor__fields\">", "", "</div>", "<div class=\"k2b-tag-editor__form-actions\">", "", "</div></form>"],
|
|
6
|
+
_tmpl$2 = ["<p class=\"k2b-tag-editor__error\" role=\"alert\">", "</p>"],
|
|
7
|
+
_tmpl$3 = ["<ul class=\"k2b-tag-editor__list\">", "</ul>"],
|
|
8
|
+
_tmpl$4 = ["<div class=\"", "\"", ">", "", "</div>"],
|
|
9
|
+
_tmpl$5 = ["<p class=\"k2b-tag-editor__empty\">", "</p>"],
|
|
10
|
+
_tmpl$6 = ["<li class=\"k2b-tag-editor__row\">", "", "</li>"],
|
|
11
|
+
_tmpl$7 = "<i class=\"ti ti-pencil\" aria-hidden=\"true\"></i>",
|
|
12
|
+
_tmpl$8 = ["<span class=\"k2b-tag-editor__row-actions\">", "", "</span>"],
|
|
13
|
+
_tmpl$9 = "<i class=\"ti ti-trash\" aria-hidden=\"true\"></i>",
|
|
14
|
+
_tmpl$0 = "<i class=\"ti ti-plus\" aria-hidden=\"true\"></i>";
|
|
15
|
+
import { createEffect, createSignal, For, onCleanup, Show } from "solid-js";
|
|
16
|
+
import { Button, IconButton } from "../actions/Button";
|
|
17
|
+
import { useUiMessages } from "../intl/messages";
|
|
18
|
+
import { Tag } from "../surfaces/Tag";
|
|
19
|
+
import { ColorInput } from "./ChoiceInputs";
|
|
20
|
+
import { TextInput } from "./TextInput";
|
|
21
|
+
function EditorForm(props) {
|
|
22
|
+
const initialName = props.initial?.name ?? "";
|
|
23
|
+
const initialColor = props.initial?.color ?? props.defaultColor;
|
|
24
|
+
const [name, setName] = createSignal(initialName);
|
|
25
|
+
const [color, setColor] = createSignal(initialColor);
|
|
26
|
+
const [error, setError] = createSignal();
|
|
27
|
+
createEffect(() => props.onDirtyChange?.(name() !== initialName || color() !== initialColor));
|
|
28
|
+
onCleanup(() => props.onDirtyChange?.(false));
|
|
29
|
+
const submit = async event => {
|
|
30
|
+
event.preventDefault();
|
|
31
|
+
const normalized = name().trim();
|
|
32
|
+
if (!normalized || props.busy) return;
|
|
33
|
+
setError(undefined);
|
|
34
|
+
try {
|
|
35
|
+
await props.onSave({
|
|
36
|
+
name: normalized,
|
|
37
|
+
color: color()
|
|
38
|
+
});
|
|
39
|
+
} catch (cause) {
|
|
40
|
+
setError(cause instanceof Error ? cause.message : props.saveError);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return _$ssr(_tmpl$, _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(TextInput, {
|
|
44
|
+
get label() {
|
|
45
|
+
return props.labels.name;
|
|
46
|
+
},
|
|
47
|
+
get placeholder() {
|
|
48
|
+
return props.labels.namePlaceholder;
|
|
49
|
+
},
|
|
50
|
+
value: name,
|
|
51
|
+
onValueChange: setName,
|
|
52
|
+
get disabled() {
|
|
53
|
+
return props.busy;
|
|
54
|
+
},
|
|
55
|
+
required: true,
|
|
56
|
+
autofocus: true
|
|
57
|
+
})), _$escape(_$createComponent(ColorInput, {
|
|
58
|
+
get ["aria-label"]() {
|
|
59
|
+
return props.labels.color;
|
|
60
|
+
},
|
|
61
|
+
value: color,
|
|
62
|
+
onValueChange: setColor,
|
|
63
|
+
onValueCommit: setColor,
|
|
64
|
+
get disabled() {
|
|
65
|
+
return props.busy;
|
|
66
|
+
},
|
|
67
|
+
compact: true
|
|
68
|
+
})), _$escape(_$createComponent(Show, {
|
|
69
|
+
get when() {
|
|
70
|
+
return error();
|
|
71
|
+
},
|
|
72
|
+
children: message => _$ssr(_tmpl$2, _$escape(message()))
|
|
73
|
+
})), _$escape(_$createComponent(Button, {
|
|
74
|
+
type: "submit",
|
|
75
|
+
size: "sm",
|
|
76
|
+
get loading() {
|
|
77
|
+
return props.busy;
|
|
78
|
+
},
|
|
79
|
+
get disabled() {
|
|
80
|
+
return !name().trim();
|
|
81
|
+
},
|
|
82
|
+
get children() {
|
|
83
|
+
return props.labels.save;
|
|
84
|
+
}
|
|
85
|
+
})), _$escape(_$createComponent(Button, {
|
|
86
|
+
type: "button",
|
|
87
|
+
size: "sm",
|
|
88
|
+
variant: "ghost",
|
|
89
|
+
get disabled() {
|
|
90
|
+
return props.busy;
|
|
91
|
+
},
|
|
92
|
+
get onClick() {
|
|
93
|
+
return props.onCancel;
|
|
94
|
+
},
|
|
95
|
+
get children() {
|
|
96
|
+
return props.labels.cancel;
|
|
97
|
+
}
|
|
98
|
+
})));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Controlled tag manager. Persistence, authorization, confirmation, and toasts stay with the consumer. */
|
|
102
|
+
export function TagEditor(props) {
|
|
103
|
+
const messages = useUiMessages();
|
|
104
|
+
const [mode, setMode] = createSignal(null);
|
|
105
|
+
const [busyId, setBusyId] = createSignal(null);
|
|
106
|
+
const [rowError, setRowError] = createSignal();
|
|
107
|
+
const labels = () => ({
|
|
108
|
+
create: messages().addTag,
|
|
109
|
+
empty: messages().noTagsYet,
|
|
110
|
+
name: messages().name,
|
|
111
|
+
namePlaceholder: messages().tagName,
|
|
112
|
+
color: messages().color,
|
|
113
|
+
save: messages().save,
|
|
114
|
+
cancel: messages().cancel,
|
|
115
|
+
edit: messages().edit,
|
|
116
|
+
remove: messages().delete,
|
|
117
|
+
...props.labels
|
|
118
|
+
});
|
|
119
|
+
const defaultColor = () => props.defaultColor ?? "#6b7280";
|
|
120
|
+
const run = async (id, action) => {
|
|
121
|
+
if (busyId()) return;
|
|
122
|
+
setBusyId(id);
|
|
123
|
+
setRowError(undefined);
|
|
124
|
+
try {
|
|
125
|
+
await action();
|
|
126
|
+
setMode(null);
|
|
127
|
+
} catch (cause) {
|
|
128
|
+
setRowError({
|
|
129
|
+
id,
|
|
130
|
+
message: cause instanceof Error ? cause.message : messages().tagActionFailed
|
|
131
|
+
});
|
|
132
|
+
throw cause;
|
|
133
|
+
} finally {
|
|
134
|
+
setBusyId(null);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
return _$ssr(_tmpl$4, `k2b-tag-editor ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-disabled", props.disabled ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
138
|
+
get when() {
|
|
139
|
+
return props.items.length > 0;
|
|
140
|
+
},
|
|
141
|
+
get fallback() {
|
|
142
|
+
return _$ssr(_tmpl$5, _$escape(labels().empty));
|
|
143
|
+
},
|
|
144
|
+
get children() {
|
|
145
|
+
return _$ssr(_tmpl$3, _$escape(_$createComponent(For, {
|
|
146
|
+
get each() {
|
|
147
|
+
return props.items;
|
|
148
|
+
},
|
|
149
|
+
children: item => _$ssr(_tmpl$6, _$escape(_$createComponent(Show, {
|
|
150
|
+
get when() {
|
|
151
|
+
return mode() === item.id && props.onUpdate;
|
|
152
|
+
},
|
|
153
|
+
get fallback() {
|
|
154
|
+
return [_$createComponent(Tag, {
|
|
155
|
+
get color() {
|
|
156
|
+
return item.color;
|
|
157
|
+
},
|
|
158
|
+
get children() {
|
|
159
|
+
return item.name;
|
|
160
|
+
}
|
|
161
|
+
}), _$ssr(_tmpl$8, _$escape(_$createComponent(Show, {
|
|
162
|
+
get when() {
|
|
163
|
+
return props.onUpdate;
|
|
164
|
+
},
|
|
165
|
+
get children() {
|
|
166
|
+
return _$createComponent(IconButton, {
|
|
167
|
+
size: "xs",
|
|
168
|
+
variant: "ghost",
|
|
169
|
+
get label() {
|
|
170
|
+
return `${labels().edit} ${item.name}`;
|
|
171
|
+
},
|
|
172
|
+
get disabled() {
|
|
173
|
+
return props.disabled || Boolean(busyId());
|
|
174
|
+
},
|
|
175
|
+
onClick: () => setMode(item.id),
|
|
176
|
+
get children() {
|
|
177
|
+
return _$ssr(_tmpl$7);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
})), _$escape(_$createComponent(Show, {
|
|
182
|
+
get when() {
|
|
183
|
+
return props.onDelete;
|
|
184
|
+
},
|
|
185
|
+
children: remove => _$createComponent(IconButton, {
|
|
186
|
+
size: "xs",
|
|
187
|
+
variant: "ghost",
|
|
188
|
+
get label() {
|
|
189
|
+
return `${labels().remove} ${item.name}`;
|
|
190
|
+
},
|
|
191
|
+
get loading() {
|
|
192
|
+
return busyId() === item.id;
|
|
193
|
+
},
|
|
194
|
+
get disabled() {
|
|
195
|
+
return props.disabled || Boolean(busyId());
|
|
196
|
+
},
|
|
197
|
+
onClick: () => void run(item.id, () => remove()(item)).catch(() => undefined),
|
|
198
|
+
get children() {
|
|
199
|
+
return _$ssr(_tmpl$9);
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
})))];
|
|
203
|
+
},
|
|
204
|
+
get children() {
|
|
205
|
+
return _$createComponent(EditorForm, {
|
|
206
|
+
initial: item,
|
|
207
|
+
get labels() {
|
|
208
|
+
return labels();
|
|
209
|
+
},
|
|
210
|
+
get defaultColor() {
|
|
211
|
+
return defaultColor();
|
|
212
|
+
},
|
|
213
|
+
get busy() {
|
|
214
|
+
return busyId() === item.id;
|
|
215
|
+
},
|
|
216
|
+
get saveError() {
|
|
217
|
+
return messages().tagCouldNotBeSaved;
|
|
218
|
+
},
|
|
219
|
+
onCancel: () => setMode(null),
|
|
220
|
+
get onDirtyChange() {
|
|
221
|
+
return props.onDirtyChange;
|
|
222
|
+
},
|
|
223
|
+
onSave: value => run(item.id, () => props.onUpdate?.(item, value))
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
})), _$escape(_$createComponent(Show, {
|
|
227
|
+
get when() {
|
|
228
|
+
return rowError()?.id === item.id && mode() !== item.id ? rowError() : undefined;
|
|
229
|
+
},
|
|
230
|
+
children: error => _$ssr(_tmpl$2, _$escape(error().message))
|
|
231
|
+
})))
|
|
232
|
+
})));
|
|
233
|
+
}
|
|
234
|
+
})), _$escape(_$createComponent(Show, {
|
|
235
|
+
get when() {
|
|
236
|
+
return props.onCreate;
|
|
237
|
+
},
|
|
238
|
+
children: create => _$createComponent(Show, {
|
|
239
|
+
get when() {
|
|
240
|
+
return mode() === "create";
|
|
241
|
+
},
|
|
242
|
+
get fallback() {
|
|
243
|
+
return _$createComponent(Button, {
|
|
244
|
+
size: "xs",
|
|
245
|
+
variant: "subtle",
|
|
246
|
+
get disabled() {
|
|
247
|
+
return props.disabled || Boolean(busyId());
|
|
248
|
+
},
|
|
249
|
+
onClick: () => setMode("create"),
|
|
250
|
+
get children() {
|
|
251
|
+
return [_$ssr(_tmpl$0), labels().create];
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
},
|
|
255
|
+
get children() {
|
|
256
|
+
return _$createComponent(EditorForm, {
|
|
257
|
+
get labels() {
|
|
258
|
+
return labels();
|
|
259
|
+
},
|
|
260
|
+
get defaultColor() {
|
|
261
|
+
return defaultColor();
|
|
262
|
+
},
|
|
263
|
+
get busy() {
|
|
264
|
+
return busyId() === "create";
|
|
265
|
+
},
|
|
266
|
+
get saveError() {
|
|
267
|
+
return messages().tagCouldNotBeSaved;
|
|
268
|
+
},
|
|
269
|
+
onCancel: () => setMode(null),
|
|
270
|
+
get onDirtyChange() {
|
|
271
|
+
return props.onDirtyChange;
|
|
272
|
+
},
|
|
273
|
+
onSave: value => run("create", () => create()(value))
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
})
|
|
277
|
+
})));
|
|
278
|
+
}
|
|
279
|
+
export default TagEditor;
|
|
280
|
+
//# sourceMappingURL=TagEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEffect","createSignal","For","onCleanup","Show","Button","IconButton","useUiMessages","Tag","ColorInput","TextInput","EditorForm","props","initialName","initial","name","initialColor","color","defaultColor","setName","setColor","error","setError","onDirtyChange","submit","event","preventDefault","normalized","trim","busy","undefined","onSave","cause","Error","message","saveError","_$ssr","_tmpl$","_$ssrAttribute","_$escape","_$createComponent","label","labels","placeholder","namePlaceholder","value","onValueChange","disabled","required","autofocus","aria-label","onValueCommit","compact","when","children","_tmpl$2","type","size","loading","save","variant","onClick","onCancel","cancel","TagEditor","messages","mode","setMode","busyId","setBusyId","rowError","setRowError","create","addTag","empty","noTagsYet","tagName","edit","remove","delete","run","id","action","tagActionFailed","_tmpl$4","class","items","length","fallback","_tmpl$5","_tmpl$3","each","item","_tmpl$6","onUpdate","_tmpl$8","Boolean","_tmpl$7","onDelete","catch","_tmpl$9","tagCouldNotBeSaved","onCreate","_tmpl$0"],"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":[]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ssrElement as _$ssrElement } from "solid-js/web";
|
|
2
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
3
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
6
|
+
import { escape as _$escape } from "solid-js/web";
|
|
7
|
+
var _tmpl$ = ["<span class=\"k2b-tags-input__values\" aria-hidden=\"true\">", "</span>"],
|
|
8
|
+
_tmpl$2 = ["<div class=\"k2b-tags-input\"", "><span class=\"k2b-tags-input__icon\" aria-hidden=\"true\"><i class=\"", "\"></i><i class=\"", "\"></i></span>", "", "</div>"],
|
|
9
|
+
_tmpl$3 = ["<div", " class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"></div>"],
|
|
10
|
+
_tmpl$4 = ["<span class=\"k2b-tags-input__placeholder\">", "</span>"],
|
|
11
|
+
_tmpl$5 = ["<span class=\"k2b-tag\">", "</span>"],
|
|
12
|
+
_tmpl$6 = ["<input type=\"hidden\"", ">"];
|
|
13
|
+
import { createEffect, createSignal, createUniqueId, Show } from "solid-js";
|
|
14
|
+
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
15
|
+
import { useUiMessages } from "../intl/messages";
|
|
16
|
+
import { resolveMaybeAccessor } from "./field-contract";
|
|
17
|
+
export function TagsInput(props) {
|
|
18
|
+
const messages = useUiMessages();
|
|
19
|
+
const meta = createFieldMeta(props.id);
|
|
20
|
+
const announcementId = `k2b-tags-${createUniqueId()}`;
|
|
21
|
+
const error = () => resolveMaybeAccessor(props.error);
|
|
22
|
+
const placeholder = () => props.placeholder ?? messages().tagsPlaceholder;
|
|
23
|
+
const [focused, setFocused] = createSignal(false);
|
|
24
|
+
let focusStartValue = [];
|
|
25
|
+
const normalize = text => text.replace(/\s+/g, " ").trim();
|
|
26
|
+
const parseTags = text => {
|
|
27
|
+
const tags = [];
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const limit = props.maxTags === undefined ? Number.POSITIVE_INFINITY : Math.max(0, Math.floor(props.maxTags));
|
|
30
|
+
for (const rawTag of text.split(",")) {
|
|
31
|
+
const tag = normalize(rawTag);
|
|
32
|
+
if (!tag || seen.has(tag)) continue;
|
|
33
|
+
if (tags.length >= limit) break;
|
|
34
|
+
seen.add(tag);
|
|
35
|
+
tags.push(tag);
|
|
36
|
+
}
|
|
37
|
+
return tags;
|
|
38
|
+
};
|
|
39
|
+
const value = () => parseTags((resolveMaybeAccessor(props.value) ?? []).join(","));
|
|
40
|
+
const [draft, setDraft] = createSignal(value().join(", "));
|
|
41
|
+
createEffect(() => {
|
|
42
|
+
if (!focused()) setDraft(value().join(", "));
|
|
43
|
+
});
|
|
44
|
+
const announce = (previous, next) => {
|
|
45
|
+
const previousTags = new Set(previous);
|
|
46
|
+
const nextTags = new Set(next);
|
|
47
|
+
const added = next.filter(tag => !previousTags.has(tag));
|
|
48
|
+
const removed = previous.filter(tag => !nextTags.has(tag));
|
|
49
|
+
const announcement = document.getElementById(announcementId);
|
|
50
|
+
if (announcement) {
|
|
51
|
+
announcement.textContent = [added.length ? messages().tagsAdded({
|
|
52
|
+
tags: added.join(", ")
|
|
53
|
+
}) : "", removed.length ? messages().tagsRemoved({
|
|
54
|
+
tags: removed.join(", ")
|
|
55
|
+
}) : ""].filter(Boolean).join(" ");
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return _$createComponent(Field, {
|
|
59
|
+
get ["class"]() {
|
|
60
|
+
return props.class;
|
|
61
|
+
},
|
|
62
|
+
get label() {
|
|
63
|
+
return props.label;
|
|
64
|
+
},
|
|
65
|
+
get description() {
|
|
66
|
+
return props.description;
|
|
67
|
+
},
|
|
68
|
+
get error() {
|
|
69
|
+
return error();
|
|
70
|
+
},
|
|
71
|
+
meta: meta,
|
|
72
|
+
labelFor: false,
|
|
73
|
+
get required() {
|
|
74
|
+
return props.required;
|
|
75
|
+
},
|
|
76
|
+
get disabled() {
|
|
77
|
+
return props.disabled;
|
|
78
|
+
},
|
|
79
|
+
get children() {
|
|
80
|
+
return [_$ssr(_tmpl$2, _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-disabled", props.disabled ? "true" : _$escape(undefined, true), false), `${_$escape(props.icon ?? "ti ti-tag", true)} k2b-tags-input__icon-idle`, `${_$escape(props.activeIcon ?? "ti ti-pencil", true)} k2b-tags-input__icon-active`, _$escape(_$createComponent(Show, {
|
|
81
|
+
get when() {
|
|
82
|
+
return !focused();
|
|
83
|
+
},
|
|
84
|
+
get children() {
|
|
85
|
+
return _$ssr(_tmpl$, _$escape(_$createComponent(Show, {
|
|
86
|
+
get when() {
|
|
87
|
+
return value().length > 0;
|
|
88
|
+
},
|
|
89
|
+
get fallback() {
|
|
90
|
+
return _$ssr(_tmpl$4, _$escape(placeholder()));
|
|
91
|
+
},
|
|
92
|
+
get children() {
|
|
93
|
+
return value().map(tag => _$ssr(_tmpl$5, _$escape(tag)));
|
|
94
|
+
}
|
|
95
|
+
})));
|
|
96
|
+
}
|
|
97
|
+
})), _$ssrElement("input", _$mergeProps({
|
|
98
|
+
get id() {
|
|
99
|
+
return meta.controlId;
|
|
100
|
+
},
|
|
101
|
+
type: "text"
|
|
102
|
+
}, () => fieldControlAria(meta, props), {
|
|
103
|
+
get disabled() {
|
|
104
|
+
return props.disabled;
|
|
105
|
+
},
|
|
106
|
+
get placeholder() {
|
|
107
|
+
return focused() || value().length === 0 ? placeholder() : undefined;
|
|
108
|
+
},
|
|
109
|
+
get value() {
|
|
110
|
+
return draft();
|
|
111
|
+
}
|
|
112
|
+
}), undefined, false)), _$createComponent(Show, {
|
|
113
|
+
get when() {
|
|
114
|
+
return props.name;
|
|
115
|
+
},
|
|
116
|
+
children: name => _$ssr(_tmpl$6, _$ssrAttribute("name", _$escape(name(), true), false) + _$ssrAttribute("value", _$escape(value().join(","), true), false))
|
|
117
|
+
}), _$ssr(_tmpl$3, _$ssrAttribute("id", _$escape(announcementId, true), false))];
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
export default TagsInput;
|
|
122
|
+
//# sourceMappingURL=TagsInput.js.map
|