@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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnyComponent } from '../context'
|
|
2
|
+
import AppLayout from './AppLayout.vue'
|
|
3
|
+
import AuthLayout from './AuthLayout.vue'
|
|
4
|
+
import BlankLayout from './BlankLayout.vue'
|
|
5
|
+
import FullscreenLayout from './FullscreenLayout.vue'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The panel's own layouts (sidebar or top navigation, auth card, blank, fullscreen), which
|
|
9
|
+
* `createAlfakit()` registers up front. Starter kit pages render in the host's layout and
|
|
10
|
+
* never import these: `PageShell` loads one on demand if such a page asks for it.
|
|
11
|
+
*/
|
|
12
|
+
export const panelLayouts: Record<string, AnyComponent> = {
|
|
13
|
+
'layout:app': AppLayout,
|
|
14
|
+
'layout:auth': AuthLayout,
|
|
15
|
+
'layout:blank': BlankLayout,
|
|
16
|
+
'layout:fullscreen': FullscreenLayout,
|
|
17
|
+
}
|
package/src/lib/lazy.ts
CHANGED
|
@@ -29,8 +29,18 @@ export function lazyComponent(
|
|
|
29
29
|
inheritAttrs: false,
|
|
30
30
|
setup(_, { attrs }) {
|
|
31
31
|
const mounted = useAppMounted()
|
|
32
|
+
// Picked once per instance: switching from the async wrapper to the loaded component
|
|
33
|
+
// on a later render would be a new component type, so Vue would remount it and its
|
|
34
|
+
// state (a spreadsheet's undo history, an editor's selection) would be lost.
|
|
35
|
+
let component: Component | null = null
|
|
32
36
|
|
|
33
|
-
return () =>
|
|
37
|
+
return () => {
|
|
38
|
+
if (!mounted.value) return h(fallback, attrs)
|
|
39
|
+
|
|
40
|
+
component ??= loaded ?? Async
|
|
41
|
+
|
|
42
|
+
return h(component, attrs)
|
|
43
|
+
}
|
|
34
44
|
},
|
|
35
45
|
})
|
|
36
46
|
}
|
package/src/pages/PageShell.vue
CHANGED
|
@@ -5,10 +5,7 @@ import { computed, onBeforeUnmount, watch } from 'vue'
|
|
|
5
5
|
import KeyboardShortcuts from '../components/panel/KeyboardShortcuts.vue'
|
|
6
6
|
import Slot from '../components/panel/Slot.vue'
|
|
7
7
|
import { useRegistry } from '../context'
|
|
8
|
-
import AppLayout from '../layouts/AppLayout.vue'
|
|
9
|
-
import AuthLayout from '../layouts/AuthLayout.vue'
|
|
10
8
|
import BlankLayout from '../layouts/BlankLayout.vue'
|
|
11
|
-
import FullscreenLayout from '../layouts/FullscreenLayout.vue'
|
|
12
9
|
import SubNavigationLayout from '../components/panel/SubNavigationLayout.vue'
|
|
13
10
|
import ConflictBanner from '../components/realtime/ConflictBanner.vue'
|
|
14
11
|
import PageHeader from './PageHeader.vue'
|
|
@@ -17,10 +14,12 @@ const props = defineProps<{ page: PageSchema }>()
|
|
|
17
14
|
const registry = useRegistry()
|
|
18
15
|
|
|
19
16
|
// Each layout can be replaced: createAlfakit({ components: { 'layout:app': MyLayout } }).
|
|
20
|
-
|
|
17
|
+
// `createAlfakit()` registers the panel's layouts (`panelLayouts`), the starter kit its content
|
|
18
|
+
// layout; importing the panel layouts here would put the sidebar in every starter kit page.
|
|
19
|
+
const Auth = computed(() => registry.resolve('layout:auth') ?? BlankLayout)
|
|
21
20
|
const Blank = computed(() => registry.resolve('layout:blank') ?? BlankLayout)
|
|
22
|
-
const Fullscreen = computed(() => registry.resolve('layout:fullscreen') ??
|
|
23
|
-
const App = computed(() => registry.resolve('layout:app') ??
|
|
21
|
+
const Fullscreen = computed(() => registry.resolve('layout:fullscreen') ?? BlankLayout)
|
|
22
|
+
const App = computed(() => registry.resolve('layout:app') ?? BlankLayout)
|
|
24
23
|
// Edit pages: somebody else saved the record (`detectConflicts()`, `Panel::realtime()`).
|
|
25
24
|
const Conflicts = computed(() => registry.resolve('page:conflict-banner') ?? ConflictBanner)
|
|
26
25
|
|
|
@@ -67,14 +67,23 @@ const version = ref(0)
|
|
|
67
67
|
const state = new StandaloneComponentState(props.component, () => version.value++)
|
|
68
68
|
const poll = (target: string, interval: string | number | null | undefined) =>
|
|
69
69
|
state.poll(target, interval)
|
|
70
|
+
const refresh = (targets: string[]) => state.refresh(targets)
|
|
70
71
|
|
|
71
72
|
const context: AlfakitContextValue = parent
|
|
72
|
-
? {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
props.components,
|
|
73
|
+
? {
|
|
74
|
+
...parent,
|
|
75
|
+
registry: createStandaloneRegistry(props.components, parent.registry),
|
|
76
76
|
poll,
|
|
77
|
-
|
|
77
|
+
refresh,
|
|
78
|
+
}
|
|
79
|
+
: {
|
|
80
|
+
...createStandaloneContext(
|
|
81
|
+
{ action: props.component.endpoints.action, modal: props.component.endpoints.modal },
|
|
82
|
+
props.components,
|
|
83
|
+
poll,
|
|
84
|
+
),
|
|
85
|
+
refresh,
|
|
86
|
+
}
|
|
78
87
|
|
|
79
88
|
provide(ALFAKIT_KEY, context)
|
|
80
89
|
|
|
@@ -124,9 +133,11 @@ onMounted(() => {
|
|
|
124
133
|
{ immediate: true },
|
|
125
134
|
)
|
|
126
135
|
|
|
136
|
+
// The watcher runs before the new payload renders: hand it over, or the response would
|
|
137
|
+
// count as stale and lazy widgets (a calendar after its action) keep their old schema.
|
|
127
138
|
watch(
|
|
128
139
|
() => props.component.token,
|
|
129
|
-
() => void state.loadLazy(),
|
|
140
|
+
() => void state.loadLazy(props.component),
|
|
130
141
|
{ immediate: true },
|
|
131
142
|
)
|
|
132
143
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { resolveToastPosition, type ToastPosition } from '@alfakit/core'
|
|
2
|
+
import { resolveToastPosition, STARTER_KIT_TOASTER_ID, type ToastPosition } from '@alfakit/core'
|
|
3
3
|
import { onMounted, onUnmounted } from 'vue'
|
|
4
|
+
import { setToasterId } from '../components/notifications/flash-toasts'
|
|
4
5
|
import Toaster from '../components/ui/Toaster.vue'
|
|
5
6
|
import { useOptionalAlfakit } from '../context'
|
|
6
7
|
import { claimToaster, createStandaloneContext, ensureFlashToasts } from './runtime'
|
|
@@ -38,15 +39,24 @@ let release: (() => void) | null = null
|
|
|
38
39
|
onMounted(() => {
|
|
39
40
|
if (!props.claimed) release = claimToaster()
|
|
40
41
|
|
|
42
|
+
// Our own toaster gets an id, so a `<Toaster />` the app's layout already mounts (the
|
|
43
|
+
// starter kits have one) doesn't show every Alfakit toast a second time.
|
|
44
|
+
if (props.toaster) setToasterId(STARTER_KIT_TOASTER_ID)
|
|
45
|
+
|
|
41
46
|
ensureFlashToasts(context.registry)
|
|
42
47
|
})
|
|
43
48
|
|
|
44
|
-
onUnmounted(() =>
|
|
49
|
+
onUnmounted(() => {
|
|
50
|
+
release?.()
|
|
51
|
+
|
|
52
|
+
if (props.toaster) setToasterId(undefined)
|
|
53
|
+
})
|
|
45
54
|
</script>
|
|
46
55
|
|
|
47
56
|
<template>
|
|
48
57
|
<Toaster
|
|
49
58
|
v-if="props.toaster"
|
|
59
|
+
:id="STARTER_KIT_TOASTER_ID"
|
|
50
60
|
:position="resolveToastPosition(props.position, props.dir)"
|
|
51
61
|
:dir="props.dir"
|
|
52
62
|
rich-colors
|
|
@@ -56,7 +56,16 @@ onUnmounted(() => {
|
|
|
56
56
|
</script>
|
|
57
57
|
|
|
58
58
|
<template>
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
<!-- The reading direction and language of Alfakit's content only: the host layout around it
|
|
60
|
+
(sidebar, header) and the app's own pages keep the document's. -->
|
|
61
|
+
<div
|
|
62
|
+
data-slot="starter-kit-root"
|
|
63
|
+
:dir="page.props.alfakit?.localization?.direction ?? 'ltr'"
|
|
64
|
+
:lang="page.props.alfakit?.localization?.tag"
|
|
65
|
+
class="contents"
|
|
66
|
+
>
|
|
67
|
+
<AlfakitRoot :toaster-id="STARTER_KIT_TOASTER_ID">
|
|
68
|
+
<slot />
|
|
69
|
+
</AlfakitRoot>
|
|
70
|
+
</div>
|
|
62
71
|
</template>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import {
|
|
2
|
+
standaloneWidgetCount,
|
|
3
|
+
starterKitDashboardWidgets,
|
|
4
|
+
type StandaloneComponentSchema,
|
|
5
|
+
} from '@alfakit/core'
|
|
6
|
+
import { usePage } from '@inertiajs/vue3'
|
|
7
|
+
import { computed, defineComponent, h, type PropType } from 'vue'
|
|
8
|
+
import type { AnyComponent } from '../context'
|
|
9
|
+
import { lazyComponent } from '../lib/lazy'
|
|
10
|
+
|
|
11
|
+
/** Widget-sized boxes until the widgets' code has loaded (also during SSR). */
|
|
12
|
+
const WidgetsPlaceholder = defineComponent({
|
|
13
|
+
name: 'AlfakitWidgetsPlaceholder',
|
|
14
|
+
props: {
|
|
15
|
+
component: { type: Object as PropType<StandaloneComponentSchema>, required: true },
|
|
16
|
+
// Declared so it does not fall through as an attribute.
|
|
17
|
+
components: { type: Object as PropType<Record<string, AnyComponent>>, default: undefined },
|
|
18
|
+
},
|
|
19
|
+
setup(props) {
|
|
20
|
+
return () =>
|
|
21
|
+
h(
|
|
22
|
+
'div',
|
|
23
|
+
{
|
|
24
|
+
'data-slot': 'starter-kit-widgets-placeholder',
|
|
25
|
+
'aria-busy': 'true',
|
|
26
|
+
class: 'grid auto-rows-min gap-4 md:grid-cols-2',
|
|
27
|
+
},
|
|
28
|
+
Array.from({ length: Math.max(standaloneWidgetCount(props.component), 1) }, (_, index) =>
|
|
29
|
+
h('div', {
|
|
30
|
+
key: index,
|
|
31
|
+
'aria-hidden': 'true',
|
|
32
|
+
class: 'bg-muted h-28 animate-pulse rounded-xl',
|
|
33
|
+
}),
|
|
34
|
+
),
|
|
35
|
+
)
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const LoadedWidgets = lazyComponent(
|
|
40
|
+
'AlfakitLoadedWidgets',
|
|
41
|
+
() => import('../standalone/AlfakitComponent.vue').then((module) => module.default),
|
|
42
|
+
WidgetsPlaceholder,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The dashboard widgets of a `starterKit()` panel on the host's own dashboard. Reads the
|
|
47
|
+
* `alfakitWidgets` prop (shared on the panel's `starterKitDashboard()` pages only, the
|
|
48
|
+
* starter kit's `/dashboard` by default) and renders the widgets with the host's theme, as
|
|
49
|
+
* `<AlfakitComponent>` renders standalone widgets: lazy widgets, polling and table widget
|
|
50
|
+
* actions go through the panel's endpoints. Its code loads once mounted; the server render
|
|
51
|
+
* and hydration show placeholders. Renders its default slot (the kit's placeholder boxes)
|
|
52
|
+
* when there are no widgets to show: other pages, guests, users who may not open the panel.
|
|
53
|
+
*
|
|
54
|
+
* ```vue
|
|
55
|
+
* <script setup lang="ts">
|
|
56
|
+
* import { AlfakitWidgets } from '@alfakit/vue'
|
|
57
|
+
* </script>
|
|
58
|
+
*
|
|
59
|
+
* <template>
|
|
60
|
+
* <AlfakitWidgets>
|
|
61
|
+
* <MyEmptyState />
|
|
62
|
+
* </AlfakitWidgets>
|
|
63
|
+
* </template>
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export const AlfakitWidgets = defineComponent({
|
|
67
|
+
name: 'AlfakitWidgets',
|
|
68
|
+
inheritAttrs: false,
|
|
69
|
+
props: {
|
|
70
|
+
/** The `starterKit()` panel whose widgets to show (the first one by default). */
|
|
71
|
+
panel: { type: String as PropType<string | undefined>, default: undefined },
|
|
72
|
+
/** Frontend components of custom widgets (`{ RevenueWidget }`), as for `<AlfakitComponent>`. */
|
|
73
|
+
components: {
|
|
74
|
+
type: Object as PropType<Record<string, AnyComponent> | undefined>,
|
|
75
|
+
default: undefined,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
setup(props, { attrs, slots }) {
|
|
79
|
+
const page = usePage()
|
|
80
|
+
const component = computed(() => starterKitDashboardWidgets(page.props, props.panel))
|
|
81
|
+
|
|
82
|
+
return () =>
|
|
83
|
+
component.value
|
|
84
|
+
? h('div', { 'data-slot': 'starter-kit-widgets' }, [
|
|
85
|
+
h(LoadedWidgets, {
|
|
86
|
+
component: component.value,
|
|
87
|
+
components: props.components,
|
|
88
|
+
class: attrs.class,
|
|
89
|
+
}),
|
|
90
|
+
])
|
|
91
|
+
: slots.default?.()
|
|
92
|
+
},
|
|
93
|
+
})
|
package/src/starter-kit/index.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export { default as AlfakitStarterKitRoot } from './AlfakitStarterKitRoot.vue'
|
|
2
|
+
export { AlfakitWidgets } from './dashboard-widgets'
|
|
2
3
|
export { useAlfakitNavigation, type AlfakitNavigation } from './navigation'
|
|
3
4
|
export { createStarterKitPage, type StarterKitPageOptions } from './starter-kit'
|
|
4
5
|
export { default as StarterKitContentLayout } from './StarterKitContentLayout.vue'
|
|
5
|
-
export {
|
|
6
|
+
export {
|
|
7
|
+
AlfakitCopilot,
|
|
8
|
+
AlfakitNotifications,
|
|
9
|
+
AlfakitSearch,
|
|
10
|
+
AlfakitTenantSwitcher,
|
|
11
|
+
} from './widgets'
|
|
@@ -6,6 +6,9 @@ import {
|
|
|
6
6
|
} from '@alfakit/core'
|
|
7
7
|
import { showToast } from '../components/notifications/flash-toasts'
|
|
8
8
|
import type { AlfakitContextValue, AnyComponent } from '../context'
|
|
9
|
+
import AuthLayout from '../layouts/AuthLayout.vue'
|
|
10
|
+
import { lazyPanelLayouts } from '../layouts/lazy-layouts'
|
|
11
|
+
import { discoverComponents } from '../lib/discovery'
|
|
9
12
|
import { preloadIcons } from '../lib/icons'
|
|
10
13
|
import AlfakitPage from '../pages/AlfakitPage.vue'
|
|
11
14
|
import { createDefaultRegistry } from '../registry'
|
|
@@ -21,6 +24,12 @@ export interface StarterKitPageOptions extends Pick<
|
|
|
21
24
|
* `null` renders the pages without a host layout.
|
|
22
25
|
*/
|
|
23
26
|
layout?: AnyComponent | null
|
|
27
|
+
/**
|
|
28
|
+
* Auto-registered custom components, as for `createAlfakit({ discover })`: pass
|
|
29
|
+
* `import.meta.glob('../../alfakit/{fields,columns,entries,widgets,pages,components,blocks}/**\/*.vue')`
|
|
30
|
+
* from `resources/js/pages/Alfakit/Page.vue` and every file there registers under its name.
|
|
31
|
+
*/
|
|
32
|
+
discover?: AlfakitOptions<AnyComponent>['discover']
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
// One context for the browser session (it survives navigations between host and Alfakit
|
|
@@ -28,14 +37,21 @@ export interface StarterKitPageOptions extends Pick<
|
|
|
28
37
|
let browserContext: AlfakitContextValue | null = null
|
|
29
38
|
|
|
30
39
|
function createStarterKitContext(options: StarterKitPageOptions): AlfakitContextValue {
|
|
40
|
+
// The host's layout replaces the panel's. Auth pages (invitations, tenant registration)
|
|
41
|
+
// keep the panel's card; the fullscreen layout loads on demand.
|
|
42
|
+
// Auto-registered files sit between the built-ins and the explicit `components` / `pages`.
|
|
43
|
+
const discovered = discoverComponents(options.discover)
|
|
31
44
|
const registry = createDefaultRegistry()
|
|
45
|
+
.registerMany(lazyPanelLayouts)
|
|
46
|
+
.register('layout:auth', AuthLayout)
|
|
32
47
|
.register('layout:app', StarterKitContentLayout)
|
|
48
|
+
.registerMany(discovered.components)
|
|
33
49
|
.registerMany(options.components ?? {})
|
|
34
50
|
const translator = new Translator()
|
|
35
51
|
|
|
36
52
|
return {
|
|
37
53
|
registry,
|
|
38
|
-
pages: { 'Alfakit/Page': AlfakitPage, ...options.pages },
|
|
54
|
+
pages: { 'Alfakit/Page': AlfakitPage, ...discovered.pages, ...options.pages },
|
|
39
55
|
translator,
|
|
40
56
|
actions: new ActionRunner({
|
|
41
57
|
endpoints: { action: '', modal: '' },
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
configureCharts,
|
|
3
3
|
registerRichEditorExtensions,
|
|
4
4
|
starterKitBreadcrumbsFromProps,
|
|
5
|
+
usesStarterKitHostLayout,
|
|
5
6
|
} from '@alfakit/core'
|
|
6
7
|
import { defineComponent, h, markRaw } from 'vue'
|
|
7
8
|
import AlfakitPage from '../pages/AlfakitPage.vue'
|
|
@@ -38,7 +39,7 @@ export function createStarterKitPage(options: StarterKitPageOptions = {}) {
|
|
|
38
39
|
// A layout callback: the host layout (with the page's breadcrumbs), then Alfakit's root.
|
|
39
40
|
return Object.assign(page, {
|
|
40
41
|
layout: (props: Record<string, unknown>) => [
|
|
41
|
-
...(options.layout
|
|
42
|
+
...(options.layout && usesStarterKitHostLayout(props)
|
|
42
43
|
? [[markRaw(options.layout), { breadcrumbs: starterKitBreadcrumbsFromProps(props) }]]
|
|
43
44
|
: []),
|
|
44
45
|
[AlfakitStarterKitRoot, { options }],
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
registerStarterKitCopilotShortcut,
|
|
4
|
+
requestStarterKitCopilot,
|
|
5
|
+
type StarterKitWidgets,
|
|
6
|
+
} from '@alfakit/core'
|
|
7
|
+
import { computed, watch } from 'vue'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The AI copilot's button until its code has loaded: the same look, from the shared prop
|
|
11
|
+
* alone (its code loads once mounted). A click and its key bindings (`mod+j`) are
|
|
12
|
+
* remembered and open it once loaded.
|
|
13
|
+
*/
|
|
14
|
+
const props = defineProps<{ source: StarterKitWidgets }>()
|
|
15
|
+
|
|
16
|
+
const copilot = computed(() => props.source.widgets.copilot)
|
|
17
|
+
|
|
18
|
+
if (typeof window !== 'undefined') {
|
|
19
|
+
watch(
|
|
20
|
+
copilot,
|
|
21
|
+
(value, _old, onCleanup) =>
|
|
22
|
+
onCleanup(registerStarterKitCopilotShortcut(value?.keyBindings ?? [], value?.label ?? '')),
|
|
23
|
+
{ immediate: true },
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<template>
|
|
29
|
+
<button
|
|
30
|
+
type="button"
|
|
31
|
+
data-slot="ai-copilot-trigger"
|
|
32
|
+
:aria-label="copilot?.label"
|
|
33
|
+
aria-haspopup="dialog"
|
|
34
|
+
:title="copilot?.label"
|
|
35
|
+
class="hover:bg-accent hover:text-accent-foreground inline-flex size-9 items-center justify-center rounded-md"
|
|
36
|
+
@click="requestStarterKitCopilot()"
|
|
37
|
+
>
|
|
38
|
+
<!-- Lucide's "sparkles", inline: the loaded copilot draws the same icon. -->
|
|
39
|
+
<svg
|
|
40
|
+
class="size-4"
|
|
41
|
+
aria-hidden="true"
|
|
42
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
43
|
+
viewBox="0 0 24 24"
|
|
44
|
+
fill="none"
|
|
45
|
+
stroke="currentColor"
|
|
46
|
+
stroke-width="2"
|
|
47
|
+
stroke-linecap="round"
|
|
48
|
+
stroke-linejoin="round"
|
|
49
|
+
>
|
|
50
|
+
<path
|
|
51
|
+
d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"
|
|
52
|
+
/>
|
|
53
|
+
<path d="M20 2v4" />
|
|
54
|
+
<path d="M22 4h-4" />
|
|
55
|
+
<circle cx="4" cy="20" r="2" />
|
|
56
|
+
</svg>
|
|
57
|
+
</button>
|
|
58
|
+
</template>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
starterKitCopilot,
|
|
4
|
+
takeRequestedStarterKitCopilot,
|
|
5
|
+
type StarterKitWidgets,
|
|
6
|
+
} from '@alfakit/core'
|
|
7
|
+
import { computed, toRef } from 'vue'
|
|
8
|
+
import AiCopilot from '../../components/ai/AiCopilot.vue'
|
|
9
|
+
import CopilotTrigger from './CopilotTrigger.vue'
|
|
10
|
+
import { useWidgetsPanel } from './use-widgets'
|
|
11
|
+
import WidgetShell from './WidgetShell.vue'
|
|
12
|
+
|
|
13
|
+
/** The AI copilot (the panel pages' `topbar.end` slot component), once its data has loaded. */
|
|
14
|
+
const props = defineProps<{ source: StarterKitWidgets }>()
|
|
15
|
+
|
|
16
|
+
const panel = useWidgetsPanel(toRef(props, 'source'))
|
|
17
|
+
const component = computed(() => (panel.value ? starterKitCopilot(panel.value) : null))
|
|
18
|
+
// A click or the key bindings before the copilot loaded open it at once.
|
|
19
|
+
const autoOpen = computed(() => component.value !== null && takeRequestedStarterKitCopilot())
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<template v-if="panel">
|
|
24
|
+
<WidgetShell v-if="component" :panel="panel">
|
|
25
|
+
<AiCopilot :component="component" :auto-open="autoOpen" />
|
|
26
|
+
</WidgetShell>
|
|
27
|
+
</template>
|
|
28
|
+
<CopilotTrigger v-else :source="props.source" />
|
|
29
|
+
</template>
|
|
@@ -50,6 +50,7 @@ function request() {
|
|
|
50
50
|
<span class="sr-only sm:not-sr-only sm:flex-1 sm:text-start">{{ placeholder }}</span>
|
|
51
51
|
<kbd
|
|
52
52
|
v-if="hydrated && binding"
|
|
53
|
+
dir="ltr"
|
|
53
54
|
class="bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline"
|
|
54
55
|
>{{ formatKeyBinding(binding) }}</kbd
|
|
55
56
|
>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// The header components appear in both header layouts and next to each other: the first
|
|
3
|
+
// one mounted shows the banner, the others render nothing.
|
|
4
|
+
let owner: symbol | null = null
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { isAlfakitPage, type StarterKitWidgets } from '@alfakit/core'
|
|
9
|
+
import { usePage } from '@inertiajs/vue3'
|
|
10
|
+
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
|
11
|
+
import ImpersonationBanner from '../../components/panel/ImpersonationBanner.vue'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The impersonation banner (who you are signed in as, **Leave**) on the host's own pages,
|
|
15
|
+
* rendered by the header components. AlfaKit's pages render their own (`AlfakitRoot`).
|
|
16
|
+
*/
|
|
17
|
+
const props = defineProps<{ source: StarterKitWidgets | null }>()
|
|
18
|
+
const page = usePage()
|
|
19
|
+
const id = Symbol('impersonation-banner')
|
|
20
|
+
const owns = ref(false)
|
|
21
|
+
const impersonation = computed(() => props.source?.widgets.impersonation)
|
|
22
|
+
const active = computed(() => impersonation.value !== undefined && !isAlfakitPage(page.props))
|
|
23
|
+
|
|
24
|
+
function release(): void {
|
|
25
|
+
if (owner === id) owner = null
|
|
26
|
+
owns.value = false
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Claimed once mounted, so the server render and hydration never include it.
|
|
30
|
+
let stop: (() => void) | null = null
|
|
31
|
+
|
|
32
|
+
onMounted(() => {
|
|
33
|
+
stop = watch(
|
|
34
|
+
active,
|
|
35
|
+
(value) => {
|
|
36
|
+
if (!value) {
|
|
37
|
+
release()
|
|
38
|
+
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (owner === null) owner = id
|
|
43
|
+
owns.value = owner === id
|
|
44
|
+
},
|
|
45
|
+
{ immediate: true },
|
|
46
|
+
)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
onBeforeUnmount(() => {
|
|
50
|
+
stop?.()
|
|
51
|
+
release()
|
|
52
|
+
})
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
<template>
|
|
56
|
+
<ImpersonationBanner v-if="active && owns" :impersonation="impersonation" />
|
|
57
|
+
</template>
|
|
@@ -63,7 +63,7 @@ const visible = computed(
|
|
|
63
63
|
<DropdownMenuSeparator v-if="tenancy.tenants.length > 0" />
|
|
64
64
|
<DropdownMenuItem @select="router.visit(tenancy.registrationUrl!)">
|
|
65
65
|
<Icon name="alfakit::panels.tenant-menu.registration-button" :fallback="PlusIcon" />
|
|
66
|
-
{{ t('tenancy.register', {}, 'New') }}
|
|
66
|
+
{{ tenancy.registrationLabel ?? t('tenancy.register', {}, 'New') }}
|
|
67
67
|
</DropdownMenuItem>
|
|
68
68
|
</template>
|
|
69
69
|
</DropdownMenuContent>
|
|
@@ -4,8 +4,17 @@ import {
|
|
|
4
4
|
type StarterKitWidgetsSchema,
|
|
5
5
|
} from '@alfakit/core'
|
|
6
6
|
import { usePage } from '@inertiajs/vue3'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
computed,
|
|
9
|
+
defineAsyncComponent,
|
|
10
|
+
defineComponent,
|
|
11
|
+
h,
|
|
12
|
+
type Component,
|
|
13
|
+
type ComputedRef,
|
|
14
|
+
type PropType,
|
|
15
|
+
} from 'vue'
|
|
8
16
|
import { lazyComponent } from '../../lib/lazy'
|
|
17
|
+
import CopilotTrigger from './CopilotTrigger.vue'
|
|
9
18
|
import NotificationsTrigger from './NotificationsTrigger.vue'
|
|
10
19
|
import SearchTrigger from './SearchTrigger.vue'
|
|
11
20
|
import TenantSwitcherTrigger from './TenantSwitcherTrigger.vue'
|
|
@@ -18,12 +27,13 @@ import TenantSwitcherTrigger from './TenantSwitcherTrigger.vue'
|
|
|
18
27
|
*
|
|
19
28
|
* ```vue
|
|
20
29
|
* <script setup lang="ts">
|
|
21
|
-
* import { AlfakitNotifications, AlfakitSearch } from '@alfakit/vue'
|
|
30
|
+
* import { AlfakitCopilot, AlfakitNotifications, AlfakitSearch } from '@alfakit/vue'
|
|
22
31
|
* </script>
|
|
23
32
|
*
|
|
24
33
|
* <template>
|
|
25
34
|
* <AlfakitSearch />
|
|
26
35
|
* <AlfakitNotifications />
|
|
36
|
+
* <AlfakitCopilot />
|
|
27
37
|
* </template>
|
|
28
38
|
* ```
|
|
29
39
|
*/
|
|
@@ -31,51 +41,73 @@ import TenantSwitcherTrigger from './TenantSwitcherTrigger.vue'
|
|
|
31
41
|
/** The header components' data of a `starterKit()` panel from the shared prop, or null. */
|
|
32
42
|
function useStarterKitWidgets(
|
|
33
43
|
panelId: () => string | undefined,
|
|
44
|
+
part: keyof StarterKitWidgetsSchema,
|
|
34
45
|
): ComputedRef<StarterKitWidgets | null> {
|
|
35
46
|
const page = usePage()
|
|
36
47
|
|
|
37
|
-
return computed(() => starterKitWidgets(page.props, panelId()))
|
|
48
|
+
return computed(() => starterKitWidgets(page.props, panelId(), part))
|
|
38
49
|
}
|
|
39
50
|
|
|
40
51
|
const LoadedSearch = lazyComponent(
|
|
41
52
|
'AlfakitLoadedSearch',
|
|
42
|
-
() => import('./
|
|
53
|
+
() => import('./loaded').then((module) => module.LoadedSearch),
|
|
43
54
|
SearchTrigger,
|
|
44
55
|
)
|
|
45
56
|
|
|
46
57
|
const LoadedNotifications = lazyComponent(
|
|
47
58
|
'AlfakitLoadedNotifications',
|
|
48
|
-
() => import('./
|
|
59
|
+
() => import('./loaded').then((module) => module.LoadedNotifications),
|
|
49
60
|
NotificationsTrigger,
|
|
50
61
|
)
|
|
51
62
|
|
|
52
63
|
const LoadedTenantSwitcher = lazyComponent(
|
|
53
64
|
'AlfakitLoadedTenantSwitcher',
|
|
54
|
-
() => import('./
|
|
65
|
+
() => import('./loaded').then((module) => module.LoadedTenantSwitcher),
|
|
55
66
|
TenantSwitcherTrigger,
|
|
56
67
|
)
|
|
57
68
|
|
|
69
|
+
const LoadedCopilot = lazyComponent(
|
|
70
|
+
'AlfakitLoadedCopilot',
|
|
71
|
+
() => import('./loaded').then((module) => module.LoadedCopilot),
|
|
72
|
+
CopilotTrigger,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// Only needed while impersonating: its code loads then.
|
|
76
|
+
const StarterKitImpersonationBanner = defineAsyncComponent(
|
|
77
|
+
() => import('./StarterKitImpersonationBanner.vue'),
|
|
78
|
+
)
|
|
79
|
+
|
|
58
80
|
function headerWidget(
|
|
59
81
|
name: string,
|
|
60
82
|
slot: string,
|
|
61
|
-
part: keyof Omit<StarterKitWidgetsSchema, 'endpoint'>,
|
|
83
|
+
part: keyof Omit<StarterKitWidgetsSchema, 'endpoint' | 'impersonation'>,
|
|
62
84
|
loaded: Component,
|
|
63
85
|
) {
|
|
64
86
|
return defineComponent({
|
|
65
87
|
name,
|
|
66
88
|
props: {
|
|
67
|
-
/** The `starterKit()` panel to use (the first one
|
|
89
|
+
/** The `starterKit()` panel to use (by default the open AlfaKit page's panel, else the first one that has this component). */
|
|
68
90
|
panel: { type: String as PropType<string | undefined>, default: undefined },
|
|
69
91
|
},
|
|
70
92
|
setup(props) {
|
|
71
|
-
const source = useStarterKitWidgets(() => props.panel)
|
|
93
|
+
const source = useStarterKitWidgets(() => props.panel, part)
|
|
72
94
|
|
|
73
95
|
return () => {
|
|
74
96
|
const value: StarterKitWidgets | null = source.value
|
|
75
97
|
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
// While impersonating, the first header component shows the banner on host pages.
|
|
99
|
+
const banner = value?.widgets.impersonation
|
|
100
|
+
? h(StarterKitImpersonationBanner, { source: value })
|
|
78
101
|
: null
|
|
102
|
+
|
|
103
|
+
if (!value?.widgets[part]) return banner
|
|
104
|
+
|
|
105
|
+
const widget = h('span', { 'data-slot': slot, class: 'inline-flex' }, [
|
|
106
|
+
h(loaded, { source: value }),
|
|
107
|
+
])
|
|
108
|
+
|
|
109
|
+
// A single root unless the banner shows, so attributes from the app still fall through.
|
|
110
|
+
return banner ? [banner, widget] : widget
|
|
79
111
|
}
|
|
80
112
|
},
|
|
81
113
|
})
|
|
@@ -114,3 +146,16 @@ export const AlfakitTenantSwitcher = headerWidget(
|
|
|
114
146
|
'tenancy',
|
|
115
147
|
LoadedTenantSwitcher,
|
|
116
148
|
)
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* The AI copilot of alfasix/alfakit-ai (`AiPlugin::copilot()`): its button and chat
|
|
152
|
+
* slide-over, opened with its key bindings (`mod+j`) from any page. Renders nothing for
|
|
153
|
+
* guests, without the plugin's copilot, for users who may not use it and (tenancy panels)
|
|
154
|
+
* outside a tenant.
|
|
155
|
+
*/
|
|
156
|
+
export const AlfakitCopilot = headerWidget(
|
|
157
|
+
'AlfakitCopilot',
|
|
158
|
+
'starter-kit-copilot',
|
|
159
|
+
'copilot',
|
|
160
|
+
LoadedCopilot,
|
|
161
|
+
)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The loaded header components, in one module: they mount together in the host's header,
|
|
3
|
+
* so one request brings them all, and a host bundle doesn't pay for a chunk per component.
|
|
4
|
+
* Only loaded in the browser (`import('./loaded')`).
|
|
5
|
+
*/
|
|
6
|
+
export { default as LoadedCopilot } from './LoadedCopilot.vue'
|
|
7
|
+
export { default as LoadedNotifications } from './LoadedNotifications.vue'
|
|
8
|
+
export { default as LoadedSearch } from './LoadedSearch.vue'
|
|
9
|
+
export { default as LoadedTenantSwitcher } from './LoadedTenantSwitcher.vue'
|