@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
@@ -20,6 +20,7 @@ export type Styles = {
20
20
  'notification-panel--compact--basic': string;
21
21
  'notification-panel--compact--outline': string;
22
22
  'notification-panel--dismissable': string;
23
+ 'notification-panel--error': string;
23
24
  'notification-panel--info': string;
24
25
  'notification-panel--large': string;
25
26
  'notification-panel--medium': string;
@@ -1,101 +1,92 @@
1
- import e, { useState as R } from "react";
2
- import u from "classnames";
3
- import { useBreakpoint as w } from "../../hooks/useBreakpoint.js";
4
- import { useHover as h } from "../../hooks/useHover.js";
5
- import { useUuid as y } from "../../hooks/useUuid.js";
6
- import { getColor as I } from "../../theme/currys/color.js";
7
- import { breakpoints as M } from "../../theme/grid.js";
8
- import { palette as t } from "../../theme/palette.js";
9
- import { getAriaLabelAttributes as X } from "../../utils/accessibility.js";
10
- import F from "../Close/Close.js";
11
- import { Icon as n } from "../Icon/Icon.js";
12
- import { IconSize as N } from "../../constants.js";
13
- import L from "../Icons/CheckFill.js";
1
+ import e, { useState as h } from "react";
2
+ import p from "classnames";
3
+ import { useBreakpoint as z } from "../../hooks/useBreakpoint.js";
4
+ import { useHover as u } from "../../hooks/useHover.js";
5
+ import { useUuid as w } from "../../hooks/useUuid.js";
6
+ import { getColor as H } from "../../theme/currys/color.js";
7
+ import { breakpoints as L } from "../../theme/grid.js";
8
+ import { getAriaLabelAttributes as M } from "../../utils/accessibility.js";
9
+ import X from "../Badge/NotificationBadge.js";
10
+ import y from "../Close/Close.js";
11
+ import { Icon as C } from "../Icon/Icon.js";
12
+ import { IconSize as E } from "../../constants.js";
14
13
  import A from "../Icons/ChevronDown.js";
15
14
  import U from "../Icons/ChevronUp.js";
16
- import $ from "../Icons/ErrorSignFill.js";
17
- import j from "../Icons/Forward.js";
18
- import B from "../Icons/InfoSignFill.js";
19
- import q from "../Icons/TriangleX.js";
20
- import D from "../Icons/X.js";
21
- import r from "../ServiceMessage/styles.module.scss";
22
- const G = ({ label: c, variant: l, id: m, hasExpander: s, isExpanded: i, dismissable: g, onExpand: v, onDismiss: f, closeBtnText: _ }) => {
23
- const d = w(), { isHovered: o, hoverRef: p } = h(), a = d < M.lg ? N.XSmall : N.Small, C = {
24
- info: /* @__PURE__ */ e.createElement(n, { svgIcon: B, color: t.blueberry700, hoverColor: t.blueberry700, size: a, isHovered: o }),
25
- warn: /* @__PURE__ */ e.createElement(n, { svgIcon: $, color: t.banana700, hoverColor: t.banana700, size: a, isHovered: o }),
26
- alert: /* @__PURE__ */ e.createElement(n, { svgIcon: q, color: t.cherry700, hoverColor: t.cherry700, size: a, isHovered: o }),
27
- success: /* @__PURE__ */ e.createElement(n, { svgIcon: L, color: t.kiwi900, hoverColor: t.kiwi900, size: a, isHovered: o })
28
- }, b = s ? "button" : "span", E = u(
29
- r["service-message__label-container"],
30
- s && r["service-message__label-container--has-expander"]
15
+ import B from "../Icons/Forward.js";
16
+ import $ from "../Icons/X.js";
17
+ import s from "../ServiceMessage/styles.module.scss";
18
+ const j = ({ label: c, variant: t, id: m, hasExpander: r, isExpanded: i, dismissable: v, onExpand: l, onDismiss: _, closeBtnText: n }) => {
19
+ const g = z(), { isHovered: a, hoverRef: d } = u(), o = g < L.lg ? E.XSmall : E.Small, N = r ? "button" : "span", f = p(
20
+ s["service-message__label-container"],
21
+ r && s["service-message__label-container--has-expander"]
31
22
  );
32
- return /* @__PURE__ */ e.createElement("div", { className: E, ref: p }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__container"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__row"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__col"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__label"] }, C[l], /* @__PURE__ */ e.createElement("h1", { className: r["service-message__title"], id: m }, /* @__PURE__ */ e.createElement(
33
- b,
23
+ return /* @__PURE__ */ e.createElement("div", { className: f, ref: d }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__container"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__row"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__col"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__label"] }, /* @__PURE__ */ e.createElement(X, { variant: t == "alert" ? "error" : t, size: o, isHovered: a }), /* @__PURE__ */ e.createElement("h1", { className: s["service-message__title"], id: m }, /* @__PURE__ */ e.createElement(
24
+ N,
34
25
  {
35
- className: r["service-message__toggle"],
36
- onClick: s ? v : void 0,
37
- "aria-expanded": s ? i : void 0
26
+ className: s["service-message__toggle"],
27
+ onClick: r ? l : void 0,
28
+ "aria-expanded": r ? i : void 0
38
29
  },
39
30
  c
40
- )), s && /* @__PURE__ */ e.createElement(n, { size: a, svgIcon: i ? U : A, isHovered: o }), !s && g && /* @__PURE__ */ e.createElement(F, { onClick: f, ariaLabel: _, className: r["service-message__close"] }))))));
41
- }, J = ({ info: c, extraInfo: l, urlTitle: m, url: s, target: i, dismissable: g, closeBtnText: v, onDismiss: f }) => {
42
- const { hoverRef: _, isHovered: d } = h(), { hoverRef: o, isHovered: p } = h(), a = s && m;
43
- return /* @__PURE__ */ e.createElement("div", { className: r["service-message__container"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__row"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__col"] }, /* @__PURE__ */ e.createElement("div", { className: r["service-message__content"] }, c && /* @__PURE__ */ e.createElement("p", { className: r["service-message__info"] }, c), l && /* @__PURE__ */ e.createElement("p", { className: u(r["service-message__info"], r["service-message__info--extra"]) }, l), /* @__PURE__ */ e.createElement("div", { className: r["service-message__actions"] }, a && /* @__PURE__ */ e.createElement("a", { className: r["service-message__action"], href: s, ref: _, target: i }, m, /* @__PURE__ */ e.createElement(n, { size: N.XSmall, svgIcon: j, color: I("blueberry", 700), isHovered: d })), g && /* @__PURE__ */ e.createElement(
31
+ )), r && /* @__PURE__ */ e.createElement(C, { size: o, svgIcon: i ? U : A, isHovered: a }), !r && v && /* @__PURE__ */ e.createElement(y, { onClick: _, ariaLabel: n, className: s["service-message__close"] }))))));
32
+ }, F = ({ info: c, extraInfo: t, urlTitle: m, url: r, target: i, dismissable: v, closeBtnText: l, onDismiss: _ }) => {
33
+ const { hoverRef: n, isHovered: g } = u(), { hoverRef: a, isHovered: d } = u(), o = r && m;
34
+ return /* @__PURE__ */ e.createElement("div", { className: s["service-message__container"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__row"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__col"] }, /* @__PURE__ */ e.createElement("div", { className: s["service-message__content"] }, c && /* @__PURE__ */ e.createElement("p", { className: s["service-message__info"] }, c), t && /* @__PURE__ */ e.createElement("p", { className: p(s["service-message__info"], s["service-message__info--extra"]) }, t), /* @__PURE__ */ e.createElement("div", { className: s["service-message__actions"] }, o && /* @__PURE__ */ e.createElement("a", { className: s["service-message__action"], href: r, ref: n, target: i }, m, /* @__PURE__ */ e.createElement(C, { size: E.XSmall, svgIcon: B, color: H("blueberry", 700), isHovered: g })), v && /* @__PURE__ */ e.createElement(
44
35
  "button",
45
36
  {
46
- ref: o,
47
- className: u(r["service-message__action"], r["service-message__action--close"]),
48
- "aria-label": v,
49
- onClick: f
37
+ ref: a,
38
+ className: p(s["service-message__action"], s["service-message__action--close"]),
39
+ "aria-label": l,
40
+ onClick: _
50
41
  },
51
- v,
52
- /* @__PURE__ */ e.createElement(n, { size: N.XSmall, svgIcon: D, color: I("blueberry", 700), isHovered: p })
42
+ l,
43
+ /* @__PURE__ */ e.createElement(C, { size: E.XSmall, svgIcon: $, color: H("blueberry", 700), isHovered: d })
53
44
  ))))));
