@helsenorge/designsystem-react 7.5.0 → 7.7.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 (32) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/components/Badge/Badge.d.ts +7 -1
  3. package/components/Badge/Badge.js +19 -9
  4. package/components/Badge/Badge.js.map +1 -1
  5. package/components/Badge/Badge.stories.d.ts +11 -0
  6. package/components/Badge/NotificationBadge.d.ts +17 -0
  7. package/components/Badge/NotificationBadge.js +68 -0
  8. package/components/Badge/NotificationBadge.js.map +1 -0
  9. package/components/ErrorWrapper/styles.module.scss +1 -0
  10. package/components/Expander/styles.module.scss +3 -2
  11. package/components/ExpanderList/styles.module.scss +6 -1
  12. package/components/LinkList/LinkList.stories.d.ts +1 -0
  13. package/components/ListHeader/ListHeader.d.ts +1 -1
  14. package/components/ListHeader/ListHeader.js +32 -28
  15. package/components/ListHeader/ListHeader.js.map +1 -1
  16. package/components/NotificationPanel/NotificationPanel.d.ts +4 -1
  17. package/components/NotificationPanel/NotificationPanel.js +65 -98
  18. package/components/NotificationPanel/NotificationPanel.js.map +1 -1
  19. package/components/NotificationPanel/NotificationPanel.stories.d.ts +6 -1
  20. package/components/NotificationPanel/styles.module.scss +14 -0
  21. package/components/NotificationPanel/styles.module.scss.d.ts +1 -0
  22. package/components/ServiceMessage/ServiceMessage.js +66 -75
  23. package/components/ServiceMessage/ServiceMessage.js.map +1 -1
  24. package/components/ServiceMessage/ServiceMessage.stories.d.ts +1 -1
  25. package/components/ServiceMessage/styles.module.scss +13 -0
  26. package/components/ServiceMessage/styles.module.scss.d.ts +1 -0
  27. package/package.json +1 -1
  28. package/components/NotificationPanel/DetailButton/DetailButton.d.ts +0 -9
  29. package/components/NotificationPanel/DetailButton/DetailButton.js +0 -28
  30. package/components/NotificationPanel/DetailButton/DetailButton.js.map +0 -1
  31. package/components/NotificationPanel/DetailButton/styles.module.scss +0 -38
  32. package/components/NotificationPanel/DetailButton/styles.module.scss.d.ts +0 -13
