@alfakit/vue 0.1.1 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +16 -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/ActionButton.js.map +1 -1
  7. package/dist/components/actions/ActionButton.vue.d.ts.map +1 -1
  8. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js +160 -159
  9. package/dist/components/actions/ActionButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/actions/ActionGroupMenu.js.map +1 -1
  11. package/dist/components/actions/ActionGroupMenu.vue.d.ts.map +1 -1
  12. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js +69 -65
  13. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/components/actions/ActionModal.js.map +1 -1
  15. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  16. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +221 -219
  17. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  18. package/dist/components/ai/AiCopilot.js.map +1 -1
  19. package/dist/components/ai/AiCopilot.vue.d.ts +2 -0
  20. package/dist/components/ai/AiCopilot.vue.d.ts.map +1 -1
  21. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js +7 -2
  22. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js +19 -19
  24. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/cms/LivePreview.js.map +1 -1
  26. package/dist/components/cms/LivePreview.vue.d.ts.map +1 -1
  27. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js +83 -83
  28. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/fields/BuilderField.js.map +1 -1
  30. package/dist/components/fields/BuilderField.vue.d.ts.map +1 -1
  31. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js +162 -157
  32. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/fields/ColorPickerField.js.map +1 -1
  34. package/dist/components/fields/ColorPickerField.vue.d.ts.map +1 -1
  35. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js +1 -0
  36. package/dist/components/fields/ColorPickerField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/fields/ComboboxSelect.js.map +1 -1
  38. package/dist/components/fields/ComboboxSelect.vue.d.ts.map +1 -1
  39. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  40. package/dist/components/fields/ComboboxSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/fields/FileUploadField.js.map +1 -1
  42. package/dist/components/fields/FileUploadField.vue.d.ts.map +1 -1
  43. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js +183 -183
  44. package/dist/components/fields/FileUploadField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/fields/ImageEditorDialog.js.map +1 -1
  46. package/dist/components/fields/ImageEditorDialog.vue.d.ts.map +1 -1
  47. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js +46 -46
  48. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/components/fields/KeyValueField.js.map +1 -1
  50. package/dist/components/fields/KeyValueField.vue.d.ts.map +1 -1
  51. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js +66 -66
  52. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  53. package/dist/components/fields/ModalTablePicker.js.map +1 -1
  54. package/dist/components/fields/ModalTablePicker.vue.d.ts.map +1 -1
  55. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js +113 -113
  56. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/components/fields/OneTimeCodeInputField.js.map +1 -1
  58. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js +1 -2
  59. package/dist/components/fields/OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  60. package/dist/components/fields/RepeaterField.js.map +1 -1
  61. package/dist/components/fields/RepeaterField.vue.d.ts.map +1 -1
  62. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js +12 -12
  63. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/fields/RichEditorInput.js.map +1 -1
  65. package/dist/components/fields/RichEditorInput.vue.d.ts.map +1 -1
  66. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js +166 -165
  67. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/fields/SelectField.js.map +1 -1
  69. package/dist/components/fields/SelectField.vue.d.ts.map +1 -1
  70. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js +2 -2
  71. package/dist/components/fields/SelectField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/fields/SliderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/fields/TableColumnHeaders.js.map +1 -1
  74. package/dist/components/fields/TableColumnHeaders.vue.d.ts.map +1 -1
  75. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js +6 -3
  76. package/dist/components/fields/TableColumnHeaders.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/components/fields/item-actions.d.ts +2 -2
  78. package/dist/components/fields/item-actions.d.ts.map +1 -1
  79. package/dist/components/fields/item-actions.js +31 -31
  80. package/dist/components/fields/item-actions.js.map +1 -1
  81. package/dist/components/file-manager/FileManagerView.js.map +1 -1
  82. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  83. package/dist/components/file-manager/FileManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/form/FormBlock.js.map +1 -1
  85. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  86. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +81 -77
  87. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/form/form-context.js +25 -25
  89. package/dist/components/form/form-context.js.map +1 -1
  90. package/dist/components/kanban/KanbanBoard.js.map +1 -1
  91. package/dist/components/kanban/KanbanBoard.vue.d.ts.map +1 -1
  92. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js +5 -2
  93. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  94. package/dist/components/kanban/KanbanColumnHeader.js.map +1 -1
  95. package/dist/components/kanban/KanbanColumnHeader.vue.d.ts.map +1 -1
  96. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js +64 -64
  97. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  98. package/dist/components/layout/FusedGroupComponent.js.map +1 -1
  99. package/dist/components/layout/FusedGroupComponent.vue.d.ts.map +1 -1
  100. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js +1 -0
  101. package/dist/components/layout/FusedGroupComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  102. package/dist/components/layout/SectionComponent.js.map +1 -1
  103. package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
  104. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +23 -23
  105. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  106. package/dist/components/layout/TabsComponent.js.map +1 -1
  107. package/dist/components/layout/TabsComponent.vue.d.ts.map +1 -1
  108. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js +76 -55
  109. package/dist/components/layout/TabsComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  110. package/dist/components/notifications/NotificationsMenu.js.map +1 -1
  111. package/dist/components/notifications/NotificationsMenu.vue.d.ts.map +1 -1
  112. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js +44 -42
  113. package/dist/components/notifications/NotificationsMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  114. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js +8 -8
  115. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  116. package/dist/components/panel/GlobalSearch.js.map +1 -1
  117. package/dist/components/panel/GlobalSearch.vue.d.ts.map +1 -1
  118. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js +1 -0
  119. package/dist/components/panel/GlobalSearch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  120. package/dist/components/panel/GlobalSearchPalette.js.map +1 -1
  121. package/dist/components/panel/GlobalSearchPalette.vue.d.ts.map +1 -1
  122. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js +102 -96
  123. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
  124. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +10 -10
  125. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  126. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js +9 -9
  127. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  128. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +16 -16
  129. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  130. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +10 -10
  131. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  132. package/dist/components/panel/ShortcutKeys.js.map +1 -1
  133. package/dist/components/panel/ShortcutKeys.vue.d.ts.map +1 -1
  134. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js +4 -1
  135. package/dist/components/panel/ShortcutKeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/components/panel/TenantMenu.js.map +1 -1
  137. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +37 -37
  138. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  139. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js +11 -11
  140. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  141. package/dist/components/realtime/use-live-updates.d.ts.map +1 -1
  142. package/dist/components/realtime/use-live-updates.js +24 -23
  143. package/dist/components/realtime/use-live-updates.js.map +1 -1
  144. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js +2 -1
  145. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  146. package/dist/components/table/ColumnHeader.js.map +1 -1
  147. package/dist/components/table/ColumnHeader.vue.d.ts.map +1 -1
  148. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js +55 -49
  149. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  150. package/dist/components/table/ColumnManager.js.map +1 -1
  151. package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
  152. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +5 -4
  153. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
  154. package/dist/components/table/ContentLayoutSort.js.map +1 -1
  155. package/dist/components/table/ContentLayoutSort.vue.d.ts.map +1 -1
  156. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js +5 -5
  157. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  158. package/dist/components/table/GroupHeaderRow.js.map +1 -1
  159. package/dist/components/table/GroupHeaderRow.vue.d.ts.map +1 -1
  160. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js +55 -34
  161. package/dist/components/table/GroupHeaderRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  162. package/dist/components/table/SelectCell.js.map +1 -1
  163. package/dist/components/table/SelectCell.vue.d.ts.map +1 -1
  164. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +26 -20
  165. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js +2 -1
  167. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  168. package/dist/components/table/TableCellContent.js.map +1 -1
  169. package/dist/components/table/TableCellContent.vue.d.ts.map +1 -1
  170. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js +4 -3
  171. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  172. package/dist/components/table/TablePagination.js.map +1 -1
  173. package/dist/components/table/TablePagination.vue.d.ts.map +1 -1
  174. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js +87 -87
  175. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  176. package/dist/components/table/TextInputCell.js.map +1 -1
  177. package/dist/components/table/TextInputCell.vue.d.ts.map +1 -1
  178. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +40 -34
  179. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  180. package/dist/components/table/cell-update.d.ts +6 -0
  181. package/dist/components/table/cell-update.d.ts.map +1 -1
  182. package/dist/components/table/cell-update.js.map +1 -1
  183. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  184. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  185. package/dist/components/ui/CommandAutoHighlight.js +7 -0
  186. package/dist/components/ui/CommandAutoHighlight.js.map +1 -0
  187. package/dist/components/ui/CommandAutoHighlight.vue.d.ts +21 -0
  188. package/dist/components/ui/CommandAutoHighlight.vue.d.ts.map +1 -0
  189. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js +18 -0
  190. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -0
  191. package/dist/components/ui/DialogContent.js.map +1 -1
  192. package/dist/components/ui/DialogContent.vue.d.ts.map +1 -1
  193. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js +13 -12
  194. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  195. package/dist/components/ui/PopoverContent.js.map +1 -1
  196. package/dist/components/ui/PopoverContent.vue.d.ts.map +1 -1
  197. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js +9 -8
  198. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  199. package/dist/components/ui/SheetContent.js.map +1 -1
  200. package/dist/components/ui/SheetContent.vue.d.ts.map +1 -1
  201. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js +13 -12
  202. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  203. package/dist/components/ui/TooltipContent.js.map +1 -1
  204. package/dist/components/ui/TooltipContent.vue.d.ts.map +1 -1
  205. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js +9 -8
  206. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  207. package/dist/components.css +347 -0
  208. package/dist/context.d.ts +7 -0
  209. package/dist/context.d.ts.map +1 -1
  210. package/dist/context.js +29 -26
  211. package/dist/context.js.map +1 -1
  212. package/dist/create-alfakit.d.ts.map +1 -1
  213. package/dist/create-alfakit.js +33 -31
  214. package/dist/create-alfakit.js.map +1 -1
  215. package/dist/eject-manifest.json +11 -2
  216. package/dist/index.d.ts +1 -0
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +219 -217
  219. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  220. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  221. package/dist/layouts/AuthLayout.vue_vue_type_script_setup_true_lang.js +9 -9
  222. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  223. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  224. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +15 -15
  225. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  226. package/dist/layouts/lazy-layouts.d.ts +10 -0
  227. package/dist/layouts/lazy-layouts.d.ts.map +1 -0
  228. package/dist/layouts/lazy-layouts.js +8 -0
  229. package/dist/layouts/lazy-layouts.js.map +1 -0
  230. package/dist/layouts/panel-layouts.d.ts +8 -0
  231. package/dist/layouts/panel-layouts.d.ts.map +1 -0
  232. package/dist/layouts/panel-layouts.js +15 -0
  233. package/dist/layouts/panel-layouts.js.map +1 -0
  234. package/dist/lib/lazy.d.ts.map +1 -1
  235. package/dist/lib/lazy.js +2 -2
  236. package/dist/lib/lazy.js.map +1 -1
  237. package/dist/pages/PageShell.js.map +1 -1
  238. package/dist/pages/PageShell.vue.d.ts.map +1 -1
  239. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js +39 -42
  240. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/standalone/AlfakitComponent.js.map +1 -1
  242. package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
  243. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +56 -52
  244. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  245. package/dist/standalone/AlfakitToaster.js.map +1 -1
  246. package/dist/standalone/AlfakitToaster.vue.d.ts.map +1 -1
  247. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js +23 -15
  248. package/dist/standalone/AlfakitToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
  249. package/dist/standalone.css +54 -0
  250. package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
  251. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts +2 -2
  252. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
  253. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +17 -12
  254. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  255. package/dist/starter-kit/dashboard-widgets.d.ts +54 -0
  256. package/dist/starter-kit/dashboard-widgets.d.ts.map +1 -0
  257. package/dist/starter-kit/dashboard-widgets.js +54 -0
  258. package/dist/starter-kit/dashboard-widgets.js.map +1 -0
  259. package/dist/starter-kit/index.d.ts +2 -1
  260. package/dist/starter-kit/index.d.ts.map +1 -1
  261. package/dist/starter-kit/index.js +5 -4
  262. package/dist/starter-kit/runtime.d.ts +6 -0
  263. package/dist/starter-kit/runtime.d.ts.map +1 -1
  264. package/dist/starter-kit/runtime.js +19 -15
  265. package/dist/starter-kit/runtime.js.map +1 -1
  266. package/dist/starter-kit/starter-kit.d.ts.map +1 -1
  267. package/dist/starter-kit/starter-kit.js +8 -8
  268. package/dist/starter-kit/starter-kit.js.map +1 -1
  269. package/dist/starter-kit/widgets/CopilotTrigger.js +7 -0
  270. package/dist/starter-kit/widgets/CopilotTrigger.js.map +1 -0
  271. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts +12 -0
  272. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts.map +1 -0
  273. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js +23 -0
  274. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  275. package/dist/starter-kit/widgets/LoadedCopilot.js +7 -0
  276. package/dist/starter-kit/widgets/LoadedCopilot.js.map +1 -0
  277. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts +8 -0
  278. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts.map +1 -0
  279. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js +31 -0
  280. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -0
  281. package/dist/starter-kit/widgets/SearchTrigger.js.map +1 -1
  282. package/dist/starter-kit/widgets/SearchTrigger.vue.d.ts.map +1 -1
  283. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js +1 -0
  284. package/dist/starter-kit/widgets/SearchTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  285. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js +7 -0
  286. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js.map +1 -0
  287. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts +8 -0
  288. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts.map +1 -0
  289. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js +34 -0
  290. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  291. package/dist/starter-kit/widgets/TenantChooser.js.map +1 -1
  292. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js +1 -1
  293. package/dist/starter-kit/widgets/TenantChooser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  294. package/dist/starter-kit/widgets/index.d.ts +40 -9
  295. package/dist/starter-kit/widgets/index.d.ts.map +1 -1
  296. package/dist/starter-kit/widgets/index.js +21 -18
  297. package/dist/starter-kit/widgets/index.js.map +1 -1
  298. package/dist/starter-kit/widgets/loaded.d.ts +10 -0
  299. package/dist/starter-kit/widgets/loaded.d.ts.map +1 -0
  300. package/dist/starter-kit/widgets/loaded.js +5 -0
  301. package/dist/styles.css +9 -2
  302. package/dist/themes.css +8 -335
  303. package/package.json +3 -3
  304. package/src/AlfakitRoot.vue +9 -1
  305. package/src/components/actions/ActionButton.vue +14 -6
  306. package/src/components/actions/ActionGroupMenu.vue +13 -1
  307. package/src/components/actions/ActionModal.vue +12 -1
  308. package/src/components/ai/AiCopilot.vue +7 -1
  309. package/src/components/cms/LivePreview.vue +8 -2
  310. package/src/components/fields/BuilderField.vue +15 -2
  311. package/src/components/fields/ColorPickerField.vue +1 -0
  312. package/src/components/fields/ComboboxSelect.vue +1 -1
  313. package/src/components/fields/FileUploadField.vue +14 -11
  314. package/src/components/fields/ImageEditorDialog.vue +7 -3
  315. package/src/components/fields/KeyValueField.vue +3 -2
  316. package/src/components/fields/ModalTablePicker.vue +7 -2
  317. package/src/components/fields/OneTimeCodeInputField.vue +1 -1
  318. package/src/components/fields/RepeaterField.vue +2 -3
  319. package/src/components/fields/RichEditorInput.vue +3 -0
  320. package/src/components/fields/SelectField.vue +4 -2
  321. package/src/components/fields/TableColumnHeaders.vue +6 -1
  322. package/src/components/fields/item-actions.ts +31 -10
  323. package/src/components/file-manager/FileManagerView.vue +1 -1
  324. package/src/components/form/FormBlock.vue +26 -1
  325. package/src/components/form/form-context.ts +3 -3
  326. package/src/components/kanban/KanbanBoard.vue +15 -3
  327. package/src/components/kanban/KanbanColumnHeader.vue +6 -4
  328. package/src/components/layout/FusedGroupComponent.vue +1 -0
  329. package/src/components/layout/SectionComponent.vue +10 -4
  330. package/src/components/layout/TabsComponent.vue +61 -5
  331. package/src/components/notifications/NotificationsMenu.vue +11 -0
  332. package/src/components/panel/GlobalSearch.vue +1 -0
  333. package/src/components/panel/GlobalSearchPalette.vue +2 -0
  334. package/src/components/panel/ShortcutKeys.vue +1 -0
  335. package/src/components/panel/TenantMenu.vue +2 -2
  336. package/src/components/realtime/use-live-updates.ts +3 -1
  337. package/src/components/table/ColumnHeader.vue +23 -12
  338. package/src/components/table/ColumnManager.vue +12 -8
  339. package/src/components/table/ContentLayoutSort.vue +7 -1
  340. package/src/components/table/GroupHeaderRow.vue +27 -0
  341. package/src/components/table/SelectCell.vue +5 -2
  342. package/src/components/table/TableCellContent.vue +4 -2
  343. package/src/components/table/TablePagination.vue +12 -7
  344. package/src/components/table/TextInputCell.vue +11 -5
  345. package/src/components/table/cell-update.ts +6 -0
  346. package/src/components/ui/CommandAutoHighlight.vue +27 -0
  347. package/src/components/ui/DialogContent.vue +5 -1
  348. package/src/components/ui/PopoverContent.vue +5 -1
  349. package/src/components/ui/SheetContent.vue +5 -1
  350. package/src/components/ui/TooltipContent.vue +5 -1
  351. package/src/context.ts +10 -0
  352. package/src/create-alfakit.ts +5 -0
  353. package/src/index.ts +2 -0
  354. package/src/layouts/lazy-layouts.ts +14 -0
  355. package/src/layouts/panel-layouts.ts +17 -0
  356. package/src/lib/lazy.ts +11 -1
  357. package/src/pages/PageShell.vue +5 -6
  358. package/src/standalone/AlfakitComponent.vue +17 -6
  359. package/src/standalone/AlfakitToaster.vue +12 -2
  360. package/src/starter-kit/AlfakitStarterKitRoot.vue +12 -3
  361. package/src/starter-kit/dashboard-widgets.ts +93 -0
  362. package/src/starter-kit/index.ts +7 -1
  363. package/src/starter-kit/runtime.ts +17 -1
  364. package/src/starter-kit/starter-kit.ts +2 -1
  365. package/src/starter-kit/widgets/CopilotTrigger.vue +58 -0
  366. package/src/starter-kit/widgets/LoadedCopilot.vue +29 -0
  367. package/src/starter-kit/widgets/SearchTrigger.vue +1 -0
  368. package/src/starter-kit/widgets/StarterKitImpersonationBanner.vue +57 -0
  369. package/src/starter-kit/widgets/TenantChooser.vue +1 -1
  370. package/src/starter-kit/widgets/index.ts +56 -11
  371. package/src/starter-kit/widgets/loaded.ts +9 -0
  372. package/src/styles.css +9 -2
