@multiplatform.one/table 7.10.0 → 7.11.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 (84) hide show
  1. package/README.md +60 -0
  2. package/dist/cjs/components/DataTable/DataTableCardControls.cjs +90 -54
  3. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +93 -56
  4. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  5. package/dist/cjs/components/DataTable/DataTableRoot.cjs +51 -8
  6. package/dist/cjs/components/DataTable/DataTableRoot.native.js +53 -9
  7. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  8. package/dist/cjs/components/DataTableFilterButton/index.cjs +14 -0
  9. package/dist/cjs/components/DataTableFilterButton/index.native.js +15 -0
  10. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  11. package/dist/cjs/components/DataTableToolbar/index.cjs +178 -101
  12. package/dist/cjs/components/DataTableToolbar/index.native.js +187 -109
  13. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  14. package/dist/cjs/hooks/useDataTable.cjs +32 -1
  15. package/dist/cjs/hooks/useDataTable.native.js +37 -1
  16. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  17. package/dist/esm/components/DataTable/DataTableCardControls.mjs +89 -54
  18. package/dist/esm/components/DataTable/DataTableCardControls.mjs.map +1 -1
  19. package/dist/esm/components/DataTable/DataTableCardControls.native.js +92 -56
  20. package/dist/esm/components/DataTable/DataTableCardControls.native.js.map +1 -1
  21. package/dist/esm/components/DataTable/DataTableRoot.mjs +53 -10
  22. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  23. package/dist/esm/components/DataTable/DataTableRoot.native.js +55 -11
  24. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  25. package/dist/esm/components/DataTableFilterButton/index.mjs +14 -1
  26. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  27. package/dist/esm/components/DataTableFilterButton/index.native.js +15 -1
  28. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  29. package/dist/esm/components/DataTableToolbar/index.mjs +180 -104
  30. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  31. package/dist/esm/components/DataTableToolbar/index.native.js +189 -112
  32. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  33. package/dist/esm/hooks/useDataTable.mjs +32 -1
  34. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  35. package/dist/esm/hooks/useDataTable.native.js +37 -1
  36. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  37. package/dist/jsx/components/DataTable/DataTableCardControls.mjs +89 -54
  38. package/dist/jsx/components/DataTable/DataTableCardControls.mjs.map +1 -1
  39. package/dist/jsx/components/DataTable/DataTableCardControls.native.js +93 -56
  40. package/dist/jsx/components/DataTable/DataTableCardControls.native.js.map +1 -1
  41. package/dist/jsx/components/DataTable/DataTableRoot.mjs +53 -10
  42. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  43. package/dist/jsx/components/DataTable/DataTableRoot.native.js +53 -9
  44. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  45. package/dist/jsx/components/DataTableFilterButton/index.mjs +14 -1
  46. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  47. package/dist/jsx/components/DataTableFilterButton/index.native.js +15 -0
  48. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  49. package/dist/jsx/components/DataTableToolbar/index.mjs +180 -104
  50. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  51. package/dist/jsx/components/DataTableToolbar/index.native.js +187 -109
  52. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  53. package/dist/jsx/hooks/useDataTable.mjs +32 -1
  54. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  55. package/dist/jsx/hooks/useDataTable.native.js +37 -1
  56. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  57. package/package.json +14 -14
  58. package/src/components/DataTable/DataTable.stories.tsx +59 -0
  59. package/src/components/DataTable/DataTableCardControls.stories.tsx +61 -2
  60. package/src/components/DataTable/DataTableCardControls.tsx +92 -66
  61. package/src/components/DataTable/DataTableRoot.tsx +82 -14
  62. package/src/components/DataTable/cardLayout.spec.tsx +4 -3
  63. package/src/components/DataTable/cardToolbar.spec.tsx +238 -0
  64. package/src/components/DataTable/chromeInterplay.spec.tsx +7 -5
  65. package/src/components/DataTable/columnWidthLayout.spec.tsx +189 -0
  66. package/src/components/DataTable/dataTableCardControls.spec.tsx +3 -2
  67. package/src/components/DataTable/footerLayout.spec.tsx +250 -0
  68. package/src/components/DataTable/pinningGeometry.spec.tsx +66 -1
  69. package/src/components/DataTableExport/DataTableExport.spec.tsx +42 -18
  70. package/src/components/DataTableFilterButton/index.tsx +9 -0
  71. package/src/components/DataTableToolbar/index.tsx +184 -105
  72. package/src/hooks/useDataTable.spec.ts +114 -0
  73. package/src/hooks/useDataTable.ts +23 -1
  74. package/src/types.ts +14 -12
  75. package/types/components/DataTable/DataTableCardControls.d.ts +3 -0
  76. package/types/components/DataTable/DataTableCardControls.d.ts.map +1 -1
  77. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  78. package/types/components/DataTableFilterButton/index.d.ts +2 -1
  79. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  80. package/types/components/DataTableToolbar/index.d.ts +1 -0
  81. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  82. package/types/hooks/useDataTable.d.ts.map +1 -1
  83. package/types/types.d.ts +14 -12
  84. package/types/types.d.ts.map +1 -1
