@dbcdk/react-components 0.0.5 → 0.0.6

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 (272) hide show
  1. package/dist/assets/logo.js +2 -85
  2. package/dist/components/__stories__/_data/table.d.ts +15 -0
  3. package/dist/components/__stories__/_data/table.js +49 -0
  4. package/dist/components/__stories__/story-components/Colors.d.ts +2 -1
  5. package/dist/components/__stories__/story-components/Colors.js +87 -142
  6. package/dist/components/__stories__/story-components/Spacing.d.ts +1 -0
  7. package/dist/components/__stories__/story-components/Spacing.js +58 -166
  8. package/dist/components/app-header/AppHeader.d.ts +4 -3
  9. package/dist/components/app-header/AppHeader.js +3 -6
  10. package/dist/components/attribute-chip/AttributeChip.d.ts +1 -0
  11. package/dist/components/attribute-chip/AttributeChip.js +3 -14
  12. package/dist/components/avatar/Avatar.d.ts +2 -2
  13. package/dist/components/avatar/Avatar.js +37 -71
  14. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +4 -4
  15. package/dist/components/breadcrumbs/Breadcrumbs.js +4 -13
  16. package/dist/components/button/Button.d.ts +3 -2
  17. package/dist/components/button/Button.js +54 -56
  18. package/dist/components/button/Button.module.css +1 -1
  19. package/dist/components/card/Card.d.ts +8 -7
  20. package/dist/components/card/Card.js +19 -60
  21. package/dist/components/card-container/CardContainer.d.ts +3 -3
  22. package/dist/components/card-container/CardContainer.js +4 -16
  23. package/dist/components/chip/Chip.d.ts +6 -5
  24. package/dist/components/chip/Chip.js +14 -38
  25. package/dist/components/chip/Chip.module.css +9 -1
  26. package/dist/components/circle/Circle.d.ts +3 -2
  27. package/dist/components/circle/Circle.js +3 -10
  28. package/dist/components/clear-button/ClearButton.d.ts +2 -1
  29. package/dist/components/clear-button/ClearButton.js +6 -17
  30. package/dist/components/code-block/CodeBlock.d.ts +1 -0
  31. package/dist/components/code-block/CodeBlock.js +4 -10
  32. package/dist/components/copy-button/CopyButton.d.ts +4 -3
  33. package/dist/components/copy-button/CopyButton.js +19 -26
  34. package/dist/components/datetime-picker/DateTimePicker.d.ts +8 -5
  35. package/dist/components/datetime-picker/DateTimePicker.js +364 -459
  36. package/dist/components/filter-field/FilterField.d.ts +5 -2
  37. package/dist/components/filter-field/FilterField.js +130 -173
  38. package/dist/components/filter-field/FilterField.module.css +21 -5
  39. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.d.ts +36 -0
  40. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.js +53 -0
  41. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.module.css +60 -0
  42. package/dist/components/forms/checkbox/Checkbox.d.ts +31 -0
  43. package/dist/components/forms/checkbox/Checkbox.js +27 -0
  44. package/dist/components/{checkbox → forms/checkbox}/Checkbox.module.css +0 -1
  45. package/dist/components/forms/checkbox-group/CheckboxGroup.d.ts +47 -0
  46. package/dist/components/forms/checkbox-group/CheckboxGroup.js +75 -0
  47. package/dist/components/forms/checkbox-group/CheckboxGroup.module.css +115 -0
  48. package/dist/components/{input → forms/input}/Input.d.ts +9 -5
  49. package/dist/components/forms/input/Input.js +70 -0
  50. package/dist/components/{input → forms/input}/Input.module.css +1 -0
  51. package/dist/components/forms/input-container/InputContainer.d.ts +15 -0
  52. package/dist/components/forms/input-container/InputContainer.js +15 -0
  53. package/dist/components/forms/input-container/InputContainer.module.css +34 -0
  54. package/dist/components/forms/multi-select/MultiSelect.d.ts +20 -0
  55. package/dist/components/forms/multi-select/MultiSelect.js +19 -0
  56. package/dist/components/forms/select/Select.d.ts +21 -0
  57. package/dist/components/forms/select/Select.js +94 -0
  58. package/dist/components/forms/text-area/Textarea.d.ts +17 -0
  59. package/dist/components/forms/text-area/Textarea.js +33 -0
  60. package/dist/components/forms/text-area/Textarea.module.css +26 -0
  61. package/dist/components/headline/Headline.js +18 -43
  62. package/dist/components/{link/Link.d.ts → hyperlink/Hyperlink.d.ts} +2 -2
  63. package/dist/components/hyperlink/Hyperlink.js +11 -0
  64. package/dist/components/{link/Link.module.css → hyperlink/Hyperlink.module.css} +5 -14
  65. package/dist/components/icon/Icon.d.ts +4 -3
  66. package/dist/components/icon/Icon.js +11 -17
  67. package/dist/components/menu/Menu.js +25 -67
  68. package/dist/components/meta-bar/MetaBar.d.ts +4 -4
  69. package/dist/components/meta-bar/MetaBar.js +7 -20
  70. package/dist/components/nav-bar/NavBar.d.ts +5 -5
  71. package/dist/components/nav-bar/NavBar.js +15 -45
  72. package/dist/components/{modal → overlay/modal}/Modal.d.ts +4 -2
  73. package/dist/components/overlay/modal/Modal.js +92 -0
  74. package/dist/components/{modal → overlay/modal}/provider/ModalProvider.d.ts +0 -1
  75. package/dist/components/overlay/modal/provider/ModalProvider.js +70 -0
  76. package/dist/components/overlay/side-panel/SidePanel.d.ts +16 -0
  77. package/dist/components/overlay/side-panel/SidePanel.js +10 -0
  78. package/dist/components/overlay/side-panel/SidePanel.module.css +56 -0
  79. package/dist/components/overlay/side-panel/useSidePanel.d.ts +5 -0
  80. package/dist/components/overlay/side-panel/useSidePanel.js +11 -0
  81. package/dist/components/overlay/tooltip/Tooltip.d.ts +13 -0
  82. package/dist/components/overlay/tooltip/Tooltip.js +17 -0
  83. package/dist/components/overlay/tooltip/Tooltip.module.css +106 -0
  84. package/dist/components/overlay/tooltip/TooltipProvider.d.ts +20 -0
  85. package/dist/components/overlay/tooltip/TooltipProvider.js +244 -0
  86. package/dist/components/overlay/tooltip/useTooltipTrigger.d.ts +24 -0
  87. package/dist/components/overlay/tooltip/useTooltipTrigger.js +108 -0
  88. package/dist/components/page/Page.d.ts +7 -6
  89. package/dist/components/page/Page.js +4 -21
  90. package/dist/components/page-layout/PageLayout.d.ts +11 -12
  91. package/dist/components/page-layout/PageLayout.js +35 -71
  92. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.js +4 -22
  93. package/dist/components/pagination/Pagination.d.ts +2 -1
  94. package/dist/components/pagination/Pagination.js +38 -121
  95. package/dist/components/panel/Panel.d.ts +4 -3
  96. package/dist/components/panel/Panel.js +5 -10
  97. package/dist/components/popover/Popover.d.ts +1 -0
  98. package/dist/components/popover/Popover.js +116 -141
  99. package/dist/components/search-box/SearchBox.d.ts +2 -2
  100. package/dist/components/search-box/SearchBox.js +112 -162
  101. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +1 -1
  102. package/dist/components/segmented-progress-bar/SegmentedProgressBar.js +47 -94
  103. package/dist/components/sidebar/Sidebar.d.ts +1 -0
  104. package/dist/components/sidebar/Sidebar.js +5 -7
  105. package/dist/components/sidebar/components/SidebarItem.js +6 -14
  106. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.d.ts +1 -1
  107. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.js +48 -88
  108. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.d.ts +3 -2
  109. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.js +11 -41
  110. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.d.ts +1 -0
  111. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.js +4 -25
  112. package/dist/components/sidebar/components/sidebar-items/SidebarItems.js +9 -23
  113. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.js +19 -40
  114. package/dist/components/sidebar/providers/SidebarProvider.d.ts +2 -1
  115. package/dist/components/sidebar/providers/SidebarProvider.js +182 -165
  116. package/dist/components/skeleton-loader/SkeletonLoader.js +68 -266
  117. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +11 -34
  118. package/dist/components/split-button/SplitButton.d.ts +7 -5
  119. package/dist/components/split-button/SplitButton.js +4 -27
  120. package/dist/components/split-pane/SplitPane.js +69 -105
  121. package/dist/components/split-pane/provider/SplitPaneContext.js +77 -71
  122. package/dist/components/table/Table.d.ts +9 -7
  123. package/dist/components/table/Table.js +115 -238
  124. package/dist/components/table/Table.module.css +5 -1
  125. package/dist/components/table/components/column-resizer/ColumnResizer.js +4 -15
  126. package/dist/components/table/components/empty-state/EmptyState.d.ts +6 -5
  127. package/dist/components/table/components/empty-state/EmptyState.js +22 -41
  128. package/dist/components/table/components/table-settings/TableSettings.d.ts +2 -1
  129. package/dist/components/table/components/table-settings/TableSettings.js +9 -27
  130. package/dist/components/table/tanstack.d.ts +1 -1
  131. package/dist/components/table/tanstack.js +154 -160
  132. package/dist/components/tabs/Tabs.d.ts +1 -0
  133. package/dist/components/tabs/Tabs.js +32 -81
  134. package/dist/components/toast/Toast.d.ts +1 -1
  135. package/dist/components/toast/Toast.js +4 -37
  136. package/dist/components/toast/Toast.module.css +1 -0
  137. package/dist/components/toast/provider/ToastProvider.d.ts +1 -1
  138. package/dist/components/toast/provider/ToastProvider.js +60 -87
  139. package/dist/components/user-display/UserDisplay.d.ts +2 -1
  140. package/dist/components/user-display/UserDisplay.js +4 -20
  141. package/dist/constants/severity.d.ts +1 -1
  142. package/dist/constants/severity.js +14 -16
  143. package/dist/constants/severity.types.d.ts +1 -1
  144. package/dist/constants/severity.types.js +1 -1
  145. package/dist/constants/sizes.js +6 -8
  146. package/dist/hooks/usePagination.d.ts +1 -1
  147. package/dist/hooks/usePagination.js +75 -82
  148. package/dist/hooks/useSorting.js +112 -110
  149. package/dist/hooks/useTableData.d.ts +1 -1
  150. package/dist/hooks/useTableData.js +42 -47
  151. package/dist/hooks/useTableSelection.js +121 -121
  152. package/dist/hooks/useTableSettings.js +23 -25
  153. package/dist/hooks/useTheme.d.ts +3 -7
  154. package/dist/hooks/useTheme.js +52 -47
  155. package/dist/hooks/useTimeDuration.d.ts +2 -2
  156. package/dist/hooks/useTimeDuration.js +33 -34
  157. package/dist/hooks/useViewportFill.d.ts +3 -2
  158. package/dist/hooks/useViewportFill.js +55 -48
  159. package/dist/index.d.ts +17 -8
  160. package/dist/index.js +18 -8
  161. package/dist/src/styles/styles.css +3 -3
  162. package/dist/styles/css-helper-classes/flex.css +4 -0
  163. package/dist/styles/styles.css +3 -3
  164. package/dist/styles/themes/dbc/dark.css +1 -1
  165. package/dist/styles/themes/dbc/light.css +2 -1
  166. package/dist/styles/themes/forfatterweb/light.css +1 -1
  167. package/dist/styles/themes/types.js +1 -1
  168. package/dist/types/a11y-props.types.d.ts +5 -5
  169. package/dist/types/a11y-props.types.js +1 -1
  170. package/dist/types/sizes.types.js +1 -1
  171. package/dist/utils/arrays/nested-filtering.js +43 -33
  172. package/dist/utils/date/formatDate.js +25 -16
  173. package/package.json +18 -9
  174. package/dist/assets/logo.cjs +0 -87
  175. package/dist/components/__stories__/story-components/Colors.cjs +0 -159
  176. package/dist/components/__stories__/story-components/Spacing.cjs +0 -190
  177. package/dist/components/app-header/AppHeader.cjs +0 -14
  178. package/dist/components/attribute-chip/AttributeChip.cjs +0 -22
  179. package/dist/components/avatar/Avatar.cjs +0 -101
  180. package/dist/components/breadcrumbs/Breadcrumbs.cjs +0 -22
  181. package/dist/components/button/Button.cjs +0 -87
  182. package/dist/components/card/Card.cjs +0 -69
  183. package/dist/components/card-container/CardContainer.cjs +0 -24
  184. package/dist/components/checkbox/Checkbox.cjs +0 -42
  185. package/dist/components/checkbox/Checkbox.d.ts +0 -12
  186. package/dist/components/checkbox/Checkbox.js +0 -36
  187. package/dist/components/chip/Chip.cjs +0 -50
  188. package/dist/components/circle/Circle.cjs +0 -18
  189. package/dist/components/clear-button/ClearButton.cjs +0 -26
  190. package/dist/components/code-block/CodeBlock.cjs +0 -18
  191. package/dist/components/copy-button/CopyButton.cjs +0 -35
  192. package/dist/components/datetime-picker/DateTimePicker.cjs +0 -504
  193. package/dist/components/filter-field/FilterField.cjs +0 -189
  194. package/dist/components/headline/Headline.cjs +0 -53
  195. package/dist/components/icon/Icon.cjs +0 -27
  196. package/dist/components/input/Input.cjs +0 -89
  197. package/dist/components/input/Input.js +0 -83
  198. package/dist/components/link/Link.cjs +0 -46
  199. package/dist/components/link/Link.js +0 -21
  200. package/dist/components/menu/Menu.cjs +0 -96
  201. package/dist/components/meta-bar/MetaBar.cjs +0 -29
  202. package/dist/components/modal/Modal.cjs +0 -134
  203. package/dist/components/modal/Modal.js +0 -128
  204. package/dist/components/modal/provider/ModalProvider.cjs +0 -80
  205. package/dist/components/modal/provider/ModalProvider.js +0 -77
  206. package/dist/components/multi-select/MultiSelect.cjs +0 -59
  207. package/dist/components/multi-select/MultiSelect.d.ts +0 -18
  208. package/dist/components/multi-select/MultiSelect.js +0 -57
  209. package/dist/components/nav-bar/NavBar.cjs +0 -55
  210. package/dist/components/page/Page.cjs +0 -30
  211. package/dist/components/page-layout/PageLayout.cjs +0 -84
  212. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.cjs +0 -32
  213. package/dist/components/pagination/Pagination.cjs +0 -133
  214. package/dist/components/panel/Panel.cjs +0 -18
  215. package/dist/components/popover/Popover.cjs +0 -149
  216. package/dist/components/search-box/SearchBox.cjs +0 -175
  217. package/dist/components/segmented-progress-bar/SegmentedProgressBar.cjs +0 -103
  218. package/dist/components/select/Select.cjs +0 -121
  219. package/dist/components/select/Select.d.ts +0 -12
  220. package/dist/components/select/Select.js +0 -119
  221. package/dist/components/sidebar/Sidebar.cjs +0 -11
  222. package/dist/components/sidebar/components/SidebarItem.cjs +0 -18
  223. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.cjs +0 -100
  224. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.cjs +0 -50
  225. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.cjs +0 -34
  226. package/dist/components/sidebar/components/sidebar-items/SidebarItems.cjs +0 -29
  227. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.cjs +0 -52
  228. package/dist/components/sidebar/providers/SidebarProvider.cjs +0 -179
  229. package/dist/components/skeleton-loader/SkeletonLoader.cjs +0 -270
  230. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +0 -42
  231. package/dist/components/split-button/SplitButton.cjs +0 -37
  232. package/dist/components/split-pane/SplitPane.cjs +0 -123
  233. package/dist/components/split-pane/provider/SplitPaneContext.cjs +0 -87
  234. package/dist/components/table/Table.cjs +0 -249
  235. package/dist/components/table/components/column-resizer/ColumnResizer.cjs +0 -22
  236. package/dist/components/table/components/empty-state/EmptyState.cjs +0 -52
  237. package/dist/components/table/components/table-settings/TableSettings.cjs +0 -32
  238. package/dist/components/table/tanstack.cjs +0 -193
  239. package/dist/components/tabs/Tabs.cjs +0 -90
  240. package/dist/components/text-area/Textarea.cjs +0 -62
  241. package/dist/components/text-area/Textarea.d.ts +0 -14
  242. package/dist/components/text-area/Textarea.js +0 -56
  243. package/dist/components/text-area/Textarea.module.css +0 -3
  244. package/dist/components/toast/Toast.cjs +0 -47
  245. package/dist/components/toast/provider/ToastProvider.cjs +0 -98
  246. package/dist/components/tooltip/Tooltip.cjs +0 -183
  247. package/dist/components/tooltip/Tooltip.d.ts +0 -11
  248. package/dist/components/tooltip/Tooltip.js +0 -177
  249. package/dist/components/tooltip/Tooltip.module.css +0 -66
  250. package/dist/components/user-display/UserDisplay.cjs +0 -28
  251. package/dist/constants/severity.cjs +0 -21
  252. package/dist/constants/severity.types.cjs +0 -2
  253. package/dist/constants/sizes.cjs +0 -11
  254. package/dist/hooks/usePagination.cjs +0 -88
  255. package/dist/hooks/useSorting.cjs +0 -118
  256. package/dist/hooks/useTableData.cjs +0 -52
  257. package/dist/hooks/useTableSelection.cjs +0 -130
  258. package/dist/hooks/useTableSettings.cjs +0 -28
  259. package/dist/hooks/useTheme.cjs +0 -58
  260. package/dist/hooks/useTimeDuration.cjs +0 -39
  261. package/dist/hooks/useViewportFill.cjs +0 -52
  262. package/dist/index.cjs +0 -383
  263. package/dist/styles/themes/types.cjs +0 -2
  264. package/dist/types/a11y-props.types.cjs +0 -2
  265. package/dist/types/assets.d.cjs +0 -2
  266. package/dist/types/assets.d.js +0 -1
  267. package/dist/types/css.d.cjs +0 -2
  268. package/dist/types/css.d.js +0 -1
  269. package/dist/types/sizes.types.cjs +0 -2
  270. package/dist/utils/arrays/nested-filtering.cjs +0 -40
  271. package/dist/utils/date/formatDate.cjs +0 -19
  272. /package/dist/components/{modal → overlay/modal}/Modal.module.css +0 -0
