@softwareone/spi-sv5-library 1.14.4 → 1.15.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 (79) hide show
  1. package/dist/components/accordion/Accordion.svelte +14 -23
  2. package/dist/components/announcement/Announcement.svelte +53 -61
  3. package/dist/components/avatar/Avatar.svelte +30 -12
  4. package/dist/components/avatar/Avatar.svelte.d.ts +2 -2
  5. package/dist/components/button/Button.svelte +41 -44
  6. package/dist/components/card/Card.svelte +4 -6
  7. package/dist/components/chips/Chips.svelte +37 -36
  8. package/dist/components/chips/Chips.svelte.d.ts +1 -1
  9. package/dist/components/confirmation/Confirmation.svelte +1 -1
  10. package/dist/components/controls/attach-file/AttachFile.svelte +18 -41
  11. package/dist/components/controls/attach-file/FileManager.svelte +16 -30
  12. package/dist/components/controls/attach-file/Warnings.svelte +13 -15
  13. package/dist/components/controls/input/Input.svelte +46 -72
  14. package/dist/components/controls/input/InputIcon.svelte +13 -13
  15. package/dist/components/controls/label/Label.svelte +5 -9
  16. package/dist/components/controls/radio-group/RadioGroup.svelte +25 -39
  17. package/dist/components/controls/select/Select.svelte +49 -71
  18. package/dist/components/controls/textarea/TextArea.svelte +36 -45
  19. package/dist/components/controls/toggle/Toggle.svelte +35 -37
  20. package/dist/components/delete-confirmation/DeleteConfirmation.svelte +1 -1
  21. package/dist/components/error-page/ErrorPage.svelte +9 -18
  22. package/dist/components/footer/Footer.svelte +6 -7
  23. package/dist/components/form/Form.svelte +1 -1
  24. package/dist/components/header/Header.svelte +39 -45
  25. package/dist/components/header/HeaderAccount.svelte +21 -33
  26. package/dist/components/header/HeaderLoader.svelte +13 -8
  27. package/dist/components/highlight-panel/HighlightPanel.svelte +29 -34
  28. package/dist/components/home/Home.svelte +18 -36
  29. package/dist/components/link/Link.svelte +1 -1
  30. package/dist/components/menu/Menu.svelte +12 -12
  31. package/dist/components/menu/MenuItem.svelte +25 -29
  32. package/dist/components/menu/Sidebar.svelte +32 -40
  33. package/dist/components/modal/Modal.svelte +8 -12
  34. package/dist/components/modal/ModalContent.svelte +3 -3
  35. package/dist/components/modal/ModalFooter.svelte +5 -5
  36. package/dist/components/modal/ModalHeader.svelte +6 -11
  37. package/dist/components/notification/Notification.svelte +20 -27
  38. package/dist/components/processing/Processing.svelte +9 -16
  39. package/dist/components/progress-page/ProgressPage.svelte +13 -18
  40. package/dist/components/progress-wizard/ProgressWizard.svelte +43 -54
  41. package/dist/components/search/Search.svelte +24 -29
  42. package/dist/components/spinner/Spinner.svelte +1 -1
  43. package/dist/components/switcher/Switcher.svelte +14 -23
  44. package/dist/components/table/ActionsColumn.svelte +13 -33
  45. package/dist/components/table/AdvancedFilter.svelte +39 -74
  46. package/dist/components/table/Body.svelte +9 -18
  47. package/dist/components/table/ColumnVisibilityDropdown.svelte +24 -55
  48. package/dist/components/table/Footer.svelte +2 -4
  49. package/dist/components/table/Header.svelte +23 -44
  50. package/dist/components/table/PageSize.svelte +24 -36
  51. package/dist/components/table/Pagination.svelte +49 -35
  52. package/dist/components/table/RowCheckBox.svelte +5 -12
  53. package/dist/components/table/Skeleton.svelte +16 -25
  54. package/dist/components/table/Table.svelte +50 -38
  55. package/dist/components/table/Table.svelte.d.ts +5 -1
  56. package/dist/components/table/types.d.ts +9 -1
  57. package/dist/components/table/utils.d.ts +5 -1
  58. package/dist/components/table/utils.js +8 -8
  59. package/dist/components/tabs/Tabs.svelte +16 -20
  60. package/dist/components/toast/Toast.svelte +27 -30
  61. package/dist/components/tooltip/Tooltip.svelte +15 -19
  62. package/dist/components/waffle/Waffle.svelte +9 -13
  63. package/dist/components/waffle/WaffleItems.svelte +10 -13
  64. package/dist/styles/index.css +3 -0
  65. package/dist/styles/reset.css +19 -0
  66. package/dist/styles/tokens/index.css +2 -0
  67. package/dist/styles/tokens/primitives/borders.css +17 -0
  68. package/dist/styles/tokens/primitives/colors.css +41 -0
  69. package/dist/styles/tokens/primitives/index.css +7 -0
  70. package/dist/styles/tokens/primitives/motion.css +11 -0
  71. package/dist/styles/tokens/primitives/opacity.css +6 -0
  72. package/dist/styles/tokens/primitives/shadows.css +11 -0
  73. package/dist/styles/tokens/primitives/sizing.css +19 -0
  74. package/dist/styles/tokens/primitives/typography.css +13 -0
  75. package/dist/styles/tokens/semantic/colors.css +78 -0
  76. package/dist/styles/tokens/semantic/index.css +2 -0
  77. package/dist/styles/tokens/semantic/shadows.css +9 -0
  78. package/dist/styles/utilities.css +73 -0
  79. package/package.json +3 -2
