@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.
Files changed (77) hide show
  1. package/CHANGELOG.md +40 -3
  2. package/components/AnchorLink/styles.module.scss +6 -5
  3. package/components/Badge/Badge.d.ts +7 -1
  4. package/components/Badge/Badge.js +19 -9
  5. package/components/Badge/Badge.js.map +1 -1
  6. package/components/Badge/Badge.stories.d.ts +11 -0
  7. package/components/Badge/NotificationBadge.d.ts +17 -0
  8. package/components/Badge/NotificationBadge.js +68 -0
  9. package/components/Badge/NotificationBadge.js.map +1 -0
  10. package/components/Button/Button.d.ts +3 -0
  11. package/components/Button/Button.js +68 -66
  12. package/components/Button/Button.js.map +1 -1
  13. package/components/Button/styles.module.scss +6 -0
  14. package/components/Button/styles.module.scss.d.ts +1 -0
  15. package/components/Expander/styles.module.scss +4 -2
  16. package/components/ExpanderHierarchy/ExpanderHierarchy.stories.d.ts +13 -12
  17. package/components/LinkList/LinkList.stories.d.ts +1 -0
  18. package/components/List/List.stories.d.ts +19 -2
  19. package/components/ListHeader/ListHeader.d.ts +1 -1
  20. package/components/ListHeader/ListHeader.js +32 -28
  21. package/components/ListHeader/ListHeader.js.map +1 -1
  22. package/components/NotificationPanel/NotificationPanel.d.ts +1 -1
  23. package/components/NotificationPanel/NotificationPanel.js +69 -103
  24. package/components/NotificationPanel/NotificationPanel.js.map +1 -1
  25. package/components/NotificationPanel/NotificationPanel.stories.d.ts +1 -1
  26. package/components/NotificationPanel/styles.module.scss +14 -0
  27. package/components/NotificationPanel/styles.module.scss.d.ts +1 -0
  28. package/components/ServiceMessage/ServiceMessage.js +66 -75
  29. package/components/ServiceMessage/ServiceMessage.js.map +1 -1
  30. package/components/ServiceMessage/ServiceMessage.stories.d.ts +1 -1
  31. package/components/ServiceMessage/styles.module.scss +13 -0
  32. package/components/ServiceMessage/styles.module.scss.d.ts +1 -0
  33. package/components/Tabs/Tab.d.ts +17 -0
  34. package/components/Tabs/Tab.js +6 -0
  35. package/components/Tabs/Tab.js.map +1 -0
  36. package/components/Tabs/TabList/TabList.d.ts +11 -0
  37. package/components/Tabs/TabList/TabList.js +51 -0
  38. package/components/Tabs/TabList/TabList.js.map +1 -0
  39. package/components/Tabs/TabList/index.d.ts +3 -0
  40. package/components/Tabs/TabList/index.js +5 -0
  41. package/components/Tabs/TabList/index.js.map +1 -0
  42. package/components/Tabs/TabList/styles.module.scss +109 -0
  43. package/components/Tabs/TabList/styles.module.scss.d.ts +18 -0
  44. package/components/Tabs/TabPanel/TabPanel.d.ts +9 -0
  45. package/components/Tabs/TabPanel/TabPanel.js +13 -0
  46. package/components/Tabs/TabPanel/TabPanel.js.map +1 -0
  47. package/components/Tabs/TabPanel/index.d.ts +3 -0
  48. package/components/Tabs/TabPanel/index.js +5 -0
  49. package/components/Tabs/TabPanel/index.js.map +1 -0
  50. package/components/Tabs/TabPanel/styles.module.scss +37 -0
  51. package/components/Tabs/TabPanel/styles.module.scss.d.ts +15 -0
  52. package/components/Tabs/Tabs.d.ts +22 -0
  53. package/components/Tabs/Tabs.js +19 -0
  54. package/components/Tabs/Tabs.js.map +1 -0
  55. package/components/Tabs/Tabs.stories.d.ts +50 -0
  56. package/components/Tabs/index.d.ts +3 -0
  57. package/components/Tabs/index.js +5 -0
  58. package/components/Tabs/index.js.map +1 -0
  59. package/components/Tabs/styles.module.scss +3 -0
  60. package/components/Tabs/styles.module.scss.d.ts +9 -0
  61. package/components/Tile/Tile.stories.d.ts +26 -2
  62. package/constants.d.ts +5 -1
  63. package/constants.js +1 -1
  64. package/constants.js.map +1 -1
  65. package/docs/index.js +7 -7
  66. package/docs/index.js.map +1 -1
  67. package/hooks/useRovingFocus.d.ts +1 -0
  68. package/hooks/useRovingFocus.js +27 -0
  69. package/hooks/useRovingFocus.js.map +1 -0
  70. package/hooks/useRovingFocus.stories.d.ts +17 -0
  71. package/package.json +1 -1
  72. package/scss/typography.module.scss +7 -5
  73. package/components/NotificationPanel/DetailButton/DetailButton.d.ts +0 -9
  74. package/components/NotificationPanel/DetailButton/DetailButton.js +0 -28
  75. package/components/NotificationPanel/DetailButton/DetailButton.js.map +0 -1
  76. package/components/NotificationPanel/DetailButton/styles.module.scss +0 -38
  77. 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: $blueberry50;
