@helsenorge/designsystem-react 12.0.0-beta.1 → 12.0.0-beta.2

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 (155) hide show
  1. package/CHANGELOG.md +90 -9
  2. package/Checkbox.js +1 -1
  3. package/Checkbox.js.map +1 -1
  4. package/Duolist.js +92 -0
  5. package/Duolist.js.map +1 -0
  6. package/ElementHeader.js +150 -0
  7. package/ElementHeader.js.map +1 -0
  8. package/ElementHeaderText.js +35 -0
  9. package/ElementHeaderText.js.map +1 -0
  10. package/HelpDetails.js +1 -1
  11. package/HelpDetails.js.map +1 -1
  12. package/HelpTriggerIcon.js +4 -4
  13. package/HelpTriggerIcon.js.map +1 -1
  14. package/HelpTriggerStandalone.js +5 -2
  15. package/HelpTriggerStandalone.js.map +1 -1
  16. package/Highlighter.js +44 -0
  17. package/Highlighter.js.map +1 -0
  18. package/LazyIcon.js +1 -1
  19. package/LazyIcon.js.map +1 -1
  20. package/LinkList.js +47 -9
  21. package/LinkList.js.map +1 -1
  22. package/NotificationBadge.js +1 -1
  23. package/NotificationBadge.js.map +1 -1
  24. package/Panel.js +38 -18
  25. package/Panel.js.map +1 -1
  26. package/PanelTitle.js +3 -2
  27. package/PanelTitle.js.map +1 -1
  28. package/PopOver.js +6 -0
  29. package/PopOver.js.map +1 -1
  30. package/StatusDot.js +15 -6
  31. package/StatusDot.js.map +1 -1
  32. package/StatusDotMultiComposition.js +27 -0
  33. package/StatusDotMultiComposition.js.map +1 -0
  34. package/components/AnchorLink/styles.module.scss +7 -7
  35. package/components/ArticleTeaser/styles.module.scss +7 -3
  36. package/components/Checkbox/styles.module.scss +7 -1
  37. package/components/Checkbox/styles.module.scss.d.ts +1 -0
  38. package/components/Close/styles.module.scss +10 -6
  39. package/components/DictionaryTrigger/styles.module.scss +12 -5
  40. package/components/Dropdown/styles.module.scss +9 -1
  41. package/components/Duolist/index.js +3 -88
  42. package/components/Duolist/index.js.map +1 -1
  43. package/components/ElementHeader/ElementHeader.d.ts +59 -0
  44. package/components/ElementHeader/ElementHeaderText/ElementHeaderText.d.ts +25 -0
  45. package/components/ElementHeader/ElementHeaderText/index.d.ts +3 -0
  46. package/components/ElementHeader/ElementHeaderText/index.js +6 -0
  47. package/components/ElementHeader/StatusDotMultiComposition/StatusDotMultiComposition.d.ts +23 -0
  48. package/components/ElementHeader/StatusDotMultiComposition/index.d.ts +3 -0
  49. package/components/ElementHeader/StatusDotMultiComposition/index.js +6 -0
  50. package/components/{ListHeader → ElementHeader/StatusDotMultiComposition}/index.js.map +1 -1
  51. package/components/ElementHeader/StatusDotMultiComposition/styles.module.scss +28 -0
  52. package/components/ElementHeader/StatusDotMultiComposition/styles.module.scss.d.ts +11 -0
  53. package/components/ElementHeader/index.d.ts +3 -0
  54. package/components/ElementHeader/index.js +9 -0
  55. package/components/ElementHeader/index.js.map +1 -0
  56. package/components/{ListHeader → ElementHeader}/styles.module.scss +46 -9
  57. package/components/ElementHeader/styles.module.scss.d.ts +22 -0
  58. package/components/ExpanderList/ExpanderList.d.ts +9 -2
  59. package/components/ExpanderList/index.js +40 -23
  60. package/components/ExpanderList/index.js.map +1 -1
  61. package/components/ExpanderList/styles.module.scss +288 -47
  62. package/components/ExpanderList/styles.module.scss.d.ts +22 -2
  63. package/components/HelpBubble/HelpBubble.d.ts +7 -0
  64. package/components/HelpBubble/index.js +43 -8
  65. package/components/HelpBubble/index.js.map +1 -1
  66. package/components/HelpBubble/resourceHelper.d.ts +3 -0
  67. package/components/HelpBubble/styles.module.scss +0 -2
  68. package/components/HelpDetails/styles.module.scss +3 -2
  69. package/components/HelpDrawer/HelpDrawer.d.ts +3 -0
  70. package/components/HelpDrawer/index.js +31 -1
  71. package/components/HelpDrawer/index.js.map +1 -1
  72. package/components/HelpDrawer/resourceHelper.d.ts +3 -0
  73. package/components/HelpDrawer/styles.module.scss +1 -11
  74. package/components/HelpDrawer/styles.module.scss.d.ts +0 -1
  75. package/components/HelpPanel/styles.module.scss +2 -2
  76. package/components/HelpTeaser/styles.module.scss +5 -5
  77. package/components/HelpTooltip/HelpTooltip.d.ts +2 -2
  78. package/components/HelpTooltip/index.js.map +1 -1
  79. package/components/HelpTriggerIcon/HelpTriggerIcon.d.ts +4 -0
  80. package/components/HelpTriggerIcon/styles.module.scss +10 -10
  81. package/components/HelpTriggerInline/index.js +5 -2
  82. package/components/HelpTriggerInline/index.js.map +1 -1
  83. package/components/HelpTriggerInline/styles.module.scss +8 -4
  84. package/components/HelpTriggerStandalone/styles.module.scss +8 -4
  85. package/components/Highlighter/Highlighter.d.ts +7 -0
  86. package/components/Highlighter/Highlighter.test.d.ts +1 -0
  87. package/components/Highlighter/index.d.ts +3 -0
  88. package/components/Highlighter/index.js +6 -0
  89. package/components/Highlighter/index.js.map +1 -0
  90. package/components/Highlighter/styles.module.scss +4 -0
  91. package/components/Highlighter/styles.module.scss.d.ts +9 -0
  92. package/components/Icons/AdditionalIconInformation.d.ts +4 -0
  93. package/components/Icons/AdditionalIconInformation.js +2 -1
  94. package/components/Icons/AdditionalIconInformation.js.map +1 -1
  95. package/components/Icons/DotActive.d.ts +4 -0
  96. package/components/Icons/DotActive.js +16 -0
  97. package/components/Icons/DotActive.js.map +1 -0
  98. package/components/Icons/DotInactive.d.ts +4 -0
  99. package/components/Icons/DotInactive.js +30 -0
  100. package/components/Icons/DotInactive.js.map +1 -0
  101. package/components/Icons/DotPending.d.ts +4 -0
  102. package/components/Icons/DotPending.js +16 -0
  103. package/components/Icons/DotPending.js.map +1 -0
  104. package/components/Icons/IconNames.d.ts +1 -1
  105. package/components/Icons/IconNames.js +4 -0
  106. package/components/Icons/IconNames.js.map +1 -1
  107. package/components/Icons/TreatmentAids.d.ts +4 -0
  108. package/components/Icons/TreatmentAids.js +41 -0
  109. package/components/Icons/TreatmentAids.js.map +1 -0
  110. package/components/LinkList/LinkList.d.ts +9 -2
  111. package/components/LinkList/styles.module.scss +70 -0
  112. package/components/LinkList/styles.module.scss.d.ts +11 -0
  113. package/components/NotificationPanel/styles.module.scss +1 -1
  114. package/components/Panel/Panel.d.ts +16 -8
  115. package/components/Panel/PanelTitle/PanelTitle.d.ts +3 -1
  116. package/components/Panel/styles.module.scss +10 -1
  117. package/components/Panel/styles.module.scss.d.ts +2 -0
  118. package/components/PanelList/PanelList.d.ts +2 -0
  119. package/components/PanelList/index.js +3 -2
  120. package/components/PanelList/index.js.map +1 -1
  121. package/components/PopOver/PopOver.d.ts +4 -0
  122. package/components/PopOver/styles.module.scss +6 -3
  123. package/components/PopOver/styles.module.scss.d.ts +1 -0
  124. package/components/RadioButton/styles.module.scss +7 -1
  125. package/components/StatusDot/StatusDot.d.ts +6 -2
  126. package/components/StatusDot/index.js +3 -3
  127. package/components/StatusDot/styles.module.scss +12 -6
  128. package/components/StatusDot/styles.module.scss.d.ts +3 -0
  129. package/components/Step/Step.d.ts +4 -0
  130. package/components/Step/index.js +5 -2
  131. package/components/Step/index.js.map +1 -1
  132. package/components/Toggle/index.js +2 -1
  133. package/components/Toggle/index.js.map +1 -1
  134. package/constants.d.ts +1 -0
  135. package/constants.js +1 -0
  136. package/constants.js.map +1 -1
  137. package/designsystem-react.css +1 -1
  138. package/package.json +1 -1
  139. package/resources/HN.Designsystem.HelpBubble.nb-NO.json.d.ts +6 -0
  140. package/resources/HN.Designsystem.HelpDrawer.nb-NO.json.d.ts +6 -0
  141. package/scss/helsenorge.scss +2 -0
  142. package/scss/supernova/styles/colors.css +1 -1
  143. package/scss/typography.stories.tsx +1 -1
  144. package/ListHeader.js +0 -94
  145. package/ListHeader.js.map +0 -1
  146. package/ListHeaderText.js +0 -39
  147. package/ListHeaderText.js.map +0 -1
  148. package/components/ListHeader/ListHeader.d.ts +0 -43
  149. package/components/ListHeader/ListHeaderText/ListHeaderText.d.ts +0 -26
  150. package/components/ListHeader/ListHeaderText/index.d.ts +0 -3
  151. package/components/ListHeader/ListHeaderText/index.js +0 -6
  152. package/components/ListHeader/index.d.ts +0 -4
  153. package/components/ListHeader/index.js +0 -11
  154. package/components/ListHeader/styles.module.scss.d.ts +0 -21
  155. /package/components/{ListHeader/ListHeaderText → ElementHeader/ElementHeaderText}/index.js.map +0 -0
