@byyuurin/ui 0.0.10 → 0.1.0

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 (289) hide show
  1. package/README.md +170 -58
  2. package/dist/module.d.mts +4 -13
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +54 -20
  5. package/dist/runtime/components/Accordion.vue +48 -72
  6. package/dist/runtime/components/Accordion.vue.d.ts +74 -0
  7. package/dist/runtime/components/Alert.vue +65 -83
  8. package/dist/runtime/components/Alert.vue.d.ts +71 -0
  9. package/dist/runtime/components/App.vue +28 -42
  10. package/dist/runtime/components/App.vue.d.ts +26 -0
  11. package/dist/runtime/components/Avatar.vue +82 -58
  12. package/dist/runtime/components/Avatar.vue.d.ts +39 -0
  13. package/dist/runtime/components/AvatarGroup.vue +43 -70
  14. package/dist/runtime/components/AvatarGroup.vue.d.ts +30 -0
  15. package/dist/runtime/components/Badge.vue +70 -64
  16. package/dist/runtime/components/Badge.vue.d.ts +45 -0
  17. package/dist/runtime/components/Breadcrumb.vue +56 -76
  18. package/dist/runtime/components/Breadcrumb.vue.d.ts +79 -0
  19. package/dist/runtime/components/Button.vue +150 -78
  20. package/dist/runtime/components/Button.vue.d.ts +45 -0
  21. package/dist/runtime/components/Calendar.vue +99 -125
  22. package/dist/runtime/components/Calendar.vue.d.ts +102 -0
  23. package/dist/runtime/components/Card.vue +33 -46
  24. package/dist/runtime/components/Card.vue.d.ts +34 -0
  25. package/dist/runtime/components/Carousel.vue +164 -237
  26. package/dist/runtime/components/Carousel.vue.d.ts +125 -0
  27. package/dist/runtime/components/Checkbox.vue +86 -88
  28. package/dist/runtime/components/Checkbox.vue.d.ts +63 -0
  29. package/dist/runtime/components/Chip.vue +44 -58
  30. package/dist/runtime/components/Chip.vue.d.ts +48 -0
  31. package/dist/runtime/components/Collapsible.vue +29 -33
  32. package/dist/runtime/components/Collapsible.vue.d.ts +34 -0
  33. package/dist/runtime/components/Drawer.vue +110 -150
  34. package/dist/runtime/components/Drawer.vue.d.ts +103 -0
  35. package/dist/runtime/components/DropdownMenu.vue +49 -120
  36. package/dist/runtime/components/DropdownMenu.vue.d.ts +140 -0
  37. package/dist/runtime/components/DropdownMenuContent.vue +177 -143
  38. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +51 -0
  39. package/dist/runtime/components/FieldGroup.vue +33 -0
  40. package/dist/runtime/components/FieldGroup.vue.d.ts +33 -0
  41. package/dist/runtime/components/Form.vue +245 -275
  42. package/dist/runtime/components/Form.vue.d.ts +103 -0
  43. package/dist/runtime/components/FormField.vue +108 -0
  44. package/dist/runtime/components/FormField.vue.d.ts +63 -0
  45. package/dist/runtime/components/Icon.vue +20 -0
  46. package/dist/runtime/components/Icon.vue.d.ts +9 -0
  47. package/dist/runtime/components/Input.vue +125 -156
  48. package/dist/runtime/components/Input.vue.d.ts +76 -0
  49. package/dist/runtime/components/InputNumber.vue +103 -130
  50. package/dist/runtime/components/InputNumber.vue.d.ts +191 -0
  51. package/dist/runtime/components/Kbd.vue +24 -39
  52. package/dist/runtime/components/Kbd.vue.d.ts +34 -0
  53. package/dist/runtime/components/Link.vue +105 -337
  54. package/dist/runtime/components/Link.vue.d.ts +95 -0
  55. package/dist/runtime/components/LinkBase.vue +31 -71
  56. package/dist/runtime/components/LinkBase.vue.d.ts +33 -0
  57. package/dist/runtime/components/Modal.vue +82 -103
  58. package/dist/runtime/components/Modal.vue.d.ts +96 -0
  59. package/dist/runtime/components/NavigationMenu.vue +336 -0
  60. package/dist/runtime/components/NavigationMenu.vue.d.ts +181 -0
  61. package/dist/runtime/components/OverlayProvider.vue +12 -16
  62. package/dist/runtime/components/OverlayProvider.vue.d.ts +3 -0
  63. package/dist/runtime/components/Pagination.vue +65 -139
  64. package/dist/runtime/components/Pagination.vue.d.ts +116 -0
  65. package/dist/runtime/components/PinInput.vue +78 -73
  66. package/dist/runtime/components/PinInput.vue.d.ts +54 -0
  67. package/dist/runtime/components/Popover.vue +60 -75
  68. package/dist/runtime/components/Popover.vue.d.ts +70 -0
  69. package/dist/runtime/components/Progress.vue +79 -126
  70. package/dist/runtime/components/Progress.vue.d.ts +63 -0
  71. package/dist/runtime/components/RadioGroup.vue +109 -140
  72. package/dist/runtime/components/RadioGroup.vue.d.ts +96 -0
  73. package/dist/runtime/components/ScrollArea.vue +50 -48
  74. package/dist/runtime/components/ScrollArea.vue.d.ts +21 -0
  75. package/dist/runtime/components/Select.vue +221 -221
  76. package/dist/runtime/components/Select.vue.d.ts +260 -0
  77. package/dist/runtime/components/Separator.vue +55 -47
  78. package/dist/runtime/components/Separator.vue.d.ts +48 -0
  79. package/dist/runtime/components/Skeleton.vue +25 -22
  80. package/dist/runtime/components/Skeleton.vue.d.ts +19 -0
  81. package/dist/runtime/components/Slider.vue +73 -77
  82. package/dist/runtime/components/Slider.vue.d.ts +52 -0
  83. package/dist/runtime/components/Switch.vue +66 -77
  84. package/dist/runtime/components/Switch.vue.d.ts +58 -0
  85. package/dist/runtime/components/Table.vue +357 -215
  86. package/dist/runtime/components/Table.vue.d.ts +234 -0
  87. package/dist/runtime/components/Tabs.vue +90 -88
  88. package/dist/runtime/components/Tabs.vue.d.ts +97 -0
  89. package/dist/runtime/components/Textarea.vue +147 -146
  90. package/dist/runtime/components/Textarea.vue.d.ts +76 -0
  91. package/dist/runtime/components/Toast.vue +108 -90
  92. package/dist/runtime/components/Toast.vue.d.ts +152 -0
  93. package/dist/runtime/components/ToastProvider.vue +82 -109
  94. package/dist/runtime/components/ToastProvider.vue.d.ts +51 -0
  95. package/dist/runtime/components/Tooltip.vue +54 -53
  96. package/dist/runtime/components/Tooltip.vue.d.ts +53 -0
  97. package/dist/runtime/composables/defineShortcuts.d.ts +16 -0
  98. package/dist/runtime/composables/defineShortcuts.js +129 -0
  99. package/dist/runtime/composables/useAvatarGroup.d.ts +8 -3
  100. package/dist/runtime/composables/useAvatarGroup.js +10 -3
  101. package/dist/runtime/composables/useComponentIcons.d.ts +9 -6
  102. package/dist/runtime/composables/useComponentIcons.js +4 -4
  103. package/dist/runtime/composables/useFieldGroup.d.ts +8 -0
  104. package/dist/runtime/composables/useFieldGroup.js +14 -0
  105. package/dist/runtime/composables/useFormField.d.ts +62 -0
  106. package/dist/runtime/composables/useFormField.js +99 -0
  107. package/dist/runtime/composables/useKbd.d.ts +3 -2
  108. package/dist/runtime/composables/useKbd.js +3 -2
  109. package/dist/runtime/composables/useLocale.d.ts +68 -5
  110. package/dist/runtime/composables/useLocale.js +11 -11
  111. package/dist/runtime/composables/useOverlay.d.ts +51 -15
  112. package/dist/runtime/composables/useOverlay.js +44 -30
  113. package/dist/runtime/composables/usePortal.d.ts +6 -0
  114. package/dist/runtime/composables/usePortal.js +17 -0
  115. package/dist/runtime/composables/useToast.d.ts +12 -5
  116. package/dist/runtime/composables/useToast.js +12 -7
  117. package/dist/runtime/locale/en.d.ts +30 -1
  118. package/dist/runtime/locale/en.js +2 -1
  119. package/dist/runtime/locale/index.d.ts +2 -2
  120. package/dist/runtime/locale/index.js +1 -1
  121. package/dist/runtime/locale/zh_tw.d.ts +31 -0
  122. package/dist/runtime/locale/{zh-tw.js → zh_tw.js} +2 -1
  123. package/dist/runtime/plugins/colors.d.ts +2 -0
  124. package/dist/runtime/plugins/colors.js +50 -0
  125. package/dist/runtime/types/app.config.d.ts +6 -0
  126. package/dist/runtime/types/form.d.ts +58 -17
  127. package/dist/runtime/types/form.js +11 -0
  128. package/dist/runtime/types/index.d.ts +51 -8
  129. package/dist/runtime/types/index.js +45 -2
  130. package/dist/runtime/types/input.d.ts +8 -0
  131. package/dist/runtime/types/locale.d.ts +5 -0
  132. package/dist/runtime/types/style.d.ts +33 -0
  133. package/dist/runtime/types/style.js +0 -0
  134. package/dist/runtime/types/unocss.d.ts +4 -0
  135. package/dist/runtime/types/utils.d.ts +38 -37
  136. package/dist/runtime/utils/form.d.ts +5 -1
  137. package/dist/runtime/utils/form.js +49 -0
  138. package/dist/runtime/utils/index.d.ts +10 -13
  139. package/dist/runtime/utils/index.js +41 -48
  140. package/dist/runtime/utils/link.d.ts +5 -6
  141. package/dist/runtime/utils/link.js +16 -2
  142. package/dist/runtime/utils/locale.d.ts +5 -0
  143. package/dist/runtime/utils/locale.js +10 -0
  144. package/dist/runtime/utils/style.d.ts +94 -0
  145. package/dist/runtime/utils/style.js +37 -0
  146. package/dist/runtime/vue/components/Icon.vue +15 -0
  147. package/dist/runtime/vue/components/Icon.vue.d.ts +7 -0
  148. package/dist/runtime/vue/components/Link.vue +163 -0
  149. package/dist/runtime/vue/components/Link.vue.d.ts +95 -0
  150. package/dist/runtime/vue/composables/useAppConfig.d.ts +1 -0
  151. package/dist/runtime/vue/composables/useAppConfig.js +4 -0
  152. package/dist/runtime/vue/plugins/color-mode.d.ts +4 -0
  153. package/dist/runtime/vue/plugins/color-mode.js +6 -0
  154. package/dist/runtime/vue/plugins/head.d.ts +4 -0
  155. package/dist/runtime/vue/plugins/head.js +9 -0
  156. package/dist/runtime/vue/stubs.d.ts +16 -1
  157. package/dist/runtime/vue/stubs.js +32 -1
  158. package/dist/setup.d.mts +13 -0
  159. package/dist/setup.mjs +12 -0
  160. package/dist/shared/ui.CzIlLITK.mjs +51 -0
  161. package/dist/shared/ui.DSyJHSTk.mjs +3787 -0
  162. package/dist/shared/ui.DpbffTXs.d.mts +84 -0
  163. package/dist/shared/ui.IulR-OYx.d.mts +64 -0
  164. package/dist/types.d.mts +3 -1
  165. package/dist/unocss.d.mts +12 -52
  166. package/dist/unocss.mjs +144 -253
  167. package/dist/unplugin.d.mts +13 -26
  168. package/dist/unplugin.mjs +193 -18
  169. package/dist/vite.d.mts +10 -1
  170. package/dist/vite.mjs +12 -3
  171. package/package.json +156 -87
  172. package/vue-plugin.d.ts +5 -0
  173. package/dist/module.cjs +0 -5
  174. package/dist/module.d.ts +0 -13
  175. package/dist/module.mjs.map +0 -1
  176. package/dist/runtime/app/injections.d.ts +0 -9307
  177. package/dist/runtime/app/injections.js +0 -61
  178. package/dist/runtime/components/ButtonGroup.vue +0 -46
  179. package/dist/runtime/components/FormItem.vue +0 -129
  180. package/dist/runtime/composables/useButtonGroup.d.ts +0 -5
  181. package/dist/runtime/composables/useButtonGroup.js +0 -9
  182. package/dist/runtime/composables/useFormItem.d.ts +0 -27
  183. package/dist/runtime/composables/useFormItem.js +0 -64
  184. package/dist/runtime/composables/useTheme.d.ts +0 -9
  185. package/dist/runtime/composables/useTheme.js +0 -23
  186. package/dist/runtime/index.d.ts +0 -44
  187. package/dist/runtime/index.js +0 -44
  188. package/dist/runtime/locale/zh-tw.d.ts +0 -2
  189. package/dist/runtime/theme/accordion.d.ts +0 -56
  190. package/dist/runtime/theme/accordion.js +0 -28
  191. package/dist/runtime/theme/alert.d.ts +0 -125
  192. package/dist/runtime/theme/alert.js +0 -47
  193. package/dist/runtime/theme/app.d.ts +0 -19
  194. package/dist/runtime/theme/app.js +0 -19
  195. package/dist/runtime/theme/avatar-group.d.ts +0 -52
  196. package/dist/runtime/theme/avatar-group.js +0 -32
  197. package/dist/runtime/theme/avatar.d.ts +0 -56
  198. package/dist/runtime/theme/avatar.js +0 -34
  199. package/dist/runtime/theme/badge.d.ts +0 -82
  200. package/dist/runtime/theme/badge.js +0 -92
  201. package/dist/runtime/theme/breadcrumb.d.ts +0 -67
  202. package/dist/runtime/theme/breadcrumb.js +0 -44
  203. package/dist/runtime/theme/button-group.d.ts +0 -66
  204. package/dist/runtime/theme/button-group.js +0 -42
  205. package/dist/runtime/theme/button.d.ts +0 -190
  206. package/dist/runtime/theme/button.js +0 -164
  207. package/dist/runtime/theme/calendar.d.ts +0 -56
  208. package/dist/runtime/theme/calendar.js +0 -69
  209. package/dist/runtime/theme/card.d.ts +0 -62
  210. package/dist/runtime/theme/card.js +0 -37
  211. package/dist/runtime/theme/carousel.d.ts +0 -113
  212. package/dist/runtime/theme/carousel.js +0 -43
  213. package/dist/runtime/theme/checkbox.d.ts +0 -88
  214. package/dist/runtime/theme/checkbox.js +0 -54
  215. package/dist/runtime/theme/chip.d.ts +0 -67
  216. package/dist/runtime/theme/chip.js +0 -66
  217. package/dist/runtime/theme/collapsible.d.ts +0 -38
  218. package/dist/runtime/theme/collapsible.js +0 -10
  219. package/dist/runtime/theme/drawer.d.ts +0 -148
  220. package/dist/runtime/theme/drawer.js +0 -113
  221. package/dist/runtime/theme/dropdown-menu.d.ts +0 -71
  222. package/dist/runtime/theme/dropdown-menu.js +0 -83
  223. package/dist/runtime/theme/form-item.d.ts +0 -76
  224. package/dist/runtime/theme/form-item.js +0 -34
  225. package/dist/runtime/theme/form.d.ts +0 -8
  226. package/dist/runtime/theme/form.js +0 -7
  227. package/dist/runtime/theme/index.d.ts +0 -41
  228. package/dist/runtime/theme/index.js +0 -41
  229. package/dist/runtime/theme/input-number.d.ts +0 -121
  230. package/dist/runtime/theme/input-number.js +0 -95
  231. package/dist/runtime/theme/input.d.ts +0 -178
  232. package/dist/runtime/theme/input.js +0 -151
  233. package/dist/runtime/theme/kbd.d.ts +0 -39
  234. package/dist/runtime/theme/kbd.js +0 -26
  235. package/dist/runtime/theme/link.d.ts +0 -44
  236. package/dist/runtime/theme/link.js +0 -26
  237. package/dist/runtime/theme/modal.d.ts +0 -48
  238. package/dist/runtime/theme/modal.js +0 -55
  239. package/dist/runtime/theme/pagination.d.ts +0 -80
  240. package/dist/runtime/theme/pagination.js +0 -17
  241. package/dist/runtime/theme/pinInput.d.ts +0 -100
  242. package/dist/runtime/theme/pinInput.js +0 -111
  243. package/dist/runtime/theme/popover.d.ts +0 -38
  244. package/dist/runtime/theme/popover.js +0 -13
  245. package/dist/runtime/theme/progress.d.ts +0 -186
  246. package/dist/runtime/theme/progress.js +0 -95
  247. package/dist/runtime/theme/radio-group.d.ts +0 -110
  248. package/dist/runtime/theme/radio-group.js +0 -61
  249. package/dist/runtime/theme/scroll-area.d.ts +0 -73
  250. package/dist/runtime/theme/scroll-area.js +0 -33
  251. package/dist/runtime/theme/select.d.ts +0 -192
  252. package/dist/runtime/theme/select.js +0 -173
  253. package/dist/runtime/theme/separator.d.ts +0 -80
  254. package/dist/runtime/theme/separator.js +0 -53
  255. package/dist/runtime/theme/skeleton.d.ts +0 -8
  256. package/dist/runtime/theme/skeleton.js +0 -7
  257. package/dist/runtime/theme/slider.d.ts +0 -76
  258. package/dist/runtime/theme/slider.js +0 -52
  259. package/dist/runtime/theme/switch.d.ts +0 -122
  260. package/dist/runtime/theme/switch.js +0 -78
  261. package/dist/runtime/theme/table.d.ts +0 -92
  262. package/dist/runtime/theme/table.js +0 -36
  263. package/dist/runtime/theme/tabs.d.ts +0 -135
  264. package/dist/runtime/theme/tabs.js +0 -146
  265. package/dist/runtime/theme/textarea.d.ts +0 -96
  266. package/dist/runtime/theme/textarea.js +0 -116
  267. package/dist/runtime/theme/toast-provider.d.ts +0 -122
  268. package/dist/runtime/theme/toast-provider.js +0 -97
  269. package/dist/runtime/theme/toast.d.ts +0 -89
  270. package/dist/runtime/theme/toast.js +0 -35
  271. package/dist/runtime/theme/tooltip.d.ts +0 -44
  272. package/dist/runtime/theme/tooltip.js +0 -11
  273. package/dist/runtime/types/components.d.ts +0 -42
  274. package/dist/runtime/utils/extend-theme.d.ts +0 -9
  275. package/dist/runtime/utils/extend-theme.js +0 -27
  276. package/dist/runtime/utils/styler.d.ts +0 -4
  277. package/dist/runtime/utils/styler.js +0 -10
  278. package/dist/runtime/utils/translator.d.ts +0 -18
  279. package/dist/runtime/utils/translator.js +0 -8
  280. package/dist/shared/ui.3e7fad19.mjs +0 -5
  281. package/dist/shared/ui.3e7fad19.mjs.map +0 -1
  282. package/dist/types.d.ts +0 -1
  283. package/dist/unocss.d.ts +0 -52
  284. package/dist/unocss.mjs.map +0 -1
  285. package/dist/unplugin.d.ts +0 -26
  286. package/dist/unplugin.mjs.map +0 -1
  287. package/dist/vite.d.ts +0 -9
  288. package/dist/vite.mjs.map +0 -1
  289. /package/dist/runtime/types/{components.js → input.js} +0 -0
