@dbcdk/react-components 0.0.3 → 0.0.5

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 (223) hide show
  1. package/dist/assets/logo.cjs +10 -10
  2. package/dist/assets/logo.js +10 -10
  3. package/dist/components/__stories__/story-components/Colors.cjs +159 -0
  4. package/dist/components/__stories__/story-components/Colors.d.ts +10 -0
  5. package/dist/components/__stories__/story-components/Colors.js +151 -0
  6. package/dist/components/__stories__/story-components/Colors.module.css +27 -0
  7. package/dist/components/__stories__/story-components/Spacing.cjs +190 -0
  8. package/dist/components/__stories__/story-components/Spacing.d.ts +1 -0
  9. package/dist/components/__stories__/story-components/Spacing.js +184 -0
  10. package/dist/components/__stories__/story-components/Spacing.module.css +154 -0
  11. package/dist/components/app-header/AppHeader.module.css +10 -15
  12. package/dist/components/attribute-chip/AttributeChip.cjs +22 -0
  13. package/dist/components/attribute-chip/AttributeChip.d.ts +8 -0
  14. package/dist/components/attribute-chip/AttributeChip.js +16 -0
  15. package/dist/components/attribute-chip/AttributeChip.module.css +65 -0
  16. package/dist/components/avatar/Avatar.cjs +38 -4
  17. package/dist/components/avatar/Avatar.d.ts +4 -2
  18. package/dist/components/avatar/Avatar.js +39 -5
  19. package/dist/components/avatar/Avatar.module.css +27 -0
  20. package/dist/components/breadcrumbs/Breadcrumbs.cjs +1 -2
  21. package/dist/components/breadcrumbs/Breadcrumbs.js +1 -2
  22. package/dist/components/breadcrumbs/Breadcrumbs.module.css +19 -22
  23. package/dist/components/button/Button.cjs +20 -12
  24. package/dist/components/button/Button.d.ts +4 -1
  25. package/dist/components/button/Button.js +20 -12
  26. package/dist/components/button/Button.module.css +118 -55
  27. package/dist/components/card/Card.cjs +53 -13
  28. package/dist/components/card/Card.d.ts +21 -6
  29. package/dist/components/card/Card.js +54 -14
  30. package/dist/components/card/Card.module.css +148 -44
  31. package/dist/components/card-container/CardContainer.cjs +6 -5
  32. package/dist/components/card-container/CardContainer.d.ts +5 -2
  33. package/dist/components/card-container/CardContainer.js +6 -5
  34. package/dist/components/card-container/CardContainer.module.css +40 -0
  35. package/dist/components/checkbox/Checkbox.cjs +3 -4
  36. package/dist/components/checkbox/Checkbox.d.ts +1 -1
  37. package/dist/components/checkbox/Checkbox.js +3 -4
  38. package/dist/components/checkbox/Checkbox.module.css +10 -10
  39. package/dist/components/chip/Chip.cjs +2 -1
  40. package/dist/components/chip/Chip.d.ts +2 -1
  41. package/dist/components/chip/Chip.js +2 -1
  42. package/dist/components/chip/Chip.module.css +42 -27
  43. package/dist/components/circle/Circle.module.css +11 -11
  44. package/dist/components/clear-button/ClearButton.cjs +3 -3
  45. package/dist/components/clear-button/ClearButton.js +3 -3
  46. package/dist/components/clear-button/ClearButton.module.css +8 -7
  47. package/dist/components/code-block/CodeBlock.cjs +18 -0
  48. package/dist/components/code-block/CodeBlock.d.ts +6 -0
  49. package/dist/components/code-block/CodeBlock.js +12 -0
  50. package/dist/components/code-block/CodeBlock.module.css +60 -0
  51. package/dist/components/copy-button/CopyButton.cjs +35 -0
  52. package/dist/components/copy-button/CopyButton.d.ts +9 -0
  53. package/dist/components/copy-button/CopyButton.js +29 -0
  54. package/dist/components/copy-button/CopyButton.module.css +6 -0
  55. package/dist/components/datetime-picker/DateTimePicker.cjs +504 -0
  56. package/dist/components/datetime-picker/DateTimePicker.d.ts +39 -0
  57. package/dist/components/datetime-picker/DateTimePicker.js +498 -0
  58. package/dist/components/datetime-picker/DateTimePicker.module.css +144 -0
  59. package/dist/components/filter-field/FilterField.cjs +34 -19
  60. package/dist/components/filter-field/FilterField.d.ts +2 -2
  61. package/dist/components/filter-field/FilterField.js +35 -20
  62. package/dist/components/filter-field/FilterField.module.css +14 -20
  63. package/dist/components/headline/Headline.cjs +10 -4
  64. package/dist/components/headline/Headline.d.ts +9 -1
  65. package/dist/components/headline/Headline.js +10 -4
  66. package/dist/components/headline/Headline.module.css +32 -7
  67. package/dist/components/icon/Icon.module.css +10 -9
  68. package/dist/components/input/Input.cjs +60 -19
  69. package/dist/components/input/Input.d.ts +7 -2
  70. package/dist/components/input/Input.js +60 -19
  71. package/dist/components/input/Input.module.css +90 -43
  72. package/dist/components/link/Link.cjs +46 -0
  73. package/dist/components/link/Link.d.ts +9 -0
  74. package/dist/components/link/Link.js +21 -0
  75. package/dist/components/link/Link.module.css +32 -0
  76. package/dist/components/menu/Menu.module.css +10 -32
  77. package/dist/components/meta-bar/MetaBar.cjs +29 -0
  78. package/dist/components/meta-bar/MetaBar.d.ts +11 -0
  79. package/dist/components/meta-bar/MetaBar.js +22 -0
  80. package/dist/components/meta-bar/MetaBar.module.css +12 -0
  81. package/dist/components/modal/Modal.cjs +134 -0
  82. package/dist/components/modal/Modal.d.ts +21 -0
  83. package/dist/components/modal/Modal.js +128 -0
  84. package/dist/components/modal/Modal.module.css +66 -0
  85. package/dist/components/modal/provider/ModalProvider.cjs +80 -0
  86. package/dist/components/modal/provider/ModalProvider.d.ts +21 -0
  87. package/dist/components/modal/provider/ModalProvider.js +77 -0
  88. package/dist/components/multi-select/MultiSelect.cjs +12 -1
  89. package/dist/components/multi-select/MultiSelect.js +12 -1
  90. package/dist/components/nav-bar/NavBar.module.css +11 -16
  91. package/dist/components/page/Page.module.css +2 -2
  92. package/dist/components/page-layout/PageLayout.cjs +5 -22
  93. package/dist/components/page-layout/PageLayout.d.ts +1 -8
  94. package/dist/components/page-layout/PageLayout.js +5 -22
  95. package/dist/components/page-layout/PageLayout.module.css +4 -80
  96. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.cjs +32 -0
  97. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.d.ts +11 -0
  98. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.js +25 -0
  99. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.module.css +84 -0
  100. package/dist/components/pagination/Pagination.cjs +83 -67
  101. package/dist/components/pagination/Pagination.d.ts +3 -1
  102. package/dist/components/pagination/Pagination.js +84 -68
  103. package/dist/components/pagination/Pagination.module.css +11 -3
  104. package/dist/components/panel/Panel.module.css +5 -7
  105. package/dist/components/popover/Popover.cjs +25 -8
  106. package/dist/components/popover/Popover.d.ts +2 -1
  107. package/dist/components/popover/Popover.js +25 -8
  108. package/dist/components/popover/Popover.module.css +4 -6
  109. package/dist/components/search-box/SearchBox.cjs +50 -37
  110. package/dist/components/search-box/SearchBox.d.ts +10 -7
  111. package/dist/components/search-box/SearchBox.js +50 -37
  112. package/dist/components/search-box/SearchBox.module.css +0 -1
  113. package/dist/components/segmented-progress-bar/SegmentedProgressBar.cjs +12 -6
  114. package/dist/components/segmented-progress-bar/SegmentedProgressBar.js +12 -6
  115. package/dist/components/segmented-progress-bar/SegmentedProgressBar.module.css +5 -1
  116. package/dist/components/select/Select.cjs +82 -13
  117. package/dist/components/select/Select.d.ts +2 -1
  118. package/dist/components/select/Select.js +83 -14
  119. package/dist/components/sidebar/Sidebar.cjs +3 -30
  120. package/dist/components/sidebar/Sidebar.d.ts +2 -1
  121. package/dist/components/sidebar/Sidebar.js +4 -26
  122. package/dist/components/sidebar/components/SidebarItem.cjs +3 -1
  123. package/dist/components/sidebar/components/SidebarItem.js +3 -1
  124. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.cjs +40 -14
  125. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.d.ts +3 -1
  126. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.js +40 -14
  127. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.module.css +9 -38
  128. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.cjs +50 -0
  129. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.d.ts +8 -0
  130. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.js +43 -0
  131. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.module.css +155 -0
  132. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.cjs +16 -9
  133. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.d.ts +2 -1
  134. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.js +16 -9
  135. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.module.css +25 -12
  136. package/dist/components/sidebar/components/sidebar-items/SidebarItems.cjs +2 -1
  137. package/dist/components/sidebar/components/sidebar-items/SidebarItems.d.ts +1 -1
  138. package/dist/components/sidebar/components/sidebar-items/SidebarItems.js +2 -1
  139. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.cjs +29 -2
  140. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.js +25 -2
  141. package/dist/components/sidebar/providers/SidebarProvider.cjs +108 -10
  142. package/dist/components/sidebar/providers/SidebarProvider.d.ts +7 -3
  143. package/dist/components/sidebar/providers/SidebarProvider.js +109 -11
  144. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +1 -1
  145. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +1 -1
  146. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.module.css +0 -12
  147. package/dist/components/split-pane/SplitPane.cjs +123 -0
  148. package/dist/components/split-pane/SplitPane.d.ts +34 -0
  149. package/dist/components/split-pane/SplitPane.js +114 -0
  150. package/dist/components/split-pane/SplitPane.module.css +106 -0
  151. package/dist/components/split-pane/provider/SplitPaneContext.cjs +87 -0
  152. package/dist/components/split-pane/provider/SplitPaneContext.d.ts +23 -0
  153. package/dist/components/split-pane/provider/SplitPaneContext.js +79 -0
  154. package/dist/components/table/Table.cjs +180 -112
  155. package/dist/components/table/Table.d.ts +22 -6
  156. package/dist/components/table/Table.js +181 -113
  157. package/dist/components/table/Table.module.css +74 -47
  158. package/dist/components/table/components/empty-state/EmptyState.cjs +52 -0
  159. package/dist/components/table/components/empty-state/EmptyState.d.ts +40 -0
  160. package/dist/components/table/components/empty-state/EmptyState.js +46 -0
  161. package/dist/components/table/components/empty-state/EmptyState.module.css +16 -0
  162. package/dist/components/table/components/table-settings/TableSettings.cjs +32 -0
  163. package/dist/components/table/components/table-settings/TableSettings.d.ts +7 -0
  164. package/dist/components/table/components/table-settings/TableSettings.js +30 -0
  165. package/dist/{tanstack.cjs → components/table/tanstack.cjs} +61 -99
  166. package/dist/components/table/tanstack.d.ts +14 -0
  167. package/dist/{tanstack.js → components/table/tanstack.js} +61 -99
  168. package/dist/components/tabs/Tabs.cjs +33 -17
  169. package/dist/components/tabs/Tabs.d.ts +6 -3
  170. package/dist/components/tabs/Tabs.js +33 -17
  171. package/dist/components/tabs/Tabs.module.css +9 -9
  172. package/dist/components/toast/Toast.cjs +47 -0
  173. package/dist/components/toast/Toast.d.ts +14 -0
  174. package/dist/components/toast/Toast.js +41 -0
  175. package/dist/components/toast/Toast.module.css +101 -0
  176. package/dist/components/toast/provider/ToastProvider.cjs +98 -0
  177. package/dist/components/toast/provider/ToastProvider.d.ts +23 -0
  178. package/dist/components/toast/provider/ToastProvider.js +91 -0
  179. package/dist/components/tooltip/Tooltip.cjs +134 -29
  180. package/dist/components/tooltip/Tooltip.js +135 -30
  181. package/dist/components/tooltip/Tooltip.module.css +25 -43
  182. package/dist/components/user-display/UserDisplay.module.css +2 -2
  183. package/dist/constants/severity.cjs +12 -12
  184. package/dist/constants/severity.js +12 -12
  185. package/dist/constants/sizes.cjs +1 -0
  186. package/dist/constants/sizes.d.ts +1 -1
  187. package/dist/constants/sizes.js +1 -0
  188. package/dist/hooks/usePagination.cjs +88 -0
  189. package/dist/hooks/usePagination.d.ts +33 -0
  190. package/dist/hooks/usePagination.js +86 -0
  191. package/dist/hooks/useSorting.cjs +118 -0
  192. package/dist/hooks/useSorting.d.ts +49 -0
  193. package/dist/hooks/useSorting.js +116 -0
  194. package/dist/hooks/useTableData.cjs +52 -0
  195. package/dist/hooks/useTableData.d.ts +40 -0
  196. package/dist/hooks/useTableData.js +50 -0
  197. package/dist/hooks/useTableSelection.cjs +130 -0
  198. package/dist/hooks/useTableSelection.d.ts +25 -0
  199. package/dist/hooks/useTableSelection.js +128 -0
  200. package/dist/hooks/useTableSettings.cjs +28 -0
  201. package/dist/hooks/useTableSettings.d.ts +7 -0
  202. package/dist/hooks/useTableSettings.js +26 -0
  203. package/dist/hooks/useTimeDuration.cjs +39 -0
  204. package/dist/hooks/useTimeDuration.d.ts +22 -0
  205. package/dist/hooks/useTimeDuration.js +37 -0
  206. package/dist/hooks/useViewportFill.js +1 -1
  207. package/dist/index.cjs +119 -0
  208. package/dist/index.d.ts +17 -0
  209. package/dist/index.js +17 -0
  210. package/dist/src/styles/styles.css +101 -8
  211. package/dist/styles/css-helper-classes/flex.css +97 -0
  212. package/dist/styles/css-helper-classes/typography.css +7 -0
  213. package/dist/styles/styles.css +101 -8
  214. package/dist/styles/themes/dbc/dark.css +206 -99
  215. package/dist/styles/themes/dbc/light.css +183 -89
  216. package/dist/types/sizes.types.d.ts +2 -2
  217. package/package.json +17 -11
  218. package/dist/components/data-summary/DataSummary.cjs +0 -49
  219. package/dist/components/data-summary/DataSummary.d.ts +0 -19
  220. package/dist/components/data-summary/DataSummary.js +0 -43
  221. package/dist/components/data-summary/DataSummary.module.css +0 -51
  222. package/dist/components/sidebar/Sidebar.module.css +0 -66
  223. package/dist/tanstack.d.ts +0 -25
