@alfakit/vue 0.1.2 → 0.1.7
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/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 +17 -15
- 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/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/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/SliderField.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/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 +1 -1
- 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/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/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/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/TenantMenu.vue_vue_type_script_setup_true_lang.js +35 -35
- 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/SelectCell.vue_vue_type_script_setup_true_lang.js +2 -1
- 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.vue_vue_type_script_setup_true_lang.js +2 -1
- 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/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.css +7 -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/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/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 +6 -1
- package/package.json +2 -2
- package/src/AlfakitRoot.vue +9 -1
- package/src/components/actions/ActionGroupMenu.vue +13 -1
- package/src/components/actions/ActionModal.vue +9 -0
- 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/ImageEditorDialog.vue +7 -3
- package/src/components/fields/KeyValueField.vue +3 -2
- package/src/components/fields/ModalTablePicker.vue +7 -2
- package/src/components/fields/RepeaterField.vue +2 -3
- package/src/components/fields/RichEditorInput.vue +3 -0
- package/src/components/fields/item-actions.ts +31 -10
- package/src/components/form/FormBlock.vue +2 -1
- package/src/components/form/form-context.ts +2 -2
- package/src/components/kanban/KanbanBoard.vue +15 -3
- package/src/components/kanban/KanbanColumnHeader.vue +6 -4
- package/src/components/layout/SectionComponent.vue +10 -4
- package/src/components/panel/GlobalSearchPalette.vue +2 -0
- 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/TableCellContent.vue +4 -2
- package/src/components/table/TablePagination.vue +12 -7
- 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/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/StarterKitImpersonationBanner.vue +57 -0
- package/src/starter-kit/widgets/index.ts +56 -11
- package/src/starter-kit/widgets/loaded.ts +9 -0
- package/src/styles.css +9 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalSearchPalette.js","names":["_sfc_main","GlobalSearchPalette_vue_vue_type_script_setup_true_lang_default","GlobalSearchPalette_default"],"sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n ActionSchema,\n CommandPaletteResponse,\n GlobalSearchGroupSchema,\n PaletteGroup,\n PaletteItem,\n} from '@alfakit/core'\nimport {\n canInstallPwa,\n commandPaletteItems,\n createLatestRequest,\n debounce,\n filterCommandPalette,\n globalSearchDebounce,\n globalSearchStatus,\n paletteGroupKey,\n pwaStore,\n requestJson,\n setAppearance,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useChoice, usePageSchema, usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport CommandDialog from '../ui/CommandDialog.vue'\nimport CommandEmpty from '../ui/CommandEmpty.vue'\nimport CommandGroup from '../ui/CommandGroup.vue'\nimport CommandInput from '../ui/CommandInput.vue'\nimport CommandItem from '../ui/CommandItem.vue'\nimport CommandList from '../ui/CommandList.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport ShortcutKeys from './ShortcutKeys.vue'\nimport { installPwa } from './pwa'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\n\ntype SearchGroup = GlobalSearchGroupSchema\n\n/**\n * The command palette behind `GlobalSearch`: global search results plus (with\n * `alfakit.commandPalette`) the page's header actions, panel commands, navigation, \"create\"\n * links, recent records, theme switching and the shortcuts overlay. Its code loads the first\n * time the palette opens; the trigger and `mod+k` stay in the shell.\n */\nconst open = defineModel<boolean>('open', { default: false })\n\n/** Groups listed after the global search results. */\nconst TRAILING_GROUPS = new Set(['theme', 'help'])\n\nconst t = useT()\nconst choice = useChoice()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst query = ref('')\nconst groups = ref<SearchGroup[]>([])\nconst loading = ref(false)\nconst loaded = ref<CommandPaletteResponse | null>(null)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\nconst overlay = computed(\n () => panel.value.keyboardShortcuts !== false && panel.value.keyboardShortcuts !== undefined,\n)\n\n// Create links and recent records, loaded each time the palette opens (also when it mounts\n// open: the first time, its code arrives after the click or `mod+k`).\nwatch(\n open,\n (value, _old, onCleanup) => {\n const url = panel.value.endpoints.commandPalette\n\n if (!value || !palette.value || !url) return\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n requestJson<CommandPaletteResponse>(url)\n .then((response) => {\n if (active) loaded.value = response\n })\n .catch(() => {\n if (active) loaded.value = { create: [], recent: [] }\n })\n },\n { immediate: true },\n)\n\nconst latest = createLatestRequest()\n\nconst search = debounce((term: string) => {\n const url = endpoint.value\n\n if (!url || term.trim() === '') {\n latest.cancel()\n groups.value = []\n loading.value = false\n\n return\n }\n\n // Only the newest request may update the results: older responses are aborted/dropped.\n void latest\n .run(\n (signal) => requestJson<{ groups: SearchGroup[] }>(url, { query: { search: term }, signal }),\n (response) => {\n groups.value = response.groups\n },\n () => {\n loading.value = false\n },\n )\n .catch(() => {\n groups.value = []\n })\n}, globalSearchDebounce(config.value))\n\nwatch(query, (term) => {\n loading.value = endpoint.value !== undefined && term.trim() !== ''\n search(term)\n})\n\nonScopeDispose(() => {\n search.cancel()\n latest.cancel()\n})\n\n// Closing the palette (or navigating away) starts the next search from scratch.\nconst reset = () => {\n search.cancel()\n latest.cancel()\n query.value = ''\n groups.value = []\n loading.value = false\n loaded.value = null\n}\n\nwatch(open, (value) => {\n if (!value) reset()\n})\n\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n reset()\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n\n// `Panel::pwa()`: \"Install app\" while the browser offers it (or on iOS Safari).\nconst pwaState = useStore(pwaStore)\nconst installable = computed(() => Boolean(panel.value.pwa) && canInstallPwa(pwaState.value))\n\nconst items = computed(() =>\n commandPaletteItems({\n panel: panel.value,\n page: page.value,\n loaded: loaded.value,\n shortcutsOverlay: overlay.value,\n ...(installable.value ? { install: t('pwa.install', {}, 'Install app') } : {}),\n labels: {\n light: t('palette.theme.light', {}, 'Light theme'),\n dark: t('palette.theme.dark', {}, 'Dark theme'),\n system: t('palette.theme.system', {}, 'System theme'),\n shortcuts: t('palette.shortcuts', {}, 'Keyboard shortcuts'),\n },\n }),\n)\nconst local = computed(() => filterCommandPalette(items.value, query.value))\nconst leading = computed(() => local.value.filter((group) => !TRAILING_GROUPS.has(group.id)))\nconst trailing = computed(() => local.value.filter((group) => TRAILING_GROUPS.has(group.id)))\n\n// Announced by the `aria-live` region once a search has finished.\nconst status = computed(() =>\n globalSearchStatus(\n query.value,\n loading.value,\n [...groups.value, ...local.value.map((group) => ({ results: group.items }))],\n { t, choice },\n ),\n)\n\nconst defaultGroupLabels: Record<string, string> = {\n recent: 'Recent',\n actions: 'Actions',\n commands: 'Commands',\n create: 'Create',\n navigation: 'Go to',\n theme: 'Theme',\n help: 'Help',\n}\n\nconst heading = (group: PaletteGroup) => {\n const id = group.id.startsWith('commands:') ? 'commands' : group.id\n\n return group.label ?? t(paletteGroupKey(group.id), {}, defaultGroupLabels[id] ?? id)\n}\n\nconst subtitle = (group: PaletteGroup, item: PaletteItem) =>\n item.description ??\n (group.id === 'recent' || group.id === 'navigation' ? item.groupLabel : undefined)\n\nconst run = (item: PaletteItem) => {\n open.value = false\n\n if (item.kind === 'action' && item.action && item.context) {\n void runner.trigger(item.action, item.context)\n } else if (item.kind === 'url' && item.url) {\n if (item.openInNewTab) {\n window.open(item.url, '_blank', 'noopener,noreferrer')\n } else {\n router.visit(item.url)\n }\n } else if (item.kind === 'theme' && item.appearance) {\n setAppearance(item.appearance, panel.value)\n } else if (item.kind === 'shortcut' && item.shortcutId) {\n const id = item.shortcutId\n // After the dialog closed, so focus returns to the page before the overlay opens.\n setTimeout(() => shortcuts.trigger(id), 0)\n } else if (item.kind === 'install') {\n void installPwa(t)\n }\n}\n\nconst select = (url: string) => {\n open.value = false\n router.visit(url)\n}\n\n// A URL action next to a search result (`getGlobalSearchResultActions()`); the item itself\n// navigates on select, so the click must not reach it.\nconst visitAction = (event: MouseEvent, action: ActionSchema) => {\n event.stopPropagation()\n\n if (!action.url || action.openUrlInNewTab || event.metaKey || event.ctrlKey) return\n\n event.preventDefault()\n open.value = false\n router.visit(action.url)\n}\n\nconst details = (result: SearchGroup['results'][number]) =>\n Object.entries(result.details ?? {})\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join(' · ')\n\nconst hasResults = computed(() => groups.value.length > 0 || local.value.length > 0)\n</script>\n\n<template>\n <CommandDialog\n :open=\"open\"\n :title=\"palette ? t('command_palette', {}, 'Command palette') : t('search', {}, 'Search')\"\n :description=\"placeholder\"\n @update:open=\"open = $event\"\n >\n <Slot name=\"global-search.start\" />\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\">{{ status }}</div>\n <CommandInput\n :placeholder=\"placeholder\"\n :model-value=\"query\"\n @update:model-value=\"query = $event\"\n />\n <CommandList>\n <CommandEmpty v-if=\"!loading && !hasResults\">{{\n query ? t('no_results', {}, 'No results.') : placeholder\n }}</CommandEmpty>\n <CommandGroup\n v-for=\"group in leading\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span class=\"truncate\">{{ item.label }}</span>\n <span v-if=\"subtitle(group, item)\" class=\"text-muted-foreground truncate text-xs\">{{\n subtitle(group, item)\n }}</span>\n </div>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n <div v-if=\"loading\" class=\"flex justify-center py-6\"><Spinner /></div>\n <CommandGroup\n v-for=\"group in groups\"\n :key=\"group.label\"\n :heading=\"group.label\"\n data-group=\"search\"\n >\n <CommandItem\n v-for=\"result in group.results\"\n :key=\"result.url\"\n :value=\"`search:${group.label}:${result.url}`\"\n @select=\"select(result.url)\"\n >\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span>{{ result.title }}</span>\n <span v-if=\"result.details\" class=\"text-muted-foreground text-xs\">{{\n details(result)\n }}</span>\n </div>\n <div\n v-if=\"result.actions?.length\"\n data-slot=\"global-search-actions\"\n class=\"ms-auto flex shrink-0 gap-1\"\n >\n <Button\n v-for=\"action in result.actions.filter((item) => item.url)\"\n :key=\"action.name\"\n as-child\n variant=\"ghost\"\n size=\"xs\"\n class=\"h-6 px-2 text-xs\"\n >\n <a\n :href=\"action.url\"\n :target=\"action.openUrlInNewTab ? '_blank' : undefined\"\n :rel=\"action.openUrlInNewTab ? 'noopener noreferrer' : undefined\"\n :aria-label=\"action.label ? undefined : (action.tooltip ?? action.name)\"\n @pointerdown.stop\n @click=\"visitAction($event, action)\"\n >\n <Icon v-if=\"action.icon\" :name=\"action.icon\" class=\"size-3.5\" />\n {{ action.label }}\n </a>\n </Button>\n </div>\n </CommandItem>\n </CommandGroup>\n <CommandGroup\n v-for=\"group in trailing\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n </CommandList>\n <Slot name=\"global-search.end\" />\n </CommandDialog>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"GlobalSearchPalette.js","names":["_sfc_main","GlobalSearchPalette_vue_vue_type_script_setup_true_lang_default","GlobalSearchPalette_default"],"sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n ActionSchema,\n CommandPaletteResponse,\n GlobalSearchGroupSchema,\n PaletteGroup,\n PaletteItem,\n} from '@alfakit/core'\nimport {\n canInstallPwa,\n commandPaletteItems,\n createLatestRequest,\n debounce,\n filterCommandPalette,\n globalSearchDebounce,\n globalSearchStatus,\n paletteGroupKey,\n pwaStore,\n requestJson,\n setAppearance,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useChoice, usePageSchema, usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport CommandDialog from '../ui/CommandDialog.vue'\nimport CommandEmpty from '../ui/CommandEmpty.vue'\nimport CommandGroup from '../ui/CommandGroup.vue'\nimport CommandInput from '../ui/CommandInput.vue'\nimport CommandItem from '../ui/CommandItem.vue'\nimport CommandAutoHighlight from '../ui/CommandAutoHighlight.vue'\nimport CommandList from '../ui/CommandList.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport ShortcutKeys from './ShortcutKeys.vue'\nimport { installPwa } from './pwa'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\n\ntype SearchGroup = GlobalSearchGroupSchema\n\n/**\n * The command palette behind `GlobalSearch`: global search results plus (with\n * `alfakit.commandPalette`) the page's header actions, panel commands, navigation, \"create\"\n * links, recent records, theme switching and the shortcuts overlay. Its code loads the first\n * time the palette opens; the trigger and `mod+k` stay in the shell.\n */\nconst open = defineModel<boolean>('open', { default: false })\n\n/** Groups listed after the global search results. */\nconst TRAILING_GROUPS = new Set(['theme', 'help'])\n\nconst t = useT()\nconst choice = useChoice()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst query = ref('')\nconst groups = ref<SearchGroup[]>([])\nconst loading = ref(false)\nconst loaded = ref<CommandPaletteResponse | null>(null)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\nconst overlay = computed(\n () => panel.value.keyboardShortcuts !== false && panel.value.keyboardShortcuts !== undefined,\n)\n\n// Create links and recent records, loaded each time the palette opens (also when it mounts\n// open: the first time, its code arrives after the click or `mod+k`).\nwatch(\n open,\n (value, _old, onCleanup) => {\n const url = panel.value.endpoints.commandPalette\n\n if (!value || !palette.value || !url) return\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n requestJson<CommandPaletteResponse>(url)\n .then((response) => {\n if (active) loaded.value = response\n })\n .catch(() => {\n if (active) loaded.value = { create: [], recent: [] }\n })\n },\n { immediate: true },\n)\n\nconst latest = createLatestRequest()\n\nconst search = debounce((term: string) => {\n const url = endpoint.value\n\n if (!url || term.trim() === '') {\n latest.cancel()\n groups.value = []\n loading.value = false\n\n return\n }\n\n // Only the newest request may update the results: older responses are aborted/dropped.\n void latest\n .run(\n (signal) => requestJson<{ groups: SearchGroup[] }>(url, { query: { search: term }, signal }),\n (response) => {\n groups.value = response.groups\n },\n () => {\n loading.value = false\n },\n )\n .catch(() => {\n groups.value = []\n })\n}, globalSearchDebounce(config.value))\n\nwatch(query, (term) => {\n loading.value = endpoint.value !== undefined && term.trim() !== ''\n search(term)\n})\n\nonScopeDispose(() => {\n search.cancel()\n latest.cancel()\n})\n\n// Closing the palette (or navigating away) starts the next search from scratch.\nconst reset = () => {\n search.cancel()\n latest.cancel()\n query.value = ''\n groups.value = []\n loading.value = false\n loaded.value = null\n}\n\nwatch(open, (value) => {\n if (!value) reset()\n})\n\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n reset()\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n\n// `Panel::pwa()`: \"Install app\" while the browser offers it (or on iOS Safari).\nconst pwaState = useStore(pwaStore)\nconst installable = computed(() => Boolean(panel.value.pwa) && canInstallPwa(pwaState.value))\n\nconst items = computed(() =>\n commandPaletteItems({\n panel: panel.value,\n page: page.value,\n loaded: loaded.value,\n shortcutsOverlay: overlay.value,\n ...(installable.value ? { install: t('pwa.install', {}, 'Install app') } : {}),\n labels: {\n light: t('palette.theme.light', {}, 'Light theme'),\n dark: t('palette.theme.dark', {}, 'Dark theme'),\n system: t('palette.theme.system', {}, 'System theme'),\n shortcuts: t('palette.shortcuts', {}, 'Keyboard shortcuts'),\n },\n }),\n)\nconst local = computed(() => filterCommandPalette(items.value, query.value))\nconst leading = computed(() => local.value.filter((group) => !TRAILING_GROUPS.has(group.id)))\nconst trailing = computed(() => local.value.filter((group) => TRAILING_GROUPS.has(group.id)))\n\n// Announced by the `aria-live` region once a search has finished.\nconst status = computed(() =>\n globalSearchStatus(\n query.value,\n loading.value,\n [...groups.value, ...local.value.map((group) => ({ results: group.items }))],\n { t, choice },\n ),\n)\n\nconst defaultGroupLabels: Record<string, string> = {\n recent: 'Recent',\n actions: 'Actions',\n commands: 'Commands',\n create: 'Create',\n navigation: 'Go to',\n theme: 'Theme',\n help: 'Help',\n}\n\nconst heading = (group: PaletteGroup) => {\n const id = group.id.startsWith('commands:') ? 'commands' : group.id\n\n return group.label ?? t(paletteGroupKey(group.id), {}, defaultGroupLabels[id] ?? id)\n}\n\nconst subtitle = (group: PaletteGroup, item: PaletteItem) =>\n item.description ??\n (group.id === 'recent' || group.id === 'navigation' ? item.groupLabel : undefined)\n\nconst run = (item: PaletteItem) => {\n open.value = false\n\n if (item.kind === 'action' && item.action && item.context) {\n void runner.trigger(item.action, item.context)\n } else if (item.kind === 'url' && item.url) {\n if (item.openInNewTab) {\n window.open(item.url, '_blank', 'noopener,noreferrer')\n } else {\n router.visit(item.url)\n }\n } else if (item.kind === 'theme' && item.appearance) {\n setAppearance(item.appearance, panel.value)\n } else if (item.kind === 'shortcut' && item.shortcutId) {\n const id = item.shortcutId\n // After the dialog closed, so focus returns to the page before the overlay opens.\n setTimeout(() => shortcuts.trigger(id), 0)\n } else if (item.kind === 'install') {\n void installPwa(t)\n }\n}\n\nconst select = (url: string) => {\n open.value = false\n router.visit(url)\n}\n\n// A URL action next to a search result (`getGlobalSearchResultActions()`); the item itself\n// navigates on select, so the click must not reach it.\nconst visitAction = (event: MouseEvent, action: ActionSchema) => {\n event.stopPropagation()\n\n if (!action.url || action.openUrlInNewTab || event.metaKey || event.ctrlKey) return\n\n event.preventDefault()\n open.value = false\n router.visit(action.url)\n}\n\nconst details = (result: SearchGroup['results'][number]) =>\n Object.entries(result.details ?? {})\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join(' · ')\n\nconst hasResults = computed(() => groups.value.length > 0 || local.value.length > 0)\n</script>\n\n<template>\n <CommandDialog\n :open=\"open\"\n :title=\"palette ? t('command_palette', {}, 'Command palette') : t('search', {}, 'Search')\"\n :description=\"placeholder\"\n @update:open=\"open = $event\"\n >\n <Slot name=\"global-search.start\" />\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\">{{ status }}</div>\n <CommandInput\n :placeholder=\"placeholder\"\n :model-value=\"query\"\n @update:model-value=\"query = $event\"\n />\n <CommandList>\n <CommandAutoHighlight :items=\"[groups, local, leading]\" />\n <CommandEmpty v-if=\"!loading && !hasResults\">{{\n query ? t('no_results', {}, 'No results.') : placeholder\n }}</CommandEmpty>\n <CommandGroup\n v-for=\"group in leading\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span class=\"truncate\">{{ item.label }}</span>\n <span v-if=\"subtitle(group, item)\" class=\"text-muted-foreground truncate text-xs\">{{\n subtitle(group, item)\n }}</span>\n </div>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n <div v-if=\"loading\" class=\"flex justify-center py-6\"><Spinner /></div>\n <CommandGroup\n v-for=\"group in groups\"\n :key=\"group.label\"\n :heading=\"group.label\"\n data-group=\"search\"\n >\n <CommandItem\n v-for=\"result in group.results\"\n :key=\"result.url\"\n :value=\"`search:${group.label}:${result.url}`\"\n @select=\"select(result.url)\"\n >\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span>{{ result.title }}</span>\n <span v-if=\"result.details\" class=\"text-muted-foreground text-xs\">{{\n details(result)\n }}</span>\n </div>\n <div\n v-if=\"result.actions?.length\"\n data-slot=\"global-search-actions\"\n class=\"ms-auto flex shrink-0 gap-1\"\n >\n <Button\n v-for=\"action in result.actions.filter((item) => item.url)\"\n :key=\"action.name\"\n as-child\n variant=\"ghost\"\n size=\"xs\"\n class=\"h-6 px-2 text-xs\"\n >\n <a\n :href=\"action.url\"\n :target=\"action.openUrlInNewTab ? '_blank' : undefined\"\n :rel=\"action.openUrlInNewTab ? 'noopener noreferrer' : undefined\"\n :aria-label=\"action.label ? undefined : (action.tooltip ?? action.name)\"\n @pointerdown.stop\n @click=\"visitAction($event, action)\"\n >\n <Icon v-if=\"action.icon\" :name=\"action.icon\" class=\"size-3.5\" />\n {{ action.label }}\n </a>\n </Button>\n </div>\n </CommandItem>\n </CommandGroup>\n <CommandGroup\n v-for=\"group in trailing\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n </CommandList>\n <Slot name=\"global-search.end\" />\n </CommandDialog>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalSearchPalette.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GlobalSearchPalette.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"names":[],"mappings":"AA+nBA,KAAK,iBAAiB,GAAG;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;;;;;;AAucF,wBAOG"}
|
|
@@ -4,43 +4,44 @@ import a from "../../lib/Icon.js";
|
|
|
4
4
|
import te from "../ui/Button2.js";
|
|
5
5
|
import ne from "../ui/Spinner.js";
|
|
6
6
|
import o from "./Slot.js";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import { installPwa as
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
7
|
+
import re from "../ui/CommandEmpty.js";
|
|
8
|
+
import s from "../ui/CommandGroup.js";
|
|
9
|
+
import ie from "../ui/CommandInput.js";
|
|
10
|
+
import c from "../ui/CommandItem.js";
|
|
11
|
+
import ae from "../ui/CommandList.js";
|
|
12
|
+
import { installPwa as oe } from "./pwa.js";
|
|
13
|
+
import l from "./ShortcutKeys.js";
|
|
14
|
+
import se from "../ui/CommandDialog.js";
|
|
15
|
+
import ce from "../ui/CommandAutoHighlight.js";
|
|
16
|
+
import { canInstallPwa as le, commandPaletteItems as ue, createLatestRequest as de, debounce as fe, filterCommandPalette as pe, globalSearchDebounce as me, globalSearchStatus as he, paletteGroupKey as ge, pwaStore as u, requestJson as d, setAppearance as _e, shortcuts as ve } from "@alfakit/core";
|
|
16
17
|
import { router as f } from "@inertiajs/vue3";
|
|
17
|
-
import { Fragment as p, computed as m, createBlock as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, createTextVNode as y, createVNode as b, defineComponent as x, onBeforeUnmount as
|
|
18
|
+
import { Fragment as p, computed as m, createBlock as h, createCommentVNode as g, createElementBlock as _, createElementVNode as v, createTextVNode as y, createVNode as b, defineComponent as x, onBeforeUnmount as ye, onMounted as be, onScopeDispose as xe, openBlock as S, ref as C, renderList as w, toDisplayString as T, unref as E, useModel as Se, watch as D, withCtx as O, withModifiers as k } from "vue";
|
|
18
19
|
//#region src/components/panel/GlobalSearchPalette.vue?vue&type=script&setup=true&lang.ts
|
|
19
20
|
var A = {
|
|
20
21
|
role: "status",
|
|
21
22
|
"aria-live": "polite",
|
|
22
23
|
"aria-atomic": "true",
|
|
23
24
|
class: "sr-only"
|
|
24
|
-
}, j = { class: "flex min-w-0 flex-1 flex-col" },
|
|
25
|
+
}, j = { class: "flex min-w-0 flex-1 flex-col" }, Ce = { class: "truncate" }, we = {
|
|
25
26
|
key: 0,
|
|
26
27
|
class: "text-muted-foreground truncate text-xs"
|
|
27
|
-
},
|
|
28
|
+
}, Te = {
|
|
28
29
|
key: 1,
|
|
29
30
|
class: "flex justify-center py-6"
|
|
30
|
-
},
|
|
31
|
+
}, Ee = { class: "flex min-w-0 flex-1 flex-col" }, De = {
|
|
31
32
|
key: 0,
|
|
32
33
|
class: "text-muted-foreground text-xs"
|
|
33
|
-
},
|
|
34
|
+
}, Oe = {
|
|
34
35
|
key: 0,
|
|
35
36
|
"data-slot": "global-search-actions",
|
|
36
37
|
class: "ms-auto flex shrink-0 gap-1"
|
|
37
|
-
},
|
|
38
|
+
}, ke = [
|
|
38
39
|
"href",
|
|
39
40
|
"target",
|
|
40
41
|
"rel",
|
|
41
42
|
"aria-label",
|
|
42
43
|
"onClick"
|
|
43
|
-
],
|
|
44
|
+
], Ae = { class: "min-w-0 flex-1 truncate" }, M = /*@__PURE__*/ x({
|
|
44
45
|
__name: "GlobalSearchPalette",
|
|
45
46
|
props: {
|
|
46
47
|
open: {
|
|
@@ -51,72 +52,72 @@ var A = {
|
|
|
51
52
|
},
|
|
52
53
|
emits: ["update:open"],
|
|
53
54
|
setup(x) {
|
|
54
|
-
let
|
|
55
|
-
D(
|
|
56
|
-
let r =
|
|
57
|
-
if (!e || !
|
|
55
|
+
let M = Se(x, "open"), N = /* @__PURE__ */ new Set(["theme", "help"]), P = i(), je = t(), F = r(), Me = n(), Ne = e(), I = C(""), L = C([]), R = C(!1), z = C(null), B = m(() => F.value.globalSearch), V = m(() => F.value.commandPalette), H = m(() => B.value ? F.value.endpoints.globalSearch : void 0), U = m(() => B.value?.placeholder ?? V.value?.placeholder ?? P("palette.placeholder", {}, "Type a command or search…")), Pe = m(() => F.value.keyboardShortcuts !== !1 && F.value.keyboardShortcuts !== void 0);
|
|
56
|
+
D(M, (e, t, n) => {
|
|
57
|
+
let r = F.value.endpoints.commandPalette;
|
|
58
|
+
if (!e || !V.value || !r) return;
|
|
58
59
|
let i = !0;
|
|
59
60
|
n(() => {
|
|
60
61
|
i = !1;
|
|
61
62
|
}), d(r).then((e) => {
|
|
62
|
-
i && (
|
|
63
|
+
i && (z.value = e);
|
|
63
64
|
}).catch(() => {
|
|
64
|
-
i && (
|
|
65
|
+
i && (z.value = {
|
|
65
66
|
create: [],
|
|
66
67
|
recent: []
|
|
67
68
|
});
|
|
68
69
|
});
|
|
69
70
|
}, { immediate: !0 });
|
|
70
|
-
let
|
|
71
|
-
let t =
|
|
71
|
+
let W = de(), G = fe((e) => {
|
|
72
|
+
let t = H.value;
|
|
72
73
|
if (!t || e.trim() === "") {
|
|
73
|
-
|
|
74
|
+
W.cancel(), L.value = [], R.value = !1;
|
|
74
75
|
return;
|
|
75
76
|
}
|
|
76
|
-
|
|
77
|
+
W.run((n) => d(t, {
|
|
77
78
|
query: { search: e },
|
|
78
79
|
signal: n
|
|
79
80
|
}), (e) => {
|
|
80
|
-
|
|
81
|
+
L.value = e.groups;
|
|
81
82
|
}, () => {
|
|
82
|
-
|
|
83
|
+
R.value = !1;
|
|
83
84
|
}).catch(() => {
|
|
84
|
-
|
|
85
|
+
L.value = [];
|
|
85
86
|
});
|
|
86
|
-
},
|
|
87
|
-
D(
|
|
88
|
-
|
|
89
|
-
}),
|
|
90
|
-
|
|
87
|
+
}, me(B.value));
|
|
88
|
+
D(I, (e) => {
|
|
89
|
+
R.value = H.value !== void 0 && e.trim() !== "", G(e);
|
|
90
|
+
}), xe(() => {
|
|
91
|
+
G.cancel(), W.cancel();
|
|
91
92
|
});
|
|
92
|
-
let
|
|
93
|
-
|
|
93
|
+
let K = () => {
|
|
94
|
+
G.cancel(), W.cancel(), I.value = "", L.value = [], R.value = !1, z.value = null;
|
|
94
95
|
};
|
|
95
|
-
D(
|
|
96
|
-
e ||
|
|
96
|
+
D(M, (e) => {
|
|
97
|
+
e || K();
|
|
97
98
|
});
|
|
98
|
-
let
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
let q;
|
|
100
|
+
be(() => {
|
|
101
|
+
q = f.on("navigate", () => {
|
|
102
|
+
M.value = !1, K();
|
|
102
103
|
});
|
|
103
|
-
}),
|
|
104
|
-
let
|
|
105
|
-
panel:
|
|
106
|
-
page:
|
|
107
|
-
loaded:
|
|
108
|
-
shortcutsOverlay:
|
|
109
|
-
...
|
|
104
|
+
}), ye(() => q?.());
|
|
105
|
+
let Fe = ee(u), Ie = m(() => !!F.value.pwa && le(Fe.value)), Le = m(() => ue({
|
|
106
|
+
panel: F.value,
|
|
107
|
+
page: Me.value,
|
|
108
|
+
loaded: z.value,
|
|
109
|
+
shortcutsOverlay: Pe.value,
|
|
110
|
+
...Ie.value ? { install: P("pwa.install", {}, "Install app") } : {},
|
|
110
111
|
labels: {
|
|
111
|
-
light:
|
|
112
|
-
dark:
|
|
113
|
-
system:
|
|
114
|
-
shortcuts:
|
|
112
|
+
light: P("palette.theme.light", {}, "Light theme"),
|
|
113
|
+
dark: P("palette.theme.dark", {}, "Dark theme"),
|
|
114
|
+
system: P("palette.theme.system", {}, "System theme"),
|
|
115
|
+
shortcuts: P("palette.shortcuts", {}, "Keyboard shortcuts")
|
|
115
116
|
}
|
|
116
|
-
})),
|
|
117
|
-
t:
|
|
118
|
-
choice:
|
|
119
|
-
})),
|
|
117
|
+
})), J = m(() => pe(Le.value, I.value)), Y = m(() => J.value.filter((e) => !N.has(e.id))), X = m(() => J.value.filter((e) => N.has(e.id))), Re = m(() => he(I.value, R.value, [...L.value, ...J.value.map((e) => ({ results: e.items }))], {
|
|
118
|
+
t: P,
|
|
119
|
+
choice: je
|
|
120
|
+
})), ze = {
|
|
120
121
|
recent: "Recent",
|
|
121
122
|
actions: "Actions",
|
|
122
123
|
commands: "Commands",
|
|
@@ -126,46 +127,51 @@ var A = {
|
|
|
126
127
|
help: "Help"
|
|
127
128
|
}, Z = (e) => {
|
|
128
129
|
let t = e.id.startsWith("commands:") ? "commands" : e.id;
|
|
129
|
-
return e.label ??
|
|
130
|
+
return e.label ?? P(ge(e.id), {}, ze[t] ?? t);
|
|
130
131
|
}, Q = (e, t) => t.description ?? (e.id === "recent" || e.id === "navigation" ? t.groupLabel : void 0), $ = (e) => {
|
|
131
|
-
if (
|
|
132
|
+
if (M.value = !1, e.kind === "action" && e.action && e.context) Ne.trigger(e.action, e.context);
|
|
132
133
|
else if (e.kind === "url" && e.url) e.openInNewTab ? window.open(e.url, "_blank", "noopener,noreferrer") : f.visit(e.url);
|
|
133
|
-
else if (e.kind === "theme" && e.appearance)
|
|
134
|
+
else if (e.kind === "theme" && e.appearance) _e(e.appearance, F.value);
|
|
134
135
|
else if (e.kind === "shortcut" && e.shortcutId) {
|
|
135
136
|
let t = e.shortcutId;
|
|
136
|
-
setTimeout(() =>
|
|
137
|
-
} else e.kind === "install" &&
|
|
138
|
-
},
|
|
139
|
-
|
|
140
|
-
},
|
|
141
|
-
e.stopPropagation(), !(!t.url || t.openUrlInNewTab || e.metaKey || e.ctrlKey) && (e.preventDefault(),
|
|
142
|
-
},
|
|
143
|
-
return (e, t) => (S(), h(
|
|
144
|
-
open:
|
|
145
|
-
title:
|
|
146
|
-
description:
|
|
147
|
-
"onUpdate:open": t[2] ||= (e) =>
|
|
137
|
+
setTimeout(() => ve.trigger(t), 0);
|
|
138
|
+
} else e.kind === "install" && oe(P);
|
|
139
|
+
}, Be = (e) => {
|
|
140
|
+
M.value = !1, f.visit(e);
|
|
141
|
+
}, Ve = (e, t) => {
|
|
142
|
+
e.stopPropagation(), !(!t.url || t.openUrlInNewTab || e.metaKey || e.ctrlKey) && (e.preventDefault(), M.value = !1, f.visit(t.url));
|
|
143
|
+
}, He = (e) => Object.entries(e.details ?? {}).map(([e, t]) => `${e}: ${String(t)}`).join(" · "), Ue = m(() => L.value.length > 0 || J.value.length > 0);
|
|
144
|
+
return (e, t) => (S(), h(se, {
|
|
145
|
+
open: M.value,
|
|
146
|
+
title: V.value ? E(P)("command_palette", {}, "Command palette") : E(P)("search", {}, "Search"),
|
|
147
|
+
description: U.value,
|
|
148
|
+
"onUpdate:open": t[2] ||= (e) => M.value = e
|
|
148
149
|
}, {
|
|
149
150
|
default: O(() => [
|
|
150
151
|
b(o, { name: "global-search.start" }),
|
|
151
|
-
v("div", A, T(
|
|
152
|
-
b(
|
|
153
|
-
placeholder:
|
|
154
|
-
"model-value":
|
|
155
|
-
"onUpdate:modelValue": t[0] ||= (e) =>
|
|
152
|
+
v("div", A, T(Re.value), 1),
|
|
153
|
+
b(ie, {
|
|
154
|
+
placeholder: U.value,
|
|
155
|
+
"model-value": I.value,
|
|
156
|
+
"onUpdate:modelValue": t[0] ||= (e) => I.value = e
|
|
156
157
|
}, null, 8, ["placeholder", "model-value"]),
|
|
157
|
-
b(
|
|
158
|
+
b(ae, null, {
|
|
158
159
|
default: O(() => [
|
|
159
|
-
|
|
160
|
-
|
|
160
|
+
b(ce, { items: [
|
|
161
|
+
L.value,
|
|
162
|
+
J.value,
|
|
163
|
+
Y.value
|
|
164
|
+
] }, null, 8, ["items"]),
|
|
165
|
+
!R.value && !Ue.value ? (S(), h(re, { key: 0 }, {
|
|
166
|
+
default: O(() => [y(T(I.value ? E(P)("no_results", {}, "No results.") : U.value), 1)]),
|
|
161
167
|
_: 1
|
|
162
168
|
})) : g("", !0),
|
|
163
|
-
(S(!0), _(p, null, w(
|
|
169
|
+
(S(!0), _(p, null, w(Y.value, (e) => (S(), h(s, {
|
|
164
170
|
key: e.id,
|
|
165
171
|
heading: Z(e),
|
|
166
172
|
"data-group": e.id
|
|
167
173
|
}, {
|
|
168
|
-
default: O(() => [(S(!0), _(p, null, w(e.items, (t) => (S(), h(
|
|
174
|
+
default: O(() => [(S(!0), _(p, null, w(e.items, (t) => (S(), h(c, {
|
|
169
175
|
key: t.id,
|
|
170
176
|
value: t.id,
|
|
171
177
|
"data-kind": t.kind,
|
|
@@ -177,8 +183,8 @@ var A = {
|
|
|
177
183
|
name: t.icon,
|
|
178
184
|
class: "size-4"
|
|
179
185
|
}, null, 8, ["name"])) : g("", !0),
|
|
180
|
-
v("div", j, [v("span",
|
|
181
|
-
t.shortcut ? (S(), h(
|
|
186
|
+
v("div", j, [v("span", Ce, T(t.label), 1), Q(e, t) ? (S(), _("span", we, T(Q(e, t)), 1)) : g("", !0)]),
|
|
187
|
+
t.shortcut ? (S(), h(l, {
|
|
182
188
|
key: 1,
|
|
183
189
|
binding: t.shortcut,
|
|
184
190
|
class: "ms-auto"
|
|
@@ -192,18 +198,18 @@ var A = {
|
|
|
192
198
|
]))), 128))]),
|
|
193
199
|
_: 2
|
|
194
200
|
}, 1032, ["heading", "data-group"]))), 128)),
|
|
195
|
-
|
|
196
|
-
(S(!0), _(p, null, w(
|
|
201
|
+
R.value ? (S(), _("div", Te, [b(ne)])) : g("", !0),
|
|
202
|
+
(S(!0), _(p, null, w(L.value, (e) => (S(), h(s, {
|
|
197
203
|
key: e.label,
|
|
198
204
|
heading: e.label,
|
|
199
205
|
"data-group": "search"
|
|
200
206
|
}, {
|
|
201
|
-
default: O(() => [(S(!0), _(p, null, w(e.results, (n) => (S(), h(
|
|
207
|
+
default: O(() => [(S(!0), _(p, null, w(e.results, (n) => (S(), h(c, {
|
|
202
208
|
key: n.url,
|
|
203
209
|
value: `search:${e.label}:${n.url}`,
|
|
204
|
-
onSelect: (e) =>
|
|
210
|
+
onSelect: (e) => Be(n.url)
|
|
205
211
|
}, {
|
|
206
|
-
default: O(() => [v("div",
|
|
212
|
+
default: O(() => [v("div", Ee, [v("span", null, T(n.title), 1), n.details ? (S(), _("span", De, T(He(n)), 1)) : g("", !0)]), n.actions?.length ? (S(), _("div", Oe, [(S(!0), _(p, null, w(n.actions.filter((e) => e.url), (e) => (S(), h(te, {
|
|
207
213
|
key: e.name,
|
|
208
214
|
"as-child": "",
|
|
209
215
|
variant: "ghost",
|
|
@@ -216,24 +222,24 @@ var A = {
|
|
|
216
222
|
rel: e.openUrlInNewTab ? "noopener noreferrer" : void 0,
|
|
217
223
|
"aria-label": e.label ? void 0 : e.tooltip ?? e.name,
|
|
218
224
|
onPointerdown: t[1] ||= k(() => {}, ["stop"]),
|
|
219
|
-
onClick: (t) =>
|
|
225
|
+
onClick: (t) => Ve(t, e)
|
|
220
226
|
}, [e.icon ? (S(), h(E(a), {
|
|
221
227
|
key: 0,
|
|
222
228
|
name: e.icon,
|
|
223
229
|
class: "size-3.5"
|
|
224
|
-
}, null, 8, ["name"])) : g("", !0), y(" " + T(e.label), 1)], 40,
|
|
230
|
+
}, null, 8, ["name"])) : g("", !0), y(" " + T(e.label), 1)], 40, ke)]),
|
|
225
231
|
_: 2
|
|
226
232
|
}, 1024))), 128))])) : g("", !0)]),
|
|
227
233
|
_: 2
|
|
228
234
|
}, 1032, ["value", "onSelect"]))), 128))]),
|
|
229
235
|
_: 2
|
|
230
236
|
}, 1032, ["heading"]))), 128)),
|
|
231
|
-
(S(!0), _(p, null, w(
|
|
237
|
+
(S(!0), _(p, null, w(X.value, (e) => (S(), h(s, {
|
|
232
238
|
key: e.id,
|
|
233
239
|
heading: Z(e),
|
|
234
240
|
"data-group": e.id
|
|
235
241
|
}, {
|
|
236
|
-
default: O(() => [(S(!0), _(p, null, w(e.items, (e) => (S(), h(
|
|
242
|
+
default: O(() => [(S(!0), _(p, null, w(e.items, (e) => (S(), h(c, {
|
|
237
243
|
key: e.id,
|
|
238
244
|
value: e.id,
|
|
239
245
|
"data-kind": e.kind,
|
|
@@ -245,8 +251,8 @@ var A = {
|
|
|
245
251
|
name: e.icon,
|
|
246
252
|
class: "size-4"
|
|
247
253
|
}, null, 8, ["name"])) : g("", !0),
|
|
248
|
-
v("span",
|
|
249
|
-
e.shortcut ? (S(), h(
|
|
254
|
+
v("span", Ae, T(e.label), 1),
|
|
255
|
+
e.shortcut ? (S(), h(l, {
|
|
250
256
|
key: 1,
|
|
251
257
|
binding: e.shortcut,
|
|
252
258
|
class: "ms-auto"
|
|
@@ -274,6 +280,6 @@ var A = {
|
|
|
274
280
|
}
|
|
275
281
|
});
|
|
276
282
|
//#endregion
|
|
277
|
-
export {
|
|
283
|
+
export { M as default };
|
|
278
284
|
|
|
279
285
|
//# sourceMappingURL=GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map
|
package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","CommandDialog","_unref","_withCtx","_createVNode","Slot","_createElementVNode","_toDisplayString","CommandInput","CommandList","CommandEmpty","_createTextVNode","_createCommentVNode","_createElementBlock","_Fragment","_renderList","CommandGroup","CommandItem","Icon","ShortcutKeys","Spinner","Button","_withModifiers","Icon_default","Button_default","Spinner_default","Slot_default","CommandEmpty_default","CommandGroup_default","CommandInput_default","CommandItem_default","CommandList_default","ShortcutKeys_default","CommandDialog_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","GlobalSearchPalette_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","open","useModel","__props","TRAILING_GROUPS","t","useT","choice","useChoice","panel","usePanel","page","usePageSchema","runner","useActionRunner","query","ref","groups","loading","loaded","config","computed","palette","endpoint","placeholder","overlay","url","value","active","onCleanup","requestJson","response","latest","createLatestRequest","search","debounce","term","globalSearchDebounce","watch","onScopeDispose","reset","stopListening","onMounted","router","onBeforeUnmount","pwaState","useStore","pwaStore","installable","canInstallPwa","items","commandPaletteItems","local","filterCommandPalette","leading","group","trailing","status","globalSearchStatus","defaultGroupLabels","heading","id","paletteGroupKey","subtitle","item","run","shortcuts","installPwa","select","visitAction","event","action","details","result","key","hasResults","openBlock","createBlock","unref","_cache","$event","withCtx","createVNode","createElementVNode","toDisplayString","createTextVNode","createCommentVNode","createElementBlock","Fragment","renderList","withModifiers"],"sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n ActionSchema,\n CommandPaletteResponse,\n GlobalSearchGroupSchema,\n PaletteGroup,\n PaletteItem,\n} from '@alfakit/core'\nimport {\n canInstallPwa,\n commandPaletteItems,\n createLatestRequest,\n debounce,\n filterCommandPalette,\n globalSearchDebounce,\n globalSearchStatus,\n paletteGroupKey,\n pwaStore,\n requestJson,\n setAppearance,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useChoice, usePageSchema, usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport CommandDialog from '../ui/CommandDialog.vue'\nimport CommandEmpty from '../ui/CommandEmpty.vue'\nimport CommandGroup from '../ui/CommandGroup.vue'\nimport CommandInput from '../ui/CommandInput.vue'\nimport CommandItem from '../ui/CommandItem.vue'\nimport CommandList from '../ui/CommandList.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport ShortcutKeys from './ShortcutKeys.vue'\nimport { installPwa } from './pwa'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\n\ntype SearchGroup = GlobalSearchGroupSchema\n\n/**\n * The command palette behind `GlobalSearch`: global search results plus (with\n * `alfakit.commandPalette`) the page's header actions, panel commands, navigation, \"create\"\n * links, recent records, theme switching and the shortcuts overlay. Its code loads the first\n * time the palette opens; the trigger and `mod+k` stay in the shell.\n */\nconst open = defineModel<boolean>('open', { default: false })\n\n/** Groups listed after the global search results. */\nconst TRAILING_GROUPS = new Set(['theme', 'help'])\n\nconst t = useT()\nconst choice = useChoice()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst query = ref('')\nconst groups = ref<SearchGroup[]>([])\nconst loading = ref(false)\nconst loaded = ref<CommandPaletteResponse | null>(null)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\nconst overlay = computed(\n () => panel.value.keyboardShortcuts !== false && panel.value.keyboardShortcuts !== undefined,\n)\n\n// Create links and recent records, loaded each time the palette opens (also when it mounts\n// open: the first time, its code arrives after the click or `mod+k`).\nwatch(\n open,\n (value, _old, onCleanup) => {\n const url = panel.value.endpoints.commandPalette\n\n if (!value || !palette.value || !url) return\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n requestJson<CommandPaletteResponse>(url)\n .then((response) => {\n if (active) loaded.value = response\n })\n .catch(() => {\n if (active) loaded.value = { create: [], recent: [] }\n })\n },\n { immediate: true },\n)\n\nconst latest = createLatestRequest()\n\nconst search = debounce((term: string) => {\n const url = endpoint.value\n\n if (!url || term.trim() === '') {\n latest.cancel()\n groups.value = []\n loading.value = false\n\n return\n }\n\n // Only the newest request may update the results: older responses are aborted/dropped.\n void latest\n .run(\n (signal) => requestJson<{ groups: SearchGroup[] }>(url, { query: { search: term }, signal }),\n (response) => {\n groups.value = response.groups\n },\n () => {\n loading.value = false\n },\n )\n .catch(() => {\n groups.value = []\n })\n}, globalSearchDebounce(config.value))\n\nwatch(query, (term) => {\n loading.value = endpoint.value !== undefined && term.trim() !== ''\n search(term)\n})\n\nonScopeDispose(() => {\n search.cancel()\n latest.cancel()\n})\n\n// Closing the palette (or navigating away) starts the next search from scratch.\nconst reset = () => {\n search.cancel()\n latest.cancel()\n query.value = ''\n groups.value = []\n loading.value = false\n loaded.value = null\n}\n\nwatch(open, (value) => {\n if (!value) reset()\n})\n\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n reset()\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n\n// `Panel::pwa()`: \"Install app\" while the browser offers it (or on iOS Safari).\nconst pwaState = useStore(pwaStore)\nconst installable = computed(() => Boolean(panel.value.pwa) && canInstallPwa(pwaState.value))\n\nconst items = computed(() =>\n commandPaletteItems({\n panel: panel.value,\n page: page.value,\n loaded: loaded.value,\n shortcutsOverlay: overlay.value,\n ...(installable.value ? { install: t('pwa.install', {}, 'Install app') } : {}),\n labels: {\n light: t('palette.theme.light', {}, 'Light theme'),\n dark: t('palette.theme.dark', {}, 'Dark theme'),\n system: t('palette.theme.system', {}, 'System theme'),\n shortcuts: t('palette.shortcuts', {}, 'Keyboard shortcuts'),\n },\n }),\n)\nconst local = computed(() => filterCommandPalette(items.value, query.value))\nconst leading = computed(() => local.value.filter((group) => !TRAILING_GROUPS.has(group.id)))\nconst trailing = computed(() => local.value.filter((group) => TRAILING_GROUPS.has(group.id)))\n\n// Announced by the `aria-live` region once a search has finished.\nconst status = computed(() =>\n globalSearchStatus(\n query.value,\n loading.value,\n [...groups.value, ...local.value.map((group) => ({ results: group.items }))],\n { t, choice },\n ),\n)\n\nconst defaultGroupLabels: Record<string, string> = {\n recent: 'Recent',\n actions: 'Actions',\n commands: 'Commands',\n create: 'Create',\n navigation: 'Go to',\n theme: 'Theme',\n help: 'Help',\n}\n\nconst heading = (group: PaletteGroup) => {\n const id = group.id.startsWith('commands:') ? 'commands' : group.id\n\n return group.label ?? t(paletteGroupKey(group.id), {}, defaultGroupLabels[id] ?? id)\n}\n\nconst subtitle = (group: PaletteGroup, item: PaletteItem) =>\n item.description ??\n (group.id === 'recent' || group.id === 'navigation' ? item.groupLabel : undefined)\n\nconst run = (item: PaletteItem) => {\n open.value = false\n\n if (item.kind === 'action' && item.action && item.context) {\n void runner.trigger(item.action, item.context)\n } else if (item.kind === 'url' && item.url) {\n if (item.openInNewTab) {\n window.open(item.url, '_blank', 'noopener,noreferrer')\n } else {\n router.visit(item.url)\n }\n } else if (item.kind === 'theme' && item.appearance) {\n setAppearance(item.appearance, panel.value)\n } else if (item.kind === 'shortcut' && item.shortcutId) {\n const id = item.shortcutId\n // After the dialog closed, so focus returns to the page before the overlay opens.\n setTimeout(() => shortcuts.trigger(id), 0)\n } else if (item.kind === 'install') {\n void installPwa(t)\n }\n}\n\nconst select = (url: string) => {\n open.value = false\n router.visit(url)\n}\n\n// A URL action next to a search result (`getGlobalSearchResultActions()`); the item itself\n// navigates on select, so the click must not reach it.\nconst visitAction = (event: MouseEvent, action: ActionSchema) => {\n event.stopPropagation()\n\n if (!action.url || action.openUrlInNewTab || event.metaKey || event.ctrlKey) return\n\n event.preventDefault()\n open.value = false\n router.visit(action.url)\n}\n\nconst details = (result: SearchGroup['results'][number]) =>\n Object.entries(result.details ?? {})\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join(' · ')\n\nconst hasResults = computed(() => groups.value.length > 0 || local.value.length > 0)\n</script>\n\n<template>\n <CommandDialog\n :open=\"open\"\n :title=\"palette ? t('command_palette', {}, 'Command palette') : t('search', {}, 'Search')\"\n :description=\"placeholder\"\n @update:open=\"open = $event\"\n >\n <Slot name=\"global-search.start\" />\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\">{{ status }}</div>\n <CommandInput\n :placeholder=\"placeholder\"\n :model-value=\"query\"\n @update:model-value=\"query = $event\"\n />\n <CommandList>\n <CommandEmpty v-if=\"!loading && !hasResults\">{{\n query ? t('no_results', {}, 'No results.') : placeholder\n }}</CommandEmpty>\n <CommandGroup\n v-for=\"group in leading\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span class=\"truncate\">{{ item.label }}</span>\n <span v-if=\"subtitle(group, item)\" class=\"text-muted-foreground truncate text-xs\">{{\n subtitle(group, item)\n }}</span>\n </div>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n <div v-if=\"loading\" class=\"flex justify-center py-6\"><Spinner /></div>\n <CommandGroup\n v-for=\"group in groups\"\n :key=\"group.label\"\n :heading=\"group.label\"\n data-group=\"search\"\n >\n <CommandItem\n v-for=\"result in group.results\"\n :key=\"result.url\"\n :value=\"`search:${group.label}:${result.url}`\"\n @select=\"select(result.url)\"\n >\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span>{{ result.title }}</span>\n <span v-if=\"result.details\" class=\"text-muted-foreground text-xs\">{{\n details(result)\n }}</span>\n </div>\n <div\n v-if=\"result.actions?.length\"\n data-slot=\"global-search-actions\"\n class=\"ms-auto flex shrink-0 gap-1\"\n >\n <Button\n v-for=\"action in result.actions.filter((item) => item.url)\"\n :key=\"action.name\"\n as-child\n variant=\"ghost\"\n size=\"xs\"\n class=\"h-6 px-2 text-xs\"\n >\n <a\n :href=\"action.url\"\n :target=\"action.openUrlInNewTab ? '_blank' : undefined\"\n :rel=\"action.openUrlInNewTab ? 'noopener noreferrer' : undefined\"\n :aria-label=\"action.label ? undefined : (action.tooltip ?? action.name)\"\n @pointerdown.stop\n @click=\"visitAction($event, action)\"\n >\n <Icon v-if=\"action.icon\" :name=\"action.icon\" class=\"size-3.5\" />\n {{ action.label }}\n </a>\n </Button>\n </div>\n </CommandItem>\n </CommandGroup>\n <CommandGroup\n v-for=\"group in trailing\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n </CommandList>\n <Slot name=\"global-search.end\" />\n </CommandDialog>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createBlock","CommandDialog","_unref","_withCtx","_createVNode","Slot","_createElementVNode","_toDisplayString","CommandInput","CommandList","CommandAutoHighlight","CommandEmpty","_createTextVNode","_createCommentVNode","_createElementBlock","_Fragment","_renderList","CommandGroup","CommandItem","Icon","ShortcutKeys","Spinner","Button","_withModifiers","Icon_default","Button_default","Spinner_default","Slot_default","CommandEmpty_default","CommandGroup_default","CommandInput_default","CommandItem_default","CommandList_default","ShortcutKeys_default","CommandDialog_default","CommandAutoHighlight_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","GlobalSearchPalette_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","open","useModel","__props","TRAILING_GROUPS","t","useT","choice","useChoice","panel","usePanel","page","usePageSchema","runner","useActionRunner","query","ref","groups","loading","loaded","config","computed","palette","endpoint","placeholder","overlay","url","value","active","onCleanup","requestJson","response","latest","createLatestRequest","search","debounce","term","globalSearchDebounce","watch","onScopeDispose","reset","stopListening","onMounted","router","onBeforeUnmount","pwaState","useStore","pwaStore","installable","canInstallPwa","items","commandPaletteItems","local","filterCommandPalette","leading","group","trailing","status","globalSearchStatus","defaultGroupLabels","heading","id","paletteGroupKey","subtitle","item","run","shortcuts","installPwa","select","visitAction","event","action","details","result","key","hasResults","openBlock","createBlock","unref","_cache","$event","withCtx","createVNode","createElementVNode","toDisplayString","createTextVNode","createCommentVNode","createElementBlock","Fragment","renderList","withModifiers"],"sources":["../../../src/components/panel/GlobalSearchPalette.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type {\n ActionSchema,\n CommandPaletteResponse,\n GlobalSearchGroupSchema,\n PaletteGroup,\n PaletteItem,\n} from '@alfakit/core'\nimport {\n canInstallPwa,\n commandPaletteItems,\n createLatestRequest,\n debounce,\n filterCommandPalette,\n globalSearchDebounce,\n globalSearchStatus,\n paletteGroupKey,\n pwaStore,\n requestJson,\n setAppearance,\n shortcuts,\n} from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { computed, onBeforeUnmount, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useActionRunner, useChoice, usePageSchema, usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport CommandDialog from '../ui/CommandDialog.vue'\nimport CommandEmpty from '../ui/CommandEmpty.vue'\nimport CommandGroup from '../ui/CommandGroup.vue'\nimport CommandInput from '../ui/CommandInput.vue'\nimport CommandItem from '../ui/CommandItem.vue'\nimport CommandAutoHighlight from '../ui/CommandAutoHighlight.vue'\nimport CommandList from '../ui/CommandList.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport ShortcutKeys from './ShortcutKeys.vue'\nimport { installPwa } from './pwa'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\n\ntype SearchGroup = GlobalSearchGroupSchema\n\n/**\n * The command palette behind `GlobalSearch`: global search results plus (with\n * `alfakit.commandPalette`) the page's header actions, panel commands, navigation, \"create\"\n * links, recent records, theme switching and the shortcuts overlay. Its code loads the first\n * time the palette opens; the trigger and `mod+k` stay in the shell.\n */\nconst open = defineModel<boolean>('open', { default: false })\n\n/** Groups listed after the global search results. */\nconst TRAILING_GROUPS = new Set(['theme', 'help'])\n\nconst t = useT()\nconst choice = useChoice()\nconst panel = usePanel()\nconst page = usePageSchema()\nconst runner = useActionRunner()\nconst query = ref('')\nconst groups = ref<SearchGroup[]>([])\nconst loading = ref(false)\nconst loaded = ref<CommandPaletteResponse | null>(null)\nconst config = computed(() => panel.value.globalSearch)\nconst palette = computed(() => panel.value.commandPalette)\nconst endpoint = computed(() => (config.value ? panel.value.endpoints.globalSearch : undefined))\nconst placeholder = computed(\n () =>\n config.value?.placeholder ??\n palette.value?.placeholder ??\n t('palette.placeholder', {}, 'Type a command or search…'),\n)\nconst overlay = computed(\n () => panel.value.keyboardShortcuts !== false && panel.value.keyboardShortcuts !== undefined,\n)\n\n// Create links and recent records, loaded each time the palette opens (also when it mounts\n// open: the first time, its code arrives after the click or `mod+k`).\nwatch(\n open,\n (value, _old, onCleanup) => {\n const url = panel.value.endpoints.commandPalette\n\n if (!value || !palette.value || !url) return\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n requestJson<CommandPaletteResponse>(url)\n .then((response) => {\n if (active) loaded.value = response\n })\n .catch(() => {\n if (active) loaded.value = { create: [], recent: [] }\n })\n },\n { immediate: true },\n)\n\nconst latest = createLatestRequest()\n\nconst search = debounce((term: string) => {\n const url = endpoint.value\n\n if (!url || term.trim() === '') {\n latest.cancel()\n groups.value = []\n loading.value = false\n\n return\n }\n\n // Only the newest request may update the results: older responses are aborted/dropped.\n void latest\n .run(\n (signal) => requestJson<{ groups: SearchGroup[] }>(url, { query: { search: term }, signal }),\n (response) => {\n groups.value = response.groups\n },\n () => {\n loading.value = false\n },\n )\n .catch(() => {\n groups.value = []\n })\n}, globalSearchDebounce(config.value))\n\nwatch(query, (term) => {\n loading.value = endpoint.value !== undefined && term.trim() !== ''\n search(term)\n})\n\nonScopeDispose(() => {\n search.cancel()\n latest.cancel()\n})\n\n// Closing the palette (or navigating away) starts the next search from scratch.\nconst reset = () => {\n search.cancel()\n latest.cancel()\n query.value = ''\n groups.value = []\n loading.value = false\n loaded.value = null\n}\n\nwatch(open, (value) => {\n if (!value) reset()\n})\n\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n reset()\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n\n// `Panel::pwa()`: \"Install app\" while the browser offers it (or on iOS Safari).\nconst pwaState = useStore(pwaStore)\nconst installable = computed(() => Boolean(panel.value.pwa) && canInstallPwa(pwaState.value))\n\nconst items = computed(() =>\n commandPaletteItems({\n panel: panel.value,\n page: page.value,\n loaded: loaded.value,\n shortcutsOverlay: overlay.value,\n ...(installable.value ? { install: t('pwa.install', {}, 'Install app') } : {}),\n labels: {\n light: t('palette.theme.light', {}, 'Light theme'),\n dark: t('palette.theme.dark', {}, 'Dark theme'),\n system: t('palette.theme.system', {}, 'System theme'),\n shortcuts: t('palette.shortcuts', {}, 'Keyboard shortcuts'),\n },\n }),\n)\nconst local = computed(() => filterCommandPalette(items.value, query.value))\nconst leading = computed(() => local.value.filter((group) => !TRAILING_GROUPS.has(group.id)))\nconst trailing = computed(() => local.value.filter((group) => TRAILING_GROUPS.has(group.id)))\n\n// Announced by the `aria-live` region once a search has finished.\nconst status = computed(() =>\n globalSearchStatus(\n query.value,\n loading.value,\n [...groups.value, ...local.value.map((group) => ({ results: group.items }))],\n { t, choice },\n ),\n)\n\nconst defaultGroupLabels: Record<string, string> = {\n recent: 'Recent',\n actions: 'Actions',\n commands: 'Commands',\n create: 'Create',\n navigation: 'Go to',\n theme: 'Theme',\n help: 'Help',\n}\n\nconst heading = (group: PaletteGroup) => {\n const id = group.id.startsWith('commands:') ? 'commands' : group.id\n\n return group.label ?? t(paletteGroupKey(group.id), {}, defaultGroupLabels[id] ?? id)\n}\n\nconst subtitle = (group: PaletteGroup, item: PaletteItem) =>\n item.description ??\n (group.id === 'recent' || group.id === 'navigation' ? item.groupLabel : undefined)\n\nconst run = (item: PaletteItem) => {\n open.value = false\n\n if (item.kind === 'action' && item.action && item.context) {\n void runner.trigger(item.action, item.context)\n } else if (item.kind === 'url' && item.url) {\n if (item.openInNewTab) {\n window.open(item.url, '_blank', 'noopener,noreferrer')\n } else {\n router.visit(item.url)\n }\n } else if (item.kind === 'theme' && item.appearance) {\n setAppearance(item.appearance, panel.value)\n } else if (item.kind === 'shortcut' && item.shortcutId) {\n const id = item.shortcutId\n // After the dialog closed, so focus returns to the page before the overlay opens.\n setTimeout(() => shortcuts.trigger(id), 0)\n } else if (item.kind === 'install') {\n void installPwa(t)\n }\n}\n\nconst select = (url: string) => {\n open.value = false\n router.visit(url)\n}\n\n// A URL action next to a search result (`getGlobalSearchResultActions()`); the item itself\n// navigates on select, so the click must not reach it.\nconst visitAction = (event: MouseEvent, action: ActionSchema) => {\n event.stopPropagation()\n\n if (!action.url || action.openUrlInNewTab || event.metaKey || event.ctrlKey) return\n\n event.preventDefault()\n open.value = false\n router.visit(action.url)\n}\n\nconst details = (result: SearchGroup['results'][number]) =>\n Object.entries(result.details ?? {})\n .map(([key, value]) => `${key}: ${String(value)}`)\n .join(' · ')\n\nconst hasResults = computed(() => groups.value.length > 0 || local.value.length > 0)\n</script>\n\n<template>\n <CommandDialog\n :open=\"open\"\n :title=\"palette ? t('command_palette', {}, 'Command palette') : t('search', {}, 'Search')\"\n :description=\"placeholder\"\n @update:open=\"open = $event\"\n >\n <Slot name=\"global-search.start\" />\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\">{{ status }}</div>\n <CommandInput\n :placeholder=\"placeholder\"\n :model-value=\"query\"\n @update:model-value=\"query = $event\"\n />\n <CommandList>\n <CommandAutoHighlight :items=\"[groups, local, leading]\" />\n <CommandEmpty v-if=\"!loading && !hasResults\">{{\n query ? t('no_results', {}, 'No results.') : placeholder\n }}</CommandEmpty>\n <CommandGroup\n v-for=\"group in leading\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span class=\"truncate\">{{ item.label }}</span>\n <span v-if=\"subtitle(group, item)\" class=\"text-muted-foreground truncate text-xs\">{{\n subtitle(group, item)\n }}</span>\n </div>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n <div v-if=\"loading\" class=\"flex justify-center py-6\"><Spinner /></div>\n <CommandGroup\n v-for=\"group in groups\"\n :key=\"group.label\"\n :heading=\"group.label\"\n data-group=\"search\"\n >\n <CommandItem\n v-for=\"result in group.results\"\n :key=\"result.url\"\n :value=\"`search:${group.label}:${result.url}`\"\n @select=\"select(result.url)\"\n >\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <span>{{ result.title }}</span>\n <span v-if=\"result.details\" class=\"text-muted-foreground text-xs\">{{\n details(result)\n }}</span>\n </div>\n <div\n v-if=\"result.actions?.length\"\n data-slot=\"global-search-actions\"\n class=\"ms-auto flex shrink-0 gap-1\"\n >\n <Button\n v-for=\"action in result.actions.filter((item) => item.url)\"\n :key=\"action.name\"\n as-child\n variant=\"ghost\"\n size=\"xs\"\n class=\"h-6 px-2 text-xs\"\n >\n <a\n :href=\"action.url\"\n :target=\"action.openUrlInNewTab ? '_blank' : undefined\"\n :rel=\"action.openUrlInNewTab ? 'noopener noreferrer' : undefined\"\n :aria-label=\"action.label ? undefined : (action.tooltip ?? action.name)\"\n @pointerdown.stop\n @click=\"visitAction($event, action)\"\n >\n <Icon v-if=\"action.icon\" :name=\"action.icon\" class=\"size-3.5\" />\n {{ action.label }}\n </a>\n </Button>\n </div>\n </CommandItem>\n </CommandGroup>\n <CommandGroup\n v-for=\"group in trailing\"\n :key=\"group.id\"\n :heading=\"heading(group)\"\n :data-group=\"group.id\"\n >\n <CommandItem\n v-for=\"item in group.items\"\n :key=\"item.id\"\n :value=\"item.id\"\n :data-kind=\"item.kind\"\n @select=\"run(item)\"\n >\n <Icon v-if=\"item.icon\" :name=\"item.icon\" class=\"size-4\" />\n <span class=\"min-w-0 flex-1 truncate\">{{ item.label }}</span>\n <ShortcutKeys v-if=\"item.shortcut\" :binding=\"item.shortcut\" class=\"ms-auto\" />\n </CommandItem>\n </CommandGroup>\n </CommandList>\n <Slot name=\"global-search.end\" />\n </CommandDialog>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { cn as e } from "../../lib/utils.js";
|
|
2
2
|
import t from "../../lib/Icon.js";
|
|
3
|
-
import n from "../ui/
|
|
4
|
-
import r from "../ui/
|
|
5
|
-
import i from "../ui/
|
|
6
|
-
import a from "../ui/
|
|
3
|
+
import n from "../ui/Collapsible.js";
|
|
4
|
+
import r from "../ui/CollapsibleContent.js";
|
|
5
|
+
import i from "../ui/CollapsibleTrigger.js";
|
|
6
|
+
import a from "../ui/SidebarMenu.js";
|
|
7
7
|
import o from "../ui/SidebarGroup.js";
|
|
8
8
|
import s from "../ui/SidebarGroupContent.js";
|
|
9
9
|
import c from "../ui/SidebarGroupLabel.js";
|
|
@@ -17,14 +17,14 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
|
|
|
17
17
|
props: { group: {} },
|
|
18
18
|
setup(v) {
|
|
19
19
|
let A = v, j = () => A.group.extraSidebarAttributes ?? {}, M = () => !!(A.group.label && A.group.icon), N = () => e(M() && "group-data-[collapsible=icon]:hidden");
|
|
20
|
-
return (e, v) => A.group.label ? A.group.collapsible ? (C(), f(
|
|
20
|
+
return (e, v) => A.group.label ? A.group.collapsible ? (C(), f(n, {
|
|
21
21
|
key: 2,
|
|
22
22
|
"default-open": !A.group.collapsed || A.group.items.some((e) => e.active),
|
|
23
23
|
class: "group/nav-group"
|
|
24
24
|
}, {
|
|
25
25
|
default: D(() => [_(o, S(y(j())), {
|
|
26
26
|
default: D(() => [
|
|
27
|
-
_(
|
|
27
|
+
_(i, { "as-child": "" }, {
|
|
28
28
|
default: D(() => [_(c, {
|
|
29
29
|
as: "button",
|
|
30
30
|
type: "button",
|
|
@@ -42,9 +42,9 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
|
|
|
42
42
|
})]),
|
|
43
43
|
_: 1
|
|
44
44
|
}),
|
|
45
|
-
_(
|
|
45
|
+
_(r, null, {
|
|
46
46
|
default: D(() => [_(s, { class: x(N()) }, {
|
|
47
|
-
default: D(() => [_(
|
|
47
|
+
default: D(() => [_(a, null, {
|
|
48
48
|
default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
|
|
49
49
|
key: e.label,
|
|
50
50
|
item: e
|
|
@@ -74,7 +74,7 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
|
|
|
74
74
|
_: 1
|
|
75
75
|
}),
|
|
76
76
|
_(s, { class: x(N()) }, {
|
|
77
|
-
default: D(() => [_(
|
|
77
|
+
default: D(() => [_(a, null, {
|
|
78
78
|
default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
|
|
79
79
|
key: e.label,
|
|
80
80
|
item: e
|
|
@@ -91,7 +91,7 @@ var k = { class: "flex items-center gap-1.5" }, A = /*@__PURE__*/ v({
|
|
|
91
91
|
_: 1
|
|
92
92
|
}, 16)) : (C(), f(o, S(b({ key: 0 }, j())), {
|
|
93
93
|
default: D(() => [_(s, null, {
|
|
94
|
-
default: D(() => [_(
|
|
94
|
+
default: D(() => [_(a, null, {
|
|
95
95
|
default: D(() => [(C(!0), m(d, null, w(A.group.items, (e) => (C(), f(u, {
|
|
96
96
|
key: e.label,
|
|
97
97
|
item: e
|