@@ -1,310 +1,452 @@
1
- <script lang="ts">
2
- import type { CellContext, ColumnDef, ColumnFiltersOptions, ColumnFiltersState, ColumnOrderState, ColumnPinningOptions, ColumnPinningState, ColumnSizingInfoState, ColumnSizingOptions, ColumnSizingState, CoreOptions, ExpandedOptions, ExpandedState, FacetedOptions, GlobalFilterOptions, GroupingOptions, GroupingState, HeaderContext, PaginationOptions, PaginationState, Row, RowData, RowPinningOptions, RowPinningState, RowSelectionOptions, RowSelectionState, SortingOptions, SortingState, Updater, VisibilityOptions, VisibilityState } from '@tanstack/vue-table'
3
- import type { PrimitiveProps } from 'reka-ui'
4
- import type { Ref } from 'vue'
5
- import type { table } from '../theme'
6
- import type { ComponentAttrs } from '../types'
7
-
8
- type DynamicHeaderSlots<T, K = keyof T> = Record<string, (props: HeaderContext<T, unknown>) => any> & Record<`${K extends string ? K : never}-header`, (props: HeaderContext<T, unknown>) => any>
9
-
10
- type DynamicCellSlots<T, K = keyof T> = Record<string, (props: CellContext<T, unknown>) => any> & Record<`${K extends string ? K : never}-cell`, (props: CellContext<T, unknown>) => any>
11
-
12
- export type TableSlots<T> = {
13
- expanded?: (props: { row: Row<T> }) => any
14
- empty?: any
15
- loading?: any
16
- caption?: any
17
- } & DynamicHeaderSlots<T> & DynamicCellSlots<T>
18
-
19
- export type TableData = RowData
20
- export type TableColumn<T extends TableData, D = unknown> = ColumnDef<T, D> & { title?: string }
21
-
22
- export interface TableOptions<T extends TableData> extends Omit<CoreOptions<T>, 'data' | 'columns' | 'getCoreRowModel' | 'state' | 'onStateChange' | 'renderFallbackValue'> {
23
- state?: CoreOptions<T>['state']
24
- onStateChange?: CoreOptions<T>['onStateChange']
25
- renderFallbackValue?: CoreOptions<T>['renderFallbackValue']
26
- }
27
-
28
- export interface TableProps<T extends TableData> extends ComponentAttrs<typeof table>, TableOptions<T> {
29
- /**
30
- * The element or component this component should render as.
31
- * @default "div"
32
- */
33
- as?: PrimitiveProps['as']
34
- data?: T[]
35
- columns?: TableColumn<T>[]
36
- caption?: string
37
- /**
38
- * The text to display when the table is empty.
39
- * @default t('table.noData')
40
- */
41
- empty?: string
42
- /**
43
- * Whether the table should have a sticky header.
44
- * @default false
45
- */
46
- sticky?: boolean
47
- /** Whether the table should be in loading state. */
48
- loading?: boolean
49
- /**
50
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/global-filtering#table-options)
51
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/global-filtering)
52
- */
53
- globalFilterOptions?: Omit<GlobalFilterOptions<T>, 'onGlobalFilterChange'>
54
- /**
55
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-filtering#table-options)
56
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-filtering)
57
- */
58
- columnFiltersOptions?: Omit<ColumnFiltersOptions<T>, 'getFilteredRowModel' | 'onColumnFiltersChange'>
59
- /**
60
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-pinning#table-options)
61
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-pinning)
62
- */
63
- columnPinningOptions?: Omit<ColumnPinningOptions, 'onColumnPinningChange'>
64
- /**
65
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-sizing#table-options)
66
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-sizing)
67
- */
68
- columnSizingOptions?: Omit<ColumnSizingOptions, 'onColumnSizingChange' | 'onColumnSizingInfoChange'>
69
- /**
70
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-visibility#table-options)
71
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-visibility)
72
- */
73
- visibilityOptions?: Omit<VisibilityOptions, 'onColumnVisibilityChange'>
74
- /**
75
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/sorting#table-options)
76
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/sorting)
77
- */
78
- sortingOptions?: Omit<SortingOptions<T>, 'getSortedRowModel' | 'onSortingChange'>
79
- /**
80
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/grouping#table-options)
81
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/grouping)
82
- */
83
- groupingOptions?: Omit<GroupingOptions, 'onGroupingChange'>
84
- /**
85
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/expanding#table-options)
86
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/expanding)
87
- */
88
- expandedOptions?: Omit<ExpandedOptions<T>, 'getExpandedRowModel' | 'onExpandedChange'>
89
- /**
90
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/row-selection#table-options)
91
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/row-selection)
92
- */
93
- rowSelectionOptions?: Omit<RowSelectionOptions<T>, 'onRowSelectionChange'>
94
- /**
95
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/row-pinning#table-options)
96
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/row-pinning)
97
- */
98
- rowPinningOptions?: Omit<RowPinningOptions<T>, 'onRowPinningChange'>
99
- /**
100
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/pagination#table-options)
101
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/pagination)
102
- */
103
- paginationOptions?: Omit<PaginationOptions, 'onPaginationChange'>
104
- /**
105
- * @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-faceting#table-options)
106
- * @link [Guide](https://tanstack.com/table/v8/docs/guide/column-faceting)
107
- */
108
- facetedOptions?: FacetedOptions<T>
109
- }
1
+ <script>
2
+ import theme from "#build/ui/table";
110
3
  </script>
