ui-svelte 0.2.11 → 0.2.13

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 (225) hide show
  1. package/README.md +2 -2
  2. package/dist/charts/ArcChart.svelte +9 -14
  3. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  4. package/dist/charts/AreaChart.svelte +347 -118
  5. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  6. package/dist/charts/BarChart.svelte +288 -66
  7. package/dist/charts/BarChart.svelte.d.ts +26 -1
  8. package/dist/charts/Candlestick.svelte +53 -50
  9. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  10. package/dist/charts/LineChart.svelte +391 -91
  11. package/dist/charts/LineChart.svelte.d.ts +26 -3
  12. package/dist/charts/PieChart.svelte +333 -92
  13. package/dist/charts/PieChart.svelte.d.ts +33 -5
  14. package/dist/charts/css/arc-chart.css +3 -3
  15. package/dist/charts/css/area-chart.css +127 -29
  16. package/dist/charts/css/bar-chart.css +114 -8
  17. package/dist/charts/css/candlestick.css +2 -0
  18. package/dist/charts/css/line-chart.css +111 -13
  19. package/dist/charts/css/pie-chart.css +92 -20
  20. package/dist/control/Audio.svelte +86 -44
  21. package/dist/control/Audio.svelte.d.ts +4 -1
  22. package/dist/control/Button.svelte +18 -27
  23. package/dist/control/Button.svelte.d.ts +3 -2
  24. package/dist/control/Fab.svelte +103 -0
  25. package/dist/control/Fab.svelte.d.ts +25 -0
  26. package/dist/control/IconButton.svelte +17 -27
  27. package/dist/control/IconButton.svelte.d.ts +3 -3
  28. package/dist/control/Image.svelte +123 -0
  29. package/dist/control/Image.svelte.d.ts +13 -0
  30. package/dist/control/Record.svelte +141 -98
  31. package/dist/control/Record.svelte.d.ts +2 -1
  32. package/dist/control/ToggleGroup.svelte +22 -8
  33. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  34. package/dist/control/ToggleTheme.svelte +13 -11
  35. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  36. package/dist/control/Video.svelte +57 -29
  37. package/dist/control/Video.svelte.d.ts +1 -0
  38. package/dist/control/css/btn.css +200 -152
  39. package/dist/control/css/fab.css +84 -0
  40. package/dist/control/css/image.css +56 -0
  41. package/dist/control/css/media.css +95 -30
  42. package/dist/control/css/toggle-group.css +253 -84
  43. package/dist/control/css/video.css +1 -14
  44. package/dist/css/animations.css +5 -9
  45. package/dist/css/base.css +13 -347
  46. package/dist/css/decorations.css +561 -0
  47. package/dist/css/rich-text.css +485 -0
  48. package/dist/css/transitions.css +158 -0
  49. package/dist/css/typography.css +291 -0
  50. package/dist/css/utilities.css +0 -4
  51. package/dist/display/Accordion.svelte +28 -4
  52. package/dist/display/Accordion.svelte.d.ts +2 -1
  53. package/dist/display/Alert.svelte +32 -12
  54. package/dist/display/Alert.svelte.d.ts +2 -3
  55. package/dist/display/Avatar.svelte +23 -18
  56. package/dist/display/Avatar.svelte.d.ts +4 -1
  57. package/dist/display/AvatarGroup.svelte +20 -18
  58. package/dist/display/AvatarGroup.svelte.d.ts +6 -3
  59. package/dist/display/Badge.svelte +11 -4
  60. package/dist/display/Badge.svelte.d.ts +2 -1
  61. package/dist/display/Card.svelte +15 -14
  62. package/dist/display/Card.svelte.d.ts +2 -3
  63. package/dist/display/Carousel.svelte +130 -99
  64. package/dist/display/Carousel.svelte.d.ts +6 -4
  65. package/dist/display/ChatBox.svelte +245 -106
  66. package/dist/display/ChatBox.svelte.d.ts +32 -5
  67. package/dist/display/Chip.svelte +31 -17
  68. package/dist/display/Chip.svelte.d.ts +3 -2
  69. package/dist/display/Code.svelte +7 -4
  70. package/dist/display/Code.svelte.d.ts +1 -0
  71. package/dist/display/Collapsible.svelte +30 -4
  72. package/dist/display/Collapsible.svelte.d.ts +2 -1
  73. package/dist/display/Countdown.svelte +169 -0
  74. package/dist/display/Countdown.svelte.d.ts +21 -0
  75. package/dist/display/Empty.svelte +37 -3
  76. package/dist/display/Empty.svelte.d.ts +3 -0
  77. package/dist/display/Item.svelte +42 -11
  78. package/dist/display/Item.svelte.d.ts +4 -2
  79. package/dist/display/Map.svelte +488 -0
  80. package/dist/display/Map.svelte.d.ts +44 -0
  81. package/dist/display/Marquee.svelte +0 -2
  82. package/dist/display/Section.svelte +14 -12
  83. package/dist/display/Section.svelte.d.ts +2 -3
  84. package/dist/display/Skeleton.svelte +32 -0
  85. package/dist/display/Skeleton.svelte.d.ts +10 -0
  86. package/dist/display/Table.svelte +94 -132
  87. package/dist/display/Table.svelte.d.ts +10 -1
  88. package/dist/display/css/accordion.css +349 -52
  89. package/dist/display/css/alert.css +38 -18
  90. package/dist/display/css/avatar-group.css +38 -75
  91. package/dist/display/css/avatar.css +139 -121
  92. package/dist/display/css/badge.css +50 -27
  93. package/dist/display/css/card.css +123 -71
  94. package/dist/display/css/carousel.css +25 -5
  95. package/dist/display/css/chat-box.css +158 -26
  96. package/dist/display/css/chip.css +142 -68
  97. package/dist/display/css/code.css +2 -6
  98. package/dist/display/css/collapsible.css +349 -45
  99. package/dist/display/css/countdown.css +206 -0
  100. package/dist/display/css/divider.css +8 -6
  101. package/dist/display/css/empty.css +7 -0
  102. package/dist/display/css/item.css +330 -84
  103. package/dist/display/css/map.css +164 -0
  104. package/dist/display/css/marquee.css +0 -3
  105. package/dist/display/css/section.css +89 -65
  106. package/dist/display/css/skeleton.css +58 -0
  107. package/dist/display/css/table.css +309 -193
  108. package/dist/form/Checkbox.svelte +11 -5
  109. package/dist/form/Checkbox.svelte.d.ts +2 -1
  110. package/dist/form/ColorField.svelte +601 -0
  111. package/dist/form/ColorField.svelte.d.ts +29 -0
  112. package/dist/form/ComboBox.svelte +24 -9
  113. package/dist/form/ComboBox.svelte.d.ts +2 -2
  114. package/dist/form/CsvField.svelte +62 -136
  115. package/dist/form/CsvField.svelte.d.ts +2 -2
  116. package/dist/form/DateField.svelte +33 -15
  117. package/dist/form/DateField.svelte.d.ts +2 -1
  118. package/dist/form/DateRange.svelte +436 -0
  119. package/dist/form/DateRange.svelte.d.ts +24 -0
  120. package/dist/form/DragDrop.svelte +578 -0
  121. package/dist/form/DragDrop.svelte.d.ts +33 -0
  122. package/dist/form/Dropzone.svelte +28 -8
  123. package/dist/form/Dropzone.svelte.d.ts +2 -2
  124. package/dist/form/Editor.svelte +626 -0
  125. package/dist/form/Editor.svelte.d.ts +50 -0
  126. package/dist/form/ImageCropper.svelte +422 -61
  127. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  128. package/dist/form/{PasswordStrength.svelte → PasswordField.svelte} +58 -24
  129. package/dist/form/{PasswordStrength.svelte.d.ts → PasswordField.svelte.d.ts} +6 -5
  130. package/dist/form/PhoneField.svelte +26 -14
  131. package/dist/form/PhoneField.svelte.d.ts +4 -3
  132. package/dist/form/PinField.svelte +39 -31
  133. package/dist/form/PinField.svelte.d.ts +3 -3
  134. package/dist/form/RadioGroup.svelte +9 -5
  135. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  136. package/dist/form/Select.svelte +20 -19
  137. package/dist/form/Select.svelte.d.ts +2 -2
  138. package/dist/form/Slider.svelte +10 -4
  139. package/dist/form/Slider.svelte.d.ts +2 -1
  140. package/dist/form/TextField.svelte +29 -11
  141. package/dist/form/TextField.svelte.d.ts +5 -4
  142. package/dist/form/Textarea.svelte +15 -6
  143. package/dist/form/Textarea.svelte.d.ts +2 -2
  144. package/dist/form/Toggle.svelte +7 -3
  145. package/dist/form/Toggle.svelte.d.ts +1 -1
  146. package/dist/form/css/checkbox.css +18 -2
  147. package/dist/form/css/color-field.css +141 -0
  148. package/dist/form/css/control.css +193 -82
  149. package/dist/form/css/csv-field.css +221 -0
  150. package/dist/form/css/date-range.css +122 -0
  151. package/dist/form/css/date.css +24 -2
  152. package/dist/form/css/drag-drop.css +234 -0
  153. package/dist/form/css/dropzone.css +153 -34
  154. package/dist/form/css/editor.css +367 -0
  155. package/dist/form/css/field.css +4 -0
  156. package/dist/form/css/image-cropper.css +242 -20
  157. package/dist/form/css/radio-group.css +26 -1
  158. package/dist/form/css/select.css +2 -2
  159. package/dist/form/css/slider.css +37 -0
  160. package/dist/form/css/textarea.css +178 -75
  161. package/dist/form/css/toggle.css +15 -3
  162. package/dist/hooks/use-chat.svelte.js +1 -1
  163. package/dist/hooks/use-form.svelte.js +3 -3
  164. package/dist/hooks/use-search.svelte.js +0 -3
  165. package/dist/hooks/use-table.svelte.d.ts +1 -0
  166. package/dist/hooks/use-table.svelte.js +6 -0
  167. package/dist/icons/index.d.ts +34 -2
  168. package/dist/icons/index.js +36 -4
  169. package/dist/index.css +44 -49
  170. package/dist/index.d.ts +14 -4
  171. package/dist/index.js +13 -3
  172. package/dist/layout/AppBar.svelte +22 -14
  173. package/dist/layout/AppBar.svelte.d.ts +2 -1
  174. package/dist/layout/Footer.svelte +19 -11
  175. package/dist/layout/Footer.svelte.d.ts +2 -1
  176. package/dist/layout/Provider.svelte +32 -9
  177. package/dist/layout/Provider.svelte.d.ts +3 -1
  178. package/dist/layout/Sidebar.svelte +17 -8
  179. package/dist/layout/Sidebar.svelte.d.ts +2 -1
  180. package/dist/layout/css/app-bar.css +63 -66
  181. package/dist/layout/css/footer.css +62 -65
  182. package/dist/layout/css/sidebar.css +120 -59
  183. package/dist/navigation/BottomNav.svelte +51 -14
  184. package/dist/navigation/FooterGroup.svelte +1 -1
  185. package/dist/navigation/NavMenu.svelte +47 -23
  186. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  187. package/dist/navigation/Pagination.svelte +158 -0
  188. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  189. package/dist/navigation/SideNav.svelte +30 -25
  190. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  191. package/dist/navigation/Tabs.svelte +17 -7
  192. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  193. package/dist/navigation/css/bottom-nav.css +319 -257
  194. package/dist/navigation/css/footer-group.css +1 -1
  195. package/dist/navigation/css/footer-nav.css +1 -1
  196. package/dist/navigation/css/nav-menu.css +331 -106
  197. package/dist/navigation/css/pagination.css +74 -0
  198. package/dist/navigation/css/side-nav.css +514 -75
  199. package/dist/navigation/css/tabs.css +246 -52
  200. package/dist/overlay/AlertDialog.svelte +58 -0
  201. package/dist/overlay/AlertDialog.svelte.d.ts +14 -25
  202. package/dist/overlay/Command.svelte +347 -0
  203. package/dist/overlay/Command.svelte.d.ts +33 -25
  204. package/dist/overlay/Drawer.svelte +49 -21
  205. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  206. package/dist/overlay/Dropdown.svelte +3 -3
  207. package/dist/overlay/Modal.svelte +51 -16
  208. package/dist/overlay/Modal.svelte.d.ts +3 -3
  209. package/dist/overlay/Toast.svelte +41 -17
  210. package/dist/overlay/Toast.svelte.d.ts +1 -1
  211. package/dist/overlay/Tooltip.svelte +36 -27
  212. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  213. package/dist/overlay/css/command.css +68 -0
  214. package/dist/overlay/css/drawer.css +63 -24
  215. package/dist/overlay/css/dropdown.css +1 -1
  216. package/dist/overlay/css/hovercard.css +1 -1
  217. package/dist/overlay/css/modal.css +79 -27
  218. package/dist/overlay/css/toast.css +40 -24
  219. package/dist/overlay/css/tooltip.css +110 -67
  220. package/dist/stores/theme.svelte.js +44 -12
  221. package/dist/stores/toast.svelte.d.ts +4 -4
  222. package/dist/stores/toast.svelte.js +2 -2
  223. package/package.json +1 -1
  224. package/dist/utils/charts.d.ts +0 -27
  225. package/dist/utils/charts.js +0 -140