@@ -33,7 +33,7 @@
33
33
  <div class="page-size-selector">
34
34
  <span>Rows per page:</span>
35
35
  <select
36
- class="page-size-select"
36
+ class="page-size-select spi-text-semibold-2"
37
37
  name="rows-per-page"
38
38
  id="rows-per-page"
39
39
  title="Rows per page"
@@ -43,7 +43,9 @@
43
43
  }}
44
44
  >
45
45
  {#each DEFAULT_ITEMS_PER_PAGE_OPTIONS as itemPerPage (itemPerPage)}
46
- <option class="page-size-option" value={itemPerPage}>{itemPerPage}</option>
46
+ <option class="page-size-option spi-text-medium-2" value={itemPerPage}
47
+ >{itemPerPage}</option
48
+ >
47
49
  {/each}
48
50
  </select>
49
51
  </div>
@@ -55,31 +57,19 @@
55
57
 
56
58
  <style>
57
59
  .page-size {
58
- --color-black: #000000;
59
- --color-primary: #472aff;
60
- --color-gray-100: #f3f4f6;
61
- --color-gray-200: #e5e7eb;
62
- --color-border: #ebedef;
63
- --spacing-sm: 8px;
64
- --spacing-md: 12px;
65
- --spacing-lg: 24px;
66
- --radius-lg: 8px;
67
- --font-medium: 500;
68
- --font-semibold: 600;
69
-
70
60
  display: flex;
71
61
  align-items: center;
72
62
  justify-content: center;
73
- gap: var(--spacing-lg);
63
+ gap: var(--spi-size-6);
74
64
  }
75
65
 
76
66
  @media (max-width: 750px) {
77
67
  .page-size {
78
- margin-top: 20px;
68
+ margin-top: var(--spi-size-5);
79
69
  }
80
70
 
81
71
  .page-size--margin {
82
- margin-left: 12px;
72
+ margin-left: var(--spi-size-3);
83
73
  }
84
74
  }
85
75
 
@@ -90,17 +80,16 @@
90
80
  }
91
81
 
92
82
  .page-size-select {
93
- width: 64px;
94
- padding: var(--spacing-sm);
95
- border-radius: var(--radius-lg);
96
- font-weight: var(--font-semibold);
83
+ width: var(--spi-size-16);
84
+ padding: var(--spi-size-2);
85
+ border-radius: var(--spi-rounded-lg);
97
86
  cursor: pointer;
98
87
  border: none;
99
88
  background: transparent;
100
89
  }
101
90
 
102
91
  .page-size-select:hover {
103
- background: var(--color-gray-100);
92
+ background: var(--spi-color-surface-subtle);
104
93
  }