111
4
 
112
- <script setup lang="ts" generic="T extends TableData">
113
- import { FlexRender, getCoreRowModel, getExpandedRowModel, getFilteredRowModel, getSortedRowModel, useVueTable } from '@tanstack/vue-table'
114
- import { reactiveOmit } from '@vueuse/core'
115
- import { Primitive } from 'reka-ui'
116
- import { upperFirst } from 'scule'
117
- import { computed } from 'vue'
118
- import { useLocale } from '../composables/useLocale'
119
- import { useTheme } from '../composables/useTheme'
120
-
121
- const props = defineProps<TableProps<T>>()
122
- const slots = defineSlots<TableSlots<T>>()
123
-
124
- const globalFilterState = defineModel<string>('globalFilter', { default: undefined })
125
- const columnFiltersState = defineModel<ColumnFiltersState>('columnFilters', { default: [] })
126
- const columnOrderState = defineModel<ColumnOrderState>('columnOrder', { default: [] })
127
- const columnVisibilityState = defineModel<VisibilityState>('columnVisibility', { default: {} })
128
- const columnPinningState = defineModel<ColumnPinningState>('columnPinning', { default: {} })
129
- const columnSizingState = defineModel<ColumnSizingState>('columnSizing', { default: {} })
130
- const columnSizingInfoState = defineModel<ColumnSizingInfoState>('columnSizingInfo', { default: {} })
131
- const rowSelectionState = defineModel<RowSelectionState>('rowSelection', { default: {} })
132
- const rowPinningState = defineModel<RowPinningState>('rowPinning', { default: {} })
133
- const sortingState = defineModel<SortingState>('sorting', { default: [] })
134
- const groupingState = defineModel<GroupingState>('grouping', { default: [] })
135
- const expandedState = defineModel<ExpandedState>('expanded', { default: {} })
136
- const paginationState = defineModel<PaginationState>('pagination', { default: {} })
137
-
138
- const data = computed(() => props.data ?? [])
139
- const columns = computed<TableColumn<T>[]>(
140
- () =>
141
- props.columns ?? Object.keys(data.value[0] ?? {}).map(
142
- (accessorKey: string) => ({ accessorKey, header: upperFirst(accessorKey) }),
143
- ),
144
- )
145
-
5
+ <script setup>
6
+ import { FlexRender, getCoreRowModel, getExpandedRowModel, getFilteredRowModel, getSortedRowModel, useVueTable } from "@tanstack/vue-table";
7
+ import { useVirtualizer } from "@tanstack/vue-virtual";
8
+ import { createReusableTemplate, reactiveOmit } from "@vueuse/core";
9
+ import { defu } from "defu";
10
+ import { Primitive } from "reka-ui";
11
+ import { upperFirst } from "scule";
12
+ import { computed, ref, shallowRef, toRef, watch } from "vue";
13
+ import { useAppConfig } from "#imports";
14
+ import { useLocale } from "../composables/useLocale";
15
+ import { cv, merge } from "../utils/style";
16
+ defineOptions({ inheritAttrs: false });
17
+ const props = defineProps({
18
+ as: { type: null, required: false },
19
+ data: { type: Array, required: false },
20
+ columns: { type: Array, required: false },
21
+ caption: { type: String, required: false },
22
+ meta: { type: Object, required: false },
23
+ virtualize: { type: [Boolean, Object], required: false, default: false },
24
+ empty: { type: String, required: false },
25
+ sticky: { type: [Boolean, String], required: false },
26
+ loading: { type: Boolean, required: false },
27
+ loadingColor: { type: null, required: false },
28
+ loadingAnimation: { type: null, required: false },
29
+ globalFilter: { type: String, required: false },
30
+ columnFilters: { type: Array, required: false },
31
+ columnOrder: { type: Array, required: false },
32
+ columnVisibility: { type: Object, required: false },
33
+ columnPinning: { type: Object, required: false },
34
+ columnSizing: { type: Object, required: false },
35
+ columnSizingInfo: { type: Object, required: false },
36
+ rowSelection: { type: Object, required: false },
37
+ rowPinning: { type: Object, required: false },
38
+ sorting: { type: Array, required: false },
39
+ grouping: { type: Array, required: false },
40
+ expanded: { type: [Boolean, Object], required: false },
41
+ pagination: { type: Object, required: false },
42
+ watchOptions: { type: Object, required: false, default: () => ({
43
+ deep: true
44
+ }) },
45
+ globalFilterOptions: { type: Object, required: false },
46
+ columnFiltersOptions: { type: Object, required: false },
47
+ columnPinningOptions: { type: Object, required: false },
48
+ columnSizingOptions: { type: Object, required: false },
49
+ visibilityOptions: { type: Object, required: false },
50
+ sortingOptions: { type: Object, required: false },
51
+ groupingOptions: { type: Object, required: false },
52
+ expandedOptions: { type: Object, required: false },
53
+ rowSelectionOptions: { type: Object, required: false },
54
+ rowPinningOptions: { type: Object, required: false },
55
+ paginationOptions: { type: Object, required: false },
56
+ facetedOptions: { type: Object, required: false },
57
+ onSelect: { type: Function, required: false },
58
+ onHover: { type: Function, required: false },
59
+ onContextmenu: { type: [Function, Array], required: false },
60
+ ui: { type: null, required: false },
61
+ class: { type: [Object, String, Number, Boolean, null, Array], required: false, skipCheck: true },
62
+ state: { type: Object, required: false },
63
+ onStateChange: { type: Function, required: false },
64
+ renderFallbackValue: { type: null, required: false },
65
+ _features: { type: Array, required: false },
66
+ autoResetAll: { type: Boolean, required: false },
67
+ debugAll: { type: Boolean, required: false },
68
+ debugCells: { type: Boolean, required: false },
69
+ debugColumns: { type: Boolean, required: false },
70
+ debugHeaders: { type: Boolean, required: false },
71
+ debugRows: { type: Boolean, required: false },
72
+ debugTable: { type: Boolean, required: false },
73
+ defaultColumn: { type: Object, required: false },
74
+ getRowId: { type: Function, required: false },
75
+ getSubRows: { type: Function, required: false },
76
+ initialState: { type: Object, required: false },
77
+ mergeOptions: { type: Function, required: false }
78
+ });
79
+ const slots = defineSlots();
80
+ const [DefineTableTemplate, ReuseTableTemplate] = createReusableTemplate();
81
+ const [DefineRowTemplate, ReuseRowTemplate] = createReusableTemplate({
82
+ props: {
83
+ row: {
84
+ type: Object,
85
+ required: true
86
+ },
87
+ style: {
88
+ type: Object,
89
+ required: false
90
+ }
91
+ }
92
+ });
93
+ const globalFilterState = defineModel("globalFilter", { type: String, ...{ default: void 0 } });
94
+ const columnFiltersState = defineModel("columnFilters", { type: Array, ...{ default: [] } });
95
+ const columnOrderState = defineModel("columnOrder", { type: Array, ...{ default: [] } });
96
+ const columnVisibilityState = defineModel("columnVisibility", { type: Object, ...{ default: {} } });
97
+ const columnPinningState = defineModel("columnPinning", { type: Object, ...{ default: {} } });
98
+ const columnSizingState = defineModel("columnSizing", { type: Object, ...{ default: {} } });
99
+ const columnSizingInfoState = defineModel("columnSizingInfo", { type: Object, ...{ default: {} } });
100
+ const rowSelectionState = defineModel("rowSelection", { type: Object, ...{ default: {} } });
101
+ const rowPinningState = defineModel("rowPinning", { type: Object, ...{ default: {} } });
102
+ const sortingState = defineModel("sorting", { type: Array, ...{ default: [] } });
103
+ const groupingState = defineModel("grouping", { type: Array, ...{ default: [] } });
104
+ const expandedState = defineModel("expanded", { type: [Boolean, Object], ...{ default: {} } });
105
+ const paginationState = defineModel("pagination", { type: Object, ...{ default: {} } });
106
+ const rootRef = shallowRef();
107
+ const tableRef = shallowRef(null);
108
+ const data = ref(props.data ?? []);
109
+ const meta = computed(() => props.meta ?? {});
110
+ const columns = computed(
111
+ () => processColumns(props.columns ?? Object.keys(data.value[0] ?? {}).map((accessorKey) => ({ accessorKey, header: upperFirst(accessorKey) })))
112
+ );
113
+ function processColumns(columns2) {
114
+ return columns2.map((column) => {
115
+ const col = { ...column };
116
+ if ("columns" in col && col.columns)
117
+ col.columns = processColumns(col.columns);
118
+ if (!col.cell) {
119
+ col.cell = ({ getValue }) => {
120
+ const value = getValue();
121
+ if (value === "" || value === null || value === void 0)
122
+ return "\xA0";
123
+ return String(value);
124
+ };
125
+ }
126
+ return col;
127
+ });
128
+ }
129
+ const hasFooter = computed(() => {
130
+ function hasFooterRecursive(columns2) {
131
+ for (const column of columns2) {
132
+ if ("footer" in column)
133
+ return true;
134
+ if ("columns" in column && hasFooterRecursive(column.columns))
135
+ return true;
136
+ }
137
+ return false;
138
+ }
139
+ return hasFooterRecursive(columns.value);
140
+ });
146
141
  const tableApi = useVueTable({
147
- ...reactiveOmit(props, 'data', 'columns', 'caption', 'sticky', 'loading', 'class', 'ui'),
142
+ ...reactiveOmit(props, "as", "data", "columns", "virtualize", "caption", "sticky", "loading", "loadingColor", "loadingAnimation", "class", "ui"),
148
143
  data,
149
- columns: columns.value,
144
+ get columns() {
145
+ return columns.value;
146
+ },
147
+ meta: meta.value,
150
148
  getCoreRowModel: getCoreRowModel(),
151
-
152
149
  ...props.globalFilterOptions,
153
150
  onGlobalFilterChange: (updaterOrValue) => valueUpdater(updaterOrValue, globalFilterState),
154
-
155
151
  ...props.columnFiltersOptions,
156
152
  getFilteredRowModel: getFilteredRowModel(),
157
153
  onColumnFiltersChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnFiltersState),
158
154
  onColumnOrderChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnOrderState),