@@ -1,116 +1,118 @@
1
- import { useState, useCallback, useRef, useEffect, useMemo } from 'react';
2
-
1
+ 'use client';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  function defaultCompare(a, b, dir, nulls) {
4
- const aNull = a == null;
5
- const bNull = b == null;
6
- if (aNull || bNull) {
7
- if (aNull && bNull) return 0;
8
- const order = nulls === "first" ? -1 : 1;
9
- return aNull ? order : -order;
10
- }
11
- if (a instanceof Date && b instanceof Date) {
12
- const diff2 = a.getTime() - b.getTime();
13
- return dir === "asc" ? diff2 : -diff2;
14
- }
15
- if (typeof a === "number" && typeof b === "number") {
16
- const diff2 = a - b;
17
- return dir === "asc" ? diff2 : -diff2;
18
- }
19
- if (typeof a === "boolean" && typeof b === "boolean") {
20
- const diff2 = Number(a) - Number(b);
21
- return dir === "asc" ? diff2 : -diff2;
22
- }
23
- const aStr = String(a);
24
- const bStr = String(b);
25
- const diff = aStr.localeCompare(bStr, void 0, { numeric: true, sensitivity: "base" });
26
- return dir === "asc" ? diff : -diff;
4
+ const aNull = a == null;
5
+ const bNull = b == null;
6
+ if (aNull || bNull) {
7
+ if (aNull && bNull)
8
+ return 0;
9
+ const order = nulls === 'first' ? -1 : 1;
10
+ return aNull ? order : -order;
11
+ }
12
+ // Dates
13
+ if (a instanceof Date && b instanceof Date) {
14
+ const diff = a.getTime() - b.getTime();
15
+ return dir === 'asc' ? diff : -diff;
16
+ }
17
+ // Numbers
18
+ if (typeof a === 'number' && typeof b === 'number') {
19
+ const diff = a - b;
20
+ return dir === 'asc' ? diff : -diff;
21
+ }
22
+ // Booleans
23
+ if (typeof a === 'boolean' && typeof b === 'boolean') {
24
+ const diff = Number(a) - Number(b);
25
+ return dir === 'asc' ? diff : -diff;
26
+ }
27
+ // Strings (locale-aware-ish)
28
+ const aStr = String(a);
29
+ const bStr = String(b);
30
+ const diff = aStr.localeCompare(bStr, undefined, { numeric: true, sensitivity: 'base' });
31
+ return dir === 'asc' ? diff : -diff;
27
32
  }
