compote-ui 0.42.7 → 0.43.1

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 (54) hide show
  1. package/dist/components/data-table/column-helper.ts.md +96 -0
  2. package/dist/components/data-table/create-table.ts.md +386 -0
  3. package/dist/components/data-table/data-table-column-filter.svelte.md +249 -0
  4. package/dist/components/data-table/data-table-column-visibility.svelte.md +74 -0
  5. package/dist/components/data-table/{data-table-head.svelte → data-table-head.svelte.md} +1 -1
  6. package/dist/components/data-table/data-table-new.svelte.md +245 -0
  7. package/dist/components/data-table/data-table-title.svelte.md +16 -0
  8. package/dist/components/data-table/data-table-toolbar.svelte.md +40 -0
  9. package/dist/components/data-table/data-table-utils.ts.md +179 -0
  10. package/dist/components/data-table/{data-table-virtual-rows.svelte → data-table-virtual-rows.svelte.md} +1 -1
  11. package/dist/components/data-table/data-table-virtualized.svelte.md +108 -0
  12. package/dist/components/data-table/data-table.svelte.md +214 -0
  13. package/dist/components/data-table/index.ts.md +22 -0
  14. package/dist/components/data-table/types.ts.md +101 -0
  15. package/dist/components/data-table/virtual/index.ts.md +26 -0
  16. package/dist/components/{data-table → data-table-v8}/column-helper.d.ts +1 -1
  17. package/dist/components/data-table-v8/create-svelte-table.svelte.d.ts +8 -0
  18. package/dist/components/data-table-v8/create-svelte-table.svelte.js +85 -0
  19. package/dist/components/data-table-v8/create-table.svelte.d.ts +35 -0
  20. package/dist/components/{data-table/create-table.js → data-table-v8/create-table.svelte.js} +25 -55
  21. package/dist/components/{data-table → data-table-v8}/data-table-column-filter.svelte +16 -19
  22. package/dist/components/{data-table → data-table-v8}/data-table-column-filter.svelte.d.ts +2 -2
  23. package/dist/components/{data-table → data-table-v8}/data-table-column-visibility.svelte +15 -14
  24. package/dist/components/{data-table → data-table-v8}/data-table-column-visibility.svelte.d.ts +2 -2
  25. package/dist/components/data-table-v8/data-table-head.svelte +196 -0
  26. package/dist/components/{data-table → data-table-v8}/data-table-head.svelte.d.ts +3 -3
  27. package/dist/components/{data-table → data-table-v8}/data-table-utils.d.ts +10 -15
  28. package/dist/components/{data-table → data-table-v8}/data-table-utils.js +18 -12
  29. package/dist/components/data-table-v8/data-table-virtual-rows.svelte +166 -0
  30. package/dist/components/{data-table → data-table-v8}/data-table-virtual-rows.svelte.d.ts +3 -3
  31. package/dist/components/{data-table → data-table-v8}/data-table-virtualized.svelte +15 -14
  32. package/dist/components/{data-table → data-table-v8}/data-table-virtualized.svelte.d.ts +2 -2
  33. package/dist/components/{data-table → data-table-v8}/data-table.svelte +37 -26
  34. package/dist/components/{data-table → data-table-v8}/data-table.svelte.d.ts +2 -2
  35. package/dist/components/data-table-v8/flex-render.svelte +35 -0
  36. package/dist/components/data-table-v8/flex-render.svelte.d.ts +28 -0
  37. package/dist/components/{data-table → data-table-v8}/index.d.ts +4 -2
  38. package/dist/components/{data-table → data-table-v8}/index.js +3 -1
  39. package/dist/components/data-table-v8/render-helpers.d.ts +13 -0
  40. package/dist/components/data-table-v8/render-helpers.js +23 -0
  41. package/dist/components/{data-table → data-table-v8}/types.d.ts +12 -2
  42. package/dist/components/data-table-v8/virtual/index.d.ts +3 -0
  43. package/dist/components/data-table-v8/virtual/index.js +2 -0
  44. package/dist/theme.css +45 -0
  45. package/package.json +9 -9
  46. package/dist/components/data-table/create-table.d.ts +0 -41
  47. package/dist/components/data-table/virtual/index.d.ts +0 -3
  48. package/dist/components/data-table/virtual/index.js +0 -2
  49. /package/dist/components/{data-table → data-table-v8}/column-helper.js +0 -0
  50. /package/dist/components/{data-table → data-table-v8}/data-table-title.svelte +0 -0
  51. /package/dist/components/{data-table → data-table-v8}/data-table-title.svelte.d.ts +0 -0
  52. /package/dist/components/{data-table → data-table-v8}/data-table-toolbar.svelte +0 -0
  53. /package/dist/components/{data-table → data-table-v8}/data-table-toolbar.svelte.d.ts +0 -0
  54. /package/dist/components/{data-table → data-table-v8}/types.js +0 -0