57
+ background-color: var(--color-action-background-transparent-onlight-hover);
57
58
  }
58
59
 
59
60
  &--expanded {
60
- background-color: $blueberry50;
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
- expanded: {
29
+ children: {
34
30
  control: string;
35
31
  };
36
- print: {
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<ExpanderHierarchyWithAndCustomArgs>;
43
+ type Story = StoryObj<typeof ExpanderHierarchy>;
43
44
  export declare const Default: Story;
@@ -46,3 +46,4 @@ export declare const VariantOutline: Story;
46
46
  export declare const VariantFill: Story;
47
47
  export declare const WithRef: Story;
48
48
  export declare const AsButton: Story;
49
+ export declare const WithNotificationBadge: 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 meta>;
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
- badgeChild?: React.ReactElement<BadgeProps>;
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 r from "react";
2
- import h from "classnames";
1
+ import a from "react";
2
+ import _ from "classnames";
3
3
  import L from "./ListHeaderText/ListHeaderText.js";
4
- import { useBreakpoint as k, Breakpoint as A } from "../../hooks/useBreakpoint.js";
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 $, { AvatarSize as B } from "../Avatar/Avatar.js";
7
- import R from "../Badge/Badge.js";
8
- import { Icon as p } from "../Icon/Icon.js";
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 K = (m, f, _, i, c, o) => {
12
+ const U = (m, f, h, i, c, o) => {
12
13
  if (u(m, E))
13
- return r.cloneElement(m, {
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__ */ r.createElement(E, { titleHtmlMarkup: f, chevronIcon: c, icon: o, isHovered: _, size: i }, m);
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 _, i;
24
- const c = [], o = [], l = [];
25
- r.Children.forEach(m, (a) => {
26
- a === null || typeof a > "u" || (u(a, $) ? _ = a : u(a, L) ? c.push(a) : u(a, R) ? i = a : typeof a == "string" ? o.push(a) : l.push(a));
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 = _ !== 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
+ 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: _, listHeaderTextChildren: c, badgeChild: i, stringChildren: o, remainingChildren: l };
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: _ = "h2", chevronIcon: i, children: c, icon: o, isHovered: l, size: n, testId: v } = m, d = k(), g = n !== "small" && !!(i || o), s = typeof c == "string", e = b(c), a = (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 = h(
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"]]: a
39
+ [t["list-header--top-align-content"]]: r
39
40
  },
40
41
  f
41
- ), x = h(
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
- ), S = h(t["list-header__chevron"], !s && n && t[`list-header__chevron--${n}`], {
48
+ ), y = _(t["list-header__chevron"], !s && n && t[`list-header__chevron--${n}`], {
48
49
  [t["list-header__chevron--for-string-content"]]: s
49
- }), y = h(t["list-header__content"], {
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 = h(
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 = h(
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
- ), z = _;
68
- return /* @__PURE__ */ r.createElement("span", { "data-testid": v, className: H }, g && o && /* @__PURE__ */ r.createElement("span", { className: I }, r.cloneElement(o, {
69
- size: d === A.xs ? C.XSmall : C.Small,
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__ */ r.createElement("span", { className: T }, r.cloneElement(e.avatarChild, { size: B.xsmall })), /* @__PURE__ */ r.createElement("span", { className: y }, e == null ? void 0 : e.listHeaderTextChildren, !!(e != null && e.stringChildren.length) && /* @__PURE__ */ r.createElement(z, { className: t["list-header__title"] }, e.stringChildren), e == null ? void 0 : e.remainingChildren), (e == null ? void 0 : e.badgeChild) && /* @__PURE__ */ r.createElement("span", { className: x }, e.badgeChild), g && i && /* @__PURE__ */ r.createElement("span", { className: S }, /* @__PURE__ */ r.createElement(p, { svgIcon: i, isHovered: l, size: C.XSmall })));
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
- K as renderListHeader
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 { DetailButton as P } from "./DetailButton/DetailButton.js";
4
- import { IconSize as o, AnalyticsId as R } from "../../constants.js";
5
- import { useUuid as $ } from "../../hooks/useUuid.js";
6
- import { getColor as M } from "../../theme/currys/color.js";
7
- import { palette as n } from "../../theme/palette.js";
8
- import { getAriaLabelAttributes as V } from "../../utils/accessibility.js";
9
- import D from "../Close/Close.js";
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 j = ({ fluid: s, children: m }) => {
17
- if (s) {
18
- const l = c(e["fluid-wrapper"]);
19
- return /* @__PURE__ */ t.createElement("div", { className: l }, m);
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 m;
22
- }, q = t.forwardRef((s, m) => {
16
+ return s;
17
+ }, W = t.forwardRef((r, s) => {
23
18
  const {
24
- children: l,
25
- variant: f = "info",
26
- dismissable: u = !1,
19
+ children: i,
20
+ variant: o = "info",
21
+ dismissable: m = !1,
27
22
  onClick: E,
28
- expanderChildren: r,
29
- expanderButtonText: b,
30
- expanderButtonClosedText: _,
23
+ expanderChildren: l,
24
+ expanderButtonText: d,
25
+ expanderButtonClosedText: f,
31
26
  expanderOpenFromStart: N = !1,
32
27
  compactVariant: a,
33
- label: i,
34
- labelHtmlMarkup: S = "h1",
35
- fluid: I = !1,
36
- size: C,
37
- className: g,
38
- labelId: x,
39
- role: w,
40
- testId: y
41
- } = s, d = $(x), T = {
42
- info: /* @__PURE__ */ t.createElement(
43
- p,
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"]]: h
83
- }), B = c(e["notification-panel__children"], {
84
- [e["notification-panel__children--with-label"]]: i,
85
- [e["notification-panel__children--expander-no-label"]]: r && !i,
86
- [e["notification-panel__children--outline"]]: h
87
- }), L = S;
88
- return /* @__PURE__ */ t.createElement("div", { className: X, id: i ? void 0 : d }, i && /* @__PURE__ */ t.createElement(L, { className: A, id: d }, i), l && /* @__PURE__ */ t.createElement("div", { className: B }, l), r && b && _ && !a && /* @__PURE__ */ t.createElement(
89
- P,
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
- expanderOpenFromStart: N,
92
- content: r,
93
- buttonText: b,
94
- buttonClosedText: _
95
- }
49
+ title: x ? d : f,
50
+ onExpand: O,
51
+ expanded: x,
52
+ testId: "expand"
53
+ },
54
+ l
96
55
  ));
97
- }, z = c(
56
+ }, B = c(
98
57
  e["notification-panel"],
99
- e[`notification-panel--${f}`],
100
- C && e[`notification-panel--${C}`],
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"]]: r || i && l,
106
- [e["notification-panel--dismissable"]]: u
64
+ [e["notification-panel--with-content"]]: l || n && i,
65
+ [e["notification-panel--dismissable"]]: m
107
66
  },
108
- g
109
- ), v = w || f === "alert" && "alert" || void 0, F = v ? V({ label: i, id: d }) : void 0;
110
- return /* @__PURE__ */ t.createElement(j, { fluid: I }, /* @__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: m,
114
- role: v,
115
- "data-testid": y,
72
+ ref: s,
73
+ role: _,
74
+ "data-testid": w,
116
75
  "data-analyticsid": R.NotificationPanel,
117
- className: z,
118
- ...F
76
+ className: B,
77
+ ...L
119
78
  },
120
- /* @__PURE__ */ t.createElement("span", { className: e["notification-panel__icon"] }, T[f]),
121
- u && /* @__PURE__ */ t.createElement("span", { className: e["notification-panel__close"] }, /* @__PURE__ */ t.createElement(D, { ariaLabel: s.ariaLabelCloseBtn, onClick: E, color: M("black") })),
122
- k()
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
- }), se = q;
90
+ }), ee = W;
125
91
  export {
126
- se as default
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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"}
@@ -17,7 +17,7 @@ declare const meta: {
17
17
  fluid: false;
18
18
  label: string;
19
19
  labelHtmlMarkup: "h1";
20
- variant: "alert";
20
+ variant: "error";
21
21
  role: undefined;
22
22
  };
23
23
  argTypes: {
@@ -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;