@zentauri-ui/zentauri-components 2.1.6 → 2.1.8

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 (152) hide show
  1. package/README.md +12 -8
  2. package/cli/cli.integration.test.ts +36 -0
  3. package/cli/index.mjs +43 -7
  4. package/cli/props.json +462 -3
  5. package/cli/registry.json +29 -0
  6. package/cli/rewrite-imports.mjs +29 -4
  7. package/cli/rewrite-imports.test.ts +35 -0
  8. package/dist/{chunk-WWKAJHIV.mjs → chunk-4PAHLHYF.mjs} +3 -3
  9. package/dist/{chunk-WWKAJHIV.mjs.map → chunk-4PAHLHYF.mjs.map} +1 -1
  10. package/dist/chunk-4SLVTSHM.js +241 -0
  11. package/dist/chunk-4SLVTSHM.js.map +1 -0
  12. package/dist/chunk-6OVDBAMI.js +19 -0
  13. package/dist/{chunk-3W2UUKWP.js.map → chunk-6OVDBAMI.js.map} +1 -1
  14. package/dist/chunk-74SKXGTM.js +4 -0
  15. package/dist/chunk-74SKXGTM.js.map +1 -0
  16. package/dist/{chunk-QE7OJW4J.js → chunk-BAAXQPZ7.js} +6 -6
  17. package/dist/{chunk-QE7OJW4J.js.map → chunk-BAAXQPZ7.js.map} +1 -1
  18. package/dist/chunk-CYKSS5S5.mjs +128 -0
  19. package/dist/chunk-CYKSS5S5.mjs.map +1 -0
  20. package/dist/chunk-D7ZTSAA6.mjs +221 -0
  21. package/dist/chunk-D7ZTSAA6.mjs.map +1 -0
  22. package/dist/{chunk-VA6SB6NN.js → chunk-DPNTQ4AK.js} +73 -6
  23. package/dist/chunk-DPNTQ4AK.js.map +1 -0
  24. package/dist/chunk-HMDH4BQJ.js +123 -0
  25. package/dist/chunk-HMDH4BQJ.js.map +1 -0
  26. package/dist/chunk-I7EBE7BD.js +98 -0
  27. package/dist/chunk-I7EBE7BD.js.map +1 -0
  28. package/dist/chunk-IHDM7AHY.mjs +233 -0
  29. package/dist/chunk-IHDM7AHY.mjs.map +1 -0
  30. package/dist/chunk-L5QORCUO.js +225 -0
  31. package/dist/chunk-L5QORCUO.js.map +1 -0
  32. package/dist/chunk-LHBJD57K.mjs +143 -0
  33. package/dist/chunk-LHBJD57K.mjs.map +1 -0
  34. package/dist/{chunk-CHI6MBTI.mjs → chunk-OWVQVAOY.mjs} +3 -3
  35. package/dist/{chunk-CHI6MBTI.mjs.map → chunk-OWVQVAOY.mjs.map} +1 -1
  36. package/dist/chunk-OYAJG2BO.js +83 -0
  37. package/dist/chunk-OYAJG2BO.js.map +1 -0
  38. package/dist/chunk-PTU5ZAYX.js +145 -0
  39. package/dist/chunk-PTU5ZAYX.js.map +1 -0
  40. package/dist/chunk-QKO5DA4N.mjs +81 -0
  41. package/dist/chunk-QKO5DA4N.mjs.map +1 -0
  42. package/dist/chunk-T7PIKDUZ.js +130 -0
  43. package/dist/chunk-T7PIKDUZ.js.map +1 -0
  44. package/dist/chunk-TDK5TVJE.mjs +3 -0
  45. package/dist/chunk-TDK5TVJE.mjs.map +1 -0
  46. package/dist/{chunk-A4IB3C23.mjs → chunk-UVP3MUBU.mjs} +58 -7
  47. package/dist/chunk-UVP3MUBU.mjs.map +1 -0
  48. package/dist/chunk-VBNW2B4D.mjs +3 -0
  49. package/dist/chunk-VBNW2B4D.mjs.map +1 -0
  50. package/dist/chunk-W6DO36XD.mjs +96 -0
  51. package/dist/chunk-W6DO36XD.mjs.map +1 -0
  52. package/dist/chunk-XR3J46TZ.js +4 -0
  53. package/dist/chunk-XR3J46TZ.js.map +1 -0
  54. package/dist/chunk-ZOHCADDL.mjs +121 -0
  55. package/dist/chunk-ZOHCADDL.mjs.map +1 -0
  56. package/dist/design-system/data-table.d.ts +8 -0
  57. package/dist/design-system/data-table.d.ts.map +1 -0
  58. package/dist/design-system/facade.js +6 -6
  59. package/dist/design-system/facade.mjs +5 -5
  60. package/dist/design-system/index.d.ts +2 -0
  61. package/dist/design-system/index.d.ts.map +1 -1
  62. package/dist/design-system/split-button.d.ts +25 -0
  63. package/dist/design-system/split-button.d.ts.map +1 -0
  64. package/dist/hooks/useTableFilter.js +6 -116
  65. package/dist/hooks/useTableFilter.js.map +1 -1
  66. package/dist/hooks/useTableFilter.mjs +1 -118
  67. package/dist/hooks/useTableFilter.mjs.map +1 -1
  68. package/dist/hooks/useTableSort.js +6 -91
  69. package/dist/hooks/useTableSort.js.map +1 -1
  70. package/dist/hooks/useTableSort.mjs +1 -93
  71. package/dist/hooks/useTableSort.mjs.map +1 -1
  72. package/dist/hooks/useVirtualList.js +6 -76
  73. package/dist/hooks/useVirtualList.js.map +1 -1
  74. package/dist/hooks/useVirtualList.mjs +1 -78
  75. package/dist/hooks/useVirtualList.mjs.map +1 -1
  76. package/dist/ui/buttons/animated.js +8 -8
  77. package/dist/ui/buttons/animated.mjs +6 -6
  78. package/dist/ui/buttons.js +10 -9
  79. package/dist/ui/buttons.mjs +8 -7
  80. package/dist/ui/checkbox.js +7 -123
  81. package/dist/ui/checkbox.js.map +1 -1
  82. package/dist/ui/checkbox.mjs +2 -126
  83. package/dist/ui/checkbox.mjs.map +1 -1
  84. package/dist/ui/data-table/data-table-base.d.ts +6 -0
  85. package/dist/ui/data-table/data-table-base.d.ts.map +1 -0
  86. package/dist/ui/data-table/data-table.d.ts +6 -0
  87. package/dist/ui/data-table/data-table.d.ts.map +1 -0
  88. package/dist/ui/data-table/index.d.ts +4 -0
  89. package/dist/ui/data-table/index.d.ts.map +1 -0
  90. package/dist/ui/data-table/types.d.ts +92 -0
  91. package/dist/ui/data-table/types.d.ts.map +1 -0
  92. package/dist/ui/data-table/variants.d.ts +8 -0
  93. package/dist/ui/data-table/variants.d.ts.map +1 -0
  94. package/dist/ui/data-table.js +620 -0
  95. package/dist/ui/data-table.js.map +1 -0
  96. package/dist/ui/data-table.mjs +611 -0
  97. package/dist/ui/data-table.mjs.map +1 -0
  98. package/dist/ui/dropdown/dropdown.d.ts +1 -1
  99. package/dist/ui/dropdown/dropdown.d.ts.map +1 -1
  100. package/dist/ui/dropdown/types.d.ts +2 -2
  101. package/dist/ui/dropdown/types.d.ts.map +1 -1
  102. package/dist/ui/dropdown.js +31 -231
  103. package/dist/ui/dropdown.js.map +1 -1
  104. package/dist/ui/dropdown.mjs +4 -229
  105. package/dist/ui/dropdown.mjs.map +1 -1
  106. package/dist/ui/dynamic-stepper.js +18 -18
  107. package/dist/ui/dynamic-stepper.mjs +7 -7
  108. package/dist/ui/inputs.js +7 -138
  109. package/dist/ui/inputs.js.map +1 -1
  110. package/dist/ui/inputs.mjs +2 -141
  111. package/dist/ui/inputs.mjs.map +1 -1
  112. package/dist/ui/pagination.js +20 -221
  113. package/dist/ui/pagination.js.map +1 -1
  114. package/dist/ui/pagination.mjs +8 -223
  115. package/dist/ui/pagination.mjs.map +1 -1
  116. package/dist/ui/split-button/index.d.ts +4 -0
  117. package/dist/ui/split-button/index.d.ts.map +1 -0
  118. package/dist/ui/split-button/split-button-base.d.ts +6 -0
  119. package/dist/ui/split-button/split-button-base.d.ts.map +1 -0
  120. package/dist/ui/split-button/split-button.d.ts +6 -0
  121. package/dist/ui/split-button/split-button.d.ts.map +1 -0
  122. package/dist/ui/split-button/types.d.ts +30 -0
  123. package/dist/ui/split-button/types.d.ts.map +1 -0
  124. package/dist/ui/split-button/variants.d.ts +16 -0
  125. package/dist/ui/split-button/variants.d.ts.map +1 -0
  126. package/dist/ui/split-button.js +287 -0
  127. package/dist/ui/split-button.js.map +1 -0
  128. package/dist/ui/split-button.mjs +278 -0
  129. package/dist/ui/split-button.mjs.map +1 -0
  130. package/dist/ui/table.js +1 -0
  131. package/dist/ui/table.mjs +1 -0
  132. package/package.json +1 -1
  133. package/src/design-system/data-table.ts +20 -0
  134. package/src/design-system/index.ts +2 -0
  135. package/src/design-system/split-button.ts +38 -0
  136. package/src/ui/data-table/data-table-base.tsx +701 -0
  137. package/src/ui/data-table/data-table.test.tsx +389 -0
  138. package/src/ui/data-table/data-table.tsx +11 -0
  139. package/src/ui/data-table/index.ts +24 -0
  140. package/src/ui/data-table/types.ts +121 -0
  141. package/src/ui/data-table/variants.ts +21 -0
  142. package/src/ui/dropdown/dropdown.tsx +7 -3
  143. package/src/ui/dropdown/types.ts +2 -2
  144. package/src/ui/split-button/index.ts +19 -0
  145. package/src/ui/split-button/split-button-base.tsx +232 -0
  146. package/src/ui/split-button/split-button.test.tsx +208 -0
  147. package/src/ui/split-button/split-button.tsx +9 -0
  148. package/src/ui/split-button/types.ts +46 -0
  149. package/src/ui/split-button/variants.ts +46 -0
  150. package/dist/chunk-3W2UUKWP.js +0 -19
  151. package/dist/chunk-A4IB3C23.mjs.map +0 -1
  152. package/dist/chunk-VA6SB6NN.js.map +0 -1
