@dbcdk/react-components 0.0.4 → 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 (299) 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 +11 -0
  5. package/dist/components/__stories__/story-components/Colors.js +96 -0
  6. package/dist/components/__stories__/story-components/Colors.module.css +27 -0
  7. package/dist/components/__stories__/story-components/Spacing.d.ts +2 -0
  8. package/dist/components/__stories__/story-components/Spacing.js +76 -0
  9. package/dist/components/__stories__/story-components/Spacing.module.css +154 -0
  10. package/dist/components/app-header/AppHeader.d.ts +4 -3
  11. package/dist/components/app-header/AppHeader.js +3 -6
  12. package/dist/components/app-header/AppHeader.module.css +10 -15
  13. package/dist/components/attribute-chip/AttributeChip.d.ts +9 -0
  14. package/dist/components/attribute-chip/AttributeChip.js +5 -0
  15. package/dist/components/attribute-chip/AttributeChip.module.css +65 -0
  16. package/dist/components/avatar/Avatar.d.ts +5 -3
  17. package/dist/components/avatar/Avatar.js +37 -37
  18. package/dist/components/avatar/Avatar.module.css +27 -0
  19. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +4 -4
  20. package/dist/components/breadcrumbs/Breadcrumbs.js +4 -14
  21. package/dist/components/breadcrumbs/Breadcrumbs.module.css +19 -22
  22. package/dist/components/button/Button.d.ts +6 -2
  23. package/dist/components/button/Button.js +56 -50
  24. package/dist/components/button/Button.module.css +119 -56
  25. package/dist/components/card/Card.d.ts +23 -7
  26. package/dist/components/card/Card.js +20 -21
  27. package/dist/components/card/Card.module.css +148 -44
  28. package/dist/components/card-container/CardContainer.d.ts +6 -3
  29. package/dist/components/card-container/CardContainer.js +4 -15
  30. package/dist/components/card-container/CardContainer.module.css +40 -0
  31. package/dist/components/chip/Chip.d.ts +7 -5
  32. package/dist/components/chip/Chip.js +14 -37
  33. package/dist/components/chip/Chip.module.css +50 -27
  34. package/dist/components/circle/Circle.d.ts +3 -2
  35. package/dist/components/circle/Circle.js +3 -10
  36. package/dist/components/circle/Circle.module.css +11 -11
  37. package/dist/components/clear-button/ClearButton.d.ts +2 -1
  38. package/dist/components/clear-button/ClearButton.js +6 -17
  39. package/dist/components/clear-button/ClearButton.module.css +8 -7
  40. package/dist/components/code-block/CodeBlock.d.ts +7 -0
  41. package/dist/components/code-block/CodeBlock.js +6 -0
  42. package/dist/components/code-block/CodeBlock.module.css +60 -0
  43. package/dist/components/copy-button/CopyButton.d.ts +10 -0
  44. package/dist/components/copy-button/CopyButton.js +22 -0
  45. package/dist/components/copy-button/CopyButton.module.css +6 -0
  46. package/dist/components/datetime-picker/DateTimePicker.d.ts +42 -0
  47. package/dist/components/datetime-picker/DateTimePicker.js +403 -0
  48. package/dist/components/datetime-picker/DateTimePicker.module.css +144 -0
  49. package/dist/components/filter-field/FilterField.d.ts +6 -3
  50. package/dist/components/filter-field/FilterField.js +130 -158
  51. package/dist/components/filter-field/FilterField.module.css +35 -25
  52. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.d.ts +36 -0
  53. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.js +53 -0
  54. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.module.css +60 -0
  55. package/dist/components/forms/checkbox/Checkbox.d.ts +31 -0
  56. package/dist/components/forms/checkbox/Checkbox.js +27 -0
  57. package/dist/components/{checkbox → forms/checkbox}/Checkbox.module.css +10 -11
  58. package/dist/components/forms/checkbox-group/CheckboxGroup.d.ts +47 -0
  59. package/dist/components/forms/checkbox-group/CheckboxGroup.js +75 -0
  60. package/dist/components/forms/checkbox-group/CheckboxGroup.module.css +115 -0
  61. package/dist/components/forms/input/Input.d.ts +22 -0
  62. package/dist/components/forms/input/Input.js +70 -0
  63. package/dist/components/forms/input/Input.module.css +160 -0
  64. package/dist/components/forms/input-container/InputContainer.d.ts +15 -0
  65. package/dist/components/forms/input-container/InputContainer.js +15 -0
  66. package/dist/components/forms/input-container/InputContainer.module.css +34 -0
  67. package/dist/components/forms/multi-select/MultiSelect.d.ts +20 -0
  68. package/dist/components/forms/multi-select/MultiSelect.js +19 -0
  69. package/dist/components/forms/select/Select.d.ts +21 -0
  70. package/dist/components/forms/select/Select.js +94 -0
  71. package/dist/components/forms/text-area/Textarea.d.ts +17 -0
  72. package/dist/components/forms/text-area/Textarea.js +33 -0
  73. package/dist/components/forms/text-area/Textarea.module.css +26 -0
  74. package/dist/components/headline/Headline.d.ts +9 -1
  75. package/dist/components/headline/Headline.js +18 -37
  76. package/dist/components/headline/Headline.module.css +32 -7
  77. package/dist/components/hyperlink/Hyperlink.d.ts +9 -0
  78. package/dist/components/hyperlink/Hyperlink.js +11 -0
  79. package/dist/components/hyperlink/Hyperlink.module.css +23 -0
  80. package/dist/components/icon/Icon.d.ts +4 -3
  81. package/dist/components/icon/Icon.js +11 -17
  82. package/dist/components/icon/Icon.module.css +10 -9
  83. package/dist/components/menu/Menu.js +25 -67
  84. package/dist/components/menu/Menu.module.css +10 -32
  85. package/dist/components/meta-bar/MetaBar.d.ts +11 -0
  86. package/dist/components/meta-bar/MetaBar.js +9 -0
  87. package/dist/components/meta-bar/MetaBar.module.css +12 -0
  88. package/dist/components/nav-bar/NavBar.d.ts +5 -5
  89. package/dist/components/nav-bar/NavBar.js +15 -45
  90. package/dist/components/nav-bar/NavBar.module.css +11 -16
  91. package/dist/components/overlay/modal/Modal.d.ts +23 -0
  92. package/dist/components/overlay/modal/Modal.js +92 -0
  93. package/dist/components/overlay/modal/Modal.module.css +66 -0
  94. package/dist/components/overlay/modal/provider/ModalProvider.d.ts +20 -0
  95. package/dist/components/overlay/modal/provider/ModalProvider.js +70 -0
  96. package/dist/components/overlay/side-panel/SidePanel.d.ts +16 -0
  97. package/dist/components/overlay/side-panel/SidePanel.js +10 -0
  98. package/dist/components/overlay/side-panel/SidePanel.module.css +56 -0
  99. package/dist/components/overlay/side-panel/useSidePanel.d.ts +5 -0
  100. package/dist/components/overlay/side-panel/useSidePanel.js +11 -0
  101. package/dist/components/overlay/tooltip/Tooltip.d.ts +13 -0
  102. package/dist/components/overlay/tooltip/Tooltip.js +17 -0
  103. package/dist/components/overlay/tooltip/Tooltip.module.css +106 -0
  104. package/dist/components/overlay/tooltip/TooltipProvider.d.ts +20 -0
  105. package/dist/components/overlay/tooltip/TooltipProvider.js +244 -0
  106. package/dist/components/overlay/tooltip/useTooltipTrigger.d.ts +24 -0
  107. package/dist/components/overlay/tooltip/useTooltipTrigger.js +108 -0
  108. package/dist/components/page/Page.d.ts +7 -6
  109. package/dist/components/page/Page.js +4 -21
  110. package/dist/components/page/Page.module.css +2 -2
  111. package/dist/components/page-layout/PageLayout.d.ts +12 -20
  112. package/dist/components/page-layout/PageLayout.js +35 -88
  113. package/dist/components/page-layout/PageLayout.module.css +4 -80
  114. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.d.ts +11 -0
  115. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.js +7 -0
  116. package/dist/components/page-layout/components/page-layout-hero/PageLayoutHero.module.css +84 -0
  117. package/dist/components/pagination/Pagination.d.ts +4 -1
  118. package/dist/components/pagination/Pagination.js +38 -105
  119. package/dist/components/pagination/Pagination.module.css +11 -3
  120. package/dist/components/panel/Panel.d.ts +4 -3
  121. package/dist/components/panel/Panel.js +5 -10
  122. package/dist/components/panel/Panel.module.css +5 -7
  123. package/dist/components/popover/Popover.d.ts +3 -1
  124. package/dist/components/popover/Popover.js +116 -124
  125. package/dist/components/popover/Popover.module.css +4 -6
  126. package/dist/components/search-box/SearchBox.d.ts +11 -8
  127. package/dist/components/search-box/SearchBox.js +112 -149
  128. package/dist/components/search-box/SearchBox.module.css +0 -1
  129. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +1 -1
  130. package/dist/components/segmented-progress-bar/SegmentedProgressBar.js +47 -88
  131. package/dist/components/segmented-progress-bar/SegmentedProgressBar.module.css +5 -1
  132. package/dist/components/sidebar/Sidebar.d.ts +3 -1
  133. package/dist/components/sidebar/Sidebar.js +5 -29
  134. package/dist/components/sidebar/components/SidebarItem.js +6 -12
  135. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.d.ts +4 -2
  136. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.js +48 -62
  137. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.module.css +9 -38
  138. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.d.ts +9 -0
  139. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.js +13 -0
  140. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.module.css +155 -0
  141. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.d.ts +3 -1
  142. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.js +4 -18
  143. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.module.css +25 -12
  144. package/dist/components/sidebar/components/sidebar-items/SidebarItems.d.ts +1 -1
  145. package/dist/components/sidebar/components/sidebar-items/SidebarItems.js +9 -22
  146. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.js +20 -18
  147. package/dist/components/sidebar/providers/SidebarProvider.d.ts +9 -4
  148. package/dist/components/sidebar/providers/SidebarProvider.js +188 -73
  149. package/dist/components/skeleton-loader/SkeletonLoader.js +68 -266
  150. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +11 -34
  151. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.module.css +0 -12
  152. package/dist/components/split-button/SplitButton.d.ts +7 -5
  153. package/dist/components/split-button/SplitButton.js +4 -27
  154. package/dist/components/split-pane/SplitPane.d.ts +34 -0
  155. package/dist/components/split-pane/SplitPane.js +78 -0
  156. package/dist/components/split-pane/SplitPane.module.css +106 -0
  157. package/dist/components/split-pane/provider/SplitPaneContext.d.ts +23 -0
  158. package/dist/components/split-pane/provider/SplitPaneContext.js +85 -0
  159. package/dist/components/table/Table.d.ts +28 -10
  160. package/dist/components/table/Table.js +117 -172
  161. package/dist/components/table/Table.module.css +78 -47
  162. package/dist/components/table/components/column-resizer/ColumnResizer.js +4 -15
  163. package/dist/components/table/components/empty-state/EmptyState.d.ts +41 -0
  164. package/dist/components/table/components/empty-state/EmptyState.js +27 -0
  165. package/dist/components/table/components/empty-state/EmptyState.module.css +16 -0
  166. package/dist/components/table/components/table-settings/TableSettings.d.ts +8 -0
  167. package/dist/components/table/components/table-settings/TableSettings.js +12 -0
  168. package/dist/components/table/tanstack.d.ts +14 -0
  169. package/dist/components/table/tanstack.js +162 -0
  170. package/dist/components/tabs/Tabs.d.ts +7 -3
  171. package/dist/components/tabs/Tabs.js +32 -65
  172. package/dist/components/tabs/Tabs.module.css +9 -9
  173. package/dist/components/toast/Toast.d.ts +14 -0
  174. package/dist/components/toast/Toast.js +8 -0
  175. package/dist/components/toast/Toast.module.css +102 -0
  176. package/dist/components/toast/provider/ToastProvider.d.ts +23 -0
  177. package/dist/components/toast/provider/ToastProvider.js +64 -0
  178. package/dist/components/user-display/UserDisplay.d.ts +2 -1
  179. package/dist/components/user-display/UserDisplay.js +4 -20
  180. package/dist/components/user-display/UserDisplay.module.css +2 -2
  181. package/dist/constants/severity.d.ts +1 -1
  182. package/dist/constants/severity.js +14 -16
  183. package/dist/constants/severity.types.d.ts +1 -1
  184. package/dist/constants/severity.types.js +1 -1
  185. package/dist/constants/sizes.d.ts +1 -1
  186. package/dist/constants/sizes.js +6 -7
  187. package/dist/hooks/usePagination.d.ts +33 -0
  188. package/dist/hooks/usePagination.js +79 -0
  189. package/dist/hooks/useSorting.d.ts +49 -0
  190. package/dist/hooks/useSorting.js +118 -0
  191. package/dist/hooks/useTableData.d.ts +40 -0
  192. package/dist/hooks/useTableData.js +45 -0
  193. package/dist/hooks/useTableSelection.d.ts +25 -0
  194. package/dist/hooks/useTableSelection.js +128 -0
  195. package/dist/hooks/useTableSettings.d.ts +7 -0
  196. package/dist/hooks/useTableSettings.js +24 -0
  197. package/dist/hooks/useTheme.d.ts +3 -7
  198. package/dist/hooks/useTheme.js +52 -47
  199. package/dist/hooks/useTimeDuration.d.ts +22 -0
  200. package/dist/hooks/useTimeDuration.js +36 -0
  201. package/dist/hooks/useViewportFill.d.ts +3 -2
  202. package/dist/hooks/useViewportFill.js +55 -48
  203. package/dist/index.d.ts +32 -6
  204. package/dist/index.js +33 -6
  205. package/dist/src/styles/styles.css +101 -8
  206. package/dist/styles/css-helper-classes/flex.css +101 -0
  207. package/dist/styles/css-helper-classes/typography.css +7 -0
  208. package/dist/styles/styles.css +101 -8
  209. package/dist/styles/themes/dbc/dark.css +207 -100
  210. package/dist/styles/themes/dbc/light.css +185 -90
  211. package/dist/styles/themes/forfatterweb/light.css +1 -1
  212. package/dist/styles/themes/types.js +1 -1
  213. package/dist/types/a11y-props.types.d.ts +5 -5
  214. package/dist/types/a11y-props.types.js +1 -1
  215. package/dist/types/sizes.types.d.ts +2 -2
  216. package/dist/types/sizes.types.js +1 -1
  217. package/dist/utils/arrays/nested-filtering.js +43 -33
  218. package/dist/utils/date/formatDate.js +25 -16
  219. package/package.json +33 -18
  220. package/dist/assets/logo.cjs +0 -87
  221. package/dist/components/app-header/AppHeader.cjs +0 -14
  222. package/dist/components/avatar/Avatar.cjs +0 -67
  223. package/dist/components/breadcrumbs/Breadcrumbs.cjs +0 -23
  224. package/dist/components/button/Button.cjs +0 -79
  225. package/dist/components/card/Card.cjs +0 -29
  226. package/dist/components/card-container/CardContainer.cjs +0 -23
  227. package/dist/components/checkbox/Checkbox.cjs +0 -43
  228. package/dist/components/checkbox/Checkbox.d.ts +0 -12
  229. package/dist/components/checkbox/Checkbox.js +0 -37
  230. package/dist/components/chip/Chip.cjs +0 -49
  231. package/dist/components/circle/Circle.cjs +0 -18
  232. package/dist/components/clear-button/ClearButton.cjs +0 -26
  233. package/dist/components/data-summary/DataSummary.cjs +0 -49
  234. package/dist/components/data-summary/DataSummary.d.ts +0 -19
  235. package/dist/components/data-summary/DataSummary.js +0 -43
  236. package/dist/components/data-summary/DataSummary.module.css +0 -51
  237. package/dist/components/filter-field/FilterField.cjs +0 -174
  238. package/dist/components/headline/Headline.cjs +0 -47
  239. package/dist/components/icon/Icon.cjs +0 -27
  240. package/dist/components/input/Input.cjs +0 -48
  241. package/dist/components/input/Input.d.ts +0 -13
  242. package/dist/components/input/Input.js +0 -42
  243. package/dist/components/input/Input.module.css +0 -112
  244. package/dist/components/menu/Menu.cjs +0 -96
  245. package/dist/components/multi-select/MultiSelect.cjs +0 -48
  246. package/dist/components/multi-select/MultiSelect.d.ts +0 -18
  247. package/dist/components/multi-select/MultiSelect.js +0 -46
  248. package/dist/components/nav-bar/NavBar.cjs +0 -55
  249. package/dist/components/page/Page.cjs +0 -30
  250. package/dist/components/page-layout/PageLayout.cjs +0 -101
  251. package/dist/components/pagination/Pagination.cjs +0 -117
  252. package/dist/components/panel/Panel.cjs +0 -18
  253. package/dist/components/popover/Popover.cjs +0 -132
  254. package/dist/components/search-box/SearchBox.cjs +0 -162
  255. package/dist/components/segmented-progress-bar/SegmentedProgressBar.cjs +0 -97
  256. package/dist/components/select/Select.cjs +0 -52
  257. package/dist/components/select/Select.d.ts +0 -11
  258. package/dist/components/select/Select.js +0 -50
  259. package/dist/components/sidebar/Sidebar.cjs +0 -38
  260. package/dist/components/sidebar/Sidebar.module.css +0 -66
  261. package/dist/components/sidebar/components/SidebarItem.cjs +0 -16
  262. package/dist/components/sidebar/components/expandable-sidebar-item/ExpandableSidebarItem.cjs +0 -74
  263. package/dist/components/sidebar/components/sidebar-item-content/SidebarItemContent.cjs +0 -27
  264. package/dist/components/sidebar/components/sidebar-items/SidebarItems.cjs +0 -28
  265. package/dist/components/sidebar/components/sidenav-filteirng/SidenavFiltering.cjs +0 -25
  266. package/dist/components/sidebar/providers/SidebarProvider.cjs +0 -81
  267. package/dist/components/skeleton-loader/SkeletonLoader.cjs +0 -270
  268. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +0 -42
  269. package/dist/components/split-button/SplitButton.cjs +0 -37
  270. package/dist/components/table/Table.cjs +0 -181
  271. package/dist/components/table/components/column-resizer/ColumnResizer.cjs +0 -22
  272. package/dist/components/tabs/Tabs.cjs +0 -74
  273. package/dist/components/text-area/Textarea.cjs +0 -62
  274. package/dist/components/text-area/Textarea.d.ts +0 -14
  275. package/dist/components/text-area/Textarea.js +0 -56
  276. package/dist/components/text-area/Textarea.module.css +0 -3
  277. package/dist/components/tooltip/Tooltip.cjs +0 -78
  278. package/dist/components/tooltip/Tooltip.d.ts +0 -11
  279. package/dist/components/tooltip/Tooltip.js +0 -72
  280. package/dist/components/tooltip/Tooltip.module.css +0 -84
  281. package/dist/components/user-display/UserDisplay.cjs +0 -28
  282. package/dist/constants/severity.cjs +0 -21
  283. package/dist/constants/severity.types.cjs +0 -2
  284. package/dist/constants/sizes.cjs +0 -10
  285. package/dist/hooks/useTheme.cjs +0 -58
  286. package/dist/hooks/useViewportFill.cjs +0 -52
  287. package/dist/index.cjs +0 -264
  288. package/dist/styles/themes/types.cjs +0 -2
  289. package/dist/tanstack.cjs +0 -231
  290. package/dist/tanstack.d.ts +0 -25
  291. package/dist/tanstack.js +0 -206
  292. package/dist/types/a11y-props.types.cjs +0 -2
  293. package/dist/types/assets.d.cjs +0 -2
  294. package/dist/types/assets.d.js +0 -1
  295. package/dist/types/css.d.cjs +0 -2
  296. package/dist/types/css.d.js +0 -1
  297. package/dist/types/sizes.types.cjs +0 -2
  298. package/dist/utils/arrays/nested-filtering.cjs +0 -40
  299. package/dist/utils/date/formatDate.cjs +0 -19