105
94
 
106
95
  .page-size-select:focus {
@@ -108,25 +97,24 @@
108
97
  }
109
98
 
110
99
  .page-size-option {
111
- gap: 20px;
112
- padding: 4px 16px;
113
- font-weight: var(--font-medium);
114
- border-right: 2px solid var(--color-border);
115
- border-left: 2px solid var(--color-border);
100
+ gap: var(--spi-size-5);
101
+ padding: var(--spi-size-1) var(--spi-size-4);
102
+ border-right: var(--spi-border-2) solid var(--spi-color-border-default);
103
+ border-left: var(--spi-border-2) solid var(--spi-color-border-default);
116
104
  }
117
105
 
118
106
  .page-size-option:hover {
119
- background: var(--color-gray-200);
107
+ background: var(--spi-color-surface-muted);
120
108
  }
121
109
 
122
110
  .page-size-option:first-of-type {
123
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
124
- border-top: 2px solid var(--color-border);
111
+ border-radius: var(--spi-rounded-lg) var(--spi-rounded-lg) 0 0;
112
+ border-top: var(--spi-border-2) solid var(--spi-color-border-default);
125
113
  }
126
114
 
127
115
  .page-size-option:last-of-type {
128
- border-radius: 0 0 var(--radius-lg) var(--radius-lg);
129
- border-bottom: 2px solid var(--color-border);
116
+ border-radius: 0 0 var(--spi-rounded-lg) var(--spi-rounded-lg);
117
+ border-bottom: var(--spi-border-2) solid var(--spi-color-border-default);
130
118
  }
131
119
 
132
120
  select,
@@ -137,12 +125,12 @@
137
125
  select::picker-icon {
138
126
  content: '\e5e1';
139
127
  font-family: 'Material Icons';
140
- color: var(--color-black);
128
+ color: var(--spi-color-text-primary);
141
129
  margin-left: 5px;
142
130
  display: inline-flex;
143
131
  align-items: center;
144
132
  transform: rotate(90deg);
145
- transition: transform 0.4s ease;
133
+ transition: transform var(--spi-duration-slow) var(--spi-ease-default);
146
134
  }
147
135
 
148
136
  option::checkmark {
@@ -150,7 +138,7 @@
150
138
  font-family: 'Material Icons';
151
139
  order: 1;
152
140
  margin-left: auto;
153
- color: var(--color-primary);
141
+ color: var(--spi-color-primary-base);
154
142
  }
155
143
 
