@fremtind/jokul 0.68.3 → 0.68.5

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 (417) hide show
  1. package/README.md +0 -15
  2. package/build/build-stats.html +15 -15
  3. package/build/cjs/components/accordion/AccordionItem.cjs.map +1 -1
  4. package/build/cjs/components/autosuggest/Autosuggest.cjs.map +1 -1
  5. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs +2 -2
  6. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
  7. package/build/cjs/components/autosuggest/ControllerButton.cjs.map +1 -1
  8. package/build/cjs/components/autosuggest/utils.cjs.map +1 -1
  9. package/build/cjs/components/breadcrumb/Breadcrumb.cjs.map +1 -1
  10. package/build/cjs/components/breadcrumb/documentation/BreadcrumbDocs.cjs.map +1 -1
  11. package/build/cjs/components/breadcrumb/stories/Breadcrumb.stories.cjs +1 -1
  12. package/build/cjs/components/breadcrumb/stories/Breadcrumb.stories.cjs.map +1 -1
  13. package/build/cjs/components/breadcrumb/stories/BreadcrumbItem.stories.cjs.map +1 -1
  14. package/build/cjs/components/button/Button.cjs.map +1 -1
  15. package/build/cjs/components/button/documentation/ButtonDocs.cjs.map +1 -1
  16. package/build/cjs/components/card/Card.cjs.map +1 -1
  17. package/build/cjs/components/card/CardImage.cjs.map +1 -1
  18. package/build/cjs/components/card/NavCard.cjs.map +1 -1
  19. package/build/cjs/components/card/stories/Card.stories.cjs.map +1 -1
  20. package/build/cjs/components/checkbox/Checkbox.cjs.map +1 -1
  21. package/build/cjs/components/checkbox-panel/stories/CheckboxPanel.stories.cjs.map +1 -1
  22. package/build/cjs/components/combobox/Combobox.cjs.map +1 -1
  23. package/build/cjs/components/combobox/stories/Combobox.stories.cjs.map +1 -1
  24. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  25. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
  26. package/build/cjs/components/cookie-consent/stories/CookieConsent.stories.cjs.map +1 -1
  27. package/build/cjs/components/countdown/Countdown.cjs.map +1 -1
  28. package/build/cjs/components/countdown/stories/Countdown.stories.cjs.map +1 -1
  29. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  30. package/build/cjs/components/datepicker/internal/Calendar.cjs.map +1 -1
  31. package/build/cjs/components/datepicker/internal/calendarReducer.cjs.map +1 -1
  32. package/build/cjs/components/datepicker/internal/useCalendar.cjs.map +1 -1
  33. package/build/cjs/components/datepicker/internal/utils.cjs.map +1 -1
  34. package/build/cjs/components/datepicker/stories/Datepicker.stories.cjs.map +1 -1
  35. package/build/cjs/components/description-list/stories/DescriptionList.stories.cjs.map +1 -1
  36. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  37. package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
  38. package/build/cjs/components/expander/Expander.cjs.map +1 -1
  39. package/build/cjs/components/expander/deprecated/ExpandSection.cjs.map +1 -1
  40. package/build/cjs/components/expander/deprecated/Expander.cjs.map +1 -1
  41. package/build/cjs/components/expander/stories/Expander.stories.cjs.map +1 -1
  42. package/build/cjs/components/expander/stories/ExpanderPanel.stories.cjs.map +1 -1
  43. package/build/cjs/components/feedback/Feedback.cjs.map +1 -1
  44. package/build/cjs/components/feedback/feedbackContext.cjs.map +1 -1
  45. package/build/cjs/components/feedback/followup/Followup.cjs.map +1 -1
  46. package/build/cjs/components/feedback/followup/followupContext.cjs.map +1 -1
  47. package/build/cjs/components/feedback/followup/useFollowup.cjs.map +1 -1
  48. package/build/cjs/components/feedback/main-question/MainQuestion.cjs.map +1 -1
  49. package/build/cjs/components/feedback/main-question/mainQuestionContext.cjs.map +1 -1
  50. package/build/cjs/components/feedback/main-question/useMainQuestion.cjs.map +1 -1
  51. package/build/cjs/components/feedback/questions/AddonQuestion.cjs.map +1 -1
  52. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs.map +1 -1
  53. package/build/cjs/components/feedback/questions/ContactQuestion.cjs.map +1 -1
  54. package/build/cjs/components/feedback/questions/RadioQuestion.cjs.map +1 -1
  55. package/build/cjs/components/feedback/questions/SmileyQuestion.cjs.map +1 -1
  56. package/build/cjs/components/feedback/questions/TextQuestion.cjs.map +1 -1
  57. package/build/cjs/components/feedback/questions/smileyUtils.cjs.map +1 -1
  58. package/build/cjs/components/feedback/utils.cjs.map +1 -1
  59. package/build/cjs/components/file-input/File.cjs.map +1 -1
  60. package/build/cjs/components/file-input/FileInput.cjs.map +1 -1
  61. package/build/cjs/components/file-input/internal/Dropzone.cjs.map +1 -1
  62. package/build/cjs/components/file-input/internal/Input.cjs.map +1 -1
  63. package/build/cjs/components/file-input/internal/fileInputContext.cjs.map +1 -1
  64. package/build/cjs/components/file-input/internal/validateFile.cjs.map +1 -1
  65. package/build/cjs/components/file-input/stories/FileInput.stories.cjs.map +1 -1
  66. package/build/cjs/components/flex/Flex.cjs.map +1 -1
  67. package/build/cjs/components/icon/icons/GreenCheckIcon.cjs.map +1 -1
  68. package/build/cjs/components/icon/icons/RedCrossIcon.cjs.map +1 -1
  69. package/build/cjs/components/icon/stories/Icons.stories.cjs.map +1 -1
  70. package/build/cjs/components/icon-button/IconButton.cjs.map +1 -1
  71. package/build/cjs/components/icon-button/stories/IconButton.stories.cjs.map +1 -1
  72. package/build/cjs/components/image/Image.cjs.map +1 -1
  73. package/build/cjs/components/image/stories/Image.stories.cjs.map +1 -1
  74. package/build/cjs/components/image/useImageLoadingStatus.cjs.map +1 -1
  75. package/build/cjs/components/input-group/FieldGroup.cjs.map +1 -1
  76. package/build/cjs/components/input-group/InputGroup.cjs.map +1 -1
  77. package/build/cjs/components/input-group/Label.cjs.map +1 -1
  78. package/build/cjs/components/input-group/SupportLabel.cjs.map +1 -1
  79. package/build/cjs/components/input-group/stories/FieldGroup.stories.cjs +1 -1
  80. package/build/cjs/components/input-group/stories/FieldGroup.stories.cjs.map +1 -1
  81. package/build/cjs/components/input-group/stories/InputGroup.stories.cjs +1 -1
  82. package/build/cjs/components/input-group/stories/InputGroup.stories.cjs.map +1 -1
  83. package/build/cjs/components/link-list/LinkList.cjs.map +1 -1
  84. package/build/cjs/components/link-list/stories/LinkList.stories.cjs.map +1 -1
  85. package/build/cjs/components/list/List.cjs.map +1 -1
  86. package/build/cjs/components/list/stories/List.stories.cjs.map +1 -1
  87. package/build/cjs/components/loader/Loader.cjs.map +1 -1
  88. package/build/cjs/components/loader/skeletons/SkeletonAnimation.cjs.map +1 -1
  89. package/build/cjs/components/loader/skeletons/SkeletonLabel.cjs.map +1 -1
  90. package/build/cjs/components/loader/skeletons/SkeletonTextArea.cjs.map +1 -1
  91. package/build/cjs/components/loader/stories/Skeleton.stories.cjs.map +1 -1
  92. package/build/cjs/components/logo/Logo.cjs.map +1 -1
  93. package/build/cjs/components/logo/LogoStamp.cjs.map +1 -1
  94. package/build/cjs/components/logo/stories/Logo.stories.cjs.map +1 -1
  95. package/build/cjs/components/logo/stories/LogoStamp.stories.cjs.map +1 -1
  96. package/build/cjs/components/logo/useTextSpinner.cjs.map +1 -1
  97. package/build/cjs/components/menu/Menu.cjs +1 -1
  98. package/build/cjs/components/menu/Menu.cjs.map +1 -1
  99. package/build/cjs/components/menu/MenuItem.cjs.map +1 -1
  100. package/build/cjs/components/menu/MenuItemCheckbox.cjs.map +1 -1
  101. package/build/cjs/components/menu/stories/Menu.stories.cjs.map +1 -1
  102. package/build/cjs/components/menu/stories/MenuDivider.stories.cjs.map +1 -1
  103. package/build/cjs/components/menu/stories/MenuItem.stories.cjs.map +1 -1
  104. package/build/cjs/components/menu/useMenuWideEvents.cjs.map +1 -1
  105. package/build/cjs/components/message/FormErrorMessage.cjs.map +1 -1
  106. package/build/cjs/components/message/Message.cjs.map +1 -1
  107. package/build/cjs/components/message/stories/ErrorMessage.stories.cjs.map +1 -1
  108. package/build/cjs/components/message/stories/InfoMessage.stories.cjs.map +1 -1
  109. package/build/cjs/components/message/stories/SuccessMessage.stories.cjs.map +1 -1
  110. package/build/cjs/components/message/stories/WarningMessage.stories.cjs.map +1 -1
  111. package/build/cjs/components/modal/Modal.cjs.map +1 -1
  112. package/build/cjs/components/modal/stories/CompleteModal.stories.cjs +1 -1
  113. package/build/cjs/components/modal/stories/ModalCloseButton.stories.cjs +1 -1
  114. package/build/cjs/components/modal/stories/ModalCloseButton.stories.cjs.map +1 -1
  115. package/build/cjs/components/modal/useModal.cjs.map +1 -1
  116. package/build/cjs/components/pagination/Pagination.cjs.map +1 -1
  117. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  118. package/build/cjs/components/popover/stories/PopoverControlled.stories.cjs +1 -1
  119. package/build/cjs/components/popover/stories/PopoverControlled.stories.cjs.map +1 -1
  120. package/build/cjs/components/popover/stories/PopoverUncontrolled.stories.cjs +1 -1
  121. package/build/cjs/components/popover/stories/PopoverUncontrolled.stories.cjs.map +1 -1
  122. package/build/cjs/components/progress-bar/ProgressBar.cjs.map +1 -1
  123. package/build/cjs/components/radio-button/BaseRadioButton.cjs.map +1 -1
  124. package/build/cjs/components/radio-button/RadioButton.cjs.map +1 -1
  125. package/build/cjs/components/radio-button/RadioButtonGroup.cjs.map +1 -1
  126. package/build/cjs/components/radio-button/stories/RadioButtonGroup.stories.cjs +1 -1
  127. package/build/cjs/components/radio-panel/RadioPanel.cjs.map +1 -1
  128. package/build/cjs/components/radio-panel/RadioPanelGroup.cjs.map +1 -1
  129. package/build/cjs/components/select/NativeSelect.cjs.map +1 -1
  130. package/build/cjs/components/select/Select.cjs.map +1 -1
  131. package/build/cjs/components/select/stories/select.stories.cjs.map +1 -1
  132. package/build/cjs/components/system-message/SystemMessage.cjs.map +1 -1
  133. package/build/cjs/components/system-message/common/MessageIcon.cjs.map +1 -1
  134. package/build/cjs/components/table/ExpandableTableRowController.cjs.map +1 -1
  135. package/build/cjs/components/table/Table.cjs.map +1 -1
  136. package/build/cjs/components/table/TableCell.cjs.map +1 -1
  137. package/build/cjs/components/table/TableHead.cjs.map +1 -1
  138. package/build/cjs/components/table/TableHeader.cjs.map +1 -1
  139. package/build/cjs/components/table/TablePagination.cjs.map +1 -1
  140. package/build/cjs/components/table/TableRow.cjs.map +1 -1
  141. package/build/cjs/components/table/stories/table.stories.cjs.map +1 -1
  142. package/build/cjs/components/table/utils.cjs.map +1 -1
  143. package/build/cjs/components/tabs/NavTab.cjs.map +1 -1
  144. package/build/cjs/components/tabs/NavTabs.cjs.map +1 -1
  145. package/build/cjs/components/tabs/Tab.cjs.map +1 -1
  146. package/build/cjs/components/tabs/TabList.cjs.map +1 -1
  147. package/build/cjs/components/tabs/TabPanel.cjs.map +1 -1
  148. package/build/cjs/components/tabs/Tabs.cjs +1 -1
  149. package/build/cjs/components/tabs/Tabs.cjs.map +1 -1
  150. package/build/cjs/components/tabs/stories/NavTabs.stories.cjs.map +1 -1
  151. package/build/cjs/components/tabs/stories/Tabs.stories.cjs.map +1 -1
  152. package/build/cjs/components/text-area/BaseTextArea.cjs.map +1 -1
  153. package/build/cjs/components/text-area/TextArea.cjs.map +1 -1
  154. package/build/cjs/components/text-input/BaseTextInput.cjs.map +1 -1
  155. package/build/cjs/components/text-input/TextInput.cjs.map +1 -1
  156. package/build/cjs/components/toast/Toast.cjs.map +1 -1
  157. package/build/cjs/components/toast/stories/ToastInCotext.stories.cjs +1 -1
  158. package/build/cjs/components/toast/stories/ToastInCotext.stories.cjs.map +1 -1
  159. package/build/cjs/components/toast/toastContext.cjs.map +1 -1
  160. package/build/cjs/components/toggle-switch/ToggleSlider.cjs.map +1 -1
  161. package/build/cjs/components/toggle-switch/ToggleSwitch.cjs.map +1 -1
  162. package/build/cjs/components/toggle-switch/usePillStyles.cjs.map +1 -1
  163. package/build/cjs/components/tooltip/PopupTip.cjs.map +1 -1
  164. package/build/cjs/components/tooltip/Tooltip.cjs.map +1 -1
  165. package/build/cjs/components/tooltip/TooltipContent.cjs.map +1 -1
  166. package/build/cjs/components/tooltip/TooltipTrigger.cjs.map +1 -1
  167. package/build/cjs/hooks/useAnimatedDetails/useAnimatedDetails.cjs.map +1 -1
  168. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs.map +1 -1
  169. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs.map +1 -1
  170. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs.map +1 -1
  171. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.cjs.map +1 -1
  172. package/build/cjs/hooks/useBrowserPreferences/useBrowserPreferences.cjs.map +1 -1
  173. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
  174. package/build/cjs/hooks/useElementDimensions/useElementDimensions.cjs.map +1 -1
  175. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs.map +1 -1
  176. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs.map +1 -1
  177. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs.map +1 -1
  178. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs.map +1 -1
  179. package/build/cjs/hooks/useMutationObserver/useMutationObserver.cjs.map +1 -1
  180. package/build/cjs/hooks/useProgressiveImg/useProgressiveImg.cjs.map +1 -1
  181. package/build/cjs/hooks/useScreen/state.cjs.map +1 -1
  182. package/build/cjs/hooks/useScreen/useScreen.cjs.map +1 -1
  183. package/build/cjs/tailwind/tailwindPreset.cjs.map +1 -1
  184. package/build/cjs/utilities/formatters/avstand/formatAvstand.cjs.map +1 -1
  185. package/build/cjs/utilities/formatters/bytes/formatBytes.cjs.map +1 -1
  186. package/build/cjs/utilities/formatters/fodselsnummer/formatFodselsnummer.cjs.map +1 -1
  187. package/build/cjs/utilities/formatters/kontonummer/formatKontonummer.cjs.map +1 -1
  188. package/build/cjs/utilities/formatters/kortnummer/formatKortnummer.cjs.map +1 -1
  189. package/build/cjs/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.cjs.map +1 -1
  190. package/build/cjs/utilities/formatters/telefonnummer/formatTelefonnummer.cjs.map +1 -1
  191. package/build/cjs/utilities/formatters/util/registerWithMask.cjs.map +1 -1
  192. package/build/cjs/utilities/getThemeAndDensity.cjs.map +1 -1
  193. package/build/cjs/utilities/polymorphism/SlotComponent.cjs.map +1 -1
  194. package/build/cjs/utilities/polymorphism/mergeProps.cjs.map +1 -1
  195. package/build/cjs/utilities/tabListener.cjs.map +1 -1
  196. package/build/cjs/utilities/validators/isValidKortnummer/isValidKortnummer.cjs.map +1 -1
  197. package/build/es/components/accordion/AccordionItem.js.map +1 -1
  198. package/build/es/components/autosuggest/Autosuggest.js.map +1 -1
  199. package/build/es/components/autosuggest/BaseAutosuggest.js +2 -2
  200. package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
  201. package/build/es/components/autosuggest/utils.js.map +1 -1
  202. package/build/es/components/breadcrumb/Breadcrumb.js.map +1 -1
  203. package/build/es/components/breadcrumb/stories/BreadcrumbItem.stories.js.map +1 -1
  204. package/build/es/components/button/documentation/ButtonDocs.js.map +1 -1
  205. package/build/es/components/card/NavCard.js.map +1 -1
  206. package/build/es/components/card/stories/Card.stories.js +1 -1
  207. package/build/es/components/checkbox/Checkbox.js.map +1 -1
  208. package/build/es/components/checkbox-panel/stories/CheckboxPanel.stories.js.map +1 -1
  209. package/build/es/components/combobox/Combobox.js.map +1 -1
  210. package/build/es/components/combobox/stories/Combobox.stories.js.map +1 -1
  211. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  212. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  213. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
  214. package/build/es/components/cookie-consent/stories/CookieConsent.stories.js.map +1 -1
  215. package/build/es/components/countdown/Countdown.js.map +1 -1
  216. package/build/es/components/countdown/stories/Countdown.stories.js.map +1 -1
  217. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  218. package/build/es/components/datepicker/internal/Calendar.js +1 -1
  219. package/build/es/components/datepicker/internal/Calendar.js.map +1 -1
  220. package/build/es/components/datepicker/internal/calendarReducer.js.map +1 -1
  221. package/build/es/components/datepicker/internal/useCalendar.js +1 -1
  222. package/build/es/components/datepicker/internal/useCalendar.js.map +1 -1
  223. package/build/es/components/datepicker/internal/utils.js +1 -1
  224. package/build/es/components/datepicker/internal/utils.js.map +1 -1
  225. package/build/es/components/datepicker/stories/Datepicker.stories.js.map +1 -1
  226. package/build/es/components/description-list/stories/DescriptionList.stories.js +1 -1
  227. package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
  228. package/build/es/components/expander/Expander.js.map +1 -1
  229. package/build/es/components/expander/deprecated/ExpandSection.js.map +1 -1
  230. package/build/es/components/expander/deprecated/Expander.js.map +1 -1
  231. package/build/es/components/expander/stories/Expander.stories.js.map +1 -1
  232. package/build/es/components/expander/stories/ExpanderPanel.stories.js.map +1 -1
  233. package/build/es/components/feedback/Feedback.js.map +1 -1
  234. package/build/es/components/feedback/followup/useFollowup.js.map +1 -1
  235. package/build/es/components/feedback/main-question/useMainQuestion.js.map +1 -1
  236. package/build/es/components/feedback/questions/CheckboxQuestion.js.map +1 -1
  237. package/build/es/components/feedback/questions/ContactQuestion.js.map +1 -1
  238. package/build/es/components/feedback/questions/RadioQuestion.js.map +1 -1
  239. package/build/es/components/feedback/questions/SmileyQuestion.js +1 -1
  240. package/build/es/components/feedback/questions/SmileyQuestion.js.map +1 -1
  241. package/build/es/components/feedback/questions/TextQuestion.js.map +1 -1
  242. package/build/es/components/feedback/questions/smileyUtils.js.map +1 -1
  243. package/build/es/components/feedback/utils.js.map +1 -1
  244. package/build/es/components/file-input/File.js.map +1 -1
  245. package/build/es/components/file-input/FileInput.js.map +1 -1
  246. package/build/es/components/file-input/internal/Dropzone.js.map +1 -1
  247. package/build/es/components/file-input/internal/Input.js.map +1 -1
  248. package/build/es/components/file-input/stories/FileInput.stories.js.map +1 -1
  249. package/build/es/components/flex/Flex.js.map +1 -1
  250. package/build/es/components/icon-button/IconButton.js.map +1 -1
  251. package/build/es/components/icon-button/stories/IconButton.stories.js.map +1 -1
  252. package/build/es/components/image/Image.js.map +1 -1
  253. package/build/es/components/image/useImageLoadingStatus.js.map +1 -1
  254. package/build/es/components/input-group/FieldGroup.js.map +1 -1
  255. package/build/es/components/input-group/InputGroup.js.map +1 -1
  256. package/build/es/components/input-group/Label.js.map +1 -1
  257. package/build/es/components/input-group/SupportLabel.js.map +1 -1
  258. package/build/es/components/input-group/stories/InputGroup.stories.js.map +1 -1
  259. package/build/es/components/loader/Loader.js.map +1 -1
  260. package/build/es/components/loader/skeletons/SkeletonAnimation.js.map +1 -1
  261. package/build/es/components/loader/skeletons/SkeletonLabel.js.map +1 -1
  262. package/build/es/components/loader/skeletons/SkeletonTextArea.js.map +1 -1
  263. package/build/es/components/logo/Logo.js.map +1 -1
  264. package/build/es/components/logo/LogoStamp.js.map +1 -1
  265. package/build/es/components/menu/Menu.js +1 -1
  266. package/build/es/components/menu/Menu.js.map +1 -1
  267. package/build/es/components/menu/MenuItem.js.map +1 -1
  268. package/build/es/components/menu/MenuItemCheckbox.js.map +1 -1
  269. package/build/es/components/menu/stories/Menu.stories.js.map +1 -1
  270. package/build/es/components/menu/stories/MenuDivider.stories.js.map +1 -1
  271. package/build/es/components/menu/stories/MenuItem.stories.js.map +1 -1
  272. package/build/es/components/menu/useMenuWideEvents.js.map +1 -1
  273. package/build/es/components/message/FormErrorMessage.js.map +1 -1
  274. package/build/es/components/message/Message.js.map +1 -1
  275. package/build/es/components/message/stories/ErrorMessage.stories.js.map +1 -1
  276. package/build/es/components/message/stories/InfoMessage.stories.js.map +1 -1
  277. package/build/es/components/message/stories/SuccessMessage.stories.js.map +1 -1
  278. package/build/es/components/message/stories/WarningMessage.stories.js.map +1 -1
  279. package/build/es/components/pagination/Pagination.js.map +1 -1
  280. package/build/es/components/popover/Popover.js +1 -1
  281. package/build/es/components/popover/Popover.js.map +1 -1
  282. package/build/es/components/popover/stories/PopoverControlled.stories.js +1 -1
  283. package/build/es/components/popover/stories/PopoverControlled.stories.js.map +1 -1
  284. package/build/es/components/progress-bar/ProgressBar.js.map +1 -1
  285. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -1
  286. package/build/es/components/radio-button/RadioButtonGroup.js.map +1 -1
  287. package/build/es/components/radio-panel/RadioPanel.js.map +1 -1
  288. package/build/es/components/select/NativeSelect.js.map +1 -1
  289. package/build/es/components/select/Select.js.map +1 -1
  290. package/build/es/components/system-message/SystemMessage.js.map +1 -1
  291. package/build/es/components/system-message/common/MessageIcon.js.map +1 -1
  292. package/build/es/components/table/ExpandableTableRowController.js.map +1 -1
  293. package/build/es/components/table/Table.js.map +1 -1
  294. package/build/es/components/table/TableCell.js.map +1 -1
  295. package/build/es/components/table/TableHead.js.map +1 -1
  296. package/build/es/components/table/TableHeader.js.map +1 -1
  297. package/build/es/components/table/TablePagination.js.map +1 -1
  298. package/build/es/components/table/TableRow.js.map +1 -1
  299. package/build/es/components/table/stories/table.stories.js +1 -1
  300. package/build/es/components/table/utils.js.map +1 -1
  301. package/build/es/components/tabs/NavTab.js.map +1 -1
  302. package/build/es/components/tabs/NavTabs.js.map +1 -1
  303. package/build/es/components/tabs/Tab.js.map +1 -1
  304. package/build/es/components/tabs/TabList.js.map +1 -1
  305. package/build/es/components/tabs/Tabs.js +1 -1
  306. package/build/es/components/tabs/Tabs.js.map +1 -1
  307. package/build/es/components/tabs/stories/NavTabs.stories.js +1 -1
  308. package/build/es/components/tabs/stories/Tabs.stories.js.map +1 -1
  309. package/build/es/components/text-area/BaseTextArea.js.map +1 -1
  310. package/build/es/components/text-area/TextArea.js.map +1 -1
  311. package/build/es/components/text-input/BaseTextInput.js.map +1 -1
  312. package/build/es/components/text-input/TextInput.js.map +1 -1
  313. package/build/es/components/toast/Toast.js.map +1 -1
  314. package/build/es/components/toast/stories/ToastInCotext.stories.js.map +1 -1
  315. package/build/es/components/toast/toastContext.js.map +1 -1
  316. package/build/es/components/toggle-switch/ToggleSlider.js.map +1 -1
  317. package/build/es/components/toggle-switch/ToggleSwitch.js.map +1 -1
  318. package/build/es/components/toggle-switch/usePillStyles.js.map +1 -1
  319. package/build/es/components/tooltip/Tooltip.js +1 -1
  320. package/build/es/components/tooltip/Tooltip.js.map +1 -1
  321. package/build/es/components/tooltip/TooltipTrigger.js.map +1 -1
  322. package/build/es/components/tooltip/stories/Tooltip.stories.js +1 -1
  323. package/build/es/hooks/useAnimatedDetails/useAnimatedDetails.js.map +1 -1
  324. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js.map +1 -1
  325. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js.map +1 -1
  326. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js.map +1 -1
  327. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.js.map +1 -1
  328. package/build/es/hooks/useBrowserPreferences/useBrowserPreferences.js.map +1 -1
  329. package/build/es/hooks/useClickOutside/useClickOutside.js.map +1 -1
  330. package/build/es/hooks/useElementDimensions/useElementDimensions.js.map +1 -1
  331. package/build/es/hooks/useFocusOutside/useFocusOutside.js.map +1 -1
  332. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  333. package/build/es/hooks/useKeyListener/useKeyListener.js.map +1 -1
  334. package/build/es/hooks/useListNavigation/useListNavigation.js.map +1 -1
  335. package/build/es/hooks/useMutationObserver/useMutationObserver.js.map +1 -1
  336. package/build/es/hooks/useProgressiveImg/useProgressiveImg.js.map +1 -1
  337. package/build/es/hooks/useScreen/state.js.map +1 -1
  338. package/build/es/hooks/useScreen/useScreen.js.map +1 -1
  339. package/build/es/utilities/formatters/util/registerWithMask.js.map +1 -1
  340. package/build/es/utilities/getThemeAndDensity.js.map +1 -1
  341. package/build/es/utilities/polymorphism/SlotComponent.js.map +1 -1
  342. package/build/es/utilities/polymorphism/mergeProps.js.map +1 -1
  343. package/build/es/utilities/tabListener.js.map +1 -1
  344. package/build/es/utilities/validators/isValidKortnummer/isValidKortnummer.js.map +1 -1
  345. package/build/index-C-qqMC-u.cjs +20 -0
  346. package/build/{index-ZdY5zxEI.cjs.map → index-C-qqMC-u.cjs.map} +1 -1
  347. package/build/index-Yq3eaNUM.js +20 -0
  348. package/build/{index-C4ABwKfA.js.map → index-Yq3eaNUM.js.map} +1 -1
  349. package/build/{style.css → jokul.css} +1 -1
  350. package/package.json +25 -26
  351. package/styles/components/accordion/accordion.min.css +1 -1
  352. package/styles/components/button/button.min.css +1 -1
  353. package/styles/components/card/card.min.css +1 -1
  354. package/styles/components/checkbox/checkbox.css +4 -4
  355. package/styles/components/checkbox/checkbox.min.css +1 -1
  356. package/styles/components/checkbox-panel/checkbox-panel.css +2 -2
  357. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  358. package/styles/components/chip/chip.min.css +1 -1
  359. package/styles/components/combobox/combobox.min.css +1 -1
  360. package/styles/components/cookie-consent/cookie-consent.min.css +1 -1
  361. package/styles/components/countdown/countdown.css +2 -2
  362. package/styles/components/countdown/countdown.min.css +1 -1
  363. package/styles/components/datepicker/datepicker.min.css +1 -1
  364. package/styles/components/description-list/description-list.min.css +1 -1
  365. package/styles/components/expander/deprecated/expander.min.css +1 -1
  366. package/styles/components/expander/expandable.min.css +1 -1
  367. package/styles/components/feedback/feedback.css +2 -2
  368. package/styles/components/feedback/feedback.min.css +1 -1
  369. package/styles/components/file-input/file-input.min.css +1 -1
  370. package/styles/components/icon-button/icon-button.min.css +1 -1
  371. package/styles/components/input-group/input-group.css +2 -2
  372. package/styles/components/input-group/input-group.min.css +1 -1
  373. package/styles/components/link/link.min.css +1 -1
  374. package/styles/components/link-list/link-list.min.css +1 -1
  375. package/styles/components/loader/loader.css +6 -6
  376. package/styles/components/loader/loader.min.css +1 -1
  377. package/styles/components/loader/skeleton-loader.css +5 -5
  378. package/styles/components/loader/skeleton-loader.min.css +1 -1
  379. package/styles/components/menu/menu.min.css +1 -1
  380. package/styles/components/message/message.css +2 -2
  381. package/styles/components/message/message.min.css +1 -1
  382. package/styles/components/modal/modal.min.css +1 -1
  383. package/styles/components/nav-link/nav-link.min.css +1 -1
  384. package/styles/components/popover/popover.min.css +1 -1
  385. package/styles/components/progress-bar/progress-bar.css +1 -1
  386. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  387. package/styles/components/radio-button/radio-button.css +2 -2
  388. package/styles/components/radio-button/radio-button.min.css +1 -1
  389. package/styles/components/radio-panel/radio-panel.css +2 -2
  390. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  391. package/styles/components/select/select.min.css +1 -1
  392. package/styles/components/system-message/system-message.css +2 -2
  393. package/styles/components/system-message/system-message.min.css +1 -1
  394. package/styles/components/table/table.min.css +1 -1
  395. package/styles/components/tabs/tabs.min.css +1 -1
  396. package/styles/components/text-area/text-area.min.css +1 -1
  397. package/styles/components/text-input/text-input.min.css +1 -1
  398. package/styles/components/toast/toast.css +4 -4
  399. package/styles/components/toast/toast.min.css +1 -1
  400. package/styles/components/toggle-switch/toggle-switch.min.css +1 -1
  401. package/styles/components/tooltip/tooltip.min.css +1 -1
  402. package/styles/core/core.min.css +1 -1
  403. package/styles/shared/input-panel/shared.min.css +1 -1
  404. package/styles/styles.css +36 -36
  405. package/styles/styles.min.css +1 -1
  406. package/build/index-C4ABwKfA.js +0 -20
  407. package/build/index-ZdY5zxEI.cjs +0 -20
  408. package/styles/vind/_flex.scss +0 -113
  409. package/styles/vind/_font.scss +0 -19
  410. package/styles/vind/_index.scss +0 -1
  411. package/styles/vind/_margin.scss +0 -43
  412. package/styles/vind/_padding.scss +0 -43
  413. package/styles/vind/_space-between.scss +0 -13
  414. package/styles/vind/_typography.scss +0 -47
  415. package/styles/vind/vind.css +0 -1756
  416. package/styles/vind/vind.min.css +0 -1
  417. package/styles/vind/vind.scss +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"ControllerButton.cjs","sources":["../../../../src/components/autosuggest/ControllerButton.tsx"],"sourcesContent":["import React, { type FC } from \"react\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CloseIcon } from \"../icon/icons/CloseIcon.js\";\nimport { SearchIcon } from \"../icon/icons/SearchIcon.js\";\n\ninterface Props {\n clearSelection: () => void;\n hasSelectedItem: boolean;\n onClick: () => void;\n}\n\nconst ControllerButton: FC<Props> = ({\n hasSelectedItem,\n clearSelection,\n onClick,\n ...downshiftProps\n}) => (\n <IconButton\n {...downshiftProps}\n className=\"jkl-text-input-action-button\"\n aria-label={hasSelectedItem ? \"Fjern valg\" : \"Vis valg\"}\n title={hasSelectedItem ? \"Fjern valg\" : \"Vis valg\"}\n onClick={hasSelectedItem ? clearSelection : onClick}\n >\n {hasSelectedItem ? <CloseIcon /> : <SearchIcon />}\n </IconButton>\n);\n\nexport default ControllerButton;\n"],"names":["hasSelectedItem","clearSelection","onClick","downshiftProps","jsx","IconButton","className","title","children","CloseIcon","SearchIcon"],"mappings":"sNAWoC,EAChCA,gBAAAA,EACAC,eAAAA,EACAC,QAAAA,KACGC,KAEHC,EAAAA,IAACC,EAAAA,WAAA,IACOF,EACJG,UAAU,+BACV,aAAYN,EAAkB,aAAe,WAC7CO,MAAOP,EAAkB,aAAe,WACxCE,QAASF,EAAkBC,EAAiBC,EAE3CM,SAAkBR,EAAAI,EAAAA,IAACK,EAAUA,UAAA,CAAA,SAAMC,EAAWA,WAAA"}
