@alfakit/vue 0.1.2 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) 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/ActionGroupMenu.js.map +1 -1
  7. package/dist/components/actions/ActionGroupMenu.vue.d.ts.map +1 -1
  8. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js +69 -65
  9. package/dist/components/actions/ActionGroupMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/actions/ActionModal.js.map +1 -1
  11. package/dist/components/actions/ActionModal.vue.d.ts.map +1 -1
  12. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js +17 -15
  13. package/dist/components/actions/ActionModal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/components/ai/AiCopilot.js.map +1 -1
  15. package/dist/components/ai/AiCopilot.vue.d.ts +2 -0
  16. package/dist/components/ai/AiCopilot.vue.d.ts.map +1 -1
  17. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js +7 -2
  18. package/dist/components/ai/AiCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js +19 -19
  20. package/dist/components/cms/CmsPage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/cms/LivePreview.js.map +1 -1
  22. package/dist/components/cms/LivePreview.vue.d.ts.map +1 -1
  23. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js +83 -83
  24. package/dist/components/cms/LivePreview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/fields/BuilderField.js.map +1 -1
  26. package/dist/components/fields/BuilderField.vue.d.ts.map +1 -1
  27. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js +162 -157
  28. package/dist/components/fields/BuilderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/fields/ImageEditorDialog.js.map +1 -1
  30. package/dist/components/fields/ImageEditorDialog.vue.d.ts.map +1 -1
  31. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js +46 -46
  32. package/dist/components/fields/ImageEditorDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/fields/KeyValueField.js.map +1 -1
  34. package/dist/components/fields/KeyValueField.vue.d.ts.map +1 -1
  35. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js +66 -66
  36. package/dist/components/fields/KeyValueField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/fields/ModalTablePicker.js.map +1 -1
  38. package/dist/components/fields/ModalTablePicker.vue.d.ts.map +1 -1
  39. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js +113 -113
  40. package/dist/components/fields/ModalTablePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/fields/RepeaterField.js.map +1 -1
  42. package/dist/components/fields/RepeaterField.vue.d.ts.map +1 -1
  43. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js +12 -12
  44. package/dist/components/fields/RepeaterField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/fields/RichEditorInput.js.map +1 -1
  46. package/dist/components/fields/RichEditorInput.vue.d.ts.map +1 -1
  47. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js +166 -165
  48. package/dist/components/fields/RichEditorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  49. package/dist/components/fields/SliderField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/fields/item-actions.d.ts +2 -2
  51. package/dist/components/fields/item-actions.d.ts.map +1 -1
  52. package/dist/components/fields/item-actions.js +31 -31
  53. package/dist/components/fields/item-actions.js.map +1 -1
  54. package/dist/components/form/FormBlock.js.map +1 -1
  55. package/dist/components/form/FormBlock.vue.d.ts.map +1 -1
  56. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js +1 -1
  57. package/dist/components/form/FormBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/form/form-context.js +25 -25
  59. package/dist/components/form/form-context.js.map +1 -1
  60. package/dist/components/kanban/KanbanBoard.js.map +1 -1
  61. package/dist/components/kanban/KanbanBoard.vue.d.ts.map +1 -1
  62. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js +5 -2
  63. package/dist/components/kanban/KanbanBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/kanban/KanbanColumnHeader.js.map +1 -1
  65. package/dist/components/kanban/KanbanColumnHeader.vue.d.ts.map +1 -1
  66. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js +64 -64
  67. package/dist/components/kanban/KanbanColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  68. package/dist/components/layout/SectionComponent.js.map +1 -1
  69. package/dist/components/layout/SectionComponent.vue.d.ts.map +1 -1
  70. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js +23 -23
  71. package/dist/components/layout/SectionComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js +8 -8
  73. package/dist/components/panel/DebugPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  74. package/dist/components/panel/GlobalSearchPalette.js.map +1 -1
  75. package/dist/components/panel/GlobalSearchPalette.vue.d.ts.map +1 -1
  76. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js +102 -96
  77. package/dist/components/panel/GlobalSearchPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js +10 -10
  79. package/dist/components/panel/NavGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  80. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js +9 -9
  81. package/dist/components/panel/NavGroupFlyout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js +16 -16
  83. package/dist/components/panel/NavItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  84. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js +10 -10
  85. package/dist/components/panel/NavSubItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  86. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js +35 -35
  87. package/dist/components/panel/TenantMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js +11 -11
  89. package/dist/components/panel/Topbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  90. package/dist/components/realtime/use-live-updates.d.ts.map +1 -1
  91. package/dist/components/realtime/use-live-updates.js +24 -23
  92. package/dist/components/realtime/use-live-updates.js.map +1 -1
  93. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js +2 -1
  94. package/dist/components/table/BooleanCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/components/table/ColumnHeader.js.map +1 -1
  96. package/dist/components/table/ColumnHeader.vue.d.ts.map +1 -1
  97. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js +55 -49
  98. package/dist/components/table/ColumnHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  99. package/dist/components/table/ColumnManager.js.map +1 -1
  100. package/dist/components/table/ColumnManager.vue.d.ts.map +1 -1
  101. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js +5 -4
  102. package/dist/components/table/ColumnManager.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/table/ContentLayoutSort.js.map +1 -1
  104. package/dist/components/table/ContentLayoutSort.vue.d.ts.map +1 -1
  105. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js +5 -5
  106. package/dist/components/table/ContentLayoutSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
  107. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js +2 -1
  108. package/dist/components/table/SelectCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js +2 -1
  110. package/dist/components/table/SelectComboboxCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  111. package/dist/components/table/TableCellContent.js.map +1 -1
  112. package/dist/components/table/TableCellContent.vue.d.ts.map +1 -1
  113. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js +4 -3
  114. package/dist/components/table/TableCellContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  115. package/dist/components/table/TablePagination.js.map +1 -1
  116. package/dist/components/table/TablePagination.vue.d.ts.map +1 -1
  117. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js +87 -87
  118. package/dist/components/table/TablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  119. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js +2 -1
  120. package/dist/components/table/TextInputCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  121. package/dist/components/table/cell-update.d.ts +6 -0
  122. package/dist/components/table/cell-update.d.ts.map +1 -1
  123. package/dist/components/table/cell-update.js.map +1 -1
  124. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js +1 -1
  125. package/dist/components/translation-manager/TranslationManagerView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  126. package/dist/components/ui/CommandAutoHighlight.js +7 -0
  127. package/dist/components/ui/CommandAutoHighlight.js.map +1 -0
  128. package/dist/components/ui/CommandAutoHighlight.vue.d.ts +21 -0
  129. package/dist/components/ui/CommandAutoHighlight.vue.d.ts.map +1 -0
  130. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js +18 -0
  131. package/dist/components/ui/CommandAutoHighlight.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/components/ui/DialogContent.js.map +1 -1
  133. package/dist/components/ui/DialogContent.vue.d.ts.map +1 -1
  134. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js +13 -12
  135. package/dist/components/ui/DialogContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  136. package/dist/components/ui/PopoverContent.js.map +1 -1
  137. package/dist/components/ui/PopoverContent.vue.d.ts.map +1 -1
  138. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js +9 -8
  139. package/dist/components/ui/PopoverContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  140. package/dist/components/ui/SheetContent.js.map +1 -1
  141. package/dist/components/ui/SheetContent.vue.d.ts.map +1 -1
  142. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js +13 -12
  143. package/dist/components/ui/SheetContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  144. package/dist/components/ui/TooltipContent.js.map +1 -1
  145. package/dist/components/ui/TooltipContent.vue.d.ts.map +1 -1
  146. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js +9 -8
  147. package/dist/components/ui/TooltipContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  148. package/dist/context.d.ts +7 -0
  149. package/dist/context.d.ts.map +1 -1
  150. package/dist/context.js +29 -26
  151. package/dist/context.js.map +1 -1
  152. package/dist/create-alfakit.d.ts.map +1 -1
  153. package/dist/create-alfakit.js +33 -31
  154. package/dist/create-alfakit.js.map +1 -1
  155. package/dist/eject-manifest.json +11 -2
  156. package/dist/index.d.ts +1 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +219 -217
  159. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  160. package/dist/layouts/AppLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  161. package/dist/layouts/AuthLayout.vue_vue_type_script_setup_true_lang.js +9 -9
  162. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js +8 -8
  163. package/dist/layouts/FullscreenLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  164. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js +15 -15
  165. package/dist/layouts/TopNavLayout.vue_vue_type_script_setup_true_lang.js.map +1 -1
  166. package/dist/layouts/lazy-layouts.d.ts +10 -0
  167. package/dist/layouts/lazy-layouts.d.ts.map +1 -0
  168. package/dist/layouts/lazy-layouts.js +8 -0
  169. package/dist/layouts/lazy-layouts.js.map +1 -0
  170. package/dist/layouts/panel-layouts.d.ts +8 -0
  171. package/dist/layouts/panel-layouts.d.ts.map +1 -0
  172. package/dist/layouts/panel-layouts.js +15 -0
  173. package/dist/layouts/panel-layouts.js.map +1 -0
  174. package/dist/lib/lazy.d.ts.map +1 -1
  175. package/dist/lib/lazy.js +2 -2
  176. package/dist/lib/lazy.js.map +1 -1
  177. package/dist/pages/PageShell.js.map +1 -1
  178. package/dist/pages/PageShell.vue.d.ts.map +1 -1
  179. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js +39 -42
  180. package/dist/pages/PageShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  181. package/dist/standalone/AlfakitComponent.js.map +1 -1
  182. package/dist/standalone/AlfakitComponent.vue.d.ts.map +1 -1
  183. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js +56 -52
  184. package/dist/standalone/AlfakitComponent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  185. package/dist/standalone.css +7 -0
  186. package/dist/starter-kit/AlfakitStarterKitRoot.js.map +1 -1
  187. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts +2 -2
  188. package/dist/starter-kit/AlfakitStarterKitRoot.vue.d.ts.map +1 -1
  189. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js +17 -12
  190. package/dist/starter-kit/AlfakitStarterKitRoot.vue_vue_type_script_setup_true_lang.js.map +1 -1
  191. package/dist/starter-kit/dashboard-widgets.d.ts +54 -0
  192. package/dist/starter-kit/dashboard-widgets.d.ts.map +1 -0
  193. package/dist/starter-kit/dashboard-widgets.js +54 -0
  194. package/dist/starter-kit/dashboard-widgets.js.map +1 -0
  195. package/dist/starter-kit/index.d.ts +2 -1
  196. package/dist/starter-kit/index.d.ts.map +1 -1
  197. package/dist/starter-kit/index.js +5 -4
  198. package/dist/starter-kit/runtime.d.ts +6 -0
  199. package/dist/starter-kit/runtime.d.ts.map +1 -1
  200. package/dist/starter-kit/runtime.js +19 -15
  201. package/dist/starter-kit/runtime.js.map +1 -1
  202. package/dist/starter-kit/starter-kit.d.ts.map +1 -1
  203. package/dist/starter-kit/starter-kit.js +8 -8
  204. package/dist/starter-kit/starter-kit.js.map +1 -1
  205. package/dist/starter-kit/widgets/CopilotTrigger.js +7 -0
  206. package/dist/starter-kit/widgets/CopilotTrigger.js.map +1 -0
  207. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts +12 -0
  208. package/dist/starter-kit/widgets/CopilotTrigger.vue.d.ts.map +1 -0
  209. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js +23 -0
  210. package/dist/starter-kit/widgets/CopilotTrigger.vue_vue_type_script_setup_true_lang.js.map +1 -0
  211. package/dist/starter-kit/widgets/LoadedCopilot.js +7 -0
  212. package/dist/starter-kit/widgets/LoadedCopilot.js.map +1 -0
  213. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts +8 -0
  214. package/dist/starter-kit/widgets/LoadedCopilot.vue.d.ts.map +1 -0
  215. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js +31 -0
  216. package/dist/starter-kit/widgets/LoadedCopilot.vue_vue_type_script_setup_true_lang.js.map +1 -0
  217. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js +7 -0
  218. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.js.map +1 -0
  219. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts +8 -0
  220. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue.d.ts.map +1 -0
  221. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js +34 -0
  222. package/dist/starter-kit/widgets/StarterKitImpersonationBanner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  223. package/dist/starter-kit/widgets/index.d.ts +40 -9
  224. package/dist/starter-kit/widgets/index.d.ts.map +1 -1
  225. package/dist/starter-kit/widgets/index.js +21 -18
  226. package/dist/starter-kit/widgets/index.js.map +1 -1
  227. package/dist/starter-kit/widgets/loaded.d.ts +10 -0
  228. package/dist/starter-kit/widgets/loaded.d.ts.map +1 -0
  229. package/dist/starter-kit/widgets/loaded.js +5 -0
  230. package/dist/styles.css +9 -2
  231. package/dist/themes.css +6 -1
  232. package/package.json +2 -2
  233. package/src/AlfakitRoot.vue +9 -1
  234. package/src/components/actions/ActionGroupMenu.vue +13 -1
  235. package/src/components/actions/ActionModal.vue +9 -0
  236. package/src/components/ai/AiCopilot.vue +7 -1
  237. package/src/components/cms/LivePreview.vue +8 -2
  238. package/src/components/fields/BuilderField.vue +15 -2
  239. package/src/components/fields/ImageEditorDialog.vue +7 -3
  240. package/src/components/fields/KeyValueField.vue +3 -2
  241. package/src/components/fields/ModalTablePicker.vue +7 -2
  242. package/src/components/fields/RepeaterField.vue +2 -3
  243. package/src/components/fields/RichEditorInput.vue +3 -0
  244. package/src/components/fields/item-actions.ts +31 -10
  245. package/src/components/form/FormBlock.vue +2 -1
  246. package/src/components/form/form-context.ts +2 -2
  247. package/src/components/kanban/KanbanBoard.vue +15 -3
  248. package/src/components/kanban/KanbanColumnHeader.vue +6 -4
  249. package/src/components/layout/SectionComponent.vue +10 -4
  250. package/src/components/panel/GlobalSearchPalette.vue +2 -0
  251. package/src/components/realtime/use-live-updates.ts +3 -1
  252. package/src/components/table/ColumnHeader.vue +23 -12
  253. package/src/components/table/ColumnManager.vue +12 -8
  254. package/src/components/table/ContentLayoutSort.vue +7 -1
  255. package/src/components/table/TableCellContent.vue +4 -2
  256. package/src/components/table/TablePagination.vue +12 -7
  257. package/src/components/table/cell-update.ts +6 -0
  258. package/src/components/ui/CommandAutoHighlight.vue +27 -0
  259. package/src/components/ui/DialogContent.vue +5 -1
  260. package/src/components/ui/PopoverContent.vue +5 -1
  261. package/src/components/ui/SheetContent.vue +5 -1
  262. package/src/components/ui/TooltipContent.vue +5 -1
  263. package/src/context.ts +10 -0
  264. package/src/create-alfakit.ts +5 -0
  265. package/src/index.ts +2 -0
  266. package/src/layouts/lazy-layouts.ts +14 -0
  267. package/src/layouts/panel-layouts.ts +17 -0
  268. package/src/lib/lazy.ts +11 -1
  269. package/src/pages/PageShell.vue +5 -6
  270. package/src/standalone/AlfakitComponent.vue +17 -6
  271. package/src/starter-kit/AlfakitStarterKitRoot.vue +12 -3
  272. package/src/starter-kit/dashboard-widgets.ts +93 -0
  273. package/src/starter-kit/index.ts +7 -1
  274. package/src/starter-kit/runtime.ts +17 -1
  275. package/src/starter-kit/starter-kit.ts +2 -1
  276. package/src/starter-kit/widgets/CopilotTrigger.vue +58 -0
  277. package/src/starter-kit/widgets/LoadedCopilot.vue +29 -0
  278. package/src/starter-kit/widgets/StarterKitImpersonationBanner.vue +57 -0
  279. package/src/starter-kit/widgets/index.ts +56 -11
  280. package/src/starter-kit/widgets/loaded.ts +9 -0
  281. package/src/styles.css +9 -2
