@danske/sapphire-react-lab 0.103.0 → 0.105.1
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.
- package/README.md +2 -1
- package/build/cjs/index.js +1970 -748
- package/build/cjs/index.js.map +1 -1
- package/build/esm/Accordion/index.js +3 -1
- package/build/esm/Accordion/index.js.map +1 -1
- package/build/esm/Accordion/src/Accordion.js +28 -22
- package/build/esm/Accordion/src/Accordion.js.map +1 -1
- package/build/esm/Accordion/src/AccordionContext.js +2 -1
- package/build/esm/Accordion/src/AccordionContext.js.map +1 -1
- package/build/esm/Accordion/src/AccordionHeading.js +30 -10
- package/build/esm/Accordion/src/AccordionHeading.js.map +1 -1
- package/build/esm/Accordion/src/AccordionItem.js +54 -52
- package/build/esm/Accordion/src/AccordionItem.js.map +1 -1
- package/build/esm/Accordion/src/AccordionPanel.js +58 -0
- package/build/esm/Accordion/src/AccordionPanel.js.map +1 -0
- package/build/esm/Accordion/src/utils.js +7 -0
- package/build/esm/Accordion/src/utils.js.map +1 -0
- package/build/esm/Amount/src/Amount.js +76 -0
- package/build/esm/Amount/src/Amount.js.map +1 -0
- package/build/esm/Amount/src/useGroupAmount.js +35 -0
- package/build/esm/Amount/src/useGroupAmount.js.map +1 -0
- package/build/esm/Autocomplete/src/Autocomplete.js +13 -3
- package/build/esm/Autocomplete/src/Autocomplete.js.map +1 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js +31 -9
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js +1 -2
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -1
- package/build/esm/Filtering/src/FilterDropdown.js +8 -3
- package/build/esm/Filtering/src/FilterDropdown.js.map +1 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js +3 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js.map +1 -1
- package/build/esm/NumberField/src/NumberField.js +53 -21
- package/build/esm/NumberField/src/NumberField.js.map +1 -1
- package/build/esm/NumberField/src/StepperButton.js +8 -4
- package/build/esm/NumberField/src/StepperButton.js.map +1 -1
- package/build/esm/NumberField/src/cursorHelpers.js +55 -0
- package/build/esm/NumberField/src/cursorHelpers.js.map +1 -0
- package/build/esm/NumberField/src/formatHelpers.js +81 -0
- package/build/esm/NumberField/src/formatHelpers.js.map +1 -0
- package/build/esm/NumberField/src/keyboardHelpers.js +120 -0
- package/build/esm/NumberField/src/keyboardHelpers.js.map +1 -0
- package/build/esm/NumberField/src/useNumberFieldFormatting.js +94 -0
- package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +1 -0
- package/build/esm/NumberField/src/useSapphireNumberField.js +1 -1
- package/build/esm/NumberField/src/useSapphireNumberField.js.map +1 -1
- package/build/esm/Sidebar/index.js +23 -0
- package/build/esm/Sidebar/index.js.map +1 -0
- package/build/esm/Sidebar/src/Body.js +56 -0
- package/build/esm/Sidebar/src/Body.js.map +1 -0
- package/build/esm/Sidebar/src/ExpandableItem.js +133 -0
- package/build/esm/Sidebar/src/ExpandableItem.js.map +1 -0
- package/build/esm/Sidebar/src/Header.js +55 -0
- package/build/esm/Sidebar/src/Header.js.map +1 -0
- package/build/esm/Sidebar/src/Item.js +56 -0
- package/build/esm/Sidebar/src/Item.js.map +1 -0
- package/build/esm/Sidebar/src/List.js +52 -0
- package/build/esm/Sidebar/src/List.js.map +1 -0
- package/build/esm/Sidebar/src/Panel.js +104 -0
- package/build/esm/Sidebar/src/Panel.js.map +1 -0
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js +42 -0
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
- package/build/esm/Sidebar/src/SecondarySidebarContext.js +35 -0
- package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +1 -0
- package/build/esm/Sidebar/src/Section.js +66 -0
- package/build/esm/Sidebar/src/Section.js.map +1 -0
- package/build/esm/Sidebar/src/Sidebar.js +114 -0
- package/build/esm/Sidebar/src/Sidebar.js.map +1 -0
- package/build/esm/Sidebar/src/useSidebar.js +29 -0
- package/build/esm/Sidebar/src/useSidebar.js.map +1 -0
- package/build/esm/TagGroup/src/Tag.js +31 -23
- package/build/esm/TagGroup/src/Tag.js.map +1 -1
- package/build/esm/index.js +2 -0
- package/build/esm/index.js.map +1 -1
- package/build/index.d.ts +238 -27
- package/package.json +35 -35
- package/build/esm/Accordion/src/useTreeState.js +0 -42
- package/build/esm/Accordion/src/useTreeState.js.map +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import React, { useLayoutEffect, useRef, useEffect } from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';
|
|
4
|
+
import buttonStyles from '@danske/sapphire-css/components/button/button.module.css';
|
|
5
|
+
import { Button } from '@danske/sapphire-react';
|
|
6
|
+
import { FocusScope } from '@react-aria/focus';
|
|
7
|
+
import { Transition } from 'react-transition-group';
|
|
8
|
+
import { Sidebar as _Sidebar } from '../index.js';
|
|
9
|
+
import { useId, mergeProps } from '@react-aria/utils';
|
|
10
|
+
import { useSidebar } from './useSidebar.js';
|
|
11
|
+
import { useSecondarySidebarContext } from './SecondarySidebarContext.js';
|
|
12
|
+
import { useIsSidebarCollapsed } from './ResponsiveSidebarContext.js';
|
|
13
|
+
|
|
14
|
+
var __defProp = Object.defineProperty;
|
|
15
|
+
var __defProps = Object.defineProperties;
|
|
16
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
17
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
18
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
19
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
20
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
21
|
+
var __spreadValues = (a, b) => {
|
|
22
|
+
for (var prop in b || (b = {}))
|
|
23
|
+
if (__hasOwnProp.call(b, prop))
|
|
24
|
+
__defNormalProp(a, prop, b[prop]);
|
|
25
|
+
if (__getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
27
|
+
if (__propIsEnum.call(b, prop))
|
|
28
|
+
__defNormalProp(a, prop, b[prop]);
|
|
29
|
+
}
|
|
30
|
+
return a;
|
|
31
|
+
};
|
|
32
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
33
|
+
var __objRest = (source, exclude) => {
|
|
34
|
+
var target = {};
|
|
35
|
+
for (var prop in source)
|
|
36
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
37
|
+
target[prop] = source[prop];
|
|
38
|
+
if (source != null && __getOwnPropSymbols)
|
|
39
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
40
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
41
|
+
target[prop] = source[prop];
|
|
42
|
+
}
|
|
43
|
+
return target;
|
|
44
|
+
};
|
|
45
|
+
const SidebarExpandableItem = React.forwardRef(function SidebarExpandableItem2(_a, ref) {
|
|
46
|
+
var _b = _a, {
|
|
47
|
+
id,
|
|
48
|
+
isActive,
|
|
49
|
+
body,
|
|
50
|
+
header,
|
|
51
|
+
children
|
|
52
|
+
} = _b, props = __objRest(_b, [
|
|
53
|
+
"id",
|
|
54
|
+
"isActive",
|
|
55
|
+
"body",
|
|
56
|
+
"header",
|
|
57
|
+
"children"
|
|
58
|
+
]);
|
|
59
|
+
const { openedId, setContent, themeVariant } = useSecondarySidebarContext();
|
|
60
|
+
const isCollapsed = useIsSidebarCollapsed();
|
|
61
|
+
const { getExpandableItemProps, secondarySidebarProps } = useSidebar();
|
|
62
|
+
const itemId = useId(id);
|
|
63
|
+
const isOpen = openedId === itemId;
|
|
64
|
+
useLayoutEffect(() => {
|
|
65
|
+
if (isOpen) {
|
|
66
|
+
setContent({ header, body });
|
|
67
|
+
}
|
|
68
|
+
}, [isOpen]);
|
|
69
|
+
return /* @__PURE__ */ React.createElement("li", {
|
|
70
|
+
className: clsx(styles["sapphire-sidebar__nav-item"])
|
|
71
|
+
}, /* @__PURE__ */ React.createElement(Button, __spreadProps(__spreadValues({
|
|
72
|
+
variant: "tertiary",
|
|
73
|
+
"aria-current": isActive || void 0,
|
|
74
|
+
ref
|
|
75
|
+
}, mergeProps(getExpandableItemProps(itemId), props)), {
|
|
76
|
+
UNSAFE_className: clsx(buttonStyles["sapphire-button--stretch-left-align"], {
|
|
77
|
+
[buttonStyles["sapphire-button--selected"]]: isActive && !isOpen,
|
|
78
|
+
[buttonStyles["is-active"]]: isOpen
|
|
79
|
+
})
|
|
80
|
+
}), children), /* @__PURE__ */ React.createElement(SecondarySidebar, __spreadValues({
|
|
81
|
+
isOpen: isOpen && !isCollapsed,
|
|
82
|
+
header,
|
|
83
|
+
themeVariant
|
|
84
|
+
}, secondarySidebarProps), body));
|
|
85
|
+
});
|
|
86
|
+
const SecondarySidebar = ({
|
|
87
|
+
isOpen,
|
|
88
|
+
onClose,
|
|
89
|
+
onCloseTransitionDone,
|
|
90
|
+
themeVariant,
|
|
91
|
+
header,
|
|
92
|
+
children
|
|
93
|
+
}) => {
|
|
94
|
+
const ref = useRef(null);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
const handleKeyDown = (e) => {
|
|
97
|
+
if (e.key === "Escape") {
|
|
98
|
+
onClose == null ? void 0 : onClose();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
102
|
+
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
103
|
+
}, [onClose]);
|
|
104
|
+
return /* @__PURE__ */ React.createElement(Transition, {
|
|
105
|
+
in: isOpen,
|
|
106
|
+
mountOnEnter: true,
|
|
107
|
+
nodeRef: ref,
|
|
108
|
+
unmountOnExit: true,
|
|
109
|
+
onExited: onCloseTransitionDone,
|
|
110
|
+
timeout: 200
|
|
111
|
+
}, (transitionState) => /* @__PURE__ */ React.createElement("div", {
|
|
112
|
+
ref,
|
|
113
|
+
className: clsx(styles["sapphire-sidebar__secondary-container"], {
|
|
114
|
+
[styles["sapphire-sidebar--slide-in"]]: true,
|
|
115
|
+
[styles["sapphire-sidebar--slide-out"]]: transitionState === "exiting"
|
|
116
|
+
})
|
|
117
|
+
}, /* @__PURE__ */ React.createElement(FocusScope, {
|
|
118
|
+
restoreFocus: true,
|
|
119
|
+
autoFocus: true
|
|
120
|
+
}, /* @__PURE__ */ React.createElement(_Sidebar, {
|
|
121
|
+
themeVariant,
|
|
122
|
+
closeOnBlurWithin: false,
|
|
123
|
+
header: /* @__PURE__ */ React.createElement(_Sidebar.Header, {
|
|
124
|
+
closeButtonProps: {
|
|
125
|
+
onPress: () => onClose == null ? void 0 : onClose()
|
|
126
|
+
}
|
|
127
|
+
}, header),
|
|
128
|
+
panelHeader: null
|
|
129
|
+
}, children))));
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export { SidebarExpandableItem };
|
|
133
|
+
//# sourceMappingURL=ExpandableItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpandableItem.js","sources":["../../../../src/Sidebar/src/ExpandableItem.tsx"],"sourcesContent":["import React, { ReactNode, useEffect, useLayoutEffect, useRef } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps, ThemeVariant } from '@danske/sapphire-react';\nimport { FocusScope } from '@react-aria/focus';\nimport { FocusableRef } from '@react-types/shared';\nimport { Transition } from 'react-transition-group';\nimport { Sidebar } from '..';\nimport { mergeProps, useId } from '@react-aria/utils';\nimport { useSidebar } from './useSidebar';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport { useIsSidebarCollapsed } from './ResponsiveSidebarContext';\n\nexport type SidebarExpandableItemProps = Omit<\n ButtonProps<'button'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n\n /**\n * The id of the group.\n * Used in `onSecondarySidebarChange` or when the sidebar is controlled\n */\n id?: string;\n\n /**\n * Heading used for secondary sidebar\n */\n header: ReactNode;\n\n /**\n * Subitems (secondary sidebar)\n */\n body: ReactNode;\n children?: ReactNode;\n};\n\nexport const SidebarExpandableItem = React.forwardRef(\n function SidebarExpandableItem(\n {\n id,\n isActive,\n body,\n header,\n children,\n ...props\n }: SidebarExpandableItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n ): React.JSX.Element {\n const { openedId, setContent, themeVariant } = useSecondarySidebarContext();\n const isCollapsed = useIsSidebarCollapsed();\n const { getExpandableItemProps, secondarySidebarProps } = useSidebar();\n const itemId = useId(id);\n const isOpen = openedId === itemId;\n\n useLayoutEffect(() => {\n if (isOpen) {\n setContent({ header, body });\n }\n }, [isOpen]);\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n variant=\"tertiary\"\n aria-current={isActive || undefined}\n ref={ref}\n {...mergeProps(\n getExpandableItemProps(itemId),\n props as ButtonProps<'button'>\n )}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n {\n [buttonStyles['sapphire-button--selected']]: isActive && !isOpen,\n [buttonStyles['is-active']]: isOpen,\n }\n )}\n >\n {children}\n </Button>\n <SecondarySidebar\n isOpen={isOpen && !isCollapsed}\n header={header}\n themeVariant={themeVariant}\n {...secondarySidebarProps}\n >\n {body}\n </SecondarySidebar>\n </li>\n );\n }\n);\n\nconst SecondarySidebar = ({\n isOpen,\n onClose,\n onCloseTransitionDone,\n themeVariant,\n header,\n children,\n}: {\n isOpen: boolean;\n onClose?: () => void;\n onCloseTransitionDone?: () => void;\n themeVariant?: ThemeVariant;\n header: ReactNode;\n children: ReactNode;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n return (\n <Transition\n in={isOpen}\n mountOnEnter\n nodeRef={ref}\n unmountOnExit\n onExited={onCloseTransitionDone}\n timeout={200}\n >\n {(transitionState) => (\n <div\n ref={ref}\n className={clsx(styles['sapphire-sidebar__secondary-container'], {\n [styles['sapphire-sidebar--slide-in']]: true,\n [styles['sapphire-sidebar--slide-out']]:\n transitionState === 'exiting',\n })}\n >\n <FocusScope restoreFocus autoFocus>\n <Sidebar\n themeVariant={themeVariant}\n closeOnBlurWithin={\n false /* no focus management on nested sidebars */\n }\n header={\n <Sidebar.Header\n closeButtonProps={{\n onPress: () => onClose?.(),\n }}\n >\n {header}\n </Sidebar.Header>\n }\n panelHeader={null}\n >\n {children}\n </Sidebar>\n </FocusScope>\n </div>\n )}\n </Transition>\n );\n};\n"],"names":["Sidebar"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { filterDOMProps } from '@react-aria/utils';
|
|
4
|
+
import styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';
|
|
5
|
+
import { IconButton } from '@danske/sapphire-react';
|
|
6
|
+
import { CloseLarge } from '@danske/sapphire-icons/react';
|
|
7
|
+
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __defProps = Object.defineProperties;
|
|
10
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
11
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
12
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
14
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __spreadValues = (a, b) => {
|
|
16
|
+
for (var prop in b || (b = {}))
|
|
17
|
+
if (__hasOwnProp.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
if (__getOwnPropSymbols)
|
|
20
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
21
|
+
if (__propIsEnum.call(b, prop))
|
|
22
|
+
__defNormalProp(a, prop, b[prop]);
|
|
23
|
+
}
|
|
24
|
+
return a;
|
|
25
|
+
};
|
|
26
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
27
|
+
var __objRest = (source, exclude) => {
|
|
28
|
+
var target = {};
|
|
29
|
+
for (var prop in source)
|
|
30
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
31
|
+
target[prop] = source[prop];
|
|
32
|
+
if (source != null && __getOwnPropSymbols)
|
|
33
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
34
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
35
|
+
target[prop] = source[prop];
|
|
36
|
+
}
|
|
37
|
+
return target;
|
|
38
|
+
};
|
|
39
|
+
const SidebarHeader = (_a) => {
|
|
40
|
+
var _b = _a, {
|
|
41
|
+
children,
|
|
42
|
+
closeButtonProps
|
|
43
|
+
} = _b, props = __objRest(_b, [
|
|
44
|
+
"children",
|
|
45
|
+
"closeButtonProps"
|
|
46
|
+
]);
|
|
47
|
+
return /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, filterDOMProps(props)), {
|
|
48
|
+
className: clsx(styles["sapphire-sidebar__header"])
|
|
49
|
+
}), children, closeButtonProps && /* @__PURE__ */ React.createElement(IconButton, __spreadProps(__spreadValues({}, closeButtonProps), {
|
|
50
|
+
"aria-label": "Close"
|
|
51
|
+
}), /* @__PURE__ */ React.createElement(CloseLarge, null)));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { SidebarHeader };
|
|
55
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sources":["../../../../src/Sidebar/src/Header.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport { IconButton, IconButtonProps } from '@danske/sapphire-react';\nimport { CloseLarge } from '@danske/sapphire-icons/react';\n\nexport interface SidebarHeaderProps extends DOMProps {\n children: ReactNode;\n /**\n * Props for the close button\n * If none provided, close button won't show\n */\n closeButtonProps?: Omit<\n IconButtonProps<'button'>,\n 'children' | 'aria-label' | 'aria-hidden'\n >;\n}\n\nexport const SidebarHeader = ({\n children,\n closeButtonProps,\n ...props\n}: SidebarHeaderProps): React.JSX.Element => {\n return (\n <div\n {...filterDOMProps(props)}\n className={clsx(styles['sapphire-sidebar__header'])}\n >\n {children}\n {closeButtonProps && (\n <IconButton {...closeButtonProps} aria-label=\"Close\">\n <CloseLarge />\n </IconButton>\n )}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBa,MAAA,aAAA,GAAgB,CAAC,EAIe,KAAA;AAJf,EAC5B,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,gBAAA;AAAA,GAF4B,GAAA,EAAA,EAGzB,kBAHyB,EAGzB,EAAA;AAAA,IAFH,UAAA;AAAA,IACA,kBAAA;AAAA,GAAA,CAAA,CAAA;AAGA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAD,aACM,CAAA,cAAA,CAAA,EAAA,EAAA,cAAA,CAAe,KADrB,CAAA,CAAA,EAAA;AAAA,IAEE,SAAA,EAAW,KAAK,MAAO,CAAA,0BAAA,CAAA,CAAA;AAAA,GAAA,CAAA,EAEtB,QACA,EAAA,gBAAA,oBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAD,iCAAgB,gBAAhB,CAAA,EAAA;AAAA,IAAkC,YAAW,EAAA,OAAA;AAAA,GAAA,CAAA,sCAC1C,UAAD,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';
|
|
4
|
+
import buttonStyles from '@danske/sapphire-css/components/button/button.module.css';
|
|
5
|
+
import { Button } from '@danske/sapphire-react';
|
|
6
|
+
import { mergeProps } from '@react-aria/utils';
|
|
7
|
+
import { useSidebar } from './useSidebar.js';
|
|
8
|
+
|
|
9
|
+
var __defProp = Object.defineProperty;
|
|
10
|
+
var __defProps = Object.defineProperties;
|
|
11
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
12
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
13
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
14
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
15
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
16
|
+
var __spreadValues = (a, b) => {
|
|
17
|
+
for (var prop in b || (b = {}))
|
|
18
|
+
if (__hasOwnProp.call(b, prop))
|
|
19
|
+
__defNormalProp(a, prop, b[prop]);
|
|
20
|
+
if (__getOwnPropSymbols)
|
|
21
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
22
|
+
if (__propIsEnum.call(b, prop))
|
|
23
|
+
__defNormalProp(a, prop, b[prop]);
|
|
24
|
+
}
|
|
25
|
+
return a;
|
|
26
|
+
};
|
|
27
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
28
|
+
var __objRest = (source, exclude) => {
|
|
29
|
+
var target = {};
|
|
30
|
+
for (var prop in source)
|
|
31
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
32
|
+
target[prop] = source[prop];
|
|
33
|
+
if (source != null && __getOwnPropSymbols)
|
|
34
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
35
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
36
|
+
target[prop] = source[prop];
|
|
37
|
+
}
|
|
38
|
+
return target;
|
|
39
|
+
};
|
|
40
|
+
const SidebarItem = React.forwardRef(function SidebarItem2(_a, ref) {
|
|
41
|
+
var _b = _a, { isActive, children } = _b, props = __objRest(_b, ["isActive", "children"]);
|
|
42
|
+
const { itemProps } = useSidebar();
|
|
43
|
+
return /* @__PURE__ */ React.createElement("li", {
|
|
44
|
+
className: clsx(styles["sapphire-sidebar__nav-item"])
|
|
45
|
+
}, /* @__PURE__ */ React.createElement(Button, __spreadProps(__spreadValues({
|
|
46
|
+
ref,
|
|
47
|
+
variant: "tertiary",
|
|
48
|
+
elementType: "a",
|
|
49
|
+
"aria-current": isActive ? "page" : void 0
|
|
50
|
+
}, mergeProps(props, itemProps)), {
|
|
51
|
+
UNSAFE_className: clsx(buttonStyles["sapphire-button--stretch-left-align"], { [buttonStyles["sapphire-button--selected"]]: isActive })
|
|
52
|
+
}), children));
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { SidebarItem };
|
|
56
|
+
//# sourceMappingURL=Item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Item.js","sources":["../../../../src/Sidebar/src/Item.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps } from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { mergeProps } from '@react-aria/utils';\nimport { useSidebar } from './useSidebar';\n\nexport type SidebarItemProps = Omit<\n ButtonProps<'a'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n children?: ReactNode;\n};\n\nexport const SidebarItem = React.forwardRef(function SidebarItem(\n { isActive, children, ...props }: SidebarItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n): React.JSX.Element {\n const { itemProps } = useSidebar();\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n ref={ref}\n variant=\"tertiary\"\n elementType=\"a\"\n aria-current={isActive ? 'page' : undefined}\n {...mergeProps(props as ButtonProps<'a'>, itemProps)}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n { [buttonStyles['sapphire-button--selected']]: isActive }\n )}\n >\n {children}\n </Button>\n </li>\n );\n});\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAM,WAAc,GAAA,KAAA,CAAM,UAAW,CAAA,SAAA,YAAA,CAC1C,IACA,GACmB,EAAA;AAFnB,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,YAAU,QAAZ,EAAA,GAAA,EAAA,EAAyB,KAAzB,GAAA,SAAA,CAAA,EAAA,EAAyB,CAAvB,UAAU,EAAA,UAAA,CAAA,CAAA,CAAA;AAGZ,EAAA,MAAM,EAAE,SAAc,EAAA,GAAA,UAAA,EAAA,CAAA;AAEtB,EAAA,2CACG,IAAD,EAAA;AAAA,IAAI,SAAA,EAAW,KAAK,MAAO,CAAA,4BAAA,CAAA,CAAA;AAAA,GAAA,sCACxB,MAAD,EAAA,aAAA,CAAA,cAAA,CAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAQ,EAAA,UAAA;AAAA,IACR,WAAY,EAAA,GAAA;AAAA,IACZ,cAAA,EAAc,WAAW,MAAS,GAAA,KAAA,CAAA;AAAA,GAC9B,EAAA,UAAA,CAAW,OAA2B,SAL5C,CAAA,CAAA,EAAA;AAAA,IAME,kBAAkB,IAChB,CAAA,YAAA,CAAa,qCACb,CAAA,EAAA,EAAA,CAAG,aAAa,2BAA+B,CAAA,GAAA,QAAA,EAAA,CAAA;AAAA,GAGhD,CAAA,EAAA,QAAA,CAAA,CAAA,CAAA;AAAA,CAAA;;;;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import { filterDOMProps } from '@react-aria/utils';
|
|
4
|
+
import styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __defProps = Object.defineProperties;
|
|
8
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
9
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
12
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
+
var __spreadValues = (a, b) => {
|
|
14
|
+
for (var prop in b || (b = {}))
|
|
15
|
+
if (__hasOwnProp.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
if (__getOwnPropSymbols)
|
|
18
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
+
if (__propIsEnum.call(b, prop))
|
|
20
|
+
__defNormalProp(a, prop, b[prop]);
|
|
21
|
+
}
|
|
22
|
+
return a;
|
|
23
|
+
};
|
|
24
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
|
+
var __objRest = (source, exclude) => {
|
|
26
|
+
var target = {};
|
|
27
|
+
for (var prop in source)
|
|
28
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
if (source != null && __getOwnPropSymbols)
|
|
31
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
32
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
33
|
+
target[prop] = source[prop];
|
|
34
|
+
}
|
|
35
|
+
return target;
|
|
36
|
+
};
|
|
37
|
+
const SidebarList = (_a) => {
|
|
38
|
+
var _b = _a, {
|
|
39
|
+
elementType = "ul",
|
|
40
|
+
children
|
|
41
|
+
} = _b, props = __objRest(_b, [
|
|
42
|
+
"elementType",
|
|
43
|
+
"children"
|
|
44
|
+
]);
|
|
45
|
+
const RootNode = elementType;
|
|
46
|
+
return /* @__PURE__ */ React.createElement(RootNode, __spreadProps(__spreadValues({}, filterDOMProps(props, { global: true })), {
|
|
47
|
+
className: clsx(styles["sapphire-sidebar__nav-list"])
|
|
48
|
+
}), children);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { SidebarList };
|
|
52
|
+
//# sourceMappingURL=List.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"List.js","sources":["../../../../src/Sidebar/src/List.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\n\nexport interface SidebarListProps extends DOMProps {\n /**\n * Wrapping element type.\n * @default 'ul'\n */\n elementType?: 'ul' | 'ol';\n children?: ReactNode;\n}\n\nexport const SidebarList = ({\n elementType = 'ul',\n children,\n ...props\n}: SidebarListProps): React.JSX.Element => {\n const RootNode = elementType as any;\n\n return (\n <RootNode\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-sidebar__nav-list'])}\n >\n {children}\n </RootNode>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAea,MAAA,WAAA,GAAc,CAAC,EAIe,KAAA;AAJf,EAC1B,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAc,WAAA,GAAA,IAAA;AAAA,IACd,QAAA;AAAA,GAF0B,GAAA,EAAA,EAGvB,kBAHuB,EAGvB,EAAA;AAAA,IAFH,aAAA;AAAA,IACA,UAAA;AAAA,GAAA,CAAA,CAAA;AAGA,EAAA,MAAM,QAAW,GAAA,WAAA,CAAA;AAEjB,EAAA,2CACG,QAAD,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACM,eAAe,KAAO,EAAA,EAAE,QAAQ,IADtC,EAAA,CAAA,CAAA,EAAA;AAAA,IAEE,SAAA,EAAW,KAAK,MAAO,CAAA,4BAAA,CAAA,CAAA;AAAA,GAEtB,CAAA,EAAA,QAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import { Panel, ModalLayout, IconButton, tokens, View } from '@danske/sapphire-react';
|
|
3
|
+
import { ChevronLeft } from '@danske/sapphire-icons/react';
|
|
4
|
+
import { useSecondarySidebarContext } from './SecondarySidebarContext.js';
|
|
5
|
+
import { useResponsiveSidebarContext, useIsSidebarCollapsed } from './ResponsiveSidebarContext.js';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defProps = Object.defineProperties;
|
|
9
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
var __objRest = (source, exclude) => {
|
|
27
|
+
var target = {};
|
|
28
|
+
for (var prop in source)
|
|
29
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
30
|
+
target[prop] = source[prop];
|
|
31
|
+
if (source != null && __getOwnPropSymbols)
|
|
32
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
33
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
34
|
+
target[prop] = source[prop];
|
|
35
|
+
}
|
|
36
|
+
return target;
|
|
37
|
+
};
|
|
38
|
+
const SidebarPanel = (_a) => {
|
|
39
|
+
var _b = _a, {
|
|
40
|
+
children,
|
|
41
|
+
header
|
|
42
|
+
} = _b, props = __objRest(_b, [
|
|
43
|
+
"children",
|
|
44
|
+
"header"
|
|
45
|
+
]);
|
|
46
|
+
const { openedId, setOpenedId, content } = useSecondarySidebarContext();
|
|
47
|
+
const responsiveContext = useResponsiveSidebarContext();
|
|
48
|
+
if (!responsiveContext) {
|
|
49
|
+
throw new Error("<SidebarPanel> must be rendered inside a <Sidebar.ResponsiveProvider>");
|
|
50
|
+
}
|
|
51
|
+
const { isPanelOpen, setPanelOpen } = responsiveContext;
|
|
52
|
+
const isCollapsed = useIsSidebarCollapsed();
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!isCollapsed) {
|
|
55
|
+
setPanelOpen(false);
|
|
56
|
+
}
|
|
57
|
+
}, [isCollapsed]);
|
|
58
|
+
return /* @__PURE__ */ React.createElement(Panel, __spreadProps(__spreadValues({}, props), {
|
|
59
|
+
isOpen: isPanelOpen,
|
|
60
|
+
onClose: () => setPanelOpen(false),
|
|
61
|
+
onCloseTransitionDone: () => setOpenedId(null),
|
|
62
|
+
alignLeft: true,
|
|
63
|
+
isDismissable: true,
|
|
64
|
+
width: 320
|
|
65
|
+
}), /* @__PURE__ */ React.createElement(ModalLayout, {
|
|
66
|
+
header: /* @__PURE__ */ React.createElement(ModalLayout.Header, {
|
|
67
|
+
heading: openedId === null ? header : content == null ? void 0 : content.header,
|
|
68
|
+
backButton: openedId !== null && /* @__PURE__ */ React.createElement(IconButton, {
|
|
69
|
+
size: "md",
|
|
70
|
+
"aria-label": "Back",
|
|
71
|
+
variant: "tertiary",
|
|
72
|
+
marginLeft: `calc(-1 * ${tokens.size.spacingSm})`,
|
|
73
|
+
onPress: () => setOpenedId(null)
|
|
74
|
+
}, /* @__PURE__ */ React.createElement(ChevronLeft, null))
|
|
75
|
+
}),
|
|
76
|
+
body: /* @__PURE__ */ React.createElement(ModalLayout.Body, {
|
|
77
|
+
noPadding: true,
|
|
78
|
+
UNSAFE_style: {
|
|
79
|
+
paddingLeft: tokens.size.spacingMd.value,
|
|
80
|
+
paddingRight: tokens.size.spacingMd.value
|
|
81
|
+
}
|
|
82
|
+
}, /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(View, {
|
|
83
|
+
isHidden: openedId !== null
|
|
84
|
+
}, children), openedId && (content == null ? void 0 : content.body)))
|
|
85
|
+
}));
|
|
86
|
+
};
|
|
87
|
+
const SidebarPanelTrigger = ({
|
|
88
|
+
children
|
|
89
|
+
}) => {
|
|
90
|
+
const context = useResponsiveSidebarContext();
|
|
91
|
+
if (!context) {
|
|
92
|
+
throw new Error("<Sidebar.PanelTrigger> should be rendered inside a <Sidebar.ResponsiveProvider>");
|
|
93
|
+
}
|
|
94
|
+
const isCollapsed = useIsSidebarCollapsed();
|
|
95
|
+
const panelTriggerProps = {
|
|
96
|
+
onPress: () => {
|
|
97
|
+
context.setPanelOpen(true);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return isCollapsed ? children(panelTriggerProps) : null;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export { SidebarPanel, SidebarPanelTrigger };
|
|
104
|
+
//# sourceMappingURL=Panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sources":["../../../../src/Sidebar/src/Panel.tsx"],"sourcesContent":["import React, { ReactNode, useEffect } from 'react';\nimport {\n IconButton,\n ModalLayout,\n Panel,\n PanelProps,\n tokens,\n View,\n} from '@danske/sapphire-react';\nimport { ChevronLeft } from '@danske/sapphire-icons/react';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport {\n useIsSidebarCollapsed,\n useResponsiveSidebarContext,\n} from './ResponsiveSidebarContext';\n\nexport type SidebarPanelProps = Omit<\n PanelProps,\n 'isOpen' | 'size' | 'direction'\n> & { header: ReactNode };\n\nexport const SidebarPanel = ({\n children,\n header,\n ...props\n}: SidebarPanelProps) => {\n const { openedId, setOpenedId, content } = useSecondarySidebarContext();\n const responsiveContext = useResponsiveSidebarContext();\n\n if (!responsiveContext) {\n throw new Error(\n '<SidebarPanel> must be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n\n const { isPanelOpen, setPanelOpen } = responsiveContext;\n const isCollapsed = useIsSidebarCollapsed();\n\n useEffect(() => {\n if (!isCollapsed) {\n // if breakpoint changes, we want to close the panel until opened manually again\n setPanelOpen(false);\n }\n }, [isCollapsed]);\n\n return (\n <Panel\n {...props}\n isOpen={isPanelOpen}\n onClose={() => setPanelOpen(false)}\n onCloseTransitionDone={() => setOpenedId(null)}\n alignLeft\n isDismissable\n width={320}\n >\n <ModalLayout\n header={\n <ModalLayout.Header\n heading={openedId === null ? header : content?.header}\n backButton={\n openedId !== null && (\n <IconButton\n size=\"md\"\n aria-label=\"Back\"\n variant=\"tertiary\"\n marginLeft={`calc(-1 * ${tokens.size.spacingSm})`}\n onPress={() => setOpenedId(null)}\n >\n <ChevronLeft />\n </IconButton>\n )\n }\n />\n }\n body={\n <ModalLayout.Body\n noPadding\n UNSAFE_style={{\n paddingLeft: tokens.size.spacingMd.value,\n paddingRight: tokens.size.spacingMd.value,\n }}\n >\n <>\n <View isHidden={openedId !== null}>{children}</View>\n {openedId && content?.body}\n </>\n </ModalLayout.Body>\n }\n />\n </Panel>\n );\n};\n\nexport const SidebarPanelTrigger = ({\n children,\n}: {\n children: (triggerProps: any) => JSX.Element;\n}) => {\n const context = useResponsiveSidebarContext();\n if (!context) {\n throw new Error(\n '<Sidebar.PanelTrigger> should be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n const isCollapsed = useIsSidebarCollapsed();\n const panelTriggerProps = {\n onPress: () => {\n context.setPanelOpen(true);\n },\n };\n\n return isCollapsed ? children(panelTriggerProps) : null;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useControlledState } from '@react-stately/utils';
|
|
2
|
+
import { useMatchedBreakpoints } from '@danske/sapphire-react';
|
|
3
|
+
import React, { useContext } from 'react';
|
|
4
|
+
|
|
5
|
+
const ResponsiveSidebarContext = React.createContext(null);
|
|
6
|
+
function useResponsiveSidebarContext() {
|
|
7
|
+
return useContext(ResponsiveSidebarContext);
|
|
8
|
+
}
|
|
9
|
+
function useIsSidebarCollapsed() {
|
|
10
|
+
const context = useContext(ResponsiveSidebarContext);
|
|
11
|
+
const matchedBreakpoints = useMatchedBreakpoints();
|
|
12
|
+
if (!context) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const { collapsed } = context;
|
|
16
|
+
if (typeof collapsed === "boolean") {
|
|
17
|
+
return collapsed;
|
|
18
|
+
}
|
|
19
|
+
if (typeof collapsed === "string") {
|
|
20
|
+
return !matchedBreakpoints.includes(collapsed);
|
|
21
|
+
}
|
|
22
|
+
return !matchedBreakpoints.includes("md");
|
|
23
|
+
}
|
|
24
|
+
const ResponsiveSidebarProvider = ({
|
|
25
|
+
collapsed,
|
|
26
|
+
isPanelOpen,
|
|
27
|
+
defaultIsPanelOpen,
|
|
28
|
+
onPanelOpenChange,
|
|
29
|
+
children
|
|
30
|
+
}) => {
|
|
31
|
+
const [isOpen, setOpen] = useControlledState(isPanelOpen, defaultIsPanelOpen != null ? defaultIsPanelOpen : false, onPanelOpenChange);
|
|
32
|
+
return /* @__PURE__ */ React.createElement(ResponsiveSidebarContext.Provider, {
|
|
33
|
+
value: {
|
|
34
|
+
isPanelOpen: isOpen,
|
|
35
|
+
setPanelOpen: setOpen,
|
|
36
|
+
collapsed
|
|
37
|
+
}
|
|
38
|
+
}, children);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export { ResponsiveSidebarContext, ResponsiveSidebarProvider, useIsSidebarCollapsed, useResponsiveSidebarContext };
|
|
42
|
+
//# sourceMappingURL=ResponsiveSidebarContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponsiveSidebarContext.js","sources":["../../../../src/Sidebar/src/ResponsiveSidebarContext.tsx"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { BreakpointKey, useMatchedBreakpoints } from '@danske/sapphire-react';\nimport React, { ReactNode, useContext } from 'react';\n\nexport interface ResponsiveSidebarContextValue {\n isPanelOpen: boolean;\n setPanelOpen: (open: boolean) => void;\n collapsed: boolean | BreakpointKey | undefined;\n}\n\nexport const ResponsiveSidebarContext =\n React.createContext<ResponsiveSidebarContextValue | null>(null);\n\nexport function useResponsiveSidebarContext() {\n return useContext(ResponsiveSidebarContext);\n}\n\n/**\n * Hook to determine if the sidebar should be collapsed.\n * Returns true if collapsed, false if expanded, or null if not in responsive mode.\n */\nexport function useIsSidebarCollapsed(): boolean | null {\n const context = useContext(ResponsiveSidebarContext);\n const matchedBreakpoints: string[] = useMatchedBreakpoints();\n\n if (!context) {\n return null;\n }\n\n const { collapsed } = context;\n\n // If collapsed is a boolean, use it directly\n if (typeof collapsed === 'boolean') {\n return collapsed;\n }\n\n // If collapsed is a breakpoint string, check if we're below that breakpoint\n if (typeof collapsed === 'string') {\n return !matchedBreakpoints.includes(collapsed);\n }\n\n // If collapsed is undefined, default to 'md' breakpoint behavior\n return !matchedBreakpoints.includes('md');\n}\n\nexport const ResponsiveSidebarProvider = ({\n collapsed,\n isPanelOpen,\n defaultIsPanelOpen,\n onPanelOpenChange,\n children,\n}: {\n /**\n * Controls whether the sidebar is collapsed.\n * - When `true`: sidebar is always collapsed (shows as panel)\n * - When `false`: sidebar is always expanded (shows as sidebar)\n * - When a breakpoint string (e.g., 'md', 'lg'): automatically collapses below that breakpoint\n * - When `undefined`: defaults to 'md' breakpoint behavior (collapses below medium screens)\n * @default undefined (equivalent to 'md')\n */\n collapsed?: boolean | BreakpointKey;\n\n /**\n * If the sidebar panel is open (controlled)\n */\n isPanelOpen?: boolean;\n\n /**\n * The default state of the panel (uncontrolled)\n */\n defaultIsPanelOpen?: boolean;\n\n /**\n * Callback for when the state of the panel changes\n */\n onPanelOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) => {\n const [isOpen, setOpen] = useControlledState<boolean>(\n isPanelOpen,\n defaultIsPanelOpen ?? false,\n onPanelOpenChange\n );\n\n return (\n <ResponsiveSidebarContext.Provider\n value={{\n isPanelOpen: isOpen,\n setPanelOpen: setOpen,\n collapsed,\n }}\n >\n {children}\n </ResponsiveSidebarContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;AAUa,MAAA,wBAAA,GACX,MAAM,aAAoD,CAAA,IAAA,EAAA;AAEd,SAAA,2BAAA,GAAA;AAC5C,EAAA,OAAO,UAAW,CAAA,wBAAA,CAAA,CAAA;AAAA,CAAA;AAOoC,SAAA,qBAAA,GAAA;AACtD,EAAA,MAAM,UAAU,UAAW,CAAA,wBAAA,CAAA,CAAA;AAC3B,EAAA,MAAM,kBAA+B,GAAA,qBAAA,EAAA,CAAA;AAErC,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA,IAAA,CAAA;AAAA,GAAA;AAGT,EAAA,MAAM,EAAE,SAAc,EAAA,GAAA,OAAA,CAAA;AAGtB,EAAI,IAAA,OAAO,cAAc,SAAW,EAAA;AAClC,IAAO,OAAA,SAAA,CAAA;AAAA,GAAA;AAIT,EAAI,IAAA,OAAO,cAAc,QAAU,EAAA;AACjC,IAAO,OAAA,CAAC,mBAAmB,QAAS,CAAA,SAAA,CAAA,CAAA;AAAA,GAAA;AAItC,EAAO,OAAA,CAAC,mBAAmB,QAAS,CAAA,IAAA,CAAA,CAAA;AAAA,CAAA;AAG/B,MAAM,4BAA4B,CAAC;AAAA,EACxC,SAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,QAAA;AAAA,CA2BI,KAAA;AACJ,EAAA,MAAM,CAAC,MAAQ,EAAA,OAAA,CAAA,GAAW,kBACxB,CAAA,WAAA,EACA,kDAAsB,KACtB,EAAA,iBAAA,CAAA,CAAA;AAGF,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,yBAAyB,QAA1B,EAAA;AAAA,IACE,KAAO,EAAA;AAAA,MACL,WAAa,EAAA,MAAA;AAAA,MACb,YAAc,EAAA,OAAA;AAAA,MACd,SAAA;AAAA,KAAA;AAAA,GAGD,EAAA,QAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { useContext, useState } from 'react';
|
|
2
|
+
import { useControlledState } from '@react-stately/utils';
|
|
3
|
+
|
|
4
|
+
const SecondarySidebarContext = React.createContext(null);
|
|
5
|
+
const useSecondarySidebarContext = () => {
|
|
6
|
+
const context = useContext(SecondarySidebarContext);
|
|
7
|
+
if (context) {
|
|
8
|
+
return context;
|
|
9
|
+
}
|
|
10
|
+
throw new Error("This should be rendered inside a <Sidebar />.");
|
|
11
|
+
};
|
|
12
|
+
const SecondarySidebarProvider = ({
|
|
13
|
+
openedId,
|
|
14
|
+
defaultOpenedId,
|
|
15
|
+
onOpenedIdChange,
|
|
16
|
+
themeVariant,
|
|
17
|
+
children
|
|
18
|
+
}) => {
|
|
19
|
+
var _a, _b, _c, _d;
|
|
20
|
+
const context = useContext(SecondarySidebarContext);
|
|
21
|
+
const [secondarySidebarId, setSecondarySidebarId] = useControlledState(openedId, defaultOpenedId != null ? defaultOpenedId : null, onOpenedIdChange);
|
|
22
|
+
const [content, setContent] = useState(null);
|
|
23
|
+
return /* @__PURE__ */ React.createElement(SecondarySidebarContext.Provider, {
|
|
24
|
+
value: {
|
|
25
|
+
openedId: (_a = context == null ? void 0 : context.openedId) != null ? _a : secondarySidebarId,
|
|
26
|
+
setOpenedId: (_b = context == null ? void 0 : context.setOpenedId) != null ? _b : setSecondarySidebarId,
|
|
27
|
+
content: (_c = context == null ? void 0 : context.content) != null ? _c : content,
|
|
28
|
+
setContent: (_d = context == null ? void 0 : context.setContent) != null ? _d : setContent,
|
|
29
|
+
themeVariant: themeVariant != null ? themeVariant : context == null ? void 0 : context.themeVariant
|
|
30
|
+
}
|
|
31
|
+
}, children);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { SecondarySidebarContext, SecondarySidebarProvider, useSecondarySidebarContext };
|
|
35
|
+
//# sourceMappingURL=SecondarySidebarContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecondarySidebarContext.js","sources":["../../../../src/Sidebar/src/SecondarySidebarContext.tsx"],"sourcesContent":["import React, { ReactNode, useContext, useState } from 'react';\nimport { ThemeVariant } from '@danske/sapphire-react';\nimport { useControlledState } from '@react-stately/utils';\n\nexport type SecondarySidebarContent = {\n header: ReactNode;\n body: ReactNode;\n} | null;\n\nexport interface SecondarySidebarContextValue {\n content: SecondarySidebarContent;\n setContent: (content: SecondarySidebarContent) => void;\n openedId: string | null;\n setOpenedId: (id: string | null) => void;\n themeVariant: ThemeVariant | undefined;\n}\n\nexport const SecondarySidebarContext =\n React.createContext<SecondarySidebarContextValue | null>(null);\n\nexport const useSecondarySidebarContext = (): SecondarySidebarContextValue => {\n const context = useContext(SecondarySidebarContext);\n if (context) {\n return context;\n }\n throw new Error('This should be rendered inside a <Sidebar />.');\n};\n\nexport const SecondarySidebarProvider = ({\n openedId,\n defaultOpenedId,\n onOpenedIdChange,\n themeVariant,\n children,\n}: {\n openedId?: string | null;\n defaultOpenedId?: string | null;\n onOpenedIdChange?: (id: string | null) => void;\n themeVariant?: ThemeVariant;\n children: ReactNode;\n}) => {\n const context = useContext(SecondarySidebarContext);\n\n const [secondarySidebarId, setSecondarySidebarId] = useControlledState<\n string | null\n >(openedId, defaultOpenedId ?? null, onOpenedIdChange);\n\n const [content, setContent] = useState<SecondarySidebarContent>(null);\n\n return (\n <SecondarySidebarContext.Provider\n value={{\n openedId: context?.openedId ?? secondarySidebarId,\n setOpenedId: context?.setOpenedId ?? setSecondarySidebarId,\n content: context?.content ?? content,\n setContent: context?.setContent ?? setContent,\n themeVariant: themeVariant ?? context?.themeVariant,\n }}\n >\n {children}\n </SecondarySidebarContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;AAiBa,MAAA,uBAAA,GACX,MAAM,aAAmD,CAAA,IAAA,EAAA;AAEpD,MAAM,6BAA6B,MAAoC;AAC5E,EAAA,MAAM,UAAU,UAAW,CAAA,uBAAA,CAAA,CAAA;AAC3B,EAAA,IAAI,OAAS,EAAA;AACX,IAAO,OAAA,OAAA,CAAA;AAAA,GAAA;AAET,EAAA,MAAM,IAAI,KAAM,CAAA,+CAAA,CAAA,CAAA;AAAA,EAAA;AAGX,MAAM,2BAA2B,CAAC;AAAA,EACvC,QAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,CAOI,KAAA;AAxCN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAyCE,EAAA,MAAM,UAAU,UAAW,CAAA,uBAAA,CAAA,CAAA;AAE3B,EAAA,MAAM,CAAC,kBAAoB,EAAA,qBAAA,CAAA,GAAyB,kBAElD,CAAA,QAAA,EAAU,4CAAmB,IAAM,EAAA,gBAAA,CAAA,CAAA;AAErC,EAAM,MAAA,CAAC,OAAS,EAAA,UAAA,CAAA,GAAc,QAAkC,CAAA,IAAA,CAAA,CAAA;AAEhE,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,wBAAwB,QAAzB,EAAA;AAAA,IACE,KAAO,EAAA;AAAA,MACL,QAAA,EAAU,CAAS,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,QAAA,KAAT,IAAqB,GAAA,EAAA,GAAA,kBAAA;AAAA,MAC/B,WAAA,EAAa,CAAS,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,WAAA,KAAT,IAAwB,GAAA,EAAA,GAAA,qBAAA;AAAA,MACrC,OAAA,EAAS,CAAS,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,OAAA,KAAT,IAAoB,GAAA,EAAA,GAAA,OAAA;AAAA,MAC7B,UAAA,EAAY,CAAS,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,UAAA,KAAT,IAAuB,GAAA,EAAA,GAAA,UAAA;AAAA,MACnC,YAAA,EAAc,sCAAgB,OAAS,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,YAAA;AAAA,KAAA;AAAA,GAGxC,EAAA,QAAA,CAAA,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
import styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';
|
|
4
|
+
import { useThemeCheck, useSapphireStyleProps } from '@danske/sapphire-react';
|
|
5
|
+
import { useListBoxSection } from '@react-aria/listbox';
|
|
6
|
+
import { filterDOMProps } from '@react-aria/utils';
|
|
7
|
+
|
|
8
|
+
var __defProp = Object.defineProperty;
|
|
9
|
+
var __defProps = Object.defineProperties;
|
|
10
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
11
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
12
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
13
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
14
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __spreadValues = (a, b) => {
|
|
16
|
+
for (var prop in b || (b = {}))
|
|
17
|
+
if (__hasOwnProp.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
if (__getOwnPropSymbols)
|
|
20
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
21
|
+
if (__propIsEnum.call(b, prop))
|
|
22
|
+
__defNormalProp(a, prop, b[prop]);
|
|
23
|
+
}
|
|
24
|
+
return a;
|
|
25
|
+
};
|
|
26
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
27
|
+
var __objRest = (source, exclude) => {
|
|
28
|
+
var target = {};
|
|
29
|
+
for (var prop in source)
|
|
30
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
31
|
+
target[prop] = source[prop];
|
|
32
|
+
if (source != null && __getOwnPropSymbols)
|
|
33
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
34
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
35
|
+
target[prop] = source[prop];
|
|
36
|
+
}
|
|
37
|
+
return target;
|
|
38
|
+
};
|
|
39
|
+
const SidebarSection = (_a) => {
|
|
40
|
+
var _b = _a, {
|
|
41
|
+
title,
|
|
42
|
+
"aria-label": label,
|
|
43
|
+
children
|
|
44
|
+
} = _b, props = __objRest(_b, [
|
|
45
|
+
"title",
|
|
46
|
+
"aria-label",
|
|
47
|
+
"children"
|
|
48
|
+
]);
|
|
49
|
+
useThemeCheck();
|
|
50
|
+
const { styleProps } = useSapphireStyleProps(props);
|
|
51
|
+
const { itemProps, headingProps, groupProps } = useListBoxSection({
|
|
52
|
+
heading: title,
|
|
53
|
+
"aria-label": label
|
|
54
|
+
});
|
|
55
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("li", {
|
|
56
|
+
role: "separator",
|
|
57
|
+
className: clsx(styles["sapphire-sidebar__separator"])
|
|
58
|
+
}), /* @__PURE__ */ React.createElement("li", __spreadValues(__spreadValues(__spreadValues({}, itemProps), styleProps), filterDOMProps(props, { global: true })), title && /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, headingProps), {
|
|
59
|
+
className: clsx(styles["sapphire-sidebar__section-header"])
|
|
60
|
+
}), title), /* @__PURE__ */ React.createElement("ul", __spreadProps(__spreadValues({}, groupProps), {
|
|
61
|
+
className: clsx(styles["sapphire-sidebar__section"])
|
|
62
|
+
}), children)));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { SidebarSection };
|
|
66
|
+
//# sourceMappingURL=Section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Section.js","sources":["../../../../src/Sidebar/src/Section.tsx"],"sourcesContent":["import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '@danske/sapphire-react';\nimport { useListBoxSection } from '@react-aria/listbox';\nimport { filterDOMProps } from '@react-aria/utils';\nimport { DOMProps } from '@react-types/shared';\n\nexport type SidebarSectionProps = DOMProps &\n SapphireStyleProps & {\n /**\n * Section title\n * If not provided, please pass the `aria-label`\n */\n title?: string;\n\n /**\n * Section aria title\n */\n 'aria-label'?: string;\n\n children?: ReactNode;\n };\n\nexport const SidebarSection = ({\n title,\n 'aria-label': label,\n children,\n ...props\n}: SidebarSectionProps) => {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const { itemProps, headingProps, groupProps } = useListBoxSection({\n heading: title,\n 'aria-label': label,\n });\n\n return (\n <>\n <li\n role=\"separator\"\n className={clsx(styles['sapphire-sidebar__separator'])}\n ></li>\n <li\n {...itemProps}\n {...styleProps}\n {...filterDOMProps(props, { global: true })}\n >\n {title && (\n <div\n {...headingProps}\n className={clsx(styles['sapphire-sidebar__section-header'])}\n >\n {title}\n </div>\n )}\n <ul\n {...groupProps}\n className={clsx(styles['sapphire-sidebar__section'])}\n >\n {children}\n </ul>\n </li>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4Ba,MAAA,cAAA,GAAiB,CAAC,EAKJ,KAAA;AALI,EAC7B,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IACA,YAAc,EAAA,KAAA;AAAA,IACd,QAAA;AAAA,GAH6B,GAAA,EAAA,EAI1B,kBAJ0B,EAI1B,EAAA;AAAA,IAHH,OAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,GAAA,CAAA,CAAA;AAGA,EAAA,aAAA,EAAA,CAAA;AACA,EAAM,MAAA,EAAE,eAAe,qBAAsB,CAAA,KAAA,CAAA,CAAA;AAC7C,EAAA,MAAM,EAAE,SAAA,EAAW,YAAc,EAAA,UAAA,EAAA,GAAe,iBAAkB,CAAA;AAAA,IAChE,OAAS,EAAA,KAAA;AAAA,IACT,YAAc,EAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAGhB,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,sCACG,IAAD,EAAA;AAAA,IACE,IAAK,EAAA,WAAA;AAAA,IACL,SAAA,EAAW,KAAK,MAAO,CAAA,6BAAA,CAAA,CAAA;AAAA,GAAA,CAAA,kBAExB,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,cACM,CAAA,cAAA,CAAA,cAAA,CAAA,EAAA,EAAA,SAAA,CAAA,EACA,aACA,cAAe,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,IAEnC,EAAA,CAAA,CAAA,EAAA,KAAA,oBACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAD,iCACM,YADN,CAAA,EAAA;AAAA,IAEE,SAAA,EAAW,KAAK,MAAO,CAAA,kCAAA,CAAA,CAAA;AAAA,GAAA,CAAA,EAEtB,KAGL,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAD,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACM,UADN,CAAA,EAAA;AAAA,IAEE,SAAA,EAAW,KAAK,MAAO,CAAA,2BAAA,CAAA,CAAA;AAAA,GAEtB,CAAA,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAAA;;;;"}
|