@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
|
@@ -67,6 +67,17 @@ watch(open, (isOpen) => {
|
|
|
67
67
|
if (isOpen) void center?.load()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
+
// Every visit brings the server's unread count (another user after impersonating, or
|
|
71
|
+
// notifications read in another tab): follow it instead of waiting for the next poll.
|
|
72
|
+
watch(
|
|
73
|
+
() => config.value?.unreadCount,
|
|
74
|
+
(count) => {
|
|
75
|
+
if (center && typeof count === 'number' && count !== center.store.get().unreadCount) {
|
|
76
|
+
center.store.update({ unreadCount: count })
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
)
|
|
80
|
+
|
|
70
81
|
// Realtime notifications announce stored ones, so the unread count updates right away.
|
|
71
82
|
let stopListening: (() => void) | null = null
|
|
72
83
|
onMounted(() => {
|
|
@@ -30,6 +30,7 @@ import CommandEmpty from '../ui/CommandEmpty.vue'
|
|
|
30
30
|
import CommandGroup from '../ui/CommandGroup.vue'
|
|
31
31
|
import CommandInput from '../ui/CommandInput.vue'
|
|
32
32
|
import CommandItem from '../ui/CommandItem.vue'
|
|
33
|
+
import CommandAutoHighlight from '../ui/CommandAutoHighlight.vue'
|
|
33
34
|
import CommandList from '../ui/CommandList.vue'
|
|
34
35
|
import Spinner from '../ui/Spinner.vue'
|
|
35
36
|
import ShortcutKeys from './ShortcutKeys.vue'
|
|
@@ -276,6 +277,7 @@ const hasResults = computed(() => groups.value.length > 0 || local.value.length
|
|
|
276
277
|
@update:model-value="query = $event"
|
|
277
278
|
/>
|
|
278
279
|
<CommandList>
|
|
280
|
+
<CommandAutoHighlight :items="[groups, local, leading]" />
|
|
279
281
|
<CommandEmpty v-if="!loading && !hasResults">{{
|
|
280
282
|
query ? t('no_results', {}, 'No results.') : placeholder
|
|
281
283
|
}}</CommandEmpty>
|
|
@@ -154,7 +154,7 @@ const tenants = computed(() =>
|
|
|
154
154
|
<DropdownMenuItem v-else-if="tenancy.profileUrl" as-child>
|
|
155
155
|
<Link :href="tenancy.profileUrl" class="w-full"
|
|
156
156
|
><Icon name="alfakit::panels.tenant-menu.profile-button" :fallback="SettingsIcon" />
|
|
157
|
-
{{ t('tenancy.profile', {}, 'Settings') }}</Link
|
|
157
|
+
{{ tenancy.profileLabel ?? t('tenancy.profile', {}, 'Settings') }}</Link
|
|
158
158
|
>
|
|
159
159
|
</DropdownMenuItem>
|
|
160
160
|
<MenuItemEntries v-if="tenancy.menu" :items="tenancy.menu" menu="tenantMenu" />
|
|
@@ -162,7 +162,7 @@ const tenants = computed(() =>
|
|
|
162
162
|
<DropdownMenuItem v-else-if="tenancy.registrationUrl" as-child>
|
|
163
163
|
<Link :href="tenancy.registrationUrl" class="w-full"
|
|
164
164
|
><Icon name="alfakit::panels.tenant-menu.registration-button" :fallback="PlusIcon" />
|
|
165
|
-
{{ t('tenancy.register', {}, 'New') }}</Link
|
|
165
|
+
{{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}</Link
|
|
166
166
|
>
|
|
167
167
|
</DropdownMenuItem>
|
|
168
168
|
</DropdownMenuContent>
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
type RecordKey,
|
|
7
7
|
} from '@alfakit/core'
|
|
8
8
|
import { onMounted, onScopeDispose, shallowRef, watch, type ShallowRef } from 'vue'
|
|
9
|
-
import { usePollComponent } from '../../context'
|
|
9
|
+
import { usePollComponent, useRefreshComponents } from '../../context'
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Follow `live()` updates of a table or widget: refresh it in place when its records
|
|
@@ -22,6 +22,7 @@ export function useLiveUpdates(
|
|
|
22
22
|
},
|
|
23
23
|
): { controller: ShallowRef<LiveUpdates | null>; state: ShallowRef<LiveUpdatesState> } {
|
|
24
24
|
const poll = usePollComponent()
|
|
25
|
+
const refresh = useRefreshComponents()
|
|
25
26
|
const controller = shallowRef<LiveUpdates | null>(null)
|
|
26
27
|
const state = shallowRef<LiveUpdatesState>({ pending: 0, connected: false })
|
|
27
28
|
let stop: (() => void) | null = null
|
|
@@ -68,6 +69,7 @@ export function useLiveUpdates(
|
|
|
68
69
|
target,
|
|
69
70
|
polling,
|
|
70
71
|
poll,
|
|
72
|
+
refresh,
|
|
71
73
|
})
|
|
72
74
|
|
|
73
75
|
controller.value = next
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { ColumnSchema, TableSchema } from '@alfakit/core'
|
|
3
|
-
import { ariaSort, columnVisibilityClasses, visitTable } from '@alfakit/core'
|
|
3
|
+
import { ariaSort, columnVisibilityClasses, debounce, visitTable } from '@alfakit/core'
|
|
4
4
|
import { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon } from '@lucide/vue'
|
|
5
5
|
import { createReusableTemplate } from '@vueuse/core'
|
|
6
|
-
import { ref } from 'vue'
|
|
6
|
+
import { onBeforeUnmount, ref } from 'vue'
|
|
7
7
|
import { useT } from '../../context'
|
|
8
8
|
import { Icon } from '../../lib/icons'
|
|
9
9
|
import { cn } from '../../lib/utils'
|
|
@@ -47,17 +47,26 @@ const sort = () => {
|
|
|
47
47
|
})
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// The column search applies after the same pause as the table search; Enter applies at once.
|
|
51
|
+
const pushColumnSearch = debounce(
|
|
52
|
+
(value: string) =>
|
|
53
|
+
visitTable(
|
|
54
|
+
props.table.identifier,
|
|
55
|
+
{ columnSearch: { ...(props.table.columnSearches ?? {}), [props.column.name]: value } },
|
|
56
|
+
['page'],
|
|
57
|
+
),
|
|
58
|
+
props.table.searchDebounce,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
onBeforeUnmount(() => pushColumnSearch.cancel())
|
|
62
|
+
|
|
63
|
+
const onColumnSearchInput = (value: string) => {
|
|
64
|
+
if (!props.table.searchOnBlur) pushColumnSearch(value)
|
|
65
|
+
}
|
|
66
|
+
|
|
50
67
|
const columnSearch = (event: Event) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
columnSearch: {
|
|
55
|
-
...(props.table.columnSearches ?? {}),
|
|
56
|
-
[props.column.name]: (event.target as HTMLInputElement).value,
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
['page'],
|
|
60
|
-
)
|
|
68
|
+
pushColumnSearch((event.target as HTMLInputElement).value)
|
|
69
|
+
pushColumnSearch.flush()
|
|
61
70
|
}
|
|
62
71
|
</script>
|
|
63
72
|
|
|
@@ -138,6 +147,8 @@ const columnSearch = (event: Event) => {
|
|
|
138
147
|
:placeholder="t('search', {}, 'Search')"
|
|
139
148
|
:aria-label="`${t('search', {}, 'Search')} ${props.column.label}`"
|
|
140
149
|
class="h-7 text-xs font-normal"
|
|
150
|
+
@update:model-value="onColumnSearchInput"
|
|
151
|
+
@blur="props.table.searchOnBlur && columnSearch($event)"
|
|
141
152
|
@keydown.enter="columnSearch"
|
|
142
153
|
/>
|
|
143
154
|
</div>
|
|
@@ -261,24 +261,28 @@ const move = (name: string, offset: -1 | 1, event: MouseEvent) => {
|
|
|
261
261
|
reorder(name, moveColumnInManager(names.value, name, offset, props.table.columnGroups))
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
264
|
+
// The order is saved before the visibility visit: both requests share the session, and a
|
|
265
|
+
// visit running alongside the save would write the old order back when it finishes.
|
|
266
|
+
const apply = async () => {
|
|
267
|
+
const order = orderDraft.value && orderChanged.value ? orderDraft.value : null
|
|
268
|
+
const columns =
|
|
269
|
+
draft.value && columnDraftChanged(props.table.visibleColumns, draft.value) ? draft.value : null
|
|
270
270
|
|
|
271
271
|
draft.value = null
|
|
272
272
|
orderDraft.value = null
|
|
273
273
|
announcement.value = ''
|
|
274
274
|
open.value = false
|
|
275
|
+
|
|
276
|
+
if (order) await save(order)
|
|
277
|
+
|
|
278
|
+
if (columns) visitTable(props.table.identifier, { columns }, ['page'])
|
|
275
279
|
}
|
|
276
280
|
|
|
277
281
|
// Reset: the defined column order and, for toggleable columns, the default visibility.
|
|
278
|
-
const reset = () => {
|
|
282
|
+
const reset = async () => {
|
|
279
283
|
if (reorderable.value) {
|
|
280
284
|
orderDraft.value = null
|
|
281
|
-
|
|
285
|
+
await save([])
|
|
282
286
|
}
|
|
283
287
|
|
|
284
288
|
if (toggleable.value) {
|
|
@@ -14,6 +14,12 @@ const props = defineProps<{ table: TableSchema; columns: ColumnSchema[] }>()
|
|
|
14
14
|
const t = useT()
|
|
15
15
|
const sortable = computed(() => props.columns.filter((column) => column.sortable))
|
|
16
16
|
const direction = computed(() => props.table.sort?.direction ?? 'asc')
|
|
17
|
+
// A default sort on a column the select doesn't list (`created_at`) shows the placeholder.
|
|
18
|
+
const selected = computed(() =>
|
|
19
|
+
sortable.value.some((column) => column.name === props.table.sort?.column)
|
|
20
|
+
? (props.table.sort?.column ?? '')
|
|
21
|
+
: '',
|
|
22
|
+
)
|
|
17
23
|
|
|
18
24
|
const sortBy = (event: Event) => {
|
|
19
25
|
const value = (event.target as HTMLSelectElement).value
|
|
@@ -39,7 +45,7 @@ const flip = () =>
|
|
|
39
45
|
<label class="flex items-center gap-2 text-sm">
|
|
40
46
|
<span class="sr-only">{{ t('table.sort_by', {}, 'Sort by') }}</span>
|
|
41
47
|
<select
|
|
42
|
-
:value="
|
|
48
|
+
:value="selected"
|
|
43
49
|
class="border-input h-8 rounded-md border bg-transparent px-2 text-sm"
|
|
44
50
|
@change="sortBy"
|
|
45
51
|
>
|
|
@@ -3,6 +3,7 @@ import type { TableRecordGroupSchema } from '@alfakit/core'
|
|
|
3
3
|
import { ChevronDownIcon, ChevronRightIcon } from '@lucide/vue'
|
|
4
4
|
import { computed } from 'vue'
|
|
5
5
|
import { useT } from '../../context'
|
|
6
|
+
import { colorClass, textColorClasses } from '../../lib/colors'
|
|
6
7
|
import { Icon } from '../../lib/icons'
|
|
7
8
|
import Checkbox from '../ui/Checkbox.vue'
|
|
8
9
|
import TableCell from '../ui/TableCell.vue'
|
|
@@ -20,6 +21,11 @@ const props = defineProps<{
|
|
|
20
21
|
const emit = defineEmits<{ toggle: [] }>()
|
|
21
22
|
const t = useT()
|
|
22
23
|
|
|
24
|
+
// An enum group shows its `HasIcon` icon, in its `HasColor` colour, before the title.
|
|
25
|
+
const groupIconClass = computed(
|
|
26
|
+
() => `size-4 shrink-0 ${colorClass(textColorClasses, props.group.color, 'gray')}`,
|
|
27
|
+
)
|
|
28
|
+
|
|
23
29
|
const toggleLabel = computed(
|
|
24
30
|
() =>
|
|
25
31
|
`${props.collapsed ? t('table_grouping.expand', {}, 'Expand group') : t('table_grouping.collapse', {}, 'Collapse group')}: ${props.group.title}`,
|
|
@@ -56,6 +62,12 @@ const toggleLabel = computed(
|
|
|
56
62
|
class="size-4 shrink-0"
|
|
57
63
|
aria-hidden="true"
|
|
58
64
|
/>
|
|
65
|
+
<Icon
|
|
66
|
+
v-if="props.group.icon"
|
|
67
|
+
:name="props.group.icon"
|
|
68
|
+
:class="groupIconClass"
|
|
69
|
+
aria-hidden="true"
|
|
70
|
+
/>
|
|
59
71
|
<span class="flex flex-col items-start">
|
|
60
72
|
<span class="font-medium">{{ props.group.title }}</span>
|
|
61
73
|
<span
|
|
@@ -65,6 +77,21 @@ const toggleLabel = computed(
|
|
|
65
77
|
>
|
|
66
78
|
</span>
|
|
67
79
|
</button>
|
|
80
|
+
<span
|
|
81
|
+
v-else-if="props.group.icon"
|
|
82
|
+
data-slot="table-group-title"
|
|
83
|
+
class="flex items-center gap-2"
|
|
84
|
+
>
|
|
85
|
+
<Icon :name="props.group.icon" :class="groupIconClass" aria-hidden="true" />
|
|
86
|
+
<span class="flex flex-col items-start">
|
|
87
|
+
<span class="font-medium">{{ props.group.title }}</span>
|
|
88
|
+
<span
|
|
89
|
+
v-if="props.group.description"
|
|
90
|
+
class="text-muted-foreground text-xs font-normal"
|
|
91
|
+
>{{ props.group.description }}</span
|
|
92
|
+
>
|
|
93
|
+
</span>
|
|
94
|
+
</span>
|
|
68
95
|
<span v-else class="flex flex-col items-start">
|
|
69
96
|
<span class="font-medium">{{ props.group.title }}</span>
|
|
70
97
|
<span v-if="props.group.description" class="text-muted-foreground text-xs font-normal">{{
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { SelectColumnSchema } from '@alfakit/core'
|
|
3
3
|
import { isOptionGroup } from '@alfakit/core'
|
|
4
|
-
import { computed, ref } from 'vue'
|
|
4
|
+
import { computed, ref, useId } from 'vue'
|
|
5
5
|
import { cn } from '../../lib/utils'
|
|
6
6
|
import { useCellUpdate, type CellProps } from './cell-update'
|
|
7
7
|
|
|
8
8
|
const props = defineProps<CellProps>()
|
|
9
9
|
const schema = computed(() => props.column as SelectColumnSchema)
|
|
10
10
|
const { update, saving, error } = useCellUpdate(props)
|
|
11
|
+
const errorId = useId()
|
|
11
12
|
const value = ref(
|
|
12
13
|
props.cell.state === null || props.cell.state === undefined ? '' : String(props.cell.state),
|
|
13
14
|
)
|
|
@@ -29,7 +30,9 @@ const onChange = (event: Event) => {
|
|
|
29
30
|
<select
|
|
30
31
|
:value="value"
|
|
31
32
|
:disabled="Boolean(props.cell.disabled) || saving"
|
|
33
|
+
:aria-label="props.column.label || props.column.name"
|
|
32
34
|
:aria-invalid="error ? true : undefined"
|
|
35
|
+
:aria-describedby="error ? errorId : undefined"
|
|
33
36
|
:class="
|
|
34
37
|
cn(
|
|
35
38
|
'border-input dark:bg-input/30 focus-visible:ring-ring/50 h-8 min-w-32 rounded-md border bg-transparent px-2 text-sm shadow-xs outline-none focus-visible:ring-[3px]',
|
|
@@ -48,6 +51,6 @@ const onChange = (event: Event) => {
|
|
|
48
51
|
{{ option.label }}
|
|
49
52
|
</option>
|
|
50
53
|
</select>
|
|
51
|
-
<span v-if="error" class="text-destructive block text-xs">{{ error }}</span>
|
|
54
|
+
<span v-if="error" :id="errorId" class="text-destructive block text-xs">{{ error }}</span>
|
|
52
55
|
</span>
|
|
53
56
|
</template>
|
|
@@ -22,7 +22,9 @@ import TextInputCell from './TextInputCell.vue'
|
|
|
22
22
|
const props = defineProps<CellProps>()
|
|
23
23
|
const registry = useRegistry()
|
|
24
24
|
// A component registered as `column:<type>` replaces the built-in cell renderer.
|
|
25
|
-
const custom = computed(() =>
|
|
25
|
+
const custom = computed(() =>
|
|
26
|
+
props.fromRegistry ? undefined : registry.resolve(columnRegistryKey(props.column)),
|
|
27
|
+
)
|
|
26
28
|
const t = useT()
|
|
27
29
|
// `ViewColumn`: the application component registered under the column's `view()` name.
|
|
28
30
|
const viewName = computed(() => (props.column as { component?: string }).component ?? '')
|
|
@@ -106,7 +108,7 @@ const descriptionPosition = computed(
|
|
|
106
108
|
</script>
|
|
107
109
|
|
|
108
110
|
<template>
|
|
109
|
-
<component :is="custom" v-if="custom" v-bind="props" />
|
|
111
|
+
<component :is="custom" v-if="custom" v-bind="props" :from-registry="true" />
|
|
110
112
|
<component
|
|
111
113
|
:is="view"
|
|
112
114
|
v-else-if="view"
|
|
@@ -10,12 +10,13 @@ import {
|
|
|
10
10
|
} from '@alfakit/core'
|
|
11
11
|
import { ChevronLeftIcon, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon } from '@lucide/vue'
|
|
12
12
|
import { computed, onBeforeUnmount, ref, watch } from 'vue'
|
|
13
|
-
import { useT } from '../../context'
|
|
13
|
+
import { useFormatter, useT } from '../../context'
|
|
14
14
|
import { Icon } from '../../lib/icons'
|
|
15
15
|
import Button from '../ui/Button.vue'
|
|
16
16
|
|
|
17
17
|
const props = defineProps<{ table: TableSchema }>()
|
|
18
18
|
const t = useT()
|
|
19
|
+
const format = useFormatter()
|
|
19
20
|
const pagination = computed(() => props.table.pagination)
|
|
20
21
|
|
|
21
22
|
function pageWindow(current: number, last: number): Array<number | null> {
|
|
@@ -66,13 +67,17 @@ const summary = computed(() => {
|
|
|
66
67
|
return numbered.value
|
|
67
68
|
? t(
|
|
68
69
|
'table.showing',
|
|
69
|
-
{
|
|
70
|
-
|
|
70
|
+
{
|
|
71
|
+
first: format.value.number(value.from),
|
|
72
|
+
last: format.value.number(value.to),
|
|
73
|
+
total: format.value.number(numbered.value.total),
|
|
74
|
+
},
|
|
75
|
+
'Showing :first–:last of :total',
|
|
71
76
|
)
|
|
72
77
|
: t(
|
|
73
78
|
'table.showing_range',
|
|
74
|
-
{ first: value.from, last: value.to },
|
|
75
|
-
|
|
79
|
+
{ first: format.value.number(value.from), last: format.value.number(value.to) },
|
|
80
|
+
'Showing :first–:last',
|
|
76
81
|
)
|
|
77
82
|
})
|
|
78
83
|
const goTo = (page: number) => visitTable(props.table.identifier, { page }, ['page'])
|
|
@@ -173,7 +178,7 @@ onBeforeUnmount(() => observer?.disconnect())
|
|
|
173
178
|
@change="setPerPage"
|
|
174
179
|
>
|
|
175
180
|
<option v-for="option in pagination.pageOptions" :key="option" :value="String(option)">
|
|
176
|
-
{{ option === 'all' ? t('table.all', {}, 'All') : option }}
|
|
181
|
+
{{ option === 'all' ? t('table.all', {}, 'All') : format.number(option) }}
|
|
177
182
|
</option>
|
|
178
183
|
</select>
|
|
179
184
|
</label>
|
|
@@ -251,7 +256,7 @@ onBeforeUnmount(() => observer?.disconnect())
|
|
|
251
256
|
size="icon-sm"
|
|
252
257
|
:aria-current="page === numbered.currentPage ? 'page' : undefined"
|
|
253
258
|
@click="goTo(page)"
|
|
254
|
-
>{{ page }}</Button
|
|
259
|
+
>{{ format.number(page) }}</Button
|
|
255
260
|
>
|
|
256
261
|
</template>
|
|
257
262
|
</template>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { TextInputColumnSchema } from '@alfakit/core'
|
|
3
|
-
import { computed, ref } from 'vue'
|
|
3
|
+
import { computed, ref, useId } from 'vue'
|
|
4
4
|
import { colorClass, textColorClasses } from '../../lib/colors'
|
|
5
5
|
import { Icon } from '../../lib/icons'
|
|
6
6
|
import { cn } from '../../lib/utils'
|
|
@@ -10,9 +10,13 @@ import { useCellUpdate, type CellProps } from './cell-update'
|
|
|
10
10
|
const props = defineProps<CellProps>()
|
|
11
11
|
const schema = computed(() => props.column as TextInputColumnSchema)
|
|
12
12
|
const { update, saving, error } = useCellUpdate(props)
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
const errorId = useId()
|
|
14
|
+
// The saved value: follows the cell after the table reloads, so changing the input back to
|
|
15
|
+
// an earlier value is saved too.
|
|
16
|
+
const initial = computed(() =>
|
|
17
|
+
props.cell.state === null || props.cell.state === undefined ? '' : String(props.cell.state),
|
|
18
|
+
)
|
|
19
|
+
const value = ref(initial.value)
|
|
16
20
|
// `prefix()` / `suffix()`: text affixes around the input, like the TextInput field.
|
|
17
21
|
const grouped = computed(() => Boolean(props.cell.prefix || props.cell.suffix))
|
|
18
22
|
</script>
|
|
@@ -57,7 +61,9 @@ const grouped = computed(() => Boolean(props.cell.prefix || props.cell.suffix))
|
|
|
57
61
|
:step="schema.step"
|
|
58
62
|
:inputmode="schema.inputMode"
|
|
59
63
|
:disabled="Boolean(props.cell.disabled) || saving"
|
|
64
|
+
:aria-label="props.column.label || props.column.name"
|
|
60
65
|
:aria-invalid="error ? true : undefined"
|
|
66
|
+
:aria-describedby="error ? errorId : undefined"
|
|
61
67
|
:class="
|
|
62
68
|
cn(
|
|
63
69
|
'h-8 min-w-32',
|
|
@@ -92,6 +98,6 @@ const grouped = computed(() => Boolean(props.cell.prefix || props.cell.suffix))
|
|
|
92
98
|
>{{ props.cell.suffix }}</span
|
|
93
99
|
>
|
|
94
100
|
</span>
|
|
95
|
-
<span v-if="error" class="text-destructive block text-xs">{{ error }}</span>
|
|
101
|
+
<span v-if="error" :id="errorId" class="text-destructive block text-xs">{{ error }}</span>
|
|
96
102
|
</span>
|
|
97
103
|
</template>
|
|
@@ -10,6 +10,12 @@ export interface CellProps {
|
|
|
10
10
|
recordKey: RecordKey
|
|
11
11
|
token: string
|
|
12
12
|
component: string
|
|
13
|
+
/**
|
|
14
|
+
* Set when this renderer was picked from the registry (`column:<type>`): it then renders
|
|
15
|
+
* the built-in cell instead of looking itself up again, so an ejected `TableCellContent`
|
|
16
|
+
* registered for a column type doesn't render itself forever.
|
|
17
|
+
*/
|
|
18
|
+
fromRegistry?: boolean
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
export function useCellUpdate(props: CellProps) {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { injectListboxRootContext } from 'reka-ui'
|
|
3
|
+
import { nextTick, watch } from 'vue'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Inside a `Command`: highlights the first item when `items` change and nothing (still on
|
|
7
|
+
* the page) is highlighted, as cmdk does in React. Results that arrive after typing (a
|
|
8
|
+
* server search) would otherwise leave Enter with nothing to select.
|
|
9
|
+
*/
|
|
10
|
+
const props = defineProps<{ items: unknown }>()
|
|
11
|
+
const root = injectListboxRootContext()
|
|
12
|
+
|
|
13
|
+
watch(
|
|
14
|
+
() => props.items,
|
|
15
|
+
() =>
|
|
16
|
+
nextTick(() => {
|
|
17
|
+
const highlighted = root.highlightedElement.value
|
|
18
|
+
|
|
19
|
+
if (!highlighted || !highlighted.isConnected) root.highlightFirstItem()
|
|
20
|
+
}),
|
|
21
|
+
{ deep: true },
|
|
22
|
+
)
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<template>
|
|
26
|
+
<slot />
|
|
27
|
+
</template>
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
DialogContent,
|
|
7
7
|
DialogOverlay,
|
|
8
8
|
DialogPortal,
|
|
9
|
+
useDirection,
|
|
9
10
|
useForwardPropsEmits,
|
|
10
11
|
type DialogContentEmits,
|
|
11
12
|
type DialogContentProps,
|
|
@@ -28,6 +29,9 @@ defineOptions({ inheritAttrs: false })
|
|
|
28
29
|
|
|
29
30
|
const emits = defineEmits<DialogContentEmits>()
|
|
30
31
|
const forwarded = useForwardPropsEmits(reactiveOmit(props, 'class', 'showCloseButton'), emits)
|
|
32
|
+
// Portaled outside Alfakit's root: carry the reading direction (starter kit pages and
|
|
33
|
+
// standalone components leave <html dir> to the host).
|
|
34
|
+
const dir = useDirection()
|
|
31
35
|
const t = useT()
|
|
32
36
|
</script>
|
|
33
37
|
|
|
@@ -39,7 +43,7 @@ const t = useT()
|
|
|
39
43
|
/>
|
|
40
44
|
<DialogContent
|
|
41
45
|
data-slot="dialog-content"
|
|
42
|
-
v-bind="{ ...forwarded, ...$attrs }"
|
|
46
|
+
v-bind="{ dir, ...forwarded, ...$attrs }"
|
|
43
47
|
:class="
|
|
44
48
|
cn(
|
|
45
49
|
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
|
|
@@ -3,6 +3,7 @@ import { reactiveOmit } from '@vueuse/core'
|
|
|
3
3
|
import {
|
|
4
4
|
PopoverContent,
|
|
5
5
|
PopoverPortal,
|
|
6
|
+
useDirection,
|
|
6
7
|
useForwardPropsEmits,
|
|
7
8
|
type PopoverContentEmits,
|
|
8
9
|
type PopoverContentProps,
|
|
@@ -20,13 +21,16 @@ defineOptions({ inheritAttrs: false })
|
|
|
20
21
|
|
|
21
22
|
const emits = defineEmits<PopoverContentEmits>()
|
|
22
23
|
const forwarded = useForwardPropsEmits(reactiveOmit(props, 'class'), emits)
|
|
24
|
+
// Portaled outside Alfakit's root: carry the reading direction (starter kit pages and
|
|
25
|
+
// standalone components leave <html dir> to the host).
|
|
26
|
+
const dir = useDirection()
|
|
23
27
|
</script>
|
|
24
28
|
|
|
25
29
|
<template>
|
|
26
30
|
<PopoverPortal>
|
|
27
31
|
<PopoverContent
|
|
28
32
|
data-slot="popover-content"
|
|
29
|
-
v-bind="{ ...forwarded, ...$attrs }"
|
|
33
|
+
v-bind="{ ...forwarded, dir: forwarded.dir ?? dir, ...$attrs }"
|
|
30
34
|
:class="
|
|
31
35
|
cn(
|
|
32
36
|
'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--reka-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden',
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
DialogContent,
|
|
7
7
|
DialogOverlay,
|
|
8
8
|
DialogPortal,
|
|
9
|
+
useDirection,
|
|
9
10
|
useForwardPropsEmits,
|
|
10
11
|
type DialogContentEmits,
|
|
11
12
|
type DialogContentProps,
|
|
@@ -35,6 +36,9 @@ const forwarded = useForwardPropsEmits(
|
|
|
35
36
|
reactiveOmit(props, 'class', 'side', 'showCloseButton'),
|
|
36
37
|
emits,
|
|
37
38
|
)
|
|
39
|
+
// Portaled outside Alfakit's root: carry the reading direction (starter kit pages and
|
|
40
|
+
// standalone components leave <html dir> to the host).
|
|
41
|
+
const dir = useDirection()
|
|
38
42
|
const t = useT()
|
|
39
43
|
</script>
|
|
40
44
|
|
|
@@ -46,7 +50,7 @@ const t = useT()
|
|
|
46
50
|
/>
|
|
47
51
|
<DialogContent
|
|
48
52
|
data-slot="sheet-content"
|
|
49
|
-
v-bind="{ ...forwarded, ...$attrs }"
|
|
53
|
+
v-bind="{ dir, ...forwarded, ...$attrs }"
|
|
50
54
|
:class="
|
|
51
55
|
cn(
|
|
52
56
|
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500',
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
TooltipArrow,
|
|
5
5
|
TooltipContent,
|
|
6
6
|
TooltipPortal,
|
|
7
|
+
useDirection,
|
|
7
8
|
useForwardPropsEmits,
|
|
8
9
|
type TooltipContentEmits,
|
|
9
10
|
type TooltipContentProps,
|
|
@@ -21,13 +22,16 @@ defineOptions({ inheritAttrs: false })
|
|
|
21
22
|
|
|
22
23
|
const emits = defineEmits<TooltipContentEmits>()
|
|
23
24
|
const forwarded = useForwardPropsEmits(reactiveOmit(props, 'class'), emits)
|
|
25
|
+
// Portaled outside Alfakit's root: carry the reading direction (starter kit pages and
|
|
26
|
+
// standalone components leave <html dir> to the host).
|
|
27
|
+
const dir = useDirection()
|
|
24
28
|
</script>
|
|
25
29
|
|
|
26
30
|
<template>
|
|
27
31
|
<TooltipPortal>
|
|
28
32
|
<TooltipContent
|
|
29
33
|
data-slot="tooltip-content"
|
|
30
|
-
v-bind="{ ...forwarded, ...$attrs }"
|
|
34
|
+
v-bind="{ dir, ...forwarded, ...$attrs }"
|
|
31
35
|
:class="
|
|
32
36
|
cn(
|
|
33
37
|
'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--reka-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',
|
package/src/context.ts
CHANGED
|
@@ -36,6 +36,11 @@ export interface AlfakitContextValue {
|
|
|
36
36
|
* their own schemas by token.
|
|
37
37
|
*/
|
|
38
38
|
poll?: (target: string, interval: string | number | null | undefined) => () => void
|
|
39
|
+
/**
|
|
40
|
+
* Fetches fresh schemas of components now (`live()` tables and widgets after a record
|
|
41
|
+
* change). Panels leave it out (a partial reload); components outside panels fetch theirs.
|
|
42
|
+
*/
|
|
43
|
+
refresh?: (targets: string[]) => Promise<void>
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
export const ALFAKIT_KEY: InjectionKey<AlfakitContextValue> = Symbol('alfakit')
|
|
@@ -69,6 +74,11 @@ export function usePollComponent(): NonNullable<AlfakitContextValue['poll']> {
|
|
|
69
74
|
return inject(ALFAKIT_KEY, null)?.poll ?? pollComponent
|
|
70
75
|
}
|
|
71
76
|
|
|
77
|
+
/** How `live()` components refresh: their own fetch outside panels, else a partial reload. */
|
|
78
|
+
export function useRefreshComponents(): AlfakitContextValue['refresh'] {
|
|
79
|
+
return inject(ALFAKIT_KEY, null)?.refresh
|
|
80
|
+
}
|
|
81
|
+
|
|
72
82
|
export function provideAlfakit(value: AlfakitContextValue): void {
|
|
73
83
|
provide(ALFAKIT_KEY, value)
|
|
74
84
|
}
|
package/src/create-alfakit.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
configureCharts,
|
|
7
7
|
configureRealtime,
|
|
8
8
|
debugRecorder,
|
|
9
|
+
documentNonce,
|
|
9
10
|
effectiveErrorNotifications,
|
|
10
11
|
initializeAppearance,
|
|
11
12
|
installErrorNotifications,
|
|
@@ -27,6 +28,7 @@ import type { App, DefineComponent } from 'vue'
|
|
|
27
28
|
import AlfakitRoot from './AlfakitRoot.vue'
|
|
28
29
|
import { showToast } from './components/notifications/flash-toasts'
|
|
29
30
|
import { ALFAKIT_KEY, type AlfakitContextValue, type AnyComponent } from './context'
|
|
31
|
+
import { panelLayouts } from './layouts/panel-layouts'
|
|
30
32
|
import { discoverComponents } from './lib/discovery'
|
|
31
33
|
import { preloadIcons } from './lib/icons'
|
|
32
34
|
import AlfakitPage from './pages/AlfakitPage.vue'
|
|
@@ -54,6 +56,7 @@ export function bootAlfakit(
|
|
|
54
56
|
// Auto-registered files sit between the built-ins and the explicit `components` / `pages`.
|
|
55
57
|
const discovered = discoverComponents(options.discover)
|
|
56
58
|
const registry = createDefaultRegistry()
|
|
59
|
+
.registerMany(panelLayouts)
|
|
57
60
|
.registerMany(discovered.components)
|
|
58
61
|
.registerMany(options.components ?? {})
|
|
59
62
|
const pages: Record<string, AnyComponent> = {
|
|
@@ -158,6 +161,8 @@ export function bootAlfakit(
|
|
|
158
161
|
return createInertiaApp<AlfakitPageProps>({
|
|
159
162
|
title: (title) => title,
|
|
160
163
|
progress: options.progress === undefined ? { color: 'var(--primary)' } : options.progress,
|
|
164
|
+
// The page's CSP nonce, so the progress bar's injected <style> passes a nonce-based policy.
|
|
165
|
+
nonce: documentNonce(),
|
|
161
166
|
resolve: (name, page) => {
|
|
162
167
|
const component = pages[name]
|
|
163
168
|
|
package/src/index.ts
CHANGED
|
@@ -102,6 +102,8 @@ export { discoverComponents, discoveredComponent, type DiscoveredComponents } fr
|
|
|
102
102
|
export { Icon, hasIcon, resolveIcon } from './lib/icons'
|
|
103
103
|
export { cn } from './lib/utils'
|
|
104
104
|
export * from './pages'
|
|
105
|
+
// `createAlfakit()` registers these; a registry built by hand for `AlfakitPage` needs them too.
|
|
106
|
+
export { panelLayouts } from './layouts/panel-layouts'
|
|
105
107
|
export { createDefaultRegistry } from './registry'
|
|
106
108
|
export * from './standalone'
|
|
107
109
|
export * from './starter-kit'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { lazyComponents } from '@alfakit/core'
|
|
2
|
+
import type { AnyComponent } from '../context'
|
|
3
|
+
import { discoveredComponent } from '../lib/discovery'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The fullscreen layout (`$layout = 'fullscreen'`), loaded on demand by starter kit pages:
|
|
7
|
+
* they render in the host's layout, so the page chunk never imports the panel's header,
|
|
8
|
+
* menus and notifications for a layout few pages use. Only the starter kit registers it;
|
|
9
|
+
* `createAlfakit()` registers the layouts themselves up front (`panelLayouts`), so a panel's
|
|
10
|
+
* bundle has no extra lazy entry points.
|
|
11
|
+
*/
|
|
12
|
+
export const lazyPanelLayouts: Record<string, AnyComponent> = lazyComponents<AnyComponent>({
|
|
13
|
+
'layout:fullscreen': () => import('./FullscreenLayout.vue').then((m) => m.default),
|
|
14
|
+
}).map(discoveredComponent).components
|