@@ -1,14 +1,14 @@
1
1
  <script lang="ts">
2
2
  import type { TableState } from '../hooks/use-table.svelte.js';
3
3
  import { cn } from '../utils/class-names.js';
4
- import { Empty, TextField, Select, Checkbox, Icon, Button } from '../index.js';
4
+ import { Empty, TextField, Select, Checkbox, Icon, Button, Pagination } from '../index.js';
5
5
  import type { Snippet } from 'svelte';
6
6
  import {
7
- ArrowLeft24RegularIcon,
8
- ArrowRight24RegularIcon,
9
7
  ArrowSortDownLines24RegularIcon,
10
- ArrowSortUpLines24RegularIcon
8
+ ArrowSortUpLines24RegularIcon,
9
+ Search24RegularIcon
11
10
  } from '../icons/index.js';
11
+ import IconButton from '../control/IconButton.svelte';
12
12
 
13
13
  const handleSort = (column: { field: string; sortable?: boolean }) => {
14
14
  if (!column.sortable) return;
@@ -17,15 +17,6 @@
17
17
  table.setSort(column.field, newOrder);
18
18
  };
19
19
 
20
- const getSortIcon = (field: string): string => {
21
- if (table.sortBy !== field) {
22
- return 'fluent:arrow-sort-down-lines-24-regular';
23
- }
24
- return table.sortOrder === 'ASC'
25
- ? 'fluent:arrow-sort-up-lines-24-regular'
26
- : 'fluent:arrow-sort-down-lines-24-regular';
27
- };
28
-
29
20
  const isColumnSorted = (field: string): boolean => {
30
21
  return table.sortBy === field;
31
22
  };
