@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 +1 @@
1
- {"version":3,"file":"ModalTablePicker.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Dialog","_withCtx","_createVNode","DialogContent","_normalizeClass","_unref","DialogHeader","DialogTitle","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","DialogDescription","Input","ModalTablePickerFilters","_createElementVNode","Skeleton","Table","TableHeader","TableRow","TableHead","_Fragment","_renderList","TableBody","TableCell","_withModifiers","Checkbox","TableCellContent","DialogFooter","Button","Button_default","Checkbox_default","Input_default","Table_default","TableBody_default","TableCell_default","TableHead_default","TableHeader_default","TableRow_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","TableCellContent_default","DialogFooter_default","Skeleton_default","ModalTablePickerFilters_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","ModalTablePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","t","useT","choice","useChoice","form","useFormStore","multiple","computed","query","ref","response","failed","loading","draft","labels","search","controller","watch","current","next","error","onScopeDispose","table","pushSearch","debounce","columns","column","records","paging","modalTablePaging","atMax","hasToolbar","toggle","toggleModalTableKey","key","isSelectable","selectable","sort","direction","ariaSortOf","goTo","confirm","openBlock","createBlock","_cache","open","withCtx","createVNode","normalizeClass","unref","cn","FILTERS_MODAL_WIDTH_CLASSES","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","SearchIcon","createElementVNode","Fragment","renderList","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","record","withModifiers","ChevronLeftIcon","ChevronRightIcon"],"sources":["../../../src/components/fields/ModalTablePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ModalTableSelectResponse, ModalTableSelectSchema, TableQuery } from '@alfakit/core'\nimport {\n FILTERS_MODAL_WIDTH_CLASSES,\n debounce,\n modalTablePaging,\n toggleModalTableKey,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpDownIcon,\n ArrowUpIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n SearchIcon,\n} from '@lucide/vue'\nimport { computed, onScopeDispose, ref, watch } from 'vue'\nimport { useChoice, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useFormStore } from '../form/form-context'\nimport TableCellContent from '../table/TableCellContent.vue'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogFooter from '../ui/DialogFooter.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport Input from '../ui/Input.vue'\nimport Skeleton from '../ui/Skeleton.vue'\nimport Table from '../ui/Table.vue'\nimport TableBody from '../ui/TableBody.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableHead from '../ui/TableHead.vue'\nimport TableHeader from '../ui/TableHeader.vue'\nimport TableRow from '../ui/TableRow.vue'\nimport ModalTablePickerFilters from './ModalTablePickerFilters.vue'\n\nconst props = defineProps<{ component: ModalTableSelectSchema; initial: string[] }>()\nconst emit = defineEmits<{\n close: []\n confirm: [keys: string[], labels: Record<string, string>]\n}>()\nconst t = useT()\nconst choice = useChoice()\nconst form = useFormStore()\nconst multiple = computed(() => Boolean(props.component.multiple))\nconst query = ref<TableQuery>({})\nconst response = ref<ModalTableSelectResponse | null>(null)\nconst failed = ref(false)\nconst loading = ref(true)\nconst draft = ref<string[]>([...props.initial])\nconst labels = ref<Record<string, string>>({})\nconst search = ref('')\nlet controller: AbortController | null = null\n\nconst load = () => {\n controller?.abort()\n const current = new AbortController()\n controller = current\n loading.value = true\n\n form\n .modalTable(\n props.component.statePath,\n props.component.tableStateIdentifier,\n query.value,\n current.signal,\n )\n .then((next) => {\n if (!next) return\n response.value = next\n labels.value = { ...labels.value, ...next.labels }\n failed.value = false\n })\n .catch((error: unknown) => {\n if ((error as { name?: string }).name !== 'AbortError') failed.value = true\n })\n .finally(() => {\n if (!current.signal.aborted) loading.value = false\n })\n}\n\nwatch(query, load, { immediate: true, deep: true })\nonScopeDispose(() => controller?.abort())\n\nconst table = computed(() => response.value?.table)\nconst pushSearch = debounce((next: string) => {\n query.value = { ...query.value, search: next || null, page: null }\n}, 400)\nonScopeDispose(() => pushSearch.cancel())\n\nconst columns = computed(() =>\n table.value\n ? table.value.columns.filter((column) => table.value!.visibleColumns.includes(column.name))\n : [],\n)\nconst records = computed(() => table.value?.records ?? [])\nconst paging = computed(() => modalTablePaging(table.value?.pagination))\nconst atMax = computed(\n () =>\n multiple.value &&\n props.component.maxItems != null &&\n draft.value.length >= props.component.maxItems,\n)\nconst hasToolbar = computed(\n () => Boolean(table.value?.searchable) || (table.value?.filters?.length ?? 0) > 0,\n)\n\nconst toggle = (key: string) => {\n draft.value = toggleModalTableKey(draft.value, key, multiple.value, props.component.maxItems)\n}\nconst isSelectable = (key: string, selectable: boolean | undefined) =>\n selectable === true && (draft.value.includes(key) || !atMax.value)\nconst sort = (column: string) => {\n const direction =\n table.value?.sort?.column === column && table.value.sort.direction === 'asc' ? 'desc' : 'asc'\n query.value = { ...query.value, sort: column, direction, page: null }\n}\nconst ariaSortOf = (column: string) =>\n table.value?.sort?.column === column\n ? table.value.sort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\nconst goTo = (page: number) => {\n query.value = { ...query.value, page }\n}\nconst confirm = () =>\n emit(\n 'confirm',\n draft.value,\n Object.fromEntries(\n draft.value.filter((key) => labels.value[key]).map((key) => [key, labels.value[key]!]),\n ),\n )\n</script>\n\n<template>\n <Dialog :open=\"true\" @update:open=\"(open) => !open && emit('close')\">\n <DialogContent\n :class=\"\n cn(\n 'flex max-h-[90vh] flex-col gap-4',\n FILTERS_MODAL_WIDTH_CLASSES[props.component.modalWidth ?? '3xl'] ?? 'sm:max-w-3xl',\n )\n \"\n data-slot=\"modal-table-select-dialog\"\n >\n <DialogHeader>\n <DialogTitle>{{ props.component.modalHeading }}</DialogTitle>\n <!-- Escaped on the server (`Html::from()`), like action modal descriptions. -->\n <p\n v-if=\"props.component.modalDescription\"\n class=\"text-muted-foreground text-sm\"\n data-slot=\"modal-table-select-description\"\n v-html=\"props.component.modalDescription\"\n />\n <DialogDescription aria-live=\"polite\">{{\n choice('table.selected', draft.length, { count: draft.length }, ':count selected')\n }}</DialogDescription>\n </DialogHeader>\n <div v-if=\"table && hasToolbar\" class=\"flex flex-col gap-3\">\n <div v-if=\"table.searchable\" class=\"relative\">\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n type=\"search\"\n :model-value=\"search\"\n :aria-label=\"table.searchPlaceholder\"\n :placeholder=\"table.searchPlaceholder\"\n class=\"ps-8\"\n @update:model-value=\"\n (next) => {\n search = String(next)\n pushSearch(String(next))\n }\n \"\n />\n </div>\n <ModalTablePickerFilters\n v-if=\"(table.filters?.length ?? 0) > 0\"\n :table=\"table\"\n :owner=\"form\"\n :path=\"props.component.statePath\"\n @change=\"(filters) => (query = { ...query, filters, page: null })\"\n />\n </div>\n <div class=\"min-h-0 flex-1 overflow-auto rounded-md border\" :aria-busy=\"loading\">\n <p v-if=\"failed\" role=\"alert\" class=\"text-destructive p-6 text-center text-sm\">\n {{ t('table_select.load_failed', {}, \"Couldn't load the records.\") }}\n </p>\n <div v-else-if=\"!table\" class=\"flex flex-col gap-2 p-4\" aria-hidden=\"true\">\n <Skeleton class=\"h-8 w-full\" />\n <Skeleton class=\"h-8 w-full\" />\n <Skeleton class=\"h-8 w-full\" />\n </div>\n <p v-else-if=\"records.length === 0\" class=\"text-muted-foreground p-6 text-center text-sm\">\n {{ table.emptyState.heading }}\n </p>\n <Table v-else :class=\"cn(loading && 'opacity-60')\">\n <TableHeader>\n <TableRow>\n <TableHead class=\"w-10\"\n ><span class=\"sr-only\">{{\n t('table.select_row', {}, 'Select row')\n }}</span></TableHead\n >\n <TableHead\n v-for=\"column in columns\"\n :key=\"column.name\"\n :aria-sort=\"ariaSortOf(column.name)\"\n >\n <button\n v-if=\"column.sortable\"\n type=\"button\"\n class=\"inline-flex items-center gap-1\"\n @click=\"sort(column.name)\"\n >\n {{ column.label }}\n <template v-if=\"table.sort?.column === column.name\">\n <ArrowUpIcon v-if=\"table.sort.direction === 'asc'\" class=\"size-3.5\" />\n <ArrowDownIcon v-else class=\"size-3.5\" />\n </template>\n <ArrowUpDownIcon v-else class=\"text-muted-foreground size-3.5\" />\n </button>\n <template v-else>{{ column.label }}</template>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow\n v-for=\"record in records\"\n :key=\"String(record.key)\"\n :data-state=\"draft.includes(String(record.key)) ? 'selected' : undefined\"\n :class=\"cn(isSelectable(String(record.key), record.selectable) && 'cursor-pointer')\"\n @click=\"\n isSelectable(String(record.key), record.selectable) && toggle(String(record.key))\n \"\n >\n <TableCell class=\"w-10\" @click.stop>\n <Checkbox\n v-if=\"multiple\"\n :model-value=\"draft.includes(String(record.key))\"\n :disabled=\"!isSelectable(String(record.key), record.selectable)\"\n :aria-label=\"\n t(\n 'table_select.select_record',\n { label: labels[String(record.key)] ?? String(record.key) },\n 'Select :label',\n )\n \"\n @update:model-value=\"toggle(String(record.key))\"\n />\n <input\n v-else\n type=\"radio\"\n :name=\"`${props.component.statePath}-picker`\"\n class=\"accent-primary size-4\"\n :checked=\"draft.includes(String(record.key))\"\n :disabled=\"!isSelectable(String(record.key), record.selectable)\"\n :aria-label=\"\n t(\n 'table_select.select_record',\n { label: labels[String(record.key)] ?? String(record.key) },\n 'Select :label',\n )\n \"\n @change=\"toggle(String(record.key))\"\n />\n </TableCell>\n <TableCell v-for=\"column in columns\" :key=\"column.name\">\n <TableCellContent\n v-if=\"record.cells[column.name]\"\n :column=\"column\"\n :cell=\"record.cells[column.name]!\"\n :record-key=\"record.key\"\n token=\"\"\n :component=\"`picker:${props.component.statePath}`\"\n />\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n <p v-if=\"atMax\" class=\"text-muted-foreground text-sm\" role=\"status\">\n {{\n choice(\n 'table_select.max_reached',\n props.component.maxItems ?? 0,\n { count: props.component.maxItems ?? 0 },\n 'You can select up to :count records.',\n )\n }}\n </p>\n <DialogFooter class=\"items-center sm:justify-between\">\n <nav\n v-if=\"paging\"\n class=\"flex items-center gap-2\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!paging.hasPrevious || loading\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"goTo(paging.page - 1)\"\n ><ChevronLeftIcon class=\"rtl:rotate-180\"\n /></Button>\n <span class=\"text-muted-foreground text-sm\">{{\n paging.total !== undefined\n ? t(\n 'table.showing',\n { first: paging.from, last: paging.to, total: paging.total },\n 'Showing :first–:last of :total',\n )\n : `${paging.from}–${paging.to}`\n }}</span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!paging.hasNext || loading\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"goTo(paging.page + 1)\"\n ><ChevronRightIcon class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n <span v-else />\n <div class=\"flex gap-2\">\n <Button v-if=\"draft.length > 0\" type=\"button\" variant=\"ghost\" @click=\"draft = []\">{{\n t('table_select.clear', {}, 'Clear selection')\n }}</Button>\n <Button type=\"button\" variant=\"outline\" @click=\"emit('close')\">{{\n t('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" @click=\"confirm\">{{\n props.component.modalSubmitActionLabel ?? t('table_select.confirm', {}, 'Select')\n }}</Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ModalTablePicker.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","Dialog","_withCtx","_createVNode","DialogContent","_normalizeClass","_unref","DialogHeader","DialogTitle","_createTextVNode","_toDisplayString","_createElementBlock","_createCommentVNode","DialogDescription","Input","ModalTablePickerFilters","_createElementVNode","Skeleton","Table","TableHeader","TableRow","TableHead","_Fragment","_renderList","TableBody","TableCell","_withModifiers","Checkbox","TableCellContent","DialogFooter","Button","Button_default","Checkbox_default","Input_default","Table_default","TableBody_default","TableCell_default","TableHead_default","TableHeader_default","TableRow_default","Dialog_default","DialogContent_default","DialogDescription_default","DialogHeader_default","DialogTitle_default","TableCellContent_default","DialogFooter_default","Skeleton_default","ModalTablePickerFilters_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","ModalTablePicker_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","t","useT","format","useFormatter","choice","useChoice","form","useFormStore","multiple","computed","query","ref","response","failed","loading","draft","labels","search","controller","watch","current","next","error","onScopeDispose","table","pushSearch","debounce","columns","column","records","paging","modalTablePaging","atMax","hasToolbar","toggle","toggleModalTableKey","key","isSelectable","selectable","sort","direction","ariaSortOf","goTo","confirm","openBlock","createBlock","_cache","open","withCtx","createVNode","normalizeClass","unref","cn","FILTERS_MODAL_WIDTH_CLASSES","createTextVNode","toDisplayString","createElementBlock","createCommentVNode","SearchIcon","createElementVNode","Fragment","renderList","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","record","withModifiers","ChevronLeftIcon","ChevronRightIcon"],"sources":["../../../src/components/fields/ModalTablePicker.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ModalTableSelectResponse, ModalTableSelectSchema, TableQuery } from '@alfakit/core'\nimport {\n FILTERS_MODAL_WIDTH_CLASSES,\n debounce,\n modalTablePaging,\n toggleModalTableKey,\n} from '@alfakit/core'\nimport {\n ArrowDownIcon,\n ArrowUpDownIcon,\n ArrowUpIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n SearchIcon,\n} from '@lucide/vue'\nimport { computed, onScopeDispose, ref, watch } from 'vue'\nimport { useChoice, useFormatter, useT } from '../../context'\nimport { cn } from '../../lib/utils'\nimport { useFormStore } from '../form/form-context'\nimport TableCellContent from '../table/TableCellContent.vue'\nimport Button from '../ui/Button.vue'\nimport Checkbox from '../ui/Checkbox.vue'\nimport Dialog from '../ui/Dialog.vue'\nimport DialogContent from '../ui/DialogContent.vue'\nimport DialogDescription from '../ui/DialogDescription.vue'\nimport DialogFooter from '../ui/DialogFooter.vue'\nimport DialogHeader from '../ui/DialogHeader.vue'\nimport DialogTitle from '../ui/DialogTitle.vue'\nimport Input from '../ui/Input.vue'\nimport Skeleton from '../ui/Skeleton.vue'\nimport Table from '../ui/Table.vue'\nimport TableBody from '../ui/TableBody.vue'\nimport TableCell from '../ui/TableCell.vue'\nimport TableHead from '../ui/TableHead.vue'\nimport TableHeader from '../ui/TableHeader.vue'\nimport TableRow from '../ui/TableRow.vue'\nimport ModalTablePickerFilters from './ModalTablePickerFilters.vue'\n\nconst props = defineProps<{ component: ModalTableSelectSchema; initial: string[] }>()\nconst emit = defineEmits<{\n close: []\n confirm: [keys: string[], labels: Record<string, string>]\n}>()\nconst t = useT()\nconst format = useFormatter()\nconst choice = useChoice()\nconst form = useFormStore()\nconst multiple = computed(() => Boolean(props.component.multiple))\nconst query = ref<TableQuery>({})\nconst response = ref<ModalTableSelectResponse | null>(null)\nconst failed = ref(false)\nconst loading = ref(true)\nconst draft = ref<string[]>([...props.initial])\nconst labels = ref<Record<string, string>>({})\nconst search = ref('')\nlet controller: AbortController | null = null\n\nconst load = () => {\n controller?.abort()\n const current = new AbortController()\n controller = current\n loading.value = true\n\n form\n .modalTable(\n props.component.statePath,\n props.component.tableStateIdentifier,\n query.value,\n current.signal,\n )\n .then((next) => {\n if (!next) return\n response.value = next\n labels.value = { ...labels.value, ...next.labels }\n failed.value = false\n })\n .catch((error: unknown) => {\n if ((error as { name?: string }).name !== 'AbortError') failed.value = true\n })\n .finally(() => {\n if (!current.signal.aborted) loading.value = false\n })\n}\n\nwatch(query, load, { immediate: true, deep: true })\nonScopeDispose(() => controller?.abort())\n\nconst table = computed(() => response.value?.table)\nconst pushSearch = debounce((next: string) => {\n query.value = { ...query.value, search: next || null, page: null }\n}, 400)\nonScopeDispose(() => pushSearch.cancel())\n\nconst columns = computed(() =>\n table.value\n ? table.value.columns.filter((column) => table.value!.visibleColumns.includes(column.name))\n : [],\n)\nconst records = computed(() => table.value?.records ?? [])\nconst paging = computed(() => modalTablePaging(table.value?.pagination))\nconst atMax = computed(\n () =>\n multiple.value &&\n props.component.maxItems != null &&\n draft.value.length >= props.component.maxItems,\n)\nconst hasToolbar = computed(\n () => Boolean(table.value?.searchable) || (table.value?.filters?.length ?? 0) > 0,\n)\n\nconst toggle = (key: string) => {\n draft.value = toggleModalTableKey(draft.value, key, multiple.value, props.component.maxItems)\n}\nconst isSelectable = (key: string, selectable: boolean | undefined) =>\n selectable === true && (draft.value.includes(key) || !atMax.value)\nconst sort = (column: string) => {\n const direction =\n table.value?.sort?.column === column && table.value.sort.direction === 'asc' ? 'desc' : 'asc'\n query.value = { ...query.value, sort: column, direction, page: null }\n}\nconst ariaSortOf = (column: string) =>\n table.value?.sort?.column === column\n ? table.value.sort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\nconst goTo = (page: number) => {\n query.value = { ...query.value, page }\n}\nconst confirm = () =>\n emit(\n 'confirm',\n draft.value,\n Object.fromEntries(\n draft.value.filter((key) => labels.value[key]).map((key) => [key, labels.value[key]!]),\n ),\n )\n</script>\n\n<template>\n <Dialog :open=\"true\" @update:open=\"(open) => !open && emit('close')\">\n <DialogContent\n :class=\"\n cn(\n 'flex max-h-[90vh] flex-col gap-4',\n FILTERS_MODAL_WIDTH_CLASSES[props.component.modalWidth ?? '3xl'] ?? 'sm:max-w-3xl',\n )\n \"\n data-slot=\"modal-table-select-dialog\"\n >\n <DialogHeader>\n <DialogTitle>{{ props.component.modalHeading }}</DialogTitle>\n <!-- Escaped on the server (`Html::from()`), like action modal descriptions. -->\n <p\n v-if=\"props.component.modalDescription\"\n class=\"text-muted-foreground text-sm\"\n data-slot=\"modal-table-select-description\"\n v-html=\"props.component.modalDescription\"\n />\n <DialogDescription aria-live=\"polite\">{{\n choice('table.selected', draft.length, { count: draft.length }, ':count selected')\n }}</DialogDescription>\n </DialogHeader>\n <div v-if=\"table && hasToolbar\" class=\"flex flex-col gap-3\">\n <div v-if=\"table.searchable\" class=\"relative\">\n <SearchIcon\n class=\"text-muted-foreground pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2\"\n />\n <Input\n type=\"search\"\n :model-value=\"search\"\n :aria-label=\"table.searchPlaceholder\"\n :placeholder=\"table.searchPlaceholder\"\n class=\"ps-8\"\n @update:model-value=\"\n (next) => {\n search = String(next)\n pushSearch(String(next))\n }\n \"\n />\n </div>\n <ModalTablePickerFilters\n v-if=\"(table.filters?.length ?? 0) > 0\"\n :table=\"table\"\n :owner=\"form\"\n :path=\"props.component.statePath\"\n @change=\"(filters) => (query = { ...query, filters, page: null })\"\n />\n </div>\n <div class=\"min-h-0 flex-1 overflow-auto rounded-md border\" :aria-busy=\"loading\">\n <p v-if=\"failed\" role=\"alert\" class=\"text-destructive p-6 text-center text-sm\">\n {{ t('table_select.load_failed', {}, \"Couldn't load the records.\") }}\n </p>\n <div v-else-if=\"!table\" class=\"flex flex-col gap-2 p-4\" aria-hidden=\"true\">\n <Skeleton class=\"h-8 w-full\" />\n <Skeleton class=\"h-8 w-full\" />\n <Skeleton class=\"h-8 w-full\" />\n </div>\n <p v-else-if=\"records.length === 0\" class=\"text-muted-foreground p-6 text-center text-sm\">\n {{ table.emptyState.heading }}\n </p>\n <Table v-else :class=\"cn(loading && 'opacity-60')\">\n <TableHeader>\n <TableRow>\n <TableHead class=\"w-10\"\n ><span class=\"sr-only\">{{\n t('table.select_row', {}, 'Select row')\n }}</span></TableHead\n >\n <TableHead\n v-for=\"column in columns\"\n :key=\"column.name\"\n :aria-sort=\"ariaSortOf(column.name)\"\n >\n <button\n v-if=\"column.sortable\"\n type=\"button\"\n class=\"inline-flex items-center gap-1\"\n @click=\"sort(column.name)\"\n >\n {{ column.label }}\n <template v-if=\"table.sort?.column === column.name\">\n <ArrowUpIcon v-if=\"table.sort.direction === 'asc'\" class=\"size-3.5\" />\n <ArrowDownIcon v-else class=\"size-3.5\" />\n </template>\n <ArrowUpDownIcon v-else class=\"text-muted-foreground size-3.5\" />\n </button>\n <template v-else>{{ column.label }}</template>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n <TableRow\n v-for=\"record in records\"\n :key=\"String(record.key)\"\n :data-state=\"draft.includes(String(record.key)) ? 'selected' : undefined\"\n :class=\"cn(isSelectable(String(record.key), record.selectable) && 'cursor-pointer')\"\n @click=\"\n isSelectable(String(record.key), record.selectable) && toggle(String(record.key))\n \"\n >\n <TableCell class=\"w-10\" @click.stop>\n <Checkbox\n v-if=\"multiple\"\n :model-value=\"draft.includes(String(record.key))\"\n :disabled=\"!isSelectable(String(record.key), record.selectable)\"\n :aria-label=\"\n t(\n 'table_select.select_record',\n { label: labels[String(record.key)] ?? String(record.key) },\n 'Select :label',\n )\n \"\n @update:model-value=\"toggle(String(record.key))\"\n />\n <input\n v-else\n type=\"radio\"\n :name=\"`${props.component.statePath}-picker`\"\n class=\"accent-primary size-4\"\n :checked=\"draft.includes(String(record.key))\"\n :disabled=\"!isSelectable(String(record.key), record.selectable)\"\n :aria-label=\"\n t(\n 'table_select.select_record',\n { label: labels[String(record.key)] ?? String(record.key) },\n 'Select :label',\n )\n \"\n @change=\"toggle(String(record.key))\"\n />\n </TableCell>\n <TableCell v-for=\"column in columns\" :key=\"column.name\">\n <TableCellContent\n v-if=\"record.cells[column.name]\"\n :column=\"column\"\n :cell=\"record.cells[column.name]!\"\n :record-key=\"record.key\"\n token=\"\"\n :component=\"`picker:${props.component.statePath}`\"\n />\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </div>\n <p v-if=\"atMax\" class=\"text-muted-foreground text-sm\" role=\"status\">\n {{\n choice(\n 'table_select.max_reached',\n props.component.maxItems ?? 0,\n { count: props.component.maxItems ?? 0 },\n 'You can select up to :count records.',\n )\n }}\n </p>\n <DialogFooter class=\"items-center sm:justify-between\">\n <nav\n v-if=\"paging\"\n class=\"flex items-center gap-2\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!paging.hasPrevious || loading\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"goTo(paging.page - 1)\"\n ><ChevronLeftIcon class=\"rtl:rotate-180\"\n /></Button>\n <span class=\"text-muted-foreground text-sm\">{{\n paging.total !== undefined\n ? t(\n 'table.showing',\n {\n first: format.number(paging.from),\n last: format.number(paging.to),\n total: format.number(paging.total),\n },\n 'Showing :first–:last of :total',\n )\n : `${paging.from}–${paging.to}`\n }}</span>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!paging.hasNext || loading\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"goTo(paging.page + 1)\"\n ><ChevronRightIcon class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n <span v-else />\n <div class=\"flex gap-2\">\n <Button v-if=\"draft.length > 0\" type=\"button\" variant=\"ghost\" @click=\"draft = []\">{{\n t('table_select.clear', {}, 'Clear selection')\n }}</Button>\n <Button type=\"button\" variant=\"outline\" @click=\"emit('close')\">{{\n t('cancel', {}, 'Cancel')\n }}</Button>\n <Button type=\"button\" @click=\"confirm\">{{\n props.component.modalSubmitActionLabel ?? t('table_select.confirm', {}, 'Select')\n }}</Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"OneTimeCodeInputField.js","names":["_sfc_main","OneTimeCodeInputField_vue_vue_type_script_setup_true_lang_default","OneTimeCodeInputField_default"],"sources":["../../../src/components/fields/OneTimeCodeInputField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { OneTimeCodeSubmitter, oneTimeCodeDigits, type OneTimeCodeInputSchema } from '@alfakit/core'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Input from '../ui/Input.vue'\n\n/**\n * `OneTimeCodeInput`: one numeric input with `autocomplete=\"one-time-code\"` (browsers and\n * password managers fill it from an SMS or email), digits only, left to right in every\n * language. `submitOnCompletion()` submits the form once the last digit is in.\n */\nconst props = defineProps<{ component: OneTimeCodeInputSchema }>()\nconst { value, setValue, blur, error, id, disabled, aria } = useField<string | null>(\n () => props.component,\n)\nconst submitter = new OneTimeCodeSubmitter()\n\nconst onInput = (event: Event) => {\n const input = event.target as HTMLInputElement\n const code = oneTimeCodeDigits(input.value, props.component.length)\n\n // A rejected character leaves the model value unchanged: correct the DOM too.\n if (code !== input.value) input.value = code\n\n setValue(code === '' ? null : code)\n\n // After the state reached the form store, so the submitted values include it.\n if (props.component.submitOnCompletion) {\n const form = input.form\n\n queueMicrotask(() => submitter.update(code, props.component.length, form))\n }\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <Input\n :id=\"id\"\n :name=\"props.component.name\"\n type=\"text\"\n dir=\"ltr\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n pattern=\"[0-9]*\"\n :maxlength=\"props.component.length\"\n :model-value=\"value ?? ''\"\n :placeholder=\"props.component.placeholder\"\n :disabled=\"disabled\"\n :readonly=\"props.component.readOnly\"\n :required=\"props.component.required\"\n :autofocus=\"props.component.autofocus\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n data-slot=\"one-time-code-input\"\n class=\"max-w-56 text-center font-mono text-lg tracking-[0.5em] tabular-nums\"\n v-bind=\"props.component.extraInputAttributes\"\n @input=\"onInput\"\n @blur=\"blur\"\n />\n </FieldWrapper>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"OneTimeCodeInputField.js","names":["_sfc_main","OneTimeCodeInputField_vue_vue_type_script_setup_true_lang_default","OneTimeCodeInputField_default"],"sources":["../../../src/components/fields/OneTimeCodeInputField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { OneTimeCodeSubmitter, oneTimeCodeDigits, type OneTimeCodeInputSchema } from '@alfakit/core'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Input from '../ui/Input.vue'\n\n/**\n * `OneTimeCodeInput`: one numeric input with `autocomplete=\"one-time-code\"` (browsers and\n * password managers fill it from an SMS or email), digits only, left to right in every\n * language. `submitOnCompletion()` submits the form once the last digit is in.\n */\nconst props = defineProps<{ component: OneTimeCodeInputSchema }>()\nconst { value, setValue, blur, error, id, disabled, aria } = useField<string | null>(\n () => props.component,\n)\nconst submitter = new OneTimeCodeSubmitter()\n\nconst onInput = (event: Event) => {\n const input = event.target as HTMLInputElement\n const code = oneTimeCodeDigits(input.value, props.component.length)\n\n // A rejected character leaves the model value unchanged: correct the DOM too.\n if (code !== input.value) input.value = code\n\n setValue(code === '' ? null : code)\n\n // After the state reached the form store, so the submitted values include it.\n if (props.component.submitOnCompletion) {\n const form = input.form\n\n queueMicrotask(() => submitter.update(code, props.component.length, form))\n }\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <Input\n :id=\"id\"\n :name=\"props.component.name\"\n type=\"text\"\n dir=\"ltr\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n pattern=\"[0-9]*\"\n :model-value=\"value ?? ''\"\n :placeholder=\"props.component.placeholder\"\n :disabled=\"disabled\"\n :readonly=\"props.component.readOnly\"\n :required=\"props.component.required\"\n :autofocus=\"props.component.autofocus\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n data-slot=\"one-time-code-input\"\n data-input=\"\"\n class=\"max-w-56 text-center font-mono text-lg tracking-[0.5em] tabular-nums\"\n v-bind=\"props.component.extraInputAttributes\"\n @input=\"onInput\"\n @blur=\"blur\"\n />\n </FieldWrapper>\n</template>\n"],"mappings":""}
@@ -28,7 +28,6 @@ var f = /*@__PURE__*/ s({
28
28
  inputmode: "numeric",
29
29
  autocomplete: "one-time-code",
30
30
  pattern: "[0-9]*",
31
- maxlength: f.component.length,
32
31
  "model-value": u(p) ?? "",
33
32
  placeholder: f.component.placeholder,
34
33
  disabled: u(v),
@@ -39,6 +38,7 @@ var f = /*@__PURE__*/ s({
39
38
  "aria-describedby": u(y)["aria-describedby"],
40
39
  "aria-required": u(y)["aria-required"],
41
40
  "data-slot": "one-time-code-input",
41
+ "data-input": "",
42
42
  class: "max-w-56 text-center font-mono text-lg tracking-[0.5em] tabular-nums"
43
43
  }, f.component.extraInputAttributes, {
44
44
  onInput: x,
@@ -46,7 +46,6 @@ var f = /*@__PURE__*/ s({
46
46
  }), null, 16, [
47
47
  "id",
48
48
  "name",
49
- "maxlength",
50
49
  "model-value",
51
50
  "placeholder",
52
51
  "disabled",
@@ -1 +1 @@
1
- {"version":3,"file":"OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createVNode","Input","_mergeProps","Input_default","FieldWrapper_default","OneTimeCodeInputField_vue_vue_type_script_setup_true_lang_default","props","__props","useField","submitter","OneTimeCodeSubmitter","onInput","input","event","code","oneTimeCodeDigits","setValue","form","openBlock","createBlock","unref","id","error","withCtx","createVNode","mergeProps","value","disabled","aria","blur"],"sources":["../../../src/components/fields/OneTimeCodeInputField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { OneTimeCodeSubmitter, oneTimeCodeDigits, type OneTimeCodeInputSchema } from '@alfakit/core'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Input from '../ui/Input.vue'\n\n/**\n * `OneTimeCodeInput`: one numeric input with `autocomplete=\"one-time-code\"` (browsers and\n * password managers fill it from an SMS or email), digits only, left to right in every\n * language. `submitOnCompletion()` submits the form once the last digit is in.\n */\nconst props = defineProps<{ component: OneTimeCodeInputSchema }>()\nconst { value, setValue, blur, error, id, disabled, aria } = useField<string | null>(\n () => props.component,\n)\nconst submitter = new OneTimeCodeSubmitter()\n\nconst onInput = (event: Event) => {\n const input = event.target as HTMLInputElement\n const code = oneTimeCodeDigits(input.value, props.component.length)\n\n // A rejected character leaves the model value unchanged: correct the DOM too.\n if (code !== input.value) input.value = code\n\n setValue(code === '' ? null : code)\n\n // After the state reached the form store, so the submitted values include it.\n if (props.component.submitOnCompletion) {\n const form = input.form\n\n queueMicrotask(() => submitter.update(code, props.component.length, form))\n }\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <Input\n :id=\"id\"\n :name=\"props.component.name\"\n type=\"text\"\n dir=\"ltr\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n pattern=\"[0-9]*\"\n :maxlength=\"props.component.length\"\n :model-value=\"value ?? ''\"\n :placeholder=\"props.component.placeholder\"\n :disabled=\"disabled\"\n :readonly=\"props.component.readOnly\"\n :required=\"props.component.required\"\n :autofocus=\"props.component.autofocus\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n data-slot=\"one-time-code-input\"\n class=\"max-w-56 text-center font-mono text-lg tracking-[0.5em] tabular-nums\"\n v-bind=\"props.component.extraInputAttributes\"\n @input=\"onInput\"\n @blur=\"blur\"\n />\n </FieldWrapper>\n</template>\n"],"mappings":";;;;;;;;;;EAWA,IAAMW,IAAQC,GACR,EAAE,UAAO,aAAU,SAAM,UAAO,OAAI,aAAU,YAASC,QACrDF,EAAM,SACd,GACMG,IAAY,IAAIC,EAAqB,GAErCC,KAAW,MAAiB;GAChC,IAAMC,IAAQC,EAAM,QACdC,IAAOC,EAAkBH,EAAM,OAAON,EAAM,UAAU,MAAM;GAQlE,IALIQ,MAASF,EAAM,UAAO,EAAM,QAAQE,IAExCE,EAASF,MAAS,KAAK,OAAOA,CAAI,GAG9BR,EAAM,UAAU,oBAAoB;IACtC,IAAMW,IAAOL,EAAM;IAEnB,qBAAqBH,EAAU,OAAOK,GAAMR,EAAM,UAAU,QAAQW,CAAI,CAAC;GAC3E;EACF;oBAIEtB,EAAA,GAAAC,EAyBeC,GAAA;GAzBA,OAAOS,EAAM;GAAY,YAAUR,EAAAuB,CAAA;GAAK,OAAOvB,EAAAwB,CAAA;;GAC5D,SAAAvB,QAuBE,CAvBFC,EAuBEC,GAvBFC,EAuBE;IAtBC,IAAIJ,EAAAuB,CAAA;IACJ,MAAMf,EAAM,UAAU;IACvB,MAAK;IACL,KAAI;IACJ,WAAU;IACV,cAAa;IACb,SAAQ;IACP,WAAWA,EAAM,UAAU;IAC3B,eAAaR,EAAA4B,CAAA,KAAK;IAClB,aAAapB,EAAM,UAAU;IAC7B,UAAUR,EAAA6B,CAAA;IACV,UAAUrB,EAAM,UAAU;IAC1B,UAAUA,EAAM,UAAU;IAC1B,WAAWA,EAAM,UAAU;IAC3B,gBAAcR,EAAA8B,CAAA,CAAI,CAAA;IAClB,oBAAkB9B,EAAA8B,CAAA,CAAI,CAAA;IACtB,iBAAe9B,EAAA8B,CAAA,CAAI,CAAA;IACpB,aAAU;IACV,OAAM;GACE,GAAAtB,EAAM,UAAU,sBAAoB;IACpC;IACP,QAAMR,EAAA+B,CAAA"}
1
+ {"version":3,"file":"OneTimeCodeInputField.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","FieldWrapper","_unref","_withCtx","_createVNode","Input","_mergeProps","Input_default","FieldWrapper_default","OneTimeCodeInputField_vue_vue_type_script_setup_true_lang_default","props","__props","useField","submitter","OneTimeCodeSubmitter","onInput","input","event","code","oneTimeCodeDigits","setValue","form","openBlock","createBlock","unref","id","error","withCtx","createVNode","mergeProps","value","disabled","aria","blur"],"sources":["../../../src/components/fields/OneTimeCodeInputField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { OneTimeCodeSubmitter, oneTimeCodeDigits, type OneTimeCodeInputSchema } from '@alfakit/core'\nimport { useField } from '../form/form-context'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport Input from '../ui/Input.vue'\n\n/**\n * `OneTimeCodeInput`: one numeric input with `autocomplete=\"one-time-code\"` (browsers and\n * password managers fill it from an SMS or email), digits only, left to right in every\n * language. `submitOnCompletion()` submits the form once the last digit is in.\n */\nconst props = defineProps<{ component: OneTimeCodeInputSchema }>()\nconst { value, setValue, blur, error, id, disabled, aria } = useField<string | null>(\n () => props.component,\n)\nconst submitter = new OneTimeCodeSubmitter()\n\nconst onInput = (event: Event) => {\n const input = event.target as HTMLInputElement\n const code = oneTimeCodeDigits(input.value, props.component.length)\n\n // A rejected character leaves the model value unchanged: correct the DOM too.\n if (code !== input.value) input.value = code\n\n setValue(code === '' ? null : code)\n\n // After the state reached the form store, so the submitted values include it.\n if (props.component.submitOnCompletion) {\n const form = input.form\n\n queueMicrotask(() => submitter.update(code, props.component.length, form))\n }\n}\n</script>\n\n<template>\n <FieldWrapper :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <Input\n :id=\"id\"\n :name=\"props.component.name\"\n type=\"text\"\n dir=\"ltr\"\n inputmode=\"numeric\"\n autocomplete=\"one-time-code\"\n pattern=\"[0-9]*\"\n :model-value=\"value ?? ''\"\n :placeholder=\"props.component.placeholder\"\n :disabled=\"disabled\"\n :readonly=\"props.component.readOnly\"\n :required=\"props.component.required\"\n :autofocus=\"props.component.autofocus\"\n :aria-invalid=\"aria['aria-invalid']\"\n :aria-describedby=\"aria['aria-describedby']\"\n :aria-required=\"aria['aria-required']\"\n data-slot=\"one-time-code-input\"\n data-input=\"\"\n class=\"max-w-56 text-center font-mono text-lg tracking-[0.5em] tabular-nums\"\n v-bind=\"props.component.extraInputAttributes\"\n @input=\"onInput\"\n @blur=\"blur\"\n />\n </FieldWrapper>\n</template>\n"],"mappings":";;;;;;;;;;EAWA,IAAMW,IAAQC,GACR,EAAE,UAAO,aAAU,SAAM,UAAO,OAAI,aAAU,YAASC,QACrDF,EAAM,SACd,GACMG,IAAY,IAAIC,EAAqB,GAErCC,KAAW,MAAiB;GAChC,IAAMC,IAAQC,EAAM,QACdC,IAAOC,EAAkBH,EAAM,OAAON,EAAM,UAAU,MAAM;GAQlE,IALIQ,MAASF,EAAM,UAAO,EAAM,QAAQE,IAExCE,EAASF,MAAS,KAAK,OAAOA,CAAI,GAG9BR,EAAM,UAAU,oBAAoB;IACtC,IAAMW,IAAOL,EAAM;IAEnB,qBAAqBH,EAAU,OAAOK,GAAMR,EAAM,UAAU,QAAQW,CAAI,CAAC;GAC3E;EACF;oBAIEtB,EAAA,GAAAC,EAyBeC,GAAA;GAzBA,OAAOS,EAAM;GAAY,YAAUR,EAAAuB,CAAA;GAAK,OAAOvB,EAAAwB,CAAA;;GAC5D,SAAAvB,QAuBE,CAvBFC,EAuBEC,GAvBFC,EAuBE;IAtBC,IAAIJ,EAAAuB,CAAA;IACJ,MAAMf,EAAM,UAAU;IACvB,MAAK;IACL,KAAI;IACJ,WAAU;IACV,cAAa;IACb,SAAQ;IACP,eAAaR,EAAA4B,CAAA,KAAK;IAClB,aAAapB,EAAM,UAAU;IAC7B,UAAUR,EAAA6B,CAAA;IACV,UAAUrB,EAAM,UAAU;IAC1B,UAAUA,EAAM,UAAU;IAC1B,WAAWA,EAAM,UAAU;IAC3B,gBAAcR,EAAA8B,CAAA,CAAI,CAAA;IAClB,oBAAkB9B,EAAA8B,CAAA,CAAI,CAAA;IACtB,iBAAe9B,EAAA8B,CAAA,CAAI,CAAA;IACpB,aAAU;IACV,cAAW;IACX,OAAM;GACE,GAAAtB,EAAM,UAAU,sBAAoB;IACpC;IACP,QAAMR,EAAA+B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RepeaterField.js","names":["_sfc_main","RepeaterField_vue_vue_type_script_setup_true_lang_default","RepeaterField_default"],"sources":["../../../src/components/fields/RepeaterField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RepeaterSchema, SchemaComponent } from '@alfakit/core'\nimport {\n isDeferredPlaceholder,\n VIRTUAL_ESTIMATES,\n appendRepeaterItem,\n fieldIds,\n cloneIndexedState,\n cloneRepeaterItem,\n gridColumnsClasses,\n moveIndexedState,\n moveRepeaterItem,\n removeIndexedState,\n removeRepeaterItem,\n reorderedItemKeys,\n replacePlaceholder,\n resolveItemAction,\n virtualizeOptions,\n type ItemActionName,\n} from '@alfakit/core'\nimport { computed, ref } from 'vue'\nimport { useScrollToErroredItem, useVirtualList } from '../../composables/use-virtual-list'\nimport { useFormatter } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport DeferredSchema from '../layout/DeferredSchema.vue'\nimport { useField } from '../form/form-context'\nimport { useFieldActionContext } from '../schema/field-actions'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport AddActionRow from './AddActionRow.vue'\nimport CollapseAllActions from './CollapseAllActions.vue'\nimport ItemActionButton from './ItemActionButton.vue'\nimport ItemHeaderActions from './ItemHeaderActions.vue'\nimport { useItemActionFallbacks, useItemMoves, useRunItemAction } from './item-actions'\nimport RepeaterTable from './RepeaterTable.vue'\n\n/**\n * Items use the per-index schema from the server when available (so closures see item\n * state) and fall back to the template for freshly added items.\n */\nconst props = defineProps<{ component: RepeaterSchema }>()\nconst formatter = useFormatter()\nconst context = useFieldActionContext(() => props.component)\nconst runItemAction = useRunItemAction(context)\nconst fallbacks = useItemActionFallbacks()\nconst resolve = (name: ItemActionName, index?: number) =>\n resolveItemAction(\n name,\n props.component,\n index === undefined ? undefined : props.component.items[index],\n name === 'add' ? { ...fallbacks.add, label: props.component.addActionLabel } : fallbacks[name],\n )\nconst {\n value,\n setValue,\n error,\n id,\n disabled: fieldDisabled,\n readOnly,\n aria,\n} = useField<unknown[] | null>(() => props.component)\n// Read-only shows the items but hides add, delete, clone and reorder controls.\nconst disabled = computed(() => fieldDisabled.value || readOnly.value)\nconst items = computed(() => value.value ?? [])\nconst collapsed = ref<Record<number, boolean>>({})\nconst dragIndex = ref<number | null>(null)\n// Long lists render only the visible items (plus a few around them); a multi-column\n// `grid()` is windowed by whole rows, counting its columns from the rendered grid.\nconst virtual = useVirtualList(\n () => items.value.length,\n () =>\n virtualizeOptions(\n props.component.virtualize,\n VIRTUAL_ESTIMATES.item,\n 12,\n props.component.grid ? 'auto' : 1,\n ),\n)\nuseScrollToErroredItem(virtual, () => props.component.statePath)\n\nconst schemaFor = (index: number): SchemaComponent[] =>\n props.component.items[index]?.schema ??\n replacePlaceholder(props.component.template, '__INDEX__', String(index))\nconst isCollapsed = (index: number) => collapsed.value[index] ?? props.component.collapsed ?? false\n\nconst canAdd = computed(\n () =>\n props.component.addable &&\n !disabled.value &&\n (props.component.maxItems == null || items.value.length < props.component.maxItems),\n)\nconst canDelete = computed(\n () =>\n props.component.deletable &&\n !disabled.value &&\n (props.component.minItems == null || items.value.length > props.component.minItems),\n)\n\n// Collapsed flags are keyed by index, so they move with their item.\nconst moveItem = (from: number, to: number) => {\n setValue(moveRepeaterItem(items.value, from, to))\n collapsed.value = moveIndexedState(collapsed.value, from, to)\n}\n// Move buttons: announced, one at a time, focus kept on the moved item.\nconst moves = useItemMoves(\n value,\n (from, to) => moveItem(from, to),\n (index) => props.component.items[index]?.label,\n () => items.value.length,\n)\nconst moveAnnouncement = moves.announcement\nconst moveContainer = moves.container\nconst removeItem = (index: number) => {\n setValue(removeRepeaterItem(items.value, index))\n collapsed.value = removeIndexedState(collapsed.value, index)\n}\nconst cloneItem = (index: number) => {\n setValue(cloneRepeaterItem(items.value, index))\n collapsed.value = cloneIndexedState(collapsed.value, index)\n}\n\nconst draggable = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithDragAndDrop !== false &&\n !disabled.value &&\n resolve('reorder') !== null,\n)\nconst buttons = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithButtons !== false &&\n !disabled.value,\n)\nconst setAllCollapsed = (value: boolean) => {\n collapsed.value = Object.fromEntries(items.value.map((_, index) => [index, value]))\n}\n\n// A drop runs the reorder action: in the browser, or on the server when customised.\nconst onDrop = (index: number) => {\n const from = dragIndex.value\n dragIndex.value = null\n if (from === null || from === index) return\n runItemAction(\n resolve('reorder'),\n { items: reorderedItemKeys(items.value.length, from, index) },\n () => moveItem(from, index),\n )\n}\n\nconst add = () =>\n setValue(\n appendRepeaterItem(\n items.value,\n props.component.simple\n ? ({ [Object.keys(props.component.templateState)[0] ?? 'value']: null } as Record<\n string,\n unknown\n >)\n : props.component.templateState,\n ),\n )\n</script>\n\n<template>\n <!-- `deferLoading()`: a skeleton until the field scrolls into view. -->\n <DeferredSchema\n v-if=\"isDeferredPlaceholder(props.component)\"\n v-slot=\"{ component: loaded }\"\n :component=\"props.component\"\n >\n <RepeaterField :component=\"loaded\" />\n </DeferredSchema>\n <FieldWrapper v-else :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div ref=\"moveContainer\" class=\"flex flex-col gap-3\">\n <span aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\" data-slot=\"item-move-status\">{{\n moveAnnouncement\n }}</span>\n <RepeaterTable\n v-if=\"props.component.table?.length && !props.component.simple\"\n :id=\"id\"\n :columns=\"props.component.table\"\n :compact=\"props.component.compact\"\n :count=\"items.length\"\n :prefix-for=\"(index: number) => `${props.component.statePath}.${index}.`\"\n :schema-for=\"schemaFor\"\n :labelled-by=\"props.component.label ? fieldIds(id).label : undefined\"\n :described-by=\"aria['aria-describedby']\"\n :reorderable=\"buttons\"\n :cloneable=\"Boolean(props.component.cloneable) && canAdd\"\n :deletable=\"canDelete\"\n :virtual=\"virtual\"\n :context=\"context\"\n :resolve=\"resolve\"\n :extra-actions-for=\"(index: number) => props.component.items[index]?.actions\"\n @move=\"moveItem\"\n @clone=\"cloneItem\"\n @remove=\"removeItem\"\n />\n <CollapseAllActions\n v-if=\"\n !(props.component.table?.length && !props.component.simple) &&\n props.component.collapsible &&\n !props.component.simple &&\n items.length > 0\n \"\n :context=\"context\"\n :collapse-all=\"resolve('collapseAll')\"\n :expand-all=\"resolve('expandAll')\"\n @collapse-all=\"setAllCollapsed(true)\"\n @expand-all=\"setAllCollapsed(false)\"\n />\n <ul\n v-if=\"!(props.component.table?.length && !props.component.simple)\"\n :id=\"id\"\n :ref=\"virtual.attach\"\n :aria-labelledby=\"props.component.label ? fieldIds(id).label : undefined\"\n :aria-describedby=\"aria['aria-describedby']\"\n :style=\"virtual.style.value\"\n :class=\"cn('grid gap-3', props.component.grid && gridColumnsClasses(props.component.grid))\"\n >\n <li\n v-for=\"index in virtual.indexes.value\"\n :key=\"index\"\n :ref=\"virtual.item\"\n :data-index=\"index\"\n :aria-setsize=\"virtual.range.value.active ? items.length : undefined\"\n :aria-posinset=\"virtual.range.value.active ? index + 1 : undefined\"\n :draggable=\"draggable\"\n :class=\"\n cn(\n 'bg-card min-w-0 rounded-lg border shadow-xs',\n dragIndex === index && 'opacity-50',\n props.component.simple && 'border-0 shadow-none',\n )\n \"\n @dragstart=\"dragIndex = index\"\n @dragover=\"draggable && $event.preventDefault()\"\n @drop=\"onDrop(index)\"\n @dragend=\"dragIndex = null\"\n >\n <Collapsible :open=\"!isCollapsed(index)\">\n <div\n v-if=\"!props.component.simple\"\n class=\"flex flex-wrap items-center gap-1 border-b px-2 py-1.5\"\n data-slot=\"item-header\"\n >\n <span\n v-if=\"draggable\"\n class=\"text-muted-foreground cursor-grab\"\n :title=\"resolve('reorder')?.label ?? undefined\"\n aria-hidden=\"true\"\n ><Icon :name=\"resolve('reorder')?.icon ?? 'grip-vertical'\"\n /></span>\n <span\n v-if=\"props.component.itemNumbers\"\n class=\"text-muted-foreground text-xs tabular-nums\"\n >{{ formatter.number(index + 1) }}</span\n >\n <span\n v-if=\"props.component.items[index]?.label\"\n dir=\"auto\"\n class=\"min-w-0 truncate text-sm font-medium\"\n >{{ props.component.items[index]?.label }}</span\n >\n <span class=\"flex-1\" />\n <ItemHeaderActions\n :context=\"context\"\n :item-key=\"String(index)\"\n :index=\"index\"\n :count=\"items.length\"\n :resolve=\"(name: ItemActionName) => resolve(name, index)\"\n :extra-actions=\"disabled ? undefined : props.component.items[index]?.actions\"\n :buttons=\"buttons\"\n :can-clone=\"Boolean(props.component.cloneable) && canAdd\"\n :can-delete=\"canDelete\"\n :collapsible=\"Boolean(props.component.collapsible)\"\n :collapsed=\"isCollapsed(index)\"\n @move=\"moves.moveWithButton\"\n @clone=\"cloneItem(index)\"\n @delete=\"removeItem(index)\"\n @toggle=\"collapsed = { ...collapsed, [index]: !isCollapsed(index) }\"\n />\n </div>\n <CollapsibleContent>\n <div :class=\"cn('flex gap-2', props.component.simple ? 'items-start' : 'p-4')\">\n <div class=\"flex-1\">\n <SchemaRenderer\n :components=\"schemaFor(index)\"\n :columns=\"\n props.component.simple\n ? { default: 1 }\n : (props.component.columns ?? { default: 1, lg: 2 })\n \"\n :class=\"\n cn(\n props.component.simple && 'gap-0',\n '[&_[data-slot=field]_[data-slot=label]]:hidden',\n !props.component.simple && '[&_[data-slot=field]_[data-slot=label]]:flex',\n )\n \"\n />\n </div>\n <ItemActionButton\n v-if=\"props.component.simple && canDelete\"\n :action=\"resolve('delete', index)\"\n :context=\"context\"\n :args=\"{ item: String(index) }\"\n size=\"default\"\n class=\"text-muted-foreground\"\n @client=\"removeItem(index)\"\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </li>\n </ul>\n <AddActionRow v-if=\"canAdd\" :alignment=\"props.component.addActionAlignment\">\n <ItemActionButton :action=\"resolve('add')\" :context=\"context\" size=\"sm\" @client=\"add\" />\n </AddActionRow>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RepeaterField.js","names":["_sfc_main","RepeaterField_vue_vue_type_script_setup_true_lang_default","RepeaterField_default"],"sources":["../../../src/components/fields/RepeaterField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RepeaterSchema, SchemaComponent } from '@alfakit/core'\nimport {\n isDeferredPlaceholder,\n VIRTUAL_ESTIMATES,\n appendRepeaterItem,\n fieldIds,\n cloneIndexedState,\n cloneRepeaterItem,\n gridColumnsClasses,\n moveIndexedState,\n moveRepeaterItem,\n removeIndexedState,\n removeRepeaterItem,\n reorderedItemKeys,\n templateForIndex,\n resolveItemAction,\n virtualizeOptions,\n type ItemActionName,\n} from '@alfakit/core'\nimport { computed, ref } from 'vue'\nimport { useScrollToErroredItem, useVirtualList } from '../../composables/use-virtual-list'\nimport { useFormatter } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport DeferredSchema from '../layout/DeferredSchema.vue'\nimport { useField } from '../form/form-context'\nimport { useFieldActionContext } from '../schema/field-actions'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport AddActionRow from './AddActionRow.vue'\nimport CollapseAllActions from './CollapseAllActions.vue'\nimport ItemActionButton from './ItemActionButton.vue'\nimport ItemHeaderActions from './ItemHeaderActions.vue'\nimport { useItemActionFallbacks, useItemMoves, useRunItemAction } from './item-actions'\nimport RepeaterTable from './RepeaterTable.vue'\n\n/**\n * Items use the per-index schema from the server when available (so closures see item\n * state) and fall back to the template for freshly added items.\n */\nconst props = defineProps<{ component: RepeaterSchema }>()\nconst formatter = useFormatter()\nconst context = useFieldActionContext(() => props.component)\nconst runItemAction = useRunItemAction(context)\nconst fallbacks = useItemActionFallbacks()\nconst resolve = (name: ItemActionName, index?: number) =>\n resolveItemAction(\n name,\n props.component,\n index === undefined ? undefined : props.component.items[index],\n name === 'add' ? { ...fallbacks.add, label: props.component.addActionLabel } : fallbacks[name],\n )\nconst {\n value,\n setValue,\n error,\n id,\n disabled: fieldDisabled,\n readOnly,\n aria,\n} = useField<unknown[] | null>(() => props.component)\n// Read-only shows the items but hides add, delete, clone and reorder controls.\nconst disabled = computed(() => fieldDisabled.value || readOnly.value)\nconst items = computed(() => value.value ?? [])\nconst collapsed = ref<Record<number, boolean>>({})\nconst dragIndex = ref<number | null>(null)\n// Long lists render only the visible items (plus a few around them); a multi-column\n// `grid()` is windowed by whole rows, counting its columns from the rendered grid.\nconst virtual = useVirtualList(\n () => items.value.length,\n () =>\n virtualizeOptions(\n props.component.virtualize,\n VIRTUAL_ESTIMATES.item,\n 12,\n props.component.grid ? 'auto' : 1,\n ),\n)\nuseScrollToErroredItem(virtual, () => props.component.statePath)\n\nconst schemaFor = (index: number): SchemaComponent[] =>\n props.component.items[index]?.schema ?? templateForIndex(props.component.template, index)\nconst isCollapsed = (index: number) => collapsed.value[index] ?? props.component.collapsed ?? false\n\nconst canAdd = computed(\n () =>\n props.component.addable &&\n !disabled.value &&\n (props.component.maxItems == null || items.value.length < props.component.maxItems),\n)\nconst canDelete = computed(\n () =>\n props.component.deletable &&\n !disabled.value &&\n (props.component.minItems == null || items.value.length > props.component.minItems),\n)\n\n// Collapsed flags are keyed by index, so they move with their item.\nconst moveItem = (from: number, to: number) => {\n setValue(moveRepeaterItem(items.value, from, to))\n collapsed.value = moveIndexedState(collapsed.value, from, to)\n}\n// Move buttons: announced, one at a time, focus kept on the moved item.\nconst moves = useItemMoves(\n value,\n (from, to) => moveItem(from, to),\n (index) => props.component.items[index]?.label,\n () => items.value.length,\n)\nconst moveAnnouncement = moves.announcement\nconst moveContainer = moves.container\nconst removeItem = (index: number) => {\n setValue(removeRepeaterItem(items.value, index))\n collapsed.value = removeIndexedState(collapsed.value, index)\n}\nconst cloneItem = (index: number) => {\n setValue(cloneRepeaterItem(items.value, index))\n collapsed.value = cloneIndexedState(collapsed.value, index)\n}\n\nconst draggable = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithDragAndDrop !== false &&\n !disabled.value &&\n resolve('reorder') !== null,\n)\nconst buttons = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithButtons !== false &&\n !disabled.value,\n)\nconst setAllCollapsed = (value: boolean) => {\n collapsed.value = Object.fromEntries(items.value.map((_, index) => [index, value]))\n}\n\n// A drop runs the reorder action: in the browser, or on the server when customised.\nconst onDrop = (index: number) => {\n const from = dragIndex.value\n dragIndex.value = null\n if (from === null || from === index) return\n runItemAction(\n resolve('reorder'),\n { items: reorderedItemKeys(items.value.length, from, index) },\n () => moveItem(from, index),\n )\n}\n\nconst add = () =>\n setValue(\n appendRepeaterItem(\n items.value,\n props.component.simple\n ? ({ [Object.keys(props.component.templateState)[0] ?? 'value']: null } as Record<\n string,\n unknown\n >)\n : props.component.templateState,\n ),\n )\n</script>\n\n<template>\n <!-- `deferLoading()`: a skeleton until the field scrolls into view. -->\n <DeferredSchema\n v-if=\"isDeferredPlaceholder(props.component)\"\n v-slot=\"{ component: loaded }\"\n :component=\"props.component\"\n >\n <RepeaterField :component=\"loaded\" />\n </DeferredSchema>\n <FieldWrapper v-else :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div ref=\"moveContainer\" class=\"flex flex-col gap-3\">\n <span aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\" data-slot=\"item-move-status\">{{\n moveAnnouncement\n }}</span>\n <RepeaterTable\n v-if=\"props.component.table?.length && !props.component.simple\"\n :id=\"id\"\n :columns=\"props.component.table\"\n :compact=\"props.component.compact\"\n :count=\"items.length\"\n :prefix-for=\"(index: number) => `${props.component.statePath}.${index}.`\"\n :schema-for=\"schemaFor\"\n :labelled-by=\"props.component.label ? fieldIds(id).label : undefined\"\n :described-by=\"aria['aria-describedby']\"\n :reorderable=\"buttons\"\n :cloneable=\"Boolean(props.component.cloneable) && canAdd\"\n :deletable=\"canDelete\"\n :virtual=\"virtual\"\n :context=\"context\"\n :resolve=\"resolve\"\n :extra-actions-for=\"(index: number) => props.component.items[index]?.actions\"\n @move=\"moveItem\"\n @clone=\"cloneItem\"\n @remove=\"removeItem\"\n />\n <CollapseAllActions\n v-if=\"\n !(props.component.table?.length && !props.component.simple) &&\n props.component.collapsible &&\n !props.component.simple &&\n items.length > 0\n \"\n :context=\"context\"\n :collapse-all=\"resolve('collapseAll')\"\n :expand-all=\"resolve('expandAll')\"\n @collapse-all=\"setAllCollapsed(true)\"\n @expand-all=\"setAllCollapsed(false)\"\n />\n <ul\n v-if=\"!(props.component.table?.length && !props.component.simple)\"\n :id=\"id\"\n :ref=\"virtual.attach\"\n :aria-labelledby=\"props.component.label ? fieldIds(id).label : undefined\"\n :aria-describedby=\"aria['aria-describedby']\"\n :style=\"virtual.style.value\"\n :class=\"cn('grid gap-3', props.component.grid && gridColumnsClasses(props.component.grid))\"\n >\n <li\n v-for=\"index in virtual.indexes.value\"\n :key=\"index\"\n :ref=\"virtual.item\"\n :data-index=\"index\"\n :aria-setsize=\"virtual.range.value.active ? items.length : undefined\"\n :aria-posinset=\"virtual.range.value.active ? index + 1 : undefined\"\n :draggable=\"draggable\"\n :class=\"\n cn(\n 'bg-card min-w-0 rounded-lg border shadow-xs',\n dragIndex === index && 'opacity-50',\n props.component.simple && 'border-0 shadow-none',\n )\n \"\n @dragstart=\"dragIndex = index\"\n @dragover=\"draggable && $event.preventDefault()\"\n @drop=\"onDrop(index)\"\n @dragend=\"dragIndex = null\"\n >\n <Collapsible :open=\"!isCollapsed(index)\">\n <div\n v-if=\"!props.component.simple\"\n class=\"flex flex-wrap items-center gap-1 border-b px-2 py-1.5\"\n data-slot=\"item-header\"\n >\n <span\n v-if=\"draggable\"\n class=\"text-muted-foreground cursor-grab\"\n :title=\"resolve('reorder')?.label ?? undefined\"\n aria-hidden=\"true\"\n ><Icon :name=\"resolve('reorder')?.icon ?? 'grip-vertical'\"\n /></span>\n <span\n v-if=\"props.component.itemNumbers\"\n class=\"text-muted-foreground text-xs tabular-nums\"\n >{{ formatter.number(index + 1) }}</span\n >\n <span\n v-if=\"props.component.items[index]?.label\"\n dir=\"auto\"\n class=\"min-w-0 truncate text-sm font-medium\"\n >{{ props.component.items[index]?.label }}</span\n >\n <span class=\"flex-1\" />\n <ItemHeaderActions\n :context=\"context\"\n :item-key=\"String(index)\"\n :index=\"index\"\n :count=\"items.length\"\n :resolve=\"(name: ItemActionName) => resolve(name, index)\"\n :extra-actions=\"disabled ? undefined : props.component.items[index]?.actions\"\n :buttons=\"buttons\"\n :can-clone=\"Boolean(props.component.cloneable) && canAdd\"\n :can-delete=\"canDelete\"\n :collapsible=\"Boolean(props.component.collapsible)\"\n :collapsed=\"isCollapsed(index)\"\n @move=\"moves.moveWithButton\"\n @clone=\"cloneItem(index)\"\n @delete=\"removeItem(index)\"\n @toggle=\"collapsed = { ...collapsed, [index]: !isCollapsed(index) }\"\n />\n </div>\n <CollapsibleContent>\n <div :class=\"cn('flex gap-2', props.component.simple ? 'items-start' : 'p-4')\">\n <div class=\"flex-1\">\n <SchemaRenderer\n :components=\"schemaFor(index)\"\n :columns=\"\n props.component.simple\n ? { default: 1 }\n : (props.component.columns ?? { default: 1, lg: 2 })\n \"\n :class=\"\n cn(\n props.component.simple && 'gap-0',\n '[&_[data-slot=field]_[data-slot=label]]:hidden',\n !props.component.simple && '[&_[data-slot=field]_[data-slot=label]]:flex',\n )\n \"\n />\n </div>\n <ItemActionButton\n v-if=\"props.component.simple && canDelete\"\n :action=\"resolve('delete', index)\"\n :context=\"context\"\n :args=\"{ item: String(index) }\"\n size=\"default\"\n class=\"text-muted-foreground\"\n @client=\"removeItem(index)\"\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </li>\n </ul>\n <AddActionRow v-if=\"canAdd\" :alignment=\"props.component.addActionAlignment\">\n <ItemActionButton :action=\"resolve('add')\" :context=\"context\" size=\"sm\" @client=\"add\" />\n </AddActionRow>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"RepeaterField.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/RepeaterField.vue"],"names":[],"mappings":"AAwUA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAA;AAsCpE;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,cAAc,CAAA;CAAE,CAAC;;AAgoBjD,wBAMG"}
1
+ {"version":3,"file":"RepeaterField.vue.d.ts","sourceRoot":"","sources":["../../../src/components/fields/RepeaterField.vue"],"names":[],"mappings":"AAuUA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAA;AAsCpE;;;GAGG;AACH,KAAK,WAAW,GAAG;IAAE,SAAS,EAAE,cAAc,CAAA;CAAE,CAAC;;AA+nBjD,wBAMG"}
@@ -4,18 +4,18 @@ import n from "../../lib/Icon.js";
4
4
  import { useField as r } from "../form/form-context.js";
5
5
  import ee from "../schema/SchemaRenderer.js";
6
6
  import { useScrollToErroredItem as i, useVirtualList as te } from "../../composables/use-virtual-list.js";
7
- import ne from "../ui/Collapsible.js";
8
- import re from "../ui/CollapsibleContent.js";
9
- import { useFieldActionContext as ie } from "../schema/field-actions.js";
10
- import ae from "../layout/DeferredSchema.js";
11
- import oe from "../schema/FieldWrapper.js";
7
+ import { useFieldActionContext as ne } from "../schema/field-actions.js";
8
+ import re from "../layout/DeferredSchema.js";
9
+ import ie from "../schema/FieldWrapper.js";
10
+ import ae from "../ui/Collapsible.js";
11
+ import oe from "../ui/CollapsibleContent.js";
12
12
  import se from "./AddActionRow.js";
13
13
  import a from "./ItemActionButton.js";
14
14
  import ce from "./CollapseAllActions.js";
15
15
  import le from "./ItemHeaderActions.js";
16
16
  import { useItemActionFallbacks as o, useItemMoves as s, useRunItemAction as c } from "./item-actions.js";
17
17
  import l from "./RepeaterTable.js";
18
- import { VIRTUAL_ESTIMATES as u, appendRepeaterItem as ue, cloneIndexedState as de, cloneRepeaterItem as fe, fieldIds as d, gridColumnsClasses as pe, isDeferredPlaceholder as me, moveIndexedState as he, moveRepeaterItem as ge, removeIndexedState as _e, removeRepeaterItem as ve, reorderedItemKeys as ye, replacePlaceholder as be, resolveItemAction as xe, virtualizeOptions as Se } from "@alfakit/core";
18
+ import { VIRTUAL_ESTIMATES as u, appendRepeaterItem as ue, cloneIndexedState as de, cloneRepeaterItem as fe, fieldIds as d, gridColumnsClasses as pe, isDeferredPlaceholder as me, moveIndexedState as he, moveRepeaterItem as ge, removeIndexedState as _e, removeRepeaterItem as ve, reorderedItemKeys as ye, resolveItemAction as be, templateForIndex as xe, virtualizeOptions as Se } from "@alfakit/core";
19
19
  import { Fragment as Ce, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createVNode as _, defineComponent as v, normalizeClass as y, normalizeStyle as we, openBlock as b, ref as x, renderList as S, resolveComponent as C, toDisplayString as w, unref as T, withCtx as E } from "vue";
20
20
  //#region src/components/fields/RepeaterField.vue?vue&type=script&setup=true&lang.ts
21
21
  var D = {
@@ -49,12 +49,12 @@ var D = {
49
49
  __name: "RepeaterField",
50
50
  props: { component: {} },
51
51
  setup(v) {
52
- let A = v, Ae = e(), j = ie(() => A.component), je = c(j), M = o(), N = (e, t) => xe(e, A.component, t === void 0 ? void 0 : A.component.items[t], e === "add" ? {
52
+ let A = v, Ae = e(), j = ne(() => A.component), je = c(j), M = o(), N = (e, t) => be(e, A.component, t === void 0 ? void 0 : A.component.items[t], e === "add" ? {
53
53
  ...M.add,
54
54
  label: A.component.addActionLabel
55
55
  } : M[e]), { value: P, setValue: F, error: Me, id: I, disabled: Ne, readOnly: Pe, aria: L } = r(() => A.component), R = f(() => Ne.value || Pe.value), z = f(() => P.value ?? []), B = x({}), V = x(null), H = te(() => z.value.length, () => Se(A.component.virtualize, u.item, 12, A.component.grid ? "auto" : 1));
56
56
  i(H, () => A.component.statePath);
57
- let U = (e) => A.component.items[e]?.schema ?? be(A.component.template, "__INDEX__", String(e)), W = (e) => B.value[e] ?? A.component.collapsed ?? !1, G = f(() => A.component.addable && !R.value && (A.component.maxItems == null || z.value.length < A.component.maxItems)), K = f(() => A.component.deletable && !R.value && (A.component.minItems == null || z.value.length > A.component.minItems)), q = (e, t) => {
57
+ let U = (e) => A.component.items[e]?.schema ?? xe(A.component.template, e), W = (e) => B.value[e] ?? A.component.collapsed ?? !1, G = f(() => A.component.addable && !R.value && (A.component.maxItems == null || z.value.length < A.component.maxItems)), K = f(() => A.component.deletable && !R.value && (A.component.minItems == null || z.value.length > A.component.minItems)), q = (e, t) => {
58
58
  F(ge(z.value, e, t)), B.value = he(B.value, e, t);
59
59
  }, J = s(P, (e, t) => q(e, t), (e) => A.component.items[e]?.label, () => z.value.length), Fe = J.announcement, Ie = J.container, Y = (e) => {
60
60
  F(ve(z.value, e)), B.value = _e(B.value, e);
@@ -68,13 +68,13 @@ var D = {
68
68
  }, Re = () => F(ue(z.value, A.component.simple ? { [Object.keys(A.component.templateState)[0] ?? "value"]: null } : A.component.templateState));
69
69
  return (e, r) => {
70
70
  let i = C("RepeaterField", !0);
71
- return T(me)(A.component) ? (b(), p(ae, {
71
+ return T(me)(A.component) ? (b(), p(re, {
72
72
  key: 0,
73
73
  component: A.component
74
74
  }, {
75
75
  default: E(({ component: e }) => [_(i, { component: e }, null, 8, ["component"])]),
76
76
  _: 1
77
- }, 8, ["component"])) : (b(), p(oe, {
77
+ }, 8, ["component"])) : (b(), p(ie, {
78
78
  key: 1,
79
79
  field: A.component,
80
80
  "html-for": T(I),
@@ -154,7 +154,7 @@ var D = {
154
154
  onDragover: r[2] ||= (e) => Z.value && e.preventDefault(),
155
155
  onDrop: (t) => Le(e),
156
156
  onDragend: r[3] ||= (e) => V.value = null
157
- }, [_(ne, { open: !W(e) }, {
157
+ }, [_(ae, { open: !W(e) }, {
158
158
  default: E(() => [A.component.simple ? m("", !0) : (b(), h("div", Te, [
159
159
  Z.value ? (b(), h("span", {
160
160
  key: 0,
@@ -201,7 +201,7 @@ var D = {
201
201
  "onDelete",
202
202
  "onToggle"
203
203
  ])
204
- ])), _(re, null, {
204
+ ])), _(oe, null, {
205
205
  default: E(() => [g("div", { class: y(T(t)("flex gap-2", A.component.simple ? "items-start" : "p-4")) }, [g("div", ke, [_(ee, {
206
206
  components: U(e),
207
207
  columns: A.component.simple ? { default: 1 } : A.component.columns ?? {
@@ -1 +1 @@
1
- {"version":3,"file":"RepeaterField.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_unref","_openBlock","_createBlock","DeferredSchema","_withCtx","_createVNode","FieldWrapper","_createElementVNode","_toDisplayString","RepeaterTable","_createCommentVNode","CollapseAllActions","_createElementBlock","_normalizeStyle","_normalizeClass","_Fragment","_renderList","Collapsible","Icon","ItemHeaderActions","CollapsibleContent","SchemaRenderer","ItemActionButton","AddActionRow","Icon_default","SchemaRenderer_default","Collapsible_default","CollapsibleContent_default","DeferredSchema_default","FieldWrapper_default","AddActionRow_default","ItemActionButton_default","CollapseAllActions_default","ItemHeaderActions_default","RepeaterTable_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","RepeaterField_vue_vue_type_script_setup_true_lang_default","props","__props","formatter","useFormatter","context","useFieldActionContext","runItemAction","useRunItemAction","fallbacks","useItemActionFallbacks","resolve","resolveItemAction","name","index","fieldDisabled","useField","disabled","computed","readOnly","items","value","collapsed","ref","dragIndex","virtual","useVirtualList","virtualizeOptions","VIRTUAL_ESTIMATES","schemaFor","replacePlaceholder","isCollapsed","canAdd","canDelete","moveItem","setValue","moveRepeaterItem","from","to","moveIndexedState","moves","useItemMoves","moveAnnouncement","moveContainer","removeItem","removeRepeaterItem","removeIndexedState","cloneItem","cloneRepeaterItem","cloneIndexedState","draggable","buttons","setAllCollapsed","onDrop","reorderedItemKeys","add","appendRepeaterItem","_component_RepeaterField","resolveComponent","unref","isDeferredPlaceholder","openBlock","createBlock","withCtx","loaded","createVNode","id","error","createElementVNode","toDisplayString","fieldIds","aria","createCommentVNode","_cache","createElementBlock","normalizeStyle","normalizeClass","cn","gridColumnsClasses","Fragment","renderList","$event"],"sources":["../../../src/components/fields/RepeaterField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RepeaterSchema, SchemaComponent } from '@alfakit/core'\nimport {\n isDeferredPlaceholder,\n VIRTUAL_ESTIMATES,\n appendRepeaterItem,\n fieldIds,\n cloneIndexedState,\n cloneRepeaterItem,\n gridColumnsClasses,\n moveIndexedState,\n moveRepeaterItem,\n removeIndexedState,\n removeRepeaterItem,\n reorderedItemKeys,\n replacePlaceholder,\n resolveItemAction,\n virtualizeOptions,\n type ItemActionName,\n} from '@alfakit/core'\nimport { computed, ref } from 'vue'\nimport { useScrollToErroredItem, useVirtualList } from '../../composables/use-virtual-list'\nimport { useFormatter } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport DeferredSchema from '../layout/DeferredSchema.vue'\nimport { useField } from '../form/form-context'\nimport { useFieldActionContext } from '../schema/field-actions'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport AddActionRow from './AddActionRow.vue'\nimport CollapseAllActions from './CollapseAllActions.vue'\nimport ItemActionButton from './ItemActionButton.vue'\nimport ItemHeaderActions from './ItemHeaderActions.vue'\nimport { useItemActionFallbacks, useItemMoves, useRunItemAction } from './item-actions'\nimport RepeaterTable from './RepeaterTable.vue'\n\n/**\n * Items use the per-index schema from the server when available (so closures see item\n * state) and fall back to the template for freshly added items.\n */\nconst props = defineProps<{ component: RepeaterSchema }>()\nconst formatter = useFormatter()\nconst context = useFieldActionContext(() => props.component)\nconst runItemAction = useRunItemAction(context)\nconst fallbacks = useItemActionFallbacks()\nconst resolve = (name: ItemActionName, index?: number) =>\n resolveItemAction(\n name,\n props.component,\n index === undefined ? undefined : props.component.items[index],\n name === 'add' ? { ...fallbacks.add, label: props.component.addActionLabel } : fallbacks[name],\n )\nconst {\n value,\n setValue,\n error,\n id,\n disabled: fieldDisabled,\n readOnly,\n aria,\n} = useField<unknown[] | null>(() => props.component)\n// Read-only shows the items but hides add, delete, clone and reorder controls.\nconst disabled = computed(() => fieldDisabled.value || readOnly.value)\nconst items = computed(() => value.value ?? [])\nconst collapsed = ref<Record<number, boolean>>({})\nconst dragIndex = ref<number | null>(null)\n// Long lists render only the visible items (plus a few around them); a multi-column\n// `grid()` is windowed by whole rows, counting its columns from the rendered grid.\nconst virtual = useVirtualList(\n () => items.value.length,\n () =>\n virtualizeOptions(\n props.component.virtualize,\n VIRTUAL_ESTIMATES.item,\n 12,\n props.component.grid ? 'auto' : 1,\n ),\n)\nuseScrollToErroredItem(virtual, () => props.component.statePath)\n\nconst schemaFor = (index: number): SchemaComponent[] =>\n props.component.items[index]?.schema ??\n replacePlaceholder(props.component.template, '__INDEX__', String(index))\nconst isCollapsed = (index: number) => collapsed.value[index] ?? props.component.collapsed ?? false\n\nconst canAdd = computed(\n () =>\n props.component.addable &&\n !disabled.value &&\n (props.component.maxItems == null || items.value.length < props.component.maxItems),\n)\nconst canDelete = computed(\n () =>\n props.component.deletable &&\n !disabled.value &&\n (props.component.minItems == null || items.value.length > props.component.minItems),\n)\n\n// Collapsed flags are keyed by index, so they move with their item.\nconst moveItem = (from: number, to: number) => {\n setValue(moveRepeaterItem(items.value, from, to))\n collapsed.value = moveIndexedState(collapsed.value, from, to)\n}\n// Move buttons: announced, one at a time, focus kept on the moved item.\nconst moves = useItemMoves(\n value,\n (from, to) => moveItem(from, to),\n (index) => props.component.items[index]?.label,\n () => items.value.length,\n)\nconst moveAnnouncement = moves.announcement\nconst moveContainer = moves.container\nconst removeItem = (index: number) => {\n setValue(removeRepeaterItem(items.value, index))\n collapsed.value = removeIndexedState(collapsed.value, index)\n}\nconst cloneItem = (index: number) => {\n setValue(cloneRepeaterItem(items.value, index))\n collapsed.value = cloneIndexedState(collapsed.value, index)\n}\n\nconst draggable = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithDragAndDrop !== false &&\n !disabled.value &&\n resolve('reorder') !== null,\n)\nconst buttons = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithButtons !== false &&\n !disabled.value,\n)\nconst setAllCollapsed = (value: boolean) => {\n collapsed.value = Object.fromEntries(items.value.map((_, index) => [index, value]))\n}\n\n// A drop runs the reorder action: in the browser, or on the server when customised.\nconst onDrop = (index: number) => {\n const from = dragIndex.value\n dragIndex.value = null\n if (from === null || from === index) return\n runItemAction(\n resolve('reorder'),\n { items: reorderedItemKeys(items.value.length, from, index) },\n () => moveItem(from, index),\n )\n}\n\nconst add = () =>\n setValue(\n appendRepeaterItem(\n items.value,\n props.component.simple\n ? ({ [Object.keys(props.component.templateState)[0] ?? 'value']: null } as Record<\n string,\n unknown\n >)\n : props.component.templateState,\n ),\n )\n</script>\n\n<template>\n <!-- `deferLoading()`: a skeleton until the field scrolls into view. -->\n <DeferredSchema\n v-if=\"isDeferredPlaceholder(props.component)\"\n v-slot=\"{ component: loaded }\"\n :component=\"props.component\"\n >\n <RepeaterField :component=\"loaded\" />\n </DeferredSchema>\n <FieldWrapper v-else :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div ref=\"moveContainer\" class=\"flex flex-col gap-3\">\n <span aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\" data-slot=\"item-move-status\">{{\n moveAnnouncement\n }}</span>\n <RepeaterTable\n v-if=\"props.component.table?.length && !props.component.simple\"\n :id=\"id\"\n :columns=\"props.component.table\"\n :compact=\"props.component.compact\"\n :count=\"items.length\"\n :prefix-for=\"(index: number) => `${props.component.statePath}.${index}.`\"\n :schema-for=\"schemaFor\"\n :labelled-by=\"props.component.label ? fieldIds(id).label : undefined\"\n :described-by=\"aria['aria-describedby']\"\n :reorderable=\"buttons\"\n :cloneable=\"Boolean(props.component.cloneable) && canAdd\"\n :deletable=\"canDelete\"\n :virtual=\"virtual\"\n :context=\"context\"\n :resolve=\"resolve\"\n :extra-actions-for=\"(index: number) => props.component.items[index]?.actions\"\n @move=\"moveItem\"\n @clone=\"cloneItem\"\n @remove=\"removeItem\"\n />\n <CollapseAllActions\n v-if=\"\n !(props.component.table?.length && !props.component.simple) &&\n props.component.collapsible &&\n !props.component.simple &&\n items.length > 0\n \"\n :context=\"context\"\n :collapse-all=\"resolve('collapseAll')\"\n :expand-all=\"resolve('expandAll')\"\n @collapse-all=\"setAllCollapsed(true)\"\n @expand-all=\"setAllCollapsed(false)\"\n />\n <ul\n v-if=\"!(props.component.table?.length && !props.component.simple)\"\n :id=\"id\"\n :ref=\"virtual.attach\"\n :aria-labelledby=\"props.component.label ? fieldIds(id).label : undefined\"\n :aria-describedby=\"aria['aria-describedby']\"\n :style=\"virtual.style.value\"\n :class=\"cn('grid gap-3', props.component.grid && gridColumnsClasses(props.component.grid))\"\n >\n <li\n v-for=\"index in virtual.indexes.value\"\n :key=\"index\"\n :ref=\"virtual.item\"\n :data-index=\"index\"\n :aria-setsize=\"virtual.range.value.active ? items.length : undefined\"\n :aria-posinset=\"virtual.range.value.active ? index + 1 : undefined\"\n :draggable=\"draggable\"\n :class=\"\n cn(\n 'bg-card min-w-0 rounded-lg border shadow-xs',\n dragIndex === index && 'opacity-50',\n props.component.simple && 'border-0 shadow-none',\n )\n \"\n @dragstart=\"dragIndex = index\"\n @dragover=\"draggable && $event.preventDefault()\"\n @drop=\"onDrop(index)\"\n @dragend=\"dragIndex = null\"\n >\n <Collapsible :open=\"!isCollapsed(index)\">\n <div\n v-if=\"!props.component.simple\"\n class=\"flex flex-wrap items-center gap-1 border-b px-2 py-1.5\"\n data-slot=\"item-header\"\n >\n <span\n v-if=\"draggable\"\n class=\"text-muted-foreground cursor-grab\"\n :title=\"resolve('reorder')?.label ?? undefined\"\n aria-hidden=\"true\"\n ><Icon :name=\"resolve('reorder')?.icon ?? 'grip-vertical'\"\n /></span>\n <span\n v-if=\"props.component.itemNumbers\"\n class=\"text-muted-foreground text-xs tabular-nums\"\n >{{ formatter.number(index + 1) }}</span\n >\n <span\n v-if=\"props.component.items[index]?.label\"\n dir=\"auto\"\n class=\"min-w-0 truncate text-sm font-medium\"\n >{{ props.component.items[index]?.label }}</span\n >\n <span class=\"flex-1\" />\n <ItemHeaderActions\n :context=\"context\"\n :item-key=\"String(index)\"\n :index=\"index\"\n :count=\"items.length\"\n :resolve=\"(name: ItemActionName) => resolve(name, index)\"\n :extra-actions=\"disabled ? undefined : props.component.items[index]?.actions\"\n :buttons=\"buttons\"\n :can-clone=\"Boolean(props.component.cloneable) && canAdd\"\n :can-delete=\"canDelete\"\n :collapsible=\"Boolean(props.component.collapsible)\"\n :collapsed=\"isCollapsed(index)\"\n @move=\"moves.moveWithButton\"\n @clone=\"cloneItem(index)\"\n @delete=\"removeItem(index)\"\n @toggle=\"collapsed = { ...collapsed, [index]: !isCollapsed(index) }\"\n />\n </div>\n <CollapsibleContent>\n <div :class=\"cn('flex gap-2', props.component.simple ? 'items-start' : 'p-4')\">\n <div class=\"flex-1\">\n <SchemaRenderer\n :components=\"schemaFor(index)\"\n :columns=\"\n props.component.simple\n ? { default: 1 }\n : (props.component.columns ?? { default: 1, lg: 2 })\n \"\n :class=\"\n cn(\n props.component.simple && 'gap-0',\n '[&_[data-slot=field]_[data-slot=label]]:hidden',\n !props.component.simple && '[&_[data-slot=field]_[data-slot=label]]:flex',\n )\n \"\n />\n </div>\n <ItemActionButton\n v-if=\"props.component.simple && canDelete\"\n :action=\"resolve('delete', index)\"\n :context=\"context\"\n :args=\"{ item: String(index) }\"\n size=\"default\"\n class=\"text-muted-foreground\"\n @client=\"removeItem(index)\"\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </li>\n </ul>\n <AddActionRow v-if=\"canAdd\" :alignment=\"props.component.addActionAlignment\">\n <ItemActionButton :action=\"resolve('add')\" :context=\"context\" size=\"sm\" @client=\"add\" />\n </AddActionRow>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RepeaterField.vue_vue_type_script_setup_true_lang.js","names":["_resolveComponent","_unref","_openBlock","_createBlock","DeferredSchema","_withCtx","_createVNode","FieldWrapper","_createElementVNode","_toDisplayString","RepeaterTable","_createCommentVNode","CollapseAllActions","_createElementBlock","_normalizeStyle","_normalizeClass","_Fragment","_renderList","Collapsible","Icon","ItemHeaderActions","CollapsibleContent","SchemaRenderer","ItemActionButton","AddActionRow","Icon_default","SchemaRenderer_default","DeferredSchema_default","FieldWrapper_default","Collapsible_default","CollapsibleContent_default","AddActionRow_default","ItemActionButton_default","CollapseAllActions_default","ItemHeaderActions_default","RepeaterTable_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","RepeaterField_vue_vue_type_script_setup_true_lang_default","props","__props","formatter","useFormatter","context","useFieldActionContext","runItemAction","useRunItemAction","fallbacks","useItemActionFallbacks","resolve","resolveItemAction","name","index","fieldDisabled","useField","disabled","computed","readOnly","items","value","collapsed","ref","dragIndex","virtual","useVirtualList","virtualizeOptions","VIRTUAL_ESTIMATES","schemaFor","templateForIndex","isCollapsed","canAdd","canDelete","moveItem","setValue","moveRepeaterItem","from","to","moveIndexedState","moves","useItemMoves","moveAnnouncement","moveContainer","removeItem","removeRepeaterItem","removeIndexedState","cloneItem","cloneRepeaterItem","cloneIndexedState","draggable","buttons","setAllCollapsed","onDrop","reorderedItemKeys","add","appendRepeaterItem","_component_RepeaterField","resolveComponent","unref","isDeferredPlaceholder","openBlock","createBlock","withCtx","loaded","createVNode","id","error","createElementVNode","toDisplayString","fieldIds","aria","createCommentVNode","_cache","createElementBlock","normalizeStyle","normalizeClass","cn","gridColumnsClasses","Fragment","renderList","$event"],"sources":["../../../src/components/fields/RepeaterField.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RepeaterSchema, SchemaComponent } from '@alfakit/core'\nimport {\n isDeferredPlaceholder,\n VIRTUAL_ESTIMATES,\n appendRepeaterItem,\n fieldIds,\n cloneIndexedState,\n cloneRepeaterItem,\n gridColumnsClasses,\n moveIndexedState,\n moveRepeaterItem,\n removeIndexedState,\n removeRepeaterItem,\n reorderedItemKeys,\n templateForIndex,\n resolveItemAction,\n virtualizeOptions,\n type ItemActionName,\n} from '@alfakit/core'\nimport { computed, ref } from 'vue'\nimport { useScrollToErroredItem, useVirtualList } from '../../composables/use-virtual-list'\nimport { useFormatter } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport DeferredSchema from '../layout/DeferredSchema.vue'\nimport { useField } from '../form/form-context'\nimport { useFieldActionContext } from '../schema/field-actions'\nimport FieldWrapper from '../schema/FieldWrapper.vue'\nimport SchemaRenderer from '../schema/SchemaRenderer.vue'\nimport Collapsible from '../ui/Collapsible.vue'\nimport CollapsibleContent from '../ui/CollapsibleContent.vue'\nimport AddActionRow from './AddActionRow.vue'\nimport CollapseAllActions from './CollapseAllActions.vue'\nimport ItemActionButton from './ItemActionButton.vue'\nimport ItemHeaderActions from './ItemHeaderActions.vue'\nimport { useItemActionFallbacks, useItemMoves, useRunItemAction } from './item-actions'\nimport RepeaterTable from './RepeaterTable.vue'\n\n/**\n * Items use the per-index schema from the server when available (so closures see item\n * state) and fall back to the template for freshly added items.\n */\nconst props = defineProps<{ component: RepeaterSchema }>()\nconst formatter = useFormatter()\nconst context = useFieldActionContext(() => props.component)\nconst runItemAction = useRunItemAction(context)\nconst fallbacks = useItemActionFallbacks()\nconst resolve = (name: ItemActionName, index?: number) =>\n resolveItemAction(\n name,\n props.component,\n index === undefined ? undefined : props.component.items[index],\n name === 'add' ? { ...fallbacks.add, label: props.component.addActionLabel } : fallbacks[name],\n )\nconst {\n value,\n setValue,\n error,\n id,\n disabled: fieldDisabled,\n readOnly,\n aria,\n} = useField<unknown[] | null>(() => props.component)\n// Read-only shows the items but hides add, delete, clone and reorder controls.\nconst disabled = computed(() => fieldDisabled.value || readOnly.value)\nconst items = computed(() => value.value ?? [])\nconst collapsed = ref<Record<number, boolean>>({})\nconst dragIndex = ref<number | null>(null)\n// Long lists render only the visible items (plus a few around them); a multi-column\n// `grid()` is windowed by whole rows, counting its columns from the rendered grid.\nconst virtual = useVirtualList(\n () => items.value.length,\n () =>\n virtualizeOptions(\n props.component.virtualize,\n VIRTUAL_ESTIMATES.item,\n 12,\n props.component.grid ? 'auto' : 1,\n ),\n)\nuseScrollToErroredItem(virtual, () => props.component.statePath)\n\nconst schemaFor = (index: number): SchemaComponent[] =>\n props.component.items[index]?.schema ?? templateForIndex(props.component.template, index)\nconst isCollapsed = (index: number) => collapsed.value[index] ?? props.component.collapsed ?? false\n\nconst canAdd = computed(\n () =>\n props.component.addable &&\n !disabled.value &&\n (props.component.maxItems == null || items.value.length < props.component.maxItems),\n)\nconst canDelete = computed(\n () =>\n props.component.deletable &&\n !disabled.value &&\n (props.component.minItems == null || items.value.length > props.component.minItems),\n)\n\n// Collapsed flags are keyed by index, so they move with their item.\nconst moveItem = (from: number, to: number) => {\n setValue(moveRepeaterItem(items.value, from, to))\n collapsed.value = moveIndexedState(collapsed.value, from, to)\n}\n// Move buttons: announced, one at a time, focus kept on the moved item.\nconst moves = useItemMoves(\n value,\n (from, to) => moveItem(from, to),\n (index) => props.component.items[index]?.label,\n () => items.value.length,\n)\nconst moveAnnouncement = moves.announcement\nconst moveContainer = moves.container\nconst removeItem = (index: number) => {\n setValue(removeRepeaterItem(items.value, index))\n collapsed.value = removeIndexedState(collapsed.value, index)\n}\nconst cloneItem = (index: number) => {\n setValue(cloneRepeaterItem(items.value, index))\n collapsed.value = cloneIndexedState(collapsed.value, index)\n}\n\nconst draggable = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithDragAndDrop !== false &&\n !disabled.value &&\n resolve('reorder') !== null,\n)\nconst buttons = computed(\n () =>\n props.component.reorderable &&\n props.component.reorderableWithButtons !== false &&\n !disabled.value,\n)\nconst setAllCollapsed = (value: boolean) => {\n collapsed.value = Object.fromEntries(items.value.map((_, index) => [index, value]))\n}\n\n// A drop runs the reorder action: in the browser, or on the server when customised.\nconst onDrop = (index: number) => {\n const from = dragIndex.value\n dragIndex.value = null\n if (from === null || from === index) return\n runItemAction(\n resolve('reorder'),\n { items: reorderedItemKeys(items.value.length, from, index) },\n () => moveItem(from, index),\n )\n}\n\nconst add = () =>\n setValue(\n appendRepeaterItem(\n items.value,\n props.component.simple\n ? ({ [Object.keys(props.component.templateState)[0] ?? 'value']: null } as Record<\n string,\n unknown\n >)\n : props.component.templateState,\n ),\n )\n</script>\n\n<template>\n <!-- `deferLoading()`: a skeleton until the field scrolls into view. -->\n <DeferredSchema\n v-if=\"isDeferredPlaceholder(props.component)\"\n v-slot=\"{ component: loaded }\"\n :component=\"props.component\"\n >\n <RepeaterField :component=\"loaded\" />\n </DeferredSchema>\n <FieldWrapper v-else :field=\"props.component\" :html-for=\"id\" :error=\"error\">\n <div ref=\"moveContainer\" class=\"flex flex-col gap-3\">\n <span aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\" data-slot=\"item-move-status\">{{\n moveAnnouncement\n }}</span>\n <RepeaterTable\n v-if=\"props.component.table?.length && !props.component.simple\"\n :id=\"id\"\n :columns=\"props.component.table\"\n :compact=\"props.component.compact\"\n :count=\"items.length\"\n :prefix-for=\"(index: number) => `${props.component.statePath}.${index}.`\"\n :schema-for=\"schemaFor\"\n :labelled-by=\"props.component.label ? fieldIds(id).label : undefined\"\n :described-by=\"aria['aria-describedby']\"\n :reorderable=\"buttons\"\n :cloneable=\"Boolean(props.component.cloneable) && canAdd\"\n :deletable=\"canDelete\"\n :virtual=\"virtual\"\n :context=\"context\"\n :resolve=\"resolve\"\n :extra-actions-for=\"(index: number) => props.component.items[index]?.actions\"\n @move=\"moveItem\"\n @clone=\"cloneItem\"\n @remove=\"removeItem\"\n />\n <CollapseAllActions\n v-if=\"\n !(props.component.table?.length && !props.component.simple) &&\n props.component.collapsible &&\n !props.component.simple &&\n items.length > 0\n \"\n :context=\"context\"\n :collapse-all=\"resolve('collapseAll')\"\n :expand-all=\"resolve('expandAll')\"\n @collapse-all=\"setAllCollapsed(true)\"\n @expand-all=\"setAllCollapsed(false)\"\n />\n <ul\n v-if=\"!(props.component.table?.length && !props.component.simple)\"\n :id=\"id\"\n :ref=\"virtual.attach\"\n :aria-labelledby=\"props.component.label ? fieldIds(id).label : undefined\"\n :aria-describedby=\"aria['aria-describedby']\"\n :style=\"virtual.style.value\"\n :class=\"cn('grid gap-3', props.component.grid && gridColumnsClasses(props.component.grid))\"\n >\n <li\n v-for=\"index in virtual.indexes.value\"\n :key=\"index\"\n :ref=\"virtual.item\"\n :data-index=\"index\"\n :aria-setsize=\"virtual.range.value.active ? items.length : undefined\"\n :aria-posinset=\"virtual.range.value.active ? index + 1 : undefined\"\n :draggable=\"draggable\"\n :class=\"\n cn(\n 'bg-card min-w-0 rounded-lg border shadow-xs',\n dragIndex === index && 'opacity-50',\n props.component.simple && 'border-0 shadow-none',\n )\n \"\n @dragstart=\"dragIndex = index\"\n @dragover=\"draggable && $event.preventDefault()\"\n @drop=\"onDrop(index)\"\n @dragend=\"dragIndex = null\"\n >\n <Collapsible :open=\"!isCollapsed(index)\">\n <div\n v-if=\"!props.component.simple\"\n class=\"flex flex-wrap items-center gap-1 border-b px-2 py-1.5\"\n data-slot=\"item-header\"\n >\n <span\n v-if=\"draggable\"\n class=\"text-muted-foreground cursor-grab\"\n :title=\"resolve('reorder')?.label ?? undefined\"\n aria-hidden=\"true\"\n ><Icon :name=\"resolve('reorder')?.icon ?? 'grip-vertical'\"\n /></span>\n <span\n v-if=\"props.component.itemNumbers\"\n class=\"text-muted-foreground text-xs tabular-nums\"\n >{{ formatter.number(index + 1) }}</span\n >\n <span\n v-if=\"props.component.items[index]?.label\"\n dir=\"auto\"\n class=\"min-w-0 truncate text-sm font-medium\"\n >{{ props.component.items[index]?.label }}</span\n >\n <span class=\"flex-1\" />\n <ItemHeaderActions\n :context=\"context\"\n :item-key=\"String(index)\"\n :index=\"index\"\n :count=\"items.length\"\n :resolve=\"(name: ItemActionName) => resolve(name, index)\"\n :extra-actions=\"disabled ? undefined : props.component.items[index]?.actions\"\n :buttons=\"buttons\"\n :can-clone=\"Boolean(props.component.cloneable) && canAdd\"\n :can-delete=\"canDelete\"\n :collapsible=\"Boolean(props.component.collapsible)\"\n :collapsed=\"isCollapsed(index)\"\n @move=\"moves.moveWithButton\"\n @clone=\"cloneItem(index)\"\n @delete=\"removeItem(index)\"\n @toggle=\"collapsed = { ...collapsed, [index]: !isCollapsed(index) }\"\n />\n </div>\n <CollapsibleContent>\n <div :class=\"cn('flex gap-2', props.component.simple ? 'items-start' : 'p-4')\">\n <div class=\"flex-1\">\n <SchemaRenderer\n :components=\"schemaFor(index)\"\n :columns=\"\n props.component.simple\n ? { default: 1 }\n : (props.component.columns ?? { default: 1, lg: 2 })\n \"\n :class=\"\n cn(\n props.component.simple && 'gap-0',\n '[&_[data-slot=field]_[data-slot=label]]:hidden',\n !props.component.simple && '[&_[data-slot=field]_[data-slot=label]]:flex',\n )\n \"\n />\n </div>\n <ItemActionButton\n v-if=\"props.component.simple && canDelete\"\n :action=\"resolve('delete', index)\"\n :context=\"context\"\n :args=\"{ item: String(index) }\"\n size=\"default\"\n class=\"text-muted-foreground\"\n @client=\"removeItem(index)\"\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </li>\n </ul>\n <AddActionRow v-if=\"canAdd\" :alignment=\"props.component.addActionAlignment\">\n <ItemActionButton :action=\"resolve('add')\" :context=\"context\" size=\"sm\" @client=\"add\" />\n </AddActionRow>\n </div>\n </FieldWrapper>\n</template>\n"],"mappings":"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"}