@teja-app/ui 0.0.1 → 0.0.2

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 (166) hide show
  1. package/dist/components/Badge/Badge.d.ts +13 -0
  2. package/dist/components/Badge/Badge.d.ts.map +1 -0
  3. package/dist/components/Badge/Badge.types.d.ts +12 -0
  4. package/dist/components/Badge/Badge.types.d.ts.map +1 -0
  5. package/dist/components/Badge/index.d.ts +3 -0
  6. package/dist/components/Badge/index.d.ts.map +1 -0
  7. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +18 -0
  8. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  9. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts +20 -0
  10. package/dist/components/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -0
  11. package/dist/components/Breadcrumbs/index.d.ts +3 -0
  12. package/dist/components/Breadcrumbs/index.d.ts.map +1 -0
  13. package/dist/components/Button/Button.d.ts.map +1 -1
  14. package/dist/components/Card/Card.d.ts +18 -0
  15. package/dist/components/Card/Card.d.ts.map +1 -0
  16. package/dist/components/Card/Card.types.d.ts +14 -0
  17. package/dist/components/Card/Card.types.d.ts.map +1 -0
  18. package/dist/components/Card/index.d.ts +3 -0
  19. package/dist/components/Card/index.d.ts.map +1 -0
  20. package/dist/components/Checkbox/Checkbox.d.ts +13 -0
  21. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  22. package/dist/components/Checkbox/Checkbox.types.d.ts +19 -0
  23. package/dist/components/Checkbox/Checkbox.types.d.ts.map +1 -0
  24. package/dist/components/Checkbox/index.d.ts +3 -0
  25. package/dist/components/Checkbox/index.d.ts.map +1 -0
  26. package/dist/components/Combobox/Combobox.d.ts +24 -0
  27. package/dist/components/Combobox/Combobox.d.ts.map +1 -0
  28. package/dist/components/Combobox/Combobox.types.d.ts +41 -0
  29. package/dist/components/Combobox/Combobox.types.d.ts.map +1 -0
  30. package/dist/components/Combobox/index.d.ts +3 -0
  31. package/dist/components/Combobox/index.d.ts.map +1 -0
  32. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +23 -0
  33. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
  34. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts +22 -0
  35. package/dist/components/ConfirmDialog/ConfirmDialog.types.d.ts.map +1 -0
  36. package/dist/components/ConfirmDialog/index.d.ts +3 -0
  37. package/dist/components/ConfirmDialog/index.d.ts.map +1 -0
  38. package/dist/components/Drawer/Drawer.d.ts +27 -0
  39. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  40. package/dist/components/Drawer/Drawer.types.d.ts +23 -0
  41. package/dist/components/Drawer/Drawer.types.d.ts.map +1 -0
  42. package/dist/components/Drawer/index.d.ts +3 -0
  43. package/dist/components/Drawer/index.d.ts.map +1 -0
  44. package/dist/components/EmptyState/EmptyState.d.ts +34 -0
  45. package/dist/components/EmptyState/EmptyState.d.ts.map +1 -0
  46. package/dist/components/EmptyState/EmptyState.types.d.ts +17 -0
  47. package/dist/components/EmptyState/EmptyState.types.d.ts.map +1 -0
  48. package/dist/components/EmptyState/index.d.ts +3 -0
  49. package/dist/components/EmptyState/index.d.ts.map +1 -0
  50. package/dist/components/Input/Input.d.ts +13 -0
  51. package/dist/components/Input/Input.d.ts.map +1 -0
  52. package/dist/components/Input/Input.types.d.ts +18 -0
  53. package/dist/components/Input/Input.types.d.ts.map +1 -0
  54. package/dist/components/Input/index.d.ts +3 -0
  55. package/dist/components/Input/index.d.ts.map +1 -0
  56. package/dist/components/Modal/Modal.d.ts +28 -0
  57. package/dist/components/Modal/Modal.d.ts.map +1 -0
  58. package/dist/components/Modal/Modal.types.d.ts +27 -0
  59. package/dist/components/Modal/Modal.types.d.ts.map +1 -0
  60. package/dist/components/Modal/index.d.ts +3 -0
  61. package/dist/components/Modal/index.d.ts.map +1 -0
  62. package/dist/components/MultiSelect/MultiSelect.d.ts +26 -0
  63. package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -0
  64. package/dist/components/MultiSelect/MultiSelect.types.d.ts +49 -0
  65. package/dist/components/MultiSelect/MultiSelect.types.d.ts.map +1 -0
  66. package/dist/components/MultiSelect/index.d.ts +3 -0
  67. package/dist/components/MultiSelect/index.d.ts.map +1 -0
  68. package/dist/components/Pagination/Pagination.d.ts +35 -0
  69. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  70. package/dist/components/Pagination/Pagination.types.d.ts +29 -0
  71. package/dist/components/Pagination/Pagination.types.d.ts.map +1 -0
  72. package/dist/components/Pagination/index.d.ts +3 -0
  73. package/dist/components/Pagination/index.d.ts.map +1 -0
  74. package/dist/components/PasswordInput/PasswordInput.d.ts +12 -0
  75. package/dist/components/PasswordInput/PasswordInput.d.ts.map +1 -0
  76. package/dist/components/PasswordInput/PasswordInput.types.d.ts +14 -0
  77. package/dist/components/PasswordInput/PasswordInput.types.d.ts.map +1 -0
  78. package/dist/components/PasswordInput/index.d.ts +3 -0
  79. package/dist/components/PasswordInput/index.d.ts.map +1 -0
  80. package/dist/components/Radio/Radio.d.ts +12 -0
  81. package/dist/components/Radio/Radio.d.ts.map +1 -0
  82. package/dist/components/Radio/Radio.types.d.ts +45 -0
  83. package/dist/components/Radio/Radio.types.d.ts.map +1 -0
  84. package/dist/components/Radio/RadioGroup.d.ts +23 -0
  85. package/dist/components/Radio/RadioGroup.d.ts.map +1 -0
  86. package/dist/components/Radio/index.d.ts +4 -0
  87. package/dist/components/Radio/index.d.ts.map +1 -0
  88. package/dist/components/Select/Select.d.ts +22 -0
  89. package/dist/components/Select/Select.d.ts.map +1 -0
  90. package/dist/components/Select/Select.types.d.ts +37 -0
  91. package/dist/components/Select/Select.types.d.ts.map +1 -0
  92. package/dist/components/Select/index.d.ts +3 -0
  93. package/dist/components/Select/index.d.ts.map +1 -0
  94. package/dist/components/Skeleton/Skeleton.d.ts +22 -0
  95. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  96. package/dist/components/Skeleton/Skeleton.types.d.ts +17 -0
  97. package/dist/components/Skeleton/Skeleton.types.d.ts.map +1 -0
  98. package/dist/components/Skeleton/index.d.ts +3 -0
  99. package/dist/components/Skeleton/index.d.ts.map +1 -0
  100. package/dist/components/Spinner/Spinner.d.ts +13 -0
  101. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  102. package/dist/components/Spinner/Spinner.types.d.ts +12 -0
  103. package/dist/components/Spinner/Spinner.types.d.ts.map +1 -0
  104. package/dist/components/Spinner/index.d.ts +3 -0
  105. package/dist/components/Spinner/index.d.ts.map +1 -0
  106. package/dist/components/Table/Table.d.ts +44 -0
  107. package/dist/components/Table/Table.d.ts.map +1 -0
  108. package/dist/components/Table/Table.types.d.ts +33 -0
  109. package/dist/components/Table/Table.types.d.ts.map +1 -0
  110. package/dist/components/Table/index.d.ts +3 -0
  111. package/dist/components/Table/index.d.ts.map +1 -0
  112. package/dist/components/Tabs/Tabs.d.ts +43 -0
  113. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  114. package/dist/components/Tabs/Tabs.types.d.ts +38 -0
  115. package/dist/components/Tabs/Tabs.types.d.ts.map +1 -0
  116. package/dist/components/Tabs/index.d.ts +3 -0
  117. package/dist/components/Tabs/index.d.ts.map +1 -0
  118. package/dist/components/Textarea/Textarea.d.ts +13 -0
  119. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  120. package/dist/components/Textarea/Textarea.types.d.ts +20 -0
  121. package/dist/components/Textarea/Textarea.types.d.ts.map +1 -0
  122. package/dist/components/Textarea/index.d.ts +3 -0
  123. package/dist/components/Textarea/index.d.ts.map +1 -0
  124. package/dist/components/Toggle/Toggle.d.ts +20 -0
  125. package/dist/components/Toggle/Toggle.d.ts.map +1 -0
  126. package/dist/components/Toggle/Toggle.types.d.ts +20 -0
  127. package/dist/components/Toggle/Toggle.types.d.ts.map +1 -0
  128. package/dist/components/Toggle/index.d.ts +3 -0
  129. package/dist/components/Toggle/index.d.ts.map +1 -0
  130. package/dist/components/index.d.ts +21 -0
  131. package/dist/components/index.d.ts.map +1 -1
  132. package/dist/hooks/index.cjs +7 -0
  133. package/dist/hooks/index.cjs.map +1 -1
  134. package/dist/hooks/index.d.ts +6 -9
  135. package/dist/hooks/index.d.ts.map +1 -1
  136. package/dist/hooks/index.js +8 -1
  137. package/dist/hooks/index.js.map +1 -1
  138. package/dist/hooks/useDebounce.d.ts +65 -0
  139. package/dist/hooks/useDebounce.d.ts.map +1 -0
  140. package/dist/hooks/useDebounce.test.d.ts +2 -0
  141. package/dist/hooks/useDebounce.test.d.ts.map +1 -0
  142. package/dist/hooks/useSelection.d.ts +84 -0
  143. package/dist/hooks/useSelection.d.ts.map +1 -0
  144. package/dist/hooks/useSelection.test.d.ts +2 -0
  145. package/dist/hooks/useSelection.test.d.ts.map +1 -0
  146. package/dist/hooks/useTable.d.ts +91 -0
  147. package/dist/hooks/useTable.d.ts.map +1 -0
  148. package/dist/hooks/useTable.test.d.ts +2 -0
  149. package/dist/hooks/useTable.test.d.ts.map +1 -0
  150. package/dist/index.cjs +9451 -11
  151. package/dist/index.cjs.map +1 -1
  152. package/dist/index.d.ts +1 -0
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.js +9435 -11
  155. package/dist/index.js.map +1 -1
  156. package/dist/tailwind/colors.d.ts +28 -2
  157. package/dist/tailwind/colors.d.ts.map +1 -1
  158. package/dist/tailwind/index.cjs +33 -3
  159. package/dist/tailwind/index.cjs.map +1 -1
  160. package/dist/tailwind/index.js +33 -3
  161. package/dist/tailwind/index.js.map +1 -1
  162. package/dist/useSelection-BK6u5Ezx.js +359 -0
  163. package/dist/useSelection-BK6u5Ezx.js.map +1 -0
  164. package/dist/useSelection-DyXUWnGK.cjs +358 -0
  165. package/dist/useSelection-DyXUWnGK.cjs.map +1 -0
  166. package/package.json +4 -1
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ const React = require("react");
3
+ function useDebounce(value, delay = 300) {
4
+ const [debouncedValue, setDebouncedValue] = React.useState(value);
5
+ React.useEffect(() => {
6
+ const timer = setTimeout(() => {
7
+ setDebouncedValue(value);
8
+ }, delay);
9
+ return () => {
10
+ clearTimeout(timer);
11
+ };
12
+ }, [value, delay]);
13
+ return debouncedValue;
14
+ }
15
+ function useDebouncedCallback(callback, delay = 300) {
16
+ const timeoutRef = React.useRef(null);
17
+ const callbackRef = React.useRef(callback);
18
+ React.useEffect(() => {
19
+ callbackRef.current = callback;
20
+ }, [callback]);
21
+ const debouncedCallback = React.useCallback(
22
+ (...args) => {
23
+ if (timeoutRef.current) {
24
+ clearTimeout(timeoutRef.current);
25
+ }
26
+ timeoutRef.current = setTimeout(() => {
27
+ callbackRef.current(...args);
28
+ }, delay);
29
+ },
30
+ [delay]
31
+ );
32
+ React.useEffect(() => {
33
+ return () => {
34
+ if (timeoutRef.current) {
35
+ clearTimeout(timeoutRef.current);
36
+ }
37
+ };
38
+ }, []);
39
+ return debouncedCallback;
40
+ }
41
+ function useDebouncedCallbackWithControl(callback, delay = 300) {
42
+ const timeoutRef = React.useRef(null);
43
+ const callbackRef = React.useRef(callback);
44
+ const argsRef = React.useRef(null);
45
+ React.useEffect(() => {
46
+ callbackRef.current = callback;
47
+ }, [callback]);
48
+ const cancel = React.useCallback(() => {
49
+ if (timeoutRef.current) {
50
+ clearTimeout(timeoutRef.current);
51
+ timeoutRef.current = null;
52
+ argsRef.current = null;
53
+ }
54
+ }, []);
55
+ const flush = React.useCallback(() => {
56
+ if (timeoutRef.current && argsRef.current) {
57
+ clearTimeout(timeoutRef.current);
58
+ timeoutRef.current = null;
59
+ const args = argsRef.current;
60
+ argsRef.current = null;
61
+ callbackRef.current(...args);
62
+ }
63
+ }, []);
64
+ const isPending = React.useCallback(() => {
65
+ return timeoutRef.current !== null;
66
+ }, []);
67
+ const debouncedFn = React.useCallback(
68
+ (...args) => {
69
+ argsRef.current = args;
70
+ if (timeoutRef.current) {
71
+ clearTimeout(timeoutRef.current);
72
+ }
73
+ timeoutRef.current = setTimeout(() => {
74
+ timeoutRef.current = null;
75
+ argsRef.current = null;
76
+ callbackRef.current(...args);
77
+ }, delay);
78
+ },
79
+ [delay]
80
+ );
81
+ React.useEffect(() => {
82
+ return () => {
83
+ cancel();
84
+ };
85
+ }, [cancel]);
86
+ return { debouncedFn, cancel, flush, isPending };
87
+ }
88
+ function useTable({
89
+ data,
90
+ initialSortColumn,
91
+ initialSortDirection = "asc",
92
+ initialPage = 1,
93
+ initialPageSize = 10,
94
+ serverSide = false,
95
+ onSort,
96
+ onPageChange,
97
+ onPageSizeChange,
98
+ sortFn,
99
+ getValueByColumn,
100
+ totalItems: totalItemsProp
101
+ }) {
102
+ const [sortState, setSortState] = React.useState({
103
+ column: initialSortColumn ?? null,
104
+ direction: initialSortDirection
105
+ });
106
+ const [currentPage, setCurrentPage] = React.useState(initialPage);
107
+ const [pageSize, setPageSizeState] = React.useState(initialPageSize);
108
+ const defaultGetValue = React.useCallback((item, column) => {
109
+ return item[column];
110
+ }, []);
111
+ const getValue = getValueByColumn ?? defaultGetValue;
112
+ const defaultSortFn = React.useCallback(
113
+ (items, column, direction) => {
114
+ return [...items].sort((a, b) => {
115
+ const aVal = getValue(a, column);
116
+ const bVal = getValue(b, column);
117
+ if (aVal == null && bVal == null) return 0;
118
+ if (aVal == null) return direction === "asc" ? 1 : -1;
119
+ if (bVal == null) return direction === "asc" ? -1 : 1;
120
+ if (typeof aVal === "string" && typeof bVal === "string") {
121
+ const comparison2 = aVal.localeCompare(bVal);
122
+ return direction === "asc" ? comparison2 : -comparison2;
123
+ }
124
+ if (typeof aVal === "number" && typeof bVal === "number") {
125
+ return direction === "asc" ? aVal - bVal : bVal - aVal;
126
+ }
127
+ if (aVal instanceof Date && bVal instanceof Date) {
128
+ return direction === "asc" ? aVal.getTime() - bVal.getTime() : bVal.getTime() - aVal.getTime();
129
+ }
130
+ if (typeof aVal === "boolean" && typeof bVal === "boolean") {
131
+ const comparison2 = aVal === bVal ? 0 : aVal ? -1 : 1;
132
+ return direction === "asc" ? comparison2 : -comparison2;
133
+ }
134
+ const aStr = String(aVal);
135
+ const bStr = String(bVal);
136
+ const comparison = aStr.localeCompare(bStr);
137
+ return direction === "asc" ? comparison : -comparison;
138
+ });
139
+ },
140
+ [getValue]
141
+ );
142
+ const sort = sortFn ?? defaultSortFn;
143
+ const sortedData = React.useMemo(() => {
144
+ if (serverSide || !sortState.column) {
145
+ return data;
146
+ }
147
+ return sort(data, sortState.column, sortState.direction);
148
+ }, [data, serverSide, sortState.column, sortState.direction, sort]);
149
+ const totalItems = serverSide ? totalItemsProp ?? data.length : data.length;
150
+ const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));
151
+ const pageData = React.useMemo(() => {
152
+ if (serverSide) {
153
+ return data;
154
+ }
155
+ const startIndex = (currentPage - 1) * pageSize;
156
+ return sortedData.slice(startIndex, startIndex + pageSize);
157
+ }, [serverSide, sortedData, currentPage, pageSize, data]);
158
+ const handleSort = React.useCallback(
159
+ (column) => {
160
+ const newDirection = sortState.column === column && sortState.direction === "asc" ? "desc" : "asc";
161
+ setSortState({ column, direction: newDirection });
162
+ if (serverSide && onSort) {
163
+ onSort(column, newDirection);
164
+ }
165
+ if (!serverSide) {
166
+ setCurrentPage(1);
167
+ }
168
+ },
169
+ [sortState.column, sortState.direction, serverSide, onSort]
170
+ );
171
+ const setSort = React.useCallback(
172
+ (column, direction) => {
173
+ setSortState({ column, direction });
174
+ if (serverSide && onSort && column) {
175
+ onSort(column, direction);
176
+ }
177
+ },
178
+ [serverSide, onSort]
179
+ );
180
+ const goToPage = React.useCallback(
181
+ (page) => {
182
+ const validPage = Math.max(1, Math.min(page, totalPages));
183
+ setCurrentPage(validPage);
184
+ if (serverSide && onPageChange) {
185
+ onPageChange(validPage);
186
+ }
187
+ },
188
+ [totalPages, serverSide, onPageChange]
189
+ );
190
+ const nextPage = React.useCallback(() => {
191
+ if (currentPage < totalPages) {
192
+ goToPage(currentPage + 1);
193
+ }
194
+ }, [currentPage, totalPages, goToPage]);
195
+ const previousPage = React.useCallback(() => {
196
+ if (currentPage > 1) {
197
+ goToPage(currentPage - 1);
198
+ }
199
+ }, [currentPage, goToPage]);
200
+ const setPageSize = React.useCallback(
201
+ (size) => {
202
+ setPageSizeState(size);
203
+ setCurrentPage(1);
204
+ if (serverSide && onPageSizeChange) {
205
+ onPageSizeChange(size);
206
+ }
207
+ },
208
+ [serverSide, onPageSizeChange]
209
+ );
210
+ const reset = React.useCallback(() => {
211
+ setSortState({
212
+ column: initialSortColumn ?? null,
213
+ direction: initialSortDirection
214
+ });
215
+ setCurrentPage(initialPage);
216
+ setPageSizeState(initialPageSize);
217
+ }, [initialSortColumn, initialSortDirection, initialPage, initialPageSize]);
218
+ return {
219
+ pageData,
220
+ sortedData,
221
+ sortColumn: sortState.column,
222
+ sortDirection: sortState.direction,
223
+ handleSort,
224
+ setSort,
225
+ currentPage,
226
+ pageSize,
227
+ totalPages,
228
+ totalItems,
229
+ goToPage,
230
+ nextPage,
231
+ previousPage,
232
+ setPageSize,
233
+ reset,
234
+ isFirstPage: currentPage === 1,
235
+ isLastPage: currentPage >= totalPages
236
+ };
237
+ }
238
+ function useSelection({
239
+ items,
240
+ getItemId,
241
+ initialSelected = [],
242
+ onSelectionChange,
243
+ isSelectable = () => true
244
+ }) {
245
+ const [selectedIds, setSelectedIds] = React.useState(initialSelected);
246
+ const selectedSet = React.useMemo(() => new Set(selectedIds), [selectedIds]);
247
+ const selectableItems = React.useMemo(
248
+ () => items.filter(isSelectable),
249
+ [items, isSelectable]
250
+ );
251
+ const selectableIds = React.useMemo(
252
+ () => selectableItems.map(getItemId),
253
+ [selectableItems, getItemId]
254
+ );
255
+ const selectedCount = selectedIds.length;
256
+ const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));
257
+ const someSelected = selectedIds.length > 0;
258
+ const noneSelected = selectedIds.length === 0;
259
+ const updateSelection = React.useCallback(
260
+ (newIds) => {
261
+ setSelectedIds(newIds);
262
+ onSelectionChange?.(newIds);
263
+ },
264
+ [onSelectionChange]
265
+ );
266
+ const isSelected = React.useCallback((id) => selectedSet.has(id), [selectedSet]);
267
+ const toggle = React.useCallback(
268
+ (id) => {
269
+ if (selectedSet.has(id)) {
270
+ updateSelection(selectedIds.filter((selectedId) => selectedId !== id));
271
+ } else {
272
+ updateSelection([...selectedIds, id]);
273
+ }
274
+ },
275
+ [selectedIds, selectedSet, updateSelection]
276
+ );
277
+ const select = React.useCallback(
278
+ (id) => {
279
+ if (!selectedSet.has(id)) {
280
+ updateSelection([...selectedIds, id]);
281
+ }
282
+ },
283
+ [selectedIds, selectedSet, updateSelection]
284
+ );
285
+ const deselect = React.useCallback(
286
+ (id) => {
287
+ if (selectedSet.has(id)) {
288
+ updateSelection(selectedIds.filter((selectedId) => selectedId !== id));
289
+ }
290
+ },
291
+ [selectedIds, selectedSet, updateSelection]
292
+ );
293
+ const selectAll = React.useCallback(() => {
294
+ const newSelectedSet = new Set(selectedIds);
295
+ selectableIds.forEach((id) => newSelectedSet.add(id));
296
+ updateSelection(Array.from(newSelectedSet));
297
+ }, [selectedIds, selectableIds, updateSelection]);
298
+ const clearSelection = React.useCallback(() => {
299
+ updateSelection([]);
300
+ }, [updateSelection]);
301
+ const toggleAll = React.useCallback(() => {
302
+ if (allSelected) {
303
+ const selectableIdSet = new Set(selectableIds);
304
+ updateSelection(selectedIds.filter((id) => !selectableIdSet.has(id)));
305
+ } else {
306
+ selectAll();
307
+ }
308
+ }, [allSelected, selectAll, selectedIds, selectableIds, updateSelection]);
309
+ const selectMany = React.useCallback(
310
+ (ids) => {
311
+ const newSelectedSet = new Set(selectedIds);
312
+ ids.forEach((id) => newSelectedSet.add(id));
313
+ updateSelection(Array.from(newSelectedSet));
314
+ },
315
+ [selectedIds, updateSelection]
316
+ );
317
+ const deselectMany = React.useCallback(
318
+ (ids) => {
319
+ const idsToRemove = new Set(ids);
320
+ updateSelection(selectedIds.filter((id) => !idsToRemove.has(id)));
321
+ },
322
+ [selectedIds, updateSelection]
323
+ );
324
+ const setSelection = React.useCallback(
325
+ (ids) => {
326
+ updateSelection(ids);
327
+ },
328
+ [updateSelection]
329
+ );
330
+ const getSelectedItems = React.useCallback(() => {
331
+ return items.filter((item) => selectedSet.has(getItemId(item)));
332
+ }, [items, selectedSet, getItemId]);
333
+ return {
334
+ selectedIds,
335
+ selectedSet,
336
+ selectedCount,
337
+ allSelected,
338
+ someSelected,
339
+ noneSelected,
340
+ isSelected,
341
+ toggle,
342
+ select,
343
+ deselect,
344
+ selectAll,
345
+ clearSelection,
346
+ toggleAll,
347
+ selectMany,
348
+ deselectMany,
349
+ setSelection,
350
+ getSelectedItems
351
+ };
352
+ }
353
+ exports.useDebounce = useDebounce;
354
+ exports.useDebouncedCallback = useDebouncedCallback;
355
+ exports.useDebouncedCallbackWithControl = useDebouncedCallbackWithControl;
356
+ exports.useSelection = useSelection;
357
+ exports.useTable = useTable;
358
+ //# sourceMappingURL=useSelection-DyXUWnGK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelection-DyXUWnGK.cjs","sources":["../src/hooks/useDebounce.ts","../src/hooks/useTable.ts","../src/hooks/useSelection.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\n\n/**\n * Debounces a value, returning the debounced value after the specified delay.\n *\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns The debounced value\n *\n * @example\n * ```tsx\n * const [searchTerm, setSearchTerm] = useState('');\n * const debouncedSearch = useDebounce(searchTerm, 300);\n *\n * useEffect(() => {\n * // This will only run after the user stops typing for 300ms\n * fetchResults(debouncedSearch);\n * }, [debouncedSearch]);\n * ```\n */\nexport function useDebounce<T>(value: T, delay: number = 300): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Returns a debounced version of the provided callback function.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns A debounced version of the callback\n *\n * @example\n * ```tsx\n * const handleSearch = useDebouncedCallback((query: string) => {\n * fetchSearchResults(query);\n * }, 300);\n *\n * // In your component:\n * <input onChange={(e) => handleSearch(e.target.value)} />\n * ```\n */\nexport function useDebouncedCallback<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): (...args: Parameters<T>) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n\n // Update callback ref on each render to always use latest callback\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return debouncedCallback;\n}\n\n/**\n * Returns a debounced callback with cancel functionality.\n *\n * @param callback - The function to debounce\n * @param delay - The delay in milliseconds (default: 300ms)\n * @returns An object with the debounced callback and cancel/flush methods\n *\n * @example\n * ```tsx\n * const { debouncedFn, cancel, flush } = useDebouncedCallbackWithControl(\n * (query: string) => fetchResults(query),\n * 300\n * );\n *\n * // Cancel pending execution\n * cancel();\n *\n * // Execute immediately\n * flush();\n * ```\n */\nexport function useDebouncedCallbackWithControl<T extends (...args: Parameters<T>) => ReturnType<T>>(\n callback: T,\n delay: number = 300\n): {\n debouncedFn: (...args: Parameters<T>) => void;\n cancel: () => void;\n flush: () => void;\n isPending: () => boolean;\n} {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n const argsRef = useRef<Parameters<T> | null>(null);\n\n // Update callback ref on each render\n useEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n\n const cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n argsRef.current = null;\n }\n }, []);\n\n const flush = useCallback(() => {\n if (timeoutRef.current && argsRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n const args = argsRef.current;\n argsRef.current = null;\n callbackRef.current(...(args as Parameters<T>));\n }\n }, []);\n\n const isPending = useCallback(() => {\n return timeoutRef.current !== null;\n }, []);\n\n const debouncedFn = useCallback(\n (...args: Parameters<T>) => {\n argsRef.current = args;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = null;\n argsRef.current = null;\n callbackRef.current(...args);\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cancel();\n };\n }, [cancel]);\n\n return { debouncedFn, cancel, flush, isPending };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface UseTableOptions<T> {\n /** The data array to manage */\n data: T[];\n\n /** Initial sort column */\n initialSortColumn?: string;\n\n /** Initial sort direction */\n initialSortDirection?: SortDirection;\n\n /** Initial page (1-based) */\n initialPage?: number;\n\n /** Initial page size */\n initialPageSize?: number;\n\n /** Enable server-side mode (disables client-side sorting/pagination) */\n serverSide?: boolean;\n\n /** Callback when sort changes (server-side mode) */\n onSort?: (column: string, direction: SortDirection) => void;\n\n /** Callback when page changes (server-side mode) */\n onPageChange?: (page: number) => void;\n\n /** Callback when page size changes (server-side mode) */\n onPageSizeChange?: (pageSize: number) => void;\n\n /** Custom sort function for client-side sorting */\n sortFn?: (data: T[], column: string, direction: SortDirection) => T[];\n\n /** Key extractor for getting sortable value from item */\n getValueByColumn?: (item: T, column: string) => unknown;\n\n /** Total items count (for server-side pagination) */\n totalItems?: number;\n}\n\nexport interface UseTableReturn<T> {\n /** Current page data (paginated if not server-side) */\n pageData: T[];\n\n /** All sorted data (before pagination) */\n sortedData: T[];\n\n /** Current sort column */\n sortColumn: string | null;\n\n /** Current sort direction */\n sortDirection: SortDirection;\n\n /** Handle sort - toggles direction if same column, resets to asc if different */\n handleSort: (column: string) => void;\n\n /** Set sort directly */\n setSort: (column: string | null, direction: SortDirection) => void;\n\n /** Current page (1-based) */\n currentPage: number;\n\n /** Current page size */\n pageSize: number;\n\n /** Total number of pages */\n totalPages: number;\n\n /** Total items count */\n totalItems: number;\n\n /** Go to specific page */\n goToPage: (page: number) => void;\n\n /** Go to next page */\n nextPage: () => void;\n\n /** Go to previous page */\n previousPage: () => void;\n\n /** Set page size */\n setPageSize: (size: number) => void;\n\n /** Reset to initial state */\n reset: () => void;\n\n /** Whether currently on first page */\n isFirstPage: boolean;\n\n /** Whether currently on last page */\n isLastPage: boolean;\n}\n\n/**\n * Hook for managing table state including sorting and pagination.\n * Supports both client-side and server-side modes.\n *\n * @example\n * ```tsx\n * // Client-side (default)\n * const { pageData, sortColumn, sortDirection, handleSort, currentPage, goToPage } = useTable({\n * data: users,\n * initialPageSize: 10,\n * });\n *\n * // Server-side\n * const { handleSort, goToPage } = useTable({\n * data: users,\n * serverSide: true,\n * totalItems: 1000,\n * onSort: (col, dir) => fetchUsers({ sort: col, order: dir }),\n * onPageChange: (page) => fetchUsers({ page }),\n * });\n * ```\n */\nexport function useTable<T>({\n data,\n initialSortColumn,\n initialSortDirection = 'asc',\n initialPage = 1,\n initialPageSize = 10,\n serverSide = false,\n onSort,\n onPageChange,\n onPageSizeChange,\n sortFn,\n getValueByColumn,\n totalItems: totalItemsProp,\n}: UseTableOptions<T>): UseTableReturn<T> {\n // Sort state\n const [sortState, setSortState] = useState<SortState>({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n\n // Pagination state\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [pageSize, setPageSizeState] = useState(initialPageSize);\n\n // Default value extractor\n const defaultGetValue = useCallback((item: T, column: string): unknown => {\n return (item as Record<string, unknown>)[column];\n }, []);\n\n const getValue = getValueByColumn ?? defaultGetValue;\n\n // Default sort function\n const defaultSortFn = useCallback(\n (items: T[], column: string, direction: SortDirection): T[] => {\n return [...items].sort((a, b) => {\n const aVal = getValue(a, column);\n const bVal = getValue(b, column);\n\n // Handle null/undefined\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return direction === 'asc' ? 1 : -1;\n if (bVal == null) return direction === 'asc' ? -1 : 1;\n\n // String comparison\n if (typeof aVal === 'string' && typeof bVal === 'string') {\n const comparison = aVal.localeCompare(bVal);\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Number comparison\n if (typeof aVal === 'number' && typeof bVal === 'number') {\n return direction === 'asc' ? aVal - bVal : bVal - aVal;\n }\n\n // Date comparison\n if (aVal instanceof Date && bVal instanceof Date) {\n return direction === 'asc'\n ? aVal.getTime() - bVal.getTime()\n : bVal.getTime() - aVal.getTime();\n }\n\n // Boolean comparison\n if (typeof aVal === 'boolean' && typeof bVal === 'boolean') {\n const comparison = aVal === bVal ? 0 : aVal ? -1 : 1;\n return direction === 'asc' ? comparison : -comparison;\n }\n\n // Fallback to string comparison\n const aStr = String(aVal);\n const bStr = String(bVal);\n const comparison = aStr.localeCompare(bStr);\n return direction === 'asc' ? comparison : -comparison;\n });\n },\n [getValue]\n );\n\n const sort = sortFn ?? defaultSortFn;\n\n // Sorted data (client-side only)\n const sortedData = useMemo(() => {\n if (serverSide || !sortState.column) {\n return data;\n }\n return sort(data, sortState.column, sortState.direction);\n }, [data, serverSide, sortState.column, sortState.direction, sort]);\n\n // Total items\n const totalItems = serverSide ? (totalItemsProp ?? data.length) : data.length;\n\n // Total pages\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize));\n\n // Paginated data (client-side only)\n const pageData = useMemo(() => {\n if (serverSide) {\n return data;\n }\n const startIndex = (currentPage - 1) * pageSize;\n return sortedData.slice(startIndex, startIndex + pageSize);\n }, [serverSide, sortedData, currentPage, pageSize, data]);\n\n // Handle sort\n const handleSort = useCallback(\n (column: string) => {\n const newDirection: SortDirection =\n sortState.column === column && sortState.direction === 'asc' ? 'desc' : 'asc';\n\n setSortState({ column, direction: newDirection });\n\n if (serverSide && onSort) {\n onSort(column, newDirection);\n }\n\n // Reset to first page on sort change\n if (!serverSide) {\n setCurrentPage(1);\n }\n },\n [sortState.column, sortState.direction, serverSide, onSort]\n );\n\n // Set sort directly\n const setSort = useCallback(\n (column: string | null, direction: SortDirection) => {\n setSortState({ column, direction });\n if (serverSide && onSort && column) {\n onSort(column, direction);\n }\n },\n [serverSide, onSort]\n );\n\n // Go to specific page\n const goToPage = useCallback(\n (page: number) => {\n const validPage = Math.max(1, Math.min(page, totalPages));\n setCurrentPage(validPage);\n if (serverSide && onPageChange) {\n onPageChange(validPage);\n }\n },\n [totalPages, serverSide, onPageChange]\n );\n\n // Next page\n const nextPage = useCallback(() => {\n if (currentPage < totalPages) {\n goToPage(currentPage + 1);\n }\n }, [currentPage, totalPages, goToPage]);\n\n // Previous page\n const previousPage = useCallback(() => {\n if (currentPage > 1) {\n goToPage(currentPage - 1);\n }\n }, [currentPage, goToPage]);\n\n // Set page size\n const setPageSize = useCallback(\n (size: number) => {\n setPageSizeState(size);\n setCurrentPage(1); // Reset to first page\n if (serverSide && onPageSizeChange) {\n onPageSizeChange(size);\n }\n },\n [serverSide, onPageSizeChange]\n );\n\n // Reset to initial state\n const reset = useCallback(() => {\n setSortState({\n column: initialSortColumn ?? null,\n direction: initialSortDirection,\n });\n setCurrentPage(initialPage);\n setPageSizeState(initialPageSize);\n }, [initialSortColumn, initialSortDirection, initialPage, initialPageSize]);\n\n return {\n pageData,\n sortedData,\n sortColumn: sortState.column,\n sortDirection: sortState.direction,\n handleSort,\n setSort,\n currentPage,\n pageSize,\n totalPages,\n totalItems,\n goToPage,\n nextPage,\n previousPage,\n setPageSize,\n reset,\n isFirstPage: currentPage === 1,\n isLastPage: currentPage >= totalPages,\n };\n}\n","import { useState, useMemo, useCallback } from 'react';\n\nexport interface UseSelectionOptions<T, K extends string | number = string> {\n /** Array of items to select from */\n items: T[];\n\n /** Function to get the unique identifier from an item */\n getItemId: (item: T) => K;\n\n /** Initial selected IDs */\n initialSelected?: K[];\n\n /** Callback when selection changes */\n onSelectionChange?: (selectedIds: K[]) => void;\n\n /** Optional filter for selectable items (e.g., exclude disabled items) */\n isSelectable?: (item: T) => boolean;\n}\n\nexport interface UseSelectionReturn<K extends string | number = string> {\n /** Currently selected IDs */\n selectedIds: K[];\n\n /** Set of selected IDs for O(1) lookup */\n selectedSet: Set<K>;\n\n /** Number of selected items */\n selectedCount: number;\n\n /** Whether all selectable items are selected */\n allSelected: boolean;\n\n /** Whether some (but not all) items are selected */\n someSelected: boolean;\n\n /** Whether no items are selected */\n noneSelected: boolean;\n\n /** Check if a specific item is selected */\n isSelected: (id: K) => boolean;\n\n /** Toggle selection for a single item */\n toggle: (id: K) => void;\n\n /** Select a single item */\n select: (id: K) => void;\n\n /** Deselect a single item */\n deselect: (id: K) => void;\n\n /** Select all selectable items */\n selectAll: () => void;\n\n /** Clear all selections */\n clearSelection: () => void;\n\n /** Toggle between select all and clear all */\n toggleAll: () => void;\n\n /** Select multiple items */\n selectMany: (ids: K[]) => void;\n\n /** Deselect multiple items */\n deselectMany: (ids: K[]) => void;\n\n /** Replace selection with new IDs */\n setSelection: (ids: K[]) => void;\n\n /** Get selected items from the original array */\n getSelectedItems: () => unknown[];\n}\n\n/**\n * Hook for managing batch selection in tables and lists.\n *\n * @example\n * ```tsx\n * const {\n * selectedIds,\n * allSelected,\n * someSelected,\n * isSelected,\n * toggle,\n * selectAll,\n * clearSelection,\n * toggleAll,\n * } = useSelection({\n * items: users,\n * getItemId: (user) => user.id,\n * isSelectable: (user) => !user.disabled,\n * });\n *\n * // In table header:\n * <Checkbox\n * checked={allSelected}\n * indeterminate={someSelected && !allSelected}\n * onChange={toggleAll}\n * />\n *\n * // In table row:\n * <Checkbox\n * checked={isSelected(user.id)}\n * onChange={() => toggle(user.id)}\n * />\n * ```\n */\nexport function useSelection<T, K extends string | number = string>({\n items,\n getItemId,\n initialSelected = [],\n onSelectionChange,\n isSelectable = () => true,\n}: UseSelectionOptions<T, K>): UseSelectionReturn<K> {\n const [selectedIds, setSelectedIds] = useState<K[]>(initialSelected);\n\n // Selected set for O(1) lookup\n const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);\n\n // Get selectable items\n const selectableItems = useMemo(\n () => items.filter(isSelectable),\n [items, isSelectable]\n );\n\n // Get selectable IDs\n const selectableIds = useMemo(\n () => selectableItems.map(getItemId),\n [selectableItems, getItemId]\n );\n\n // Computed states\n const selectedCount = selectedIds.length;\n const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));\n const someSelected = selectedIds.length > 0;\n const noneSelected = selectedIds.length === 0;\n\n // Update selection and call callback\n const updateSelection = useCallback(\n (newIds: K[]) => {\n setSelectedIds(newIds);\n onSelectionChange?.(newIds);\n },\n [onSelectionChange]\n );\n\n // Check if item is selected\n const isSelected = useCallback((id: K) => selectedSet.has(id), [selectedSet]);\n\n // Toggle single item\n const toggle = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n } else {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select single item\n const select = useCallback(\n (id: K) => {\n if (!selectedSet.has(id)) {\n updateSelection([...selectedIds, id]);\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Deselect single item\n const deselect = useCallback(\n (id: K) => {\n if (selectedSet.has(id)) {\n updateSelection(selectedIds.filter((selectedId) => selectedId !== id));\n }\n },\n [selectedIds, selectedSet, updateSelection]\n );\n\n // Select all selectable items\n const selectAll = useCallback(() => {\n const newSelectedSet = new Set(selectedIds);\n selectableIds.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n }, [selectedIds, selectableIds, updateSelection]);\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n updateSelection([]);\n }, [updateSelection]);\n\n // Toggle all\n const toggleAll = useCallback(() => {\n if (allSelected) {\n // Deselect all selectable items (keep non-selectable items selected if any)\n const selectableIdSet = new Set(selectableIds);\n updateSelection(selectedIds.filter((id) => !selectableIdSet.has(id)));\n } else {\n selectAll();\n }\n }, [allSelected, selectAll, selectedIds, selectableIds, updateSelection]);\n\n // Select multiple items\n const selectMany = useCallback(\n (ids: K[]) => {\n const newSelectedSet = new Set(selectedIds);\n ids.forEach((id) => newSelectedSet.add(id));\n updateSelection(Array.from(newSelectedSet));\n },\n [selectedIds, updateSelection]\n );\n\n // Deselect multiple items\n const deselectMany = useCallback(\n (ids: K[]) => {\n const idsToRemove = new Set(ids);\n updateSelection(selectedIds.filter((id) => !idsToRemove.has(id)));\n },\n [selectedIds, updateSelection]\n );\n\n // Replace selection\n const setSelection = useCallback(\n (ids: K[]) => {\n updateSelection(ids);\n },\n [updateSelection]\n );\n\n // Get selected items\n const getSelectedItems = useCallback(() => {\n return items.filter((item) => selectedSet.has(getItemId(item)));\n }, [items, selectedSet, getItemId]);\n\n return {\n selectedIds,\n selectedSet,\n selectedCount,\n allSelected,\n someSelected,\n noneSelected,\n isSelected,\n toggle,\n select,\n deselect,\n selectAll,\n clearSelection,\n toggleAll,\n selectMany,\n deselectMany,\n setSelection,\n getSelectedItems,\n };\n}\n"],"names":["useState","useEffect","useRef","useCallback","comparison","useMemo"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teja-app/ui",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Shared UI component library for Teja applications",
5
5
  "author": "Teja App",
6
6
  "license": "MIT",
@@ -52,6 +52,8 @@
52
52
  "storybook:build": "storybook build",
53
53
  "test:storybook": "test-storybook",
54
54
  "test:storybook:ci": "concurrently -k -s first \"http-server storybook-static --port 6006 --silent\" \"wait-on tcp:127.0.0.1:6006 && test-storybook\"",
55
+ "test:a11y": "test-storybook --url http://localhost:6006",
56
+ "test:a11y:ci": "concurrently -k -s first \"http-server storybook-static --port 6006 --silent\" \"wait-on tcp:127.0.0.1:6006 && test-storybook --junit --outputFile=a11y-report.xml\"",
55
57
  "prepublishOnly": "bun run build",
56
58
  "changeset": "changeset",
57
59
  "version": "changeset version",
@@ -91,6 +93,7 @@
91
93
  "@typescript-eslint/parser": "^8.47.0",
92
94
  "@vitejs/plugin-react-swc": "^4.2.2",
93
95
  "@vitest/coverage-v8": "^4.0.13",
96
+ "axe-playwright": "^2.2.2",
94
97
  "concurrently": "^9.2.1",
95
98
  "eslint": "^9.39.1",
96
99
  "eslint-plugin-jsx-a11y": "^6.10.2",