@alfakit/vue 0.1.1 → 0.1.6
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/CHANGELOG.md +16 -0
- package/dist/AlfakitRoot.js.map +1 -1
- package/dist/AlfakitRoot.vue.d.ts.map +1 -1
- package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionButton.js.map +1 -1
- package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
- package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionGroupMenu.js.map +1 -1
- package/dist/components/actions/ActionGroupMenu.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js +69 -65
- package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/actions/ActionModal.js.map +1 -1
- package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +221 -219
- package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ai/AiCopilot.js.map +1 -1
- package/dist/components/ai/AiCopilot.vue.d.ts +2 -0
- package/dist/components/ai/AiCopilot.vue.d.ts.map +1 -1
- package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js +7 -2
- package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js +19 -19
- package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cms/LivePreview.js.map +1 -1
- package/dist/components/cms/LivePreview.vue.d.ts.map +1 -1
- package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js +83 -83
- package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/BuilderField.js.map +1 -1
- package/dist/components/fields/BuilderField.vue.d.ts.map +1 -1
- package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js +162 -157
- package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ColorPickerField.js.map +1 -1
- package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.js.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/FileUploadField.js.map +1 -1
- package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
- package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ImageEditorDialog.js.map +1 -1
- package/dist/components/fields/ImageEditorDialog.vue.d.ts.map +1 -1
- package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js +46 -46
- package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/KeyValueField.js.map +1 -1
- package/dist/components/fields/KeyValueField.vue.d.ts.map +1 -1
- package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js +66 -66
- package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/ModalTablePicker.js.map +1 -1
- package/dist/components/fields/ModalTablePicker.vue.d.ts.map +1 -1
- package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js +113 -113
- package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RepeaterField.js.map +1 -1
- package/dist/components/fields/RepeaterField.vue.d.ts.map +1 -1
- package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js +12 -12
- package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/RichEditorInput.js.map +1 -1
- package/dist/components/fields/RichEditorInput.vue.d.ts.map +1 -1
- package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js +166 -165
- package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SelectField.js.map +1 -1
- package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/SliderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.js.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/fields/item-actions.d.ts +2 -2
- package/dist/components/fields/item-actions.d.ts.map +1 -1
- package/dist/components/fields/item-actions.js +31 -31
- package/dist/components/fields/item-actions.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.js.map +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/FormBlock.js.map +1 -1
- package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
- package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/form-context.js +25 -25
- package/dist/components/form/form-context.js.map +1 -1
- package/dist/components/kanban/KanbanBoard.js.map +1 -1
- package/dist/components/kanban/KanbanBoard.vue.d.ts.map +1 -1
- package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.js.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.vue.d.ts.map +1 -1
- package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js +64 -64
- package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.js.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/SectionComponent.js.map +1 -1
- package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +23 -23
- package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/layout/TabsComponent.js.map +1 -1
- package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
- package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.js.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
- package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearch.js.map +1 -1
- package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.js.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.vue.d.ts.map +1 -1
- package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js +102 -96
- package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.js.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/TenantMenu.js.map +1 -1
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +37 -37
- package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js +11 -11
- package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/realtime/use-live-updates.d.ts.map +1 -1
- package/dist/components/realtime/use-live-updates.js +24 -23
- package/dist/components/realtime/use-live-updates.js.map +1 -1
- package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ColumnHeader.js.map +1 -1
- package/dist/components/table/ColumnHeader.vue.d.ts.map +1 -1
- package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js +55 -49
- package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ColumnManager.js.map +1 -1
- package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/ContentLayoutSort.js.map +1 -1
- package/dist/components/table/ContentLayoutSort.vue.d.ts.map +1 -1
- package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.js.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
- package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectCell.js.map +1 -1
- package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +26 -20
- package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TableCellContent.js.map +1 -1
- package/dist/components/table/TableCellContent.vue.d.ts.map +1 -1
- package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js +4 -3
- package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TablePagination.js.map +1 -1
- package/dist/components/table/TablePagination.vue.d.ts.map +1 -1
- package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js +87 -87
- package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/TextInputCell.js.map +1 -1
- package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +40 -34
- package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/table/cell-update.d.ts +6 -0
- package/dist/components/table/cell-update.d.ts.map +1 -1
- package/dist/components/table/cell-update.js.map +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/CommandAutoHighlight.js +7 -0
- package/dist/components/ui/CommandAutoHighlight.js.map +1 -0
- package/dist/components/ui/CommandAutoHighlight.vue.d.ts +21 -0
- package/dist/components/ui/CommandAutoHighlight.vue.d.ts.map +1 -0
- package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js +18 -0
- package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ui/DialogContent.js.map +1 -1
- package/dist/components/ui/DialogContent.vue.d.ts.map +1 -1
- package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js +13 -12
- package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/PopoverContent.js.map +1 -1
- package/dist/components/ui/PopoverContent.vue.d.ts.map +1 -1
- package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js +9 -8
- package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/SheetContent.js.map +1 -1
- package/dist/components/ui/SheetContent.vue.d.ts.map +1 -1
- package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js +13 -12
- package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/ui/TooltipContent.js.map +1 -1
- package/dist/components/ui/TooltipContent.vue.d.ts.map +1 -1
- package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js +9 -8
- package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components.css +347 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -26
- package/dist/context.js.map +1 -1
- package/dist/create-alfakit.d.ts.map +1 -1
- package/dist/create-alfakit.js +33 -31
- package/dist/create-alfakit.js.map +1 -1
- package/dist/eject-manifest.json +11 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +219 -217
- package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/AuthLayout.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/layouts/lazy-layouts.d.ts +10 -0
- package/dist/layouts/lazy-layouts.d.ts.map +1 -0
- package/dist/layouts/lazy-layouts.js +8 -0
- package/dist/layouts/lazy-layouts.js.map +1 -0
- package/dist/layouts/panel-layouts.d.ts +8 -0
- package/dist/layouts/panel-layouts.d.ts.map +1 -0
- package/dist/layouts/panel-layouts.js +15 -0
- package/dist/layouts/panel-layouts.js.map +1 -0
- package/dist/lib/lazy.d.ts.map +1 -1
- package/dist/lib/lazy.js +2 -2
- package/dist/lib/lazy.js.map +1 -1
- package/dist/pages/PageShell.js.map +1 -1
- package/dist/pages/PageShell.vue.d.ts.map +1 -1
- package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js +39 -42
- package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/AlfakitComponent.js.map +1 -1
- package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +56 -52
- package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone/AlfakitToaster.js.map +1 -1
- package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
- package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/standalone.css +54 -0
- package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts +2 -2
- package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +17 -12
- package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/dashboard-widgets.d.ts +54 -0
- package/dist/starter-kit/dashboard-widgets.d.ts.map +1 -0
- package/dist/starter-kit/dashboard-widgets.js +54 -0
- package/dist/starter-kit/dashboard-widgets.js.map +1 -0
- package/dist/starter-kit/index.d.ts +2 -1
- package/dist/starter-kit/index.d.ts.map +1 -1
- package/dist/starter-kit/index.js +5 -4
- package/dist/starter-kit/runtime.d.ts +6 -0
- package/dist/starter-kit/runtime.d.ts.map +1 -1
- package/dist/starter-kit/runtime.js +19 -15
- package/dist/starter-kit/runtime.js.map +1 -1
- package/dist/starter-kit/starter-kit.d.ts.map +1 -1
- package/dist/starter-kit/starter-kit.js +8 -8
- package/dist/starter-kit/starter-kit.js.map +1 -1
- package/dist/starter-kit/widgets/CopilotTrigger.js +7 -0
- package/dist/starter-kit/widgets/CopilotTrigger.js.map +1 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts +12 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js +23 -0
- package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.js +7 -0
- package/dist/starter-kit/widgets/LoadedCopilot.js.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts +8 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js +7 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js.map +1 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts +8 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts.map +1 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/starter-kit/widgets/index.d.ts +40 -9
- package/dist/starter-kit/widgets/index.d.ts.map +1 -1
- package/dist/starter-kit/widgets/index.js +21 -18
- package/dist/starter-kit/widgets/index.js.map +1 -1
- package/dist/starter-kit/widgets/loaded.d.ts +10 -0
- package/dist/starter-kit/widgets/loaded.d.ts.map +1 -0
- package/dist/starter-kit/widgets/loaded.js +5 -0
- package/dist/styles.css +9 -2
- package/dist/themes.css +8 -335
- package/package.json +3 -3
- package/src/AlfakitRoot.vue +9 -1
- package/src/components/actions/ActionButton.vue +14 -6
- package/src/components/actions/ActionGroupMenu.vue +13 -1
- package/src/components/actions/ActionModal.vue +12 -1
- package/src/components/ai/AiCopilot.vue +7 -1
- package/src/components/cms/LivePreview.vue +8 -2
- package/src/components/fields/BuilderField.vue +15 -2
- package/src/components/fields/ColorPickerField.vue +1 -0
- package/src/components/fields/ComboboxSelect.vue +1 -1
- package/src/components/fields/FileUploadField.vue +14 -11
- package/src/components/fields/ImageEditorDialog.vue +7 -3
- package/src/components/fields/KeyValueField.vue +3 -2
- package/src/components/fields/ModalTablePicker.vue +7 -2
- package/src/components/fields/OneTimeCodeInputField.vue +1 -1
- package/src/components/fields/RepeaterField.vue +2 -3
- package/src/components/fields/RichEditorInput.vue +3 -0
- package/src/components/fields/SelectField.vue +4 -2
- package/src/components/fields/TableColumnHeaders.vue +6 -1
- package/src/components/fields/item-actions.ts +31 -10
- package/src/components/file-manager/FileManagerView.vue +1 -1
- package/src/components/form/FormBlock.vue +26 -1
- package/src/components/form/form-context.ts +3 -3
- package/src/components/kanban/KanbanBoard.vue +15 -3
- package/src/components/kanban/KanbanColumnHeader.vue +6 -4
- package/src/components/layout/FusedGroupComponent.vue +1 -0
- package/src/components/layout/SectionComponent.vue +10 -4
- package/src/components/layout/TabsComponent.vue +61 -5
- package/src/components/notifications/NotificationsMenu.vue +11 -0
- package/src/components/panel/GlobalSearch.vue +1 -0
- package/src/components/panel/GlobalSearchPalette.vue +2 -0
- package/src/components/panel/ShortcutKeys.vue +1 -0
- package/src/components/panel/TenantMenu.vue +2 -2
- package/src/components/realtime/use-live-updates.ts +3 -1
- package/src/components/table/ColumnHeader.vue +23 -12
- package/src/components/table/ColumnManager.vue +12 -8
- package/src/components/table/ContentLayoutSort.vue +7 -1
- package/src/components/table/GroupHeaderRow.vue +27 -0
- package/src/components/table/SelectCell.vue +5 -2
- package/src/components/table/TableCellContent.vue +4 -2
- package/src/components/table/TablePagination.vue +12 -7
- package/src/components/table/TextInputCell.vue +11 -5
- package/src/components/table/cell-update.ts +6 -0
- package/src/components/ui/CommandAutoHighlight.vue +27 -0
- package/src/components/ui/DialogContent.vue +5 -1
- package/src/components/ui/PopoverContent.vue +5 -1
- package/src/components/ui/SheetContent.vue +5 -1
- package/src/components/ui/TooltipContent.vue +5 -1
- package/src/context.ts +10 -0
- package/src/create-alfakit.ts +5 -0
- package/src/index.ts +2 -0
- package/src/layouts/lazy-layouts.ts +14 -0
- package/src/layouts/panel-layouts.ts +17 -0
- package/src/lib/lazy.ts +11 -1
- package/src/pages/PageShell.vue +5 -6
- package/src/standalone/AlfakitComponent.vue +17 -6
- package/src/standalone/AlfakitToaster.vue +12 -2
- package/src/starter-kit/AlfakitStarterKitRoot.vue +12 -3
- package/src/starter-kit/dashboard-widgets.ts +93 -0
- package/src/starter-kit/index.ts +7 -1
- package/src/starter-kit/runtime.ts +17 -1
- package/src/starter-kit/starter-kit.ts +2 -1
- package/src/starter-kit/widgets/CopilotTrigger.vue +58 -0
- package/src/starter-kit/widgets/LoadedCopilot.vue +29 -0
- package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
- package/src/starter-kit/widgets/StarterKitImpersonationBanner.vue +57 -0
- package/src/starter-kit/widgets/TenantChooser.vue +1 -1
- package/src/starter-kit/widgets/index.ts +56 -11
- package/src/starter-kit/widgets/loaded.ts +9 -0
- package/src/styles.css +9 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichEditorInput.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createElementVNode","_normalizeClass","_createElementBlock","_normalizeStyle","_createVNode","RichEditorToolbarEntries","_createCommentVNode","_Fragment","_renderList","_withModifiers","Button","RichEditorSidePanel","RichEditorSuggestions","_toDisplayString","Button_default","FieldWrapper_default","RichEditorSidePanel_default","RichEditorSuggestions_default","RichEditorToolbarEntries_default","Image","Link","Placeholder","StarterKit","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","RESIZE_HANDLE_CLASSES","RichEditorInput_vue_vue_type_script_setup_true_lang_default","imageExtension","resizable","resizableImageAttributes","resizableImageOptions","toolbarExtensions","has","names","buttons","name","extensions","TableKit","markdown","Mark","highlightMarkConfig","subscriptMarkConfig","superscriptMarkConfig","textColorMarkConfig","Extension","textAlignExtensionConfig","detailsNodeConfigs","Node","config","smallMarkConfig","leadExtensionConfig","gridNodeConfigs","props","__props","t","useT","panel","usePanel","runner","useActionRunner","useField","fileInput","ref","isMarkdown","computed","editable","disabled","readOnly","attachments","EditorAttachments","isJson","liveEditor","shallowRef","rich","useRichEditorExtensions","openPanel","sidePanel","initial","attachmentError","selectionTick","stickyTop","sticky","updateStickyTop","resolveStickyOffset","onMounted","watch","commands","toolbarCommands","tool","args","stateToContent","document","toEditorDocument","state","editorToState","instance","html","htmlToMarkdown","toolbarElements","toolbars","setToolbar","current","slot","element","attachToolbarKeyboard","editor","useEditor","linkExtensionOptions","allToolbarButtons","value","isToolbarShortcut","event","focusToolbar","cn","fieldIds","id","aria","attribute","blur","next","isEditable","hasFloatingToolbars","onScroll","onCleanup","pickImage","uploadImage","problem","fileAttachmentError","file","response","uploadTemporaryFile","panelUploadOptions","error","src","onFilePicked","accept","translate","key","fallback","runCommand","button","message","target","toggleSidePanel","insertMergeTag","tagId","currentTextColor","showTableToolbar","showsTableToolbar","floating","resolveFloatingToolbar","applyColor","setTextColor","color","close","openBlock","createBlock","unref","withCtx","createElementVNode","normalizeClass","createElementBlock","normalizeStyle","createVNode","createCommentVNode","toolbarButtonLabel","Fragment","renderList","_cache","withModifiers","$event","EraserIcon","TABLE_TOOLBAR_BUTTONS","EditorContent","blockId","floatingToolbarStyle","toDisplayString"],"sources":["../../../src/components/fields/RichEditorInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LoadedRichEditorExtensions, RichEditorPanel, RichEditorSchema } from '@alfakit/core'\nimport {\n allToolbarButtons,\n attachToolbarKeyboard,\n focusToolbar,\n isToolbarShortcut,\n detailsNodeConfigs,\n gridNodeConfigs,\n leadExtensionConfig,\n linkExtensionOptions,\n smallMarkConfig,\n EditorAttachments,\n fieldIds,\n fileAttachmentError,\n floatingToolbarStyle,\n highlightMarkConfig,\n htmlToMarkdown,\n resizableImageAttributes,\n resizableImageOptions,\n resolveFloatingToolbar,\n resolveStickyOffset,\n setTextColor,\n showsTableToolbar,\n subscriptMarkConfig,\n superscriptMarkConfig,\n TABLE_TOOLBAR_BUTTONS,\n textAlignExtensionConfig,\n textColorMarkConfig,\n toEditorDocument,\n toolbarButtonLabel,\n toolbarCommands,\n panelUploadOptions,\n uploadTemporaryFile,\n} from '@alfakit/core'\nimport { EraserIcon } from '@lucide/vue'\nimport Image from '@tiptap/extension-image'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { TableKit } from '@tiptap/extension-table'\nimport StarterKit from '@tiptap/starter-kit'\nimport {\n EditorContent,\n Extension,\n Mark,\n Node,\n useEditor,\n type Editor,\n type Extensions,\n} from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport { useActionRunner, usePanel, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Button from '../ui/Button.vue'\nimport { useRichEditorExtensions } from './rich-editor-extensions'\nimport RichEditorSidePanel from './RichEditorSidePanel.vue'\nimport RichEditorSuggestions from './RichEditorSuggestions.vue'\nimport RichEditorToolbarEntries from './RichEditorToolbarEntries.vue'\n\ntype MarkConfig = Parameters<typeof Mark.create>[0]\ntype NodeConfig = Parameters<typeof Node.create>[0]\ntype ExtensionConfig = Parameters<typeof Extension.create>[0]\n\n/**\n * Resize handles of `resizableImages()` (Tiptap's node view adds bare `data-resize-handle`\n * elements): round dots on the corners, shown on hover and while the image is selected.\n */\nconst RESIZE_HANDLE_CLASSES =\n '[&_[data-resize-handle]]:z-10 [&_[data-resize-handle]]:size-3 [&_[data-resize-handle]]:rounded-full [&_[data-resize-handle]]:border-2 [&_[data-resize-handle]]:border-background [&_[data-resize-handle]]:bg-primary [&_[data-resize-handle]]:opacity-0 [&_[data-resize-container]:hover_[data-resize-handle]]:opacity-100 [&_.ProseMirror-selectednode_[data-resize-handle]]:opacity-100 [&_[data-resize-handle=bottom-right]]:cursor-nwse-resize [&_[data-resize-handle=top-left]]:cursor-nwse-resize [&_[data-resize-handle=bottom-left]]:cursor-nesw-resize [&_[data-resize-handle=top-right]]:cursor-nesw-resize'\n\n/** The image extension, with drag handles for `resizableImages()`. */\nfunction imageExtension(resizable: boolean) {\n if (!resizable) return Image\n\n return Image.extend({\n addAttributes() {\n return resizableImageAttributes(this.parent?.() ?? {})\n },\n }).configure(resizableImageOptions())\n}\n\n/** Extensions for the extra toolbar buttons (only those the toolbar uses are loaded). */\nfunction toolbarExtensions(buttons: string[], markdown: boolean): Extensions {\n const has = (...names: string[]) => names.some((name) => buttons.includes(name))\n const extensions: Extensions = []\n\n if (has('table')) extensions.push(TableKit.configure({ table: { resizable: false } }))\n // Markdown has no syntax for these.\n if (markdown) return extensions\n\n if (has('highlight')) extensions.push(Mark.create(highlightMarkConfig() as MarkConfig))\n if (has('subscript')) extensions.push(Mark.create(subscriptMarkConfig() as MarkConfig))\n if (has('superscript')) extensions.push(Mark.create(superscriptMarkConfig() as MarkConfig))\n if (has('textColor')) extensions.push(Mark.create(textColorMarkConfig() as MarkConfig))\n if (has('alignStart', 'alignCenter', 'alignEnd', 'alignJustify')) {\n extensions.push(Extension.create(textAlignExtensionConfig() as ExtensionConfig))\n }\n if (has('details')) {\n extensions.push(...detailsNodeConfigs().map((config) => Node.create(config as NodeConfig)))\n }\n if (has('small')) extensions.push(Mark.create(smallMarkConfig() as MarkConfig))\n if (has('lead')) extensions.push(Extension.create(leadExtensionConfig() as ExtensionConfig))\n if (has('grid', 'gridDelete', 'gridAddColumnBefore', 'gridAddColumnAfter', 'gridDeleteColumn')) {\n extensions.push(...gridNodeConfigs().map((config) => Node.create(config as NodeConfig)))\n }\n\n return extensions\n}\n\nconst props = defineProps<{ component: RichEditorSchema; plugins: LoadedRichEditorExtensions }>()\nconst t = useT()\nconst panel = usePanel()\nconst runner = useActionRunner()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<unknown>(\n () => props.component,\n)\nconst fileInput = ref<HTMLInputElement | null>(null)\nconst isMarkdown = computed(() => props.component.type === 'MarkdownEditor')\nconst editable = computed(() => !disabled.value && !readOnly.value)\n// Uploaded images preview from a local URL but are stored by their `tmp:` key.\nconst attachments = new EditorAttachments()\nconst isJson = computed(() => Boolean(props.component.json) && !isMarkdown.value)\n// The editor's live instance, for the custom block node views and suggestions.\nconst liveEditor = shallowRef<Editor | undefined>()\nconst rich = useRichEditorExtensions(() => props.component, liveEditor)\n// The open toolbar panel (the text colour palette).\nconst openPanel = ref<'textColor' | null>(null)\n// The open side panel (custom blocks or merge tags).\nconst initialSidePanel = (): RichEditorPanel | null => {\n const initial = props.component.activePanel ?? null\n\n if (initial === 'customBlocks') return props.component.customBlocks?.length ? initial : null\n if (initial === 'mergeTags') return props.component.mergeTags?.length ? initial : null\n\n return null\n}\nconst sidePanel = ref<RichEditorPanel | null>(initialSidePanel())\nconst attachmentError = ref<string | null>(null)\n// Bumped on every transaction so active states and the table row follow the cursor.\nconst selectionTick = ref(0)\nconst stickyTop = ref<string | null>(null)\nconst sticky = computed(() =>\n Boolean(props.component.stickyToolbar || props.component.stickyPanels),\n)\n\nconst updateStickyTop = () => {\n stickyTop.value = sticky.value ? resolveStickyOffset(props.component.stickyOffset) : null\n}\n\nonMounted(updateStickyTop)\nwatch([sticky, () => props.component.stickyOffset], updateStickyTop)\n\n// Built-in buttons, plugin tools and commands of plugin JavaScript extensions.\nconst commands = computed(() =>\n toolbarCommands(\n props.component.editorTools,\n {\n runAction: (tool, args) =>\n tool.action\n ? runner.runField(tool.action, { ...rich.context.value, arguments: args })\n : Promise.resolve(undefined),\n editor: () => liveEditor.value ?? null,\n },\n props.plugins.commands,\n ),\n)\n\n// Field state ↔ editor content: HTML, Markdown (loaded from the server's HTML) or a\n// Tiptap JSON document. `tmp:` upload keys become local preview URLs and back.\nconst stateToContent = (state: unknown): string | Record<string, unknown> => {\n if (isJson.value) {\n const document = toEditorDocument(state)\n\n return document ? JSON.parse(attachments.toEditor(JSON.stringify(document))) : ''\n }\n\n return attachments.toEditor(\n ((isMarkdown.value\n ? typeof props.component.html === 'string'\n ? props.component.html\n : null\n : state) as string | null) ?? '',\n )\n}\nconst editorToState = (instance: Pick<Editor, 'isEmpty' | 'getJSON' | 'getHTML'>): unknown => {\n if (instance.isEmpty) return null\n if (isJson.value) return JSON.parse(attachments.toState(JSON.stringify(instance.getJSON())))\n\n const html = instance.getHTML()\n\n return attachments.toState(isMarkdown.value ? htmlToMarkdown(html) : html)\n}\n\nonBeforeUnmount(() => attachments.destroy())\n\n// Keyboard access to the toolbars (roving tabindex, arrows, Escape, Alt+F10).\ntype ToolbarSlot = 'main' | 'table' | 'floating'\nconst toolbarElements: Record<ToolbarSlot, { element: HTMLElement; detach: () => void } | null> = {\n main: null,\n table: null,\n floating: null,\n}\nconst toolbars = () => [\n toolbarElements.floating?.element,\n toolbarElements.main?.element,\n toolbarElements.table?.element,\n]\nconst setToolbar = (slot: ToolbarSlot, element: unknown) => {\n const current = toolbarElements[slot]\n\n if (current?.element === element) return\n\n current?.detach()\n toolbarElements[slot] =\n element instanceof HTMLElement\n ? {\n element,\n detach: attachToolbarKeyboard(element, {\n onEscape: () => liveEditor.value?.commands.focus(),\n toolbars,\n }),\n }\n : null\n}\n\nonBeforeUnmount(() => {\n for (const slot of ['main', 'table', 'floating'] as const) setToolbar(slot, null)\n})\n\nconst editor = useEditor({\n extensions: [\n StarterKit.configure({ link: false }),\n Link.configure(linkExtensionOptions(props.component.linkProtocols)),\n imageExtension(Boolean(props.component.resizableImages) && !isMarkdown.value),\n Placeholder.configure({ placeholder: props.component.placeholder ?? '' }),\n ...toolbarExtensions(allToolbarButtons(props.component), isMarkdown.value),\n ...(isMarkdown.value ? [] : rich.extensions),\n ...(isMarkdown.value ? [] : (props.plugins.extensions as Extensions)),\n ],\n // Markdown is loaded from the server's HTML rendering of it, never parsed as HTML.\n content: stateToContent(value.value),\n editable: editable.value,\n editorProps: {\n // The mention / merge tag popup takes the arrow, Enter, Tab and Escape keys.\n handleKeyDown: (_view, event) => {\n // Alt+F10: into the floating toolbar, else the main one.\n if (isToolbarShortcut(event)) return focusToolbar(toolbars())\n\n return liveEditor.value ? rich.suggestions.handleKeyDown(event, liveEditor.value) : false\n },\n // ProseMirror reads its DOM attributes on every view update, so they follow `aria`.\n attributes: () => ({\n class: cn(\n 'alfakit-prose min-h-32 px-3 py-2 text-sm outline-none',\n props.component.resizableImages && RESIZE_HANDLE_CLASSES,\n ),\n // Runtime sizes cannot be Tailwind classes (they would never be generated).\n ...(props.component.minHeight ? { style: `min-height: ${props.component.minHeight}px` } : {}),\n id,\n // Each paragraph follows its own script, so Arabic and English mix correctly.\n dir: 'auto',\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(props.component.label ? { 'aria-labelledby': fieldIds(id).label } : {}),\n ...Object.fromEntries(\n Object.entries(aria.value).map(([name, attribute]) => [name, String(attribute)]),\n ),\n }),\n },\n onUpdate: ({ editor: instance }) => {\n setValue(editorToState(instance))\n },\n onTransaction: ({ editor: instance }) => {\n rich.suggestions.update(instance)\n selectionTick.value++\n },\n onBlur: () => {\n rich.suggestions.close()\n blur()\n },\n})\n\nwatch(\n editor,\n (instance) => {\n liveEditor.value = instance\n },\n { immediate: true },\n)\n\n// Keep editor in sync when the server refreshes the state.\nwatch(value, (next) => {\n const instance = editor.value\n\n if (!instance) return\n\n const current = editorToState(instance)\n const same = isJson.value\n ? JSON.stringify(toEditorDocument(next)) === JSON.stringify(current)\n : (next ?? '') === (current ?? '')\n\n if (!same) {\n instance.commands.setContent(stateToContent(next), { emitUpdate: false })\n }\n})\n\nwatch(editable, (isEditable) => {\n editor.value?.setEditable(isEditable)\n})\n\n// Re-apply the editable element's attributes when the error or description changes.\nwatch(aria, () => {\n if (editor.value && !editor.value.isDestroyed) {\n editor.value.view.setProps({})\n }\n})\n\n// A floating toolbar follows its selection while the page scrolls.\nwatch(\n () => Boolean(props.component.floatingToolbars),\n (hasFloatingToolbars, _previous, onCleanup) => {\n if (!hasFloatingToolbars || typeof window === 'undefined') return\n\n const onScroll = () => selectionTick.value++\n\n window.addEventListener('scroll', onScroll, { capture: true, passive: true })\n onCleanup(() => window.removeEventListener('scroll', onScroll, { capture: true }))\n },\n { immediate: true },\n)\n\nconst pickImage = () => fileInput.value?.click()\n\nconst uploadImage = async (file: File) => {\n if (!panel.value.endpoints.upload || !editor.value) return\n\n // The server checks again when the form is saved.\n const problem = fileAttachmentError(file, props.component.fileAttachments)\n\n if (problem) {\n attachmentError.value =\n problem === 'too_large'\n ? t('form.file_too_large', {}, 'This file is too large.')\n : t('form.file_invalid_type', {}, 'This file type is not allowed.')\n\n return\n }\n\n attachmentError.value = null\n\n let response: { key: string }\n\n try {\n // Large attachments go in resumable chunks.\n response = await uploadTemporaryFile(\n panel.value.endpoints.upload,\n file,\n panelUploadOptions(panel.value, props.component.fileAttachments.uploadPolicy),\n )\n } catch (error) {\n attachmentError.value =\n (error as { errors?: Record<string, string[]> }).errors?.file?.[0] ??\n t('form.upload_failed', {}, 'The file could not be uploaded.')\n\n return\n }\n\n const src = attachments.add(response.key, file)\n\n editor.value.chain().focus().setImage({ src, alt: file.name }).run()\n}\n\nconst onFilePicked = (event: Event) => {\n const file = (event.target as HTMLInputElement).files?.[0]\n\n if (file) void uploadImage(file)\n}\n\nconst accept = computed(() =>\n (props.component.fileAttachments.acceptedFileTypes ?? ['image/*']).join(','),\n)\n\nconst translate = (key: string, fallback: string) => t(key, {}, fallback)\n\nconst runCommand = (name: string) => {\n const button = commands.value[name]\n\n if (!button || !editor.value) return\n\n button.run(editor.value, {\n // Messages arrive translated (`form.link_prompt`, `editor.grid_columns`).\n prompt: (message) => window.prompt(message),\n pickImage,\n togglePanel: (target) => {\n openPanel.value = openPanel.value === target ? null : target\n },\n t: translate,\n })\n}\n\nconst toggleSidePanel = (target: RichEditorPanel) => {\n sidePanel.value = sidePanel.value === target ? null : target\n}\n\nconst insertMergeTag = (tagId: string) => {\n editor.value\n ?.chain()\n .focus()\n .insertContent({ type: 'mergeTag', attrs: { id: tagId } })\n .run()\n}\n\nconst currentTextColor = () => {\n void selectionTick.value\n\n return editor.value?.getAttributes('textColor').color\n}\n\n// A `table` floating toolbar replaces the table row of buttons.\nconst showTableToolbar = () => {\n void selectionTick.value\n\n return Boolean(\n editor.value &&\n editable.value &&\n !props.component.floatingToolbars?.table &&\n showsTableToolbar(allToolbarButtons(props.component), editor.value),\n )\n}\n\nconst floating = computed(() => {\n void selectionTick.value\n\n return editable.value\n ? resolveFloatingToolbar(editor.value ?? null, props.component.floatingToolbars)\n : null\n})\n\nconst applyColor = (color: string | null, close = true) => {\n if (!editor.value) return\n\n setTextColor(editor.value, color)\n\n if (close) openPanel.value = null\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div\n :class=\"\n cn(\n 'border-input dark:bg-input/30 focus-within:border-ring focus-within:ring-ring/50 rounded-md border shadow-xs focus-within:ring-[3px]',\n error && 'border-destructive',\n disabled && 'opacity-60',\n )\n \"\n >\n <!-- The sticky offset is a runtime value: no Tailwind class can hold it. -->\n <div\n v-if=\"props.component.toolbarButtons.length > 0 && editor\"\n :ref=\"(element) => setToolbar('main', element)\"\n role=\"toolbar\"\n :aria-label=\"t('editor.toolbar', {}, 'Formatting')\"\n aria-keyshortcuts=\"Alt+F10\"\n data-slot=\"rich-editor-toolbar\"\n :class=\"\n cn(\n 'flex flex-wrap items-center gap-0.5 border-b p-1',\n props.component.stickyToolbar && 'bg-background sticky z-10 rounded-t-md',\n )\n \"\n :style=\"props.component.stickyToolbar ? { top: stickyTop ?? '0px' } : undefined\"\n >\n <RichEditorToolbarEntries\n :names=\"props.component.toolbarButtons\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <div\n v-if=\"editor && openPanel === 'textColor'\"\n role=\"group\"\n :aria-label=\"toolbarButtonLabel('textColor', translate)\"\n class=\"flex flex-wrap items-center gap-1 border-b p-1\"\n data-slot=\"rich-editor-text-colors\"\n >\n <!-- Palette colours are runtime values: no Tailwind class can hold them. -->\n <button\n v-for=\"color in props.component.textColors ?? []\"\n :key=\"color.value\"\n type=\"button\"\n :title=\"color.label\"\n :aria-label=\"color.label\"\n :aria-pressed=\"currentTextColor() === color.value ? 'true' : 'false'\"\n class=\"focus-visible:ring-ring/50 size-6 rounded-full border shadow-xs outline-none focus-visible:ring-[3px] aria-pressed:ring-2\"\n :style=\"{ backgroundColor: color.value }\"\n @mousedown.prevent\n @click=\"applyColor(color.value)\"\n />\n <input\n v-if=\"props.component.customTextColors\"\n type=\"color\"\n :aria-label=\"t('editor.custom_color', {}, 'Custom color')\"\n :title=\"t('editor.custom_color', {}, 'Custom color')\"\n class=\"size-6 cursor-pointer rounded border bg-transparent p-0\"\n @input=\"applyColor(($event.target as HTMLInputElement).value, false)\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :aria-label=\"t('editor.remove_color', {}, 'Remove color')\"\n :title=\"t('editor.remove_color', {}, 'Remove color')\"\n @mousedown.prevent\n @click=\"applyColor(null)\"\n >\n <EraserIcon />\n </Button>\n </div>\n <div\n v-if=\"editor && showTableToolbar()\"\n :ref=\"(element) => setToolbar('table', element)\"\n role=\"toolbar\"\n :aria-label=\"toolbarButtonLabel('table', translate)\"\n class=\"flex flex-wrap items-center gap-0.5 border-b p-1\"\n data-slot=\"rich-editor-table-toolbar\"\n >\n <RichEditorToolbarEntries\n :names=\"TABLE_TOOLBAR_BUTTONS\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <div class=\"@container\">\n <div class=\"flex flex-col-reverse @2xl:flex-row\">\n <EditorContent\n :editor=\"editor\"\n class=\"min-w-0 flex-1\"\n :style=\"\n props.component.maxHeight\n ? { maxHeight: `${props.component.maxHeight}px`, overflowY: 'auto' }\n : undefined\n \"\n />\n <RichEditorSidePanel\n v-if=\"editor && sidePanel\"\n :panel=\"sidePanel\"\n :component=\"props.component\"\n :editable=\"editable\"\n :sticky=\"props.component.stickyPanels ? (stickyTop ?? '0px') : null\"\n @insert-block=\"(blockId: string) => void rich.insertBlock(blockId)\"\n @insert-merge-tag=\"insertMergeTag\"\n @close=\"sidePanel = null\"\n />\n </div>\n </div>\n <!-- Runtime coordinates cannot be Tailwind classes. -->\n <div\n v-if=\"editor && floating && floating.buttons.length > 0\"\n :ref=\"(element) => setToolbar('floating', element)\"\n role=\"toolbar\"\n :aria-label=\"t('editor.floating_toolbar', {}, 'Selection formatting')\"\n data-slot=\"rich-editor-floating-toolbar\"\n :data-node=\"floating.node\"\n class=\"bg-popover text-popover-foreground fixed z-50 flex items-center gap-0.5 rounded-md border p-1 shadow-md\"\n :style=\"floatingToolbarStyle(floating.coords)\"\n >\n <RichEditorToolbarEntries\n :names=\"floating.buttons\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <RichEditorSuggestions\n :id=\"`${id}-suggestions`\"\n :suggestions=\"rich.suggestions\"\n :editor=\"editor\"\n />\n <p v-if=\"attachmentError\" role=\"alert\" class=\"text-destructive px-3 pb-2 text-xs\">\n {{ attachmentError }}\n </p>\n <input\n ref=\"fileInput\"\n type=\"file\"\n :accept=\"accept\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n @change=\"onFilePicked\"\n />\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RichEditorInput.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createElementVNode","_normalizeClass","_createElementBlock","_normalizeStyle","_createVNode","RichEditorToolbarEntries","_createCommentVNode","_Fragment","_renderList","_withModifiers","Button","RichEditorSidePanel","RichEditorSuggestions","_toDisplayString","Button_default","FieldWrapper_default","RichEditorSidePanel_default","RichEditorSuggestions_default","RichEditorToolbarEntries_default","Image","Link","Placeholder","StarterKit","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","RESIZE_HANDLE_CLASSES","RichEditorInput_vue_vue_type_script_setup_true_lang_default","imageExtension","resizable","resizableImageAttributes","resizableImageOptions","toolbarExtensions","has","names","buttons","name","extensions","TableKit","markdown","Mark","highlightMarkConfig","subscriptMarkConfig","superscriptMarkConfig","textColorMarkConfig","Extension","textAlignExtensionConfig","detailsNodeConfigs","Node","config","smallMarkConfig","leadExtensionConfig","gridNodeConfigs","props","__props","t","useT","panel","usePanel","runner","useActionRunner","useField","fileInput","ref","isMarkdown","computed","editable","disabled","readOnly","attachments","EditorAttachments","isJson","liveEditor","shallowRef","rich","useRichEditorExtensions","openPanel","sidePanel","initial","attachmentError","selectionTick","stickyTop","sticky","updateStickyTop","resolveStickyOffset","onMounted","watch","commands","toolbarCommands","tool","args","stateToContent","document","toEditorDocument","state","editorToState","instance","html","htmlToMarkdown","toolbarElements","toolbars","setToolbar","current","slot","element","attachToolbarKeyboard","editor","useEditor","documentNonce","linkExtensionOptions","allToolbarButtons","value","isToolbarShortcut","event","focusToolbar","cn","fieldIds","id","aria","attribute","blur","next","isEditable","hasFloatingToolbars","onScroll","onCleanup","pickImage","uploadImage","problem","fileAttachmentError","file","response","uploadTemporaryFile","panelUploadOptions","error","src","onFilePicked","accept","translate","key","fallback","runCommand","button","message","target","toggleSidePanel","insertMergeTag","tagId","currentTextColor","showTableToolbar","showsTableToolbar","floating","resolveFloatingToolbar","applyColor","setTextColor","color","close","openBlock","createBlock","unref","withCtx","createElementVNode","normalizeClass","createElementBlock","normalizeStyle","createVNode","createCommentVNode","toolbarButtonLabel","Fragment","renderList","_cache","withModifiers","$event","EraserIcon","TABLE_TOOLBAR_BUTTONS","EditorContent","blockId","floatingToolbarStyle","toDisplayString"],"sources":["../../../src/components/fields/RichEditorInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LoadedRichEditorExtensions, RichEditorPanel, RichEditorSchema } from '@alfakit/core'\nimport {\n allToolbarButtons,\n attachToolbarKeyboard,\n focusToolbar,\n isToolbarShortcut,\n detailsNodeConfigs,\n gridNodeConfigs,\n leadExtensionConfig,\n linkExtensionOptions,\n smallMarkConfig,\n EditorAttachments,\n fieldIds,\n fileAttachmentError,\n floatingToolbarStyle,\n highlightMarkConfig,\n htmlToMarkdown,\n resizableImageAttributes,\n resizableImageOptions,\n resolveFloatingToolbar,\n resolveStickyOffset,\n setTextColor,\n showsTableToolbar,\n subscriptMarkConfig,\n superscriptMarkConfig,\n TABLE_TOOLBAR_BUTTONS,\n textAlignExtensionConfig,\n textColorMarkConfig,\n toEditorDocument,\n toolbarButtonLabel,\n toolbarCommands,\n panelUploadOptions,\n uploadTemporaryFile,\n documentNonce,\n} from '@alfakit/core'\nimport { EraserIcon } from '@lucide/vue'\nimport Image from '@tiptap/extension-image'\nimport Link from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport { TableKit } from '@tiptap/extension-table'\nimport StarterKit from '@tiptap/starter-kit'\nimport {\n EditorContent,\n Extension,\n Mark,\n Node,\n useEditor,\n type Editor,\n type Extensions,\n} from '@tiptap/vue-3'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue'\nimport { useActionRunner, usePanel, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Button from '../ui/Button.vue'\nimport { useRichEditorExtensions } from './rich-editor-extensions'\nimport RichEditorSidePanel from './RichEditorSidePanel.vue'\nimport RichEditorSuggestions from './RichEditorSuggestions.vue'\nimport RichEditorToolbarEntries from './RichEditorToolbarEntries.vue'\n\ntype MarkConfig = Parameters<typeof Mark.create>[0]\ntype NodeConfig = Parameters<typeof Node.create>[0]\ntype ExtensionConfig = Parameters<typeof Extension.create>[0]\n\n/**\n * Resize handles of `resizableImages()` (Tiptap's node view adds bare `data-resize-handle`\n * elements): round dots on the corners, shown on hover and while the image is selected.\n */\nconst RESIZE_HANDLE_CLASSES =\n '[&_[data-resize-handle]]:z-10 [&_[data-resize-handle]]:size-3 [&_[data-resize-handle]]:rounded-full [&_[data-resize-handle]]:border-2 [&_[data-resize-handle]]:border-background [&_[data-resize-handle]]:bg-primary [&_[data-resize-handle]]:opacity-0 [&_[data-resize-container]:hover_[data-resize-handle]]:opacity-100 [&_.ProseMirror-selectednode_[data-resize-handle]]:opacity-100 [&_[data-resize-handle=bottom-right]]:cursor-nwse-resize [&_[data-resize-handle=top-left]]:cursor-nwse-resize [&_[data-resize-handle=bottom-left]]:cursor-nesw-resize [&_[data-resize-handle=top-right]]:cursor-nesw-resize'\n\n/** The image extension, with drag handles for `resizableImages()`. */\nfunction imageExtension(resizable: boolean) {\n if (!resizable) return Image\n\n return Image.extend({\n addAttributes() {\n return resizableImageAttributes(this.parent?.() ?? {})\n },\n }).configure(resizableImageOptions())\n}\n\n/** Extensions for the extra toolbar buttons (only those the toolbar uses are loaded). */\nfunction toolbarExtensions(buttons: string[], markdown: boolean): Extensions {\n const has = (...names: string[]) => names.some((name) => buttons.includes(name))\n const extensions: Extensions = []\n\n if (has('table')) extensions.push(TableKit.configure({ table: { resizable: false } }))\n // Markdown has no syntax for these.\n if (markdown) return extensions\n\n if (has('highlight')) extensions.push(Mark.create(highlightMarkConfig() as MarkConfig))\n if (has('subscript')) extensions.push(Mark.create(subscriptMarkConfig() as MarkConfig))\n if (has('superscript')) extensions.push(Mark.create(superscriptMarkConfig() as MarkConfig))\n if (has('textColor')) extensions.push(Mark.create(textColorMarkConfig() as MarkConfig))\n if (has('alignStart', 'alignCenter', 'alignEnd', 'alignJustify')) {\n extensions.push(Extension.create(textAlignExtensionConfig() as ExtensionConfig))\n }\n if (has('details')) {\n extensions.push(...detailsNodeConfigs().map((config) => Node.create(config as NodeConfig)))\n }\n if (has('small')) extensions.push(Mark.create(smallMarkConfig() as MarkConfig))\n if (has('lead')) extensions.push(Extension.create(leadExtensionConfig() as ExtensionConfig))\n if (has('grid', 'gridDelete', 'gridAddColumnBefore', 'gridAddColumnAfter', 'gridDeleteColumn')) {\n extensions.push(...gridNodeConfigs().map((config) => Node.create(config as NodeConfig)))\n }\n\n return extensions\n}\n\nconst props = defineProps<{ component: RichEditorSchema; plugins: LoadedRichEditorExtensions }>()\nconst t = useT()\nconst panel = usePanel()\nconst runner = useActionRunner()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<unknown>(\n () => props.component,\n)\nconst fileInput = ref<HTMLInputElement | null>(null)\nconst isMarkdown = computed(() => props.component.type === 'MarkdownEditor')\nconst editable = computed(() => !disabled.value && !readOnly.value)\n// Uploaded images preview from a local URL but are stored by their `tmp:` key.\nconst attachments = new EditorAttachments()\nconst isJson = computed(() => Boolean(props.component.json) && !isMarkdown.value)\n// The editor's live instance, for the custom block node views and suggestions.\nconst liveEditor = shallowRef<Editor | undefined>()\nconst rich = useRichEditorExtensions(() => props.component, liveEditor)\n// The open toolbar panel (the text colour palette).\nconst openPanel = ref<'textColor' | null>(null)\n// The open side panel (custom blocks or merge tags).\nconst initialSidePanel = (): RichEditorPanel | null => {\n const initial = props.component.activePanel ?? null\n\n if (initial === 'customBlocks') return props.component.customBlocks?.length ? initial : null\n if (initial === 'mergeTags') return props.component.mergeTags?.length ? initial : null\n\n return null\n}\nconst sidePanel = ref<RichEditorPanel | null>(initialSidePanel())\nconst attachmentError = ref<string | null>(null)\n// Bumped on every transaction so active states and the table row follow the cursor.\nconst selectionTick = ref(0)\nconst stickyTop = ref<string | null>(null)\nconst sticky = computed(() =>\n Boolean(props.component.stickyToolbar || props.component.stickyPanels),\n)\n\nconst updateStickyTop = () => {\n stickyTop.value = sticky.value ? resolveStickyOffset(props.component.stickyOffset) : null\n}\n\nonMounted(updateStickyTop)\nwatch([sticky, () => props.component.stickyOffset], updateStickyTop)\n\n// Built-in buttons, plugin tools and commands of plugin JavaScript extensions.\nconst commands = computed(() =>\n toolbarCommands(\n props.component.editorTools,\n {\n runAction: (tool, args) =>\n tool.action\n ? runner.runField(tool.action, { ...rich.context.value, arguments: args })\n : Promise.resolve(undefined),\n editor: () => liveEditor.value ?? null,\n },\n props.plugins.commands,\n ),\n)\n\n// Field state ↔ editor content: HTML, Markdown (loaded from the server's HTML) or a\n// Tiptap JSON document. `tmp:` upload keys become local preview URLs and back.\nconst stateToContent = (state: unknown): string | Record<string, unknown> => {\n if (isJson.value) {\n const document = toEditorDocument(state)\n\n return document ? JSON.parse(attachments.toEditor(JSON.stringify(document))) : ''\n }\n\n return attachments.toEditor(\n ((isMarkdown.value\n ? typeof props.component.html === 'string'\n ? props.component.html\n : null\n : state) as string | null) ?? '',\n )\n}\nconst editorToState = (instance: Pick<Editor, 'isEmpty' | 'getJSON' | 'getHTML'>): unknown => {\n if (instance.isEmpty) return null\n if (isJson.value) return JSON.parse(attachments.toState(JSON.stringify(instance.getJSON())))\n\n const html = instance.getHTML()\n\n return attachments.toState(isMarkdown.value ? htmlToMarkdown(html) : html)\n}\n\nonBeforeUnmount(() => attachments.destroy())\n\n// Keyboard access to the toolbars (roving tabindex, arrows, Escape, Alt+F10).\ntype ToolbarSlot = 'main' | 'table' | 'floating'\nconst toolbarElements: Record<ToolbarSlot, { element: HTMLElement; detach: () => void } | null> = {\n main: null,\n table: null,\n floating: null,\n}\nconst toolbars = () => [\n toolbarElements.floating?.element,\n toolbarElements.main?.element,\n toolbarElements.table?.element,\n]\nconst setToolbar = (slot: ToolbarSlot, element: unknown) => {\n const current = toolbarElements[slot]\n\n if (current?.element === element) return\n\n current?.detach()\n toolbarElements[slot] =\n element instanceof HTMLElement\n ? {\n element,\n detach: attachToolbarKeyboard(element, {\n onEscape: () => liveEditor.value?.commands.focus(),\n toolbars,\n }),\n }\n : null\n}\n\nonBeforeUnmount(() => {\n for (const slot of ['main', 'table', 'floating'] as const) setToolbar(slot, null)\n})\n\nconst editor = useEditor({\n // TipTap injects its base CSS; with the page's CSP nonce a nonce-based policy allows it.\n injectNonce: documentNonce(),\n extensions: [\n StarterKit.configure({ link: false }),\n Link.configure(linkExtensionOptions(props.component.linkProtocols)),\n imageExtension(Boolean(props.component.resizableImages) && !isMarkdown.value),\n Placeholder.configure({ placeholder: props.component.placeholder ?? '' }),\n ...toolbarExtensions(allToolbarButtons(props.component), isMarkdown.value),\n ...(isMarkdown.value ? [] : rich.extensions),\n ...(isMarkdown.value ? [] : (props.plugins.extensions as Extensions)),\n ],\n // Markdown is loaded from the server's HTML rendering of it, never parsed as HTML.\n content: stateToContent(value.value),\n editable: editable.value,\n editorProps: {\n // The mention / merge tag popup takes the arrow, Enter, Tab and Escape keys.\n handleKeyDown: (_view, event) => {\n // Alt+F10: into the floating toolbar, else the main one.\n if (isToolbarShortcut(event)) return focusToolbar(toolbars())\n\n return liveEditor.value ? rich.suggestions.handleKeyDown(event, liveEditor.value) : false\n },\n // ProseMirror reads its DOM attributes on every view update, so they follow `aria`.\n attributes: () => ({\n class: cn(\n 'alfakit-prose min-h-32 px-3 py-2 text-sm outline-none',\n props.component.resizableImages && RESIZE_HANDLE_CLASSES,\n ),\n // Runtime sizes cannot be Tailwind classes (they would never be generated).\n ...(props.component.minHeight ? { style: `min-height: ${props.component.minHeight}px` } : {}),\n id,\n // Each paragraph follows its own script, so Arabic and English mix correctly.\n dir: 'auto',\n role: 'textbox',\n 'aria-multiline': 'true',\n ...(props.component.label ? { 'aria-labelledby': fieldIds(id).label } : {}),\n ...Object.fromEntries(\n Object.entries(aria.value).map(([name, attribute]) => [name, String(attribute)]),\n ),\n }),\n },\n onUpdate: ({ editor: instance }) => {\n setValue(editorToState(instance))\n },\n onTransaction: ({ editor: instance }) => {\n rich.suggestions.update(instance)\n selectionTick.value++\n },\n onBlur: () => {\n rich.suggestions.close()\n blur()\n },\n})\n\nwatch(\n editor,\n (instance) => {\n liveEditor.value = instance\n },\n { immediate: true },\n)\n\n// Keep editor in sync when the server refreshes the state.\nwatch(value, (next) => {\n const instance = editor.value\n\n if (!instance) return\n\n const current = editorToState(instance)\n const same = isJson.value\n ? JSON.stringify(toEditorDocument(next)) === JSON.stringify(current)\n : (next ?? '') === (current ?? '')\n\n if (!same) {\n instance.commands.setContent(stateToContent(next), { emitUpdate: false })\n }\n})\n\nwatch(editable, (isEditable) => {\n editor.value?.setEditable(isEditable)\n})\n\n// Re-apply the editable element's attributes when the error or description changes.\nwatch(aria, () => {\n if (editor.value && !editor.value.isDestroyed) {\n editor.value.view.setProps({})\n }\n})\n\n// A floating toolbar follows its selection while the page scrolls.\nwatch(\n () => Boolean(props.component.floatingToolbars),\n (hasFloatingToolbars, _previous, onCleanup) => {\n if (!hasFloatingToolbars || typeof window === 'undefined') return\n\n const onScroll = () => selectionTick.value++\n\n window.addEventListener('scroll', onScroll, { capture: true, passive: true })\n onCleanup(() => window.removeEventListener('scroll', onScroll, { capture: true }))\n },\n { immediate: true },\n)\n\nconst pickImage = () => fileInput.value?.click()\n\nconst uploadImage = async (file: File) => {\n if (!panel.value.endpoints.upload || !editor.value) return\n\n // The server checks again when the form is saved.\n const problem = fileAttachmentError(file, props.component.fileAttachments)\n\n if (problem) {\n attachmentError.value =\n problem === 'too_large'\n ? t('form.file_too_large', {}, 'This file is too large.')\n : t('form.file_invalid_type', {}, 'This file type is not allowed.')\n\n return\n }\n\n attachmentError.value = null\n\n let response: { key: string }\n\n try {\n // Large attachments go in resumable chunks.\n response = await uploadTemporaryFile(\n panel.value.endpoints.upload,\n file,\n panelUploadOptions(panel.value, props.component.fileAttachments.uploadPolicy),\n )\n } catch (error) {\n attachmentError.value =\n (error as { errors?: Record<string, string[]> }).errors?.file?.[0] ??\n t('form.upload_failed', {}, 'The file could not be uploaded.')\n\n return\n }\n\n const src = attachments.add(response.key, file)\n\n editor.value.chain().focus().setImage({ src, alt: file.name }).run()\n}\n\nconst onFilePicked = (event: Event) => {\n const file = (event.target as HTMLInputElement).files?.[0]\n\n if (file) void uploadImage(file)\n}\n\nconst accept = computed(() =>\n (props.component.fileAttachments.acceptedFileTypes ?? ['image/*']).join(','),\n)\n\nconst translate = (key: string, fallback: string) => t(key, {}, fallback)\n\nconst runCommand = (name: string) => {\n const button = commands.value[name]\n\n if (!button || !editor.value) return\n\n button.run(editor.value, {\n // Messages arrive translated (`form.link_prompt`, `editor.grid_columns`).\n prompt: (message) => window.prompt(message),\n pickImage,\n togglePanel: (target) => {\n openPanel.value = openPanel.value === target ? null : target\n },\n t: translate,\n })\n}\n\nconst toggleSidePanel = (target: RichEditorPanel) => {\n sidePanel.value = sidePanel.value === target ? null : target\n}\n\nconst insertMergeTag = (tagId: string) => {\n editor.value\n ?.chain()\n .focus()\n .insertContent({ type: 'mergeTag', attrs: { id: tagId } })\n .run()\n}\n\nconst currentTextColor = () => {\n void selectionTick.value\n\n return editor.value?.getAttributes('textColor').color\n}\n\n// A `table` floating toolbar replaces the table row of buttons.\nconst showTableToolbar = () => {\n void selectionTick.value\n\n return Boolean(\n editor.value &&\n editable.value &&\n !props.component.floatingToolbars?.table &&\n showsTableToolbar(allToolbarButtons(props.component), editor.value),\n )\n}\n\nconst floating = computed(() => {\n void selectionTick.value\n\n return editable.value\n ? resolveFloatingToolbar(editor.value ?? null, props.component.floatingToolbars)\n : null\n})\n\nconst applyColor = (color: string | null, close = true) => {\n if (!editor.value) return\n\n setTextColor(editor.value, color)\n\n if (close) openPanel.value = null\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div\n :class=\"\n cn(\n 'border-input dark:bg-input/30 focus-within:border-ring focus-within:ring-ring/50 rounded-md border shadow-xs focus-within:ring-[3px]',\n error && 'border-destructive',\n disabled && 'opacity-60',\n )\n \"\n >\n <!-- The sticky offset is a runtime value: no Tailwind class can hold it. -->\n <div\n v-if=\"props.component.toolbarButtons.length > 0 && editor\"\n :ref=\"(element) => setToolbar('main', element)\"\n role=\"toolbar\"\n :aria-label=\"t('editor.toolbar', {}, 'Formatting')\"\n aria-keyshortcuts=\"Alt+F10\"\n data-slot=\"rich-editor-toolbar\"\n :class=\"\n cn(\n 'flex flex-wrap items-center gap-0.5 border-b p-1',\n props.component.stickyToolbar && 'bg-background sticky z-10 rounded-t-md',\n )\n \"\n :style=\"props.component.stickyToolbar ? { top: stickyTop ?? '0px' } : undefined\"\n >\n <RichEditorToolbarEntries\n :names=\"props.component.toolbarButtons\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <div\n v-if=\"editor && openPanel === 'textColor'\"\n role=\"group\"\n :aria-label=\"toolbarButtonLabel('textColor', translate)\"\n class=\"flex flex-wrap items-center gap-1 border-b p-1\"\n data-slot=\"rich-editor-text-colors\"\n >\n <!-- Palette colours are runtime values: no Tailwind class can hold them. -->\n <button\n v-for=\"color in props.component.textColors ?? []\"\n :key=\"color.value\"\n type=\"button\"\n :title=\"color.label\"\n :aria-label=\"color.label\"\n :aria-pressed=\"currentTextColor() === color.value ? 'true' : 'false'\"\n class=\"focus-visible:ring-ring/50 size-6 rounded-full border shadow-xs outline-none focus-visible:ring-[3px] aria-pressed:ring-2\"\n :style=\"{ backgroundColor: color.value }\"\n @mousedown.prevent\n @click=\"applyColor(color.value)\"\n />\n <input\n v-if=\"props.component.customTextColors\"\n type=\"color\"\n :aria-label=\"t('editor.custom_color', {}, 'Custom color')\"\n :title=\"t('editor.custom_color', {}, 'Custom color')\"\n class=\"size-6 cursor-pointer rounded border bg-transparent p-0\"\n @input=\"applyColor(($event.target as HTMLInputElement).value, false)\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :aria-label=\"t('editor.remove_color', {}, 'Remove color')\"\n :title=\"t('editor.remove_color', {}, 'Remove color')\"\n @mousedown.prevent\n @click=\"applyColor(null)\"\n >\n <EraserIcon />\n </Button>\n </div>\n <div\n v-if=\"editor && showTableToolbar()\"\n :ref=\"(element) => setToolbar('table', element)\"\n role=\"toolbar\"\n :aria-label=\"toolbarButtonLabel('table', translate)\"\n class=\"flex flex-wrap items-center gap-0.5 border-b p-1\"\n data-slot=\"rich-editor-table-toolbar\"\n >\n <RichEditorToolbarEntries\n :names=\"TABLE_TOOLBAR_BUTTONS\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <div class=\"@container\">\n <div class=\"flex flex-col-reverse @2xl:flex-row\">\n <EditorContent\n :editor=\"editor\"\n class=\"min-w-0 flex-1\"\n :style=\"\n props.component.maxHeight\n ? { maxHeight: `${props.component.maxHeight}px`, overflowY: 'auto' }\n : undefined\n \"\n />\n <RichEditorSidePanel\n v-if=\"editor && sidePanel\"\n :panel=\"sidePanel\"\n :component=\"props.component\"\n :editable=\"editable\"\n :sticky=\"props.component.stickyPanels ? (stickyTop ?? '0px') : null\"\n @insert-block=\"(blockId: string) => void rich.insertBlock(blockId)\"\n @insert-merge-tag=\"insertMergeTag\"\n @close=\"sidePanel = null\"\n />\n </div>\n </div>\n <!-- Runtime coordinates cannot be Tailwind classes. -->\n <div\n v-if=\"editor && floating && floating.buttons.length > 0\"\n :ref=\"(element) => setToolbar('floating', element)\"\n role=\"toolbar\"\n :aria-label=\"t('editor.floating_toolbar', {}, 'Selection formatting')\"\n data-slot=\"rich-editor-floating-toolbar\"\n :data-node=\"floating.node\"\n class=\"bg-popover text-popover-foreground fixed z-50 flex items-center gap-0.5 rounded-md border p-1 shadow-md\"\n :style=\"floatingToolbarStyle(floating.coords)\"\n >\n <RichEditorToolbarEntries\n :names=\"floating.buttons\"\n :component=\"props.component\"\n :editor=\"editor\"\n :editable=\"editable\"\n :commands=\"commands\"\n :tick=\"selectionTick\"\n :open-panel=\"openPanel\"\n :side-panel=\"sidePanel\"\n @run=\"runCommand\"\n @toggle-panel=\"toggleSidePanel\"\n />\n </div>\n <RichEditorSuggestions\n :id=\"`${id}-suggestions`\"\n :suggestions=\"rich.suggestions\"\n :editor=\"editor\"\n />\n <p v-if=\"attachmentError\" role=\"alert\" class=\"text-destructive px-3 pb-2 text-xs\">\n {{ attachmentError }}\n </p>\n <input\n ref=\"fileInput\"\n type=\"file\"\n :accept=\"accept\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n @change=\"onFilePicked\"\n />\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.js","names":["_sfc_main","SelectField_vue_vue_type_script_setup_true_lang_default","SelectField_default"],"sources":["../../../src/components/fields/SelectField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectSchema } from '@alfakit/core'\nimport { htmlLabelToText, isOptionGroup } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Select from '../ui/Select.vue'\nimport SelectContent from '../ui/SelectContent.vue'\nimport SelectGroup from '../ui/SelectGroup.vue'\nimport SelectItem from '../ui/SelectItem.vue'\nimport SelectLabel from '../ui/SelectLabel.vue'\nimport SelectTrigger from '../ui/SelectTrigger.vue'\nimport SelectValue from '../ui/SelectValue.vue'\nimport ComboboxSelect from './ComboboxSelect.vue'\nimport OptionLabel from './OptionLabel.vue'\nimport SelectAffixes from './SelectAffixes.vue'\n\nconst props = defineProps<{ component: SelectSchema }>()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<\n string | number | Array<string | number> | null\n>(() => props.component)\n\nconst isNative = computed(\n () => props.component.native && !props.component.multiple && !props.component.searchable,\n)\nconst isSimple = computed(() => !props.component.multiple && !props.component.searchable)\nconst current = computed(() =>\n value.value === null || value.value === undefined ? '' : String(value.value),\n)\nconst hasValue = computed(\n () => value.value !== null && value.value !== undefined && value.value !== '',\n)\nconst t = useT()\n/** Text of an option label for native `<option>`s (`allowHtml()` labels are HTML). */\nconst plainLabel = (label: string): string =>\n props.component.allowHtml ? htmlLabelToText(label) : label\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <SelectAffixes :component=\"props.component\" :error=\"error\">\n <select\n v-if=\"isNative\"\n :id=\"id\"\n :name=\"props.component.name\"\n :value=\"current\"\n :disabled=\"disabled || readOnly\"\n :required=\"props.component.required\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"border-input dark:bg-input/30 focus-visible:ring-ring/50 h-9 w-full rounded-md border bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:ring-[3px]\"\n @change=\"\n setValue(\n ($event.target as HTMLSelectElement).value === ''\n ? null\n : ($event.target as HTMLSelectElement).value,\n )\n \"\n @blur=\"blur\"\n >\n <option v-if=\"props.component.selectablePlaceholder\" value=\"\">\n {{ props.component.placeholder ?? '' }}\n </option>\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <optgroup v-if=\"isOptionGroup(option)\" :label=\"option.label\">\n <option\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n {{ plainLabel(item.label) }}\n </option>\n </optgroup>\n <option v-else :value=\"option.value\" :disabled=\"option.disabled\">\n {{ plainLabel(option.label) }}\n </option>\n </template>\n </select>\n <Select\n v-else-if=\"isSimple\"\n :model-value=\"current\"\n :disabled=\"disabled || readOnly\"\n @update:model-value=\"setValue($event === '__none__' ? null : ($event as string))\"\n >\n <SelectTrigger\n :id=\"id\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"w-full\"\n >\n <SelectValue
|
|
1
|
+
{"version":3,"file":"SelectField.js","names":["_sfc_main","SelectField_vue_vue_type_script_setup_true_lang_default","SelectField_default"],"sources":["../../../src/components/fields/SelectField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectSchema } from '@alfakit/core'\nimport { htmlLabelToText, isOptionGroup } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Select from '../ui/Select.vue'\nimport SelectContent from '../ui/SelectContent.vue'\nimport SelectGroup from '../ui/SelectGroup.vue'\nimport SelectItem from '../ui/SelectItem.vue'\nimport SelectLabel from '../ui/SelectLabel.vue'\nimport SelectTrigger from '../ui/SelectTrigger.vue'\nimport SelectValue from '../ui/SelectValue.vue'\nimport ComboboxSelect from './ComboboxSelect.vue'\nimport OptionLabel from './OptionLabel.vue'\nimport SelectAffixes from './SelectAffixes.vue'\n\nconst props = defineProps<{ component: SelectSchema }>()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<\n string | number | Array<string | number> | null\n>(() => props.component)\n\nconst isNative = computed(\n () => props.component.native && !props.component.multiple && !props.component.searchable,\n)\nconst isSimple = computed(() => !props.component.multiple && !props.component.searchable)\nconst current = computed(() =>\n value.value === null || value.value === undefined ? '' : String(value.value),\n)\nconst hasValue = computed(\n () => value.value !== null && value.value !== undefined && value.value !== '',\n)\nconst t = useT()\n/** Text of an option label for native `<option>`s (`allowHtml()` labels are HTML). */\nconst plainLabel = (label: string): string =>\n props.component.allowHtml ? htmlLabelToText(label) : label\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <SelectAffixes :component=\"props.component\" :error=\"error\">\n <select\n v-if=\"isNative\"\n :id=\"id\"\n :name=\"props.component.name\"\n :value=\"current\"\n :disabled=\"disabled || readOnly\"\n :required=\"props.component.required\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"border-input dark:bg-input/30 focus-visible:ring-ring/50 h-9 w-full rounded-md border bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:ring-[3px]\"\n @change=\"\n setValue(\n ($event.target as HTMLSelectElement).value === ''\n ? null\n : ($event.target as HTMLSelectElement).value,\n )\n \"\n @blur=\"blur\"\n >\n <option v-if=\"props.component.selectablePlaceholder\" value=\"\">\n {{ props.component.placeholder ?? t('select_option', {}, 'Select an option') }}\n </option>\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <optgroup v-if=\"isOptionGroup(option)\" :label=\"option.label\">\n <option\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n {{ plainLabel(item.label) }}\n </option>\n </optgroup>\n <option v-else :value=\"option.value\" :disabled=\"option.disabled\">\n {{ plainLabel(option.label) }}\n </option>\n </template>\n </select>\n <Select\n v-else-if=\"isSimple\"\n :model-value=\"current\"\n :disabled=\"disabled || readOnly\"\n @update:model-value=\"setValue($event === '__none__' ? null : ($event as string))\"\n >\n <SelectTrigger\n :id=\"id\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"w-full\"\n >\n <SelectValue\n :placeholder=\"props.component.placeholder ?? t('select_option', {}, 'Select an option')\"\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n v-if=\"props.component.selectablePlaceholder && hasValue\"\n value=\"__none__\"\n class=\"text-muted-foreground\"\n >{{ props.component.placeholder ?? '—' }}</SelectItem\n >\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <SelectGroup v-if=\"isOptionGroup(option)\">\n <SelectLabel>{{ option.label }}</SelectLabel>\n <SelectItem\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n <OptionLabel\n :option=\"item\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </SelectGroup>\n <SelectItem v-else :value=\"option.value\" :disabled=\"option.disabled\">\n <OptionLabel\n :option=\"option\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </template>\n <div\n v-if=\"props.component.options.length === 0\"\n data-slot=\"select-empty\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{\n props.component.noOptionsMessage ?? t('form.no_options', {}, 'No options available.')\n }}\n </div>\n </SelectContent>\n </Select>\n <ComboboxSelect\n v-else\n :id=\"id\"\n :component=\"props.component\"\n :value=\"value\"\n :set-value=\"setValue\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :error=\"error\"\n :aria=\"aria\"\n />\n </SelectAffixes>\n </FieldWrapper>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/SelectField.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SelectField.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/SelectField.vue"],"names":[],"mappings":"AAoKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAiBjD,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC;;AAuW/C,wBAMG"}
|
|
@@ -59,7 +59,7 @@ var O = [
|
|
|
59
59
|
class: "border-input dark:bg-input/30 focus-visible:ring-ring/50 h-9 w-full rounded-md border bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:ring-[3px]",
|
|
60
60
|
onChange: t[0] ||= (e) => E(I)(e.target.value === "" ? null : e.target.value),
|
|
61
61
|
onBlur: t[1] ||= (...e) => E(L) && E(L)(...e)
|
|
62
|
-
}, [P.component.selectablePlaceholder ? (C(), y("option", k, T(P.component.placeholder ?? ""), 1)) : v("", !0), (C(!0), y(h, null, w(P.component.options, (e) => (C(), y(h, { key: E(m)(e) ? e.label : e.value }, [E(m)(e) ? (C(), y("optgroup", {
|
|
62
|
+
}, [P.component.selectablePlaceholder ? (C(), y("option", k, T(P.component.placeholder ?? E(q)("select_option", {}, "Select an option")), 1)) : v("", !0), (C(!0), y(h, null, w(P.component.options, (e) => (C(), y(h, { key: E(m)(e) ? e.label : e.value }, [E(m)(e) ? (C(), y("optgroup", {
|
|
63
63
|
key: 0,
|
|
64
64
|
label: e.label
|
|
65
65
|
}, [(C(!0), y(h, null, w(e.options, (e) => (C(), y("option", {
|
|
@@ -84,7 +84,7 @@ var O = [
|
|
|
84
84
|
"aria-readonly": E(V) || void 0,
|
|
85
85
|
class: "w-full"
|
|
86
86
|
}, {
|
|
87
|
-
default: D(() => [x(u, { placeholder: P.component.placeholder ?? "" }, null, 8, ["placeholder"])]),
|
|
87
|
+
default: D(() => [x(u, { placeholder: P.component.placeholder ?? E(q)("select_option", {}, "Select an option") }, null, 8, ["placeholder"])]),
|
|
88
88
|
_: 1
|
|
89
89
|
}, 8, [
|
|
90
90
|
"id",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectField.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createVNode","SelectAffixes","_createElementBlock","_toDisplayString","_createCommentVNode","_Fragment","_renderList","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","_createTextVNode","SelectGroup","SelectLabel","OptionLabel","ComboboxSelect","FieldWrapper_default","SelectAffixes_default","Select_default","SelectContent_default","SelectGroup_default","SelectItem_default","SelectLabel_default","SelectTrigger_default","SelectValue_default","OptionLabel_default","ComboboxSelect_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","SelectField_vue_vue_type_script_setup_true_lang_default","props","__props","useField","isNative","computed","isSimple","current","value","hasValue","t","useT","plainLabel","htmlLabelToText","label","openBlock","createBlock","unref","id","error","withCtx","createVNode","createElementBlock","disabled","readOnly","aria","_cache","setValue","$event","args","blur","toDisplayString","createCommentVNode","Fragment","renderList","isOptionGroup","option","item","createTextVNode"],"sources":["../../../src/components/fields/SelectField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectSchema } from '@alfakit/core'\nimport { htmlLabelToText, isOptionGroup } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Select from '../ui/Select.vue'\nimport SelectContent from '../ui/SelectContent.vue'\nimport SelectGroup from '../ui/SelectGroup.vue'\nimport SelectItem from '../ui/SelectItem.vue'\nimport SelectLabel from '../ui/SelectLabel.vue'\nimport SelectTrigger from '../ui/SelectTrigger.vue'\nimport SelectValue from '../ui/SelectValue.vue'\nimport ComboboxSelect from './ComboboxSelect.vue'\nimport OptionLabel from './OptionLabel.vue'\nimport SelectAffixes from './SelectAffixes.vue'\n\nconst props = defineProps<{ component: SelectSchema }>()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<\n string | number | Array<string | number> | null\n>(() => props.component)\n\nconst isNative = computed(\n () => props.component.native && !props.component.multiple && !props.component.searchable,\n)\nconst isSimple = computed(() => !props.component.multiple && !props.component.searchable)\nconst current = computed(() =>\n value.value === null || value.value === undefined ? '' : String(value.value),\n)\nconst hasValue = computed(\n () => value.value !== null && value.value !== undefined && value.value !== '',\n)\nconst t = useT()\n/** Text of an option label for native `<option>`s (`allowHtml()` labels are HTML). */\nconst plainLabel = (label: string): string =>\n props.component.allowHtml ? htmlLabelToText(label) : label\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <SelectAffixes :component=\"props.component\" :error=\"error\">\n <select\n v-if=\"isNative\"\n :id=\"id\"\n :name=\"props.component.name\"\n :value=\"current\"\n :disabled=\"disabled || readOnly\"\n :required=\"props.component.required\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"border-input dark:bg-input/30 focus-visible:ring-ring/50 h-9 w-full rounded-md border bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:ring-[3px]\"\n @change=\"\n setValue(\n ($event.target as HTMLSelectElement).value === ''\n ? null\n : ($event.target as HTMLSelectElement).value,\n )\n \"\n @blur=\"blur\"\n >\n <option v-if=\"props.component.selectablePlaceholder\" value=\"\">\n {{ props.component.placeholder ?? '' }}\n </option>\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <optgroup v-if=\"isOptionGroup(option)\" :label=\"option.label\">\n <option\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n {{ plainLabel(item.label) }}\n </option>\n </optgroup>\n <option v-else :value=\"option.value\" :disabled=\"option.disabled\">\n {{ plainLabel(option.label) }}\n </option>\n </template>\n </select>\n <Select\n v-else-if=\"isSimple\"\n :model-value=\"current\"\n :disabled=\"disabled || readOnly\"\n @update:model-value=\"setValue($event === '__none__' ? null : ($event as string))\"\n >\n <SelectTrigger\n :id=\"id\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"w-full\"\n >\n <SelectValue :placeholder=\"props.component.placeholder ?? ''\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n v-if=\"props.component.selectablePlaceholder && hasValue\"\n value=\"__none__\"\n class=\"text-muted-foreground\"\n >{{ props.component.placeholder ?? '—' }}</SelectItem\n >\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <SelectGroup v-if=\"isOptionGroup(option)\">\n <SelectLabel>{{ option.label }}</SelectLabel>\n <SelectItem\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n <OptionLabel\n :option=\"item\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </SelectGroup>\n <SelectItem v-else :value=\"option.value\" :disabled=\"option.disabled\">\n <OptionLabel\n :option=\"option\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </template>\n <div\n v-if=\"props.component.options.length === 0\"\n data-slot=\"select-empty\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{\n props.component.noOptionsMessage ?? t('form.no_options', {}, 'No options available.')\n }}\n </div>\n </SelectContent>\n </Select>\n <ComboboxSelect\n v-else\n :id=\"id\"\n :component=\"props.component\"\n :value=\"value\"\n :set-value=\"setValue\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :error=\"error\"\n :aria=\"aria\"\n />\n </SelectAffixes>\n </FieldWrapper>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,IAAMwC,IAAQC,GACR,EAAE,UAAO,aAAU,SAAM,UAAO,OAAI,aAAU,aAAU,YAASC,QAE/DF,EAAM,SAAS,GAEjBG,IAAWC,QACTJ,EAAM,UAAU,UAAU,CAACA,EAAM,UAAU,YAAY,CAACA,EAAM,UAAU,UAChF,GACMK,IAAWD,QAAe,CAACJ,EAAM,UAAU,YAAY,CAACA,EAAM,UAAU,UAAU,GAClFM,IAAUF,QACdG,EAAM,UAAU,QAAQA,EAAM,UAAU,KAAA,IAAY,KAAK,OAAOA,EAAM,KAAK,CAC7E,GACMC,IAAWJ,QACTG,EAAM,UAAU,QAAQA,EAAM,UAAU,KAAA,KAAaA,EAAM,UAAU,EAC7E,GACME,IAAIC,EAAK,GAETC,KAAc,MAClBX,EAAM,UAAU,YAAYY,EAAgBC,CAAK,IAAIA;oBAIrDrD,EAAA,GAAAC,EAsHeC,GAAA;GAtHA,OAAOsC,EAAM;GAAY,YAAUrC,EAAAsD,CAAA;GAAK,OAAOtD,EAAAuD,CAAA;;GAC5D,SAAAtD,QAoHgB,CApHhBC,EAoHgBC,GAAA;IApHA,WAAWkC,EAAM;IAAY,OAAOrC,EAAAuD,CAAA;;IAClD,SAAAtD,QA0CS,CAzCDuC,EAAA,SADR3C,EAAA,GAAAO,EA0CS,UAAA;;KAxCN,IAAIJ,EAAAsD,CAAA;KACJ,MAAMjB,EAAM,UAAU;KACtB,OAAOM,EAAA;KACP,UAAU3C,EAAA2D,CAAA,KAAY3D,EAAA4D,CAAA;KACtB,UAAUvB,EAAM,UAAU;KAC1B,gBAAcrC,EAAA6D,CAAA,CAAI,CAAA;KAClB,oBAAkB7D,EAAA6D,CAAA,CAAI,CAAA;KACtB,iBAAe7D,EAAA6D,CAAA,CAAI,CAAA;KACnB,iBAAe7D,EAAA4D,CAAA,KAAY,KAAA;KAC5B,OAAM;KACL,UAAM,AAAAE,EAAA,QAAA,MAAa9D,EAAA+D,CAAA,CAAQ,CAAeC,EAAO,OAA6B,UAAK,KAAA,OAA8CA,EAAO,OAA6B,KAAA;KAOrK,QAAI,AAAAF,EAAA,QAAE,GAAAG,MAAAjE,EAAAkE,CAAA,KAAAlE,EAAAkE,CAAA,CAAA,CAAA,GAAAD,CAAA;IAEO,GAAA,CAAA5B,EAAM,UAAU,yBAA9BxC,EAAA,GAAAO,EAES,UAFT2B,GAES1B,EADJgC,EAAM,UAAU,eAAW,EAAA,GAAA,CAAA,KAAA+B,EAAA,IAAA,EAAA,IAEhCvE,EAAA,EAAA,GAAAO,EAiBWG,GAAA,MAAAC,EAhBQ6B,EAAM,UAAU,UAA1B,OACDc,EAAA,GAAAO,EAAAW,GAAA,EAAA,KAAArE,EAAAuE,CAAA,CAAa,CAACC,CAAM,IAAIA,EAAO,QAAQA,EAAO,MAAA,GAAA,CAEpCxE,EAAAuE,CAAA,CAAa,CAACC,CAAM,KAApC3E,EAAA,GAAAO,EASW,YAAA;;KAT6B,OAAOoE,EAAO;IACpD3E,GAAAA,EAAAA,EAAA,EAAA,GAAAO,EAOSG,GAAA,MAAAC,EANQgE,EAAO,UAAf,OADT3E,EAAA,GAAAO,EAOS,UAAA;KALN,KAAKqE,EAAK;KACV,OAAOA,EAAK;KACZ,UAAUA,EAAK;IAEb,GAAApE,EAAA2C,EAAWyB,EAAK,KAAK,CAAA,GAAA,GAAAxC,CAAA,EAG5BpC,GAAAA,GAAAA,EAAAA,GAAAA,GAAAA,CAAAA,MAAAA,EAAA,GAAAO,EAES,UAAA;;KAFO,OAAOoE,EAAO;KAAQ,UAAUA,EAAO;IAClD,GAAAnE,EAAA2C,EAAWwB,EAAO,KAAK,CAAA,GAAA,GAAAtC,CAAA,EAAA,GAAA,EAAA,EAKnB,GAAA,GAAA,EAAA,GAAA,IAAAJ,CAAA,KAAAY,EAAA,SADb7C,EAAA,GAAAC,EA4DSW,GAAA;;KA1DN,eAAakC,EAAA;KACb,UAAU3C,EAAA2D,CAAA,KAAY3D,EAAA4D,CAAA;KACtB,uBAAkB,AAAAE,EAAA,QAAA,MAAE9D,EAAA+D,CAAA,CAAQ,CAACC,MAAM,aAAA,OAA0BA,CAAM;;KAEpE,SAAA/D,QASgB,CAThBC,EASgBQ,GAAA;MARb,IAAIV,EAAAsD,CAAA;MACJ,gBAActD,EAAA6D,CAAA,CAAI,CAAA;MAClB,oBAAkB7D,EAAA6D,CAAA,CAAI,CAAA;MACtB,iBAAe7D,EAAA6D,CAAA,CAAI,CAAA;MACnB,iBAAe7D,EAAA4D,CAAA,KAAY,KAAA;MAC5B,OAAM;;MAEN,SAAA3D,QAAgE,CAAhEC,EAAgES,GAAA,EAAlD,aAAa0B,EAAM,UAAU,eAAW,GAAA,GAAA,MAAA,GAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;;;;;;;KAExDnC,CAAAA,GAAAA,EA2CgBU,GAAA,MAAA;MA1Cd,SAAAX,QAKC;OAJOoC,EAAM,UAAU,yBAAyBQ,EAAA,SADjDhD,EAAA,GAAAC,EAKCe,GAAA;;QAHC,OAAM;QACN,OAAM;;QACL,SAAAZ,QAAwC,CAArCa,EAAAT,EAAAgC,EAAM,UAAU,eAAW,GAAA,GAAA,CAAA,CAAA,CAAA;;;QAEjCxC,EAAA,EAAA,GAAAO,EA0BWG,GAAA,MAAAC,EAzBQ6B,EAAM,UAAU,UAA1B,OACDc,EAAA,GAAAO,EAAAW,GAAA,EAAA,KAAArE,EAAAuE,CAAA,CAAa,CAACC,CAAM,IAAIA,EAAO,QAAQA,EAAO,MAAA,GAAA,CAEjCxE,EAAAuE,CAAA,CAAa,CAACC,CAAM,KAAvC3E,EAAA,GAAAC,EAcciB,GAAA,EAAA,KAAA,EAAA,GAAA;QAbZ,SAAAd,QAA6C,CAA7CC,EAA6Cc,GAAA,MAAA;SAAhC,SAAAf,QAAkB,CAAfa,EAAAT,EAAAmE,EAAO,KAAK,GAAA,CAAA,CAAA,CAAA;;QAC5B3E,GAAAA,IAAAA,IAAAA,EAAA,EAAA,GAAAO,EAWaG,GAAA,MAAAC,EAVIgE,EAAO,UAAf,OADT3E,EAAA,GAAAC,EAWae,GAAA;SATV,KAAK4D,EAAK;SACV,OAAOA,EAAK;SACZ,UAAUA,EAAK;;SAEhB,SAAAxE,QAIE,CAJFC,EAIEe,GAAA;UAHC,QAAQwD;UACR,cAAYpC,EAAM,UAAU;UAC5B,MAAMA,EAAM,UAAU,qBAAgB;;;;;;;;;OAI7CxC,GAAAA,IAAAA,MAAAA,EAAA,GAAAC,EAMae,GAAA;;QANO,OAAO2D,EAAO;QAAQ,UAAUA,EAAO;;QACzD,SAAAvE,QAIE,CAJFC,EAIEe,GAAA;SAHS;SACR,cAAYoB,EAAM,UAAU;SAC5B,MAAMA,EAAM,UAAU,qBAAgB;;;;;;;;OAKrCA,EAAM,UAAU,QAAQ,WAAM,KADtCxC,EAAA,GAAAO,EAQM,OARN+B,GAQM9B,EAFFgC,EAAM,UAAU,oBAAoBrC,EAAA8C,CAAA,CAAC,CAAA,mBAAA,CAAA,GAAA,uBAAA,CAAA,GAAA,CAAA,KAAAsB,EAAA,IAAA,EAAA;;;;;IAK7CvE,GAAAA,GAAAA,CAAAA,eAAAA,UAAAA,CAAAA,MAAAA,EAAA,GAAAC,EAUEoB,GAAA;;KARC,IAAIlB,EAAAsD,CAAA;KACJ,WAAWjB,EAAM;KACjB,OAAOrC,EAAA4C,CAAA;KACP,aAAW5C,EAAA+D,CAAA;KACX,UAAU/D,EAAA2D,CAAA;KACV,aAAW3D,EAAA4D,CAAA;KACX,OAAO5D,EAAAuD,CAAA;KACP,MAAMvD,EAAA6D,CAAA"}
|
|
1
|
+
{"version":3,"file":"SelectField.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createVNode","SelectAffixes","_createElementBlock","_toDisplayString","_createCommentVNode","_Fragment","_renderList","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","_createTextVNode","SelectGroup","SelectLabel","OptionLabel","ComboboxSelect","FieldWrapper_default","SelectAffixes_default","Select_default","SelectContent_default","SelectGroup_default","SelectItem_default","SelectLabel_default","SelectTrigger_default","SelectValue_default","OptionLabel_default","ComboboxSelect_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","SelectField_vue_vue_type_script_setup_true_lang_default","props","__props","useField","isNative","computed","isSimple","current","value","hasValue","t","useT","plainLabel","htmlLabelToText","label","openBlock","createBlock","unref","id","error","withCtx","createVNode","createElementBlock","disabled","readOnly","aria","_cache","setValue","$event","args","blur","toDisplayString","createCommentVNode","Fragment","renderList","isOptionGroup","option","item","createTextVNode"],"sources":["../../../src/components/fields/SelectField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SelectSchema } from '@alfakit/core'\nimport { htmlLabelToText, isOptionGroup } from '@alfakit/core'\nimport { computed } from 'vue'\nimport { useT } from '../../context'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Select from '../ui/Select.vue'\nimport SelectContent from '../ui/SelectContent.vue'\nimport SelectGroup from '../ui/SelectGroup.vue'\nimport SelectItem from '../ui/SelectItem.vue'\nimport SelectLabel from '../ui/SelectLabel.vue'\nimport SelectTrigger from '../ui/SelectTrigger.vue'\nimport SelectValue from '../ui/SelectValue.vue'\nimport ComboboxSelect from './ComboboxSelect.vue'\nimport OptionLabel from './OptionLabel.vue'\nimport SelectAffixes from './SelectAffixes.vue'\n\nconst props = defineProps<{ component: SelectSchema }>()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<\n string | number | Array<string | number> | null\n>(() => props.component)\n\nconst isNative = computed(\n () => props.component.native && !props.component.multiple && !props.component.searchable,\n)\nconst isSimple = computed(() => !props.component.multiple && !props.component.searchable)\nconst current = computed(() =>\n value.value === null || value.value === undefined ? '' : String(value.value),\n)\nconst hasValue = computed(\n () => value.value !== null && value.value !== undefined && value.value !== '',\n)\nconst t = useT()\n/** Text of an option label for native `<option>`s (`allowHtml()` labels are HTML). */\nconst plainLabel = (label: string): string =>\n props.component.allowHtml ? htmlLabelToText(label) : label\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <SelectAffixes :component=\"props.component\" :error=\"error\">\n <select\n v-if=\"isNative\"\n :id=\"id\"\n :name=\"props.component.name\"\n :value=\"current\"\n :disabled=\"disabled || readOnly\"\n :required=\"props.component.required\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"border-input dark:bg-input/30 focus-visible:ring-ring/50 h-9 w-full rounded-md border bg-transparent px-3 text-sm shadow-xs outline-none focus-visible:ring-[3px]\"\n @change=\"\n setValue(\n ($event.target as HTMLSelectElement).value === ''\n ? null\n : ($event.target as HTMLSelectElement).value,\n )\n \"\n @blur=\"blur\"\n >\n <option v-if=\"props.component.selectablePlaceholder\" value=\"\">\n {{ props.component.placeholder ?? t('select_option', {}, 'Select an option') }}\n </option>\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <optgroup v-if=\"isOptionGroup(option)\" :label=\"option.label\">\n <option\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n {{ plainLabel(item.label) }}\n </option>\n </optgroup>\n <option v-else :value=\"option.value\" :disabled=\"option.disabled\">\n {{ plainLabel(option.label) }}\n </option>\n </template>\n </select>\n <Select\n v-else-if=\"isSimple\"\n :model-value=\"current\"\n :disabled=\"disabled || readOnly\"\n @update:model-value=\"setValue($event === '__none__' ? null : ($event as string))\"\n >\n <SelectTrigger\n :id=\"id\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n :aria-readonly=\"readOnly || undefined\"\n class=\"w-full\"\n >\n <SelectValue\n :placeholder=\"props.component.placeholder ?? t('select_option', {}, 'Select an option')\"\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem\n v-if=\"props.component.selectablePlaceholder && hasValue\"\n value=\"__none__\"\n class=\"text-muted-foreground\"\n >{{ props.component.placeholder ?? '—' }}</SelectItem\n >\n <template\n v-for=\"option in props.component.options\"\n :key=\"isOptionGroup(option) ? option.label : option.value\"\n >\n <SelectGroup v-if=\"isOptionGroup(option)\">\n <SelectLabel>{{ option.label }}</SelectLabel>\n <SelectItem\n v-for=\"item in option.options\"\n :key=\"item.value\"\n :value=\"item.value\"\n :disabled=\"item.disabled\"\n >\n <OptionLabel\n :option=\"item\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </SelectGroup>\n <SelectItem v-else :value=\"option.value\" :disabled=\"option.disabled\">\n <OptionLabel\n :option=\"option\"\n :allow-html=\"props.component.allowHtml\"\n :wrap=\"props.component.wrapOptionLabels !== false\"\n />\n </SelectItem>\n </template>\n <div\n v-if=\"props.component.options.length === 0\"\n data-slot=\"select-empty\"\n class=\"text-muted-foreground px-2 py-1.5 text-sm\"\n >\n {{\n props.component.noOptionsMessage ?? t('form.no_options', {}, 'No options available.')\n }}\n </div>\n </SelectContent>\n </Select>\n <ComboboxSelect\n v-else\n :id=\"id\"\n :component=\"props.component\"\n :value=\"value\"\n :set-value=\"setValue\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :error=\"error\"\n :aria=\"aria\"\n />\n </SelectAffixes>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderField.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createElementVNode","_normalizeClass","_createVNode","_createElementBlock","_Fragment","_renderList","_normalizeStyle","_toDisplayString","_createCommentVNode","FieldWrapper_default","SliderField_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panelDir","useDirection","dir","computed","sliderDirection","formatter","useFormatter","useField","values","sliderValues","value","pips","sliderPips","vertical","topToBottom","behavior","sliderBehavior","smooth","ref","primitive","sliderPrimitive","locked","disabled","readOnly","change","setValue","sliderState","sliderNextValues","next","onModelValue","sliderFromPrimitive","onCommit","sliderSnap","thumb","blur","onPointerDownCapture","target","event","track","sliderBlocksTap","fillSections","sliderFillSections","fill","format","number","thumbLabel","index","pipStyle","percent","openBlock","createBlock","unref","id","error","withCtx","createElementVNode","normalizeClass","cn","sliderHasTooltips","createVNode","SliderRoot","sliderToPrimitive","SliderTrack","createElementBlock","Fragment","renderList","section","normalizeStyle","sliderFillStyle","SliderRange","SliderThumb","fieldIds","aria","sliderShowsTooltip","toDisplayString","createCommentVNode","pip"],"sources":["../../../src/components/fields/SliderField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SliderSchema } from '@alfakit/core'\nimport {\n fieldIds,\n sliderBehavior,\n sliderBlocksTap,\n sliderDirection,\n sliderFillSections,\n sliderFillStyle,\n sliderFromPrimitive,\n sliderHasTooltips,\n sliderNextValues,\n sliderPips,\n sliderPrimitive,\n sliderShowsTooltip,\n sliderSnap,\n sliderState,\n sliderToPrimitive,\n sliderValues,\n startSliderRangeDrag,\n} from '@alfakit/core'\nimport { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport { useDirection, useFormatter, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\n\n/**\n * A slider with one thumb, or several for a range. Built on Reka Slider, which handles\n * pointer and keyboard input and mirrors itself in right-to-left layouts (`dir`). Values,\n * tooltips and pips are formatted with the panel's locale.\n */\nconst props = defineProps<{ component: SliderSchema }>()\nconst t = useT()\nconst panelDir = useDirection()\n// `rtl()` overrides the panel's direction.\nconst dir = computed(() => sliderDirection(props.component, panelDir.value))\nconst formatter = useFormatter()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<unknown>(\n () => props.component,\n)\nconst values = computed(() => sliderValues(value.value, props.component))\nconst pips = computed(() => (props.component.pips ? sliderPips(props.component) : []))\nconst vertical = computed(() => Boolean(props.component.vertical))\n// `vertical(isTopToBottom: true)`: the minimum at the top.\nconst topToBottom = computed(() => vertical.value && Boolean(props.component.topToBottom))\nconst behavior = computed(() => sliderBehavior(props.component))\n// `Behavior::SmoothSteps`: no snapping while a pointer drags a thumb.\nconst smooth = ref(false)\nconst primitive = computed(() => sliderPrimitive(props.component, smooth.value))\nconst locked = computed(() => disabled.value || readOnly.value)\n\nconst change = (next: number[]) =>\n setValue(sliderState(sliderNextValues(values.value, next, props.component), props.component))\n\nconst onModelValue = (next: number[] | undefined) => {\n if (next) change(sliderFromPrimitive(next, props.component, !smooth.value))\n}\n\nconst onCommit = () => {\n if (smooth.value) {\n smooth.value = false\n change(values.value.map((thumb) => sliderSnap(thumb, props.component)))\n }\n\n blur()\n}\n\n// Before the primitive sees the press: start a range drag, or swallow taps on the track.\nconst onPointerDownCapture = (event: PointerEvent) => {\n if (locked.value) return\n\n const target = event.target as Element\n const track = (event.currentTarget as HTMLElement).querySelector<HTMLElement>(\n '[data-slot=\"slider-track\"]',\n )\n\n if (behavior.value.has('drag') && target.closest('[data-slot=\"slider-range\"]') && track) {\n startSliderRangeDrag(event, {\n track,\n values: values.value,\n schema: props.component,\n direction: dir.value,\n vertical: vertical.value,\n topToBottom: topToBottom.value,\n onChange: (next) => setValue(sliderState(next, props.component)),\n onEnd: () => blur(),\n })\n\n return\n }\n\n if (sliderBlocksTap(target, props.component)) {\n event.stopPropagation()\n\n return\n }\n\n if (behavior.value.has('smooth-steps') && target.closest('[role=\"slider\"]')) smooth.value = true\n}\n// `fillTrack([…])`: chosen sections are drawn here; the primitive's range stays clear.\nconst fillSections = computed(() => sliderFillSections(values.value, props.component))\nconst fill = computed(\n () =>\n fillSections.value === null && (props.component.fillTrack === true || values.value.length > 1),\n)\n\nconst format = (number: number) =>\n formatter.value.number(number, {\n maximumFractionDigits: props.component.decimalPlaces ?? 10,\n minimumFractionDigits: props.component.decimalPlaces ?? 0,\n })\n\nconst thumbLabel = (index: number) => {\n if (values.value.length === 1) return undefined\n if (values.value.length === 2) {\n return index === 0 ? t('slider.minimum', {}, 'Minimum') : t('slider.maximum', {}, 'Maximum')\n }\n\n return t('slider.thumb', { number: index + 1 }, 'Value :number')\n}\n\n// Reka puts the minimum at the bottom of a vertical slider and at the inline start of a\n// horizontal one (the right in RTL).\nconst pipStyle = (percent: number) =>\n vertical.value\n ? topToBottom.value\n ? { top: `${percent}%` }\n : { bottom: `${percent}%` }\n : dir.value === 'rtl'\n ? { right: `${percent}%` }\n : { left: `${percent}%` }\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"`${id}-thumb-0`\" :error=\"error\">\n <div\n data-slot=\"slider\"\n :class=\"\n cn(\n 'px-2',\n sliderHasTooltips(props.component) && !vertical && 'pt-7',\n pips.length > 0 && 'pb-6',\n )\n \"\n @pointerdown.capture=\"onPointerDownCapture\"\n >\n <SliderRoot\n :id=\"id\"\n :dir=\"dir\"\n :min=\"primitive.min\"\n :max=\"primitive.max\"\n :step=\"primitive.step\"\n :min-steps-between-thumbs=\"\n props.component.minDifference && !primitive.nonLinear\n ? Math.round(props.component.minDifference / props.component.step)\n : 0\n \"\n :orientation=\"vertical ? 'vertical' : 'horizontal'\"\n :inverted=\"topToBottom\"\n :disabled=\"locked\"\n :model-value=\"sliderToPrimitive(values, props.component)\"\n :class=\"\n cn(\n 'relative flex touch-none items-center select-none data-[disabled]:opacity-50',\n vertical ? 'h-48 w-5 flex-col' : 'w-full',\n readOnly && 'data-[disabled]:opacity-100',\n )\n \"\n @update:model-value=\"onModelValue\"\n @value-commit=\"onCommit\"\n >\n <SliderTrack\n data-slot=\"slider-track\"\n :class=\"\n cn(\n 'bg-muted relative grow overflow-hidden rounded-full',\n vertical ? 'h-full w-1.5' : 'h-1.5 w-full',\n )\n \"\n >\n <span\n v-for=\"section in fillSections ?? []\"\n :key=\"`${section.start}-${section.end}`\"\n data-slot=\"slider-fill\"\n aria-hidden=\"true\"\n :class=\"cn('bg-primary absolute', vertical ? 'w-full' : 'h-full')\"\n :style=\"sliderFillStyle(section, { vertical, topToBottom, direction: dir })\"\n />\n <SliderRange\n data-slot=\"slider-range\"\n :class=\"\n cn(\n 'absolute',\n fill ? 'bg-primary' : 'bg-transparent',\n vertical ? 'w-full' : 'h-full',\n behavior.has('drag') && values.length > 1 && !locked && 'cursor-grab',\n )\n \"\n />\n </SliderTrack>\n <SliderThumb\n v-for=\"(thumb, index) in values\"\n :id=\"`${id}-thumb-${index}`\"\n :key=\"index\"\n :aria-label=\"thumbLabel(index)\"\n :aria-labelledby=\"\n values.length === 1 && props.component.label ? fieldIds(id).label : undefined\n \"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-valuetext=\"format(thumb)\"\n class=\"border-primary bg-background ring-ring/50 relative block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none\"\n >\n <span\n v-if=\"sliderShowsTooltip(props.component, index)\"\n aria-hidden=\"true\"\n :class=\"\n cn(\n 'bg-foreground text-background pointer-events-none absolute rounded px-1.5 py-0.5 text-xs whitespace-nowrap tabular-nums',\n vertical\n ? 'start-6 top-1/2 -translate-y-1/2'\n : 'bottom-6 left-1/2 -translate-x-1/2',\n )\n \"\n >{{ format(thumb) }}</span\n >\n </SliderThumb>\n <div\n v-if=\"pips.length > 0\"\n aria-hidden=\"true\"\n :class=\"\n cn('pointer-events-none absolute', vertical ? 'inset-y-0 start-6' : 'inset-x-0 top-4')\n \"\n >\n <span\n v-for=\"pip in pips\"\n :key=\"pip.value\"\n :style=\"pipStyle(pip.percent)\"\n :class=\"\n cn(\n 'absolute flex items-center gap-1',\n vertical\n ? cn('flex-row', topToBottom ? '-translate-y-1/2' : 'translate-y-1/2')\n : 'flex-col',\n !vertical && (dir === 'rtl' ? 'translate-x-1/2' : '-translate-x-1/2'),\n )\n \"\n >\n <span\n :class=\"\n cn(\n 'bg-border block',\n vertical ? 'h-px' : 'w-px',\n pip.labelled && !pip.small\n ? vertical\n ? 'w-2'\n : 'h-2'\n : vertical\n ? 'w-1'\n : 'h-1',\n )\n \"\n />\n <span\n v-if=\"pip.labelled\"\n :class=\"\n cn('text-muted-foreground tabular-nums', pip.small ? 'text-[0.625rem]' : 'text-xs')\n \"\n >{{ format(pip.value) }}</span\n >\n </span>\n </div>\n </SliderRoot>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SliderField.vue_vue_type_script_setup_true_lang.js","names":["useDirection","_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createElementVNode","_normalizeClass","_createVNode","_createElementBlock","_Fragment","_renderList","_normalizeStyle","_toDisplayString","_createCommentVNode","useDirection$1","FieldWrapper_default","SliderField_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panelDir","dir","computed","sliderDirection","formatter","useFormatter","useField","values","sliderValues","value","pips","sliderPips","vertical","topToBottom","behavior","sliderBehavior","smooth","ref","primitive","sliderPrimitive","locked","disabled","readOnly","change","setValue","sliderState","sliderNextValues","next","onModelValue","sliderFromPrimitive","onCommit","sliderSnap","thumb","blur","onPointerDownCapture","target","event","track","sliderBlocksTap","fillSections","sliderFillSections","fill","format","number","thumbLabel","index","pipStyle","percent","openBlock","createBlock","unref","id","error","withCtx","createElementVNode","normalizeClass","cn","sliderHasTooltips","createVNode","SliderRoot","sliderToPrimitive","SliderTrack","createElementBlock","Fragment","renderList","section","normalizeStyle","sliderFillStyle","SliderRange","SliderThumb","fieldIds","aria","sliderShowsTooltip","toDisplayString","createCommentVNode","pip"],"sources":["../../../src/components/fields/SliderField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { SliderSchema } from '@alfakit/core'\nimport {\n fieldIds,\n sliderBehavior,\n sliderBlocksTap,\n sliderDirection,\n sliderFillSections,\n sliderFillStyle,\n sliderFromPrimitive,\n sliderHasTooltips,\n sliderNextValues,\n sliderPips,\n sliderPrimitive,\n sliderShowsTooltip,\n sliderSnap,\n sliderState,\n sliderToPrimitive,\n sliderValues,\n startSliderRangeDrag,\n} from '@alfakit/core'\nimport { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'reka-ui'\nimport { computed, ref } from 'vue'\nimport { useDirection, useFormatter, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\n\n/**\n * A slider with one thumb, or several for a range. Built on Reka Slider, which handles\n * pointer and keyboard input and mirrors itself in right-to-left layouts (`dir`). Values,\n * tooltips and pips are formatted with the panel's locale.\n */\nconst props = defineProps<{ component: SliderSchema }>()\nconst t = useT()\nconst panelDir = useDirection()\n// `rtl()` overrides the panel's direction.\nconst dir = computed(() => sliderDirection(props.component, panelDir.value))\nconst formatter = useFormatter()\nconst { value, setValue, blur, error, id, disabled, readOnly, aria } = useField<unknown>(\n () => props.component,\n)\nconst values = computed(() => sliderValues(value.value, props.component))\nconst pips = computed(() => (props.component.pips ? sliderPips(props.component) : []))\nconst vertical = computed(() => Boolean(props.component.vertical))\n// `vertical(isTopToBottom: true)`: the minimum at the top.\nconst topToBottom = computed(() => vertical.value && Boolean(props.component.topToBottom))\nconst behavior = computed(() => sliderBehavior(props.component))\n// `Behavior::SmoothSteps`: no snapping while a pointer drags a thumb.\nconst smooth = ref(false)\nconst primitive = computed(() => sliderPrimitive(props.component, smooth.value))\nconst locked = computed(() => disabled.value || readOnly.value)\n\nconst change = (next: number[]) =>\n setValue(sliderState(sliderNextValues(values.value, next, props.component), props.component))\n\nconst onModelValue = (next: number[] | undefined) => {\n if (next) change(sliderFromPrimitive(next, props.component, !smooth.value))\n}\n\nconst onCommit = () => {\n if (smooth.value) {\n smooth.value = false\n change(values.value.map((thumb) => sliderSnap(thumb, props.component)))\n }\n\n blur()\n}\n\n// Before the primitive sees the press: start a range drag, or swallow taps on the track.\nconst onPointerDownCapture = (event: PointerEvent) => {\n if (locked.value) return\n\n const target = event.target as Element\n const track = (event.currentTarget as HTMLElement).querySelector<HTMLElement>(\n '[data-slot=\"slider-track\"]',\n )\n\n if (behavior.value.has('drag') && target.closest('[data-slot=\"slider-range\"]') && track) {\n startSliderRangeDrag(event, {\n track,\n values: values.value,\n schema: props.component,\n direction: dir.value,\n vertical: vertical.value,\n topToBottom: topToBottom.value,\n onChange: (next) => setValue(sliderState(next, props.component)),\n onEnd: () => blur(),\n })\n\n return\n }\n\n if (sliderBlocksTap(target, props.component)) {\n event.stopPropagation()\n\n return\n }\n\n if (behavior.value.has('smooth-steps') && target.closest('[role=\"slider\"]')) smooth.value = true\n}\n// `fillTrack([…])`: chosen sections are drawn here; the primitive's range stays clear.\nconst fillSections = computed(() => sliderFillSections(values.value, props.component))\nconst fill = computed(\n () =>\n fillSections.value === null && (props.component.fillTrack === true || values.value.length > 1),\n)\n\nconst format = (number: number) =>\n formatter.value.number(number, {\n maximumFractionDigits: props.component.decimalPlaces ?? 10,\n minimumFractionDigits: props.component.decimalPlaces ?? 0,\n })\n\nconst thumbLabel = (index: number) => {\n if (values.value.length === 1) return undefined\n if (values.value.length === 2) {\n return index === 0 ? t('slider.minimum', {}, 'Minimum') : t('slider.maximum', {}, 'Maximum')\n }\n\n return t('slider.thumb', { number: index + 1 }, 'Value :number')\n}\n\n// Reka puts the minimum at the bottom of a vertical slider and at the inline start of a\n// horizontal one (the right in RTL).\nconst pipStyle = (percent: number) =>\n vertical.value\n ? topToBottom.value\n ? { top: `${percent}%` }\n : { bottom: `${percent}%` }\n : dir.value === 'rtl'\n ? { right: `${percent}%` }\n : { left: `${percent}%` }\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"`${id}-thumb-0`\" :error=\"error\">\n <div\n data-slot=\"slider\"\n :class=\"\n cn(\n 'px-2',\n sliderHasTooltips(props.component) && !vertical && 'pt-7',\n pips.length > 0 && 'pb-6',\n )\n \"\n @pointerdown.capture=\"onPointerDownCapture\"\n >\n <SliderRoot\n :id=\"id\"\n :dir=\"dir\"\n :min=\"primitive.min\"\n :max=\"primitive.max\"\n :step=\"primitive.step\"\n :min-steps-between-thumbs=\"\n props.component.minDifference && !primitive.nonLinear\n ? Math.round(props.component.minDifference / props.component.step)\n : 0\n \"\n :orientation=\"vertical ? 'vertical' : 'horizontal'\"\n :inverted=\"topToBottom\"\n :disabled=\"locked\"\n :model-value=\"sliderToPrimitive(values, props.component)\"\n :class=\"\n cn(\n 'relative flex touch-none items-center select-none data-[disabled]:opacity-50',\n vertical ? 'h-48 w-5 flex-col' : 'w-full',\n readOnly && 'data-[disabled]:opacity-100',\n )\n \"\n @update:model-value=\"onModelValue\"\n @value-commit=\"onCommit\"\n >\n <SliderTrack\n data-slot=\"slider-track\"\n :class=\"\n cn(\n 'bg-muted relative grow overflow-hidden rounded-full',\n vertical ? 'h-full w-1.5' : 'h-1.5 w-full',\n )\n \"\n >\n <span\n v-for=\"section in fillSections ?? []\"\n :key=\"`${section.start}-${section.end}`\"\n data-slot=\"slider-fill\"\n aria-hidden=\"true\"\n :class=\"cn('bg-primary absolute', vertical ? 'w-full' : 'h-full')\"\n :style=\"sliderFillStyle(section, { vertical, topToBottom, direction: dir })\"\n />\n <SliderRange\n data-slot=\"slider-range\"\n :class=\"\n cn(\n 'absolute',\n fill ? 'bg-primary' : 'bg-transparent',\n vertical ? 'w-full' : 'h-full',\n behavior.has('drag') && values.length > 1 && !locked && 'cursor-grab',\n )\n \"\n />\n </SliderTrack>\n <SliderThumb\n v-for=\"(thumb, index) in values\"\n :id=\"`${id}-thumb-${index}`\"\n :key=\"index\"\n :aria-label=\"thumbLabel(index)\"\n :aria-labelledby=\"\n values.length === 1 && props.component.label ? fieldIds(id).label : undefined\n \"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-valuetext=\"format(thumb)\"\n class=\"border-primary bg-background ring-ring/50 relative block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none\"\n >\n <span\n v-if=\"sliderShowsTooltip(props.component, index)\"\n aria-hidden=\"true\"\n :class=\"\n cn(\n 'bg-foreground text-background pointer-events-none absolute rounded px-1.5 py-0.5 text-xs whitespace-nowrap tabular-nums',\n vertical\n ? 'start-6 top-1/2 -translate-y-1/2'\n : 'bottom-6 left-1/2 -translate-x-1/2',\n )\n \"\n >{{ format(thumb) }}</span\n >\n </SliderThumb>\n <div\n v-if=\"pips.length > 0\"\n aria-hidden=\"true\"\n :class=\"\n cn('pointer-events-none absolute', vertical ? 'inset-y-0 start-6' : 'inset-x-0 top-4')\n \"\n >\n <span\n v-for=\"pip in pips\"\n :key=\"pip.value\"\n :style=\"pipStyle(pip.percent)\"\n :class=\"\n cn(\n 'absolute flex items-center gap-1',\n vertical\n ? cn('flex-row', topToBottom ? '-translate-y-1/2' : 'translate-y-1/2')\n : 'flex-col',\n !vertical && (dir === 'rtl' ? 'translate-x-1/2' : '-translate-x-1/2'),\n )\n \"\n >\n <span\n :class=\"\n cn(\n 'bg-border block',\n vertical ? 'h-px' : 'w-px',\n pip.labelled && !pip.small\n ? vertical\n ? 'w-2'\n : 'h-2'\n : vertical\n ? 'w-1'\n : 'h-1',\n )\n \"\n />\n <span\n v-if=\"pip.labelled\"\n :class=\"\n cn('text-muted-foreground tabular-nums', pip.small ? 'text-[0.625rem]' : 'text-xs')\n \"\n >{{ format(pip.value) }}</span\n >\n </span>\n </div>\n </SliderRoot>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnHeaders.js","names":["_sfc_main","TableColumnHeaders_vue_vue_type_script_setup_true_lang_default","TableColumnHeaders_default"],"sources":["../../../src/components/fields/TableColumnHeaders.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableColumnSchema } from '@alfakit/core'\nimport { tableColumnAlignmentClass } from '@alfakit/core'\nimport { cn } from '../../lib/utils'\n\n/** Header cells shared by the Repeater and RepeatableEntry tables. */\nconst props = defineProps<{ columns: TableColumnSchema[] }>()\n</script>\n\n<template>\n <th\n v-for=\"(column, index) in props.columns\"\n :key=\"`${column.name ?? 'column'}-${index}`\"\n scope=\"col\"\n :style=\"column.width
|
|
1
|
+
{"version":3,"file":"TableColumnHeaders.js","names":["_sfc_main","TableColumnHeaders_vue_vue_type_script_setup_true_lang_default","TableColumnHeaders_default"],"sources":["../../../src/components/fields/TableColumnHeaders.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableColumnSchema } from '@alfakit/core'\nimport { tableColumnAlignmentClass } from '@alfakit/core'\nimport { cn } from '../../lib/utils'\n\n/** Header cells shared by the Repeater and RepeatableEntry tables. */\nconst props = defineProps<{ columns: TableColumnSchema[] }>()\n\n// A fixed `width()` (`9rem`, `120px`) is also the column's minimum, so the table scrolls\n// sideways instead of squeezing its fields; percentages stay flexible.\nconst widthStyle = (width?: string | null) =>\n !width ? undefined : width.trim().endsWith('%') ? { width } : { width, minWidth: width }\n</script>\n\n<template>\n <th\n v-for=\"(column, index) in props.columns\"\n :key=\"`${column.name ?? 'column'}-${index}`\"\n scope=\"col\"\n :style=\"widthStyle(column.width)\"\n :class=\"\n cn(\n 'text-muted-foreground px-3 py-2 text-xs font-medium',\n tableColumnAlignmentClass(column),\n !column.wrapHeader && 'whitespace-nowrap',\n )\n \"\n >\n <span :class=\"cn(column.hiddenLabel && 'sr-only')\">{{ column.label }}</span\n ><span v-if=\"column.required\" class=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>\n </th>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnHeaders.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/TableColumnHeaders.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TableColumnHeaders.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/TableColumnHeaders.vue"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAItD,sEAAsE;AACtE,KAAK,WAAW,GAAG;IAAE,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC;;AA+DpD,wBAMG"}
|
|
@@ -10,11 +10,14 @@ var p = {
|
|
|
10
10
|
__name: "TableColumnHeaders",
|
|
11
11
|
props: { columns: {} },
|
|
12
12
|
setup(o) {
|
|
13
|
-
let m = o
|
|
14
|
-
|
|
13
|
+
let m = o, h = (e) => e ? e.trim().endsWith("%") ? { width: e } : {
|
|
14
|
+
width: e,
|
|
15
|
+
minWidth: e
|
|
16
|
+
} : void 0;
|
|
17
|
+
return (o, g) => (l(!0), i(n, null, u(m.columns, (n, o) => (l(), i("th", {
|
|
15
18
|
key: `${n.name ?? "column"}-${o}`,
|
|
16
19
|
scope: "col",
|
|
17
|
-
style: c(n.width
|
|
20
|
+
style: c(h(n.width)),
|
|
18
21
|
class: s(f(e)("text-muted-foreground px-3 py-2 text-xs font-medium", f(t)(n), !n.wrapHeader && "whitespace-nowrap"))
|
|
19
22
|
}, [a("span", { class: s(f(e)(n.hiddenLabel && "sr-only")) }, d(n.label), 3), n.required ? (l(), i("span", p, "*")) : r("", !0)], 6))), 128));
|
|
20
23
|
}
|
package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnHeaders.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeStyle","_normalizeClass","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","_hoisted_1","TableColumnHeaders_vue_vue_type_script_setup_true_lang_default","props","__props","openBlock","createElementBlock","Fragment","renderList","column","index","normalizeStyle","normalizeClass","unref","cn","tableColumnAlignmentClass","createElementVNode","toDisplayString","createCommentVNode"],"sources":["../../../src/components/fields/TableColumnHeaders.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableColumnSchema } from '@alfakit/core'\nimport { tableColumnAlignmentClass } from '@alfakit/core'\nimport { cn } from '../../lib/utils'\n\n/** Header cells shared by the Repeater and RepeatableEntry tables. */\nconst props = defineProps<{ columns: TableColumnSchema[] }>()\n</script>\n\n<template>\n <th\n v-for=\"(column, index) in props.columns\"\n :key=\"`${column.name ?? 'column'}-${index}`\"\n scope=\"col\"\n :style=\"column.width
|
|
1
|
+
{"version":3,"file":"TableColumnHeaders.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_renderList","_normalizeStyle","_normalizeClass","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","_hoisted_1","TableColumnHeaders_vue_vue_type_script_setup_true_lang_default","props","__props","widthStyle","width","openBlock","createElementBlock","Fragment","renderList","column","index","normalizeStyle","normalizeClass","unref","cn","tableColumnAlignmentClass","createElementVNode","toDisplayString","createCommentVNode"],"sources":["../../../src/components/fields/TableColumnHeaders.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableColumnSchema } from '@alfakit/core'\nimport { tableColumnAlignmentClass } from '@alfakit/core'\nimport { cn } from '../../lib/utils'\n\n/** Header cells shared by the Repeater and RepeatableEntry tables. */\nconst props = defineProps<{ columns: TableColumnSchema[] }>()\n\n// A fixed `width()` (`9rem`, `120px`) is also the column's minimum, so the table scrolls\n// sideways instead of squeezing its fields; percentages stay flexible.\nconst widthStyle = (width?: string | null) =>\n !width ? undefined : width.trim().endsWith('%') ? { width } : { width, minWidth: width }\n</script>\n\n<template>\n <th\n v-for=\"(column, index) in props.columns\"\n :key=\"`${column.name ?? 'column'}-${index}`\"\n scope=\"col\"\n :style=\"widthStyle(column.width)\"\n :class=\"\n cn(\n 'text-muted-foreground px-3 py-2 text-xs font-medium',\n tableColumnAlignmentClass(column),\n !column.wrapHeader && 'whitespace-nowrap',\n )\n \"\n >\n <span :class=\"cn(column.hiddenLabel && 'sr-only')\">{{ column.label }}</span\n ><span v-if=\"column.required\" class=\"text-destructive ms-0.5\" aria-hidden=\"true\">*</span>\n </th>\n</template>\n"],"mappings":";;;;;;;;;;;;EAMA,IAAMY,IAAQC,GAIRC,KAAc,MACjBC,IAAoBA,EAAM,KAAK,CAAC,CAAC,SAAS,GAAG,IAAI,EAAE,SAAM,IAAI;GAAE;GAAO,UAAUA;EAAM,IAA9E,KAAA;oBAITf,EAAA,EAAA,GAAAC,EAeKC,GAAA,MAAAC,EAduBS,EAAM,UAAxB,GAAQ,OADlBZ,EAAA,GAAAC,EAeK,MAAA;GAbF,KAAG,GAAKmB,EAAO,QAAI,SAAA,GAAgBC;GACpC,OAAM;GACL,OAAKjB,EAAEU,EAAWM,EAAO,KAAK,CAAA;GAC9B,OAAKf,EAASC,EAAAmB,CAAA,CAAE,CAAA,uDAAyEnB,EAAAoB,CAAA,CAAyB,CAACN,CAAM,GAAY,CAAAA,EAAO,cAAU,mBAAA,CAAA;EAQvJb,GAAAA,CAAAA,EACC,QAAA,EADM,OAAKF,EAAEC,EAAAmB,CAAA,CAAE,CAACL,EAAO,eAAW,SAAA,CAAA,EAAmB,GAAAZ,EAAAY,EAAO,KAAK,GAAA,CAAA,GACrDA,EAAO,YAAnBpB,EAAA,GAAAC,EAAwF,QAAxFS,GAAgF,GAAC,KAAAmB,EAAA,IAAA,EAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ActionContext, ItemActionFallback, ItemActionName, ItemActionSchema } from '@alfakit/core';
|
|
2
2
|
import { type MaybeRefOrGetter } from 'vue';
|
|
3
|
-
/** Default looks of the built-in item actions, for payloads without `itemActions
|
|
4
|
-
export declare function useItemActionFallbacks(): Record<ItemActionName, ItemActionFallback>;
|
|
3
|
+
/** Default looks of the built-in item actions, for payloads without `itemActions` (icons follow their `alfakit::` aliases). */
|
|
4
|
+
export declare function useItemActionFallbacks(kind?: 'repeater' | 'builder'): Record<ItemActionName, ItemActionFallback>;
|
|
5
5
|
/** Run a built-in action: on the server when customised, else `onClient`. */
|
|
6
6
|
export declare function useRunItemAction(context: MaybeRefOrGetter<ActionContext>): (action: ItemActionSchema | null, args: Record<string, unknown>, onClient: () => void) => void;
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-actions.d.ts","sourceRoot":"","sources":["../../../src/components/fields/item-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAG1E
|
|
1
|
+
{"version":3,"file":"item-actions.d.ts","sourceRoot":"","sources":["../../../src/components/fields/item-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EAAiC,KAAK,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAG1E,+HAA+H;AAC/H,wBAAgB,sBAAsB,CACpC,IAAI,GAAE,UAAU,GAAG,SAAsB,GACxC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,CA0C5C;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,IAIrE,QAAQ,gBAAgB,GAAG,IAAI,EAC/B,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,MAAM,IAAI,KACnB,IAAI,CAKR;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAChC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,EACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,EACtD,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC;2BAcD,MAAM,MAAM,MAAM;;;EAsBjD"}
|