@softwareone/spi-sv5-library 1.9.0 → 1.10.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 (52) hide show
  1. package/dist/Button/Button.svelte +16 -0
  2. package/dist/Controls/Input/Input.svelte +1 -1
  3. package/dist/Controls/{Label.svelte → Label/Label.svelte} +1 -1
  4. package/dist/Controls/Select/Select.svelte +1 -1
  5. package/dist/Controls/TextArea/TextArea.svelte +1 -1
  6. package/dist/Controls/Toggle/Toggle.svelte +1 -1
  7. package/dist/Table/ActionsColumn.svelte +203 -0
  8. package/dist/Table/ActionsColumn.svelte.d.ts +9 -0
  9. package/dist/Table/Body.svelte +90 -0
  10. package/dist/Table/Body.svelte.d.ts +27 -0
  11. package/dist/Table/ColumnVisibilityDropdown.svelte +174 -0
  12. package/dist/Table/ColumnVisibilityDropdown.svelte.d.ts +27 -0
  13. package/dist/Table/Footer.svelte +34 -0
  14. package/dist/Table/Footer.svelte.d.ts +28 -0
  15. package/dist/Table/Header.svelte +176 -0
  16. package/dist/Table/Header.svelte.d.ts +28 -0
  17. package/dist/Table/PageSize.svelte +164 -0
  18. package/dist/Table/PageSize.svelte.d.ts +28 -0
  19. package/dist/Table/Pagination.svelte +145 -0
  20. package/dist/Table/Pagination.svelte.d.ts +27 -0
  21. package/dist/Table/RowCheckBox.svelte +31 -0
  22. package/dist/Table/RowCheckBox.svelte.d.ts +9 -0
  23. package/dist/Table/Skeleton.svelte +99 -0
  24. package/dist/Table/Skeleton.svelte.d.ts +7 -0
  25. package/dist/Table/Table.svelte +351 -0
  26. package/dist/Table/Table.svelte.d.ts +45 -0
  27. package/dist/Table/adapter/flex-render.svelte +40 -0
  28. package/dist/Table/adapter/flex-render.svelte.d.ts +28 -0
  29. package/dist/Table/adapter/index.d.ts +4 -0
  30. package/dist/Table/adapter/index.js +4 -0
  31. package/dist/Table/adapter/render-component.d.ts +13 -0
  32. package/dist/Table/adapter/render-component.js +18 -0
  33. package/dist/Table/adapter/table.svelte.d.ts +6 -0
  34. package/dist/Table/adapter/table.svelte.js +66 -0
  35. package/dist/Table/consts.d.ts +4 -0
  36. package/dist/Table/consts.js +4 -0
  37. package/dist/Table/context.d.ts +4 -0
  38. package/dist/Table/context.js +15 -0
  39. package/dist/Table/excel-setting.d.ts +8 -0
  40. package/dist/Table/excel-setting.js +3 -0
  41. package/dist/Table/excel.d.ts +4 -0
  42. package/dist/Table/excel.js +66 -0
  43. package/dist/Table/index.d.ts +6 -0
  44. package/dist/Table/index.js +6 -0
  45. package/dist/Table/types.d.ts +16 -0
  46. package/dist/Table/types.js +1 -0
  47. package/dist/Table/util.d.ts +4 -0
  48. package/dist/Table/util.js +46 -0
  49. package/dist/index.d.ts +2 -1
  50. package/dist/index.js +2 -1
  51. package/package.json +21 -1
  52. /package/dist/Controls/{Label.svelte.d.ts → Label/Label.svelte.d.ts} +0 -0
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ columns?: number;
4
+ rows?: number;
5
+ }
6
+
7
+ let { columns = 5, rows = 10 }: Props = $props();
8
+ </script>
9
+
10
+ <section class="table-skeleton">
11
+ <table class="table-skeleton-table">
12
+ <thead>
13
+ <tr>
14
+ {#each Array(columns) as _}
15
+ <th class="table-skeleton-header">
16
+ <div class="table-skeleton-header-placeholder"></div>
17
+ </th>
18
+ {/each}
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ {#each Array(rows) as _}
23
+ <tr>
24
+ {#each Array(columns) as _}
25
+ <td class="table-skeleton-cell">
26
+ <div class="table-skeleton-cell-placeholder"></div>
27
+ </td>
28
+ {/each}
29
+ </tr>
30
+ {/each}
31
+ </tbody>
32
+ </table>
33
+ </section>
34
+
35
+ <style>
36
+
37
+ .table-skeleton {
38
+ --color-black: #000;
39
+ --color-gray-300: #d1d5db;
40
+ --spacing-md: 12px;
41
+ --spacing-lg: 16px;
42
+ --font-size-sm: 14px;
43
+ --skeleton-width: 150px;
44
+ --skeleton-header-height: 18px;
45
+ --skeleton-cell-height: 16px;
46
+ --radius-lg: 8px;
47
+
48
+ overflow-x: auto;
49
+ overflow-y: hidden;
50
+ }
51
+
52
+ .table-skeleton-table {
53
+ width: 100%;
54
+ border-spacing: 0;
55
+ }
56
+
57
+ .table-skeleton-header {
58
+ padding: var(--spacing-md) var(--spacing-lg);
59
+ border-right: 0.5px solid var(--color-gray-300);
60
+ border-bottom: 2px solid var(--color-black);
61
+ text-align: left;
62
+ font-size: var(--font-size-sm);
63
+ }
64
+
65
+ .table-skeleton-header:last-child {
66
+ border-right: 0;
67
+ }
68
+
69
+ .table-skeleton-header-placeholder {
70
+ height: var(--skeleton-header-height);
71
+ width: var(--skeleton-width);
72
+ background: var(--color-gray-300);
73
+ border-radius: var(--radius-lg);
74
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
75
+ }
76
+
77
+ .table-skeleton-cell {
78
+ padding: var(--spacing-md) var(--spacing-lg);
79
+ border-bottom: 2px solid var(--color-gray-300);
80
+ }
81
+
82
+ .table-skeleton-cell-placeholder {
83
+ height: var(--skeleton-cell-height);
84
+ width: var(--skeleton-width);
85
+ background: var(--color-gray-300);
86
+ border-radius: var(--radius-lg);
87
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
88
+ }
89
+
90
+ @keyframes pulse {
91
+ 0%,
92
+ 100% {
93
+ opacity: 1;
94
+ }
95
+ 50% {
96
+ opacity: 0.5;
97
+ }
98
+ }
99
+ </style>
@@ -0,0 +1,7 @@
1
+ interface Props {
2
+ columns?: number;
3
+ rows?: number;
4
+ }
5
+ declare const Skeleton: import("svelte").Component<Props, {}, "">;
6
+ type Skeleton = ReturnType<typeof Skeleton>;
7
+ export default Skeleton;
@@ -0,0 +1,351 @@
1
+ <script lang="ts" generics="T">
2
+ import { type Snippet } from 'svelte';
3
+
4
+ import { Button, Search } from '../index.js';
5
+ import {
6
+ createSvelteTable,
7
+ getCoreRowModel,
8
+ getExpandedRowModel,
9
+ getFilteredRowModel,
10
+ getPaginationRowModel,
11
+ getSortedRowModel,
12
+ type ColumnDef,
13
+ type ColumnFiltersState,
14
+ type ExpandedState,
15
+ type PaginationState,
16
+ type RowSelectionState,
17
+ type SortingState,
18
+ type Updater,
19
+ type VisibilityState
20
+ } from './adapter/index.js';
21
+ import Body from './Body.svelte';
22
+ import ColumnVisibilityDropdown from './ColumnVisibilityDropdown.svelte';
23
+ import { DEFAULT_MIN_PAGE_LIMIT, DEFAULT_PAGE_LIMIT } from './consts.js';
24
+ import { setPaginationTableContext } from './context.js';
25
+ import type { ExcelSetting } from './excel-setting.js';
26
+ import exportExcel from './excel.js';
27
+ import Footer from './Footer.svelte';
28
+ import Header from './Header.svelte';
29
+ import Skeleton from './Skeleton.svelte';
30
+ import type { Pagination } from './types.js';
31
+ import { createCheckedColumn } from './util.js';
32
+
33
+ interface Props {
34
+ columns: ColumnDef<T, any>[];
35
+ isLoading?: boolean;
36
+ data?: T[];
37
+ minPageSize?: boolean;
38
+ enableChecked?: boolean;
39
+ enableExportExcel?: boolean;
40
+ enableGlobalSearch?: boolean;
41
+ enableColumnSearch?: boolean;
42
+ enableColumnVisibility?: boolean;
43
+ manualPagination?: boolean;
44
+ pagination?: Pagination;
45
+ excelSetting?: ExcelSetting;
46
+ header?: Snippet;
47
+ bulkActions?: Snippet<[selectedRows: T[]]>;
48
+ onpagechange?: (pageSize: number, pageNumber: number) => void;
49
+ onpagesizechange?: (pageSize: number) => void;
50
+ }
51
+
52
+ let {
53
+ columns = [],
54
+ isLoading = false,
55
+ data = [],
56
+ minPageSize = false,
57
+ enableChecked = false,
58
+ enableExportExcel = false,
59
+ enableGlobalSearch = true,
60
+ enableColumnSearch = false,
61
+ enableColumnVisibility = true,
62
+ manualPagination = false,
63
+ pagination,
64
+ excelSetting = {
65
+ fileName: 'Table',
66
+ exportAllColumns: false
67
+ },
68
+ onpagechange,
69
+ onpagesizechange,
70
+ header,
71
+ bulkActions
72
+ }: Props = $props();
73
+
74
+ const getInitialColumnVisibility = (): VisibilityState => {
75
+ const visibility: VisibilityState = {};
76
+ columns.forEach((column) => {
77
+ const columnId =
78
+ column.id ?? ('accessorKey' in column ? String(column.accessorKey) : undefined);
79
+ if (columnId && column.meta?.isVisible === false) {
80
+ visibility[columnId] = false;
81
+ }
82
+ });
83
+ return visibility;
84
+ };
85
+
86
+ const getInitialPaginationState = (): PaginationState => {
87
+ if (!manualPagination) {
88
+ return {
89
+ pageIndex: 0,
90
+ pageSize: minPageSize ? DEFAULT_MIN_PAGE_LIMIT : DEFAULT_PAGE_LIMIT
91
+ };
92
+ }
93
+
94
+ const pageSize = DEFAULT_PAGE_LIMIT;
95
+ const pageIndex = 0;
96
+
97
+ return { pageIndex, pageSize };
98
+ };
99
+
100
+ const tableManualPagination = manualPagination ? setPaginationTableContext() : undefined;
101
+ let globalFilter = $state<string>('');
102
+ let sorting = $state<SortingState>([]);
103
+ let columnFilters = $state<ColumnFiltersState>([]);
104
+ let rowSelection = $state<RowSelectionState>({});
105
+ let expanded = $state<ExpandedState>({});
106
+ let columnVisibility = $state<VisibilityState>(getInitialColumnVisibility());
107
+ let paginationState = $state<PaginationState>(getInitialPaginationState());
108
+ let tableData = $derived(data);
109
+
110
+ const table = createSvelteTable({
111
+ get data() {
112
+ return tableData;
113
+ },
114
+ columns,
115
+ state: {
116
+ get sorting() {
117
+ return sorting;
118
+ },
119
+ get columnVisibility() {
120
+ return columnVisibility;
121
+ },
122
+ get columnFilters() {
123
+ return columnFilters;
124
+ },
125
+ get rowSelection() {
126
+ return rowSelection;
127
+ },
128
+ get globalFilter() {
129
+ return globalFilter;
130
+ },
131
+ get pagination() {
132
+ return paginationState;
133
+ },
134
+ get expanded() {
135
+ return expanded;
136
+ }
137
+ },
138
+ get pageCount() {
139
+ return $tableManualPagination?.totalPages;
140
+ },
141
+ onSortingChange: (updater: Updater<SortingState>) => {
142
+ sorting = updater instanceof Function ? updater(sorting) : updater;
143
+ },
144
+ onColumnVisibilityChange: (updater: Updater<VisibilityState>) => {
145
+ columnVisibility = updater instanceof Function ? updater(columnVisibility) : updater;
146
+ },
147
+ onRowSelectionChange: (updater: Updater<RowSelectionState>) => {
148
+ rowSelection = updater instanceof Function ? updater(rowSelection) : updater;
149
+ },
150
+ onColumnFiltersChange: (updater: Updater<ColumnFiltersState>) => {
151
+ columnFilters = updater instanceof Function ? updater(columnFilters) : updater;
152
+ },
153
+ onExpandedChange: (updater: Updater<ExpandedState>) => {
154
+ expanded = updater instanceof Function ? updater(expanded) : updater;
155
+ },
156
+ onPaginationChange: (updater: Updater<PaginationState>) => {
157
+ const next = updater instanceof Function ? updater(paginationState) : updater;
158
+ if ($tableManualPagination) {
159
+ changeManualPagination(next);
160
+ }
161
+ paginationState = next;
162
+ },
163
+ getCoreRowModel: getCoreRowModel(),
164
+ getPaginationRowModel: getPaginationRowModel(),
165
+ getFilteredRowModel: getFilteredRowModel(),
166
+ getSortedRowModel: getSortedRowModel(),
167
+ getExpandedRowModel: getExpandedRowModel(),
168
+ getSubRows: (row) => (row as any)?.children,
169
+ manualPagination,
170
+ paginateExpandedRows: false,
171
+ enableColumnFilters: true,
172
+ sortDescFirst: false
173
+ });
174
+
175
+ const changeManualPagination = (updatedPaginationState: PaginationState) => {
176
+ const pageSizeChanged = updatedPaginationState.pageSize !== paginationState.pageSize;
177
+
178
+ if (pageSizeChanged) {
179
+ updatedPaginationState.pageIndex = 0;
180
+ onpagesizechange?.(updatedPaginationState.pageSize);
181
+ } else {
182
+ const currentPageNumber = updatedPaginationState.pageIndex + 1;
183
+ onpagechange?.(updatedPaginationState.pageSize, currentPageNumber);
184
+ }
185
+ };
186
+
187
+ const hasData = $derived(data.length > 0);
188
+ const hasFilteredRows = $derived(table.getRowModel().rows.length > 0);
189
+ const selectedRows = $derived(table.getSelectedRowModel().rows);
190
+
191
+ $effect(() => {
192
+ if (manualPagination && pagination) {
193
+ $tableManualPagination = { ...pagination };
194
+ }
195
+ });
196
+
197
+ $effect.pre(() => {
198
+ if (enableChecked && columns.length) {
199
+ const checkedColumnExists = columns.some((column) => column.id === 'checked');
200
+ if (!checkedColumnExists) {
201
+ const checkedColumn = createCheckedColumn<T>();
202
+ columns.unshift(checkedColumn);
203
+ }
204
+ }
205
+ });
206
+ </script>
207
+
208
+ <section class="table-container">
209
+ {#if isLoading}
210
+ <Skeleton columns={minPageSize ? 3 : undefined} rows={minPageSize ? 5 : undefined} />
211
+ {:else}
212
+ <header
213
+ class={[
214
+ 'table-header',
215
+ enableGlobalSearch ? 'table-header--space-between' : 'table-header--end'
216
+ ]}
217
+ >
218
+ {#if enableGlobalSearch}
219
+ <div class="table-search">
220
+ <Search bind:value={globalFilter} />
221
+ </div>
222
+ {/if}
223
+
224
+ {#if header || enableExportExcel || enableColumnVisibility}
225
+ <div class="table-actions">
226
+ {#if enableColumnVisibility}
227
+ <ColumnVisibilityDropdown
228
+ columns={table.getAllLeafColumns().filter((column) => column.getCanHide())}
229
+ />
230
+ {/if}
231
+ {#if enableExportExcel}
232
+ <Button variant="secondary" onclick={() => exportExcel(table, excelSetting)}
233
+ >Export</Button
234
+ >
235
+ {/if}
236
+ {@render header?.()}
237
+ </div>
238
+ {/if}
239
+ </header>
240
+
241
+ {#if enableChecked && (table.getIsSomeRowsSelected() || table.getIsAllRowsSelected())}
242
+ <div class="table-bulk-actions">
243
+ <p>
244
+ {selectedRows.length} of {table.getCoreRowModel().rows.length} items are selected
245
+ </p>
246
+ {#if bulkActions}
247
+ <hr class="action-divider" />
248
+ {@render bulkActions?.(selectedRows.map((row) => row.original))}
249
+ {/if}
250
+ </div>
251
+ {/if}
252
+
253
+ <article class={['table-article', hasFilteredRows && 'table-article--padding']}>
254
+ <table class="table-main">
255
+ <Header headerGroups={table.getHeaderGroups()} {enableColumnSearch} />
256
+ {#if hasData}
257
+ <Body bodyRows={table.getRowModel().rows} />
258
+ {/if}
259
+ </table>
260
+ </article>
261
+
262
+ {#if !hasData}
263
+ <p class="table-message table-message--error">No data available</p>
264
+ {:else if !hasFilteredRows}
265
+ <p class="table-message table-message--error">No items found</p>
266
+ {/if}
267
+
268
+ {#if hasData}
269
+ <Footer {table} {minPageSize} />
270
+ {/if}
271
+ {/if}
272
+ </section>
273
+
274
+ <style>
275
+ .table-container {
276
+ --color-red-600: #dc2626;
277
+ --color-gray-300: #d1d5db;
278
+ --color-gray: #6b7180;
279
+ --font-size-sm: 14px;
280
+ --spacing-md: 16px;
281
+ --spacing-lg: 24px;
282
+ --spacing-xl: 40px;
283
+ --font-size-xl: 20px;
284
+ --search-width: 491px;
285
+
286
+ width: 100%;
287
+ }
288
+
289
+ .table-header {
290
+ display: flex;
291
+ align-items: center;
292
+ }
293
+
294
+ .table-header--space-between {
295
+ justify-content: space-between;
296
+ }
297
+
298
+ .table-header--end {
299
+ justify-content: flex-end;
300
+ }
301
+
302
+ .table-search {
303
+ width: var(--search-width);
304
+ }
305
+
306
+ .table-actions {
307
+ display: flex;
308
+ gap: var(--spacing-md);
309
+ }
310
+
311
+ .table-bulk-actions {
312
+ display: flex;
313
+ align-items: center;
314
+ gap: 8px;
315
+ font-size: var(--font-size-sm);
316
+ margin-top: var(--spacing-md);
317
+ }
318
+
319
+ .action-divider {
320
+ border: none;
321
+ border-left: 1px solid var(--color-gray);
322
+ margin: 0;
323
+ height: 15px;
324
+ }
325
+
326
+ .table-article {
327
+ margin: var(--spacing-md) 0;
328
+ padding-right: 12px;
329
+ overflow-x: auto;
330
+ overflow-y: hidden;
331
+ }
332
+
333
+ .table-article--padding {
334
+ padding-bottom: var(--spacing-md);
335
+ }
336
+
337
+ .table-main {
338
+ min-width: 100%;
339
+ border-spacing: 0;
340
+ }
341
+
342
+ .table-message {
343
+ margin-top: var(--spacing-xl);
344
+ text-align: center;
345
+ font-size: var(--font-size-xl);
346
+ }
347
+
348
+ .table-message--error {
349
+ color: var(--color-red-600);
350
+ }
351
+ </style>
@@ -0,0 +1,45 @@
1
+ import { type Snippet } from 'svelte';
2
+ import { type ColumnDef } from './adapter/index.js';
3
+ import type { ExcelSetting } from './excel-setting.js';
4
+ import type { Pagination } from './types.js';
5
+ declare function $$render<T>(): {
6
+ props: {
7
+ columns: ColumnDef<T, any>[];
8
+ isLoading?: boolean;
9
+ data?: T[];
10
+ minPageSize?: boolean;
11
+ enableChecked?: boolean;
12
+ enableExportExcel?: boolean;
13
+ enableGlobalSearch?: boolean;
14
+ enableColumnSearch?: boolean;
15
+ enableColumnVisibility?: boolean;
16
+ manualPagination?: boolean;
17
+ pagination?: Pagination;
18
+ excelSetting?: ExcelSetting;
19
+ header?: Snippet;
20
+ bulkActions?: Snippet<[selectedRows: T[]]>;
21
+ onpagechange?: (pageSize: number, pageNumber: number) => void;
22
+ onpagesizechange?: (pageSize: number) => void;
23
+ };
24
+ exports: {};
25
+ bindings: "";
26
+ slots: {};
27
+ events: {};
28
+ };
29
+ declare class __sveltets_Render<T> {
30
+ props(): ReturnType<typeof $$render<T>>['props'];
31
+ events(): ReturnType<typeof $$render<T>>['events'];
32
+ slots(): ReturnType<typeof $$render<T>>['slots'];
33
+ bindings(): "";
34
+ exports(): {};
35
+ }
36
+ interface $$IsomorphicComponent {
37
+ new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
38
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
39
+ } & ReturnType<__sveltets_Render<T>['exports']>;
40
+ <T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
41
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
42
+ }
43
+ declare const Table: $$IsomorphicComponent;
44
+ type Table<T> = InstanceType<typeof Table<T>>;
45
+ export default Table;
@@ -0,0 +1,40 @@
1
+ <script
2
+ lang="ts"
3
+ generics="TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>"
4
+ >
5
+ import type {
6
+ CellContext,
7
+ ColumnDefTemplate,
8
+ HeaderContext,
9
+ } from "@tanstack/table-core";
10
+ import {
11
+ RenderComponentConfig,
12
+ RenderSnippetConfig,
13
+ } from "./render-component.js";
14
+
15
+ type Props = {
16
+ content?: TContext extends HeaderContext<TData, TValue>
17
+ ? ColumnDefTemplate<HeaderContext<TData, TValue>>
18
+ : TContext extends CellContext<TData, TValue>
19
+ ? ColumnDefTemplate<CellContext<TData, TValue>>
20
+ : never;
21
+ context: TContext;
22
+ };
23
+
24
+ let { content, context }: Props = $props();
25
+ </script>
26
+
27
+ {#if typeof content === "string"}
28
+ {content}
29
+ {:else if content instanceof Function}
30
+ {@const result = content(context as any)}
31
+ {#if result instanceof RenderComponentConfig}
32
+ {@const { component: Component, props } = result}
33
+ <Component {...props} />
34
+ {:else if result instanceof RenderSnippetConfig}
35
+ {@const { snippet, params } = result}
36
+ {@render snippet(params)}
37
+ {:else}
38
+ {result}
39
+ {/if}
40
+ {/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;
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;
@@ -0,0 +1,4 @@
1
+ export * from '@tanstack/table-core';
2
+ export { default as FlexRender } from './flex-render.svelte';
3
+ export { renderComponent, renderSnippet } from './render-component.js';
4
+ export { createSvelteTable } from './table.svelte';
@@ -0,0 +1,4 @@
1
+ export * from '@tanstack/table-core';
2
+ export { default as FlexRender } from './flex-render.svelte';
3
+ export { renderComponent, renderSnippet } from './render-component.js';
4
+ export { createSvelteTable } from './table.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 const renderComponent: <TComponent extends Component<any>, TProps extends ComponentProps<TComponent>>(component: TComponent, props: TProps) => RenderComponentConfig<TComponent>;
13
+ export declare const renderSnippet: <TProps>(snippet: Snippet<[TProps]>, params: TProps) => RenderSnippetConfig<TProps>;
@@ -0,0 +1,18 @@
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
+ export const renderComponent = (component, props) => new RenderComponentConfig(component, props);
18
+ export const renderSnippet = (snippet, params) => new RenderSnippetConfig(snippet, params);
@@ -0,0 +1,6 @@
1
+ import { type RowData, type Table, type TableOptions } from "@tanstack/table-core";
2
+ export declare function createSvelteTable<TData extends RowData>(options: TableOptions<TData>): Table<TData>;
3
+ export declare function mergeObjects<T>(source: T): T;
4
+ export declare function mergeObjects<T, U>(source: T, source1: U): T & U;
5
+ export declare function mergeObjects<T, U, V>(source: T, source1: U, source2: V): T & U & V;
6
+ export declare function mergeObjects<T, U, V, W>(source: T, source1: U, source2: V, source3: W): T & U & V & W;
@@ -0,0 +1,66 @@
1
+ import { createTable, } from "@tanstack/table-core";
2
+ export function createSvelteTable(options) {
3
+ const resolvedOptions = mergeObjects(createDefaultOptions(), options);
4
+ const table = createTable(resolvedOptions);
5
+ let state = $state(table.initialState);
6
+ function updateOptions() {
7
+ table.setOptions((prev) => {
8
+ return mergeObjects(prev, options, {
9
+ state: mergeObjects(state, options.state ?? {}),
10
+ onStateChange: (updater) => {
11
+ if (updater instanceof Function) {
12
+ state = updater(state);
13
+ }
14
+ else {
15
+ state = mergeObjects(state, updater);
16
+ }
17
+ options.onStateChange?.(updater);
18
+ },
19
+ });
20
+ });
21
+ }
22
+ updateOptions();
23
+ $effect.pre(() => {
24
+ updateOptions();
25
+ });
26
+ return table;
27
+ }
28
+ function createDefaultOptions() {
29
+ return {
30
+ state: {},
31
+ onStateChange() { },
32
+ renderFallbackValue: null,
33
+ mergeOptions: (defaultOptions, options) => {
34
+ return mergeObjects(defaultOptions, options);
35
+ },
36
+ };
37
+ }
38
+ export function mergeObjects(...sources) {
39
+ const target = {};
40
+ for (let i = 0; i < sources.length; i++) {
41
+ let source = sources[i];
42
+ if (typeof source === "function")
43
+ source = source();
44
+ if (source) {
45
+ const descriptors = Object.getOwnPropertyDescriptors(source);
46
+ for (const key in descriptors) {
47
+ if (key in target)
48
+ continue;
49
+ Object.defineProperty(target, key, {
50
+ enumerable: true,
51
+ get() {
52
+ for (let i = sources.length - 1; i >= 0; i--) {
53
+ let s = sources[i];
54
+ if (typeof s === "function")
55
+ s = s();
56
+ const v = (s || {})[key];
57
+ if (v !== undefined)
58
+ return v;
59
+ }
60
+ },
61
+ });
62
+ }
63
+ }
64
+ }
65
+ return target;
66
+ }