@helsenorge/designsystem-react 15.7.2 → 16.0.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 (228) hide show
  1. package/lib/Button.js +2 -2
  2. package/lib/Button.js.map +1 -1
  3. package/lib/CHANGELOG.md +2652 -997
  4. package/lib/Close.js +1 -1
  5. package/lib/Close.js.map +1 -1
  6. package/lib/Drawer.js +2 -4
  7. package/lib/Drawer.js.map +1 -1
  8. package/lib/DrawerNavigation.js +1 -0
  9. package/lib/DrawerNavigation.js.map +1 -1
  10. package/lib/Duolist.js +5 -1
  11. package/lib/Duolist.js.map +1 -1
  12. package/lib/ElementHeader.js.map +1 -1
  13. package/lib/FilterLinkList.js +1 -1
  14. package/lib/FilterLinkList.js.map +1 -1
  15. package/lib/FormGroup.js +3 -3
  16. package/lib/FormGroup.js.map +1 -1
  17. package/lib/HelpDetails.js +1 -1
  18. package/lib/HelpTriggerIcon.js +2 -2
  19. package/lib/HelpTriggerIcon.js.map +1 -1
  20. package/lib/HelpTriggerStandalone.js +1 -1
  21. package/lib/HelpTriggerStandalone.js.map +1 -1
  22. package/lib/LazyIcon.js +1 -0
  23. package/lib/LazyIcon.js.map +1 -1
  24. package/lib/LazyIllustration.js +2 -0
  25. package/lib/LazyIllustration.js.map +1 -1
  26. package/lib/LinkList.js +10 -10
  27. package/lib/LinkList.js.map +1 -1
  28. package/lib/ListEditMode.js +1 -1
  29. package/lib/ListEditMode.js.map +1 -1
  30. package/lib/PopOver.js +2 -2
  31. package/lib/PopOver.js.map +1 -1
  32. package/lib/Radio.js +65 -55
  33. package/lib/Radio.js.map +1 -1
  34. package/lib/Radio2.js +74 -0
  35. package/lib/Radio2.js.map +1 -0
  36. package/lib/RadioMarker.js +2 -2
  37. package/lib/RadioMarker.js.map +1 -1
  38. package/lib/TabList.js +5 -5
  39. package/lib/TabList.js.map +1 -1
  40. package/lib/Toggle.js +2 -2
  41. package/lib/Toggle.js.map +1 -1
  42. package/lib/VisualRadio.js +1 -1
  43. package/lib/VisualRadio.js.map +1 -1
  44. package/lib/components/AnchorLink/styles.module.scss +3 -4
  45. package/lib/components/ArticleTeaser/styles.module.scss +12 -12
  46. package/lib/components/Button/Button.d.ts +1 -1
  47. package/lib/components/Button/styles.module.scss +111 -60
  48. package/lib/components/Button/styles.module.scss.d.ts +1 -1
  49. package/lib/components/Checkbox/CheckboxMarker/styles.module.scss +6 -6
  50. package/lib/components/Chip/styles.module.scss +2 -3
  51. package/lib/components/Close/styles.module.scss +2 -3
  52. package/lib/components/DictionaryTrigger/index.js +26 -1
  53. package/lib/{DictionaryTrigger.js.map → components/DictionaryTrigger/index.js.map} +1 -1
  54. package/lib/components/DictionaryTrigger/styles.module.scss +6 -8
  55. package/lib/components/Drawer/Drawer.d.ts +0 -4
  56. package/lib/components/Drawer/DrawerBackButton.module.scss +1 -2
  57. package/lib/components/Drawer/styles.module.scss +6 -3
  58. package/lib/components/Dropdown/SingleSelect/styles.module.scss +0 -2
  59. package/lib/components/Dropdown/index.js +9 -17
  60. package/lib/components/Dropdown/index.js.map +1 -1
  61. package/lib/components/Dropdown/styles.module.scss +12 -14
  62. package/lib/components/Duolist/Duolist.d.ts +14 -2
  63. package/lib/components/Duolist/styles.module.scss +32 -8
  64. package/lib/components/Duolist/styles.module.scss.d.ts +3 -0
  65. package/lib/components/ElementHeader/ElementHeader.d.ts +1 -1
  66. package/lib/components/ElementHeader/styles.module.scss +1 -1
  67. package/lib/components/EmptyState/styles.module.scss +1 -2
  68. package/lib/components/ErrorWrapper/styles.module.scss +3 -3
  69. package/lib/components/Expander/styles.module.scss +0 -2
  70. package/lib/components/Expander/styles.module.scss.d.ts +1 -1
  71. package/lib/components/ExpanderList/index.js +20 -19
  72. package/lib/components/ExpanderList/index.js.map +1 -1
  73. package/lib/components/ExpanderList/styles.module.scss +10 -11
  74. package/lib/components/FavoriteButton/index.js +3 -3
  75. package/lib/components/FavoriteButton/index.js.map +1 -1
  76. package/lib/components/FavoriteButton/styles.module.scss +0 -1
  77. package/lib/components/Filter/FilterButton/styles.module.scss +5 -6
  78. package/lib/components/Filter/FilterButtonAndChipsWrapper/styles.module.scss +0 -1
  79. package/lib/components/Filter/FilterDrawer/styles.module.scss +0 -1
  80. package/lib/components/Filter/FilterLinkList/FilterLinkList.module.scss +5 -6
  81. package/lib/components/Filter/FilterOverviewSearch/styles.module.scss +1 -4
  82. package/lib/components/Filter/FilterSearch/styles.module.scss +14 -15
  83. package/lib/components/Filter/FilterSort/styles.module.scss +1 -2
  84. package/lib/components/Filter/FilterStateWrapper/styles.module.scss +0 -2
  85. package/lib/components/Filter/LoaderSpinner/styles.module.scss +2 -4
  86. package/lib/components/FormFieldTag/styles.module.scss +0 -1
  87. package/lib/components/FormGroup/styles.module.scss +0 -1
  88. package/lib/components/HelpBubble/styles.module.scss +0 -1
  89. package/lib/components/HelpDetails/styles.module.scss +2 -4
  90. package/lib/components/HelpDrawer/styles.module.scss +1 -2
  91. package/lib/components/HelpPanel/HelpPanel.d.ts +2 -2
  92. package/lib/components/HelpPanel/index.js +1 -17
  93. package/lib/components/HelpPanel/index.js.map +1 -1
  94. package/lib/components/HelpPanel/styles.module.scss +2 -22
  95. package/lib/components/HelpPanel/styles.module.scss.d.ts +0 -4
  96. package/lib/components/HelpTeaser/styles.module.scss +7 -9
  97. package/lib/components/HelpTriggerIcon/HelpTriggerIcon.d.ts +2 -2
  98. package/lib/components/HelpTriggerIcon/styles.module.scss +20 -22
  99. package/lib/components/HelpTriggerIcon/styles.module.scss.d.ts +1 -1
  100. package/lib/components/HelpTriggerInline/styles.module.scss +3 -5
  101. package/lib/components/HelpTriggerStandalone/styles.module.scss +3 -5
  102. package/lib/components/HighlightPanel/styles.module.scss +2 -3
  103. package/lib/components/Icons/AdditionalIconInformation.d.ts +4 -0
  104. package/lib/components/Icons/AdditionalIconInformation.js +14 -10
  105. package/lib/components/Icons/AdditionalIconInformation.js.map +1 -1
  106. package/lib/components/Icons/HistoryDocument.js +6 -7
  107. package/lib/components/Icons/HistoryDocument.js.map +1 -1
  108. package/lib/components/Icons/IconNames.d.ts +1 -1
  109. package/lib/components/Icons/IconNames.js +1 -0
  110. package/lib/components/Icons/IconNames.js.map +1 -1
  111. package/lib/components/Icons/YesNo.d.ts +3 -0
  112. package/lib/components/Icons/YesNo.js +53 -0
  113. package/lib/components/Icons/YesNo.js.map +1 -0
  114. package/lib/components/Illustrations/IllustrationNames.d.ts +1 -1
  115. package/lib/components/Illustrations/IllustrationNames.js +2 -0
  116. package/lib/components/Illustrations/IllustrationNames.js.map +1 -1
  117. package/lib/components/Illustrations/MoveAway.d.ts +11 -0
  118. package/lib/components/Illustrations/MoveAway.js +18 -0
  119. package/lib/components/Illustrations/MoveAway.js.map +1 -0
  120. package/lib/components/Illustrations/MoveAwayMedium.d.ts +3 -0
  121. package/lib/components/Illustrations/MoveAwayMedium.js +114 -0
  122. package/lib/components/Illustrations/MoveAwayMedium.js.map +1 -0
  123. package/lib/components/InfoTeaser/styles.module.scss +6 -8
  124. package/lib/components/Label/styles.module.scss +1 -1
  125. package/lib/components/LinkList/LinkList.d.ts +1 -1
  126. package/lib/components/LinkList/styles.module.scss +9 -11
  127. package/lib/components/LinkList/styles.module.scss.d.ts +1 -1
  128. package/lib/components/ListEditMode/styles.module.scss +5 -7
  129. package/lib/components/Loader/Loader.d.ts +1 -1
  130. package/lib/components/Loader/index.js +4 -4
  131. package/lib/components/Loader/index.js.map +1 -1
  132. package/lib/components/Loader/styles.module.scss +7 -7
  133. package/lib/components/Loader/styles.module.scss.d.ts +3 -3
  134. package/lib/components/Modal/constants.d.ts +1 -1
  135. package/lib/components/Modal/index.js +2 -2
  136. package/lib/components/Modal/index.js.map +1 -1
  137. package/lib/components/Modal/styles.module.scss +14 -19
  138. package/lib/components/Modal/styles.module.scss.d.ts +2 -3
  139. package/lib/components/Panel/index.js +1 -1
  140. package/lib/components/Panel/index.js.map +1 -1
  141. package/lib/components/Panel/styles.module.scss +15 -16
  142. package/lib/components/Panel/styles.module.scss.d.ts +1 -1
  143. package/lib/components/PopMenu/index.js +7 -4
  144. package/lib/components/PopMenu/index.js.map +1 -1
  145. package/lib/components/PopOver/styles.module.scss +1 -3
  146. package/lib/components/Progressbar/Progressbar.d.ts +1 -1
  147. package/lib/components/Progressbar/constants.d.ts +1 -1
  148. package/lib/components/Progressbar/index.js +4 -4
  149. package/lib/components/Progressbar/index.js.map +1 -1
  150. package/lib/components/Radio/Radio.d.ts +28 -0
  151. package/lib/components/Radio/index.d.ts +3 -0
  152. package/lib/components/Radio/index.js +7 -0
  153. package/lib/components/Radio/index.js.map +1 -0
  154. package/lib/components/{RadioButton → Radio}/styles.module.scss +8 -9
  155. package/lib/components/Radio/styles.module.scss.d.ts +26 -0
  156. package/lib/components/ServiceMessage/styles.module.scss +20 -22
  157. package/lib/components/Slider/styles.module.scss +1 -2
  158. package/lib/components/StatusDot/styles.module.scss +4 -5
  159. package/lib/components/StickyNote/index.js +2 -2
  160. package/lib/components/StickyNote/index.js.map +1 -1
  161. package/lib/components/StickyNote/styles.module.scss +9 -10
  162. package/lib/components/Tabs/TabList/styles.module.scss +20 -18
  163. package/lib/components/Tabs/TabPanel/styles.module.scss +2 -3
  164. package/lib/components/Tabs/styles.module.scss +0 -1
  165. package/lib/components/Tag/styles.module.scss +0 -1
  166. package/lib/components/Tile/styles.module.scss +5 -7
  167. package/lib/components/Toast/styles.module.scss +0 -1
  168. package/lib/components/Toggle/styles.module.scss +9 -10
  169. package/lib/components/Validation/index.js +2 -2
  170. package/lib/components/Validation/index.js.map +1 -1
  171. package/lib/components/VisualCheckboxCloud/Checkbox/styles.module.scss +0 -2
  172. package/lib/components/VisualCheckboxCloud/styles.module.scss +0 -1
  173. package/lib/components/VisualCheckboxGroup/VisualCheckbox/styles.module.scss +0 -2
  174. package/lib/components/VisualCheckboxGroup/styles.module.scss +0 -1
  175. package/lib/components/VisualContentgroupWithImage/styles.module.scss +0 -1
  176. package/lib/components/VisualRadioCloud/Radio/index.js +1 -1
  177. package/lib/components/VisualRadioCloud/Radio/styles.module.scss +0 -2
  178. package/lib/components/VisualRadioCloud/index.js +1 -1
  179. package/lib/components/VisualRadioCloud/styles.module.scss +0 -1
  180. package/lib/components/VisualRadioGroup/VisualRadio/styles.module.scss +0 -2
  181. package/lib/components/VisualRadioGroup/styles.module.scss +0 -1
  182. package/lib/constants.d.ts +2 -3
  183. package/lib/constants.js +2 -3
  184. package/lib/constants.js.map +1 -1
  185. package/lib/floating-ui.react.js +1 -458
  186. package/lib/floating-ui.react.js.map +1 -1
  187. package/lib/hooks/useDismissablePopover.d.ts +20 -0
  188. package/lib/hooks/useDismissablePopover.js +66 -0
  189. package/lib/hooks/useDismissablePopover.js.map +1 -0
  190. package/lib/hooks/useOutsideEvent.d.ts +3 -0
  191. package/lib/hooks/useOutsideEvent.js +24 -3
  192. package/lib/hooks/useOutsideEvent.js.map +1 -1
  193. package/lib/hooks/useReturnFocusOnClose.d.ts +7 -0
  194. package/lib/hooks/useReturnFocusOnClose.js +22 -0
  195. package/lib/hooks/useReturnFocusOnClose.js.map +1 -0
  196. package/lib/index.d.ts +2 -0
  197. package/lib/index.js +3 -1
  198. package/lib/scss/_visual-form.scss +47 -47
  199. package/lib/scss/helsenorge.scss +1 -0
  200. package/lib/scss/supernova/styles/colors.css +177 -122
  201. package/lib/scss/supernova/styles/typography.css +58 -51
  202. package/lib/scss/supernova-legacy/index.css +2 -0
  203. package/lib/scss/supernova-legacy/styles/legacy-colors.css +111 -0
  204. package/lib/utils/formSpacing.js +3 -3
  205. package/lib/utils/formSpacing.js.map +1 -1
  206. package/package.json +8 -14
  207. package/scss/_visual-form.scss +47 -47
  208. package/scss/helsenorge.scss +1 -0
  209. package/scss/supernova/styles/colors.css +177 -122
  210. package/scss/supernova/styles/typography.css +58 -51
  211. package/scss/supernova-legacy/index.css +2 -0
  212. package/scss/supernova-legacy/styles/legacy-colors.css +111 -0
  213. package/lib/DictionaryTrigger.js +0 -27
  214. package/lib/RadioButton.js +0 -84
  215. package/lib/RadioButton.js.map +0 -1
  216. package/lib/components/HelpTooltip/HelpTooltip.d.ts +0 -12
  217. package/lib/components/HelpTooltip/index.d.ts +0 -3
  218. package/lib/components/HelpTooltip/index.js +0 -48
  219. package/lib/components/HelpTooltip/index.js.map +0 -1
  220. package/lib/components/RadioButton/RadioButton.d.ts +0 -28
  221. package/lib/components/RadioButton/index.d.ts +0 -3
  222. package/lib/components/RadioButton/index.js +0 -7
  223. package/lib/components/RadioButton/index.js.map +0 -1
  224. package/lib/components/RadioButton/styles.module.scss.d.ts +0 -26
  225. package/lib/designsystem-react.css +0 -273
  226. /package/lib/components/{RadioButton → Radio}/RadioMarker/RadioMarker.d.ts +0 -0
  227. /package/lib/components/{RadioButton → Radio}/RadioMarker/styles.module.scss +0 -0
  228. /package/lib/components/{RadioButton → Radio}/RadioMarker/styles.module.scss.d.ts +0 -0
