ui-svelte 0.1.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 (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/dist/charts/ArcChart.svelte +320 -0
  4. package/dist/charts/ArcChart.svelte.d.ts +26 -0
  5. package/dist/charts/AreaChart.svelte +495 -0
  6. package/dist/charts/AreaChart.svelte.d.ts +32 -0
  7. package/dist/charts/BarChart.svelte +504 -0
  8. package/dist/charts/BarChart.svelte.d.ts +38 -0
  9. package/dist/charts/Candlestick.svelte +527 -0
  10. package/dist/charts/Candlestick.svelte.d.ts +38 -0
  11. package/dist/charts/LineChart.svelte +365 -0
  12. package/dist/charts/LineChart.svelte.d.ts +36 -0
  13. package/dist/charts/PieChart.svelte +311 -0
  14. package/dist/charts/PieChart.svelte.d.ts +28 -0
  15. package/dist/charts/css/arc-chart.css +237 -0
  16. package/dist/charts/css/area-chart.css +289 -0
  17. package/dist/charts/css/bar-chart.css +167 -0
  18. package/dist/charts/css/candlestick.css +197 -0
  19. package/dist/charts/css/line-chart.css +202 -0
  20. package/dist/charts/css/pie-chart.css +199 -0
  21. package/dist/control/Audio.svelte +212 -0
  22. package/dist/control/Audio.svelte.d.ts +8 -0
  23. package/dist/control/Button.svelte +116 -0
  24. package/dist/control/Button.svelte.d.ts +22 -0
  25. package/dist/control/IconButton.svelte +104 -0
  26. package/dist/control/IconButton.svelte.d.ts +17 -0
  27. package/dist/control/Record.svelte +430 -0
  28. package/dist/control/Record.svelte.d.ts +11 -0
  29. package/dist/control/ToggleTheme.svelte +21 -0
  30. package/dist/control/ToggleTheme.svelte.d.ts +8 -0
  31. package/dist/control/Video.svelte +222 -0
  32. package/dist/control/Video.svelte.d.ts +10 -0
  33. package/dist/control/css/btn.css +206 -0
  34. package/dist/control/css/media.css +78 -0
  35. package/dist/control/css/video.css +58 -0
  36. package/dist/css/animations.css +27 -0
  37. package/dist/css/base.css +192 -0
  38. package/dist/css/utilities.css +136 -0
  39. package/dist/display/Accordion.svelte +98 -0
  40. package/dist/display/Accordion.svelte.d.ts +20 -0
  41. package/dist/display/Alert.svelte +65 -0
  42. package/dist/display/Alert.svelte.d.ts +15 -0
  43. package/dist/display/Avatar.svelte +80 -0
  44. package/dist/display/Avatar.svelte.d.ts +13 -0
  45. package/dist/display/Badge.svelte +46 -0
  46. package/dist/display/Badge.svelte.d.ts +11 -0
  47. package/dist/display/Card.svelte +94 -0
  48. package/dist/display/Card.svelte.d.ts +21 -0
  49. package/dist/display/Carousel.svelte +359 -0
  50. package/dist/display/Carousel.svelte.d.ts +25 -0
  51. package/dist/display/ChatBox.svelte +249 -0
  52. package/dist/display/ChatBox.svelte.d.ts +18 -0
  53. package/dist/display/Chip.svelte +67 -0
  54. package/dist/display/Chip.svelte.d.ts +17 -0
  55. package/dist/display/Code.svelte +56 -0
  56. package/dist/display/Code.svelte.d.ts +9 -0
  57. package/dist/display/Collapsible.svelte +71 -0
  58. package/dist/display/Collapsible.svelte.d.ts +15 -0
  59. package/dist/display/Divider.svelte +32 -0
  60. package/dist/display/Divider.svelte.d.ts +10 -0
  61. package/dist/display/Empty.svelte +462 -0
  62. package/dist/display/Empty.svelte.d.ts +11 -0
  63. package/dist/display/Icon.svelte +20 -0
  64. package/dist/display/Icon.svelte.d.ts +11 -0
  65. package/dist/display/Item.svelte +119 -0
  66. package/dist/display/Item.svelte.d.ts +24 -0
  67. package/dist/display/Loading.svelte +8 -0
  68. package/dist/display/Loading.svelte.d.ts +26 -0
  69. package/dist/display/Marquee.svelte +164 -0
  70. package/dist/display/Marquee.svelte.d.ts +21 -0
  71. package/dist/display/Section.svelte +63 -0
  72. package/dist/display/Section.svelte.d.ts +16 -0
  73. package/dist/display/Table.svelte +407 -0
  74. package/dist/display/Table.svelte.d.ts +32 -0
  75. package/dist/display/TypeWriter.svelte +23 -0
  76. package/dist/display/TypeWriter.svelte.d.ts +11 -0
  77. package/dist/display/User.svelte +0 -0
  78. package/dist/display/User.svelte.d.ts +26 -0
  79. package/dist/display/css/accordion.css +98 -0
  80. package/dist/display/css/alert.css +51 -0
  81. package/dist/display/css/avatar.css +158 -0
  82. package/dist/display/css/badge.css +47 -0
  83. package/dist/display/css/card.css +231 -0
  84. package/dist/display/css/carousel.css +156 -0
  85. package/dist/display/css/chat-box.css +188 -0
  86. package/dist/display/css/chip.css +91 -0
  87. package/dist/display/css/code.css +19 -0
  88. package/dist/display/css/collapsible.css +86 -0
  89. package/dist/display/css/divider.css +54 -0
  90. package/dist/display/css/empty.css +8 -0
  91. package/dist/display/css/item.css +149 -0
  92. package/dist/display/css/listbox.css +24 -0
  93. package/dist/display/css/marquee.css +138 -0
  94. package/dist/display/css/section.css +85 -0
  95. package/dist/display/css/table.css +361 -0
  96. package/dist/form/Checkbox.svelte +45 -0
  97. package/dist/form/Checkbox.svelte.d.ts +13 -0
  98. package/dist/form/ComboBox.svelte +448 -0
  99. package/dist/form/ComboBox.svelte.d.ts +29 -0
  100. package/dist/form/CsvField.svelte +389 -0
  101. package/dist/form/CsvField.svelte.d.ts +21 -0
  102. package/dist/form/DateField.svelte +292 -0
  103. package/dist/form/DateField.svelte.d.ts +18 -0
  104. package/dist/form/Dropzone.svelte +196 -0
  105. package/dist/form/Dropzone.svelte.d.ts +30 -0
  106. package/dist/form/ImageCropper.svelte +254 -0
  107. package/dist/form/ImageCropper.svelte.d.ts +14 -0
  108. package/dist/form/PasswordField.svelte +170 -0
  109. package/dist/form/PasswordField.svelte.d.ts +28 -0
  110. package/dist/form/PhoneField.svelte +485 -0
  111. package/dist/form/PhoneField.svelte.d.ts +25 -0
  112. package/dist/form/PinField.svelte +139 -0
  113. package/dist/form/PinField.svelte.d.ts +17 -0
  114. package/dist/form/RadioGroup.svelte +70 -0
  115. package/dist/form/RadioGroup.svelte.d.ts +19 -0
  116. package/dist/form/Select.svelte +350 -0
  117. package/dist/form/Select.svelte.d.ts +26 -0
  118. package/dist/form/Slider.svelte +60 -0
  119. package/dist/form/Slider.svelte.d.ts +15 -0
  120. package/dist/form/TextField.svelte +154 -0
  121. package/dist/form/TextField.svelte.d.ts +31 -0
  122. package/dist/form/Textarea.svelte +137 -0
  123. package/dist/form/Textarea.svelte.d.ts +27 -0
  124. package/dist/form/Toggle.svelte +45 -0
  125. package/dist/form/Toggle.svelte.d.ts +13 -0
  126. package/dist/form/css/checkbox.css +46 -0
  127. package/dist/form/css/combo-box.css +69 -0
  128. package/dist/form/css/control.css +177 -0
  129. package/dist/form/css/csv-field.css +0 -0
  130. package/dist/form/css/date.css +56 -0
  131. package/dist/form/css/dropzone.css +133 -0
  132. package/dist/form/css/field.css +17 -0
  133. package/dist/form/css/image-cropper.css +155 -0
  134. package/dist/form/css/password.css +35 -0
  135. package/dist/form/css/radio-group.css +57 -0
  136. package/dist/form/css/select.css +18 -0
  137. package/dist/form/css/slider.css +80 -0
  138. package/dist/form/css/textarea.css +130 -0
  139. package/dist/form/css/toggle.css +27 -0
  140. package/dist/form/js/countries.d.ts +13 -0
  141. package/dist/form/js/countries.js +307 -0
  142. package/dist/form/js/phone-examples.d.ts +248 -0
  143. package/dist/form/js/phone-examples.js +247 -0
  144. package/dist/hooks/use-auth.svelte.d.ts +11 -0
  145. package/dist/hooks/use-auth.svelte.js +59 -0
  146. package/dist/hooks/use-chat.svelte.d.ts +40 -0
  147. package/dist/hooks/use-chat.svelte.js +265 -0
  148. package/dist/hooks/use-clipboard.svelte.d.ts +9 -0
  149. package/dist/hooks/use-clipboard.svelte.js +52 -0
  150. package/dist/hooks/use-fetch.svelte.d.ts +11 -0
  151. package/dist/hooks/use-fetch.svelte.js +38 -0
  152. package/dist/hooks/use-form.svelte.d.ts +31 -0
  153. package/dist/hooks/use-form.svelte.js +110 -0
  154. package/dist/hooks/use-localstorage.svelte.d.ts +3 -0
  155. package/dist/hooks/use-localstorage.svelte.js +26 -0
  156. package/dist/hooks/use-scroll.svelte.d.ts +6 -0
  157. package/dist/hooks/use-scroll.svelte.js +34 -0
  158. package/dist/hooks/use-search.svelte.d.ts +49 -0
  159. package/dist/hooks/use-search.svelte.js +229 -0
  160. package/dist/hooks/use-table.svelte.d.ts +85 -0
  161. package/dist/hooks/use-table.svelte.js +362 -0
  162. package/dist/hooks/use-websocket.svelte.d.ts +18 -0
  163. package/dist/hooks/use-websocket.svelte.js +79 -0
  164. package/dist/icons/index.d.ts +132 -0
  165. package/dist/icons/index.js +132 -0
  166. package/dist/index.css +115 -0
  167. package/dist/index.d.ts +76 -0
  168. package/dist/index.js +76 -0
  169. package/dist/layout/AppBar.svelte +94 -0
  170. package/dist/layout/AppBar.svelte.d.ts +17 -0
  171. package/dist/layout/Footer.svelte +94 -0
  172. package/dist/layout/Footer.svelte.d.ts +17 -0
  173. package/dist/layout/FooterLinks.svelte +28 -0
  174. package/dist/layout/FooterLinks.svelte.d.ts +11 -0
  175. package/dist/layout/Provider.svelte +52 -0
  176. package/dist/layout/Provider.svelte.d.ts +10 -0
  177. package/dist/layout/Scaffold.svelte +46 -0
  178. package/dist/layout/Scaffold.svelte.d.ts +15 -0
  179. package/dist/layout/Sidebar.svelte +40 -0
  180. package/dist/layout/Sidebar.svelte.d.ts +13 -0
  181. package/dist/layout/css/app-bar.css +35 -0
  182. package/dist/layout/css/bottom-bar.css +12 -0
  183. package/dist/layout/css/footer-links.css +17 -0
  184. package/dist/layout/css/footer.css +35 -0
  185. package/dist/layout/css/scaffold.css +15 -0
  186. package/dist/layout/css/sidebar.css +17 -0
  187. package/dist/navigation/BottomNav.svelte +0 -0
  188. package/dist/navigation/BottomNav.svelte.d.ts +26 -0
  189. package/dist/navigation/NavMenu.svelte +254 -0
  190. package/dist/navigation/SideNav.svelte +249 -0
  191. package/dist/navigation/Tabs.svelte +79 -0
  192. package/dist/navigation/Tabs.svelte.d.ts +19 -0
  193. package/dist/navigation/css/bottom-nav.css +0 -0
  194. package/dist/navigation/css/nav-menu.css +168 -0
  195. package/dist/navigation/css/side-nav.css +244 -0
  196. package/dist/navigation/css/tabs.css +118 -0
  197. package/dist/overlay/AlertDialog.svelte +0 -0
  198. package/dist/overlay/AlertDialog.svelte.d.ts +26 -0
  199. package/dist/overlay/Command.svelte +0 -0
  200. package/dist/overlay/Command.svelte.d.ts +26 -0
  201. package/dist/overlay/Drawer.svelte +129 -0
  202. package/dist/overlay/Drawer.svelte.d.ts +20 -0
  203. package/dist/overlay/Dropdown.svelte +140 -0
  204. package/dist/overlay/Modal.svelte +102 -0
  205. package/dist/overlay/Modal.svelte.d.ts +19 -0
  206. package/dist/overlay/PopoverStack.svelte +0 -0
  207. package/dist/overlay/PopoverStack.svelte.d.ts +26 -0
  208. package/dist/overlay/Toast.svelte +83 -0
  209. package/dist/overlay/Toast.svelte.d.ts +9 -0
  210. package/dist/overlay/Tooltip.svelte +140 -0
  211. package/dist/overlay/Tooltip.svelte.d.ts +12 -0
  212. package/dist/overlay/css/drawer.css +75 -0
  213. package/dist/overlay/css/dropdown.css +24 -0
  214. package/dist/overlay/css/hovercard.css +11 -0
  215. package/dist/overlay/css/modal.css +51 -0
  216. package/dist/overlay/css/toast.css +80 -0
  217. package/dist/overlay/css/tooltip.css +89 -0
  218. package/dist/stores/i18n.svelte.d.ts +16 -0
  219. package/dist/stores/i18n.svelte.js +137 -0
  220. package/dist/stores/theme.svelte.d.ts +5 -0
  221. package/dist/stores/theme.svelte.js +55 -0
  222. package/dist/stores/toast.svelte.d.ts +19 -0
  223. package/dist/stores/toast.svelte.js +38 -0
  224. package/dist/types.d.ts +75 -0
  225. package/dist/types.js +1 -0
  226. package/dist/utils/charts.d.ts +27 -0
  227. package/dist/utils/charts.js +140 -0
  228. package/dist/utils/class-names.d.ts +1 -0
  229. package/dist/utils/class-names.js +3 -0
  230. package/dist/utils/click-outside.d.ts +3 -0
  231. package/dist/utils/click-outside.js +9 -0
  232. package/dist/utils/popover.d.ts +3 -0
  233. package/dist/utils/popover.js +17 -0
  234. package/dist/utils/ulid.d.ts +1 -0
  235. package/dist/utils/ulid.js +22 -0
  236. package/dist/utils/validate-schema.d.ts +2 -0
  237. package/dist/utils/validate-schema.js +97 -0
  238. package/package.json +69 -0
@@ -0,0 +1,362 @@
1
+ export const useTable = (config) => {
2
+ const isManualMode = !!config.data;
3
+ let allData = $state(config.data ?? []);
4
+ let data = $state([]);
5
+ let total = $state(0);
6
+ let page = $state(config.initialPage ?? 1);
7
+ let pageSize = $state(config.initialPageSize ?? 10);
8
+ let sortBy = $state(config.initialSortBy);
9
+ let sortOrder = $state(config.initialSortOrder ?? 'ASC');
10
+ let search = $state(config.initialSearch ?? '');
11
+ let isLoading = $state(false);
12
+ let error = $state(null);
13
+ const selectable = config.selectable ?? false;
14
+ const rowKey = config.rowKey ?? 'id';
15
+ let selectedKeys = $state(new Set());
16
+ let debounceTimeout;
17
+ const getRowKey = (row) => {
18
+ return row[rowKey];
19
+ };
20
+ const selectedRows = $derived.by(() => {
21
+ if (!selectable)
22
+ return [];
23
+ return data.filter((row) => selectedKeys.has(getRowKey(row)));
24
+ });
25
+ const isAllSelected = $derived.by(() => {
26
+ if (!selectable || data.length === 0)
27
+ return false;
28
+ return data.every((row) => selectedKeys.has(getRowKey(row)));
29
+ });
30
+ const isIndeterminate = $derived.by(() => {
31
+ if (!selectable || data.length === 0)
32
+ return false;
33
+ const someSelected = data.some((row) => selectedKeys.has(getRowKey(row)));
34
+ return someSelected && !isAllSelected;
35
+ });
36
+ const buildUrl = () => {
37
+ if (!config.url)
38
+ return '';
39
+ const url = config.url;
40
+ if (!config.queryParams) {
41
+ return url;
42
+ }
43
+ const params = new URLSearchParams();
44
+ const tableParams = {
45
+ page,
46
+ pageSize,
47
+ sortBy,
48
+ sortOrder,
49
+ search,
50
+ offset: (page - 1) * pageSize,
51
+ limit: pageSize
52
+ };
53
+ const customParams = config.queryParams(tableParams);
54
+ Object.entries(customParams).forEach(([key, value]) => {
55
+ if (value !== undefined && value !== null && value !== '') {
56
+ params.append(key, value);
57
+ }
58
+ });
59
+ return `${url}?${params.toString()}`;
60
+ };
61
+ const processClientSideData = () => {
62
+ let processedData = [...allData];
63
+ if (search) {
64
+ processedData = processedData.filter((item) => {
65
+ return config.columns.some((column) => {
66
+ const value = item[column.field];
67
+ return String(value).toLowerCase().includes(search.toLowerCase());
68
+ });
69
+ });
70
+ }
71
+ if (sortBy) {
72
+ processedData.sort((a, b) => {
73
+ const aVal = a[sortBy];
74
+ const bVal = b[sortBy];
75
+ if (aVal === bVal)
76
+ return 0;
77
+ const comparison = aVal > bVal ? 1 : -1;
78
+ return sortOrder === 'ASC' ? comparison : -comparison;
79
+ });
80
+ }
81
+ total = processedData.length;
82
+ const startIndex = (page - 1) * pageSize;
83
+ const endIndex = startIndex + pageSize;
84
+ data = processedData.slice(startIndex, endIndex);
85
+ };
86
+ const fetchData = async () => {
87
+ if (isManualMode) {
88
+ processClientSideData();
89
+ return;
90
+ }
91
+ isLoading = true;
92
+ error = null;
93
+ try {
94
+ const response = await fetch(buildUrl(), {
95
+ method: 'GET',
96
+ headers: {
97
+ 'Content-Type': 'application/json',
98
+ ...config.headers
99
+ }
100
+ });
101
+ if (!response.ok) {
102
+ throw new Error(`HTTP error! status: ${response.status}`);
103
+ }
104
+ const result = await response.json();
105
+ const tableParams = {
106
+ page,
107
+ pageSize,
108
+ sortBy,
109
+ sortOrder,
110
+ search,
111
+ offset: (page - 1) * pageSize,
112
+ limit: pageSize
113
+ };
114
+ const paginatedData = config.parseResponse
115
+ ? config.parseResponse(result, tableParams)
116
+ : result;
117
+ data = paginatedData.data;
118
+ total = paginatedData.total;
119
+ if (paginatedData.page !== undefined)
120
+ page = paginatedData.page;
121
+ if (paginatedData.pageSize !== undefined)
122
+ pageSize = paginatedData.pageSize;
123
+ config.onSuccess?.(paginatedData);
124
+ }
125
+ catch (err) {
126
+ error = err;
127
+ config.onError?.(err);
128
+ }
129
+ finally {
130
+ isLoading = false;
131
+ }
132
+ };
133
+ const debouncedFetch = () => {
134
+ if (config.debounceSearch && config.debounceSearch > 0) {
135
+ clearTimeout(debounceTimeout);
136
+ debounceTimeout = setTimeout(() => {
137
+ fetchData();
138
+ }, config.debounceSearch);
139
+ }
140
+ else {
141
+ fetchData();
142
+ }
143
+ };
144
+ $effect(() => {
145
+ if (isManualMode) {
146
+ page;
147
+ pageSize;
148
+ sortBy;
149
+ sortOrder;
150
+ search;
151
+ allData;
152
+ processClientSideData();
153
+ }
154
+ else {
155
+ page;
156
+ pageSize;
157
+ sortBy;
158
+ sortOrder;
159
+ search;
160
+ debouncedFetch();
161
+ }
162
+ return () => {
163
+ clearTimeout(debounceTimeout);
164
+ };
165
+ });
166
+ $effect(() => {
167
+ if (selectable && config.onSelectionChange) {
168
+ config.onSelectionChange(selectedRows);
169
+ }
170
+ });
171
+ const setPage = (newPage) => {
172
+ page = newPage;
173
+ };
174
+ const setPageSize = (newPageSize) => {
175
+ pageSize = newPageSize;
176
+ page = 1;
177
+ };
178
+ const setSort = (column, order) => {
179
+ sortBy = column;
180
+ sortOrder = order ?? (sortBy === column && sortOrder === 'ASC' ? 'DESC' : 'ASC');
181
+ };
182
+ const setSearch = (query) => {
183
+ search = query;
184
+ page = 1;
185
+ };
186
+ const updateData = (newData) => {
187
+ allData = newData;
188
+ page = 1;
189
+ };
190
+ const refresh = () => {
191
+ if (isManualMode) {
192
+ processClientSideData();
193
+ }
194
+ else {
195
+ fetchData();
196
+ }
197
+ };
198
+ const reset = () => {
199
+ page = config.initialPage ?? 1;
200
+ pageSize = config.initialPageSize ?? 10;
201
+ sortBy = config.initialSortBy;
202
+ sortOrder = config.initialSortOrder ?? 'ASC';
203
+ search = config.initialSearch ?? '';
204
+ selectedKeys = new Set();
205
+ };
206
+ const nextPage = () => {
207
+ if (page < Math.ceil(total / pageSize)) {
208
+ page++;
209
+ }
210
+ };
211
+ const prevPage = () => {
212
+ if (page > 1) {
213
+ page--;
214
+ }
215
+ };
216
+ const goToPage = (targetPage) => {
217
+ const maxPages = Math.ceil(total / pageSize);
218
+ if (targetPage >= 1 && targetPage <= maxPages) {
219
+ page = targetPage;
220
+ }
221
+ };
222
+ const selectRow = (row) => {
223
+ if (!selectable)
224
+ return;
225
+ const key = getRowKey(row);
226
+ selectedKeys = new Set(selectedKeys).add(key);
227
+ };
228
+ const deselectRow = (row) => {
229
+ if (!selectable)
230
+ return;
231
+ const key = getRowKey(row);
232
+ const newSet = new Set(selectedKeys);
233
+ newSet.delete(key);
234
+ selectedKeys = newSet;
235
+ };
236
+ const toggleRow = (row) => {
237
+ if (!selectable)
238
+ return;
239
+ const key = getRowKey(row);
240
+ if (selectedKeys.has(key)) {
241
+ deselectRow(row);
242
+ }
243
+ else {
244
+ selectRow(row);
245
+ }
246
+ };
247
+ const selectAll = () => {
248
+ if (!selectable)
249
+ return;
250
+ const newSet = new Set(selectedKeys);
251
+ data.forEach((row) => {
252
+ newSet.add(getRowKey(row));
253
+ });
254
+ selectedKeys = newSet;
255
+ };
256
+ const deselectAll = () => {
257
+ if (!selectable)
258
+ return;
259
+ const newSet = new Set(selectedKeys);
260
+ data.forEach((row) => {
261
+ newSet.delete(getRowKey(row));
262
+ });
263
+ selectedKeys = newSet;
264
+ };
265
+ const toggleAll = () => {
266
+ if (!selectable)
267
+ return;
268
+ if (isAllSelected) {
269
+ deselectAll();
270
+ }
271
+ else {
272
+ selectAll();
273
+ }
274
+ };
275
+ const isRowSelected = (row) => {
276
+ if (!selectable)
277
+ return false;
278
+ return selectedKeys.has(getRowKey(row));
279
+ };
280
+ const clearSelection = () => {
281
+ if (!selectable)
282
+ return;
283
+ selectedKeys = new Set();
284
+ };
285
+ return {
286
+ get data() {
287
+ return data;
288
+ },
289
+ get total() {
290
+ return total;
291
+ },
292
+ get page() {
293
+ return page;
294
+ },
295
+ get pageSize() {
296
+ return pageSize;
297
+ },
298
+ get sortBy() {
299
+ return sortBy;
300
+ },
301
+ get sortOrder() {
302
+ return sortOrder;
303
+ },
304
+ get search() {
305
+ return search;
306
+ },
307
+ get isLoading() {
308
+ return isLoading;
309
+ },
310
+ get error() {
311
+ return error;
312
+ },
313
+ get totalPages() {
314
+ return Math.ceil(total / pageSize);
315
+ },
316
+ get hasNextPage() {
317
+ return page < Math.ceil(total / pageSize);
318
+ },
319
+ get hasPrevPage() {
320
+ return page > 1;
321
+ },
322
+ get columns() {
323
+ return config.columns;
324
+ },
325
+ get selectable() {
326
+ return selectable;
327
+ },
328
+ get rowKey() {
329
+ return rowKey;
330
+ },
331
+ get selectedRows() {
332
+ return selectedRows;
333
+ },
334
+ get selectedKeys() {
335
+ return selectedKeys;
336
+ },
337
+ get isAllSelected() {
338
+ return isAllSelected;
339
+ },
340
+ get isIndeterminate() {
341
+ return isIndeterminate;
342
+ },
343
+ setPage,
344
+ setPageSize,
345
+ setSort,
346
+ setSearch,
347
+ refresh,
348
+ reset,
349
+ nextPage,
350
+ prevPage,
351
+ goToPage,
352
+ updateData,
353
+ selectRow,
354
+ deselectRow,
355
+ toggleRow,
356
+ selectAll,
357
+ deselectAll,
358
+ toggleAll,
359
+ isRowSelected,
360
+ clearSelection
361
+ };
362
+ };
@@ -0,0 +1,18 @@
1
+ export interface WebSocketConfig {
2
+ url: string;
3
+ protocols?: string | string[];
4
+ reconnect?: boolean;
5
+ reconnectInterval?: number;
6
+ reconnectAttempts?: number;
7
+ onOpen?: (event: Event) => void;
8
+ onMessage?: (data: any) => void;
9
+ onError?: (error: string) => void;
10
+ onClose?: (event: CloseEvent) => void;
11
+ }
12
+ export declare const useWebSocket: (config: WebSocketConfig) => {
13
+ readonly isConnected: boolean;
14
+ readonly reconnectCount: number;
15
+ connect: () => void;
16
+ send: (data: any) => void;
17
+ close: (code?: number, reason?: string) => void;
18
+ };
@@ -0,0 +1,79 @@
1
+ export const useWebSocket = (config) => {
2
+ let ws = $state(null);
3
+ let isConnected = $state(false);
4
+ let reconnectCount = $state(0);
5
+ let reconnectTimeoutId = null;
6
+ const { url, protocols, reconnect = true, reconnectInterval = 3000, reconnectAttempts = 5 } = config;
7
+ const connect = () => {
8
+ try {
9
+ const token = localStorage.getItem('auth_token');
10
+ const wsUrl = token ? `${url}?token=${token}` : url;
11
+ ws = new WebSocket(wsUrl, protocols);
12
+ ws.onopen = (event) => {
13
+ isConnected = true;
14
+ reconnectCount = 0;
15
+ config.onOpen?.(event);
16
+ };
17
+ ws.onmessage = (event) => {
18
+ try {
19
+ const data = JSON.parse(event.data);
20
+ config.onMessage?.(data);
21
+ }
22
+ catch {
23
+ config.onMessage?.(event.data);
24
+ }
25
+ };
26
+ ws.onerror = () => {
27
+ config.onError?.('WebSocket error occurred');
28
+ };
29
+ ws.onclose = (event) => {
30
+ isConnected = false;
31
+ config.onClose?.(event);
32
+ if (reconnect && reconnectCount < reconnectAttempts) {
33
+ reconnectTimeoutId = window.setTimeout(() => {
34
+ reconnectCount++;
35
+ connect();
36
+ }, reconnectInterval);
37
+ }
38
+ };
39
+ }
40
+ catch (err) {
41
+ if (err instanceof Error) {
42
+ config.onError?.(err.message);
43
+ }
44
+ else {
45
+ config.onError?.(String(err));
46
+ }
47
+ }
48
+ };
49
+ const send = (data) => {
50
+ if (ws && isConnected) {
51
+ const message = typeof data === 'string' ? data : JSON.stringify(data);
52
+ ws.send(message);
53
+ }
54
+ else {
55
+ config.onError?.('WebSocket is not connected');
56
+ }
57
+ };
58
+ const close = (code, reason) => {
59
+ if (reconnectTimeoutId) {
60
+ clearTimeout(reconnectTimeoutId);
61
+ reconnectTimeoutId = null;
62
+ }
63
+ if (ws) {
64
+ ws.close(code, reason);
65
+ ws = null;
66
+ }
67
+ };
68
+ return {
69
+ get isConnected() {
70
+ return isConnected;
71
+ },
72
+ get reconnectCount() {
73
+ return reconnectCount;
74
+ },
75
+ connect,
76
+ send,
77
+ close
78
+ };
79
+ };
@@ -0,0 +1,132 @@
1
+ export declare const ArrowDown24RegularIcon: {
2
+ body: string;
3
+ viewbox: string;
4
+ };
5
+ export declare const ArrowLeft24RegularIcon: {
6
+ body: string;
7
+ viewbox: string;
8
+ };
9
+ export declare const ArrowRight24RegularIcon: {
10
+ body: string;
11
+ viewbox: string;
12
+ };
13
+ export declare const ArrowSortDownLines24RegularIcon: {
14
+ body: string;
15
+ viewbox: string;
16
+ };
17
+ export declare const ArrowSortUpLines24RegularIcon: {
18
+ body: string;
19
+ viewbox: string;
20
+ };
21
+ export declare const ArrowUp24RegularIcon: {
22
+ body: string;
23
+ viewbox: string;
24
+ };
25
+ export declare const Attach24RegularIcon: {
26
+ body: string;
27
+ viewbox: string;
28
+ };
29
+ export declare const Camera24RegularIcon: {
30
+ body: string;
31
+ viewbox: string;
32
+ };
33
+ export declare const CheckmarkCircle24RegularIcon: {
34
+ body: string;
35
+ viewbox: string;
36
+ };
37
+ export declare const Checkmark24RegularIcon: {
38
+ body: string;
39
+ viewbox: string;
40
+ };
41
+ export declare const ChevronDown24RegularIcon: {
42
+ body: string;
43
+ viewbox: string;
44
+ };
45
+ export declare const ChevronRight24RegularIcon: {
46
+ body: string;
47
+ viewbox: string;
48
+ };
49
+ export declare const Copy24RegularIcon: {
50
+ body: string;
51
+ viewbox: string;
52
+ };
53
+ export declare const Delete24RegularIcon: {
54
+ body: string;
55
+ viewbox: string;
56
+ };
57
+ export declare const DismissCircle24RegularIcon: {
58
+ body: string;
59
+ viewbox: string;
60
+ };
61
+ export declare const Dismiss24RegularIcon: {
62
+ body: string;
63
+ viewbox: string;
64
+ };
65
+ export declare const Info24RegularIcon: {
66
+ body: string;
67
+ viewbox: string;
68
+ };
69
+ export declare const DotsMoveIcon: {
70
+ body: string;
71
+ viewbox: string;
72
+ };
73
+ export declare const MaximizeSquareMinimalisticLinearIcon: {
74
+ body: string;
75
+ viewbox: string;
76
+ };
77
+ export declare const Microphone2LinearIcon: {
78
+ body: string;
79
+ viewbox: string;
80
+ };
81
+ export declare const MoonStarsLinearIcon: {
82
+ body: string;
83
+ viewbox: string;
84
+ };
85
+ export declare const MoreVertical24RegularIcon: {
86
+ body: string;
87
+ viewbox: string;
88
+ };
89
+ export declare const SpeakerMute24RegularIcon: {
90
+ body: string;
91
+ viewbox: string;
92
+ };
93
+ export declare const Pause24RegularIcon: {
94
+ body: string;
95
+ viewbox: string;
96
+ };
97
+ export declare const PictureInPicture24RegularIcon: {
98
+ body: string;
99
+ viewbox: string;
100
+ };
101
+ export declare const Play24RegularIcon: {
102
+ body: string;
103
+ viewbox: string;
104
+ };
105
+ export declare const Record24RegularIcon: {
106
+ body: string;
107
+ viewbox: string;
108
+ };
109
+ export declare const Search24RegularIcon: {
110
+ body: string;
111
+ viewbox: string;
112
+ };
113
+ export declare const Send24RegularIcon: {
114
+ body: string;
115
+ viewbox: string;
116
+ };
117
+ export declare const Speaker24RegularIcon: {
118
+ body: string;
119
+ viewbox: string;
120
+ };
121
+ export declare const RecordStop24RegularIcon: {
122
+ body: string;
123
+ viewbox: string;
124
+ };
125
+ export declare const Sun2LinearIcon: {
126
+ body: string;
127
+ viewbox: string;
128
+ };
129
+ export declare const Warning24RegularIcon: {
130
+ body: string;
131
+ viewbox: string;
132
+ };