@@ -0,0 +1,11 @@
1
+ import { useState } from 'react';
2
+ export function useSidePanel() {
3
+ const [isOpen, setIsOpen] = useState(false);
4
+ const openSidePanel = () => setIsOpen(true);
5
+ const closeSidePanel = () => setIsOpen(false);
6
+ return {
7
+ isOpen,
8
+ openSidePanel,
9
+ closeSidePanel,
10
+ };
11
+ }
@@ -0,0 +1,13 @@
1
+ import { type ReactNode, type HTMLAttributes, type ReactElement } from 'react';
2
+ import { TooltipPlacement } from './TooltipProvider';
3
+ export interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'content'> {
4
+ children: ReactNode;
5
+ content: ReactNode;
6
+ placement?: TooltipPlacement;
7
+ open?: boolean;
8
+ offset?: number;
9
+ delayOpenMs?: number;
10
+ delayCloseMs?: number;
11
+ className?: string;
12
+ }
13
+ export declare function Tooltip({ children, content, placement, open, offset, delayOpenMs, delayCloseMs, className, ...rest }: TooltipProps): ReactElement;
@@ -0,0 +1,17 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useTooltipTrigger } from './useTooltipTrigger';
4
+ export function Tooltip({ children, content, placement = 'top', open, offset = 8, delayOpenMs, delayCloseMs, className, ...rest }) {
5
+ const { triggerProps } = useTooltipTrigger({
6
+ content,
7
+ placement,
8
+ offset,
9
+ open,
10
+ delayOpenMs,
11
+ delayCloseMs,
12
+ });
13
+ const rootClass = useMemo(() => ['TooltipContainer', className].filter(Boolean).join(' '), [className]);
14
+ if (!content)
15
+ return _jsx(_Fragment, { children: children });
16
+ return (_jsx("span", { className: rootClass, ...rest, children: _jsx("span", { className: "TooltipTrigger", tabIndex: 0, ...triggerProps, children: children }) }));
17
+ }
@@ -0,0 +1,106 @@
1
+ /* Layout neutral wrapper */
2
+ .container {
3
+ display: contents;
4
+ }
5
+
6
+ /* Measurable trigger box without forcing full width */
7
+ .trigger {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ max-width: 100%;
11
+ }
12
+
13
+ .trigger:focus-visible {
14
+ outline: none;
15
+ box-shadow: var(--focus-ring);
16
+ border-radius: var(--border-radius-default);
17
+ }
18
+
19
+ /* Bubble */
20
+ .bubble {
21
+ position: fixed;
22
+ z-index: var(--z-tooltip);
23
+ pointer-events: none;
24
+
25
+ background: var(--color-fg-default);
26
+ color: var(--color-fg-on-strong);
27
+ font-size: var(--font-size-xs);
28
+ line-height: var(--line-height-tight);
29
+ padding: var(--spacing-xxs) var(--spacing-sm);
30
+ border-radius: var(--border-radius-default);
31
+
32
+ /*
33
+ ✅ Width behavior:
34
+ - Don't let it run wild horizontally
35
+ - But don't clip: allow wrap
36
+ - Keep some relation to viewport
37
+ */
38
+ max-width: min(360px, calc(100vw - 16px));
39
+ white-space: normal;
40
+ overflow-wrap: break-word; /* wrap long words nicely */
41
+ word-break: normal;
42
+
43
+ /*
44
+ If your tooltips often include URLs/IDs, consider 'anywhere' instead:
45
+ overflow-wrap: anywhere;
46
+ */
47
+
48
+ /* Optional: nicer shadow than box-shadow for rounded bubble */
49
+ filter: drop-shadow(0 6px 16px rgba(0, 0, 0, 0.22));
50
+
51
+ /* Hidden by default */
52
+ opacity: 0;
53
+ visibility: hidden;
54
+
55
+ /* Base transform gets overridden by placement rules below */
56
+ transform: translate3d(0, 0, 0);
57
+
58
+ transition:
59
+ opacity var(--transition-fast),
60
+ transform var(--transition-fast),
61
+ visibility 0s linear var(--transition-fast);
62
+ }
63
+
64
+ .bubble[data-open='true'] {
65
+ opacity: 1;
66
+ visibility: visible;
67
+ transition:
68
+ opacity var(--transition-fast),
69
+ transform var(--transition-fast),
70
+ visibility 0s;
71
+ }
72
+
73
+ /* Placement-based motion (so it “comes from” the trigger) */
74
+ .bubble[data-placement='top'] {
75
+ transform: translate3d(0, -6px, 0);
76
+ }
77
+ .bubble[data-placement='bottom'] {
78
+ transform: translate3d(0, 6px, 0);
79
+ }
80
+ .bubble[data-placement='left'] {
81
+ transform: translate3d(-6px, 0, 0);
82
+ }
83
+ .bubble[data-placement='right'] {
84
+ transform: translate3d(6px, 0, 0);
85
+ }
86
+
87
+ /* Open state resets transform to 0 for all placements */
88
+ .bubble[data-open='true'][data-placement='top'],
89
+ .bubble[data-open='true'][data-placement='bottom'],
90
+ .bubble[data-open='true'][data-placement='left'],
91
+ .bubble[data-open='true'][data-placement='right'] {
92
+ transform: translate3d(0, 0, 0);
93
+ }
94
+
95
+ .bubble svg {
96
+ height: 20px;
97
+ width: 20px;
98
+ flex: 0 0 auto;
99
+ }
100
+
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .bubble {
103
+ transition: none;
104
+ transform: none;
105
+ }
106
+ }
@@ -0,0 +1,20 @@
1
+ import React, { type ReactNode } from 'react';
2
+ export type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
3
+ export type TooltipState = {
4
+ id: string;
5
+ open: boolean;
6
+ content: ReactNode;
7
+ placement: TooltipPlacement;
8
+ offset: number;
9
+ triggerEl: HTMLElement | null;
10
+ };
11
+ export type TooltipContextValue = {
12
+ show: (next: Omit<TooltipState, 'open'>) => void;
13
+ hide: (id: string) => void;
14
+ update: (id: string, patch: Partial<Omit<TooltipState, 'id'>>) => void;
15
+ active: TooltipState | null;
16
+ };
17
+ export declare const TooltipContext: React.Context<TooltipContextValue | null>;
18
+ export declare function TooltipProvider({ children }: {
19
+ children: ReactNode;
20
+ }): React.ReactElement;
@@ -0,0 +1,244 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import styles from './Tooltip.module.css';
6
+ export const TooltipContext = createContext(null);
7
+ const VIEWPORT_PADDING = 8;
8
+ function clamp(n, min, max) {
9
+ return Math.max(min, Math.min(n, max));
10
+ }
11
+ function flippedPlacement(p) {
12
+ if (p === 'top')
13
+ return 'bottom';
14
+ if (p === 'bottom')
15
+ return 'top';
16
+ if (p === 'left')
17
+ return 'right';
18
+ return 'left';
19
+ }
20
+ function computePosition(args) {
21
+ const { triggerRect, bubbleRect, placement, offset } = args;
22
+ switch (placement) {
23
+ case 'top':
24
+ return {
25
+ left: triggerRect.left + triggerRect.width / 2 - bubbleRect.width / 2,
26
+ top: triggerRect.top - bubbleRect.height - offset,
27
+ };
28
+ case 'bottom':
29
+ return {
30
+ left: triggerRect.left + triggerRect.width / 2 - bubbleRect.width / 2,
31
+ top: triggerRect.bottom + offset,
32
+ };
33
+ case 'left':
34
+ return {
35
+ left: triggerRect.left - bubbleRect.width - offset,
36
+ top: triggerRect.top + triggerRect.height / 2 - bubbleRect.height / 2,
37
+ };
38
+ case 'right':
39
+ return {
40
+ left: triggerRect.right + offset,
41
+ top: triggerRect.top + triggerRect.height / 2 - bubbleRect.height / 2,
42
+ };
43
+ }
44
+ }
45
+ function fitsViewport(pos, bubbleRect) {
46
+ const vw = window.innerWidth;
47
+ const vh = window.innerHeight;
48
+ const leftOk = pos.left >= VIEWPORT_PADDING;
49
+ const rightOk = pos.left + bubbleRect.width <= vw - VIEWPORT_PADDING;
50
+ const topOk = pos.top >= VIEWPORT_PADDING;
51
+ const bottomOk = pos.top + bubbleRect.height <= vh - VIEWPORT_PADDING;
52
+ return leftOk && rightOk && topOk && bottomOk;
53
+ }
54
+ function shallowEqualActive(a, b) {
55
+ if (a === b)
56
+ return true;
57
+ if (!a || !b)
58
+ return false;
59
+ return (a.id === b.id &&
60
+ a.open === b.open &&
61
+ a.content === b.content &&
62
+ a.placement === b.placement &&
63
+ a.offset === b.offset &&
64
+ a.triggerEl === b.triggerEl);
65
+ }
66
+ export function TooltipProvider({ children }) {
67
+ const [active, setActive] = useState(null);
68
+ const show = useCallback((next) => {
69
+ setActive(curr => {
70
+ const proposed = { ...next, open: true };
71
+ return shallowEqualActive(curr, proposed) ? curr : proposed;
72
+ });
73
+ }, []);
74
+ const hide = useCallback((id) => {
75
+ setActive(curr => {
76
+ if (!curr || curr.id !== id)
77
+ return curr;
78
+ return null;
79
+ });
80
+ }, []);
81
+ const update = useCallback((id, patch) => {
82
+ setActive(curr => {
83
+ if (!curr || curr.id !== id)
84
+ return curr;
85
+ const proposed = { ...curr, ...patch };
86
+ return shallowEqualActive(curr, proposed) ? curr : proposed;
87
+ });
88
+ }, []);
89
+ const value = useMemo(() => ({ show, hide, update, active }), [show, hide, update, active]);
90
+ return (_jsxs(TooltipContext.Provider, { value: value, children: [children, _jsx(TooltipLayer, {})] }));
91
+ }
92
+ function TooltipLayer() {
93
+ const ctx = useContext(TooltipContext);
94
+ const active = ctx === null || ctx === void 0 ? void 0 : ctx.active;
95
+ const bubbleRef = useRef(null);
96
+ const [mounted, setMounted] = useState(false);
97
+ // "open" follows provider state; "visible" only becomes true after a successful measure+position.
98
+ const [open, setOpen] = useState(false);
99
+ const [visible, setVisible] = useState(false);
100
+ const [placement, setPlacement] = useState('top');
101
+ const [pos, setPos] = useState({ top: 0, left: 0 });
102
+ // Prevent unnecessary state churn
103
+ const lastPlacementRef = useRef('top');
104
+ const lastPosRef = useRef({ top: 0, left: 0 });
105
+ // Robust switching between triggers (prevents showing new tooltip at old coords)
106
+ const lastActiveIdRef = useRef(null);
107
+ // Track and cancel scheduled recomputes
108
+ const rafRef = useRef(null);
109
+ useEffect(() => setMounted(true), []);
110
+ const recompute = useCallback(() => {
111
+ if (!(active === null || active === void 0 ? void 0 : active.open))
112
+ return;
113
+ const trigger = active.triggerEl;
114
+ const bubble = bubbleRef.current;
115
+ if (!trigger || !bubble)
116
+ return;
117
+ const triggerRect = trigger.getBoundingClientRect();
118
+ const bubbleRect = bubble.getBoundingClientRect();
119
+ // Keep hidden until bubble has real dimensions
120
+ if (bubbleRect.width === 0 || bubbleRect.height === 0) {
121
+ if (visible)
122
+ setVisible(false);
123
+ if (rafRef.current)
124
+ cancelAnimationFrame(rafRef.current);
125
+ rafRef.current = requestAnimationFrame(recompute);
126
+ return;
127
+ }
128
+ const candidates = [active.placement, flippedPlacement(active.placement)];
129
+ let chosen = candidates[0];
130
+ let nextPos = computePosition({
131
+ triggerRect,
132
+ bubbleRect,
133
+ placement: chosen,
134
+ offset: active.offset,
135
+ });
136
+ if (!fitsViewport(nextPos, bubbleRect)) {
137
+ const alt = candidates[1];
138
+ const altPos = computePosition({
139
+ triggerRect,
140
+ bubbleRect,
141
+ placement: alt,
142
+ offset: active.offset,
143
+ });
144
+ if (fitsViewport(altPos, bubbleRect)) {
145
+ chosen = alt;
146
+ nextPos = altPos;
147
+ }
148
+ }
149
+ const vw = window.innerWidth;
150
+ const vh = window.innerHeight;
151
+ const left = clamp(nextPos.left, VIEWPORT_PADDING, vw - bubbleRect.width - VIEWPORT_PADDING);
152
+ const top = clamp(nextPos.top, VIEWPORT_PADDING, vh - bubbleRect.height - VIEWPORT_PADDING);
153
+ // Only update state if changed
154
+ const prevPos = lastPosRef.current;
155
+ if (prevPos.left !== left || prevPos.top !== top) {
156
+ lastPosRef.current = { left, top };
157
+ setPos({ left, top });
158
+ }
159
+ if (lastPlacementRef.current !== chosen) {
160
+ lastPlacementRef.current = chosen;
161
+ setPlacement(chosen);
162
+ }
163
+ if (!visible)
164
+ setVisible(true);
165
+ }, [active === null || active === void 0 ? void 0 : active.open, active === null || active === void 0 ? void 0 : active.triggerEl, active === null || active === void 0 ? void 0 : active.placement, active === null || active === void 0 ? void 0 : active.offset, visible]);
166
+ // Drive open/close local state, reset visibility on open.
167
+ useEffect(() => {
168
+ const nextOpen = !!(active === null || active === void 0 ? void 0 : active.open);
169
+ setOpen(prev => (prev === nextOpen ? prev : nextOpen));
170
+ if (nextOpen)
171
+ setVisible(false);
172
+ if (!nextOpen)
173
+ lastActiveIdRef.current = null;
174
+ }, [active === null || active === void 0 ? void 0 : active.open]);
175
+ // Handle switching from one trigger to another (hide before paint + recompute)
176
+ useLayoutEffect(() => {
177
+ var _a;
178
+ const id = (_a = active === null || active === void 0 ? void 0 : active.id) !== null && _a !== void 0 ? _a : null;
179
+ if (!id)
180
+ return;
181
+ if (lastActiveIdRef.current && lastActiveIdRef.current !== id) {
182
+ // Switching tooltips: hide immediately to avoid flash at previous position
183
+ setVisible(false);
184
+ }
185
+ lastActiveIdRef.current = id;
186
+ // Schedule a recompute after DOM updates
187
+ if (rafRef.current)
188
+ cancelAnimationFrame(rafRef.current);
189
+ rafRef.current = requestAnimationFrame(recompute);
190
+ return () => {
191
+ if (rafRef.current) {
192
+ cancelAnimationFrame(rafRef.current);
193
+ rafRef.current = null;
194
+ }
195
+ };
196
+ }, [active === null || active === void 0 ? void 0 : active.id, recompute]);
197
+ // Auto-update while open (resize/scroll/resize-observer)
198
+ useLayoutEffect(() => {
199
+ if (!open)
200
+ return;
201
+ if (rafRef.current)
202
+ cancelAnimationFrame(rafRef.current);
203
+ rafRef.current = requestAnimationFrame(recompute);
204
+ const onResize = () => recompute();
205
+ const onScroll = () => recompute();
206
+ window.addEventListener('resize', onResize);
207
+ window.addEventListener('scroll', onScroll, true);
208
+ const ro = new ResizeObserver(() => recompute());
209
+ if (active === null || active === void 0 ? void 0 : active.triggerEl)
210
+ ro.observe(active.triggerEl);
211
+ if (bubbleRef.current)
212
+ ro.observe(bubbleRef.current);
213
+ return () => {
214
+ if (rafRef.current) {
215
+ cancelAnimationFrame(rafRef.current);
216
+ rafRef.current = null;
217
+ }
218
+ window.removeEventListener('resize', onResize);
219
+ window.removeEventListener('scroll', onScroll, true);
220
+ ro.disconnect();
221
+ };
222
+ }, [open, recompute, active === null || active === void 0 ? void 0 : active.triggerEl]);
223
+ // Escape closes
224
+ useEffect(() => {
225
+ if (!open || !active)
226
+ return;
227
+ const onKeyDown = (e) => {
228
+ if (e.key === 'Escape')
229
+ ctx.hide(active.id);
230
+ };
231
+ window.addEventListener('keydown', onKeyDown);
232
+ return () => window.removeEventListener('keydown', onKeyDown);
233
+ // eslint-disable-next-line react-hooks/exhaustive-deps
234
+ }, [open, active === null || active === void 0 ? void 0 : active.id]);
235
+ if (!ctx)
236
+ return null;
237
+ if (!mounted || !active)
238
+ return null;
239
+ // While not yet visible, keep it offscreen so it can be measured but never flashes at stale coords.
240
+ const bubbleStyle = visible
241
+ ? { top: pos.top, left: pos.left }
242
+ : { top: -9999, left: -9999 };
243
+ return createPortal(_jsx("div", { ref: bubbleRef, id: active.id, role: "tooltip", className: styles.bubble, "data-open": visible ? 'true' : 'false', "data-placement": placement, style: bubbleStyle, "aria-hidden": !visible, children: active.content }), document.body);
244
+ }
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+ import { TooltipPlacement } from './TooltipProvider';
3
+ type UseTooltipOptions = {
4
+ content: ReactNode;
5
+ placement?: TooltipPlacement;
6
+ offset?: number;
7
+ open?: boolean;
8
+ defaultOpen?: boolean;
9
+ delayOpenMs?: number;
10
+ delayCloseMs?: number;
11
+ };
12
+ export declare function useTooltipTrigger(options: UseTooltipOptions): {
13
+ id: string;
14
+ isOpen: boolean;
15
+ triggerProps: {
16
+ ref: (node: HTMLElement | null) => void;
17
+ onPointerEnter: () => void;
18
+ onPointerLeave: () => void;
19
+ onFocus: () => void;
20
+ onBlur: () => void;
21
+ 'aria-describedby'?: string;
22
+ };
23
+ };
24
+ export {};
@@ -0,0 +1,108 @@
1
+ import { useCallback, useContext, useEffect, useId, useRef, useState } from 'react';
2
+ import { TooltipContext } from './TooltipProvider';
3
+ export function useTooltipTrigger(options) {
4
+ const ctx = useContext(TooltipContext);
5
+ if (!ctx)
6
+ throw new Error('useTooltipTrigger must be used within <TooltipProvider>.');
7
+ const { content, placement = 'top', offset = 8, open, defaultOpen = false, delayOpenMs = 150, delayCloseMs = 50, } = options;
8
+ const id = useId();
9
+ const triggerElRef = useRef(null);
10
+ const isControlled = open !== undefined;
11
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
12
+ const isOpen = isControlled ? !!open : uncontrolledOpen;
13
+ const openTimer = useRef(null);
14
+ const closeTimer = useRef(null);
15
+ const clearTimers = () => {
16
+ if (openTimer.current)
17
+ window.clearTimeout(openTimer.current);
18
+ if (closeTimer.current)
19
+ window.clearTimeout(closeTimer.current);
20
+ openTimer.current = null;
21
+ closeTimer.current = null;
22
+ };
23
+ // Track last values so we only call update when something actually changes
24
+ const lastSentRef = useRef(null);
25
+ const show = useCallback(() => {
26
+ if (!content)
27
+ return;
28
+ ctx.show({
29
+ id,
30
+ content,
31
+ placement,
32
+ offset,
33
+ triggerEl: triggerElRef.current,
34
+ });
35
+ lastSentRef.current = { content, placement, offset };
36
+ }, [ctx, id, content, placement, offset]);
37
+ const hide = useCallback(() => {
38
+ ctx.hide(id);
39
+ }, [ctx, id]);
40
+ // Drive global tooltip open/close from local state
41
+ useEffect(() => {
42
+ if (!isOpen) {
43
+ hide();
44
+ return;
45
+ }
46
+ show();
47
+ }, [isOpen, show, hide]);
48
+ // ✅ Only call update if THIS tooltip is the active one AND something changed
49
+ useEffect(() => {
50
+ var _a;
51
+ if (!isOpen)
52
+ return;
53
+ if (((_a = ctx.active) === null || _a === void 0 ? void 0 : _a.id) !== id)
54
+ return;
55
+ const last = lastSentRef.current;
56
+ const changed = !last || last.content !== content || last.placement !== placement || last.offset !== offset;
57
+ if (!changed)
58
+ return;
59
+ ctx.update(id, {
60
+ content,
61
+ placement,
62
+ offset,
63
+ triggerEl: triggerElRef.current,
64
+ });
65
+ lastSentRef.current = { content, placement, offset };
66
+ }, [ctx, id, isOpen, content, placement, offset]);
67
+ const setOpen = (next) => {
68
+ if (isControlled)
69
+ return;
70
+ setUncontrolledOpen(next);
71
+ };
72
+ const onPointerEnter = () => {
73
+ clearTimers();
74
+ if (isControlled)
75
+ return;
76
+ openTimer.current = window.setTimeout(() => setOpen(true), delayOpenMs);
77
+ };
78
+ const onPointerLeave = () => {
79
+ clearTimers();
80
+ if (isControlled)
81
+ return;
82
+ closeTimer.current = window.setTimeout(() => setOpen(false), delayCloseMs);
83
+ };
84
+ const onFocus = () => {
85
+ clearTimers();
86
+ if (!isControlled)
87
+ setOpen(true);
88
+ };
89
+ const onBlur = () => {
90
+ clearTimers();
91
+ if (!isControlled)
92
+ setOpen(false);
93
+ };
94
+ return {
95
+ id,
96
+ isOpen,
97
+ triggerProps: {
98
+ ref: (node) => {
99
+ triggerElRef.current = node;
100
+ },
101
+ onPointerEnter,
102
+ onPointerLeave,
103
+ onFocus,
104
+ onBlur,
105
+ 'aria-describedby': content ? id : undefined,
106
+ },
107
+ };
108
+ }
@@ -1,13 +1,14 @@
1
- import { Severity } from '@/constants/severity.types';
1
+ import type { ReactNode } from 'react';
2
+ import { Severity } from '../../constants/severity.types';
2
3
  import { BreadcrumbItem } from '../breadcrumbs/Breadcrumbs';