package/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ ## [7.6.0](https://github.com/helsenorge/designsystem/branchCompare?baseVersion=GTv7.5.0&targetVersion=GTv7.6.0) (2024-05-15)
2
+
3
+ ### Features
4
+
5
+ - **notificationpanel:** legg til prop for å sette html tag for label
6
+ ([ebd331a](https://github.com/helsenorge/designsystem/commit/ebd331a75f04099c4ad7e552ff70df8751675734)), closes
7
+ [#324952](https://github.com/helsenorge/designsystem/issues/324952)
8
+
9
+ ### Bug Fixes
10
+
11
+ - skjemaelementer med error styling overlapper utifra dom rekkefølge
12
+ ([b07b7d6](https://github.com/helsenorge/designsystem/commit/b07b7d69391b3e4296e8a8cde8b8d312f835cb03)), closes
13
+ [#324846](https://github.com/helsenorge/designsystem/issues/324846)
14
+ - **expanderlist:** fiks så variant fill ikke mister margin top ved åpning av expander
15
+ ([d277c97](https://github.com/helsenorge/designsystem/commit/d277c97660aa8334a44b1183445f55f2037b2263)), closes
16
+ [#324823](https://github.com/helsenorge/designsystem/issues/324823)
17
+
18
+ ## [7.5.0](https://github.com/helsenorge/designsystem/branchCompare?baseVersion=GTv7.4.0&targetVersion=GTv7.5.0) (2024-05-08)
19
+
20
+ ### Features
21
+
22
+ - **notificationpanel:** compactmode kan nå vise children
23
+ ([8056e4a](https://github.com/helsenorge/designsystem/commit/8056e4a95ed03caecd05b69bedbb5c16f6ba1f4a)), closes
24
+ [#324320](https://github.com/helsenorge/designsystem/issues/324320)
25
+
1
26
  ## [7.4.0](https://github.com/helsenorge/designsystem/branchCompare?baseVersion=GTv7.3.1&targetVersion=GTv7.4.0) (2024-05-07)
2
27
 
3
28
  ### Features
@@ -1,16 +1,22 @@
1
1
  import React from 'react';
2
+ import { BadgeNotificationVariant } from './NotificationBadge';
2
3
  import { PaletteNames } from '../../theme/palette';
3
4
  export type BadgeColors = Extract<PaletteNames, 'blueberry' | 'cherry' | 'neutral'>;
4
5
  export type BadgeChildren = string | number;
6
+ export type BadgeVariant = 'string' | 'notification';
5
7
  export interface BadgeProps {
6
8
  /** Sets the content of the badge. */
7
- children: BadgeChildren;
9
+ children?: BadgeChildren;
8
10
  /** Adds custom classes to the element. */
9
11
  className?: string;
10
12
  /** Changes the badge background color. */
11
13
  color?: BadgeColors;
12
14
  /** Sets the data-testid attribute. */
13
15
  testId?: string;
16
+ /** Changes the type of the badge. Default: string */
17
+ type?: BadgeVariant;
18
+ /** Type of notification badge. Only works if type is 'notification'. */
19
+ notificationVariant?: BadgeNotificationVariant;
14
20
  }
15
21
  export type BadgeType = React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLElement>>;
16
22
  declare const Badge: BadgeType;
@@ -1,20 +1,30 @@
1
- import r from "react";
2
- import n from "classnames";
3
- import { AnalyticsId as b } from "../../constants.js";
1
+ import t from "react";
2
+ import m from "classnames";
3
+ import g from "./NotificationBadge.js";
4
+ import { IconSize as b, AnalyticsId as d } from "../../constants.js";
4
5
  import e from "../Badge/styles.module.scss";
5
- const m = r.forwardRef(function(t, d) {
6
- const { children: s, className: o = "", color: a = "blueberry", testId: l } = t, c = n(
6
+ const u = t.forwardRef(function(n, s) {
7
+ const { children: c, className: r = "", color: a = "blueberry", testId: i, type: l = "string", notificationVariant: o = "info" } = n, f = m(
7
8
  e.badge,
8
9
  {
9
10
  [e["badge--blueberry"]]: a === "blueberry",
10
11
  [e["badge--cherry"]]: a === "cherry",
11
12
  [e["badge--neutral"]]: a === "neutral"
12
13
  },
13
- o
14
+ r
14
15
  );
15
- return /* @__PURE__ */ r.createElement("span", { className: c, ref: d, "data-testid": l, "data-analyticsid": b.Badge }, s);
16
- }), p = m;
16
+ return l === "notification" && o !== void 0 ? /* @__PURE__ */ t.createElement(
17
+ g,
18
+ {
19
+ variant: o,
20
+ size: b.XSmall,
21
+ className: r,
22
+ testId: i,
23
+ "data-analyticsid": d.Badge
24
+ }
25
+ ) : /* @__PURE__ */ t.createElement("span", { className: f, ref: s, "data-testid": i, "data-analyticsid": d.Badge }, c);
26
+ }), R = u;
17
27
  export {
18
- p as default
28
+ R as default
19
29
  };
20
30
  //# sourceMappingURL=Badge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import React from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId } from '../../constants';\nimport { PaletteNames } from '../../theme/palette';\n\nimport badgeStyles from './styles.module.scss';\n\nexport type BadgeColors = Extract<PaletteNames, 'blueberry' | 'cherry' | 'neutral'>;\nexport type BadgeChildren = string | number;\n\nexport interface BadgeProps {\n /** Sets the content of the badge. */\n children: BadgeChildren;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the badge background color. */\n color?: BadgeColors;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\nexport type BadgeType = React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLElement>>;\nconst Badge: BadgeType = React.forwardRef(function BadgeForwardedRef(props: BadgeProps, ref: React.ForwardedRef<HTMLElement>) {\n const { children, className = '', color = 'blueberry', testId } = props;\n const badgeClasses = classNames(\n badgeStyles.badge,\n {\n [badgeStyles['badge--blueberry']]: color === 'blueberry',\n [badgeStyles['badge--cherry']]: color === 'cherry',\n [badgeStyles['badge--neutral']]: color === 'neutral',\n },\n className\n );\n\n return (\n <span className={badgeClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.Badge}>\n {children}\n </span>\n );\n});\n\nexport default Badge;\n"],"names":["Badge","React","props","ref","children","className","color","testId","badgeClasses","classNames","badgeStyles","AnalyticsId","Badge$1"],"mappings":";;;;AAuBA,MAAMA,IAAmBC,EAAM,WAAW,SAA2BC,GAAmBC,GAAsC;AAC5H,QAAM,EAAE,UAAAC,GAAU,WAAAC,IAAY,IAAI,OAAAC,IAAQ,aAAa,QAAAC,EAAW,IAAAL,GAC5DM,IAAeC;AAAA,IACnBC,EAAY;AAAA,IACZ;AAAA,MACE,CAACA,EAAY,kBAAkB,CAAC,GAAGJ,MAAU;AAAA,MAC7C,CAACI,EAAY,eAAe,CAAC,GAAGJ,MAAU;AAAA,MAC1C,CAACI,EAAY,gBAAgB,CAAC,GAAGJ,MAAU;AAAA,IAC7C;AAAA,IACAD;AAAA,EAAA;AAIA,SAAAJ,gBAAAA,EAAA,cAAC,QAAK,EAAA,WAAWO,GAAc,KAAAL,GAAU,eAAaI,GAAQ,oBAAkBI,EAAY,MAAA,GACzFP,CACH;AAEJ,CAAC,GAEDQ,IAAeZ;"}
1
+ {"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import React from 'react';\n\nimport classNames from 'classnames';\n\nimport NotificationBadge, { BadgeNotificationVariant } from './NotificationBadge';\nimport { AnalyticsId, IconSize } from '../../constants';\nimport { PaletteNames } from '../../theme/palette';\n\nimport badgeStyles from './styles.module.scss';\n\nexport type BadgeColors = Extract<PaletteNames, 'blueberry' | 'cherry' | 'neutral'>;\nexport type BadgeChildren = string | number;\nexport type BadgeVariant = 'string' | 'notification';\n\nexport interface BadgeProps {\n /** Sets the content of the badge. */\n children?: BadgeChildren;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the badge background color. */\n color?: BadgeColors;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Changes the type of the badge. Default: string */\n type?: BadgeVariant;\n /** Type of notification badge. Only works if type is 'notification'. */\n notificationVariant?: BadgeNotificationVariant;\n}\n\nexport type BadgeType = React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLElement>>;\nconst Badge: BadgeType = React.forwardRef(function BadgeForwardedRef(props: BadgeProps, ref: React.ForwardedRef<HTMLElement>) {\n const { children, className = '', color = 'blueberry', testId, type = 'string', notificationVariant = 'info' } = props;\n const badgeClasses = classNames(\n badgeStyles.badge,\n {\n [badgeStyles['badge--blueberry']]: color === 'blueberry',\n [badgeStyles['badge--cherry']]: color === 'cherry',\n [badgeStyles['badge--neutral']]: color === 'neutral',\n },\n className\n );\n\n if (type === 'notification' && notificationVariant !== undefined) {\n return (\n <NotificationBadge\n variant={notificationVariant}\n size={IconSize.XSmall}\n className={className}\n testId={testId}\n data-analyticsid={AnalyticsId.Badge}\n />\n );\n }\n\n return (\n <span className={badgeClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.Badge}>\n {children}\n </span>\n );\n});\n\nexport default Badge;\n"],"names":["Badge","React","props","ref","children","className","color","testId","type","notificationVariant","badgeClasses","classNames","badgeStyles","NotificationBadge","IconSize","AnalyticsId","Badge$1"],"mappings":";;;;;AA8BA,MAAMA,IAAmBC,EAAM,WAAW,SAA2BC,GAAmBC,GAAsC;AACtH,QAAA,EAAE,UAAAC,GAAU,WAAAC,IAAY,IAAI,OAAAC,IAAQ,aAAa,QAAAC,GAAQ,MAAAC,IAAO,UAAU,qBAAAC,IAAsB,OAAA,IAAWP,GAC3GQ,IAAeC;AAAA,IACnBC,EAAY;AAAA,IACZ;AAAA,MACE,CAACA,EAAY,kBAAkB,CAAC,GAAGN,MAAU;AAAA,MAC7C,CAACM,EAAY,eAAe,CAAC,GAAGN,MAAU;AAAA,MAC1C,CAACM,EAAY,gBAAgB,CAAC,GAAGN,MAAU;AAAA,IAC7C;AAAA,IACAD;AAAA,EAAA;AAGE,SAAAG,MAAS,kBAAkBC,MAAwB,SAEnDR,gBAAAA,EAAA;AAAA,IAACY;AAAA,IAAA;AAAA,MACC,SAASJ;AAAA,MACT,MAAMK,EAAS;AAAA,MACf,WAAAT;AAAA,MACA,QAAAE;AAAA,MACA,oBAAkBQ,EAAY;AAAA,IAAA;AAAA,EAAA,IAMlCd,gBAAAA,EAAA,cAAC,QAAK,EAAA,WAAWS,GAAc,KAAAP,GAAU,eAAaI,GAAQ,oBAAkBQ,EAAY,MAAA,GACzFX,CACH;AAEJ,CAAC,GAEDY,IAAehB;"}
@@ -14,6 +14,8 @@ declare const meta: {
14
14
  args: {
15
15
  children: string;
16
16
  color: "blueberry";
17
+ type: "string";
18
+ notificationVariant: "info";
17
19
  };
18
20
  argTypes: {
19
21
  children: {
@@ -23,9 +25,18 @@ declare const meta: {
23
25
  control: string;
24
26
  options: string[];
25
27
  };
28
+ type: {
29
+ control: string;
30
+ options: string[];
31
+ };
32
+ notificationVariant: {
33
+ control: string;
34
+ options: string[];
35
+ };
26
36
  };
27
37
  };
28
38
  export default meta;
29
39
  type Story = StoryObj<typeof meta>;
30
40
  export declare const Default: Story;
31
41
  export declare const Variants: Story;
42
+ export declare const Notification: Story;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { IconSize } from '../../constants';
3
+ export type BadgeNotificationVariant = 'info' | 'warn' | 'error' | 'success';
4
+ export interface NotificationBadgeProps {
5
+ /** Changes the type of the badge */
6
+ variant: BadgeNotificationVariant;
7
+ /** Sets the size of the badge */
8
+ size: IconSize;
9
+ /** Adds custom classes to the element */
10
+ className?: string;
11
+ /** Sets the data-testid attribute. */
12
+ testId?: string;
13
+ /** Sets hover state */
14
+ isHovered?: boolean;
15
+ }
16
+ declare const NotificationBadge: (props: NotificationBadgeProps) => React.JSX.Element;
17
+ export default NotificationBadge;
@@ -0,0 +1,68 @@
1
+ import c from "react";
2
+ import { palette as r } from "../../theme/palette.js";
3
+ import { Icon as n } from "../Icon/Icon.js";
4
+ import s from "../Icons/CheckFill.js";
5
+ import m from "../Icons/ErrorSignFill.js";
6
+ import f from "../Icons/InfoSignFill.js";
7
+ import v from "../Icons/TriangleX.js";
8
+ const g = (i) => {
9
+ const { variant: l, size: e, className: o = "", testId: t, isHovered: a = !1 } = i;
10
+ switch (l) {
11
+ case "info":
12
+ return /* @__PURE__ */ c.createElement(
13
+ n,
14
+ {
15
+ svgIcon: f,
16
+ color: r.blueberry700,
17
+ hoverColor: r.blueberry700,
18
+ size: e,
19
+ className: o,
20
+ testId: t,
21
+ isHovered: a
22
+ }
23
+ );
24
+ case "warn":
25
+ return /* @__PURE__ */ c.createElement(
26
+ n,
27
+ {
28
+ svgIcon: m,
29
+ color: r.banana700,
30
+ hoverColor: r.banana700,
31
+ size: e,
32
+ className: o,
33
+ testId: t,
34
+ isHovered: a
35
+ }
36
+ );
37
+ case "error":
38
+ return /* @__PURE__ */ c.createElement(
39
+ n,
40
+ {
41
+ svgIcon: v,
42
+ color: r.cherry700,
43
+ hoverColor: r.cherry700,
44
+ size: e,
45
+ className: o,
46
+ testId: t,
47
+ isHovered: a
48
+ }
49
+ );
50
+ case "success":
51
+ return /* @__PURE__ */ c.createElement(
52
+ n,
53
+ {
54
+ svgIcon: s,
55
+ color: r.kiwi900,
56
+ hoverColor: r.kiwi900,
57
+ size: e,
58
+ className: o,
59
+ testId: t,
60
+ isHovered: a
61
+ }
62
+ );
63
+ }
64
+ }, E = g;
65
+ export {
66
+ E as default
67
+ };
68
+ //# sourceMappingURL=NotificationBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotificationBadge.js","sources":["../../../src/components/Badge/NotificationBadge.tsx"],"sourcesContent":["import React from 'react';\n\nimport { IconSize } from '../../constants';\nimport { palette } from '../../theme/palette';\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\nexport type BadgeNotificationVariant = 'info' | 'warn' | 'error' | 'success';\n\nexport interface NotificationBadgeProps {\n /** Changes the type of the badge */\n variant: BadgeNotificationVariant;\n /** Sets the size of the badge */\n size: IconSize;\n /** Adds custom classes to the element */\n className?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets hover state */\n isHovered?: boolean;\n}\n\nconst NotificationBadge = (props: NotificationBadgeProps): React.JSX.Element => {\n const { variant, size, className = '', testId, isHovered = false } = props;\n switch (variant) {\n case 'info':\n return (\n <Icon\n svgIcon={InfoSignFill}\n color={palette.blueberry700}\n hoverColor={palette.blueberry700}\n size={size}\n className={className}\n testId={testId}\n isHovered={isHovered}\n />\n );\n case 'warn':\n return (\n <Icon\n svgIcon={ErrorSignFill}\n color={palette.banana700}\n hoverColor={palette.banana700}\n size={size}\n className={className}\n testId={testId}\n isHovered={isHovered}\n />\n );\n case 'error':\n return (\n <Icon\n svgIcon={TriangleX}\n color={palette.cherry700}\n hoverColor={palette.cherry700}\n size={size}\n className={className}\n testId={testId}\n isHovered={isHovered}\n />\n );\n case 'success':\n return (\n <Icon\n svgIcon={CheckFill}\n color={palette.kiwi900}\n hoverColor={palette.kiwi900}\n size={size}\n className={className}\n testId={testId}\n isHovered={isHovered}\n />\n );\n }\n};\n\nexport default NotificationBadge;\n"],"names":["NotificationBadge","props","variant","size","className","testId","isHovered","React","Icon","InfoSignFill","palette","ErrorSignFill","TriangleX","CheckFill","NotificationBadge$1"],"mappings":";;;;;;;AAyBA,MAAMA,IAAoB,CAACC,MAAqD;AACxE,QAAA,EAAE,SAAAC,GAAS,MAAAC,GAAM,WAAAC,IAAY,IAAI,QAAAC,GAAQ,WAAAC,IAAY,GAAU,IAAAL;AACrE,UAAQC,GAAS;AAAA,IACf,KAAK;AAED,aAAAK,gBAAAA,EAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAASC;AAAA,UACT,OAAOC,EAAQ;AAAA,UACf,YAAYA,EAAQ;AAAA,UACpB,MAAAP;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,UACA,WAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN,KAAK;AAED,aAAAC,gBAAAA,EAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAASG;AAAA,UACT,OAAOD,EAAQ;AAAA,UACf,YAAYA,EAAQ;AAAA,UACpB,MAAAP;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,UACA,WAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN,KAAK;AAED,aAAAC,gBAAAA,EAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAASI;AAAA,UACT,OAAOF,EAAQ;AAAA,UACf,YAAYA,EAAQ;AAAA,UACpB,MAAAP;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,UACA,WAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN,KAAK;AAED,aAAAC,gBAAAA,EAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,SAASK;AAAA,UACT,OAAOH,EAAQ;AAAA,UACf,YAAYA,EAAQ;AAAA,UACpB,MAAAP;AAAA,UACA,WAAAC;AAAA,UACA,QAAAC;AAAA,UACA,WAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,EAGR;AACF,GAEAQ,IAAed;"}
@@ -5,6 +5,7 @@
5
5
  @import '../../scss/font-settings';
6
6
 
7
7
  .error-wrapper {
8
+ position: relative;
8
9
  padding-bottom: getSpacer(m);
9
10
 
10
11
  @media (min-width: map.get($grid-breakpoints, md)) {
@@ -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
 
@@ -89,8 +89,13 @@
89
89
  &--closed:not(:hover, .expander-list-link--fill) {
90
90
  background-color: transparent;
91
91
  }
92
+
93
+ &--fill {
94
+ margin-top: getSpacer(s);
95
+ }
96
+
92
97
  &--closed#{&}--fill {
93
- margin: getSpacer(s) 0;
98
+ margin-bottom: getSpacer(s);
94
99
 
95
100
  &:not(:hover) {
96
101
  background-color: $neutral50;
@@ -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;
@@ -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,7 +1,8 @@
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
+ export type LabelTags = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'span';
5
6
  export interface NotificationPanelProps {
6
7
  /** Adds custom classes to the element. */
7
8
  className?: string;
@@ -29,6 +30,8 @@ export interface NotificationPanelProps {
29
30
  fluid?: boolean;
30
31
  /** Sets a label for the notification panel. */
31
32
  label?: string;
33
+ /** Changes the underlying element of the label. */
34
+ labelHtmlMarkup?: LabelTags;
32
35
  /** Close button aria-label */
33
36
  ariaLabelCloseBtn?: string;
34
37
  /** Custom id for the label */