159
-
160
155
  ...props.visibilityOptions,
161
156
  onColumnVisibilityChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnVisibilityState),
162
-
163
157
  ...props.columnPinningOptions,
164
158
  onColumnPinningChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnPinningState),
165
-
166
159
  ...props.columnSizingOptions,
167
160
  onColumnSizingChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnSizingState),
168
161
  onColumnSizingInfoChange: (updaterOrValue) => valueUpdater(updaterOrValue, columnSizingInfoState),
169
-
170
162
  ...props.rowSelectionOptions,
171
163
  onRowSelectionChange: (updaterOrValue) => valueUpdater(updaterOrValue, rowSelectionState),
172
-
173
164
  ...props.rowPinningOptions,
174
165
  onRowPinningChange: (updaterOrValue) => valueUpdater(updaterOrValue, rowPinningState),
175
-
176
166
  ...props.sortingOptions,
177
167
  getSortedRowModel: getSortedRowModel(),
178
168
  onSortingChange: (updaterOrValue) => valueUpdater(updaterOrValue, sortingState),
179
-
180
169
  ...props.groupingOptions,
181
170
  onGroupingChange: (updaterOrValue) => valueUpdater(updaterOrValue, groupingState),
182
-
183
171
  ...props.expandedOptions,
184
172
  getExpandedRowModel: getExpandedRowModel(),