@@ -7,9 +7,10 @@ import { usePseudoClasses } from "../../hooks/usePseudoClasses.js";
7
7
  import { useUuid } from "../../hooks/useUuid.js";
8
8
  import { mergeRefs } from "../../utils/refs.js";
9
9
  import { isElementInViewport } from "../../utils/viewport.js";
10
+ import { r as renderElementHeader } from "../../ElementHeader.js";
11
+ import { H as Highlighter } from "../../Highlighter.js";
10
12
  import ChevronDown from "../Icons/ChevronDown.js";
11
13
  import ChevronUp from "../Icons/ChevronUp.js";
12
- import { r as renderListHeader } from "../../ListHeader.js";
13
14
  import expanderListStyles from "./styles.module.scss";
14
15
  const Expander = React__default.forwardRef((props, ref) => {
15
16
  const {
@@ -28,7 +29,9 @@ const Expander = React__default.forwardRef((props, ref) => {
28
29
  onExpand,
29
30
  renderChildrenWhenClosed,
30
31
  variant = "line",
31
- zIndex = 0
32
+ zIndex = 0,
33
+ highlightText,
34
+ status = "none"
32
35
  } = props;
33
36
  const [isExpanded] = useExpand(expanded, onExpand);
34
37
  const expanderRef = useRef(null);
@@ -42,34 +45,41 @@ const Expander = React__default.forwardRef((props, ref) => {
42
45
  [expanderListStyles[`expander-list__item--fill`]]: isFill,
43
46
  [expanderListStyles[`expander-list__item--fill--${color}`]]: isFill,
44
47
  [expanderListStyles[`expander-list__item--fill-negative`]]: isFillNegative,
48
+ [expanderListStyles[`expander-list__item--fill-negative--${color}`]]: isFillNegative,
45
49
  [expanderListStyles["expander-list__item--outline"]]: isOutline,
46
50
  [expanderListStyles[`expander-list__item--outline--${color}`]]: isOutline,
47
51
  [expanderListStyles["expander-list__item--line"]]: isLine,
48
- [expanderListStyles[`expander-list__item--line--${color}`]]: isLine
52
+ [expanderListStyles[`expander-list__item--line--${color}`]]: isLine,
53
+ [expanderListStyles[`expander-list__item--new`]]: status === "new"
49
54
  });
50
55
  const expanderClasses = classNames(expanderListStyles["expander-list-link"], expanderListStyles[`expander-list-link--${color}`], {
51
- [expanderListStyles[`expander-list-link--fill`]]: isFill,
52
56
  [expanderListStyles[`expander-list-link--fill--${color}`]]: isFill,
53
57
  [expanderListStyles[`expander-list-link--fill-negative`]]: isFillNegative,
58
+ [expanderListStyles[`expander-list-link--fill-negative--${color}`]]: isFillNegative,
54
59
  [expanderListStyles["expander-list-link--outline"]]: isOutline,
55
60
  [expanderListStyles[`expander-list-link--outline--${color}`]]: isOutline,
56
61
  [expanderListStyles[`expander-list-link--line--${color}`]]: isLine,
57
- [expanderListStyles["expander-list-link--closed"]]: !isExpanded,
58
62
  [expanderListStyles["expander-list-link--open"]]: isExpanded,
59
- [expanderListStyles["expander-list-link--large"]]: large
63
+ [expanderListStyles["expander-list-link--large"]]: large,
64
+ [expanderListStyles[`expander-list-link--new`]]: status === "new"
60
65
  });
61
66
  const renderContent = () => {
62
67
  if (!renderChildrenWhenClosed && !isExpanded) {
63
68
  return null;
64
69
  }
65
- const mainContentClasses = classNames(
66
- expanderListStyles["expander-list-link__main-content"],
67
- isExpanded && expanderListStyles["expander-list-link__main-content--expanded"],
68
- padding ? expanderListStyles["expander-list-link__main-content--padding"] : ""
69
- );
70
- return /* @__PURE__ */ jsx("div", { className: mainContentClasses, children });
70
+ const mainContentClasses = classNames(expanderListStyles["expander-list-link__main-content"], {
71
+ [expanderListStyles["expander-list-link__main-content--expanded"]]: isExpanded,
72
+ [expanderListStyles["expander-list-link__main-content--padding"]]: padding,
73
+ [expanderListStyles[`expander-list-link__main-content--outline--${color}`]]: isOutline,
74
+ [expanderListStyles[`expander-list-link__main-content--new`]]: status === "new"
75
+ });
76
+ return /* @__PURE__ */ jsx("div", { className: mainContentClasses, "data-state": isExpanded ? "open" : "closed", children: /* @__PURE__ */ jsx(Highlighter, { searchText: highlightText, children }) });
71
77
  };
78
+ const statusMarkerClasses = classNames(expanderListStyles["expander-list__item__status-marker"], {
79
+ [expanderListStyles["expander-list__item__status-marker--new"]]: status === "new"
80
+ });
72
81
  return /* @__PURE__ */ jsxs("li", { className: itemClasses, ref: mergeRefs([ref, expanderRef]), children: [
82
+ status !== "none" && /* @__PURE__ */ jsx("div", { className: statusMarkerClasses }),
73
83
  /* @__PURE__ */ jsx(
74
84
  "button",
75
85
  {
@@ -84,14 +94,15 @@ const Expander = React__default.forwardRef((props, ref) => {
84
94
  style: {
85
95
  zIndex: isFocused ? zIndex + 1 : zIndex
86
96
  },
87
- children: renderListHeader(
88
- title,
97
+ children: renderElementHeader(title, {
89
98
  titleHtmlMarkup,
90
- isHovered || isFocused,
91
- large ? "large" : "medium",
92
- isExpanded ? ChevronUp : ChevronDown,
93
- icon
94
- )
99
+ isHovered: isHovered || isFocused,
100
+ size: large ? "large" : "medium",
101
+ parentType: "expanderlist",
102
+ chevronIcon: isExpanded ? ChevronUp : ChevronDown,
103
+ icon,
104
+ highlightText
105
+ })
95
106
  }
96
107
  ),
97
108
  renderContent()
@@ -104,17 +115,21 @@ const ExpanderList = React__default.forwardRef((props, ref) => {
104
115
  childPadding = true,
105
116
  large,
106
117
  renderChildrenWhenClosed = false,
107
- color,
118
+ color = "white",
108
119
  className = "",
109
120
  accordion = false,
110
121
  testId,
111
122
  variant,
112
- zIndex
123
+ zIndex,
124
+ highlightText
113
125
  } = props;
114
126
  const [activeExpander, setActiveExpander] = useState();
115
127
  const [latestExpander, setLatestExpander] = useState();
116
128
  const uuid = useUuid();
117
- const expanderListClasses = classNames(expanderListStyles["expander-list"], className);
129
+ const expanderListClasses = classNames(expanderListStyles["expander-list"], className, {
130
+ [expanderListStyles[`expander-list--outline--${color}`]]: variant === "outline",
131
+ [expanderListStyles[`expander-list--fill`]]: variant === "fill" || variant === "fill-negative"
132
+ });
118
133
  function handleExpanderClick(event, id) {
119
134
  setActiveExpander((prevState) => accordion ? { [id]: !(prevState == null ? void 0 : prevState[id]) } : { ...prevState, [id]: !(prevState == null ? void 0 : prevState[id]) });
120
135
  setLatestExpander(event.currentTarget);
@@ -143,6 +158,7 @@ const ExpanderList = React__default.forwardRef((props, ref) => {
143
158
  if (isExpanderComponent(child)) {
144
159
  const id = getExpanderId(index);
145
160
  const expanded = activeExpander == null ? void 0 : activeExpander[id];
161
+ const highlightTextChild = child.props.highlightText || highlightText;
146
162
  return React__default.cloneElement(child, {
147
163
  id,
148
164
  key: index,
@@ -155,7 +171,8 @@ const ExpanderList = React__default.forwardRef((props, ref) => {
155
171
  handleExpanderClick: (event) => handleExpanderClick(event, `${uuid}-${index}`),
156
172
  renderChildrenWhenClosed,
157
173
  variant,
158
- zIndex
174
+ zIndex,
175
+ highlightText: highlightTextChild
159
176
  });
160
177
  }
161
178
  return child;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/ExpanderList/ExpanderList.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { useUuid } from '../../hooks/useUuid';\nimport { PaletteNames } from '../../theme/palette';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport { ListHeaderType, renderListHeader } from '../ListHeader/ListHeader';\nimport { TitleTags } from '../Title';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = Extract<PaletteNames, 'white' | 'blueberry' | 'cherry' | 'neutral'>;\nexport interface ExpanderType extends React.ForwardRefExoticComponent<ExpanderProps & React.RefAttributes<HTMLLIElement>> {\n ListHeader?: ListHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.ForwardRefExoticComponent<ExpanderListProps & React.RefAttributes<HTMLUListElement>> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill' | 'fill-negative';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the colors of the list. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: JSX.Element | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'variant'>;\n\nconst Expander: ExpanderType = React.forwardRef<HTMLLIElement, ExpanderProps>((props, ref) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n zIndex = 0,\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered, isFocused } = usePseudoClasses(triggerRef);\n\n const isFill = variant === 'fill';\n const isFillNegative = variant === 'fill-negative';\n const isOutline = variant === 'outline';\n const isLine = variant === 'line';\n\n const itemClasses = classNames(className, expanderListStyles['expander-list__item'], {\n [expanderListStyles[`expander-list__item--fill`]]: isFill,\n [expanderListStyles[`expander-list__item--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list__item--fill-negative`]]: isFillNegative,\n [expanderListStyles['expander-list__item--outline']]: isOutline,\n [expanderListStyles[`expander-list__item--outline--${color}`]]: isOutline,\n [expanderListStyles['expander-list__item--line']]: isLine,\n [expanderListStyles[`expander-list__item--line--${color}`]]: isLine,\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles[`expander-list-link--fill`]]: isFill,\n [expanderListStyles[`expander-list-link--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list-link--fill-negative`]]: isFillNegative,\n [expanderListStyles['expander-list-link--outline']]: isOutline,\n [expanderListStyles[`expander-list-link--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link--line--${color}`]]: isLine,\n [expanderListStyles['expander-list-link--closed']]: !isExpanded,\n [expanderListStyles['expander-list-link--open']]: isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n });\n\n const renderContent = (): React.ReactNode => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(\n expanderListStyles['expander-list-link__main-content'],\n isExpanded && expanderListStyles['expander-list-link__main-content--expanded'],\n padding ? expanderListStyles['expander-list-link__main-content--padding'] : ''\n );\n\n return <div className={mainContentClasses}>{children}</div>;\n };\n\n return (\n <li className={itemClasses} ref={mergeRefs([ref, expanderRef])}>\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isFocused ? zIndex + 1 : zIndex,\n }}\n >\n {renderListHeader(\n title,\n titleHtmlMarkup,\n isHovered || isFocused,\n large ? 'large' : 'medium',\n isExpanded ? ChevronUp : ChevronDown,\n icon\n )}\n </button>\n {renderContent()}\n </li>\n );\n});\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: unknown | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nexport const ExpanderList = React.forwardRef((props: ExpanderListProps, ref: React.Ref<HTMLUListElement>) => {\n const {\n children,\n childPadding = true,\n large,\n renderChildrenWhenClosed = false,\n color,\n className = '',\n accordion = false,\n testId,\n variant,\n zIndex,\n } = props;\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const uuid = useUuid();\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className);\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n const getExpanderId = (index: number): string => `${uuid}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n useEffect(() => {\n const newActiveExpander = React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }, [children]);\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n id,\n key: index,\n expanded,\n padding: childPadding,\n color,\n large,\n 'aria-expanded': expanded,\n className: expanderListStyles['expander-list__item'],\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => handleExpanderClick(event, `${uuid}-${index}`),\n renderChildrenWhenClosed,\n variant,\n zIndex: zIndex,\n });\n }\n return child;\n })}\n </ul>\n );\n}) as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n"],"names":["React"],"mappings":";;;;;;;;;;;;;AA8EA,MAAM,WAAyBA,eAAM,WAAyC,CAAC,OAAO,QAAQ;AACtF,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,IACP;AACJ,QAAM,CAAC,UAAU,IAAI,UAAU,UAAU,QAAQ;AAC3C,QAAA,cAAc,OAAsB,IAAI;AACxC,QAAA,aAAa,OAA0B,IAAI;AACjD,QAAM,EAAE,WAAW,cAAc,iBAAiB,UAAU;AAE5D,QAAM,SAAS,YAAY;AAC3B,QAAM,iBAAiB,YAAY;AACnC,QAAM,YAAY,YAAY;AAC9B,QAAM,SAAS,YAAY;AAE3B,QAAM,cAAc,WAAW,WAAW,mBAAmB,qBAAqB,GAAG;AAAA,IACnF,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,IACnD,CAAC,mBAAmB,8BAA8B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC7D,CAAC,mBAAmB,oCAAoC,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,8BAA8B,CAAC,GAAG;AAAA,IACtD,CAAC,mBAAmB,iCAAiC,KAAK,EAAE,CAAC,GAAG;AAAA,IAChE,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,IACnD,CAAC,mBAAmB,8BAA8B,KAAK,EAAE,CAAC,GAAG;AAAA,EAAA,CAC9D;AAEK,QAAA,kBAAkB,WAAW,mBAAmB,oBAAoB,GAAG,mBAAmB,uBAAuB,KAAK,EAAE,GAAG;AAAA,IAC/H,CAAC,mBAAmB,0BAA0B,CAAC,GAAG;AAAA,IAClD,CAAC,mBAAmB,6BAA6B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,mCAAmC,CAAC,GAAG;AAAA,IAC3D,CAAC,mBAAmB,6BAA6B,CAAC,GAAG;AAAA,IACrD,CAAC,mBAAmB,gCAAgC,KAAK,EAAE,CAAC,GAAG;AAAA,IAC/D,CAAC,mBAAmB,6BAA6B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,4BAA4B,CAAC,GAAG,CAAC;AAAA,IACrD,CAAC,mBAAmB,0BAA0B,CAAC,GAAG;AAAA,IAClD,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,EAAA,CACpD;AAED,QAAM,gBAAgB,MAAuB;AACvC,QAAA,CAAC,4BAA4B,CAAC,YAAY;AACrC,aAAA;AAAA,IAAA;AAGT,UAAM,qBAAqB;AAAA,MACzB,mBAAmB,kCAAkC;AAAA,MACrD,cAAc,mBAAmB,4CAA4C;AAAA,MAC7E,UAAU,mBAAmB,2CAA2C,IAAI;AAAA,IAC9E;AAEA,WAAQ,oBAAA,OAAA,EAAI,WAAW,oBAAqB,SAAS,CAAA;AAAA,EACvD;AAGE,SAAA,qBAAC,MAAG,EAAA,WAAW,aAAa,KAAK,UAAU,CAAC,KAAK,WAAW,CAAC,GAC3D,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,eAAa;AAAA,QACb,oBAAkB,YAAY;AAAA,QAC9B,WAAW;AAAA,QACX,KAAK;AAAA,QACL,iBAAe;AAAA,QACf,OAAO;AAAA,UACL,QAAQ,YAAY,SAAS,IAAI;AAAA,QACnC;AAAA,QAEC,UAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,QAAQ,UAAU;AAAA,UAClB,aAAa,YAAY;AAAA,UACzB;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,IACC,cAAc;AAAA,EAAA,GACjB;AAEJ,CAAC;AAID,MAAM,sBAAsB,CAAC,YAC3BA,eAAM,eAA8B,OAAO,KAAM,QAA+B,SAAS;AAEpF,MAAM,eAAeA,eAAM,WAAW,CAAC,OAA0B,QAAqC;AACrG,QAAA;AAAA,IACJ;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,2BAA2B;AAAA,IAC3B;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAyB;AACrE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAsB;AAClE,QAAM,OAAO,QAAQ;AACrB,QAAM,sBAAsB,WAAW,mBAAmB,eAAe,GAAG,SAAS;AAE5E,WAAA,oBAAoB,OAAkD,IAAkB;AAC7E,sBAAA,CAAA,cAAc,YAAY,EAAE,CAAC,EAAE,GAAG,EAAC,uCAAY,KAAE,IAAM,EAAE,GAAG,WAAW,CAAC,EAAE,GAAG,EAAC,uCAAY,MAAM;AAClH,sBAAkB,MAAM,aAAa;AAAA,EAAA;AAGvC,QAAM,gBAAgB,CAAC,UAA0B,GAAG,IAAI,IAAI,KAAK;AAEjE,YAAU,MAAM;AACd,QAAI,aAAa,kBAAkB,CAAC,oBAAoB,cAAc,GAAG;AACvE,qBAAe,eAAe;AAAA,IAAA;AAAA,EAChC,GACC,CAAC,WAAW,cAAc,CAAC;AAE9B,YAAU,MAAM;;AACd,UAAM,qBAAoBA,oBAAM,SAAS,IAAI,UAAU,CAAS,UAAA;AAC1D,UAAA,oBAAoB,KAAK,GAAG;AACvB,eAAA;AAAA,MAAA;AAAA,IAEV,CAAA,MAJyBA,mBAItB,OAAO,CAAC,KAAK,OAAO,UAAU;AAEhC,UAAI,OAAO,MAAM,MAAM,aAAa,aAAa;AAC/C,YAAI,cAAc,KAAK,CAAC,IAAI,MAAM,MAAM;AAAA,MAAA;AAEnC,aAAA;AAAA,IACT,GAAG;AAEH,sBAAkB,EAAE,GAAG,gBAAgB,GAAG,mBAAmB;AAAA,EAAA,GAC5D,CAAC,QAAQ,CAAC;AAEb,6BACG,MAAG,EAAA,WAAW,qBAAqB,KAAU,eAAa,QAAQ,oBAAkB,YAAY,cAC9F,yBAAM,SAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AAC1C,QAAA,oBAAoB,KAAK,GAAG;AACxB,YAAA,KAAK,cAAc,KAAK;AACxB,YAAA,WAAW,iDAAiB;AAE3B,aAAAA,eAAM,aAAa,OAA4C;AAAA,QACpE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,WAAW,mBAAmB,qBAAqB;AAAA,QACnD,qBAAqB,CAAC,UAAyC,oBAAoB,OAAO,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,QAC5G;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA;AAEI,WAAA;AAAA,EACR,CAAA,GACH;AAEJ,CAAC;AAED,aAAa,cAAc;AAC3B,aAAa,WAAW;AACxB,SAAS,cAAc;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/ExpanderList/ExpanderList.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport { AnalyticsId } from '../../constants';\nimport { useExpand } from '../../hooks/useExpand';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { useUuid } from '../../hooks/useUuid';\nimport { PaletteNames } from '../../theme/palette';\nimport { mergeRefs } from '../../utils/refs';\nimport { isElementInViewport } from '../../utils/viewport';\nimport { ElementHeaderType, renderElementHeader } from '../ElementHeader/ElementHeader';\nimport Highlighter from '../Highlighter';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport { TitleTags } from '../Title';\n\nimport expanderListStyles from './styles.module.scss';\n\nexport type ExpanderListColors = Extract<PaletteNames, 'white' | 'blueberry' | 'cherry' | 'neutral'>;\nexport interface ExpanderType extends React.ForwardRefExoticComponent<ExpanderProps & React.RefAttributes<HTMLLIElement>> {\n ElementHeader?: ElementHeaderType;\n}\n\nexport interface ExpanderListCompound extends React.ForwardRefExoticComponent<ExpanderListProps & React.RefAttributes<HTMLUListElement>> {\n Expander: ExpanderType;\n}\n\nexport type ExpanderListVariant = 'line' | 'outline' | 'fill' | 'fill-negative';\n\nexport type ExpanderListStatus = 'none' | 'new';\n\ninterface ExpanderListProps {\n /** Toggles accordion functionality for the expanders. */\n accordion?: boolean;\n /** Items in the ExpanderList */\n children: React.ReactNode;\n /** Toggles padding of child elements */\n childPadding?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the colors of the list. */\n color?: ExpanderListColors;\n /** Changes the font size. */\n large?: boolean;\n /** Whether to render children when closed (in which case they are hidden with CSS). Default: false */\n renderChildrenWhenClosed?: boolean;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets visual priority */\n variant?: ExpanderListVariant;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Used for search results */\n highlightText?: string;\n}\n\ntype Modify<T, R> = Omit<T, keyof R> & R;\n\ntype ExpanderProps = Modify<\n React.HTMLAttributes<HTMLButtonElement>,\n {\n id?: string;\n title: JSX.Element | string;\n /** Changes the underlying element of the title. Default: span*/\n titleHtmlMarkup?: TitleTags;\n children: React.ReactNode;\n className?: string;\n color?: ExpanderListColors;\n icon?: React.ReactElement;\n padding?: boolean;\n expanded?: boolean;\n large?: boolean;\n testId?: string;\n handleExpanderClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n /** Called when expander is open/closed. */\n onExpand?: (isExpanded: boolean) => void;\n /** Overrides the default z-index of the expander header */\n zIndex?: number;\n /** Highlights text in title and content. Override if different from list. */\n highlightText?: string;\n /** Displays a status on the left side: default none */\n status?: ExpanderListStatus;\n }\n> &\n Pick<ExpanderListProps, 'renderChildrenWhenClosed' | 'variant'>;\n\nconst Expander: ExpanderType = React.forwardRef<HTMLLIElement, ExpanderProps>((props, ref) => {\n const {\n id,\n children,\n padding = true,\n color = 'neutral',\n className = '',\n icon,\n large = false,\n title,\n titleHtmlMarkup = 'span',\n expanded = false,\n testId,\n handleExpanderClick,\n onExpand,\n renderChildrenWhenClosed,\n variant = 'line',\n zIndex = 0,\n highlightText,\n status = 'none',\n } = props;\n const [isExpanded] = useExpand(expanded, onExpand);\n const expanderRef = useRef<HTMLLIElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const { isHovered, isFocused } = usePseudoClasses(triggerRef);\n\n const isFill = variant === 'fill';\n const isFillNegative = variant === 'fill-negative';\n const isOutline = variant === 'outline';\n const isLine = variant === 'line';\n\n const itemClasses = classNames(className, expanderListStyles['expander-list__item'], {\n [expanderListStyles[`expander-list__item--fill`]]: isFill,\n [expanderListStyles[`expander-list__item--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list__item--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list__item--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list__item--outline']]: isOutline,\n [expanderListStyles[`expander-list__item--outline--${color}`]]: isOutline,\n [expanderListStyles['expander-list__item--line']]: isLine,\n [expanderListStyles[`expander-list__item--line--${color}`]]: isLine,\n [expanderListStyles[`expander-list__item--new`]]: status === 'new',\n });\n\n const expanderClasses = classNames(expanderListStyles['expander-list-link'], expanderListStyles[`expander-list-link--${color}`], {\n [expanderListStyles[`expander-list-link--fill--${color}`]]: isFill,\n [expanderListStyles[`expander-list-link--fill-negative`]]: isFillNegative,\n [expanderListStyles[`expander-list-link--fill-negative--${color}`]]: isFillNegative,\n [expanderListStyles['expander-list-link--outline']]: isOutline,\n [expanderListStyles[`expander-list-link--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link--line--${color}`]]: isLine,\n [expanderListStyles['expander-list-link--open']]: isExpanded,\n [expanderListStyles['expander-list-link--large']]: large,\n [expanderListStyles[`expander-list-link--new`]]: status === 'new',\n });\n\n const renderContent = (): React.ReactNode => {\n if (!renderChildrenWhenClosed && !isExpanded) {\n return null;\n }\n\n const mainContentClasses = classNames(expanderListStyles['expander-list-link__main-content'], {\n [expanderListStyles['expander-list-link__main-content--expanded']]: isExpanded,\n [expanderListStyles['expander-list-link__main-content--padding']]: padding,\n [expanderListStyles[`expander-list-link__main-content--outline--${color}`]]: isOutline,\n [expanderListStyles[`expander-list-link__main-content--new`]]: status === 'new',\n });\n\n return (\n <div className={mainContentClasses} data-state={isExpanded ? 'open' : 'closed'}>\n <Highlighter searchText={highlightText}>{children}</Highlighter>\n </div>\n );\n };\n\n const statusMarkerClasses = classNames(expanderListStyles['expander-list__item__status-marker'], {\n [expanderListStyles['expander-list__item__status-marker--new']]: status === 'new',\n });\n\n return (\n <li className={itemClasses} ref={mergeRefs([ref, expanderRef])}>\n {status !== 'none' && <div className={statusMarkerClasses}></div>}\n <button\n type=\"button\"\n id={id}\n onClick={handleExpanderClick}\n data-testid={testId}\n data-analyticsid={AnalyticsId.ExpanderListExpander}\n className={expanderClasses}\n ref={triggerRef}\n aria-expanded={isExpanded}\n style={{\n zIndex: isFocused ? zIndex + 1 : zIndex,\n }}\n >\n {renderElementHeader(title, {\n titleHtmlMarkup,\n isHovered: isHovered || isFocused,\n size: large ? 'large' : 'medium',\n parentType: 'expanderlist',\n chevronIcon: isExpanded ? ChevronUp : ChevronDown,\n icon,\n highlightText,\n })}\n </button>\n {renderContent()}\n </li>\n );\n});\n\ntype ActiveExpander = Record<string, boolean>;\n\nconst isExpanderComponent = (element: unknown | null | undefined): element is React.ReactElement<ExpanderProps> =>\n React.isValidElement<ExpanderProps>(element) && (element as React.ReactElement).type === Expander;\n\nexport const ExpanderList = React.forwardRef((props: ExpanderListProps, ref: React.Ref<HTMLUListElement>) => {\n const {\n children,\n childPadding = true,\n large,\n renderChildrenWhenClosed = false,\n color = 'white',\n className = '',\n accordion = false,\n testId,\n variant,\n zIndex,\n highlightText,\n } = props;\n const [activeExpander, setActiveExpander] = useState<ActiveExpander>();\n const [latestExpander, setLatestExpander] = useState<HTMLElement>();\n const uuid = useUuid();\n const expanderListClasses = classNames(expanderListStyles['expander-list'], className, {\n [expanderListStyles[`expander-list--outline--${color}`]]: variant === 'outline',\n [expanderListStyles[`expander-list--fill`]]: variant === 'fill' || variant === 'fill-negative',\n });\n\n function handleExpanderClick(event: React.MouseEvent<HTMLElement, MouseEvent>, id: string): void {\n setActiveExpander(prevState => (accordion ? { [id]: !prevState?.[id] } : { ...prevState, [id]: !prevState?.[id] }));\n setLatestExpander(event.currentTarget);\n }\n\n const getExpanderId = (index: number): string => `${uuid}-${index}`;\n\n useEffect(() => {\n if (accordion && latestExpander && !isElementInViewport(latestExpander)) {\n latestExpander.scrollIntoView();\n }\n }, [accordion, latestExpander]);\n\n useEffect(() => {\n const newActiveExpander = React.Children.map(children, child => {\n if (isExpanderComponent(child)) {\n return child;\n }\n })?.reduce((acc, child, index) => {\n // Expanded-status skal bare settes dersom prop er satt av den som bruker komponenten\n if (typeof child.props.expanded !== 'undefined') {\n acc[getExpanderId(index)] = child.props.expanded;\n }\n return acc;\n }, {} as ActiveExpander);\n\n setActiveExpander({ ...activeExpander, ...newActiveExpander });\n }, [children]);\n\n return (\n <ul className={expanderListClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.ExpanderList}>\n {React.Children.map(children, (child, index) => {\n if (isExpanderComponent(child)) {\n const id = getExpanderId(index);\n const expanded = activeExpander?.[id];\n const highlightTextChild: string | undefined = child.props.highlightText || highlightText;\n\n return React.cloneElement(child as React.ReactElement<ExpanderProps>, {\n id,\n key: index,\n expanded,\n padding: childPadding,\n color,\n large,\n 'aria-expanded': expanded,\n className: expanderListStyles['expander-list__item'],\n handleExpanderClick: (event: React.MouseEvent<HTMLElement>) => handleExpanderClick(event, `${uuid}-${index}`),\n renderChildrenWhenClosed,\n variant,\n zIndex: zIndex,\n highlightText: highlightTextChild,\n });\n }\n return child;\n })}\n </ul>\n );\n}) as ExpanderListCompound;\n\nExpanderList.displayName = 'ExpanderList';\nExpanderList.Expander = Expander;\nExpander.displayName = 'ExpanderList.Expander';\n\nexport default ExpanderList;\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;AAuFA,MAAM,WAAyBA,eAAM,WAAyC,CAAC,OAAO,QAAQ;AACtF,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA,SAAS;AAAA,EAAA,IACP;AACJ,QAAM,CAAC,UAAU,IAAI,UAAU,UAAU,QAAQ;AAC3C,QAAA,cAAc,OAAsB,IAAI;AACxC,QAAA,aAAa,OAA0B,IAAI;AACjD,QAAM,EAAE,WAAW,cAAc,iBAAiB,UAAU;AAE5D,QAAM,SAAS,YAAY;AAC3B,QAAM,iBAAiB,YAAY;AACnC,QAAM,YAAY,YAAY;AAC9B,QAAM,SAAS,YAAY;AAE3B,QAAM,cAAc,WAAW,WAAW,mBAAmB,qBAAqB,GAAG;AAAA,IACnF,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,IACnD,CAAC,mBAAmB,8BAA8B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC7D,CAAC,mBAAmB,oCAAoC,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,uCAAuC,KAAK,EAAE,CAAC,GAAG;AAAA,IACtE,CAAC,mBAAmB,8BAA8B,CAAC,GAAG;AAAA,IACtD,CAAC,mBAAmB,iCAAiC,KAAK,EAAE,CAAC,GAAG;AAAA,IAChE,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,IACnD,CAAC,mBAAmB,8BAA8B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC7D,CAAC,mBAAmB,0BAA0B,CAAC,GAAG,WAAW;AAAA,EAAA,CAC9D;AAEK,QAAA,kBAAkB,WAAW,mBAAmB,oBAAoB,GAAG,mBAAmB,uBAAuB,KAAK,EAAE,GAAG;AAAA,IAC/H,CAAC,mBAAmB,6BAA6B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,mCAAmC,CAAC,GAAG;AAAA,IAC3D,CAAC,mBAAmB,sCAAsC,KAAK,EAAE,CAAC,GAAG;AAAA,IACrE,CAAC,mBAAmB,6BAA6B,CAAC,GAAG;AAAA,IACrD,CAAC,mBAAmB,gCAAgC,KAAK,EAAE,CAAC,GAAG;AAAA,IAC/D,CAAC,mBAAmB,6BAA6B,KAAK,EAAE,CAAC,GAAG;AAAA,IAC5D,CAAC,mBAAmB,0BAA0B,CAAC,GAAG;AAAA,IAClD,CAAC,mBAAmB,2BAA2B,CAAC,GAAG;AAAA,IACnD,CAAC,mBAAmB,yBAAyB,CAAC,GAAG,WAAW;AAAA,EAAA,CAC7D;AAED,QAAM,gBAAgB,MAAuB;AACvC,QAAA,CAAC,4BAA4B,CAAC,YAAY;AACrC,aAAA;AAAA,IAAA;AAGT,UAAM,qBAAqB,WAAW,mBAAmB,kCAAkC,GAAG;AAAA,MAC5F,CAAC,mBAAmB,4CAA4C,CAAC,GAAG;AAAA,MACpE,CAAC,mBAAmB,2CAA2C,CAAC,GAAG;AAAA,MACnE,CAAC,mBAAmB,8CAA8C,KAAK,EAAE,CAAC,GAAG;AAAA,MAC7E,CAAC,mBAAmB,uCAAuC,CAAC,GAAG,WAAW;AAAA,IAAA,CAC3E;AAED,WACG,oBAAA,OAAA,EAAI,WAAW,oBAAoB,cAAY,aAAa,SAAS,UACpE,UAAC,oBAAA,aAAA,EAAY,YAAY,eAAgB,SAAS,CAAA,GACpD;AAAA,EAEJ;AAEA,QAAM,sBAAsB,WAAW,mBAAmB,oCAAoC,GAAG;AAAA,IAC/F,CAAC,mBAAmB,yCAAyC,CAAC,GAAG,WAAW;AAAA,EAAA,CAC7E;AAGC,SAAA,qBAAC,MAAG,EAAA,WAAW,aAAa,KAAK,UAAU,CAAC,KAAK,WAAW,CAAC,GAC1D,UAAA;AAAA,IAAA,WAAW,UAAU,oBAAC,OAAI,EAAA,WAAW,qBAAqB;AAAA,IAC3D;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,eAAa;AAAA,QACb,oBAAkB,YAAY;AAAA,QAC9B,WAAW;AAAA,QACX,KAAK;AAAA,QACL,iBAAe;AAAA,QACf,OAAO;AAAA,UACL,QAAQ,YAAY,SAAS,IAAI;AAAA,QACnC;AAAA,QAEC,8BAAoB,OAAO;AAAA,UAC1B;AAAA,UACA,WAAW,aAAa;AAAA,UACxB,MAAM,QAAQ,UAAU;AAAA,UACxB,YAAY;AAAA,UACZ,aAAa,aAAa,YAAY;AAAA,UACtC;AAAA,UACA;AAAA,QACD,CAAA;AAAA,MAAA;AAAA,IACH;AAAA,IACC,cAAc;AAAA,EAAA,GACjB;AAEJ,CAAC;AAID,MAAM,sBAAsB,CAAC,YAC3BA,eAAM,eAA8B,OAAO,KAAM,QAA+B,SAAS;AAEpF,MAAM,eAAeA,eAAM,WAAW,CAAC,OAA0B,QAAqC;AACrG,QAAA;AAAA,IACJ;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,2BAA2B;AAAA,IAC3B,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AACJ,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAyB;AACrE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAsB;AAClE,QAAM,OAAO,QAAQ;AACrB,QAAM,sBAAsB,WAAW,mBAAmB,eAAe,GAAG,WAAW;AAAA,IACrF,CAAC,mBAAmB,2BAA2B,KAAK,EAAE,CAAC,GAAG,YAAY;AAAA,IACtE,CAAC,mBAAmB,qBAAqB,CAAC,GAAG,YAAY,UAAU,YAAY;AAAA,EAAA,CAChF;AAEQ,WAAA,oBAAoB,OAAkD,IAAkB;AAC7E,sBAAA,CAAA,cAAc,YAAY,EAAE,CAAC,EAAE,GAAG,EAAC,uCAAY,KAAE,IAAM,EAAE,GAAG,WAAW,CAAC,EAAE,GAAG,EAAC,uCAAY,MAAM;AAClH,sBAAkB,MAAM,aAAa;AAAA,EAAA;AAGvC,QAAM,gBAAgB,CAAC,UAA0B,GAAG,IAAI,IAAI,KAAK;AAEjE,YAAU,MAAM;AACd,QAAI,aAAa,kBAAkB,CAAC,oBAAoB,cAAc,GAAG;AACvE,qBAAe,eAAe;AAAA,IAAA;AAAA,EAChC,GACC,CAAC,WAAW,cAAc,CAAC;AAE9B,YAAU,MAAM;;AACd,UAAM,qBAAoBA,oBAAM,SAAS,IAAI,UAAU,CAAS,UAAA;AAC1D,UAAA,oBAAoB,KAAK,GAAG;AACvB,eAAA;AAAA,MAAA;AAAA,IAEV,CAAA,MAJyBA,mBAItB,OAAO,CAAC,KAAK,OAAO,UAAU;AAEhC,UAAI,OAAO,MAAM,MAAM,aAAa,aAAa;AAC/C,YAAI,cAAc,KAAK,CAAC,IAAI,MAAM,MAAM;AAAA,MAAA;AAEnC,aAAA;AAAA,IACT,GAAG;AAEH,sBAAkB,EAAE,GAAG,gBAAgB,GAAG,mBAAmB;AAAA,EAAA,GAC5D,CAAC,QAAQ,CAAC;AAEb,6BACG,MAAG,EAAA,WAAW,qBAAqB,KAAU,eAAa,QAAQ,oBAAkB,YAAY,cAC9F,yBAAM,SAAS,IAAI,UAAU,CAAC,OAAO,UAAU;AAC1C,QAAA,oBAAoB,KAAK,GAAG;AACxB,YAAA,KAAK,cAAc,KAAK;AACxB,YAAA,WAAW,iDAAiB;AAC5B,YAAA,qBAAyC,MAAM,MAAM,iBAAiB;AAErE,aAAAA,eAAM,aAAa,OAA4C;AAAA,QACpE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,WAAW,mBAAmB,qBAAqB;AAAA,QACnD,qBAAqB,CAAC,UAAyC,oBAAoB,OAAO,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,QAC5G;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA;AAEI,WAAA;AAAA,EACR,CAAA,GACH;AAEJ,CAAC;AAED,aAAa,cAAc;AAC3B,aAAa,WAAW;AACxB,SAAS,cAAc;"}
@@ -5,14 +5,51 @@
5
5
  @import '../../scss/supernova/styles/colors.css';
6
6
 
7
7
  .expander-list {
8
+ --statusmarker-left-space: 8px;
9
+
8
10
  list-style: none;
9
11
  padding: 0;
10
12
  width: inherit;
11
13
  margin: 0;
12
14
 
15
+ &--outline {
16
+ &--neutral {
17
+ border: 1px solid var(--color-base-border-onlight);
18
+ }
19
+
20
+ &--blueberry {
21
+ border: 1px solid var(--core-color-blueberry-500);
22
+ }
23
+
24
+ &--cherry {
25
+ border: 1px solid var(--core-color-cherry-400);
26
+ }
27
+
28
+ &--white {
29
+ border: 1px solid var(--color-base-border-onlight);
30
+ }
31
+ }
32
+
33
+ &--fill {
34
+ display: flex;
35
+ flex-flow: column;
36
+ gap: spacers.getSpacer(2xs);
37
+ }
38
+
13
39
  &__item {
14
40
  border: 0;
15
- position: relative;
41
+ display: grid;
42
+ grid-template:
43
+ 'header' auto
44
+ 'content' auto / 1fr auto;
45
+
46
+ &--new {
47
+ grid-template:
48
+ 'statusmarker header' auto
49
+ 'statusmarker content' auto / 8px auto;
50
+
51
+ --statusmarker-left-space: 0px;
52
+ }
16
53
 
17
54
  &--line {
18
55
  border-bottom: 1px solid var(--color-base-border-onlight);
@@ -111,6 +148,36 @@
111
148
  &--fill-negative {
112
149
  background-color: var(--color-base-background-white);
113
150
  }
151
+
152
+ &--fill,
153
+ &--fill-negative {
154
+ &--blueberry {
155
+ border: 1px solid var(--core-color-blueberry-500);
156
+ }
157
+
158
+ &--cherry {
159
+ border: 1px solid var(--core-color-cherry-400);
160
+ }
161
+
162
+ &--neutral {
163
+ border: 1px solid var(--color-base-border-onlight);
164
+ }
165
+
166
+ &--white {
167
+ border: 1px solid var(--color-base-border-onlight);
168
+ }
169
+ }
170
+
171
+ &__status-marker {
172
+ width: 8px;
173
+ height: 100%;
174
+ grid-area: statusmarker;
175
+ background-color: transparent;
176
+
177
+ &--new {
178
+ background-color: var(--core-color-blueberry-500);
179
+ }
180
+ }
114
181
  }
115
182
  }
116
183
 
@@ -130,108 +197,226 @@
130
197
  border: 0;
131
198
  width: 100%;
132
199
  outline: none;
200
+ grid-area: header;
201
+ padding-left: var(--statusmarker-left-space);
133
202
 
134
203
  @media (min-width: map.get(breakpoints.$grid-breakpoints, md)) {
135
204
  font-size: font-settings.$font-size-md;
136
205
  line-height: font-settings.$lineheight-size-md;
137
206
  }
138
207
 
139
- &--open {
140
- font-weight: 600;
208
+ &[aria-expanded='true'] {
209
+ border-bottom: 1px solid var(--color-action-border-ondark);
141
210
  }
142
211
 
143
- &--fill,
144
- &--fill-negative {
145
- margin-top: spacers.getSpacer(s);
212
+ &--open {
213
+ font-weight: 600;
146
214
  }
147
215
 
148
216
  &--fill-negative {
149
217
  background-color: var(--color-base-background-white);
150
218
  }
151
219
 
152
- &--closed#{&}--fill {
153
- margin-bottom: spacers.getSpacer(s);
154
- }
155
-
156
- &:focus-visible:not(.expander-list-link--outline) {
220
+ &:focus-visible {
157
221
  outline: 0.25rem solid var(--color-action-border-onlight-focus);
158
222
  }
159
223
 
160
- &--white:not(.expander-list-link--outline) {
161
- &:hover {
162
- background-color: var(--core-color-blueberry-50);
224
+ &--white:not(.expander-list-link--outline, .expander-list-link--fill-negative) {
225
+ &[aria-expanded='false'] {
226
+ &:hover {
227
+ background-color: var(--core-color-neutral-50);
228
+ }
229
+
230
+ &:active {
231
+ background-color: var(--core-color-neutral-100);
232
+ }
163
233
  }
164
234
 
165
- &:active {
166
- background-color: var(--core-color-blueberry-100);
235
+ &[aria-expanded='true'] {
236
+ background-color: var(--core-color-neutral-50);
237
+
238
+ &:hover {
239
+ background-color: var(--core-color-neutral-100);
240
+ }
241
+
242
+ &:active {
243
+ background-color: var(--core-color-neutral-200);
244
+ }
167
245
  }
168
246
  }
169
247
 
170
- &--blueberry:not(.expander-list-link--outline) {
171
- &:hover {
172
- background-color: var(--core-color-blueberry-100);
248
+ &--blueberry:not(.expander-list-link--outline, .expander-list-link--fill-negative) {
249
+ &[aria-expanded='false'] {
250
+ &:hover {
251
+ background-color: var(--core-color-blueberry-100);
252
+ }
253
+
254
+ &:active {
255
+ background-color: var(--color-action-background-ondark-hoverselected);
256
+ }
173
257
  }
174
258
 
175
- &:active {
176
- background-color: var(--color-action-background-ondark-hoverselected);
259
+ &[aria-expanded='true'] {
260
+ background-color: var(--core-color-blueberry-100);
261
+
262
+ &:hover {
263
+ background-color: var(--core-color-blueberry-200);
264
+ }
265
+
266
+ &:active {
267
+ background-color: var(--core-color-blueberry-300);
268
+ }
177
269
  }
178
270
  }
179
271
 
180
- &--cherry:not(.expander-list-link--outline) {
181
- &:hover {
182
- background-color: var(--core-color-cherry-100);
272
+ &--cherry:not(.expander-list-link--outline, .expander-list-link--fill-negative) {
273
+ &[aria-expanded='false'] {
274
+ &:hover {
275
+ background-color: var(--core-color-cherry-100);
276
+ }
277
+
278
+ &:active {
279
+ background-color: var(--core-color-cherry-200);
280
+ }
183
281
  }
184
282
 
185
- &:active {
186
- background-color: var(--core-color-cherry-200);
283
+ &[aria-expanded='true'] {
284
+ background-color: var(--core-color-cherry-100);
285
+
286
+ &:hover {
287
+ background-color: var(--core-color-cherry-200);
288
+ }
289
+
290
+ &:active {
291
+ background-color: var(--core-color-cherry-300);
292
+ }
187
293
  }
188
294
  }
189
295
 
190
- &--neutral:not(.expander-list-link--outline) {
191
- &:hover {
192
- background-color: var(--core-color-neutral-100);
296
+ &--neutral:not(.expander-list-link--outline, .expander-list-link--fill-negative) {
297
+ &[aria-expanded='false'] {
298
+ &:hover {
299
+ background-color: var(--core-color-neutral-100);
300
+ }
301
+
302
+ &:active {
303
+ background-color: var(--core-color-neutral-200);
304
+ }
193
305
  }
194
306
 
195
- &:active {
196
- background-color: var(--core-color-neutral-200);
307
+ &[aria-expanded='true'] {
308
+ background-color: var(--core-color-neutral-100);
309
+
310
+ &:hover {
311
+ background-color: var(--core-color-neutral-200);
312
+ }
313
+
314
+ &:active {
315
+ background-color: var(--core-color-neutral-300);
316
+ }
197
317
  }
198
318
  }
199
319
 
200
320
  &--outline {
201
- background-color: var(--color-base-background-white);
321
+ &--blueberry {
322
+ &[aria-expanded='false'] {
323
+ border-bottom: 1px solid var(--core-color-blueberry-500);
324
+ }
325
+ }
326
+
327
+ &--cherry {
328
+ &[aria-expanded='false'] {
329
+ border-bottom: 1px solid var(--core-color-cherry-400);
330
+ }
331
+ }
332
+
333
+ &--neutral {
334
+ &[aria-expanded='false'] {
335
+ border-bottom: 1px solid var(--color-base-border-onlight);
336
+ }
337
+ }
202
338
 
203
- &:focus-visible {
204
- outline: 0.5rem solid var(--color-action-border-onlight-focus);
339
+ &--white {
340
+ &[aria-expanded='false'] {
341
+ border-bottom: 1px solid var(--color-base-border-onlight);
342
+ }
205
343
  }
344
+ }
345
+
346
+ &--outline,
347
+ &--fill-negative {
348
+ background-color: var(--color-base-background-white);
206
349
 
207
350
  &--blueberry {
208
- &:hover {
209
- background-color: var(--core-color-blueberry-50);
351
+ &[aria-expanded='false'] {
352
+ &:hover {
353
+ background-color: var(--core-color-blueberry-50);
354
+ }
355
+
356
+ &:active {
357
+ background-color: var(--core-color-blueberry-100);
358
+ }
210
359
  }
211
360
 
212
- &:active {
213
- background-color: var(--core-color-blueberry-100);
361
+ &[aria-expanded='true'] {
362
+ background-color: var(--core-color-blueberry-50);
363
+
364
+ &:hover {
365
+ background-color: var(--core-color-blueberry-100);
366
+ }
367
+
368
+ &:active {
369
+ background-color: var(--core-color-blueberry-200);
370
+ }
214
371
  }
215
372
  }
216
373
 
217
374
  &--cherry {
218
- &:hover {
219
- background-color: var(--core-color-cherry-50);
375
+ &[aria-expanded='false'] {
376
+ &:hover {
377
+ background-color: var(--core-color-cherry-50);
378
+ }
379
+
380
+ &:active {
381
+ background-color: var(--core-color-cherry-100);
382
+ }
220
383
  }
221
384
 
222
- &:active {
223
- background-color: var(--core-color-cherry-100);
385
+ &[aria-expanded='true'] {
386
+ background-color: var(--core-color-cherry-50);
387
+
388
+ &:hover {
389
+ background-color: var(--core-color-cherry-100);
390
+ }
391
+
392
+ &:active {
393
+ background-color: var(--core-color-cherry-200);
394
+ }
224
395
  }
225
396
  }
226
397
 
227
398
  &--neutral,
228
399
  &--white {
229
- &:hover {
230
- background-color: var(--core-color-neutral-50);
400
+ &[aria-expanded='false'] {
401
+ &:hover {
402
+ background-color: var(--core-color-neutral-50);
403
+ }
404
+
405
+ &:active {
406
+ background-color: var(--core-color-neutral-100);
407
+ }
231
408
  }
232
409
 
233
- &:active {
234
- background-color: var(--core-color-neutral-100);
410
+ &[aria-expanded='true'] {
411
+ background-color: var(--core-color-neutral-50);
412
+
413
+ &:hover {
414
+ background-color: var(--core-color-neutral-100);
415
+ }
416
+
417
+ &:active {
418
+ background-color: var(--core-color-neutral-200);
419
+ }
235
420
  }
236
421
  }
237
422
  }
@@ -241,6 +426,30 @@
241
426
  line-height: font-settings.$lineheight-size-lg;
242
427
  }
243
428
 
429
+ &--new {
430
+ background-color: var(--core-color-blueberry-50) !important;
431
+
432
+ &:hover {
433
+ background-color: var(--core-color-blueberry-100) !important;
434
+ }
435
+
436
+ &:active {
437
+ background-color: var(--core-color-blueberry-200) !important;
438
+ }
439
+
440
+ &[aria-expanded='true'] {
441
+ background-color: var(--core-color-blueberry-100) !important;
442
+
443
+ &:hover {
444
+ background-color: var(--core-color-blueberry-200) !important;
445
+ }
446
+
447
+ &:active {
448
+ background-color: var(--core-color-blueberry-300) !important;
449
+ }
450
+ }
451
+ }
452
+
244
453
  &__icon {
245
454
  display: flex;
246
455
  align-items: center;
@@ -257,6 +466,8 @@
257
466
  &__main-content {
258
467
  padding: 0;
259
468
  display: none;
469
+ grid-area: content;
470
+ padding-left: var(--statusmarker-left-space);
260
471
 
261
472
  @media print {
262
473
  display: block;
@@ -266,8 +477,38 @@
266
477
  display: block;
267
478
  }
268
479
 
480
+ &--new {
481
+ background-color: var(--core-color-blueberry-50);
482
+ }
483
+
269
484
  &--padding {
270
- padding: spacers.getSpacer(xs) spacers.getSpacer(s) spacers.getSpacer(l);
485
+ padding: spacers.getSpacer(xs) spacers.getSpacer(s) spacers.getSpacer(l) calc(spacers.getSpacer(s) + var(--statusmarker-left-space));
486
+ }
487
+
488
+ &--outline {
489
+ &--blueberry {
490
+ &[aria-expanded='true'] {
491
+ border-bottom: 1px solid var(--core-color-blueberry-500);
492
+ }
493
+ }
494
+
495
+ &--cherry {
496
+ &[aria-expanded='true'] {
497
+ border-bottom: 1px solid var(--core-color-cherry-400);
498
+ }
499
+ }
500
+
501
+ &--neutral {
502
+ &[aria-expanded='true'] {
503
+ border-bottom: 1px solid var(--color-base-border-onlight);
504
+ }
505
+ }
506
+
507
+ &--white {
508
+ &[aria-expanded='true'] {
509
+ border-bottom: 1px solid var(--color-base-border-onlight);
510
+ }
511
+ }
271
512
  }
272
513
  }
273
514
  }