@@ -5,9 +5,9 @@
5
5
  justify-content: space-between;
6
6
  gap: var(--spacing-sm);
7
7
  padding-block: var(--spacing-xs);
8
- padding-inline: var(--spacing-sm);
8
+ padding-inline: var(--spacing-xs);
9
9
  text-decoration: none;
10
- color: var(--color-text-secondary);
10
+ color: var(--color-fg-muted);
11
11
  cursor: pointer;
12
12
  position: relative;
13
13
  border-radius: var(--border-radius-default);
@@ -16,6 +16,12 @@
16
16
  color var(--transition-fast) var(--ease-standard);
17
17
  }
18
18
 
19
+ .container.collapsed {
20
+ justify-content: center;
21
+ padding: var(--spacing-xs);
22
+ border-radius: 0;
23
+ }
24
+
19
25
  .active {
20
26
  background: var(--color-bg-selected);
21
27
  }
@@ -26,7 +32,7 @@
26
32
  inset-inline-start: 0;
27
33
  inset-block: 0;
28
34
  inline-size: 3px;
29
- background-color: var(--color-primary);
35
+ background-color: var(--color-brand);
30
36
  border-radius: 0;
31
37
  }
32
38
 
@@ -37,25 +43,32 @@
37
43
  }
38
44
 