185
173
  onExpandedChange: (updaterOrValue) => valueUpdater(updaterOrValue, expandedState),
186
-
187
174
  ...props.paginationOptions,
188
175
  onPaginationChange: (updaterOrValue) => valueUpdater(updaterOrValue, paginationState),
189
-
190
176
  ...props.facetedOptions,
191
177
  state: {
192
178
  get globalFilter() {
193
- return globalFilterState.value
179
+ return globalFilterState.value;
194
180
  },
195
181
  get columnFilters() {
196
- return columnFiltersState.value
182
+ return columnFiltersState.value;
197
183
  },
198
184
  get columnOrder() {
199
- return columnOrderState.value
185
+ return columnOrderState.value;
200
186
  },
201
187
  get columnVisibility() {
202
- return columnVisibilityState.value
188
+ return columnVisibilityState.value;
203
189
  },
204
190
  get columnPinning() {
205
- return columnPinningState.value
191
+ return columnPinningState.value;
206
192
  },
207
193
  get expanded() {
208
- return expandedState.value
194
+ return expandedState.value;
209
195
  },
210
196
  get rowSelection() {
211
- return rowSelectionState.value
197
+ return rowSelectionState.value;
212
198
  },
213
199
  get sorting() {
214
- return sortingState.value
200
+ return sortingState.value;
215
201
  },
216
202
  get grouping() {
217
- return groupingState.value
203
+ return groupingState.value;
218
204
  },
219
205
  get rowPinning() {
220
- return rowPinningState.value
206
+ return rowPinningState.value;
221
207
  },
222
208
  get columnSizing() {
223
- return columnSizingState.value
209
+ return columnSizingState.value;
224
210
  },
225
211
  get columnSizingInfo() {
226
- return columnSizingInfoState.value
212
+ return columnSizingInfoState.value;
227
213
  },
228
214
  get pagination() {
229
- return paginationState.value
230
- },
215
+ return paginationState.value;
216
+ }
217
+ }
218
+ });
219
+ const rows = computed(() => tableApi.getRowModel().rows);
220
+ const virtualizerProps = toRef(() => defu(typeof props.virtualize === "boolean" ? {} : props.virtualize, {
221
+ estimateSize: 65,
222
+ overscan: 12
223
+ }));
224
+ const virtualizer = !!props.virtualize && useVirtualizer({
225
+ ...virtualizerProps.value,
226
+ get count() {
227
+ return rows.value.length;
231
228
  },
232
- })
233
-
234
- function valueUpdater<T extends Updater<any>>(updaterOrValue: T, ref: Ref) {
235
- ref.value = typeof updaterOrValue === 'function' ? updaterOrValue(ref.value) : updaterOrValue
229
+ getScrollElement: () => rootRef.value?.$el,
230
+ estimateSize: () => virtualizerProps.value.estimateSize
231
+ });
232
+ function valueUpdater(updaterOrValue, ref2) {
233
+ ref2.value = typeof updaterOrValue === "function" ? updaterOrValue(ref2.value) : updaterOrValue;
236
234
  }
