@dbcdk/react-components 0.0.5 → 0.0.7

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 (276) 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 +262 -475
  36. package/dist/components/datetime-picker/dateTimeHelpers.d.ts +13 -0
  37. package/dist/components/datetime-picker/dateTimeHelpers.js +119 -0
  38. package/dist/components/filter-field/FilterField.d.ts +5 -2
  39. package/dist/components/filter-field/FilterField.js +130 -173
  40. package/dist/components/filter-field/FilterField.module.css +21 -5
  41. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.d.ts +36 -0
  42. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.js +53 -0
  43. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.module.css +60 -0
  44. package/dist/components/forms/checkbox/Checkbox.d.ts +31 -0
  45. package/dist/components/forms/checkbox/Checkbox.js +27 -0
  46. package/dist/components/{checkbox → forms/checkbox}/Checkbox.module.css +0 -1
  47. package/dist/components/forms/checkbox-group/CheckboxGroup.d.ts +47 -0
  48. package/dist/components/forms/checkbox-group/CheckboxGroup.js +75 -0
  49. package/dist/components/forms/checkbox-group/CheckboxGroup.module.css +115 -0
  50. package/dist/components/{input → forms/input}/Input.d.ts +9 -5
  51. package/dist/components/forms/input/Input.js +70 -0
  52. package/dist/components/{input → forms/input}/Input.module.css +1 -0
  53. package/dist/components/forms/input-container/InputContainer.d.ts +15 -0
  54. package/dist/components/forms/input-container/InputContainer.js +15 -0
  55. package/dist/components/forms/input-container/InputContainer.module.css +34 -0
  56. package/dist/components/forms/multi-select/MultiSelect.d.ts +20 -0
  57. package/dist/components/forms/multi-select/MultiSelect.js +19 -0
  58. package/dist/components/forms/select/Select.d.ts +21 -0
  59. package/dist/components/forms/select/Select.js +94 -0
  60. package/dist/components/forms/text-area/Textarea.d.ts +17 -0
  61. package/dist/components/forms/text-area/Textarea.js +33 -0
  62. package/dist/components/forms/text-area/Textarea.module.css +26 -0
  63. package/dist/components/headline/Headline.js +18 -43
  64. package/dist/components/{link/Link.d.ts → hyperlink/Hyperlink.d.ts} +2 -2
  65. package/dist/components/hyperlink/Hyperlink.js +11 -0
  66. package/dist/components/{link/Link.module.css → hyperlink/Hyperlink.module.css} +5 -14
  67. package/dist/components/icon/Icon.d.ts +4 -3
  68. package/dist/components/icon/Icon.js +11 -17
  69. package/dist/components/interval-select/IntervalSelect.d.ts +30 -0
  70. package/dist/components/interval-select/IntervalSelect.js +82 -0
  71. package/dist/components/menu/Menu.js +25 -67
  72. package/dist/components/meta-bar/MetaBar.d.ts +4 -4
  73. package/dist/components/meta-bar/MetaBar.js +7 -20
  74. package/dist/components/nav-bar/NavBar.d.ts +5 -5
  75. package/dist/components/nav-bar/NavBar.js +15 -45
  76. package/dist/components/{modal → overlay/modal}/Modal.d.ts +4 -2
  77. package/dist/components/overlay/modal/Modal.js +92 -0
  78. package/dist/components/{modal → overlay/modal}/provider/ModalProvider.d.ts +0 -1
  79. package/dist/components/overlay/modal/provider/ModalProvider.js +70 -0
  80. package/dist/components/overlay/side-panel/SidePanel.d.ts +16 -0
  81. package/dist/components/overlay/side-panel/SidePanel.js +10 -0
  82. package/dist/components/overlay/side-panel/SidePanel.module.css +56 -0
  83. package/dist/components/overlay/side-panel/useSidePanel.d.ts +5 -0
  84. package/dist/components/overlay/side-panel/useSidePanel.js +11 -0
  85. package/dist/components/overlay/tooltip/Tooltip.d.ts +13 -0
  86. package/dist/components/overlay/tooltip/Tooltip.js +17 -0
  87. package/dist/components/overlay/tooltip/Tooltip.module.css +106 -0
  88. package/dist/components/overlay/tooltip/TooltipProvider.d.ts +20 -0
  89. package/dist/components/overlay/tooltip/TooltipProvider.js +244 -0
  90. package/dist/components/overlay/tooltip/useTooltipTrigger.d.ts +24 -0
  91. package/dist/components/overlay/tooltip/useTooltipTrigger.js +108 -0
  92. package/dist/components/page/Page.d.ts +7 -6
  93. package/dist/components/page/Page.js +4 -21
  94. package/dist/components/page-layout/PageLayout.d.ts +11 -12
  95. package/dist/components/page-layout/PageLayout.js +35 -71
  96. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.js +4 -22
  97. package/dist/components/pagination/Pagination.d.ts +2 -1
  98. package/dist/components/pagination/Pagination.js +38 -121
  99. package/dist/components/panel/Panel.d.ts +4 -3
  100. package/dist/components/panel/Panel.js +5 -10
  101. package/dist/components/popover/Popover.d.ts +1 -0
  102. package/dist/components/popover/Popover.js +116 -141
  103. package/dist/components/search-box/SearchBox.d.ts +2 -2
  104. package/dist/components/search-box/SearchBox.js +112 -162
  105. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +1 -1
  106. package/dist/components/segmented-progress-bar/SegmentedProgressBar.js +47 -94
  107. package/dist/components/sidebar/Sidebar.d.ts +1 -0
  108. package/dist/components/sidebar/Sidebar.js +5 -7
  109. package/dist/components/sidebar/components/SidebarItem.js +6 -14
  110. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.d.ts +1 -1
  111. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.js +48 -88
  112. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.d.ts +3 -2
  113. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.js +11 -41
  114. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.d.ts +1 -0
  115. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.js +4 -25
  116. package/dist/components/sidebar/components/sidebar-items/SidebarItems.js +9 -23
  117. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.js +19 -40
  118. package/dist/components/sidebar/providers/SidebarProvider.d.ts +2 -1
  119. package/dist/components/sidebar/providers/SidebarProvider.js +182 -165
  120. package/dist/components/skeleton-loader/SkeletonLoader.js +68 -266
  121. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +11 -34
  122. package/dist/components/split-button/SplitButton.d.ts +7 -5
  123. package/dist/components/split-button/SplitButton.js +4 -27
  124. package/dist/components/split-pane/SplitPane.js +69 -105
  125. package/dist/components/split-pane/provider/SplitPaneContext.js +77 -71
  126. package/dist/components/table/Table.d.ts +9 -7
  127. package/dist/components/table/Table.js +115 -238
  128. package/dist/components/table/Table.module.css +5 -1
  129. package/dist/components/table/components/column-resizer/ColumnResizer.js +4 -15
  130. package/dist/components/table/components/empty-state/EmptyState.d.ts +6 -5
  131. package/dist/components/table/components/empty-state/EmptyState.js +22 -41
  132. package/dist/components/table/components/table-settings/TableSettings.d.ts +2 -1
  133. package/dist/components/table/components/table-settings/TableSettings.js +9 -27
  134. package/dist/components/table/tanstack.d.ts +1 -1
  135. package/dist/components/table/tanstack.js +154 -160
  136. package/dist/components/tabs/Tabs.d.ts +1 -0
  137. package/dist/components/tabs/Tabs.js +32 -81
  138. package/dist/components/toast/Toast.d.ts +1 -1
  139. package/dist/components/toast/Toast.js +4 -37
  140. package/dist/components/toast/Toast.module.css +1 -0
  141. package/dist/components/toast/provider/ToastProvider.d.ts +1 -1
  142. package/dist/components/toast/provider/ToastProvider.js +60 -87
  143. package/dist/components/user-display/UserDisplay.d.ts +2 -1
  144. package/dist/components/user-display/UserDisplay.js +4 -20
  145. package/dist/constants/severity.d.ts +1 -1
  146. package/dist/constants/severity.js +14 -16
  147. package/dist/constants/severity.types.d.ts +1 -1
  148. package/dist/constants/severity.types.js +1 -1
  149. package/dist/constants/sizes.js +6 -8
  150. package/dist/hooks/usePagination.d.ts +1 -1
  151. package/dist/hooks/usePagination.js +75 -82
  152. package/dist/hooks/useSorting.js +112 -110
  153. package/dist/hooks/useTableData.d.ts +1 -1
  154. package/dist/hooks/useTableData.js +42 -47
  155. package/dist/hooks/useTableSelection.js +121 -121
  156. package/dist/hooks/useTableSettings.js +23 -25
  157. package/dist/hooks/useTheme.d.ts +3 -7
  158. package/dist/hooks/useTheme.js +52 -47
  159. package/dist/hooks/useTimeDuration.d.ts +2 -2
  160. package/dist/hooks/useTimeDuration.js +33 -34
  161. package/dist/hooks/useViewportFill.d.ts +3 -2
  162. package/dist/hooks/useViewportFill.js +55 -48
  163. package/dist/index.d.ts +17 -8
  164. package/dist/index.js +18 -8
  165. package/dist/src/styles/styles.css +3 -3
  166. package/dist/styles/css-helper-classes/flex.css +4 -0
  167. package/dist/styles/styles.css +3 -3
  168. package/dist/styles/themes/dbc/dark.css +1 -1
  169. package/dist/styles/themes/dbc/light.css +2 -1
  170. package/dist/styles/themes/forfatterweb/light.css +1 -1
  171. package/dist/styles/themes/types.js +1 -1
  172. package/dist/types/a11y-props.types.d.ts +5 -5
  173. package/dist/types/a11y-props.types.js +1 -1
  174. package/dist/types/sizes.types.js +1 -1
  175. package/dist/utils/arrays/nested-filtering.js +43 -33
  176. package/dist/utils/date/formatDate.js +25 -16
  177. package/package.json +18 -9
  178. package/dist/assets/logo.cjs +0 -87
  179. package/dist/components/__stories__/story-components/Colors.cjs +0 -159
  180. package/dist/components/__stories__/story-components/Spacing.cjs +0 -190
  181. package/dist/components/app-header/AppHeader.cjs +0 -14
  182. package/dist/components/attribute-chip/AttributeChip.cjs +0 -22
  183. package/dist/components/avatar/Avatar.cjs +0 -101
  184. package/dist/components/breadcrumbs/Breadcrumbs.cjs +0 -22
  185. package/dist/components/button/Button.cjs +0 -87
  186. package/dist/components/card/Card.cjs +0 -69
  187. package/dist/components/card-container/CardContainer.cjs +0 -24
  188. package/dist/components/checkbox/Checkbox.cjs +0 -42
  189. package/dist/components/checkbox/Checkbox.d.ts +0 -12
  190. package/dist/components/checkbox/Checkbox.js +0 -36
  191. package/dist/components/chip/Chip.cjs +0 -50
  192. package/dist/components/circle/Circle.cjs +0 -18
  193. package/dist/components/clear-button/ClearButton.cjs +0 -26
  194. package/dist/components/code-block/CodeBlock.cjs +0 -18
  195. package/dist/components/copy-button/CopyButton.cjs +0 -35
  196. package/dist/components/datetime-picker/DateTimePicker.cjs +0 -504
  197. package/dist/components/filter-field/FilterField.cjs +0 -189
  198. package/dist/components/headline/Headline.cjs +0 -53
  199. package/dist/components/icon/Icon.cjs +0 -27
  200. package/dist/components/input/Input.cjs +0 -89
  201. package/dist/components/input/Input.js +0 -83
  202. package/dist/components/link/Link.cjs +0 -46
  203. package/dist/components/link/Link.js +0 -21
  204. package/dist/components/menu/Menu.cjs +0 -96
  205. package/dist/components/meta-bar/MetaBar.cjs +0 -29
  206. package/dist/components/modal/Modal.cjs +0 -134
  207. package/dist/components/modal/Modal.js +0 -128
  208. package/dist/components/modal/provider/ModalProvider.cjs +0 -80
  209. package/dist/components/modal/provider/ModalProvider.js +0 -77
  210. package/dist/components/multi-select/MultiSelect.cjs +0 -59
  211. package/dist/components/multi-select/MultiSelect.d.ts +0 -18
  212. package/dist/components/multi-select/MultiSelect.js +0 -57
  213. package/dist/components/nav-bar/NavBar.cjs +0 -55
  214. package/dist/components/page/Page.cjs +0 -30
  215. package/dist/components/page-layout/PageLayout.cjs +0 -84
  216. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.cjs +0 -32
  217. package/dist/components/pagination/Pagination.cjs +0 -133
  218. package/dist/components/panel/Panel.cjs +0 -18
  219. package/dist/components/popover/Popover.cjs +0 -149
  220. package/dist/components/search-box/SearchBox.cjs +0 -175
  221. package/dist/components/segmented-progress-bar/SegmentedProgressBar.cjs +0 -103
  222. package/dist/components/select/Select.cjs +0 -121
  223. package/dist/components/select/Select.d.ts +0 -12
  224. package/dist/components/select/Select.js +0 -119
  225. package/dist/components/sidebar/Sidebar.cjs +0 -11
  226. package/dist/components/sidebar/components/SidebarItem.cjs +0 -18
  227. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.cjs +0 -100
  228. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.cjs +0 -50
  229. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.cjs +0 -34
  230. package/dist/components/sidebar/components/sidebar-items/SidebarItems.cjs +0 -29
  231. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.cjs +0 -52
  232. package/dist/components/sidebar/providers/SidebarProvider.cjs +0 -179
  233. package/dist/components/skeleton-loader/SkeletonLoader.cjs +0 -270
  234. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +0 -42
  235. package/dist/components/split-button/SplitButton.cjs +0 -37
  236. package/dist/components/split-pane/SplitPane.cjs +0 -123
  237. package/dist/components/split-pane/provider/SplitPaneContext.cjs +0 -87
  238. package/dist/components/table/Table.cjs +0 -249
  239. package/dist/components/table/components/column-resizer/ColumnResizer.cjs +0 -22
  240. package/dist/components/table/components/empty-state/EmptyState.cjs +0 -52
  241. package/dist/components/table/components/table-settings/TableSettings.cjs +0 -32
  242. package/dist/components/table/tanstack.cjs +0 -193
  243. package/dist/components/tabs/Tabs.cjs +0 -90
  244. package/dist/components/text-area/Textarea.cjs +0 -62
  245. package/dist/components/text-area/Textarea.d.ts +0 -14
  246. package/dist/components/text-area/Textarea.js +0 -56
  247. package/dist/components/text-area/Textarea.module.css +0 -3
  248. package/dist/components/toast/Toast.cjs +0 -47
  249. package/dist/components/toast/provider/ToastProvider.cjs +0 -98
  250. package/dist/components/tooltip/Tooltip.cjs +0 -183
  251. package/dist/components/tooltip/Tooltip.d.ts +0 -11
  252. package/dist/components/tooltip/Tooltip.js +0 -177
  253. package/dist/components/tooltip/Tooltip.module.css +0 -66
  254. package/dist/components/user-display/UserDisplay.cjs +0 -28
  255. package/dist/constants/severity.cjs +0 -21
  256. package/dist/constants/severity.types.cjs +0 -2
  257. package/dist/constants/sizes.cjs +0 -11
  258. package/dist/hooks/usePagination.cjs +0 -88
  259. package/dist/hooks/useSorting.cjs +0 -118
  260. package/dist/hooks/useTableData.cjs +0 -52
  261. package/dist/hooks/useTableSelection.cjs +0 -130
  262. package/dist/hooks/useTableSettings.cjs +0 -28
  263. package/dist/hooks/useTheme.cjs +0 -58
  264. package/dist/hooks/useTimeDuration.cjs +0 -39
  265. package/dist/hooks/useViewportFill.cjs +0 -52
  266. package/dist/index.cjs +0 -383
  267. package/dist/styles/themes/types.cjs +0 -2
  268. package/dist/types/a11y-props.types.cjs +0 -2
  269. package/dist/types/assets.d.cjs +0 -2
  270. package/dist/types/assets.d.js +0 -1
  271. package/dist/types/css.d.cjs +0 -2
  272. package/dist/types/css.d.js +0 -1
  273. package/dist/types/sizes.types.cjs +0 -2
  274. package/dist/utils/arrays/nested-filtering.cjs +0 -40
  275. package/dist/utils/date/formatDate.cjs +0 -19
  276. /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
  };