@alfakit/vue 0.1.2 → 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.
Files changed (281) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/AlfakitRoot.js.map +1 -1
  3. package/dist/AlfakitRoot.vue.d.ts.map +1 -1
  4. package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js +3 -1
  5. package/dist/AlfakitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  6. package/dist/components/actions/ActionGroupMenu.js.map +1 -1
  7. package/dist/components/actions/ActionGroupMenu.vue.d.ts.map +1 -1
  8. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js +69 -65
  9. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/actions/ActionModal.js.map +1 -1
  11. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  12. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +17 -15
  13. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/components/ai/AiCopilot.js.map +1 -1
  15. package/dist/components/ai/AiCopilot.vue.d.ts +2 -0
  16. package/dist/components/ai/AiCopilot.vue.d.ts.map +1 -1
  17. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js +7 -2
  18. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js +19 -19
  20. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/cms/LivePreview.js.map +1 -1
  22. package/dist/components/cms/LivePreview.vue.d.ts.map +1 -1
  23. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js +83 -83
  24. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/fields/BuilderField.js.map +1 -1
  26. package/dist/components/fields/BuilderField.vue.d.ts.map +1 -1
  27. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js +162 -157
  28. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/fields/ImageEditorDialog.js.map +1 -1
  30. package/dist/components/fields/ImageEditorDialog.vue.d.ts.map +1 -1
  31. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js +46 -46
  32. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/fields/KeyValueField.js.map +1 -1
  34. package/dist/components/fields/KeyValueField.vue.d.ts.map +1 -1
  35. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js +66 -66
  36. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/fields/ModalTablePicker.js.map +1 -1
  38. package/dist/components/fields/ModalTablePicker.vue.d.ts.map +1 -1
  39. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js +113 -113
  40. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/fields/RepeaterField.js.map +1 -1
  42. package/dist/components/fields/RepeaterField.vue.d.ts.map +1 -1
  43. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js +12 -12
  44. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/fields/RichEditorInput.js.map +1 -1
  46. package/dist/components/fields/RichEditorInput.vue.d.ts.map +1 -1
  47. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js +166 -165
  48. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/components/fields/SliderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/fields/item-actions.d.ts +2 -2
  51. package/dist/components/fields/item-actions.d.ts.map +1 -1
  52. package/dist/components/fields/item-actions.js +31 -31
  53. package/dist/components/fields/item-actions.js.map +1 -1
  54. package/dist/components/form/FormBlock.js.map +1 -1
  55. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  56. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +1 -1
  57. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/form/form-context.js +25 -25
  59. package/dist/components/form/form-context.js.map +1 -1
  60. package/dist/components/kanban/KanbanBoard.js.map +1 -1
  61. package/dist/components/kanban/KanbanBoard.vue.d.ts.map +1 -1
  62. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js +5 -2
  63. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/kanban/KanbanColumnHeader.js.map +1 -1
  65. package/dist/components/kanban/KanbanColumnHeader.vue.d.ts.map +1 -1
  66. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js +64 -64
  67. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/layout/SectionComponent.js.map +1 -1
  69. package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
  70. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +23 -23
  71. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js +8 -8
  73. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/components/panel/GlobalSearchPalette.js.map +1 -1
  75. package/dist/components/panel/GlobalSearchPalette.vue.d.ts.map +1 -1
  76. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js +102 -96
  77. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +10 -10
  79. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js +9 -9
  81. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +16 -16
  83. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +10 -10
  85. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  86. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +35 -35
  87. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js +11 -11
  89. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/realtime/use-live-updates.d.ts.map +1 -1
  91. package/dist/components/realtime/use-live-updates.js +24 -23
  92. package/dist/components/realtime/use-live-updates.js.map +1 -1
  93. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js +2 -1
  94. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/table/ColumnHeader.js.map +1 -1
  96. package/dist/components/table/ColumnHeader.vue.d.ts.map +1 -1
  97. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js +55 -49
  98. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  99. package/dist/components/table/ColumnManager.js.map +1 -1
  100. package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
  101. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +5 -4
  102. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/table/ContentLayoutSort.js.map +1 -1
  104. package/dist/components/table/ContentLayoutSort.vue.d.ts.map +1 -1
  105. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js +5 -5
  106. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +2 -1
  108. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js +2 -1
  110. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  111. package/dist/components/table/TableCellContent.js.map +1 -1
  112. package/dist/components/table/TableCellContent.vue.d.ts.map +1 -1
  113. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js +4 -3
  114. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/table/TablePagination.js.map +1 -1
  116. package/dist/components/table/TablePagination.vue.d.ts.map +1 -1
  117. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js +87 -87
  118. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +2 -1
  120. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/table/cell-update.d.ts +6 -0
  122. package/dist/components/table/cell-update.d.ts.map +1 -1
  123. package/dist/components/table/cell-update.js.map +1 -1
  124. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  125. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  126. package/dist/components/ui/CommandAutoHighlight.js +7 -0
  127. package/dist/components/ui/CommandAutoHighlight.js.map +1 -0
  128. package/dist/components/ui/CommandAutoHighlight.vue.d.ts +21 -0
  129. package/dist/components/ui/CommandAutoHighlight.vue.d.ts.map +1 -0
  130. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js +18 -0
  131. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/components/ui/DialogContent.js.map +1 -1
  133. package/dist/components/ui/DialogContent.vue.d.ts.map +1 -1
  134. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js +13 -12
  135. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/components/ui/PopoverContent.js.map +1 -1
  137. package/dist/components/ui/PopoverContent.vue.d.ts.map +1 -1
  138. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js +9 -8
  139. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/ui/SheetContent.js.map +1 -1
  141. package/dist/components/ui/SheetContent.vue.d.ts.map +1 -1
  142. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js +13 -12
  143. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/components/ui/TooltipContent.js.map +1 -1
  145. package/dist/components/ui/TooltipContent.vue.d.ts.map +1 -1
  146. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js +9 -8
  147. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  148. package/dist/context.d.ts +7 -0
  149. package/dist/context.d.ts.map +1 -1
  150. package/dist/context.js +29 -26
  151. package/dist/context.js.map +1 -1
  152. package/dist/create-alfakit.d.ts.map +1 -1
  153. package/dist/create-alfakit.js +33 -31
  154. package/dist/create-alfakit.js.map +1 -1
  155. package/dist/eject-manifest.json +11 -2
  156. package/dist/index.d.ts +1 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +219 -217
  159. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  160. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/layouts/AuthLayout.vue_vue_type_script_setup_true_lang.js +9 -9
  162. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  163. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +15 -15
  165. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/layouts/lazy-layouts.d.ts +10 -0
  167. package/dist/layouts/lazy-layouts.d.ts.map +1 -0
  168. package/dist/layouts/lazy-layouts.js +8 -0
  169. package/dist/layouts/lazy-layouts.js.map +1 -0
  170. package/dist/layouts/panel-layouts.d.ts +8 -0
  171. package/dist/layouts/panel-layouts.d.ts.map +1 -0
  172. package/dist/layouts/panel-layouts.js +15 -0
  173. package/dist/layouts/panel-layouts.js.map +1 -0
  174. package/dist/lib/lazy.d.ts.map +1 -1
  175. package/dist/lib/lazy.js +2 -2
  176. package/dist/lib/lazy.js.map +1 -1
  177. package/dist/pages/PageShell.js.map +1 -1
  178. package/dist/pages/PageShell.vue.d.ts.map +1 -1
  179. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js +39 -42
  180. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/standalone/AlfakitComponent.js.map +1 -1
  182. package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
  183. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +56 -52
  184. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  185. package/dist/standalone.css +7 -0
  186. package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
  187. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts +2 -2
  188. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
  189. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +17 -12
  190. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  191. package/dist/starter-kit/dashboard-widgets.d.ts +54 -0
  192. package/dist/starter-kit/dashboard-widgets.d.ts.map +1 -0
  193. package/dist/starter-kit/dashboard-widgets.js +54 -0
  194. package/dist/starter-kit/dashboard-widgets.js.map +1 -0
  195. package/dist/starter-kit/index.d.ts +2 -1
  196. package/dist/starter-kit/index.d.ts.map +1 -1
  197. package/dist/starter-kit/index.js +5 -4
  198. package/dist/starter-kit/runtime.d.ts +6 -0
  199. package/dist/starter-kit/runtime.d.ts.map +1 -1
  200. package/dist/starter-kit/runtime.js +19 -15
  201. package/dist/starter-kit/runtime.js.map +1 -1
  202. package/dist/starter-kit/starter-kit.d.ts.map +1 -1
  203. package/dist/starter-kit/starter-kit.js +8 -8
  204. package/dist/starter-kit/starter-kit.js.map +1 -1
  205. package/dist/starter-kit/widgets/CopilotTrigger.js +7 -0
  206. package/dist/starter-kit/widgets/CopilotTrigger.js.map +1 -0
  207. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts +12 -0
  208. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts.map +1 -0
  209. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js +23 -0
  210. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  211. package/dist/starter-kit/widgets/LoadedCopilot.js +7 -0
  212. package/dist/starter-kit/widgets/LoadedCopilot.js.map +1 -0
  213. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts +8 -0
  214. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts.map +1 -0
  215. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js +31 -0
  216. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -0
  217. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js +7 -0
  218. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js.map +1 -0
  219. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts +8 -0
  220. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts.map +1 -0
  221. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js +34 -0
  222. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  223. package/dist/starter-kit/widgets/index.d.ts +40 -9
  224. package/dist/starter-kit/widgets/index.d.ts.map +1 -1
  225. package/dist/starter-kit/widgets/index.js +21 -18
  226. package/dist/starter-kit/widgets/index.js.map +1 -1
  227. package/dist/starter-kit/widgets/loaded.d.ts +10 -0
  228. package/dist/starter-kit/widgets/loaded.d.ts.map +1 -0
  229. package/dist/starter-kit/widgets/loaded.js +5 -0
  230. package/dist/styles.css +9 -2
  231. package/dist/themes.css +6 -1
  232. package/package.json +2 -2
  233. package/src/AlfakitRoot.vue +9 -1
  234. package/src/components/actions/ActionGroupMenu.vue +13 -1
  235. package/src/components/actions/ActionModal.vue +9 -0
  236. package/src/components/ai/AiCopilot.vue +7 -1
  237. package/src/components/cms/LivePreview.vue +8 -2
  238. package/src/components/fields/BuilderField.vue +15 -2
  239. package/src/components/fields/ImageEditorDialog.vue +7 -3
  240. package/src/components/fields/KeyValueField.vue +3 -2
  241. package/src/components/fields/ModalTablePicker.vue +7 -2
  242. package/src/components/fields/RepeaterField.vue +2 -3
  243. package/src/components/fields/RichEditorInput.vue +3 -0
  244. package/src/components/fields/item-actions.ts +31 -10
  245. package/src/components/form/FormBlock.vue +2 -1
  246. package/src/components/form/form-context.ts +2 -2
  247. package/src/components/kanban/KanbanBoard.vue +15 -3
  248. package/src/components/kanban/KanbanColumnHeader.vue +6 -4
  249. package/src/components/layout/SectionComponent.vue +10 -4
  250. package/src/components/panel/GlobalSearchPalette.vue +2 -0
  251. package/src/components/realtime/use-live-updates.ts +3 -1
  252. package/src/components/table/ColumnHeader.vue +23 -12
  253. package/src/components/table/ColumnManager.vue +12 -8
  254. package/src/components/table/ContentLayoutSort.vue +7 -1
  255. package/src/components/table/TableCellContent.vue +4 -2
  256. package/src/components/table/TablePagination.vue +12 -7
  257. package/src/components/table/cell-update.ts +6 -0
  258. package/src/components/ui/CommandAutoHighlight.vue +27 -0
  259. package/src/components/ui/DialogContent.vue +5 -1
  260. package/src/components/ui/PopoverContent.vue +5 -1
  261. package/src/components/ui/SheetContent.vue +5 -1
  262. package/src/components/ui/TooltipContent.vue +5 -1
  263. package/src/context.ts +10 -0
  264. package/src/create-alfakit.ts +5 -0
  265. package/src/index.ts +2 -0
  266. package/src/layouts/lazy-layouts.ts +14 -0
  267. package/src/layouts/panel-layouts.ts +17 -0
  268. package/src/lib/lazy.ts +11 -1
  269. package/src/pages/PageShell.vue +5 -6
  270. package/src/standalone/AlfakitComponent.vue +17 -6
  271. package/src/starter-kit/AlfakitStarterKitRoot.vue +12 -3
  272. package/src/starter-kit/dashboard-widgets.ts +93 -0
  273. package/src/starter-kit/index.ts +7 -1
  274. package/src/starter-kit/runtime.ts +17 -1
  275. package/src/starter-kit/starter-kit.ts +2 -1
  276. package/src/starter-kit/widgets/CopilotTrigger.vue +58 -0
  277. package/src/starter-kit/widgets/LoadedCopilot.vue +29 -0
  278. package/src/starter-kit/widgets/StarterKitImpersonationBanner.vue +57 -0
  279. package/src/starter-kit/widgets/index.ts +56 -11
  280. package/src/starter-kit/widgets/loaded.ts +9 -0
  281. 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":"AA4nBA,KAAK,iBAAiB,GAAG;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;;;;;;AA6bF,wBAOG"}
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 s from "../ui/CommandEmpty.js";
8
- import c from "../ui/CommandGroup.js";
9
- import re from "../ui/CommandInput.js";
10
- import l from "../ui/CommandItem.js";
11
- import ie from "../ui/CommandList.js";
12
- import { installPwa as ae } from "./pwa.js";
13
- import u from "./ShortcutKeys.js";
14
- import oe from "../ui/CommandDialog.js";
15
- import { canInstallPwa as se, commandPaletteItems as ce, createLatestRequest as le, debounce as ue, filterCommandPalette as de, globalSearchDebounce as fe, globalSearchStatus as pe, paletteGroupKey as me, pwaStore as he, requestJson as d, setAppearance as ge, shortcuts as _e } from "@alfakit/core";
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 ve, onMounted as ye, onScopeDispose as be, openBlock as S, ref as C, renderList as w, toDisplayString as T, unref as E, useModel as xe, watch as D, withCtx as O, withModifiers as k } from "vue";
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" }, M = { class: "truncate" }, Se = {
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
- }, Ce = {
28
+ }, Te = {
28
29
  key: 1,
29
30
  class: "flex justify-center py-6"
30
- }, we = { class: "flex min-w-0 flex-1 flex-col" }, Te = {
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
- }, Ee = {
34
+ }, Oe = {
34
35
  key: 0,
35
36
  "data-slot": "global-search-actions",
36
37
  class: "ms-auto flex shrink-0 gap-1"
37
- }, De = [
38
+ }, ke = [
38
39
  "href",
39
40
  "target",
40
41
  "rel",
41
42
  "aria-label",
42
43
  "onClick"
43
- ], Oe = { class: "min-w-0 flex-1 truncate" }, N = /*@__PURE__*/ x({
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 N = xe(x, "open"), P = /* @__PURE__ */ new Set(["theme", "help"]), F = i(), ke = t(), I = r(), Ae = n(), je = e(), L = C(""), R = C([]), z = C(!1), B = C(null), V = m(() => I.value.globalSearch), H = m(() => I.value.commandPalette), U = m(() => V.value ? I.value.endpoints.globalSearch : void 0), W = m(() => V.value?.placeholder ?? H.value?.placeholder ?? F("palette.placeholder", {}, "Type a command or search…")), Me = m(() => I.value.keyboardShortcuts !== !1 && I.value.keyboardShortcuts !== void 0);
55
- D(N, (e, t, n) => {
56
- let r = I.value.endpoints.commandPalette;
57
- if (!e || !H.value || !r) return;
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 && (B.value = e);
63
+ i && (z.value = e);
63
64
  }).catch(() => {
64
- i && (B.value = {
65
+ i && (z.value = {
65
66
  create: [],
66
67
  recent: []
67
68
  });
68
69
  });
69
70
  }, { immediate: !0 });
70
- let G = le(), K = ue((e) => {
71
- let t = U.value;
71
+ let W = de(), G = fe((e) => {
72
+ let t = H.value;
72
73
  if (!t || e.trim() === "") {
73
- G.cancel(), R.value = [], z.value = !1;
74
+ W.cancel(), L.value = [], R.value = !1;
74
75
  return;
75
76
  }
76
- G.run((n) => d(t, {
77
+ W.run((n) => d(t, {
77
78
  query: { search: e },
78
79
  signal: n
79
80
  }), (e) => {
80
- R.value = e.groups;
81
+ L.value = e.groups;
81
82
  }, () => {
82
- z.value = !1;
83
+ R.value = !1;
83
84
  }).catch(() => {
84
- R.value = [];
85
+ L.value = [];
85
86
  });
86
- }, fe(V.value));
87
- D(L, (e) => {
88
- z.value = U.value !== void 0 && e.trim() !== "", K(e);
89
- }), be(() => {
90
- K.cancel(), G.cancel();
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 q = () => {
93
- K.cancel(), G.cancel(), L.value = "", R.value = [], z.value = !1, B.value = null;
93
+ let K = () => {
94
+ G.cancel(), W.cancel(), I.value = "", L.value = [], R.value = !1, z.value = null;
94
95
  };
95
- D(N, (e) => {
96
- e || q();
96
+ D(M, (e) => {
97
+ e || K();
97
98
  });
98
- let J;
99
- ye(() => {
100
- J = f.on("navigate", () => {
101
- N.value = !1, q();
99
+ let q;
100
+ be(() => {
101
+ q = f.on("navigate", () => {
102
+ M.value = !1, K();
102
103
  });
103
- }), ve(() => J?.());
104
- let Ne = ee(he), Pe = m(() => !!I.value.pwa && se(Ne.value)), Fe = m(() => ce({
105
- panel: I.value,
106
- page: Ae.value,
107
- loaded: B.value,
108
- shortcutsOverlay: Me.value,
109
- ...Pe.value ? { install: F("pwa.install", {}, "Install app") } : {},
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: F("palette.theme.light", {}, "Light theme"),
112
- dark: F("palette.theme.dark", {}, "Dark theme"),
113
- system: F("palette.theme.system", {}, "System theme"),
114
- shortcuts: F("palette.shortcuts", {}, "Keyboard 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
- })), Y = m(() => de(Fe.value, L.value)), Ie = m(() => Y.value.filter((e) => !P.has(e.id))), Le = m(() => Y.value.filter((e) => P.has(e.id))), X = m(() => pe(L.value, z.value, [...R.value, ...Y.value.map((e) => ({ results: e.items }))], {
117
- t: F,
118
- choice: ke
119
- })), Re = {
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 ?? F(me(e.id), {}, Re[t] ?? t);
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 (N.value = !1, e.kind === "action" && e.action && e.context) je.trigger(e.action, e.context);
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) ge(e.appearance, I.value);
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(() => _e.trigger(t), 0);
137
- } else e.kind === "install" && ae(F);
138
- }, ze = (e) => {
139
- N.value = !1, f.visit(e);
140
- }, Be = (e, t) => {
141
- e.stopPropagation(), !(!t.url || t.openUrlInNewTab || e.metaKey || e.ctrlKey) && (e.preventDefault(), N.value = !1, f.visit(t.url));
142
- }, Ve = (e) => Object.entries(e.details ?? {}).map(([e, t]) => `${e}: ${String(t)}`).join(" · "), He = m(() => R.value.length > 0 || Y.value.length > 0);
143
- return (e, t) => (S(), h(oe, {
144
- open: N.value,
145
- title: H.value ? E(F)("command_palette", {}, "Command palette") : E(F)("search", {}, "Search"),
146
- description: W.value,
147
- "onUpdate:open": t[2] ||= (e) => N.value = 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(X.value), 1),
152
- b(re, {
153
- placeholder: W.value,
154
- "model-value": L.value,
155
- "onUpdate:modelValue": t[0] ||= (e) => L.value = 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(ie, null, {
158
+ b(ae, null, {
158
159
  default: O(() => [
159
- !z.value && !He.value ? (S(), h(s, { key: 0 }, {
160
- default: O(() => [y(T(L.value ? E(F)("no_results", {}, "No results.") : W.value), 1)]),
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(Ie.value, (e) => (S(), h(c, {
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(l, {
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", M, T(t.label), 1), Q(e, t) ? (S(), _("span", Se, T(Q(e, t)), 1)) : g("", !0)]),
181
- t.shortcut ? (S(), h(u, {
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
- z.value ? (S(), _("div", Ce, [b(ne)])) : g("", !0),
196
- (S(!0), _(p, null, w(R.value, (e) => (S(), h(c, {
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(l, {
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) => ze(n.url)
210
+ onSelect: (e) => Be(n.url)
205
211
  }, {
206
- default: O(() => [v("div", we, [v("span", null, T(n.title), 1), n.details ? (S(), _("span", Te, T(Ve(n)), 1)) : g("", !0)]), n.actions?.length ? (S(), _("div", Ee, [(S(!0), _(p, null, w(n.actions.filter((e) => e.url), (e) => (S(), h(te, {
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) => Be(t, e)
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, De)]),
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(Le.value, (e) => (S(), h(c, {
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(l, {
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", Oe, T(e.label), 1),
249
- e.shortcut ? (S(), h(u, {
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 { N as default };
283
+ export { M as default };
278
284
 
279
285
  //# sourceMappingURL=GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map
@@ -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/SidebarMenu.js";
4
- import r from "../ui/Collapsible.js";
5
- import i from "../ui/CollapsibleContent.js";
6
- import a from "../ui/CollapsibleTrigger.js";
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(r, {
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
- _(a, { "as-child": "" }, {
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
- _(i, null, {
45
+ _(r, null, {
46
46
  default: D(() => [_(s, { class: x(N()) }, {
47
- default: D(() => [_(n, null, {
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(() => [_(n, null, {
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(() => [_(n, null, {
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