237
-
238
- const { t } = useLocale()
239
- const { generateStyle } = useTheme()
240
- const style = computed(() => generateStyle('table', props))
241
-
235
+ function onRowSelect(e, row) {
236
+ if (!props.onSelect)
237
+ return;
238
+ const target = e.target;
239
+ const isInteractive = target.closest("button") || target.closest("a");
240
+ if (isInteractive)
241
+ return;
242
+ e.preventDefault();
243
+ e.stopPropagation();
244
+ props.onSelect(e, row);
245
+ }
246
+ function onRowHover(e, row) {
247
+ if (!props.onHover)
248
+ return;
249
+ props.onHover(e, row);
250
+ }
251
+ function onRowContextmenu(e, row) {
252
+ if (!props.onContextmenu)
253
+ return;
254
+ if (Array.isArray(props.onContextmenu))
255
+ props.onContextmenu.forEach((fn) => fn(e, row));
256
+ else
257
+ props.onContextmenu(e, row);
258
+ }
259
+ function resolveValue(prop, arg) {
260
+ if (typeof prop === "function") {
261
+ return prop(arg);
262
+ }
263
+ return prop;
264
+ }
265
+ watch(() => props.data, () => {
266
+ data.value = props.data ? [...props.data] : [];
267
+ }, props.watchOptions);
268
+ const { t } = useLocale();
269
+ const appConfig = useAppConfig();
270
+ const ui = computed(() => {
271
+ const styler = cv(merge(theme, appConfig.ui.table));
272
+ return styler({
273
+ ...props,
274
+ sticky: props.virtualize ? false : props.sticky,
275
+ virtualize: !!props.virtualize
276
+ });
277
+ });
242
278
  defineExpose({
243
- tableApi,
244
- })
279
+ get $el() {
280
+ return rootRef.value?.$el;
281
+ },
282
+ tableRef,
283
+ tableApi
284
+ });
245
285
  </script>