54
- }, K = ({
45
+ }, q = ({
55
46
  label: c,
56
- dismissable: l = !0,
47
+ dismissable: t = !0,
57
48
  onDismiss: m,
58
- info: s,
49
+ info: r,
59
50
  extraInfo: i,
60
- urlTitle: g,
61
- url: v,
62
- target: f = "_self",
63
- closeBtnText: _ = "fjern melding",
64
- expanderOpenFromStart: d = !1,
65
- variant: o = "alert",
66
- testId: p
51
+ urlTitle: v,
52
+ url: l,
53
+ target: _ = "_self",
54
+ closeBtnText: n = "fjern melding",
55
+ expanderOpenFromStart: g = !1,
56
+ variant: a = "error",
57
+ testId: d
67
58
  }) => {
68
- const [a, C] = R(d), b = y(), E = !!s || !!i, S = o === "alert" ? "alert" : "region", k = X({ label: c, id: b }), z = () => {
69
- E && C(!a);
70
- }, H = u(r["service-message"], r[`service-message--${o}`]);
71
- return /* @__PURE__ */ e.createElement("div", { className: H, role: S, ...k, "data-testid": p }, /* @__PURE__ */ e.createElement(
72
- G,
59
+ const [o, N] = h(g), f = w(), b = !!r || !!i, S = a === "alert" || a === "error" ? "alert" : "region", R = M({ label: c, id: f }), k = () => {
60
+ b && N(!o);
61
+ }, I = p(s["service-message"], s[`service-message--${a}`]);
62
+ return /* @__PURE__ */ e.createElement("div", { className: I, role: S, ...R, "data-testid": d }, /* @__PURE__ */ e.createElement(
63
+ j,
73
64
  {
74
65
  label: c,
75
- variant: o,
76
- id: b,
77
- hasExpander: E,
78
- isExpanded: a,
79
- dismissable: l,
80
- onExpand: z,
66
+ variant: a,
67
+ id: f,
68
+ hasExpander: b,
69
+ isExpanded: o,
70
+ dismissable: t,
71
+ onExpand: k,
81
72
  onDismiss: m,
82
- closeBtnText: _
73
+ closeBtnText: n
83
74
  }
84
- ), E && a && /* @__PURE__ */ e.createElement(
85
- J,
75
+ ), b && o && /* @__PURE__ */ e.createElement(
76
+ F,
86
77
  {
87
- info: s,
78
+ info: r,
88
79
  extraInfo: i,
89
- urlTitle: g,
90
- url: v,
91
- target: f,
92
- dismissable: l,
80
+ urlTitle: v,
81
+ url: l,
82
+ target: _,
83
+ dismissable: t,
93
84
  onDismiss: m,
94
- closeBtnText: _
85
+ closeBtnText: n
95
86
  }
96
87
  ));
97
- }, _e = K;
88
+ }, te = q;
98
89
  export {
99
- _e as default
90
+ te as default
100
91
  };
101
92
  //# sourceMappingURL=ServiceMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceMessage.js","sources":["../../../src/components/ServiceMessage/ServiceMessage.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { useBreakpoint } from '../../hooks/useBreakpoint';\nimport { useHover } from '../../hooks/useHover';\nimport { useUuid } from '../../hooks/useUuid';\nimport { getColor } from '../../theme/currys';\nimport { breakpoints } from '../../theme/grid';\nimport { palette } from '../../theme/palette';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport { AnchorLinkTargets } from '../AnchorLink';\nimport Close from '../Close';\nimport Icon, { IconSize } from '../Icon';\nimport CheckFill from '../Icons/CheckFill';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport ErrorSignFill from '../Icons/ErrorSignFill';\nimport Forward from '../Icons/Forward';\nimport InfoSignFill from '../Icons/InfoSignFill';\nimport TriangleX from '../Icons/TriangleX';\nimport X from '../Icons/X';\nimport { NotificationPanelVariants } from '../NotificationPanel';\n\nimport styles from './styles.module.scss';\n\ninterface LabelProps {\n label: string;\n variant: NotificationPanelVariants;\n id: string;\n hasExpander: boolean;\n isExpanded: boolean;\n dismissable: boolean;\n onExpand: () => void;\n onDismiss?: () => void;\n closeBtnText?: string;\n}\n\nconst Label: React.FC<LabelProps> = ({ label, variant, id, hasExpander, isExpanded, dismissable, onExpand, onDismiss, closeBtnText }) => {\n const breakpoint = useBreakpoint();\n const { isHovered, hoverRef } = useHover<HTMLDivElement>();\n\n const iconSize = breakpoint < breakpoints.lg ? IconSize.XSmall : IconSize.Small;\n const variantToIconMap = {\n info: (\n <Icon svgIcon={InfoSignFill} color={palette.blueberry700} hoverColor={palette.blueberry700} size={iconSize} isHovered={isHovered} />\n ),\n warn: <Icon svgIcon={ErrorSignFill} color={palette.banana700} hoverColor={palette.banana700} size={iconSize} isHovered={isHovered} />,\n alert: <Icon svgIcon={TriangleX} color={palette.cherry700} hoverColor={palette.cherry700} size={iconSize} isHovered={isHovered} />,\n success: <Icon svgIcon={CheckFill} color={palette.kiwi900} hoverColor={palette.kiwi900} size={iconSize} isHovered={isHovered} />,\n };\n const CustomTag = hasExpander ? 'button' : 'span';\n\n const labelContainerClasses = classNames(\n styles['service-message__label-container'],\n hasExpander && styles[`service-message__label-container--has-expander`]\n );\n\n return (\n <div className={labelContainerClasses} ref={hoverRef}>\n <div className={styles['service-message__container']}>\n <div className={styles['service-message__row']}>\n <div className={styles['service-message__col']}>\n <div className={styles['service-message__label']}>\n {variantToIconMap[variant]}\n <h1 className={styles['service-message__title']} id={id}>\n <CustomTag\n className={styles['service-message__toggle']}\n onClick={hasExpander ? onExpand : undefined}\n aria-expanded={hasExpander ? isExpanded : undefined}\n >\n {label}\n </CustomTag>\n </h1>\n {hasExpander && <Icon size={iconSize} svgIcon={isExpanded ? ChevronUp : ChevronDown} isHovered={isHovered} />}\n {!hasExpander && dismissable && (\n <Close onClick={onDismiss} ariaLabel={closeBtnText} className={styles['service-message__close']} />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\ninterface ContentProps {\n info?: string;\n extraInfo?: string;\n urlTitle?: string;\n url?: string;\n target?: AnchorLinkTargets;\n dismissable: boolean;\n onDismiss?: () => void;\n closeBtnText?: string;\n}\n\nconst Content: React.FC<ContentProps> = ({ info, extraInfo, urlTitle, url, target, dismissable, closeBtnText, onDismiss }) => {\n const { hoverRef: readMoreRef, isHovered: readMoreHoverRefIsHovered } = useHover<HTMLAnchorElement>();\n const { hoverRef: closeButtonRef, isHovered: closeButtonIsHovered } = useHover<HTMLButtonElement>();\n\n const hasUrl = url && urlTitle;\n\n return (\n <div className={styles['service-message__container']}>\n <div className={styles['service-message__row']}>\n <div className={styles['service-message__col']}>\n <div className={styles['service-message__content']}>\n {info && <p className={styles['service-message__info']}>{info}</p>}\n {extraInfo && (\n <p className={classNames(styles['service-message__info'], styles['service-message__info--extra'])}>{extraInfo}</p>\n )}\n <div className={styles['service-message__actions']}>\n {hasUrl && (\n <a className={styles['service-message__action']} href={url} ref={readMoreRef} target={target}>\n {urlTitle}\n <Icon size={IconSize.XSmall} svgIcon={Forward} color={getColor('blueberry', 700)} isHovered={readMoreHoverRefIsHovered} />\n </a>\n )}\n\n {dismissable && (\n <button\n ref={closeButtonRef}\n className={classNames(styles['service-message__action'], styles['service-message__action--close'])}\n aria-label={closeBtnText}\n onClick={onDismiss}\n >\n {closeBtnText}\n <Icon size={IconSize.XSmall} svgIcon={X} color={getColor('blueberry', 700)} isHovered={closeButtonIsHovered} />\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport interface ServiceMessageProps {\n /** Sets a label for the notification panel. */\n label: string;\n /** String displayed in service-message when expanded */\n info?: string;\n /** String displayed in service-message when expanded, with a smaller font */\n extraInfo?: string;\n /** function that runs on dismiss */\n onDismiss?: () => void;\n /** Allows for dismiss to be an option, also for ServiceMessage with only label as content */\n dismissable?: boolean;\n /** Makes expander be open from start. */\n expanderOpenFromStart?: boolean;\n /** Name that describes a url-link for the user*/\n urlTitle?: string;\n /** Url for further information*/\n url?: string;\n /** Sets target for the anchorlink to the url*/\n target?: AnchorLinkTargets;\n /** Text on close-button in service messages. */\n closeBtnText?: string;\n /** Changes the visual representation. */\n variant?: NotificationPanelVariants;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\nconst ServiceMessage: React.FC<ServiceMessageProps> = ({\n label,\n dismissable = true,\n onDismiss,\n info,\n extraInfo,\n urlTitle,\n url,\n target = '_self',\n closeBtnText = 'fjern melding',\n expanderOpenFromStart = false,\n variant = 'alert',\n testId,\n}) => {\n const [isExpanded, setIsExpanded] = useState<boolean>(expanderOpenFromStart);\n\n const labelId = useUuid();\n const hasExpander = !!info || !!extraInfo;\n\n const ariaRole = variant === 'alert' ? 'alert' : 'region';\n const ariaLabelAttributes = getAriaLabelAttributes({ label, id: labelId });\n\n const handleClick = (): void => {\n hasExpander && setIsExpanded(!isExpanded);\n };\n\n const classes = classNames(styles['service-message'], styles[`service-message--${variant}`]);\n\n return (\n <div className={classes} role={ariaRole} {...ariaLabelAttributes} data-testid={testId}>\n <Label\n label={label}\n variant={variant}\n id={labelId}\n hasExpander={hasExpander}\n isExpanded={isExpanded}\n dismissable={dismissable}\n onExpand={handleClick}\n onDismiss={onDismiss}\n closeBtnText={closeBtnText}\n />\n {hasExpander && isExpanded && (\n <Content\n info={info}\n extraInfo={extraInfo}\n urlTitle={urlTitle}\n url={url}\n target={target}\n dismissable={dismissable}\n onDismiss={onDismiss}\n closeBtnText={closeBtnText}\n />\n )}\n </div>\n );\n};\n\nexport default ServiceMessage;\n"],"names":["Label","label","variant","id","hasExpander","isExpanded","dismissable","onExpand","onDismiss","closeBtnText","breakpoint","useBreakpoint","isHovered","hoverRef","useHover","iconSize","breakpoints","IconSize","variantToIconMap","React","Icon","InfoSignFill","palette","ErrorSignFill","TriangleX","CheckFill","CustomTag","labelContainerClasses","classNames","styles","ChevronUp","ChevronDown","Close","Content","info","extraInfo","urlTitle","url","target","readMoreRef","readMoreHoverRefIsHovered","closeButtonRef","closeButtonIsHovered","hasUrl","Forward","getColor","X","ServiceMessage","expanderOpenFromStart","testId","setIsExpanded","useState","labelId","useUuid","ariaRole","ariaLabelAttributes","getAriaLabelAttributes","handleClick","classes","ServiceMessage$1"],"mappings":"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"}
1
+ {"version":3,"file":"ServiceMessage.js","sources":["../../../src/components/ServiceMessage/ServiceMessage.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { useBreakpoint } from '../../hooks/useBreakpoint';\nimport { useHover } from '../../hooks/useHover';\nimport { useUuid } from '../../hooks/useUuid';\nimport { getColor } from '../../theme/currys';\nimport { breakpoints } from '../../theme/grid';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport { AnchorLinkTargets } from '../AnchorLink';\nimport NotificationBadge from '../Badge/NotificationBadge';\nimport Close from '../Close';\nimport Icon, { IconSize } from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport Forward from '../Icons/Forward';\nimport X from '../Icons/X';\nimport { NotificationPanelVariants } from '../NotificationPanel';\n\nimport styles from './styles.module.scss';\n\ninterface LabelProps {\n label: string;\n variant: NotificationPanelVariants;\n id: string;\n hasExpander: boolean;\n isExpanded: boolean;\n dismissable: boolean;\n onExpand: () => void;\n onDismiss?: () => void;\n closeBtnText?: string;\n}\n\nconst Label: React.FC<LabelProps> = ({ label, variant, id, hasExpander, isExpanded, dismissable, onExpand, onDismiss, closeBtnText }) => {\n const breakpoint = useBreakpoint();\n const { isHovered, hoverRef } = useHover<HTMLDivElement>();\n\n const iconSize = breakpoint < breakpoints.lg ? IconSize.XSmall : IconSize.Small;\n const CustomTag = hasExpander ? 'button' : 'span';\n\n const labelContainerClasses = classNames(\n styles['service-message__label-container'],\n hasExpander && styles[`service-message__label-container--has-expander`]\n );\n\n return (\n <div className={labelContainerClasses} ref={hoverRef}>\n <div className={styles['service-message__container']}>\n <div className={styles['service-message__row']}>\n <div className={styles['service-message__col']}>\n <div className={styles['service-message__label']}>\n <NotificationBadge variant={variant == 'alert' ? 'error' : variant} size={iconSize} isHovered={isHovered} />\n <h1 className={styles['service-message__title']} id={id}>\n <CustomTag\n className={styles['service-message__toggle']}\n onClick={hasExpander ? onExpand : undefined}\n aria-expanded={hasExpander ? isExpanded : undefined}\n >\n {label}\n </CustomTag>\n </h1>\n {hasExpander && <Icon size={iconSize} svgIcon={isExpanded ? ChevronUp : ChevronDown} isHovered={isHovered} />}\n {!hasExpander && dismissable && (\n <Close onClick={onDismiss} ariaLabel={closeBtnText} className={styles['service-message__close']} />\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\ninterface ContentProps {\n info?: string;\n extraInfo?: string;\n urlTitle?: string;\n url?: string;\n target?: AnchorLinkTargets;\n dismissable: boolean;\n onDismiss?: () => void;\n closeBtnText?: string;\n}\n\nconst Content: React.FC<ContentProps> = ({ info, extraInfo, urlTitle, url, target, dismissable, closeBtnText, onDismiss }) => {\n const { hoverRef: readMoreRef, isHovered: readMoreHoverRefIsHovered } = useHover<HTMLAnchorElement>();\n const { hoverRef: closeButtonRef, isHovered: closeButtonIsHovered } = useHover<HTMLButtonElement>();\n\n const hasUrl = url && urlTitle;\n\n return (\n <div className={styles['service-message__container']}>\n <div className={styles['service-message__row']}>\n <div className={styles['service-message__col']}>\n <div className={styles['service-message__content']}>\n {info && <p className={styles['service-message__info']}>{info}</p>}\n {extraInfo && (\n <p className={classNames(styles['service-message__info'], styles['service-message__info--extra'])}>{extraInfo}</p>\n )}\n <div className={styles['service-message__actions']}>\n {hasUrl && (\n <a className={styles['service-message__action']} href={url} ref={readMoreRef} target={target}>\n {urlTitle}\n <Icon size={IconSize.XSmall} svgIcon={Forward} color={getColor('blueberry', 700)} isHovered={readMoreHoverRefIsHovered} />\n </a>\n )}\n\n {dismissable && (\n <button\n ref={closeButtonRef}\n className={classNames(styles['service-message__action'], styles['service-message__action--close'])}\n aria-label={closeBtnText}\n onClick={onDismiss}\n >\n {closeBtnText}\n <Icon size={IconSize.XSmall} svgIcon={X} color={getColor('blueberry', 700)} isHovered={closeButtonIsHovered} />\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport interface ServiceMessageProps {\n /** Sets a label for the notification panel. */\n label: string;\n /** String displayed in service-message when expanded */\n info?: string;\n /** String displayed in service-message when expanded, with a smaller font */\n extraInfo?: string;\n /** function that runs on dismiss */\n onDismiss?: () => void;\n /** Allows for dismiss to be an option, also for ServiceMessage with only label as content */\n dismissable?: boolean;\n /** Makes expander be open from start. */\n expanderOpenFromStart?: boolean;\n /** Name that describes a url-link for the user*/\n urlTitle?: string;\n /** Url for further information*/\n url?: string;\n /** Sets target for the anchorlink to the url*/\n target?: AnchorLinkTargets;\n /** Text on close-button in service messages. */\n closeBtnText?: string;\n /** Changes the visual representation. */\n variant?: NotificationPanelVariants;\n /** Sets the data-testid attribute. */\n testId?: string;\n}\n\nconst ServiceMessage: React.FC<ServiceMessageProps> = ({\n label,\n dismissable = true,\n onDismiss,\n info,\n extraInfo,\n urlTitle,\n url,\n target = '_self',\n closeBtnText = 'fjern melding',\n expanderOpenFromStart = false,\n variant = 'error',\n testId,\n}) => {\n const [isExpanded, setIsExpanded] = useState<boolean>(expanderOpenFromStart);\n\n const labelId = useUuid();\n const hasExpander = !!info || !!extraInfo;\n\n const ariaRole = variant === 'alert' || variant === 'error' ? 'alert' : 'region';\n const ariaLabelAttributes = getAriaLabelAttributes({ label, id: labelId });\n\n const handleClick = (): void => {\n hasExpander && setIsExpanded(!isExpanded);\n };\n\n const classes = classNames(styles['service-message'], styles[`service-message--${variant}`]);\n\n return (\n <div className={classes} role={ariaRole} {...ariaLabelAttributes} data-testid={testId}>\n <Label\n label={label}\n variant={variant}\n id={labelId}\n hasExpander={hasExpander}\n isExpanded={isExpanded}\n dismissable={dismissable}\n onExpand={handleClick}\n onDismiss={onDismiss}\n closeBtnText={closeBtnText}\n />\n {hasExpander && isExpanded && (\n <Content\n info={info}\n extraInfo={extraInfo}\n urlTitle={urlTitle}\n url={url}\n target={target}\n dismissable={dismissable}\n onDismiss={onDismiss}\n closeBtnText={closeBtnText}\n />\n )}\n </div>\n );\n};\n\nexport default ServiceMessage;\n"],"names":["Label","label","variant","id","hasExpander","isExpanded","dismissable","onExpand","onDismiss","closeBtnText","breakpoint","useBreakpoint","isHovered","hoverRef","useHover","iconSize","breakpoints","IconSize","CustomTag","labelContainerClasses","classNames","styles","React","NotificationBadge","Icon","ChevronUp","ChevronDown","Close","Content","info","extraInfo","urlTitle","url","target","readMoreRef","readMoreHoverRefIsHovered","closeButtonRef","closeButtonIsHovered","hasUrl","Forward","getColor","X","ServiceMessage","expanderOpenFromStart","testId","setIsExpanded","useState","labelId","useUuid","ariaRole","ariaLabelAttributes","getAriaLabelAttributes","handleClick","classes","ServiceMessage$1"],"mappings":"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"}
@@ -21,7 +21,7 @@ declare const meta: {
21
21
  url: string;
22
22
  target: "_parent";
23
23
  closeBtnText: string;
24
- variant: "alert";
24
+ variant: "error";
25
25
  testId: string;
26
26
  };
27
27
  argTypes: {
@@ -67,6 +67,19 @@
67
67
  }
68
68
  }
69
69
 
70
+ &--error {
71
+ background-color: $cherry50;
72
+
73
+ &:hover {
74
+ background-color: rgba-to-rgb(rgba($cherry500, 0.1), $cherry50);
75
+ }
76
+
77
+ &#{$servicemessage},
78
+ &#{$servicemessage}__label-container {
79
+ border-color: $cherry700;
80
+ }
81
+ }
82
+
70
83
  &__container {
71
84
  @include make-container;
72
85
  @include make-container-max-widths;
@@ -16,6 +16,7 @@ export type Styles = {
16
16
  'service-message__title': string;
17
17
  'service-message__toggle': string;
18
18
  'service-message--alert': string;
19
+ 'service-message--error': string;
19
20
  'service-message--info': string;
20
21
  'service-message--success': string;
21
22
  'service-message--warn': string;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { SvgIcon } from '../Icon';
3
+ import { IconName } from '../Icons/IconNames';
4
+ export interface TabProps {
5
+ /** Sets the tab panel content */
6
+ children?: React.ReactNode;
7
+ /** Optional icon on the tab */
8
+ icon?: SvgIcon | IconName;
9
+ /** Called when tab is selected */
10
+ onTabClick?: (index: number) => void;
11
+ /** Sets the data-testid attribute. */
12
+ testId?: string;
13
+ /** Title on the tab */
14
+ title?: string;
15
+ }
16
+ declare const Tab: React.FC<TabProps>;
17
+ export default Tab;
@@ -0,0 +1,6 @@
1
+ import e from "react";
2
+ const a = (t) => /* @__PURE__ */ e.createElement(e.Fragment, null, t.children ?? null), n = a;
3
+ export {
4
+ n as default
5
+ };
6
+ //# sourceMappingURL=Tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tab.js","sources":["../../../src/components/Tabs/Tab.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SvgIcon } from '../Icon';\nimport { IconName } from '../Icons/IconNames';\n\nexport interface TabProps {\n /** Sets the tab panel content */\n children?: React.ReactNode;\n /** Optional icon on the tab */\n icon?: SvgIcon | IconName;\n /** Called when tab is selected */\n onTabClick?: (index: number) => void;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Title on the tab */\n title?: string;\n}\n\nconst Tab: React.FC<TabProps> = props => {\n return <>{props.children ?? null}</>;\n};\n\nexport default Tab;\n"],"names":["Tab","props","React","Tab$1"],"mappings":";AAkBA,MAAMA,IAA0B,CAASC,MAChCC,gBAAAA,EAAA,cAAAA,EAAA,UAAA,MAAGD,EAAM,YAAY,IAAK,GAGnCE,IAAeH;"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { TabsColors, TabsType } from '../Tabs';
3
+ interface TabListProps {
4
+ children: React.ReactNode;
5
+ onTabListClick: (index: number) => void;
6
+ selectedTab: number;
7
+ color?: TabsColors;
8
+ type?: TabsType;
9
+ }
10
+ declare const TabList: React.FC<TabListProps>;
11
+ export default TabList;
@@ -0,0 +1,51 @@
1
+ import t, { useRef as p } from "react";
2
+ import u from "classnames";
3
+ import { useRovingFocus as N } from "../../../hooks/useRovingFocus.js";
4
+ import { palette as s } from "../../../theme/palette.js";
5
+ import { isComponent as $ } from "../../../utils/component.js";
6
+ import { uuid as L } from "../../../utils/uuid.js";
7
+ import { Icon as S } from "../../Icon/Icon.js";
8
+ import { IconSize as _ } from "../../../constants.js";
9
+ import g from "../../LazyIcon/LazyIcon.js";
10
+ import v from "../Tab.js";
11
+ import e from "../../Tabs/TabList/styles.module.scss";
12
+ const X = (d) => {
13
+ const { selectedTab: C, onTabListClick: i, children: n, color: k = "white", type: y = "normal" } = d, c = p(null), l = p(t.Children.map(n, () => t.createRef()));
14
+ N(i, l, c, !0);
15
+ const R = u(e["tab-list"], e[`tab-list--${y}`]), E = L();
16
+ return /* @__PURE__ */ t.createElement("ul", { className: R, ref: c, role: "tablist", "aria-orientation": "horizontal" }, t.Children.map(n, (m, o) => {
17
+ if ($(m, v)) {
18
+ const r = o === C, { title: b, onTabClick: f, icon: a, testId: T } = m.props, h = () => {
19
+ f && f(o), i(o);
20
+ }, z = u(e["tab-list__tab"], e[`tab-list__tab--${k}`], {
21
+ [e["tab-list__tab--selected"]]: r,
22
+ [e["tab-list__tab--first"]]: o == 0
23
+ }), I = l.current && l.current[o];
24
+ return /* @__PURE__ */ t.createElement("li", { role: "presentation" }, /* @__PURE__ */ t.createElement(
25
+ "button",
26
+ {
27
+ role: "tab",
28
+ "aria-selected": r,
29
+ onClick: h,
30
+ className: z,
31
+ key: `${b}-${E}`,
32
+ "data-testid": T,
33
+ ref: I
34
+ },
35
+ /* @__PURE__ */ t.createElement("span", { className: e["tab-list__tab__title-and-icon"] }, a && (typeof a == "string" ? /* @__PURE__ */ t.createElement(
36
+ g,
37
+ {
38
+ iconName: a,
39
+ size: _.XSmall,
40
+ color: r ? s.black : s.blueberry500
41
+ }
42
+ ) : /* @__PURE__ */ t.createElement(S, { svgIcon: a, size: _.XSmall, color: r ? s.black : s.blueberry500 })), b)
43
+ ));
44
+ }
45
+ return null;
46
+ }));
47
+ }, M = X;
48
+ export {
49
+ M as default
50
+ };
51
+ //# sourceMappingURL=TabList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabList.js","sources":["../../../../src/components/Tabs/TabList/TabList.tsx"],"sourcesContent":["import React, { useRef } from 'react';\n\nimport classNames from 'classnames';\n\nimport { useRovingFocus } from '../../../hooks/useRovingFocus';\nimport { palette } from '../../../theme/palette';\nimport { isComponent } from '../../../utils/component';\nimport uuid from '../../../utils/uuid';\nimport Icon, { IconSize } from '../../Icon';\nimport { IconName } from '../../Icons/IconNames';\nimport LazyIcon from '../../LazyIcon';\nimport Tab from '../Tab';\nimport { TabsColors, TabsType } from '../Tabs';\n\nimport styles from './styles.module.scss';\ninterface TabListProps {\n children: React.ReactNode;\n onTabListClick: (index: number) => void;\n selectedTab: number;\n color?: TabsColors;\n type?: TabsType;\n}\n\nconst TabList: React.FC<TabListProps> = props => {\n const { selectedTab, onTabListClick, children, color = 'white', type = 'normal' } = props;\n\n const listRef = useRef<HTMLUListElement>(null);\n\n const tabRefs = useRef(React.Children.map(children, () => React.createRef<HTMLButtonElement>()));\n useRovingFocus(onTabListClick, tabRefs, listRef, true);\n\n const tablistClasses = classNames(styles['tab-list'], styles[`tab-list--${type}`]);\n\n const id = uuid();\n\n return (\n <ul className={tablistClasses} ref={listRef} role=\"tablist\" aria-orientation=\"horizontal\">\n {React.Children.map(children, (child, index) => {\n if (isComponent(child, Tab)) {\n const isSelected = index === selectedTab;\n const { title, onTabClick, icon, testId } = child.props;\n const handleClick = (): void => {\n onTabClick && onTabClick(index);\n onTabListClick(index);\n };\n const tabButtonClasses = classNames(styles['tab-list__tab'], styles[`tab-list__tab--${color}`], {\n [styles['tab-list__tab--selected']]: isSelected,\n [styles['tab-list__tab--first']]: index == 0,\n });\n\n const currentRef = tabRefs.current && tabRefs.current[index];\n\n return (\n <li role=\"presentation\">\n <button\n role=\"tab\"\n aria-selected={isSelected}\n onClick={handleClick}\n className={tabButtonClasses}\n key={`${title}-${id}`}\n data-testid={testId}\n ref={currentRef as React.RefObject<HTMLButtonElement>}\n >\n <span className={styles['tab-list__tab__title-and-icon']}>\n {icon &&\n (typeof icon === 'string' ? (\n <LazyIcon\n iconName={icon as IconName}\n size={IconSize.XSmall}\n color={isSelected ? palette[`black`] : palette['blueberry500']}\n />\n ) : (\n <Icon svgIcon={icon} size={IconSize.XSmall} color={isSelected ? palette[`black`] : palette['blueberry500']} />\n ))}\n {title}\n </span>\n </button>\n </li>\n );\n }\n return null;\n })}\n </ul>\n );\n};\n\nexport default TabList;\n"],"names":["TabList","props","selectedTab","onTabListClick","children","color","type","listRef","useRef","tabRefs","React","useRovingFocus","tablistClasses","classNames","styles","id","uuid","child","index","isComponent","Tab","isSelected","title","onTabClick","icon","testId","handleClick","tabButtonClasses","currentRef","LazyIcon","IconSize","palette","Icon","TabList$1"],"mappings":";;;;;;;;;;;AAuBA,MAAMA,IAAkC,CAASC,MAAA;AACzC,QAAA,EAAE,aAAAC,GAAa,gBAAAC,GAAgB,UAAAC,GAAU,OAAAC,IAAQ,SAAS,MAAAC,IAAO,SAAa,IAAAL,GAE9EM,IAAUC,EAAyB,IAAI,GAEvCC,IAAUD,EAAOE,EAAM,SAAS,IAAIN,GAAU,MAAMM,EAAM,UAA8B,CAAA,CAAC;AAChF,EAAAC,EAAAR,GAAgBM,GAASF,GAAS,EAAI;AAE/C,QAAAK,IAAiBC,EAAWC,EAAO,UAAU,GAAGA,EAAO,aAAaR,CAAI,EAAE,CAAC,GAE3ES,IAAKC;AAEX,yCACG,MAAG,EAAA,WAAWJ,GAAgB,KAAKL,GAAS,MAAK,WAAU,oBAAiB,aAAA,GAC1EG,EAAM,SAAS,IAAIN,GAAU,CAACa,GAAOC,MAAU;AAC1C,QAAAC,EAAYF,GAAOG,CAAG,GAAG;AAC3B,YAAMC,IAAaH,MAAUhB,GACvB,EAAE,OAAAoB,GAAO,YAAAC,GAAY,MAAAC,GAAM,QAAAC,MAAWR,EAAM,OAC5CS,IAAc,MAAY;AAC9B,QAAAH,KAAcA,EAAWL,CAAK,GAC9Bf,EAAee,CAAK;AAAA,MAAA,GAEhBS,IAAmBd,EAAWC,EAAO,eAAe,GAAGA,EAAO,kBAAkBT,CAAK,EAAE,GAAG;AAAA,QAC9F,CAACS,EAAO,yBAAyB,CAAC,GAAGO;AAAA,QACrC,CAACP,EAAO,sBAAsB,CAAC,GAAGI,KAAS;AAAA,MAAA,CAC5C,GAEKU,IAAanB,EAAQ,WAAWA,EAAQ,QAAQS,CAAK;AAGzD,aAAAR,gBAAAA,EAAA,cAAC,MAAG,EAAA,MAAK,eACP,GAAAA,gBAAAA,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,iBAAeW;AAAA,UACf,SAASK;AAAA,UACT,WAAWC;AAAA,UACX,KAAK,GAAGL,CAAK,IAAIP,CAAE;AAAA,UACnB,eAAaU;AAAA,UACb,KAAKG;AAAA,QAAA;AAAA,QAELlB,gBAAAA,EAAA,cAAC,UAAK,WAAWI,EAAO,+BAA+B,EACpD,GAAAU,MACE,OAAOA,KAAS,WACfd,gBAAAA,EAAA;AAAA,UAACmB;AAAA,UAAA;AAAA,YACC,UAAUL;AAAA,YACV,MAAMM,EAAS;AAAA,YACf,OAAOT,IAAaU,EAAQ,QAAWA,EAAQ;AAAA,UAAc;AAAA,QAAA,IAG9DrB,gBAAAA,EAAA,cAAAsB,GAAA,EAAK,SAASR,GAAM,MAAMM,EAAS,QAAQ,OAAOT,IAAaU,EAAQ,QAAWA,EAAQ,aAAc,CAAG,IAE/GT,CACH;AAAA,MAAA,CAEJ;AAAA,IAEJ;AACO,WAAA;AAAA,EACR,CAAA,CACH;AAEJ,GAEAW,IAAejC;"}
@@ -0,0 +1,3 @@
1
+ import TabList from './TabList';
2
+ export * from './TabList';
3
+ export default TabList;
@@ -0,0 +1,5 @@
1
+ import a from "./TabList.js";
2
+ export {
3
+ a as default
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,109 @@
1
+ @import '../../../scss/supernova/styles/colors';
2
+
3
+ .tab-list {
4
+ $tab-list: &;
5
+ $colors: 'blueberry', 'neutral', 'white';
6
+
7
+ display: flex;
8
+ flex-direction: row;
9
+ gap: 0.25rem;
10
+ list-style-type: none;
11
+ white-space: nowrap;
12
+ overflow-x: initial;
13
+ overflow-y: initial;
14
+ height: 3rem;
15
+ z-index: 0;
16
+ margin: 0;
17
+ margin-bottom: -1px;
18
+
19
+ &__tab {
20
+ display: flex;
21
+ align-items: start;
22
+ background-color: transparent;
23
+ height: 3rem;
24
+ text-align: start;
25
+ font-size: 1.25rem;
26
+ text-decoration: none;
27
+ padding: 0.5rem 1.5rem;
28
+ color: var(--color-action-text-onlight);
29
+ border: 1px solid var(--color-action-border-onlight);
30
+ border-bottom: 0;
31
+ border-radius: 0.5rem 0.5rem 0 0;
32
+ position: relative;
33
+ z-index: 0;
34
+
35
+ @each $color in $colors {
36
+ &--#{$color} {
37
+ background-color: var(--color-base-background-#{$color});
38
+ }
39
+ }
40
+
41
+ &--selected {
42
+ overflow: visible;
43
+ z-index: 2;
44
+ border-color: var(--color-action-border-onlight-focus);
45
+ color: var(--color-base-text-onlight);
46
+ background-color: var(--color-base-background-white);
47
+ }
48
+
49
+ &__title-and-icon {
50
+ display: flex;
51
+ flex-flow: row nowrap;
52
+ align-items: center;
53
+ gap: 0.5rem;
54
+ height: 2rem;
55
+ }
56
+ }
57
+
58
+ &--normal {
59
+ padding-left: 1rem;
60
+ }
61
+
62
+ &--framed {
63
+ padding-left: 0;
64
+
65
+ #{$tab-list}__tab {
66
+ background-color: var(--color-base-background-white);
67
+
68
+ &--first {
69
+ // This is in order to look nice when the first tab is not selected
70
+ height: 3.5rem;
71
+ }
72
+
73
+ &--selected {
74
+ height: 3rem;
75
+ }
76
+ }
77
+
78
+ @each $color in $colors {
79
+ .tab-list__tab--selected#{$tab-list}__tab--#{$color} {
80
+ background-color: var(--color-base-background-#{$color});
81
+ }
82
+ }
83
+ }
84
+
85
+ // Because the button states should be the same for all types
86
+ .tab-list__tab {
87
+ &:hover {
88
+ background-color: var(--color-action-background-ondark-hover);
89
+
90
+ &#{$tab-list}__tab--blueberry {
91
+ background-color: var(--color-action-background-ondark-selected);
92
+ }
93
+ }
94
+
95
+ &:active {
96
+ background-color: var(--color-action-background-ondark-selected);
97
+
98
+ &#{$tab-list}__tab--blueberry {
99
+ background-color: var(--color-action-background-ondark-hoverselected);
100
+ }
101
+ }
102
+
103
+ &:focus-visible {
104
+ background-color: var(--color-base-background-blueberry);
105
+ outline: 4px solid var(--color-action-border-onlight-focus);
106
+ outline-offset: -4px;
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,18 @@
1
+ export type Styles = {
2
+ 'tab-list': string;
3
+ 'tab-list__tab': string;
4
+ 'tab-list__tab__title-and-icon': string;
5
+ 'tab-list__tab--blueberry': string;
6
+ 'tab-list__tab--first': string;
7
+ 'tab-list__tab--neutral': string;
8
+ 'tab-list__tab--selected': string;
9
+ 'tab-list__tab--white': string;
10
+ 'tab-list--framed': string;
11
+ 'tab-list--normal': string;
12
+ };
13
+
14
+ export type ClassNames = keyof Styles;
15
+
16
+ declare const styles: Styles;
17
+
18
+ export default styles;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { TabsColors, TabsType } from '../Tabs';
3
+ interface TabPanelProps {
4
+ color?: TabsColors;
5
+ type?: TabsType;
6
+ isFirst?: boolean;
7
+ }
8
+ declare const TabPanel: React.FC<TabPanelProps>;
9
+ export default TabPanel;
@@ -0,0 +1,13 @@
1
+ import r from "react";
2
+ import o from "classnames";
3
+ import a from "../../Tabs/TabPanel/styles.module.scss";
4
+ const m = ({ children: e, color: t = "white", type: l = "normal", isFirst: s = !1 }) => {
5
+ const n = o(a["tab-panel"], a[`tab-panel--${t}`], a[`tab-panel--${l}`], {
6
+ [a["tab-panel--first"]]: s
7
+ });
8
+ return /* @__PURE__ */ r.createElement("div", { className: n }, e);
9
+ }, f = m;
10
+ export {
11
+ f as default
12
+ };
13
+ //# sourceMappingURL=TabPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabPanel.js","sources":["../../../../src/components/Tabs/TabPanel/TabPanel.tsx"],"sourcesContent":["import React from 'react';\n\nimport classNames from 'classnames';\n\nimport { TabsColors, TabsType } from '../Tabs';\n\nimport styles from './styles.module.scss';\n\ninterface TabPanelProps {\n color?: TabsColors;\n type?: TabsType;\n isFirst?: boolean;\n}\n\nconst TabPanel: React.FC<TabPanelProps> = ({ children, color = 'white', type = 'normal', isFirst = false }) => {\n const tabPanelClasses = classNames(styles['tab-panel'], styles[`tab-panel--${color}`], styles[`tab-panel--${type}`], {\n [styles['tab-panel--first']]: isFirst,\n });\n return <div className={tabPanelClasses}>{children}</div>;\n};\n\nexport default TabPanel;\n"],"names":["TabPanel","children","color","type","isFirst","tabPanelClasses","classNames","styles","React","TabPanel$1"],"mappings":";;;AAcA,MAAMA,IAAoC,CAAC,EAAE,UAAAC,GAAU,OAAAC,IAAQ,SAAS,MAAAC,IAAO,UAAU,SAAAC,IAAU,SAAY;AAC7G,QAAMC,IAAkBC,EAAWC,EAAO,WAAW,GAAGA,EAAO,cAAcL,CAAK,EAAE,GAAGK,EAAO,cAAcJ,CAAI,EAAE,GAAG;AAAA,IACnH,CAACI,EAAO,kBAAkB,CAAC,GAAGH;AAAA,EAAA,CAC/B;AACD,SAAQI,gBAAAA,EAAA,cAAA,OAAA,EAAI,WAAWH,EAAA,GAAkBJ,CAAS;AACpD,GAEAQ,IAAeT;"}
@@ -0,0 +1,3 @@
1
+ import TabPanel from './TabPanel';
2
+ export * from './TabPanel';
3
+ export default TabPanel;
@@ -0,0 +1,5 @@
1
+ import e from "./TabPanel.js";
2
+ export {
3
+ e as default
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,37 @@
1
+ @use 'sass:map';
2
+ @import '../../../scss/spacers';
3
+ @import '../../../scss/palette';
4
+ @import '../../../scss/font-settings';
5
+ @import '../../../scss/breakpoints';
6
+ @import '../../../scss/supernova/styles/colors';
7
+
8
+ .tab-panel {
9
+ $tab-panel: &;
10
+
11
+ border-top: 1px solid var(--color-action-border-onlight-focus);
12
+ padding: 2rem;
13
+ position: relative;
14
+ z-index: 1;
15
+
16
+ $colors: 'blueberry', 'neutral', 'white';
17
+
18
+ &--normal {
19
+ padding: 0;
20
+ }
21
+
22
+ &--framed {
23
+ padding: 2rem;
24
+ border: 1px solid var(--color-action-border-onlight-focus);
25
+ border-radius: 0.5rem;
26
+
27
+ &#{$tab-panel}--first {
28
+ border-radius: 0 0.5rem 0.5rem;
29
+ }
30
+
31
+ @each $color in $colors {
32
+ &#{$tab-panel}--#{$color} {
33
+ background-color: var(--color-base-background-#{$color});
34
+ }
35
+ }
36
+ }
37
+ }