@@ -35,6 +26,7 @@
35
26
  isStriped?: boolean;
36
27
  isBordered?: boolean;
37
28
  hasDividers?: boolean;
29
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
38
30
  noDataTitle?: string;
39
31
  noDataDescription?: string;
40
32
  noDataType?: 'playlist' | 'result' | 'data' | 'template';
@@ -51,11 +43,19 @@
51
43
  totalLabel?: string;
52
44
  showToolbar?: boolean;
53
45
  toolbarClass?: string;
54
- showSelectionCount?: boolean;
46
+ hideSelectionCount?: boolean;
55
47
  selectionCountLabel?: string;
48
+ selectionClearLabel?: string;
56
49
  toolbarStart?: Snippet;
57
50
  toolbarEnd?: Snippet;
58
51
  selectionActions?: Snippet<[any[]]>;
52
+ emptyState?: Snippet;
53
+ onRowClick?: (row: any, index: number) => void;
54
+ rowClass?: (row: any, index: number) => string;
55
+ rootClass?: string;
56
+ containerClass?: string;
57
+ headerClass?: string;
58
+ bodyClass?: string;
59
59
  };
60
60
 
61
61
  const {
@@ -63,6 +63,7 @@
63
63
  isStriped,
64
64
  isBordered,
65
65
  hasDividers,
66
+ color = 'muted',
66
67
  noDataTitle = 'No data',
67
68
  noDataDescription = 'There are no records to display',
68
69
  noDataType = 'data',
@@ -79,11 +80,19 @@
79
80
  totalLabel = 'Total',
80
81
  showToolbar = false,
81
82
  toolbarClass,
82
- showSelectionCount = true,
83
+ hideSelectionCount,
83
84
  selectionCountLabel = 'selected',
85
+ selectionClearLabel = 'Clear selection',
84
86
  toolbarStart,
85
87
  toolbarEnd,
86
- selectionActions
88
+ selectionActions,
89
+ emptyState,
90
+ onRowClick,
91
+ rowClass,
92
+ rootClass,
93
+ containerClass,
94
+ headerClass,
95
+ bodyClass
87
96
  }: Props = $props();