@@ -1,4 +1,7 @@
1
1
  import { cn } from 'tailwind-variants';
2
+ export function getReactiveTableState(table) {
3
+ return table._svelteState ?? table.getState();
4
+ }
2
5
  export function alignClass(align) {
3
6
  return align === 'right' ? 'text-right' : align === 'center' ? 'text-center' : 'text-left';
4
7
  }
@@ -36,7 +39,7 @@ export function virtualGroupWithGrowSizeStyle(fixedPortion) {
36
39
  export function resizeHandleStyle(table, header) {
37
40
  if (table.options.columnResizeMode !== 'onEnd')
38
41
  return undefined;
39
- const deltaOffset = table.store.state.columnResizing.deltaOffset;
42
+ const deltaOffset = table.getState().columnSizingInfo.deltaOffset;
40
43
  if (!header.column.getIsResizing() || deltaOffset === null)
41
44
  return undefined;
42
45
  return `transform: translateX(${deltaOffset}px)`;
@@ -44,8 +47,7 @@ export function resizeHandleStyle(table, header) {
44
47
  export function resizeHandleClass(headerIndex, headerCount) {
45
48
  return cn('absolute top-0 z-10 flex h-full w-2 cursor-col-resize touch-none items-center justify-center select-none before:h-4 before:w-px before:bg-border before:content-[""]', headerIndex === headerCount - 1 ? 'right-0' : '-right-1');
46
49
  }
47
- export function getHeaderSortDirection(header, sortingState) {
48
- void sortingState;
50
+ export function getHeaderSortDirection(header) {
49
51
  return header.column.getIsSorted();
50
52
  }
51
53
  export function getHeaderSortLabel(sortDirection) {
@@ -62,18 +64,18 @@ export function getHeaderAriaSort(sortDirection) {
62
64
  return 'descending';
63
65
  return 'none';
64
66
  }
65
- export function getAllRowsSelectionState(table, rowSelection) {
66
- void rowSelection;
67
+ export function getAllRowsSelectionState(table) {
67
68
  const allRowsSelected = table.getIsAllRowsSelected();
68
69
  const someRowsSelected = table.getIsSomeRowsSelected();
69
70
  return allRowsSelected ? true : someRowsSelected ? 'indeterminate' : false;
70
71
  }
71
- export function getRowSelectionState(table, rowSelection, rowId) {
72
- void rowSelection;
72
+ export function getRowSelectionState(table, rowId) {
73
73
  return table.getRow(rowId).getIsSelected();
74
74
  }
75
- export function getSelectedRowCount(table, rowSelection) {
76
- void rowSelection;
75
+ export function getReactiveCells(row, columnVisibility) {
76
+ return row.getAllCells().filter((cell) => columnVisibility[cell.column.id] !== false);
77
+ }
78
+ export function getSelectedRowCount(table) {
77
79
  return table.getSelectedRowModel().rows.length;
78
80
  }
79
81
  export function getBooleanCellValue(value) {
@@ -83,7 +85,7 @@ export function getBooleanCellValue(value) {
83
85
  return false;
84
86
  return undefined;
85
87
  }
86
- export function getPinningStyle(column, isHeader = false, isRowSelectionEnabled = false) {
88
+ export function getPinningStyle(column, table, isHeader = false, isRowSelectionEnabled = false) {
87
89
  const isPinned = column.getIsPinned();
88
90
  if (!isPinned)
89
91
  return undefined;
@@ -91,7 +93,9 @@ export function getPinningStyle(column, isHeader = false, isRowSelectionEnabled
91
93
  const selectionOffset = isRowSelectionEnabled ? 40 : 0;
92
94
  if (isPinned === 'left') {
93
95
  const left = column.getStart('left') + selectionOffset;
94
- const shadow = !isHeader && column.getIsLastColumn('left')
96
+ const leftCols = table.getLeftLeafColumns();
97
+ const isLastLeft = leftCols[leftCols.length - 1]?.id === column.id;
98
+ const shadow = !isHeader && isLastLeft
95
99
  ? 'box-shadow: -4px 0 4px -4px var(--compote-border) inset'
96
100
  : undefined;
97
101
  return ['position: sticky', `z-index: ${zIndex}`, `left: ${left}px`, shadow]
@@ -100,7 +104,9 @@ export function getPinningStyle(column, isHeader = false, isRowSelectionEnabled
100
104
  }
101
105
  else {
102
106
  const right = column.getAfter('right');
103
- const shadow = !isHeader && column.getIsFirstColumn('right')
107
+ const rightCols = table.getRightLeafColumns();
108
+ const isFirstRight = rightCols[0]?.id === column.id;
109
+ const shadow = !isHeader && isFirstRight
104
110
  ? 'box-shadow: 4px 0 4px -4px var(--compote-border) inset'
105
111
  : undefined;
106
112
  return ['position: sticky', `z-index: ${zIndex}`, `right: ${right}px`, shadow]
@@ -0,0 +1,166 @@
1
+ <script lang="ts" generics="T extends RowData">
2
+ import type { Row, RowData } from '@tanstack/table-core';
3
+ import { createVirtualizer } from '@tanstack/svelte-virtual';
4
+ import { cn } from 'tailwind-variants';
5
+ import { PhArrowSquareOut, PhCheck, PhX } from '../../icons';
6
+ import type { DataTableInstance } from './data-table-utils';
7
+ import FlexRender from './flex-render.svelte';
8
+ import {
9
+ alignClass,
10
+ getBooleanCellValue,
11
+ getColumnMeta,
12
+ getPinningStyle,
13
+ getReactiveCells,
14
+ getReactiveTableState,
15
+ getUrlCellValue,
16
+ joinStyles,
17
+ justifyClass,
18
+ openUrlCell,
19
+ virtualColumnSizeStyle,
20
+ virtualGrowColumnSizeStyle,
21
+ virtualSelectionColumnSizeStyle
22
+ } from './data-table-utils';
23
+
24
+ type Props = {
25
+ rows: Row<T>[];
26
+ scrollContainer: HTMLDivElement;
27
+ isRowSelectionEnabled: boolean;
28
+ table: DataTableInstance<T>;
29
+ emptyMessage: string;
30
+ onRowClick?: (details: { row: T; event: MouseEvent }) => void;
31
+ onRowDoubleClick?: (details: { row: T; event: MouseEvent }) => void;
32
+ };
33
+
34
+ let {
35
+ rows,
36
+ scrollContainer,
37
+ isRowSelectionEnabled,
38
+ table,
39
+ emptyMessage,
40
+ onRowClick,
41
+ onRowDoubleClick
42
+ }: Props = $props();
43
+
44
+ const rowVirtualizer = createVirtualizer<HTMLDivElement, HTMLTableRowElement>({
45
+ get count() {
46
+ return rows.length;
47
+ },
48
+ estimateSize: () => 37,
49
+ getScrollElement: () => scrollContainer,
50
+ measureElement:
51
+ typeof window !== 'undefined' && !navigator.userAgent.includes('Firefox')
52
+ ? (element) => element.getBoundingClientRect().height
53
+ : undefined,
54
+ overscan: 5
55
+ });
56
+
57
+ function measureRowElement(node: HTMLTableRowElement) {
58
+ $rowVirtualizer.measureElement(node);
59
+ }
60
+ </script>
61
+
62
+ <tbody style="display: grid; height: {$rowVirtualizer.getTotalSize()}px; position: relative">
63
+ {#if rows.length === 0}
64
+ <tr style="display: flex; position: absolute; width: 100%; top: 0">
65
+ <td class="px-3 py-10 text-center text-sm text-ink-dim" style="flex: 1">
66
+ {emptyMessage}
67
+ </td>
68
+ </tr>
69
+ {:else}
70
+ {#each $rowVirtualizer.getVirtualItems() as virtualRow (virtualRow.index)}
71
+ {@const row = rows[virtualRow.index]}
72
+ {@const rowSelected = getReactiveTableState(table).rowSelection[row.id] === true}
73
+ <tr
74
+ data-index={virtualRow.index}
75
+ use:measureRowElement
76
+ class={cn(
77
+ 'group/row border-b border-surface-2 last:border-b-0',
78
+ '[--row-bg:var(--compote-surface-1)]',
79
+ 'hover:bg-well/60 hover:[--row-bg:color-mix(in_srgb,var(--compote-well)_60%,var(--compote-surface-1))]',
80
+ rowSelected &&
81
+ 'bg-well/60 [--row-bg:color-mix(in_srgb,var(--compote-well)_60%,var(--compote-surface-1))]'
82
+ )}
83
+ style="display: flex; position: absolute; transform: translateY({virtualRow.start}px); width: 100%"
84
+ onclick={(event) => onRowClick?.({ row: row.original, event })}
85
+ ondblclick={(event) => onRowDoubleClick?.({ row: row.original, event })}
86
+ >
87
+ {#if isRowSelectionEnabled}
88
+ <td
89
+ class="items-center justify-center bg-(--row-bg) px-3 py-2 text-center align-middle"
90
+ style={joinStyles(
91
+ virtualSelectionColumnSizeStyle(),
92
+ 'position: sticky; left: 0; z-index: 1'
93
+ )}
94
+ >
95
+ <input
96
+ type="checkbox"
97
+ aria-label="Select row"
98
+ class="table-checkbox mx-auto block size-4"
99
+ checked={rowSelected}
100
+ disabled={!row.getCanSelect()}
101
+ onchange={(e) => row.toggleSelected(e.currentTarget.checked)}
102
+ />
103
+ </td>
104
+ {/if}
105
+ {#each getReactiveCells(row, getReactiveTableState(table).columnVisibility) as cell (cell.id)}
106
+ {@const columnDef = getColumnMeta(cell.column.columnDef)}
107
+ <td
108
+ class={cn(
109
+ 'items-center truncate px-3 py-2',
110
+ alignClass(columnDef?.align),
111
+ justifyClass(columnDef?.align),
112
+ cell.column.getIsPinned() && 'bg-(--row-bg)'
113
+ )}
114
+ style={joinStyles(
115
+ getColumnMeta(cell.column.columnDef)?.grow
116
+ ? virtualGrowColumnSizeStyle()
117
+ : virtualColumnSizeStyle(cell.column.getSize()),
118
+ getPinningStyle(cell.column, table, false, isRowSelectionEnabled)
119
+ )}
120
+ >
121
+ {#if columnDef?.type === 'boolean'}
122
+ {@const value = getBooleanCellValue(cell.getValue())}
123
+ {#if value === true}
124
+ <span
125
+ class="inline-flex size-5 items-center justify-center text-success"
126
+ role="img"
127
+ aria-label="Yes"
128
+ >
129
+ <PhCheck class="size-4" />
130
+ </span>
131
+ {:else if value === false}
132
+ <span
133
+ class="inline-flex size-5 items-center justify-center text-danger"
134
+ role="img"
135
+ aria-label="No"
136
+ >
137
+ <PhX class="size-4" />
138
+ </span>
139
+ {:else}
140
+ -
141
+ {/if}
142
+ {:else if columnDef?.type === 'url'}
143
+ {@const value = getUrlCellValue(cell.getValue())}
144
+ {#if value}
145
+ <button
146
+ type="button"
147
+ class={cn(
148
+ 'inline-flex max-w-full appearance-none items-center gap-1.5 rounded-sm border-0 bg-transparent p-0 align-middle leading-5 font-medium text-ink underline decoration-border decoration-dotted underline-offset-4 outline-none hover:text-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',
149
+ justifyClass(columnDef.align)
150
+ )}
151
+ onclick={() => openUrlCell(value)}
152
+ >
153
+ <PhArrowSquareOut class="size-3.5 shrink-0" />
154
+ </button>
155
+ {:else}
156
+ -
157
+ {/if}
158
+ {:else}
159
+ <FlexRender content={cell.column.columnDef.cell} context={cell.getContext()} />
160
+ {/if}
161
+ </td>
162
+ {/each}
163
+ </tr>
164
+ {/each}
165
+ {/if}
166
+ </tbody>
@@ -1,8 +1,8 @@
1
- import type { Row, RowData } from '@tanstack/svelte-table';
2
- import type { DataTableFeatures, DataTableInstance } from './create-table';
1
+ import type { Row, RowData } from '@tanstack/table-core';
2
+ import type { DataTableInstance } from './data-table-utils';
3
3
  declare function $$render<T extends RowData>(): {
4
4
  props: {
5
- rows: Row<DataTableFeatures, T>[];
5
+ rows: Row<T>[];
6
6
  scrollContainer: HTMLDivElement;
7
7
  isRowSelectionEnabled: boolean;
8
8
  table: DataTableInstance<T>;
@@ -1,12 +1,13 @@
1
1
  <script lang="ts" generics="T extends RowData">
2
- import type { RowData } from '@tanstack/svelte-table';
2
+ import type { RowData } from '@tanstack/table-core';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
4
  import { cn, type ClassValue } from 'tailwind-variants';
5
- import { type DataTableInstance } from './create-table';
5
+ import type { DataTableInstance } from './data-table-utils';
6
6
  import DataTableHead from './data-table-head.svelte';
7
7
  import DataTableVirtualRows from './data-table-virtual-rows.svelte';
8
8
  import {
9
9
  getAllRowsSelectionState,
10
+ getReactiveTableState,
10
11
  getSelectedRowCount,
11
12
  tableSizeStyle
12
13
  } from './data-table-utils';
@@ -32,27 +33,27 @@
32
33
 
33
34
  let scrollContainerRef = $state<HTMLDivElement | undefined>(undefined);
34
35
 
35
- const tableStateKey = $derived(JSON.stringify(table.store.state));
36
- function trackTableState() {
37
- return tableStateKey;
38
- }
39
-
36
+ const tableState = $derived(getReactiveTableState(table));
40
37
  const rowModel = $derived.by(() => {
41
- trackTableState();
38
+ getReactiveTableState(table);
42
39
  return table.getRowModel();
43
40
  });
44
41
  const headerGroups = $derived.by(() => {
45
- trackTableState();
42
+ getReactiveTableState(table);
46
43
  return table.getHeaderGroups();
47
44
  });
48
45
  const isRowSelectionEnabled = $derived(Boolean(table.options.enableRowSelection));
49
46
  const isMultiRowSelectionEnabled = $derived(table.options.enableMultiRowSelection !== false);
50
47
  const headerGroupCount = $derived(headerGroups.length);
51
- const allRowsSelectionState = $derived(
52
- getAllRowsSelectionState(table, table.store.state.rowSelection)
53
- );
54
- const selectedRowCount = $derived(getSelectedRowCount(table, table.store.state.rowSelection));
55
- const isColumnResizing = $derived(table.store.state.columnResizing.isResizingColumn !== false);
48
+ const allRowsSelectionState = $derived.by(() => {
49
+ getReactiveTableState(table);
50
+ return getAllRowsSelectionState(table);
51
+ });
52
+ const selectedRowCount = $derived.by(() => {
53
+ getReactiveTableState(table);
54
+ return getSelectedRowCount(table);
55
+ });
56
+ const isColumnResizing = $derived(tableState.columnSizingInfo.isResizingColumn !== false);
56
57
  </script>
57
58
 
58
59
  <div
@@ -1,7 +1,7 @@
1
- import type { RowData } from '@tanstack/svelte-table';
1
+ import type { RowData } from '@tanstack/table-core';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import { type ClassValue } from 'tailwind-variants';
4
- import { type DataTableInstance } from './create-table';
4
+ import type { DataTableInstance } from './data-table-utils';
5
5
  declare function $$render<T extends RowData>(): {
6
6
  props: Omit<HTMLAttributes<HTMLDivElement>, "class"> & {
7
7
  table: DataTableInstance<T>;
@@ -1,21 +1,21 @@
1
1
  <script lang="ts" generics="T extends RowData">
2
- import { FlexRender } from '@tanstack/svelte-table';
3
- import type { RowData } from '@tanstack/svelte-table';
2
+ import type { RowData } from '@tanstack/table-core';
4
3
  import type { HTMLAttributes } from 'svelte/elements';
5
4
  import { cn, type ClassValue } from 'tailwind-variants';
6
5
  import { PhArrowSquareOut, PhCheck, PhX } from '../../icons';
7
- import Checkbox from '../checkbox/checkbox.svelte';
8
- import { type DataTableInstance } from './create-table';
6
+ import type { DataTableInstance } from './data-table-utils';
9
7
  import DataTableHead from './data-table-head.svelte';
8
+ import FlexRender from './flex-render.svelte';
10
9
  import {
11
10
  alignClass,
12
11
  columnSizeStyle,
13
- // getAllRowsSelectionState,
14
12
  getBooleanCellValue,
15
13
  getColumnMeta,
16
14
  getPinningStyle,
17
- getRowSelectionState,
18
- // getSelectedRowCount,
15
+ getAllRowsSelectionState,
16
+ getReactiveCells,
17
+ getReactiveTableState,
18
+ getSelectedRowCount,
19
19
  getUrlCellValue,
20
20
  justifyClass,
21
21
  openUrlCell,
@@ -42,9 +42,19 @@
42
42
  ...rest
43
43
  }: Props = $props();
44
44
 
45
- const rowModel = $derived(table.getRowModel());
46
- const headerGroups = $derived(table.getHeaderGroups());
47
- const visibleLeafColumns = $derived(table.getVisibleLeafColumns());
45
+ const tableState = $derived(getReactiveTableState(table));
46
+ const rowModel = $derived.by(() => {
47
+ getReactiveTableState(table);
48
+ return table.getRowModel();
49
+ });
50
+ const headerGroups = $derived.by(() => {
51
+ getReactiveTableState(table);
52
+ return table.getHeaderGroups();
53
+ });
54
+ const visibleLeafColumns = $derived.by(() => {
55
+ getReactiveTableState(table);
56
+ return table.getVisibleLeafColumns();
57
+ });
48
58
  const growColumn = $derived(visibleLeafColumns.find((col) => getColumnMeta(col.columnDef)?.grow));
49
59
  const hasGrowColumn = $derived(growColumn !== undefined);
50
60
  const visibleColumnCount = $derived(visibleLeafColumns.length);
@@ -53,14 +63,15 @@
53
63
  const tableColumnCount = $derived(visibleColumnCount + (isRowSelectionEnabled ? 1 : 0));
54
64
  const renderedColumnCount = $derived(tableColumnCount + 1);
55
65
  const headerGroupCount = $derived(headerGroups.length);
56
- // const allRowsSelectionState = $derived(
57
- // getAllRowsSelectionState(table, table.store.state.rowSelection)
58
- // );
59
- // const selectedRowCount = $derived(getSelectedRowCount(table, table.store.state.rowSelection));
60
- // const isColumnResizing = $derived(table.store.state.columnResizing.isResizingColumn !== false);
61
- const allRowsSelectionState = $derived<boolean | 'indeterminate'>(false);
62
- const selectedRowCount = $derived(0);
63
- const isColumnResizing = $derived(false);
66
+ const allRowsSelectionState = $derived.by(() => {
67
+ getReactiveTableState(table);
68
+ return getAllRowsSelectionState(table);
69
+ });
70
+ const selectedRowCount = $derived.by(() => {
71
+ getReactiveTableState(table);
72
+ return getSelectedRowCount(table);
73
+ });
74
+ const isColumnResizing = $derived(tableState.columnSizingInfo.isResizingColumn !== false);
64
75
  </script>
65
76
 
66
77
  <div
@@ -108,7 +119,7 @@
108
119
  />
109
120
  <tbody>
110
121
  {#each rowModel.rows as row (row.id)}
111
- {@const rowSelected = getRowSelectionState(table, table.store.state.rowSelection, row.id)}
122
+ {@const rowSelected = getReactiveTableState(table).rowSelection[row.id] === true}
112
123
  <tr
113
124
  class={cn(
114
125
  'group/row',
@@ -125,17 +136,17 @@
125
136
  class="border-b border-surface-2 bg-(--row-bg) px-3 py-2 text-center align-middle group-last/row:border-b-0"
126
137
  style="position: sticky; left: 0; z-index: 1"
127
138
  >
128
- <Checkbox
129
- size="sm"
139
+ <input
140
+ type="checkbox"
130
141
  aria-label="Select row"
131
- class="mx-auto size-4"
142
+ class="table-checkbox mx-auto block size-4"
132
143
  checked={rowSelected}
133
144
  disabled={!row.getCanSelect()}
134
- onCheckedChange={({ checked }) => row.toggleSelected(checked === true)}
145
+ onchange={(e) => row.toggleSelected(e.currentTarget.checked)}
135
146
  />
136
147
  </td>
137
148
  {/if}
138
- {#each row.getVisibleCells() as cell (cell.id)}
149
+ {#each getReactiveCells(row, getReactiveTableState(table).columnVisibility) as cell (cell.id)}
139
150
  {@const columnDef = getColumnMeta(cell.column.columnDef)}
140
151
  <td
141
152
  class={cn(
@@ -143,7 +154,7 @@
143
154
  alignClass(columnDef?.align),
144
155
  cell.column.getIsPinned() && 'bg-(--row-bg)'
145
156
  )}
146
- style={getPinningStyle(cell.column, false, isRowSelectionEnabled)}
157
+ style={getPinningStyle(cell.column, table, false, isRowSelectionEnabled)}
147
158
  >
148
159
  {#if columnDef?.type === 'boolean'}
149
160
  {@const value = getBooleanCellValue(cell.getValue())}
@@ -183,7 +194,7 @@
183
194
  -
184
195
  {/if}
185
196
  {:else}
186
- <FlexRender {cell} />
197
+ <FlexRender content={cell.column.columnDef.cell} context={cell.getContext()} />
187
198
  {/if}
188
199
  </td>
189
200
  {/each}
@@ -1,7 +1,7 @@
1
- import type { RowData } from '@tanstack/svelte-table';
1
+ import type { RowData } from '@tanstack/table-core';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  import { type ClassValue } from 'tailwind-variants';
4
- import { type DataTableInstance } from './create-table';
4
+ import type { DataTableInstance } from './data-table-utils';
5
5
  declare function $$render<T extends RowData>(): {
6
6
  props: Omit<HTMLAttributes<HTMLDivElement>, "class"> & {
7
7
  table: DataTableInstance<T>;
@@ -0,0 +1,35 @@
1
+ <script
2
+ lang="ts"
3
+ generics="TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>"
4
+ >
5
+ import type { CellContext, ColumnDefTemplate, HeaderContext } from '@tanstack/table-core';
6
+ import { RenderComponentConfig, RenderSnippetConfig } from './render-helpers.js';
7
+
8
+ type Props = {
9
+ content?:
10
+ | (TContext extends HeaderContext<TData, TValue>
11
+ ? ColumnDefTemplate<HeaderContext<TData, TValue>>
12
+ : TContext extends CellContext<TData, TValue>
13
+ ? ColumnDefTemplate<CellContext<TData, TValue>>
14
+ : never)
15
+ | undefined;
16
+ context: TContext;
17
+ };
18
+
19
+ let { content, context }: Props = $props();
20
+ </script>
21
+
22
+ {#if typeof content === 'string'}
23
+ {content}
24
+ {:else if content instanceof Function}
25
+ {@const result = content(context as never)}
26
+ {#if result instanceof RenderComponentConfig}
27
+ {@const { component: Component, props } = result}
28
+ <Component {...props} />
29
+ {:else if result instanceof RenderSnippetConfig}
30
+ {@const { snippet, params } = result}
31
+ {@render snippet(params)}
32
+ {:else}
33
+ {result}
34
+ {/if}
35
+ {/if}
@@ -0,0 +1,28 @@
1
+ import type { CellContext, ColumnDefTemplate, HeaderContext } from '@tanstack/table-core';
2
+ declare function $$render<TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>>(): {
3
+ props: {
4
+ content?: (TContext extends HeaderContext<TData, TValue> ? ColumnDefTemplate<HeaderContext<TData, TValue>> : TContext extends CellContext<TData, TValue> ? ColumnDefTemplate<CellContext<TData, TValue>> : never) | undefined;
5
+ context: TContext;
6
+ };
7
+ exports: {};
8
+ bindings: "";
9
+ slots: {};
10
+ events: {};
11
+ };
12
+ declare class __sveltets_Render<TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>> {
13
+ props(): ReturnType<typeof $$render<TData, TValue, TContext>>['props'];
14
+ events(): ReturnType<typeof $$render<TData, TValue, TContext>>['events'];
15
+ slots(): ReturnType<typeof $$render<TData, TValue, TContext>>['slots'];
16
+ bindings(): "";
17
+ exports(): {};
18
+ }
19
+ interface $$IsomorphicComponent {
20
+ new <TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<TData, TValue, TContext>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<TData, TValue, TContext>['props']>, ReturnType<__sveltets_Render<TData, TValue, TContext>['events']>, ReturnType<__sveltets_Render<TData, TValue, TContext>['slots']>> & {
21
+ $$bindings?: ReturnType<__sveltets_Render<TData, TValue, TContext>['bindings']>;
22
+ } & ReturnType<__sveltets_Render<TData, TValue, TContext>['exports']>;
23
+ <TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>>(internal: unknown, props: ReturnType<__sveltets_Render<TData, TValue, TContext>['props']> & {}): ReturnType<__sveltets_Render<TData, TValue, TContext>['exports']>;
24
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any, any>['bindings']>;
25
+ }
26
+ declare const FlexRender: $$IsomorphicComponent;
27
+ type FlexRender<TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>> = InstanceType<typeof FlexRender<TData, TValue, TContext>>;
28
+ export default FlexRender;
@@ -1,9 +1,11 @@
1
1
  export { createDataTableColumnHelper } from './column-helper';
2
- export { createTable } from './create-table';
2
+ export { createTable } from './create-table.svelte';
3
+ export { renderComponent, renderSnippet } from './render-helpers';
4
+ export { default as FlexRender } from './flex-render.svelte';
3
5
  export { default as Root } from './data-table.svelte';
4
6
  export { default as Toolbar } from './data-table-toolbar.svelte';
5
7
  export { default as Title } from './data-table-title.svelte';
6
8
  export { default as ColumnVisibility } from './data-table-column-visibility.svelte';
7
9
  export { default as ColumnFilter } from './data-table-column-filter.svelte';
8
- export type { CreateDataTableOptions, DataTableFeatures, DataTableInstance } from './create-table';
10
+ export type { CreateDataTableOptions, DataTableInstance } from './create-table.svelte';
9
11
  export type { DataTableAlign, DataTableAccessorFnColumn, DataTableAccessorKeyColumn, DataTableColumn, DataTableColumnBase, DataTableColumnOptions, DataTableColumnType, DataTableCellPropsResolver, DataTableCellRenderProps, DataTableGroupColumn, DataTableLeafColumnBase, DataTableLeafColumn } from './types';
@@ -1,5 +1,7 @@
1
1
  export { createDataTableColumnHelper } from './column-helper';
2
- export { createTable } from './create-table';
2
+ export { createTable } from './create-table.svelte';
3
+ export { renderComponent, renderSnippet } from './render-helpers';
4
+ export { default as FlexRender } from './flex-render.svelte';
3
5
  export { default as Root } from './data-table.svelte';
4
6
  export { default as Toolbar } from './data-table-toolbar.svelte';
5
7
  export { default as Title } from './data-table-title.svelte';
@@ -0,0 +1,13 @@
1
+ import type { Component, ComponentProps, Snippet } from 'svelte';
2
+ export declare class RenderComponentConfig<TComponent extends Component> {
3
+ component: TComponent;
4
+ props: ComponentProps<TComponent> | Record<string, never>;
5
+ constructor(component: TComponent, props?: ComponentProps<TComponent> | Record<string, never>);
6
+ }
7
+ export declare class RenderSnippetConfig<TProps> {
8
+ snippet: Snippet<[TProps]>;
9
+ params: TProps;
10
+ constructor(snippet: Snippet<[TProps]>, params: TProps);
11
+ }
12
+ export declare function renderComponent<T extends Component<any>, Props extends ComponentProps<T>>(component: T, props?: Props): RenderComponentConfig<T>;
13
+ export declare function renderSnippet<TProps>(snippet: Snippet<[TProps]>, params?: TProps): RenderSnippetConfig<TProps>;
@@ -0,0 +1,23 @@
1
+ export class RenderComponentConfig {
2
+ component;
3
+ props;
4
+ constructor(component, props = {}) {
5
+ this.component = component;
6
+ this.props = props;
7
+ }
8
+ }
9
+ export class RenderSnippetConfig {
10
+ snippet;
11
+ params;
12
+ constructor(snippet, params) {
13
+ this.snippet = snippet;
14
+ this.params = params;
15
+ }
16
+ }
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ export function renderComponent(component, props = {}) {
19
+ return new RenderComponentConfig(component, props);
20
+ }
21
+ export function renderSnippet(snippet, params = {}) {
22
+ return new RenderSnippetConfig(snippet, params);
23
+ }
@@ -1,4 +1,4 @@
1
- import type { CellData, ColumnDef, RowData, TableFeatures } from '@tanstack/svelte-table';
1
+ import type { FilterFnOption, RowData } from '@tanstack/table-core';
2
2
  import type { Snippet } from 'svelte';
3
3
  export type DataTableAlign = 'left' | 'center' | 'right';
4
4
  export type DataTableColumnType = 'text' | 'number' | 'currency' | 'percent' | 'boolean' | 'select' | 'url' | 'date' | 'time' | 'date-time';
@@ -8,7 +8,17 @@ export type DataTableCellRenderProps<T extends RowData> = {
8
8
  row: T;
9
9
  };
10
10
  export type DataTableCellPropsResolver<T extends RowData> = (value: unknown, row: T) => Record<string, unknown>;
11
- export type DataTableColumnOptions<T extends RowData> = Partial<Pick<ColumnDef<TableFeatures, T, CellData>, 'size' | 'minSize' | 'maxSize' | 'enableResizing' | 'enableHiding' | 'enableSorting' | 'sortDescFirst' | 'enableColumnFilter' | 'filterFn'>>;
11
+ export type DataTableColumnOptions<T extends RowData> = {
12
+ size?: number;
13
+ minSize?: number;
14
+ maxSize?: number;
15
+ enableResizing?: boolean;
16
+ enableHiding?: boolean;
17
+ enableSorting?: boolean;
18
+ sortDescFirst?: boolean;
19
+ enableColumnFilter?: boolean;
20
+ filterFn?: FilterFnOption<T>;
21
+ };
12
22
  export type DataTableColumnBase = {
13
23
  header: string;
14
24
  align?: DataTableAlign;
@@ -0,0 +1,3 @@
1
+ export { default as Root } from '../data-table-virtualized.svelte';
2
+ export { ColumnFilter, ColumnVisibility, FlexRender, Title, Toolbar, createDataTableColumnHelper, createTable, renderComponent, renderSnippet } from '../index';
3
+ export type { CreateDataTableOptions, DataTableAccessorFnColumn, DataTableAccessorKeyColumn, DataTableAlign, DataTableCellPropsResolver, DataTableCellRenderProps, DataTableColumn, DataTableColumnBase, DataTableColumnOptions, DataTableColumnType, DataTableGroupColumn, DataTableInstance, DataTableLeafColumn, DataTableLeafColumnBase } from '../index';
@@ -0,0 +1,2 @@
1
+ export { default as Root } from '../data-table-virtualized.svelte';
2
+ export { ColumnFilter, ColumnVisibility, FlexRender, Title, Toolbar, createDataTableColumnHelper, createTable, renderComponent, renderSnippet } from '../index';