33
+ // Stable sort (decorate-sort-undecorate)
28
34
  function stableSort(arr, cmp) {
29
- return arr.map((item, idx) => ({ item, idx })).sort((x, y) => {
30
- const c = cmp(x.item, y.item);
31
- return c !== 0 ? c : x.idx - y.idx;
32
- }).map((x) => x.item);
35
+ return arr
36
+ .map((item, idx) => ({ item, idx }))
37
+ .sort((x, y) => {
38
+ const c = cmp(x.item, y.item);
39
+ return c !== 0 ? c : x.idx - y.idx;
40
+ })
41
+ .map(x => x.item);
33
42
  }
34
- function useSorting({
35
- data = [],
36
- sortBy = null,
37
- sortDirection = "asc",
38
- state,
39
- onStateChange,
40
- columnComparators = {},
41
- nulls = "last",
42
- allowUnsort = true,
43
- resetOnDataChange = false
44
- }) {
45
- const isControlled = state != null;
46
- const [uncontrolled, setUncontrolled] = useState(() => ({
47
- sortBy,
48
- sortDirection
49
- }));
50
- const sortState = isControlled ? state : uncontrolled;
51
- const setSort = useCallback(
52
- (next) => {
53
- var _a, _b;
54
- const normalized = {
55
- sortBy: (_a = next.sortBy) != null ? _a : null,
56
- sortDirection: (_b = next.sortDirection) != null ? _b : null
57
- };
58
- if (isControlled) onStateChange == null ? void 0 : onStateChange(normalized);
59
- else setUncontrolled(normalized);
60
- },
61
- [isControlled, onStateChange]
62
- );
63
- const clearSort = useCallback(() => setSort({ sortBy: null, sortDirection: null }), [setSort]);
64
- const onSortChange = useCallback(
65
- (e) => {
66
- var _a, _b;
67
- const nextSortBy = (_a = e.sortBy) != null ? _a : null;
68
- setSort(sortState);
69
- const current = sortState;
70
- if (nextSortBy == null) {
71
- return clearSort();
72
- }
73
- if (current.sortBy === nextSortBy) {
74
- const nextDir = current.sortDirection === "asc" ? "desc" : allowUnsort ? null : "asc";
75
- return setSort({ sortBy: nextSortBy, sortDirection: nextDir });
76
- }
77
- return setSort({
78
- sortBy: nextSortBy,
79
- sortDirection: (_b = e.sortDirection) != null ? _b : "asc"
80
- });
81
- },
82
- [allowUnsort, clearSort, setSort, sortState]
83
- );
84
- const didInitRef = useRef(false);
85
- useEffect(() => {
86
- if (!resetOnDataChange) return;
87
- if (!didInitRef.current) {
88
- didInitRef.current = true;
89
- return;
90
- }
91
- clearSort();
92
- }, [resetOnDataChange, data]);
93
- const sortedData = useMemo(() => {
94
- const { sortBy: sb, sortDirection: dir } = sortState;
95
- if (!sb || !dir) return data;
96
- const custom = columnComparators[sb];
97
- const cmp = (a, b) => {
98
- if (custom) return custom(a, b, dir);
99
- const av = a[sb];
100
- const bv = b[sb];
101
- return defaultCompare(av, bv, dir, nulls);
43
+ export function useSorting({ data = [], sortBy = null, sortDirection = 'asc', state, onStateChange, columnComparators = {}, nulls = 'last', allowUnsort = true, resetOnDataChange = false, }) {
44
+ const isControlled = state != null;
45
+ const [uncontrolled, setUncontrolled] = useState(() => ({
46
+ sortBy,
47
+ sortDirection,
48
+ }));
49
+ const sortState = (isControlled ? state : uncontrolled);
50
+ const setSort = useCallback((next) => {
51
+ var _a, _b;
52
+ const normalized = {
53
+ sortBy: (_a = next.sortBy) !== null && _a !== void 0 ? _a : null,
54
+ sortDirection: (_b = next.sortDirection) !== null && _b !== void 0 ? _b : null,
55
+ };
56
+ if (isControlled)
57
+ onStateChange === null || onStateChange === void 0 ? void 0 : onStateChange(normalized);
58
+ else
59
+ setUncontrolled(normalized);
60
+ }, [isControlled, onStateChange]);
61
+ const clearSort = useCallback(() => setSort({ sortBy: null, sortDirection: null }), [setSort]);
62
+ const onSortChange = useCallback((e) => {
63
+ var _a, _b;
64
+ const nextSortBy = ((_a = e.sortBy) !== null && _a !== void 0 ? _a : null);
65
+ setSort(sortState);
66
+ const current = sortState;
67
+ if (nextSortBy == null) {
68
+ return clearSort();
69
+ }
70
+ // Same column toggling
71
+ if (current.sortBy === nextSortBy) {
72
+ const nextDir = current.sortDirection === 'asc' ? 'desc' : allowUnsort ? null : 'asc';
73
+ return setSort({ sortBy: nextSortBy, sortDirection: nextDir });
74
+ }
75
+ // New column: default to provided direction or asc
76
+ return setSort({
77
+ sortBy: nextSortBy,
78
+ sortDirection: (_b = e.sortDirection) !== null && _b !== void 0 ? _b : 'asc',
79
+ });
80
+ }, [allowUnsort, clearSort, setSort, sortState]);
81
+ // Optional reset on data ref change
82
+ const didInitRef = useRef(false);
83
+ useEffect(() => {
84
+ if (!resetOnDataChange)
85
+ return;
86
+ if (!didInitRef.current) {
87
+ didInitRef.current = true;
88
+ return;
89
+ }
90
+ clearSort();
91
+ // eslint-disable-next-line react-hooks/exhaustive-deps
92
+ }, [resetOnDataChange, data]);
93
+ const sortedData = useMemo(() => {
94
+ const { sortBy: sb, sortDirection: dir } = sortState;
95
+ if (!sb || !dir)
96
+ return data;
97
+ const custom = columnComparators[sb];
98
+ const cmp = (a, b) => {
99
+ if (custom)
100
+ return custom(a, b, dir);
101
+ const av = a[sb];
102
+ const bv = b[sb];
103
+ return defaultCompare(av, bv, dir, nulls);
104
+ };
105
+ // Don’t mutate input
106
+ return stableSort(data, cmp);
107
+ }, [data, sortState, columnComparators, nulls]);
108
+ // Helper: support functional updates in uncontrolled mode (optional nicety)
109
+ const setSortRef = useRef(setSort);
110
+ setSortRef.current = setSort;
111
+ return {
112
+ sortedData,
113
+ sortState,
114
+ onSortChange,
115
+ setSort,
116
+ clearSort,
102
117
  };
103
- return stableSort(data, cmp);
104
- }, [data, sortState, columnComparators, nulls]);
105
- const setSortRef = useRef(setSort);
106
- setSortRef.current = setSort;
107
- return {
108
- sortedData,
109
- sortState,
110
- onSortChange,
111
- setSort,
112
- clearSort
113
- };
114
118
  }
115
-
116
- export { useSorting };
@@ -1,4 +1,4 @@
1
- import type { PageChangeEvent } from '@/components/pagination/Pagination';
1
+ import type { PageChangeEvent } from '../components/pagination/Pagination';
2
2
  import { type PaginationState } from './usePagination';
3
3
  import { type SortDirection, type SortState, type ColumnComparators } from './useSorting';
4
4
  export interface UseTableDataProps<T> {
@@ -1,50 +1,45 @@
1
+ 'use client';
1
2
  import { useEffect, useMemo } from 'react';
2
3
  import { usePagination } from './usePagination';
3
- import { useSorting } from './useSorting';
4
-
5
- function useTableData({
6
- data = [],
7
- pagination,
8
- sorting,
9
- resetPageOnSortChange = true
10
- }) {
11
- var _a, _b, _c, _d, _e, _f;
12
- const s = useSorting({
13
- data,
14
- sortBy: (_a = sorting == null ? void 0 : sorting.sortBy) != null ? _a : null,
15
- sortDirection: (_b = sorting == null ? void 0 : sorting.direction) != null ? _b : null,
16
- state: sorting == null ? void 0 : sorting.state,
17
- onStateChange: sorting == null ? void 0 : sorting.onStateChange,
18
- columnComparators: sorting == null ? void 0 : sorting.columnComparators,
19
- nulls: (_c = sorting == null ? void 0 : sorting.nulls) != null ? _c : "last",
20
- allowUnsort: (_d = sorting == null ? void 0 : sorting.allowUnsort) != null ? _d : true
21
- });
22
- const p = usePagination({
23
- data: s.sortedData,
24
- skip: (_e = pagination == null ? void 0 : pagination.skip) != null ? _e : 0,
25
- take: (_f = pagination == null ? void 0 : pagination.take) != null ? _f : 10,
26
- state: pagination == null ? void 0 : pagination.state,
27
- onStateChange: pagination == null ? void 0 : pagination.onStateChange
28
- });
29
- useEffect(() => {
30
- if (!resetPageOnSortChange) return;
31
- p.resetPage();
32
- }, [resetPageOnSortChange, s.sortState.sortBy, s.sortState.sortDirection]);
33
- const rows = useMemo(() => p.paginatedData, [p.paginatedData]);
34
- return {
35
- rows,
36
- totalCount: s.sortedData.length,
37
- pagination: {
38
- state: p.paginationState,
39
- onPageChange: p.onPageChange,
40
- resetPage: p.resetPage
41
- },
42
- sorting: {
43
- state: s.sortState,
44
- onSortChange: s.onSortChange,
45
- clearSort: s.clearSort
46
- }
47
- };
4
+ import { useSorting, } from './useSorting';
5
+ export function useTableData({ data = [], pagination, sorting, resetPageOnSortChange = true, }) {
6
+ var _a, _b, _c, _d, _e, _f;
7
+ const s = useSorting({
8
+ data,
9
+ sortBy: (_a = sorting === null || sorting === void 0 ? void 0 : sorting.sortBy) !== null && _a !== void 0 ? _a : null,
10
+ sortDirection: (_b = sorting === null || sorting === void 0 ? void 0 : sorting.direction) !== null && _b !== void 0 ? _b : null,
11
+ state: sorting === null || sorting === void 0 ? void 0 : sorting.state,
12
+ onStateChange: sorting === null || sorting === void 0 ? void 0 : sorting.onStateChange,
13
+ columnComparators: sorting === null || sorting === void 0 ? void 0 : sorting.columnComparators,
14
+ nulls: (_c = sorting === null || sorting === void 0 ? void 0 : sorting.nulls) !== null && _c !== void 0 ? _c : 'last',
15
+ allowUnsort: (_d = sorting === null || sorting === void 0 ? void 0 : sorting.allowUnsort) !== null && _d !== void 0 ? _d : true,
16
+ });
17
+ const p = usePagination({
18
+ data: s.sortedData,
19
+ skip: (_e = pagination === null || pagination === void 0 ? void 0 : pagination.skip) !== null && _e !== void 0 ? _e : 0,
20
+ take: (_f = pagination === null || pagination === void 0 ? void 0 : pagination.take) !== null && _f !== void 0 ? _f : 10,
21
+ state: pagination === null || pagination === void 0 ? void 0 : pagination.state,
22
+ onStateChange: pagination === null || pagination === void 0 ? void 0 : pagination.onStateChange,
23
+ });
24
+ useEffect(() => {
25
+ if (!resetPageOnSortChange)
26
+ return;
27
+ p.resetPage();
28
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29
+ }, [resetPageOnSortChange, s.sortState.sortBy, s.sortState.sortDirection]);
30
+ const rows = useMemo(() => p.paginatedData, [p.paginatedData]);
31
+ return {
32
+ rows,
33
+ totalCount: s.sortedData.length,
34
+ pagination: {
35
+ state: p.paginationState,
36
+ onPageChange: p.onPageChange,
37
+ resetPage: p.resetPage,
38
+ },
39
+ sorting: {
40
+ state: s.sortState,
41
+ onSortChange: s.onSortChange,
42
+ clearSort: s.clearSort,
43
+ },
44
+ };
48
45
  }
49
-
50
- export { useTableData };
@@ -1,128 +1,128 @@
1
- import { useState, useMemo, useEffect, useCallback } from 'react';
2
-
3
- function useTableSelection({
4
- storageKey,
5
- items,
6
- getId,
7
- initialSelectedIds = /* @__PURE__ */ new Set(),
8
- totalItems,
9
- onSelectionChange,
10
- selectionMode = "single"
11
- }) {
12
- const [selectedIds, setSelectedIds] = useState(initialSelectedIds);
13
- const [selectedItemMap, setSelectedItemMap] = useState(() => /* @__PURE__ */ new Map());
14
- const itemsById = useMemo(() => {
15
- const m = /* @__PURE__ */ new Map();
16
- for (const item of items) m.set(getId(item), item);
17
- return m;
18
- }, [items, getId]);
19
- useEffect(() => {
20
- const stored = window.localStorage.getItem(storageKey);
21
- if (!stored) {
22
- setSelectedIds(initialSelectedIds);
23
- return;
24
- }
25
- try {
26
- const parsed = JSON.parse(stored);
27
- setSelectedIds(new Set(parsed));
28
- } catch {
29
- setSelectedIds(initialSelectedIds);
30
- }
31
- }, [storageKey]);
32
- useEffect(() => {
33
- setSelectedItemMap((prev) => {
34
- const next = /* @__PURE__ */ new Map();
35
- for (const id of selectedIds) {
36
- const item = itemsById.get(id);
37
- if (item !== void 0) next.set(id, item);
38
- }
39
- if (next.size === prev.size) {
40
- let same = true;
41
- for (const [id, item] of next) {
42
- if (prev.get(id) !== item) {
43
- same = false;
44
- break;
45
- }
1
+ 'use client';
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ export function useTableSelection({ storageKey, items, getId, initialSelectedIds = new Set(), totalItems, onSelectionChange, selectionMode = 'single', }) {
4
+ // Selected IDs are persisted and are your primary lookup structure
5
+ const [selectedIds, setSelectedIds] = useState(initialSelectedIds);
6
+ // Keep the actual selected items keyed by id for O(1) access
7
+ const [selectedItemMap, setSelectedItemMap] = useState(() => new Map());
8
+ // Build a fast lookup of current items by id (for hydration + reconciliation)
9
+ const itemsById = useMemo(() => {
10
+ const m = new Map();
11
+ for (const item of items)
12
+ m.set(getId(item), item);
13
+ return m;
14
+ }, [items, getId]);
15
+ // Hydrate selectedIds from localStorage on mount / storageKey change
16
+ useEffect(() => {
17
+ const stored = window.localStorage.getItem(storageKey);
18
+ if (!stored) {
19
+ setSelectedIds(initialSelectedIds);
20
+ return;
46
21
  }
47
- if (same) return prev;
48
- }
49
- return next;
50
- });
51
- }, [selectedIds, itemsById]);
52
- const selectedItems = useMemo(() => Array.from(selectedItemMap.values()), [selectedItemMap]);
53
- const allSelected = useMemo(() => {
54
- if (typeof totalItems !== "number") return false;
55
- return totalItems > 0 && selectedIds.size === totalItems;
56
- }, [selectedIds, totalItems]);
57
- const anySelected = useMemo(() => selectedIds.size > 0, [selectedIds]);
58
- useEffect(() => {
59
- window.localStorage.setItem(storageKey, JSON.stringify(Array.from(selectedIds)));
60
- onSelectionChange == null ? void 0 : onSelectionChange({ selectedIds, selectedItems });
61
- }, [selectedIds, selectedItems, storageKey, onSelectionChange]);
62
- const toggleId = useCallback(
63
- (id) => {
64
- setSelectedIds((prevIds) => {
65
- const nextIds = new Set(prevIds);
66
- const isSelected = nextIds.has(id);
67
- if (isSelected) {
68
- nextIds.delete(id);
69
- } else {
70
- if (selectionMode === "single") nextIds.clear();
71
- nextIds.add(id);
22
+ try {
23
+ const parsed = JSON.parse(stored);
24
+ setSelectedIds(new Set(parsed));
72
25
  }
73
- return nextIds;
74
- });
75
- setSelectedItemMap((prevMap) => {
76
- const nextMap = new Map(prevMap);
77
- const isSelected = nextMap.has(id);
78
- if (isSelected) {
79
- nextMap.delete(id);
80
- } else {
81
- if (selectionMode === "single") nextMap.clear();
82
- const item = itemsById.get(id);
83
- if (item !== void 0) nextMap.set(id, item);
26
+ catch {
27
+ setSelectedIds(initialSelectedIds);
84
28
  }
85
- return nextMap;
86
- });
87
- },
88
- [itemsById, selectionMode]
89
- );
90
- const toggleItem = useCallback(
91
- (item) => {
92
- toggleId(getId(item));
93
- },
94
- [toggleId, getId]
95
- );
96
- const toggleAll = useCallback(
97
- (selected) => {
98
- if (!selected) {
99
- clearSelection();
100
- } else {
101
- const nextIds = /* @__PURE__ */ new Set();
29
+ // eslint-disable-next-line react-hooks/exhaustive-deps
30
+ }, [storageKey]);
31
+ // Reconcile selectedItemMap whenever selectedIds or items change.
32
+ // This makes sure selectedItems stay up to date without scanning the full items list on every render.
33
+ useEffect(() => {
34
+ setSelectedItemMap(prev => {
35
+ const next = new Map();
36
+ // Keep only ids that still exist in itemsById (if list changed)
37
+ for (const id of selectedIds) {
38
+ const item = itemsById.get(id);
39
+ if (item !== undefined)
40
+ next.set(id, item);
41
+ }
42
+ // If nothing changed, return prev to avoid re-renders
43
+ if (next.size === prev.size) {
44
+ let same = true;
45
+ for (const [id, item] of next) {
46
+ if (prev.get(id) !== item) {
47
+ same = false;
48
+ break;
49
+ }
50
+ }
51
+ if (same)
52
+ return prev;
53
+ }
54
+ return next;
55
+ });
56
+ }, [selectedIds, itemsById]);
57
+ const selectedItems = useMemo(() => Array.from(selectedItemMap.values()), [selectedItemMap]);
58
+ const allSelected = useMemo(() => {
59
+ if (typeof totalItems !== 'number')
60
+ return false;
61
+ return totalItems > 0 && selectedIds.size === totalItems;
62
+ }, [selectedIds, totalItems]);
63
+ const anySelected = useMemo(() => selectedIds.size > 0, [selectedIds]);
64
+ useEffect(() => {
65
+ window.localStorage.setItem(storageKey, JSON.stringify(Array.from(selectedIds)));
66
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange({ selectedIds, selectedItems });
67
+ }, [selectedIds, selectedItems, storageKey, onSelectionChange]);
68
+ const toggleId = useCallback((id) => {
69
+ setSelectedIds(prevIds => {
70
+ const nextIds = new Set(prevIds);
71
+ const isSelected = nextIds.has(id);
72
+ if (isSelected) {
73
+ nextIds.delete(id);
74
+ }
75
+ else {
76
+ if (selectionMode === 'single')
77
+ nextIds.clear();
78
+ nextIds.add(id);
79
+ }
80
+ return nextIds;
81
+ });
82
+ // Update selectedItemMap in the same interaction for snappy UI
83
+ setSelectedItemMap(prevMap => {
84
+ const nextMap = new Map(prevMap);
85
+ const isSelected = nextMap.has(id);
86
+ if (isSelected) {
87
+ nextMap.delete(id);
88
+ }
89
+ else {
90
+ if (selectionMode === 'single')
91
+ nextMap.clear();
92
+ const item = itemsById.get(id);
93
+ if (item !== undefined)
94
+ nextMap.set(id, item);
95
+ }
96
+ return nextMap;
97
+ });
98
+ }, [itemsById, selectionMode]);
99
+ const toggleItem = useCallback((item) => {
100
+ toggleId(getId(item));
101
+ }, [toggleId, getId]);
102
+ const clearSelection = useCallback(() => {
103
+ setSelectedIds(new Set());
104
+ setSelectedItemMap(new Map());
105
+ }, []);
106
+ const toggleAll = useCallback((selected) => {
107
+ if (!selected) {
108
+ clearSelection();
109
+ return;
110
+ }
111
+ const nextIds = new Set();
102
112
  for (const item of items) {
103
- nextIds.add(getId(item));
113
+ nextIds.add(getId(item));
104
114
  }
105
115
  setSelectedIds(nextIds);
106
- return nextIds;
107
- }
108
- },
109
- [allSelected, getId, items]
110
- );
111
- const clearSelection = useCallback(() => {
112
- setSelectedIds(/* @__PURE__ */ new Set());
113
- setSelectedItemMap(/* @__PURE__ */ new Map());
114
- }, []);
115
- return {
116
- selectedIds,
117
- selectedItems,
118
- selectedItemMap,
119
- toggleItem,
120
- toggleId,
121
- clearSelection,
122
- allSelected,
123
- anySelected,
124
- toggleAll
125
- };
116
+ }, [clearSelection, getId, items]);
117
+ return {
118
+ selectedIds,
119
+ selectedItems,
120
+ selectedItemMap,
121
+ toggleItem,
122
+ toggleId,
123
+ clearSelection,
124
+ allSelected,
125
+ anySelected,
126
+ toggleAll,
127
+ };
126
128
  }
127
-
128
- export { useTableSelection };
@@ -1,26 +1,24 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
-
3
- function useTableSettings(storageKey) {
4
- const [viewMode, setViewMode] = useState("compact");
5
- useEffect(() => {
6
- if (typeof window !== "undefined" && storageKey) {
7
- const storedMode = window.localStorage.getItem(`dbc-table-settings:${storageKey}`);
8
- if (storedMode === "compact" || storedMode === "comfortable") {
9
- setViewMode(storedMode);
10
- }
11
- }
12
- }, [storageKey]);
13
- const toggleViewMode = useCallback(() => {
14
- if (typeof window !== "undefined" && storageKey) {
15
- const newMode = viewMode === "comfortable" ? "compact" : "comfortable";
16
- window.localStorage.setItem(`dbc-table-settings:${storageKey}`, newMode);
17
- }
18
- setViewMode((prevMode) => prevMode === "comfortable" ? "compact" : "comfortable");
19
- }, [storageKey, viewMode]);
20
- return {
21
- viewMode,
22
- toggleViewMode
23
- };
1
+ 'use client';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ export function useTableSettings(storageKey) {
4
+ const [viewMode, setViewMode] = useState('compact');
5
+ useEffect(() => {
6
+ if (typeof window !== 'undefined' && storageKey) {
7
+ const storedMode = window.localStorage.getItem(`dbc-table-settings:${storageKey}`);
8
+ if (storedMode === 'compact' || storedMode === 'comfortable') {
9
+ setViewMode(storedMode);
10
+ }
11
+ }
12
+ }, [storageKey]);
13
+ const toggleViewMode = useCallback(() => {
14
+ if (typeof window !== 'undefined' && storageKey) {
15
+ const newMode = viewMode === 'comfortable' ? 'compact' : 'comfortable';
16
+ window.localStorage.setItem(`dbc-table-settings:${storageKey}`, newMode);
17
+ }
18
+ setViewMode(prevMode => (prevMode === 'comfortable' ? 'compact' : 'comfortable'));
19
+ }, [storageKey, viewMode]);
20
+ return {
21
+ viewMode,
22
+ toggleViewMode,
23
+ };
24
24
  }
25
-
26
- export { useTableSettings };
@@ -1,9 +1,5 @@
1
- export type ThemeId = string;
2
- export type ThemeUrls = Record<ThemeId, string>;
3
- export declare const LINK_ID = "dbc-theme-link";
4
- export type ThemeVariant = "light" | "dark";
1
+ export type ThemeVariant = 'light' | 'dark';
5
2
  export declare function useTheme(initialTheme?: ThemeVariant): {
6
- theme: ThemeId | null;
7
- switchTheme: (id: ThemeId) => string;
8
- linkId: string;
3
+ theme: ThemeVariant | null;
4
+ switchTheme: (id: ThemeVariant) => ThemeVariant;
9
5
  };