246
286
 
247
287
  <template>
248
- <Primitive :as="props.as" :class="style.root({ class: [props.class, props.ui?.root] })">
249
- <table :class="style.base({ class: props.ui?.base })">
250
- <caption v-if="props.caption || slots.caption" :class="style.caption({ class: props.caption })">
288
+ <DefineRowTemplate v-slot="{ row, style }">
289
+ <tr
290
+ :role="props.onSelect ? 'button' : void 0"
291
+ :tabindex="props.onSelect ? 0 : void 0"
292
+ :class="ui.tr({
293
+ class: [
294
+ props.ui?.tr,
295
+ resolveValue(tableApi.options.meta?.class?.tr, row)
296
+ ]
297
+ })"
298
+ :data-selected="row.getIsSelected()"
299
+ :data-selectable="!!props.onSelect || !!props.onHover || !!props.onContextmenu"
300
+ :data-expanded="row.getIsExpanded()"
301
+ data-part="tr"
302
+ :style="[resolveValue(tableApi.options.meta?.style?.tr, row), style]"
303
+ @click="onRowSelect($event, row)"
304
+ @pointerenter="onRowHover($event, row)"
305
+ @pointerleave="onRowHover($event, null)"
306
+ @contextmenu="onRowContextmenu($event, row)"
307
+ >
308
+ <td
309
+ v-for="cell in row.getVisibleCells()"
310
+ :key="cell.id"
311
+ :colspan="resolveValue(cell.column.columnDef.meta?.colspan?.td, cell)"
312
+ :rowspan="resolveValue(cell.column.columnDef.meta?.rowspan?.td, cell)"
313
+ :class="ui.td({
314
+ class: [
315
+ props.ui?.td,
316
+ resolveValue(cell.column.columnDef.meta?.class?.td, cell)
317
+ ],
318
+ pinned: !!cell.column.getIsPinned()
319
+ })"
320
+ :data-pinned="cell.column.getIsPinned()"
321
+ data-part="td"
322
+ :style="resolveValue(cell.column.columnDef.meta?.style?.td, cell)"
323
+ >
324
+ <slot :name="`${cell.column.id}-cell`" v-bind="cell.getContext()">
325
+ <FlexRender :render="cell.column.columnDef.cell" :props="cell.getContext()" />
326
+ </slot>
327
+ </td>
328
+ </tr>
329
+
330
+ <tr v-if="row.getIsExpanded()" :class="ui.tr({ class: props.ui?.tr })" data-part="tr">
331
+ <td :colspan="row.getAllCells().length" :class="ui.td({ class: props.ui?.td })" data-part="td">
332
+ <slot name="expanded" :row="row"></slot>
333
+ </td>
334
+ </tr>
335
+ </DefineRowTemplate>
336
+
337
+ <DefineTableTemplate>
338
+ <table ref="tableRef" :class="ui.base({ class: props.ui?.base })" data-part="base">
339
+ <caption v-if="caption || !!slots.caption" :class="ui.caption({ class: [props.ui?.caption] })" data-part="caption">
251
340
  <slot name="caption">
252
- {{ props.caption }}
341
+ {{ caption }}
253
342
  </slot>
254
343
  </caption>
255
344
 
256
- <thead :class="style.thead({ class: props.ui?.thead })">
257
- <tr v-for="headerGroup in tableApi.getHeaderGroups()" :key="headerGroup.id" :class="style.tr({ class: props.ui?.tr })">
345
+ <thead :class="ui.thead({ class: [props.ui?.thead] })" data-part="thead">
346
+ <tr v-for="headerGroup in tableApi.getHeaderGroups()" :key="headerGroup.id" :class="ui.tr({ class: [props.ui?.tr] })" data-part="tr">
258
347
  <th
259
348
  v-for="header in headerGroup.headers"
260
349
  :key="header.id"
261
350
  :data-pinned="header.column.getIsPinned()"