1
+ {"version":3,"file":"ControllerButton.cjs","sources":["../../../../src/components/autosuggest/ControllerButton.tsx"],"sourcesContent":["import React, { type FC } from \"react\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CloseIcon } from \"../icon/icons/CloseIcon.js\";\nimport { SearchIcon } from \"../icon/icons/SearchIcon.js\";\n\ninterface Props {\n clearSelection: () => void;\n hasSelectedItem: boolean;\n onClick: () => void;\n}\n\nconst ControllerButton: FC<Props> = ({\n hasSelectedItem,\n clearSelection,\n onClick,\n ...downshiftProps\n}) => (\n <IconButton\n {...downshiftProps}\n className=\"jkl-text-input-action-button\"\n aria-label={hasSelectedItem ? \"Fjern valg\" : \"Vis valg\"}\n title={hasSelectedItem ? \"Fjern valg\" : \"Vis valg\"}\n onClick={hasSelectedItem ? clearSelection : onClick}\n >\n {hasSelectedItem ? <CloseIcon /> : <SearchIcon />}\n </IconButton>\n);\n\nexport default ControllerButton;\n"],"names":["hasSelectedItem","clearSelection","onClick","downshiftProps","jsx","IconButton","className","title","children","CloseIcon","SearchIcon"],"mappings":"sNAWoC,EAChCA,gBAAAA,EACAC,eAAAA,EACAC,QAAAA,KACGC,KAEHC,EAAAA,IAACC,EAAAA,WAAA,IACOF,EACJG,UAAU,+BACV,aAAYN,EAAkB,aAAe,WAC7CO,MAAOP,EAAkB,aAAe,WACxCE,QAASF,EAAkBC,EAAiBC,EAE3CM,SAAkBR,EAAAI,MAACK,EAAAA,UAAU,CAAA,SAAMC,EAAAA,WAAW,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../../../src/components/autosuggest/utils.ts"],"sourcesContent":["import { matchSorter } from \"match-sorter\";\n\nexport function filter<T>(\n allItems: T[],\n inputValue: string | null,\n keys?: string[],\n): T[] {\n const options = keys ? { keys } : {};\n if (!inputValue) {\n return allItems;\n }\n return matchSorter(allItems, inputValue, options);\n}\n"],"names":["allItems","inputValue","keys","options","matchSorter"],"mappings":"+HAEgB,SACZA,EACAC,EACAC,GAEA,MAAMC,EAAUD,EAAO,CAAEA,KAAAA,GAAS,CAAA,EAClC,OAAKD,EAGEG,cAAYJ,EAAUC,EAAYE,GAF9BH,CAGf"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../../../src/components/autosuggest/utils.ts"],"sourcesContent":["import { matchSorter } from \"match-sorter\";\n\nexport function filter<T>(\n allItems: T[],\n inputValue: string | null,\n keys?: string[],\n): T[] {\n const options = keys ? { keys } : {};\n if (!inputValue) {\n return allItems;\n }\n return matchSorter(allItems, inputValue, options);\n}\n"],"names":["allItems","inputValue","keys","options","matchSorter"],"mappings":"+HAEgB,SACZA,EACAC,EACAC,GAEA,MAAMC,EAAUD,EAAO,CAAEA,KAAAA,GAAS,CAAC,EACnC,OAAKD,EAGEG,cAAYJ,EAAUC,EAAYE,GAF9BH,CAGf"}
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.cjs","sources":["../../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport type { BreadcrumbItemProps, BreadcrumbProps } from \"./types.js\";\n\nexport const Breadcrumb = ({\n className,\n children,\n density,\n ...rest\n}: BreadcrumbProps): JSX.Element => {\n const numberOfChildren = React.Children.count(children);\n return (\n <nav\n aria-label=\"Sti\"\n className={clsx(\"jkl-breadcrumb\", className)}\n data-layout-density={density}\n {...rest}\n >\n <ol className=\"jkl-breadcrumb__list\">\n {React.Children.map(children, (child, index) => {\n const isLastElement = index + 1 === numberOfChildren;\n return (\n <>\n {React.isValidElement<BreadcrumbItemProps>(child)\n ? React.cloneElement<BreadcrumbItemProps>(\n child,\n {\n isLastElement,\n },\n )\n : child}\n {!isLastElement && (\n <span\n className=\"jkl-breadcrumb__item-separator\"\n aria-hidden=\"true\"\n >\n ›\n </span>\n )}\n </>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"names":["className","children","density","rest","numberOfChildren","React","Children","count","jsx","clsx","map","child","index","isLastElement","jsxs","Fragment","isValidElement","cloneElement"],"mappings":"mMAI0B,EACtBA,UAAAA,EACAC,SAAAA,EACAC,QAAAA,KACGC,MAEH,MAAMC,EAAmBC,EAAMC,SAASC,MAAMN,GAE1C,OAAAO,EAAAA,IAAC,MAAA,CACG,aAAW,MACXR,UAAWS,EAAAA,KAAK,iBAAkBT,GAClC,sBAAqBE,KACjBC,EAEJF,SAAAO,EAAAA,IAAC,KAAG,CAAAR,UAAU,uBACTC,SAAAI,EAAMC,SAASI,IAAIT,GAAU,CAACU,EAAOC,KAC5B,MAAAC,EAAgBD,EAAQ,IAAMR,EACpC,OAESU,EAAAA,KAAAC,WAAA,CAAAd,SAAA,CAAMI,EAAAW,eAAoCL,GACrCN,EAAMY,aACFN,EACA,CACIE,cAAAA,IAGRF,GACJE,GACEL,EAAAA,IAAC,OAAA,CACGR,UAAU,iCACV,cAAY,OACfC,SAAA,QAIT,OAGZ"}
1
+ {"version":3,"file":"Breadcrumb.cjs","sources":["../../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport type { BreadcrumbItemProps, BreadcrumbProps } from \"./types.js\";\n\nexport const Breadcrumb = ({\n className,\n children,\n density,\n ...rest\n}: BreadcrumbProps): JSX.Element => {\n const numberOfChildren = React.Children.count(children);\n return (\n <nav\n aria-label=\"Sti\"\n className={clsx(\"jkl-breadcrumb\", className)}\n data-layout-density={density}\n {...rest}\n >\n <ol className=\"jkl-breadcrumb__list\">\n {React.Children.map(children, (child, index) => {\n const isLastElement = index + 1 === numberOfChildren;\n return (\n <>\n {React.isValidElement<BreadcrumbItemProps>(child)\n ? React.cloneElement<BreadcrumbItemProps>(\n child,\n {\n isLastElement,\n },\n )\n : child}\n {!isLastElement && (\n <span\n className=\"jkl-breadcrumb__item-separator\"\n aria-hidden=\"true\"\n >\n ›\n </span>\n )}\n </>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"names":["className","children","density","rest","numberOfChildren","React","Children","count","jsx","clsx","map","child","index","isLastElement","jsxs","Fragment","isValidElement","cloneElement"],"mappings":"mMAI0B,EACtBA,UAAAA,EACAC,SAAAA,EACAC,QAAAA,KACGC,MAEH,MAAMC,EAAmBC,EAAMC,SAASC,MAAMN,GAE1C,OAAAO,EAAAA,IAAC,MAAA,CACG,aAAW,MACXR,UAAWS,EAAAA,KAAK,iBAAkBT,GAClC,sBAAqBE,KACjBC,EAEJF,SAAAO,EAAAA,IAAC,KAAG,CAAAR,UAAU,uBACTC,SAAAI,EAAMC,SAASI,IAAIT,GAAU,CAACU,EAAOC,KAC5B,MAAAC,EAAgBD,EAAQ,IAAMR,EACpC,OAESU,EAAAA,KAAAC,WAAA,CAAAd,SAAA,CAAMI,EAAAW,eAAoCL,GACrCN,EAAMY,aACFN,EACA,CACIE,cAAAA,IAGRF,GACJE,GACEL,EAAAA,IAAC,OAAA,CACGR,UAAU,iCACV,cAAY,OACfC,SAAA,QAIT,OAIhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BreadcrumbDocs.cjs","sources":["../../../../../src/components/breadcrumb/documentation/BreadcrumbDocs.tsx"],"sourcesContent":["import React from \"react\";\nimport { Breadcrumb } from \"../Breadcrumb.js\";\nimport { BreadcrumbItem } from \"../BreadcrumbItem.js\";\n\nexport const BreadcrumbExample = () => {\n /* -- EXAMPLE CODE START -- */\n return (\n <Breadcrumb>\n <BreadcrumbItem>\n <a href=\"/\">Hjem</a>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <a href=\"/komponenter/accordion\">Komponenter</a>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <a href=\"/komponenter/breadcrumb\">Breadcrumb</a>\n </BreadcrumbItem>\n </Breadcrumb>\n );\n /* -- EXAMPLE CODE END -- */\n};\n"],"names":["Breadcrumb","children","jsx","BreadcrumbItem","href"],"mappings":"wOAIiC,WAGxBA,aACG,CAAAC,SAAA,CAAAC,EAAAA,IAACC,kBACGF,SAACC,EAAAA,IAAA,IAAA,CAAEE,KAAK,IAAIH,0BAEfE,EACGA,eAAA,CAAAF,SAAAC,EAAAA,IAAC,KAAEE,KAAK,yBAAyBH,iCAEpCE,EACGA,eAAA,CAAAF,SAAAC,EAAAA,IAAC,KAAEE,KAAK,0BAA0BH"}
1
+ {"version":3,"file":"BreadcrumbDocs.cjs","sources":["../../../../../src/components/breadcrumb/documentation/BreadcrumbDocs.tsx"],"sourcesContent":["import React from \"react\";\nimport { Breadcrumb } from \"../Breadcrumb.js\";\nimport { BreadcrumbItem } from \"../BreadcrumbItem.js\";\n\nexport const BreadcrumbExample = () => {\n /* -- EXAMPLE CODE START -- */\n return (\n <Breadcrumb>\n <BreadcrumbItem>\n <a href=\"/\">Hjem</a>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <a href=\"/komponenter/accordion\">Komponenter</a>\n </BreadcrumbItem>\n <BreadcrumbItem>\n <a href=\"/komponenter/breadcrumb\">Breadcrumb</a>\n </BreadcrumbItem>\n </Breadcrumb>\n );\n /* -- EXAMPLE CODE END -- */\n};\n"],"names":["Breadcrumb","children","jsx","BreadcrumbItem","href"],"mappings":"wOAIiC,WAGxBA,aACG,CAAAC,SAAA,CAAAC,EAAAA,IAACC,kBACGF,SAACC,EAAAA,IAAA,IAAA,CAAEE,KAAK,IAAIH,0BAEfE,EACGA,eAAA,CAAAF,SAAAC,EAAAA,IAAC,KAAEE,KAAK,yBAAyBH,iCAEpCE,EACGA,eAAA,CAAAF,SAAAC,MAAC,KAAEE,KAAK,0BAA0BH"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),r=require("../Breadcrumb.cjs"),c=require("../BreadcrumbItem.cjs");,/* empty css */require("react");const t={title:"Komponenter/Breadcrumb/Breadcrumb",component:r.Breadcrumb,subcomponents:{BreadcrumbItem:c.BreadcrumbItem},parameters:{layout:"centered"},tags:["autodocs"]},a={args:{children:[e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/",children:"Hjem"})},0),e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/komponenter/accordion",children:"Komponenter"})},1),e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/komponenter/breadcrumb",children:"Breadcrumb"})},2)]}};exports.Breadcrumb=a,exports.default=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),r=require("../Breadcrumb.cjs"),c=require("../BreadcrumbItem.cjs");/* empty css */require("react");const t={title:"Komponenter/Breadcrumb/Breadcrumb",component:r.Breadcrumb,subcomponents:{BreadcrumbItem:c.BreadcrumbItem},parameters:{layout:"centered"},tags:["autodocs"]},a={args:{children:[e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/",children:"Hjem"})},0),e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/komponenter/accordion",children:"Komponenter"})},1),e.jsx(c.BreadcrumbItem,{children:e.jsx("a",{href:"/komponenter/breadcrumb",children:"Breadcrumb"})},2)]}};exports.Breadcrumb=a,exports.default=t;
2
2
  //# sourceMappingURL=Breadcrumb.stories.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.stories.cjs","sources":["../../../../../src/components/breadcrumb/stories/Breadcrumb.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Breadcrumb as BreadcrumbComponent } from \"../Breadcrumb.js\";\nimport { BreadcrumbItem } from \"../BreadcrumbItem.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\n\nconst meta = {\n title: \"Komponenter/Breadcrumb/Breadcrumb\",\n component: BreadcrumbComponent,\n subcomponents: { BreadcrumbItem },\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof BreadcrumbComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Breadcrumb: Story = {\n args: {\n children: [\n <BreadcrumbItem key={0}>\n <a href=\"/\">Hjem</a>\n </BreadcrumbItem>,\n <BreadcrumbItem key={1}>\n <a href=\"/komponenter/accordion\">Komponenter</a>\n </BreadcrumbItem>,\n <BreadcrumbItem key={2}>\n <a href=\"/komponenter/breadcrumb\">Breadcrumb</a>\n </BreadcrumbItem>,\n ],\n },\n};\n"],"names":["meta","title","component","BreadcrumbComponent","Breadcrumb","subcomponents","BreadcrumbItem","parameters","layout","tags","args","children","jsx","href"],"mappings":"+QAMA,MAAMA,EAAO,CACTC,MAAO,oCACPC,UAAWC,EAAAC,WACXC,cAAe,CAAEC,eAAAA,EAAAA,gBACjBC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMEL,EAAoB,CAC7BM,KAAM,CACFC,SAAU,CACNC,EAAAA,IAACN,EAAAA,gBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,IAAIF,SAAA,UADK,GAGrBC,EAAAA,IAACN,EAAAA,gBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,yBAAyBF,SAAA,iBADhB,GAGrBC,EAAAA,IAACN,EAAAA,gBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,0BAA0BF,SAAA,gBADjB"}
