@helsenorge/designsystem-react 15.3.0 → 15.5.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 (280) hide show
  1. package/lib/AnchorLink.js +4 -4
  2. package/lib/AnchorLink.js.map +1 -1
  3. package/lib/AsChildSlot.js.map +1 -1
  4. package/lib/Avatar.js +2 -2
  5. package/lib/Avatar.js.map +1 -1
  6. package/lib/Badge.js +2 -2
  7. package/lib/Badge.js.map +1 -1
  8. package/lib/Button.js +6 -6
  9. package/lib/Button.js.map +1 -1
  10. package/lib/CHANGELOG.md +29 -0
  11. package/lib/Checkbox.js +6 -6
  12. package/lib/Checkbox.js.map +1 -1
  13. package/lib/Checkbox2.js +2 -2
  14. package/lib/Checkbox2.js.map +1 -1
  15. package/lib/CheckboxMarker.js +2 -2
  16. package/lib/CheckboxMarker.js.map +1 -1
  17. package/lib/Chip.js +4 -4
  18. package/lib/Chip.js.map +1 -1
  19. package/lib/Close.js +3 -3
  20. package/lib/Close.js.map +1 -1
  21. package/lib/DictionaryTrigger.js +2 -2
  22. package/lib/DictionaryTrigger.js.map +1 -1
  23. package/lib/Drawer.js +57 -40
  24. package/lib/Drawer.js.map +1 -1
  25. package/lib/DrawerNavigation.js +106 -8
  26. package/lib/DrawerNavigation.js.map +1 -1
  27. package/lib/Duolist.js +5 -5
  28. package/lib/Duolist.js.map +1 -1
  29. package/lib/ElementHeader.js +9 -9
  30. package/lib/ElementHeader.js.map +1 -1
  31. package/lib/ElementHeaderText.js +4 -4
  32. package/lib/ElementHeaderText.js.map +1 -1
  33. package/lib/ErrorWrapper.js +2 -2
  34. package/lib/ErrorWrapper.js.map +1 -1
  35. package/lib/Expander.js +8 -8
  36. package/lib/Expander.js.map +1 -1
  37. package/lib/FilterButton.js +2 -2
  38. package/lib/FilterButton.js.map +1 -1
  39. package/lib/FilterButtonAndChipsWrapper.js +2 -2
  40. package/lib/FilterButtonAndChipsWrapper.js.map +1 -1
  41. package/lib/FilterLinkList.js +4 -4
  42. package/lib/FilterLinkList.js.map +1 -1
  43. package/lib/FilterOverviewSearch.js +2 -2
  44. package/lib/FilterOverviewSearch.js.map +1 -1
  45. package/lib/FilterSearch.js +31 -18
  46. package/lib/FilterSearch.js.map +1 -1
  47. package/lib/FormFieldTag.js +2 -2
  48. package/lib/FormFieldTag.js.map +1 -1
  49. package/lib/FormGroup.js +5 -5
  50. package/lib/FormGroup.js.map +1 -1
  51. package/lib/FormLayout.js +3 -3
  52. package/lib/FormLayout.js.map +1 -1
  53. package/lib/HelpDetails.js +5 -4
  54. package/lib/HelpDetails.js.map +1 -1
  55. package/lib/HelpTriggerIcon.js +2 -2
  56. package/lib/HelpTriggerIcon.js.map +1 -1
  57. package/lib/HelpTriggerStandalone.js +2 -2
  58. package/lib/HelpTriggerStandalone.js.map +1 -1
  59. package/lib/HighlightPanel.js +4 -4
  60. package/lib/HighlightPanel.js.map +1 -1
  61. package/lib/Highlighter.js +1 -1
  62. package/lib/Highlighter.js.map +1 -1
  63. package/lib/HorizontalScroll.js +4 -4
  64. package/lib/HorizontalScroll.js.map +1 -1
  65. package/lib/Icon.js +2 -2
  66. package/lib/Icon.js.map +1 -1
  67. package/lib/InfoTeaser.js +12 -11
  68. package/lib/InfoTeaser.js.map +1 -1
  69. package/lib/Input.js +12 -6
  70. package/lib/Input.js.map +1 -1
  71. package/lib/LazyIcon.js +3 -0
  72. package/lib/LazyIcon.js.map +1 -1
  73. package/lib/LinkList.js +6 -6
  74. package/lib/LinkList.js.map +1 -1
  75. package/lib/List.js +2 -2
  76. package/lib/List.js.map +1 -1
  77. package/lib/ListEditMode.js +4 -4
  78. package/lib/ListEditMode.js.map +1 -1
  79. package/lib/MaxCharacters.js +2 -2
  80. package/lib/MaxCharacters.js.map +1 -1
  81. package/lib/PanelTitle.js +2 -2
  82. package/lib/PanelTitle.js.map +1 -1
  83. package/lib/PopOver.js +2 -2
  84. package/lib/PopOver.js.map +1 -1
  85. package/lib/Radio.js +2 -2
  86. package/lib/Radio.js.map +1 -1
  87. package/lib/RadioButton.js +5 -5
  88. package/lib/RadioButton.js.map +1 -1
  89. package/lib/RadioMarker.js +2 -2
  90. package/lib/RadioMarker.js.map +1 -1
  91. package/lib/Select.js +4 -4
  92. package/lib/Select.js.map +1 -1
  93. package/lib/SingleSelectItem.js +3 -3
  94. package/lib/SingleSelectItem.js.map +1 -1
  95. package/lib/Slider.js +10 -6
  96. package/lib/Slider.js.map +1 -1
  97. package/lib/Spacer.js +2 -2
  98. package/lib/Spacer.js.map +1 -1
  99. package/lib/StatusDot.js +4 -4
  100. package/lib/StatusDot.js.map +1 -1
  101. package/lib/StatusDotList.js +2 -2
  102. package/lib/StatusDotList.js.map +1 -1
  103. package/lib/StepButtons.js +5 -5
  104. package/lib/StepButtons.js.map +1 -1
  105. package/lib/TabList.js +8 -8
  106. package/lib/TabList.js.map +1 -1
  107. package/lib/TabPanel.js +2 -2
  108. package/lib/TabPanel.js.map +1 -1
  109. package/lib/TableBody.js +3 -3
  110. package/lib/TableBody.js.map +1 -1
  111. package/lib/TableCell.js +3 -3
  112. package/lib/TableCell.js.map +1 -1
  113. package/lib/TableExpandedRow.js +5 -5
  114. package/lib/TableExpandedRow.js.map +1 -1
  115. package/lib/TableExpanderCell.js +3 -3
  116. package/lib/TableExpanderCell.js.map +1 -1
  117. package/lib/TableHead.js +7 -7
  118. package/lib/TableHead.js.map +1 -1
  119. package/lib/TableHeadCell.js +6 -6
  120. package/lib/TableHeadCell.js.map +1 -1
  121. package/lib/TableRow.js +6 -6
  122. package/lib/TableRow.js.map +1 -1
  123. package/lib/Textarea.js +6 -6
  124. package/lib/Textarea.js.map +1 -1
  125. package/lib/Title.js +2 -2
  126. package/lib/Title.js.map +1 -1
  127. package/lib/Toast.js +3 -3
  128. package/lib/Toast.js.map +1 -1
  129. package/lib/VisualCheckbox.js +3 -3
  130. package/lib/VisualCheckbox.js.map +1 -1
  131. package/lib/VisualRadio.js +3 -3
  132. package/lib/VisualRadio.js.map +1 -1
  133. package/lib/__mocks__/matchMedia.js.map +1 -1
  134. package/lib/__mocks__/usePseudoClasses.js.map +1 -1
  135. package/lib/__mocks__/useSize.js.map +1 -1
  136. package/lib/__mocks__/uuid.js +1 -1
  137. package/lib/__mocks__/uuid.js.map +1 -1
  138. package/lib/components/ArticleTeaser/index.js +4 -4
  139. package/lib/components/ArticleTeaser/index.js.map +1 -1
  140. package/lib/components/Drawer/Drawer.d.ts +3 -1
  141. package/lib/components/Drawer/DrawerHeaderContent.d.ts +22 -0
  142. package/lib/components/Drawer/DrawerHeaderContent.module.scss +51 -0
  143. package/lib/components/Drawer/DrawerHeaderContent.module.scss.d.ts +12 -0
  144. package/lib/components/Drawer/styles.module.scss +0 -14
  145. package/lib/components/Drawer/styles.module.scss.d.ts +0 -2
  146. package/lib/components/Dropdown/index.js +5 -5
  147. package/lib/components/Dropdown/index.js.map +1 -1
  148. package/lib/components/DropdownOld/index.js +3 -3
  149. package/lib/components/DropdownOld/index.js.map +1 -1
  150. package/lib/components/EmptyState/index.js +2 -2
  151. package/lib/components/EmptyState/index.js.map +1 -1
  152. package/lib/components/ExpanderHierarchy/index.js +7 -7
  153. package/lib/components/ExpanderHierarchy/index.js.map +1 -1
  154. package/lib/components/ExpanderList/index.js +6 -6
  155. package/lib/components/ExpanderList/index.js.map +1 -1
  156. package/lib/components/FavoriteButton/index.js +2 -2
  157. package/lib/components/FavoriteButton/index.js.map +1 -1
  158. package/lib/components/Filter/DrawerNavigation/styles.module.scss +15 -0
  159. package/lib/components/Filter/DrawerNavigation/styles.module.scss.d.ts +11 -0
  160. package/lib/components/Filter/FilterSearch/FilterSearch.d.ts +2 -0
  161. package/lib/components/Filter/FilterSearch/styles.module.scss +32 -7
  162. package/lib/components/Filter/FilterSearch/styles.module.scss.d.ts +2 -0
  163. package/lib/components/Filter/index.js.map +1 -1
  164. package/lib/components/HelpBubble/index.js +3 -3
  165. package/lib/components/HelpBubble/index.js.map +1 -1
  166. package/lib/components/HelpPanel/index.js +2 -2
  167. package/lib/components/HelpPanel/index.js.map +1 -1
  168. package/lib/components/HelpTriggerInline/index.js +2 -2
  169. package/lib/components/HelpTriggerInline/index.js.map +1 -1
  170. package/lib/components/Highlighter/styles.module.scss +1 -1
  171. package/lib/components/Icons/AdditionalIconInformation.d.ts +12 -0
  172. package/lib/components/Icons/AdditionalIconInformation.js +13 -1
  173. package/lib/components/Icons/AdditionalIconInformation.js.map +1 -1
  174. package/lib/components/Icons/ArrowUpRight.js +4 -4
  175. package/lib/components/Icons/ArrowUpRight.js.map +1 -1
  176. package/lib/components/Icons/ArrowUpRightLight.d.ts +3 -0
  177. package/lib/components/Icons/ArrowUpRightLight.js +17 -0
  178. package/lib/components/Icons/ArrowUpRightLight.js.map +1 -0
  179. package/lib/components/Icons/IconNames.d.ts +1 -1
  180. package/lib/components/Icons/IconNames.js +3 -0
  181. package/lib/components/Icons/IconNames.js.map +1 -1
  182. package/lib/components/Icons/ThumbsDown.d.ts +4 -0
  183. package/lib/components/Icons/ThumbsDown.js +15 -0
  184. package/lib/components/Icons/ThumbsDown.js.map +1 -0
  185. package/lib/components/Icons/ThumbsUp.d.ts +4 -0
  186. package/lib/components/Icons/ThumbsUp.js +15 -0
  187. package/lib/components/Icons/ThumbsUp.js.map +1 -0
  188. package/lib/components/Illustrations/BabyMobileMedium.js.map +1 -1
  189. package/lib/components/Illustrations/ChildMedium.js.map +1 -1
  190. package/lib/components/Illustrations/DoctorMedium.js.map +1 -1
  191. package/lib/components/Illustrations/DoctorSmall.js.map +1 -1
  192. package/lib/components/Illustrations/EyeContactMedium.js.map +1 -1
  193. package/lib/components/Illustrations/FacialRecognitionFingerprintMedium.js.map +1 -1
  194. package/lib/components/Illustrations/GiveBabyFoodMedium.js.map +1 -1
  195. package/lib/components/Illustrations/HealthcarePersonnelMedium.js.map +1 -1
  196. package/lib/components/Illustrations/HealthcarePersonnelSmall.js.map +1 -1
  197. package/lib/components/Illustrations/ReadLettersMedium.js.map +1 -1
  198. package/lib/components/Illustrations/SkinToSkinMedium.js.map +1 -1
  199. package/lib/components/Illustrations/StorkMedium.js.map +1 -1
  200. package/lib/components/Illustrations/StrollerMedium.js.map +1 -1
  201. package/lib/components/Illustrations/Support2Medium.js.map +1 -1
  202. package/lib/components/Illustrations/ThinkingMedium.js.map +1 -1
  203. package/lib/components/InfoTeaser/InfoTeaser.d.ts +4 -0
  204. package/lib/components/Loader/index.js +5 -5
  205. package/lib/components/Loader/index.js.map +1 -1
  206. package/lib/components/Modal/index.js +10 -10
  207. package/lib/components/Modal/index.js.map +1 -1
  208. package/lib/components/NotificationPanel/index.js +6 -6
  209. package/lib/components/NotificationPanel/index.js.map +1 -1
  210. package/lib/components/Panel/index.js +12 -12
  211. package/lib/components/Panel/index.js.map +1 -1
  212. package/lib/components/PanelList/index.js +3 -3
  213. package/lib/components/PanelList/index.js.map +1 -1
  214. package/lib/components/PopMenu/index.js +3 -3
  215. package/lib/components/PopMenu/index.js.map +1 -1
  216. package/lib/components/Portal/index.js.map +1 -1
  217. package/lib/components/Progressbar/index.js +2 -2
  218. package/lib/components/Progressbar/index.js.map +1 -1
  219. package/lib/components/PromoPanel/PromoPanel.d.ts +2 -2
  220. package/lib/components/PromoPanel/index.js +13 -9
  221. package/lib/components/PromoPanel/index.js.map +1 -1
  222. package/lib/components/RadioButton/RadioMarker/styles.module.scss +3 -9
  223. package/lib/components/ServiceMessage/index.js +5 -5
  224. package/lib/components/ServiceMessage/index.js.map +1 -1
  225. package/lib/components/SharingStatus/index.js +4 -4
  226. package/lib/components/SharingStatus/index.js.map +1 -1
  227. package/lib/components/Step/index.js +2 -2
  228. package/lib/components/Step/index.js.map +1 -1
  229. package/lib/components/Stepper/index.js +2 -2
  230. package/lib/components/Stepper/index.js.map +1 -1
  231. package/lib/components/StickyNote/index.js +8 -8
  232. package/lib/components/StickyNote/index.js.map +1 -1
  233. package/lib/components/Table/index.js +3 -3
  234. package/lib/components/Table/index.js.map +1 -1
  235. package/lib/components/Tabs/index.js +4 -4
  236. package/lib/components/Tabs/index.js.map +1 -1
  237. package/lib/components/Tag/index.js +2 -2
  238. package/lib/components/Tag/index.js.map +1 -1
  239. package/lib/components/Tile/index.js +4 -4
  240. package/lib/components/Tile/index.js.map +1 -1
  241. package/lib/components/ToastList/index.js +1 -1
  242. package/lib/components/ToastList/index.js.map +1 -1
  243. package/lib/components/Toggle/index.js +7 -7
  244. package/lib/components/Toggle/index.js.map +1 -1
  245. package/lib/components/Validation/index.js +2 -2
  246. package/lib/components/Validation/index.js.map +1 -1
  247. package/lib/components/VisualCheckboxCloud/index.js +2 -2
  248. package/lib/components/VisualCheckboxCloud/index.js.map +1 -1
  249. package/lib/components/VisualCheckboxGroup/index.js +3 -3
  250. package/lib/components/VisualCheckboxGroup/index.js.map +1 -1
  251. package/lib/components/VisualContentgroupWithImage/index.js +2 -2
  252. package/lib/components/VisualContentgroupWithImage/index.js.map +1 -1
  253. package/lib/components/VisualRadioCloud/index.js +2 -2
  254. package/lib/components/VisualRadioCloud/index.js.map +1 -1
  255. package/lib/components/VisualRadioGroup/index.js +3 -3
  256. package/lib/components/VisualRadioGroup/index.js.map +1 -1
  257. package/lib/floating-ui.react.js +9 -6
  258. package/lib/floating-ui.react.js.map +1 -1
  259. package/lib/getFilterChips.js.map +1 -1
  260. package/lib/hooks/useBreakpoint.js.map +1 -1
  261. package/lib/hooks/useFocusTrap.js +4 -2
  262. package/lib/hooks/useFocusTrap.js.map +1 -1
  263. package/lib/hooks/useFocusableElements.js.map +1 -1
  264. package/lib/hooks/useIsVisible.js.map +1 -1
  265. package/lib/hooks/useOutsideEvent.js.map +1 -1
  266. package/lib/hooks/useResizeObserver.js.map +1 -1
  267. package/lib/hooks/useRovingFocus.js.map +1 -1
  268. package/lib/hooks/useSize.js.map +1 -1
  269. package/lib/index.js +1 -1
  270. package/lib/utils/focus.js.map +1 -1
  271. package/lib/utils/mobile.js.map +1 -1
  272. package/lib/utils/uuid.js +29 -2
  273. package/lib/utils/uuid.js.map +1 -0
  274. package/lib/utils2.js +7 -7
  275. package/lib/utils2.js.map +1 -1
  276. package/lib/utils5.js +2 -2
  277. package/lib/utils5.js.map +1 -1
  278. package/package.json +1 -1
  279. package/lib/uuid.js +0 -29
  280. package/lib/uuid.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PanelTitle.js","names":[],"sources":["../src/components/Panel/PanelTitle/PanelTitle.tsx","../src/components/Panel/PanelTitle/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport Highlighter from '../../Highlighter';\nimport Title from '../../Title';\n\nimport styles from './styles.module.scss';\n\nexport interface PanelTitleProps {\n /** Badge displayed in title */\n badge?: React.ReactNode;\n /** Icon displayed in title. Only IconSize Small is supported */\n icon?: React.ReactNode;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Title text */\n title: string | React.ReactNode;\n /** Title HTML markup */\n titleMarkup?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n /** Highlights text in title and content. Used for search results */\n highlightText?: string;\n}\n\nconst PanelTitle: React.FC<PanelTitleProps> = (props: PanelTitleProps) => {\n const { testId, icon, badge, title, titleMarkup = 'h3', highlightText } = props;\n return (\n <div className={classNames(styles['paneltitle'], { [styles['paneltitle--has-icon']]: icon })} data-testid={testId}>\n {icon && <div className={styles['paneltitle__icon']}>{icon}</div>}\n {title && (\n <div className={styles['paneltitle__title']}>\n <Title appearance=\"title3\" htmlMarkup={titleMarkup}>\n <Highlighter searchText={highlightText}>{title}</Highlighter>\n </Title>\n {badge && <div className={styles['paneltitle__badge']}>{badge}</div>}\n </div>\n )}\n </div>\n );\n};\n\nexport default PanelTitle;\n","import PanelTitle from './PanelTitle';\nexport * from './PanelTitle';\nexport default PanelTitle;\n"],"mappings":";;;;;;AAsBA,IAAM,cAAyC,UAA2B;CACxE,MAAM,EAAE,QAAQ,MAAM,OAAO,OAAO,cAAc,MAAM,kBAAkB;CAC1E,OACE,qBAAC,OAAD;EAAK,WAAW,GAAW,OAAO,eAAe,GAAG,OAAO,0BAA0B,KAAK,CAAC;EAAG,eAAa;YAA3G,CACG,QAAQ,oBAAC,OAAD;GAAK,WAAW,OAAO;aAAsB;EAAU,CAAA,GAC/D,SACC,qBAAC,OAAD;GAAK,WAAW,OAAO;aAAvB,CACE,oBAAC,eAAD;IAAO,YAAW;IAAS,YAAY;cACrC,oBAAC,qBAAD;KAAa,YAAY;eAAgB;IAAmB,CAAA;GACvD,CAAA,GACN,SAAS,oBAAC,OAAD;IAAK,WAAW,OAAO;cAAuB;GAAW,CAAA,CAChE;IAEJ;;AAET;;;ACnCA,IAAA,qBAAe"}
1
+ {"version":3,"file":"PanelTitle.js","names":[],"sources":["../src/components/Panel/PanelTitle/PanelTitle.tsx","../src/components/Panel/PanelTitle/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport Highlighter from '../../Highlighter';\nimport Title from '../../Title';\n\nimport styles from './styles.module.scss';\n\nexport interface PanelTitleProps {\n /** Badge displayed in title */\n badge?: React.ReactNode;\n /** Icon displayed in title. Only IconSize Small is supported */\n icon?: React.ReactNode;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Title text */\n title: string | React.ReactNode;\n /** Title HTML markup */\n titleMarkup?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n /** Highlights text in title and content. Used for search results */\n highlightText?: string;\n}\n\nconst PanelTitle: React.FC<PanelTitleProps> = (props: PanelTitleProps) => {\n const { testId, icon, badge, title, titleMarkup = 'h3', highlightText } = props;\n return (\n <div className={classNames(styles['paneltitle'], { [styles['paneltitle--has-icon']]: icon })} data-testid={testId}>\n {icon && <div className={styles['paneltitle__icon']}>{icon}</div>}\n {title && (\n <div className={styles['paneltitle__title']}>\n <Title appearance=\"title3\" htmlMarkup={titleMarkup}>\n <Highlighter searchText={highlightText}>{title}</Highlighter>\n </Title>\n {badge && <div className={styles['paneltitle__badge']}>{badge}</div>}\n </div>\n )}\n </div>\n );\n};\n\nexport default PanelTitle;\n","import PanelTitle from './PanelTitle';\nexport * from './PanelTitle';\nexport default PanelTitle;\n"],"mappings":";;;;;;AAsBA,IAAM,cAAyC,UAA2B;CACxE,MAAM,EAAE,QAAQ,MAAM,OAAO,OAAO,cAAc,MAAM,kBAAkB;CAC1E,OACE,qBAAC,OAAD;EAAK,WAAW,WAAW,OAAO,eAAe,GAAG,OAAO,0BAA0B,KAAK,CAAC;EAAG,eAAa;YAA3G,CACG,QAAQ,oBAAC,OAAD;GAAK,WAAW,OAAO;aAAsB;EAAU,CAAA,GAC/D,SACC,qBAAC,OAAD;GAAK,WAAW,OAAO;aAAvB,CACE,oBAAC,eAAD;IAAO,YAAW;IAAS,YAAY;cACrC,oBAAC,qBAAD;KAAa,YAAY;eAAgB;IAAmB,CAAA;GACvD,CAAA,GACN,SAAS,oBAAC,OAAD;IAAK,WAAW,OAAO;cAAuB;GAAW,CAAA,CAChE;IAEJ;;AAET;;;ACnCA,IAAA,qBAAe"}
package/lib/PopOver.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AnalyticsId, ZIndex } from "./constants.js";
2
2
  import { getAriaLabelAttributes } from "./utils/accessibility.js";
3
3
  import { _ as autoUpdate, a as useDismiss, d as arrow, f as flip, h as shift, i as useClick, l as useInteractions, m as offset, o as useFloating, p as hide, r as FloatingFocusManager, t as FloatingArrow, u as useMergeRefs } from "./floating-ui.react.js";
4
- import cn from "classnames";
4
+ import classNames from "classnames";
5
5
  import { useRef } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import styles from "./components/PopOver/styles.module.scss";
@@ -47,7 +47,7 @@ var PopOver = (props) => {
47
47
  visibility: isVisible ? "visible" : "hidden",
48
48
  zIndex
49
49
  },
50
- className: cn(styles.popover, className),
50
+ className: classNames(styles.popover, className),
51
51
  ...getFloatingProps(),
52
52
  role,
53
53
  "data-testid": testId,
@@ -1 +1 @@
1
- {"version":3,"file":"PopOver.js","names":[],"sources":["../src/components/PopOver/utils.ts","../src/components/PopOver/PopOver.tsx","../src/components/PopOver/index.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nexport enum PopOverVariant {\n positionautomatic = 'positionautomatic',\n positionbelow = 'positionbelow',\n positionabove = 'positionabove',\n}\n\ntype HorizontalPosition = 'left' | 'right' | 'floating';\ntype BubblePosition = 'leftabove' | 'leftbelow' | 'rightabove' | 'rightbelow' | 'floatingabove' | 'floatingbelow';\n\n/** Bredde på hjelpeboble */\nconst BUBBLE_WIDTH_PX = 373;\n/** Hjelpeboblen skal holde avstand til venstre/høyre kant på vinduet */\nconst WINDOW_MARGIN_PX = 12;\n/** Vertikal avstand fra hjelpeboble til kontroller */\nconst BUBBLE_VERTICAL_OFFSET_PX = 16;\n/** Høyde/bredde på pil */\nconst ARROW_WIDTH_PX = 20;\n/** Avstand fra pil til hjelpeboble */\nconst ARROW_VERTICAL_OFFSET_PX = 4;\n/** Pilen skal holde avstand til venstre/høyre kant av hjelpeboblen */\nconst ARROW_HORIZONTAL_MARGIN_PX = 12;\n\n/**\n * Beregn om hjelpeboblen skal vises over eller under kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under/automatisk)\n * @returns Om hjelpeboblen skal vises over eller under\n */\nexport const getVerticalPosition = (\n controllerSize: DOMRect,\n bubbleSize: DOMRect,\n variant: keyof typeof PopOverVariant\n): keyof typeof PopOverVariant => {\n if (variant !== PopOverVariant.positionautomatic) {\n return variant;\n }\n if (controllerSize.top > bubbleSize.height + BUBBLE_VERTICAL_OFFSET_PX) {\n return PopOverVariant.positionabove;\n } else {\n return PopOverVariant.positionbelow;\n }\n};\n\n/**\n * Finn horisontalt midtpunkt på kontrolleren i forhold til venstre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Horisontalt senter av controlleren i px\n */\nconst getControllerLeftCenterPx = (controllerSize: DOMRect): number => controllerSize.left + controllerSize.width / 2;\n\n/**\n * Finn horisontalt midtpunkt på kontrolleren i forhold til høyre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Horisontalt senter av controlleren i px\n */\nconst getControllerRightCenterPx = (controllerSize: DOMRect): number =>\n document.documentElement.clientWidth - controllerSize.right + controllerSize.width / 2;\n\n/**\n * Finn venstre kant av hjelpeboblen i forhold til kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns Venstre kant av hjelpeboblen i px\n */\nconst getBubbleLeftPx = (controllerSize: DOMRect, bubbleSize: DOMRect): number => {\n const controllerHorizontalCenterPx = getControllerLeftCenterPx(controllerSize);\n\n return controllerHorizontalCenterPx - bubbleSize.width / 2;\n};\n\n/**\n * Finn høyre kant av hjelpeboblen i forhold til kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns Høyre kant av hjelpeboblen i px\n */\nconst getBubbleRightPx = (controllerSize: DOMRect, bubbleSize: DOMRect): number => {\n const bubbleLeftPx = getBubbleLeftPx(controllerSize, bubbleSize);\n\n return bubbleLeftPx + bubbleSize.width;\n};\n\n/**\n * Sjekk om venstre kant av hjelpeboblen er innenfor vinduet\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns true dersom venstre kant er innenfor vinduet\n */\nconst getBubbleLeftVisible = (controllerSize: DOMRect, bubbleSize: DOMRect): boolean => {\n const bubbleLeftPx = getBubbleLeftPx(controllerSize, bubbleSize);\n\n return bubbleLeftPx > WINDOW_MARGIN_PX;\n};\n\n/**\n * Sjekk om høyre kant av hjelpeboblen er innenfor vinduet\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns true dersom høyre kant er innenfor vinduet\n */\nconst getBubbleRightIsVisible = (controllerSize: DOMRect, bubbleSize: DOMRect): boolean => {\n const bubbleRightPx = getBubbleRightPx(controllerSize, bubbleSize);\n\n return bubbleRightPx < document.documentElement.clientWidth - WINDOW_MARGIN_PX;\n};\n\n/**\n * Finn riktig horisontal plassering til hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns left, right eller floating\n */\nconst getHorizontalPosition = (controllerSize: DOMRect, bubbleSize: DOMRect): HorizontalPosition => {\n if (!getBubbleRightIsVisible(controllerSize, bubbleSize)) {\n return 'right';\n }\n if (!getBubbleLeftVisible(controllerSize, bubbleSize)) {\n return 'left';\n }\n\n return 'floating';\n};\n\n/**\n * Finn vertikal plassering av hjelpeboblen når den skal vises over\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns \"Top\" for hjelpeboblen i px\n */\nconst getBubbleAbovePx = (controllerSize: DOMRect, bubbleSize: DOMRect): number =>\n controllerSize.top - BUBBLE_VERTICAL_OFFSET_PX - bubbleSize.height;\n\n/**\n * Finn vertikal plassering av hjelpeboblen når den skal vises under\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns \"Top\" for hjelpeboblen i px\n */\nconst getBubbleBelowPx = (controllerSize: DOMRect): number => controllerSize.bottom + BUBBLE_VERTICAL_OFFSET_PX;\n\n/**\n * Finn maks bredde på hjelpeboblen i forhold til vinduet\n * @returns Bredde på hjelpeboblen i px\n */\nconst getBubbleWidth = (): number => document.documentElement.clientWidth - WINDOW_MARGIN_PX * 2;\n\n/**\n * Sjekk om hjelpeboblen har plass i vinduet\n * @returns true dersom det er plass til hjelpeboblen i vinduet\n */\nconst getBubbleFitsInWindow = (): boolean => {\n return document.documentElement.clientWidth > BUBBLE_WIDTH_PX + WINDOW_MARGIN_PX * 2;\n};\n\n/**\n * Finn vertikal plassering av pilen når den skal vises over\n * @param controllerSize DOMRect for controlleren\n * @returns \"Top\" for pilen i px\n */\nconst getArrowTopxPx = (controllerSize: DOMRect): number => controllerSize.top - BUBBLE_VERTICAL_OFFSET_PX - ARROW_VERTICAL_OFFSET_PX;\n\n/**\n * Finn horisontal plassering av pilen i forhold til venstre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Venstre kant av pilen i px\n */\nconst getArrowLeftPx = (controllerSize: DOMRect): number => getControllerLeftCenterPx(controllerSize) - ARROW_WIDTH_PX / 2;\n\n/**\n * Finn horisontal plassering av pilen\n * @param controllerSize DOMRect for controlleren\n * @returns Venstre kant av pilen i px\n */\nconst getArrowRightPx = (controllerSize: DOMRect): number => getControllerRightCenterPx(controllerSize) - ARROW_WIDTH_PX / 2;\n\n/**\n * Finn riktig plassering av hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under)\n * @returns Beste mulige plassering av hjelpeboblen\n */\nconst getBubblePosition = (controllerSize: DOMRect, bubbleSize: DOMRect, variant: keyof typeof PopOverVariant): BubblePosition => {\n const horizontalPosition = getHorizontalPosition(controllerSize, bubbleSize);\n const verticalPosition = getVerticalPosition(controllerSize, bubbleSize, variant);\n\n if (horizontalPosition === 'left') {\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'leftabove';\n }\n return 'leftbelow';\n }\n\n if (horizontalPosition === 'right') {\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'rightabove';\n }\n return 'rightbelow';\n }\n\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'floatingabove';\n }\n\n return 'floatingbelow';\n};\n\n/**\n * Finn riktig plassering av hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under)\n * @returns CSSProperties som plasserer hjelpeboblen riktig\n */\nexport const getBubbleStyle = (controllerSize: DOMRect, bubbleSize: DOMRect, variant: keyof typeof PopOverVariant): CSSProperties => {\n const bubblePosition = getBubblePosition(controllerSize, bubbleSize, variant);\n const bubbleWidth = !getBubbleFitsInWindow() ? getBubbleWidth() : undefined;\n\n if (bubblePosition === 'leftabove') {\n return {\n left: WINDOW_MARGIN_PX,\n top: getBubbleAbovePx(controllerSize, bubbleSize),\n width: bubbleWidth,\n };\n }\n if (bubblePosition === 'leftbelow') {\n return { left: WINDOW_MARGIN_PX, top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n if (bubblePosition === 'rightabove') {\n return { right: WINDOW_MARGIN_PX, top: getBubbleAbovePx(controllerSize, bubbleSize), width: bubbleWidth };\n }\n if (bubblePosition === 'rightbelow') {\n return { right: WINDOW_MARGIN_PX, top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n\n if (bubblePosition === 'floatingbelow') {\n return { left: getBubbleLeftPx(controllerSize, bubbleSize), top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n\n return { left: getBubbleLeftPx(controllerSize, bubbleSize), top: getBubbleAbovePx(controllerSize, bubbleSize), width: bubbleWidth };\n};\n\n/**\n * Finn riktig plassering av pilen\n * @param bubbleStyle CSSProperties for hjelpeboblen\n * @param controllerSize DOMRect for kontrolleren\n * @param verticalPosition Ønsket plassering av hjelpeboblen (over/under)\n * @returns CSSProperties som plasserer pilen riktig\n */\nexport const getArrowStyle = (\n bubbleStyle: CSSProperties,\n controllerSize: DOMRect,\n verticalPosition: keyof typeof PopOverVariant\n): CSSProperties => {\n const leftPx = getArrowLeftPx(controllerSize);\n const rightPx = getArrowRightPx(controllerSize);\n const minLeftPx = (bubbleStyle.left as number) + ARROW_HORIZONTAL_MARGIN_PX;\n const minRightPx = (bubbleStyle.right as number) + ARROW_HORIZONTAL_MARGIN_PX;\n\n if (bubbleStyle.right) {\n if (verticalPosition === PopOverVariant.positionabove) {\n return {\n right: rightPx > minRightPx ? rightPx : minRightPx,\n top: getArrowTopxPx(controllerSize),\n };\n }\n\n return {\n right: rightPx > minRightPx ? rightPx : minRightPx,\n top: controllerSize.bottom,\n };\n }\n\n if (verticalPosition === PopOverVariant.positionabove) {\n return {\n left: leftPx > minLeftPx ? leftPx : minLeftPx,\n top: getArrowTopxPx(controllerSize),\n };\n }\n\n return {\n left: leftPx > minLeftPx ? leftPx : minLeftPx,\n top: controllerSize.bottom,\n };\n};\n","import { useRef } from 'react';\n\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n FloatingArrow,\n arrow,\n hide,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\n\nimport { PopOverVariant } from './utils';\nimport { AnalyticsId, ZIndex } from '../../constants';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\n\nimport styles from './styles.module.scss';\n\nexport type PopOverRole = 'tooltip' | 'dialog' | 'group';\n\nexport type PopOverPlacement = 'top' | 'bottom';\n\nexport interface PopOverProps {\n /** Sets aria-label of the bubble. If role is set to dialog ariaLabel or ariaLabelledById MUST be set! */\n ariaLabel?: string;\n /** Sets aria-labelledby of the bubble. If role is set to dialog ariaLabel or ariaLabelledById MUST be set! */\n ariaLabelledById?: string;\n /** Id of the PopOver */\n id?: string;\n /** Content shown inside PopOver. Note that if role=\"tooltip\", you must not include interactive/focusable elements. */\n children: React.ReactNode;\n /** Ref for the element the PopOver is placed upon */\n controllerRef: React.RefObject<HTMLElement | SVGSVGElement | null>;\n /** Show the popover. Only applies when role=tooltip. Default: false. */\n show?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** @deprecated Adds custom classes to the arrow element. */\n arrowClassName?: string;\n /** @deprecated use placement instead. Determines the placement of the popover. Default: automatic positioning. */\n variant?: keyof typeof PopOverVariant;\n /** Sets the placement of the popover relative to the trigger if there is space, otherwise automatic. */\n placement?: PopOverPlacement;\n /** Sets role of the PopOver element */\n role?: PopOverRole;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Overrides the default z-index of PopOver */\n zIndex?: number;\n /** Ref that is passed to the component */\n ref?: React.Ref<HTMLDivElement | SVGSVGElement | HTMLElement | null>;\n}\n\nconst PopOver: React.FC<PopOverProps> = props => {\n const {\n ariaLabel,\n ariaLabelledById,\n id,\n children,\n controllerRef,\n show = false,\n className = '',\n variant = PopOverVariant.positionautomatic,\n role = 'dialog',\n testId,\n zIndex = ZIndex.PopOver,\n placement,\n ref,\n } = props;\n\n const ariaLabelAttributes = getAriaLabelAttributes({ label: ariaLabel, id: ariaLabelledById });\n\n const placementProp = placement ?? (variant === PopOverVariant.positionabove ? 'top' : 'bottom');\n\n const arrowRef = useRef(null);\n const { refs, floatingStyles, context, middlewareData } = useFloating({\n middleware: [offset(10), flip(), shift({ padding: 8 }), hide(), arrow({ element: arrowRef })],\n placement: placementProp,\n whileElementsMounted: autoUpdate,\n elements: {\n reference: controllerRef.current,\n },\n });\n\n const click = useClick(context);\n const dismiss = useDismiss(context);\n\n const { getFloatingProps } = useInteractions([click, dismiss]);\n\n const isVisible = show && !middlewareData.hide?.referenceHidden;\n\n const mergedRef = useMergeRefs<HTMLElement | SVGSVGElement>([refs.setFloating, ref]);\n\n return (\n <FloatingFocusManager context={context} modal={false}>\n <div\n id={id}\n ref={mergedRef}\n style={{ ...floatingStyles, visibility: isVisible ? 'visible' : 'hidden', zIndex: zIndex }}\n className={classNames(styles.popover, className)}\n {...getFloatingProps()}\n role={role}\n data-testid={testId}\n data-analyticsid={AnalyticsId.PopOver}\n {...ariaLabelAttributes}\n >\n {children}\n <FloatingArrow\n ref={arrowRef}\n className={styles['popover__arrow']}\n context={context}\n fill={'var(--core-color-white)'}\n stroke={'var(--color-base-border-onlight)'}\n strokeWidth={1}\n />\n </div>\n </FloatingFocusManager>\n );\n};\n\nPopOver.displayName = 'PopOver';\n\nexport default PopOver;\n","import PopOver from './PopOver';\nexport { PopOverVariant } from './utils';\nexport * from './PopOver';\nexport default PopOver;\n"],"mappings":";;;;;;;;AAEA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,uBAAA;CACA,eAAA,mBAAA;CACA,eAAA,mBAAA;;AACF,EAAA,CAAA,CAAA;;;ACsDA,IAAM,WAAkC,UAAS;CAC/C,MAAM,EACJ,WACA,kBACA,IACA,UACA,eACA,OAAO,OACP,YAAY,IACZ,UAAU,eAAe,mBACzB,OAAO,UACP,QACA,SAAS,OAAO,SAChB,WACA,QACE;CAEJ,MAAM,sBAAsB,uBAAuB;EAAE,OAAO;EAAW,IAAI;CAAiB,CAAC;CAE7F,MAAM,gBAAgB,cAAc,YAAY,eAAe,gBAAgB,QAAQ;CAEvF,MAAM,WAAW,OAAO,IAAI;CAC5B,MAAM,EAAE,MAAM,gBAAgB,SAAS,mBAAmB,YAAY;EACpE,YAAY;GAAC,OAAO,EAAE;GAAG,KAAK;GAAG,MAAM,EAAE,SAAS,EAAE,CAAC;GAAG,KAAK;GAAG,MAAM,EAAE,SAAS,SAAS,CAAC;EAAC;EAC5F,WAAW;EACX,sBAAsB;EACtB,UAAU,EACR,WAAW,cAAc,QAC3B;CACF,CAAC;CAKD,MAAM,EAAE,qBAAqB,gBAAgB,CAH/B,SAAS,OAGuB,GAF9B,WAAW,OAE0B,CAAO,CAAC;CAE7D,MAAM,YAAY,QAAQ,CAAC,eAAe,MAAM;CAIhD,OACE,oBAAC,sBAAD;EAA+B;EAAS,OAAO;YAC7C,qBAAC,OAAD;GACM;GACJ,KANY,aAA0C,CAAC,KAAK,aAAa,GAAG,CAMvE;GACL,OAAO;IAAE,GAAG;IAAgB,YAAY,YAAY,YAAY;IAAkB;GAAO;GACzF,WAAW,GAAW,OAAO,SAAS,SAAS;GAC/C,GAAI,iBAAiB;GACf;GACN,eAAa;GACb,oBAAkB,YAAY;GAC9B,GAAI;aATN,CAWG,UACD,oBAAC,eAAD;IACE,KAAK;IACL,WAAW,OAAO;IACT;IACT,MAAM;IACN,QAAQ;IACR,aAAa;GACd,CAAA,CACE;;CACe,CAAA;AAE1B;AAEA,QAAQ,cAAc;;;AC5HtB,IAAA,kBAAe"}
1
+ {"version":3,"file":"PopOver.js","names":[],"sources":["../src/components/PopOver/utils.ts","../src/components/PopOver/PopOver.tsx","../src/components/PopOver/index.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\n\nexport enum PopOverVariant {\n positionautomatic = 'positionautomatic',\n positionbelow = 'positionbelow',\n positionabove = 'positionabove',\n}\n\ntype HorizontalPosition = 'left' | 'right' | 'floating';\ntype BubblePosition = 'leftabove' | 'leftbelow' | 'rightabove' | 'rightbelow' | 'floatingabove' | 'floatingbelow';\n\n/** Bredde på hjelpeboble */\nconst BUBBLE_WIDTH_PX = 373;\n/** Hjelpeboblen skal holde avstand til venstre/høyre kant på vinduet */\nconst WINDOW_MARGIN_PX = 12;\n/** Vertikal avstand fra hjelpeboble til kontroller */\nconst BUBBLE_VERTICAL_OFFSET_PX = 16;\n/** Høyde/bredde på pil */\nconst ARROW_WIDTH_PX = 20;\n/** Avstand fra pil til hjelpeboble */\nconst ARROW_VERTICAL_OFFSET_PX = 4;\n/** Pilen skal holde avstand til venstre/høyre kant av hjelpeboblen */\nconst ARROW_HORIZONTAL_MARGIN_PX = 12;\n\n/**\n * Beregn om hjelpeboblen skal vises over eller under kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under/automatisk)\n * @returns Om hjelpeboblen skal vises over eller under\n */\nexport const getVerticalPosition = (\n controllerSize: DOMRect,\n bubbleSize: DOMRect,\n variant: keyof typeof PopOverVariant\n): keyof typeof PopOverVariant => {\n if (variant !== PopOverVariant.positionautomatic) {\n return variant;\n }\n if (controllerSize.top > bubbleSize.height + BUBBLE_VERTICAL_OFFSET_PX) {\n return PopOverVariant.positionabove;\n } else {\n return PopOverVariant.positionbelow;\n }\n};\n\n/**\n * Finn horisontalt midtpunkt på kontrolleren i forhold til venstre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Horisontalt senter av controlleren i px\n */\nconst getControllerLeftCenterPx = (controllerSize: DOMRect): number => controllerSize.left + controllerSize.width / 2;\n\n/**\n * Finn horisontalt midtpunkt på kontrolleren i forhold til høyre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Horisontalt senter av controlleren i px\n */\nconst getControllerRightCenterPx = (controllerSize: DOMRect): number =>\n document.documentElement.clientWidth - controllerSize.right + controllerSize.width / 2;\n\n/**\n * Finn venstre kant av hjelpeboblen i forhold til kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns Venstre kant av hjelpeboblen i px\n */\nconst getBubbleLeftPx = (controllerSize: DOMRect, bubbleSize: DOMRect): number => {\n const controllerHorizontalCenterPx = getControllerLeftCenterPx(controllerSize);\n\n return controllerHorizontalCenterPx - bubbleSize.width / 2;\n};\n\n/**\n * Finn høyre kant av hjelpeboblen i forhold til kontrolleren\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns Høyre kant av hjelpeboblen i px\n */\nconst getBubbleRightPx = (controllerSize: DOMRect, bubbleSize: DOMRect): number => {\n const bubbleLeftPx = getBubbleLeftPx(controllerSize, bubbleSize);\n\n return bubbleLeftPx + bubbleSize.width;\n};\n\n/**\n * Sjekk om venstre kant av hjelpeboblen er innenfor vinduet\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns true dersom venstre kant er innenfor vinduet\n */\nconst getBubbleLeftVisible = (controllerSize: DOMRect, bubbleSize: DOMRect): boolean => {\n const bubbleLeftPx = getBubbleLeftPx(controllerSize, bubbleSize);\n\n return bubbleLeftPx > WINDOW_MARGIN_PX;\n};\n\n/**\n * Sjekk om høyre kant av hjelpeboblen er innenfor vinduet\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns true dersom høyre kant er innenfor vinduet\n */\nconst getBubbleRightIsVisible = (controllerSize: DOMRect, bubbleSize: DOMRect): boolean => {\n const bubbleRightPx = getBubbleRightPx(controllerSize, bubbleSize);\n\n return bubbleRightPx < document.documentElement.clientWidth - WINDOW_MARGIN_PX;\n};\n\n/**\n * Finn riktig horisontal plassering til hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns left, right eller floating\n */\nconst getHorizontalPosition = (controllerSize: DOMRect, bubbleSize: DOMRect): HorizontalPosition => {\n if (!getBubbleRightIsVisible(controllerSize, bubbleSize)) {\n return 'right';\n }\n if (!getBubbleLeftVisible(controllerSize, bubbleSize)) {\n return 'left';\n }\n\n return 'floating';\n};\n\n/**\n * Finn vertikal plassering av hjelpeboblen når den skal vises over\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns \"Top\" for hjelpeboblen i px\n */\nconst getBubbleAbovePx = (controllerSize: DOMRect, bubbleSize: DOMRect): number =>\n controllerSize.top - BUBBLE_VERTICAL_OFFSET_PX - bubbleSize.height;\n\n/**\n * Finn vertikal plassering av hjelpeboblen når den skal vises under\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @returns \"Top\" for hjelpeboblen i px\n */\nconst getBubbleBelowPx = (controllerSize: DOMRect): number => controllerSize.bottom + BUBBLE_VERTICAL_OFFSET_PX;\n\n/**\n * Finn maks bredde på hjelpeboblen i forhold til vinduet\n * @returns Bredde på hjelpeboblen i px\n */\nconst getBubbleWidth = (): number => document.documentElement.clientWidth - WINDOW_MARGIN_PX * 2;\n\n/**\n * Sjekk om hjelpeboblen har plass i vinduet\n * @returns true dersom det er plass til hjelpeboblen i vinduet\n */\nconst getBubbleFitsInWindow = (): boolean => {\n return document.documentElement.clientWidth > BUBBLE_WIDTH_PX + WINDOW_MARGIN_PX * 2;\n};\n\n/**\n * Finn vertikal plassering av pilen når den skal vises over\n * @param controllerSize DOMRect for controlleren\n * @returns \"Top\" for pilen i px\n */\nconst getArrowTopxPx = (controllerSize: DOMRect): number => controllerSize.top - BUBBLE_VERTICAL_OFFSET_PX - ARROW_VERTICAL_OFFSET_PX;\n\n/**\n * Finn horisontal plassering av pilen i forhold til venstre kant av vinduet\n * @param controllerSize DOMRect for controlleren\n * @returns Venstre kant av pilen i px\n */\nconst getArrowLeftPx = (controllerSize: DOMRect): number => getControllerLeftCenterPx(controllerSize) - ARROW_WIDTH_PX / 2;\n\n/**\n * Finn horisontal plassering av pilen\n * @param controllerSize DOMRect for controlleren\n * @returns Venstre kant av pilen i px\n */\nconst getArrowRightPx = (controllerSize: DOMRect): number => getControllerRightCenterPx(controllerSize) - ARROW_WIDTH_PX / 2;\n\n/**\n * Finn riktig plassering av hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under)\n * @returns Beste mulige plassering av hjelpeboblen\n */\nconst getBubblePosition = (controllerSize: DOMRect, bubbleSize: DOMRect, variant: keyof typeof PopOverVariant): BubblePosition => {\n const horizontalPosition = getHorizontalPosition(controllerSize, bubbleSize);\n const verticalPosition = getVerticalPosition(controllerSize, bubbleSize, variant);\n\n if (horizontalPosition === 'left') {\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'leftabove';\n }\n return 'leftbelow';\n }\n\n if (horizontalPosition === 'right') {\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'rightabove';\n }\n return 'rightbelow';\n }\n\n if (verticalPosition === PopOverVariant.positionabove) {\n return 'floatingabove';\n }\n\n return 'floatingbelow';\n};\n\n/**\n * Finn riktig plassering av hjelpeboblen\n * @param controllerSize DOMRect for controlleren\n * @param bubbleSize DOMRect for hjelpeboblen\n * @param variant Ønsket plassering av hjelpeboblen (over/under)\n * @returns CSSProperties som plasserer hjelpeboblen riktig\n */\nexport const getBubbleStyle = (controllerSize: DOMRect, bubbleSize: DOMRect, variant: keyof typeof PopOverVariant): CSSProperties => {\n const bubblePosition = getBubblePosition(controllerSize, bubbleSize, variant);\n const bubbleWidth = !getBubbleFitsInWindow() ? getBubbleWidth() : undefined;\n\n if (bubblePosition === 'leftabove') {\n return {\n left: WINDOW_MARGIN_PX,\n top: getBubbleAbovePx(controllerSize, bubbleSize),\n width: bubbleWidth,\n };\n }\n if (bubblePosition === 'leftbelow') {\n return { left: WINDOW_MARGIN_PX, top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n if (bubblePosition === 'rightabove') {\n return { right: WINDOW_MARGIN_PX, top: getBubbleAbovePx(controllerSize, bubbleSize), width: bubbleWidth };\n }\n if (bubblePosition === 'rightbelow') {\n return { right: WINDOW_MARGIN_PX, top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n\n if (bubblePosition === 'floatingbelow') {\n return { left: getBubbleLeftPx(controllerSize, bubbleSize), top: getBubbleBelowPx(controllerSize), width: bubbleWidth };\n }\n\n return { left: getBubbleLeftPx(controllerSize, bubbleSize), top: getBubbleAbovePx(controllerSize, bubbleSize), width: bubbleWidth };\n};\n\n/**\n * Finn riktig plassering av pilen\n * @param bubbleStyle CSSProperties for hjelpeboblen\n * @param controllerSize DOMRect for kontrolleren\n * @param verticalPosition Ønsket plassering av hjelpeboblen (over/under)\n * @returns CSSProperties som plasserer pilen riktig\n */\nexport const getArrowStyle = (\n bubbleStyle: CSSProperties,\n controllerSize: DOMRect,\n verticalPosition: keyof typeof PopOverVariant\n): CSSProperties => {\n const leftPx = getArrowLeftPx(controllerSize);\n const rightPx = getArrowRightPx(controllerSize);\n const minLeftPx = (bubbleStyle.left as number) + ARROW_HORIZONTAL_MARGIN_PX;\n const minRightPx = (bubbleStyle.right as number) + ARROW_HORIZONTAL_MARGIN_PX;\n\n if (bubbleStyle.right) {\n if (verticalPosition === PopOverVariant.positionabove) {\n return {\n right: rightPx > minRightPx ? rightPx : minRightPx,\n top: getArrowTopxPx(controllerSize),\n };\n }\n\n return {\n right: rightPx > minRightPx ? rightPx : minRightPx,\n top: controllerSize.bottom,\n };\n }\n\n if (verticalPosition === PopOverVariant.positionabove) {\n return {\n left: leftPx > minLeftPx ? leftPx : minLeftPx,\n top: getArrowTopxPx(controllerSize),\n };\n }\n\n return {\n left: leftPx > minLeftPx ? leftPx : minLeftPx,\n top: controllerSize.bottom,\n };\n};\n","import { useRef } from 'react';\n\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useInteractions,\n FloatingArrow,\n arrow,\n hide,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\nimport classNames from 'classnames';\n\nimport { PopOverVariant } from './utils';\nimport { AnalyticsId, ZIndex } from '../../constants';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\n\nimport styles from './styles.module.scss';\n\nexport type PopOverRole = 'tooltip' | 'dialog' | 'group';\n\nexport type PopOverPlacement = 'top' | 'bottom';\n\nexport interface PopOverProps {\n /** Sets aria-label of the bubble. If role is set to dialog ariaLabel or ariaLabelledById MUST be set! */\n ariaLabel?: string;\n /** Sets aria-labelledby of the bubble. If role is set to dialog ariaLabel or ariaLabelledById MUST be set! */\n ariaLabelledById?: string;\n /** Id of the PopOver */\n id?: string;\n /** Content shown inside PopOver. Note that if role=\"tooltip\", you must not include interactive/focusable elements. */\n children: React.ReactNode;\n /** Ref for the element the PopOver is placed upon */\n controllerRef: React.RefObject<HTMLElement | SVGSVGElement | null>;\n /** Show the popover. Only applies when role=tooltip. Default: false. */\n show?: boolean;\n /** Adds custom classes to the element. */\n className?: string;\n /** @deprecated Adds custom classes to the arrow element. */\n arrowClassName?: string;\n /** @deprecated use placement instead. Determines the placement of the popover. Default: automatic positioning. */\n variant?: keyof typeof PopOverVariant;\n /** Sets the placement of the popover relative to the trigger if there is space, otherwise automatic. */\n placement?: PopOverPlacement;\n /** Sets role of the PopOver element */\n role?: PopOverRole;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Overrides the default z-index of PopOver */\n zIndex?: number;\n /** Ref that is passed to the component */\n ref?: React.Ref<HTMLDivElement | SVGSVGElement | HTMLElement | null>;\n}\n\nconst PopOver: React.FC<PopOverProps> = props => {\n const {\n ariaLabel,\n ariaLabelledById,\n id,\n children,\n controllerRef,\n show = false,\n className = '',\n variant = PopOverVariant.positionautomatic,\n role = 'dialog',\n testId,\n zIndex = ZIndex.PopOver,\n placement,\n ref,\n } = props;\n\n const ariaLabelAttributes = getAriaLabelAttributes({ label: ariaLabel, id: ariaLabelledById });\n\n const placementProp = placement ?? (variant === PopOverVariant.positionabove ? 'top' : 'bottom');\n\n const arrowRef = useRef(null);\n const { refs, floatingStyles, context, middlewareData } = useFloating({\n middleware: [offset(10), flip(), shift({ padding: 8 }), hide(), arrow({ element: arrowRef })],\n placement: placementProp,\n whileElementsMounted: autoUpdate,\n elements: {\n reference: controllerRef.current,\n },\n });\n\n const click = useClick(context);\n const dismiss = useDismiss(context);\n\n const { getFloatingProps } = useInteractions([click, dismiss]);\n\n const isVisible = show && !middlewareData.hide?.referenceHidden;\n\n const mergedRef = useMergeRefs<HTMLElement | SVGSVGElement>([refs.setFloating, ref]);\n\n return (\n <FloatingFocusManager context={context} modal={false}>\n <div\n id={id}\n ref={mergedRef}\n style={{ ...floatingStyles, visibility: isVisible ? 'visible' : 'hidden', zIndex: zIndex }}\n className={classNames(styles.popover, className)}\n {...getFloatingProps()}\n role={role}\n data-testid={testId}\n data-analyticsid={AnalyticsId.PopOver}\n {...ariaLabelAttributes}\n >\n {children}\n <FloatingArrow\n ref={arrowRef}\n className={styles['popover__arrow']}\n context={context}\n fill={'var(--core-color-white)'}\n stroke={'var(--color-base-border-onlight)'}\n strokeWidth={1}\n />\n </div>\n </FloatingFocusManager>\n );\n};\n\nPopOver.displayName = 'PopOver';\n\nexport default PopOver;\n","import PopOver from './PopOver';\nexport { PopOverVariant } from './utils';\nexport * from './PopOver';\nexport default PopOver;\n"],"mappings":";;;;;;;;AAEA,IAAY,iBAAL,yBAAA,gBAAA;CACL,eAAA,uBAAA;CACA,eAAA,mBAAA;CACA,eAAA,mBAAA;;AACF,EAAA,CAAA,CAAA;;;ACsDA,IAAM,WAAkC,UAAS;CAC/C,MAAM,EACJ,WACA,kBACA,IACA,UACA,eACA,OAAO,OACP,YAAY,IACZ,UAAU,eAAe,mBACzB,OAAO,UACP,QACA,SAAS,OAAO,SAChB,WACA,QACE;CAEJ,MAAM,sBAAsB,uBAAuB;EAAE,OAAO;EAAW,IAAI;CAAiB,CAAC;CAE7F,MAAM,gBAAgB,cAAc,YAAY,eAAe,gBAAgB,QAAQ;CAEvF,MAAM,WAAW,OAAO,IAAI;CAC5B,MAAM,EAAE,MAAM,gBAAgB,SAAS,mBAAmB,YAAY;EACpE,YAAY;GAAC,OAAO,EAAE;GAAG,KAAK;GAAG,MAAM,EAAE,SAAS,EAAE,CAAC;GAAG,KAAK;GAAG,MAAM,EAAE,SAAS,SAAS,CAAC;EAAC;EAC5F,WAAW;EACX,sBAAsB;EACtB,UAAU,EACR,WAAW,cAAc,QAC3B;CACF,CAAC;CAKD,MAAM,EAAE,qBAAqB,gBAAgB,CAH/B,SAAS,OAGuB,GAF9B,WAAW,OAE0B,CAAO,CAAC;CAE7D,MAAM,YAAY,QAAQ,CAAC,eAAe,MAAM;CAIhD,OACE,oBAAC,sBAAD;EAA+B;EAAS,OAAO;YAC7C,qBAAC,OAAD;GACM;GACJ,KANY,aAA0C,CAAC,KAAK,aAAa,GAAG,CAMvE;GACL,OAAO;IAAE,GAAG;IAAgB,YAAY,YAAY,YAAY;IAAkB;GAAO;GACzF,WAAW,WAAW,OAAO,SAAS,SAAS;GAC/C,GAAI,iBAAiB;GACf;GACN,eAAa;GACb,oBAAkB,YAAY;GAC9B,GAAI;aATN,CAWG,UACD,oBAAC,eAAD;IACE,KAAK;IACL,WAAW,OAAO;IACT;IACT,MAAM;IACN,QAAQ;IACR,aAAa;GACd,CAAA,CACE;;CACe,CAAA;AAE1B;AAEA,QAAQ,cAAc;;;AC5HtB,IAAA,kBAAe"}
package/lib/Radio.js CHANGED
@@ -2,7 +2,7 @@ import { useIsMobileBreakpoint } from "./hooks/useIsMobileBreakpoint.js";
2
2
  import { useIdWithFallback } from "./hooks/useIdWithFallback.js";
3
3
  import { getAriaDescribedBy } from "./utils/accessibility.js";
4
4
  import { t as ErrorWrapper_default } from "./ErrorWrapper.js";
5
- import cn from "classnames";
5
+ import classNames from "classnames";
6
6
  import { useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import styles from "./components/VisualRadioCloud/Radio/styles.module.scss";
@@ -27,7 +27,7 @@ var Radio = (props) => {
27
27
  errorText,
28
28
  errorTextId,
29
29
  children: /* @__PURE__ */ jsxs("label", {
30
- className: cn(styles["visual-radio"], {
30
+ className: classNames(styles["visual-radio"], {
31
31
  [styles["visual-radio--checked"]]: isChecked,
32
32
  [styles["visual-radio--invalid"]]: error
33
33
  }, className),
package/lib/Radio.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Radio.js","names":[],"sources":["../src/components/VisualRadioCloud/Radio/Radio.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../../ErrorWrapper';\n\nimport { useIdWithFallback } from '../../../hooks/useIdWithFallback';\nimport { useIsMobileBreakpoint } from '../../../hooks/useIsMobileBreakpoint';\nimport { getAriaDescribedBy } from '../../../utils/accessibility';\nimport ErrorWrapper from '../../ErrorWrapper';\n\nimport styles from './styles.module.scss';\n\nexport interface RadioProps\n extends\n ErrorWrapperClassNameProps,\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'id' | 'className' | 'children' | 'size' | 'value'> {\n /** Adds custom classes to the root element. */\n className?: string;\n /** Label text shown inside the pill. */\n children: React.ReactNode;\n /** Value identifying this radio inside its group. Required. */\n value: string;\n /** input id of the underlying radio */\n inputId?: string;\n /** Activates error styling. Can be true while errorText is empty (e.g. when used in a cloud). */\n error?: boolean;\n /** Error text to show above the component. */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref forwarded to the underlying input element. */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nconst Radio: React.FC<RadioProps> = props => {\n const {\n className,\n checked,\n defaultChecked,\n children,\n inputId: inputIdProp,\n errorText,\n error = !!errorText,\n errorTextId: errorTextIdProp,\n errorWrapperClassName,\n testId,\n onChange,\n ref,\n ...rest\n } = props;\n\n const inputId = useIdWithFallback(inputIdProp);\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const isMobile = useIsMobileBreakpoint();\n const [isChecked, setIsChecked] = useState<boolean>(!!(checked ?? defaultChecked));\n const [prevChecked, setPrevChecked] = useState<boolean | undefined>(checked);\n if (prevChecked !== checked) {\n setPrevChecked(checked);\n if (checked !== undefined && checked !== isChecked) {\n setIsChecked(checked);\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n setIsChecked(e.target.checked);\n onChange?.(e);\n };\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <label\n className={classNames(\n styles['visual-radio'],\n {\n [styles['visual-radio--checked']]: isChecked,\n [styles['visual-radio--invalid']]: error,\n },\n className\n )}\n htmlFor={inputId}\n data-testid={testId}\n >\n <input\n {...rest}\n id={inputId}\n ref={ref}\n className={styles['visual-radio__input']}\n type=\"radio\"\n checked={isChecked}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n onChange={handleChange}\n />\n <span className={styles['visual-radio__pill']}>\n {isChecked && (\n <span className={styles['visual-radio__icon']} aria-hidden=\"true\">\n {isMobile ? (\n <svg width=\"8\" height=\"8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 8a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 12A6 6 0 1 0 6 0a6 6 0 0 0 0 12Z\" />\n </svg>\n )}\n </span>\n )}\n <span className={styles['visual-radio__label']}>{children}</span>\n </span>\n </label>\n </ErrorWrapper>\n );\n};\n\nexport default Radio;\n"],"mappings":";;;;;;;;;AAqCA,IAAM,SAA8B,UAAS;CAC3C,MAAM,EACJ,WACA,SACA,gBACA,UACA,SAAS,aACT,WACA,QAAQ,CAAC,CAAC,WACV,aAAa,iBACb,uBACA,QACA,UACA,KACA,GAAG,SACD;CAEJ,MAAM,UAAU,kBAAkB,WAAW;CAC7C,MAAM,cAAc,kBAAkB,eAAe;CACrD,MAAM,WAAW,sBAAsB;CACvC,MAAM,CAAC,WAAW,gBAAgB,SAAkB,CAAC,EAAE,WAAW,eAAe;CACjF,MAAM,CAAC,aAAa,kBAAkB,SAA8B,OAAO;CAC3E,IAAI,gBAAgB,SAAS;EAC3B,eAAe,OAAO;EACtB,IAAI,YAAY,KAAA,KAAa,YAAY,WACvC,aAAa,OAAO;CAExB;CAEA,MAAM,gBAAgB,MAAiD;EACrE,aAAa,EAAE,OAAO,OAAO;EAC7B,WAAW,CAAC;CACd;CAEA,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,qBAAC,SAAD;GACE,WAAW,GACT,OAAO,iBACP;KACG,OAAO,2BAA2B;KAClC,OAAO,2BAA2B;GACrC,GACA,SACF;GACA,SAAS;GACT,eAAa;aAVf,CAYE,oBAAC,SAAD;IACE,GAAI;IACJ,IAAI;IACC;IACL,WAAW,OAAO;IAClB,MAAK;IACL,SAAS;IACT,oBAAkB,mBAAmB,OAAO,WAAW;IACvD,UAAU;GACX,CAAA,GACD,qBAAC,QAAD;IAAM,WAAW,OAAO;cAAxB,CACG,aACC,oBAAC,QAAD;KAAM,WAAW,OAAO;KAAuB,eAAY;eACxD,WACC,oBAAC,OAAD;MAAK,OAAM;MAAI,QAAO;MAAI,MAAK;MAAO,OAAM;gBAC1C,oBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;KAC1C,CAAA,IAEL,oBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,MAAK;MAAO,OAAM;gBAC5C,oBAAC,QAAD,EAAM,GAAE,sCAAuC,CAAA;KAC5C,CAAA;IAEH,CAAA,GAER,oBAAC,QAAD;KAAM,WAAW,OAAO;KAAyB;IAAe,CAAA,CAC5D;KACD;;CACK,CAAA;AAElB"}
1
+ {"version":3,"file":"Radio.js","names":[],"sources":["../src/components/VisualRadioCloud/Radio/Radio.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../../ErrorWrapper';\n\nimport { useIdWithFallback } from '../../../hooks/useIdWithFallback';\nimport { useIsMobileBreakpoint } from '../../../hooks/useIsMobileBreakpoint';\nimport { getAriaDescribedBy } from '../../../utils/accessibility';\nimport ErrorWrapper from '../../ErrorWrapper';\n\nimport styles from './styles.module.scss';\n\nexport interface RadioProps\n extends\n ErrorWrapperClassNameProps,\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'id' | 'className' | 'children' | 'size' | 'value'> {\n /** Adds custom classes to the root element. */\n className?: string;\n /** Label text shown inside the pill. */\n children: React.ReactNode;\n /** Value identifying this radio inside its group. Required. */\n value: string;\n /** input id of the underlying radio */\n inputId?: string;\n /** Activates error styling. Can be true while errorText is empty (e.g. when used in a cloud). */\n error?: boolean;\n /** Error text to show above the component. */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref forwarded to the underlying input element. */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nconst Radio: React.FC<RadioProps> = props => {\n const {\n className,\n checked,\n defaultChecked,\n children,\n inputId: inputIdProp,\n errorText,\n error = !!errorText,\n errorTextId: errorTextIdProp,\n errorWrapperClassName,\n testId,\n onChange,\n ref,\n ...rest\n } = props;\n\n const inputId = useIdWithFallback(inputIdProp);\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const isMobile = useIsMobileBreakpoint();\n const [isChecked, setIsChecked] = useState<boolean>(!!(checked ?? defaultChecked));\n const [prevChecked, setPrevChecked] = useState<boolean | undefined>(checked);\n if (prevChecked !== checked) {\n setPrevChecked(checked);\n if (checked !== undefined && checked !== isChecked) {\n setIsChecked(checked);\n }\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n setIsChecked(e.target.checked);\n onChange?.(e);\n };\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <label\n className={classNames(\n styles['visual-radio'],\n {\n [styles['visual-radio--checked']]: isChecked,\n [styles['visual-radio--invalid']]: error,\n },\n className\n )}\n htmlFor={inputId}\n data-testid={testId}\n >\n <input\n {...rest}\n id={inputId}\n ref={ref}\n className={styles['visual-radio__input']}\n type=\"radio\"\n checked={isChecked}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n onChange={handleChange}\n />\n <span className={styles['visual-radio__pill']}>\n {isChecked && (\n <span className={styles['visual-radio__icon']} aria-hidden=\"true\">\n {isMobile ? (\n <svg width=\"8\" height=\"8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 8a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 12A6 6 0 1 0 6 0a6 6 0 0 0 0 12Z\" />\n </svg>\n )}\n </span>\n )}\n <span className={styles['visual-radio__label']}>{children}</span>\n </span>\n </label>\n </ErrorWrapper>\n );\n};\n\nexport default Radio;\n"],"mappings":";;;;;;;;;AAqCA,IAAM,SAA8B,UAAS;CAC3C,MAAM,EACJ,WACA,SACA,gBACA,UACA,SAAS,aACT,WACA,QAAQ,CAAC,CAAC,WACV,aAAa,iBACb,uBACA,QACA,UACA,KACA,GAAG,SACD;CAEJ,MAAM,UAAU,kBAAkB,WAAW;CAC7C,MAAM,cAAc,kBAAkB,eAAe;CACrD,MAAM,WAAW,sBAAsB;CACvC,MAAM,CAAC,WAAW,gBAAgB,SAAkB,CAAC,EAAE,WAAW,eAAe;CACjF,MAAM,CAAC,aAAa,kBAAkB,SAA8B,OAAO;CAC3E,IAAI,gBAAgB,SAAS;EAC3B,eAAe,OAAO;EACtB,IAAI,YAAY,KAAA,KAAa,YAAY,WACvC,aAAa,OAAO;CAExB;CAEA,MAAM,gBAAgB,MAAiD;EACrE,aAAa,EAAE,OAAO,OAAO;EAC7B,WAAW,CAAC;CACd;CAEA,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,qBAAC,SAAD;GACE,WAAW,WACT,OAAO,iBACP;KACG,OAAO,2BAA2B;KAClC,OAAO,2BAA2B;GACrC,GACA,SACF;GACA,SAAS;GACT,eAAa;aAVf,CAYE,oBAAC,SAAD;IACE,GAAI;IACJ,IAAI;IACC;IACL,WAAW,OAAO;IAClB,MAAK;IACL,SAAS;IACT,oBAAkB,mBAAmB,OAAO,WAAW;IACvD,UAAU;GACX,CAAA,GACD,qBAAC,QAAD;IAAM,WAAW,OAAO;cAAxB,CACG,aACC,oBAAC,QAAD;KAAM,WAAW,OAAO;KAAuB,eAAY;eACxD,WACC,oBAAC,OAAD;MAAK,OAAM;MAAI,QAAO;MAAI,MAAK;MAAO,OAAM;gBAC1C,oBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA;KAC1C,CAAA,IAEL,oBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,MAAK;MAAO,OAAM;gBAC5C,oBAAC,QAAD,EAAM,GAAE,sCAAuC,CAAA;KAC5C,CAAA;IAEH,CAAA,GAER,oBAAC,QAAD;KAAM,WAAW,OAAO;KAAyB;IAAe,CAAA,CAC5D;KACD;;CACK,CAAA;AAElB"}
@@ -1,11 +1,11 @@
1
- import { t as uuid } from "./uuid.js";
1
+ import uuid from "./utils/uuid.js";
2
2
  import { AnalyticsId, FormOnColor, FormSize } from "./constants.js";
3
3
  import { useIdWithFallback } from "./hooks/useIdWithFallback.js";
4
4
  import { getAriaDescribedBy } from "./utils/accessibility.js";
5
5
  import { t as ErrorWrapper_default } from "./ErrorWrapper.js";
6
6
  import { r as renderLabelAsParent, t as getLabelText } from "./utils2.js";
7
7
  import { t as RadioMarker } from "./RadioMarker.js";
8
- import cn from "classnames";
8
+ import classNames from "classnames";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import radioButtonStyles from "./components/RadioButton/styles.module.scss";
11
11
  //#region src/components/RadioButton/RadioButton.tsx
@@ -18,12 +18,12 @@ var RadioButton = (props) => {
18
18
  const onCherry = onColor === FormOnColor.oninvalid;
19
19
  const isLarge = size === FormSize.large;
20
20
  const errorTextId = useIdWithFallback(errorTextIdProp);
21
- const radioButtonWrapperClasses = cn(radioButtonStyles["radio-button-wrapper"], {
21
+ const radioButtonWrapperClasses = classNames(radioButtonStyles["radio-button-wrapper"], {
22
22
  [radioButtonStyles["radio-button-wrapper__large"]]: isLarge,
23
23
  [radioButtonStyles["radio-button-wrapper__large--invalid"]]: isLarge && onCherry,
24
24
  [radioButtonStyles["radio-button-wrapper__large--on-blueberry"]]: isLarge && onBlueberry
25
25
  });
26
- const radioButtonLabelClasses = cn(radioButtonStyles["radio-button-label"], {
26
+ const radioButtonLabelClasses = classNames(radioButtonStyles["radio-button-label"], {
27
27
  [radioButtonStyles["radio-button-label--disabled"]]: disabled,
28
28
  [radioButtonStyles["radio-button-label--on-dark"]]: onDark,
29
29
  [radioButtonStyles["radio-button-label--invalid"]]: invalid,
@@ -33,7 +33,7 @@ var RadioButton = (props) => {
33
33
  [radioButtonStyles["radio-button-label__large--on-blueberry"]]: isLarge && onBlueberry,
34
34
  [radioButtonStyles["radio-button-label__large--invalid"]]: isLarge && onCherry
35
35
  }, labelClassNames);
36
- const radioButtonClasses = cn(radioButtonStyles["radio-button"], className);
36
+ const radioButtonClasses = classNames(radioButtonStyles["radio-button"], className);
37
37
  const getLabelContent = () => /* @__PURE__ */ jsxs("span", {
38
38
  className: radioButtonStyles["radio-button__marker-wrapper"],
39
39
  children: [/* @__PURE__ */ jsx("input", {
@@ -1 +1 @@
1
- {"version":3,"file":"RadioButton.js","names":[],"sources":["../src/components/RadioButton/RadioButton.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport RadioMarker from './RadioMarker/RadioMarker';\nimport { AnalyticsId, FormOnColor, FormSize } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { getAriaDescribedBy } from '../../utils/accessibility';\nimport { uuid } from '../../utils/uuid';\nimport ErrorWrapper from '../ErrorWrapper';\nimport { getLabelText, renderLabelAsParent } from '../Label/utils';\n\nimport radioButtonStyles from './styles.module.scss';\n\nexport interface RadioButtonProps\n extends\n ErrorWrapperClassNameProps,\n Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'aria-describedby' | 'name' | 'value' | 'disabled' | 'checked' | 'defaultChecked' | 'required' | 'onChange'\n > {\n /** Adds custom classes to the element. */\n className?: string;\n /** The <Label/> next to the radioButton - sublabels kan ikke kombineres med large variant */\n label: React.ReactNode;\n /** Adds custom classes to the label element. */\n labelClassNames?: string;\n /** input id of the radioButton */\n inputId?: string;\n /** Changes the visuals of the radioButton */\n onColor?: keyof typeof FormOnColor;\n /** Changes the visuals of the radioButton. Large version only works when used inside a FormGroup wrapper. */\n size?: keyof typeof FormSize;\n /** Activates Error style for the radioButton - This is can be true while errorText is empty, when in a FormGroup */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref passed to the input element */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nexport const RadioButton: React.FC<RadioButtonProps> = props => {\n const {\n className,\n defaultChecked,\n onChange,\n disabled,\n label,\n inputId = uuid(),\n onColor = FormOnColor.onwhite,\n name = inputId,\n size,\n errorText,\n errorTextId: errorTextIdProp,\n error = !!errorText,\n errorWrapperClassName,\n value = getLabelText(label),\n testId,\n required,\n labelClassNames,\n ref,\n ...rest\n } = props;\n const invalid = error || onColor === FormOnColor.oninvalid;\n const onDark = onColor === FormOnColor.ondark;\n const onGrey = onColor === FormOnColor.ongrey;\n const onBlueberry = onColor === FormOnColor.onblueberry;\n const onCherry = onColor === FormOnColor.oninvalid;\n const isLarge = size === FormSize.large;\n\n const errorTextId = useIdWithFallback(errorTextIdProp);\n\n const radioButtonWrapperClasses = classNames(radioButtonStyles['radio-button-wrapper'], {\n [radioButtonStyles['radio-button-wrapper__large']]: isLarge,\n [radioButtonStyles['radio-button-wrapper__large--invalid']]: isLarge && onCherry,\n [radioButtonStyles['radio-button-wrapper__large--on-blueberry']]: isLarge && onBlueberry,\n });\n const radioButtonLabelClasses = classNames(\n radioButtonStyles['radio-button-label'],\n {\n [radioButtonStyles['radio-button-label--disabled']]: disabled,\n [radioButtonStyles['radio-button-label--on-dark']]: onDark,\n [radioButtonStyles['radio-button-label--invalid']]: invalid,\n [radioButtonStyles['radio-button-label__large']]: isLarge,\n [radioButtonStyles['radio-button-label__large--disabled']]: isLarge && disabled,\n [radioButtonStyles['radio-button-label__large--on-grey']]: isLarge && onGrey,\n [radioButtonStyles['radio-button-label__large--on-blueberry']]: isLarge && onBlueberry,\n [radioButtonStyles['radio-button-label__large--invalid']]: isLarge && onCherry,\n },\n labelClassNames\n );\n const radioButtonClasses = classNames(radioButtonStyles['radio-button'], className);\n\n const getLabelContent = (): React.ReactNode => (\n <span className={radioButtonStyles['radio-button__marker-wrapper']}>\n <input\n {...rest}\n id={inputId}\n name={name}\n className={radioButtonClasses}\n type=\"radio\"\n disabled={disabled}\n value={value}\n ref={ref}\n defaultChecked={defaultChecked}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n required={required}\n onChange={onChange}\n />\n <RadioMarker disabled={disabled} error={invalid} onColor={onColor} size={size} />\n </span>\n );\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <div data-testid={testId} data-analyticsid={AnalyticsId.RadioButton} className={radioButtonWrapperClasses}>\n {renderLabelAsParent({\n label: label,\n children: getLabelContent(),\n inputId: inputId,\n onColor: onColor as FormOnColor,\n labelClassName: radioButtonLabelClasses,\n sublabelWrapperClassName: radioButtonStyles['radiobutton-sublabel-wrapper'],\n large: isLarge,\n afterLabelChildrenClassName: radioButtonStyles['radiobutton-afterlabelchildren-wrapper'],\n })}\n </div>\n </ErrorWrapper>\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nexport default RadioButton;\n"],"mappings":";;;;;;;;;;;AA6CA,IAAa,eAA0C,UAAS;CAC9D,MAAM,EACJ,WACA,gBACA,UACA,UACA,OACA,UAAU,KAAK,GACf,UAAU,YAAY,SACtB,OAAO,SACP,MACA,WACA,aAAa,iBACb,QAAQ,CAAC,CAAC,WACV,uBACA,QAAQ,aAAa,KAAK,GAC1B,QACA,UACA,iBACA,KACA,GAAG,SACD;CACJ,MAAM,UAAU,SAAS,YAAY,YAAY;CACjD,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,cAAc,YAAY,YAAY;CAC5C,MAAM,WAAW,YAAY,YAAY;CACzC,MAAM,UAAU,SAAS,SAAS;CAElC,MAAM,cAAc,kBAAkB,eAAe;CAErD,MAAM,4BAA4B,GAAW,kBAAkB,yBAAyB;GACrF,kBAAkB,iCAAiC;GACnD,kBAAkB,0CAA0C,WAAW;GACvE,kBAAkB,+CAA+C,WAAW;CAC/E,CAAC;CACD,MAAM,0BAA0B,GAC9B,kBAAkB,uBAClB;GACG,kBAAkB,kCAAkC;GACpD,kBAAkB,iCAAiC;GACnD,kBAAkB,iCAAiC;GACnD,kBAAkB,+BAA+B;GACjD,kBAAkB,yCAAyC,WAAW;GACtE,kBAAkB,wCAAwC,WAAW;GACrE,kBAAkB,6CAA6C,WAAW;GAC1E,kBAAkB,wCAAwC,WAAW;CACxE,GACA,eACF;CACA,MAAM,qBAAqB,GAAW,kBAAkB,iBAAiB,SAAS;CAElF,MAAM,wBACJ,qBAAC,QAAD;EAAM,WAAW,kBAAkB;YAAnC,CACE,oBAAC,SAAD;GACE,GAAI;GACJ,IAAI;GACE;GACN,WAAW;GACX,MAAK;GACK;GACH;GACF;GACW;GAChB,oBAAkB,mBAAmB,OAAO,WAAW;GAC7C;GACA;EACX,CAAA,GACD,oBAAC,aAAD;GAAuB;GAAU,OAAO;GAAkB;GAAe;EAAO,CAAA,CAC5E;;CAGR,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,oBAAC,OAAD;GAAK,eAAa;GAAQ,oBAAkB,YAAY;GAAa,WAAW;aAC7E,oBAAoB;IACZ;IACP,UAAU,gBAAgB;IACjB;IACA;IACT,gBAAgB;IAChB,0BAA0B,kBAAkB;IAC5C,OAAO;IACP,6BAA6B,kBAAkB;GACjD,CAAC;EACE,CAAA;CACO,CAAA;AAElB;AAEA,YAAY,cAAc"}
1
+ {"version":3,"file":"RadioButton.js","names":[],"sources":["../src/components/RadioButton/RadioButton.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport RadioMarker from './RadioMarker/RadioMarker';\nimport { AnalyticsId, FormOnColor, FormSize } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { getAriaDescribedBy } from '../../utils/accessibility';\nimport { uuid } from '../../utils/uuid';\nimport ErrorWrapper from '../ErrorWrapper';\nimport { getLabelText, renderLabelAsParent } from '../Label/utils';\n\nimport radioButtonStyles from './styles.module.scss';\n\nexport interface RadioButtonProps\n extends\n ErrorWrapperClassNameProps,\n Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'aria-describedby' | 'name' | 'value' | 'disabled' | 'checked' | 'defaultChecked' | 'required' | 'onChange'\n > {\n /** Adds custom classes to the element. */\n className?: string;\n /** The <Label/> next to the radioButton - sublabels kan ikke kombineres med large variant */\n label: React.ReactNode;\n /** Adds custom classes to the label element. */\n labelClassNames?: string;\n /** input id of the radioButton */\n inputId?: string;\n /** Changes the visuals of the radioButton */\n onColor?: keyof typeof FormOnColor;\n /** Changes the visuals of the radioButton. Large version only works when used inside a FormGroup wrapper. */\n size?: keyof typeof FormSize;\n /** Activates Error style for the radioButton - This is can be true while errorText is empty, when in a FormGroup */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref passed to the input element */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nexport const RadioButton: React.FC<RadioButtonProps> = props => {\n const {\n className,\n defaultChecked,\n onChange,\n disabled,\n label,\n inputId = uuid(),\n onColor = FormOnColor.onwhite,\n name = inputId,\n size,\n errorText,\n errorTextId: errorTextIdProp,\n error = !!errorText,\n errorWrapperClassName,\n value = getLabelText(label),\n testId,\n required,\n labelClassNames,\n ref,\n ...rest\n } = props;\n const invalid = error || onColor === FormOnColor.oninvalid;\n const onDark = onColor === FormOnColor.ondark;\n const onGrey = onColor === FormOnColor.ongrey;\n const onBlueberry = onColor === FormOnColor.onblueberry;\n const onCherry = onColor === FormOnColor.oninvalid;\n const isLarge = size === FormSize.large;\n\n const errorTextId = useIdWithFallback(errorTextIdProp);\n\n const radioButtonWrapperClasses = classNames(radioButtonStyles['radio-button-wrapper'], {\n [radioButtonStyles['radio-button-wrapper__large']]: isLarge,\n [radioButtonStyles['radio-button-wrapper__large--invalid']]: isLarge && onCherry,\n [radioButtonStyles['radio-button-wrapper__large--on-blueberry']]: isLarge && onBlueberry,\n });\n const radioButtonLabelClasses = classNames(\n radioButtonStyles['radio-button-label'],\n {\n [radioButtonStyles['radio-button-label--disabled']]: disabled,\n [radioButtonStyles['radio-button-label--on-dark']]: onDark,\n [radioButtonStyles['radio-button-label--invalid']]: invalid,\n [radioButtonStyles['radio-button-label__large']]: isLarge,\n [radioButtonStyles['radio-button-label__large--disabled']]: isLarge && disabled,\n [radioButtonStyles['radio-button-label__large--on-grey']]: isLarge && onGrey,\n [radioButtonStyles['radio-button-label__large--on-blueberry']]: isLarge && onBlueberry,\n [radioButtonStyles['radio-button-label__large--invalid']]: isLarge && onCherry,\n },\n labelClassNames\n );\n const radioButtonClasses = classNames(radioButtonStyles['radio-button'], className);\n\n const getLabelContent = (): React.ReactNode => (\n <span className={radioButtonStyles['radio-button__marker-wrapper']}>\n <input\n {...rest}\n id={inputId}\n name={name}\n className={radioButtonClasses}\n type=\"radio\"\n disabled={disabled}\n value={value}\n ref={ref}\n defaultChecked={defaultChecked}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n required={required}\n onChange={onChange}\n />\n <RadioMarker disabled={disabled} error={invalid} onColor={onColor} size={size} />\n </span>\n );\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <div data-testid={testId} data-analyticsid={AnalyticsId.RadioButton} className={radioButtonWrapperClasses}>\n {renderLabelAsParent({\n label: label,\n children: getLabelContent(),\n inputId: inputId,\n onColor: onColor as FormOnColor,\n labelClassName: radioButtonLabelClasses,\n sublabelWrapperClassName: radioButtonStyles['radiobutton-sublabel-wrapper'],\n large: isLarge,\n afterLabelChildrenClassName: radioButtonStyles['radiobutton-afterlabelchildren-wrapper'],\n })}\n </div>\n </ErrorWrapper>\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nexport default RadioButton;\n"],"mappings":";;;;;;;;;;;AA6CA,IAAa,eAA0C,UAAS;CAC9D,MAAM,EACJ,WACA,gBACA,UACA,UACA,OACA,UAAU,KAAK,GACf,UAAU,YAAY,SACtB,OAAO,SACP,MACA,WACA,aAAa,iBACb,QAAQ,CAAC,CAAC,WACV,uBACA,QAAQ,aAAa,KAAK,GAC1B,QACA,UACA,iBACA,KACA,GAAG,SACD;CACJ,MAAM,UAAU,SAAS,YAAY,YAAY;CACjD,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,cAAc,YAAY,YAAY;CAC5C,MAAM,WAAW,YAAY,YAAY;CACzC,MAAM,UAAU,SAAS,SAAS;CAElC,MAAM,cAAc,kBAAkB,eAAe;CAErD,MAAM,4BAA4B,WAAW,kBAAkB,yBAAyB;GACrF,kBAAkB,iCAAiC;GACnD,kBAAkB,0CAA0C,WAAW;GACvE,kBAAkB,+CAA+C,WAAW;CAC/E,CAAC;CACD,MAAM,0BAA0B,WAC9B,kBAAkB,uBAClB;GACG,kBAAkB,kCAAkC;GACpD,kBAAkB,iCAAiC;GACnD,kBAAkB,iCAAiC;GACnD,kBAAkB,+BAA+B;GACjD,kBAAkB,yCAAyC,WAAW;GACtE,kBAAkB,wCAAwC,WAAW;GACrE,kBAAkB,6CAA6C,WAAW;GAC1E,kBAAkB,wCAAwC,WAAW;CACxE,GACA,eACF;CACA,MAAM,qBAAqB,WAAW,kBAAkB,iBAAiB,SAAS;CAElF,MAAM,wBACJ,qBAAC,QAAD;EAAM,WAAW,kBAAkB;YAAnC,CACE,oBAAC,SAAD;GACE,GAAI;GACJ,IAAI;GACE;GACN,WAAW;GACX,MAAK;GACK;GACH;GACF;GACW;GAChB,oBAAkB,mBAAmB,OAAO,WAAW;GAC7C;GACA;EACX,CAAA,GACD,oBAAC,aAAD;GAAuB;GAAU,OAAO;GAAkB;GAAe;EAAO,CAAA,CAC5E;;CAGR,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,oBAAC,OAAD;GAAK,eAAa;GAAQ,oBAAkB,YAAY;GAAa,WAAW;aAC7E,oBAAoB;IACZ;IACP,UAAU,gBAAgB;IACjB;IACA;IACT,gBAAgB;IAChB,0BAA0B,kBAAkB;IAC5C,OAAO;IACP,6BAA6B,kBAAkB;GACjD,CAAC;EACE,CAAA;CACO,CAAA;AAElB;AAEA,YAAY,cAAc"}
@@ -1,5 +1,5 @@
1
1
  import { FormOnColor, FormSize } from "./constants.js";
2
- import cn from "classnames";
2
+ import classNames from "classnames";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import styles from "./components/RadioButton/RadioMarker/styles.module.scss";
5
5
  //#region src/components/RadioButton/RadioMarker/RadioMarker.tsx
@@ -15,7 +15,7 @@ var RadioMarker = (props) => {
15
15
  const onDark = onColor === FormOnColor.ondark;
16
16
  const large = size === FormSize.large;
17
17
  return /* @__PURE__ */ jsx("span", {
18
- className: cn(styles["radio__marker"], large ? styles["radio__marker__large"] : styles["radio__marker__regular"], {
18
+ className: classNames(styles["radio__marker"], large ? styles["radio__marker__large"] : styles["radio__marker__regular"], {
19
19
  [styles["radio__marker--on-white"]]: onWhite,
20
20
  [styles["radio__marker--on-grey"]]: onGrey,
21
21
  [styles["radio__marker--on-blueberry"]]: onBlueberry,
@@ -1 +1 @@
1
- {"version":3,"file":"RadioMarker.js","names":[],"sources":["../src/components/RadioButton/RadioMarker/RadioMarker.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport { FormOnColor, FormSize } from '../../../constants';\n\nimport styles from './styles.module.scss';\n\nexport interface RadioMarkerProps {\n /** Whether the radio is checked. Controls the inner dot visibility. */\n checked?: boolean;\n /** Disables the visual state of the marker. */\n disabled?: boolean;\n /** Activates error styling. */\n error?: boolean;\n /** Background context the marker is rendered on. */\n onColor?: keyof typeof FormOnColor;\n /** Size variant of the marker. */\n size?: keyof typeof FormSize;\n /** Adds custom classes to the marker wrapper. */\n className?: string;\n}\n\n/**\n * Does not render an <input>; consumers render this on their end.\n */\nexport const RadioMarker: React.FC<RadioMarkerProps> = props => {\n const { checked = false, disabled = false, error = false, onColor = FormOnColor.onwhite, size, className } = props;\n\n const onWhite = onColor === FormOnColor.onwhite;\n const onGrey = onColor === FormOnColor.ongrey;\n const onBlueberry = onColor === FormOnColor.onblueberry;\n const onInvalid = error || onColor === FormOnColor.oninvalid;\n const onDark = onColor === FormOnColor.ondark;\n const large = size === FormSize.large;\n\n const markerClasses = classNames(\n styles['radio__marker'],\n large ? styles['radio__marker__large'] : styles['radio__marker__regular'],\n {\n [styles['radio__marker--on-white']]: onWhite,\n [styles['radio__marker--on-grey']]: onGrey,\n [styles['radio__marker--on-blueberry']]: onBlueberry,\n [styles['radio__marker--on-dark']]: onDark,\n [styles['radio__marker--on-invalid']]: onInvalid,\n [styles['radio__marker--invalid']]: onInvalid,\n [styles['radio__marker--disabled']]: disabled,\n [styles['radio__marker--checked']]: checked,\n },\n className\n );\n\n return (\n <span className={markerClasses} aria-hidden=\"true\">\n <span className={styles['radio__marker-dot']} />\n </span>\n );\n};\n\nexport default RadioMarker;\n"],"mappings":";;;;;;;;AAwBA,IAAa,eAA0C,UAAS;CAC9D,MAAM,EAAE,UAAU,OAAO,WAAW,OAAO,QAAQ,OAAO,UAAU,YAAY,SAAS,MAAM,cAAc;CAE7G,MAAM,UAAU,YAAY,YAAY;CACxC,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,cAAc,YAAY,YAAY;CAC5C,MAAM,YAAY,SAAS,YAAY,YAAY;CACnD,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,QAAQ,SAAS,SAAS;CAkBhC,OACE,oBAAC,QAAD;EAAM,WAjBc,GACpB,OAAO,kBACP,QAAQ,OAAO,0BAA0B,OAAO,2BAChD;IACG,OAAO,6BAA6B;IACpC,OAAO,4BAA4B;IACnC,OAAO,iCAAiC;IACxC,OAAO,4BAA4B;IACnC,OAAO,+BAA+B;IACtC,OAAO,4BAA4B;IACnC,OAAO,6BAA6B;IACpC,OAAO,4BAA4B;EACtC,GACA,SAIiB;EAAe,eAAY;YAC1C,oBAAC,QAAD,EAAM,WAAW,OAAO,qBAAuB,CAAA;CAC3C,CAAA;AAEV"}
1
+ {"version":3,"file":"RadioMarker.js","names":[],"sources":["../src/components/RadioButton/RadioMarker/RadioMarker.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport { FormOnColor, FormSize } from '../../../constants';\n\nimport styles from './styles.module.scss';\n\nexport interface RadioMarkerProps {\n /** Whether the radio is checked. Controls the inner dot visibility. */\n checked?: boolean;\n /** Disables the visual state of the marker. */\n disabled?: boolean;\n /** Activates error styling. */\n error?: boolean;\n /** Background context the marker is rendered on. */\n onColor?: keyof typeof FormOnColor;\n /** Size variant of the marker. */\n size?: keyof typeof FormSize;\n /** Adds custom classes to the marker wrapper. */\n className?: string;\n}\n\n/**\n * Does not render an <input>; consumers render this on their end.\n */\nexport const RadioMarker: React.FC<RadioMarkerProps> = props => {\n const { checked = false, disabled = false, error = false, onColor = FormOnColor.onwhite, size, className } = props;\n\n const onWhite = onColor === FormOnColor.onwhite;\n const onGrey = onColor === FormOnColor.ongrey;\n const onBlueberry = onColor === FormOnColor.onblueberry;\n const onInvalid = error || onColor === FormOnColor.oninvalid;\n const onDark = onColor === FormOnColor.ondark;\n const large = size === FormSize.large;\n\n const markerClasses = classNames(\n styles['radio__marker'],\n large ? styles['radio__marker__large'] : styles['radio__marker__regular'],\n {\n [styles['radio__marker--on-white']]: onWhite,\n [styles['radio__marker--on-grey']]: onGrey,\n [styles['radio__marker--on-blueberry']]: onBlueberry,\n [styles['radio__marker--on-dark']]: onDark,\n [styles['radio__marker--on-invalid']]: onInvalid,\n [styles['radio__marker--invalid']]: onInvalid,\n [styles['radio__marker--disabled']]: disabled,\n [styles['radio__marker--checked']]: checked,\n },\n className\n );\n\n return (\n <span className={markerClasses} aria-hidden=\"true\">\n <span className={styles['radio__marker-dot']} />\n </span>\n );\n};\n\nexport default RadioMarker;\n"],"mappings":";;;;;;;;AAwBA,IAAa,eAA0C,UAAS;CAC9D,MAAM,EAAE,UAAU,OAAO,WAAW,OAAO,QAAQ,OAAO,UAAU,YAAY,SAAS,MAAM,cAAc;CAE7G,MAAM,UAAU,YAAY,YAAY;CACxC,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,cAAc,YAAY,YAAY;CAC5C,MAAM,YAAY,SAAS,YAAY,YAAY;CACnD,MAAM,SAAS,YAAY,YAAY;CACvC,MAAM,QAAQ,SAAS,SAAS;CAkBhC,OACE,oBAAC,QAAD;EAAM,WAjBc,WACpB,OAAO,kBACP,QAAQ,OAAO,0BAA0B,OAAO,2BAChD;IACG,OAAO,6BAA6B;IACpC,OAAO,4BAA4B;IACnC,OAAO,iCAAiC;IACxC,OAAO,4BAA4B;IACnC,OAAO,+BAA+B;IACtC,OAAO,4BAA4B;IACnC,OAAO,6BAA6B;IACpC,OAAO,4BAA4B;EACtC,GACA,SAIiB;EAAe,eAAY;YAC1C,oBAAC,QAAD,EAAM,WAAW,OAAO,qBAAuB,CAAA;CAC3C,CAAA;AAEV"}
package/lib/Select.js CHANGED
@@ -6,7 +6,7 @@ import { getAriaDescribedBy } from "./utils/accessibility.js";
6
6
  import { t as ErrorWrapper_default } from "./ErrorWrapper.js";
7
7
  import { n as renderLabel } from "./utils2.js";
8
8
  import ChevronDown from "./components/Icons/ChevronDown.js";
9
- import cn from "classnames";
9
+ import classNames from "classnames";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
11
  import selectStyles from "./components/Select/styles.module.scss";
12
12
  //#region src/components/Select/Select.tsx
@@ -24,17 +24,17 @@ var Select = (props) => {
24
24
  const invalid = onColor === "oninvalid" || !!errorText || !!error;
25
25
  const iconColor = getIconColor(invalid, !!disabled);
26
26
  const maxWidth = width ? getSelectMaxWidth(width) : void 0;
27
- const selectInnerWrapperClasses = cn(selectStyles["select-inner-wrapper"], {
27
+ const selectInnerWrapperClasses = classNames(selectStyles["select-inner-wrapper"], {
28
28
  [selectStyles["select-inner-wrapper--transparent"]]: concept === "transparent",
29
29
  [selectStyles["select-inner-wrapper--on-blueberry"]]: onBlueberry,
30
30
  [selectStyles["select-inner-wrapper--invalid"]]: invalid,
31
31
  [selectStyles["select-inner-wrapper--disabled"]]: disabled
32
32
  }, className);
33
- const selectClasses = cn(selectStyles.select, {
33
+ const selectClasses = classNames(selectStyles.select, {
34
34
  [selectStyles["select--on-blueberry"]]: onBlueberry,
35
35
  [selectStyles["select--invalid"]]: invalid
36
36
  });
37
- const selectWrapperClasses = cn(selectStyles["select-wrapper"], wrapperClassName);
37
+ const selectWrapperClasses = classNames(selectStyles["select-wrapper"], wrapperClassName);
38
38
  return /* @__PURE__ */ jsx(ErrorWrapper_default, {
39
39
  className: errorWrapperClassName,
40
40
  errorText,
package/lib/Select.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Select.js","names":[],"sources":["../src/components/Select/Select.tsx","../src/components/Select/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport { AnalyticsId, AVERAGE_CHARACTER_WIDTH_PX, FormOnColor, IconSize } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { getColor } from '../../theme/currys';\nimport { getAriaDescribedBy } from '../../utils/accessibility';\nimport ErrorWrapper from '../ErrorWrapper';\nimport Icon from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport { renderLabel } from '../Label/utils';\n\nimport selectStyles from './styles.module.scss';\n\ntype SelectConcept = 'normal' | 'transparent';\n\nexport interface SelectProps\n extends\n ErrorWrapperClassNameProps,\n Pick<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n 'aria-describedby' | 'name' | 'disabled' | 'required' | 'value' | 'onChange' | 'autoComplete'\n > {\n /** Sets the content of the select element. */\n children: React.ReactNode;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the visuals of the component */\n concept?: SelectConcept;\n /** The label text above the select */\n label?: React.ReactNode;\n /** Adds custom classes to the label wrapper */\n labelClassName?: string;\n /** Changes the visuals of the component */\n onColor?: keyof typeof FormOnColor;\n /** Activates Error style for the select component - This is can be true while errorText is empty, when in a FormGroup */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** select id of the select element */\n selectId?: string;\n /** Width of select in characters (approximate) */\n width?: number;\n /** Gives defaultvalue to the comp. Preferred over selected prop on option by react */\n defaultValue?: string | number;\n /** Adds custom classes to the wrapper tag */\n wrapperClassName?: string;\n /** Ref passed to the select element */\n ref?: React.Ref<HTMLSelectElement | null>;\n}\n\nconst getSelectMaxWidth = (characters: number): string => {\n const paddingWidth = '2rem';\n\n return `calc(${characters * AVERAGE_CHARACTER_WIDTH_PX}px + ${paddingWidth})`;\n};\n\nconst getIconColor = (invalid: boolean, disabled: boolean): string => {\n const iconColor = invalid ? 'cherry' : 'blueberry';\n return disabled ? getColor('neutral', 500) : getColor(iconColor, 600);\n};\n\nexport const Select: React.FC<SelectProps> = props => {\n const {\n className,\n children,\n concept = 'normal',\n disabled,\n error,\n errorText,\n errorTextId: errorTextIdProp,\n selectId: selectIdProp,\n errorWrapperClassName,\n label,\n name = props.selectId,\n onColor = FormOnColor.onwhite,\n testId,\n width,\n required,\n value,\n defaultValue,\n autoComplete = 'off',\n wrapperClassName,\n ref,\n labelClassName,\n ...rest\n } = props;\n\n const selectId = useIdWithFallback(selectIdProp);\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const onBlueberry = onColor === 'onblueberry';\n const invalid = onColor === 'oninvalid' || !!errorText || !!error;\n const iconColor = getIconColor(invalid, !!disabled);\n const maxWidth = width ? getSelectMaxWidth(width) : undefined;\n\n const selectInnerWrapperClasses = classNames(\n selectStyles['select-inner-wrapper'],\n {\n [selectStyles['select-inner-wrapper--transparent']]: concept === 'transparent',\n [selectStyles['select-inner-wrapper--on-blueberry']]: onBlueberry,\n [selectStyles['select-inner-wrapper--invalid']]: invalid,\n [selectStyles['select-inner-wrapper--disabled']]: disabled,\n },\n className\n );\n\n const selectClasses = classNames(selectStyles.select, {\n [selectStyles['select--on-blueberry']]: onBlueberry,\n [selectStyles['select--invalid']]: invalid,\n });\n\n const selectWrapperClasses = classNames(selectStyles['select-wrapper'], wrapperClassName);\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <div data-testid={testId} data-analyticsid={AnalyticsId.Select} className={selectWrapperClasses} style={{ maxWidth }}>\n {renderLabel({ label: label, inputId: selectId, onColor: onColor as FormOnColor, className: labelClassName })}\n <div className={selectInnerWrapperClasses} data-testid={testId + '-inner-wrapper'}>\n <Icon\n className={selectStyles['select-arrow']}\n svgIcon={ChevronDown}\n color={iconColor}\n size={IconSize.XSmall}\n testId={testId + '-icon'}\n />\n <select\n {...rest}\n aria-invalid={!!invalid}\n id={selectId}\n name={name}\n className={selectClasses}\n disabled={disabled}\n ref={ref}\n required={required}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n aria-required={!!required}\n value={value}\n defaultValue={defaultValue}\n autoComplete={autoComplete ? autoComplete : undefined}\n >\n {children}\n </select>\n </div>\n </div>\n </ErrorWrapper>\n );\n};\n\nexport default Select;\n","import Select from './Select';\nexport * from './Select';\nexport default Select;\n"],"mappings":";;;;;;;;;;;;AAwDA,IAAM,qBAAqB,eAA+B;CAGxD,OAAO,QAAQ,aAAA,GAAwC;AACzD;AAEA,IAAM,gBAAgB,SAAkB,aAA8B;CAEpE,OAAO,WAAW,SAAS,WAAW,GAAG,IAAI,SAD3B,UAAU,WAAW,aAC0B,GAAG;AACtE;AAEA,IAAa,UAAgC,UAAS;CACpD,MAAM,EACJ,WACA,UACA,UAAU,UACV,UACA,OACA,WACA,aAAa,iBACb,UAAU,cACV,uBACA,OACA,OAAO,MAAM,UACb,UAAU,YAAY,SACtB,QACA,OACA,UACA,OACA,cACA,eAAe,OACf,kBACA,KACA,gBACA,GAAG,SACD;CAEJ,MAAM,WAAW,kBAAkB,YAAY;CAC/C,MAAM,cAAc,kBAAkB,eAAe;CACrD,MAAM,cAAc,YAAY;CAChC,MAAM,UAAU,YAAY,eAAe,CAAC,CAAC,aAAa,CAAC,CAAC;CAC5D,MAAM,YAAY,aAAa,SAAS,CAAC,CAAC,QAAQ;CAClD,MAAM,WAAW,QAAQ,kBAAkB,KAAK,IAAI,KAAA;CAEpD,MAAM,4BAA4B,GAChC,aAAa,yBACb;GACG,aAAa,uCAAuC,YAAY;GAChE,aAAa,wCAAwC;GACrD,aAAa,mCAAmC;GAChD,aAAa,oCAAoC;CACpD,GACA,SACF;CAEA,MAAM,gBAAgB,GAAW,aAAa,QAAQ;GACnD,aAAa,0BAA0B;GACvC,aAAa,qBAAqB;CACrC,CAAC;CAED,MAAM,uBAAuB,GAAW,aAAa,mBAAmB,gBAAgB;CAExF,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,qBAAC,OAAD;GAAK,eAAa;GAAQ,oBAAkB,YAAY;GAAQ,WAAW;GAAsB,OAAO,EAAE,SAAS;aAAnH,CACG,YAAY;IAAS;IAAO,SAAS;IAAmB;IAAwB,WAAW;GAAe,CAAC,GAC5G,qBAAC,OAAD;IAAK,WAAW;IAA2B,eAAa,SAAS;cAAjE,CACE,oBAAC,cAAD;KACE,WAAW,aAAa;KACxB,SAAS;KACT,OAAO;KACP,MAAM,SAAS;KACf,QAAQ,SAAS;IAClB,CAAA,GACD,oBAAC,UAAD;KACE,GAAI;KACJ,gBAAc,CAAC,CAAC;KAChB,IAAI;KACE;KACN,WAAW;KACD;KACL;KACK;KACV,oBAAkB,mBAAmB,OAAO,WAAW;KACvD,iBAAe,CAAC,CAAC;KACV;KACO;KACd,cAAc,eAAe,eAAe,KAAA;KAE3C;IACK,CAAA,CACL;KACF;;CACO,CAAA;AAElB;;;ACrJA,IAAA,iBAAe"}
1
+ {"version":3,"file":"Select.js","names":[],"sources":["../src/components/Select/Select.tsx","../src/components/Select/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport { AnalyticsId, AVERAGE_CHARACTER_WIDTH_PX, FormOnColor, IconSize } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { getColor } from '../../theme/currys';\nimport { getAriaDescribedBy } from '../../utils/accessibility';\nimport ErrorWrapper from '../ErrorWrapper';\nimport Icon from '../Icon';\nimport ChevronDown from '../Icons/ChevronDown';\nimport { renderLabel } from '../Label/utils';\n\nimport selectStyles from './styles.module.scss';\n\ntype SelectConcept = 'normal' | 'transparent';\n\nexport interface SelectProps\n extends\n ErrorWrapperClassNameProps,\n Pick<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n 'aria-describedby' | 'name' | 'disabled' | 'required' | 'value' | 'onChange' | 'autoComplete'\n > {\n /** Sets the content of the select element. */\n children: React.ReactNode;\n /** Adds custom classes to the element. */\n className?: string;\n /** Changes the visuals of the component */\n concept?: SelectConcept;\n /** The label text above the select */\n label?: React.ReactNode;\n /** Adds custom classes to the label wrapper */\n labelClassName?: string;\n /** Changes the visuals of the component */\n onColor?: keyof typeof FormOnColor;\n /** Activates Error style for the select component - This is can be true while errorText is empty, when in a FormGroup */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** select id of the select element */\n selectId?: string;\n /** Width of select in characters (approximate) */\n width?: number;\n /** Gives defaultvalue to the comp. Preferred over selected prop on option by react */\n defaultValue?: string | number;\n /** Adds custom classes to the wrapper tag */\n wrapperClassName?: string;\n /** Ref passed to the select element */\n ref?: React.Ref<HTMLSelectElement | null>;\n}\n\nconst getSelectMaxWidth = (characters: number): string => {\n const paddingWidth = '2rem';\n\n return `calc(${characters * AVERAGE_CHARACTER_WIDTH_PX}px + ${paddingWidth})`;\n};\n\nconst getIconColor = (invalid: boolean, disabled: boolean): string => {\n const iconColor = invalid ? 'cherry' : 'blueberry';\n return disabled ? getColor('neutral', 500) : getColor(iconColor, 600);\n};\n\nexport const Select: React.FC<SelectProps> = props => {\n const {\n className,\n children,\n concept = 'normal',\n disabled,\n error,\n errorText,\n errorTextId: errorTextIdProp,\n selectId: selectIdProp,\n errorWrapperClassName,\n label,\n name = props.selectId,\n onColor = FormOnColor.onwhite,\n testId,\n width,\n required,\n value,\n defaultValue,\n autoComplete = 'off',\n wrapperClassName,\n ref,\n labelClassName,\n ...rest\n } = props;\n\n const selectId = useIdWithFallback(selectIdProp);\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const onBlueberry = onColor === 'onblueberry';\n const invalid = onColor === 'oninvalid' || !!errorText || !!error;\n const iconColor = getIconColor(invalid, !!disabled);\n const maxWidth = width ? getSelectMaxWidth(width) : undefined;\n\n const selectInnerWrapperClasses = classNames(\n selectStyles['select-inner-wrapper'],\n {\n [selectStyles['select-inner-wrapper--transparent']]: concept === 'transparent',\n [selectStyles['select-inner-wrapper--on-blueberry']]: onBlueberry,\n [selectStyles['select-inner-wrapper--invalid']]: invalid,\n [selectStyles['select-inner-wrapper--disabled']]: disabled,\n },\n className\n );\n\n const selectClasses = classNames(selectStyles.select, {\n [selectStyles['select--on-blueberry']]: onBlueberry,\n [selectStyles['select--invalid']]: invalid,\n });\n\n const selectWrapperClasses = classNames(selectStyles['select-wrapper'], wrapperClassName);\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <div data-testid={testId} data-analyticsid={AnalyticsId.Select} className={selectWrapperClasses} style={{ maxWidth }}>\n {renderLabel({ label: label, inputId: selectId, onColor: onColor as FormOnColor, className: labelClassName })}\n <div className={selectInnerWrapperClasses} data-testid={testId + '-inner-wrapper'}>\n <Icon\n className={selectStyles['select-arrow']}\n svgIcon={ChevronDown}\n color={iconColor}\n size={IconSize.XSmall}\n testId={testId + '-icon'}\n />\n <select\n {...rest}\n aria-invalid={!!invalid}\n id={selectId}\n name={name}\n className={selectClasses}\n disabled={disabled}\n ref={ref}\n required={required}\n aria-describedby={getAriaDescribedBy(props, errorTextId)}\n aria-required={!!required}\n value={value}\n defaultValue={defaultValue}\n autoComplete={autoComplete ? autoComplete : undefined}\n >\n {children}\n </select>\n </div>\n </div>\n </ErrorWrapper>\n );\n};\n\nexport default Select;\n","import Select from './Select';\nexport * from './Select';\nexport default Select;\n"],"mappings":";;;;;;;;;;;;AAwDA,IAAM,qBAAqB,eAA+B;CAGxD,OAAO,QAAQ,aAAA,GAAwC;AACzD;AAEA,IAAM,gBAAgB,SAAkB,aAA8B;CAEpE,OAAO,WAAW,SAAS,WAAW,GAAG,IAAI,SAD3B,UAAU,WAAW,aAC0B,GAAG;AACtE;AAEA,IAAa,UAAgC,UAAS;CACpD,MAAM,EACJ,WACA,UACA,UAAU,UACV,UACA,OACA,WACA,aAAa,iBACb,UAAU,cACV,uBACA,OACA,OAAO,MAAM,UACb,UAAU,YAAY,SACtB,QACA,OACA,UACA,OACA,cACA,eAAe,OACf,kBACA,KACA,gBACA,GAAG,SACD;CAEJ,MAAM,WAAW,kBAAkB,YAAY;CAC/C,MAAM,cAAc,kBAAkB,eAAe;CACrD,MAAM,cAAc,YAAY;CAChC,MAAM,UAAU,YAAY,eAAe,CAAC,CAAC,aAAa,CAAC,CAAC;CAC5D,MAAM,YAAY,aAAa,SAAS,CAAC,CAAC,QAAQ;CAClD,MAAM,WAAW,QAAQ,kBAAkB,KAAK,IAAI,KAAA;CAEpD,MAAM,4BAA4B,WAChC,aAAa,yBACb;GACG,aAAa,uCAAuC,YAAY;GAChE,aAAa,wCAAwC;GACrD,aAAa,mCAAmC;GAChD,aAAa,oCAAoC;CACpD,GACA,SACF;CAEA,MAAM,gBAAgB,WAAW,aAAa,QAAQ;GACnD,aAAa,0BAA0B;GACvC,aAAa,qBAAqB;CACrC,CAAC;CAED,MAAM,uBAAuB,WAAW,aAAa,mBAAmB,gBAAgB;CAExF,OACE,oBAAC,sBAAD;EAAc,WAAW;EAAkC;EAAwB;YACjF,qBAAC,OAAD;GAAK,eAAa;GAAQ,oBAAkB,YAAY;GAAQ,WAAW;GAAsB,OAAO,EAAE,SAAS;aAAnH,CACG,YAAY;IAAS;IAAO,SAAS;IAAmB;IAAwB,WAAW;GAAe,CAAC,GAC5G,qBAAC,OAAD;IAAK,WAAW;IAA2B,eAAa,SAAS;cAAjE,CACE,oBAAC,cAAD;KACE,WAAW,aAAa;KACxB,SAAS;KACT,OAAO;KACP,MAAM,SAAS;KACf,QAAQ,SAAS;IAClB,CAAA,GACD,oBAAC,UAAD;KACE,GAAI;KACJ,gBAAc,CAAC,CAAC;KAChB,IAAI;KACE;KACN,WAAW;KACD;KACL;KACK;KACV,oBAAkB,mBAAmB,OAAO,WAAW;KACvD,iBAAe,CAAC,CAAC;KACV;KACO;KACd,cAAc,eAAe,eAAe,KAAA;KAE3C;IACK,CAAA,CACL;KACF;;CACO,CAAA;AAElB;;;ACrJA,IAAA,iBAAe"}
@@ -1,5 +1,5 @@
1
1
  import { t as AsChildSlot_default } from "./AsChildSlot.js";
2
- import cn from "classnames";
2
+ import classNames from "classnames";
3
3
  import React, { useId } from "react";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import styles from "./components/Dropdown/SingleSelect/styles.module.scss";
@@ -24,8 +24,8 @@ var SingleSelectItem = (props) => {
24
24
  group,
25
25
  optionValue
26
26
  ]);
27
- const contentClasses = cn(styles["single-select-item__content"], { [styles["single-select-item__content--disabled"]]: isDisabled });
28
- const dotClasses = cn(styles["single-select-item__dot"], {
27
+ const contentClasses = classNames(styles["single-select-item__content"], { [styles["single-select-item__content--disabled"]]: isDisabled });
28
+ const dotClasses = classNames(styles["single-select-item__dot"], {
29
29
  [styles["single-select-item__dot--disabled"]]: isDisabled,
30
30
  [styles["single-select-item__dot--checked"]]: isSelected
31
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SingleSelectItem.js","names":[],"sources":["../src/components/Dropdown/SingleSelect/utils.tsx","../src/components/Dropdown/SingleSelect/SingleSelectItem.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SingleSelectContextType } from './SingleSelect';\n\nexport const SingleSelectContext = React.createContext<SingleSelectContextType | null>(null);\n\nexport const useSingleSelect = (): SingleSelectContextType | null => React.useContext(SingleSelectContext);\n","import React, { useId } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { AsChildSlotHandle } from '../../AsChildSlot';\n\nimport { useSingleSelect } from './utils';\nimport AsChildSlot from '../../AsChildSlot';\n\nimport styles from './styles.module.scss';\n\nexport interface SingleSelectItemProps extends Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'disabled'> {\n /** The text to the singleSelectItem */\n text?: string;\n /** input id of the singleSelectItem */\n inputId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** When true, onclick and keyboard events will be passed to the child Button or AnchorLink. */\n asChild?: boolean;\n /** Only use when asChild is set to true and only pass one child */\n children?: React.ReactNode;\n /** Value for this singleSelectItem option - used by the parent wrapper to keep track of the context */\n value?: string;\n /** aria-describedby passthrough if needed */\n ['aria-describedby']?: string;\n /** Marks this option as initially selected */\n defaultSelected?: boolean;\n /** Ref that is passed to the component */\n ref?: React.Ref<HTMLElement | null>;\n}\n\nexport const SingleSelectItem: React.FC<SingleSelectItemProps> = props => {\n const { text, value, testId, asChild = false, children, disabled, defaultSelected, ref, ...rest } = props;\n\n const generatedId = useId();\n const inputId = props.inputId ?? generatedId;\n const group = useSingleSelect();\n const optionValue = typeof value === 'string' && value.length > 0 ? value : inputId;\n const isSelected = group ? group.value === optionValue : false;\n const isDisabled = !!disabled || !!group?.disabled;\n const asChildSlotRef = React.useRef<AsChildSlotHandle | null>(null);\n\n React.useEffect(() => {\n if (defaultSelected && group && typeof group.value === 'undefined') {\n group.onValueChange?.(optionValue);\n }\n }, [defaultSelected, group, optionValue]);\n\n const contentClasses = classNames(styles['single-select-item__content'], {\n [styles['single-select-item__content--disabled']]: isDisabled,\n });\n const dotClasses = classNames(styles['single-select-item__dot'], {\n [styles['single-select-item__dot--disabled']]: isDisabled,\n [styles['single-select-item__dot--checked']]: isSelected,\n });\n\n const childArray = React.Children.toArray(children).filter(React.isValidElement) as React.ReactElement[];\n const childElement = childArray[0] ?? null;\n\n const selectThis = (e?: React.SyntheticEvent): void => {\n if (isDisabled) return;\n if (group && group.value !== optionValue) {\n group.onValueChange?.(optionValue, e);\n }\n };\n\n const content = (\n <>\n <span className={dotClasses} aria-hidden />\n <span>{text}</span>\n </>\n );\n\n const Component = (asChild ? AsChildSlot : 'button') as React.ElementType;\n const childWithInjectedContent = childElement ? React.cloneElement(childElement, undefined, content) : null;\n\n const componentProps = asChild\n ? {\n ref: asChildSlotRef,\n elementRef: ref,\n className: contentClasses,\n disabled: isDisabled,\n onSelect: (e: React.SyntheticEvent): void => selectThis(e),\n ariaCurrent: isSelected ? 'true' : undefined,\n children: childWithInjectedContent,\n }\n : {\n ...rest,\n type: 'button' as const,\n className: contentClasses,\n disabled: isDisabled,\n onClick: (e: React.MouseEvent<HTMLButtonElement>): void => {\n e.preventDefault();\n selectThis(e);\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n selectThis(e);\n }\n },\n ref: ref,\n 'aria-disabled': isDisabled || undefined,\n 'aria-current': isSelected ? 'true' : undefined,\n children: content,\n };\n\n return (\n <div data-testid={testId} className={styles['single-select-item']}>\n <Component {...componentProps} />\n </div>\n );\n};\n\nSingleSelectItem.displayName = 'Dropdown.SingleSelectItem';\n\nexport default SingleSelectItem;\n"],"mappings":";;;;;;AAIA,IAAa,sBAAsB,MAAM,cAA8C,IAAI;AAE3F,IAAa,wBAAwD,MAAM,WAAW,mBAAmB;;;AC0BzG,IAAa,oBAAoD,UAAS;CACxE,MAAM,EAAE,MAAM,OAAO,QAAQ,UAAU,OAAO,UAAU,UAAU,iBAAiB,KAAK,GAAG,SAAS;CAEpG,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,MAAM,WAAW;CACjC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,cAAc,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;CAC5E,MAAM,aAAa,QAAQ,MAAM,UAAU,cAAc;CACzD,MAAM,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO;CAC1C,MAAM,iBAAiB,MAAM,OAAiC,IAAI;CAElE,MAAM,gBAAgB;EACpB,IAAI,mBAAmB,SAAS,OAAO,MAAM,UAAU,aACrD,MAAM,gBAAgB,WAAW;CAErC,GAAG;EAAC;EAAiB;EAAO;CAAW,CAAC;CAExC,MAAM,iBAAiB,GAAW,OAAO,gCAAgC,GACtE,OAAO,2CAA2C,WACrD,CAAC;CACD,MAAM,aAAa,GAAW,OAAO,4BAA4B;GAC9D,OAAO,uCAAuC;GAC9C,OAAO,sCAAsC;CAChD,CAAC;CAGD,MAAM,eADa,MAAM,SAAS,QAAQ,QAAQ,EAAE,OAAO,MAAM,cAC5C,EAAW,MAAM;CAEtC,MAAM,cAAc,MAAmC;EACrD,IAAI,YAAY;EAChB,IAAI,SAAS,MAAM,UAAU,aAC3B,MAAM,gBAAgB,aAAa,CAAC;CAExC;CAEA,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;EAAM,WAAW;EAAY,eAAA;CAAa,CAAA,GAC1C,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,CAClB,EAAA,CAAA;CAGJ,MAAM,YAAa,UAAU,sBAAc;CAC3C,MAAM,2BAA2B,eAAe,MAAM,aAAa,cAAc,KAAA,GAAW,OAAO,IAAI;CAEvG,MAAM,iBAAiB,UACnB;EACE,KAAK;EACL,YAAY;EACZ,WAAW;EACX,UAAU;EACV,WAAW,MAAkC,WAAW,CAAC;EACzD,aAAa,aAAa,SAAS,KAAA;EACnC,UAAU;CACZ,IACA;EACE,GAAG;EACH,MAAM;EACN,WAAW;EACX,UAAU;EACV,UAAU,MAAiD;GACzD,EAAE,eAAe;GACjB,WAAW,CAAC;EACd;EACA,YAAY,MAAoD;GAC9D,IAAI,EAAE,QAAQ,SAAS;IACrB,EAAE,eAAe;IACjB,WAAW,CAAC;GACd;EACF;EACK;EACL,iBAAiB,cAAc,KAAA;EAC/B,gBAAgB,aAAa,SAAS,KAAA;EACtC,UAAU;CACZ;CAEJ,OACE,oBAAC,OAAD;EAAK,eAAa;EAAQ,WAAW,OAAO;YAC1C,oBAAC,WAAD,EAAW,GAAI,eAAiB,CAAA;CAC7B,CAAA;AAET;AAEA,iBAAiB,cAAc"}
1
+ {"version":3,"file":"SingleSelectItem.js","names":[],"sources":["../src/components/Dropdown/SingleSelect/utils.tsx","../src/components/Dropdown/SingleSelect/SingleSelectItem.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SingleSelectContextType } from './SingleSelect';\n\nexport const SingleSelectContext = React.createContext<SingleSelectContextType | null>(null);\n\nexport const useSingleSelect = (): SingleSelectContextType | null => React.useContext(SingleSelectContext);\n","import React, { useId } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { AsChildSlotHandle } from '../../AsChildSlot';\n\nimport { useSingleSelect } from './utils';\nimport AsChildSlot from '../../AsChildSlot';\n\nimport styles from './styles.module.scss';\n\nexport interface SingleSelectItemProps extends Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'disabled'> {\n /** The text to the singleSelectItem */\n text?: string;\n /** input id of the singleSelectItem */\n inputId?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** When true, onclick and keyboard events will be passed to the child Button or AnchorLink. */\n asChild?: boolean;\n /** Only use when asChild is set to true and only pass one child */\n children?: React.ReactNode;\n /** Value for this singleSelectItem option - used by the parent wrapper to keep track of the context */\n value?: string;\n /** aria-describedby passthrough if needed */\n ['aria-describedby']?: string;\n /** Marks this option as initially selected */\n defaultSelected?: boolean;\n /** Ref that is passed to the component */\n ref?: React.Ref<HTMLElement | null>;\n}\n\nexport const SingleSelectItem: React.FC<SingleSelectItemProps> = props => {\n const { text, value, testId, asChild = false, children, disabled, defaultSelected, ref, ...rest } = props;\n\n const generatedId = useId();\n const inputId = props.inputId ?? generatedId;\n const group = useSingleSelect();\n const optionValue = typeof value === 'string' && value.length > 0 ? value : inputId;\n const isSelected = group ? group.value === optionValue : false;\n const isDisabled = !!disabled || !!group?.disabled;\n const asChildSlotRef = React.useRef<AsChildSlotHandle | null>(null);\n\n React.useEffect(() => {\n if (defaultSelected && group && typeof group.value === 'undefined') {\n group.onValueChange?.(optionValue);\n }\n }, [defaultSelected, group, optionValue]);\n\n const contentClasses = classNames(styles['single-select-item__content'], {\n [styles['single-select-item__content--disabled']]: isDisabled,\n });\n const dotClasses = classNames(styles['single-select-item__dot'], {\n [styles['single-select-item__dot--disabled']]: isDisabled,\n [styles['single-select-item__dot--checked']]: isSelected,\n });\n\n const childArray = React.Children.toArray(children).filter(React.isValidElement) as React.ReactElement[];\n const childElement = childArray[0] ?? null;\n\n const selectThis = (e?: React.SyntheticEvent): void => {\n if (isDisabled) return;\n if (group && group.value !== optionValue) {\n group.onValueChange?.(optionValue, e);\n }\n };\n\n const content = (\n <>\n <span className={dotClasses} aria-hidden />\n <span>{text}</span>\n </>\n );\n\n const Component = (asChild ? AsChildSlot : 'button') as React.ElementType;\n const childWithInjectedContent = childElement ? React.cloneElement(childElement, undefined, content) : null;\n\n const componentProps = asChild\n ? {\n ref: asChildSlotRef,\n elementRef: ref,\n className: contentClasses,\n disabled: isDisabled,\n onSelect: (e: React.SyntheticEvent): void => selectThis(e),\n ariaCurrent: isSelected ? 'true' : undefined,\n children: childWithInjectedContent,\n }\n : {\n ...rest,\n type: 'button' as const,\n className: contentClasses,\n disabled: isDisabled,\n onClick: (e: React.MouseEvent<HTMLButtonElement>): void => {\n e.preventDefault();\n selectThis(e);\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n selectThis(e);\n }\n },\n ref: ref,\n 'aria-disabled': isDisabled || undefined,\n 'aria-current': isSelected ? 'true' : undefined,\n children: content,\n };\n\n return (\n <div data-testid={testId} className={styles['single-select-item']}>\n <Component {...componentProps} />\n </div>\n );\n};\n\nSingleSelectItem.displayName = 'Dropdown.SingleSelectItem';\n\nexport default SingleSelectItem;\n"],"mappings":";;;;;;AAIA,IAAa,sBAAsB,MAAM,cAA8C,IAAI;AAE3F,IAAa,wBAAwD,MAAM,WAAW,mBAAmB;;;AC0BzG,IAAa,oBAAoD,UAAS;CACxE,MAAM,EAAE,MAAM,OAAO,QAAQ,UAAU,OAAO,UAAU,UAAU,iBAAiB,KAAK,GAAG,SAAS;CAEpG,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,MAAM,WAAW;CACjC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,cAAc,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;CAC5E,MAAM,aAAa,QAAQ,MAAM,UAAU,cAAc;CACzD,MAAM,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO;CAC1C,MAAM,iBAAiB,MAAM,OAAiC,IAAI;CAElE,MAAM,gBAAgB;EACpB,IAAI,mBAAmB,SAAS,OAAO,MAAM,UAAU,aACrD,MAAM,gBAAgB,WAAW;CAErC,GAAG;EAAC;EAAiB;EAAO;CAAW,CAAC;CAExC,MAAM,iBAAiB,WAAW,OAAO,gCAAgC,GACtE,OAAO,2CAA2C,WACrD,CAAC;CACD,MAAM,aAAa,WAAW,OAAO,4BAA4B;GAC9D,OAAO,uCAAuC;GAC9C,OAAO,sCAAsC;CAChD,CAAC;CAGD,MAAM,eADa,MAAM,SAAS,QAAQ,QAAQ,CAAC,CAAC,OAAO,MAAM,cAC5C,CAAA,CAAW,MAAM;CAEtC,MAAM,cAAc,MAAmC;EACrD,IAAI,YAAY;EAChB,IAAI,SAAS,MAAM,UAAU,aAC3B,MAAM,gBAAgB,aAAa,CAAC;CAExC;CAEA,MAAM,UACJ,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;EAAM,WAAW;EAAY,eAAA;CAAa,CAAA,GAC1C,oBAAC,QAAD,EAAA,UAAO,KAAW,CAAA,CAClB,EAAA,CAAA;CAGJ,MAAM,YAAa,UAAU,sBAAc;CAC3C,MAAM,2BAA2B,eAAe,MAAM,aAAa,cAAc,KAAA,GAAW,OAAO,IAAI;CAEvG,MAAM,iBAAiB,UACnB;EACE,KAAK;EACL,YAAY;EACZ,WAAW;EACX,UAAU;EACV,WAAW,MAAkC,WAAW,CAAC;EACzD,aAAa,aAAa,SAAS,KAAA;EACnC,UAAU;CACZ,IACA;EACE,GAAG;EACH,MAAM;EACN,WAAW;EACX,UAAU;EACV,UAAU,MAAiD;GACzD,EAAE,eAAe;GACjB,WAAW,CAAC;EACd;EACA,YAAY,MAAoD;GAC9D,IAAI,EAAE,QAAQ,SAAS;IACrB,EAAE,eAAe;IACjB,WAAW,CAAC;GACd;EACF;EACK;EACL,iBAAiB,cAAc,KAAA;EAC/B,gBAAgB,aAAa,SAAS,KAAA;EACtC,UAAU;CACZ;CAEJ,OACE,oBAAC,OAAD;EAAK,eAAa;EAAQ,WAAW,OAAO;YAC1C,oBAAC,WAAD,EAAW,GAAI,eAAiB,CAAA;CAC7B,CAAA;AAET;AAEA,iBAAiB,cAAc"}
package/lib/Slider.js CHANGED
@@ -6,7 +6,7 @@ import { getAriaLabelAttributes } from "./utils/accessibility.js";
6
6
  import { t as ErrorWrapper_default } from "./ErrorWrapper.js";
7
7
  import { useSize } from "./hooks/useSize.js";
8
8
  import Title_default from "./components/Title/index.js";
9
- import cn from "classnames";
9
+ import classNames from "classnames";
10
10
  import { useEffect, useId, useRef, useState } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
12
  import styles from "./components/Slider/styles.module.scss";
@@ -67,7 +67,10 @@ var Slider = (props) => {
67
67
  };
68
68
  useEffect(() => {
69
69
  const handlePointerMove = (e) => {
70
- if (!disabled && isMoving) setValueState(getValueBasedOnMarkerPosition(e.clientX));
70
+ if (!disabled && isMoving) {
71
+ const newValue = getValueBasedOnMarkerPosition(e.clientX);
72
+ setValueState(newValue);
73
+ }
71
74
  };
72
75
  document.addEventListener("pointermove", handlePointerMove);
73
76
  return () => {
@@ -123,7 +126,8 @@ var Slider = (props) => {
123
126
  };
124
127
  const handleTrackClick = (e) => {
125
128
  if (disabled) return;
126
- setValueState(getValueBasedOnMarkerPosition(e.clientX));
129
+ const newValue = getValueBasedOnMarkerPosition(e.clientX);
130
+ setValueState(newValue);
127
131
  refObject.current?.focus();
128
132
  };
129
133
  const handlePointerDown = (e) => {
@@ -239,13 +243,13 @@ var Slider = (props) => {
239
243
  renderEmojies(),
240
244
  /* @__PURE__ */ jsxs("div", {
241
245
  ref: trackRef,
242
- className: cn(styles["slider__track-wrapper"], disabled && styles["slider__track-wrapper--disabled"]),
246
+ className: classNames(styles["slider__track-wrapper"], disabled && styles["slider__track-wrapper--disabled"]),
243
247
  onPointerDown: handlePointerDown,
244
248
  children: [/* @__PURE__ */ jsx("div", {
245
- className: cn(styles.slider__track, disabled && styles["slider__track--disabled"]),
249
+ className: classNames(styles.slider__track, disabled && styles["slider__track--disabled"]),
246
250
  children: renderSteps()
247
251
  }), /* @__PURE__ */ jsx("div", {
248
- className: cn(styles.slider__marker, {
252
+ className: classNames(styles.slider__marker, {
249
253
  [styles["slider__marker--disabled"]]: disabled,
250
254
  [styles["slider__marker--selected"]]: selectedState,
251
255
  [styles["slider__marker--invalid"]]: invalid,
package/lib/Slider.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","names":[],"sources":["../src/components/Slider/Slider.tsx","../src/components/Slider/index.ts"],"sourcesContent":["import { useEffect, useState, useRef, useId } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport { AnalyticsId } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { useSize } from '../../hooks/useSize';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport { isMutableRefObject, mergeRefs } from '../../utils/refs';\nimport ErrorWrapper from '../ErrorWrapper';\nimport Title from '../Title';\n\nimport styles from './styles.module.scss';\n\nconst useSafeNumberValue = (initial: number, min: number, max: number): [number, (value: number) => void] => {\n const [value, setValue] = useState(initial);\n const [prevMin, setPrevMin] = useState(min);\n const [prevMax, setPrevMax] = useState(max);\n\n const getSafeValue = (newValue: number): number => {\n if (newValue > max) {\n return max;\n }\n if (newValue < min) {\n return min;\n }\n return newValue;\n };\n\n const setSafeValue = (newValue: number): void => {\n setValue(getSafeValue(newValue));\n };\n\n if (min !== prevMin || max !== prevMax) {\n setPrevMin(min);\n setPrevMax(max);\n const safeValue = getSafeValue(initial);\n if (safeValue !== value) {\n setValue(safeValue);\n }\n }\n\n return [value, setSafeValue];\n};\n\nexport type SliderStep = {\n label?: number | string;\n emojiUniCode?: string;\n};\n\nexport interface SliderProps\n extends ErrorWrapperClassNameProps, Pick<React.InputHTMLAttributes<HTMLInputElement>, 'id' | 'name' | 'onChange' | 'onBlur'> {\n /** Activates Error style for the input */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /**\tSets the title of the slider. */\n title?: string;\n /** Adds the left hand label to the element. */\n labelLeft?: string;\n /** Adds the right hand label to the element. */\n labelRight?: string;\n /**\tSets aria-label of the slider. */\n ariaLabel?: string;\n /** Disables the slider element. */\n disabled?: boolean;\n /** Sets the minimum allowed value on the slider - this overrides the use of steps prop for minValue/maxValue. */\n minValue?: number;\n /** Sets the maximum allowed value on the slider - this overrides the use of steps prop for minValue/maxValue. */\n maxValue?: number;\n /** If set to false will only trigger onChange once a user interaction has been made, updates to this prop will be taken into account - true by default */\n selected?: boolean;\n /** Sets the steps data for the slider */\n steps?: SliderStep[];\n /** Sets the step to move per point in the slider */\n step?: number;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets the value of the slider */\n value?: number;\n /** Ref passed to component */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nexport const Slider: React.FC<SliderProps> = props => {\n const {\n title,\n ariaLabel,\n error,\n errorText,\n errorTextId: errorTextIdProp,\n errorWrapperClassName,\n labelLeft,\n labelRight,\n disabled = false,\n onChange,\n steps,\n step = 1,\n minValue = 0,\n maxValue = steps ? steps.length - 1 : 100,\n selected = true,\n testId,\n value,\n ref,\n ...rest\n } = props;\n\n const [isMoving, setIsMoving] = useState(false);\n const [selectedState, setSelectedState] = useState(typeof value === 'undefined' ? selected : true);\n const [valueState, setValueState] = useSafeNumberValue(\n typeof value === 'undefined' ? (maxValue - minValue) / 2 + minValue : value,\n minValue,\n maxValue\n );\n\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const baseId = useId();\n const titleId = 'title-' + baseId;\n const labelLeftId = 'label-' + baseId;\n const labelRightId = 'label-right-' + baseId;\n const trackRef = useRef<HTMLDivElement>(null);\n const { refObject, isFocused } = usePseudoClasses<HTMLInputElement>(isMutableRefObject(ref) ? ref : null);\n const mergedRefs = mergeRefs([ref, refObject]);\n\n const { width: trackWidth } = useSize(trackRef) || { width: 0 };\n const largeStep = maxValue / 10;\n const invalid = !!errorText || !!error;\n\n useEffect(() => {\n const handlePointerUp = (): void => {\n setIsMoving(false);\n };\n\n document.addEventListener('pointerup', handlePointerUp);\n\n return (): void => {\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const getValueBasedOnMarkerPosition = (markerPosition: number): number => {\n const trackPosition = trackRef.current?.getBoundingClientRect().x ?? 0;\n\n // Calculate the normalized position (0 to 1) of the marker along the track\n const normalizedPosition = (markerPosition - trackPosition) / trackWidth;\n const valueRange = maxValue - minValue;\n // Calculate the value without considering the step\n let value = normalizedPosition * valueRange + minValue;\n // Adjust the value to account for the step increment\n const stepCount = Math.round(value / step);\n value = stepCount * step;\n value = Math.max(minValue, Math.min(maxValue, value));\n\n return value;\n };\n\n const handleSelected = (): void => {\n if (selectedState === false) {\n setSelectedState(true);\n }\n };\n\n useEffect(() => {\n const handlePointerMove = (e: PointerEvent): void => {\n if (!disabled && isMoving) {\n const newValue = getValueBasedOnMarkerPosition(e.clientX);\n setValueState(newValue);\n }\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n\n return (): void => {\n document.removeEventListener('pointermove', handlePointerMove);\n };\n }, [isMoving]);\n\n useEffect(() => {\n if (value !== valueState && typeof value !== 'undefined') {\n handleSelected();\n setValueState(value);\n }\n }, [value]);\n\n useEffect(() => {\n if (typeof value === 'undefined' && selected !== selectedState) {\n setSelectedState(selected);\n }\n }, [selected]);\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n let flag = false;\n\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n setValueState(valueState - step);\n flag = true;\n break;\n case 'PageDown':\n setValueState(valueState - largeStep);\n flag = true;\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n setValueState(valueState + step);\n flag = true;\n break;\n case 'PageUp':\n setValueState(valueState + largeStep);\n flag = true;\n break;\n case 'Home':\n setValueState(minValue);\n flag = true;\n break;\n case 'End':\n setValueState(maxValue);\n flag = true;\n break;\n default:\n break;\n }\n\n if (flag) {\n handleSelected();\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n const handleTrackClick: React.MouseEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n const newValue = getValueBasedOnMarkerPosition(e.clientX);\n setValueState(newValue);\n refObject.current?.focus();\n };\n\n const handlePointerDown: React.PointerEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n handleTrackClick(e);\n setIsMoving(true);\n handleSelected();\n\n e.preventDefault();\n e.stopPropagation();\n\n refObject.current?.focus();\n };\n\n const markerXPos = maxValue !== minValue ? (trackWidth / (maxValue - minValue)) * (valueState - minValue) : 0;\n\n const getAriaValueText = (): string | undefined => {\n const stepIndex = steps ? Math.round((valueState - minValue) / step) : null;\n\n if (steps && stepIndex !== null && stepIndex >= 0 && stepIndex < steps.length) {\n const step = steps[stepIndex];\n const emojiCode = step.emojiUniCode;\n const label = typeof step.label !== 'undefined' ? step.label.toString() : undefined;\n\n return emojiCode && label ? `${emojiCode} ${label}` : emojiCode || label;\n }\n\n return undefined;\n };\n\n const getAriaLabeledById = (): string | undefined => {\n if (title && labelLeft && labelRight) {\n return [titleId, labelLeftId, labelRightId].join(' ');\n }\n if (title && labelLeft) {\n return [titleId, labelLeftId].join(' ');\n }\n if (title && labelRight) {\n return [titleId, labelRightId].join(' ');\n }\n if (title) {\n return titleId;\n }\n };\n\n const ariaLabelAttributes = getAriaLabelAttributes({\n label: ariaLabel,\n id: getAriaLabeledById(),\n prefer: 'label',\n });\n\n const getXPositionStyling = (index: number, stepsLength: number): { left: string } => {\n return { left: `${(index / (stepsLength - 1)) * 100}%` };\n };\n\n useEffect(() => {\n if (selectedState && onChange) {\n onChange({\n target: {\n name: props.name,\n value: valueState,\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }, [valueState, selectedState]);\n\n const renderEmojies = (): React.ReactNode => {\n return (\n <div className={styles['slider__emoji-container']}>\n {steps?.map((step, index) => {\n return (\n step.emojiUniCode && (\n <div\n aria-hidden={true}\n key={'emoji' + index}\n className={styles['slider__emoji']}\n style={getXPositionStyling(index, steps.length)}\n >\n {step.emojiUniCode}\n </div>\n )\n );\n })}\n </div>\n );\n };\n\n const renderSteps = (): React.ReactNode => {\n return steps?.map((_step, index) => {\n return <div key={'step' + index} className={styles['slider__track__step']} style={getXPositionStyling(index, steps.length)} />;\n });\n };\n\n const renderStepLabels = (): React.ReactNode => {\n return (\n <div className={styles['slider__value-container']}>\n {steps?.map((step, index) => {\n return (\n typeof step.label !== 'undefined' && (\n <div\n aria-hidden={true}\n key={'label' + index}\n className={styles['slider__value']}\n style={getXPositionStyling(index, steps.length)}\n >\n {step.label}\n </div>\n )\n );\n })}\n </div>\n );\n };\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <input\n aria-valuetext={getAriaValueText()}\n className={styles['sr-only-slider']}\n disabled={disabled}\n min={minValue}\n max={maxValue}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n value={valueState}\n ref={mergedRefs}\n type=\"range\"\n {...rest}\n {...ariaLabelAttributes}\n />\n <div className={styles.slider} data-testid={testId} data-analyticsid={AnalyticsId.Slider}>\n {title && (\n <Title className={styles['slider__title']} htmlMarkup={'h3'} margin={0} appearance={'title3'} id={titleId}>\n {title}\n </Title>\n )}\n <div className={styles['slider__content-container']}>\n {renderEmojies()}\n {/* Slider streken er klikkbar med mus/touch */}\n <div\n ref={trackRef}\n className={classNames(styles['slider__track-wrapper'], disabled && styles['slider__track-wrapper--disabled'])}\n onPointerDown={handlePointerDown}\n >\n <div className={classNames(styles.slider__track, disabled && styles['slider__track--disabled'])}>{renderSteps()}</div>\n <div\n className={classNames(styles.slider__marker, {\n [styles['slider__marker--disabled']]: disabled,\n [styles['slider__marker--selected']]: selectedState,\n [styles['slider__marker--invalid']]: invalid,\n [styles['slider__marker--focused']]: !disabled && isFocused,\n })}\n style={{\n left: `${markerXPos}px`,\n }}\n />\n </div>\n {renderStepLabels()}\n </div>\n {(labelLeft || labelRight) && (\n <span className={styles.slider__options}>\n <span id={labelLeftId}>{labelLeft}</span>\n <span id={labelRightId}>{labelRight}</span>\n </span>\n )}\n </div>\n </ErrorWrapper>\n );\n};\n\nSlider.displayName = 'Slider';\n\nexport default Slider;\n","import Slider from './Slider';\nexport * from './Slider';\nexport default Slider;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Slider.js","names":[],"sources":["../src/components/Slider/Slider.tsx","../src/components/Slider/index.ts"],"sourcesContent":["import { useEffect, useState, useRef, useId } from 'react';\n\nimport classNames from 'classnames';\n\nimport type { ErrorWrapperClassNameProps } from '../ErrorWrapper';\n\nimport { AnalyticsId } from '../../constants';\nimport { useIdWithFallback } from '../../hooks/useIdWithFallback';\nimport { usePseudoClasses } from '../../hooks/usePseudoClasses';\nimport { useSize } from '../../hooks/useSize';\nimport { getAriaLabelAttributes } from '../../utils/accessibility';\nimport { isMutableRefObject, mergeRefs } from '../../utils/refs';\nimport ErrorWrapper from '../ErrorWrapper';\nimport Title from '../Title';\n\nimport styles from './styles.module.scss';\n\nconst useSafeNumberValue = (initial: number, min: number, max: number): [number, (value: number) => void] => {\n const [value, setValue] = useState(initial);\n const [prevMin, setPrevMin] = useState(min);\n const [prevMax, setPrevMax] = useState(max);\n\n const getSafeValue = (newValue: number): number => {\n if (newValue > max) {\n return max;\n }\n if (newValue < min) {\n return min;\n }\n return newValue;\n };\n\n const setSafeValue = (newValue: number): void => {\n setValue(getSafeValue(newValue));\n };\n\n if (min !== prevMin || max !== prevMax) {\n setPrevMin(min);\n setPrevMax(max);\n const safeValue = getSafeValue(initial);\n if (safeValue !== value) {\n setValue(safeValue);\n }\n }\n\n return [value, setSafeValue];\n};\n\nexport type SliderStep = {\n label?: number | string;\n emojiUniCode?: string;\n};\n\nexport interface SliderProps\n extends ErrorWrapperClassNameProps, Pick<React.InputHTMLAttributes<HTMLInputElement>, 'id' | 'name' | 'onChange' | 'onBlur'> {\n /** Activates Error style for the input */\n error?: boolean;\n /** Error text to show above the component */\n errorText?: string;\n /** Error text id */\n errorTextId?: string;\n /**\tSets the title of the slider. */\n title?: string;\n /** Adds the left hand label to the element. */\n labelLeft?: string;\n /** Adds the right hand label to the element. */\n labelRight?: string;\n /**\tSets aria-label of the slider. */\n ariaLabel?: string;\n /** Disables the slider element. */\n disabled?: boolean;\n /** Sets the minimum allowed value on the slider - this overrides the use of steps prop for minValue/maxValue. */\n minValue?: number;\n /** Sets the maximum allowed value on the slider - this overrides the use of steps prop for minValue/maxValue. */\n maxValue?: number;\n /** If set to false will only trigger onChange once a user interaction has been made, updates to this prop will be taken into account - true by default */\n selected?: boolean;\n /** Sets the steps data for the slider */\n steps?: SliderStep[];\n /** Sets the step to move per point in the slider */\n step?: number;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Sets the value of the slider */\n value?: number;\n /** Ref passed to component */\n ref?: React.Ref<HTMLInputElement | null>;\n}\n\nexport const Slider: React.FC<SliderProps> = props => {\n const {\n title,\n ariaLabel,\n error,\n errorText,\n errorTextId: errorTextIdProp,\n errorWrapperClassName,\n labelLeft,\n labelRight,\n disabled = false,\n onChange,\n steps,\n step = 1,\n minValue = 0,\n maxValue = steps ? steps.length - 1 : 100,\n selected = true,\n testId,\n value,\n ref,\n ...rest\n } = props;\n\n const [isMoving, setIsMoving] = useState(false);\n const [selectedState, setSelectedState] = useState(typeof value === 'undefined' ? selected : true);\n const [valueState, setValueState] = useSafeNumberValue(\n typeof value === 'undefined' ? (maxValue - minValue) / 2 + minValue : value,\n minValue,\n maxValue\n );\n\n const errorTextId = useIdWithFallback(errorTextIdProp);\n const baseId = useId();\n const titleId = 'title-' + baseId;\n const labelLeftId = 'label-' + baseId;\n const labelRightId = 'label-right-' + baseId;\n const trackRef = useRef<HTMLDivElement>(null);\n const { refObject, isFocused } = usePseudoClasses<HTMLInputElement>(isMutableRefObject(ref) ? ref : null);\n const mergedRefs = mergeRefs([ref, refObject]);\n\n const { width: trackWidth } = useSize(trackRef) || { width: 0 };\n const largeStep = maxValue / 10;\n const invalid = !!errorText || !!error;\n\n useEffect(() => {\n const handlePointerUp = (): void => {\n setIsMoving(false);\n };\n\n document.addEventListener('pointerup', handlePointerUp);\n\n return (): void => {\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n const getValueBasedOnMarkerPosition = (markerPosition: number): number => {\n const trackPosition = trackRef.current?.getBoundingClientRect().x ?? 0;\n\n // Calculate the normalized position (0 to 1) of the marker along the track\n const normalizedPosition = (markerPosition - trackPosition) / trackWidth;\n const valueRange = maxValue - minValue;\n // Calculate the value without considering the step\n let value = normalizedPosition * valueRange + minValue;\n // Adjust the value to account for the step increment\n const stepCount = Math.round(value / step);\n value = stepCount * step;\n value = Math.max(minValue, Math.min(maxValue, value));\n\n return value;\n };\n\n const handleSelected = (): void => {\n if (selectedState === false) {\n setSelectedState(true);\n }\n };\n\n useEffect(() => {\n const handlePointerMove = (e: PointerEvent): void => {\n if (!disabled && isMoving) {\n const newValue = getValueBasedOnMarkerPosition(e.clientX);\n setValueState(newValue);\n }\n };\n\n document.addEventListener('pointermove', handlePointerMove);\n\n return (): void => {\n document.removeEventListener('pointermove', handlePointerMove);\n };\n }, [isMoving]);\n\n useEffect(() => {\n if (value !== valueState && typeof value !== 'undefined') {\n handleSelected();\n setValueState(value);\n }\n }, [value]);\n\n useEffect(() => {\n if (typeof value === 'undefined' && selected !== selectedState) {\n setSelectedState(selected);\n }\n }, [selected]);\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n let flag = false;\n\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n setValueState(valueState - step);\n flag = true;\n break;\n case 'PageDown':\n setValueState(valueState - largeStep);\n flag = true;\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n setValueState(valueState + step);\n flag = true;\n break;\n case 'PageUp':\n setValueState(valueState + largeStep);\n flag = true;\n break;\n case 'Home':\n setValueState(minValue);\n flag = true;\n break;\n case 'End':\n setValueState(maxValue);\n flag = true;\n break;\n default:\n break;\n }\n\n if (flag) {\n handleSelected();\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n const handleTrackClick: React.MouseEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n const newValue = getValueBasedOnMarkerPosition(e.clientX);\n setValueState(newValue);\n refObject.current?.focus();\n };\n\n const handlePointerDown: React.PointerEventHandler<HTMLDivElement> = e => {\n if (disabled) return;\n\n handleTrackClick(e);\n setIsMoving(true);\n handleSelected();\n\n e.preventDefault();\n e.stopPropagation();\n\n refObject.current?.focus();\n };\n\n const markerXPos = maxValue !== minValue ? (trackWidth / (maxValue - minValue)) * (valueState - minValue) : 0;\n\n const getAriaValueText = (): string | undefined => {\n const stepIndex = steps ? Math.round((valueState - minValue) / step) : null;\n\n if (steps && stepIndex !== null && stepIndex >= 0 && stepIndex < steps.length) {\n const step = steps[stepIndex];\n const emojiCode = step.emojiUniCode;\n const label = typeof step.label !== 'undefined' ? step.label.toString() : undefined;\n\n return emojiCode && label ? `${emojiCode} ${label}` : emojiCode || label;\n }\n\n return undefined;\n };\n\n const getAriaLabeledById = (): string | undefined => {\n if (title && labelLeft && labelRight) {\n return [titleId, labelLeftId, labelRightId].join(' ');\n }\n if (title && labelLeft) {\n return [titleId, labelLeftId].join(' ');\n }\n if (title && labelRight) {\n return [titleId, labelRightId].join(' ');\n }\n if (title) {\n return titleId;\n }\n };\n\n const ariaLabelAttributes = getAriaLabelAttributes({\n label: ariaLabel,\n id: getAriaLabeledById(),\n prefer: 'label',\n });\n\n const getXPositionStyling = (index: number, stepsLength: number): { left: string } => {\n return { left: `${(index / (stepsLength - 1)) * 100}%` };\n };\n\n useEffect(() => {\n if (selectedState && onChange) {\n onChange({\n target: {\n name: props.name,\n value: valueState,\n },\n } as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n }, [valueState, selectedState]);\n\n const renderEmojies = (): React.ReactNode => {\n return (\n <div className={styles['slider__emoji-container']}>\n {steps?.map((step, index) => {\n return (\n step.emojiUniCode && (\n <div\n aria-hidden={true}\n key={'emoji' + index}\n className={styles['slider__emoji']}\n style={getXPositionStyling(index, steps.length)}\n >\n {step.emojiUniCode}\n </div>\n )\n );\n })}\n </div>\n );\n };\n\n const renderSteps = (): React.ReactNode => {\n return steps?.map((_step, index) => {\n return <div key={'step' + index} className={styles['slider__track__step']} style={getXPositionStyling(index, steps.length)} />;\n });\n };\n\n const renderStepLabels = (): React.ReactNode => {\n return (\n <div className={styles['slider__value-container']}>\n {steps?.map((step, index) => {\n return (\n typeof step.label !== 'undefined' && (\n <div\n aria-hidden={true}\n key={'label' + index}\n className={styles['slider__value']}\n style={getXPositionStyling(index, steps.length)}\n >\n {step.label}\n </div>\n )\n );\n })}\n </div>\n );\n };\n\n return (\n <ErrorWrapper className={errorWrapperClassName} errorText={errorText} errorTextId={errorTextId}>\n <input\n aria-valuetext={getAriaValueText()}\n className={styles['sr-only-slider']}\n disabled={disabled}\n min={minValue}\n max={maxValue}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n value={valueState}\n ref={mergedRefs}\n type=\"range\"\n {...rest}\n {...ariaLabelAttributes}\n />\n <div className={styles.slider} data-testid={testId} data-analyticsid={AnalyticsId.Slider}>\n {title && (\n <Title className={styles['slider__title']} htmlMarkup={'h3'} margin={0} appearance={'title3'} id={titleId}>\n {title}\n </Title>\n )}\n <div className={styles['slider__content-container']}>\n {renderEmojies()}\n {/* Slider streken er klikkbar med mus/touch */}\n <div\n ref={trackRef}\n className={classNames(styles['slider__track-wrapper'], disabled && styles['slider__track-wrapper--disabled'])}\n onPointerDown={handlePointerDown}\n >\n <div className={classNames(styles.slider__track, disabled && styles['slider__track--disabled'])}>{renderSteps()}</div>\n <div\n className={classNames(styles.slider__marker, {\n [styles['slider__marker--disabled']]: disabled,\n [styles['slider__marker--selected']]: selectedState,\n [styles['slider__marker--invalid']]: invalid,\n [styles['slider__marker--focused']]: !disabled && isFocused,\n })}\n style={{\n left: `${markerXPos}px`,\n }}\n />\n </div>\n {renderStepLabels()}\n </div>\n {(labelLeft || labelRight) && (\n <span className={styles.slider__options}>\n <span id={labelLeftId}>{labelLeft}</span>\n <span id={labelRightId}>{labelRight}</span>\n </span>\n )}\n </div>\n </ErrorWrapper>\n );\n};\n\nSlider.displayName = 'Slider';\n\nexport default Slider;\n","import Slider from './Slider';\nexport * from './Slider';\nexport default Slider;\n"],"mappings":"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"}
package/lib/Spacer.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { AnalyticsId } from "./constants.js";
2
- import cn from "classnames";
2
+ import classNames from "classnames";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import spacerStyles from "./components/Spacer/styles.module.scss";
5
5
  //#region src/components/Spacer/Spacer.tsx
6
6
  var Spacer = (props) => {
7
7
  const { size = "s", className, testId, ref } = props;
8
8
  return /* @__PURE__ */ jsx("span", {
9
- className: cn(spacerStyles.spacer, {
9
+ className: classNames(spacerStyles.spacer, {
10
10
  [spacerStyles["spacer--4xs"]]: size === "4xs",
11
11
  [spacerStyles["spacer--3xs"]]: size === "3xs",
12
12
  [spacerStyles["spacer--2xs"]]: size === "2xs",
package/lib/Spacer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Spacer.js","names":[],"sources":["../src/components/Spacer/Spacer.tsx","../src/components/Spacer/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { SpacerSizes } from './../../theme/spacers';\n\nimport { AnalyticsId } from '../../constants';\n\nimport spacerStyles from './styles.module.scss';\n\nexport interface SpacerProps {\n /** Sets the size of the spacer. */\n size?: SpacerSizes;\n /** Adds custom classes to the element. */\n className?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref passed to the component */\n ref?: React.Ref<HTMLElement | null>;\n}\n\nconst Spacer: React.FC<SpacerProps> = (props: SpacerProps) => {\n const { size = 's', className, testId, ref } = props;\n const spacerClasses = classNames(\n spacerStyles.spacer,\n {\n [spacerStyles['spacer--4xs']]: size === '4xs',\n [spacerStyles['spacer--3xs']]: size === '3xs',\n [spacerStyles['spacer--2xs']]: size === '2xs',\n [spacerStyles['spacer--xs']]: size === 'xs',\n [spacerStyles['spacer--s']]: size === 's',\n [spacerStyles['spacer--m']]: size === 'm',\n [spacerStyles['spacer--l']]: size === 'l',\n [spacerStyles['spacer--xl']]: size === 'xl',\n [spacerStyles['spacer--2xl']]: size === '2xl',\n [spacerStyles['spacer--3xl']]: size === '3xl',\n [spacerStyles['spacer--4xl']]: size === '4xl',\n [spacerStyles['spacer--5xl']]: size === '5xl',\n [spacerStyles['spacer--6xl']]: size === '6xl',\n },\n className\n );\n\n return <span className={spacerClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.Spacer}></span>;\n};\n\nexport default Spacer;\n","import Spacer from './Spacer';\nexport * from './Spacer';\nexport default Spacer;\n"],"mappings":";;;;;AAmBA,IAAM,UAAiC,UAAuB;CAC5D,MAAM,EAAE,OAAO,KAAK,WAAW,QAAQ,QAAQ;CAqB/C,OAAO,oBAAC,QAAD;EAAM,WApBS,GACpB,aAAa,QACb;IACG,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,gBAAgB,SAAS;IACtC,aAAa,eAAe,SAAS;IACrC,aAAa,eAAe,SAAS;IACrC,aAAa,eAAe,SAAS;IACrC,aAAa,gBAAgB,SAAS;IACtC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;EAC1C,GACA,SAGsB;EAAoB;EAAK,eAAa;EAAQ,oBAAkB,YAAY;CAAc,CAAA;AACpH;;;ACxCA,IAAA,iBAAe"}
1
+ {"version":3,"file":"Spacer.js","names":[],"sources":["../src/components/Spacer/Spacer.tsx","../src/components/Spacer/index.ts"],"sourcesContent":["import classNames from 'classnames';\n\nimport type { SpacerSizes } from './../../theme/spacers';\n\nimport { AnalyticsId } from '../../constants';\n\nimport spacerStyles from './styles.module.scss';\n\nexport interface SpacerProps {\n /** Sets the size of the spacer. */\n size?: SpacerSizes;\n /** Adds custom classes to the element. */\n className?: string;\n /** Sets the data-testid attribute. */\n testId?: string;\n /** Ref passed to the component */\n ref?: React.Ref<HTMLElement | null>;\n}\n\nconst Spacer: React.FC<SpacerProps> = (props: SpacerProps) => {\n const { size = 's', className, testId, ref } = props;\n const spacerClasses = classNames(\n spacerStyles.spacer,\n {\n [spacerStyles['spacer--4xs']]: size === '4xs',\n [spacerStyles['spacer--3xs']]: size === '3xs',\n [spacerStyles['spacer--2xs']]: size === '2xs',\n [spacerStyles['spacer--xs']]: size === 'xs',\n [spacerStyles['spacer--s']]: size === 's',\n [spacerStyles['spacer--m']]: size === 'm',\n [spacerStyles['spacer--l']]: size === 'l',\n [spacerStyles['spacer--xl']]: size === 'xl',\n [spacerStyles['spacer--2xl']]: size === '2xl',\n [spacerStyles['spacer--3xl']]: size === '3xl',\n [spacerStyles['spacer--4xl']]: size === '4xl',\n [spacerStyles['spacer--5xl']]: size === '5xl',\n [spacerStyles['spacer--6xl']]: size === '6xl',\n },\n className\n );\n\n return <span className={spacerClasses} ref={ref} data-testid={testId} data-analyticsid={AnalyticsId.Spacer}></span>;\n};\n\nexport default Spacer;\n","import Spacer from './Spacer';\nexport * from './Spacer';\nexport default Spacer;\n"],"mappings":";;;;;AAmBA,IAAM,UAAiC,UAAuB;CAC5D,MAAM,EAAE,OAAO,KAAK,WAAW,QAAQ,QAAQ;CAqB/C,OAAO,oBAAC,QAAD;EAAM,WApBS,WACpB,aAAa,QACb;IACG,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,gBAAgB,SAAS;IACtC,aAAa,eAAe,SAAS;IACrC,aAAa,eAAe,SAAS;IACrC,aAAa,eAAe,SAAS;IACrC,aAAa,gBAAgB,SAAS;IACtC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;IACvC,aAAa,iBAAiB,SAAS;EAC1C,GACA,SAGsB;EAAoB;EAAK,eAAa;EAAQ,oBAAkB,YAAY;CAAc,CAAA;AACpH;;;ACxCA,IAAA,iBAAe"}