262
- :class="style.th({ class: props.ui?.th, pinned: !!header.column.getIsPinned() })"
351
+ :scope="header.colSpan > 1 ? 'colgroup' : 'col'"
352
+ :colspan="header.colSpan > 1 ? header.colSpan : void 0"
353
+ :rowspan="header.rowSpan > 1 ? header.rowSpan : void 0"
354
+ :class="ui.th({
355
+ class: [
356
+ props.ui?.th,
357
+ resolveValue(header.column.columnDef.meta?.class?.th, header)
358
+ ],
359
+ pinned: !!header.column.getIsPinned()
360
+ })"
361
+ data-part="th"
263
362
  >
264
363
  <slot :name="`${header.id}-header`" v-bind="header.getContext()">
265
- <FlexRender v-if="!header.isPlaceholder" :render="header.column.columnDef.header" :props="header.getContext" />
364
+ <FlexRender v-if="!header.isPlaceholder" :render="header.column.columnDef.header" :props="header.getContext()" />
266
365
  </slot>
267
366
  </th>
268
367
  </tr>
368
+
369
+ <tr :class="ui.separator({ class: [props.ui?.separator] })" data-part="separator"></tr>
269
370
  </thead>
270
371
 
271
- <tbody :class="style.tbody({ class: props.ui?.tbody })">
272
- <template v-if="tableApi.getRowModel().rows.length > 0">
273
- <template v-for="row in tableApi.getRowModel().rows" :key="row.id">
274
- <tr :data-selected="row.getIsSelected()" :data-expanded="row.getIsExpanded()" :class="style.tr({ class: props.ui?.tr })">
275
- <td
276
- v-for="cell in row.getVisibleCells()"
277
- :key="cell.id"
278
- :data-pinned="cell.column.getIsPinned()"
279
- :class="style.td({ class: props.ui?.td, pinned: !!cell.column.getIsPinned() })"
280
- >
281
- <slot :name="`${cell.column.id}-cell`" v-bind="cell.getContext()">
282
- <FlexRender :render="cell.column.columnDef.cell" :props="cell.getContext()" />
283
- </slot>
284
- </td>
285
- </tr>
286
- <tr v-if="row.getIsExpanded()" :class="style.tr({ class: props.ui?.tr, expanded: true })">
287
- <td :colspan="row.getAllCells().length" :class="style.td({ class: props.ui?.td })">
288
- <slot name="expanded" :row="row"></slot>
289
- </td>
290
- </tr>
372
+ <tbody :class="ui.tbody({ class: [props.ui?.tbody] })" data-part="tbody">
373
+ <slot name="body-top"></slot>
374
+
375
+ <template v-if="rows.length">
376
+ <template v-if="virtualizer">
377
+ <template v-for="(virtualRow, index) in virtualizer.getVirtualItems()" :key="rows[virtualRow.index]?.id">
378
+ <ReuseRowTemplate
379
+ :row="rows[virtualRow.index]"
380
+ :style="{
381
+ height: `${virtualRow.size}px`,
382
+ transform: `translateY(${virtualRow.start - index * virtualRow.size}px)`
383
+ }"
384
+ />
385
+ </template>
386
+ </template>
387
+
388
+ <template v-else>
389
+ <ReuseRowTemplate v-for="row in rows" :key="row.id" :row="row" />
291
390
  </template>
292
391
  </template>
293
392
 
294
- <tr v-else-if="props.loading && slots.loading">
295
- <td :colspan="columns.length" :class="style.loading({ class: props.ui?.loading })">
393
+ <tr v-else-if="props.loading && !!slots.loading">
394
+ <td :colspan="tableApi.getAllLeafColumns().length" :class="ui.loading({ class: props.ui?.loading })" data-part="loading">
296
395
  <slot name="loading"></slot>
297
396
  </td>
298
397
  </tr>
299
398
 
300
- <tr v-else :class="style.tr({ class: props.ui?.tr })">
301
- <td :colspan="columns.length" :class="style.empty({ class: props.ui?.empty })">
399
+ <tr v-else>
400
+ <td :colspan="tableApi.getAllLeafColumns().length" :class="ui.empty({ class: props.ui?.empty })" data-part="empty">
302
401
  <slot name="empty">
303
- {{ props.empty || t('table.noData') }}
402
+ {{ props.empty || t("table.noData") }}
304
403
  </slot>
305
404
  </td>
306
405
  </tr>
406
+
407
+ <slot name="body-bottom"></slot>
307
408
  </tbody>
409
+
410
+ <tfoot
411
+ v-if="hasFooter"
412
+ :class="ui.tfoot({ class: props.ui?.tfoot })"
413
+ data-part="tfoot"
414
+ :style="virtualizer ? {
415
+ transform: `translateY(${virtualizer.getTotalSize() - virtualizer.getVirtualItems().length * virtualizerProps.estimateSize}px)`
416
+ } : void 0"
417
+ >
418
+ <tr :class="ui.separator({ class: props.ui?.separator })" data-part="separator"></tr>
419
+
420
+ <tr v-for="footerGroup in tableApi.getFooterGroups()" :key="footerGroup.id" :class="ui.tr({ class: props.ui?.tr })" data-part="tr">
421
+ <th
422
+ v-for="header in footerGroup.headers"
423
+ :key="header.id"
424
+ :data-pinned="header.column.getIsPinned()"
425
+ :colspan="header.colSpan > 1 ? header.colSpan : void 0"
426
+ :rowspan="header.rowSpan > 1 ? header.rowSpan : void 0"
427
+ :class="ui.th({
428
+ class: [
429
+ props.ui?.th,
430
+ resolveValue(header.column.columnDef.meta?.class?.th, header)
431
+ ],
432
+ pinned: !!header.column.getIsPinned()
433
+ })"
434
+ data-part="th"
435
+ :style="resolveValue(header.column.columnDef.meta?.style?.th, header)"
436
+ >
437
+ <slot :name="`${header.id}-footer`" v-bind="header.getContext()">
438
+ <FlexRender v-if="!header.isPlaceholder" :render="header.column.columnDef.footer" :props="header.getContext()" />
439
+ </slot>
440
+ </th>
441
+ </tr>
442
+ </tfoot>
308
443
  </table>
444
+ </DefineTableTemplate>
445
+
446
+ <Primitive ref="rootRef" :as="props.as" v-bind="$attrs" :class="ui.root({ class: [props.ui?.root, props.class] })" data-part="root">
447
+ <div v-if="virtualizer" :style="{ height: `${virtualizer.getTotalSize()}px` }">
448
+ <ReuseTableTemplate />
449
+ </div>
450
+ <ReuseTableTemplate v-else />
309
451
  </Primitive>
310
452
  </template>