@@ -0,0 +1,611 @@
1
+ "use client";
2
+ import { useTableSort } from '../chunk-W6DO36XD.mjs';
3
+ import { useVirtualList } from '../chunk-QKO5DA4N.mjs';
4
+ import { useTableFilter } from '../chunk-ZOHCADDL.mjs';
5
+ import '../chunk-TDK5TVJE.mjs';
6
+ import { TableBase, TableCaption, TableHeader, TableRow, TableHead, TableBody, TableCell } from '../chunk-BYXFSXNG.mjs';
7
+ import { Pagination } from '../chunk-D7ZTSAA6.mjs';
8
+ import { usePagination } from '../chunk-YNBJAFI2.mjs';
9
+ import { Input } from '../chunk-LHBJD57K.mjs';
10
+ import '../chunk-O22T5X4G.mjs';
11
+ import '../chunk-VBNW2B4D.mjs';
12
+ import { Button } from '../chunk-OWVQVAOY.mjs';
13
+ import '../chunk-4PAHLHYF.mjs';
14
+ import { Checkbox } from '../chunk-CYKSS5S5.mjs';
15
+ import '../chunk-ILCT3P7D.mjs';
16
+ import { zuiDataTableRootBase, zuiDataTableToolbarBase, zuiDataTableToolbarGroupBase, zuiDataTableColumnPanelBase, zuiDataTableStatusBase, zuiDataTableStateCellBase, zuiDataTableVirtualScrollBase } from '../chunk-UVP3MUBU.mjs';
17
+ import '../chunk-2NQKFH26.mjs';
18
+ import '../chunk-XY3TKIIH.mjs';
19
+ import '../chunk-FX5KR2GP.mjs';
20
+ import '../chunk-ZBAKTM2R.mjs';
21
+ import '../chunk-4ZBMDWWY.mjs';
22
+ import '../chunk-YH6MOKHR.mjs';
23
+ import '../chunk-T4ZLTKV2.mjs';
24
+ import '../chunk-PUSCPBT2.mjs';
25
+ import '../chunk-523VQLCW.mjs';
26
+ import '../chunk-3VW4HMJT.mjs';
27
+ import '../chunk-LRYKMXKI.mjs';
28
+ import '../chunk-XFJIX2YP.mjs';
29
+ import '../chunk-4WG3VNVL.mjs';
30
+ import '../chunk-YPTHTFVF.mjs';
31
+ import '../chunk-JEDMUBYI.mjs';
32
+ import '../chunk-EJ3UMMCS.mjs';
33
+ import '../chunk-EE53BIXR.mjs';
34
+ import '../chunk-YXU2MJMT.mjs';
35
+ import '../chunk-3IE4IELX.mjs';
36
+ import '../chunk-BUEI4RMR.mjs';
37
+ import '../chunk-5AOVTY2X.mjs';
38
+ import '../chunk-SS3T3BUL.mjs';
39
+ import '../chunk-SCWQSQBJ.mjs';
40
+ import '../chunk-ZPGYR2UP.mjs';
41
+ import '../chunk-MBEQ4GQ7.mjs';
42
+ import '../chunk-34LHS26H.mjs';
43
+ import '../chunk-YKTANA3H.mjs';
44
+ import '../chunk-ENYZGL4R.mjs';
45
+ import '../chunk-2VPXQ2LA.mjs';
46
+ import '../chunk-GUB3RSPR.mjs';
47
+ import '../chunk-6ERBVFDA.mjs';
48
+ import '../chunk-DOA4ESKS.mjs';
49
+ import '../chunk-QX6PPTWL.mjs';
50
+ import '../chunk-U64ISRUX.mjs';
51
+ import '../chunk-TKAOHMVA.mjs';
52
+ import '../chunk-HFQJRAG7.mjs';
53
+ import '../chunk-NIVJFG5Z.mjs';
54
+ import '../chunk-COCPCZMR.mjs';
55
+ import '../chunk-ZJWOSRAS.mjs';
56
+ import '../chunk-JOLSS7UY.mjs';
57
+ import '../chunk-NGZTAVQO.mjs';
58
+ import { cn } from '../chunk-4D54YOL6.mjs';
59
+ import '../chunk-J5LGTIGS.mjs';
60
+ import { useMemo, useId, useState, useCallback } from 'react';
61
+ import { cva } from 'class-variance-authority';
62
+ import { jsx, jsxs } from 'react/jsx-runtime';
63
+
64
+ var dataTableRootVariants = cva(zuiDataTableRootBase);
65
+ var dataTableToolbarVariants = cva(zuiDataTableToolbarBase);
66
+ var dataTableToolbarGroupVariants = cva(zuiDataTableToolbarGroupBase);
67
+ var dataTableColumnPanelVariants = cva(zuiDataTableColumnPanelBase);
68
+ var dataTableStatusVariants = cva(zuiDataTableStatusBase);
69
+ var dataTableStateCellVariants = cva(zuiDataTableStateCellBase);
70
+ var dataTableVirtualScrollVariants = cva(
71
+ zuiDataTableVirtualScrollBase
72
+ );
73
+ var defaultLoadingContent = "Loading data";
74
+ var defaultEmptyContent = "No results found";
75
+ var globalFilterKey = "__zui_global_filter__";
76
+ function getAccessorValue(row, column) {
77
+ if (typeof column.accessor === "function") {
78
+ return column.accessor(row);
79
+ }
80
+ if (column.accessor && row && typeof row === "object") {
81
+ return row[column.accessor];
82
+ }
83
+ if (row && typeof row === "object" && column.id in row) {
84
+ return row[column.id];
85
+ }
86
+ return void 0;
87
+ }
88
+ function normalizeComparable(value) {
89
+ if (value instanceof Date) {
90
+ return value.getTime();
91
+ }
92
+ if (typeof value === "number") {
93
+ return value;
94
+ }
95
+ if (typeof value === "boolean") {
96
+ return value ? 1 : 0;
97
+ }
98
+ return value == null ? "" : String(value).toLowerCase();
99
+ }
100
+ function compareValues(left, right) {
101
+ const normalizedLeft = normalizeComparable(left);
102
+ const normalizedRight = normalizeComparable(right);
103
+ if (typeof normalizedLeft === "number" && typeof normalizedRight === "number") {
104
+ return normalizedLeft - normalizedRight;
105
+ }
106
+ return String(normalizedLeft).localeCompare(String(normalizedRight));
107
+ }
108
+ function resolveSearchOptions(search) {
109
+ if (!search) {
110
+ return null;
111
+ }
112
+ if (search === true) {
113
+ return {};
114
+ }
115
+ return search;
116
+ }
117
+ function validateSearchOptions(searchOptions) {
118
+ if (searchOptions?.filterColumnIds && searchOptions.filterColumnIds.length === 0) {
119
+ console.warn(
120
+ "DataTable search.filterColumnIds is empty. It should include at least one column id."
121
+ );
122
+ }
123
+ }
124
+ function isSelected(selectedRowIds, rowId) {
125
+ return selectedRowIds.includes(rowId);
126
+ }
127
+ function toggleId(ids, id, checked) {
128
+ if (checked) {
129
+ return ids.includes(id) ? [...ids] : [...ids, id];
130
+ }
131
+ return ids.filter((item) => item !== id);
132
+ }
133
+ function textAlignClass(textAlign) {
134
+ if (textAlign === "center") {
135
+ return "text-center";
136
+ }
137
+ if (textAlign === "right") {
138
+ return "text-right";
139
+ }
140
+ return void 0;
141
+ }
142
+ function paginationAppearanceFor(appearance) {
143
+ if (appearance === "striped" || appearance === "bordered" || appearance === "ghost") {
144
+ return "default";
145
+ }
146
+ return appearance;
147
+ }
148
+ function uniqueVisibleColumnIds(columns, ids) {
149
+ const columnIds = new Set(columns.map((column) => column.id));
150
+ const initialIds = ids ?? columns.filter((column) => column.visible !== false).map((column) => column.id);
151
+ return initialIds.filter((id, index) => {
152
+ return columnIds.has(id) && initialIds.indexOf(id) === index;
153
+ });
154
+ }
155
+ function DataTableBase(props) {
156
+ const {
157
+ className,
158
+ columns,
159
+ data,
160
+ getRowId,
161
+ caption,
162
+ tableClassName,
163
+ tableScrollAreaAriaLabel,
164
+ appearance = "default",
165
+ size = "md",
166
+ stickyHeader,
167
+ textAlign,
168
+ search,
169
+ sortKey,
170
+ defaultSortKey,
171
+ sortDirection,
172
+ defaultSortDirection = "none",
173
+ onSortChange,
174
+ enableRowSelection = false,
175
+ selectedRowIds,
176
+ defaultSelectedRowIds = [],
177
+ onRowSelectionChange,
178
+ enableColumnVisibility = false,
179
+ visibleColumnIds,
180
+ defaultVisibleColumnIds,
181
+ onColumnVisibilityChange,
182
+ bulkActions = [],
183
+ pagination,
184
+ virtualization,
185
+ showRowCount = true,
186
+ loading = false,
187
+ loadingContent = defaultLoadingContent,
188
+ emptyContent = defaultEmptyContent,
189
+ ref,
190
+ "aria-label": ariaLabel = "Data table",
191
+ ...rest
192
+ } = props;
193
+ const searchOptions = resolveSearchOptions(search);
194
+ validateSearchOptions(searchOptions);
195
+ const keyedData = useMemo(
196
+ () => data.map((row, index) => ({
197
+ row,
198
+ id: getRowId ? getRowId(row, index) : String(index)
199
+ })),
200
+ [data, getRowId]
201
+ );
202
+ const resolvedAppearance = appearance ?? "default";
203
+ const resolvedSize = size ?? "md";
204
+ const resolvedPaginationAppearance = paginationAppearanceFor(resolvedAppearance);
205
+ const columnPanelId = useId();
206
+ const [columnPanelOpen, setColumnPanelOpen] = useState(false);
207
+ const [internalSelectedRowIds, setInternalSelectedRowIds] = useState(() => [
208
+ ...defaultSelectedRowIds
209
+ ]);
210
+ const selectedIds = useMemo(
211
+ () => selectedRowIds ? [...selectedRowIds] : internalSelectedRowIds,
212
+ [internalSelectedRowIds, selectedRowIds]
213
+ );
214
+ const isSelectionControlled = selectedRowIds !== void 0;
215
+ const [internalVisibleColumnIds, setInternalVisibleColumnIds] = useState(() => uniqueVisibleColumnIds(columns, defaultVisibleColumnIds));
216
+ const currentVisibleColumnIds = visibleColumnIds ? uniqueVisibleColumnIds(columns, visibleColumnIds) : uniqueVisibleColumnIds(columns, internalVisibleColumnIds);
217
+ const isVisibilityControlled = visibleColumnIds !== void 0;
218
+ const visibleColumns = useMemo(
219
+ () => columns.filter((column) => currentVisibleColumnIds.includes(column.id)),
220
+ [columns, currentVisibleColumnIds]
221
+ );
222
+ const [internalSearchValue, setInternalSearchValue] = useState(
223
+ () => searchOptions?.defaultValue ?? ""
224
+ );
225
+ const searchValue = searchOptions?.value ?? internalSearchValue;
226
+ const isSearchControlled = searchOptions?.value !== void 0;
227
+ const searchableColumns = useMemo(() => {
228
+ const filterColumnIds = searchOptions?.filterColumnIds;
229
+ const hasFilterColumns = Boolean(
230
+ filterColumnIds && filterColumnIds.length > 0
231
+ );
232
+ return visibleColumns.filter((column) => {
233
+ if (hasFilterColumns && !filterColumnIds?.includes(column.id)) {
234
+ return false;
235
+ }
236
+ return column.filterable !== false;
237
+ });
238
+ }, [searchOptions?.filterColumnIds, visibleColumns]);
239
+ const filterState = searchValue ? { [globalFilterKey]: searchValue } : void 0;
240
+ const { filteredData } = useTableFilter({
241
+ data: keyedData,
242
+ filters: filterState,
243
+ filterPredicate: ({ row }, filterValue) => {
244
+ const query = filterValue.trim().toLowerCase();
245
+ if (!query) {
246
+ return true;
247
+ }
248
+ return searchableColumns.some((column) => {
249
+ const value = column.filterValue ? column.filterValue(row) : getAccessorValue(row, column);
250
+ return String(value ?? "").toLowerCase().includes(query);
251
+ });
252
+ }
253
+ });
254
+ const tableSort = useTableSort({
255
+ sortKey,
256
+ defaultSortKey,
257
+ sortDirection,
258
+ defaultSortDirection,
259
+ onSortChange
260
+ });
261
+ const sortedData = useMemo(() => {
262
+ if (!tableSort.sortKey || tableSort.sortDirection === "none") {
263
+ return filteredData;
264
+ }
265
+ const sortedColumn = columns.find(
266
+ (column) => column.id === tableSort.sortKey
267
+ );
268
+ if (!sortedColumn || !sortedColumn.sortable) {
269
+ return filteredData;
270
+ }
271
+ const direction = tableSort.sortDirection === "ascending" ? 1 : -1;
272
+ return [...filteredData].sort((left, right) => {
273
+ const leftValue = sortedColumn.sortValue ? sortedColumn.sortValue(left.row) : getAccessorValue(left.row, sortedColumn);
274
+ const rightValue = sortedColumn.sortValue ? sortedColumn.sortValue(right.row) : getAccessorValue(right.row, sortedColumn);
275
+ return compareValues(leftValue, rightValue) * direction;
276
+ });
277
+ }, [columns, filteredData, tableSort.sortDirection, tableSort.sortKey]);
278
+ const paginationOptions = pagination && pagination !== true ? pagination : void 0;
279
+ const paginationEnabled = Boolean(pagination);
280
+ const pageSize = Math.max(1, paginationOptions?.pageSize ?? 10);
281
+ const pageCount = paginationEnabled ? Math.ceil(sortedData.length / pageSize) : 1;
282
+ const paginationState = usePagination({
283
+ pageCount,
284
+ page: paginationOptions?.page,
285
+ defaultPage: paginationOptions?.defaultPage,
286
+ siblingCount: paginationOptions?.siblingCount,
287
+ boundaryCount: paginationOptions?.boundaryCount,
288
+ onPageChange: paginationOptions?.onPageChange
289
+ });
290
+ const processedRows = paginationEnabled ? sortedData.slice(
291
+ (paginationState.currentPage - 1) * pageSize,
292
+ paginationState.currentPage * pageSize
293
+ ) : sortedData;
294
+ const virtualizationEnabled = Boolean(virtualization?.enabled) && processedRows.length > 0;
295
+ const virtualList = useVirtualList({
296
+ itemCount: processedRows.length,
297
+ itemHeight: virtualization?.rowHeight ?? 48,
298
+ overscan: virtualization?.overscan
299
+ });
300
+ const renderedRows = virtualizationEnabled ? virtualList.virtualItems.map((item) => ({
301
+ entry: processedRows[item.index],
302
+ index: item.index,
303
+ start: item.start
304
+ })) : processedRows.map((entry, index) => ({ entry, index, start: 0 }));
305
+ const virtualOffset = virtualizationEnabled ? virtualList.virtualItems[0]?.start ?? 0 : 0;
306
+ const selectableRows = useMemo(
307
+ () => processedRows.map((entry) => ({
308
+ row: entry.row,
309
+ id: entry.id
310
+ })),
311
+ [processedRows]
312
+ );
313
+ const selectedRows = useMemo(
314
+ () => keyedData.filter((entry) => isSelected(selectedIds, entry.id)).map((entry) => entry.row),
315
+ [keyedData, selectedIds]
316
+ );
317
+ const allVisibleSelected = selectableRows.length > 0 && selectableRows.every((item) => isSelected(selectedIds, item.id));
318
+ const someVisibleSelected = selectableRows.some((item) => isSelected(selectedIds, item.id)) && !allVisibleSelected;
319
+ const setSelectedIds = useCallback(
320
+ (nextIds) => {
321
+ if (!isSelectionControlled) {
322
+ setInternalSelectedRowIds(nextIds);
323
+ }
324
+ const nextRows = keyedData.filter((entry) => nextIds.includes(entry.id)).map((entry) => entry.row);
325
+ onRowSelectionChange?.(nextIds, nextRows);
326
+ },
327
+ [keyedData, isSelectionControlled, onRowSelectionChange]
328
+ );
329
+ const setColumnVisible = useCallback(
330
+ (columnId, checked) => {
331
+ const nextIds = checked ? [...currentVisibleColumnIds, columnId] : currentVisibleColumnIds.filter((id) => id !== columnId);
332
+ const normalized = uniqueVisibleColumnIds(columns, nextIds);
333
+ if (!isVisibilityControlled) {
334
+ setInternalVisibleColumnIds(normalized);
335
+ }
336
+ onColumnVisibilityChange?.(normalized);
337
+ },
338
+ [
339
+ columns,
340
+ currentVisibleColumnIds,
341
+ isVisibilityControlled,
342
+ onColumnVisibilityChange
343
+ ]
344
+ );
345
+ const handleSearchChange = useCallback(
346
+ (value) => {
347
+ if (!isSearchControlled) {
348
+ setInternalSearchValue(value);
349
+ }
350
+ searchOptions?.onValueChange?.(value);
351
+ },
352
+ [isSearchControlled, searchOptions]
353
+ );
354
+ const headerColSpan = visibleColumns.length + (enableRowSelection ? 1 : 0) || 1;
355
+ const renderStateRow = (content) => /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
356
+ TableCell,
357
+ {
358
+ colSpan: headerColSpan,
359
+ className: dataTableStateCellVariants(),
360
+ children: content
361
+ }
362
+ ) });
363
+ const renderRow = (entry, rowIndex) => {
364
+ const { row, id: rowId } = entry;
365
+ const rowSelected = isSelected(selectedIds, rowId);
366
+ const labelColumn = visibleColumns[0] ?? columns[0];
367
+ const rowSelectionLabel = labelColumn ? String(getAccessorValue(row, labelColumn) ?? rowId) : rowId;
368
+ return /* @__PURE__ */ jsxs(TableRow, { "data-state": rowSelected ? "selected" : void 0, children: [
369
+ enableRowSelection ? /* @__PURE__ */ jsx(TableCell, { className: "w-10", children: /* @__PURE__ */ jsx(
370
+ Checkbox,
371
+ {
372
+ "aria-label": `Select ${rowSelectionLabel}`,
373
+ checked: rowSelected,
374
+ onCheckedChange: (checked) => {
375
+ setSelectedIds(toggleId(selectedIds, rowId, checked));
376
+ }
377
+ }
378
+ ) }) : null,
379
+ visibleColumns.map((column, columnIndex) => {
380
+ const value = getAccessorValue(row, column);
381
+ const content = column.cell ? column.cell({ row, value, column, rowIndex }) : String(value ?? "");
382
+ const isRowHeader = columnIndex === 0;
383
+ return /* @__PURE__ */ jsx(
384
+ TableCell,
385
+ {
386
+ scope: isRowHeader ? "row" : void 0,
387
+ className: cn(
388
+ textAlignClass(column.textAlign),
389
+ column.className,
390
+ column.cellClassName
391
+ ),
392
+ ...column.cellProps,
393
+ children: content
394
+ },
395
+ column.id
396
+ );
397
+ })
398
+ ] }, rowId);
399
+ };
400
+ const tableElement = /* @__PURE__ */ jsxs(
401
+ TableBase,
402
+ {
403
+ "aria-label": ariaLabel,
404
+ appearance: resolvedAppearance,
405
+ size: resolvedSize,
406
+ stickyHeader,
407
+ textAlign,
408
+ scrollAreaAriaLabel: tableScrollAreaAriaLabel,
409
+ className: tableClassName,
410
+ children: [
411
+ caption ? /* @__PURE__ */ jsx(TableCaption, { children: caption }) : null,
412
+ /* @__PURE__ */ jsx(TableHeader, { children: /* @__PURE__ */ jsxs(TableRow, { children: [
413
+ enableRowSelection ? /* @__PURE__ */ jsx(TableHead, { className: "w-10", children: /* @__PURE__ */ jsx(
414
+ Checkbox,
415
+ {
416
+ "aria-label": "Select all rows",
417
+ checked: allVisibleSelected,
418
+ indeterminate: someVisibleSelected,
419
+ onCheckedChange: (checked) => {
420
+ const visibleIds = selectableRows.map((item) => item.id);
421
+ const nextIds = checked ? [.../* @__PURE__ */ new Set([...selectedIds, ...visibleIds])] : selectedIds.filter((id) => !visibleIds.includes(id));
422
+ setSelectedIds(nextIds);
423
+ }
424
+ }
425
+ ) }) : null,
426
+ visibleColumns.map((column) => {
427
+ const header = typeof column.header === "function" ? column.header({ column }) : column.header;
428
+ return /* @__PURE__ */ jsx(
429
+ TableHead,
430
+ {
431
+ className: cn(
432
+ textAlignClass(column.textAlign),
433
+ column.className,
434
+ column.headerClassName
435
+ ),
436
+ ...column.sortable ? tableSort.getSortProps(column.id) : {},
437
+ ...column.headerProps,
438
+ children: header
439
+ },
440
+ column.id
441
+ );
442
+ })
443
+ ] }) }),
444
+ /* @__PURE__ */ jsx(TableBody, { children: loading ? renderStateRow(loadingContent) : renderedRows.length === 0 ? renderStateRow(emptyContent) : renderedRows.map(({ entry, index }) => renderRow(entry, index)) })
445
+ ]
446
+ }
447
+ );
448
+ return /* @__PURE__ */ jsxs(
449
+ "section",
450
+ {
451
+ ref,
452
+ "data-slot": "data-table",
453
+ className: cn(dataTableRootVariants(), className),
454
+ ...rest,
455
+ children: [
456
+ searchOptions || enableColumnVisibility || bulkActions.length > 0 ? /* @__PURE__ */ jsxs(
457
+ "div",
458
+ {
459
+ "data-slot": "data-table-toolbar",
460
+ className: dataTableToolbarVariants(),
461
+ children: [
462
+ /* @__PURE__ */ jsxs(
463
+ "div",
464
+ {
465
+ "data-slot": "data-table-toolbar-primary",
466
+ className: dataTableToolbarGroupVariants(),
467
+ children: [
468
+ searchOptions ? /* @__PURE__ */ jsx(
469
+ Input,
470
+ {
471
+ as: "input",
472
+ type: "search",
473
+ "aria-label": searchOptions.label ?? "Search table",
474
+ placeholder: searchOptions.placeholder ?? "Search table",
475
+ value: searchValue,
476
+ onChange: (event) => handleSearchChange(event.currentTarget.value),
477
+ className: "min-w-56"
478
+ }
479
+ ) : null,
480
+ selectedRows.length > 0 ? /* @__PURE__ */ jsxs("span", { className: dataTableStatusVariants(), "aria-live": "polite", children: [
481
+ selectedRows.length,
482
+ " selected"
483
+ ] }) : null
484
+ ]
485
+ }
486
+ ),
487
+ /* @__PURE__ */ jsxs(
488
+ "div",
489
+ {
490
+ "data-slot": "data-table-toolbar-actions",
491
+ className: dataTableToolbarGroupVariants(),
492
+ children: [
493
+ bulkActions.map((action, index) => /* @__PURE__ */ jsx(
494
+ Button,
495
+ {
496
+ type: "button",
497
+ appearance: "outline",
498
+ size: "sm",
499
+ disabled: action.disabled || selectedRows.length === 0,
500
+ onClick: () => action.onSelect(selectedRows),
501
+ children: action.label
502
+ },
503
+ index
504
+ )),
505
+ enableColumnVisibility ? /* @__PURE__ */ jsxs("div", { className: "relative", children: [
506
+ /* @__PURE__ */ jsx(
507
+ Button,
508
+ {
509
+ type: "button",
510
+ appearance: "outline",
511
+ size: "sm",
512
+ "aria-expanded": columnPanelOpen,
513
+ "aria-controls": columnPanelId,
514
+ onClick: () => setColumnPanelOpen((open) => !open),
515
+ children: "Columns"
516
+ }
517
+ ),
518
+ columnPanelOpen ? /* @__PURE__ */ jsx(
519
+ "div",
520
+ {
521
+ id: columnPanelId,
522
+ "data-slot": "data-table-column-panel",
523
+ className: dataTableColumnPanelVariants(),
524
+ children: columns.map((column) => {
525
+ const canHide = column.enableHiding !== false;
526
+ return /* @__PURE__ */ jsxs(
527
+ Checkbox,
528
+ {
529
+ checked: currentVisibleColumnIds.includes(column.id),
530
+ disabled: !canHide,
531
+ onCheckedChange: (checked) => setColumnVisible(column.id, checked),
532
+ children: [
533
+ String(
534
+ typeof column.header === "function" ? column.id : column.header
535
+ ),
536
+ " ",
537
+ "column"
538
+ ]
539
+ },
540
+ column.id
541
+ );
542
+ })
543
+ }
544
+ ) : null
545
+ ] }) : null
546
+ ]
547
+ }
548
+ )
549
+ ]
550
+ }
551
+ ) : null,
552
+ virtualizationEnabled ? /* @__PURE__ */ jsx(
553
+ "div",
554
+ {
555
+ ref: virtualList.setContainerRef,
556
+ "data-slot": "data-table-virtual-scroll",
557
+ className: dataTableVirtualScrollVariants(),
558
+ style: { maxHeight: virtualization?.height },
559
+ children: /* @__PURE__ */ jsx("div", { style: { minHeight: virtualList.totalHeight }, children: /* @__PURE__ */ jsx(
560
+ "div",
561
+ {
562
+ "data-slot": "data-table-virtual-offset",
563
+ style: { transform: `translateY(${virtualOffset}px)` },
564
+ children: tableElement
565
+ }
566
+ ) })
567
+ }
568
+ ) : tableElement,
569
+ paginationEnabled && pageCount > 1 ? /* @__PURE__ */ jsxs(
570
+ "div",
571
+ {
572
+ className: cn(
573
+ "flex flex-wrap items-center gap-3",
574
+ showRowCount ? "justify-between" : "justify-end"
575
+ ),
576
+ children: [
577
+ showRowCount ? /* @__PURE__ */ jsxs("span", { className: dataTableStatusVariants(), children: [
578
+ "Showing ",
579
+ processedRows.length,
580
+ " of ",
581
+ sortedData.length
582
+ ] }) : null,
583
+ /* @__PURE__ */ jsx(
584
+ Pagination,
585
+ {
586
+ appearance: resolvedPaginationAppearance,
587
+ size: resolvedSize,
588
+ pageCount,
589
+ page: paginationState.currentPage,
590
+ siblingCount: paginationOptions?.siblingCount,
591
+ boundaryCount: paginationOptions?.boundaryCount,
592
+ onPageChange: paginationState.setPage,
593
+ className: "w-auto"
594
+ }
595
+ )
596
+ ]
597
+ }
598
+ ) : null
599
+ ]
600
+ }
601
+ );
602
+ }
603
+ DataTableBase.displayName = "DataTable";
604
+ function DataTable(props) {
605
+ return /* @__PURE__ */ jsx(DataTableBase, { ...props });
606
+ }
607
+ DataTable.displayName = "DataTable";
608
+
609
+ export { DataTable, dataTableColumnPanelVariants, dataTableRootVariants, dataTableStateCellVariants, dataTableStatusVariants, dataTableToolbarGroupVariants, dataTableToolbarVariants, dataTableVirtualScrollVariants };
610
+ //# sourceMappingURL=data-table.mjs.map
611
+ //# sourceMappingURL=data-table.mjs.map