@@ -1,6 +1,5 @@
1
1
  @use 'sass:map';
2
2
  @use '../../scss/breakpoints' as breakpoints;
3
- @import '../../scss/supernova/styles/colors.css';
4
3
 
5
4
  $desktop-size: 3rem;
6
5
  $mobile-inner-size: 2.375rem;
@@ -44,7 +43,7 @@ $mobile-outer-size: 2.75rem;
44
43
  }
45
44
 
46
45
  :focus-visible > & {
47
- outline: 3px solid var(--color-action-border-onlight-focus);
46
+ outline: 3px solid var(--color-action-border-dark-focus);
48
47
  border-radius: 0;
49
48
  border: 0;
50
49
  }
@@ -2,8 +2,6 @@
2
2
  @use '../../scss/palette' as palette;
3
3
  @use '../../scss/font-settings' as font-settings;
4
4
  @use '../../scss/breakpoints' as breakpoints;
5
- @import '../../scss/supernova/styles/colors.css';
6
- @import '../../scss/supernova/styles/spacers.css';
7
5
 
8
6
  .drawer {
9
7
  position: fixed;
@@ -115,7 +113,12 @@
115
113
  }
116
114
 
117
115
  &--padding-extra {
118
- padding: var(--core-space-xs) var(--core-space-s);
116
+ padding-top: var(--core-space-xs);
117
+ padding-bottom: var(--core-space-xs);
118
+
119
+ @media (min-width: map.get(breakpoints.$grid-breakpoints, xs)) {
120
+ padding: var(--core-space-xs) var(--core-space-s);
121
+ }
119
122
 
120
123
  @media (min-width: map.get(breakpoints.$grid-breakpoints, md)) {
121
124
  padding: var(--core-space-xs) var(--core-space-m);
@@ -1,8 +1,6 @@
1
1
  @use 'sass:map';
2
2
  @use 'sass:meta';
3
3
  @use 'sass:string';
4
- @import '../../../scss/supernova/styles/colors.css';
5
- @import '../../../scss/supernova/styles/spacers.css';
6
4
 
7
5
  .single-select-item {
8
6
  cursor: pointer;
@@ -9,9 +9,9 @@ import { useIsMobileBreakpoint } from "../../hooks/useIsMobileBreakpoint.js";
9
9
  import { t as Button_default } from "../../Button.js";
10
10
  import { useToggle } from "../../hooks/useToggle.js";
11
11
  import { useKeyboardEvent } from "../../hooks/useKeyboardEvent.js";
12
- import { useOutsideEvent } from "../../hooks/useOutsideEvent.js";
12
+ import { useDismissablePopover } from "../../hooks/useDismissablePopover.js";
13
13
  import Checkbox_default from "../Checkbox/index.js";
14
- import { _ as autoUpdate, f as flip, g as size, h as shift, m as offset, o as useFloating } from "../../floating-ui.react.js";
14
+ import { a as useFloating, d as offset, f as shift, l as flip, m as autoUpdate, p as size } from "../../floating-ui.react.js";
15
15
  import { n as HN_Designsystem_Dropdown_en_GB_default, t as HN_Designsystem_Dropdown_nb_NO_default } from "../../HN.Designsystem.Dropdown.nb-NO.js";
16
16
  import { n as SingleSelectContext, t as SingleSelectItem } from "../../SingleSelectItem.js";
17
17
  import ChevronDown from "../Icons/ChevronDown.js";
@@ -126,11 +126,12 @@ var DropdownBase = (props) => {
126
126
  openedByKeyboard.current = isKeyboard;
127
127
  toggleIsOpen();
128
128
  };
129
- const handleClose = () => {
130
- if (!isOpen) return;
131
- toggleIsOpen();
132
- buttonRef.current?.focus();
133
- };
129
+ const handleClose = useDismissablePopover({
130
+ popoverRef: dropdownRef,
131
+ triggerRef: buttonRef,
132
+ isOpen,
133
+ onClose: toggleIsOpen
134
+ });
134
135
  useEffect(() => {
135
136
  if (isOpen && openedByKeyboard.current) {
136
137
  (childrenRefList.current?.find((r) => r.current && !r.current.hasAttribute("disabled")))?.current?.focus();
@@ -144,13 +145,6 @@ var DropdownBase = (props) => {
144
145
  const handleKeyboardNavigation = (event) => {
145
146
  if (!childrenRefList.current) return;
146
147
  const key = event.key;
147
- if (key === KeyboardEventKey.Escape) {
148
- if (isOpen) {
149
- event.preventDefault();
150
- handleClose();
151
- }
152
- return;
153
- }
154
148
  if (!isOpen) {
155
149
  if (isListNavKey(key)) {
156
150
  event.preventDefault();
@@ -175,11 +169,9 @@ var DropdownBase = (props) => {
175
169
  KeyboardEventKey.ArrowUp,
176
170
  KeyboardEventKey.End,
177
171
  KeyboardEventKey.Enter,
178
- KeyboardEventKey.Escape,
179
172
  KeyboardEventKey.Home,
180
173
  KeyboardEventKey.Space
181
174
  ]);
182
- useOutsideEvent(dropdownRef, () => isOpen && handleClose());
183
175
  const renderChildren = React.Children.map(children, (child, index) => {
184
176
  const element = child;
185
177
  return /* @__PURE__ */ jsx("li", {
@@ -258,7 +250,7 @@ var DropdownBase = (props) => {
258
250
  }), !isSingleSelect && !noCloseButton && /* @__PURE__ */ jsx("div", {
259
251
  className: styles.dropdown__close,
260
252
  children: /* @__PURE__ */ jsx(Button_default, {
261
- onClick: handleClose,
253
+ onClick: () => handleClose(),
262
254
  children: mergedResources.closeText
263
255
  })
264
256
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Dropdown/resourceHelper.ts","../../../src/components/Dropdown/SingleSelect/SingleSelect.tsx","../../../src/components/Dropdown/Dropdown.tsx","../../../src/components/Dropdown/index.ts"],"sourcesContent":["import type { HNDesignsystemDropdown } from '../../resources/Resources';\n\nimport { LanguageLocales } from '../../constants';\nimport enGB from '../../resources/HN.Designsystem.Dropdown.en-GB.json';\nimport nbNO from '../../resources/HN.Designsystem.Dropdown.nb-NO.json';\n\nexport const getResources = (language: LanguageLocales): HNDesignsystemDropdown => {\n switch (language) {\n case LanguageLocales.ENGLISH:\n return enGB;\n case LanguageLocales.NORWEGIAN:\n default:\n return nbNO;\n }\n};\n","import React from 'react';\n\nimport { SingleSelectContext } from './utils';\n\nexport type SingleSelectContextType = {\n name?: string;\n disabled?: boolean;\n required?: boolean;\n value?: string;\n onValueChange?: (newValue: string, e?: React.SyntheticEvent) => void;\n};\n\nexport interface SingleSelectProps {\n name?: string;\n disabled?: boolean;\n defaultValue?: string;\n onValueChange?: (newValue: string, e?: React.SyntheticEvent) => void;\n children: React.ReactNode;\n}\n\nexport const SingleSelect: React.FC<SingleSelectProps> = ({ name, disabled, defaultValue, onValueChange, children }) => {\n const [selected, setSelected] = React.useState<string | undefined>(defaultValue);\n\n const context = React.useMemo<SingleSelectContextType>(\n () => ({\n name,\n disabled,\n value: selected,\n onValueChange: (v, e): void => {\n setSelected(v);\n onValueChange?.(v, e);\n },\n }),\n [name, disabled, selected, onValueChange]\n );\n\n return <SingleSelectContext.Provider value={context}>{children}</SingleSelectContext.Provider>;\n};\n","import type { ComponentType } from 'react';\nimport React, { useEffect, useRef, useId } from 'react';\n\nimport { autoUpdate, offset, shift, size, useFloating, flip } from '@floating-ui/react';\nimport classNames from 'classnames';\nimport { clamp } from 'motion/react';\n\nimport type { SingleSelectItemProps } from './SingleSelect/SingleSelectItem';\nimport type { HNDesignsystemDropdown } from '../../resources/Resources';\nimport type { CheckboxProps } from '../Checkbox';\nimport type { SvgIcon } from '../Icon';\nimport type { IconName } from '../Icons/IconNames';\nimport type { LabelProps } from '../Label';\n\nimport {\n AnalyticsId,\n IconSize,\n KeyboardEventKey,\n LanguageLocales,\n ZIndex,\n usePseudoClasses,\n useKeyboardEvent,\n useOutsideEvent,\n useToggle,\n} from '../..';\nimport { getResources } from './resourceHelper';\nimport { SingleSelectItem } from './SingleSelect/SingleSelectItem';\nimport { useIsMobileBreakpoint } from '../../hooks/useIsMobileBreakpoint';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { isComponent } from '../../utils/component';\nimport { mergeRefs } from '../../utils/refs';\nimport Button from '../Button';\nimport Checkbox from '../Checkbox';\nimport Icon from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport PlusSmall from '../Icons/PlusSmall';\nimport Label from '../Label';\nimport LazyIcon from '../LazyIcon';\nimport { SingleSelect } from './SingleSelect/SingleSelect';\n\nimport styles from './styles.module.scss';\n\ntype DropdownVariants = 'fill' | 'transparent' | 'borderless';\n\nexport interface DropdownProps {\n /** Text on the trigger button that opens the dropdown */\n triggerText: string;\n /** Sets the dropdown content */\n children: React.ReactNode;\n /** Minimum width for the dropdown in pixels. Does not affect trigger button. */\n dropdownMinWidth?: number;\n /** Minimum width for the trigger in pixels. Does not apply for borderless variant */\n triggerMinWidth?: number;\n /** Disables rendring of the close button in the list */\n noCloseButton?: boolean;\n /** Called when dropdown is open/closed */\n onToggle?: (isOpen: boolean) => void;\n /** Whether the dropdown is open or not */\n open?: boolean;\n /** Makes the dropdown disabled */\n disabled?: boolean;\n /** Sets the data-testid attribute on the dropdown button */\n testId?: string;\n /** Overrides the default z-index of the DropDownContent */\n zIndex?: number;\n /** Resources for component */\n resources?: Partial<HNDesignsystemDropdown>;\n /** Adds an icon to the trigger */\n svgIcon?: SvgIcon | IconName;\n /** Sets the visual variant of the Dropdown */\n variant?: DropdownVariants;\n}\n\nexport const DropdownBase: React.FC<DropdownProps> = props => {\n const {\n triggerText,\n noCloseButton = false,\n onToggle,\n dropdownMinWidth,\n triggerMinWidth,\n open = false,\n children,\n testId,\n disabled,\n zIndex = ZIndex.PopOver,\n resources,\n svgIcon,\n variant = 'fill',\n } = props;\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionsRef = useRef<HTMLUListElement>(null);\n const childrenRefList = useRef(React.Children.map(children, () => React.createRef<HTMLElement>()));\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const { isHovered } = usePseudoClasses<HTMLButtonElement | null>(buttonRef);\n const openedByKeyboard = useRef<boolean>(false);\n const { value: isOpen, toggleValue: toggleIsOpen } = useToggle(!disabled && open, onToggle);\n const isMobile = useIsMobileBreakpoint();\n const triggerActualMinWidth = variant !== 'borderless' && typeof triggerMinWidth != 'undefined' ? `${triggerMinWidth}px` : 'auto';\n const triggerMinWidthLimit = isMobile ? 96 : 112;\n const dropdownFloatingPadding = 15;\n const maxWidth = isMobile ? 384 : 400;\n const maxHeight = isMobile ? 384 : 464;\n const toggleTextId = useId();\n const optionIdPrefix = useId();\n const contentId = useId();\n const leftIconProps = {\n className: styles['dropdown__left-icon'],\n size: IconSize.XSmall,\n isHovered: !disabled && isHovered,\n };\n\n const isSingleSelect = React.Children.toArray(children).every(\n child => React.isValidElement(child) && isComponent<SingleSelectItemProps>(child, SingleSelectItem)\n );\n const isMultiSelect = React.Children.toArray(children).every(\n child => React.isValidElement(child) && isComponent<CheckboxProps>(child, Checkbox)\n );\n\n const { language } = useLanguage<LanguageLocales>(LanguageLocales.NORWEGIAN);\n const defaultResources = getResources(language);\n const mergedResources: HNDesignsystemDropdown = {\n ...defaultResources,\n ...resources,\n };\n\n const toggleClasses = classNames(styles.dropdown__toggle, {\n [styles['dropdown__toggle--open']]: isOpen && !disabled,\n [styles['dropdown__toggle--with-icon']]: typeof svgIcon !== 'undefined',\n [styles['dropdown__toggle--transparent']]: variant === 'transparent',\n [styles['dropdown__toggle--borderless']]: variant === 'borderless',\n });\n const contentClasses = classNames(styles.dropdown__content, isOpen && styles['dropdown__content--open']);\n const listItemClasses = classNames(styles['dropdown__list-item'], { [styles['dropdown__list-item--single-select']]: isSingleSelect });\n\n const { refs, floatingStyles } = useFloating({\n strategy: 'fixed',\n placement: 'bottom-start',\n middleware: [\n offset(8),\n // Hvis det ikke er plass på høyre side flipper vi dropdownlisten fra bottom-start til bottom-end\n flip({ mainAxis: false, fallbackPlacements: ['bottom-end'], padding: dropdownFloatingPadding }),\n // Shift fungerer som en fallback for flip og unngår at availableWidth ikke oppdaterer seg ved skjermbreddeendring\n shift({ padding: dropdownFloatingPadding }),\n // Hvis det ikke er plass på noen av sidene krymper vi bredden på listen med size\n size({\n padding: dropdownFloatingPadding,\n apply({ availableWidth, availableHeight, elements, rects }) {\n const triggerW = rects.reference.width;\n const minProp = typeof dropdownMinWidth !== 'undefined' ? clamp(0, maxWidth, dropdownMinWidth) : 0;\n const targetW = Math.max(triggerW, minProp);\n\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.min(targetW, availableWidth)}px`,\n maxHeight: `${Math.min(maxHeight, availableHeight)}px`,\n overflowY: 'auto',\n overflowX: 'hidden',\n });\n },\n }),\n ],\n whileElementsMounted: isOpen ? autoUpdate : undefined,\n });\n\n const handleOpen = (isKeyboard: boolean): void => {\n openedByKeyboard.current = isKeyboard;\n toggleIsOpen();\n };\n\n const handleClose = (): void => {\n if (!isOpen) return;\n\n toggleIsOpen();\n buttonRef.current?.focus();\n };\n\n useEffect(() => {\n if (isOpen && openedByKeyboard.current) {\n const firstEnabled = childrenRefList.current?.find(r => r.current && !r.current.hasAttribute('disabled'));\n firstEnabled?.current?.focus();\n openedByKeyboard.current = false;\n }\n }, [isOpen]);\n\n const focusByIndex = (nextIndex: number): void => {\n childrenRefList.current?.[nextIndex]?.current?.focus();\n };\n\n const isListNavKey = (key: string): boolean =>\n key === KeyboardEventKey.ArrowDown || key === KeyboardEventKey.ArrowUp || key === KeyboardEventKey.Home || key === KeyboardEventKey.End;\n\n const handleKeyboardNavigation = (event: KeyboardEvent): void => {\n if (!childrenRefList.current) return;\n\n const key = event.key as KeyboardEventKey;\n\n if (key === KeyboardEventKey.Escape) {\n if (isOpen) {\n event.preventDefault();\n handleClose();\n }\n return;\n }\n\n if (!isOpen) {\n if (isListNavKey(key)) {\n event.preventDefault();\n handleOpen(true);\n }\n return;\n }\n\n if (!isListNavKey(key)) {\n return;\n }\n\n const index = childrenRefList.current.findIndex(x => x.current === (event.target as HTMLElement));\n let nextIndex = index;\n\n if (key === KeyboardEventKey.Home) {\n nextIndex = 0;\n } else if (key === KeyboardEventKey.End) {\n nextIndex = childrenRefList.current.length - 1;\n } else if (key === KeyboardEventKey.ArrowDown && index < childrenRefList.current.length - 1) {\n nextIndex = index + 1;\n } else if (key === KeyboardEventKey.ArrowUp && index > 0) {\n nextIndex = index - 1;\n }\n\n if (nextIndex !== -1) {\n event.preventDefault();\n focusByIndex(nextIndex);\n }\n };\n\n useKeyboardEvent(dropdownRef, handleKeyboardNavigation, [\n KeyboardEventKey.ArrowDown,\n KeyboardEventKey.ArrowUp,\n KeyboardEventKey.End,\n KeyboardEventKey.Enter,\n KeyboardEventKey.Escape,\n KeyboardEventKey.Home,\n KeyboardEventKey.Space,\n ]);\n\n useOutsideEvent(dropdownRef, () => isOpen && handleClose());\n\n const renderChildren = React.Children.map(children, (child, index) => {\n const element = child as React.ReactElement<{ ref?: React.Ref<HTMLElement | null> }>;\n\n return (\n <li className={listItemClasses} id={`${optionIdPrefix}-${index}`}>\n {React.isValidElement(element) && childrenRefList.current && childrenRefList.current[index]\n ? ((): React.ReactElement => {\n if (isMultiSelect && isComponent<CheckboxProps>(element, Checkbox)) {\n const label = element.props.label;\n if (React.isValidElement(label) && isComponent<LabelProps>(label, Label)) {\n return React.cloneElement(element, {\n ref: mergeRefs([element.props.ref, childrenRefList.current[index]]),\n label: React.cloneElement(label, {\n labelClassName: classNames((label.props as LabelProps)?.labelClassName, styles['dropdown__multiselect-item']),\n }),\n });\n }\n }\n\n return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n ref: mergeRefs([element.props.ref, childrenRefList.current[index]]),\n });\n })()\n : child}\n </li>\n );\n });\n\n return (\n <div className={styles.dropdown} ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={(): false | void => handleOpen(false)}\n className={toggleClasses}\n ref={mergeRefs([buttonRef, refs.setReference])}\n data-testid={testId}\n data-analyticsid={AnalyticsId.Dropdown}\n disabled={disabled}\n aria-labelledby={toggleTextId}\n aria-haspopup={true}\n aria-controls={contentId}\n aria-expanded={isOpen}\n style={{\n width: triggerActualMinWidth,\n maxWidth: '100%',\n minWidth: `${triggerMinWidthLimit}px`,\n }}\n >\n {svgIcon && (\n <>\n {typeof svgIcon === 'string' ? (\n <LazyIcon {...leftIconProps} iconName={svgIcon} />\n ) : (\n <Icon {...leftIconProps} svgIcon={svgIcon} />\n )}\n </>\n )}\n <span id={toggleTextId} className={styles.dropdown__toggle__text}>\n {triggerText}\n </span>\n <Icon\n svgIcon={!isSingleSelect ? PlusSmall : isOpen ? ChevronUp : ChevronDown}\n className={styles['dropdown__right-icon']}\n isHovered={!disabled && isHovered}\n size={IconSize.XSmall}\n />\n </button>\n <div\n key={dropdownMinWidth ?? 'auto'}\n id={contentId}\n className={contentClasses}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex: zIndex,\n }}\n >\n <ul className={styles.dropdown__options} role=\"group\" aria-labelledby={toggleTextId} tabIndex={-1} ref={optionsRef}>\n {isSingleSelect && <SingleSelect onValueChange={() => handleClose()}>{renderChildren}</SingleSelect>}\n {isMultiSelect && renderChildren}\n </ul>\n {!isSingleSelect && !noCloseButton && (\n <div className={styles.dropdown__close}>\n <Button onClick={handleClose}>{mergedResources.closeText}</Button>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport interface DropdownCompound extends React.FC<DropdownProps> {\n SingleSelectItem: ComponentType<SingleSelectItemProps>;\n}\nconst Dropdown = DropdownBase as DropdownCompound;\nDropdown.SingleSelectItem = SingleSelectItem;\nDropdownBase.displayName = 'Dropdown';\n\nexport default Dropdown;\n","import Dropdown from './Dropdown';\nexport * from './Dropdown';\nexport default Dropdown;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Dropdown/resourceHelper.ts","../../../src/components/Dropdown/SingleSelect/SingleSelect.tsx","../../../src/components/Dropdown/Dropdown.tsx","../../../src/components/Dropdown/index.ts"],"sourcesContent":["import type { HNDesignsystemDropdown } from '../../resources/Resources';\n\nimport { LanguageLocales } from '../../constants';\nimport enGB from '../../resources/HN.Designsystem.Dropdown.en-GB.json';\nimport nbNO from '../../resources/HN.Designsystem.Dropdown.nb-NO.json';\n\nexport const getResources = (language: LanguageLocales): HNDesignsystemDropdown => {\n switch (language) {\n case LanguageLocales.ENGLISH:\n return enGB;\n case LanguageLocales.NORWEGIAN:\n default:\n return nbNO;\n }\n};\n","import React from 'react';\n\nimport { SingleSelectContext } from './utils';\n\nexport type SingleSelectContextType = {\n name?: string;\n disabled?: boolean;\n required?: boolean;\n value?: string;\n onValueChange?: (newValue: string, e?: React.SyntheticEvent) => void;\n};\n\nexport interface SingleSelectProps {\n name?: string;\n disabled?: boolean;\n defaultValue?: string;\n onValueChange?: (newValue: string, e?: React.SyntheticEvent) => void;\n children: React.ReactNode;\n}\n\nexport const SingleSelect: React.FC<SingleSelectProps> = ({ name, disabled, defaultValue, onValueChange, children }) => {\n const [selected, setSelected] = React.useState<string | undefined>(defaultValue);\n\n const context = React.useMemo<SingleSelectContextType>(\n () => ({\n name,\n disabled,\n value: selected,\n onValueChange: (v, e): void => {\n setSelected(v);\n onValueChange?.(v, e);\n },\n }),\n [name, disabled, selected, onValueChange]\n );\n\n return <SingleSelectContext.Provider value={context}>{children}</SingleSelectContext.Provider>;\n};\n","import type { ComponentType } from 'react';\nimport React, { useEffect, useRef, useId } from 'react';\n\nimport { autoUpdate, offset, shift, size, useFloating, flip } from '@floating-ui/react';\nimport classNames from 'classnames';\nimport { clamp } from 'motion/react';\n\nimport type { SingleSelectItemProps } from './SingleSelect/SingleSelectItem';\nimport type { HNDesignsystemDropdown } from '../../resources/Resources';\nimport type { CheckboxProps } from '../Checkbox';\nimport type { SvgIcon } from '../Icon';\nimport type { IconName } from '../Icons/IconNames';\nimport type { LabelProps } from '../Label';\n\nimport {\n AnalyticsId,\n IconSize,\n KeyboardEventKey,\n LanguageLocales,\n ZIndex,\n usePseudoClasses,\n useDismissablePopover,\n useKeyboardEvent,\n useToggle,\n} from '../..';\nimport { getResources } from './resourceHelper';\nimport { SingleSelectItem } from './SingleSelect/SingleSelectItem';\nimport { useIsMobileBreakpoint } from '../../hooks/useIsMobileBreakpoint';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { isComponent } from '../../utils/component';\nimport { mergeRefs } from '../../utils/refs';\nimport Button from '../Button';\nimport Checkbox from '../Checkbox';\nimport Icon from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport ChevronUp from '../Icons/ChevronUp';\nimport PlusSmall from '../Icons/PlusSmall';\nimport Label from '../Label';\nimport LazyIcon from '../LazyIcon';\nimport { SingleSelect } from './SingleSelect/SingleSelect';\n\nimport styles from './styles.module.scss';\n\ntype DropdownVariants = 'fill' | 'transparent' | 'borderless';\n\nexport interface DropdownProps {\n /** Text on the trigger button that opens the dropdown */\n triggerText: string;\n /** Sets the dropdown content */\n children: React.ReactNode;\n /** Minimum width for the dropdown in pixels. Does not affect trigger button. */\n dropdownMinWidth?: number;\n /** Minimum width for the trigger in pixels. Does not apply for borderless variant */\n triggerMinWidth?: number;\n /** Disables rendring of the close button in the list */\n noCloseButton?: boolean;\n /** Called when dropdown is open/closed */\n onToggle?: (isOpen: boolean) => void;\n /** Whether the dropdown is open or not */\n open?: boolean;\n /** Makes the dropdown disabled */\n disabled?: boolean;\n /** Sets the data-testid attribute on the dropdown button */\n testId?: string;\n /** Overrides the default z-index of the DropDownContent */\n zIndex?: number;\n /** Resources for component */\n resources?: Partial<HNDesignsystemDropdown>;\n /** Adds an icon to the trigger */\n svgIcon?: SvgIcon | IconName;\n /** Sets the visual variant of the Dropdown */\n variant?: DropdownVariants;\n}\n\nexport const DropdownBase: React.FC<DropdownProps> = props => {\n const {\n triggerText,\n noCloseButton = false,\n onToggle,\n dropdownMinWidth,\n triggerMinWidth,\n open = false,\n children,\n testId,\n disabled,\n zIndex = ZIndex.PopOver,\n resources,\n svgIcon,\n variant = 'fill',\n } = props;\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const optionsRef = useRef<HTMLUListElement>(null);\n const childrenRefList = useRef(React.Children.map(children, () => React.createRef<HTMLElement>()));\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const { isHovered } = usePseudoClasses<HTMLButtonElement | null>(buttonRef);\n const openedByKeyboard = useRef<boolean>(false);\n const { value: isOpen, toggleValue: toggleIsOpen } = useToggle(!disabled && open, onToggle);\n const isMobile = useIsMobileBreakpoint();\n const triggerActualMinWidth = variant !== 'borderless' && typeof triggerMinWidth != 'undefined' ? `${triggerMinWidth}px` : 'auto';\n const triggerMinWidthLimit = isMobile ? 96 : 112;\n const dropdownFloatingPadding = 15;\n const maxWidth = isMobile ? 384 : 400;\n const maxHeight = isMobile ? 384 : 464;\n const toggleTextId = useId();\n const optionIdPrefix = useId();\n const contentId = useId();\n const leftIconProps = {\n className: styles['dropdown__left-icon'],\n size: IconSize.XSmall,\n isHovered: !disabled && isHovered,\n };\n\n const isSingleSelect = React.Children.toArray(children).every(\n child => React.isValidElement(child) && isComponent<SingleSelectItemProps>(child, SingleSelectItem)\n );\n const isMultiSelect = React.Children.toArray(children).every(\n child => React.isValidElement(child) && isComponent<CheckboxProps>(child, Checkbox)\n );\n\n const { language } = useLanguage<LanguageLocales>(LanguageLocales.NORWEGIAN);\n const defaultResources = getResources(language);\n const mergedResources: HNDesignsystemDropdown = {\n ...defaultResources,\n ...resources,\n };\n\n const toggleClasses = classNames(styles.dropdown__toggle, {\n [styles['dropdown__toggle--open']]: isOpen && !disabled,\n [styles['dropdown__toggle--with-icon']]: typeof svgIcon !== 'undefined',\n [styles['dropdown__toggle--transparent']]: variant === 'transparent',\n [styles['dropdown__toggle--borderless']]: variant === 'borderless',\n });\n const contentClasses = classNames(styles.dropdown__content, isOpen && styles['dropdown__content--open']);\n const listItemClasses = classNames(styles['dropdown__list-item'], { [styles['dropdown__list-item--single-select']]: isSingleSelect });\n\n const { refs, floatingStyles } = useFloating({\n strategy: 'fixed',\n placement: 'bottom-start',\n middleware: [\n offset(8),\n // Hvis det ikke er plass på høyre side flipper vi dropdownlisten fra bottom-start til bottom-end\n flip({ mainAxis: false, fallbackPlacements: ['bottom-end'], padding: dropdownFloatingPadding }),\n // Shift fungerer som en fallback for flip og unngår at availableWidth ikke oppdaterer seg ved skjermbreddeendring\n shift({ padding: dropdownFloatingPadding }),\n // Hvis det ikke er plass på noen av sidene krymper vi bredden på listen med size\n size({\n padding: dropdownFloatingPadding,\n apply({ availableWidth, availableHeight, elements, rects }) {\n const triggerW = rects.reference.width;\n const minProp = typeof dropdownMinWidth !== 'undefined' ? clamp(0, maxWidth, dropdownMinWidth) : 0;\n const targetW = Math.max(triggerW, minProp);\n\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.min(targetW, availableWidth)}px`,\n maxHeight: `${Math.min(maxHeight, availableHeight)}px`,\n overflowY: 'auto',\n overflowX: 'hidden',\n });\n },\n }),\n ],\n whileElementsMounted: isOpen ? autoUpdate : undefined,\n });\n\n const handleOpen = (isKeyboard: boolean): void => {\n openedByKeyboard.current = isKeyboard;\n toggleIsOpen();\n };\n\n const handleClose = useDismissablePopover({ popoverRef: dropdownRef, triggerRef: buttonRef, isOpen, onClose: toggleIsOpen });\n\n useEffect(() => {\n if (isOpen && openedByKeyboard.current) {\n const firstEnabled = childrenRefList.current?.find(r => r.current && !r.current.hasAttribute('disabled'));\n firstEnabled?.current?.focus();\n openedByKeyboard.current = false;\n }\n }, [isOpen]);\n\n const focusByIndex = (nextIndex: number): void => {\n childrenRefList.current?.[nextIndex]?.current?.focus();\n };\n\n const isListNavKey = (key: string): boolean =>\n key === KeyboardEventKey.ArrowDown || key === KeyboardEventKey.ArrowUp || key === KeyboardEventKey.Home || key === KeyboardEventKey.End;\n\n const handleKeyboardNavigation = (event: KeyboardEvent): void => {\n if (!childrenRefList.current) return;\n\n const key = event.key as KeyboardEventKey;\n\n if (!isOpen) {\n if (isListNavKey(key)) {\n event.preventDefault();\n handleOpen(true);\n }\n return;\n }\n\n if (!isListNavKey(key)) {\n return;\n }\n\n const index = childrenRefList.current.findIndex(x => x.current === (event.target as HTMLElement));\n let nextIndex = index;\n\n if (key === KeyboardEventKey.Home) {\n nextIndex = 0;\n } else if (key === KeyboardEventKey.End) {\n nextIndex = childrenRefList.current.length - 1;\n } else if (key === KeyboardEventKey.ArrowDown && index < childrenRefList.current.length - 1) {\n nextIndex = index + 1;\n } else if (key === KeyboardEventKey.ArrowUp && index > 0) {\n nextIndex = index - 1;\n }\n\n if (nextIndex !== -1) {\n event.preventDefault();\n focusByIndex(nextIndex);\n }\n };\n\n useKeyboardEvent(dropdownRef, handleKeyboardNavigation, [\n KeyboardEventKey.ArrowDown,\n KeyboardEventKey.ArrowUp,\n KeyboardEventKey.End,\n KeyboardEventKey.Enter,\n KeyboardEventKey.Home,\n KeyboardEventKey.Space,\n ]);\n\n const renderChildren = React.Children.map(children, (child, index) => {\n const element = child as React.ReactElement<{ ref?: React.Ref<HTMLElement | null> }>;\n\n return (\n <li className={listItemClasses} id={`${optionIdPrefix}-${index}`}>\n {React.isValidElement(element) && childrenRefList.current && childrenRefList.current[index]\n ? ((): React.ReactElement => {\n if (isMultiSelect && isComponent<CheckboxProps>(element, Checkbox)) {\n const label = element.props.label;\n if (React.isValidElement(label) && isComponent<LabelProps>(label, Label)) {\n return React.cloneElement(element, {\n ref: mergeRefs([element.props.ref, childrenRefList.current[index]]),\n label: React.cloneElement(label, {\n labelClassName: classNames((label.props as LabelProps)?.labelClassName, styles['dropdown__multiselect-item']),\n }),\n });\n }\n }\n\n return React.cloneElement(child as React.ReactElement<Record<string, unknown>>, {\n ref: mergeRefs([element.props.ref, childrenRefList.current[index]]),\n });\n })()\n : child}\n </li>\n );\n });\n\n return (\n <div className={styles.dropdown} ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={(): false | void => handleOpen(false)}\n className={toggleClasses}\n ref={mergeRefs([buttonRef, refs.setReference])}\n data-testid={testId}\n data-analyticsid={AnalyticsId.Dropdown}\n disabled={disabled}\n aria-labelledby={toggleTextId}\n aria-haspopup={true}\n aria-controls={contentId}\n aria-expanded={isOpen}\n style={{\n width: triggerActualMinWidth,\n maxWidth: '100%',\n minWidth: `${triggerMinWidthLimit}px`,\n }}\n >\n {svgIcon && (\n <>\n {typeof svgIcon === 'string' ? (\n <LazyIcon {...leftIconProps} iconName={svgIcon} />\n ) : (\n <Icon {...leftIconProps} svgIcon={svgIcon} />\n )}\n </>\n )}\n <span id={toggleTextId} className={styles.dropdown__toggle__text}>\n {triggerText}\n </span>\n <Icon\n svgIcon={!isSingleSelect ? PlusSmall : isOpen ? ChevronUp : ChevronDown}\n className={styles['dropdown__right-icon']}\n isHovered={!disabled && isHovered}\n size={IconSize.XSmall}\n />\n </button>\n <div\n key={dropdownMinWidth ?? 'auto'}\n id={contentId}\n className={contentClasses}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex: zIndex,\n }}\n >\n <ul className={styles.dropdown__options} role=\"group\" aria-labelledby={toggleTextId} tabIndex={-1} ref={optionsRef}>\n {isSingleSelect && <SingleSelect onValueChange={() => handleClose()}>{renderChildren}</SingleSelect>}\n {isMultiSelect && renderChildren}\n </ul>\n {!isSingleSelect && !noCloseButton && (\n <div className={styles.dropdown__close}>\n <Button onClick={(): void => handleClose()}>{mergedResources.closeText}</Button>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport interface DropdownCompound extends React.FC<DropdownProps> {\n SingleSelectItem: ComponentType<SingleSelectItemProps>;\n}\nconst Dropdown = DropdownBase as DropdownCompound;\nDropdown.SingleSelectItem = SingleSelectItem;\nDropdownBase.displayName = 'Dropdown';\n\nexport default Dropdown;\n","import Dropdown from './Dropdown';\nexport * from './Dropdown';\nexport default Dropdown;\n"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  @use 'sass:map';
2
2
  @use '../../scss/font-settings' as font-settings;
3
3
  @use '../../scss/breakpoints' as breakpoints;
4
- @import '../../scss/supernova/styles/colors.css';
5
- @import '../../scss/supernova/styles/spacers.css';
6
4
 
7
5
  .dropdown {
8
6
  position: relative;
@@ -21,11 +19,11 @@
21
19
  font-family: inherit;
22
20
  font-size: font-settings.$font-size-sm;
23
21
  line-height: 1.3rem; // Custom fordi teksten skal henge bedre sammen om den går over to linjer
24
- border-color: var(--color-base-border-onlight-emphasized);
22
+ border-color: var(--color-base-emphasized-border-dark);
25
23
  background-color: var(--core-color-white);
26
24
 
27
25
  &:hover:not(:disabled) {
28
- background-color: var(--color-base-background-neutral);
26
+ background-color: var(--color-base-neutral-background-light);
29
27
  }
30
28
 
31
29
  &:active:not(:disabled) {
@@ -40,15 +38,15 @@
40
38
 
41
39
  &:focus-visible {
42
40
  outline: none;
43
- border-color: var(--color-action-border-onlight-focus);
44
- box-shadow: 0 0 0 1px var(--color-action-border-onlight-focus);
41
+ border-color: var(--color-action-border-dark-focus);
42
+ box-shadow: 0 0 0 1px var(--color-action-border-dark-focus);
45
43
  }
46
44
 
47
45
  &:disabled {
48
46
  cursor: initial;
49
47
  color: var(--color-disabled-text);
50
48
  background-color: transparent;
51
- border-color: var(--color-disabled-border);
49
+ border-color: var(--color-disabled-border-dark);
52
50
  border-style: dashed;
53
51
  }
54
52
 
@@ -79,7 +77,7 @@
79
77
  }
80
78
 
81
79
  &--borderless#{&}--open {
82
- border-color: var(--color-base-border-onlight-emphasized);
80
+ border-color: var(--color-base-emphasized-border-dark);
83
81
  }
84
82
 
85
83
  &__text {
@@ -104,14 +102,14 @@
104
102
 
105
103
  &__left-icon,
106
104
  &__right-icon {
107
- fill: var(--color-action-graphics-onlight);
105
+ fill: var(--color-action-graphics-dark-normal);
108
106
 
109
107
  :hover > & {
110
- fill: var(--color-action-graphics-onlight-hover);
108
+ fill: var(--color-action-graphics-dark-hover);
111
109
  }
112
110
 
113
111
  :disabled > & {
114
- fill: var(--color-disabled-graphics);
112
+ fill: var(--color-disabled-graphics-dark);
115
113
  }
116
114
  }
117
115
 
@@ -144,7 +142,7 @@
144
142
 
145
143
  &__list-item {
146
144
  min-height: 44px;
147
- border-bottom: 1px solid var(--color-base-border-neutral-emphasized);
145
+ border-bottom: 1px solid var(--color-base-neutral-border-light-plus1);
148
146
 
149
147
  &:last-child {
150
148
  border-bottom: none;
@@ -172,8 +170,8 @@
172
170
  }
173
171
 
174
172
  &--single-select:has(:focus-visible) {
175
- border-color: var(--color-action-border-onlight-focus);
176
- outline: 4px solid var(--color-action-border-onlight-focus);
173
+ border-color: var(--color-action-border-dark-focus);
174
+ outline: 4px solid var(--color-action-border-dark-focus);
177
175
  outline-offset: -4px;
178
176
  }
179
177
  }
@@ -2,13 +2,20 @@ import { default as React } from 'react';
2
2
  import { TitleProps } from '../Title';
3
3
  import { Breakpoint } from '../../hooks/useBreakpoint';
4
4
  export type DuolistVariants = 'normal' | 'line';
5
- export type BoldColumn = 'first' | 'second' | 'none';
6
5
  export type Border = 'no-border' | 'border';
6
+ export type HideLines = 'top' | 'bottom' | 'both';
7
+ export interface ResponsiveHideLines {
8
+ /** Hides lines on desktop (when the list is not collapsed) */
9
+ desktop?: HideLines;
10
+ /** Hides lines on mobile (when the list is collapsed, see useCollapsedFromAndBelowBreakpoint) */
11
+ mobile?: HideLines;
12
+ }
13
+ export type BoldColumn = 'first' | 'second' | 'none';
7
14
  export type Formats = 'formatted' | 'non-formatted';
8
15
  export interface DuolistProps {
9
16
  /** Determines which column is bold */
10
17
  boldColumn?: BoldColumn;
11
- /** Label of the Duolist */
18
+ /**@deprecated Border around the Duolist */
12
19
  border?: Border;
13
20
  /** Label of the Duolist */
14
21
  label?: React.ReactElement<TitleProps>;
@@ -16,8 +23,13 @@ export interface DuolistProps {
16
23
  format?: Formats;
17
24
  /** Character separator for non-formatted format */
18
25
  separator?: string;
26
+ /** Turns the built-in padding of the list on/off. Default: true */
27
+ padding?: boolean;
19
28
  /** Sets the visual variant of the Duolist. */
20
29
  variant?: DuolistVariants;
30
+ /** Hides the top line, bottom line or both. Only applies to the 'line' variant.
31
+ * Accepts a single value for all screen sizes, or an object to configure desktop and mobile (collapsed) separately. */
32
+ hideLines?: HideLines | ResponsiveHideLines;
21
33
  /** Sets the content of the Duolist. */
22
34
  children: React.ReactNode;
23
35
  /** Adds custom classes to the element. */
@@ -78,30 +78,54 @@
78
78
  dt {
79
79
  padding-top: spacers.getSpacer(3xs);
80
80
  padding-top: spacers.getSpacer(2xs);
81
+
82
+ &:first-of-type {
83
+ border-top: 1px solid var(--color-base-border-dark);
84
+ }
81
85
  }
82
86
 
83
87
  dd {
84
88
  padding-bottom: spacers.getSpacer(2xs);
85
- border-bottom: 1px solid var(--color-base-border-onlight);
86
-
87
- &:last-of-type {
88
- border-bottom: 0;
89
- }
89
+ border-bottom: 1px solid var(--color-base-border-dark);
90
90
  }
91
91
  }
92
92
 
93
93
  &--line#{&}--not-collapsed {
94
94
  dt,
95
95
  dd {
96
- border-top: 1px solid var(--color-base-border-onlight);
96
+ border-bottom: 1px solid var(--color-base-border-dark);
97
97
  padding-top: spacers.getSpacer(2xs);
98
98
 
99
- &:last-of-type {
100
- border-bottom: 0.062rem solid var(--color-base-border-onlight);
99
+ &:first-of-type {
100
+ border-top: 1px solid var(--color-base-border-dark);
101
101
  }
102
102
  }
103
103
  }
104
104
 
105
+ &--line#{&}--hide-top-line {
106
+ dt:first-of-type,
107
+ dd:first-of-type {
108
+ border-top: 0;
109
+ padding-top: 0;
110
+ }
111
+ }
112
+
113
+ &--line#{&}--hide-bottom-line {
114
+ dt:last-of-type,
115
+ dd:last-of-type {
116
+ border-bottom: 0;
117
+ }
118
+ }
119
+
120
+ &--no-padding#{&}--collapsed,
121
+ &--no-padding#{&}--not-collapsed {
122
+ dt,
123
+ dd {
124
+ padding-top: 0;
125
+ padding-bottom: 0;
126
+ }
127
+ }
128
+
105
129
  &--non-formatted {
106
130
  display: unset;
107
131
  }
@@ -7,7 +7,10 @@ export type Styles = {
7
7
  'duolist__dt--bold': string;
8
8
  'duolist__dt--non-formatted': string;
9
9
  'duolist--collapsed': string;
10
+ 'duolist--hide-bottom-line': string;
11
+ 'duolist--hide-top-line': string;
10
12
  'duolist--line': string;
13
+ 'duolist--no-padding': string;
11
14
  'duolist--non-formatted': string;
12
15
  'duolist--not-collapsed': string;
13
16
  'duolist-wrapper--border': string;
@@ -6,7 +6,7 @@ import { StatusDotProps, StatusDotType } from '../StatusDot';
6
6
  import { TitleTags } from '../Title';
7
7
  import { ElementHeaderTextProps, ElementHeaderTextType } from './ElementHeaderText/ElementHeaderText';
8
8
  import { StatusDotListProps, StatusDotListType } from './StatusDotList/StatusDotList';
9
- export type ElementHeaderSize = 'compact' | 'small' | 'medium' | 'large';
9
+ export type ElementHeaderSize = 'compact' | 'small' | 'normal' | 'large';
10
10
  export type ParentType = 'linklist' | 'expanderlist';
11
11
  export interface ElementHeaderType extends React.FC<ElementHeaderProps> {
12
12
  Avatar?: AvatarType;
@@ -127,7 +127,7 @@
127
127
  grid-area: chevron;
128
128
 
129
129
  svg {
130
- fill: var(--color-action-graphics-onlight);
130
+ fill: var(--color-action-graphics-dark-normal);
131
131
  height: 100%;
132
132
  }
133
133
 
@@ -2,7 +2,6 @@
2
2
  @use '../../scss/font-mixins' as fonts;
3
3
  @use '../../scss/spacers' as spacers;
4
4
  @use '../../scss/breakpoints' as breakpoints;
5
- @import '../../scss/supernova/styles/colors.css';
6
5
 
7
6
  .emptystate {
8
7
  display: flex;
@@ -20,7 +19,7 @@
20
19
  border-radius: 16px;
21
20
  border-style: dashed;
22
21
  border-width: 1px;
23
- border-color: var(--color-base-border-onlight-emphasized);
22
+ border-color: var(--color-base-emphasized-border-dark);
24
23
  }
25
24
 
26
25
  &--blank {
@@ -6,9 +6,9 @@
6
6
  .error-wrapper {
7
7
  &--with-error {
8
8
  padding: spacers.getSpacer(s) spacers.getSpacer(xs) spacers.getSpacer(m) spacers.getSpacer(2xs);
9
- background-color: var(--color-notification-background-error);
9
+ background-color: var(--color-notification-error-background);
10
10
  border: 1px solid var(--core-color-cherry-400);
11
- border-left: 4px solid var(--color-notification-border-error);
11
+ border-left: 4px solid var(--color-notification-error-border);
12
12
 
13
13
  @media (min-width: map.get(breakpoints.$grid-breakpoints, md)) {
14
14
  padding: spacers.getSpacer(s) spacers.getSpacer(m) spacers.getSpacer(l) spacers.getSpacer(m);
@@ -17,7 +17,7 @@
17
17
 
18
18
  &__errors {
19
19
  margin-top: 0;
20
- color: var(--color-notification-border-error);
20
+ color: var(--color-notification-error-border);
21
21
 
22
22
  @include fonts.label;
23
23
  }
@@ -4,8 +4,6 @@
4
4
  @use '../../scss/font-settings' as font-settings;
5
5
  @use '../Button/styles.module' as button;
6
6
  @use '../../scss/breakpoints' as breakpoints;
7
- @import '../../scss/supernova/styles/colors.css';
8
- @import '../../scss/supernova/styles/spacers.css';
9
7
 
10
8
  .expander {
11
9
  position: initial;
@@ -18,7 +18,7 @@ export type Styles = {
18
18
  'button--large-borderless': string;
19
19
  'button--large-non-borderless': string;
20
20
  'button--left-icon': string;
21
- 'button--medium': string;
21
+ 'button--normal': string;
22
22
  'button--on-dark': string;
23
23
  'button--only-icon': string;
24
24
  'button--outline': string;
@@ -73,7 +73,7 @@ var Expander = (props) => {
73
73
  children: renderElementHeader(title, {
74
74
  titleHtmlMarkup,
75
75
  isHovered: false,
76
- size: large ? "large" : "medium",
76
+ size: large ? "large" : "normal",
77
77
  parentType: "expanderlist",
78
78
  chevronIcon: void 0,
79
79
  icon,
@@ -98,7 +98,7 @@ var Expander = (props) => {
98
98
  children: renderElementHeader(title, {
99
99
  titleHtmlMarkup,
100
100
  isHovered: isHovered || isFocused,
101
- size: large ? "large" : "medium",
101
+ size: large ? "large" : "normal",
102
102
  parentType: "expanderlist",
103
103
  chevronIcon: isExpanded ? ChevronUp : ChevronDown,
104
104
  icon,
@@ -162,40 +162,41 @@ var ExpanderListComponent = (props) => {
162
162
  const id = getExpanderId(index);
163
163
  const expanded = activeExpander?.[id];
164
164
  const highlightTextChild = child.props.highlightText || highlightText;
165
+ const childProps = child.props;
166
+ const sharedProps = {
167
+ padding: childProps.padding ?? childPadding,
168
+ color: childProps.color ?? color,
169
+ large: childProps.large ?? large,
170
+ className: classNames(expanderListStyles["expander-list__item"], childProps.className),
171
+ variant: childProps.variant ?? variant,
172
+ zIndex: childProps.zIndex ?? zIndex,
173
+ highlightText: highlightTextChild
174
+ };
165
175
  if (editMode) return /* @__PURE__ */ jsx(ListEditMode_default, {
166
176
  color,
167
177
  variant,
168
- onDelete: child.props.onDelete,
178
+ onDelete: childProps.onDelete,
169
179
  children: React.cloneElement(child, {
180
+ ...sharedProps,
170
181
  id,
171
182
  key: index,
172
183
  expanded,
173
- padding: childPadding,
174
- color,
175
- large,
176
184
  "aria-expanded": false,
177
- className: expanderListStyles["expander-list__item"],
178
185
  renderChildrenWhenClosed: false,
179
- variant,
180
- zIndex,
181
- highlightText: highlightTextChild,
182
186
  editMode: true
183
187
  })
184
188
  });
185
189
  else return React.cloneElement(child, {
190
+ ...sharedProps,
186
191
  id,
187
192
  key: index,
188
193
  expanded,
189
- padding: childPadding,
190
- color,
191
- large,
192
194
  "aria-expanded": expanded,
193
- className: expanderListStyles["expander-list__item"],
194
- handleExpanderClick: (event) => handleExpanderClick(event, `${expanderIdBase}-${index}`),
195
- renderChildrenWhenClosed,
196
- variant,
197
- zIndex,
198
- highlightText: highlightTextChild
195
+ handleExpanderClick: (event) => {
196
+ childProps.handleExpanderClick?.(event);
197
+ handleExpanderClick(event, id);
198
+ },
199
+ renderChildrenWhenClosed: childProps.renderChildrenWhenClosed ?? renderChildrenWhenClosed
199
200
  });
200
201
  }
201
202
  return child;