39
45
  .container:not(.active):hover {
40
- background-color: var(--color-surface-hover);
41
- border-radius: var(--border-radius-default);
42
- color: var(--color-text);
46
+ background-color: var(--color-bg-contextual);
47
+
48
+ color: var(--color-fg-default);
43
49
  }
44
50
 
45
- .icon {
46
- min-inline-size: var(--icon-size);
51
+ .icon,
52
+ .suffixIcon {
53
+ min-inline-size: var(--icon-size-sm);
47
54
  display: flex;
48
55
  align-items: center;
49
56
  justify-content: center;
50
- color: var(--color-secondary);
57
+ color: var(--color-fg-subtle);
51
58
  }
52
59
 
53
- .icon svg {
54
- inline-size: var(--icon-size);
55
- block-size: var(--icon-size);
60
+ .icon svg,
61
+ .suffixIcon svg {
62
+ inline-size: var(--icon-size-sm);
63
+ block-size: var(--icon-size-sm);
56
64
  color: inherit;
57
65
  }
58
66
 
67
+ .collapsed svg {
68
+ inline-size: var(--icon-size-md);
69
+ block-size: var(--icon-size-md);
70
+ }
71
+
59
72
  .container:focus-visible {
60
73
  outline: none;
61
74
  box-shadow: var(--focus-ring);
@@ -18,7 +18,8 @@ function SidebarItems({ activeLink }) {
18
18
  items: children,
19
19
  label,
20
20
  icon,
21
- href
21
+ href,
22
+ component: Component
22
23
  },
23
24
  label
24
25
  ) : /* @__PURE__ */ jsxRuntime.jsx(SidebarItem.SidebarItem, { component: Component, label, icon, href }, id)
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  export declare function SidebarItems({ activeLink }: {
3
3
  activeLink?: string;
4
- }): React.ReactElement;
4
+ }): React.ReactNode;
@@ -16,7 +16,8 @@ function SidebarItems({ activeLink }) {
16
16
  items: children,
17
17
  label,
18
18
  icon,
19
- href
19
+ href,
20
+ component: Component
20
21
  },