3
- interface Page {
4
+ interface PageProps {
4
5
  header?: string;
5
6
  severity?: Severity;
6
- headerIcon?: React.ReactNode;
7
- children?: React.ReactNode;
8
- headerAddition?: React.ReactNode;
7
+ headerIcon?: ReactNode;
8
+ children?: ReactNode;
9
+ headerAddition?: ReactNode;
9
10
  disableContentBox?: boolean;
10
11
  breadcrumbs?: BreadcrumbItem[];
11
12
  }
12
- export declare function Page({ header, severity, headerIcon, headerAddition, breadcrumbs, disableContentBox, children, }: Page): React.ReactNode;
13
+ export declare function Page({ header, severity, headerIcon, headerAddition, breadcrumbs, disableContentBox, children, }: PageProps): ReactNode;
13
14
  export {};
@@ -1,24 +1,7 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Headline } from '../headline/Headline';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
2
  import styles from './Page.module.css';
4
3
  import { Breadcrumbs } from '../breadcrumbs/Breadcrumbs';
5
-
6
- function Page({
7
- header,
8
- severity,
9
- headerIcon,
10
- headerAddition,
11
- breadcrumbs,
12
- disableContentBox,
13
- children
14
- }) {
15
- return /* @__PURE__ */ jsxs("div", { className: "grow-container", children: [
16
- /* @__PURE__ */ jsxs("div", { className: styles.headerContainer, children: [
17
- breadcrumbs ? /* @__PURE__ */ jsx(Breadcrumbs, { items: breadcrumbs }) : /* @__PURE__ */ jsx(Headline, { disableMargin: true, size: 2, severity, icon: headerIcon, children: header }),
18
- headerAddition
19
- ] }),
20
- /* @__PURE__ */ jsx("div", { className: `${styles.content} ${disableContentBox ? styles.disableContentBox : ""}`, children })
21
- ] });
4
+ import { Headline } from '../headline/Headline';
5
+ export function Page({ header, severity, headerIcon, headerAddition, breadcrumbs, disableContentBox, children, }) {
6
+ return (_jsxs("div", { className: "grow-container", children: [_jsxs("div", { className: styles.headerContainer, children: [breadcrumbs ? (_jsx(Breadcrumbs, { items: breadcrumbs })) : (_jsx(Headline, { disableMargin: true, size: 2, severity: severity, icon: headerIcon, children: header })), headerAddition] }), _jsx("div", { className: `${styles.content} ${disableContentBox ? styles.disableContentBox : ''}`, children: children })] }));
22
7
  }
23
-
24
- export { Page };
@@ -21,6 +21,6 @@
21
21
 
22
22
  .content:not(.disableContentBox) {
23
23
  padding: var(--spacing-lg);
24
- border: 1px solid var(--opac-bg-dark);
24
+ border: 1px solid var(--color-border-default);
25
25
  border-radius: var(--border-radius-default);
26
- }
26
+ }
@@ -1,35 +1,27 @@
1
- import * as React from 'react';
2
- import type { PropsWithChildren } from 'react';
1
+ import type { PropsWithChildren, ReactNode, FC } from 'react';
2
+ import { PageLayoutHeroProps } from './components/page-layout-hero/PageLayoutHero';
3
3
  type Orientation = 'vertical' | 'horizontal';