@@ -11,7 +11,7 @@ import type { TableView } from "../../types";
11
11
  import { iconSizeForToken } from "../../utils/chromeIcons";
12
12
  import { useDataTableState } from "../DataTable/DataTableStateContext";
13
13
  import { DataTableExport } from "../DataTableExport";
14
- import { DataTableFilterButton } from "../DataTableFilterButton";
14
+ import { DataTableCardFilterButton, DataTableFilterButton } from "../DataTableFilterButton";
15
15
 
16
16
  export interface DataTableToolbarProps {
17
17
  // Search
@@ -49,6 +49,17 @@ export interface DataTableToolbarProps {
49
49
  }
50
50
 
51
51
  export function DataTableToolbar(props: DataTableToolbarProps) {
52
+ return <ToolbarLayout {...props} />;
53
+ }
54
+
55
+ export function DataTableCardToolbar(props: DataTableToolbarProps) {
56
+ return <ToolbarLayout {...props} cardLayout />;
57
+ }
58
+
59
+ function ToolbarLayout({
60
+ cardLayout = false,
61
+ ...props
62
+ }: DataTableToolbarProps & { cardLayout?: boolean }) {
52
63
  const ctx = useDataTableState();
53
64
 
54
65
  const globalFilter = props.globalFilter ?? ctx?.state.globalFilter ?? "";
@@ -108,9 +119,105 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
108
119
  );
109
120
  const hasTrailing = showActionCluster || isFetching;
110
121
 
122
+ const viewPickerContent = showViewPicker && (
123
+ <DropdownMenu closeOnSelect placement="bottom-end">
124
+ <DropdownMenu.Trigger asChild>
125
+ <RovingFocusGroup.Item focusable asChild>
126
+ <Button
127
+ chromeless
128
+ size={controlSize}
129
+ iconAfter={<CaretDownIcon size={iconPx} />}
130
+ aria-label={t("Saved views")}
131
+ {...(cardLayout ? { minWidth: 0, maxWidth: "100%" as const } : {})}
132
+ aria-haspopup="menu"
133
+ >
134
+ {activeView?.name ?? t("Views")}
135
+ </Button>
136
+ </RovingFocusGroup.Item>
137
+ </DropdownMenu.Trigger>
138
+ <DropdownMenu.Content>
139
+ {views.map((view) => (
140
+ <DropdownMenu.CheckboxItem
141
+ key={view.id}
142
+ checked={view.id === activeViewId}
143
+ closeOnSelect
144
+ onSelect={() => onLoadView(view.id)}
145
+ >
146
+ {view.name}
147
+ </DropdownMenu.CheckboxItem>
148
+ ))}
149
+ </DropdownMenu.Content>
150
+ </DropdownMenu>
151
+ );
152
+ const viewPicker =
153
+ cardLayout && showViewPicker ? (
154
+ <XStack minWidth={0} maxWidth="100%" flexBasis="auto" flexGrow={0} flexShrink={1}>
155
+ {viewPickerContent}
156
+ </XStack>
157
+ ) : (
158
+ viewPickerContent
159
+ );
160
+ const saveView = showSave && (
161
+ <Popover open={showSaveViewDialog} onOpenChange={setShowSaveViewDialog}>
162
+ <Popover.Trigger asChild>
163
+ <RovingFocusGroup.Item focusable asChild>
164
+ <Button
165
+ chromeless
166
+ size={controlSize}
167
+ icon={<FloppyDiskIcon size={iconPx} />}
168
+ aria-label={t("Save view")}
169
+ />
170
+ </RovingFocusGroup.Item>
171
+ </Popover.Trigger>
172
+ <Popover.Content
173
+ {...knobProps.elevatedSurface}
174
+ {...knobProps.borderRadius}
175
+ borderColor="$color6"
176
+ // LC-24: enter/exitStyle need a `transition` driver on the
177
+ // same element ({...string} spread set nothing).
178
+ transition={knobProps.transition}
179
+ enterStyle={{ x: 0, y: -10, opacity: 0 }}
180
+ exitStyle={{ x: 0, y: -10, opacity: 0 }}
181
+ data-dismiss-class="compose"
182
+ >
183
+ <YStack {...knobProps.gap} {...knobProps.panelPadding} minWidth={240}>
184
+ <Input
185
+ placeholder={t("View name")}
186
+ value={newViewName}
187
+ onChangeText={setNewViewName}
188
+ size={searchSize}
189
+ {...(compact === undefined ? {} : { compact })}
190
+ inputProps={{
191
+ "aria-label": t("View name"),
192
+ onKeyDown: (e: React.KeyboardEvent) => {
193
+ if (e.key === "Enter") handleSaveView();
194
+ },
195
+ }}
196
+ />
197
+ <XStack {...knobProps.gap} justifyContent="flex-end">
198
+ <Button size={controlSize} onPress={() => setShowSaveViewDialog(false)}>
199
+ {t("Cancel")}
200
+ </Button>
201
+ <Button
202
+ size={controlSize}
203
+ onPress={handleSaveView}
204
+ disabled={!newViewName.trim()}
205
+ disabledReason={t("Enter a view name")}
206
+ >
207
+ {t("Save")}
208
+ </Button>
209
+ </XStack>
210
+ </YStack>
211
+ </Popover.Content>
212
+ </Popover>
213
+ );
214
+ const showSecondary = showViewPicker || showSave || enableExport || isFetching;
215
+
111
216
  return (
112
217
  <XStack
113
- alignItems="center"
218
+ alignItems={cardLayout ? "stretch" : "center"}
219
+ flexDirection={cardLayout ? "column" : "row"}
220
+ {...(cardLayout ? { width: "100%" as const, minWidth: 0 } : {})}
114
221
  // LC-39: flush band — no painted panel, so no horizontal inset.
115
222
  paddingVertical={knobProps.panelPadding.padding}
116
223
  paddingHorizontal={0}
@@ -124,7 +231,12 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
124
231
  aria-busy={isFetching || undefined}
125
232
  >
126
233
  {enableGlobalSearch && (
127
- <XStack flex={1} minWidth={160} maxWidth={searchMaxWidth} flexShrink={1}>
234
+ <XStack
235
+ flex={cardLayout ? undefined : 1}
236
+ minWidth={cardLayout ? 0 : 160}
237
+ maxWidth={cardLayout ? undefined : searchMaxWidth}
238
+ flexShrink={1}
239
+ >
128
240
  <SearchInput
129
241
  value={globalFilter}
130
242
  onChange={onGlobalFilterChange}
@@ -144,116 +256,83 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
144
256
  </XStack>
145
257
  )}
146
258
 
147
- {hasTrailing && (
148
- <XStack
149
- alignItems="center"
150
- {...knobProps.gap}
151
- flexShrink={0}
152
- marginInlineStart={enableGlobalSearch ? "auto" : 0}
153
- >
154
- {showActionCluster && (
259
+ {cardLayout ? (
260
+ <>
261
+ {(showFilterButton || customActions) && (
155
262
  <RovingFocusGroup orientation="horizontal" loop asChild>
156
- <XStack alignItems="center" {...knobProps.gap}>
157
- {showFilterButton && <DataTableFilterButton />}
158
-
159
- {enableExport && <DataTableExport />}
160
-
263
+ <XStack
264
+ data-table-card-primary=""
265
+ width="100%"
266
+ minWidth={0}
267
+ alignItems="center"
268
+ flexWrap="nowrap"
269
+ {...knobProps.gap}
270
+ >
271
+ {showFilterButton && (
272
+ <XStack flexShrink={0}>
273
+ <DataTableCardFilterButton />
274
+ </XStack>
275
+ )}
161
276
  {customActions}
162
-
163
- {showViewPicker && (
164
- <DropdownMenu closeOnSelect placement="bottom-end">
165
- <DropdownMenu.Trigger asChild>
166
- <RovingFocusGroup.Item focusable asChild>
167
- <Button
168
- chromeless
169
- size={controlSize}
170
- iconAfter={<CaretDownIcon size={iconPx} />}
171
- aria-label={t("Saved views")}
172
- aria-haspopup="menu"
173
- >
174
- {activeView?.name ?? t("Views")}
175
- </Button>
176
- </RovingFocusGroup.Item>
177
- </DropdownMenu.Trigger>
178
- <DropdownMenu.Content>
179
- {views.map((view) => (
180
- <DropdownMenu.CheckboxItem
181
- key={view.id}
182
- checked={view.id === activeViewId}
183
- closeOnSelect
184
- onSelect={() => onLoadView(view.id)}
185
- >
186
- {view.name}
187
- </DropdownMenu.CheckboxItem>
188
- ))}
189
- </DropdownMenu.Content>
190
- </DropdownMenu>
277
+ </XStack>
278
+ </RovingFocusGroup>
279
+ )}
280
+ {showSecondary && (
281
+ <RovingFocusGroup orientation="horizontal" loop asChild>
282
+ <XStack
283
+ data-table-card-secondary=""
284
+ width="100%"
285
+ minWidth={0}
286
+ flexWrap="wrap"
287
+ alignItems="center"
288
+ {...knobProps.gap}
289
+ >
290
+ {enableExport && (
291
+ <XStack maxWidth="100%" minWidth={0}>
292
+ <DataTableExport />
293
+ </XStack>
191
294
  )}
192
-
193
- {showSave && (
194
- <Popover open={showSaveViewDialog} onOpenChange={setShowSaveViewDialog}>
195
- <Popover.Trigger asChild>
196
- <RovingFocusGroup.Item focusable asChild>
197
- <Button
198
- chromeless
199
- size={controlSize}
200
- icon={<FloppyDiskIcon size={iconPx} />}
201
- aria-label={t("Save view")}
202
- />
203
- </RovingFocusGroup.Item>
204
- </Popover.Trigger>
205
- <Popover.Content
206
- {...knobProps.elevatedSurface}
207
- {...knobProps.borderRadius}
208
- borderColor="$color6"
209
- // LC-24: enter/exitStyle need a `transition` driver on the
210
- // same element ({...string} spread set nothing).
211
- transition={knobProps.transition}
212
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
213
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
214
- data-dismiss-class="compose"
215
- >
216
- <YStack {...knobProps.gap} {...knobProps.panelPadding} minWidth={240}>
217
- <Input
218
- placeholder={t("View name")}
219
- value={newViewName}
220
- onChangeText={setNewViewName}
221
- size={searchSize}
222
- {...(compact === undefined ? {} : { compact })}
223
- inputProps={{
224
- "aria-label": t("View name"),
225
- onKeyDown: (e: React.KeyboardEvent) => {
226
- if (e.key === "Enter") handleSaveView();
227
- },
228
- }}
229
- />
230
- <XStack {...knobProps.gap} justifyContent="flex-end">
231
- <Button size={controlSize} onPress={() => setShowSaveViewDialog(false)}>
232
- {t("Cancel")}
233
- </Button>
234
- <Button
235
- size={controlSize}
236
- onPress={handleSaveView}
237
- disabled={!newViewName.trim()}
238
- disabledReason={t("Enter a view name")}
239
- >
240
- {t("Save")}
241
- </Button>
242
- </XStack>
243
- </YStack>
244
- </Popover.Content>
245
- </Popover>
295
+ {viewPicker}
296
+ {saveView}
297
+ {isFetching && (
298
+ <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
299
+ <Spinner size="small" />
300
+ </XStack>
246
301
  )}
247
302
  </XStack>
248
303
  </RovingFocusGroup>
249
304
  )}
305
+ </>
306
+ ) : (
307
+ hasTrailing && (
308
+ <XStack
309
+ alignItems="center"
310
+ {...knobProps.gap}
311
+ flexShrink={0}
312
+ marginInlineStart={enableGlobalSearch ? "auto" : 0}
313
+ >
314
+ {showActionCluster && (
315
+ <RovingFocusGroup orientation="horizontal" loop asChild>
316
+ <XStack alignItems="center" {...knobProps.gap}>
317
+ {showFilterButton && <DataTableFilterButton />}
250
318
 
251
- {isFetching && (
252
- <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
253
- <Spinner size="small" />
254
- </XStack>
255
- )}
256
- </XStack>
319
+ {enableExport && <DataTableExport />}
320
+
321
+ {customActions}
322
+
323
+ {viewPicker}
324
+ {saveView}
325
+ </XStack>
326
+ </RovingFocusGroup>
327
+ )}
328
+
329
+ {isFetching && (
330
+ <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
331
+ <Spinner size="small" />
332
+ </XStack>
333
+ )}
334
+ </XStack>
335
+ )
257
336
  )}
258
337
  </XStack>
259
338
  );
@@ -111,3 +111,117 @@ describe("useDataTable controlledState adoption", () => {
111
111
  expect(result.current.state.filters).toEqual([]);
112
112
  });
113
113
  });
114
+
115
+ describe("useDataTable column width normalization", () => {
116
+ type Row = (typeof data)[number];
117
+
118
+ it.each<[Partial<DataTableColumn<Row>>, number]>([
119
+ [{ width: 320 }, 320],
120
+ [{ width: 320, size: 90 }, 90],
121
+ [{ width: 320, minWidth: 200, maxWidth: 240 }, 240],
122
+ [{ width: 320, size: 90, minWidth: 200, minSize: 60, maxWidth: 80, maxSize: 100 }, 90],
123
+ [{ width: 320, size: 180, maxWidth: 140 }, 140],
124
+ [{ width: 125.5 }, 125.5],
125
+ [{ width: 0 }, 20],
126
+ [{ width: 0, minWidth: 0 }, 0],
127
+ [{ width: 320, size: 0, minSize: 0 }, 0],
128
+ [{ width: Number.NaN }, 150],
129
+ [{ width: Number.POSITIVE_INFINITY }, 150],
130
+ [{ width: -1 }, 150],
131
+ [{ minWidth: Number.NaN, maxWidth: -1 }, 150],
132
+ ])("resolves %j to %s through the real table", (sizing, expected) => {
133
+ const { result } = renderHook(() =>
134
+ useDataTable({ data, columns: [{ id: "name", accessorKey: "name", ...sizing }] }),
135
+ );
136
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(expected);
137
+ });
138
+
139
+ it("preserves input objects and normalizes grouped leaves without distributing group width", () => {
140
+ const leaf: DataTableColumn<Row> = { id: "name", accessorKey: "name", width: 320 };
141
+ const group: DataTableColumn<Row> = {
142
+ id: "group",
143
+ header: "Group",
144
+ width: 900,
145
+ columns: [leaf],
146
+ };
147
+ const plain: DataTableColumn<Row> = { id: "status", accessorKey: "status" };
148
+ Object.freeze(leaf);
149
+ Object.freeze(group.columns);
150
+ Object.freeze(group);
151
+ Object.freeze(plain);
152
+ const source = [group, plain];
153
+ Object.freeze(source);
154
+ const { result, rerender } = renderHook(() => useDataTable({ data, columns: source }));
155
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(320);
156
+ expect(leaf).not.toHaveProperty("size");
157
+ expect(group.columns?.[0]).toBe(leaf);
158
+ expect(result.current.table.options.columns[1]).toBe(plain);
159
+ const normalized = result.current.table.options.columns;
160
+ rerender();
161
+ expect(result.current.table.options.columns).toBe(normalized);
162
+ });
163
+
164
+ it("keeps sizing state ahead of updated declarations and resets to the current definition", () => {
165
+ const { result, rerender } = renderHook(
166
+ ({ width }) => useDataTable({ data, columns: [{ id: "name", accessorKey: "name", width }] }),
167
+ { initialProps: { width: 320 } },
168
+ );
169
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(320);
170
+ act(() => result.current.actions.setColumnSizing({ name: 210 }));
171
+ rerender({ width: 400 });
172
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(210);
173
+ act(() => result.current.actions.resetToDefault());
174
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(400);
175
+ });
176
+
177
+ it("loads existing view width state without renaming its persistence field", () => {
178
+ const { result } = renderHook(() =>
179
+ useDataTable({
180
+ data,
181
+ columns: [{ id: "name", accessorKey: "name", width: 320 }],
182
+ initialState: {
183
+ views: [
184
+ {
185
+ id: "saved",
186
+ name: "Saved",
187
+ columns: { name: { id: "name", visible: true, width: 205, order: 0 } },
188
+ filters: [],
189
+ sorting: [],
190
+ pagination: { pageIndex: 0, pageSize: 10 },
191
+ },
192
+ ],
193
+ },
194
+ }),
195
+ );
196
+ act(() => result.current.actions.loadView("saved"));
197
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(205);
198
+ expect(result.current.state.columnSizing).toEqual({ name: 205 });
199
+ act(() => result.current.actions.resetToDefault());
200
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(320);
201
+ });
202
+
203
+ it("preserves sorting/filter aliases and explicit overrides alongside width", () => {
204
+ const sortingFn = vi.fn(() => 0);
205
+ const { result } = renderHook(() =>
206
+ useDataTable({
207
+ data,
208
+ columns: [
209
+ { id: "name", accessorKey: "name", width: 320, sortable: false, filterable: false },
210
+ {
211
+ id: "status",
212
+ accessorKey: "status",
213
+ width: 90,
214
+ sortable: false,
215
+ enableSorting: true,
216
+ sortingFn,
217
+ },
218
+ ],
219
+ }),
220
+ );
221
+ expect(result.current.table.getColumn("name")?.getSize()).toBe(320);
222
+ expect(result.current.table.getColumn("name")?.getCanSort()).toBe(false);
223
+ expect(result.current.table.getColumn("name")?.getCanFilter()).toBe(false);
224
+ expect(result.current.table.getColumn("status")?.getCanSort()).toBe(true);
225
+ expect(result.current.table.getColumn("status")?.columnDef.sortingFn).toBe(sortingFn);
226
+ });
227
+ });
@@ -170,6 +170,7 @@ export const createUrlStrategy = {
170
170
 
171
171
  import React, { useMemo, useState, useCallback, useEffect, useRef } from "react";
172
172
  import type {
173
+ DataTableColumn,
173
174
  DataTableData,
174
175
  DataTableField,
175
176
  DataTableInfiniteState,
@@ -200,6 +201,26 @@ import { useTableViews } from "./useTableViews";
200
201
  const moneySortingFn = (rowA: any, rowB: any, columnId: string): number =>
201
202
  moneyComparator(rowA.getValue(columnId), rowB.getValue(columnId));
202
203
 
204
+ function normalizeColumnWidths<TData extends DataTableData>(
205
+ column: ColumnDef<TData>,
206
+ ): ColumnDef<TData> {
207
+ if ("columns" in column && column.columns) {
208
+ const children = column.columns.map(normalizeColumnWidths);
209
+ return children.some((child, index) => child !== column.columns?.[index])
210
+ ? { ...column, columns: children }
211
+ : column;
212
+ }
213
+ const { width, minWidth, maxWidth } = column as DataTableColumn<TData>;
214
+ const validWidth = (value: unknown): value is number =>
215
+ typeof value === "number" && Number.isFinite(value) && value >= 0;
216
+ const sizing = {
217
+ ...(column.size === undefined && validWidth(width) ? { size: width } : {}),
218
+ ...(column.minSize === undefined && validWidth(minWidth) ? { minSize: minWidth } : {}),
219
+ ...(column.maxSize === undefined && validWidth(maxWidth) ? { maxSize: maxWidth } : {}),
220
+ };
221
+ return Object.keys(sizing).length ? { ...column, ...sizing } : column;
222
+ }
223
+
203
224
  export function useDataTable<TData extends DataTableData = DataTableData>({
204
225
  data = [],
205
226
  columns = [],
@@ -480,7 +501,8 @@ export function useDataTable<TData extends DataTableData = DataTableData>({
480
501
  // the column declined (Axiom 6 HONEST STATE). Explicit TanStack props win.
481
502
  const normalizedColumns = useMemo(
482
503
  () =>
483
- columns.map((column) => {
504
+ columns.map((inputColumn) => {
505
+ const column = normalizeColumnWidths(inputColumn);
484
506
  const { sortable, filterable, field } = column as {
485
507
  sortable?: boolean;
486
508
  filterable?: boolean;
package/src/types.ts CHANGED
@@ -181,13 +181,15 @@ export type DataTableColumn<TData extends DataTableData = DataTableData> = Colum
181
181
  searchable?: boolean;
182
182
  hidden?: boolean;
183
183
  /**
184
- * Column width intent, in px. Read by the view-options width slider and by
185
- * saved views; the RENDERED cell box comes from TanStack `size`. Under the
186
- * default `columnLayout: "equal"` neither one survives, and declaring
187
- * either warns (see `columnLayout`).
184
+ * Initial leaf-column size in px, mapped to TanStack `size` when absent.
185
+ * Finite nonnegative values only. Sizing state overrides the declaration,
186
+ * within min/max bounds. Unpinned equal-layout cells ignore sizes unless
187
+ * resizing is enabled (see `columnLayout`).
188
188
  */
189
189
  width?: number;
190
+ /** Alias for `minSize` when absent. Finite nonnegative px; canonical value wins. */
190
191
  minWidth?: number;
192
+ /** Alias for `maxSize` when absent. Finite nonnegative px; canonical value wins. */
191
193
  maxWidth?: number;
192
194
  /**
193
195
  * Text alignment override (DG-TBL-01).
@@ -565,15 +567,15 @@ export interface DataTableProps<TData extends DataTableData = DataTableData> {
565
567
  // Column Layout
566
568
  /**
567
569
  * How columns are sized and whether table scrolls horizontally.
568
- * - 'equal': All columns equal width, no horizontal scroll (default)
569
- * - 'auto': Content-based width, last column fills remainder, squishes if needed
570
- * - 'scroll': Content-based width, horizontal scroll when content exceeds container
570
+ * - 'equal': Unpinned cells share available width (default).
571
+ * - 'auto': Native table layout on web; resolved sizes are table-layout inputs.
572
+ * - 'scroll': Fixed resolved sizes; horizontal overflow on web when needed.
571
573
  *
572
- * Under 'equal' a PER-COLUMN WIDTH IS IGNORED. Every cell gets
573
- * `flexGrow: 1, flexBasis: 0`, so a column's `width` / `size` never reaches
574
- * the cell box and the render is identical to one that declared no widths.
575
- * Use 'auto' or 'scroll' when the widths must hold, or turn on
576
- * `enableColumnResizing`, which switches the cells to `flexBasis: "auto"`.
574
+ * Under 'equal', unpinned cells ignore `width` / `size` without resizing.
575
+ * Use 'scroll' for exact widths or enable `enableColumnResizing` for fixed
576
+ * resizable cells. Pinned cells always keep their resolved size so sticky
577
+ * offsets agree with their boxes. Unspecified sizes resolve to 150px in
578
+ * sized modes; content isn't measured and spare space needn't be filled.
577
579
  * Declaring a width under 'equal' emits the `[table] column-width-ignored`
578
580
  * dev warning rather than failing silently (MPO-236).
579
581
  */
@@ -26,5 +26,8 @@ export interface DataTableCardControlsProps {
26
26
  /** Table-level disabled state (UX-011): controls render inert + LC-40 visible. */
27
27
  disabled?: boolean;
28
28
  }
29
+ export declare function DataTableCardSortControl({ table, compact, disabled, contained, }: Pick<DataTableCardControlsProps, "table" | "compact" | "disabled"> & {
30
+ contained?: boolean;
31
+ }): import("react/jsx-runtime").JSX.Element | null;
29
32
  export declare function DataTableCardControls({ table, enableSorting, enableFiltering, availableColumns, compact, disabled, }: DataTableCardControlsProps): import("react/jsx-runtime").JSX.Element | null;
30
33
  //# sourceMappingURL=DataTableCardControls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableCardControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableCardControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAK5E,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,mBAAmB,CAAC;QAC1B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAOD,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,aAAqB,EACrB,eAAuB,EACvB,gBAAqB,EACrB,OAAe,EACf,QAAgB,GACjB,EAAE,0BAA0B,kDA+F5B"}
1
+ {"version":3,"file":"DataTableCardControls.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableCardControls.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAK5E,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,mBAAmB,CAAC;QAC1B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACjC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAOD,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,OAAe,EACf,QAAgB,EAChB,SAAiB,GAClB,EAAE,IAAI,CAAC,0BAA0B,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,kDAqF9F;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,aAAqB,EACrB,eAAuB,EACvB,gBAAqB,EACrB,OAAe,EACf,QAAgB,GACjB,EAAE,0BAA0B,kDA6B5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableRoot.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAajF,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,aAAa,CAAC;AAgDrB,MAAM,WAAW,kBAAkB,CACjC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACvD,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACrF,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,UAAU,EACV,QAAQ,EACR,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EAAE,cAAc,EAC7B,SAAS,EACT,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CA8kE3B"}
1
+ {"version":3,"file":"DataTableRoot.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/DataTableRoot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAajF,OAAO,KAAK,EAIV,cAAc,EAEf,MAAM,aAAa,CAAC;AAgDrB,MAAM,WAAW,kBAAkB,CACjC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACvD,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACrF,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,eAAe,EACf,aAAa,EACb,OAAO,EACP,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,EAC1B,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAuB,EACvB,eAAe,EACf,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAA4B,EAC5B,oBAA4B,EAC5B,kBAAyB,EACzB,WAAmB,EACnB,YAAsB,EACtB,MAAe,EACf,oBAA4B,EAC5B,oBAAoB,EACpB,sBAA0B,EAC1B,kBAA0B,EAC1B,kBAAkB,EAClB,UAAU,EACV,mBAA2B,EAC3B,gBAAoB,EACpB,cAAsB,EACtB,wBAAgC,EAChC,UAAU,EACV,QAAQ,EACR,kBAA0B,EAC1B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EACX,QAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,IAAI,EAAE,QAAQ,EACd,cAAsB,EACtB,UAAkB,EAClB,aAAqB,EACrB,OAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,aAAa,EAAE,cAAc,EAC7B,SAAS,EACT,IAAI,EACJ,OAAe,EACf,QAAgB,EAChB,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,eAAe,EACnC,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,KAAK,CAAC,2CAkpE3B"}
@@ -12,5 +12,6 @@
12
12
  * applies immediately; outside click / Escape just closes. Chip presses
13
13
  * reopen this editor pre-filled via the context filterUi channel.
14
14
  */
15
- export declare function DataTableFilterButton(): import("react/jsx-runtime").JSX.Element | null;
15
+ export declare function DataTableFilterButton(): import("react/jsx-runtime").JSX.Element;
16
+ export declare function DataTableCardFilterButton(): import("react/jsx-runtime").JSX.Element;
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTableFilterButton/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA+EH,wBAAgB,qBAAqB,mDA6UpC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTableFilterButton/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA+EH,wBAAgB,qBAAqB,4CAEpC;AAED,wBAAgB,yBAAyB,4CAExC"}
@@ -24,4 +24,5 @@ export interface DataTableToolbarProps {
24
24
  compact?: boolean;
25
25
  }
26
26
  export declare function DataTableToolbar(props: DataTableToolbarProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function DataTableCardToolbar(props: DataTableToolbarProps): import("react/jsx-runtime").JSX.Element;
27
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTableToolbar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,WAAW,qBAAqB;IAEpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAG/C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAiN5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DataTableToolbar/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,MAAM,WAAW,qBAAqB;IAEpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAG/C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAE5D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,2CAEhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDataTable.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataTable.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtC,YAAY,EAAE,CAAC,KACZ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiID,eAAO,MAAM,iBAAiB;4BA9HkB,MAAM,KAAG,gBAAgB;mCAgIxC,GAAG,eAAe,MAAM;8BAE7B,GAAG,aAAa,GAAG,eAAe,MAAM;6BAzCnB,MAAM,KAAG,gBAAgB;uBA4CrD,gBAAgB;CACpC,CAAC;AAGF,OAAO,KAAK,EACV,aAAa,EAIb,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAwBlB,wBAAgB,YAAY,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,EAAE,EACxE,IAAS,EACT,OAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAgB,EAAE,iBAAwB,EAC1C,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAAoB,EAAE,qBAA6B,EACnD,oBAA4B,EAC5B,kBAAyB,EACzB,WAAW,EAAE,YAAoB,EACjC,kBAA0B,EAC1B,UAAU,EACV,mBAA2B,EAC3B,cAAsB,EACtB,kBAA0B,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,GAC3B,GAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAwiBjC"}
1
+ {"version":3,"file":"useDataTable.d.ts","sourceRoot":"","sources":["../../src/hooks/useDataTable.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtC,YAAY,EAAE,CAAC,KACZ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiID,eAAO,MAAM,iBAAiB;4BA9HkB,MAAM,KAAG,gBAAgB;mCAgIxC,GAAG,eAAe,MAAM;8BAE7B,GAAG,aAAa,GAAG,eAAe,MAAM;6BAzCnB,MAAM,KAAG,gBAAgB;uBA4CrD,gBAAgB;CACpC,CAAC;AAGF,OAAO,KAAK,EAEV,aAAa,EAIb,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AA4ClB,wBAAgB,YAAY,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,EAAE,EACxE,IAAS,EACT,OAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAmB,EACnB,aAAmB,EACnB,WAAW,EACX,eAAuB,EACvB,gBAAwB,EACxB,aAAqB,EACrB,eAAsB,EACtB,gBAAgB,EAChB,aAAoB,EACpB,gBAAgB,EAAE,iBAAwB,EAC1C,cAAwB,EACxB,QAAQ,EACR,cAAc,EACd,sBAA6B,EAC7B,oBAAoB,EAAE,qBAA6B,EACnD,oBAA4B,EAC5B,kBAAyB,EACzB,WAAW,EAAE,YAAoB,EACjC,kBAA0B,EAC1B,UAAU,EACV,mBAA2B,EAC3B,cAAsB,EACtB,kBAA0B,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,cAAc,GAC3B,GAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAC3B,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAyiBjC"}