88
97
 
89
98
  const tableSizes = {
@@ -92,10 +101,21 @@
92
101
  lg: 'is-lg'
93
102
  };
94
103
 
104
+ const tableColors = {
105
+ primary: 'is-primary',
106
+ secondary: 'is-secondary',
107
+ muted: 'is-muted',
108
+ success: 'is-success',
109
+ info: 'is-info',
110
+ danger: 'is-danger',
111
+ warning: 'is-warning'
112
+ };
113
+
95
114
  const shouldShowToolbar = $derived(showToolbar || showSearch || toolbarStart || toolbarEnd);
96
115
 
97
116
  const hasSelection = $derived(table.selectable && table.selectedRows.length > 0);
98
117
 
118
+ // svelte-ignore state_referenced_locally
99
119
  let searchValue = $state(table.search ?? '');
100
120
 
101
121
  const rowsPerPageSelectOptions = $derived(
@@ -125,47 +145,9 @@
125
145
  const handleRowSelectChange = (row: any) => {
126
146
  table.toggleRow(row);
127
147
  };
128
-
129
- const getPageNumbers = (current: number, total: number): (number | string)[] => {
130
- const pages: (number | string)[] = [];
131
- const delta = 1;
132
-
133
- if (total <= 7) {
134
- for (let i = 1; i <= total; i++) {
135
- pages.push(i);
136
- }
137
- } else {
138
- pages.push(1);
139
- const start = Math.max(2, current - delta);
140
- const end = Math.min(total - 1, current + delta);
141
-
142
- if (start > 2) {
143
- pages.push('...');
144
- }
145
- for (let i = start; i <= end; i++) {
146
- pages.push(i);
147
- }
148
-
149
- if (end < total - 1) {
150
- pages.push('...');
151
- }
152
- pages.push(total);
153
- }
154
- return pages;
155
- };
156
-
157
- const pageNumbers = $derived(
158
- showPagination && table.page && table.totalPages
159
- ? getPageNumbers(table.page, table.totalPages)
160
- : []
161
- );
162
148
  </script>
163
149
 
164
- {#snippet InputIcon()}
165
- <SearchIcon class="control-icon" />
166
- {/snippet}
167
-
168
- <div class="table-wrapper">
150
+ <div class={cn('table-wrapper', rootClass)}>
169
151
  {#if shouldShowToolbar}
170
152
  <div class={cn('table-toolbar', toolbarClass)}>
171
153
  <div class="table-toolbar-start">
@@ -173,11 +155,11 @@
173
155
  <TextField
174
156
  value={searchValue}
175
157
  placeholder={searchPlaceholder}
176
- prefix={InputIcon}
158
+ startIcon={Search24RegularIcon}
177
159
  variant="outlined"
178
160
  size="sm"
179
161
  oninput={handleSearchInput}
180
- class="table-search"
162
+ rootClass="table-toolbar-search"
181
163
  />
182
164
  {/if}
183
165
  {#if toolbarStart}
@@ -194,17 +176,17 @@
194
176
  {/if}
195
177
 
196
178
  {#if hasSelection}
197
- <div class="table-selection-bar">
179
+ <div class={cn('table-selection-bar', tableColors[color])}>
198
180
  <div class="table-selection-info">
199
- {#if showSelectionCount}
181
+ {#if !hideSelectionCount}
200
182
  <span class="table-selection-count">
201
183
  {table.selectedRows.length}
202
184
  {selectionCountLabel}
203
185
  </span>
204
186
  {/if}
205
- <button type="button" class="table-selection-clear" onclick={() => table.clearSelection()}>
206
- Clear selection
207
- </button>
187
+ <Button variant="ghost" {color} size="sm" onclick={() => table.clearSelection()}>
188
+ {selectionClearLabel}
189
+ </Button>
208
190
  </div>
209
191
  {#if selectionActions}
210
192
  <div class="table-selection-actions">
@@ -214,17 +196,18 @@
214
196
  </div>
215
197
  {/if}
216
198
 
217
- <div class="table-container">
199
+ <div class={cn('table-container', containerClass)}>
218
200
  <table
219
201
  class={cn(
220
202
  'table',
221
203
  tableSizes[size],
222
204
  isStriped && 'is-striped',
223
205
  isBordered && 'is-bordered',
224
- hasDividers && 'has-dividers'
206
+ hasDividers && 'has-dividers',
207
+ color && tableColors[color]
225
208
  )}
226
209
  >
227
- <thead class="table-header">
210
+ <thead class={cn('table-header', headerClass)}>
228
211
  <tr>
229
212
  {#if table.selectable}
230
213
  <th class="table-head table-checkbox-cell" style="width: 48px;">
@@ -232,6 +215,7 @@
232
215
  checked={table.isAllSelected}
233
216
  onchange={handleSelectAllChange}
234
217
  class={cn('table-checkbox', table.isIndeterminate && 'is-indeterminate')}
218
+ isMuted
235
219
  />
236
220
  </th>
237
221
  {/if}
@@ -252,27 +236,24 @@
252
236
  >
253
237
  <span class="table-head-label">{column.label}</span>
254
238
  {#if column.sortable}
255
- <Button
239
+ <IconButton
240
+ icon={table.sortBy !== column.field
241
+ ? ArrowSortDownLines24RegularIcon
242
+ : table.sortOrder === 'ASC'
243
+ ? ArrowSortUpLines24RegularIcon
244
+ : ArrowSortDownLines24RegularIcon}
256
245
  variant="ghost"
246
+ {color}
257
247
  size="xs"
258
248
  onclick={() => handleSort(column)}
259
- class="table-sort-btn {isColumnSorted(column.field) ? 'is-active' : ''}"
260
- >
261
- {#if table.sortBy !== column.field}
262
- <Icon icon={ArrowSortDownLines24RegularIcon} />
263
- {:else if table.sortOrder === 'ASC'}
264
- <Icon icon={ArrowSortUpLines24RegularIcon} />
265
- {:else}
266
- <Icon icon={ArrowSortDownLines24RegularIcon} />
267
- {/if}
268
- </Button>
249
+ />
269
250
  {/if}
270
251
  </div>
271
252
  </th>
272
253
  {/each}
273
254
  </tr>
274
255
  </thead>
275
- <tbody class="table-body">
256
+ <tbody class={cn('table-body', bodyClass)}>
276
257
  {#if table.isLoading}
277
258
  {#each Array(loadingRows) as _, index}
278
259
  <tr class="table-loading-row">
@@ -288,26 +269,39 @@
288
269
  {/each}
289
270
  </tr>
290
271
  {/each}
291
- {:else if table.data.length === 0}
272
+ {:else if table.hasInitialized && table.data.length === 0}
292
273
  <tr class="table-empty-row">
293
274
  <td
294
275
  colspan={table.selectable ? table.columns.length + 1 : table.columns.length}
295
276
  class="table-empty-cell"
296
277
  >
297
- <div class="empty-state">
298
- <div class="empty-icon">
299
- <Empty type={noDataType} />
300
- </div>
301
- <div class="empty-content">
302
- <h3 class="empty-title">{noDataTitle}</h3>
303
- <p class="empty-description">{noDataDescription}</p>
278
+ {#if emptyState}
279
+ {@render emptyState()}
280
+ {:else}
281
+ <div class="empty-state">
282
+ <div class="empty-icon">
283
+ <Empty type={noDataType} />
284
+ </div>
285
+ <div class="empty-content">
286
+ <h3 class="empty-title">{noDataTitle}</h3>
287
+ <p class="empty-description">{noDataDescription}</p>
288
+ </div>
304
289
  </div>
305
- </div>
290
+ {/if}
306
291
  </td>
307
292
  </tr>
308
293
  {:else}
309
294
  {#each table.data as item, index}
310
- <tr class:table-row-selected={table.selectable && table.isRowSelected(item)}>
295
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
296
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
297
+ <tr
298
+ class={cn(
299
+ table.selectable && table.isRowSelected(item) && 'table-row-selected',
300
+ onRowClick && 'is-clickable',
301
+ rowClass?.(item, index)
302
+ )}
303
+ onclick={onRowClick ? () => onRowClick(item, index) : undefined}
304
+ >
311
305
  {#if table.selectable}
312
306
  <td class="table-checkbox-cell">
313
307
  <Checkbox
@@ -351,7 +345,6 @@
351
345
  onchange={handleRowsPerPageChange}
352
346
  variant="outlined"
353
347
  size="sm"
354
- class="table-rows-per-page-select"
355
348
  />
356
349
  </div>
357
350
  {/if}
@@ -359,49 +352,18 @@
359
352
  {/if}
360
353
 
361
354
  {#if showPagination && table.totalPages && table.totalPages > 1 && !table.isLoading}
362
- <div
363
- class="pagination-container"
364
- style="justify-content: {paginationAlign === 'start'
365
- ? 'flex-start'
366
- : paginationAlign === 'end'
367
- ? 'flex-end'
368
- : 'center'}"
369
- >
370
- <div class="pagination">
371
- <button
372
- class="pagination-btn"
373
- onclick={() => table.prevPage?.()}
374
- disabled={!table.hasPrevPage}
375
- aria-label="Previous page"
376
- >
377
- <Icon icon={ArrowLeft24RegularIcon} />
378
- </button>
379
-
380
- {#each pageNumbers as pageNum}
381
- {#if pageNum === '...'}
382
- <span class="pagination-ellipsis">...</span>
383
- {:else}
384
- <button
385
- class="pagination-btn"
386
- class:active={pageNum === table.page}
387
- onclick={() => table.goToPage?.(pageNum as number)}
388
- aria-label="Page {pageNum}"
389
- aria-current={pageNum === table.page ? 'page' : undefined}
390
- >
391
- {pageNum}
392
- </button>
393
- {/if}
394
- {/each}
395
-
396
- <button
397
- class="pagination-btn"
398
- onclick={() => table.nextPage?.()}
399
- disabled={!table.hasNextPage}
400
- aria-label="Next page"
401
- >
402
- <Icon icon={ArrowRight24RegularIcon} />
403
- </button>
404
- </div>
405
- </div>
355
+ <Pagination
356
+ page={table.page ?? 1}
357
+ totalPages={table.totalPages}
358
+ onPrev={() => table.prevPage?.()}
359
+ onNext={() => table.nextPage?.()}
360
+ onPageChange={(p) => table.goToPage?.(p)}
361
+ hasPrevPage={table.hasPrevPage}
362
+ hasNextPage={table.hasNextPage}
363
+ align={paginationAlign}
364
+ variant="soft"
365
+ {color}
366
+ {size}
367
+ />
406
368
  {/if}
407
369
  </div>
@@ -5,6 +5,7 @@ type Props = {
5
5
  isStriped?: boolean;
6
6
  isBordered?: boolean;
7
7
  hasDividers?: boolean;
8
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
8
9
  noDataTitle?: string;
9
10
  noDataDescription?: string;
10
11
  noDataType?: 'playlist' | 'result' | 'data' | 'template';
@@ -21,11 +22,19 @@ type Props = {
21
22
  totalLabel?: string;
22
23
  showToolbar?: boolean;
23
24
  toolbarClass?: string;
24
- showSelectionCount?: boolean;
25
+ hideSelectionCount?: boolean;
25
26
  selectionCountLabel?: string;
27
+ selectionClearLabel?: string;
26
28
  toolbarStart?: Snippet;
27
29
  toolbarEnd?: Snippet;
28
30
  selectionActions?: Snippet<[any[]]>;
31
+ emptyState?: Snippet;
32
+ onRowClick?: (row: any, index: number) => void;
33
+ rowClass?: (row: any, index: number) => string;
34
+ rootClass?: string;
35
+ containerClass?: string;
36
+ headerClass?: string;
37
+ bodyClass?: string;
29
38
  };
30
39
  declare const Table: import("svelte").Component<Props, {}, "">;
31
40
  type Table = ReturnType<typeof Table>;