@helsenorge/designsystem-react 7.6.0 → 7.8.0
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/CHANGELOG.md +40 -3
- package/components/AnchorLink/styles.module.scss +6 -5
- package/components/Badge/Badge.d.ts +7 -1
- package/components/Badge/Badge.js +19 -9
- package/components/Badge/Badge.js.map +1 -1
- package/components/Badge/Badge.stories.d.ts +11 -0
- package/components/Badge/NotificationBadge.d.ts +17 -0
- package/components/Badge/NotificationBadge.js +68 -0
- package/components/Badge/NotificationBadge.js.map +1 -0
- package/components/Button/Button.d.ts +3 -0
- package/components/Button/Button.js +68 -66
- package/components/Button/Button.js.map +1 -1
- package/components/Button/styles.module.scss +6 -0
- package/components/Button/styles.module.scss.d.ts +1 -0
- package/components/Expander/styles.module.scss +4 -2
- package/components/ExpanderHierarchy/ExpanderHierarchy.stories.d.ts +13 -12
- package/components/LinkList/LinkList.stories.d.ts +1 -0
- package/components/List/List.stories.d.ts +19 -2
- package/components/ListHeader/ListHeader.d.ts +1 -1
- package/components/ListHeader/ListHeader.js +32 -28
- package/components/ListHeader/ListHeader.js.map +1 -1
- package/components/NotificationPanel/NotificationPanel.d.ts +1 -1
- package/components/NotificationPanel/NotificationPanel.js +69 -103
- package/components/NotificationPanel/NotificationPanel.js.map +1 -1
- package/components/NotificationPanel/NotificationPanel.stories.d.ts +1 -1
- package/components/NotificationPanel/styles.module.scss +14 -0
- package/components/NotificationPanel/styles.module.scss.d.ts +1 -0
- package/components/ServiceMessage/ServiceMessage.js +66 -75
- package/components/ServiceMessage/ServiceMessage.js.map +1 -1
- package/components/ServiceMessage/ServiceMessage.stories.d.ts +1 -1
- package/components/ServiceMessage/styles.module.scss +13 -0
- package/components/ServiceMessage/styles.module.scss.d.ts +1 -0
- package/components/Tabs/Tab.d.ts +17 -0
- package/components/Tabs/Tab.js +6 -0
- package/components/Tabs/Tab.js.map +1 -0
- package/components/Tabs/TabList/TabList.d.ts +11 -0
- package/components/Tabs/TabList/TabList.js +51 -0
- package/components/Tabs/TabList/TabList.js.map +1 -0
- package/components/Tabs/TabList/index.d.ts +3 -0
- package/components/Tabs/TabList/index.js +5 -0
- package/components/Tabs/TabList/index.js.map +1 -0
- package/components/Tabs/TabList/styles.module.scss +109 -0
- package/components/Tabs/TabList/styles.module.scss.d.ts +18 -0
- package/components/Tabs/TabPanel/TabPanel.d.ts +9 -0
- package/components/Tabs/TabPanel/TabPanel.js +13 -0
- package/components/Tabs/TabPanel/TabPanel.js.map +1 -0
- package/components/Tabs/TabPanel/index.d.ts +3 -0
- package/components/Tabs/TabPanel/index.js +5 -0
- package/components/Tabs/TabPanel/index.js.map +1 -0
- package/components/Tabs/TabPanel/styles.module.scss +37 -0
- package/components/Tabs/TabPanel/styles.module.scss.d.ts +15 -0
- package/components/Tabs/Tabs.d.ts +22 -0
- package/components/Tabs/Tabs.js +19 -0
- package/components/Tabs/Tabs.js.map +1 -0
- package/components/Tabs/Tabs.stories.d.ts +50 -0
- package/components/Tabs/index.d.ts +3 -0
- package/components/Tabs/index.js +5 -0
- package/components/Tabs/index.js.map +1 -0
- package/components/Tabs/styles.module.scss +3 -0
- package/components/Tabs/styles.module.scss.d.ts +9 -0
- package/components/Tile/Tile.stories.d.ts +26 -2
- package/constants.d.ts +5 -1
- package/constants.js +1 -1
- package/constants.js.map +1 -1
- package/docs/index.js +7 -7
- package/docs/index.js.map +1 -1
- package/hooks/useRovingFocus.d.ts +1 -0
- package/hooks/useRovingFocus.js +27 -0
- package/hooks/useRovingFocus.js.map +1 -0
- package/hooks/useRovingFocus.stories.d.ts +17 -0
- package/package.json +1 -1
- package/scss/typography.module.scss +7 -5
- package/components/NotificationPanel/DetailButton/DetailButton.d.ts +0 -9
- package/components/NotificationPanel/DetailButton/DetailButton.js +0 -28
- package/components/NotificationPanel/DetailButton/DetailButton.js.map +0 -1
- package/components/NotificationPanel/DetailButton/styles.module.scss +0 -38
- package/components/NotificationPanel/DetailButton/styles.module.scss.d.ts +0 -13
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
@import '../../scss/breakpoints';
|
|
4
4
|
@import '../../scss/palette';
|
|
5
5
|
@import '../../scss/font-settings';
|
|
6
|
+
@import '../../scss/supernova/styles/colors';
|
|
6
7
|
|
|
7
8
|
.expander {
|
|
8
9
|
position: relative;
|
|
@@ -53,11 +54,11 @@
|
|
|
53
54
|
text-align: left;
|
|
54
55
|
|
|
55
56
|
&:hover {
|
|
56
|
-
background-color:
|
|
57
|
+
background-color: var(--color-action-background-transparent-onlight-hover);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
&--expanded {
|
|
60
|
-
background-color:
|
|
61
|
+
background-color: var(--color-action-background-transparent-onlight-hover);
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
|
|
@@ -82,6 +83,7 @@
|
|
|
82
83
|
&--large {
|
|
83
84
|
width: 100%;
|
|
84
85
|
padding: getSpacer(xs) getSpacer(2xs) getSpacer(xs) getSpacer(s);
|
|
86
|
+
cursor: pointer;
|
|
85
87
|
|
|
86
88
|
@media (min-width: map.get($grid-breakpoints, md)) {
|
|
87
89
|
padding: getSpacer(xs) getSpacer(s) getSpacer(xs) getSpacer(l);
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StoryObj } from '@storybook/react';
|
|
3
3
|
import ExpanderHierarchy from './ExpanderHierarchy';
|
|
4
|
-
type ExpanderHierarchyWithAndCustomArgs = React.ComponentProps<typeof ExpanderHierarchy> & {
|
|
5
|
-
title: string;
|
|
6
|
-
expanded: boolean;
|
|
7
|
-
};
|
|
8
4
|
declare const meta: {
|
|
9
5
|
title: string;
|
|
10
6
|
component: import("./ExpanderHierarchy").ExpanderHierarchyCompound;
|
|
@@ -17,27 +13,32 @@ declare const meta: {
|
|
|
17
13
|
};
|
|
18
14
|
};
|
|
19
15
|
args: {
|
|
20
|
-
title: string;
|
|
21
16
|
htmlMarkup: "h2";
|
|
22
|
-
expanded: false;
|
|
23
17
|
print: false;
|
|
24
18
|
};
|
|
25
19
|
argTypes: {
|
|
26
|
-
title: {
|
|
27
|
-
control: string;
|
|
28
|
-
};
|
|
29
20
|
htmlMarkup: {
|
|
30
21
|
control: string;
|
|
31
22
|
options: string[];
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
print: {
|
|
26
|
+
control: string;
|
|
27
|
+
description: string;
|
|
32
28
|
};
|
|
33
|
-
|
|
29
|
+
children: {
|
|
34
30
|
control: string;
|
|
35
31
|
};
|
|
36
|
-
|
|
32
|
+
level: {
|
|
33
|
+
control: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
testId: {
|
|
37
37
|
control: string;
|
|
38
|
+
description: string;
|
|
38
39
|
};
|
|
39
40
|
};
|
|
40
41
|
};
|
|
41
42
|
export default meta;
|
|
42
|
-
type Story = StoryObj<
|
|
43
|
+
type Story = StoryObj<typeof ExpanderHierarchy>;
|
|
43
44
|
export declare const Default: Story;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { StoryObj } from '@storybook/react';
|
|
3
|
+
import List from './List';
|
|
3
4
|
declare const meta: {
|
|
4
5
|
title: string;
|
|
5
6
|
component: import("./List").ListCompound;
|
|
@@ -12,22 +13,38 @@ declare const meta: {
|
|
|
12
13
|
};
|
|
13
14
|
};
|
|
14
15
|
args: {
|
|
15
|
-
children: string;
|
|
16
16
|
variant: "bullet";
|
|
17
17
|
margin: false;
|
|
18
|
+
className: string;
|
|
19
|
+
testId: string;
|
|
18
20
|
};
|
|
19
21
|
argTypes: {
|
|
20
22
|
variant: {
|
|
21
23
|
control: string;
|
|
22
24
|
options: string[];
|
|
25
|
+
description: string;
|
|
26
|
+
defaultValue: string;
|
|
23
27
|
};
|
|
24
28
|
margin: {
|
|
25
29
|
control: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
children: {
|
|
33
|
+
control: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
className: {
|
|
37
|
+
control: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
testId: {
|
|
41
|
+
control: string;
|
|
42
|
+
description: string;
|
|
26
43
|
};
|
|
27
44
|
};
|
|
28
45
|
};
|
|
29
46
|
export default meta;
|
|
30
|
-
type Story = StoryObj<typeof
|
|
47
|
+
type Story = StoryObj<typeof List>;
|
|
31
48
|
export declare const Default: Story;
|
|
32
49
|
export declare const Bullet: Story;
|
|
33
50
|
export declare const Dashed: Story;
|
|
@@ -32,7 +32,7 @@ export interface ListHeaderProps {
|
|
|
32
32
|
interface ListHeaderChildren {
|
|
33
33
|
avatarChild?: React.ReactElement<AvatarProps>;
|
|
34
34
|
listHeaderTextChildren: React.ReactElement<ListHeaderTextProps>[];
|
|
35
|
-
|
|
35
|
+
badgeChildren?: React.ReactElement<BadgeProps>[];
|
|
36
36
|
elementChild?: React.ReactElement;
|
|
37
37
|
stringChildren: string[];
|
|
38
38
|
remainingChildren: React.ReactNode[];
|
|
@@ -1,80 +1,84 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import a from "react";
|
|
2
|
+
import _ from "classnames";
|
|
3
3
|
import L from "./ListHeaderText/ListHeaderText.js";
|
|
4
|
-
import { useBreakpoint as
|
|
4
|
+
import { useBreakpoint as A, Breakpoint as $ } from "../../hooks/useBreakpoint.js";
|
|
5
5
|
import { isComponent as u, isComponentWithChildren as N } from "../../utils/component.js";
|
|
6
|
-
import
|
|
7
|
-
import R from "../
|
|
8
|
-
import
|
|
6
|
+
import { uuid as B } from "../../utils/uuid.js";
|
|
7
|
+
import R, { AvatarSize as X } from "../Avatar/Avatar.js";
|
|
8
|
+
import w from "../Badge/Badge.js";
|
|
9
|
+
import { Icon as M } from "../Icon/Icon.js";
|
|
9
10
|
import { IconSize as C } from "../../constants.js";
|
|
10
11
|
import t from "../ListHeader/styles.module.scss";
|
|
11
|
-
const
|
|
12
|
+
const U = (m, f, h, i, c, o) => {
|
|
12
13
|
if (u(m, E))
|
|
13
|
-
return
|
|
14
|
+
return a.cloneElement(m, {
|
|
14
15
|
chevronIcon: c,
|
|
15
16
|
icon: o,
|
|
16
|
-
isHovered:
|
|
17
|
+
isHovered: h,
|
|
17
18
|
size: i
|
|
18
19
|
});
|
|
19
20
|
if (m)
|
|
20
|
-
return /* @__PURE__ */
|
|
21
|
+
return /* @__PURE__ */ a.createElement(E, { titleHtmlMarkup: f, chevronIcon: c, icon: o, isHovered: h, size: i }, m);
|
|
21
22
|
}, b = (m, f = !1) => {
|
|
22
23
|
var d, g, s, e;
|
|
23
|
-
let
|
|
24
|
-
const c = [], o = [], l = [];
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
let h;
|
|
25
|
+
const i = [], c = [], o = [], l = [];
|
|
26
|
+
a.Children.forEach(m, (r) => {
|
|
27
|
+
r === null || typeof r > "u" || (u(r, R) ? h = r : u(r, L) ? c.push(r) : u(r, w) ? i.push(r) : typeof r == "string" ? o.push(r) : l.push(r));
|
|
27
28
|
});
|
|
28
|
-
const n =
|
|
29
|
+
const n = h !== void 0 || c.length > 0 || i !== void 0 && o.length > 0, v = l.length === 0 || N(l[0]) && typeof ((g = (d = l[0]) == null ? void 0 : d.props) == null ? void 0 : g.children) > "u";
|
|
29
30
|
if (f || n || v)
|
|
30
|
-
return { avatarChild:
|
|
31
|
+
return { avatarChild: h, listHeaderTextChildren: c, badgeChildren: i, stringChildren: o, remainingChildren: l };
|
|
31
32
|
if (N(l[0]))
|
|
32
33
|
return b((e = (s = l[0]) == null ? void 0 : s.props) == null ? void 0 : e.children, !0);
|
|
33
34
|
}, E = (m) => {
|
|
34
|
-
const { className: f = "", titleHtmlMarkup:
|
|
35
|
+
const { className: f = "", titleHtmlMarkup: h = "h2", chevronIcon: i, children: c, icon: o, isHovered: l, size: n, testId: v } = m, d = A(), g = n !== "small" && !!(i || o), s = typeof c == "string", e = b(c), r = (e == null ? void 0 : e.avatarChild) || (e == null ? void 0 : e.listHeaderTextChildren) && e.listHeaderTextChildren.length > 0 || (e == null ? void 0 : e.remainingChildren) && (e == null ? void 0 : e.remainingChildren.length) > 0, H = _(
|
|
35
36
|
t["list-header"],
|
|
36
37
|
{
|
|
37
38
|
[t["list-header--for-element-content"]]: !s,
|
|
38
|
-
[t["list-header--top-align-content"]]:
|
|
39
|
+
[t["list-header--top-align-content"]]: r
|
|
39
40
|
},
|
|
40
41
|
f
|
|
41
|
-
), x =
|
|
42
|
+
), x = _(
|
|
42
43
|
t["list-header__badge"],
|
|
43
44
|
{
|
|
44
45
|
[t["list-header__badge--for-string-content"]]: s
|
|
45
46
|
},
|
|
46
47
|
!s && n && t[`list-header__badge--${n}`]
|
|
47
|
-
),
|
|
48
|
+
), y = _(t["list-header__chevron"], !s && n && t[`list-header__chevron--${n}`], {
|
|
48
49
|
[t["list-header__chevron--for-string-content"]]: s
|
|
49
|
-
}),
|
|
50
|
+
}), S = _(t["list-header__content"], {
|
|
50
51
|
[t["list-header__content--string"]]: s,
|
|
51
52
|
[t["list-header__content--element"]]: !s,
|
|
52
53
|
[t["list-header__content--spacing"]]: !(e != null && e.avatarChild) && !o
|
|
53
|
-
}), I =
|
|
54
|
+
}), I = _(
|
|
54
55
|
t["list-header__icon"],
|
|
55
56
|
!s && n && (n === "medium" || n === "large") && t[`list-header__icon--for-element-content--${n}`],
|
|
56
57
|
{
|
|
57
58
|
[t["list-header__icon--for-string-content"]]: s,
|
|
58
59
|
[t["list-header__icon--for-element-content"]]: !s
|
|
59
60
|
}
|
|
60
|
-
), T =
|
|
61
|
+
), T = _(
|
|
61
62
|
t["list-header__avatar"],
|
|
62
63
|
!s && n && (n === "medium" || n === "large") && t[`list-header__avatar--for-element-content--${n}`],
|
|
63
64
|
{
|
|
64
65
|
[t["list-header__avatar--for-string-content"]]: s,
|
|
65
66
|
[t["list-header__avatar--for-element-content"]]: !s
|
|
66
67
|
}
|
|
67
|
-
),
|
|
68
|
-
return /* @__PURE__ */
|
|
69
|
-
size: d ===
|
|
68
|
+
), k = h;
|
|
69
|
+
return /* @__PURE__ */ a.createElement("span", { "data-testid": v, className: H }, g && o && /* @__PURE__ */ a.createElement("span", { className: I }, a.cloneElement(o, {
|
|
70
|
+
size: d === $.xs ? C.XSmall : C.Small,
|
|
70
71
|
isHovered: l
|
|
71
|
-
})), n !== "small" && (e == null ? void 0 : e.avatarChild) && /* @__PURE__ */
|
|
72
|
+
})), n !== "small" && (e == null ? void 0 : e.avatarChild) && /* @__PURE__ */ a.createElement("span", { className: T }, a.cloneElement(e.avatarChild, { size: X.xsmall })), /* @__PURE__ */ a.createElement("span", { className: S }, e == null ? void 0 : e.listHeaderTextChildren, !!(e != null && e.stringChildren.length) && /* @__PURE__ */ a.createElement(k, { className: t["list-header__title"] }, e.stringChildren), e == null ? void 0 : e.remainingChildren), (e == null ? void 0 : e.badgeChildren) && e.badgeChildren.map((p) => {
|
|
73
|
+
const z = B();
|
|
74
|
+
return /* @__PURE__ */ a.createElement("span", { key: z, className: x }, p);
|
|
75
|
+
}), g && i && /* @__PURE__ */ a.createElement("span", { className: y }, /* @__PURE__ */ a.createElement(M, { svgIcon: i, isHovered: l, size: C.XSmall })));
|
|
72
76
|
};
|
|
73
77
|
E.displayName = "ListHeader";
|
|
74
78
|
export {
|
|
75
79
|
E as ListHeader,
|
|
76
80
|
E as default,
|
|
77
81
|
b as mapChildren,
|
|
78
|
-
|
|
82
|
+
U as renderListHeader
|
|
79
83
|
};
|
|
80
84
|
//# sourceMappingURL=ListHeader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListHeader.js","sources":["../../../src/components/ListHeader/ListHeader.tsx"],"sourcesContent":["import React from 'react';\n\nimport cn from 'classnames';\n\nimport ListHeaderText, { ListHeaderTextProps, ListHeaderTextType } from './ListHeaderText/ListHeaderText';\nimport { Breakpoint, useBreakpoint } from '../../hooks/useBreakpoint';\nimport { isComponent, isComponentWithChildren } from '../../utils/component';\nimport Avatar, { AvatarProps, AvatarSize, AvatarType } from '../Avatar';\nimport Badge, { BadgeProps, BadgeType } from '../Badge';\nimport Icon, { IconSize, SvgIcon } from '../Icon';\nimport { TitleTags } from '../Title';\n\nimport styles from './styles.module.scss';\n\nexport type ListHeaderSize = 'small' | 'medium' | 'large';\n\nexport interface ListHeaderType extends React.FC<ListHeaderProps> {\n Avatar?: AvatarType;\n Badge?: BadgeType;\n ListHeaderText?: ListHeaderTextType;\n}\n\nexport const renderListHeader = (\n element: React.ReactNode,\n titleHtmlMarkup: TitleTags,\n isHovered: boolean,\n size: ListHeaderSize,\n chevronIcon?: SvgIcon,\n icon?: React.ReactElement\n): JSX.Element | undefined => {\n if (isComponent<ListHeaderProps>(element, ListHeader)) {\n return React.cloneElement(element, {\n chevronIcon,\n icon,\n isHovered,\n size,\n });\n }\n if (element) {\n return (\n <ListHeader titleHtmlMarkup={titleHtmlMarkup} chevronIcon={chevronIcon} icon={icon} isHovered={isHovered} size={size}>\n {element}\n </ListHeader>\n );\n }\n};\n\nexport interface ListHeaderProps {\n /** Adds custom classes to the ListHeader element. */\n className?: string;\n /** Chevron to render inside of the ListHeader */\n chevronIcon?: SvgIcon;\n /** Children to be rendered inside of ListHeader */\n children: React.ReactNode;\n /** Changes the underlying element of the title. Default: h2*/\n titleHtmlMarkup?: TitleTags;\n /** icon to be rendered inside of ListHeader */\n icon?: React.ReactElement;\n /** whether or not the parent is hovered */\n isHovered?: boolean;\n /** Changes size of the ListHeader. */\n size?: ListHeaderSize;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\ninterface ListHeaderChildren {\n avatarChild?: React.ReactElement<AvatarProps>;\n listHeaderTextChildren: React.ReactElement<ListHeaderTextProps>[];\n badgeChild?: React.ReactElement<BadgeProps>;\n elementChild?: React.ReactElement;\n stringChildren: string[];\n remainingChildren: React.ReactNode[];\n}\n\ntype ChildrenMapper = (children: React.ReactNode, isJsxChild?: boolean) => ListHeaderChildren | undefined;\n\nexport const mapChildren: ChildrenMapper = (children, isJsxChild = false) => {\n let avatarChild: React.ReactElement<AvatarProps> | undefined;\n let badgeChild: React.ReactElement<BadgeProps> | undefined;\n const listHeaderTextChildren: React.ReactElement<ListHeaderTextProps>[] = [];\n const stringChildren: string[] = [];\n const remainingChildren: React.ReactNode[] = [];\n\n React.Children.forEach(children, child => {\n if (child === null || typeof child === 'undefined') return;\n if (isComponent<AvatarProps>(child, Avatar)) {\n avatarChild = child;\n } else if (isComponent<ListHeaderTextProps>(child, ListHeaderText)) {\n listHeaderTextChildren.push(child);\n } else if (isComponent<BadgeProps>(child, Badge)) {\n badgeChild = child;\n } else if (typeof child === 'string') {\n stringChildren.push(child);\n } else {\n remainingChildren.push(child);\n }\n });\n\n // Dette og recursive mapChildren under(gjøres en gang) er for å passe på at jsx children også sjekkes for Avatar og liknende innhold.\n // Slik opprettholder vi stylingen i tilfeller hvor vertikaler har wrappet elementer i en parent span eller div.\n const hasSpecialChildren =\n avatarChild !== undefined || listHeaderTextChildren.length > 0 || (badgeChild !== undefined && stringChildren.length > 0);\n const noRemainingRecursiveChildren =\n remainingChildren.length === 0 ||\n (isComponentWithChildren(remainingChildren[0]) && typeof remainingChildren[0]?.props?.children === 'undefined');\n\n if (isJsxChild || hasSpecialChildren || noRemainingRecursiveChildren) {\n return { avatarChild, listHeaderTextChildren, badgeChild, stringChildren, remainingChildren };\n }\n\n if (isComponentWithChildren(remainingChildren[0])) {\n return mapChildren(remainingChildren[0]?.props?.children, true);\n }\n};\n\nexport const ListHeader: ListHeaderType = props => {\n const { className = '', titleHtmlMarkup = 'h2', chevronIcon, children, icon, isHovered, size, testId } = props;\n const breakpoint = useBreakpoint();\n const showChevronAndIcon = size !== 'small' && !!(chevronIcon || icon);\n const contentIsString = typeof children === 'string';\n const mappedChildren = mapChildren(children);\n const topAlignContent =\n mappedChildren?.avatarChild ||\n (mappedChildren?.listHeaderTextChildren && mappedChildren.listHeaderTextChildren.length > 0) ||\n (mappedChildren?.remainingChildren && mappedChildren?.remainingChildren.length > 0);\n\n const listLabelClasses = cn(\n styles['list-header'],\n {\n [styles['list-header--for-element-content']]: !contentIsString,\n [styles['list-header--top-align-content']]: topAlignContent,\n },\n className\n );\n const badgeClasses = cn(\n styles['list-header__badge'],\n {\n [styles['list-header__badge--for-string-content']]: contentIsString,\n },\n !contentIsString && size && styles[`list-header__badge--${size}`]\n );\n const chevronClasses = cn(styles['list-header__chevron'], !contentIsString && size && styles[`list-header__chevron--${size}`], {\n [styles['list-header__chevron--for-string-content']]: contentIsString,\n });\n const contentClasses = cn(styles['list-header__content'], {\n [styles['list-header__content--string']]: contentIsString,\n [styles['list-header__content--element']]: !contentIsString,\n [styles['list-header__content--spacing']]: !mappedChildren?.avatarChild && !icon,\n });\n const iconClasses = cn(\n styles['list-header__icon'],\n !contentIsString && size && (size === 'medium' || size === 'large') && styles[`list-header__icon--for-element-content--${size}`],\n {\n [styles['list-header__icon--for-string-content']]: contentIsString,\n [styles['list-header__icon--for-element-content']]: !contentIsString,\n }\n );\n const avatarClasses = cn(\n styles['list-header__avatar'],\n !contentIsString && size && (size === 'medium' || size === 'large') && styles[`list-header__avatar--for-element-content--${size}`],\n {\n [styles['list-header__avatar--for-string-content']]: contentIsString,\n [styles['list-header__avatar--for-element-content']]: !contentIsString,\n }\n );\n const CustomTag = titleHtmlMarkup;\n return (\n <span data-testid={testId} className={listLabelClasses}>\n {showChevronAndIcon && icon && (\n <span className={iconClasses}>\n {React.cloneElement(icon, {\n size: breakpoint === Breakpoint.xs ? IconSize.XSmall : IconSize.Small,\n isHovered,\n })}\n </span>\n )}\n {size !== 'small' && mappedChildren?.avatarChild && (\n <span className={avatarClasses}>{React.cloneElement(mappedChildren.avatarChild, { size: AvatarSize.xsmall })}</span>\n )}\n <span className={contentClasses}>\n {mappedChildren?.listHeaderTextChildren}\n {!!mappedChildren?.stringChildren.length && (\n <CustomTag className={styles['list-header__title']}>{mappedChildren.stringChildren}</CustomTag>\n )}\n {mappedChildren?.remainingChildren}\n </span>\n\n {mappedChildren?.badgeChild && <span className={badgeClasses}>{mappedChildren.badgeChild}</span>}\n {showChevronAndIcon && chevronIcon && (\n <span className={chevronClasses}>\n <Icon svgIcon={chevronIcon} isHovered={isHovered} size={IconSize.XSmall} />\n </span>\n )}\n </span>\n );\n};\n\nListHeader.displayName = 'ListHeader';\n\nexport default ListHeader;\n"],"names":["renderListHeader","element","titleHtmlMarkup","isHovered","size","chevronIcon","icon","isComponent","ListHeader","React","mapChildren","children","isJsxChild","avatarChild","badgeChild","listHeaderTextChildren","stringChildren","remainingChildren","child","Avatar","ListHeaderText","Badge","hasSpecialChildren","noRemainingRecursiveChildren","isComponentWithChildren","_b","_a","_d","_c","props","className","testId","breakpoint","useBreakpoint","showChevronAndIcon","contentIsString","mappedChildren","topAlignContent","listLabelClasses","cn","styles","badgeClasses","chevronClasses","contentClasses","iconClasses","avatarClasses","CustomTag","Breakpoint","IconSize","AvatarSize","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListHeader.js","sources":["../../../src/components/ListHeader/ListHeader.tsx"],"sourcesContent":["import React from 'react';\n\nimport cn from 'classnames';\n\nimport ListHeaderText, { ListHeaderTextProps, ListHeaderTextType } from './ListHeaderText/ListHeaderText';\nimport { Breakpoint, useBreakpoint } from '../../hooks/useBreakpoint';\nimport { isComponent, isComponentWithChildren } from '../../utils/component';\nimport uuid from '../../utils/uuid';\nimport Avatar, { AvatarProps, AvatarSize, AvatarType } from '../Avatar';\nimport Badge, { BadgeProps, BadgeType } from '../Badge';\nimport Icon, { IconSize, SvgIcon } from '../Icon';\nimport { TitleTags } from '../Title';\n\nimport styles from './styles.module.scss';\n\nexport type ListHeaderSize = 'small' | 'medium' | 'large';\n\nexport interface ListHeaderType extends React.FC<ListHeaderProps> {\n Avatar?: AvatarType;\n Badge?: BadgeType;\n ListHeaderText?: ListHeaderTextType;\n}\n\nexport const renderListHeader = (\n element: React.ReactNode,\n titleHtmlMarkup: TitleTags,\n isHovered: boolean,\n size: ListHeaderSize,\n chevronIcon?: SvgIcon,\n icon?: React.ReactElement\n): JSX.Element | undefined => {\n if (isComponent<ListHeaderProps>(element, ListHeader)) {\n return React.cloneElement(element, {\n chevronIcon,\n icon,\n isHovered,\n size,\n });\n }\n if (element) {\n return (\n <ListHeader titleHtmlMarkup={titleHtmlMarkup} chevronIcon={chevronIcon} icon={icon} isHovered={isHovered} size={size}>\n {element}\n </ListHeader>\n );\n }\n};\n\nexport interface ListHeaderProps {\n /** Adds custom classes to the ListHeader element. */\n className?: string;\n /** Chevron to render inside of the ListHeader */\n chevronIcon?: SvgIcon;\n /** Children to be rendered inside of ListHeader */\n children: React.ReactNode;\n /** Changes the underlying element of the title. Default: h2*/\n titleHtmlMarkup?: TitleTags;\n /** icon to be rendered inside of ListHeader */\n icon?: React.ReactElement;\n /** whether or not the parent is hovered */\n isHovered?: boolean;\n /** Changes size of the ListHeader. */\n size?: ListHeaderSize;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\ninterface ListHeaderChildren {\n avatarChild?: React.ReactElement<AvatarProps>;\n listHeaderTextChildren: React.ReactElement<ListHeaderTextProps>[];\n badgeChildren?: React.ReactElement<BadgeProps>[];\n elementChild?: React.ReactElement;\n stringChildren: string[];\n remainingChildren: React.ReactNode[];\n}\n\ntype ChildrenMapper = (children: React.ReactNode, isJsxChild?: boolean) => ListHeaderChildren | undefined;\n\nexport const mapChildren: ChildrenMapper = (children, isJsxChild = false) => {\n let avatarChild: React.ReactElement<AvatarProps> | undefined;\n const badgeChildren: React.ReactElement<BadgeProps>[] = [];\n const listHeaderTextChildren: React.ReactElement<ListHeaderTextProps>[] = [];\n const stringChildren: string[] = [];\n const remainingChildren: React.ReactNode[] = [];\n\n React.Children.forEach(children, child => {\n if (child === null || typeof child === 'undefined') return;\n if (isComponent<AvatarProps>(child, Avatar)) {\n avatarChild = child;\n } else if (isComponent<ListHeaderTextProps>(child, ListHeaderText)) {\n listHeaderTextChildren.push(child);\n } else if (isComponent<BadgeProps>(child, Badge)) {\n badgeChildren.push(child);\n } else if (typeof child === 'string') {\n stringChildren.push(child);\n } else {\n remainingChildren.push(child);\n }\n });\n\n // Dette og recursive mapChildren under(gjøres en gang) er for å passe på at jsx children også sjekkes for Avatar og liknende innhold.\n // Slik opprettholder vi stylingen i tilfeller hvor vertikaler har wrappet elementer i en parent span eller div.\n const hasSpecialChildren =\n avatarChild !== undefined || listHeaderTextChildren.length > 0 || (badgeChildren !== undefined && stringChildren.length > 0);\n const noRemainingRecursiveChildren =\n remainingChildren.length === 0 ||\n (isComponentWithChildren(remainingChildren[0]) && typeof remainingChildren[0]?.props?.children === 'undefined');\n\n if (isJsxChild || hasSpecialChildren || noRemainingRecursiveChildren) {\n return { avatarChild, listHeaderTextChildren, badgeChildren, stringChildren, remainingChildren };\n }\n\n if (isComponentWithChildren(remainingChildren[0])) {\n return mapChildren(remainingChildren[0]?.props?.children, true);\n }\n};\n\nexport const ListHeader: ListHeaderType = props => {\n const { className = '', titleHtmlMarkup = 'h2', chevronIcon, children, icon, isHovered, size, testId } = props;\n const breakpoint = useBreakpoint();\n const showChevronAndIcon = size !== 'small' && !!(chevronIcon || icon);\n const contentIsString = typeof children === 'string';\n const mappedChildren = mapChildren(children);\n const topAlignContent =\n mappedChildren?.avatarChild ||\n (mappedChildren?.listHeaderTextChildren && mappedChildren.listHeaderTextChildren.length > 0) ||\n (mappedChildren?.remainingChildren && mappedChildren?.remainingChildren.length > 0);\n\n const listLabelClasses = cn(\n styles['list-header'],\n {\n [styles['list-header--for-element-content']]: !contentIsString,\n [styles['list-header--top-align-content']]: topAlignContent,\n },\n className\n );\n const badgeClasses = cn(\n styles['list-header__badge'],\n {\n [styles['list-header__badge--for-string-content']]: contentIsString,\n },\n !contentIsString && size && styles[`list-header__badge--${size}`]\n );\n const chevronClasses = cn(styles['list-header__chevron'], !contentIsString && size && styles[`list-header__chevron--${size}`], {\n [styles['list-header__chevron--for-string-content']]: contentIsString,\n });\n const contentClasses = cn(styles['list-header__content'], {\n [styles['list-header__content--string']]: contentIsString,\n [styles['list-header__content--element']]: !contentIsString,\n [styles['list-header__content--spacing']]: !mappedChildren?.avatarChild && !icon,\n });\n const iconClasses = cn(\n styles['list-header__icon'],\n !contentIsString && size && (size === 'medium' || size === 'large') && styles[`list-header__icon--for-element-content--${size}`],\n {\n [styles['list-header__icon--for-string-content']]: contentIsString,\n [styles['list-header__icon--for-element-content']]: !contentIsString,\n }\n );\n const avatarClasses = cn(\n styles['list-header__avatar'],\n !contentIsString && size && (size === 'medium' || size === 'large') && styles[`list-header__avatar--for-element-content--${size}`],\n {\n [styles['list-header__avatar--for-string-content']]: contentIsString,\n [styles['list-header__avatar--for-element-content']]: !contentIsString,\n }\n );\n const CustomTag = titleHtmlMarkup;\n return (\n <span data-testid={testId} className={listLabelClasses}>\n {showChevronAndIcon && icon && (\n <span className={iconClasses}>\n {React.cloneElement(icon, {\n size: breakpoint === Breakpoint.xs ? IconSize.XSmall : IconSize.Small,\n isHovered,\n })}\n </span>\n )}\n {size !== 'small' && mappedChildren?.avatarChild && (\n <span className={avatarClasses}>{React.cloneElement(mappedChildren.avatarChild, { size: AvatarSize.xsmall })}</span>\n )}\n <span className={contentClasses}>\n {mappedChildren?.listHeaderTextChildren}\n {!!mappedChildren?.stringChildren.length && (\n <CustomTag className={styles['list-header__title']}>{mappedChildren.stringChildren}</CustomTag>\n )}\n {mappedChildren?.remainingChildren}\n </span>\n\n {mappedChildren?.badgeChildren &&\n mappedChildren.badgeChildren.map(badgeChild => {\n const id = uuid();\n return (\n <span key={id} className={badgeClasses}>\n {badgeChild}\n </span>\n );\n })}\n {showChevronAndIcon && chevronIcon && (\n <span className={chevronClasses}>\n <Icon svgIcon={chevronIcon} isHovered={isHovered} size={IconSize.XSmall} />\n </span>\n )}\n </span>\n );\n};\n\nListHeader.displayName = 'ListHeader';\n\nexport default ListHeader;\n"],"names":["renderListHeader","element","titleHtmlMarkup","isHovered","size","chevronIcon","icon","isComponent","ListHeader","React","mapChildren","children","isJsxChild","avatarChild","badgeChildren","listHeaderTextChildren","stringChildren","remainingChildren","child","Avatar","ListHeaderText","Badge","hasSpecialChildren","noRemainingRecursiveChildren","isComponentWithChildren","_b","_a","_d","_c","props","className","testId","breakpoint","useBreakpoint","showChevronAndIcon","contentIsString","mappedChildren","topAlignContent","listLabelClasses","cn","styles","badgeClasses","chevronClasses","contentClasses","iconClasses","avatarClasses","CustomTag","Breakpoint","IconSize","AvatarSize","badgeChild","id","uuid","Icon"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export type NotificationPanelVariants = 'info' | 'warn' | 'alert' | 'success';
|
|
2
|
+
export type NotificationPanelVariants = 'info' | 'warn' | 'alert' | 'error' | 'success';
|
|
3
3
|
export type NotificationCompactVariants = 'basic' | 'outline';
|
|
4
4
|
export type NotificationPanelSizes = 'small' | 'medium' | 'large';
|
|
5
5
|
export type LabelTags = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'span';
|
|
@@ -1,128 +1,94 @@
|
|
|
1
1
|
import t from "react";
|
|
2
2
|
import c from "classnames";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import { Icon as p } from "../Icon/Icon.js";
|
|
11
|
-
import H from "../Icons/CheckFill.js";
|
|
12
|
-
import O from "../Icons/ErrorSignFill.js";
|
|
13
|
-
import U from "../Icons/InfoSignFill.js";
|
|
14
|
-
import W from "../Icons/TriangleX.js";
|
|
3
|
+
import { AnalyticsId as R, IconSize as C } from "../../constants.js";
|
|
4
|
+
import { useUuid as T } from "../../hooks/useUuid.js";
|
|
5
|
+
import { getColor as $ } from "../../theme/currys/color.js";
|
|
6
|
+
import { getAriaLabelAttributes as F } from "../../utils/accessibility.js";
|
|
7
|
+
import V from "../Badge/NotificationBadge.js";
|
|
8
|
+
import H from "../Close/Close.js";
|
|
9
|
+
import M from "../Expander/Expander.js";
|
|
15
10
|
import e from "../NotificationPanel/styles.module.scss";
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
18
|
-
const
|
|
19
|
-
return /* @__PURE__ */ t.createElement("div", { className:
|
|
11
|
+
const U = ({ fluid: r, children: s }) => {
|
|
12
|
+
if (r) {
|
|
13
|
+
const i = c(e["fluid-wrapper"]);
|
|
14
|
+
return /* @__PURE__ */ t.createElement("div", { className: i }, s);
|
|
20
15
|
}
|
|
21
|
-
return
|
|
22
|
-
},
|
|
16
|
+
return s;
|
|
17
|
+
}, W = t.forwardRef((r, s) => {
|
|
23
18
|
const {
|
|
24
|
-
children:
|
|
25
|
-
variant:
|
|
26
|
-
dismissable:
|
|
19
|
+
children: i,
|
|
20
|
+
variant: o = "info",
|
|
21
|
+
dismissable: m = !1,
|
|
27
22
|
onClick: E,
|
|
28
|
-
expanderChildren:
|
|
29
|
-
expanderButtonText:
|
|
30
|
-
expanderButtonClosedText:
|
|
23
|
+
expanderChildren: l,
|
|
24
|
+
expanderButtonText: d,
|
|
25
|
+
expanderButtonClosedText: f,
|
|
31
26
|
expanderOpenFromStart: N = !1,
|
|
32
27
|
compactVariant: a,
|
|
33
|
-
label:
|
|
34
|
-
labelHtmlMarkup:
|
|
35
|
-
fluid:
|
|
36
|
-
size:
|
|
37
|
-
className:
|
|
38
|
-
labelId:
|
|
39
|
-
role:
|
|
40
|
-
testId:
|
|
41
|
-
} =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
{
|
|
45
|
-
svgIcon: U,
|
|
46
|
-
color: n.blueberry700,
|
|
47
|
-
hoverColor: n.blueberry700,
|
|
48
|
-
size: a ? o.XSmall : o.Small
|
|
49
|
-
}
|
|
50
|
-
),
|
|
51
|
-
warn: /* @__PURE__ */ t.createElement(
|
|
52
|
-
p,
|
|
53
|
-
{
|
|
54
|
-
svgIcon: O,
|
|
55
|
-
color: n.banana700,
|
|
56
|
-
hoverColor: n.banana700,
|
|
57
|
-
size: a ? o.XSmall : o.Small
|
|
58
|
-
}
|
|
59
|
-
),
|
|
60
|
-
alert: /* @__PURE__ */ t.createElement(
|
|
61
|
-
p,
|
|
62
|
-
{
|
|
63
|
-
svgIcon: W,
|
|
64
|
-
color: n.cherry700,
|
|
65
|
-
hoverColor: n.cherry700,
|
|
66
|
-
size: a ? o.XSmall : o.Small
|
|
67
|
-
}
|
|
68
|
-
),
|
|
69
|
-
success: /* @__PURE__ */ t.createElement(
|
|
70
|
-
p,
|
|
71
|
-
{
|
|
72
|
-
svgIcon: H,
|
|
73
|
-
color: n.kiwi900,
|
|
74
|
-
hoverColor: n.kiwi900,
|
|
75
|
-
size: a ? o.XSmall : o.Small
|
|
76
|
-
}
|
|
77
|
-
)
|
|
78
|
-
}, k = () => {
|
|
79
|
-
const h = a === "outline", X = c(e["notification-panel__content"]), A = c(e["notification-panel__label"], {
|
|
80
|
-
[e["notification-panel__label--no-content"]]: !l && !r,
|
|
28
|
+
label: n,
|
|
29
|
+
labelHtmlMarkup: h = "h1",
|
|
30
|
+
fluid: v = !1,
|
|
31
|
+
size: u,
|
|
32
|
+
className: I,
|
|
33
|
+
labelId: S,
|
|
34
|
+
role: g,
|
|
35
|
+
testId: w
|
|
36
|
+
} = r, p = T(S), A = () => {
|
|
37
|
+
const b = a === "outline", P = c(e["notification-panel__content"]), k = c(e["notification-panel__label"], {
|
|
38
|
+
[e["notification-panel__label--no-content"]]: !i && !l,
|
|
81
39
|
[e["notification-panel__label--compact"]]: !!a,
|
|
82
|
-
[e["notification-panel__label--outline"]]:
|
|
83
|
-
}),
|
|
84
|
-
[e["notification-panel__children--with-label"]]:
|
|
85
|
-
[e["notification-panel__children--expander-no-label"]]:
|
|
86
|
-
[e["notification-panel__children--outline"]]:
|
|
87
|
-
}),
|
|
88
|
-
return /* @__PURE__ */ t.createElement("div", { className:
|
|
89
|
-
|
|
40
|
+
[e["notification-panel__label--outline"]]: b
|
|
41
|
+
}), y = c(e["notification-panel__children"], {
|
|
42
|
+
[e["notification-panel__children--with-label"]]: n,
|
|
43
|
+
[e["notification-panel__children--expander-no-label"]]: l && !n,
|
|
44
|
+
[e["notification-panel__children--outline"]]: b
|
|
45
|
+
}), z = h, [x, O] = t.useState(N);
|
|
46
|
+
return /* @__PURE__ */ t.createElement("div", { className: P, id: n ? void 0 : p }, n && /* @__PURE__ */ t.createElement(z, { className: k, id: p }, n), i && /* @__PURE__ */ t.createElement("div", { className: y }, i), l && d && f && !a && /* @__PURE__ */ t.createElement(
|
|
47
|
+
M,
|
|
90
48
|
{
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
49
|
+
title: x ? d : f,
|
|
50
|
+
onExpand: O,
|
|
51
|
+
expanded: x,
|
|
52
|
+
testId: "expand"
|
|
53
|
+
},
|
|
54
|
+
l
|
|
96
55
|
));
|
|
97
|
-
},
|
|
56
|
+
}, B = c(
|
|
98
57
|
e["notification-panel"],
|
|
99
|
-
e[`notification-panel--${
|
|
100
|
-
|
|
58
|
+
e[`notification-panel--${o}`],
|
|
59
|
+
u && e[`notification-panel--${u}`],
|
|
101
60
|
{
|
|
102
61
|
[e["notification-panel--compact"]]: !!a,
|
|
103
62
|
[e["notification-panel--compact--basic"]]: a === "basic",
|
|
104
63
|
[e["notification-panel--compact--outline"]]: a === "outline",
|
|
105
|
-
[e["notification-panel--with-content"]]:
|
|
106
|
-
[e["notification-panel--dismissable"]]:
|
|
64
|
+
[e["notification-panel--with-content"]]: l || n && i,
|
|
65
|
+
[e["notification-panel--dismissable"]]: m
|
|
107
66
|
},
|
|
108
|
-
|
|
109
|
-
),
|
|
110
|
-
return /* @__PURE__ */ t.createElement(
|
|
67
|
+
I
|
|
68
|
+
), _ = g || (o === "alert" || o === "error") && "alert" || void 0, L = _ ? F({ label: n, id: p }) : void 0;
|
|
69
|
+
return /* @__PURE__ */ t.createElement(U, { fluid: v }, /* @__PURE__ */ t.createElement(
|
|
111
70
|
"div",
|
|
112
71
|
{
|
|
113
|
-
ref:
|
|
114
|
-
role:
|
|
115
|
-
"data-testid":
|
|
72
|
+
ref: s,
|
|
73
|
+
role: _,
|
|
74
|
+
"data-testid": w,
|
|
116
75
|
"data-analyticsid": R.NotificationPanel,
|
|
117
|
-
className:
|
|
118
|
-
...
|
|
76
|
+
className: B,
|
|
77
|
+
...L
|
|
119
78
|
},
|
|
120
|
-
/* @__PURE__ */ t.createElement(
|
|
121
|
-
|
|
122
|
-
|
|
79
|
+
/* @__PURE__ */ t.createElement(
|
|
80
|
+
V,
|
|
81
|
+
{
|
|
82
|
+
variant: o == "alert" ? "error" : o,
|
|
83
|
+
size: a ? C.XSmall : C.Small,
|
|
84
|
+
className: e["notification-panel__icon"]
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
m && /* @__PURE__ */ t.createElement("span", { className: e["notification-panel__close"] }, /* @__PURE__ */ t.createElement(H, { ariaLabel: r.ariaLabelCloseBtn, onClick: E, color: $("black") })),
|
|
88
|
+
A()
|
|
123
89
|
));
|
|
124
|
-
}),
|
|
90
|
+
}), ee = W;
|
|
125
91
|
export {
|
|
126
|
-
|
|
92
|
+
ee as default
|
|
127
93
|
};
|
|
128
94
|
//# sourceMappingURL=NotificationPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationPanel.js","sources":["../../../src/components/NotificationPanel/NotificationPanel.tsx"],"sourcesContent":["import React from 'react';\n\nimport classNames from 'classnames';\n\nimport { DetailButton } from './DetailButton/DetailButton';\nimport { AnalyticsId, IconSize } from '../../constants';\nimport { useUuid } from '../../hooks/useUuid';\nimport { getColor } from '../../theme/currys';\nimport { palette } from '../../theme/palette';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport Close from '../Close';\nimport Icon from '../Icon';\nimport CheckFill from '../Icons/CheckFill';\nimport ErrorSignFill from '../Icons/ErrorSignFill';\nimport InfoSignFill from '../Icons/InfoSignFill';\nimport TriangleX from '../Icons/TriangleX';\n\nimport styles from './styles.module.scss';\n\nexport type NotificationPanelVariants = 'info' | 'warn' | 'alert' | 'success';\nexport type NotificationCompactVariants = 'basic' | 'outline';\nexport type NotificationPanelSizes = 'small' | 'medium' | 'large';\nexport type LabelTags = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'span';\n\nexport interface NotificationPanelProps {\n /** Adds custom classes to the element. */\n className?: string;\n /** Adds inner child elements. */\n children?: React.ReactNode;\n /** Adds inner expander elements. */\n expanderChildren?: React.ReactNode;\n /** Text for expanderButton. */\n expanderButtonText?: string;\n /** Text for expanderButton when closed. */\n expanderButtonClosedText?: string;\n /** Makes expander be open from start. */\n expanderOpenFromStart?: boolean;\n /** Changes the visual representation of the notification panel. */\n variant?: NotificationPanelVariants;\n /** Makes the panel more compact. Available in basic and outline. */\n compactVariant?: NotificationCompactVariants;\n /** Sets a fixed size for the content container. */\n size?: NotificationPanelSizes;\n /** Used in combination with dismissiable property to close the notification panel. */\n onClick?: (e?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Toggles the close button in the top right corner. */\n dismissable?: boolean;\n /** Enables a fluid outer container that spans the entire width of parent. */\n fluid?: boolean;\n /** Sets a label for the notification panel. */\n label?: string;\n /** Changes the underlying element of the label. */\n labelHtmlMarkup?: LabelTags;\n /** Close button aria-label */\n ariaLabelCloseBtn?: string;\n /** Custom id for the label */\n labelId?: string;\n /** Custom role for the panel. Default is no role. If variant is alert or crisis, the aria role will be set to \"alert\" unless the role-prop is also set. */\n role?: 'region' | 'alert';\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\ntype WrapFluidProps = Pick<NotificationPanelProps, 'fluid'> & {\n children: React.ReactElement;\n};\n\nconst FluidWrapper: React.FC<WrapFluidProps> = ({ fluid, children }) => {\n if (fluid) {\n const fluidClasses = classNames(styles['fluid-wrapper']);\n\n return <div className={fluidClasses}>{children}</div>;\n }\n return children;\n};\n\nconst NotificationPanel = React.forwardRef<HTMLDivElement, NotificationPanelProps>((props, ref) => {\n const {\n children,\n variant = 'info',\n dismissable = false,\n onClick,\n expanderChildren,\n expanderButtonText,\n expanderButtonClosedText,\n expanderOpenFromStart = false,\n compactVariant,\n label,\n labelHtmlMarkup = 'h1',\n fluid = false,\n size,\n className,\n labelId,\n role,\n testId,\n } = props;\n const uuid = useUuid(labelId);\n const variantToIconMap = {\n info: (\n <Icon\n svgIcon={InfoSignFill}\n color={palette.blueberry700}\n hoverColor={palette.blueberry700}\n size={compactVariant ? IconSize.XSmall : IconSize.Small}\n />\n ),\n warn: (\n <Icon\n svgIcon={ErrorSignFill}\n color={palette.banana700}\n hoverColor={palette.banana700}\n size={compactVariant ? IconSize.XSmall : IconSize.Small}\n />\n ),\n alert: (\n <Icon\n svgIcon={TriangleX}\n color={palette.cherry700}\n hoverColor={palette.cherry700}\n size={compactVariant ? IconSize.XSmall : IconSize.Small}\n />\n ),\n success: (\n <Icon\n svgIcon={CheckFill}\n color={palette.kiwi900}\n hoverColor={palette.kiwi900}\n size={compactVariant ? IconSize.XSmall : IconSize.Small}\n />\n ),\n };\n const renderContent = (): JSX.Element => {\n const outlineVariant = compactVariant === 'outline';\n const contentClasses = classNames(styles['notification-panel__content']);\n const labelClasses = classNames(styles['notification-panel__label'], {\n [styles['notification-panel__label--no-content']]: !children && !expanderChildren,\n [styles['notification-panel__label--compact']]: !!compactVariant,\n [styles['notification-panel__label--outline']]: outlineVariant,\n });\n const childrenClasses = classNames(styles['notification-panel__children'], {\n [styles['notification-panel__children--with-label']]: label,\n [styles['notification-panel__children--expander-no-label']]: expanderChildren && !label,\n [styles['notification-panel__children--outline']]: outlineVariant,\n });\n const CustomTag = labelHtmlMarkup;\n\n return (\n <div className={contentClasses} id={!label ? uuid : undefined}>\n {label && (\n <CustomTag className={labelClasses} id={uuid}>\n {label}\n </CustomTag>\n )}\n {children && <div className={childrenClasses}>{children}</div>}\n {expanderChildren && expanderButtonText && expanderButtonClosedText && !compactVariant && (\n <DetailButton\n expanderOpenFromStart={expanderOpenFromStart}\n content={expanderChildren}\n buttonText={expanderButtonText}\n buttonClosedText={expanderButtonClosedText}\n />\n )}\n </div>\n );\n };\n\n const notificationPanelClasses = classNames(\n styles['notification-panel'],\n styles[`notification-panel--${variant}`],\n size && styles[`notification-panel--${size}`],\n {\n [styles['notification-panel--compact']]: !!compactVariant,\n [styles['notification-panel--compact--basic']]: compactVariant === 'basic',\n [styles['notification-panel--compact--outline']]: compactVariant === 'outline',\n [styles['notification-panel--with-content']]: expanderChildren || (label && children),\n [styles['notification-panel--dismissable']]: dismissable,\n },\n className\n );\n\n const ariaRole = role || (variant === 'alert' && 'alert') || undefined;\n const ariaLabelAttributes = ariaRole ? getAriaLabelAttributes({ label, id: uuid }) : undefined;\n\n return (\n <FluidWrapper fluid={fluid}>\n <div\n ref={ref}\n role={ariaRole}\n data-testid={testId}\n data-analyticsid={AnalyticsId.NotificationPanel}\n className={notificationPanelClasses}\n {...ariaLabelAttributes}\n >\n <span className={styles['notification-panel__icon']}>{variantToIconMap[variant]}</span>\n {dismissable && (\n <span className={styles['notification-panel__close']}>\n <Close ariaLabel={props.ariaLabelCloseBtn} onClick={onClick} color={getColor('black')} />\n </span>\n )}\n {renderContent()}\n </div>\n </FluidWrapper>\n );\n});\n\nexport default NotificationPanel;\n"],"names":["FluidWrapper","fluid","children","fluidClasses","classNames","styles","React","NotificationPanel","props","ref","variant","dismissable","onClick","expanderChildren","expanderButtonText","expanderButtonClosedText","expanderOpenFromStart","compactVariant","label","labelHtmlMarkup","size","className","labelId","role","testId","uuid","useUuid","variantToIconMap","Icon","InfoSignFill","palette","IconSize","ErrorSignFill","TriangleX","CheckFill","renderContent","outlineVariant","contentClasses","labelClasses","childrenClasses","CustomTag","DetailButton","notificationPanelClasses","ariaRole","ariaLabelAttributes","getAriaLabelAttributes","AnalyticsId","Close","getColor","NotificationPanel$1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NotificationPanel.js","sources":["../../../src/components/NotificationPanel/NotificationPanel.tsx"],"sourcesContent":["import React from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId, IconSize } from '../../constants';\nimport { useUuid } from '../../hooks/useUuid';\nimport { getColor } from '../../theme/currys';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport NotificationBadge from '../Badge/NotificationBadge';\nimport Close from '../Close';\nimport Expander from '../Expander';\n\nimport styles from './styles.module.scss';\n\nexport type NotificationPanelVariants = 'info' | 'warn' | 'alert' | 'error' | 'success';\nexport type NotificationCompactVariants = 'basic' | 'outline';\nexport type NotificationPanelSizes = 'small' | 'medium' | 'large';\nexport type LabelTags = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'span';\n\nexport interface NotificationPanelProps {\n /** Adds custom classes to the element. */\n className?: string;\n /** Adds inner child elements. */\n children?: React.ReactNode;\n /** Adds inner expander elements. */\n expanderChildren?: React.ReactNode;\n /** Text for expanderButton. */\n expanderButtonText?: string;\n /** Text for expanderButton when closed. */\n expanderButtonClosedText?: string;\n /** Makes expander be open from start. */\n expanderOpenFromStart?: boolean;\n /** Changes the visual representation of the notification panel. */\n variant?: NotificationPanelVariants;\n /** Makes the panel more compact. Available in basic and outline. */\n compactVariant?: NotificationCompactVariants;\n /** Sets a fixed size for the content container. */\n size?: NotificationPanelSizes;\n /** Used in combination with dismissiable property to close the notification panel. */\n onClick?: (e?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Toggles the close button in the top right corner. */\n dismissable?: boolean;\n /** Enables a fluid outer container that spans the entire width of parent. */\n fluid?: boolean;\n /** Sets a label for the notification panel. */\n label?: string;\n /** Changes the underlying element of the label. */\n labelHtmlMarkup?: LabelTags;\n /** Close button aria-label */\n ariaLabelCloseBtn?: string;\n /** Custom id for the label */\n labelId?: string;\n /** Custom role for the panel. Default is no role. If variant is alert or crisis, the aria role will be set to \"alert\" unless the role-prop is also set. */\n role?: 'region' | 'alert';\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\ntype WrapFluidProps = Pick<NotificationPanelProps, 'fluid'> & {\n children: React.ReactElement;\n};\n\nconst FluidWrapper: React.FC<WrapFluidProps> = ({ fluid, children }) => {\n if (fluid) {\n const fluidClasses = classNames(styles['fluid-wrapper']);\n\n return <div className={fluidClasses}>{children}</div>;\n }\n return children;\n};\n\nconst NotificationPanel = React.forwardRef<HTMLDivElement, NotificationPanelProps>((props, ref) => {\n const {\n children,\n variant = 'info',\n dismissable = false,\n onClick,\n expanderChildren,\n expanderButtonText,\n expanderButtonClosedText,\n expanderOpenFromStart = false,\n compactVariant,\n label,\n labelHtmlMarkup = 'h1',\n fluid = false,\n size,\n className,\n labelId,\n role,\n testId,\n } = props;\n const uuid = useUuid(labelId);\n const renderContent = (): JSX.Element => {\n const outlineVariant = compactVariant === 'outline';\n const contentClasses = classNames(styles['notification-panel__content']);\n const labelClasses = classNames(styles['notification-panel__label'], {\n [styles['notification-panel__label--no-content']]: !children && !expanderChildren,\n [styles['notification-panel__label--compact']]: !!compactVariant,\n [styles['notification-panel__label--outline']]: outlineVariant,\n });\n const childrenClasses = classNames(styles['notification-panel__children'], {\n [styles['notification-panel__children--with-label']]: label,\n [styles['notification-panel__children--expander-no-label']]: expanderChildren && !label,\n [styles['notification-panel__children--outline']]: outlineVariant,\n });\n const CustomTag = labelHtmlMarkup;\n\n const [expanderOpen, setExpanderOpen] = React.useState(expanderOpenFromStart);\n return (\n <div className={contentClasses} id={!label ? uuid : undefined}>\n {label && (\n <CustomTag className={labelClasses} id={uuid}>\n {label}\n </CustomTag>\n )}\n {children && <div className={childrenClasses}>{children}</div>}\n {expanderChildren && expanderButtonText && expanderButtonClosedText && !compactVariant && (\n <Expander\n title={expanderOpen ? expanderButtonText : expanderButtonClosedText}\n onExpand={setExpanderOpen}\n expanded={expanderOpen}\n testId=\"expand\"\n >\n {expanderChildren}\n </Expander>\n )}\n </div>\n );\n };\n\n const notificationPanelClasses = classNames(\n styles['notification-panel'],\n styles[`notification-panel--${variant}`],\n size && styles[`notification-panel--${size}`],\n {\n [styles['notification-panel--compact']]: !!compactVariant,\n [styles['notification-panel--compact--basic']]: compactVariant === 'basic',\n [styles['notification-panel--compact--outline']]: compactVariant === 'outline',\n [styles['notification-panel--with-content']]: expanderChildren || (label && children),\n [styles['notification-panel--dismissable']]: dismissable,\n },\n className\n );\n\n const ariaRole = role || ((variant === 'alert' || variant === 'error') && 'alert') || undefined;\n const ariaLabelAttributes = ariaRole ? getAriaLabelAttributes({ label, id: uuid }) : undefined;\n\n return (\n <FluidWrapper fluid={fluid}>\n <div\n ref={ref}\n role={ariaRole}\n data-testid={testId}\n data-analyticsid={AnalyticsId.NotificationPanel}\n className={notificationPanelClasses}\n {...ariaLabelAttributes}\n >\n <NotificationBadge\n variant={variant == 'alert' ? 'error' : variant}\n size={compactVariant ? IconSize.XSmall : IconSize.Small}\n className={styles['notification-panel__icon']}\n />\n {dismissable && (\n <span className={styles['notification-panel__close']}>\n <Close ariaLabel={props.ariaLabelCloseBtn} onClick={onClick} color={getColor('black')} />\n </span>\n )}\n {renderContent()}\n </div>\n </FluidWrapper>\n );\n});\n\nexport default NotificationPanel;\n"],"names":["FluidWrapper","fluid","children","fluidClasses","classNames","styles","React","NotificationPanel","props","ref","variant","dismissable","onClick","expanderChildren","expanderButtonText","expanderButtonClosedText","expanderOpenFromStart","compactVariant","label","labelHtmlMarkup","size","className","labelId","role","testId","uuid","useUuid","renderContent","outlineVariant","contentClasses","labelClasses","childrenClasses","CustomTag","expanderOpen","setExpanderOpen","Expander","notificationPanelClasses","ariaRole","ariaLabelAttributes","getAriaLabelAttributes","AnalyticsId","NotificationBadge","IconSize","Close","getColor","NotificationPanel$1"],"mappings":"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"}
|
|
@@ -98,6 +98,20 @@
|
|
|
98
98
|
border: none;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
+
&--error {
|
|
102
|
+
border: 0.125rem solid $cherry700;
|
|
103
|
+
background-color: $cherry50;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&--error#{&}--compact {
|
|
107
|
+
box-shadow: none;
|
|
108
|
+
background-color: transparent;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&--error#{&}--compact--basic {
|
|
112
|
+
border: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
101
115
|
&--success {
|
|
102
116
|
border: 0.125rem solid $kiwi900;
|
|
103
117
|
background-color: $kiwi50;
|