21
22
  label
22
23
  ) : /* @__PURE__ */ jsx(SidebarItem, { component: Component, label, icon, href }, id)
@@ -1,18 +1,45 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
4
5
  var SearchBox = require('../../../search-box/SearchBox');
5
6
  var SidebarProvider = require('../../providers/SidebarProvider');
7
+ var Button = require('../../../button/Button');
8
+ var lucideReact = require('lucide-react');
9
+
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var React__default = /*#__PURE__*/_interopDefault(React);
6
13
 
7
14
  const SidenavFiltering = () => {
8
- const { activeQuery, setActiveQuery } = SidebarProvider.useSidebar();
15
+ const { activeQuery, setActiveQuery, isSidebarCollapsed, handleSidebarCollapseChange } = SidebarProvider.useSidebar();
16
+ const searchBoxRef = React__default.default.useRef(null);
9
17
  const handleSearch = (value) => {
10
18
  setActiveQuery == null ? void 0 : setActiveQuery(value);
11
19
  };
20
+ if (isSidebarCollapsed) {
21
+ return /* @__PURE__ */ jsxRuntime.jsx(
22
+ Button.Button,
23
+ {
24
+ fullWidth: true,
25
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, {}),
26
+ size: "sm",
27
+ variant: "inline",
28
+ onClick: () => {
29
+ handleSidebarCollapseChange(false);
30
+ setTimeout(() => {
31
+ var _a;
32
+ (_a = searchBoxRef.current) == null ? void 0 : _a.focus();
33
+ }, 50);
34
+ }
35
+ }
36
+ );
37
+ }
12
38
  return /* @__PURE__ */ jsxRuntime.jsx(
13
39
  SearchBox.SearchBox,
14
40
  {
15
- width: "100%",
41
+ ref: searchBoxRef,
42
+ inputWidth: "100%",
16
43
  inputSize: "sm",
17
44
  value: activeQuery != null ? activeQuery : "",
18
45
  onSearch: handleSearch,
@@ -1,16 +1,39 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
2
3
  import { SearchBox } from '../../../search-box/SearchBox';
3
4
  import { useSidebar } from '../../providers/SidebarProvider';
5
+ import { Button } from '../../../button/Button';
6
+ import { Search } from 'lucide-react';
4
7
 
5
8
  const SidenavFiltering = () => {
6
- const { activeQuery, setActiveQuery } = useSidebar();
9
+ const { activeQuery, setActiveQuery, isSidebarCollapsed, handleSidebarCollapseChange } = useSidebar();
10
+ const searchBoxRef = React.useRef(null);
7
11
  const handleSearch = (value) => {
8
12
  setActiveQuery == null ? void 0 : setActiveQuery(value);
9
13
  };
14
+ if (isSidebarCollapsed) {
15
+ return /* @__PURE__ */ jsx(
16
+ Button,
17
+ {
18
+ fullWidth: true,
19
+ icon: /* @__PURE__ */ jsx(Search, {}),
20
+ size: "sm",
21
+ variant: "inline",
22
+ onClick: () => {
23
+ handleSidebarCollapseChange(false);
24
+ setTimeout(() => {
25
+ var _a;
26
+ (_a = searchBoxRef.current) == null ? void 0 : _a.focus();
27
+ }, 50);
28
+ }
29
+ }
30
+ );
31
+ }
10
32
  return /* @__PURE__ */ jsx(
11
33
  SearchBox,
12
34
  {
13
- width: "100%",
35
+ ref: searchBoxRef,
36
+ inputWidth: "100%",
14
37
  inputSize: "sm",
15
38
  value: activeQuery != null ? activeQuery : "",
16
39
  onSearch: handleSearch,
@@ -4,34 +4,67 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
5
  var nestedFiltering = require('../../../utils/arrays/nested-filtering');
6
6
 
7
+ const findParentItem = (navItem, items, prevPath) => {
8
+ var _a;
9
+ for (const currentItem of items) {
10
+ let path = prevPath || `.${currentItem.href}`;
11
+ if ((_a = currentItem.children) == null ? void 0 : _a.some((child) => (child == null ? void 0 : child.href) === navItem)) {
12
+ return path;
13
+ } else if (currentItem.children) {
14
+ path = findParentItem(navItem, currentItem.children, path);
15
+ if (path) {
16
+ return path;
17
+ }
18
+ }
19
+ }
20
+ return "";
21
+ };
7
22
  const SidebarContext = react.createContext({
8
23
  defaultExpanded: null,
24
+ expandedItems: /* @__PURE__ */ new Set(),
9
25
  activeQuery: "",
10
- isSidebarCollapsed: false,
26
+ areItemsCollapsed: false,
11
27
  setActiveQuery: () => {
12
28
  },
13
29
  triggerExpandAll: () => {
14
30
  },
15
- setIsSidebarCollapsed: () => {
31
+ setItemsCollapsed: () => {
16
32
  },
17
33
  resetExpandAll: () => {
18
34
  },
19
35
  activeLink: "",
20
36
  setActiveLink: () => {
37
+ },
38
+ isSidebarCollapsed: false,
39
+ handleSidebarCollapseChange: () => {
21
40
  }
22
41
  });
42
+ const SIDEBAR_COLLAPSED_STORAGE_KEY = "sidebar-is-collapsed";
43
+ const SIDEBAR_BREAKPOINT = 1024;
44
+ const getBreakpoint = (width) => width < SIDEBAR_BREAKPOINT ? "small" : "large";
23
45
  function SidebarProvider({
24
46
  children,
25
47
  items,
26
- initialCollapsed = false
48
+ initialCollapsed = false,
49
+ initialSidebarCollapsed
27
50
  }) {
28
51
  const [defaultExpanded, setDefaultExpanded] = react.useState(null);
29
52
  const [activeQuery, setActiveQuery] = react.useState("");
30
- const [isSidebarCollapsed, setIsSidebarCollapsed] = react.useState(initialCollapsed);
53
+ const [areItemsCollapsed, setItemsCollapsed] = react.useState(initialCollapsed);
31
54
  const [activeHref, setActiveHref] = react.useState("");
55
+ const [expandedItems, setExpandedItems] = react.useState(/* @__PURE__ */ new Set());
56
+ const [isSidebarCollapsed, setSidebarCollapsed] = react.useState(
57
+ initialSidebarCollapsed != null ? initialSidebarCollapsed : false
58
+ );
59
+ const [breakpoint, setBreakpoint] = react.useState(null);
60
+ const hasExplicitInitialSidebarCollapsed = initialSidebarCollapsed !== void 0;
32
61
  const triggerExpandAll = react.useCallback(() => setDefaultExpanded(true), []);
33
62
  const resetExpandAll = react.useCallback(() => setDefaultExpanded(null), []);
34
63
  const setActiveLink = react.useCallback((href) => setActiveHref(href), []);
64
+ react.useEffect(() => {
65
+ const path = findParentItem(activeHref, items);
66
+ setExpandedItems(new Set(path.split(".").filter(Boolean)));
67
+ }, [activeHref]);
35
68
  const filteredItems = react.useMemo(() => {
36
69
  return activeQuery ? nestedFiltering.nestedFiltering(items, {
37
70
  keys: ["label", "tags"],
@@ -45,30 +78,95 @@ function SidebarProvider({
45
78
  triggerExpandAll();
46
79
  }
47
80
  }, [activeQuery, triggerExpandAll]);
81
+ react.useEffect(() => {
82
+ if (typeof window === "undefined") return;
83
+ const currentBreakpoint = getBreakpoint(window.innerWidth);
84
+ setBreakpoint(currentBreakpoint);
85
+ if (hasExplicitInitialSidebarCollapsed) {
86
+ const value2 = initialSidebarCollapsed != null ? initialSidebarCollapsed : false;
87
+ setSidebarCollapsed(value2);
88
+ try {
89
+ window.localStorage.setItem(SIDEBAR_COLLAPSED_STORAGE_KEY, JSON.stringify(value2));
90
+ } catch {
91
+ }
92
+ return;
93
+ }
94
+ try {
95
+ const stored = window.localStorage.getItem(SIDEBAR_COLLAPSED_STORAGE_KEY);
96
+ if (stored !== null) {
97
+ const parsed = JSON.parse(stored);
98
+ setSidebarCollapsed(Boolean(parsed));
99
+ return;
100
+ }
101
+ } catch {
102
+ }
103
+ const defaultCollapsed = currentBreakpoint === "small";
104
+ setSidebarCollapsed(defaultCollapsed);
105
+ }, [hasExplicitInitialSidebarCollapsed, initialSidebarCollapsed]);
106
+ const persistCollapsed = react.useCallback((collapsed) => {
107
+ if (typeof window === "undefined") return;
108
+ try {
109
+ window.localStorage.setItem(SIDEBAR_COLLAPSED_STORAGE_KEY, JSON.stringify(collapsed));
110
+ } catch {
111
+ }
112
+ }, []);
113
+ const handleSidebarCollapseChange = react.useCallback(
114
+ (collapsed) => {
115
+ setSidebarCollapsed(collapsed);
116
+ persistCollapsed(collapsed);
117
+ },
118
+ [persistCollapsed]
119
+ );
120
+ react.useEffect(() => {
121
+ if (typeof window === "undefined") return;
122
+ const onResize = () => {
123
+ const nextBreakpoint = getBreakpoint(window.innerWidth);
124
+ setBreakpoint((prev) => {
125
+ if (prev === null) {
126
+ return nextBreakpoint;
127
+ }
128
+ if (prev === nextBreakpoint) {
129
+ return prev;
130
+ }
131
+ const autoCollapsed = nextBreakpoint === "small";
132
+ setSidebarCollapsed(autoCollapsed);
133
+ persistCollapsed(autoCollapsed);
134
+ return nextBreakpoint;
135
+ });
136
+ };
137
+ window.addEventListener("resize", onResize);
138
+ return () => window.removeEventListener("resize", onResize);
139
+ }, [persistCollapsed]);
48
140
  const value = react.useMemo(
49
141
  () => ({
50
142
  defaultExpanded,
143
+ expandedItems,
51
144
  filteredItems,
52
145
  activeQuery,
53
- isSidebarCollapsed,
146
+ areItemsCollapsed,
54
147
  setActiveQuery,
55
148
  triggerExpandAll,
56
149
  resetExpandAll,
57
- setIsSidebarCollapsed,
150
+ setItemsCollapsed,
58
151
  activeLink: activeHref,
59
- setActiveLink
152
+ setActiveLink,
153
+ isSidebarCollapsed,
154
+ handleSidebarCollapseChange
60
155
  }),
61
156
  [
62
157
  defaultExpanded,
158
+ expandedItems,
63
159
  filteredItems,
64
160
  activeQuery,
65
- isSidebarCollapsed,
161
+ areItemsCollapsed,
66
162
  setActiveQuery,
67
163
  triggerExpandAll,
68
164
  resetExpandAll,
69
- setIsSidebarCollapsed,
165
+ setItemsCollapsed,
70
166
  activeHref,
71
- setActiveLink
167
+ setActiveLink,
168
+ isSidebarCollapsed,
169
+ handleSidebarCollapseChange
72
170
  ]
73
171
  );
74
172
  return /* @__PURE__ */ jsxRuntime.jsx(SidebarContext.Provider, { value, children });
@@ -2,15 +2,18 @@ import * as React from 'react';
2
2
  import { NavBarItem } from '@/components/nav-bar/NavBar';
3
3
  export type SidebarContextValue = {
4
4
  defaultExpanded: boolean | null;
5
+ expandedItems: Set<string | undefined>;
5
6
  resetExpandAll: () => void;
6
7
  activeQuery: string;
7
- isSidebarCollapsed: boolean;
8
+ areItemsCollapsed: boolean;
8
9
  setActiveQuery: (query: string) => void;
9
10
  triggerExpandAll: () => void;
10
- setIsSidebarCollapsed: (v: boolean) => void;
11
+ setItemsCollapsed: (v: boolean) => void;
11
12
  filteredItems?: NavBarItem[];
12
13
  activeLink?: string;
13
14
  setActiveLink: (href: string) => void;
15
+ isSidebarCollapsed: boolean;
16
+ handleSidebarCollapseChange: (collapsed: boolean) => void;
14
17
  };
15
18
  type SidebarProviderProps = {
16
19
  children: React.ReactNode;
@@ -18,7 +21,8 @@ type SidebarProviderProps = {
18
21
  initialQuery?: string | null;
19
22
  initialCollapsed?: boolean;
20
23
  initialCollapseChildren?: boolean;
24
+ initialSidebarCollapsed?: boolean;
21
25
  };
22
- export declare function SidebarProvider({ children, items, initialCollapsed, }: SidebarProviderProps): JSX.Element;
26
+ export declare function SidebarProvider({ children, items, initialCollapsed, initialSidebarCollapsed, }: SidebarProviderProps): JSX.Element;
23
27
  export declare function useSidebar(): SidebarContextValue;
24
28
  export {};
@@ -1,35 +1,68 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { createContext, useState, useCallback, useMemo, useEffect, useContext } from 'react';
2
+ import { createContext, useState, useCallback, useEffect, useMemo, useContext } from 'react';
3
3
  import { nestedFiltering } from '../../../utils/arrays/nested-filtering';
4
4
 
5
+ const findParentItem = (navItem, items, prevPath) => {
6
+ var _a;
7
+ for (const currentItem of items) {
8
+ let path = prevPath || `.${currentItem.href}`;
9
+ if ((_a = currentItem.children) == null ? void 0 : _a.some((child) => (child == null ? void 0 : child.href) === navItem)) {
10
+ return path;
11
+ } else if (currentItem.children) {
12
+ path = findParentItem(navItem, currentItem.children, path);
13
+ if (path) {
14
+ return path;
15
+ }
16
+ }
17
+ }
18
+ return "";
19
+ };
5
20
  const SidebarContext = createContext({
6
21
  defaultExpanded: null,
22
+ expandedItems: /* @__PURE__ */ new Set(),
7
23
  activeQuery: "",
8
- isSidebarCollapsed: false,
24
+ areItemsCollapsed: false,
9
25
  setActiveQuery: () => {
10
26
  },
11
27
  triggerExpandAll: () => {
12
28
  },
13
- setIsSidebarCollapsed: () => {
29
+ setItemsCollapsed: () => {
14
30
  },
15
31
  resetExpandAll: () => {
16
32
  },
17
33
  activeLink: "",
18
34
  setActiveLink: () => {
35
+ },
36
+ isSidebarCollapsed: false,
37
+ handleSidebarCollapseChange: () => {
19
38
  }
20
39
  });
40
+ const SIDEBAR_COLLAPSED_STORAGE_KEY = "sidebar-is-collapsed";
41
+ const SIDEBAR_BREAKPOINT = 1024;
42
+ const getBreakpoint = (width) => width < SIDEBAR_BREAKPOINT ? "small" : "large";
21
43
  function SidebarProvider({
22
44
  children,
23
45
  items,
24
- initialCollapsed = false
46
+ initialCollapsed = false,
47
+ initialSidebarCollapsed
25
48
  }) {
26
49
  const [defaultExpanded, setDefaultExpanded] = useState(null);
27
50
  const [activeQuery, setActiveQuery] = useState("");
28
- const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(initialCollapsed);
51
+ const [areItemsCollapsed, setItemsCollapsed] = useState(initialCollapsed);
29
52
  const [activeHref, setActiveHref] = useState("");
53
+ const [expandedItems, setExpandedItems] = useState(/* @__PURE__ */ new Set());
54
+ const [isSidebarCollapsed, setSidebarCollapsed] = useState(
55
+ initialSidebarCollapsed != null ? initialSidebarCollapsed : false
56
+ );
57
+ const [breakpoint, setBreakpoint] = useState(null);
58
+ const hasExplicitInitialSidebarCollapsed = initialSidebarCollapsed !== void 0;
30
59
  const triggerExpandAll = useCallback(() => setDefaultExpanded(true), []);
31
60
  const resetExpandAll = useCallback(() => setDefaultExpanded(null), []);
32
61
  const setActiveLink = useCallback((href) => setActiveHref(href), []);
62
+ useEffect(() => {
63
+ const path = findParentItem(activeHref, items);
64
+ setExpandedItems(new Set(path.split(".").filter(Boolean)));
65
+ }, [activeHref]);
33
66
  const filteredItems = useMemo(() => {
34
67
  return activeQuery ? nestedFiltering(items, {
35
68
  keys: ["label", "tags"],
@@ -43,30 +76,95 @@ function SidebarProvider({
43
76
  triggerExpandAll();
44
77
  }
45
78
  }, [activeQuery, triggerExpandAll]);
79
+ useEffect(() => {
80
+ if (typeof window === "undefined") return;
81
+ const currentBreakpoint = getBreakpoint(window.innerWidth);
82
+ setBreakpoint(currentBreakpoint);
83
+ if (hasExplicitInitialSidebarCollapsed) {
84
+ const value2 = initialSidebarCollapsed != null ? initialSidebarCollapsed : false;
85
+ setSidebarCollapsed(value2);
86
+ try {
87
+ window.localStorage.setItem(SIDEBAR_COLLAPSED_STORAGE_KEY, JSON.stringify(value2));
88
+ } catch {
89
+ }
90
+ return;
91
+ }
92
+ try {
93
+ const stored = window.localStorage.getItem(SIDEBAR_COLLAPSED_STORAGE_KEY);
94
+ if (stored !== null) {
95
+ const parsed = JSON.parse(stored);
96
+ setSidebarCollapsed(Boolean(parsed));
97
+ return;
98
+ }
99
+ } catch {
100
+ }
101
+ const defaultCollapsed = currentBreakpoint === "small";
102
+ setSidebarCollapsed(defaultCollapsed);
103
+ }, [hasExplicitInitialSidebarCollapsed, initialSidebarCollapsed]);
104
+ const persistCollapsed = useCallback((collapsed) => {
105
+ if (typeof window === "undefined") return;
106
+ try {
107
+ window.localStorage.setItem(SIDEBAR_COLLAPSED_STORAGE_KEY, JSON.stringify(collapsed));
108
+ } catch {
109
+ }
110
+ }, []);
111
+ const handleSidebarCollapseChange = useCallback(
112
+ (collapsed) => {
113
+ setSidebarCollapsed(collapsed);
114
+ persistCollapsed(collapsed);
115
+ },
116
+ [persistCollapsed]
117
+ );
118
+ useEffect(() => {
119
+ if (typeof window === "undefined") return;
120
+ const onResize = () => {
121
+ const nextBreakpoint = getBreakpoint(window.innerWidth);
122
+ setBreakpoint((prev) => {
123
+ if (prev === null) {
124
+ return nextBreakpoint;
125
+ }
126
+ if (prev === nextBreakpoint) {
127
+ return prev;
128
+ }
129
+ const autoCollapsed = nextBreakpoint === "small";
130
+ setSidebarCollapsed(autoCollapsed);
131
+ persistCollapsed(autoCollapsed);
132
+ return nextBreakpoint;
133
+ });
134
+ };
135
+ window.addEventListener("resize", onResize);
136
+ return () => window.removeEventListener("resize", onResize);
137
+ }, [persistCollapsed]);
46
138
  const value = useMemo(
47
139
  () => ({
48
140
  defaultExpanded,
141
+ expandedItems,
49
142
  filteredItems,
50
143
  activeQuery,
51
- isSidebarCollapsed,
144
+ areItemsCollapsed,
52
145
  setActiveQuery,
53
146
  triggerExpandAll,
54
147
  resetExpandAll,
55
- setIsSidebarCollapsed,
148
+ setItemsCollapsed,
56
149
  activeLink: activeHref,
57
- setActiveLink
150
+ setActiveLink,
151
+ isSidebarCollapsed,
152
+ handleSidebarCollapseChange
58
153
  }),
59
154
  [
60
155
  defaultExpanded,
156
+ expandedItems,
61
157
  filteredItems,
62
158
  activeQuery,
63
- isSidebarCollapsed,
159
+ areItemsCollapsed,
64
160
  setActiveQuery,
65
161
  triggerExpandAll,
66
162
  resetExpandAll,
67
- setIsSidebarCollapsed,
163
+ setItemsCollapsed,
68
164
  activeHref,
69
- setActiveLink
165
+ setActiveLink,
166
+ isSidebarCollapsed,
167
+ handleSidebarCollapseChange
70
168
  ]
71
169
  );
72
170
  return /* @__PURE__ */ jsx(SidebarContext.Provider, { value, children });
@@ -33,7 +33,7 @@ function SkeletonLoaderItem({
33
33
  },
34
34
  children: [
35
35
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles__default.default.bar, "aria-hidden": "true" }),
36
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: styles__default.default.srOnly, children: "Loading\u2026" })
36
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "srOnly", children: "Loading\u2026" })
37
37
  ]
38
38
  }
39
39
  );
@@ -27,7 +27,7 @@ function SkeletonLoaderItem({
27
27
  },
28
28
  children: [
29
29
  /* @__PURE__ */ jsx("span", { className: styles.bar, "aria-hidden": "true" }),
30
- /* @__PURE__ */ jsx("span", { className: styles.srOnly, children: "Loading\u2026" })
30
+ /* @__PURE__ */ jsx("span", { className: "srOnly", children: "Loading\u2026" })
31
31
  ]
32
32
  }
33
33
  );
@@ -35,18 +35,6 @@
35
35
  border-radius: inherit;
36
36
  }
37
37
 
38
- .srOnly {
39
- position: absolute;
40
- inline-size: 1px;
41
- block-size: 1px;
42
- padding: 0;
43
- margin: -1px;
44
- overflow: hidden;
45
- clip: rect(0 0 0 0);
46
- white-space: nowrap;
47
- border: 0;
48
- }
49
-
50
38
  @keyframes shimmer {
51
39
  0% {
52
40
  background-position: 200% 0;