156
144
  select:open::picker-icon {
@@ -159,6 +147,6 @@
159
147
 
160
148
  ::picker(select) {
161
149
  border: none;
162
- border-radius: var(--radius-lg);
150
+ border-radius: var(--spi-rounded-lg);
163
151
  }
164
152
  </style>
@@ -1,6 +1,8 @@
1
1
  <script lang="ts" generics="T">
2
2
  import { Tooltip } from '../../index.js';
3
3
  import type { Table } from './adapter/index.js';
4
+ import { getPaginationTableContext } from './context.js';
5
+ import { isCursorPagination } from './utils.js';
4
6
 
5
7
  interface Props {
6
8
  table: Table<T>;
@@ -8,7 +10,13 @@
8
10
 
9
11
  let { table }: Props = $props();
10
12
 
13
+ const paginationTable = getPaginationTableContext();
14
+
11
15
  const initialPage = $derived(table.getState().pagination.pageIndex + 1);
16
+ const isCursorPaginationEnabled = $derived(
17
+ $paginationTable && isCursorPagination($paginationTable)
18
+ );
19
+ const hasMultiplePages = $derived(table.getPageCount() > 2);
12
20
 
13
21
  const handlePaginationChange = (event: Event) => {
14
22
  const input = event.currentTarget as HTMLInputElement;
@@ -37,18 +45,30 @@
37
45
  </script>
38
46
 
39
47
  <div class="pagination">
48
+ {#if hasMultiplePages}
49
+ <Tooltip content="First page" width="xs" position="bottom">
50
+ <button
51
+ type="button"
52
+ class="pagination-button spi-text-regular-2"
53
+ onclick={() => table.setPageIndex(0)}
54
+ disabled={!table.getCanPreviousPage()}
55
+ >
56
+ <span class="pagination-icon material-icons spi-text-regular-5">first_page</span>
57
+ </button>
58
+ </Tooltip>
59
+ {/if}
40
60
  <button
41
61
  type="button"
42
- class="pagination-button"
62
+ class="pagination-button spi-text-regular-2"
43
63
  onclick={() => table.previousPage()}
44
64
  disabled={!table.getCanPreviousPage()}
45
65
  >
46
- <span class="pagination-icon material-icons">arrow_back</span>
66
+ <span class="pagination-icon material-icons spi-text-regular-2">arrow_back</span>
47
67
  <span>Previous</span>
48
68
  </button>
49
69
  <div class="pagination-info">
50
70
  <span>Page</span>
51
- {#if table.getPageCount() > 1}
71
+ {#if !isCursorPaginationEnabled && table.getPageCount() > 1}
52
72
  <Tooltip content="Enter page number" width="sm" position="bottom">
53
73
  <input
54
74
  type="text"
@@ -66,80 +86,74 @@
66
86
 
67
87
  <button
68
88
  type="button"
69
- class="pagination-button"
89
+ class="pagination-button spi-text-regular-2"
70
90
  onclick={() => table.nextPage()}
71
91
  disabled={!table.getCanNextPage()}
72
92
  >
73
93
  <span>Next</span>
74
- <span class="pagination-icon material-icons">arrow_forward</span>
94
+ <span class="pagination-icon material-icons spi-text-regular-2">arrow_forward</span>
75
95
  </button>
96
+ {#if hasMultiplePages}
97
+ <Tooltip content="Last page" width="xs" position="bottom">
98
+ <button
99
+ type="button"
100
+ class="pagination-button spi-text-regular-2"
101
+ onclick={() => table.setPageIndex(table.getPageCount() - 1)}
102
+ disabled={isCursorPaginationEnabled || !table.getCanNextPage()}
103
+ >
104
+ <span class="pagination-icon material-icons spi-text-regular-5">last_page</span>
105
+ </button>
106
+ </Tooltip>
107
+ {/if}
76
108
  </div>
77
109
 
78
110
  <style>
79
111
  .pagination {
80
- --color-primary: #472aff;
81
- --color-gray-300: #d1d5db;
82
- --color-gray-500: #6b7280;
83
- --color-text: #000000;
84
- --spacing-sm: 8px;
85
- --spacing-md: 12px;
86
- --spacing-lg: 24px;
87
- --radius-lg: 8px;
88
- --font-size-sm: 14px;
89
- --font-size-icon: 14px;
90
- --input-height: 37px;
91
- --input-width: 38px;
92
-
93
112
  display: flex;
94
113
  align-items: center;
95
114
  justify-content: center;
96
- gap: var(--spacing-lg);
97
- padding: var(--spacing-sm) 0;
115
+ gap: var(--spi-size-6);
116
+ padding: var(--spi-size-2) 0;
98
117
  }
99
118
 
100
119
  .pagination-button {
101
120
  display: flex;
102
121
  align-items: center;
103
- gap: var(--spacing-sm);
122
+ gap: var(--spi-size-2);
104
123
  padding: 0;
105
124
  border: none;
106
125
  background: none;
107
- font-size: var(--font-size-sm);
108
- color: var(--color-text);
126
+ color: var(--spi-color-text-primary);
109
127
  cursor: pointer;
110
128
  }
111
129
 
112
130
  .pagination-button:disabled {
113
- color: var(--color-gray-300);
131
+ color: var(--spi-color-text-disabled);
114
132
  cursor: not-allowed;
115
133
  }
116
134
 
117
- .pagination-icon {
118
- font-size: var(--font-size-icon);
119
- }
120
-
121
135
  .pagination-info {
122
136
  display: flex;
123
137
  align-items: center;
124
- gap: var(--spacing-sm);
138
+ gap: var(--spi-size-2);
125
139
  }
126
140
 
127
141
  .pagination-input {
128
- height: var(--input-height);
129
- width: var(--input-width);
142
+ height: var(--spi-size-9);
143
+ width: var(--spi-size-9);
130
144
  padding: 0;
131
- border: 1px solid var(--color-gray-500);
132
- border-radius: var(--radius-lg);
145
+ border: var(--spi-border-1) solid var(--spi-color-border-strong);
146
+ border-radius: var(--spi-rounded-lg);
133
147
  text-align: center;
134
148
  cursor: pointer;
135
149
  }
136
150
 
137
151
  .pagination-input:hover {
138
- border-color: var(--color-primary);
152
+ border-color: var(--spi-color-primary-base);
139
153
  }
140
154
 
141
155
  .pagination-input:focus {
142
- border: 1px solid var(--color-primary);
156
+ border: var(--spi-border-1) solid var(--spi-color-primary-base);
143
157
  outline: none;
144
158
  }
145
159
  </style>
@@ -9,23 +9,16 @@
9
9
  let { indeterminate = false, checked, disabled = false, onchange }: Props = $props();
10
10
  </script>
11
11
 
12
- <input
13
- type="checkbox"
14
- class="accent-magentablue"
15
- {disabled}
16
- {onchange}
17
- {checked}
18
- bind:indeterminate
19
- />
12
+ <input type="checkbox" class="row-checkbox" {disabled} {onchange} {checked} bind:indeterminate />
20
13
 
21
14
  <style>
22
- .accent-magentablue {
23
- accent-color: #472aff;
15
+ .row-checkbox {
16
+ accent-color: var(--spi-color-primary-base);
24
17
  cursor: pointer;
25
18
  }
26
19
 
27
- .accent-magentablue:disabled {
20
+ .row-checkbox:disabled {
28
21
  cursor: not-allowed;
29
- opacity: 0.5;
22
+ opacity: var(--spi-opacity-disabled);
30
23
  }
31
24
  </style>
@@ -12,7 +12,7 @@
12
12
  <thead>
13
13
  <tr>
14
14
  {#each Array(columns).keys() as index (index)}
15
- <th class="table-skeleton-header">
15
+ <th class="table-skeleton-header spi-text-regular-2">
16
16
  <div class="table-skeleton-header-placeholder"></div>
17
17
  </th>
18
18
  {/each}
@@ -34,15 +34,7 @@
34
34
 
35
35
  <style>
36
36
  .table-skeleton {
37
- --color-black: #000;
38
- --color-gray-300: #d1d5db;
39
- --spacing-md: 12px;
40
- --spacing-lg: 16px;
41
- --font-size-sm: 14px;
42
37
  --skeleton-width: 150px;
43
- --skeleton-header-height: 18px;
44
- --skeleton-cell-height: 16px;
45
- --radius-lg: 8px;
46
38
 
47
39
  overflow-x: auto;
48
40
  overflow-y: hidden;
@@ -54,11 +46,10 @@
54
46
  }
55
47
 
56
48
  .table-skeleton-header {
57
- padding: var(--spacing-md) var(--spacing-lg);
58
- border-right: 0.5px solid var(--color-gray-300);
59
- border-bottom: 2px solid var(--color-black);
49
+ padding: var(--spi-size-3) var(--spi-size-4);
50
+ border-right: 0.5px solid var(--spi-color-border-default);
51
+ border-bottom: var(--spi-border-2) solid var(--spi-color-text-primary);
60
52
  text-align: left;
61
- font-size: var(--font-size-sm);
62
53
  }
63
54
 
64
55
  .table-skeleton-header:last-child {
@@ -66,33 +57,33 @@
66
57
  }
67
58
 
68
59
  .table-skeleton-header-placeholder {
69
- height: var(--skeleton-header-height);
60
+ height: 18px;
70
61
  width: var(--skeleton-width);
71
- background: var(--color-gray-300);
72
- border-radius: var(--radius-lg);
73
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
62
+ background: var(--spi-color-neutral-light);
63
+ border-radius: var(--spi-rounded-lg);
64
+ animation: pulse 2s var(--spi-ease-in-out) infinite;
74
65
  }
75
66
 
76
67
  .table-skeleton-cell {
77
- padding: var(--spacing-md) var(--spacing-lg);
78
- border-bottom: 2px solid var(--color-gray-300);
68
+ padding: var(--spi-size-3) var(--spi-size-4);
69
+ border-bottom: var(--spi-border-2) solid var(--spi-color-border-default);
79
70
  }
80
71
 
81
72
  .table-skeleton-cell-placeholder {
82
- height: var(--skeleton-cell-height);
73
+ height: var(--spi-size-4);
83
74
  width: var(--skeleton-width);
84
- background: var(--color-gray-300);
85
- border-radius: var(--radius-lg);
86
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
75
+ background: var(--spi-color-neutral-light);
76
+ border-radius: var(--spi-rounded-lg);
77
+ animation: pulse 2s var(--spi-ease-in-out) infinite;
87
78
  }
88
79
 
89
80
  @keyframes pulse {
90
81
  0%,
91
82
  100% {
92
- opacity: 1;
83
+ opacity: var(--spi-opacity-100);
93
84
  }
94
85
  50% {
95
- opacity: 0.5;
86
+ opacity: var(--spi-opacity-50);
96
87
  }
97
88
  }
98
89
  </style>
@@ -23,7 +23,12 @@
23
23
  import AdvancedFilter from './AdvancedFilter.svelte';
24
24
  import Body from './Body.svelte';
25
25
  import ColumnVisibilityDropdown from './ColumnVisibilityDropdown.svelte';
26
- import { DEFAULT_MIN_PAGE_LIMIT, DEFAULT_PAGE_LIMIT, Operator } from './consts.js';
26
+ import {
27
+ DEFAULT_MIN_PAGE_LIMIT,
28
+ DEFAULT_PAGE,
29
+ DEFAULT_PAGE_LIMIT,
30
+ Operator
31
+ } from './consts.js';
27
32
  import { setPaginationTableContext } from './context.js';
28
33
  import type { ExcelSetting } from './excel-setting.js';
29
34
  import exportExcel from './excel.js';
@@ -31,7 +36,12 @@
31
36
  import Header from './Header.svelte';
32
37
  import Skeleton from './Skeleton.svelte';
33
38
  import { type Filter, type Pagination } from './types.js';
34
- import { createCheckedColumn, getPage, getPageLimit } from './utils.js';
39
+ import {
40
+ createCheckedColumn,
41
+ isCursorPagination,
42
+ isValidPage,
43
+ isValidPageSize
44
+ } from './utils.js';
35
45
 
36
46
  interface Props {
37
47
  columns: ColumnDef<T, any>[];
@@ -45,13 +55,17 @@
45
55
  enableColumnSearch?: boolean;
46
56
  enableColumnVisibility?: boolean;
47
57
  enableAdvancedFilter?: boolean;
48
- manualPagination?: boolean;
58
+ serverSide?: boolean;
49
59
  pagination?: Pagination;
60
+ initialPage?: number;
61
+ initialPageSize?: number;
50
62
  excelSetting?: ExcelSetting;
51
63
  header?: Snippet;
52
64
  bulkActions?: Snippet<[selectedRows: T[], clearSelection: VoidFunction]>;
53
65
  onpagechange?: (pageSize: number, pageNumber: number) => void;
54
66
  onpagesizechange?: (pageSize: number) => void;
67
+ onnextpage?: (pageSize: number, pageNumber: number) => void;
68
+ onprevpage?: (pageSize: number, pageNumber: number) => void;
55
69
  }
56
70
 
57
71
  let {
@@ -66,14 +80,18 @@
66
80
  enableColumnSearch = false,
67
81
  enableColumnVisibility = true,
68
82
  enableAdvancedFilter = false,
69
- manualPagination = false,
83
+ serverSide = false,
70
84
  pagination,
85
+ initialPage,
86
+ initialPageSize,
71
87
  excelSetting = {
72
88
  fileName: 'Table',
73
89
  exportAllColumns: false
74
90
  },
75
91
  onpagechange,
76
92
  onpagesizechange,
93
+ onnextpage,
94
+ onprevpage,
77
95
  header,
78
96
  bulkActions
79
97
  }: Props = $props();
@@ -86,7 +104,7 @@
86
104
  let columnVisibility = $state<VisibilityState>(getInitialColumnVisibility());
87
105
  let paginationState = $state<PaginationState>(getInitialPaginationState());
88
106
  let tableData = $derived(data);
89
- const tableManualPagination = manualPagination ? setPaginationTableContext() : undefined;
107
+ const tableManualPagination = serverSide ? setPaginationTableContext() : undefined;
90
108
  const hasData = $derived(data.length > 0);
91
109
 
92
110
  const tableColumns = $derived.by(() => {
@@ -160,7 +178,7 @@
160
178
  getSortedRowModel: getSortedRowModel(),
161
179
  getExpandedRowModel: getExpandedRowModel(),
162
180
  getSubRows: (row) => ('children' in row ? (row.children as T[]) : undefined),
163
- manualPagination,
181
+ manualPagination: serverSide,
164
182
  paginateExpandedRows: false,
165
183
  enableColumnFilters: true,
166
184
  sortDescFirst: false
@@ -182,28 +200,34 @@
182
200
  }
183
201
 
184
202
  function getInitialPaginationState(): PaginationState {
185
- if (!manualPagination) {
203
+ if (!serverSide) {
186
204
  return {
187
205
  pageIndex: 0,
188
206
  pageSize: minPageSize ? DEFAULT_MIN_PAGE_LIMIT : DEFAULT_PAGE_LIMIT
189
207
  };
190
208
  }
191
209
 
192
- const currentPage = getPage(page.url.searchParams);
193
- const pageSize = getPageLimit(page.url.searchParams);
210
+ const currentPage = isValidPage(initialPage) ? initialPage : DEFAULT_PAGE;
211
+ const pageSize = isValidPageSize(initialPageSize) ? initialPageSize : undefined;
212
+
194
213
  const pageIndex = Math.max(0, currentPage - 1);
195
214
 
196
- return { pageIndex, pageSize };
215
+ return { pageIndex, pageSize: pageSize ?? DEFAULT_PAGE_LIMIT };
197
216
  }
198
217
 
199
218
  function changeManualPagination(updatedPaginationState: PaginationState) {
200
219
  const pageSizeChanged = updatedPaginationState.pageSize !== paginationState.pageSize;
220
+ const currentPageNumber = updatedPaginationState.pageIndex + 1;
201
221
 
202
222
  if (pageSizeChanged) {
203
223
  updatedPaginationState.pageIndex = 0;
204
224
  onpagesizechange?.(updatedPaginationState.pageSize);
225
+ } else if (pagination && isCursorPagination(pagination)) {
226
+ const isNext = updatedPaginationState.pageIndex > paginationState.pageIndex;
227
+ const handler = isNext ? onnextpage : onprevpage;
228
+
229
+ handler?.(updatedPaginationState.pageSize, currentPageNumber);
205
230
  } else {
206
- const currentPageNumber = updatedPaginationState.pageIndex + 1;
207
231
  onpagechange?.(updatedPaginationState.pageSize, currentPageNumber);
208
232
  }
209
233
  }
@@ -236,7 +260,7 @@
236
260
  };
237
261
 
238
262
  $effect(() => {
239
- if (manualPagination && pagination) {
263
+ if (serverSide && pagination) {
240
264
  $tableManualPagination = { ...pagination };
241
265
  }
242
266
  });
@@ -292,7 +316,7 @@
292
316
  </header>
293
317
 
294
318
  {#if enableChecked && (keepVisibleBulkActions || selectedRows.length > 0)}
295
- <div class="table-bulk-actions">
319
+ <div class="table-bulk-actions spi-text-regular-2">
296
320
  <p>
297
321
  {selectedRows.length} of {table.getCoreRowModel().rows.length} items are selected
298
322
  </p>
@@ -316,9 +340,9 @@
316
340
  </article>
317
341
 
318
342
  {#if !hasData}
319
- <p class="table-message table-message--error">No data available</p>
343
+ <p class="table-message table-message--error spi-text-regular-5">No data available</p>
320
344
  {:else if !hasFilteredRows}
321
- <p class="table-message table-message--error">No items found</p>
345
+ <p class="table-message table-message--error spi-text-regular-5">No items found</p>
322
346
  {/if}
323
347
 
324
348
  {#if hasData}
@@ -329,16 +353,6 @@
329
353
 
330
354
  <style>
331
355
  .table-container {
332
- --color-red-600: #dc2626;
333
- --color-gray-300: #d1d5db;
334
- --color-gray: #6b7180;
335
- --font-size-sm: 14px;
336
- --spacing-md: 16px;
337
- --spacing-lg: 24px;
338
- --spacing-xl: 40px;
339
- --font-size-xl: 20px;
340
- --search-width: 491px;
341
-
342
356
  width: 100%;
343
357
  }
344
358
 
@@ -356,44 +370,43 @@
356
370
  }
357
371
 
358
372
  .table-search {
359
- width: var(--search-width);
373
+ width: 491px;
360
374
  }
361
375
 
362
376
  .table-search-container {
363
377
  display: flex;
364
378
  align-items: center;
365
- gap: var(--spacing-md);
379
+ gap: var(--spi-size-4);
366
380
  }
367
381
 
368
382
  .table-actions {
369
383
  display: flex;
370
- gap: var(--spacing-md);
384
+ gap: var(--spi-size-4);
371
385
  }
372
386
 
373
387
  .table-bulk-actions {
374
388
  display: flex;
375
389
  align-items: center;
376
- gap: 8px;
377
- font-size: var(--font-size-sm);
378
- margin-top: var(--spacing-md);
390
+ gap: var(--spi-size-2);
391
+ margin-top: var(--spi-size-4);
379
392
  }
380
393
 
381
394
  .action-divider {
382
395
  border: none;
383
- border-left: 1px solid var(--color-gray);
396
+ border-left: var(--spi-border-1) solid var(--spi-color-border-strong);
384
397
  margin: 0;
385
398
  height: 15px;
386
399
  }
387
400
 
388
401
  .table-article {
389
- margin: var(--spacing-md) 0;
390
- padding-right: 12px;
402
+ margin: var(--spi-size-4) 0;
403
+ padding-right: var(--spi-size-3);
391
404
  overflow-x: auto;
392
405
  overflow-y: hidden;
393
406
  }
394
407
 
395
408
  .table-article--padding {
396
- padding-bottom: var(--spacing-md);
409
+ padding-bottom: var(--spi-size-4);
397
410
  }
398
411
 
399
412
  .table-main {
@@ -402,12 +415,11 @@
402
415
  }
403
416
 
404
417
  .table-message {
405
- margin-top: var(--spacing-xl);
418
+ margin-top: var(--spi-size-10);
406
419
  text-align: center;
407
- font-size: var(--font-size-xl);
408
420
  }
409
421
 
410
422
  .table-message--error {
411
- color: var(--color-red-600);
423
+ color: var(--spi-color-text-danger);
412
424
  }
413
425
  </style>
@@ -15,13 +15,17 @@ declare function $$render<T extends object>(): {
15
15
  enableColumnSearch?: boolean;
16
16
  enableColumnVisibility?: boolean;
17
17
  enableAdvancedFilter?: boolean;
18
- manualPagination?: boolean;
18
+ serverSide?: boolean;
19
19
  pagination?: Pagination;
20
+ initialPage?: number;
21
+ initialPageSize?: number;
20
22
  excelSetting?: ExcelSetting;
21
23
  header?: Snippet;
22
24
  bulkActions?: Snippet<[selectedRows: T[], clearSelection: VoidFunction]>;
23
25
  onpagechange?: (pageSize: number, pageNumber: number) => void;
24
26
  onpagesizechange?: (pageSize: number) => void;
27
+ onnextpage?: (pageSize: number, pageNumber: number) => void;
28
+ onprevpage?: (pageSize: number, pageNumber: number) => void;
25
29
  };
26
30
  exports: {};
27
31
  bindings: "";