@@ -1,7 +1,7 @@
1
1
  import { useDirection as e, useFormatter as t, usePanel as ee, useT as te } from "../../context.js";
2
2
  import { cn as n } from "../../lib/utils.js";
3
- import { useStore as r } from "../../composables/use-store.js";
4
- import { cssColor as i, textColorClasses as ne } from "../../lib/colors.js";
3
+ import { useStore as ne } from "../../composables/use-store.js";
4
+ import { cssColor as r, textColorClasses as i } from "../../lib/colors.js";
5
5
  import a from "../../lib/Icon.js";
6
6
  import o from "../ui/Button2.js";
7
7
  import s from "../ui/Spinner.js";
@@ -10,8 +10,8 @@ import c from "../ui/Popover.js";
10
10
  import l from "../ui/PopoverContent.js";
11
11
  import u from "../ui/PopoverTrigger.js";
12
12
  import d from "../ui/ScrollArea.js";
13
- import { NotificationCenter as ie, notificationTintStyles as ae, onDatabaseNotificationsSent as oe, onOpenDatabaseNotifications as se } from "@alfakit/core";
14
- import { Fragment as f, computed as ce, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as _, createVNode as v, defineComponent as y, normalizeClass as b, normalizeStyle as x, onMounted as S, onScopeDispose as C, openBlock as w, ref as le, renderList as T, toDisplayString as E, unref as D, watch as O, withCtx as k } from "vue";
13
+ import { NotificationCenter as f, notificationTintStyles as ie, onDatabaseNotificationsSent as ae, onOpenDatabaseNotifications as oe } from "@alfakit/core";
14
+ import { Fragment as p, computed as se, createBlock as m, createCommentVNode as h, createElementBlock as g, createElementVNode as _, createTextVNode as v, createVNode as y, defineComponent as b, normalizeClass as x, normalizeStyle as ce, onMounted as S, onScopeDispose as C, openBlock as w, ref as le, renderList as T, toDisplayString as E, unref as D, watch as O, withCtx as k } from "vue";
15
15
  import { BellIcon as A, CheckCheckIcon as j, Trash2Icon as M } from "@lucide/vue";
16
16
  //#region src/components/notifications/NotificationsMenu.vue?vue&type=script&setup=true&lang.ts
