@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @alfakit/vue
2
2
 
3
+ ## 0.1.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Released with AlfaKit 0.1.6 (the npm and PHP versions now match). Fixes from the full verification in React, Vue and Svelte: starter-kit copilot, dashboard widgets and discovered components, per-item form errors, stable template schemas in new blocks, CSP nonces, WCAG AA badge contrast, plural kanban counts and more (see the AlfaKit changelog for 0.1.6).
8
+ - Updated dependencies
9
+ - @alfakit/core@0.1.6
10
+
11
+ ## 0.1.2
12
+
13
+ ### Patch Changes
14
+
15
+ - Fixes from end-to-end QA in React, Vue and Svelte: modal field ids, errors in hidden tabs, per-row action spinners, one-time-code paste, RTL fixes (colours, key bindings, calendar), localised file sizes and named upload buttons, select placeholders, single toasts in starter kits, readable tab query values, enum group titles, tenant menu labels, Svelte hydration gate, plugin styles in starter-kit mode, and more (see the AlfaKit changelog for 0.1.2).
16
+ - Updated dependencies
17
+ - @alfakit/core@0.1.2
18
+
3
19
  ## 0.1.1
4
20
 
5
21
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitRoot.js","names":["_sfc_main","AlfakitRoot_vue_vue_type_script_setup_true_lang_default","AlfakitRoot_default"],"sources":["../src/AlfakitRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n applyDocumentLocale,\n applyPanelTheme,\n PANEL_TOAST_OFFSET,\n resolveToastPosition,\n type AlfakitPageProps,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, watch } from 'vue'\nimport ActionModals from './components/actions/ActionModals.vue'\nimport DevToolsSlot from './components/dev-tools/DevToolsSlot.vue'\nimport FlashToasts from './components/notifications/FlashToasts.vue'\nimport RealtimeNotifications from './components/notifications/RealtimeNotifications.vue'\nimport ImpersonationBanner from './components/panel/ImpersonationBanner.vue'\nimport PwaManager from './components/panel/PwaManager.vue'\nimport SchemaContractGuard from './components/panel/SchemaContractGuard.vue'\nimport Toaster from './components/ui/Toaster.vue'\nimport TooltipProvider from './components/ui/TooltipProvider.vue'\nimport { useAlfakit } from './context'\n\n/**\n * Persistent layout rendered inside Inertia's page tree, so modals and toasts can read page\n * props through `usePage()`. It follows the current page: the reading direction for reka-ui\n * primitives, modals and toasts.\n */\n/** Starter kit mode: Alfakit's toaster gets an id so the host's id-less one never doubles its toasts. */\ndefineProps<{ toasterId?: string }>()\n\nconst page = usePage<AlfakitPageProps>()\nconst { translator, registry } = useAlfakit()\n\n// Replace with createAlfakit({ components: { 'panel:impersonation-banner': … } }).\nconst impersonationBanner = registry.resolve('panel:impersonation-banner') ?? ImpersonationBanner\n\nconst panel = computed(() => page.props.alfakit as AlfakitPageProps['alfakit'] | undefined)\nconst localization = computed(() => panel.value?.localization)\nconst direction = computed(() => localization.value?.direction ?? 'ltr')\n\n// Every visit (including the redirect after a language switch, which is a POST + redirect\n// and so not a plain navigation) may carry new strings: update the translator synchronously,\n// before children re-render.\nwatch(\n () => [panel.value?.translations, localization.value?.tag] as const,\n ([translations, tag]) => {\n if (!panel.value) return\n\n translator.setTranslations(translations ?? {})\n translator.setLocale(tag ?? 'en')\n },\n { immediate: true, flush: 'sync' },\n)\n\nwatch(localization, (value) => applyDocumentLocale(value), { immediate: true })\nwatch(panel, (value) => applyPanelTheme(value), { immediate: true })\n</script>\n\n<template>\n <ConfigProvider :dir=\"direction\">\n <TooltipProvider :delay-duration=\"0\">\n <SchemaContractGuard :panel=\"panel\">\n <slot />\n </SchemaContractGuard>\n <ActionModals />\n <FlashToasts />\n <RealtimeNotifications />\n <!-- `Panel::pwa()`: service worker and the \"new version\" toast. -->\n <PwaManager />\n <!-- Schema inspector: renders (and loads its code) only with `alfakitDevTools`. -->\n <DevToolsSlot />\n <component\n :is=\"impersonationBanner\"\n v-if=\"panel?.impersonation\"\n :impersonation=\"panel.impersonation\"\n />\n <Toaster\n :id=\"toasterId\"\n :position=\"resolveToastPosition(panel?.toastPosition, direction)\"\n :offset=\"PANEL_TOAST_OFFSET\"\n :mobile-offset=\"PANEL_TOAST_OFFSET\"\n :dir=\"direction\"\n rich-colors\n close-button\n />\n </TooltipProvider>\n </ConfigProvider>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"AlfakitRoot.js","names":["_sfc_main","AlfakitRoot_vue_vue_type_script_setup_true_lang_default","AlfakitRoot_default"],"sources":["../src/AlfakitRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n applyDocumentLocale,\n applyPanelTheme,\n PANEL_TOAST_OFFSET,\n resolveToastPosition,\n type AlfakitPageProps,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, watch } from 'vue'\nimport ActionModals from './components/actions/ActionModals.vue'\nimport DevToolsSlot from './components/dev-tools/DevToolsSlot.vue'\nimport FlashToasts from './components/notifications/FlashToasts.vue'\nimport RealtimeNotifications from './components/notifications/RealtimeNotifications.vue'\nimport ImpersonationBanner from './components/panel/ImpersonationBanner.vue'\nimport PwaManager from './components/panel/PwaManager.vue'\nimport SchemaContractGuard from './components/panel/SchemaContractGuard.vue'\nimport Toaster from './components/ui/Toaster.vue'\nimport TooltipProvider from './components/ui/TooltipProvider.vue'\nimport { useAlfakit } from './context'\n\n/**\n * Persistent layout rendered inside Inertia's page tree, so modals and toasts can read page\n * props through `usePage()`. It follows the current page: the reading direction for reka-ui\n * primitives, modals and toasts.\n */\n/** Starter kit mode: Alfakit's toaster gets an id so the host's id-less one never doubles its toasts. */\ndefineProps<{ toasterId?: string }>()\n\nconst page = usePage<AlfakitPageProps>()\nconst { translator, registry } = useAlfakit()\n\n// Replace with createAlfakit({ components: { 'panel:impersonation-banner': … } }).\nconst impersonationBanner = registry.resolve('panel:impersonation-banner') ?? ImpersonationBanner\n\nconst panel = computed(() => page.props.alfakit as AlfakitPageProps['alfakit'] | undefined)\nconst localization = computed(() => panel.value?.localization)\nconst direction = computed(() => localization.value?.direction ?? 'ltr')\n\n// Every visit (including the redirect after a language switch, which is a POST + redirect\n// and so not a plain navigation) may carry new strings: update the translator synchronously,\n// before children re-render.\nwatch(\n () => [panel.value?.translations, localization.value?.tag] as const,\n ([translations, tag]) => {\n if (!panel.value) return\n\n translator.setTranslations(translations ?? {})\n translator.setLocale(tag ?? 'en')\n },\n { immediate: true, flush: 'sync' },\n)\n\n// Starter kit mode: the host app owns `<html lang dir>` (its own pages and layout are not\n// mirrored); `AlfakitStarterKitRoot` puts the direction on Alfakit's own root element.\nwatch(\n localization,\n (value) => {\n if (panel.value?.starterKit !== true) applyDocumentLocale(value)\n },\n { immediate: true },\n)\nwatch(panel, (value) => applyPanelTheme(value), { immediate: true })\n</script>\n\n<template>\n <ConfigProvider :dir=\"direction\">\n <TooltipProvider :delay-duration=\"0\">\n <SchemaContractGuard :panel=\"panel\">\n <slot />\n </SchemaContractGuard>\n <ActionModals />\n <FlashToasts />\n <RealtimeNotifications />\n <!-- `Panel::pwa()`: service worker and the \"new version\" toast. -->\n <PwaManager />\n <!-- Schema inspector: renders (and loads its code) only with `alfakitDevTools`. -->\n <DevToolsSlot />\n <component\n :is=\"impersonationBanner\"\n v-if=\"panel?.impersonation\"\n :impersonation=\"panel.impersonation\"\n />\n <Toaster\n :id=\"toasterId\"\n :position=\"resolveToastPosition(panel?.toastPosition, direction)\"\n :offset=\"PANEL_TOAST_OFFSET\"\n :mobile-offset=\"PANEL_TOAST_OFFSET\"\n :dir=\"direction\"\n rich-colors\n close-button\n />\n </TooltipProvider>\n </ConfigProvider>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitRoot.vue.d.ts","sourceRoot":"","sources":["../src/AlfakitRoot.vue"],"names":[],"mappings":"AA+GA;;;;GAIG;AACH,yGAAyG;AACzG,KAAK,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAqI1C,QAAA,IAAI,QAAQ,IAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAiChD,QAAA,MAAM,eAAe,kSAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"AlfakitRoot.vue.d.ts","sourceRoot":"","sources":["../src/AlfakitRoot.vue"],"names":[],"mappings":"AAuHA;;;;GAIG;AACH,yGAAyG;AACzG,KAAK,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA6I1C,QAAA,IAAI,QAAQ,IAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AAiChD,QAAA,MAAM,eAAe,kSAMnB,CAAC;wBACkB,eAAe,CAAC,OAAO,eAAe,EAAE,WAAW,CAAC;AAAzE,wBAA0E;AAQ1E,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
@@ -23,7 +23,9 @@ var D = /*@__PURE__*/ y({
23
23
  }, {
24
24
  immediate: !0,
25
25
  flush: "sync"
26
- }), w(M, (e) => d(e), { immediate: !0 }), w(j, (e) => f(e), { immediate: !0 }), (e, a) => (b(), g(C(E), { dir: N.value }, {
26
+ }), w(M, (e) => {
27
+ j.value?.starterKit !== !0 && d(e);
28
+ }, { immediate: !0 }), w(j, (e) => f(e), { immediate: !0 }), (e, a) => (b(), g(C(E), { dir: N.value }, {
27
29
  default: T(() => [v(n, { "delay-duration": 0 }, {
28
30
  default: T(() => [
29
31
  v(l, { panel: j.value }, {
@@ -1 +1 @@
1
- {"version":3,"file":"AlfakitRoot.vue_vue_type_script_setup_true_lang.js","names":["ImpersonationBanner","_openBlock","_createBlock","_unref","_withCtx","_createVNode","TooltipProvider","SchemaContractGuard","_renderSlot","ActionModals","FlashToasts","RealtimeNotifications","PwaManager","DevToolsSlot","_resolveDynamicComponent","_createCommentVNode","Toaster","ActionModals_default","TooltipProvider_default","FlashToasts_default","RealtimeNotifications_default","ImpersonationBanner_default","PwaManager_default","Toaster_default","DevToolsSlot_default","SchemaContractGuard_default","AlfakitRoot_vue_vue_type_script_setup_true_lang_default","page","usePage","useAlfakit","impersonationBanner","registry","panel","computed","localization","direction","watch","translations","tag","translator","applyDocumentLocale","value","applyPanelTheme","openBlock","createBlock","unref","ConfigProvider","withCtx","createVNode","renderSlot","_ctx","resolveDynamicComponent","createCommentVNode","__props","resolveToastPosition","PANEL_TOAST_OFFSET"],"sources":["../src/AlfakitRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n applyDocumentLocale,\n applyPanelTheme,\n PANEL_TOAST_OFFSET,\n resolveToastPosition,\n type AlfakitPageProps,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, watch } from 'vue'\nimport ActionModals from './components/actions/ActionModals.vue'\nimport DevToolsSlot from './components/dev-tools/DevToolsSlot.vue'\nimport FlashToasts from './components/notifications/FlashToasts.vue'\nimport RealtimeNotifications from './components/notifications/RealtimeNotifications.vue'\nimport ImpersonationBanner from './components/panel/ImpersonationBanner.vue'\nimport PwaManager from './components/panel/PwaManager.vue'\nimport SchemaContractGuard from './components/panel/SchemaContractGuard.vue'\nimport Toaster from './components/ui/Toaster.vue'\nimport TooltipProvider from './components/ui/TooltipProvider.vue'\nimport { useAlfakit } from './context'\n\n/**\n * Persistent layout rendered inside Inertia's page tree, so modals and toasts can read page\n * props through `usePage()`. It follows the current page: the reading direction for reka-ui\n * primitives, modals and toasts.\n */\n/** Starter kit mode: Alfakit's toaster gets an id so the host's id-less one never doubles its toasts. */\ndefineProps<{ toasterId?: string }>()\n\nconst page = usePage<AlfakitPageProps>()\nconst { translator, registry } = useAlfakit()\n\n// Replace with createAlfakit({ components: { 'panel:impersonation-banner': … } }).\nconst impersonationBanner = registry.resolve('panel:impersonation-banner') ?? ImpersonationBanner\n\nconst panel = computed(() => page.props.alfakit as AlfakitPageProps['alfakit'] | undefined)\nconst localization = computed(() => panel.value?.localization)\nconst direction = computed(() => localization.value?.direction ?? 'ltr')\n\n// Every visit (including the redirect after a language switch, which is a POST + redirect\n// and so not a plain navigation) may carry new strings: update the translator synchronously,\n// before children re-render.\nwatch(\n () => [panel.value?.translations, localization.value?.tag] as const,\n ([translations, tag]) => {\n if (!panel.value) return\n\n translator.setTranslations(translations ?? {})\n translator.setLocale(tag ?? 'en')\n },\n { immediate: true, flush: 'sync' },\n)\n\nwatch(localization, (value) => applyDocumentLocale(value), { immediate: true })\nwatch(panel, (value) => applyPanelTheme(value), { immediate: true })\n</script>\n\n<template>\n <ConfigProvider :dir=\"direction\">\n <TooltipProvider :delay-duration=\"0\">\n <SchemaContractGuard :panel=\"panel\">\n <slot />\n </SchemaContractGuard>\n <ActionModals />\n <FlashToasts />\n <RealtimeNotifications />\n <!-- `Panel::pwa()`: service worker and the \"new version\" toast. -->\n <PwaManager />\n <!-- Schema inspector: renders (and loads its code) only with `alfakitDevTools`. -->\n <DevToolsSlot />\n <component\n :is=\"impersonationBanner\"\n v-if=\"panel?.impersonation\"\n :impersonation=\"panel.impersonation\"\n />\n <Toaster\n :id=\"toasterId\"\n :position=\"resolveToastPosition(panel?.toastPosition, direction)\"\n :offset=\"PANEL_TOAST_OFFSET\"\n :mobile-offset=\"PANEL_TOAST_OFFSET\"\n :dir=\"direction\"\n rich-colors\n close-button\n />\n </TooltipProvider>\n </ConfigProvider>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA8BA,IAAM2B,IAAOC,EAA0B,GACjC,EAAE,eAAY,gBAAaC,EAAW,GAGtCC,IAAsBC,EAAS,QAAQ,4BAA4B,KAAK/B,GAExEgC,IAAQC,QAAeN,EAAK,MAAM,OAAkD,GACpFO,IAAeD,QAAeD,EAAM,OAAO,YAAY,GACvDG,IAAYF,QAAeC,EAAa,OAAO,aAAa,KAAK;SAKvEE,QACQ,CAACJ,EAAM,OAAO,cAAcE,EAAa,OAAO,GAAG,IACxD,CAACG,GAAcC,OAAS;GACvB,AAAKN,EAAM,UAEXO,EAAW,gBAAgBF,KAAgB,CAAC,CAAC,GAC7CE,EAAW,UAAUD,KAAO,IAAI;EAClC,GACA;GAAE,WAAW;GAAM,OAAO;EAAO,CACnC,GAEAF,EAAMF,IAAe,MAAUM,EAAoBC,CAAK,GAAG,EAAE,WAAW,GAAK,CAAC,GAC9EL,EAAMJ,IAAQ,MAAUU,EAAgBD,CAAK,GAAG,EAAE,WAAW,GAAK,CAAC,cAIjExC,EAAA,GAAAC,EA2BiBC,EAAA2C,CAAA,GAAA,EA3BA,KAAKX,EAAA,MAAS,GAAA;GAC7B,SAAA/B,QAyBkB,CAzBlBC,EAyBkBC,GAAA,EAzBA,kBAAgB,EAAC,GAAA;IACjC,SAAAF,QAEsB;KAFtBC,EAEsBE,GAAA,EAFA,OAAOyB,EAAA,MAAK,GAAA;MAChC,SAAA5B,QAAQ,CAARI,EAAQ0C,EAAA,QAAA,SAAA,CAAA,CAAA;;;KAEV7C,EAAgBI,CAAA;KAChBJ,EAAeK,CAAA;KACfL,EAAyBM,CAAA;KAEzBN,EAAcO,CAAA;KAEdP,EAAgBQ,CAAA;KAGRmB,EAAA,OAAO,iBAFf/B,EAAA,GAAAC,EAIEY,EAHKX,EAAA2B,CAAA,CAAmB,GAAA;;MAEvB,eAAeE,EAAA,MAAM;;KAExB3B,EAQEW,GAAA;MAPC,IAAIqC,EAAA;MACJ,UAAUlD,EAAAmD,CAAA,CAAoB,CAACtB,EAAA,OAAO,eAAeG,EAAA,KAAS;MAC9D,QAAQhC,EAAAoD,CAAA;MACR,iBAAepD,EAAAoD,CAAA;MACf,KAAKpB,EAAA;MACN,eAAA;MACA,gBAAA"}
1
+ {"version":3,"file":"AlfakitRoot.vue_vue_type_script_setup_true_lang.js","names":["ImpersonationBanner","_openBlock","_createBlock","_unref","_withCtx","_createVNode","TooltipProvider","SchemaContractGuard","_renderSlot","ActionModals","FlashToasts","RealtimeNotifications","PwaManager","DevToolsSlot","_resolveDynamicComponent","_createCommentVNode","Toaster","ActionModals_default","TooltipProvider_default","FlashToasts_default","RealtimeNotifications_default","ImpersonationBanner_default","PwaManager_default","Toaster_default","DevToolsSlot_default","SchemaContractGuard_default","AlfakitRoot_vue_vue_type_script_setup_true_lang_default","page","usePage","useAlfakit","impersonationBanner","registry","panel","computed","localization","direction","watch","translations","tag","translator","applyDocumentLocale","value","applyPanelTheme","openBlock","createBlock","unref","ConfigProvider","withCtx","createVNode","renderSlot","_ctx","resolveDynamicComponent","createCommentVNode","__props","resolveToastPosition","PANEL_TOAST_OFFSET"],"sources":["../src/AlfakitRoot.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n applyDocumentLocale,\n applyPanelTheme,\n PANEL_TOAST_OFFSET,\n resolveToastPosition,\n type AlfakitPageProps,\n} from '@alfakit/core'\nimport { usePage } from '@inertiajs/vue3'\nimport { ConfigProvider } from 'reka-ui'\nimport { computed, watch } from 'vue'\nimport ActionModals from './components/actions/ActionModals.vue'\nimport DevToolsSlot from './components/dev-tools/DevToolsSlot.vue'\nimport FlashToasts from './components/notifications/FlashToasts.vue'\nimport RealtimeNotifications from './components/notifications/RealtimeNotifications.vue'\nimport ImpersonationBanner from './components/panel/ImpersonationBanner.vue'\nimport PwaManager from './components/panel/PwaManager.vue'\nimport SchemaContractGuard from './components/panel/SchemaContractGuard.vue'\nimport Toaster from './components/ui/Toaster.vue'\nimport TooltipProvider from './components/ui/TooltipProvider.vue'\nimport { useAlfakit } from './context'\n\n/**\n * Persistent layout rendered inside Inertia's page tree, so modals and toasts can read page\n * props through `usePage()`. It follows the current page: the reading direction for reka-ui\n * primitives, modals and toasts.\n */\n/** Starter kit mode: Alfakit's toaster gets an id so the host's id-less one never doubles its toasts. */\ndefineProps<{ toasterId?: string }>()\n\nconst page = usePage<AlfakitPageProps>()\nconst { translator, registry } = useAlfakit()\n\n// Replace with createAlfakit({ components: { 'panel:impersonation-banner': … } }).\nconst impersonationBanner = registry.resolve('panel:impersonation-banner') ?? ImpersonationBanner\n\nconst panel = computed(() => page.props.alfakit as AlfakitPageProps['alfakit'] | undefined)\nconst localization = computed(() => panel.value?.localization)\nconst direction = computed(() => localization.value?.direction ?? 'ltr')\n\n// Every visit (including the redirect after a language switch, which is a POST + redirect\n// and so not a plain navigation) may carry new strings: update the translator synchronously,\n// before children re-render.\nwatch(\n () => [panel.value?.translations, localization.value?.tag] as const,\n ([translations, tag]) => {\n if (!panel.value) return\n\n translator.setTranslations(translations ?? {})\n translator.setLocale(tag ?? 'en')\n },\n { immediate: true, flush: 'sync' },\n)\n\n// Starter kit mode: the host app owns `<html lang dir>` (its own pages and layout are not\n// mirrored); `AlfakitStarterKitRoot` puts the direction on Alfakit's own root element.\nwatch(\n localization,\n (value) => {\n if (panel.value?.starterKit !== true) applyDocumentLocale(value)\n },\n { immediate: true },\n)\nwatch(panel, (value) => applyPanelTheme(value), { immediate: true })\n</script>\n\n<template>\n <ConfigProvider :dir=\"direction\">\n <TooltipProvider :delay-duration=\"0\">\n <SchemaContractGuard :panel=\"panel\">\n <slot />\n </SchemaContractGuard>\n <ActionModals />\n <FlashToasts />\n <RealtimeNotifications />\n <!-- `Panel::pwa()`: service worker and the \"new version\" toast. -->\n <PwaManager />\n <!-- Schema inspector: renders (and loads its code) only with `alfakitDevTools`. -->\n <DevToolsSlot />\n <component\n :is=\"impersonationBanner\"\n v-if=\"panel?.impersonation\"\n :impersonation=\"panel.impersonation\"\n />\n <Toaster\n :id=\"toasterId\"\n :position=\"resolveToastPosition(panel?.toastPosition, direction)\"\n :offset=\"PANEL_TOAST_OFFSET\"\n :mobile-offset=\"PANEL_TOAST_OFFSET\"\n :dir=\"direction\"\n rich-colors\n close-button\n />\n </TooltipProvider>\n </ConfigProvider>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA8BA,IAAM2B,IAAOC,EAA0B,GACjC,EAAE,eAAY,gBAAaC,EAAW,GAGtCC,IAAsBC,EAAS,QAAQ,4BAA4B,KAAK/B,GAExEgC,IAAQC,QAAeN,EAAK,MAAM,OAAkD,GACpFO,IAAeD,QAAeD,EAAM,OAAO,YAAY,GACvDG,IAAYF,QAAeC,EAAa,OAAO,aAAa,KAAK;SAKvEE,QACQ,CAACJ,EAAM,OAAO,cAAcE,EAAa,OAAO,GAAG,IACxD,CAACG,GAAcC,OAAS;GACvB,AAAKN,EAAM,UAEXO,EAAW,gBAAgBF,KAAgB,CAAC,CAAC,GAC7CE,EAAW,UAAUD,KAAO,IAAI;EAClC,GACA;GAAE,WAAW;GAAM,OAAO;EAAO,CACnC,GAIAF,EACEF,IACC,MAAU;GACT,AAAIF,EAAM,OAAO,eAAe,MAAMQ,EAAoBC,CAAK;EACjE,GACA,EAAE,WAAW,GAAK,CACpB,GACAL,EAAMJ,IAAQ,MAAUU,EAAgBD,CAAK,GAAG,EAAE,WAAW,GAAK,CAAC,cAIjExC,EAAA,GAAAC,EA2BiBC,EAAA2C,CAAA,GAAA,EA3BA,KAAKX,EAAA,MAAS,GAAA;GAC7B,SAAA/B,QAyBkB,CAzBlBC,EAyBkBC,GAAA,EAzBA,kBAAgB,EAAC,GAAA;IACjC,SAAAF,QAEsB;KAFtBC,EAEsBE,GAAA,EAFA,OAAOyB,EAAA,MAAK,GAAA;MAChC,SAAA5B,QAAQ,CAARI,EAAQ0C,EAAA,QAAA,SAAA,CAAA,CAAA;;;KAEV7C,EAAgBI,CAAA;KAChBJ,EAAeK,CAAA;KACfL,EAAyBM,CAAA;KAEzBN,EAAcO,CAAA;KAEdP,EAAgBQ,CAAA;KAGRmB,EAAA,OAAO,iBAFf/B,EAAA,GAAAC,EAIEY,EAHKX,EAAA2B,CAAA,CAAmB,GAAA;;MAEvB,eAAeE,EAAA,MAAM;;KAExB3B,EAQEW,GAAA;MAPC,IAAIqC,EAAA;MACJ,UAAUlD,EAAAmD,CAAA,CAAoB,CAACtB,EAAA,OAAO,eAAeG,EAAA,KAAS;MAC9D,QAAQhC,EAAAoD,CAAA;MACR,iBAAepD,EAAAoD,CAAA;MACf,KAAKpB,EAAA;MACN,eAAA;MACA,gBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButton.js","names":["_sfc_main","ActionButton_vue_vue_type_script_setup_true_lang_default","ActionButton_default"],"sources":["../../../src/components/actions/ActionButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema } from '@alfakit/core'\nimport {\n bindsKeyBindings,\n formatKeyBinding,\n iconButtonSize,\n registerKeyBindings,\n resolveActionSize,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { computed, watchEffect, type HTMLAttributes } from 'vue'\nimport { useStoreSelector } from '../../composables/use-store'\nimport { useActionRunner, useT } from '../../context'\nimport {\n badgeColorClasses,\n colorClass,\n ghostButtonColorClasses,\n outlineButtonColorClasses,\n solidButtonColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport Tooltip from '../ui/Tooltip.vue'\nimport TooltipContent from '../ui/TooltipContent.vue'\nimport TooltipTrigger from '../ui/TooltipTrigger.vue'\n\nexport interface ActionButtonProps {\n action: ActionSchema\n context: ActionContext\n size?: 'xs' | 'sm' | 'default' | 'lg'\n class?: HTMLAttributes['class']\n /** Force a variant (e.g. menu items render as plain rows). */\n variant?: ActionSchema['variant']\n /** Bind the action's key bindings globally while mounted. */\n withKeyBindings?: boolean\n /** Override how the action runs (e.g. a form submits its values). */\n onTrigger?: (action: ActionSchema, context: ActionContext) => void | Promise<void>\n}\n\nconst props = withDefaults(defineProps<ActionButtonProps>(), {\n size: 'default',\n withKeyBindings: true,\n})\n\nconst runner = useActionRunner()\nconst loading = useStoreSelector(runner.store, (state) => state.loading === props.action.name)\nconst processing = useStoreSelector(runner.store, (state) =>\n state.modals.some((modal) => modal.action.name === props.action.name && modal.processing),\n)\n\nconst variant = computed(\n () =>\n props.variant ??\n (props.action.outlined\n ? 'outline'\n : (props.action.variant ??\n (props.action.hasAction || props.action.hasModal || props.action.url ? 'link' : 'button'))),\n)\nconst isIconOnly = computed(() => variant.value === 'icon-button' || !props.action.label)\nconst busy = computed(() => loading.value || processing.value)\n// A disabled link renders as a disabled button so it cannot navigate.\nconst isPlainLink = computed(() =>\n Boolean(\n props.action.url && !props.action.hasAction && !props.action.hasModal && !props.action.disabled,\n ),\n)\n// Record actions repeat per row: a global shortcut would run them for every record.\nconst bindsKeys = computed(\n () => props.withKeyBindings && bindsKeyBindings(props.action, props.context),\n)\n\n/** The badge trigger style (`badge()` without an argument). */\nconst BADGE_TRIGGER_CLASSES =\n \"h-auto min-h-6 gap-1 rounded-md border px-2 py-0.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-3.5\"\n\nfunction buttonClasses(action: ActionSchema, kind: ActionSchema['variant']): string {\n const color = action.color ?? 'primary'\n\n switch (kind) {\n case 'outline':\n return cn('bg-background border', colorClass(outlineButtonColorClasses, color, 'gray'))\n case 'ghost':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'link':\n return cn(\n 'h-auto p-0 underline-offset-4 hover:underline',\n colorClass(textColorClasses, color, 'primary'),\n )\n case 'icon-button':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'badge':\n // `badge()`: a tinted pill in the action's colour.\n return cn(BADGE_TRIGGER_CLASSES, colorClass(badgeColorClasses, color, 'primary'))\n default:\n return colorClass(solidButtonColorClasses, color, 'primary')\n }\n}\n\nconst run = () =>\n void (props.onTrigger\n ? props.onTrigger(props.action, props.context)\n : runner.trigger(props.action, props.context))\n\nwatchEffect((onCleanup) => {\n if (!bindsKeys.value || !props.action.keyBindings) {\n return\n }\n\n onCleanup(registerKeyBindings([{ keys: props.action.keyBindings, handler: run }]))\n})\n\nconst onClick = (event: MouseEvent) => {\n if (isPlainLink.value) {\n return // Plain link: let Inertia Link / anchor handle it.\n }\n\n event.preventDefault()\n run()\n}\n\nconst sizeProp = computed(() => {\n const size = variant.value === 'badge' ? 'xs' : resolveActionSize(props.action.size, props.size)\n\n return isIconOnly.value ? iconButtonSize(size) : size\n})\n// `labeledFrom()`: icon only below the breakpoint; the label stays the accessible name.\nconst LABEL_FROM: Record<string, string> = {\n sm: 'hidden sm:inline',\n md: 'hidden md:inline',\n lg: 'hidden lg:inline',\n xl: 'hidden xl:inline',\n '2xl': 'hidden 2xl:inline',\n}\nconst ICON_ONLY_BELOW: Record<string, string> = {\n sm: 'max-sm:aspect-square max-sm:px-0',\n md: 'max-md:aspect-square max-md:px-0',\n lg: 'max-lg:aspect-square max-lg:px-0',\n xl: 'max-xl:aspect-square max-xl:px-0',\n '2xl': 'max-2xl:aspect-square max-2xl:px-0',\n}\nconst labeledFrom = computed(() =>\n !isIconOnly.value && props.action.icon && props.action.labeledFrom\n ? props.action.labeledFrom\n : null,\n)\nconst labelClass = computed(() => (labeledFrom.value ? LABEL_FROM[labeledFrom.value] : undefined))\nconst classes = computed(() =>\n cn(\n buttonClasses(props.action, variant.value),\n labeledFrom.value && ICON_ONLY_BELOW[labeledFrom.value],\n props.class,\n ),\n)\nconst t = useT()\nconst newTabHint = computed(() => t('opens_in_new_tab', {}, '(opens in a new tab)'))\nconst ariaLabel = computed(() => {\n if (!isIconOnly.value && !labeledFrom.value) return undefined\n\n const name = props.action.label ?? props.action.tooltip ?? props.action.name\n\n return isPlainLink.value && props.action.openUrlInNewTab ? `${name} ${newTabHint.value}` : name\n})\nconst tooltip = computed(\n () => props.action.tooltip ?? (isIconOnly.value ? props.action.label : undefined),\n)\nconst shortcut = computed(() => (bindsKeys.value ? props.action.keyBindings?.[0] : undefined))\nconst disabledTooltip = computed(() => Boolean(props.action.disabled && tooltip.value))\n</script>\n\n<template>\n <Tooltip v-if=\"tooltip || shortcut\">\n <!-- A disabled button gets no pointer or focus events: a focusable span carries the\n tooltip (e.g. the reason from `authorizationTooltip()`). -->\n <TooltipTrigger\n :as-child=\"!disabledTooltip\"\n :as=\"disabledTooltip ? 'span' : undefined\"\n :tabindex=\"disabledTooltip ? 0 : undefined\"\n :class=\"disabledTooltip ? 'inline-flex' : undefined\"\n :data-disabled-tooltip=\"disabledTooltip ? '' : undefined\"\n >\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {{ tooltip }}\n <kbd v-if=\"shortcut\" class=\"ms-2 rounded border border-white/20 px-1 font-mono text-[10px]\">{{\n formatKeyBinding(shortcut)\n }}</kbd>\n </TooltipContent>\n </Tooltip>\n <template v-else>\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ActionButton.js","names":["_sfc_main","ActionButton_vue_vue_type_script_setup_true_lang_default","ActionButton_default"],"sources":["../../../src/components/actions/ActionButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ActionContext, ActionSchema } from '@alfakit/core'\nimport {\n bindsKeyBindings,\n formatKeyBinding,\n iconButtonSize,\n isActionLoading,\n isActionProcessing,\n registerKeyBindings,\n resolveActionSize,\n} from '@alfakit/core'\nimport { Link } from '@inertiajs/vue3'\nimport { computed, watchEffect, type HTMLAttributes } from 'vue'\nimport { useStoreSelector } from '../../composables/use-store'\nimport { useActionRunner, useT } from '../../context'\nimport {\n badgeColorClasses,\n colorClass,\n ghostButtonColorClasses,\n outlineButtonColorClasses,\n solidButtonColorClasses,\n textColorClasses,\n} from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport Badge from '../ui/Badge.vue'\nimport Button from '../ui/Button.vue'\nimport Spinner from '../ui/Spinner.vue'\nimport Tooltip from '../ui/Tooltip.vue'\nimport TooltipContent from '../ui/TooltipContent.vue'\nimport TooltipTrigger from '../ui/TooltipTrigger.vue'\n\nexport interface ActionButtonProps {\n action: ActionSchema\n context: ActionContext\n size?: 'xs' | 'sm' | 'default' | 'lg'\n class?: HTMLAttributes['class']\n /** Force a variant (e.g. menu items render as plain rows). */\n variant?: ActionSchema['variant']\n /** Bind the action's key bindings globally while mounted. */\n withKeyBindings?: boolean\n /** Override how the action runs (e.g. a form submits its values). */\n onTrigger?: (action: ActionSchema, context: ActionContext) => void | Promise<void>\n}\n\nconst props = withDefaults(defineProps<ActionButtonProps>(), {\n size: 'default',\n withKeyBindings: true,\n})\n\nconst runner = useActionRunner()\n// Only this run (this record's button), not the same action in every table row.\nconst loading = useStoreSelector(runner.store, (state) =>\n isActionLoading(state, props.action, props.context),\n)\nconst processing = useStoreSelector(runner.store, (state) =>\n isActionProcessing(state, props.action, props.context),\n)\n\nconst variant = computed(\n () =>\n props.variant ??\n (props.action.outlined\n ? 'outline'\n : (props.action.variant ??\n (props.action.hasAction || props.action.hasModal || props.action.url ? 'link' : 'button'))),\n)\nconst isIconOnly = computed(() => variant.value === 'icon-button' || !props.action.label)\nconst busy = computed(() => loading.value || processing.value)\n// A disabled link renders as a disabled button so it cannot navigate.\nconst isPlainLink = computed(() =>\n Boolean(\n props.action.url && !props.action.hasAction && !props.action.hasModal && !props.action.disabled,\n ),\n)\n// Record actions repeat per row: a global shortcut would run them for every record.\nconst bindsKeys = computed(\n () => props.withKeyBindings && bindsKeyBindings(props.action, props.context),\n)\n\n/** The badge trigger style (`badge()` without an argument). */\nconst BADGE_TRIGGER_CLASSES =\n \"h-auto min-h-6 gap-1 rounded-md border px-2 py-0.5 text-xs font-medium [&_svg:not([class*='size-'])]:size-3.5\"\n\nfunction buttonClasses(action: ActionSchema, kind: ActionSchema['variant']): string {\n const color = action.color ?? 'primary'\n\n switch (kind) {\n case 'outline':\n return cn('bg-background border', colorClass(outlineButtonColorClasses, color, 'gray'))\n case 'ghost':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'link':\n return cn(\n 'h-auto p-0 underline-offset-4 hover:underline has-[>svg]:px-0',\n colorClass(textColorClasses, color, 'primary'),\n )\n case 'icon-button':\n return colorClass(ghostButtonColorClasses, color, 'gray')\n case 'badge':\n // `badge()`: a tinted pill in the action's colour.\n return cn(BADGE_TRIGGER_CLASSES, colorClass(badgeColorClasses, color, 'primary'))\n default:\n return colorClass(solidButtonColorClasses, color, 'primary')\n }\n}\n\nconst run = () =>\n void (props.onTrigger\n ? props.onTrigger(props.action, props.context)\n : runner.trigger(props.action, props.context))\n\nwatchEffect((onCleanup) => {\n if (!bindsKeys.value || !props.action.keyBindings) {\n return\n }\n\n onCleanup(registerKeyBindings([{ keys: props.action.keyBindings, handler: run }]))\n})\n\nconst onClick = (event: MouseEvent) => {\n if (isPlainLink.value) {\n return // Plain link: let Inertia Link / anchor handle it.\n }\n\n event.preventDefault()\n run()\n}\n\nconst sizeProp = computed(() => {\n const size = variant.value === 'badge' ? 'xs' : resolveActionSize(props.action.size, props.size)\n\n return isIconOnly.value ? iconButtonSize(size) : size\n})\n// `labeledFrom()`: icon only below the breakpoint; the label stays the accessible name.\nconst LABEL_FROM: Record<string, string> = {\n sm: 'hidden sm:inline',\n md: 'hidden md:inline',\n lg: 'hidden lg:inline',\n xl: 'hidden xl:inline',\n '2xl': 'hidden 2xl:inline',\n}\nconst ICON_ONLY_BELOW: Record<string, string> = {\n sm: 'max-sm:aspect-square max-sm:px-0',\n md: 'max-md:aspect-square max-md:px-0',\n lg: 'max-lg:aspect-square max-lg:px-0',\n xl: 'max-xl:aspect-square max-xl:px-0',\n '2xl': 'max-2xl:aspect-square max-2xl:px-0',\n}\nconst labeledFrom = computed(() =>\n !isIconOnly.value && props.action.icon && props.action.labeledFrom\n ? props.action.labeledFrom\n : null,\n)\nconst labelClass = computed(() => (labeledFrom.value ? LABEL_FROM[labeledFrom.value] : undefined))\nconst classes = computed(() =>\n cn(\n buttonClasses(props.action, variant.value),\n labeledFrom.value && ICON_ONLY_BELOW[labeledFrom.value],\n props.class,\n ),\n)\nconst t = useT()\nconst newTabHint = computed(() => t('opens_in_new_tab', {}, '(opens in a new tab)'))\nconst ariaLabel = computed(() => {\n if (!isIconOnly.value && !labeledFrom.value) return undefined\n\n const name = props.action.label ?? props.action.tooltip ?? props.action.name\n\n return isPlainLink.value && props.action.openUrlInNewTab ? `${name} ${newTabHint.value}` : name\n})\nconst tooltip = computed(\n () => props.action.tooltip ?? (isIconOnly.value ? props.action.label : undefined),\n)\nconst shortcut = computed(() => (bindsKeys.value ? props.action.keyBindings?.[0] : undefined))\nconst disabledTooltip = computed(() => Boolean(props.action.disabled && tooltip.value))\n</script>\n\n<template>\n <Tooltip v-if=\"tooltip || shortcut\">\n <!-- A disabled button gets no pointer or focus events: a focusable span carries the\n tooltip (e.g. the reason from `authorizationTooltip()`). -->\n <TooltipTrigger\n :as-child=\"!disabledTooltip\"\n :as=\"disabledTooltip ? 'span' : undefined\"\n :tabindex=\"disabledTooltip ? 0 : undefined\"\n :class=\"disabledTooltip ? 'inline-flex' : undefined\"\n :data-disabled-tooltip=\"disabledTooltip ? '' : undefined\"\n >\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {{ tooltip }}\n <kbd\n v-if=\"shortcut\"\n dir=\"ltr\"\n class=\"ms-2 rounded border border-white/20 px-1 font-mono text-[10px]\"\n >{{ formatKeyBinding(shortcut) }}</kbd\n >\n </TooltipContent>\n </Tooltip>\n <template v-else>\n <Button\n v-if=\"isPlainLink && props.action.openUrlInNewTab\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <a :href=\"props.action.url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <span v-if=\"!isIconOnly\" class=\"sr-only\"> {{ newTabHint }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </a>\n </Button>\n <Button\n v-else-if=\"isPlainLink\"\n as-child\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n >\n <Link :href=\"props.action.url ?? '#'\">\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Link>\n </Button>\n <Button\n v-else\n type=\"button\"\n variant=\"plain\"\n :size=\"sizeProp\"\n :class=\"classes\"\n :disabled=\"props.action.disabled || busy\"\n :aria-label=\"ariaLabel\"\n v-bind=\"props.action.extraAttributes\"\n @click=\"onClick\"\n >\n <Spinner v-if=\"busy\" />\n <Icon\n v-else-if=\"props.action.icon && props.action.iconPosition !== 'after'\"\n :name=\"props.action.icon\"\n />\n <span v-if=\"!isIconOnly\" :class=\"labelClass\">{{ props.action.label }}</span>\n <Icon\n v-if=\"props.action.icon && props.action.iconPosition === 'after' && !busy\"\n :name=\"props.action.icon\"\n />\n <Badge\n v-if=\"props.action.badge !== undefined && props.action.badge !== null\"\n variant=\"outline\"\n :class=\"\n cn('ms-1 px-1.5 py-0', colorClass(badgeColorClasses, props.action.badgeColor, 'gray'))\n \"\n >{{ props.action.badge }}</Badge\n >\n </Button>\n </template>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButton.vue.d.ts","sourceRoot":"","sources":["../../../src/components/actions/ActionButton.vue"],"names":[],"mappings":"AA+XA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAShE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAA;AAoBhE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAA;IACrC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACjC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnF;;UARQ,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;qBAKnB,OAAO;;AAkxB3B,wBAOG"}
1
+ {"version":3,"file":"ActionButton.vue.d.ts","sourceRoot":"","sources":["../../../src/components/actions/ActionButton.vue"],"names":[],"mappings":"AAuYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAWhE,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAA;AAoBhE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE,aAAa,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAA;IACrC,KAAK,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;IACjC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnF;;UARQ,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;qBAKnB,OAAO;;AAoxB3B,wBAOG"}