4
4
  export interface PageLayoutProps extends PropsWithChildren {
5
5
  containScrolling?: boolean;
6
6
  orientation?: Orientation;
7
- sidebar?: React.ReactNode;
8
- header?: React.ReactNode;
7
+ sidebar?: ReactNode;
8
+ header?: ReactNode;
9
9
  }
10
10
  export interface PageLayoutHeaderProps {
11
11
  maxWidth?: boolean;
12
- children: React.ReactNode;
13
- }
14
- export interface PageLayoutHeroProps {
15
- children?: React.ReactNode;
16
- link?: (children: React.ReactNode) => React.ReactNode;
17
- image?: React.ReactNode;
18
- headline?: string | React.ReactNode;
19
- metaHeadline?: string | React.ReactNode;
20
- maxWidth?: boolean;
12
+ children: ReactNode;
21
13
  }
22
14
  export interface PageLayoutContentProps {
23
15
  maxWidth?: boolean;
24
- children: React.ReactNode;
16
+ children: ReactNode;
25
17
  }
26
18
  export interface PageLayoutFooterProps {
27
- children: React.ReactNode;
19
+ children: ReactNode;
28
20
  }
29
- export declare const PageLayout: React.FC<PageLayoutProps> & {
30
- Header: React.FC<PageLayoutHeaderProps>;
31
- Hero: React.FC<PageLayoutHeroProps>;
32
- Content: React.FC<PageLayoutContentProps>;
33
- Footer: React.FC<PageLayoutFooterProps>;
21
+ export declare const PageLayout: FC<PageLayoutProps> & {
22
+ Header: FC<PageLayoutHeaderProps>;
23
+ Hero: FC<PageLayoutHeroProps>;
24
+ Content: FC<PageLayoutContentProps>;
25
+ Footer: FC<PageLayoutFooterProps>;
34
26
  };
35
27
  export {};