1
+ {"version":3,"file":"Breadcrumb.stories.cjs","sources":["../../../../../src/components/breadcrumb/stories/Breadcrumb.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Breadcrumb as BreadcrumbComponent } from \"../Breadcrumb.js\";\nimport { BreadcrumbItem } from \"../BreadcrumbItem.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\n\nconst meta = {\n title: \"Komponenter/Breadcrumb/Breadcrumb\",\n component: BreadcrumbComponent,\n subcomponents: { BreadcrumbItem },\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof BreadcrumbComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Breadcrumb: Story = {\n args: {\n children: [\n <BreadcrumbItem key={0}>\n <a href=\"/\">Hjem</a>\n </BreadcrumbItem>,\n <BreadcrumbItem key={1}>\n <a href=\"/komponenter/accordion\">Komponenter</a>\n </BreadcrumbItem>,\n <BreadcrumbItem key={2}>\n <a href=\"/komponenter/breadcrumb\">Breadcrumb</a>\n </BreadcrumbItem>,\n ],\n },\n};\n"],"names":["meta","title","component","BreadcrumbComponent","Breadcrumb","subcomponents","BreadcrumbItem","parameters","layout","tags","args","children","jsx","href"],"mappings":"+QAMA,MAAMA,EAAO,CACTC,MAAO,oCACPC,UAAWC,EAAAC,WACXC,cAAe,CAAEC,eAAAA,EAAAA,gBACjBC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMEL,EAAoB,CAC7BM,KAAM,CACFC,SAAU,CACNC,EAAAA,IAACN,EAAAA,gBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,IAAIF,SAAA,UADK,GAGrBC,EAAAA,IAACN,EAAAA,gBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,yBAAyBF,SAAA,iBADhB,GAGrBC,EAAAA,IAACN,kBACGK,SAACC,EAAAA,IAAA,IAAA,CAAEC,KAAK,0BAA0BF,SAAA,gBADjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BreadcrumbItem.stories.cjs","sources":["../../../../../src/components/breadcrumb/stories/BreadcrumbItem.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { BreadcrumbItem as BreadcrumbItemComponent } from \"../BreadcrumbItem.js\";\nimport \"../styles/_index.scss\";\nimport { Breadcrumb } from \"../Breadcrumb.js\";\n\nconst meta = {\n title: \"Komponenter/Breadcrumb/BreadcrumbItem\",\n component: BreadcrumbItemComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n isLastElement: {\n control: \"boolean\",\n },\n },\n} satisfies Meta<typeof BreadcrumbItemComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const BreadcrumbItem: Story = {\n args: {\n children: <a href=\"/komponenter/accordion\">Komponenter</a>,\n },\n decorators: (Story) => (\n <Breadcrumb>\n <Story />\n </Breadcrumb>\n ),\n};\n"],"names":["meta","title","component","BreadcrumbItemComponent","BreadcrumbItem","parameters","layout","tags","argTypes","isLastElement","control","args","children","jsx","href","decorators","Story","Breadcrumb"],"mappings":"2RAMMA,EAAO,CACTC,MAAO,wCACPC,UAAWC,EAAAC,eACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,cAAe,CACXC,QAAS,aAQRN,EAAwB,CACjCO,KAAM,CACFC,SAAUC,EAAAA,IAAC,IAAE,CAAAC,KAAK,yBAAyBF,SAAW,iBAE1DG,WAAaC,SACRC,EACGA,WAAA,CAAAL,SAAAC,MAACG,GAAM"}
1
+ {"version":3,"file":"BreadcrumbItem.stories.cjs","sources":["../../../../../src/components/breadcrumb/stories/BreadcrumbItem.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { BreadcrumbItem as BreadcrumbItemComponent } from \"../BreadcrumbItem.js\";\nimport \"../styles/_index.scss\";\nimport { Breadcrumb } from \"../Breadcrumb.js\";\n\nconst meta = {\n title: \"Komponenter/Breadcrumb/BreadcrumbItem\",\n component: BreadcrumbItemComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n isLastElement: {\n control: \"boolean\",\n },\n },\n} satisfies Meta<typeof BreadcrumbItemComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const BreadcrumbItem: Story = {\n args: {\n children: <a href=\"/komponenter/accordion\">Komponenter</a>,\n },\n decorators: (Story) => (\n <Breadcrumb>\n <Story />\n </Breadcrumb>\n ),\n};\n"],"names":["meta","title","component","BreadcrumbItemComponent","BreadcrumbItem","parameters","layout","tags","argTypes","isLastElement","control","args","children","jsx","href","decorators","Story","Breadcrumb"],"mappings":"2RAMMA,EAAO,CACTC,MAAO,wCACPC,UAAWC,EAAAC,eACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,cAAe,CACXC,QAAS,aAQRN,EAAwB,CACjCO,KAAM,CACFC,SAAUC,EAAAA,IAAC,IAAE,CAAAC,KAAK,yBAAyBF,SAAW,iBAE1DG,WAAaC,SACRC,EACGA,WAAA,CAAAL,SAAAC,EAAAA,IAACG"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","sources":["../../../../src/components/button/Button.tsx"],"sourcesContent":["import cn from \"clsx\";\nimport React, { type ButtonHTMLAttributes } from \"react\";\nimport { useAriaLiveRegion } from \"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport { Loader } from \"../loader/Loader.js\";\nimport type { ButtonComponent, ButtonProps } from \"./types.js\";\n\nexport const Button = React.forwardRef(function Button<\n ElementType extends React.ElementType = \"button\",\n>(props: ButtonProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n as = \"button\",\n children,\n className,\n density,\n onTouchStart,\n onAnimationEnd,\n loader,\n icon,\n iconPosition = \"left\",\n iconLeft,\n iconRight,\n variant = \"secondary\",\n ...rest\n } = props;\n\n const Component = as;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n React.Children.count(children) === 0 &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"] &&\n !props.title\n ) {\n console.warn(\n \"Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title\",\n );\n }\n\n const ariaLive = useAriaLiveRegion(loader?.showLoader);\n const showLoader = Boolean(children) && Boolean(loader?.showLoader);\n\n return (\n <Component\n {...ariaLive}\n data-loading={showLoader}\n data-density={density}\n className={cn(\"jkl-button\", `jkl-button--${variant}`, className)}\n disabled={as === \"button\" ? loader?.showLoader : undefined}\n {...rest}\n ref={ref}\n >\n <div className=\"jkl-button__label\">\n {iconLeft && iconLeft}\n {icon && iconPosition === \"left\" && icon}\n {children && (\n <span className=\"jkl-button__text\">{children}</span>\n )}\n {iconRight && iconRight}\n {icon && iconPosition === \"right\" && icon}\n </div>\n\n {children && (\n <Loader\n className=\"jkl-button__loader\"\n variant=\"medium\"\n textDescription={\n loader?.textDescription || \"Vennligst vent\"\n }\n aria-hidden={!loader?.showLoader}\n />\n )}\n </Component>\n );\n}) as ButtonComponent;\n\nexport function PrimaryButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"primary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function SecondaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"secondary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function TertiaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"tertiary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function GhostButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"loader\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"ghost\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n"],"names":["Button","React","forwardRef","props","ref","as","children","className","density","onTouchStart","onAnimationEnd","loader","icon","iconPosition","iconLeft","iconRight","variant","rest","Component","process","env","NODE_ENV","Children","count","title","console","warn","ariaLive","useAriaLiveRegion","showLoader","jsxs","cn","clsx","disabled","jsx","Loader","textDescription","buttonProps"],"mappings":"mRAOaA,EAASC,EAAMC,YAAW,SAErCC,EAAiCC,GACzB,MACFC,GAAAA,EAAK,SACLC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,OAAAA,EACAC,KAAAA,EACAC,aAAAA,EAAe,OACfC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EAAU,eACPC,GACHd,EAEEe,EAAYb,EAGW,eAAzBc,QAAQC,IAAIC,UACuB,IAAnCpB,EAAMqB,SAASC,MAAMjB,KACpBH,EAAM,gBACNA,EAAM,qBACNA,EAAMqB,OAECC,QAAAC,KACJ,2HAIF,MAAAC,EAAWC,EAAAA,kBAAkB,MAAAjB,OAAA,EAAAA,EAAQkB,YACrCA,IAAqBvB,KAAqB,MAAAK,IAAAA,EAAQkB,YAGpD,OAAAC,EAAAA,KAACZ,EAAA,IACOS,EACJ,eAAcE,EACd,eAAcrB,EACdD,UAAWwB,EAAGC,KAAA,aAAc,eAAehB,IAAWT,GACtD0B,SAAiB,WAAP5B,EAAkB,MAAAM,SAAAA,EAAQkB,gBAAa,KAC7CZ,EACJb,IAAAA,EAEAE,SAAA,CAACwB,EAAAA,KAAA,MAAA,CAAIvB,UAAU,oBACVD,SAAA,CAAYQ,GAAAA,EACZF,GAAyB,SAAjBC,GAA2BD,EACnCN,GACG4B,EAAAA,IAAC,OAAK,CAAA3B,UAAU,mBAAoBD,SAAAA,IAEvCS,GAAaA,EACbH,GAAyB,UAAjBC,GAA4BD,KAGxCN,GACG4B,EAAAA,IAACC,EAAAA,OAAA,CACG5B,UAAU,qBACVS,QAAQ,SACRoB,iBACI,MAAAzB,OAAA,EAAAA,EAAQyB,kBAAmB,iBAE/B,gBAAc,MAAAzB,GAAAA,EAAQkB,gBAK1C,yCAuCO,SACH1B,GAEA,MAAMkC,EAAc,IACblC,EACHa,QAAS,SAEN,OAAAkB,EAAAA,IAAClC,EAAQ,IAAGqC,GACvB,wBA7CO,SACHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,WAEN,OAAAkB,EAAAA,IAAClC,EAAQ,IAAGqC,GACvB,0BAEO,SAGHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,aAEN,OAAAkB,EAAAA,IAAClC,EAAQ,IAAGqC,GACvB,yBAEO,SAGHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,YAEN,OAAAkB,EAAAA,IAAClC,EAAQ,IAAGqC,GACvB"}
1
+ {"version":3,"file":"Button.cjs","sources":["../../../../src/components/button/Button.tsx"],"sourcesContent":["import cn from \"clsx\";\nimport React, { type ButtonHTMLAttributes } from \"react\";\nimport { useAriaLiveRegion } from \"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport { Loader } from \"../loader/Loader.js\";\nimport type { ButtonComponent, ButtonProps } from \"./types.js\";\n\nexport const Button = React.forwardRef(function Button<\n ElementType extends React.ElementType = \"button\",\n>(props: ButtonProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n as = \"button\",\n children,\n className,\n density,\n onTouchStart,\n onAnimationEnd,\n loader,\n icon,\n iconPosition = \"left\",\n iconLeft,\n iconRight,\n variant = \"secondary\",\n ...rest\n } = props;\n\n const Component = as;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n React.Children.count(children) === 0 &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"] &&\n !props.title\n ) {\n console.warn(\n \"Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title\",\n );\n }\n\n const ariaLive = useAriaLiveRegion(loader?.showLoader);\n const showLoader = Boolean(children) && Boolean(loader?.showLoader);\n\n return (\n <Component\n {...ariaLive}\n data-loading={showLoader}\n data-density={density}\n className={cn(\"jkl-button\", `jkl-button--${variant}`, className)}\n disabled={as === \"button\" ? loader?.showLoader : undefined}\n {...rest}\n ref={ref}\n >\n <div className=\"jkl-button__label\">\n {iconLeft && iconLeft}\n {icon && iconPosition === \"left\" && icon}\n {children && (\n <span className=\"jkl-button__text\">{children}</span>\n )}\n {iconRight && iconRight}\n {icon && iconPosition === \"right\" && icon}\n </div>\n\n {children && (\n <Loader\n className=\"jkl-button__loader\"\n variant=\"medium\"\n textDescription={\n loader?.textDescription || \"Vennligst vent\"\n }\n aria-hidden={!loader?.showLoader}\n />\n )}\n </Component>\n );\n}) as ButtonComponent;\n\nexport function PrimaryButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"primary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function SecondaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"secondary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function TertiaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"tertiary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function GhostButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"loader\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"ghost\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n"],"names":["Button","React","forwardRef","props","ref","as","children","className","density","onTouchStart","onAnimationEnd","loader","icon","iconPosition","iconLeft","iconRight","variant","rest","Component","process","env","NODE_ENV","Children","count","title","console","warn","ariaLive","useAriaLiveRegion","showLoader","jsxs","cn","clsx","disabled","jsx","Loader","textDescription","buttonProps"],"mappings":"mRAOaA,EAASC,EAAMC,YAAW,SAErCC,EAAiCC,GACzB,MACFC,GAAAA,EAAK,SACLC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,OAAAA,EACAC,KAAAA,EACAC,aAAAA,EAAe,OACfC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EAAU,eACPC,GACHd,EAEEe,EAAYb,EAGW,eAAzBc,QAAQC,IAAIC,UACuB,IAAnCpB,EAAMqB,SAASC,MAAMjB,KACpBH,EAAM,gBACNA,EAAM,qBACNA,EAAMqB,OAECC,QAAAC,KACJ,2HAIF,MAAAC,EAAWC,EAAAA,kBAAkB,MAAAjB,OAAA,EAAAA,EAAQkB,YACrCA,IAAqBvB,KAAqB,MAAAK,IAAAA,EAAQkB,YAGpD,OAAAC,EAAAA,KAACZ,EAAA,IACOS,EACJ,eAAcE,EACd,eAAcrB,EACdD,UAAWwB,EAAGC,KAAA,aAAc,eAAehB,IAAWT,GACtD0B,SAAiB,WAAP5B,EAAkB,MAAAM,SAAAA,EAAQkB,gBAAa,KAC7CZ,EACJb,IAAAA,EAEAE,SAAA,CAACwB,EAAAA,KAAA,MAAA,CAAIvB,UAAU,oBACVD,SAAA,CAAYQ,GAAAA,EACZF,GAAyB,SAAjBC,GAA2BD,EACnCN,GACG4B,EAAAA,IAAC,OAAK,CAAA3B,UAAU,mBAAoBD,SAAAA,IAEvCS,GAAaA,EACbH,GAAyB,UAAjBC,GAA4BD,KAGxCN,GACG4B,EAAAA,IAACC,EAAAA,OAAA,CACG5B,UAAU,qBACVS,QAAQ,SACRoB,iBACI,MAAAzB,OAAA,EAAAA,EAAQyB,kBAAmB,iBAE/B,gBAAc,MAAAzB,GAAAA,EAAQkB,gBAK1C,yCAuCO,SACH1B,GAEA,MAAMkC,EAAc,IACblC,EACHa,QAAS,SAEN,OAAAkB,MAAClC,EAAQ,IAAGqC,GACvB,wBA7CO,SACHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,WAEN,OAAAkB,MAAClC,EAAQ,IAAGqC,GACvB,0BAEO,SAGHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,aAEN,OAAAkB,MAAClC,EAAQ,IAAGqC,GACvB,yBAEO,SAGHlC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,YAEN,OAAAkB,MAAClC,EAAQ,IAAGqC,GACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonDocs.cjs","sources":["../../../../../src/components/button/documentation/ButtonDocs.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { Button } from \"../Button.js\";\n\nexport const ButtonExample = () => {\n /* -- EXAMPLE CODE START -- */\n const [showLoader, setShowLoader] = useState(false);\n\n const simulateLoading = useCallback(() => {\n setShowLoader(true);\n setTimeout(() => {\n setShowLoader(false);\n }, 2200);\n }, []);\n\n return (\n <Flex\n direction=\"column\"\n gap={32}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Button\n variant=\"primary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Lagre og send inn\n </Button>\n <Button\n variant=\"secondary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Lagre\n </Button>\n <Button\n variant=\"tertiary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Avbryt\n </Button>\n\n <Button variant=\"ghost\">Ola Nordmann</Button>\n </Flex>\n );\n /* -- EXAMPLE CODE END -- */\n};\n"],"names":["showLoader","setShowLoader","useState","simulateLoading","useCallback","setTimeout","jsxs","Flex","direction","gap","justifyContent","alignItems","children","jsx","Button","variant","loader","textDescription","onClick"],"mappings":"0NAI6B,KAEzB,MAAOA,EAAYC,GAAiBC,YAAS,GAEvCC,EAAkBC,EAAAA,aAAY,KAChCH,GAAc,GACdI,YAAW,KACPJ,GAAc,EAAK,GACpB,KAAI,GACR,IAGC,OAAAK,EAAAA,KAACC,EAAAA,KAAA,CACGC,UAAU,SACVC,IAAK,GACLC,eAAe,gBACfC,WAAW,SAEXC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,UACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,sBAGDC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,YACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,UAGDC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,WACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,WAIAC,EAAAA,IAAAC,EAAAA,OAAA,CAAOC,QAAQ,QAAQH,SAAY,mBAAA"}
1
+ {"version":3,"file":"ButtonDocs.cjs","sources":["../../../../../src/components/button/documentation/ButtonDocs.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { Button } from \"../Button.js\";\n\nexport const ButtonExample = () => {\n /* -- EXAMPLE CODE START -- */\n const [showLoader, setShowLoader] = useState(false);\n\n const simulateLoading = useCallback(() => {\n setShowLoader(true);\n setTimeout(() => {\n setShowLoader(false);\n }, 2200);\n }, []);\n\n return (\n <Flex\n direction=\"column\"\n gap={32}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Button\n variant=\"primary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Lagre og send inn\n </Button>\n <Button\n variant=\"secondary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Lagre\n </Button>\n <Button\n variant=\"tertiary\"\n loader={{\n showLoader,\n textDescription: \"Laster innhold\",\n }}\n onClick={simulateLoading}\n >\n Avbryt\n </Button>\n\n <Button variant=\"ghost\">Ola Nordmann</Button>\n </Flex>\n );\n /* -- EXAMPLE CODE END -- */\n};\n"],"names":["showLoader","setShowLoader","useState","simulateLoading","useCallback","setTimeout","jsxs","Flex","direction","gap","justifyContent","alignItems","children","jsx","Button","variant","loader","textDescription","onClick"],"mappings":"0NAI6B,KAEzB,MAAOA,EAAYC,GAAiBC,EAAAA,UAAS,GAEvCC,EAAkBC,EAAAA,aAAY,KAChCH,GAAc,GACdI,YAAW,KACPJ,GAAc,EAAK,GACpB,KAAI,GACR,IAGC,OAAAK,EAAAA,KAACC,EAAAA,KAAA,CACGC,UAAU,SACVC,IAAK,GACLC,eAAe,gBACfC,WAAW,SAEXC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,UACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,sBAGDC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,YACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,UAGDC,EAAAA,IAACC,EAAAA,OAAA,CACGC,QAAQ,WACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,WAIAC,EAAAA,IAAAC,EAAAA,OAAA,CAAOC,QAAQ,QAAQH,SAAY,mBACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Card.cjs","sources":["../../../../src/components/card/Card.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport { SlotComponent } from \"../../utilities/polymorphism/SlotComponent.js\";\nimport type { AsChildProps } from \"../../utilities/polymorphism/as-child.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport type { CardProps } from \"./types.js\";\n\ntype CardComponent = <ElementType extends React.ElementType = \"div\">(\n props: CardProps<ElementType> & AsChildProps,\n) => React.ReactElement | null;\n\n/**\n * En allsidig kortkomponent som brukes for å gruppere innhold på en side.\n * Komponenten rendres til vanlig som en `<div>`, men du kan velge å rendre\n * den som andre elementer eller komponenter der du trenger annen semantikk\n * eller funksjonalitet.\n */\nexport const Card = React.forwardRef(function Card<\n ElementType extends React.ElementType = \"div\",\n>(props: CardProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n className,\n clickable = false,\n padding = \"s\",\n variant = \"high\",\n asChild,\n as = \"div\",\n ...componentProps\n } = props;\n\n const Component = asChild ? SlotComponent : as;\n\n return (\n <Component\n data-testid=\"jkl-card\"\n data-clickable={clickable}\n data-padding={padding}\n className={clsx(\"jkl-card\", `jkl-card--${variant}`, className)}\n {...componentProps}\n ref={ref}\n />\n );\n}) as CardComponent;\n"],"names":["Card","React","forwardRef","props","ref","className","clickable","padding","variant","asChild","as","componentProps","Component","SlotComponent","jsx","clsx"],"mappings":"4OAiBaA,EAAOC,EAAMC,YAAW,SAEnCC,EAA+BC,GACvB,MACFC,UAAAA,EACAC,UAAAA,GAAY,EACZC,QAAAA,EAAU,IACVC,QAAAA,EAAU,OACVC,QAAAA,EACAC,GAAAA,EAAK,SACFC,GACHR,EAEES,EAAYH,EAAUI,EAAgBA,cAAAH,EAGxC,OAAAI,EAAAA,IAACF,EAAA,CACG,cAAY,WACZ,iBAAgBN,EAChB,eAAcC,EACdF,UAAWU,EAAKA,KAAA,WAAY,aAAaP,IAAWH,MAChDM,EACJP,IAAAA,GAGZ"}
1
+ {"version":3,"file":"Card.cjs","sources":["../../../../src/components/card/Card.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport { SlotComponent } from \"../../utilities/polymorphism/SlotComponent.js\";\nimport type { AsChildProps } from \"../../utilities/polymorphism/as-child.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport type { CardProps } from \"./types.js\";\n\ntype CardComponent = <ElementType extends React.ElementType = \"div\">(\n props: CardProps<ElementType> & AsChildProps,\n) => React.ReactElement | null;\n\n/**\n * En allsidig kortkomponent som brukes for å gruppere innhold på en side.\n * Komponenten rendres til vanlig som en `<div>`, men du kan velge å rendre\n * den som andre elementer eller komponenter der du trenger annen semantikk\n * eller funksjonalitet.\n */\nexport const Card = React.forwardRef(function Card<\n ElementType extends React.ElementType = \"div\",\n>(props: CardProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n className,\n clickable = false,\n padding = \"s\",\n variant = \"high\",\n asChild,\n as = \"div\",\n ...componentProps\n } = props;\n\n const Component = asChild ? SlotComponent : as;\n\n return (\n <Component\n data-testid=\"jkl-card\"\n data-clickable={clickable}\n data-padding={padding}\n className={clsx(\"jkl-card\", `jkl-card--${variant}`, className)}\n {...componentProps}\n ref={ref}\n />\n );\n}) as CardComponent;\n"],"names":["Card","React","forwardRef","props","ref","className","clickable","padding","variant","asChild","as","componentProps","Component","SlotComponent","jsx","clsx"],"mappings":"4OAiBaA,EAAOC,EAAMC,YAAW,SAEnCC,EAA+BC,GACvB,MACFC,UAAAA,EACAC,UAAAA,GAAY,EACZC,QAAAA,EAAU,IACVC,QAAAA,EAAU,OACVC,QAAAA,EACAC,GAAAA,EAAK,SACFC,GACHR,EAEES,EAAYH,EAAUI,EAAAA,cAAgBH,EAGxC,OAAAI,EAAAA,IAACF,EAAA,CACG,cAAY,WACZ,iBAAgBN,EAChB,eAAcC,EACdF,UAAWU,EAAKA,KAAA,WAAY,aAAaP,IAAWH,MAChDM,EACJP,IAAAA,GAGZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"CardImage.cjs","sources":["../../../../src/components/card/CardImage.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport { SlotComponent } from \"../../utilities/polymorphism/SlotComponent.js\";\nimport type { AsChildProps } from \"../../utilities/polymorphism/as-child.js\";\nimport type {\n PolymorphicPropsWithRef,\n PolymorphicRef,\n} from \"../../utilities/polymorphism/polymorphism.js\";\n\nexport type CardImageProps<ElementType extends React.ElementType> =\n PolymorphicPropsWithRef<\n ElementType,\n {\n /**\n * Legger til riktig negativ margin avhengig av hvor i kortet bildet\n * skal plasseres. Margin justeres automatisk etter padding i kortet.\n * @default \"top\"\n */\n placement?: \"top\" | \"middle\" | \"bottom\";\n }\n >;\n\ntype CardImageComponent = <ElementType extends React.ElementType = \"img\">(\n props: CardImageProps<ElementType>,\n) => React.ReactElement | null;\n\n/**\n * Bildekomponent som kan brukes i `Card` for å sørge for at bildet\n * blør helt ut i kantene av kortet. Rendres normalt som et `<img>`-\n * element, men du kan overstyre dette med `as` dersom du f.eks. har\n * en egen komponent for å håndtere responsive bilder.\n */\nexport const CardImage = React.forwardRef(function CardImage<\n ElementType extends React.ElementType = \"img\",\n>(\n {\n as,\n asChild,\n className,\n placement = \"top\",\n ...imageProps\n }: CardImageProps<ElementType> & AsChildProps,\n ref?: PolymorphicRef<ElementType>,\n) {\n const Component = asChild ? SlotComponent : as || \"img\";\n\n return (\n <Component\n ref={ref}\n className={clsx(\n \"jkl-card-image\",\n `jkl-card-image--${placement}`,\n className,\n )}\n {...imageProps}\n />\n );\n}) as CardImageComponent;\n"],"names":["CardImage","React","forwardRef","as","asChild","className","placement","imageProps","ref","Component","SlotComponent","jsx","clsx"],"mappings":"4OAgCaA,EAAYC,EAAMC,YAAW,UAIlCC,GAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EAAY,SACTC,GAEPC,GAEM,MAAAC,EAAYL,EAAUM,gBAAgBP,GAAM,MAG9C,OAAAQ,EAAAA,IAACF,EAAA,CACGD,IAAAA,EACAH,UAAWO,EAAAA,KACP,iBACA,mBAAmBN,IACnBD,MAEAE,GAGhB"}
1
+ {"version":3,"file":"CardImage.cjs","sources":["../../../../src/components/card/CardImage.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport { SlotComponent } from \"../../utilities/polymorphism/SlotComponent.js\";\nimport type { AsChildProps } from \"../../utilities/polymorphism/as-child.js\";\nimport type {\n PolymorphicPropsWithRef,\n PolymorphicRef,\n} from \"../../utilities/polymorphism/polymorphism.js\";\n\nexport type CardImageProps<ElementType extends React.ElementType> =\n PolymorphicPropsWithRef<\n ElementType,\n {\n /**\n * Legger til riktig negativ margin avhengig av hvor i kortet bildet\n * skal plasseres. Margin justeres automatisk etter padding i kortet.\n * @default \"top\"\n */\n placement?: \"top\" | \"middle\" | \"bottom\";\n }\n >;\n\ntype CardImageComponent = <ElementType extends React.ElementType = \"img\">(\n props: CardImageProps<ElementType>,\n) => React.ReactElement | null;\n\n/**\n * Bildekomponent som kan brukes i `Card` for å sørge for at bildet\n * blør helt ut i kantene av kortet. Rendres normalt som et `<img>`-\n * element, men du kan overstyre dette med `as` dersom du f.eks. har\n * en egen komponent for å håndtere responsive bilder.\n */\nexport const CardImage = React.forwardRef(function CardImage<\n ElementType extends React.ElementType = \"img\",\n>(\n {\n as,\n asChild,\n className,\n placement = \"top\",\n ...imageProps\n }: CardImageProps<ElementType> & AsChildProps,\n ref?: PolymorphicRef<ElementType>,\n) {\n const Component = asChild ? SlotComponent : as || \"img\";\n\n return (\n <Component\n ref={ref}\n className={clsx(\n \"jkl-card-image\",\n `jkl-card-image--${placement}`,\n className,\n )}\n {...imageProps}\n />\n );\n}) as CardImageComponent;\n"],"names":["CardImage","React","forwardRef","as","asChild","className","placement","imageProps","ref","Component","SlotComponent","jsx","clsx"],"mappings":"4OAgCaA,EAAYC,EAAMC,YAAW,UAIlCC,GAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,UAAAA,EAAY,SACTC,GAEPC,GAEM,MAAAC,EAAYL,EAAUM,EAAAA,cAAgBP,GAAM,MAG9C,OAAAQ,EAAAA,IAACF,EAAA,CACGD,IAAAA,EACAH,UAAWO,EAAAA,KACP,iBACA,mBAAmBN,IACnBD,MAEAE,GAGhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavCard.cjs","sources":["../../../../src/components/card/NavCard.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type AnchorHTMLAttributes,\n type ElementType,\n type FC,\n} from \"react\";\nimport type { Density, WithChildren } from \"../../core/types.js\";\nimport { Image } from \"../image/Image.js\";\nimport type { ImageProps } from \"../image/types.js\";\nimport { ErrorTag, InfoTag, SuccessTag, Tag, WarningTag } from \"../tag/Tag.js\";\nimport type { TagProps } from \"../tag/types.js\";\nimport type { CardTag, PaddingOptions, TagType } from \"./types.js\";\nimport { getPaddingStyles } from \"./utils.js\";\n\n/**\n * Bruk denne komponenten for å legge til ekstra informasjon i NavCard.\n * Innholdet blir rendret med skillelinje, og tekststil \"small\"\n */\nexport const InfoBlock: FC<WithChildren> = ({ children }) => (\n <div className=\"jkl-nav-card__info\">{children}</div>\n);\n\nexport interface NavCardProps\n extends PaddingOptions,\n AnchorHTMLAttributes<HTMLAnchorElement> {\n tag?: CardTag | Array<CardTag>;\n title: string;\n href?: string;\n to?: string;\n external?: boolean;\n description?: string;\n image?: Omit<ImageProps, \"className\">;\n className?: string;\n /**\n * Overstyr hvilken komponent som skal brukes, for eksempel hvis du har en Link-komponent fra en router.\n * @default \"a\"\n */\n component?: ElementType;\n density?: Density;\n}\n\nconst getTag = (type?: TagType) => {\n switch (type) {\n case \"info\":\n return InfoTag;\n case \"success\":\n return SuccessTag;\n case \"warning\":\n return WarningTag;\n case \"error\":\n return ErrorTag;\n default:\n return Tag;\n }\n};\nconst NavCardTag = ({\n text,\n type,\n density,\n}: CardTag & Pick<TagProps, \"density\">) => {\n const CardTag = getTag(type);\n return <CardTag density={density}>{text}</CardTag>;\n};\n\nexport const NavCard: FC<NavCardProps> = React.forwardRef<\n HTMLAnchorElement,\n NavCardProps\n>((props, ref) => {\n const {\n component = \"a\",\n padding = \"l\",\n image,\n tag,\n title,\n external,\n description,\n children,\n className,\n density,\n ...rest\n } = props;\n\n const Component = component;\n\n const tagArr = !tag ? undefined : Array.isArray(tag) ? tag : [tag];\n\n return (\n <Component\n ref={ref}\n aria-label={title}\n className={clsx(\"jkl-nav-card\", className)}\n data-density={density}\n {...rest}\n >\n {image && <Image className=\"jkl-nav-card__image\" {...image} />}\n <div\n className=\"jkl-nav-card__content\"\n style={getPaddingStyles(padding)}\n >\n {tagArr && (\n <div className=\"jkl-nav-card__tag-wrapper\">\n {tagArr.map((t, index) => (\n <NavCardTag\n type={t.type}\n text={t.text}\n key={index}\n />\n ))}\n </div>\n )}\n <div>\n <p\n className={clsx(\n \"jkl-nav-card__link\",\n external ? \"jkl-nav-card__link--external\" : \"\",\n )}\n >\n {title}\n </p>\n {description && (\n <p className=\"jkl-nav-card__description jkl-spacing-xs--top\">\n {description}\n </p>\n )}\n </div>\n {children}\n </div>\n </Component>\n );\n});\n\nNavCard.displayName = \"NavCard\";\n"],"names":["NavCardTag","text","type","density","CardTag","InfoTag","SuccessTag","WarningTag","ErrorTag","Tag","getTag","jsx","children","NavCard","React","forwardRef","props","ref","component","padding","image","tag","title","external","description","className","rest","Component","tagArr","Array","isArray","jsxs","clsx","Image","style","getPaddingStyles","map","t","index","displayName"],"mappings":"qQAuDMA,EAAa,EACfC,KAAAA,EACAC,KAAAA,EACAC,QAAAA,MAEM,MAAAC,EAnBMF,KACZ,OAAQA,GACJ,IAAK,OACM,OAAAG,UACX,IAAK,UACM,OAAAC,aACX,IAAK,UACM,OAAAC,aACX,IAAK,QACM,OAAAC,WACX,QACW,OAAAC,MACf,EAOgBC,CAAOR,GAChB,OAAAS,EAAAA,IAACP,EAAQ,CAAAD,QAAAA,EAAmBS,SAAKX,GAAA,EAG/BY,EAA4BC,EAAMC,YAG7C,CAACC,EAAOC,KACA,MACFC,UAAAA,EAAY,IACZC,QAAAA,EAAU,IACVC,MAAAA,EACAC,IAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAZ,SAAAA,EACAa,UAAAA,EACAtB,QAAAA,KACGuB,GACHV,EAEEW,EAAYT,EAEZU,EAAUP,EAAkBQ,MAAMC,QAAQT,GAAOA,EAAM,CAACA,QAAxC,EAGlB,OAAAU,EAAAA,KAACJ,EAAA,CACGV,IAAAA,EACA,aAAYK,EACZG,UAAWO,EAAAA,KAAK,eAAgBP,GAChC,eAActB,KACVuB,EAEHd,SAAA,CAAAQ,GAAUT,EAAAA,IAAAsB,QAAA,CAAMR,UAAU,yBAA0BL,IACrDW,EAAAA,KAAC,MAAA,CACGN,UAAU,wBACVS,MAAOC,mBAAiBhB,GAEvBP,SAAA,CACGgB,GAAAjB,EAAAA,IAAC,OAAIc,UAAU,4BACVb,WAAOwB,KAAI,CAACC,EAAGC,IACZ3B,EAAAA,IAACX,EAAA,CACGE,KAAMmC,EAAEnC,KACRD,KAAMoC,EAAEpC,MACHqC,cAKpB,MACG,CAAA1B,SAAA,CAAAD,EAAAA,IAAC,IAAA,CACGc,UAAWO,EAAAA,KACP,qBACAT,EAAW,+BAAiC,IAG/CX,SAAAU,IAEJE,GACGb,EAAAA,IAAC,IAAE,CAAAc,UAAU,gDACRb,SACLY,OAGPZ,OACL,IAKZC,EAAQ0B,YAAc,4BAjHqB,EAAG3B,SAAAA,KACzCD,EAAAA,IAAA,MAAA,CAAIc,UAAU,qBAAsBb,SAAAA"}
1
+ {"version":3,"file":"NavCard.cjs","sources":["../../../../src/components/card/NavCard.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type AnchorHTMLAttributes,\n type ElementType,\n type FC,\n} from \"react\";\nimport type { Density, WithChildren } from \"../../core/types.js\";\nimport { Image } from \"../image/Image.js\";\nimport type { ImageProps } from \"../image/types.js\";\nimport { ErrorTag, InfoTag, SuccessTag, Tag, WarningTag } from \"../tag/Tag.js\";\nimport type { TagProps } from \"../tag/types.js\";\nimport type { CardTag, PaddingOptions, TagType } from \"./types.js\";\nimport { getPaddingStyles } from \"./utils.js\";\n\n/**\n * Bruk denne komponenten for å legge til ekstra informasjon i NavCard.\n * Innholdet blir rendret med skillelinje, og tekststil \"small\"\n */\nexport const InfoBlock: FC<WithChildren> = ({ children }) => (\n <div className=\"jkl-nav-card__info\">{children}</div>\n);\n\nexport interface NavCardProps\n extends PaddingOptions,\n AnchorHTMLAttributes<HTMLAnchorElement> {\n tag?: CardTag | Array<CardTag>;\n title: string;\n href?: string;\n to?: string;\n external?: boolean;\n description?: string;\n image?: Omit<ImageProps, \"className\">;\n className?: string;\n /**\n * Overstyr hvilken komponent som skal brukes, for eksempel hvis du har en Link-komponent fra en router.\n * @default \"a\"\n */\n component?: ElementType;\n density?: Density;\n}\n\nconst getTag = (type?: TagType) => {\n switch (type) {\n case \"info\":\n return InfoTag;\n case \"success\":\n return SuccessTag;\n case \"warning\":\n return WarningTag;\n case \"error\":\n return ErrorTag;\n default:\n return Tag;\n }\n};\nconst NavCardTag = ({\n text,\n type,\n density,\n}: CardTag & Pick<TagProps, \"density\">) => {\n const CardTag = getTag(type);\n return <CardTag density={density}>{text}</CardTag>;\n};\n\nexport const NavCard: FC<NavCardProps> = React.forwardRef<\n HTMLAnchorElement,\n NavCardProps\n>((props, ref) => {\n const {\n component = \"a\",\n padding = \"l\",\n image,\n tag,\n title,\n external,\n description,\n children,\n className,\n density,\n ...rest\n } = props;\n\n const Component = component;\n\n const tagArr = !tag ? undefined : Array.isArray(tag) ? tag : [tag];\n\n return (\n <Component\n ref={ref}\n aria-label={title}\n className={clsx(\"jkl-nav-card\", className)}\n data-density={density}\n {...rest}\n >\n {image && <Image className=\"jkl-nav-card__image\" {...image} />}\n <div\n className=\"jkl-nav-card__content\"\n style={getPaddingStyles(padding)}\n >\n {tagArr && (\n <div className=\"jkl-nav-card__tag-wrapper\">\n {tagArr.map((t, index) => (\n <NavCardTag\n type={t.type}\n text={t.text}\n key={index}\n />\n ))}\n </div>\n )}\n <div>\n <p\n className={clsx(\n \"jkl-nav-card__link\",\n external ? \"jkl-nav-card__link--external\" : \"\",\n )}\n >\n {title}\n </p>\n {description && (\n <p className=\"jkl-nav-card__description jkl-spacing-xs--top\">\n {description}\n </p>\n )}\n </div>\n {children}\n </div>\n </Component>\n );\n});\n\nNavCard.displayName = \"NavCard\";\n"],"names":["NavCardTag","text","type","density","CardTag","InfoTag","SuccessTag","WarningTag","ErrorTag","Tag","getTag","jsx","children","NavCard","React","forwardRef","props","ref","component","padding","image","tag","title","external","description","className","rest","Component","tagArr","Array","isArray","jsxs","clsx","Image","style","getPaddingStyles","map","t","index","displayName"],"mappings":"qQAuDMA,EAAa,EACfC,KAAAA,EACAC,KAAAA,EACAC,QAAAA,MAEM,MAAAC,EAnBMF,KACZ,OAAQA,GACJ,IAAK,OACM,OAAAG,EAAAA,QACX,IAAK,UACM,OAAAC,EAAAA,WACX,IAAK,UACM,OAAAC,EAAAA,WACX,IAAK,QACM,OAAAC,EAAAA,SACX,QACW,OAAAC,EAAAA,IAAA,EAQCC,CAAOR,GAChB,OAAAS,EAAAA,IAACP,EAAQ,CAAAD,QAAAA,EAAmBS,SAAKX,GAAA,EAG/BY,EAA4BC,EAAMC,YAG7C,CAACC,EAAOC,KACA,MACFC,UAAAA,EAAY,IACZC,QAAAA,EAAU,IACVC,MAAAA,EACAC,IAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAZ,SAAAA,EACAa,UAAAA,EACAtB,QAAAA,KACGuB,GACHV,EAEEW,EAAYT,EAEZU,EAAUP,EAAkBQ,MAAMC,QAAQT,GAAOA,EAAM,CAACA,QAAxC,EAGlB,OAAAU,EAAAA,KAACJ,EAAA,CACGV,IAAAA,EACA,aAAYK,EACZG,UAAWO,EAAAA,KAAK,eAAgBP,GAChC,eAActB,KACVuB,EAEHd,SAAA,CAAAQ,GAAUT,EAAAA,IAAAsB,QAAA,CAAMR,UAAU,yBAA0BL,IACrDW,EAAAA,KAAC,MAAA,CACGN,UAAU,wBACVS,MAAOC,mBAAiBhB,GAEvBP,SAAA,CACGgB,GAAAjB,EAAAA,IAAC,OAAIc,UAAU,4BACVb,WAAOwB,KAAI,CAACC,EAAGC,IACZ3B,EAAAA,IAACX,EAAA,CACGE,KAAMmC,EAAEnC,KACRD,KAAMoC,EAAEpC,MACHqC,cAKpB,MACG,CAAA1B,SAAA,CAAAD,EAAAA,IAAC,IAAA,CACGc,UAAWO,EAAAA,KACP,qBACAT,EAAW,+BAAiC,IAG/CX,SAAAU,IAEJE,GACGb,EAAAA,IAAC,IAAE,CAAAc,UAAU,gDACRb,SACLY,OAGPZ,OAET,IAIRC,EAAQ0B,YAAc,4BAjHqB,EAAG3B,SAAAA,KACzCD,EAAAA,IAAA,MAAA,CAAIc,UAAU,qBAAsBb,SAAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Card.stories.cjs","sources":["../../../../../src/components/card/stories/Card.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { formatValuta } from \"../../../utilities/formatters/valuta/formatValuta.js\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { ErrorTag } from \"../../tag/Tag.js\";\nimport { Card as CardComponent } from \"../Card.js\";\nimport { CARD_PADDINGS, CARD_VARIANTS } from \"../types.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/Card\",\n component: CardComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n args: {\n // as: \"object\",\n },\n argTypes: {\n variant: {\n control: \"select\",\n options: CARD_VARIANTS,\n },\n padding: { control: \"select\", options: CARD_PADDINGS },\n },\n} satisfies Meta<typeof CardComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Card: Story = {\n args: {\n padding: \"m\",\n variant: \"outlined\",\n children: \"Hei, verden!\",\n },\n};\n\nexport const Fakturainformasjon: Story = {\n args: {\n padding: \"m\",\n clickable: true,\n variant: \"outlined\",\n children: \"\",\n },\n render: ({ asChild, as, ...props }) => (\n <CardComponent asChild {...props}>\n <Flex as=\"a\" href=\"#test\" colGap={40}>\n <Flex direction=\"column\" gap={4}>\n <p className=\"jkl-heading-2\">\n {formatValuta(18856)}\n <span aria-hidden> →</span>\n </p>\n <p className=\"jkl-body\">Frist 20.03.2023</p>\n </Flex>\n <Flex direction=\"column\" gap={12}>\n <ErrorTag>Ubetalt</ErrorTag>\n <p className=\"jkl-body\">Purring</p>\n </Flex>\n </Flex>\n </CardComponent>\n ),\n};\n"],"names":["meta","title","component","CardComponent","Card","parameters","layout","tags","args","argTypes","variant","control","options","CARD_VARIANTS","padding","CARD_PADDINGS","Fakturainformasjon","clickable","children","render","asChild","as","props","jsx","jsxs","Flex","href","colGap","direction","gap","className","formatValuta","ErrorTag"],"mappings":"8VASMA,EAAO,CACTC,MAAO,mBACPC,UAAWC,EAAAC,KACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,KAAM,CAEN,EACAC,SAAU,CACNC,QAAS,CACLC,QAAS,SACTC,QAASC,EAAAA,eAEbC,QAAS,CAAEH,QAAS,SAAUC,QAASG,EAAAA,iBAelCC,EAA4B,CACrCR,KAAM,CACFM,QAAS,IACTG,WAAW,EACXP,QAAS,WACTQ,SAAU,IAEdC,OAAQ,EAAGC,QAAAA,EAASC,GAAAA,KAAOC,KACtBC,EAAAA,IAAApB,EAAAC,KAAA,CAAcgB,SAAO,KAAKE,EACvBJ,SAACM,EAAAA,KAAAC,OAAA,CAAKJ,GAAG,IAAIK,KAAK,QAAQC,OAAQ,GAC9BT,SAAA,CAAAM,EAAAA,KAACC,EAAKA,KAAA,CAAAG,UAAU,SAASC,IAAK,EAC1BX,SAAA,CAACM,EAAAA,KAAA,IAAA,CAAEM,UAAU,gBACRZ,SAAA,CAAAa,EAAAA,aAAa,OACbR,EAAAA,IAAA,OAAA,CAAK,eAAW,EAACL,SAAE,UAEvBK,EAAAA,IAAA,IAAA,CAAEO,UAAU,WAAWZ,SAAgB,wBAE3CM,EAAAA,KAAAC,EAAAA,KAAA,CAAKG,UAAU,SAASC,IAAK,GAC1BX,SAAA,CAAAK,EAAAA,IAACS,YAASd,SAAO,YAChBK,EAAAA,IAAA,IAAA,CAAEO,UAAU,WAAWZ,SAAO,kCA3BxB,CACvBV,KAAM,CACFM,QAAS,IACTJ,QAAS,WACTQ,SAAU"}
1
+ {"version":3,"file":"Card.stories.cjs","sources":["../../../../../src/components/card/stories/Card.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { formatValuta } from \"../../../utilities/formatters/valuta/formatValuta.js\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { ErrorTag } from \"../../tag/Tag.js\";\nimport { Card as CardComponent } from \"../Card.js\";\nimport { CARD_PADDINGS, CARD_VARIANTS } from \"../types.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/Card\",\n component: CardComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n args: {\n // as: \"object\",\n },\n argTypes: {\n variant: {\n control: \"select\",\n options: CARD_VARIANTS,\n },\n padding: { control: \"select\", options: CARD_PADDINGS },\n },\n} satisfies Meta<typeof CardComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Card: Story = {\n args: {\n padding: \"m\",\n variant: \"outlined\",\n children: \"Hei, verden!\",\n },\n};\n\nexport const Fakturainformasjon: Story = {\n args: {\n padding: \"m\",\n clickable: true,\n variant: \"outlined\",\n children: \"\",\n },\n render: ({ asChild, as, ...props }) => (\n <CardComponent asChild {...props}>\n <Flex as=\"a\" href=\"#test\" colGap={40}>\n <Flex direction=\"column\" gap={4}>\n <p className=\"jkl-heading-2\">\n {formatValuta(18856)}\n <span aria-hidden> →</span>\n </p>\n <p className=\"jkl-body\">Frist 20.03.2023</p>\n </Flex>\n <Flex direction=\"column\" gap={12}>\n <ErrorTag>Ubetalt</ErrorTag>\n <p className=\"jkl-body\">Purring</p>\n </Flex>\n </Flex>\n </CardComponent>\n ),\n};\n"],"names":["meta","title","component","CardComponent","Card","parameters","layout","tags","args","argTypes","variant","control","options","CARD_VARIANTS","padding","CARD_PADDINGS","Fakturainformasjon","clickable","children","render","asChild","as","props","jsx","jsxs","Flex","href","colGap","direction","gap","className","formatValuta","ErrorTag"],"mappings":"8VASMA,EAAO,CACTC,MAAO,mBACPC,UAAWC,EAAAC,KACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,KAAM,CAEN,EACAC,SAAU,CACNC,QAAS,CACLC,QAAS,SACTC,QAASC,EAAAA,eAEbC,QAAS,CAAEH,QAAS,SAAUC,QAASG,EAAcA,iBAehDC,EAA4B,CACrCR,KAAM,CACFM,QAAS,IACTG,WAAW,EACXP,QAAS,WACTQ,SAAU,IAEdC,OAAQ,EAAGC,QAAAA,EAASC,GAAAA,KAAOC,KACtBC,EAAAA,IAAApB,EAAAC,KAAA,CAAcgB,SAAO,KAAKE,EACvBJ,SAACM,EAAAA,KAAAC,OAAA,CAAKJ,GAAG,IAAIK,KAAK,QAAQC,OAAQ,GAC9BT,SAAA,CAAAM,EAAAA,KAACC,EAAKA,KAAA,CAAAG,UAAU,SAASC,IAAK,EAC1BX,SAAA,CAACM,EAAAA,KAAA,IAAA,CAAEM,UAAU,gBACRZ,SAAA,CAAAa,EAAAA,aAAa,OACbR,EAAAA,IAAA,OAAA,CAAK,eAAW,EAACL,SAAE,UAEvBK,EAAAA,IAAA,IAAA,CAAEO,UAAU,WAAWZ,SAAgB,wBAE3CM,EAAAA,KAAAC,EAAAA,KAAA,CAAKG,UAAU,SAASC,IAAK,GAC1BX,SAAA,CAAAK,EAAAA,IAACS,YAASd,SAAO,YAChBK,EAAAA,IAAA,IAAA,CAAEO,UAAU,WAAWZ,SAAO,kCA3BxB,CACvBV,KAAM,CACFM,QAAS,IACTJ,QAAS,WACTQ,SAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.cjs","sources":["../../../../src/components/checkbox/Checkbox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport type { CheckboxProps } from \"./types.js\";\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (props, ref) => {\n const {\n id,\n children,\n invalid,\n className,\n inline = false,\n density,\n \"data-testautoid\": testAutoId,\n checked,\n indeterminate,\n ...rest\n } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(\n ref,\n () => inputRef.current as HTMLInputElement,\n [],\n );\n\n const inputId = useId(id || \"jkl-checkbox\", { generateSuffix: !id });\n\n useEffect(() => {\n if (\n checked === true &&\n indeterminate === true &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n \"A Checkbox can not be both checked and indeterminate, and will be treated as checked\",\n );\n }\n if (inputRef.current) {\n inputRef.current.indeterminate = !checked && !!indeterminate;\n }\n }, [checked, indeterminate]);\n\n return (\n <div\n className={clsx(\"jkl-checkbox\", className, {\n \"jkl-checkbox--inline\": inline,\n \"jkl-checkbox--error\": invalid,\n })}\n data-density={density}\n >\n <input\n id={inputId}\n ref={inputRef}\n className=\"jkl-checkbox__input\"\n data-testid=\"jkl-checkbox-input\"\n aria-invalid={invalid}\n type=\"checkbox\"\n data-testautoid={testAutoId}\n checked={checked}\n {...rest}\n />\n <label htmlFor={inputId} className=\"jkl-checkbox__label\">\n <span className=\"jkl-checkbox__mark\">\n <span className=\"jkl-checkbox__indeterminate-mark\" />\n <span className=\"jkl-checkbox__check-mark\" />\n </span>\n <span className=\"jkl-checkbox__text\">{children}</span>\n </label>\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["Checkbox","forwardRef","props","ref","id","children","invalid","className","inline","density","testAutoId","checked","indeterminate","rest","inputRef","useRef","useImperativeHandle","current","inputId","useId","generateSuffix","useEffect","process","env","NODE_ENV","console","warn","jsxs","clsx","jsx","type","htmlFor","displayName"],"mappings":"yNAUaA,EAAWC,EAAAA,YACpB,CAACC,EAAOC,KACE,MACFC,GAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,OAAAA,GAAS,EACTC,QAAAA,EACA,kBAAmBC,EACnBC,QAAAA,EACAC,cAAAA,KACGC,GACHX,EAEEY,EAAWC,SAAyB,MAC1CC,EAAAA,oBACIb,GACA,IAAMW,EAASG,SACf,IAGE,MAAAC,EAAUC,QAAMf,GAAM,eAAgB,CAAEgB,gBAAiBhB,IAE/DiB,OAAAA,EAAAA,WAAU,MAEU,IAAZV,IACkB,IAAlBC,GACyB,eAAzBU,QAAQC,IAAIC,UAEJC,QAAAC,KACJ,wFAGJZ,EAASG,UACTH,EAASG,QAAQL,eAAiBD,KAAaC,KAEpD,CAACD,EAASC,IAGTe,EAAAA,KAAC,MAAA,CACGpB,UAAWqB,EAAAA,KAAK,eAAgBrB,EAAW,CACvC,uBAAwBC,EACxB,sBAAuBF,IAE3B,eAAcG,EAEdJ,SAAA,CAAAwB,EAAAA,IAAC,QAAA,CACGzB,GAAIc,EACJf,IAAKW,EACLP,UAAU,sBACV,cAAY,qBACZ,eAAcD,EACdwB,KAAK,WACL,kBAAiBpB,EACjBC,QAAAA,KACIE,IAEPc,EAAAA,KAAA,QAAA,CAAMI,QAASb,EAASX,UAAU,sBAC/BF,SAAA,CAACsB,EAAAA,KAAA,OAAA,CAAKpB,UAAU,qBACZF,SAAA,CAACwB,EAAAA,IAAA,OAAA,CAAKtB,UAAU,qCAChBsB,EAAAA,IAAC,OAAK,CAAAtB,UAAU,gCAEnBsB,EAAAA,IAAA,OAAA,CAAKtB,UAAU,qBAAsBF,SAAAA,SAC1C,IAMhBL,EAASgC,YAAc"}
1
+ {"version":3,"file":"Checkbox.cjs","sources":["../../../../src/components/checkbox/Checkbox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport type { CheckboxProps } from \"./types.js\";\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (props, ref) => {\n const {\n id,\n children,\n invalid,\n className,\n inline = false,\n density,\n \"data-testautoid\": testAutoId,\n checked,\n indeterminate,\n ...rest\n } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(\n ref,\n () => inputRef.current as HTMLInputElement,\n [],\n );\n\n const inputId = useId(id || \"jkl-checkbox\", { generateSuffix: !id });\n\n useEffect(() => {\n if (\n checked === true &&\n indeterminate === true &&\n process.env.NODE_ENV !== \"production\"\n ) {\n console.warn(\n \"A Checkbox can not be both checked and indeterminate, and will be treated as checked\",\n );\n }\n if (inputRef.current) {\n inputRef.current.indeterminate = !checked && !!indeterminate;\n }\n }, [checked, indeterminate]);\n\n return (\n <div\n className={clsx(\"jkl-checkbox\", className, {\n \"jkl-checkbox--inline\": inline,\n \"jkl-checkbox--error\": invalid,\n })}\n data-density={density}\n >\n <input\n id={inputId}\n ref={inputRef}\n className=\"jkl-checkbox__input\"\n data-testid=\"jkl-checkbox-input\"\n aria-invalid={invalid}\n type=\"checkbox\"\n data-testautoid={testAutoId}\n checked={checked}\n {...rest}\n />\n <label htmlFor={inputId} className=\"jkl-checkbox__label\">\n <span className=\"jkl-checkbox__mark\">\n <span className=\"jkl-checkbox__indeterminate-mark\" />\n <span className=\"jkl-checkbox__check-mark\" />\n </span>\n <span className=\"jkl-checkbox__text\">{children}</span>\n </label>\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["Checkbox","forwardRef","props","ref","id","children","invalid","className","inline","density","testAutoId","checked","indeterminate","rest","inputRef","useRef","useImperativeHandle","current","inputId","useId","generateSuffix","useEffect","process","env","NODE_ENV","console","warn","jsxs","clsx","jsx","type","htmlFor","displayName"],"mappings":"yNAUaA,EAAWC,EAAAA,YACpB,CAACC,EAAOC,KACE,MACFC,GAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,OAAAA,GAAS,EACTC,QAAAA,EACA,kBAAmBC,EACnBC,QAAAA,EACAC,cAAAA,KACGC,GACHX,EAEEY,EAAWC,SAAyB,MAC1CC,EAAAA,oBACIb,GACA,IAAMW,EAASG,SACf,IAGE,MAAAC,EAAUC,EAAAA,MAAMf,GAAM,eAAgB,CAAEgB,gBAAiBhB,IAE/DiB,OAAAA,EAAAA,WAAU,MAEU,IAAZV,IACkB,IAAlBC,GACyB,eAAzBU,QAAQC,IAAIC,UAEJC,QAAAC,KACJ,wFAGJZ,EAASG,UACTH,EAASG,QAAQL,eAAiBD,KAAaC,KAEpD,CAACD,EAASC,IAGTe,EAAAA,KAAC,MAAA,CACGpB,UAAWqB,EAAAA,KAAK,eAAgBrB,EAAW,CACvC,uBAAwBC,EACxB,sBAAuBF,IAE3B,eAAcG,EAEdJ,SAAA,CAAAwB,EAAAA,IAAC,QAAA,CACGzB,GAAIc,EACJf,IAAKW,EACLP,UAAU,sBACV,cAAY,qBACZ,eAAcD,EACdwB,KAAK,WACL,kBAAiBpB,EACjBC,QAAAA,KACIE,IAEPc,EAAAA,KAAA,QAAA,CAAMI,QAASb,EAASX,UAAU,sBAC/BF,SAAA,CAACsB,EAAAA,KAAA,OAAA,CAAKpB,UAAU,qBACZF,SAAA,CAACwB,EAAAA,IAAA,OAAA,CAAKtB,UAAU,qCAChBsB,EAAAA,IAAC,OAAK,CAAAtB,UAAU,gCAEnBsB,EAAAA,IAAA,OAAA,CAAKtB,UAAU,qBAAsBF,SAAAA,SAE9C,IAKZL,EAASgC,YAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxPanel.stories.cjs","sources":["../../../../../src/components/checkbox-panel/stories/CheckboxPanel.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { SuccessTag } from \"../../tag/Tag.js\";\nimport { CheckboxPanel as CheckboxPanelComponent } from \"../CheckboxPanel.js\";\nimport \"../styles/_index.scss\";\nimport \"./styles.scss\";\n\nconst meta = {\n title: \"Komponenter/CheckboxPanel\",\n component: CheckboxPanelComponent,\n parameters: {\n layout: \"padded\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n alwaysOpen: {\n table: {\n defaultValue: {\n summary: undefined,\n },\n },\n },\n },\n} satisfies Meta<typeof CheckboxPanelComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const CheckboxPanel: Story = {\n args: {\n label: \"Kasko\",\n children: (\n <p>\n En forsikring som passer de fleste biler. Dekker det meste av\n skader, også de du selv er ansvarlig for. Inkluderer Minikasko\n og Ansvar.\n </p>\n ),\n extraLabel: (\n <Flex\n as=\"span\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={24}\n className=\"input-panel-example__custom-label input-panel-example__custom-label--bold\"\n >\n <SuccessTag>Anbefalt</SuccessTag>\n 300 kr/mnd\n </Flex>\n ),\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 580 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","CheckboxPanel","parameters","layout","tags","argTypes","alwaysOpen","table","defaultValue","summary","args","label","children","jsx","extraLabel","jsxs","Flex","as","alignItems","justifyContent","gap","className","SuccessTag","decorators","Story","style","maxWidth"],"mappings":"wOAQMA,EAAO,CACTC,MAAO,4BACPC,0CAAWC,cACXC,WAAY,CACRC,OAAQ,UAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,WAAY,CACRC,MAAO,CACHC,aAAc,CACVC,aAAS,OAUhBR,EAAuB,CAChCS,KAAM,CACFC,MAAO,QACPC,SACKC,EAAAA,IAAA,IAAA,CAAED,SAIH,4IAEJE,WACIC,EAAAA,KAACC,EAAAA,KAAA,CACGC,GAAG,OACHC,WAAW,SACXC,eAAe,WACfC,IAAK,GACLC,UAAU,4EAEVT,SAAA,CAAAC,EAAAA,IAACS,cAAWV,SAAQ,aAAa,iBAK7CW,WAAaC,GACTX,EAAAA,IAAC,MAAI,CAAAY,MAAO,CAAEC,SAAU,KACpBd,SAACC,EAAAA,IAAAW,EAAA,CAAA"}
1
+ {"version":3,"file":"CheckboxPanel.stories.cjs","sources":["../../../../../src/components/checkbox-panel/stories/CheckboxPanel.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React from \"react\";\nimport { Flex } from \"../../flex/Flex.js\";\nimport { SuccessTag } from \"../../tag/Tag.js\";\nimport { CheckboxPanel as CheckboxPanelComponent } from \"../CheckboxPanel.js\";\nimport \"../styles/_index.scss\";\nimport \"./styles.scss\";\n\nconst meta = {\n title: \"Komponenter/CheckboxPanel\",\n component: CheckboxPanelComponent,\n parameters: {\n layout: \"padded\",\n },\n tags: [\"autodocs\"],\n argTypes: {\n alwaysOpen: {\n table: {\n defaultValue: {\n summary: undefined,\n },\n },\n },\n },\n} satisfies Meta<typeof CheckboxPanelComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const CheckboxPanel: Story = {\n args: {\n label: \"Kasko\",\n children: (\n <p>\n En forsikring som passer de fleste biler. Dekker det meste av\n skader, også de du selv er ansvarlig for. Inkluderer Minikasko\n og Ansvar.\n </p>\n ),\n extraLabel: (\n <Flex\n as=\"span\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n gap={24}\n className=\"input-panel-example__custom-label input-panel-example__custom-label--bold\"\n >\n <SuccessTag>Anbefalt</SuccessTag>\n 300 kr/mnd\n </Flex>\n ),\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 580 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","CheckboxPanel","parameters","layout","tags","argTypes","alwaysOpen","table","defaultValue","summary","args","label","children","jsx","extraLabel","jsxs","Flex","as","alignItems","justifyContent","gap","className","SuccessTag","decorators","Story","style","maxWidth"],"mappings":"wOAQMA,EAAO,CACTC,MAAO,4BACPC,0CAAWC,cACXC,WAAY,CACRC,OAAQ,UAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,WAAY,CACRC,MAAO,CACHC,aAAc,CACVC,aAAS,OAUhBR,EAAuB,CAChCS,KAAM,CACFC,MAAO,QACPC,SACKC,EAAAA,IAAA,IAAA,CAAED,SAIH,4IAEJE,WACIC,EAAAA,KAACC,EAAAA,KAAA,CACGC,GAAG,OACHC,WAAW,SACXC,eAAe,WACfC,IAAK,GACLC,UAAU,4EAEVT,SAAA,CAAAC,EAAAA,IAACS,cAAWV,SAAQ,aAAa,iBAK7CW,WAAaC,GACTX,EAAAA,IAAC,MAAI,CAAAY,MAAO,CAAEC,SAAU,KACpBd,SAACC,EAAAA,IAAAW,EAAA,CAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.cjs","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type FC,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAnimatedHeight } from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport { useListNavigation } from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { TooltipContent } from \"../tooltip/TooltipContent.js\";\nimport { TooltipTrigger } from \"../tooltip/TooltipTrigger.js\";\nimport type { ComboboxProps, ComboboxValuePair } from \"./types.js\";\n\nexport function getComboboxValuePair(\n item: string | ComboboxValuePair,\n): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<\n Array<ComboboxValuePair>\n >(value || []);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n }\n\n return selectedValue.some((value) => value.value === option.value);\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e:\n | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n const newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, onChange, name],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: {\n target: { value: React.SetStateAction<string> };\n }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) =>\n option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<\n string | undefined\n >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n // Håndtere arrow-state\n const isPointingDown = !showMenu;\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (\n e: FocusEvent<\n HTMLDivElement | HTMLInputElement | HTMLButtonElement\n >,\n ) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent = componentRootElement?.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(\n new Event(\"focusout\", { bubbles: true }),\n );\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement\n .querySelector<HTMLButtonElement>('[role=\"option\"]')\n ?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some(\n (item) => item.isMarked,\n );\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter(\n (item) => !item.isMarked,\n );\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(\n e,\n selectedValue[selectedValue.length - 1].value,\n );\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector(\n '[role=\"option\"]:not([hidden])',\n );\n if (\n e.currentTarget.id === firstVisible?.id &&\n searchRef.current\n ) {\n searchRef.current.focus();\n }\n }\n }\n },\n [dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n const renderSelectedOption = useCallback(\n (option: ComboboxValuePair) => (\n <Chip\n key={option.value}\n data-testid=\"jkl-chip\"\n aria-label={`Fjern ${option.tagLabel}`}\n className={`jkl-combobox__selected-option ${\n marked && \"jkl-combobox__selected-option--marked\"\n }`}\n variant=\"input\"\n onClick={(e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n }}\n onBlur={handleBlur}\n >\n {option.tagLabel ? option.tagLabel : option.label}\n </Chip>\n ),\n [handleBlur, onTagRemove, marked],\n );\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", {\n \"jkl-combobox__wrapper--active-value\": hasSelection,\n })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className=\"jkl-combobox__chips\"\n data-testid=\"jkl-combobox__chips\"\n >\n {selectedValue\n .map(getComboboxValuePair)\n .map((option) => {\n return hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {renderSelectedOption(option)}\n </TooltipTrigger>\n <TooltipContent>\n {option.label}\n </TooltipContent>\n </Tooltip>\n ) : (\n renderSelectedOption(option)\n );\n })}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={\n selectedValue.length > 0 ? \"\" : placeholder\n }\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) &&\n \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(\n `${listId}__${option.value}`,\n ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">\n {option.description}\n </span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && (\n <div className=\"jkl-combobox__no-option\">\n {noMatchingOption}\n </div>\n )}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label={`${\n selectedValue.map((value) => value.label) ||\n \"Velg\"\n },${label}`}\n aria-expanded={showMenu}\n aria-controls={listId}\n onClick={() => setShowMenu((previous) => !previous)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated\n pointingDown={isPointingDown}\n />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","_a","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","_b","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","componentRootElement","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.cjs","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type FC,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAnimatedHeight } from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport { useListNavigation } from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { TooltipContent } from \"../tooltip/TooltipContent.js\";\nimport { TooltipTrigger } from \"../tooltip/TooltipTrigger.js\";\nimport type { ComboboxProps, ComboboxValuePair } from \"./types.js\";\n\nexport function getComboboxValuePair(\n item: string | ComboboxValuePair,\n): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<\n Array<ComboboxValuePair>\n >(value || []);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n }\n\n return selectedValue.some((value) => value.value === option.value);\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e:\n | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n const newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, onChange, name],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: {\n target: { value: React.SetStateAction<string> };\n }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) =>\n option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<\n string | undefined\n >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n // Håndtere arrow-state\n const isPointingDown = !showMenu;\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (\n e: FocusEvent<\n HTMLDivElement | HTMLInputElement | HTMLButtonElement\n >,\n ) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent = componentRootElement?.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(\n new Event(\"focusout\", { bubbles: true }),\n );\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement\n .querySelector<HTMLButtonElement>('[role=\"option\"]')\n ?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some(\n (item) => item.isMarked,\n );\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter(\n (item) => !item.isMarked,\n );\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(\n e,\n selectedValue[selectedValue.length - 1].value,\n );\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector(\n '[role=\"option\"]:not([hidden])',\n );\n if (\n e.currentTarget.id === firstVisible?.id &&\n searchRef.current\n ) {\n searchRef.current.focus();\n }\n }\n }\n },\n [dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n const renderSelectedOption = useCallback(\n (option: ComboboxValuePair) => (\n <Chip\n key={option.value}\n data-testid=\"jkl-chip\"\n aria-label={`Fjern ${option.tagLabel}`}\n className={`jkl-combobox__selected-option ${\n marked && \"jkl-combobox__selected-option--marked\"\n }`}\n variant=\"input\"\n onClick={(e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n }}\n onBlur={handleBlur}\n >\n {option.tagLabel ? option.tagLabel : option.label}\n </Chip>\n ),\n [handleBlur, onTagRemove, marked],\n );\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", {\n \"jkl-combobox__wrapper--active-value\": hasSelection,\n })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className=\"jkl-combobox__chips\"\n data-testid=\"jkl-combobox__chips\"\n >\n {selectedValue\n .map(getComboboxValuePair)\n .map((option) => {\n return hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {renderSelectedOption(option)}\n </TooltipTrigger>\n <TooltipContent>\n {option.label}\n </TooltipContent>\n </Tooltip>\n ) : (\n renderSelectedOption(option)\n );\n })}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={\n selectedValue.length > 0 ? \"\" : placeholder\n }\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) &&\n \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(\n `${listId}__${option.value}`,\n ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">\n {option.description}\n </span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && (\n <div className=\"jkl-combobox__no-option\">\n {noMatchingOption}\n </div>\n )}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label={`${\n selectedValue.map((value) => value.label) ||\n \"Velg\"\n },${label}`}\n aria-expanded={showMenu}\n aria-controls={listId}\n onClick={() => setShowMenu((previous) => !previous)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated\n pointingDown={isPointingDown}\n />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","_a","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","_b","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","componentRootElement","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.stories.cjs","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Combobox as ComboboxComponent } from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\nimport type { ComboboxValuePair } from \"../../combobox/types.js\";\n\nconst meta = {\n title: \"Komponenter/Combobox\",\n component: ComboboxComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof ComboboxComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst items: ComboboxValuePair[] = [\n { value: \"a080\", label: \"A080 - Rotavirusenteritt\", tagLabel: \"A080\" },\n {\n value: \"a081\",\n label: \"A081 - Akutt gastroenteritt som skyldes norovirus\",\n tagLabel: \"A081\",\n },\n { value: \"a082\", label: \"A082 - Adenovirusenteritt\", tagLabel: \"A082\" },\n {\n value: \"a083\",\n label: \"A083 - Annen virusenteritt\",\n tagLabel: \"A083\",\n },\n {\n value: \"a084\",\n label: \"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen\",\n tagLabel: \"A084\",\n },\n {\n value: \"a085\",\n label: \"A085 - Annen spesifisert mage-tarminfeksjon\",\n tagLabel: \"A085\",\n },\n {\n value: \"a090\",\n label: \"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak\",\n tagLabel: \"A090\",\n },\n {\n value: \"a099\",\n label: \"A099 - Gastroenteritt eller kolitt av uspesifisert årsak\",\n tagLabel: \"A099\",\n },\n {\n value: \"a150\",\n label: \"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur\",\n tagLabel: \"A150\",\n },\n];\n\nexport const Combobox: Story = {\n args: {\n items,\n label: \"Velg sykdommer\",\n name: \"disease\",\n onChange: () => {},\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 220 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","ComboboxComponent","Combobox","parameters","layout","tags","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"+LAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EAAAC,SACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEH,EAAkB,CAC3BI,KAAM,CACFC,MA1C2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAOVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,GACTC,EAAAA,IAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAA,IAAAD,EAAA,CAAA"}
1
+ {"version":3,"file":"Combobox.stories.cjs","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Combobox as ComboboxComponent } from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\nimport type { ComboboxValuePair } from \"../../combobox/types.js\";\n\nconst meta = {\n title: \"Komponenter/Combobox\",\n component: ComboboxComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof ComboboxComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst items: ComboboxValuePair[] = [\n { value: \"a080\", label: \"A080 - Rotavirusenteritt\", tagLabel: \"A080\" },\n {\n value: \"a081\",\n label: \"A081 - Akutt gastroenteritt som skyldes norovirus\",\n tagLabel: \"A081\",\n },\n { value: \"a082\", label: \"A082 - Adenovirusenteritt\", tagLabel: \"A082\" },\n {\n value: \"a083\",\n label: \"A083 - Annen virusenteritt\",\n tagLabel: \"A083\",\n },\n {\n value: \"a084\",\n label: \"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen\",\n tagLabel: \"A084\",\n },\n {\n value: \"a085\",\n label: \"A085 - Annen spesifisert mage-tarminfeksjon\",\n tagLabel: \"A085\",\n },\n {\n value: \"a090\",\n label: \"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak\",\n tagLabel: \"A090\",\n },\n {\n value: \"a099\",\n label: \"A099 - Gastroenteritt eller kolitt av uspesifisert årsak\",\n tagLabel: \"A099\",\n },\n {\n value: \"a150\",\n label: \"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur\",\n tagLabel: \"A150\",\n },\n];\n\nexport const Combobox: Story = {\n args: {\n items,\n label: \"Velg sykdommer\",\n name: \"disease\",\n onChange: () => {},\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 220 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","ComboboxComponent","Combobox","parameters","layout","tags","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"+LAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EAAAC,SACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEH,EAAkB,CAC3BI,KAAM,CACFC,MA1C2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAOVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,GACTC,EAAAA,IAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAA,IAAAD,EAAA,CAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { type FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport type { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"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"}
1
+ {"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { type FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport type { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"+YA0B6B,EACzBA,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,sBAEGC,EAAUC,GAAeC,WAAS,CACrCC,GAAI,oBAAoBC,EAAAA,UAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,EAAAA,WAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,EAAAA,WAAU,KACA,MAAAG,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAC1B,CAAA,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGL,MAAAC,EAAS,CACXC,EAAYC,EAAAA,2CACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,EAAI,CAAAC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,mBAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,QAoBd,OAAOyB,EAASC,aACZC,EAAAA,KAACC,EAAAA,eAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAA,IAAAC,EAAAA,aAAA,IAAiBxC,EAAYyC,UAC9BN,EAAAA,KAACO,EAAMA,MAAA,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAAAA,2CAChB,CACIL,WAA2C,SAA/BiC,EAASI,IAAI,cACzBnC,WAA2C,SAA/B+B,EAASI,IAAI,cACzBpC,UAAyC,SAA9BgC,EAASI,IAAI,cAE5B1D,GAGJwB,EAAOiC,EAAW,EAWVb,SAAA,CAAAC,EAAAA,IAACc,eACGf,SAACC,EAAAA,IAAAe,EAAAA,WAAA,IAAetD,EAAYK,MAAOiC,+CAItCiB,EAAAA,UACG,CAAAjB,SAAA,CAAAC,EAAAA,IAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAAAA,IAACiB,EAAAA,oBAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,uBAS5C2C,EAAAA,aACG,CAAArB,SAAA,CAAAC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAAAA,IAACqB,EAAAA,gBAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KACb"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport type {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n cookiePath,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n /* Use timestamp as a dependency to be able to force re-reading of cookie */\n // biome-ignore lint/correctness/useExhaustiveDependencies:\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n cookiePath,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAKtBY,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GAAA,yDAqBmB,KACtB,MAAA4B,EAAUC,aAAWhC,GAE3B,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,0CA7BG,KACtB,MAAAC,EAAU9B,EAAM+B,WAAWhC,GACjC,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
1
+ {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport type {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n cookiePath,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n /* Use timestamp as a dependency to be able to force re-reading of cookie */\n // biome-ignore lint/correctness/useExhaustiveDependencies:\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n cookiePath,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAKtBY,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GACL,yDAoBwB,KACtB,MAAA4B,EAAUC,aAAWhC,GAE3B,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,eAEW,2BA/BR,KACtB,MAAAC,EAAU9B,EAAM+B,WAAWhC,GACjC,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.stories.cjs","sources":["../../../../../src/components/cookie-consent/stories/CookieConsent.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React, { type FC } from \"react\";\nimport type { WithChildren } from \"../../../core/types.js\";\nimport { PrimaryButton } from \"../../button/Button.js\";\nimport { CookieConsent as CookieConsentComponent } from \"../CookieConsent.js\";\nimport {\n CookieConsentProvider,\n useCookieConsent,\n} from \"../CookieConsentContext.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/CookieConsent\",\n component: CookieConsentProvider,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {},\n} satisfies Meta<typeof CookieConsentProvider>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst Wrapper: FC<WithChildren> = ({ children }) => {\n const { openConsentModal } = useCookieConsent();\n\n return (\n <div>\n <PrimaryButton onClick={() => openConsentModal()}>\n Åpne samtykker\n </PrimaryButton>\n {children}\n </div>\n );\n};\n\nexport const CookieConsent: Story = {\n args: {\n children: (\n <Wrapper>\n <CookieConsentComponent />\n </Wrapper>\n ),\n cookieName: \"demo-consent-cookie\",\n functional: true,\n statistics: true,\n marketing: true,\n },\n};\n"],"names":["meta","title","component","CookieConsentProvider","parameters","layout","tags","argTypes","CookieConsent","args","children","jsx","openConsentModal","useCookieConsent","PrimaryButton","onClick","CookieConsentComponent","cookieName","functional","statistics","marketing"],"mappings":"wRAWMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EAAAA,sBACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAC,GAmBFC,EAAuB,CAChCC,KAAM,CACFC,SACIC,EAAAA,KAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,EAAAA,mBAE7B,cACK,MACG,CAAAH,SAAA,CAAAC,EAAAA,IAACG,EAAcA,cAAA,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAAAA,IAACK,iBAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
1
+ {"version":3,"file":"CookieConsent.stories.cjs","sources":["../../../../../src/components/cookie-consent/stories/CookieConsent.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React, { type FC } from \"react\";\nimport type { WithChildren } from \"../../../core/types.js\";\nimport { PrimaryButton } from \"../../button/Button.js\";\nimport { CookieConsent as CookieConsentComponent } from \"../CookieConsent.js\";\nimport {\n CookieConsentProvider,\n useCookieConsent,\n} from \"../CookieConsentContext.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/CookieConsent\",\n component: CookieConsentProvider,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {},\n} satisfies Meta<typeof CookieConsentProvider>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst Wrapper: FC<WithChildren> = ({ children }) => {\n const { openConsentModal } = useCookieConsent();\n\n return (\n <div>\n <PrimaryButton onClick={() => openConsentModal()}>\n Åpne samtykker\n </PrimaryButton>\n {children}\n </div>\n );\n};\n\nexport const CookieConsent: Story = {\n args: {\n children: (\n <Wrapper>\n <CookieConsentComponent />\n </Wrapper>\n ),\n cookieName: \"demo-consent-cookie\",\n functional: true,\n statistics: true,\n marketing: true,\n },\n};\n"],"names":["meta","title","component","CookieConsentProvider","parameters","layout","tags","argTypes","CookieConsent","args","children","jsx","openConsentModal","useCookieConsent","PrimaryButton","onClick","CookieConsentComponent","cookieName","functional","statistics","marketing"],"mappings":"wRAWMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EAAAA,sBACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAA,GAmBDC,EAAuB,CAChCC,KAAM,CACFC,SACIC,EAAAA,KAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,qBAE7B,cACK,MACG,CAAAH,SAAA,CAAAC,EAAAA,IAACG,EAAcA,cAAA,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAAAA,IAACK,iBAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"Countdown.cjs","sources":["../../../../src/components/countdown/Countdown.tsx"],"sourcesContent":["import React, { useState, type CSSProperties, type FC, useEffect } from \"react\";\nimport type { CountdownProps } from \"./types.js\";\n\nexport const Countdown: FC<CountdownProps> = ({\n className,\n from,\n isPaused,\n ...rest\n}) => {\n const [remainingSeconds, setRemainingSeconds] = useState(\n Math.floor(from / 1000),\n );\n\n useEffect(() => {\n if (remainingSeconds <= 0) {\n return;\n }\n\n setTimeout(() => {\n if (!isPaused) {\n setRemainingSeconds((sec) => sec - 1);\n }\n }, 1000);\n }, [isPaused, remainingSeconds]);\n\n return (\n <div\n className={`jkl-countdown ${className ?? \"\"}`}\n role=\"timer\"\n data-testid=\"jkl-countdown\"\n {...rest}\n >\n <span\n className=\"jkl-countdown__tracker\"\n role=\"presentation\"\n style={\n {\n \"--duration\": `${from}ms`,\n \"--play-state\": isPaused ? \"paused\" : \"running\",\n } as CSSProperties\n }\n data-testid=\"jkl-countdown__tracker\"\n />\n <span className=\"jkl-sr-only\">{remainingSeconds}</span>\n </div>\n );\n};\n"],"names":["className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"0JAG6C,EACzCA,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAAAA,SAC5CC,KAAKC,MAAMP,EAAO,MAGtBQ,OAAAA,EAAAA,WAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUE,IAGVQ,EAAAA,KAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAAA,IAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MAAA"}
1
+ {"version":3,"file":"Countdown.cjs","sources":["../../../../src/components/countdown/Countdown.tsx"],"sourcesContent":["import React, { useState, type CSSProperties, type FC, useEffect } from \"react\";\nimport type { CountdownProps } from \"./types.js\";\n\nexport const Countdown: FC<CountdownProps> = ({\n className,\n from,\n isPaused,\n ...rest\n}) => {\n const [remainingSeconds, setRemainingSeconds] = useState(\n Math.floor(from / 1000),\n );\n\n useEffect(() => {\n if (remainingSeconds <= 0) {\n return;\n }\n\n setTimeout(() => {\n if (!isPaused) {\n setRemainingSeconds((sec) => sec - 1);\n }\n }, 1000);\n }, [isPaused, remainingSeconds]);\n\n return (\n <div\n className={`jkl-countdown ${className ?? \"\"}`}\n role=\"timer\"\n data-testid=\"jkl-countdown\"\n {...rest}\n >\n <span\n className=\"jkl-countdown__tracker\"\n role=\"presentation\"\n style={\n {\n \"--duration\": `${from}ms`,\n \"--play-state\": isPaused ? \"paused\" : \"running\",\n } as CSSProperties\n }\n data-testid=\"jkl-countdown__tracker\"\n />\n <span className=\"jkl-sr-only\">{remainingSeconds}</span>\n </div>\n );\n};\n"],"names":["className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"0JAG6C,EACzCA,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAAAA,SAC5CC,KAAKC,MAAMP,EAAO,MAGtBQ,OAAAA,EAAAA,WAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUE,IAGVQ,EAAAA,KAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAAA,IAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MACpD"}