17
17
  var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P = {
@@ -38,15 +38,15 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
38
38
  }, ge = {
39
39
  key: 3,
40
40
  class: "flex justify-center border-t p-2"
41
- }, W = /*@__PURE__*/ y({
41
+ }, W = /*@__PURE__*/ b({
42
42
  __name: "NotificationsMenu",
43
43
  props: { variant: { default: "topbar" } },
44
- setup(y) {
45
- let W = y, G = te(), _e = e(), K = ee(), q = ce(() => K.value.databaseNotifications), J = K.value.endpoints, Y = J.notifications && J.notificationsReadAll && J.notificationsDestroyAll ? new ie({
44
+ setup(b) {
45
+ let W = b, G = te(), _e = e(), K = ee(), q = se(() => K.value.databaseNotifications), J = K.value.endpoints, Y = J.notifications && J.notificationsReadAll && J.notificationsDestroyAll ? new f({
46
46
  notifications: J.notifications,
47
47
  notificationsReadAll: J.notificationsReadAll,
48
48
  notificationsDestroyAll: J.notificationsDestroyAll
49
- }, q.value?.unreadCount ?? 0) : null, X = le(!1), Z = r(Y?.store ?? {
49
+ }, q.value?.unreadCount ?? 0) : null, X = le(!1), Z = ne(Y?.store ?? {
50
50
  get: () => ({
51
51
  notifications: [],
52
52
  unreadCount: 0,
@@ -60,23 +60,25 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
60
60
  O(() => q.value?.pollingInterval, (e) => Y?.startPolling(e), { immediate: !0 });
61
61
  }), O(X, (e) => {
62
62
  e && Y?.load();
63
+ }), O(() => q.value?.unreadCount, (e) => {
64
+ Y && typeof e == "number" && e !== Y.store.get().unreadCount && Y.store.update({ unreadCount: e });
63
65
  });
64
66
  let Q = null;
65
67
  S(() => {
66
- Q = Y ? oe(() => void Y.load()) : null;
68
+ Q = Y ? ae(() => void Y.load()) : null;
67
69
  }), C(() => Q?.());
68
70
  let $ = null;
69
71
  S(() => {
70
- $ = se(() => X.value = !0);
72
+ $ = oe(() => X.value = !0);
71
73
  }), C(() => $?.()), C(() => Y?.stopPolling());
72
74
  let ve = t();
73
- return (e, t) => q.value && D(Y) ? (w(), p(c, {
75
+ return (e, t) => q.value && D(Y) ? (w(), m(c, {
74
76
  key: 0,
75
77
  open: X.value,
76
78
  "onUpdate:open": t[3] ||= (e) => X.value = e
77
79
  }, {
78
- default: k(() => [v(u, { "as-child": "" }, {
79
- default: k(() => [W.variant === "sidebar" ? (w(), p(o, {
80
+ default: k(() => [y(u, { "as-child": "" }, {
81
+ default: k(() => [W.variant === "sidebar" ? (w(), m(o, {
80
82
  key: 0,
81
83
  type: "button",
82
84
  variant: "ghost",
@@ -85,15 +87,15 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
85
87
  "data-variant": "sidebar"
86
88
  }, {
87
89
  default: k(() => [
88
- v(D(a), {
90
+ y(D(a), {
89
91
  name: "alfakit::panels.topbar.open-database-notifications-button",
90
92
  fallback: D(A)
91
93
  }, null, 8, ["fallback"]),
92
- g("span", N, E(D(G)("notifications", {}, "Notifications")), 1),
93
- D(Z).unreadCount > 0 ? (w(), h("span", P, [_(E(D(Z).unreadCount > 99 ? "99+" : D(Z).unreadCount) + " ", 1), g("span", F, E(D(G)("unread_notifications", {}, "unread")), 1)])) : m("", !0)
94
+ _("span", N, E(D(G)("notifications", {}, "Notifications")), 1),
95
+ D(Z).unreadCount > 0 ? (w(), g("span", P, [v(E(D(Z).unreadCount > 99 ? "99+" : D(Z).unreadCount) + " ", 1), _("span", F, E(D(G)("unread_notifications", {}, "unread")), 1)])) : h("", !0)
94
96
  ]),
95
97
  _: 1
96
- })) : (w(), p(o, {
98
+ })) : (w(), m(o, {
97
99
  key: 1,
98
100
  type: "button",
99
101
  variant: "ghost",
@@ -102,19 +104,19 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
102
104
  "data-slot": "notifications-trigger",
103
105
  "aria-label": D(G)("notifications", {}, "Notifications")
104
106
  }, {
105
- default: k(() => [v(D(a), {
107
+ default: k(() => [y(D(a), {
106
108
  name: "alfakit::panels.topbar.open-database-notifications-button",
107
109
  fallback: D(A)
108
- }, null, 8, ["fallback"]), D(Z).unreadCount > 0 ? (w(), h("span", I, E(D(Z).unreadCount > 99 ? "99+" : D(Z).unreadCount), 1)) : m("", !0)]),
110
+ }, null, 8, ["fallback"]), D(Z).unreadCount > 0 ? (w(), g("span", I, E(D(Z).unreadCount > 99 ? "99+" : D(Z).unreadCount), 1)) : h("", !0)]),
109
111
  _: 1
110
112
  }, 8, ["aria-label"]))]),
111
113
  _: 1
112
- }), v(l, {
114
+ }), y(l, {
113
115
  align: W.variant === "sidebar" ? "start" : "end",
114
116
  side: W.variant === "sidebar" ? D(_e) === "rtl" ? "left" : "right" : "bottom",
115
117
  class: "w-80 p-0 sm:w-96"
116
118
  }, {
117
- default: k(() => [g("div", L, [g("span", R, E(D(G)("notifications", {}, "Notifications")), 1), g("div", z, [D(Z).unreadCount > 0 ? (w(), p(o, {
119
+ default: k(() => [_("div", L, [_("span", R, E(D(G)("notifications", {}, "Notifications")), 1), _("div", z, [D(Z).unreadCount > 0 ? (w(), m(o, {
118
120
  key: 0,
119
121
  type: "button",
120
122
  variant: "ghost",
@@ -122,9 +124,9 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
122
124
  title: D(G)("mark_all_read", {}, "Mark all as read"),
123
125
  onClick: t[0] ||= (e) => void D(Y).markAllAsRead()
124
126
  }, {
125
- default: k(() => [v(D(j))]),
127
+ default: k(() => [y(D(j))]),
126
128
  _: 1
127
- }, 8, ["title"])) : m("", !0), D(Z).notifications.length > 0 ? (w(), p(o, {
129
+ }, 8, ["title"])) : h("", !0), D(Z).notifications.length > 0 ? (w(), m(o, {
128
130
  key: 1,
129
131
  type: "button",
130
132
  variant: "ghost",
@@ -132,35 +134,35 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
132
134
  title: D(G)("clear_notifications", {}, "Clear notifications"),
133
135
  onClick: t[1] ||= (e) => void D(Y).clear()
134
136
  }, {
135
- default: k(() => [v(D(M))]),
137
+ default: k(() => [y(D(M))]),
136
138
  _: 1
137
- }, 8, ["title"])) : m("", !0)])]), v(d, { class: "max-h-96" }, {
138
- default: k(() => [D(Z).loading && D(Z).notifications.length === 0 ? (w(), h("div", B, [v(s)])) : D(Z).notifications.length === 0 ? (w(), h("p", ue, E(D(G)("no_notifications", {}, "You have no notifications.")), 1)) : (w(), h("ul", V, [(w(!0), h(f, null, T(D(Z).notifications, (e) => (w(), h("li", {
139
+ }, 8, ["title"])) : h("", !0)])]), y(d, { class: "max-h-96" }, {
140
+ default: k(() => [D(Z).loading && D(Z).notifications.length === 0 ? (w(), g("div", B, [y(s)])) : D(Z).notifications.length === 0 ? (w(), g("p", ue, E(D(G)("no_notifications", {}, "You have no notifications.")), 1)) : (w(), g("ul", V, [(w(!0), g(p, null, T(D(Z).notifications, (e) => (w(), g("li", {
139
141
  key: e.id,
140
- class: b(D(n)("flex gap-3 px-3 py-3", !e.readAt && "bg-primary/5")),
141
- style: x(e.color ? D(ae)(D(i)(e.color)).item : void 0)
142
- }, [e.icon ? (w(), p(D(a), {
142
+ class: x(D(n)("flex gap-3 px-3 py-3", !e.readAt && "bg-primary/5")),
143
+ style: ce(e.color ? D(ie)(D(r)(e.color)).item : void 0)
144
+ }, [e.icon ? (w(), m(D(a), {
143
145
  key: 0,
144
146
  name: e.icon,
145
- class: b(D(n)("mt-0.5 size-5 shrink-0", e.iconColor && D(ne)[e.iconColor]))
146
- }, null, 8, ["name", "class"])) : m("", !0), g("div", H, [
147
- g("div", U, [g("p", de, E(e.title), 1), e.readAt ? m("", !0) : (w(), h("button", {
147
+ class: x(D(n)("mt-0.5 size-5 shrink-0", e.iconColor && D(i)[e.iconColor]))
148
+ }, null, 8, ["name", "class"])) : h("", !0), _("div", H, [
149
+ _("div", U, [_("p", de, E(e.title), 1), e.readAt ? h("", !0) : (w(), g("button", {
148
150
  key: 0,
149
151
  type: "button",
150
152
  class: "focus-visible:ring-ring/50 -me-2 -mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full outline-none focus-visible:ring-[3px]",
151
153
  "aria-label": D(G)("mark_as_read", {}, "Mark as read"),
152
154
  onClick: (t) => void D(Y).markAsRead(e.id)
153
- }, [...t[4] ||= [g("span", {
155
+ }, [...t[4] ||= [_("span", {
154
156
  class: "bg-primary size-2 rounded-full",
155
157
  "aria-hidden": "true"
156
158
  }, null, -1)]], 8, fe))]),
157
- e.body ? (w(), h("p", {
159
+ e.body ? (w(), g("p", {
158
160
  key: 0,
159
161
  class: "text-muted-foreground text-sm",
160
162
  innerHTML: e.body
161
- }, null, 8, pe)) : m("", !0),
162
- e.date ? (w(), h("time", me, E(D(ve).relative(e.date)), 1)) : m("", !0),
163
- e.actions ? (w(), h("div", he, [(w(!0), h(f, null, T(e.actions, (t) => (w(), p(re, {
163
+ }, null, 8, pe)) : h("", !0),
164
+ e.date ? (w(), g("time", me, E(D(ve).relative(e.date)), 1)) : h("", !0),
165
+ e.actions ? (w(), g("div", he, [(w(!0), g(p, null, T(e.actions, (t) => (w(), m(re, {
164
166
  key: t.name,
165
167
  action: t,
166
168
  "on-mark-as-read": () => void D(Y).markAsRead(e.id),
@@ -169,23 +171,23 @@ var N = { class: "flex-1 text-start group-data-[collapsible=icon]:sr-only" }, P
169
171
  "action",
170
172
  "on-mark-as-read",
171
173
  "on-mark-as-unread"
172
- ]))), 128))])) : m("", !0)
173
- ])], 6))), 128))])), D(Z).hasMore && D(Z).notifications.length > 0 ? (w(), h("div", ge, [v(o, {
174
+ ]))), 128))])) : h("", !0)
175
+ ])], 6))), 128))])), D(Z).hasMore && D(Z).notifications.length > 0 ? (w(), g("div", ge, [y(o, {
174
176
  type: "button",
175
177
  variant: "ghost",
176
178
  size: "sm",
177
179
  disabled: D(Z).loading,
178
180
  onClick: t[2] ||= (e) => void D(Y).loadMore()
179
181
  }, {
180
- default: k(() => [D(Z).loading ? (w(), p(s, { key: 0 })) : m("", !0), _(" " + E(D(G)("load_more", {}, "Load more")), 1)]),
182
+ default: k(() => [D(Z).loading ? (w(), m(s, { key: 0 })) : h("", !0), v(" " + E(D(G)("load_more", {}, "Load more")), 1)]),
181
183
  _: 1
182
- }, 8, ["disabled"])])) : m("", !0)]),
184
+ }, 8, ["disabled"])])) : h("", !0)]),
183
185
  _: 1
184
186
  })]),
185
187
  _: 1
186
188
  }, 8, ["align", "side"])]),
187
189
  _: 1
188
- }, 8, ["open"])) : m("", !0);
190
+ }, 8, ["open"])) : h("", !0);
189
191
  }
190
192
  });
191
193
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationsMenu.vue_vue_type_script_setup_true_lang.js","names":["_unref","_openBlock","_createBlock","Popover","_withCtx","_createVNode","PopoverTrigger","Button","Icon","_createElementVNode","_toDisplayString","_createElementBlock","_createTextVNode","_createCommentVNode","PopoverContent","ScrollArea","Spinner","_Fragment","_renderList","_normalizeClass","_normalizeStyle","NotificationActionButton","Icon_default","Button_default","Spinner_default","NotificationActionButton_default","Popover_default","PopoverContent_default","PopoverTrigger_default","ScrollArea_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","NotificationsMenu_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","direction","useDirection","panel","usePanel","config","computed","endpoints","center","NotificationCenter","open","ref","state","useStore","onMounted","interval","watch","isOpen","stopListening","onDatabaseNotificationsSent","onScopeDispose","stopOpenListener","onOpenDatabaseNotifications","format","useFormatter","unref","openBlock","createBlock","_cache","$event","withCtx","createVNode","BellIcon","createElementVNode","toDisplayString","createElementBlock","createTextVNode","createCommentVNode","CheckCheckIcon","Trash2Icon","Fragment","renderList","notification","normalizeClass","cn","normalizeStyle","notificationTintStyles","cssColor","textColorClasses","action"],"sources":["../../../src/components/notifications/NotificationsMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n NotificationCenter,\n notificationTintStyles,\n onDatabaseNotificationsSent,\n onOpenDatabaseNotifications,\n} from '@alfakit/core'\nimport { BellIcon, CheckCheckIcon, Trash2Icon } from '@lucide/vue'\nimport { computed, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useDirection, useFormatter, usePanel, useT } from '../../context'\nimport { cssColor, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Button from '../ui/Button.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport ScrollArea from '../ui/ScrollArea.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport NotificationActionButton from './NotificationActionButton.vue'\n\n/**\n * Bell menu for database notifications. It also opens when something calls\n * `openDatabaseNotifications()` (or an action with `->openDatabaseNotifications()`).\n * `variant=\"sidebar\"`: a full-width row with a label, for layouts that put it in the sidebar.\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), {\n variant: 'topbar',\n})\nconst t = useT()\nconst direction = useDirection()\nconst panel = usePanel()\nconst config = computed(() => panel.value.databaseNotifications)\nconst endpoints = panel.value.endpoints\n\nconst center =\n endpoints.notifications && endpoints.notificationsReadAll && endpoints.notificationsDestroyAll\n ? new NotificationCenter(\n {\n notifications: endpoints.notifications,\n notificationsReadAll: endpoints.notificationsReadAll,\n notificationsDestroyAll: endpoints.notificationsDestroyAll,\n },\n config.value?.unreadCount ?? 0,\n )\n : null\n\nconst open = ref(false)\nconst state = useStore(\n center?.store ?? {\n get: () => ({ notifications: [], unreadCount: 0, loading: false, hasMore: false, page: 0 }),\n subscribe: () => () => {},\n },\n)\n\n// Polling starts in the browser only: a server render must not leave timers behind.\nonMounted(() => {\n watch(\n () => config.value?.pollingInterval,\n (interval) => center?.startPolling(interval),\n { immediate: true },\n )\n})\n\nwatch(open, (isOpen) => {\n if (isOpen) void center?.load()\n})\n\n// Realtime notifications announce stored ones, so the unread count updates right away.\nlet stopListening: (() => void) | null = null\nonMounted(() => {\n stopListening = center ? onDatabaseNotificationsSent(() => void center.load()) : null\n})\nonScopeDispose(() => stopListening?.())\n\n// `openDatabaseNotifications()`: opened from code or an action.\nlet stopOpenListener: (() => void) | null = null\nonMounted(() => {\n stopOpenListener = onOpenDatabaseNotifications(() => (open.value = true))\n})\nonScopeDispose(() => stopOpenListener?.())\n\nonScopeDispose(() => center?.stopPolling())\nconst format = useFormatter()\n</script>\n\n<template>\n <Popover v-if=\"config && center\" :open=\"open\" @update:open=\"open = $event\">\n <PopoverTrigger as-child>\n <Button\n v-if=\"props.variant === 'sidebar'\"\n type=\"button\"\n variant=\"ghost\"\n class=\"relative w-full justify-start gap-2 group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0\"\n data-slot=\"notifications-trigger\"\n data-variant=\"sidebar\"\n >\n <!-- In a collapsed (icon) sidebar only the bell and its badge stay visible. -->\n <Icon\n name=\"alfakit::panels.topbar.open-database-notifications-button\"\n :fallback=\"BellIcon\"\n />\n <span class=\"flex-1 text-start group-data-[collapsible=icon]:sr-only\">{{\n t('notifications', {}, 'Notifications')\n }}</span>\n <span\n v-if=\"state.unreadCount > 0\"\n class=\"bg-primary text-primary-foreground flex h-5 min-w-5 items-center justify-center rounded-full px-1 text-xs font-medium group-data-[collapsible=icon]:absolute group-data-[collapsible=icon]:-end-1 group-data-[collapsible=icon]:-top-1 group-data-[collapsible=icon]:h-4 group-data-[collapsible=icon]:min-w-4 group-data-[collapsible=icon]:text-[10px]\"\n >{{ state.unreadCount > 99 ? '99+' : state.unreadCount }}\n <span class=\"sr-only\">{{ t('unread_notifications', {}, 'unread') }}</span></span\n >\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"relative\"\n data-slot=\"notifications-trigger\"\n :aria-label=\"t('notifications', {}, 'Notifications')\"\n >\n <Icon\n name=\"alfakit::panels.topbar.open-database-notifications-button\"\n :fallback=\"BellIcon\"\n />\n <span\n v-if=\"state.unreadCount > 0\"\n class=\"bg-primary text-primary-foreground absolute -end-0.5 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-medium\"\n >{{ state.unreadCount > 99 ? '99+' : state.unreadCount }}</span\n >\n </Button>\n </PopoverTrigger>\n <PopoverContent\n :align=\"props.variant === 'sidebar' ? 'start' : 'end'\"\n :side=\"props.variant === 'sidebar' ? (direction === 'rtl' ? 'left' : 'right') : 'bottom'\"\n class=\"w-80 p-0 sm:w-96\"\n >\n <div class=\"flex items-center justify-between border-b px-3 py-2\">\n <span class=\"text-sm font-semibold\">{{ t('notifications', {}, 'Notifications') }}</span>\n <div class=\"flex items-center gap-1\">\n <Button\n v-if=\"state.unreadCount > 0\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :title=\"t('mark_all_read', {}, 'Mark all as read')\"\n @click=\"void center.markAllAsRead()\"\n ><CheckCheckIcon\n /></Button>\n <Button\n v-if=\"state.notifications.length > 0\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :title=\"t('clear_notifications', {}, 'Clear notifications')\"\n @click=\"void center.clear()\"\n ><Trash2Icon\n /></Button>\n </div>\n </div>\n <ScrollArea class=\"max-h-96\">\n <div\n v-if=\"state.loading && state.notifications.length === 0\"\n class=\"flex justify-center py-8\"\n >\n <Spinner />\n </div>\n <p\n v-else-if=\"state.notifications.length === 0\"\n class=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {{ t('no_notifications', {}, 'You have no notifications.') }}\n </p>\n <ul v-else class=\"divide-y\">\n <li\n v-for=\"notification in state.notifications\"\n :key=\"notification.id\"\n :class=\"cn('flex gap-3 px-3 py-3', !notification.readAt && 'bg-primary/5')\"\n :style=\"\n notification.color\n ? notificationTintStyles(cssColor(notification.color)).item\n : undefined\n \"\n >\n <Icon\n v-if=\"notification.icon\"\n :name=\"notification.icon\"\n :class=\"\n cn(\n 'mt-0.5 size-5 shrink-0',\n notification.iconColor && textColorClasses[notification.iconColor],\n )\n \"\n />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div class=\"flex items-start justify-between gap-2\">\n <p class=\"text-sm font-medium\">{{ notification.title }}</p>\n <button\n v-if=\"!notification.readAt\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 -me-2 -mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full outline-none focus-visible:ring-[3px]\"\n :aria-label=\"t('mark_as_read', {}, 'Mark as read')\"\n @click=\"void center.markAsRead(notification.id)\"\n >\n <span class=\"bg-primary size-2 rounded-full\" aria-hidden=\"true\" />\n </button>\n </div>\n <p\n v-if=\"notification.body\"\n class=\"text-muted-foreground text-sm\"\n v-html=\"notification.body\"\n />\n <time v-if=\"notification.date\" class=\"text-muted-foreground text-xs\">{{\n format.relative(notification.date)\n }}</time>\n <div v-if=\"notification.actions\" class=\"flex flex-wrap gap-1\">\n <NotificationActionButton\n v-for=\"action in notification.actions\"\n :key=\"action.name\"\n :action=\"action\"\n :on-mark-as-read=\"() => void center!.markAsRead(notification.id)\"\n :on-mark-as-unread=\"() => void center!.markAsUnread(notification.id)\"\n />\n </div>\n </div>\n </li>\n </ul>\n <div\n v-if=\"state.hasMore && state.notifications.length > 0\"\n class=\"flex justify-center border-t p-2\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"state.loading\"\n @click=\"void center!.loadMore()\"\n >\n <Spinner v-if=\"state.loading\" />\n {{ t('load_more', {}, 'Load more') }}\n </Button>\n </div>\n </ScrollArea>\n </PopoverContent>\n </Popover>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"NotificationsMenu.vue_vue_type_script_setup_true_lang.js","names":["_unref","_openBlock","_createBlock","Popover","_withCtx","_createVNode","PopoverTrigger","Button","Icon","_createElementVNode","_toDisplayString","_createElementBlock","_createTextVNode","_createCommentVNode","PopoverContent","ScrollArea","Spinner","_Fragment","_renderList","_normalizeClass","_normalizeStyle","NotificationActionButton","Icon_default","Button_default","Spinner_default","NotificationActionButton_default","Popover_default","PopoverContent_default","PopoverTrigger_default","ScrollArea_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","NotificationsMenu_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","direction","useDirection","panel","usePanel","config","computed","endpoints","center","NotificationCenter","open","ref","state","useStore","onMounted","interval","watch","isOpen","count","stopListening","onDatabaseNotificationsSent","onScopeDispose","stopOpenListener","onOpenDatabaseNotifications","format","useFormatter","unref","openBlock","createBlock","_cache","$event","withCtx","createVNode","BellIcon","createElementVNode","toDisplayString","createElementBlock","createTextVNode","createCommentVNode","CheckCheckIcon","Trash2Icon","Fragment","renderList","notification","normalizeClass","cn","normalizeStyle","notificationTintStyles","cssColor","textColorClasses","action"],"sources":["../../../src/components/notifications/NotificationsMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n NotificationCenter,\n notificationTintStyles,\n onDatabaseNotificationsSent,\n onOpenDatabaseNotifications,\n} from '@alfakit/core'\nimport { BellIcon, CheckCheckIcon, Trash2Icon } from '@lucide/vue'\nimport { computed, onMounted, onScopeDispose, ref, watch } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useDirection, useFormatter, usePanel, useT } from '../../context'\nimport { cssColor, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Button from '../ui/Button.vue'\nimport Popover from '../ui/Popover.vue'\nimport PopoverContent from '../ui/PopoverContent.vue'\nimport PopoverTrigger from '../ui/PopoverTrigger.vue'\nimport ScrollArea from '../ui/ScrollArea.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport NotificationActionButton from './NotificationActionButton.vue'\n\n/**\n * Bell menu for database notifications. It also opens when something calls\n * `openDatabaseNotifications()` (or an action with `->openDatabaseNotifications()`).\n * `variant=\"sidebar\"`: a full-width row with a label, for layouts that put it in the sidebar.\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), {\n variant: 'topbar',\n})\nconst t = useT()\nconst direction = useDirection()\nconst panel = usePanel()\nconst config = computed(() => panel.value.databaseNotifications)\nconst endpoints = panel.value.endpoints\n\nconst center =\n endpoints.notifications && endpoints.notificationsReadAll && endpoints.notificationsDestroyAll\n ? new NotificationCenter(\n {\n notifications: endpoints.notifications,\n notificationsReadAll: endpoints.notificationsReadAll,\n notificationsDestroyAll: endpoints.notificationsDestroyAll,\n },\n config.value?.unreadCount ?? 0,\n )\n : null\n\nconst open = ref(false)\nconst state = useStore(\n center?.store ?? {\n get: () => ({ notifications: [], unreadCount: 0, loading: false, hasMore: false, page: 0 }),\n subscribe: () => () => {},\n },\n)\n\n// Polling starts in the browser only: a server render must not leave timers behind.\nonMounted(() => {\n watch(\n () => config.value?.pollingInterval,\n (interval) => center?.startPolling(interval),\n { immediate: true },\n )\n})\n\nwatch(open, (isOpen) => {\n if (isOpen) void center?.load()\n})\n\n// Every visit brings the server's unread count (another user after impersonating, or\n// notifications read in another tab): follow it instead of waiting for the next poll.\nwatch(\n () => config.value?.unreadCount,\n (count) => {\n if (center && typeof count === 'number' && count !== center.store.get().unreadCount) {\n center.store.update({ unreadCount: count })\n }\n },\n)\n\n// Realtime notifications announce stored ones, so the unread count updates right away.\nlet stopListening: (() => void) | null = null\nonMounted(() => {\n stopListening = center ? onDatabaseNotificationsSent(() => void center.load()) : null\n})\nonScopeDispose(() => stopListening?.())\n\n// `openDatabaseNotifications()`: opened from code or an action.\nlet stopOpenListener: (() => void) | null = null\nonMounted(() => {\n stopOpenListener = onOpenDatabaseNotifications(() => (open.value = true))\n})\nonScopeDispose(() => stopOpenListener?.())\n\nonScopeDispose(() => center?.stopPolling())\nconst format = useFormatter()\n</script>\n\n<template>\n <Popover v-if=\"config && center\" :open=\"open\" @update:open=\"open = $event\">\n <PopoverTrigger as-child>\n <Button\n v-if=\"props.variant === 'sidebar'\"\n type=\"button\"\n variant=\"ghost\"\n class=\"relative w-full justify-start gap-2 group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:p-0\"\n data-slot=\"notifications-trigger\"\n data-variant=\"sidebar\"\n >\n <!-- In a collapsed (icon) sidebar only the bell and its badge stay visible. -->\n <Icon\n name=\"alfakit::panels.topbar.open-database-notifications-button\"\n :fallback=\"BellIcon\"\n />\n <span class=\"flex-1 text-start group-data-[collapsible=icon]:sr-only\">{{\n t('notifications', {}, 'Notifications')\n }}</span>\n <span\n v-if=\"state.unreadCount > 0\"\n class=\"bg-primary text-primary-foreground flex h-5 min-w-5 items-center justify-center rounded-full px-1 text-xs font-medium group-data-[collapsible=icon]:absolute group-data-[collapsible=icon]:-end-1 group-data-[collapsible=icon]:-top-1 group-data-[collapsible=icon]:h-4 group-data-[collapsible=icon]:min-w-4 group-data-[collapsible=icon]:text-[10px]\"\n >{{ state.unreadCount > 99 ? '99+' : state.unreadCount }}\n <span class=\"sr-only\">{{ t('unread_notifications', {}, 'unread') }}</span></span\n >\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n class=\"relative\"\n data-slot=\"notifications-trigger\"\n :aria-label=\"t('notifications', {}, 'Notifications')\"\n >\n <Icon\n name=\"alfakit::panels.topbar.open-database-notifications-button\"\n :fallback=\"BellIcon\"\n />\n <span\n v-if=\"state.unreadCount > 0\"\n class=\"bg-primary text-primary-foreground absolute -end-0.5 -top-0.5 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-medium\"\n >{{ state.unreadCount > 99 ? '99+' : state.unreadCount }}</span\n >\n </Button>\n </PopoverTrigger>\n <PopoverContent\n :align=\"props.variant === 'sidebar' ? 'start' : 'end'\"\n :side=\"props.variant === 'sidebar' ? (direction === 'rtl' ? 'left' : 'right') : 'bottom'\"\n class=\"w-80 p-0 sm:w-96\"\n >\n <div class=\"flex items-center justify-between border-b px-3 py-2\">\n <span class=\"text-sm font-semibold\">{{ t('notifications', {}, 'Notifications') }}</span>\n <div class=\"flex items-center gap-1\">\n <Button\n v-if=\"state.unreadCount > 0\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :title=\"t('mark_all_read', {}, 'Mark all as read')\"\n @click=\"void center.markAllAsRead()\"\n ><CheckCheckIcon\n /></Button>\n <Button\n v-if=\"state.notifications.length > 0\"\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n :title=\"t('clear_notifications', {}, 'Clear notifications')\"\n @click=\"void center.clear()\"\n ><Trash2Icon\n /></Button>\n </div>\n </div>\n <ScrollArea class=\"max-h-96\">\n <div\n v-if=\"state.loading && state.notifications.length === 0\"\n class=\"flex justify-center py-8\"\n >\n <Spinner />\n </div>\n <p\n v-else-if=\"state.notifications.length === 0\"\n class=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {{ t('no_notifications', {}, 'You have no notifications.') }}\n </p>\n <ul v-else class=\"divide-y\">\n <li\n v-for=\"notification in state.notifications\"\n :key=\"notification.id\"\n :class=\"cn('flex gap-3 px-3 py-3', !notification.readAt && 'bg-primary/5')\"\n :style=\"\n notification.color\n ? notificationTintStyles(cssColor(notification.color)).item\n : undefined\n \"\n >\n <Icon\n v-if=\"notification.icon\"\n :name=\"notification.icon\"\n :class=\"\n cn(\n 'mt-0.5 size-5 shrink-0',\n notification.iconColor && textColorClasses[notification.iconColor],\n )\n \"\n />\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div class=\"flex items-start justify-between gap-2\">\n <p class=\"text-sm font-medium\">{{ notification.title }}</p>\n <button\n v-if=\"!notification.readAt\"\n type=\"button\"\n class=\"focus-visible:ring-ring/50 -me-2 -mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-full outline-none focus-visible:ring-[3px]\"\n :aria-label=\"t('mark_as_read', {}, 'Mark as read')\"\n @click=\"void center.markAsRead(notification.id)\"\n >\n <span class=\"bg-primary size-2 rounded-full\" aria-hidden=\"true\" />\n </button>\n </div>\n <p\n v-if=\"notification.body\"\n class=\"text-muted-foreground text-sm\"\n v-html=\"notification.body\"\n />\n <time v-if=\"notification.date\" class=\"text-muted-foreground text-xs\">{{\n format.relative(notification.date)\n }}</time>\n <div v-if=\"notification.actions\" class=\"flex flex-wrap gap-1\">\n <NotificationActionButton\n v-for=\"action in notification.actions\"\n :key=\"action.name\"\n :action=\"action\"\n :on-mark-as-read=\"() => void center!.markAsRead(notification.id)\"\n :on-mark-as-unread=\"() => void center!.markAsUnread(notification.id)\"\n />\n </div>\n </div>\n </li>\n </ul>\n <div\n v-if=\"state.hasMore && state.notifications.length > 0\"\n class=\"flex justify-center border-t p-2\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n :disabled=\"state.loading\"\n @click=\"void center!.loadMore()\"\n >\n <Spinner v-if=\"state.loading\" />\n {{ t('load_more', {}, 'Load more') }}\n </Button>\n </div>\n </ScrollArea>\n </PopoverContent>\n </Popover>\n</template>\n"],"mappings":"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"}
@@ -12,10 +12,10 @@ import oe from "../ui/Tabs.js";
12
12
  import o from "../ui/TabsContent.js";
13
13
  import s from "../ui/TabsList.js";
14
14
  import c from "../ui/TabsTrigger.js";
15
- import l from "../ui/ScrollArea.js";
16
- import u from "../ui/Collapsible.js";
17
- import d from "../ui/CollapsibleContent.js";
18
- import f from "../ui/CollapsibleTrigger.js";
15
+ import l from "../ui/Collapsible.js";
16
+ import u from "../ui/CollapsibleContent.js";
17
+ import d from "../ui/CollapsibleTrigger.js";
18
+ import f from "../ui/ScrollArea.js";
19
19
  import p from "./DebugFormState.js";
20
20
  import m from "./DebugTreeNode.js";
21
21
  import { byteLength as se, debugRecorder as h, formatBytes as g } from "@alfakit/core";
@@ -132,7 +132,7 @@ var N = {
132
132
  })
133
133
  ]),
134
134
  _: 1
135
- }), w(l, { class: "min-h-0 flex-1" }, {
135
+ }), w(f, { class: "min-h-0 flex-1" }, {
136
136
  default: A(() => [
137
137
  w(o, {
138
138
  value: "schema",
@@ -167,11 +167,11 @@ var N = {
167
167
  }, {
168
168
  default: A(() => [C(O(k(J)("debug.clear", {}, "Clear")), 1)]),
169
169
  _: 1
170
- })]), (E(!0), x(_, null, D(k(Z).requests, (e) => (E(), y(u, {
170
+ })]), (E(!0), x(_, null, D(k(Z).requests, (e) => (E(), y(l, {
171
171
  key: e.id,
172
172
  class: "rounded-md border"
173
173
  }, {
174
- default: A(() => [w(f, { class: "flex w-full items-center gap-2 px-3 py-2 text-start [&[data-state=open]>svg]:rotate-90" }, {
174
+ default: A(() => [w(d, { class: "flex w-full items-center gap-2 px-3 py-2 text-start [&[data-state=open]>svg]:rotate-90" }, {
175
175
  default: A(() => [
176
176
  w(k(M), { class: "text-muted-foreground size-3.5 shrink-0 transition-transform rtl:rotate-180" }),
177
177
  S("span", V, O(e.method), 1),
@@ -189,7 +189,7 @@ var N = {
189
189
  S("span", U, O(e.duration) + " ms", 1)
190
190
  ]),
191
191
  _: 2
192
- }, 1024), w(d, { class: "space-y-2 border-t px-3 py-2" }, {
192
+ }, 1024), w(u, { class: "space-y-2 border-t px-3 py-2" }, {
193
193
  default: A(() => [
194
194
  S("dl", W, [
195
195
  S("dt", null, O(k(J)("debug.duration", {}, "Duration")), 1),
@@ -1 +1 @@
1
- {"version":3,"file":"DebugPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Sheet","_withCtx","_createVNode","SheetTrigger","Button","_unref","SheetContent","_createElementVNode","SheetHeader","SheetTitle","_createTextVNode","_toDisplayString","SheetDescription","Tabs","TabsList","TabsTrigger","_createElementBlock","_createCommentVNode","ScrollArea","TabsContent","_Fragment","_renderList","DebugTreeNode","DebugFormState","Collapsible","CollapsibleTrigger","Badge","CollapsibleContent","Badge_default","Button_default","Sheet_default","SheetContent_default","SheetDescription_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","Tabs_default","TabsContent_default","TabsList_default","TabsTrigger_default","ScrollArea_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","DebugFormState_default","DebugTreeNode_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","DebugPanel_vue_vue_type_script_setup_true_lang_default","t","useT","props","useAlfakitProps","direction","useDirection","debug","computed","state","useStore","debugRecorder","payloadBytes","byteLength","json","value","pathOf","parsed","url","forms","openBlock","createBlock","withCtx","createVNode","unref","BugIcon","createElementVNode","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","Fragment","renderList","node","index","_cache","request","ChevronRightIcon","formatBytes","closure","item"],"sources":["../../../src/components/panel/DebugPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { FormStore } from '@alfakit/core'\nimport { byteLength, debugRecorder, formatBytes } from '@alfakit/core'\nimport { BugIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useAlfakitProps, useDirection, useT } from '../../context'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport ScrollArea from '../ui/ScrollArea.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport Tabs from '../ui/Tabs.vue'\nimport TabsContent from '../ui/TabsContent.vue'\nimport TabsList from '../ui/TabsList.vue'\nimport TabsTrigger from '../ui/TabsTrigger.vue'\nimport DebugFormState from './DebugFormState.vue'\nimport DebugTreeNode from './DebugTreeNode.vue'\n\n/**\n * The developer debug panel: a top bar toggle that opens a drawer with the page's resolved\n * schema tree (visibility and authorisation per component, closures evaluated), the live\n * form state, the internal requests captured by `requestJson()` and timings. Rendered only\n * when the page carries the `alfakitDebug` prop, which PHP adds while `Panel::debugPanel()`\n * is active and `app.debug` is on. Replace it with `components: { 'panel:debug-panel': … }`.\n */\nconst t = useT()\nconst props = useAlfakitProps()\nconst direction = useDirection()\nconst debug = computed(() => props.value.alfakitDebug)\nconst state = useStore(debugRecorder.store)\nconst payloadBytes = computed(() => byteLength(props.value))\n\nconst json = (value: unknown): string => {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nconst pathOf = (url: string): string => {\n try {\n const parsed = new URL(url, 'http://localhost')\n\n return parsed.pathname + parsed.search\n } catch {\n return url\n }\n}\n\nconst forms = computed(() => state.value.forms as FormStore[])\n</script>\n\n<template>\n <Sheet v-if=\"debug\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n :aria-label=\"t('debug.open', {}, 'Open debug panel')\"\n data-slot=\"debug-toggle\"\n >\n <BugIcon />\n </Button>\n </SheetTrigger>\n <SheetContent\n :side=\"direction === 'rtl' ? 'left' : 'right'\"\n class=\"flex w-full flex-col gap-0 p-0 sm:max-w-xl\"\n >\n <div data-slot=\"debug-panel\" class=\"flex min-h-0 flex-1 flex-col\">\n <SheetHeader class=\"border-b\">\n <SheetTitle class=\"flex items-center gap-2\">\n <BugIcon class=\"size-4\" />\n {{ t('debug.title', {}, 'Debug') }}\n </SheetTitle>\n <SheetDescription class=\"truncate font-mono text-xs\" :title=\"debug.page\">\n {{ debug.page }}\n </SheetDescription>\n </SheetHeader>\n <Tabs default-value=\"schema\" class=\"flex min-h-0 flex-1 flex-col gap-0\">\n <TabsList class=\"mx-4 mt-3 grid w-auto grid-cols-4\">\n <TabsTrigger value=\"schema\">{{ t('debug.schema', {}, 'Schema') }}</TabsTrigger>\n <TabsTrigger value=\"form\">\n {{ t('debug.form', {}, 'Form') }}\n <span\n v-if=\"forms.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ forms.length }}</span\n >\n </TabsTrigger>\n <TabsTrigger value=\"requests\">\n {{ t('debug.requests', {}, 'Requests') }}\n <span\n v-if=\"state.requests.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ state.requests.length }}</span\n >\n </TabsTrigger>\n <TabsTrigger value=\"timings\">{{ t('debug.timings', {}, 'Timings') }}</TabsTrigger>\n </TabsList>\n <ScrollArea class=\"min-h-0 flex-1\">\n <TabsContent value=\"schema\" class=\"p-4 text-sm\">\n <p v-if=\"debug.tree.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_tree', {}, 'The server sent no schema tree for this page.') }}\n </p>\n <ul v-else class=\"space-y-0.5 font-mono text-xs\">\n <DebugTreeNode\n v-for=\"(node, index) in debug.tree\"\n :key=\"`${node.key ?? node.type}-${index}`\"\n :node=\"node\"\n :depth=\"0\"\n />\n </ul>\n </TabsContent>\n <TabsContent value=\"form\" class=\"space-y-4 p-4 text-sm\">\n <p v-if=\"forms.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_forms', {}, 'No forms on this page.') }}\n </p>\n <DebugFormState v-for=\"(form, index) in forms\" :key=\"index\" :form=\"form\" />\n </TabsContent>\n <TabsContent value=\"requests\" class=\"space-y-2 p-4 text-sm\">\n <p v-if=\"state.requests.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_requests', {}, 'No internal requests yet.') }}\n </p>\n <template v-else>\n <div class=\"flex justify-end\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"debugRecorder.clearRequests()\"\n >\n {{ t('debug.clear', {}, 'Clear') }}\n </Button>\n </div>\n <Collapsible\n v-for=\"request in state.requests\"\n :key=\"request.id\"\n class=\"rounded-md border\"\n >\n <CollapsibleTrigger\n class=\"flex w-full items-center gap-2 px-3 py-2 text-start [&[data-state=open]>svg]:rotate-90\"\n >\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 transition-transform rtl:rotate-180\"\n />\n <span class=\"font-mono text-xs font-semibold\">{{ request.method }}</span>\n <span class=\"min-w-0 flex-1 truncate font-mono text-xs\" :title=\"request.url\">{{\n pathOf(request.url)\n }}</span>\n <Badge\n :variant=\"\n request.status === 0 || request.status >= 400 ? 'destructive' : 'secondary'\n \"\n class=\"font-mono\"\n >{{\n request.status === 0 ? t('debug.failed', {}, 'failed') : request.status\n }}</Badge\n >\n <span class=\"text-muted-foreground font-mono text-xs tabular-nums\"\n >{{ request.duration }} ms</span\n >\n </CollapsibleTrigger>\n <CollapsibleContent class=\"space-y-2 border-t px-3 py-2\">\n <dl\n class=\"text-muted-foreground grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-xs\"\n >\n <dt>{{ t('debug.duration', {}, 'Duration') }}</dt>\n <dd class=\"font-mono tabular-nums\">\n {{ request.duration }} ms\n <template v-if=\"request.serverDuration !== null\">\n ({{ t('debug.server_time', {}, 'Server time') }}:\n {{ request.serverDuration }} ms)\n </template>\n </dd>\n <dt>{{ t('debug.size', {}, 'Size') }}</dt>\n <dd class=\"font-mono tabular-nums\">\n ↑ {{ formatBytes(request.requestBytes) }} · ↓\n {{ formatBytes(request.responseBytes) }}\n </dd>\n </dl>\n <pre\n v-if=\"request.request !== undefined && request.request !== null\"\n dir=\"ltr\"\n class=\"bg-muted/50 max-h-72 overflow-auto rounded-md p-2 text-start font-mono text-xs leading-relaxed\"\n >{{ json(request.request) }}</pre>\n <pre\n dir=\"ltr\"\n class=\"bg-muted/50 max-h-72 overflow-auto rounded-md p-2 text-start font-mono text-xs leading-relaxed\"\n >{{ json(request.response) }}</pre>\n </CollapsibleContent>\n </Collapsible>\n </template>\n </TabsContent>\n <TabsContent value=\"timings\" class=\"space-y-4 p-4 text-sm\">\n <dl class=\"grid grid-cols-2 gap-3\">\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.server_time', {}, 'Server time') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ debug.server.duration }} ms\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.queries', {}, 'Queries') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ debug.server.queries }} · {{ debug.server.queryTime }} ms\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.memory', {}, 'Peak memory') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ formatBytes(debug.server.memory) }}\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.payload', {}, 'Page payload') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ formatBytes(payloadBytes) }}\n </dd>\n </div>\n </dl>\n <p class=\"text-muted-foreground font-mono text-xs\">\n PHP {{ debug.server.php }} · Laravel {{ debug.server.laravel }}\n </p>\n <section>\n <h3 class=\"mb-2 text-sm font-medium\">\n {{ t('debug.closures', {}, 'Closures evaluated') }}\n <span\n v-if=\"debug.closures.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ debug.closures.length }}</span\n >\n </h3>\n <p v-if=\"debug.closures.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_closures', {}, 'No closures were evaluated.') }}\n </p>\n <ul v-else class=\"divide-y rounded-md border font-mono text-xs\">\n <li\n v-for=\"(closure, index) in debug.closures\"\n :key=\"index\"\n class=\"flex items-center gap-2 px-3 py-1.5\"\n >\n <span class=\"font-semibold\">{{ closure.owner }}</span>\n <span\n class=\"text-muted-foreground min-w-0 flex-1 truncate\"\n :title=\"closure.file\"\n >{{ closure.file }}:{{ closure.line }}</span\n >\n <Badge v-if=\"closure.count > 1\" variant=\"secondary\">{{\n t('debug.times', { count: closure.count }, '×:count')\n }}</Badge>\n </li>\n </ul>\n </section>\n <section v-if=\"(debug.deprecations ?? []).length > 0\">\n <h3 class=\"mb-2 text-sm font-medium\">\n {{ t('debug.deprecations', {}, 'Deprecations') }}\n <span class=\"bg-muted ms-1 rounded px-1.5 py-0.5 font-mono text-xs\">{{\n debug.deprecations?.length\n }}</span>\n </h3>\n <ul class=\"divide-y rounded-md border text-xs\">\n <li\n v-for=\"item in debug.deprecations\"\n :key=\"item.subject\"\n class=\"flex flex-col gap-0.5 px-3 py-1.5\"\n >\n <span class=\"font-mono font-semibold\"\n >{{ item.subject\n }}<span v-if=\"item.since\" class=\"text-muted-foreground font-normal\">\n · {{ item.since }}</span\n ></span\n >\n <span class=\"text-muted-foreground\">{{ item.message }}</span>\n </li>\n </ul>\n </section>\n </TabsContent>\n </ScrollArea>\n </Tabs>\n </div>\n </SheetContent>\n </Sheet>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"DebugPanel.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Sheet","_withCtx","_createVNode","SheetTrigger","Button","_unref","SheetContent","_createElementVNode","SheetHeader","SheetTitle","_createTextVNode","_toDisplayString","SheetDescription","Tabs","TabsList","TabsTrigger","_createElementBlock","_createCommentVNode","ScrollArea","TabsContent","_Fragment","_renderList","DebugTreeNode","DebugFormState","Collapsible","CollapsibleTrigger","Badge","CollapsibleContent","Badge_default","Button_default","Sheet_default","SheetContent_default","SheetDescription_default","SheetHeader_default","SheetTitle_default","SheetTrigger_default","Tabs_default","TabsContent_default","TabsList_default","TabsTrigger_default","Collapsible_default","CollapsibleContent_default","CollapsibleTrigger_default","ScrollArea_default","DebugFormState_default","DebugTreeNode_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","DebugPanel_vue_vue_type_script_setup_true_lang_default","t","useT","props","useAlfakitProps","direction","useDirection","debug","computed","state","useStore","debugRecorder","payloadBytes","byteLength","json","value","pathOf","parsed","url","forms","openBlock","createBlock","withCtx","createVNode","unref","BugIcon","createElementVNode","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","Fragment","renderList","node","index","_cache","request","ChevronRightIcon","formatBytes","closure","item"],"sources":["../../../src/components/panel/DebugPanel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { FormStore } from '@alfakit/core'\nimport { byteLength, debugRecorder, formatBytes } from '@alfakit/core'\nimport { BugIcon, ChevronRightIcon } from '@lucide/vue'\nimport { computed } from 'vue'\nimport { useStore } from '../../composables/use-store'\nimport { useAlfakitProps, useDirection, useT } from '../../context'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport CollapsibleTrigger from '../ui/CollapsibleTrigger.vue'\nimport ScrollArea from '../ui/ScrollArea.vue'\nimport Sheet from '../ui/Sheet.vue'\nimport SheetContent from '../ui/SheetContent.vue'\nimport SheetDescription from '../ui/SheetDescription.vue'\nimport SheetHeader from '../ui/SheetHeader.vue'\nimport SheetTitle from '../ui/SheetTitle.vue'\nimport SheetTrigger from '../ui/SheetTrigger.vue'\nimport Tabs from '../ui/Tabs.vue'\nimport TabsContent from '../ui/TabsContent.vue'\nimport TabsList from '../ui/TabsList.vue'\nimport TabsTrigger from '../ui/TabsTrigger.vue'\nimport DebugFormState from './DebugFormState.vue'\nimport DebugTreeNode from './DebugTreeNode.vue'\n\n/**\n * The developer debug panel: a top bar toggle that opens a drawer with the page's resolved\n * schema tree (visibility and authorisation per component, closures evaluated), the live\n * form state, the internal requests captured by `requestJson()` and timings. Rendered only\n * when the page carries the `alfakitDebug` prop, which PHP adds while `Panel::debugPanel()`\n * is active and `app.debug` is on. Replace it with `components: { 'panel:debug-panel': … }`.\n */\nconst t = useT()\nconst props = useAlfakitProps()\nconst direction = useDirection()\nconst debug = computed(() => props.value.alfakitDebug)\nconst state = useStore(debugRecorder.store)\nconst payloadBytes = computed(() => byteLength(props.value))\n\nconst json = (value: unknown): string => {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n } catch {\n return String(value)\n }\n}\n\nconst pathOf = (url: string): string => {\n try {\n const parsed = new URL(url, 'http://localhost')\n\n return parsed.pathname + parsed.search\n } catch {\n return url\n }\n}\n\nconst forms = computed(() => state.value.forms as FormStore[])\n</script>\n\n<template>\n <Sheet v-if=\"debug\">\n <SheetTrigger as-child>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n :aria-label=\"t('debug.open', {}, 'Open debug panel')\"\n data-slot=\"debug-toggle\"\n >\n <BugIcon />\n </Button>\n </SheetTrigger>\n <SheetContent\n :side=\"direction === 'rtl' ? 'left' : 'right'\"\n class=\"flex w-full flex-col gap-0 p-0 sm:max-w-xl\"\n >\n <div data-slot=\"debug-panel\" class=\"flex min-h-0 flex-1 flex-col\">\n <SheetHeader class=\"border-b\">\n <SheetTitle class=\"flex items-center gap-2\">\n <BugIcon class=\"size-4\" />\n {{ t('debug.title', {}, 'Debug') }}\n </SheetTitle>\n <SheetDescription class=\"truncate font-mono text-xs\" :title=\"debug.page\">\n {{ debug.page }}\n </SheetDescription>\n </SheetHeader>\n <Tabs default-value=\"schema\" class=\"flex min-h-0 flex-1 flex-col gap-0\">\n <TabsList class=\"mx-4 mt-3 grid w-auto grid-cols-4\">\n <TabsTrigger value=\"schema\">{{ t('debug.schema', {}, 'Schema') }}</TabsTrigger>\n <TabsTrigger value=\"form\">\n {{ t('debug.form', {}, 'Form') }}\n <span\n v-if=\"forms.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ forms.length }}</span\n >\n </TabsTrigger>\n <TabsTrigger value=\"requests\">\n {{ t('debug.requests', {}, 'Requests') }}\n <span\n v-if=\"state.requests.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ state.requests.length }}</span\n >\n </TabsTrigger>\n <TabsTrigger value=\"timings\">{{ t('debug.timings', {}, 'Timings') }}</TabsTrigger>\n </TabsList>\n <ScrollArea class=\"min-h-0 flex-1\">\n <TabsContent value=\"schema\" class=\"p-4 text-sm\">\n <p v-if=\"debug.tree.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_tree', {}, 'The server sent no schema tree for this page.') }}\n </p>\n <ul v-else class=\"space-y-0.5 font-mono text-xs\">\n <DebugTreeNode\n v-for=\"(node, index) in debug.tree\"\n :key=\"`${node.key ?? node.type}-${index}`\"\n :node=\"node\"\n :depth=\"0\"\n />\n </ul>\n </TabsContent>\n <TabsContent value=\"form\" class=\"space-y-4 p-4 text-sm\">\n <p v-if=\"forms.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_forms', {}, 'No forms on this page.') }}\n </p>\n <DebugFormState v-for=\"(form, index) in forms\" :key=\"index\" :form=\"form\" />\n </TabsContent>\n <TabsContent value=\"requests\" class=\"space-y-2 p-4 text-sm\">\n <p v-if=\"state.requests.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_requests', {}, 'No internal requests yet.') }}\n </p>\n <template v-else>\n <div class=\"flex justify-end\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n @click=\"debugRecorder.clearRequests()\"\n >\n {{ t('debug.clear', {}, 'Clear') }}\n </Button>\n </div>\n <Collapsible\n v-for=\"request in state.requests\"\n :key=\"request.id\"\n class=\"rounded-md border\"\n >\n <CollapsibleTrigger\n class=\"flex w-full items-center gap-2 px-3 py-2 text-start [&[data-state=open]>svg]:rotate-90\"\n >\n <ChevronRightIcon\n class=\"text-muted-foreground size-3.5 shrink-0 transition-transform rtl:rotate-180\"\n />\n <span class=\"font-mono text-xs font-semibold\">{{ request.method }}</span>\n <span class=\"min-w-0 flex-1 truncate font-mono text-xs\" :title=\"request.url\">{{\n pathOf(request.url)\n }}</span>\n <Badge\n :variant=\"\n request.status === 0 || request.status >= 400 ? 'destructive' : 'secondary'\n \"\n class=\"font-mono\"\n >{{\n request.status === 0 ? t('debug.failed', {}, 'failed') : request.status\n }}</Badge\n >\n <span class=\"text-muted-foreground font-mono text-xs tabular-nums\"\n >{{ request.duration }} ms</span\n >\n </CollapsibleTrigger>\n <CollapsibleContent class=\"space-y-2 border-t px-3 py-2\">\n <dl\n class=\"text-muted-foreground grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-xs\"\n >\n <dt>{{ t('debug.duration', {}, 'Duration') }}</dt>\n <dd class=\"font-mono tabular-nums\">\n {{ request.duration }} ms\n <template v-if=\"request.serverDuration !== null\">\n ({{ t('debug.server_time', {}, 'Server time') }}:\n {{ request.serverDuration }} ms)\n </template>\n </dd>\n <dt>{{ t('debug.size', {}, 'Size') }}</dt>\n <dd class=\"font-mono tabular-nums\">\n ↑ {{ formatBytes(request.requestBytes) }} · ↓\n {{ formatBytes(request.responseBytes) }}\n </dd>\n </dl>\n <pre\n v-if=\"request.request !== undefined && request.request !== null\"\n dir=\"ltr\"\n class=\"bg-muted/50 max-h-72 overflow-auto rounded-md p-2 text-start font-mono text-xs leading-relaxed\"\n >{{ json(request.request) }}</pre>\n <pre\n dir=\"ltr\"\n class=\"bg-muted/50 max-h-72 overflow-auto rounded-md p-2 text-start font-mono text-xs leading-relaxed\"\n >{{ json(request.response) }}</pre>\n </CollapsibleContent>\n </Collapsible>\n </template>\n </TabsContent>\n <TabsContent value=\"timings\" class=\"space-y-4 p-4 text-sm\">\n <dl class=\"grid grid-cols-2 gap-3\">\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.server_time', {}, 'Server time') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ debug.server.duration }} ms\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.queries', {}, 'Queries') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ debug.server.queries }} · {{ debug.server.queryTime }} ms\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.memory', {}, 'Peak memory') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ formatBytes(debug.server.memory) }}\n </dd>\n </div>\n <div class=\"rounded-md border p-3\">\n <dt class=\"text-muted-foreground text-xs\">\n {{ t('debug.payload', {}, 'Page payload') }}\n </dt>\n <dd class=\"font-mono text-sm font-semibold tabular-nums\">\n {{ formatBytes(payloadBytes) }}\n </dd>\n </div>\n </dl>\n <p class=\"text-muted-foreground font-mono text-xs\">\n PHP {{ debug.server.php }} · Laravel {{ debug.server.laravel }}\n </p>\n <section>\n <h3 class=\"mb-2 text-sm font-medium\">\n {{ t('debug.closures', {}, 'Closures evaluated') }}\n <span\n v-if=\"debug.closures.length > 0\"\n class=\"bg-muted text-muted-foreground ms-1.5 rounded-full px-1.5 font-mono text-[10px] tabular-nums\"\n >{{ debug.closures.length }}</span\n >\n </h3>\n <p v-if=\"debug.closures.length === 0\" class=\"text-muted-foreground text-sm\">\n {{ t('debug.no_closures', {}, 'No closures were evaluated.') }}\n </p>\n <ul v-else class=\"divide-y rounded-md border font-mono text-xs\">\n <li\n v-for=\"(closure, index) in debug.closures\"\n :key=\"index\"\n class=\"flex items-center gap-2 px-3 py-1.5\"\n >\n <span class=\"font-semibold\">{{ closure.owner }}</span>\n <span\n class=\"text-muted-foreground min-w-0 flex-1 truncate\"\n :title=\"closure.file\"\n >{{ closure.file }}:{{ closure.line }}</span\n >\n <Badge v-if=\"closure.count > 1\" variant=\"secondary\">{{\n t('debug.times', { count: closure.count }, '×:count')\n }}</Badge>\n </li>\n </ul>\n </section>\n <section v-if=\"(debug.deprecations ?? []).length > 0\">\n <h3 class=\"mb-2 text-sm font-medium\">\n {{ t('debug.deprecations', {}, 'Deprecations') }}\n <span class=\"bg-muted ms-1 rounded px-1.5 py-0.5 font-mono text-xs\">{{\n debug.deprecations?.length\n }}</span>\n </h3>\n <ul class=\"divide-y rounded-md border text-xs\">\n <li\n v-for=\"item in debug.deprecations\"\n :key=\"item.subject\"\n class=\"flex flex-col gap-0.5 px-3 py-1.5\"\n >\n <span class=\"font-mono font-semibold\"\n >{{ item.subject\n }}<span v-if=\"item.since\" class=\"text-muted-foreground font-normal\">\n · {{ item.since }}</span\n ></span\n >\n <span class=\"text-muted-foreground\">{{ item.message }}</span>\n </li>\n </ul>\n </section>\n </TabsContent>\n </ScrollArea>\n </Tabs>\n </div>\n </SheetContent>\n </Sheet>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.js","names":["_sfc_main","GlobalSearch_vue_vue_type_script_setup_true_lang_default","GlobalSearch_default"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\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)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"GlobalSearch.js","names":["_sfc_main","GlobalSearch_vue_vue_type_script_setup_true_lang_default","GlobalSearch_default"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\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)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearch.vue"],"names":[],"mappings":"AAyKA;;;;;;GAMG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;;aAAvB,QAAQ,GAAG,SAAS;;AA6PnD,wBAOG"}
1
+ {"version":3,"file":"GlobalSearch.vue.d.ts","sourceRoot":"","sources":["../../../src/components/panel/GlobalSearch.vue"],"names":[],"mappings":"AA0KA;;;;;;GAMG;AACH,KAAK,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,CAAC;;aAAvB,QAAQ,GAAG,SAAS;;AA8PnD,wBAOG"}
@@ -15,6 +15,7 @@ var M = {
15
15
  class: "text-muted-foreground hidden text-[10px] sm:inline"
16
16
  }, N = {
17
17
  key: 1,
18
+ dir: "ltr",
18
19
  class: "bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline"
19
20
  }, P = /*@__PURE__*/ y({
20
21
  __name: "GlobalSearch",
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalSearch.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","Slot","Button","_normalizeClass","_withCtx","_unref","Icon","_createElementVNode","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","_hoisted_1","_hoisted_2","GlobalSearch_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","hydrated","useHydrated","open","ref","Palette","shallowRef","globalSearchPalette","config","computed","palette","endpoint","placeholder","suffix","globalSearchSuffix","keys","watch","value","onCleanup","shortcuts","SHORTCUT_IDS","active","component","preload","stopListening","onMounted","router","onBeforeUnmount","openBlock","createElementBlock","Fragment","createVNode","normalizeClass","_cache","withCtx","unref","SearchIcon","createElementVNode","toDisplayString","createCommentVNode","formatKeyBinding","createBlock","resolveDynamicComponent","$event"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\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)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GlobalSearch.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_Fragment","_createVNode","Slot","Button","_normalizeClass","_withCtx","_unref","Icon","_createElementVNode","_toDisplayString","_createCommentVNode","_createBlock","_resolveDynamicComponent","Icon_default","Button_default","Slot_default","_hoisted_1","_hoisted_2","GlobalSearch_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","panel","usePanel","hydrated","useHydrated","open","ref","Palette","shallowRef","globalSearchPalette","config","computed","palette","endpoint","placeholder","suffix","globalSearchSuffix","keys","watch","value","onCleanup","shortcuts","SHORTCUT_IDS","active","component","preload","stopListening","onMounted","router","onBeforeUnmount","openBlock","createElementBlock","Fragment","createVNode","normalizeClass","_cache","withCtx","unref","SearchIcon","createElementVNode","toDisplayString","createCommentVNode","formatKeyBinding","createBlock","resolveDynamicComponent","$event"],"sources":["../../../src/components/panel/GlobalSearch.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { formatKeyBinding, globalSearchSuffix, SHORTCUT_IDS, shortcuts } from '@alfakit/core'\nimport { router } from '@inertiajs/vue3'\nimport { SearchIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, onMounted, ref, shallowRef, watch, type Component } from 'vue'\nimport { useHydrated } from '../../composables/use-hydrated'\nimport { usePanel, useT } from '../../context'\nimport Button from '../ui/Button.vue'\nimport Slot from './Slot.vue'\nimport { Icon } from '../../lib/icons'\nimport { globalSearchPalette } from './lazy-chrome'\n\n/**\n * The search field and its command palette (`GlobalSearchPalette`, loaded on first open):\n * global search results plus (with `alfakit.commandPalette`) the page's header actions,\n * panel commands, navigation, \"create\" links, recent records, theme switching and the\n * shortcuts overlay. `variant=\"sidebar\"`: the full-width field in the sidebar header\n * (`globalSearch(position: Sidebar)`).\n */\nconst props = withDefaults(defineProps<{ variant?: 'topbar' | 'sidebar' }>(), { variant: 'topbar' })\n\nconst t = useT()\nconst panel = usePanel()\n// The shortcut hint depends on the visitor's platform (⌘ or Ctrl): rendered after hydration.\nconst hydrated = useHydrated()\nconst open = ref(false)\n// Null on the server and during hydration (nothing loads there), so the markup matches.\nconst Palette = shallowRef<Component | null>(globalSearchPalette.current)\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)\n// `globalSearchFieldSuffix()`, or the first key binding (default); ⌘K / Ctrl+K without global search.\nconst suffix = computed(() =>\n globalSearchSuffix(\n config.value ??\n (palette.value ? { keyBindings: ['mod+k'], placeholder: placeholder.value } : undefined),\n ),\n)\nconst keys = computed(() =>\n config.value || palette.value ? JSON.stringify(config.value?.keyBindings ?? ['mod+k']) : '',\n)\n\n// The palette's key bindings: essential, so they keep working with `keyboardShortcuts(false)`.\nwatch(\n keys,\n (value, _old, onCleanup) => {\n // Never during a server render: the registry is shared by every request there.\n if (!value || typeof window === 'undefined') return\n\n onCleanup(\n shortcuts.register({\n id: SHORTCUT_IDS.palette,\n keys: JSON.parse(value) as string[],\n label: t('shortcuts.open_palette', {}, 'Open the command palette'),\n group: 'general',\n essential: true,\n handler: () => {\n open.value = true\n },\n }),\n )\n },\n { immediate: true },\n)\n\n// Opening before the code has arrived (a click or `mod+k` right after the page loads)\n// keeps `open` set; the palette mounts open once it has loaded.\nwatch(open, (value, _old, onCleanup) => {\n if (!value) return\n\n // Already loaded (by another instance): mount it straight away.\n if (globalSearchPalette.current) {\n Palette.value = globalSearchPalette.current\n\n return\n }\n\n let active = true\n onCleanup(() => {\n active = false\n })\n\n globalSearchPalette.load().then(\n (component) => {\n if (active) Palette.value = component\n },\n () => {\n if (active) open.value = false\n },\n )\n})\n\nconst preload = () => void globalSearchPalette.load().catch(() => undefined)\n\n// A palette opened while its code was still loading closes when the page changes.\nlet stopListening: (() => void) | undefined\n\nonMounted(() => {\n stopListening = router.on('navigate', () => {\n open.value = false\n })\n})\n\nonBeforeUnmount(() => stopListening?.())\n</script>\n\n<template>\n <template v-if=\"(config && endpoint) || palette\">\n <Slot name=\"global-search.before\" />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :data-variant=\"props.variant\"\n :class=\"\n props.variant === 'sidebar'\n ? 'text-muted-foreground w-full justify-start gap-2 px-2.5 font-normal group-data-[collapsible=icon]:size-8 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0'\n : 'text-muted-foreground size-8 justify-center gap-2 px-0 font-normal sm:w-56 sm:justify-start sm:px-2.5'\n \"\n @click=\"open = true\"\n @pointerenter=\"preload\"\n @focus=\"preload\"\n >\n <Icon name=\"alfakit::panels.global-search.field\" :fallback=\"SearchIcon\" class=\"size-4\" />\n <span\n :class=\"\n props.variant === 'sidebar'\n ? 'flex-1 truncate text-start group-data-[collapsible=icon]:sr-only'\n : 'sr-only sm:not-sr-only sm:flex-1 sm:text-start'\n \"\n >{{ placeholder }}</span\n >\n <span\n v-if=\"suffix?.type === 'text'\"\n data-slot=\"global-search-suffix\"\n class=\"text-muted-foreground hidden text-[10px] sm:inline\"\n >{{ suffix.text }}</span\n >\n <kbd\n v-if=\"hydrated && suffix?.type === 'keyBinding'\"\n dir=\"ltr\"\n class=\"bg-muted hidden rounded px-1 font-mono text-[10px] sm:inline\"\n >{{ formatKeyBinding(suffix.keyBinding) }}</kbd\n >\n </Button>\n <Slot name=\"global-search.after\" />\n <!-- The dialog's code loads on first open (click or shortcut); hovering or focusing the\n field fetches it ahead. Not rendered on the server, like the closed dialog before it. -->\n <component :is=\"Palette\" v-if=\"Palette\" v-model:open=\"open\" />\n </template>\n</template>\n"],"mappings":"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"}