@@ -46,10 +46,11 @@ var ae = {
46
46
  cell: {},
47
47
  recordKey: {},
48
48
  token: {},
49
- component: {}
49
+ component: {},
50
+ fromRegistry: { type: Boolean }
50
51
  },
51
52
  setup(b) {
52
- let z = b, B = e(), V = g(() => B.resolve(d(z.column))), H = t(), U = g(() => z.column.component ?? ""), W = g(() => z.column.type === "ViewColumn" && U.value ? B.resolve(U.value) : void 0), G = g(() => z.column), K = g(() => m(G.value)), q = g(() => Array.isArray(z.cell.state) ? z.cell.state : []), J = g(() => G.value.limit ?? q.value.length), Y = (e) => typeof e == "number" ? `${e}px` : e, ce = g(() => {
53
+ let z = b, B = e(), V = g(() => z.fromRegistry ? void 0 : B.resolve(d(z.column))), H = t(), U = g(() => z.column.component ?? ""), W = g(() => z.column.type === "ViewColumn" && U.value ? B.resolve(U.value) : void 0), G = g(() => z.column), K = g(() => m(G.value)), q = g(() => Array.isArray(z.cell.state) ? z.cell.state : []), J = g(() => G.value.limit ?? q.value.length), Y = (e) => typeof e == "number" ? `${e}px` : e, ce = g(() => {
53
54
  let e = G.value.size ?? 40;
54
55
  return {
55
56
  height: Y(G.value.height ?? e),
@@ -71,7 +72,7 @@ var ae = {
71
72
  itemIcons: z.cell.itemIcons,
72
73
  itemUrls: z.cell.itemUrls
73
74
  })), de = g(() => z.column.type === "SelectColumn" && z.column.native === !1), $ = g(() => z.column.descriptionPosition ?? "below");
74
- return (e, t) => V.value ? (T(), _(O(V.value), C(x({ key: 0 }, z)), null, 16)) : W.value ? (T(), _(O(W.value), C(x({ key: 1 }, {
75
+ return (e, t) => V.value ? (T(), _(O(V.value), x({ key: 0 }, z, { "from-registry": !0 }), null, 16)) : W.value ? (T(), _(O(W.value), C(x({ key: 1 }, {
75
76
  ...z.cell.props ?? {},
76
77
  state: z.cell.state,
77
78
  ...z
@@ -1 +1 @@
1
- {"version":3,"file":"TableCellContent.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_createElementBlock","_toDisplayString","_unref","_Fragment","_normalizeClass","_createCommentVNode","_renderList","Icon","_withModifiers","_createElementVNode","_normalizeStyle","BooleanCell","SelectComboboxCell","SelectCell","TextInputCell","_createVNode","FormattedText","Icon_default","FormattedText_default","BooleanCell_default","SelectCell_default","SelectComboboxCell_default","TextInputCell_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","TableCellContent_vue_vue_type_script_setup_true_lang_default","props","__props","registry","useRegistry","custom","computed","columnRegistryKey","t","useT","viewName","view","imageSchema","defaultImageStack","usesDefaultImageStack","imageUrls","imageLimit","toCss","value","imageStyle","size","colors","colorSchema","copiedColor","ref","copyColor","color","textSchema","isComboboxSelect","descriptionPosition","openBlock","createBlock","resolveDynamicComponent","normalizeProps","mergeProps","createElementBlock","toDisplayString","unref","Fragment","normalizeClass","cn","createCommentVNode","renderList","index","item","colorClass","iconSizeClasses","textColorClasses","url","stackedImageStyle","remainingTextSizeClass","withModifiers","createElementVNode","normalizeStyle","CheckIcon","createVNode"],"sources":["../../../src/components/table/TableCellContent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColorColumnSchema, IconColumnSchema } from '@alfakit/core'\nimport {\n columnRegistryKey,\n remainingTextSizeClass,\n stackedImageStyle,\n usesDefaultImageStack,\n} from '@alfakit/core'\nimport { CheckIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { useRegistry, useT } from '../../context'\nimport { colorClass, iconSizeClasses, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport FormattedText from '../entries/FormattedText.vue'\nimport BooleanCell from './BooleanCell.vue'\nimport type { CellProps } from './cell-update'\nimport SelectCell from './SelectCell.vue'\nimport SelectComboboxCell from './SelectComboboxCell.vue'\nimport TextInputCell from './TextInputCell.vue'\n\nconst props = defineProps<CellProps>()\nconst registry = useRegistry()\n// A component registered as `column:<type>` replaces the built-in cell renderer.\nconst custom = computed(() => registry.resolve(columnRegistryKey(props.column)))\nconst t = useT()\n// `ViewColumn`: the application component registered under the column's `view()` name.\nconst viewName = computed(() => (props.column as { component?: string }).component ?? '')\nconst view = computed(() =>\n props.column.type === 'ViewColumn' && viewName.value\n ? registry.resolve(viewName.value)\n : undefined,\n)\n\nconst imageSchema = computed(\n () =>\n props.column as {\n circular?: boolean\n square?: boolean\n size?: number | string\n height?: number | string\n width?: string\n stacked?: boolean\n limit?: number\n limitedRemainingText?: boolean\n limitedRemainingTextSize?: string\n wrap?: boolean\n ring?: number\n overlap?: number\n },\n)\nconst defaultImageStack = computed(() => usesDefaultImageStack(imageSchema.value))\nconst imageUrls = computed(() =>\n Array.isArray(props.cell.state) ? (props.cell.state as string[]) : [],\n)\nconst imageLimit = computed(() => imageSchema.value.limit ?? imageUrls.value.length)\nconst toCss = (value: number | string | undefined) =>\n typeof value === 'number' ? `${value}px` : value\nconst imageStyle = computed(() => {\n const size = imageSchema.value.size ?? 40\n\n return {\n height: toCss(imageSchema.value.height ?? size),\n width: toCss(\n imageSchema.value.width ??\n (imageSchema.value.square || imageSchema.value.circular ? size : undefined),\n ),\n }\n})\nconst colors = computed(() =>\n Array.isArray(props.cell.state)\n ? (props.cell.state as string[])\n : props.cell.state\n ? [String(props.cell.state)]\n : [],\n)\nconst colorSchema = computed(() => props.column as ColorColumnSchema)\nconst copiedColor = ref<string | null>(null)\nconst copyColor = (color: string) => {\n void navigator.clipboard?.writeText(color).then(() => {\n copiedColor.value = color\n setTimeout(() => {\n copiedColor.value = null\n }, colorSchema.value.copyMessageDuration ?? 1500)\n })\n}\nconst textSchema = computed(() => ({\n ...(props.column as object),\n color: props.cell.color,\n icon: props.cell.icon,\n iconPosition: props.cell.iconPosition,\n iconColor: props.cell.iconColor,\n itemColors: props.cell.itemColors,\n itemIcons: props.cell.itemIcons,\n itemUrls: props.cell.itemUrls,\n}))\n// `SelectColumn::native(false)` renders a combobox.\nconst isComboboxSelect = computed(\n () =>\n props.column.type === 'SelectColumn' && (props.column as { native?: boolean }).native === false,\n)\nconst descriptionPosition = computed(\n () =>\n (props.column as { descriptionPosition?: 'above' | 'below' }).descriptionPosition ?? 'below',\n)\n</script>\n\n<template>\n <component :is=\"custom\" v-if=\"custom\" v-bind=\"props\" />\n <component\n :is=\"view\"\n v-else-if=\"view\"\n v-bind=\"{ ...(props.cell.props ?? {}), state: props.cell.state, ...props }\"\n />\n <span v-else-if=\"props.column.type === 'ViewColumn'\" class=\"text-destructive text-xs\">{{\n t(\n 'component_not_registered',\n { component: viewName },\n `Component ${viewName} is not registered.`,\n )\n }}</span>\n <template v-else-if=\"props.column.type === 'IconColumn'\">\n <!-- A list state: one icon per item (`wrap()` lets them wrap). -->\n <div\n v-if=\"props.cell.icons\"\n data-slot=\"icon-column-icons\"\n :class=\"\n cn(\n 'flex items-center gap-1.5',\n (props.column as IconColumnSchema).wrap ? 'flex-wrap' : 'flex-nowrap',\n )\n \"\n >\n <span v-if=\"props.cell.icons.length === 0\" class=\"text-muted-foreground\">—</span>\n <Icon\n v-for=\"(item, index) in props.cell.icons\"\n :key=\"index\"\n :name=\"item.icon\"\n :class=\"\n cn(\n colorClass(iconSizeClasses, props.cell.size, 'md'),\n item.color && textColorClasses[item.color],\n )\n \"\n />\n </div>\n <Icon\n v-else-if=\"props.cell.icon\"\n :name=\"props.cell.icon\"\n :class=\"\n cn(\n colorClass(iconSizeClasses, props.cell.size, 'md'),\n props.cell.color && textColorClasses[props.cell.color],\n )\n \"\n />\n <span v-else class=\"text-muted-foreground\">—</span>\n </template>\n <template v-else-if=\"props.column.type === 'ImageColumn'\">\n <span v-if=\"imageUrls.length === 0\" class=\"text-muted-foreground\">—</span>\n <div\n v-else\n :class=\"\n cn(\n 'flex items-center',\n imageSchema.wrap && 'flex-wrap',\n imageSchema.stacked ? defaultImageStack && '-space-x-2' : 'gap-1.5',\n imageSchema.wrap && imageSchema.stacked && 'gap-y-1.5',\n )\n \"\n >\n <img\n v-for=\"(url, index) in imageUrls.slice(0, imageLimit)\"\n :key=\"index\"\n :src=\"url\"\n :alt=\"props.cell.alt ?? ''\"\n :style=\"[imageStyle, stackedImageStyle(index, imageSchema)]\"\n :class=\"\n cn(\n 'object-cover',\n imageSchema.circular ? 'rounded-full' : 'rounded-md',\n imageSchema.stacked && defaultImageStack && 'ring-background ring-2',\n )\n \"\n v-bind=\"props.cell.extraImgAttributes\"\n />\n <span\n v-if=\"imageSchema.limitedRemainingText && imageUrls.length > imageLimit\"\n data-slot=\"image-remaining\"\n :class=\"\n cn(\n 'text-muted-foreground ms-1',\n remainingTextSizeClass(imageSchema.limitedRemainingTextSize),\n )\n \"\n >+{{ imageUrls.length - imageLimit }}</span\n >\n </div>\n </template>\n <template v-else-if=\"props.column.type === 'ColorColumn'\">\n <span v-if=\"colors.length === 0\" class=\"text-muted-foreground\">—</span>\n <div\n v-else\n :class=\"cn('flex items-center gap-1.5', colorSchema.wrap ? 'flex-wrap' : 'flex-nowrap')\"\n >\n <template v-for=\"color in colors\" :key=\"color\">\n <!-- The cell may sit inside a link or a clickable row. -->\n <button\n v-if=\"colorSchema.copyable\"\n type=\"button\"\n data-slot=\"color-copy\"\n :title=\"color\"\n :aria-label=\"`${t('copy', {}, 'Copy')} ${color}`\"\n class=\"focus-visible:ring-ring/50 inline-flex rounded outline-none focus-visible:ring-[3px]\"\n @click.prevent.stop=\"copyColor(color)\"\n >\n <span\n class=\"inline-flex size-5 items-center justify-center rounded border shadow-xs\"\n :style=\"{ backgroundColor: color }\"\n >\n <CheckIcon\n v-if=\"copiedColor === color\"\n class=\"size-3 text-white mix-blend-difference\"\n />\n </span>\n </button>\n <span\n v-else\n :title=\"color\"\n class=\"size-5 rounded border shadow-xs\"\n :style=\"{ backgroundColor: color }\"\n />\n </template>\n <span\n v-if=\"colorSchema.copyable && copiedColor\"\n role=\"status\"\n :class=\"cn('text-xs', !colorSchema.copyMessage && 'sr-only')\"\n >{{ colorSchema.copyMessage ?? t('copied', {}, 'Copied') }}</span\n >\n </div>\n </template>\n <BooleanCell\n v-else-if=\"props.column.type === 'ToggleColumn' || props.column.type === 'CheckboxColumn'\"\n v-bind=\"props\"\n />\n <SelectComboboxCell v-else-if=\"isComboboxSelect\" v-bind=\"props\" />\n <SelectCell v-else-if=\"props.column.type === 'SelectColumn'\" v-bind=\"props\" />\n <TextInputCell v-else-if=\"props.column.type === 'TextInputColumn'\" v-bind=\"props\" />\n <div v-else class=\"flex flex-col gap-0.5\">\n <span\n v-if=\"props.cell.description && descriptionPosition === 'above'\"\n class=\"text-muted-foreground block text-xs\"\n >{{ props.cell.description }}</span\n >\n <FormattedText :value=\"props.cell.state\" :schema=\"textSchema\" />\n <span\n v-if=\"props.cell.description && descriptionPosition === 'below'\"\n class=\"text-muted-foreground block text-xs\"\n >{{ props.cell.description }}</span\n >\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableCellContent.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_normalizeProps","_createElementBlock","_toDisplayString","_unref","_Fragment","_normalizeClass","_createCommentVNode","_renderList","Icon","_withModifiers","_createElementVNode","_normalizeStyle","BooleanCell","SelectComboboxCell","SelectCell","TextInputCell","_createVNode","FormattedText","Icon_default","FormattedText_default","BooleanCell_default","SelectCell_default","SelectComboboxCell_default","TextInputCell_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","TableCellContent_vue_vue_type_script_setup_true_lang_default","props","__props","registry","useRegistry","custom","computed","columnRegistryKey","t","useT","viewName","view","imageSchema","defaultImageStack","usesDefaultImageStack","imageUrls","imageLimit","toCss","value","imageStyle","size","colors","colorSchema","copiedColor","ref","copyColor","color","textSchema","isComboboxSelect","descriptionPosition","openBlock","createBlock","resolveDynamicComponent","mergeProps","normalizeProps","createElementBlock","toDisplayString","unref","Fragment","normalizeClass","cn","createCommentVNode","renderList","index","item","colorClass","iconSizeClasses","textColorClasses","url","stackedImageStyle","remainingTextSizeClass","withModifiers","createElementVNode","normalizeStyle","CheckIcon","createVNode"],"sources":["../../../src/components/table/TableCellContent.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ColorColumnSchema, IconColumnSchema } from '@alfakit/core'\nimport {\n columnRegistryKey,\n remainingTextSizeClass,\n stackedImageStyle,\n usesDefaultImageStack,\n} from '@alfakit/core'\nimport { CheckIcon } from '@lucide/vue'\nimport { computed, ref } from 'vue'\nimport { useRegistry, useT } from '../../context'\nimport { colorClass, iconSizeClasses, textColorClasses } from '../../lib/colors'\nimport { Icon } from '../../lib/icons'\nimport { cn } from '../../lib/utils'\nimport FormattedText from '../entries/FormattedText.vue'\nimport BooleanCell from './BooleanCell.vue'\nimport type { CellProps } from './cell-update'\nimport SelectCell from './SelectCell.vue'\nimport SelectComboboxCell from './SelectComboboxCell.vue'\nimport TextInputCell from './TextInputCell.vue'\n\nconst props = defineProps<CellProps>()\nconst registry = useRegistry()\n// A component registered as `column:<type>` replaces the built-in cell renderer.\nconst custom = computed(() =>\n props.fromRegistry ? undefined : registry.resolve(columnRegistryKey(props.column)),\n)\nconst t = useT()\n// `ViewColumn`: the application component registered under the column's `view()` name.\nconst viewName = computed(() => (props.column as { component?: string }).component ?? '')\nconst view = computed(() =>\n props.column.type === 'ViewColumn' && viewName.value\n ? registry.resolve(viewName.value)\n : undefined,\n)\n\nconst imageSchema = computed(\n () =>\n props.column as {\n circular?: boolean\n square?: boolean\n size?: number | string\n height?: number | string\n width?: string\n stacked?: boolean\n limit?: number\n limitedRemainingText?: boolean\n limitedRemainingTextSize?: string\n wrap?: boolean\n ring?: number\n overlap?: number\n },\n)\nconst defaultImageStack = computed(() => usesDefaultImageStack(imageSchema.value))\nconst imageUrls = computed(() =>\n Array.isArray(props.cell.state) ? (props.cell.state as string[]) : [],\n)\nconst imageLimit = computed(() => imageSchema.value.limit ?? imageUrls.value.length)\nconst toCss = (value: number | string | undefined) =>\n typeof value === 'number' ? `${value}px` : value\nconst imageStyle = computed(() => {\n const size = imageSchema.value.size ?? 40\n\n return {\n height: toCss(imageSchema.value.height ?? size),\n width: toCss(\n imageSchema.value.width ??\n (imageSchema.value.square || imageSchema.value.circular ? size : undefined),\n ),\n }\n})\nconst colors = computed(() =>\n Array.isArray(props.cell.state)\n ? (props.cell.state as string[])\n : props.cell.state\n ? [String(props.cell.state)]\n : [],\n)\nconst colorSchema = computed(() => props.column as ColorColumnSchema)\nconst copiedColor = ref<string | null>(null)\nconst copyColor = (color: string) => {\n void navigator.clipboard?.writeText(color).then(() => {\n copiedColor.value = color\n setTimeout(() => {\n copiedColor.value = null\n }, colorSchema.value.copyMessageDuration ?? 1500)\n })\n}\nconst textSchema = computed(() => ({\n ...(props.column as object),\n color: props.cell.color,\n icon: props.cell.icon,\n iconPosition: props.cell.iconPosition,\n iconColor: props.cell.iconColor,\n itemColors: props.cell.itemColors,\n itemIcons: props.cell.itemIcons,\n itemUrls: props.cell.itemUrls,\n}))\n// `SelectColumn::native(false)` renders a combobox.\nconst isComboboxSelect = computed(\n () =>\n props.column.type === 'SelectColumn' && (props.column as { native?: boolean }).native === false,\n)\nconst descriptionPosition = computed(\n () =>\n (props.column as { descriptionPosition?: 'above' | 'below' }).descriptionPosition ?? 'below',\n)\n</script>\n\n<template>\n <component :is=\"custom\" v-if=\"custom\" v-bind=\"props\" :from-registry=\"true\" />\n <component\n :is=\"view\"\n v-else-if=\"view\"\n v-bind=\"{ ...(props.cell.props ?? {}), state: props.cell.state, ...props }\"\n />\n <span v-else-if=\"props.column.type === 'ViewColumn'\" class=\"text-destructive text-xs\">{{\n t(\n 'component_not_registered',\n { component: viewName },\n `Component ${viewName} is not registered.`,\n )\n }}</span>\n <template v-else-if=\"props.column.type === 'IconColumn'\">\n <!-- A list state: one icon per item (`wrap()` lets them wrap). -->\n <div\n v-if=\"props.cell.icons\"\n data-slot=\"icon-column-icons\"\n :class=\"\n cn(\n 'flex items-center gap-1.5',\n (props.column as IconColumnSchema).wrap ? 'flex-wrap' : 'flex-nowrap',\n )\n \"\n >\n <span v-if=\"props.cell.icons.length === 0\" class=\"text-muted-foreground\">—</span>\n <Icon\n v-for=\"(item, index) in props.cell.icons\"\n :key=\"index\"\n :name=\"item.icon\"\n :class=\"\n cn(\n colorClass(iconSizeClasses, props.cell.size, 'md'),\n item.color && textColorClasses[item.color],\n )\n \"\n />\n </div>\n <Icon\n v-else-if=\"props.cell.icon\"\n :name=\"props.cell.icon\"\n :class=\"\n cn(\n colorClass(iconSizeClasses, props.cell.size, 'md'),\n props.cell.color && textColorClasses[props.cell.color],\n )\n \"\n />\n <span v-else class=\"text-muted-foreground\">—</span>\n </template>\n <template v-else-if=\"props.column.type === 'ImageColumn'\">\n <span v-if=\"imageUrls.length === 0\" class=\"text-muted-foreground\">—</span>\n <div\n v-else\n :class=\"\n cn(\n 'flex items-center',\n imageSchema.wrap && 'flex-wrap',\n imageSchema.stacked ? defaultImageStack && '-space-x-2' : 'gap-1.5',\n imageSchema.wrap && imageSchema.stacked && 'gap-y-1.5',\n )\n \"\n >\n <img\n v-for=\"(url, index) in imageUrls.slice(0, imageLimit)\"\n :key=\"index\"\n :src=\"url\"\n :alt=\"props.cell.alt ?? ''\"\n :style=\"[imageStyle, stackedImageStyle(index, imageSchema)]\"\n :class=\"\n cn(\n 'object-cover',\n imageSchema.circular ? 'rounded-full' : 'rounded-md',\n imageSchema.stacked && defaultImageStack && 'ring-background ring-2',\n )\n \"\n v-bind=\"props.cell.extraImgAttributes\"\n />\n <span\n v-if=\"imageSchema.limitedRemainingText && imageUrls.length > imageLimit\"\n data-slot=\"image-remaining\"\n :class=\"\n cn(\n 'text-muted-foreground ms-1',\n remainingTextSizeClass(imageSchema.limitedRemainingTextSize),\n )\n \"\n >+{{ imageUrls.length - imageLimit }}</span\n >\n </div>\n </template>\n <template v-else-if=\"props.column.type === 'ColorColumn'\">\n <span v-if=\"colors.length === 0\" class=\"text-muted-foreground\">—</span>\n <div\n v-else\n :class=\"cn('flex items-center gap-1.5', colorSchema.wrap ? 'flex-wrap' : 'flex-nowrap')\"\n >\n <template v-for=\"color in colors\" :key=\"color\">\n <!-- The cell may sit inside a link or a clickable row. -->\n <button\n v-if=\"colorSchema.copyable\"\n type=\"button\"\n data-slot=\"color-copy\"\n :title=\"color\"\n :aria-label=\"`${t('copy', {}, 'Copy')} ${color}`\"\n class=\"focus-visible:ring-ring/50 inline-flex rounded outline-none focus-visible:ring-[3px]\"\n @click.prevent.stop=\"copyColor(color)\"\n >\n <span\n class=\"inline-flex size-5 items-center justify-center rounded border shadow-xs\"\n :style=\"{ backgroundColor: color }\"\n >\n <CheckIcon\n v-if=\"copiedColor === color\"\n class=\"size-3 text-white mix-blend-difference\"\n />\n </span>\n </button>\n <span\n v-else\n :title=\"color\"\n class=\"size-5 rounded border shadow-xs\"\n :style=\"{ backgroundColor: color }\"\n />\n </template>\n <span\n v-if=\"colorSchema.copyable && copiedColor\"\n role=\"status\"\n :class=\"cn('text-xs', !colorSchema.copyMessage && 'sr-only')\"\n >{{ colorSchema.copyMessage ?? t('copied', {}, 'Copied') }}</span\n >\n </div>\n </template>\n <BooleanCell\n v-else-if=\"props.column.type === 'ToggleColumn' || props.column.type === 'CheckboxColumn'\"\n v-bind=\"props\"\n />\n <SelectComboboxCell v-else-if=\"isComboboxSelect\" v-bind=\"props\" />\n <SelectCell v-else-if=\"props.column.type === 'SelectColumn'\" v-bind=\"props\" />\n <TextInputCell v-else-if=\"props.column.type === 'TextInputColumn'\" v-bind=\"props\" />\n <div v-else class=\"flex flex-col gap-0.5\">\n <span\n v-if=\"props.cell.description && descriptionPosition === 'above'\"\n class=\"text-muted-foreground block text-xs\"\n >{{ props.cell.description }}</span\n >\n <FormattedText :value=\"props.cell.state\" :schema=\"textSchema\" />\n <span\n v-if=\"props.cell.description && descriptionPosition === 'below'\"\n class=\"text-muted-foreground block text-xs\"\n >{{ props.cell.description }}</span\n >\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.js","names":["_sfc_main","TablePagination_vue_vue_type_script_setup_true_lang_default","TablePagination_default"],"sources":["../../../src/components/table/TablePagination.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n extremePageLinks,\n isAppendingPagination,\n nextPageQuery,\n prefetchTablePage,\n previousPageQuery,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Button from '../ui/Button.vue'\n\nconst props = defineProps<{ table: TableSchema }>()\nconst t = useT()\nconst pagination = computed(() => props.table.pagination)\n\nfunction pageWindow(current: number, last: number): Array<number | null> {\n if (last <= 7) {\n return Array.from({ length: last }, (_, index) => index + 1)\n }\n\n const pages = new Set<number>([1, last, current - 1, current, current + 1])\n const sorted = [...pages].filter((page) => page >= 1 && page <= last).sort((a, b) => a - b)\n const result: Array<number | null> = []\n\n sorted.forEach((page, index) => {\n if (index > 0 && page - (sorted[index - 1] ?? 0) > 1) {\n result.push(null)\n }\n\n result.push(page)\n })\n\n return result\n}\n\n// Numbered pages (the default mode) know their total and last page.\nconst numbered = computed(() => {\n const value = pagination.value\n\n return value && (value.mode === undefined || value.mode === 'default') ? value : null\n})\nconst appending = computed(() =>\n isAppendingPagination(pagination.value) ? pagination.value : null,\n)\nconst pages = computed(() =>\n numbered.value ? pageWindow(numbered.value.currentPage, numbered.value.lastPage) : [],\n)\n// `extremePaginationLinks()`: first / last page buttons around numbered pages.\nconst extremes = computed(() =>\n numbered.value\n ? extremePageLinks(props.table, numbered.value.currentPage, numbered.value.lastPage)\n : null,\n)\nconst previous = computed(() => previousPageQuery(pagination.value))\nconst next = computed(() => nextPageQuery(pagination.value))\nconst summary = computed(() => {\n const value = pagination.value\n\n if (!value) return ''\n\n return numbered.value\n ? t(\n 'table.showing',\n { first: value.from, last: value.to, total: numbered.value.total },\n `Showing ${value.from}–${value.to} of ${numbered.value.total}`,\n )\n : t(\n 'table.showing_range',\n { first: value.from, last: value.to },\n `Showing ${value.from}–${value.to}`,\n )\n})\nconst goTo = (page: number) => visitTable(props.table.identifier, { page }, ['page'])\n// The next page is fetched while hovering or focusing \"next\" (cached for a few seconds).\nconst prefetchNext = () => next.value && prefetchTablePage(props.table.identifier, next.value)\n// `deferTotals()`: the total and page numbers arrive after the rows.\nconst pendingTotal = computed(\n () => pagination.value?.mode === 'simple' && pagination.value.pendingTotal === true,\n)\nconst visit = (query: ReturnType<typeof nextPageQuery>) =>\n query && visitTable(props.table.identifier, query, ['page'])\nconst setPerPage = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(props.table.identifier, { perPage: value === 'all' ? 'all' : Number(value) }, ['page'])\n}\n\n// Load more / infinite scroll: the server returns every record up to the requested page,\n// so asking for the next page appends it (and reloads keep what was already shown). A\n// request that fails shows a retry control instead of staying on \"Loading more…\"; infinite\n// scroll waits for the retry rather than requesting again.\nconst loading = ref(false)\nconst failed = ref(false)\nconst sentinel = ref<HTMLElement | null>(null)\nlet observer: IntersectionObserver | null = null\n\nwatch(\n () => pagination.value?.to,\n () => {\n loading.value = false\n failed.value = false\n },\n)\n\nconst loadMore = () => {\n if (!next.value || loading.value) return\n\n let succeeded = false\n let cancelled = false\n loading.value = true\n failed.value = false\n visitTable(props.table.identifier, next.value, ['page'], {\n onSuccess: () => {\n succeeded = true\n },\n onCancel: () => {\n cancelled = true\n },\n onFinish: () => {\n loading.value = false\n if (!succeeded && !cancelled) failed.value = true\n },\n })\n}\n\nwatch(\n [sentinel, () => appending.value?.mode, next, failed],\n ([element, mode, query, hasFailed]) => {\n observer?.disconnect()\n observer = null\n\n if (\n !element ||\n mode !== 'infinite' ||\n !query ||\n hasFailed ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return\n }\n\n observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) loadMore()\n })\n observer.observe(element)\n },\n { flush: 'post' },\n)\n\nonBeforeUnmount(() => observer?.disconnect())\n</script>\n\n<template>\n <div v-if=\"pagination\" class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"text-muted-foreground flex items-center gap-3 text-sm\">\n <span>{{ summary }}</span>\n <span\n v-if=\"pendingTotal\"\n data-slot=\"pagination-total\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 inline-block h-4 w-12 animate-pulse rounded-md\"\n />\n <label v-if=\"pagination.pageOptions.length > 1\" class=\"flex items-center gap-2\">\n <span class=\"sr-only sm:not-sr-only\">{{ t('table.per_page', {}, 'Per page') }}</span>\n <select\n :value=\"String(pagination.perPage)\"\n class=\"border-input h-8 rounded-md border bg-transparent px-2 text-sm\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in pagination.pageOptions\" :key=\"option\" :value=\"String(option)\">\n {{ option === 'all' ? t('table.all', {}, 'All') : option }}\n </option>\n </select>\n </label>\n </div>\n <template v-if=\"appending\">\n <template v-if=\"next\">\n <div v-if=\"failed\" class=\"flex items-center gap-2 text-sm\" role=\"alert\">\n <span class=\"text-destructive\">{{\n t('table.load_more_failed', {}, \"Couldn't load more records.\")\n }}</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" @click=\"loadMore\">{{\n t('retry', {}, 'Retry')\n }}</Button>\n </div>\n <div\n v-else-if=\"appending.mode === 'infinite'\"\n ref=\"sentinel\"\n class=\"text-muted-foreground text-sm\"\n aria-live=\"polite\"\n >\n {{ loading ? t('table.loading_more', {}, 'Loading more…') : '' }}\n </div>\n <Button\n v-else\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :disabled=\"loading\"\n @click=\"loadMore\"\n >\n {{\n loading ? t('table.loading_more', {}, 'Loading more…') : t('load_more', {}, 'Load more')\n }}\n </Button>\n </template>\n </template>\n <nav\n v-else-if=\"previous || next\"\n class=\"flex items-center gap-1\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-first\"\n :disabled=\"extremes.first === null\"\n :aria-label=\"t('table.first_page', {}, 'First page')\"\n @click=\"goTo(1)\"\n ><Icon\n name=\"alfakit::support.pagination.first-button\"\n :fallback=\"ChevronsLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"visit(previous)\"\n ><Icon\n name=\"alfakit::support.pagination.previous-button\"\n :fallback=\"ChevronLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <template v-if=\"numbered && !numbered.simple\">\n <template v-for=\"(page, index) in pages\" :key=\"page === null ? `gap-${index}` : page\">\n <span v-if=\"page === null\" class=\"text-muted-foreground px-1\">…</span>\n <Button\n v-else\n type=\"button\"\n :variant=\"page === numbered.currentPage ? 'default' : 'outline'\"\n size=\"icon-sm\"\n :aria-current=\"page === numbered.currentPage ? 'page' : undefined\"\n @click=\"goTo(page)\"\n >{{ page }}</Button\n >\n </template>\n </template>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"visit(next)\"\n @pointerenter=\"prefetchNext\"\n @focus=\"prefetchNext\"\n ><Icon\n name=\"alfakit::support.pagination.next-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-last\"\n :disabled=\"extremes.last === null\"\n :aria-label=\"t('table.last_page', {}, 'Last page')\"\n @click=\"extremes.last !== null && goTo(extremes.last)\"\n ><Icon\n name=\"alfakit::support.pagination.last-button\"\n :fallback=\"ChevronsRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"TablePagination.js","names":["_sfc_main","TablePagination_vue_vue_type_script_setup_true_lang_default","TablePagination_default"],"sources":["../../../src/components/table/TablePagination.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n extremePageLinks,\n isAppendingPagination,\n nextPageQuery,\n prefetchTablePage,\n previousPageQuery,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useFormatter, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Button from '../ui/Button.vue'\n\nconst props = defineProps<{ table: TableSchema }>()\nconst t = useT()\nconst format = useFormatter()\nconst pagination = computed(() => props.table.pagination)\n\nfunction pageWindow(current: number, last: number): Array<number | null> {\n if (last <= 7) {\n return Array.from({ length: last }, (_, index) => index + 1)\n }\n\n const pages = new Set<number>([1, last, current - 1, current, current + 1])\n const sorted = [...pages].filter((page) => page >= 1 && page <= last).sort((a, b) => a - b)\n const result: Array<number | null> = []\n\n sorted.forEach((page, index) => {\n if (index > 0 && page - (sorted[index - 1] ?? 0) > 1) {\n result.push(null)\n }\n\n result.push(page)\n })\n\n return result\n}\n\n// Numbered pages (the default mode) know their total and last page.\nconst numbered = computed(() => {\n const value = pagination.value\n\n return value && (value.mode === undefined || value.mode === 'default') ? value : null\n})\nconst appending = computed(() =>\n isAppendingPagination(pagination.value) ? pagination.value : null,\n)\nconst pages = computed(() =>\n numbered.value ? pageWindow(numbered.value.currentPage, numbered.value.lastPage) : [],\n)\n// `extremePaginationLinks()`: first / last page buttons around numbered pages.\nconst extremes = computed(() =>\n numbered.value\n ? extremePageLinks(props.table, numbered.value.currentPage, numbered.value.lastPage)\n : null,\n)\nconst previous = computed(() => previousPageQuery(pagination.value))\nconst next = computed(() => nextPageQuery(pagination.value))\nconst summary = computed(() => {\n const value = pagination.value\n\n if (!value) return ''\n\n return numbered.value\n ? t(\n 'table.showing',\n {\n first: format.value.number(value.from),\n last: format.value.number(value.to),\n total: format.value.number(numbered.value.total),\n },\n 'Showing :first–:last of :total',\n )\n : t(\n 'table.showing_range',\n { first: format.value.number(value.from), last: format.value.number(value.to) },\n 'Showing :first–:last',\n )\n})\nconst goTo = (page: number) => visitTable(props.table.identifier, { page }, ['page'])\n// The next page is fetched while hovering or focusing \"next\" (cached for a few seconds).\nconst prefetchNext = () => next.value && prefetchTablePage(props.table.identifier, next.value)\n// `deferTotals()`: the total and page numbers arrive after the rows.\nconst pendingTotal = computed(\n () => pagination.value?.mode === 'simple' && pagination.value.pendingTotal === true,\n)\nconst visit = (query: ReturnType<typeof nextPageQuery>) =>\n query && visitTable(props.table.identifier, query, ['page'])\nconst setPerPage = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(props.table.identifier, { perPage: value === 'all' ? 'all' : Number(value) }, ['page'])\n}\n\n// Load more / infinite scroll: the server returns every record up to the requested page,\n// so asking for the next page appends it (and reloads keep what was already shown). A\n// request that fails shows a retry control instead of staying on \"Loading more…\"; infinite\n// scroll waits for the retry rather than requesting again.\nconst loading = ref(false)\nconst failed = ref(false)\nconst sentinel = ref<HTMLElement | null>(null)\nlet observer: IntersectionObserver | null = null\n\nwatch(\n () => pagination.value?.to,\n () => {\n loading.value = false\n failed.value = false\n },\n)\n\nconst loadMore = () => {\n if (!next.value || loading.value) return\n\n let succeeded = false\n let cancelled = false\n loading.value = true\n failed.value = false\n visitTable(props.table.identifier, next.value, ['page'], {\n onSuccess: () => {\n succeeded = true\n },\n onCancel: () => {\n cancelled = true\n },\n onFinish: () => {\n loading.value = false\n if (!succeeded && !cancelled) failed.value = true\n },\n })\n}\n\nwatch(\n [sentinel, () => appending.value?.mode, next, failed],\n ([element, mode, query, hasFailed]) => {\n observer?.disconnect()\n observer = null\n\n if (\n !element ||\n mode !== 'infinite' ||\n !query ||\n hasFailed ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return\n }\n\n observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) loadMore()\n })\n observer.observe(element)\n },\n { flush: 'post' },\n)\n\nonBeforeUnmount(() => observer?.disconnect())\n</script>\n\n<template>\n <div v-if=\"pagination\" class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"text-muted-foreground flex items-center gap-3 text-sm\">\n <span>{{ summary }}</span>\n <span\n v-if=\"pendingTotal\"\n data-slot=\"pagination-total\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 inline-block h-4 w-12 animate-pulse rounded-md\"\n />\n <label v-if=\"pagination.pageOptions.length > 1\" class=\"flex items-center gap-2\">\n <span class=\"sr-only sm:not-sr-only\">{{ t('table.per_page', {}, 'Per page') }}</span>\n <select\n :value=\"String(pagination.perPage)\"\n class=\"border-input h-8 rounded-md border bg-transparent px-2 text-sm\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in pagination.pageOptions\" :key=\"option\" :value=\"String(option)\">\n {{ option === 'all' ? t('table.all', {}, 'All') : format.number(option) }}\n </option>\n </select>\n </label>\n </div>\n <template v-if=\"appending\">\n <template v-if=\"next\">\n <div v-if=\"failed\" class=\"flex items-center gap-2 text-sm\" role=\"alert\">\n <span class=\"text-destructive\">{{\n t('table.load_more_failed', {}, \"Couldn't load more records.\")\n }}</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" @click=\"loadMore\">{{\n t('retry', {}, 'Retry')\n }}</Button>\n </div>\n <div\n v-else-if=\"appending.mode === 'infinite'\"\n ref=\"sentinel\"\n class=\"text-muted-foreground text-sm\"\n aria-live=\"polite\"\n >\n {{ loading ? t('table.loading_more', {}, 'Loading more…') : '' }}\n </div>\n <Button\n v-else\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :disabled=\"loading\"\n @click=\"loadMore\"\n >\n {{\n loading ? t('table.loading_more', {}, 'Loading more…') : t('load_more', {}, 'Load more')\n }}\n </Button>\n </template>\n </template>\n <nav\n v-else-if=\"previous || next\"\n class=\"flex items-center gap-1\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-first\"\n :disabled=\"extremes.first === null\"\n :aria-label=\"t('table.first_page', {}, 'First page')\"\n @click=\"goTo(1)\"\n ><Icon\n name=\"alfakit::support.pagination.first-button\"\n :fallback=\"ChevronsLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"visit(previous)\"\n ><Icon\n name=\"alfakit::support.pagination.previous-button\"\n :fallback=\"ChevronLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <template v-if=\"numbered && !numbered.simple\">\n <template v-for=\"(page, index) in pages\" :key=\"page === null ? `gap-${index}` : page\">\n <span v-if=\"page === null\" class=\"text-muted-foreground px-1\">…</span>\n <Button\n v-else\n type=\"button\"\n :variant=\"page === numbered.currentPage ? 'default' : 'outline'\"\n size=\"icon-sm\"\n :aria-current=\"page === numbered.currentPage ? 'page' : undefined\"\n @click=\"goTo(page)\"\n >{{ format.number(page) }}</Button\n >\n </template>\n </template>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"visit(next)\"\n @pointerenter=\"prefetchNext\"\n @focus=\"prefetchNext\"\n ><Icon\n name=\"alfakit::support.pagination.next-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-last\"\n :disabled=\"extremes.last === null\"\n :aria-label=\"t('table.last_page', {}, 'Last page')\"\n @click=\"extremes.last !== null && goTo(extremes.last)\"\n ><Icon\n name=\"alfakit::support.pagination.last-button\"\n :fallback=\"ChevronsRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n </div>\n</template>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/TablePagination.vue"],"names":[],"mappings":"AAkSA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAehD,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;;AAilB1C,wBAMG"}
1
+ {"version":3,"file":"TablePagination.vue.d.ts","sourceRoot":"","sources":["../../../src/components/table/TablePagination.vue"],"names":[],"mappings":"AAuSA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAehD,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;;AAulB1C,wBAMG"}
@@ -1,29 +1,29 @@
1
- import { useT as e } from "../../context.js";
2
- import t from "../../lib/Icon.js";
3
- import n from "../ui/Button2.js";
4
- import { extremePageLinks as r, isAppendingPagination as i, nextPageQuery as a, prefetchTablePage as ee, previousPageQuery as o, visitTable as s } from "@alfakit/core";
5
- import { Fragment as c, computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createTextVNode as m, createVNode as h, defineComponent as g, onBeforeUnmount as _, openBlock as v, ref as y, renderList as b, toDisplayString as x, unref as S, watch as C, withCtx as w } from "vue";
6
- import { ChevronLeftIcon as te, ChevronRightIcon as T, ChevronsLeftIcon as E, ChevronsRightIcon as D } from "@lucide/vue";
1
+ import { useFormatter as e, useT as t } from "../../context.js";
2
+ import n from "../../lib/Icon.js";
3
+ import r from "../ui/Button2.js";
4
+ import { extremePageLinks as i, isAppendingPagination as ee, nextPageQuery as a, prefetchTablePage as o, previousPageQuery as s, visitTable as c } from "@alfakit/core";
5
+ import { Fragment as l, computed as u, createBlock as d, createCommentVNode as f, createElementBlock as p, createElementVNode as m, createTextVNode as h, createVNode as g, defineComponent as _, onBeforeUnmount as v, openBlock as y, ref as b, renderList as x, toDisplayString as S, unref as C, watch as w, withCtx as T } from "vue";
6
+ import { ChevronLeftIcon as E, ChevronRightIcon as D, ChevronsLeftIcon as O, ChevronsRightIcon as k } from "@lucide/vue";
7
7
  //#region src/components/table/TablePagination.vue?vue&type=script&setup=true&lang.ts
8
- var O = {
8
+ var te = {
9
9
  key: 0,
10
10
  class: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"
11
- }, k = { class: "text-muted-foreground flex items-center gap-3 text-sm" }, A = ["aria-label"], j = {
11
+ }, ne = { class: "text-muted-foreground flex items-center gap-3 text-sm" }, re = ["aria-label"], ie = {
12
12
  key: 1,
13
13
  class: "flex items-center gap-2"
14
- }, ne = { class: "sr-only sm:not-sr-only" }, re = ["value"], ie = ["value"], ae = {
14
+ }, ae = { class: "sr-only sm:not-sr-only" }, A = ["value"], oe = ["value"], se = {
15
15
  key: 0,
16
16
  class: "flex items-center gap-2 text-sm",
17
17
  role: "alert"
18
- }, oe = { class: "text-destructive" }, M = ["aria-label"], N = {
18
+ }, j = { class: "text-destructive" }, M = ["aria-label"], N = {
19
19
  key: 0,
20
20
  class: "text-muted-foreground px-1"
21
- }, P = /*@__PURE__*/ g({
21
+ }, P = /*@__PURE__*/ _({
22
22
  __name: "TablePagination",
23
23
  props: { table: {} },
24
- setup(g) {
25
- let P = g, F = e(), I = l(() => P.table.pagination);
26
- function L(e, t) {
24
+ setup(_) {
25
+ let P = _, F = t(), I = e(), L = u(() => P.table.pagination);
26
+ function R(e, t) {
27
27
  if (t <= 7) return Array.from({ length: t }, (e, t) => t + 1);
28
28
  let n = [.../* @__PURE__ */ new Set([
29
29
  1,
@@ -36,30 +36,30 @@ var O = {
36
36
  t > 0 && e - (n[t - 1] ?? 0) > 1 && r.push(null), r.push(e);
37
37
  }), r;
38
38
  }
39
- let R = l(() => {
40
- let e = I.value;
39
+ let z = u(() => {
40
+ let e = L.value;
41
41
  return e && (e.mode === void 0 || e.mode === "default") ? e : null;
42
- }), z = l(() => i(I.value) ? I.value : null), B = l(() => R.value ? L(R.value.currentPage, R.value.lastPage) : []), V = l(() => R.value ? r(P.table, R.value.currentPage, R.value.lastPage) : null), H = l(() => o(I.value)), U = l(() => a(I.value)), W = l(() => {
43
- let e = I.value;
44
- return e ? R.value ? F("table.showing", {
45
- first: e.from,
46
- last: e.to,
47
- total: R.value.total
48
- }, `Showing ${e.from}–${e.to} of ${R.value.total}`) : F("table.showing_range", {
49
- first: e.from,
50
- last: e.to
51
- }, `Showing ${e.from}–${e.to}`) : "";
52
- }), G = (e) => s(P.table.identifier, { page: e }, ["page"]), K = () => U.value && ee(P.table.identifier, U.value), q = l(() => I.value?.mode === "simple" && I.value.pendingTotal === !0), J = (e) => e && s(P.table.identifier, e, ["page"]), se = (e) => {
42
+ }), B = u(() => ee(L.value) ? L.value : null), V = u(() => z.value ? R(z.value.currentPage, z.value.lastPage) : []), H = u(() => z.value ? i(P.table, z.value.currentPage, z.value.lastPage) : null), U = u(() => s(L.value)), W = u(() => a(L.value)), G = u(() => {
43
+ let e = L.value;
44
+ return e ? z.value ? F("table.showing", {
45
+ first: I.value.number(e.from),
46
+ last: I.value.number(e.to),
47
+ total: I.value.number(z.value.total)
48
+ }, "Showing :first–:last of :total") : F("table.showing_range", {
49
+ first: I.value.number(e.from),
50
+ last: I.value.number(e.to)
51
+ }, "Showing :first–:last") : "";
52
+ }), K = (e) => c(P.table.identifier, { page: e }, ["page"]), q = () => W.value && o(P.table.identifier, W.value), ce = u(() => L.value?.mode === "simple" && L.value.pendingTotal === !0), J = (e) => e && c(P.table.identifier, e, ["page"]), le = (e) => {
53
53
  let t = e.target.value;
54
- s(P.table.identifier, { perPage: t === "all" ? "all" : Number(t) }, ["page"]);
55
- }, Y = y(!1), X = y(!1), Z = y(null), Q = null;
56
- C(() => I.value?.to, () => {
54
+ c(P.table.identifier, { perPage: t === "all" ? "all" : Number(t) }, ["page"]);
55
+ }, Y = b(!1), X = b(!1), Z = b(null), Q = null;
56
+ w(() => L.value?.to, () => {
57
57
  Y.value = !1, X.value = !1;
58
58
  });
59
59
  let $ = () => {
60
- if (!U.value || Y.value) return;
60
+ if (!W.value || Y.value) return;
61
61
  let e = !1, t = !1;
62
- Y.value = !0, X.value = !1, s(P.table.identifier, U.value, ["page"], {
62
+ Y.value = !0, X.value = !1, c(P.table.identifier, W.value, ["page"], {
63
63
  onSuccess: () => {
64
64
  e = !0;
65
65
  },
@@ -71,47 +71,47 @@ var O = {
71
71
  }
72
72
  });
73
73
  };
74
- return C([
74
+ return w([
75
75
  Z,
76
- () => z.value?.mode,
77
- U,
76
+ () => B.value?.mode,
77
+ W,
78
78
  X
79
79
  ], ([e, t, n, r]) => {
80
80
  Q?.disconnect(), Q = null, e && t === "infinite" && n && !r && typeof IntersectionObserver < "u" && (Q = new IntersectionObserver((e) => {
81
81
  e.some((e) => e.isIntersecting) && $();
82
82
  }), Q.observe(e));
83
- }, { flush: "post" }), _(() => Q?.disconnect()), (e, r) => I.value ? (v(), f("div", O, [p("div", k, [
84
- p("span", null, x(W.value), 1),
85
- q.value ? (v(), f("span", {
83
+ }, { flush: "post" }), v(() => Q?.disconnect()), (e, t) => L.value ? (y(), p("div", te, [m("div", ne, [
84
+ m("span", null, S(G.value), 1),
85
+ ce.value ? (y(), p("span", {
86
86
  key: 0,
87
87
  "data-slot": "pagination-total",
88
88
  "aria-busy": "true",
89
- "aria-label": S(F)("loading", {}, "Loading"),
89
+ "aria-label": C(F)("loading", {}, "Loading"),
90
90
  class: "bg-muted-foreground/20 inline-block h-4 w-12 animate-pulse rounded-md"
91
- }, null, 8, A)) : d("", !0),
92
- I.value.pageOptions.length > 1 ? (v(), f("label", j, [p("span", ne, x(S(F)("table.per_page", {}, "Per page")), 1), p("select", {
93
- value: String(I.value.perPage),
91
+ }, null, 8, re)) : f("", !0),
92
+ L.value.pageOptions.length > 1 ? (y(), p("label", ie, [m("span", ae, S(C(F)("table.per_page", {}, "Per page")), 1), m("select", {
93
+ value: String(L.value.perPage),
94
94
  class: "border-input h-8 rounded-md border bg-transparent px-2 text-sm",
95
- onChange: se
96
- }, [(v(!0), f(c, null, b(I.value.pageOptions, (e) => (v(), f("option", {
95
+ onChange: le
96
+ }, [(y(!0), p(l, null, x(L.value.pageOptions, (e) => (y(), p("option", {
97
97
  key: e,
98
98
  value: String(e)
99
- }, x(e === "all" ? S(F)("table.all", {}, "All") : e), 9, ie))), 128))], 40, re)])) : d("", !0)
100
- ]), z.value ? (v(), f(c, { key: 0 }, [U.value ? (v(), f(c, { key: 0 }, [X.value ? (v(), f("div", ae, [p("span", oe, x(S(F)("table.load_more_failed", {}, "Couldn't load more records.")), 1), h(n, {
99
+ }, S(e === "all" ? C(F)("table.all", {}, "All") : C(I).number(e)), 9, oe))), 128))], 40, A)])) : f("", !0)
100
+ ]), B.value ? (y(), p(l, { key: 0 }, [W.value ? (y(), p(l, { key: 0 }, [X.value ? (y(), p("div", se, [m("span", j, S(C(F)("table.load_more_failed", {}, "Couldn't load more records.")), 1), g(r, {
101
101
  type: "button",
102
102
  variant: "outline",
103
103
  size: "sm",
104
104
  onClick: $
105
105
  }, {
106
- default: w(() => [m(x(S(F)("retry", {}, "Retry")), 1)]),
106
+ default: T(() => [h(S(C(F)("retry", {}, "Retry")), 1)]),
107
107
  _: 1
108
- })])) : z.value.mode === "infinite" ? (v(), f("div", {
108
+ })])) : B.value.mode === "infinite" ? (y(), p("div", {
109
109
  key: 1,
110
110
  ref_key: "sentinel",
111
111
  ref: Z,
112
112
  class: "text-muted-foreground text-sm",
113
113
  "aria-live": "polite"
114
- }, x(Y.value ? S(F)("table.loading_more", {}, "Loading more…") : ""), 513)) : (v(), u(n, {
114
+ }, S(Y.value ? C(F)("table.loading_more", {}, "Loading more…") : ""), 513)) : (y(), d(r, {
115
115
  key: 2,
116
116
  type: "button",
117
117
  variant: "outline",
@@ -119,95 +119,95 @@ var O = {
119
119
  disabled: Y.value,
120
120
  onClick: $
121
121
  }, {
122
- default: w(() => [m(x(Y.value ? S(F)("table.loading_more", {}, "Loading more…") : S(F)("load_more", {}, "Load more")), 1)]),
122
+ default: T(() => [h(S(Y.value ? C(F)("table.loading_more", {}, "Loading more…") : C(F)("load_more", {}, "Load more")), 1)]),
123
123
  _: 1
124
- }, 8, ["disabled"]))], 64)) : d("", !0)], 64)) : H.value || U.value ? (v(), f("nav", {
124
+ }, 8, ["disabled"]))], 64)) : f("", !0)], 64)) : U.value || W.value ? (y(), p("nav", {
125
125
  key: 1,
126
126
  class: "flex items-center gap-1",
127
- "aria-label": S(F)("pagination", {}, "Pagination")
127
+ "aria-label": C(F)("pagination", {}, "Pagination")
128
128
  }, [
129
- V.value ? (v(), u(n, {
129
+ H.value ? (y(), d(r, {
130
130
  key: 0,
131
131
  type: "button",
132
132
  variant: "outline",
133
133
  size: "icon-sm",
134
134
  "data-slot": "pagination-first",
135
- disabled: V.value.first === null,
136
- "aria-label": S(F)("table.first_page", {}, "First page"),
137
- onClick: r[0] ||= (e) => G(1)
135
+ disabled: H.value.first === null,
136
+ "aria-label": C(F)("table.first_page", {}, "First page"),
137
+ onClick: t[0] ||= (e) => K(1)
138
138
  }, {
139
- default: w(() => [h(S(t), {
139
+ default: T(() => [g(C(n), {
140
140
  name: "alfakit::support.pagination.first-button",
141
- fallback: S(E),
141
+ fallback: C(O),
142
142
  class: "rtl:rotate-180"
143
143
  }, null, 8, ["fallback"])]),
144
144
  _: 1
145
- }, 8, ["disabled", "aria-label"])) : d("", !0),
146
- h(n, {
145
+ }, 8, ["disabled", "aria-label"])) : f("", !0),
146
+ g(r, {
147
147
  type: "button",
148
148
  variant: "outline",
149
149
  size: "icon-sm",
150
- disabled: !H.value,
151
- "aria-label": S(F)("table.previous", {}, "Previous"),
152
- onClick: r[1] ||= (e) => J(H.value)
150
+ disabled: !U.value,
151
+ "aria-label": C(F)("table.previous", {}, "Previous"),
152
+ onClick: t[1] ||= (e) => J(U.value)
153
153
  }, {
154
- default: w(() => [h(S(t), {
154
+ default: T(() => [g(C(n), {
155
155
  name: "alfakit::support.pagination.previous-button",
156
- fallback: S(te),
156
+ fallback: C(E),
157
157
  class: "rtl:rotate-180"
158
158
  }, null, 8, ["fallback"])]),
159
159
  _: 1
160
160
  }, 8, ["disabled", "aria-label"]),
161
- R.value && !R.value.simple ? (v(!0), f(c, { key: 1 }, b(B.value, (e, t) => (v(), f(c, { key: e === null ? `gap-${t}` : e }, [e === null ? (v(), f("span", N, "…")) : (v(), u(n, {
161
+ z.value && !z.value.simple ? (y(!0), p(l, { key: 1 }, x(V.value, (e, t) => (y(), p(l, { key: e === null ? `gap-${t}` : e }, [e === null ? (y(), p("span", N, "…")) : (y(), d(r, {
162
162
  key: 1,
163
163
  type: "button",
164
- variant: e === R.value.currentPage ? "default" : "outline",
164
+ variant: e === z.value.currentPage ? "default" : "outline",
165
165
  size: "icon-sm",
166
- "aria-current": e === R.value.currentPage ? "page" : void 0,
167
- onClick: (t) => G(e)
166
+ "aria-current": e === z.value.currentPage ? "page" : void 0,
167
+ onClick: (t) => K(e)
168
168
  }, {
169
- default: w(() => [m(x(e), 1)]),
169
+ default: T(() => [h(S(C(I).number(e)), 1)]),
170
170
  _: 2
171
171
  }, 1032, [
172
172
  "variant",
173
173
  "aria-current",
174
174
  "onClick"
175
- ]))], 64))), 128)) : d("", !0),
176
- h(n, {
175
+ ]))], 64))), 128)) : f("", !0),
176
+ g(r, {
177
177
  type: "button",
178
178
  variant: "outline",
179
179
  size: "icon-sm",
180
- disabled: !U.value,
181
- "aria-label": S(F)("table.next", {}, "Next"),
182
- onClick: r[2] ||= (e) => J(U.value),
183
- onPointerenter: K,
184
- onFocus: K
180
+ disabled: !W.value,
181
+ "aria-label": C(F)("table.next", {}, "Next"),
182
+ onClick: t[2] ||= (e) => J(W.value),
183
+ onPointerenter: q,
184
+ onFocus: q
185
185
  }, {
186
- default: w(() => [h(S(t), {
186
+ default: T(() => [g(C(n), {
187
187
  name: "alfakit::support.pagination.next-button",
188
- fallback: S(T),
188
+ fallback: C(D),
189
189
  class: "rtl:rotate-180"
190
190
  }, null, 8, ["fallback"])]),
191
191
  _: 1
192
192
  }, 8, ["disabled", "aria-label"]),
193
- V.value ? (v(), u(n, {
193
+ H.value ? (y(), d(r, {
194
194
  key: 2,
195
195
  type: "button",
196
196
  variant: "outline",
197
197
  size: "icon-sm",
198
198
  "data-slot": "pagination-last",
199
- disabled: V.value.last === null,
200
- "aria-label": S(F)("table.last_page", {}, "Last page"),
201
- onClick: r[3] ||= (e) => V.value.last !== null && G(V.value.last)
199
+ disabled: H.value.last === null,
200
+ "aria-label": C(F)("table.last_page", {}, "Last page"),
201
+ onClick: t[3] ||= (e) => H.value.last !== null && K(H.value.last)
202
202
  }, {
203
- default: w(() => [h(S(t), {
203
+ default: T(() => [g(C(n), {
204
204
  name: "alfakit::support.pagination.last-button",
205
- fallback: S(D),
205
+ fallback: C(k),
206
206
  class: "rtl:rotate-180"
207
207
  }, null, 8, ["fallback"])]),
208
208
  _: 1
209
- }, 8, ["disabled", "aria-label"])) : d("", !0)
210
- ], 8, M)) : d("", !0)])) : d("", !0);
209
+ }, 8, ["disabled", "aria-label"])) : f("", !0)
210
+ ], 8, M)) : f("", !0)])) : f("", !0);
211
211
  }
212
212
  });
213
213
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_unref","_createCommentVNode","_Fragment","_renderList","_createVNode","Button","_withCtx","_createTextVNode","_createBlock","Icon","Icon_default","Button_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","TablePagination_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","pagination","computed","pageWindow","last","index","sorted","current","page","a","b","result","numbered","value","appending","isAppendingPagination","pages","extremes","extremePageLinks","previous","previousPageQuery","next","nextPageQuery","summary","goTo","visitTable","prefetchNext","prefetchTablePage","pendingTotal","visit","query","setPerPage","event","loading","ref","failed","sentinel","observer","loadMore","succeeded","cancelled","watch","element","mode","hasFailed","entries","entry","onBeforeUnmount","openBlock","createElementBlock","createElementVNode","toDisplayString","unref","createCommentVNode","Fragment","renderList","option","createVNode","withCtx","createTextVNode","createBlock","_cache","ChevronsLeftIcon","ChevronLeftIcon","ChevronRightIcon","ChevronsRightIcon"],"sources":["../../../src/components/table/TablePagination.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n extremePageLinks,\n isAppendingPagination,\n nextPageQuery,\n prefetchTablePage,\n previousPageQuery,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Button from '../ui/Button.vue'\n\nconst props = defineProps<{ table: TableSchema }>()\nconst t = useT()\nconst pagination = computed(() => props.table.pagination)\n\nfunction pageWindow(current: number, last: number): Array<number | null> {\n if (last <= 7) {\n return Array.from({ length: last }, (_, index) => index + 1)\n }\n\n const pages = new Set<number>([1, last, current - 1, current, current + 1])\n const sorted = [...pages].filter((page) => page >= 1 && page <= last).sort((a, b) => a - b)\n const result: Array<number | null> = []\n\n sorted.forEach((page, index) => {\n if (index > 0 && page - (sorted[index - 1] ?? 0) > 1) {\n result.push(null)\n }\n\n result.push(page)\n })\n\n return result\n}\n\n// Numbered pages (the default mode) know their total and last page.\nconst numbered = computed(() => {\n const value = pagination.value\n\n return value && (value.mode === undefined || value.mode === 'default') ? value : null\n})\nconst appending = computed(() =>\n isAppendingPagination(pagination.value) ? pagination.value : null,\n)\nconst pages = computed(() =>\n numbered.value ? pageWindow(numbered.value.currentPage, numbered.value.lastPage) : [],\n)\n// `extremePaginationLinks()`: first / last page buttons around numbered pages.\nconst extremes = computed(() =>\n numbered.value\n ? extremePageLinks(props.table, numbered.value.currentPage, numbered.value.lastPage)\n : null,\n)\nconst previous = computed(() => previousPageQuery(pagination.value))\nconst next = computed(() => nextPageQuery(pagination.value))\nconst summary = computed(() => {\n const value = pagination.value\n\n if (!value) return ''\n\n return numbered.value\n ? t(\n 'table.showing',\n { first: value.from, last: value.to, total: numbered.value.total },\n `Showing ${value.from}–${value.to} of ${numbered.value.total}`,\n )\n : t(\n 'table.showing_range',\n { first: value.from, last: value.to },\n `Showing ${value.from}–${value.to}`,\n )\n})\nconst goTo = (page: number) => visitTable(props.table.identifier, { page }, ['page'])\n// The next page is fetched while hovering or focusing \"next\" (cached for a few seconds).\nconst prefetchNext = () => next.value && prefetchTablePage(props.table.identifier, next.value)\n// `deferTotals()`: the total and page numbers arrive after the rows.\nconst pendingTotal = computed(\n () => pagination.value?.mode === 'simple' && pagination.value.pendingTotal === true,\n)\nconst visit = (query: ReturnType<typeof nextPageQuery>) =>\n query && visitTable(props.table.identifier, query, ['page'])\nconst setPerPage = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(props.table.identifier, { perPage: value === 'all' ? 'all' : Number(value) }, ['page'])\n}\n\n// Load more / infinite scroll: the server returns every record up to the requested page,\n// so asking for the next page appends it (and reloads keep what was already shown). A\n// request that fails shows a retry control instead of staying on \"Loading more…\"; infinite\n// scroll waits for the retry rather than requesting again.\nconst loading = ref(false)\nconst failed = ref(false)\nconst sentinel = ref<HTMLElement | null>(null)\nlet observer: IntersectionObserver | null = null\n\nwatch(\n () => pagination.value?.to,\n () => {\n loading.value = false\n failed.value = false\n },\n)\n\nconst loadMore = () => {\n if (!next.value || loading.value) return\n\n let succeeded = false\n let cancelled = false\n loading.value = true\n failed.value = false\n visitTable(props.table.identifier, next.value, ['page'], {\n onSuccess: () => {\n succeeded = true\n },\n onCancel: () => {\n cancelled = true\n },\n onFinish: () => {\n loading.value = false\n if (!succeeded && !cancelled) failed.value = true\n },\n })\n}\n\nwatch(\n [sentinel, () => appending.value?.mode, next, failed],\n ([element, mode, query, hasFailed]) => {\n observer?.disconnect()\n observer = null\n\n if (\n !element ||\n mode !== 'infinite' ||\n !query ||\n hasFailed ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return\n }\n\n observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) loadMore()\n })\n observer.observe(element)\n },\n { flush: 'post' },\n)\n\nonBeforeUnmount(() => observer?.disconnect())\n</script>\n\n<template>\n <div v-if=\"pagination\" class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"text-muted-foreground flex items-center gap-3 text-sm\">\n <span>{{ summary }}</span>\n <span\n v-if=\"pendingTotal\"\n data-slot=\"pagination-total\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 inline-block h-4 w-12 animate-pulse rounded-md\"\n />\n <label v-if=\"pagination.pageOptions.length > 1\" class=\"flex items-center gap-2\">\n <span class=\"sr-only sm:not-sr-only\">{{ t('table.per_page', {}, 'Per page') }}</span>\n <select\n :value=\"String(pagination.perPage)\"\n class=\"border-input h-8 rounded-md border bg-transparent px-2 text-sm\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in pagination.pageOptions\" :key=\"option\" :value=\"String(option)\">\n {{ option === 'all' ? t('table.all', {}, 'All') : option }}\n </option>\n </select>\n </label>\n </div>\n <template v-if=\"appending\">\n <template v-if=\"next\">\n <div v-if=\"failed\" class=\"flex items-center gap-2 text-sm\" role=\"alert\">\n <span class=\"text-destructive\">{{\n t('table.load_more_failed', {}, \"Couldn't load more records.\")\n }}</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" @click=\"loadMore\">{{\n t('retry', {}, 'Retry')\n }}</Button>\n </div>\n <div\n v-else-if=\"appending.mode === 'infinite'\"\n ref=\"sentinel\"\n class=\"text-muted-foreground text-sm\"\n aria-live=\"polite\"\n >\n {{ loading ? t('table.loading_more', {}, 'Loading more…') : '' }}\n </div>\n <Button\n v-else\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :disabled=\"loading\"\n @click=\"loadMore\"\n >\n {{\n loading ? t('table.loading_more', {}, 'Loading more…') : t('load_more', {}, 'Load more')\n }}\n </Button>\n </template>\n </template>\n <nav\n v-else-if=\"previous || next\"\n class=\"flex items-center gap-1\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-first\"\n :disabled=\"extremes.first === null\"\n :aria-label=\"t('table.first_page', {}, 'First page')\"\n @click=\"goTo(1)\"\n ><Icon\n name=\"alfakit::support.pagination.first-button\"\n :fallback=\"ChevronsLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"visit(previous)\"\n ><Icon\n name=\"alfakit::support.pagination.previous-button\"\n :fallback=\"ChevronLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <template v-if=\"numbered && !numbered.simple\">\n <template v-for=\"(page, index) in pages\" :key=\"page === null ? `gap-${index}` : page\">\n <span v-if=\"page === null\" class=\"text-muted-foreground px-1\">…</span>\n <Button\n v-else\n type=\"button\"\n :variant=\"page === numbered.currentPage ? 'default' : 'outline'\"\n size=\"icon-sm\"\n :aria-current=\"page === numbered.currentPage ? 'page' : undefined\"\n @click=\"goTo(page)\"\n >{{ page }}</Button\n >\n </template>\n </template>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"visit(next)\"\n @pointerenter=\"prefetchNext\"\n @focus=\"prefetchNext\"\n ><Icon\n name=\"alfakit::support.pagination.next-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-last\"\n :disabled=\"extremes.last === null\"\n :aria-label=\"t('table.last_page', {}, 'Last page')\"\n @click=\"extremes.last !== null && goTo(extremes.last)\"\n ><Icon\n name=\"alfakit::support.pagination.last-button\"\n :fallback=\"ChevronsRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"TablePagination.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_unref","_createCommentVNode","_Fragment","_renderList","_createVNode","Button","_withCtx","_createTextVNode","_createBlock","Icon","Icon_default","Button_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","TablePagination_vue_vue_type_script_setup_true_lang_default","props","__props","t","useT","format","useFormatter","pagination","computed","pageWindow","last","index","sorted","current","page","a","b","result","numbered","value","appending","isAppendingPagination","pages","extremes","extremePageLinks","previous","previousPageQuery","next","nextPageQuery","summary","goTo","visitTable","prefetchNext","prefetchTablePage","pendingTotal","visit","query","setPerPage","event","loading","ref","failed","sentinel","observer","loadMore","succeeded","cancelled","watch","element","mode","hasFailed","entries","entry","onBeforeUnmount","openBlock","createElementBlock","createElementVNode","toDisplayString","unref","createCommentVNode","Fragment","renderList","option","createVNode","withCtx","createTextVNode","createBlock","_cache","ChevronsLeftIcon","ChevronLeftIcon","ChevronRightIcon","ChevronsRightIcon"],"sources":["../../../src/components/table/TablePagination.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { TableSchema } from '@alfakit/core'\nimport {\n extremePageLinks,\n isAppendingPagination,\n nextPageQuery,\n prefetchTablePage,\n previousPageQuery,\n visitTable,\n} from '@alfakit/core'\nimport { ChevronLeftIcon, ChevronRightIcon, ChevronsLeftIcon, ChevronsRightIcon } from '@lucide/vue'\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useFormatter, useT } from '../../context'\nimport { Icon } from '../../lib/icons'\nimport Button from '../ui/Button.vue'\n\nconst props = defineProps<{ table: TableSchema }>()\nconst t = useT()\nconst format = useFormatter()\nconst pagination = computed(() => props.table.pagination)\n\nfunction pageWindow(current: number, last: number): Array<number | null> {\n if (last <= 7) {\n return Array.from({ length: last }, (_, index) => index + 1)\n }\n\n const pages = new Set<number>([1, last, current - 1, current, current + 1])\n const sorted = [...pages].filter((page) => page >= 1 && page <= last).sort((a, b) => a - b)\n const result: Array<number | null> = []\n\n sorted.forEach((page, index) => {\n if (index > 0 && page - (sorted[index - 1] ?? 0) > 1) {\n result.push(null)\n }\n\n result.push(page)\n })\n\n return result\n}\n\n// Numbered pages (the default mode) know their total and last page.\nconst numbered = computed(() => {\n const value = pagination.value\n\n return value && (value.mode === undefined || value.mode === 'default') ? value : null\n})\nconst appending = computed(() =>\n isAppendingPagination(pagination.value) ? pagination.value : null,\n)\nconst pages = computed(() =>\n numbered.value ? pageWindow(numbered.value.currentPage, numbered.value.lastPage) : [],\n)\n// `extremePaginationLinks()`: first / last page buttons around numbered pages.\nconst extremes = computed(() =>\n numbered.value\n ? extremePageLinks(props.table, numbered.value.currentPage, numbered.value.lastPage)\n : null,\n)\nconst previous = computed(() => previousPageQuery(pagination.value))\nconst next = computed(() => nextPageQuery(pagination.value))\nconst summary = computed(() => {\n const value = pagination.value\n\n if (!value) return ''\n\n return numbered.value\n ? t(\n 'table.showing',\n {\n first: format.value.number(value.from),\n last: format.value.number(value.to),\n total: format.value.number(numbered.value.total),\n },\n 'Showing :first–:last of :total',\n )\n : t(\n 'table.showing_range',\n { first: format.value.number(value.from), last: format.value.number(value.to) },\n 'Showing :first–:last',\n )\n})\nconst goTo = (page: number) => visitTable(props.table.identifier, { page }, ['page'])\n// The next page is fetched while hovering or focusing \"next\" (cached for a few seconds).\nconst prefetchNext = () => next.value && prefetchTablePage(props.table.identifier, next.value)\n// `deferTotals()`: the total and page numbers arrive after the rows.\nconst pendingTotal = computed(\n () => pagination.value?.mode === 'simple' && pagination.value.pendingTotal === true,\n)\nconst visit = (query: ReturnType<typeof nextPageQuery>) =>\n query && visitTable(props.table.identifier, query, ['page'])\nconst setPerPage = (event: Event) => {\n const value = (event.target as HTMLSelectElement).value\n visitTable(props.table.identifier, { perPage: value === 'all' ? 'all' : Number(value) }, ['page'])\n}\n\n// Load more / infinite scroll: the server returns every record up to the requested page,\n// so asking for the next page appends it (and reloads keep what was already shown). A\n// request that fails shows a retry control instead of staying on \"Loading more…\"; infinite\n// scroll waits for the retry rather than requesting again.\nconst loading = ref(false)\nconst failed = ref(false)\nconst sentinel = ref<HTMLElement | null>(null)\nlet observer: IntersectionObserver | null = null\n\nwatch(\n () => pagination.value?.to,\n () => {\n loading.value = false\n failed.value = false\n },\n)\n\nconst loadMore = () => {\n if (!next.value || loading.value) return\n\n let succeeded = false\n let cancelled = false\n loading.value = true\n failed.value = false\n visitTable(props.table.identifier, next.value, ['page'], {\n onSuccess: () => {\n succeeded = true\n },\n onCancel: () => {\n cancelled = true\n },\n onFinish: () => {\n loading.value = false\n if (!succeeded && !cancelled) failed.value = true\n },\n })\n}\n\nwatch(\n [sentinel, () => appending.value?.mode, next, failed],\n ([element, mode, query, hasFailed]) => {\n observer?.disconnect()\n observer = null\n\n if (\n !element ||\n mode !== 'infinite' ||\n !query ||\n hasFailed ||\n typeof IntersectionObserver === 'undefined'\n ) {\n return\n }\n\n observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) loadMore()\n })\n observer.observe(element)\n },\n { flush: 'post' },\n)\n\nonBeforeUnmount(() => observer?.disconnect())\n</script>\n\n<template>\n <div v-if=\"pagination\" class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div class=\"text-muted-foreground flex items-center gap-3 text-sm\">\n <span>{{ summary }}</span>\n <span\n v-if=\"pendingTotal\"\n data-slot=\"pagination-total\"\n aria-busy=\"true\"\n :aria-label=\"t('loading', {}, 'Loading')\"\n class=\"bg-muted-foreground/20 inline-block h-4 w-12 animate-pulse rounded-md\"\n />\n <label v-if=\"pagination.pageOptions.length > 1\" class=\"flex items-center gap-2\">\n <span class=\"sr-only sm:not-sr-only\">{{ t('table.per_page', {}, 'Per page') }}</span>\n <select\n :value=\"String(pagination.perPage)\"\n class=\"border-input h-8 rounded-md border bg-transparent px-2 text-sm\"\n @change=\"setPerPage\"\n >\n <option v-for=\"option in pagination.pageOptions\" :key=\"option\" :value=\"String(option)\">\n {{ option === 'all' ? t('table.all', {}, 'All') : format.number(option) }}\n </option>\n </select>\n </label>\n </div>\n <template v-if=\"appending\">\n <template v-if=\"next\">\n <div v-if=\"failed\" class=\"flex items-center gap-2 text-sm\" role=\"alert\">\n <span class=\"text-destructive\">{{\n t('table.load_more_failed', {}, \"Couldn't load more records.\")\n }}</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" @click=\"loadMore\">{{\n t('retry', {}, 'Retry')\n }}</Button>\n </div>\n <div\n v-else-if=\"appending.mode === 'infinite'\"\n ref=\"sentinel\"\n class=\"text-muted-foreground text-sm\"\n aria-live=\"polite\"\n >\n {{ loading ? t('table.loading_more', {}, 'Loading more…') : '' }}\n </div>\n <Button\n v-else\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n :disabled=\"loading\"\n @click=\"loadMore\"\n >\n {{\n loading ? t('table.loading_more', {}, 'Loading more…') : t('load_more', {}, 'Load more')\n }}\n </Button>\n </template>\n </template>\n <nav\n v-else-if=\"previous || next\"\n class=\"flex items-center gap-1\"\n :aria-label=\"t('pagination', {}, 'Pagination')\"\n >\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-first\"\n :disabled=\"extremes.first === null\"\n :aria-label=\"t('table.first_page', {}, 'First page')\"\n @click=\"goTo(1)\"\n ><Icon\n name=\"alfakit::support.pagination.first-button\"\n :fallback=\"ChevronsLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!previous\"\n :aria-label=\"t('table.previous', {}, 'Previous')\"\n @click=\"visit(previous)\"\n ><Icon\n name=\"alfakit::support.pagination.previous-button\"\n :fallback=\"ChevronLeftIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <template v-if=\"numbered && !numbered.simple\">\n <template v-for=\"(page, index) in pages\" :key=\"page === null ? `gap-${index}` : page\">\n <span v-if=\"page === null\" class=\"text-muted-foreground px-1\">…</span>\n <Button\n v-else\n type=\"button\"\n :variant=\"page === numbered.currentPage ? 'default' : 'outline'\"\n size=\"icon-sm\"\n :aria-current=\"page === numbered.currentPage ? 'page' : undefined\"\n @click=\"goTo(page)\"\n >{{ format.number(page) }}</Button\n >\n </template>\n </template>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n :disabled=\"!next\"\n :aria-label=\"t('table.next', {}, 'Next')\"\n @click=\"visit(next)\"\n @pointerenter=\"prefetchNext\"\n @focus=\"prefetchNext\"\n ><Icon\n name=\"alfakit::support.pagination.next-button\"\n :fallback=\"ChevronRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n <Button\n v-if=\"extremes\"\n type=\"button\"\n variant=\"outline\"\n size=\"icon-sm\"\n data-slot=\"pagination-last\"\n :disabled=\"extremes.last === null\"\n :aria-label=\"t('table.last_page', {}, 'Last page')\"\n @click=\"extremes.last !== null && goTo(extremes.last)\"\n ><Icon\n name=\"alfakit::support.pagination.last-button\"\n :fallback=\"ChevronsRightIcon\"\n class=\"rtl:rotate-180\"\n /></Button>\n </nav>\n </div>\n</template>\n"],"mappings":"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"}
@@ -20,7 +20,8 @@ var b = ["data-slot"], x = {
20
20
  cell: {},
21
21
  recordKey: {},
22
22
  token: {},
23
- component: {}
23
+ component: {},
24
+ fromRegistry: { type: Boolean }
24
25
  },
25
26
  setup(d) {
26
27
  let w = d, T = o(() => w.column), { update: E, saving: D, error: O } = a(w), k = _(), A = o(() => w.cell.state === null || w.cell.state === void 0 ? "" : String(w.cell.state)), j = m(A.value), M = o(() => !!(w.cell.prefix || w.cell.suffix));