@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":"utils.js","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":["filter","allItems","inputValue","keys","matchSorter"],"mappings":"2CAEgB,SAAAA,EACZC,EACAC,EACAC,GAGA,OAAKD,EAGEE,EAAYH,EAAUC,EAJbC,EAAO,CAAEA,KAAAA,GAAS,CAAA,GAEvBF,CAGf"}
1
+ {"version":3,"file":"utils.js","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":["filter","allItems","inputValue","keys","matchSorter"],"mappings":"2CAEgB,SAAAA,EACZC,EACAC,EACAC,GAGA,OAAKD,EAGEE,EAAYH,EAAUC,EAJbC,EAAO,CAAEA,KAAAA,GAAS,CAAC,GAExBF,CAGf"}
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumb.js","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":["Breadcrumb","className","children","density","rest","numberOfChildren","React","Children","count","jsx","clsx","map","child","index","isLastElement","jsxs","Fragment","isValidElement","cloneElement"],"mappings":"mIAIO,MAAMA,EAAa,EACtBC,UAAAA,EACAC,SAAAA,EACAC,QAAAA,KACGC,MAEH,MAAMC,EAAmBC,EAAMC,SAASC,MAAMN,GAE1C,OAAAO,EAAC,MAAA,CACG,aAAW,MACXR,UAAWS,EAAK,iBAAkBT,GAClC,sBAAqBE,KACjBC,EAEJF,SAAAO,EAAC,KAAG,CAAAR,UAAU,uBACTC,SAAAI,EAAMC,SAASI,IAAIT,GAAU,CAACU,EAAOC,KAC5BC,MAAAA,EAAgBD,EAAQ,IAAMR,EACpC,OAESU,EAAAC,EAAA,CAAAd,SAAA,CAAMI,EAAAW,eAAoCL,GACrCN,EAAMY,aACFN,EACA,CACIE,cAAAA,IAGRF,GACJE,GACEL,EAAC,OAAA,CACGR,UAAU,iCACV,cAAY,OACfC,SAAA,QAIT,OAGZ"}
1
+ {"version":3,"file":"Breadcrumb.js","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":["Breadcrumb","className","children","density","rest","numberOfChildren","React","Children","count","jsx","clsx","map","child","index","isLastElement","jsxs","Fragment","isValidElement","cloneElement"],"mappings":"mIAIO,MAAMA,EAAa,EACtBC,UAAAA,EACAC,SAAAA,EACAC,QAAAA,KACGC,MAEH,MAAMC,EAAmBC,EAAMC,SAASC,MAAMN,GAE1C,OAAAO,EAAC,MAAA,CACG,aAAW,MACXR,UAAWS,EAAK,iBAAkBT,GAClC,sBAAqBE,KACjBC,EAEJF,SAAAO,EAAC,KAAG,CAAAR,UAAU,uBACTC,SAAAI,EAAMC,SAASI,IAAIT,GAAU,CAACU,EAAOC,KAC5BC,MAAAA,EAAgBD,EAAQ,IAAMR,EACpC,OAESU,EAAAC,EAAA,CAAAd,SAAA,CAAMI,EAAAW,eAAoCL,GACrCN,EAAMY,aACFN,EACA,CACIE,cAAAA,IAGRF,GACJE,GACEL,EAAC,OAAA,CACGR,UAAU,iCACV,cAAY,OACfC,SAAA,QAIT,OAIhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BreadcrumbItem.stories.js","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","parameters","layout","tags","argTypes","isLastElement","control","BreadcrumbItem","args","children","jsx","href","decorators","Story","Breadcrumb"],"mappings":"iMAMA,MAAMA,EAAO,CACTC,MAAO,wCACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,cAAe,CACXC,QAAS,aAQRC,EAAwB,CACjCC,KAAM,CACFC,SAAUC,EAAC,IAAE,CAAAC,KAAK,yBAAyBF,SAAW,iBAE1DG,WAAaC,KACRC,EACG,CAAAL,SAAAC,EAACG,GAAM"}
1
+ {"version":3,"file":"BreadcrumbItem.stories.js","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","parameters","layout","tags","argTypes","isLastElement","control","BreadcrumbItem","args","children","jsx","href","decorators","Story","Breadcrumb"],"mappings":"iMAMA,MAAMA,EAAO,CACTC,MAAO,wCACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,cAAe,CACXC,QAAS,aAQRC,EAAwB,CACjCC,KAAM,CACFC,SAAUC,EAAC,IAAE,CAAAC,KAAK,yBAAyBF,SAAW,iBAE1DG,WAAaC,KACRC,EACG,CAAAL,SAAAC,EAACG"}
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonDocs.js","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":["ButtonExample","showLoader","setShowLoader","useState","simulateLoading","useCallback","setTimeout","jsxs","Flex","direction","gap","justifyContent","alignItems","children","jsx","Button","variant","loader","textDescription","onClick"],"mappings":"oLAIO,MAAMA,EAAgB,KAEnB,MAACC,EAAYC,GAAiBC,GAAS,GAEvCC,EAAkBC,GAAY,KAChCH,GAAc,GACdI,YAAW,KACPJ,GAAc,EAAK,GACpB,KAAI,GACR,IAGC,OAAAK,EAACC,EAAA,CACGC,UAAU,SACVC,IAAK,GACLC,eAAe,gBACfC,WAAW,SAEXC,SAAA,CAAAC,EAACC,EAAA,CACGC,QAAQ,UACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,sBAGDC,EAACC,EAAA,CACGC,QAAQ,YACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,UAGDC,EAACC,EAAA,CACGC,QAAQ,WACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,WAIAC,EAAAC,EAAA,CAAOC,QAAQ,QAAQH,SAAY,mBAAA"}
1
+ {"version":3,"file":"ButtonDocs.js","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":["ButtonExample","showLoader","setShowLoader","useState","simulateLoading","useCallback","setTimeout","jsxs","Flex","direction","gap","justifyContent","alignItems","children","jsx","Button","variant","loader","textDescription","onClick"],"mappings":"oLAIO,MAAMA,EAAgB,KAEnB,MAACC,EAAYC,GAAiBC,GAAS,GAEvCC,EAAkBC,GAAY,KAChCH,GAAc,GACdI,YAAW,KACPJ,GAAc,EAAK,GACpB,KAAI,GACR,IAGC,OAAAK,EAACC,EAAA,CACGC,UAAU,SACVC,IAAK,GACLC,eAAe,gBACfC,WAAW,SAEXC,SAAA,CAAAC,EAACC,EAAA,CACGC,QAAQ,UACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,sBAGDC,EAACC,EAAA,CACGC,QAAQ,YACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,UAGDC,EAACC,EAAA,CACGC,QAAQ,WACRC,OAAQ,CACJhB,WAAAA,EACAiB,gBAAiB,kBAErBC,QAASf,EACZS,SAAA,WAIAC,EAAAC,EAAA,CAAOC,QAAQ,QAAQH,SAAY,mBACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavCard.js","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":["InfoBlock","children","jsx","className","NavCardTag","text","type","density","CardTag","InfoTag","SuccessTag","WarningTag","ErrorTag","Tag","getTag","NavCard","React","forwardRef","props","ref","component","padding","image","tag","title","external","description","rest","Component","tagArr","Array","isArray","jsxs","clsx","Image","style","getPaddingStyles","map","t","index","displayName"],"mappings":"4SAkBa,MAAAA,EAA8B,EAAGC,SAAAA,KACzCC,EAAA,MAAA,CAAIC,UAAU,qBAAsBF,SAAAA,IAoCnCG,EAAa,EACfC,KAAAA,EACAC,KAAAA,EACAC,QAAAA,MAEMC,MAAAA,EAnBK,CAACF,IACZ,OAAQA,GACJ,IAAK,OACMG,OAAAA,EACX,IAAK,UACMC,OAAAA,EACX,IAAK,UACMC,OAAAA,EACX,IAAK,QACMC,OAAAA,EACX,QACWC,OAAAA,EACf,EAOgBC,CAAOR,GAChB,OAAAJ,EAACM,EAAQ,CAAAD,QAAAA,EAAmBN,SAAKI,GAAA,EAG/BU,EAA4BC,EAAMC,YAG7C,CAACC,EAAOC,KACA,MACFC,UAAAA,EAAY,IACZC,QAAAA,EAAU,IACVC,MAAAA,EACAC,IAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAzB,SAAAA,EACAE,UAAAA,EACAI,QAAAA,KACGoB,GACHT,EAEEU,EAAYR,EAEZS,EAAUN,EAAkBO,MAAMC,QAAQR,GAAOA,EAAM,CAACA,QAAxC,EAGlB,OAAAS,EAACJ,EAAA,CACGT,IAAAA,EACA,aAAYK,EACZrB,UAAW8B,EAAK,eAAgB9B,GAChC,eAAcI,KACVoB,EAEH1B,SAAA,CAAAqB,GAAUpB,EAAAgC,EAAA,CAAM/B,UAAU,yBAA0BmB,IACrDU,EAAC,MAAA,CACG7B,UAAU,wBACVgC,MAAOC,EAAiBf,GAEvBpB,SAAA,CACG4B,GAAA3B,EAAC,OAAIC,UAAU,4BACVF,WAAOoC,KAAI,CAACC,EAAGC,IACZrC,EAACE,EAAA,CACGE,KAAMgC,EAAEhC,KACRD,KAAMiC,EAAEjC,MACHkC,SAKpB,MACG,CAAAtC,SAAA,CAAAC,EAAC,IAAA,CACGC,UAAW8B,EACP,qBACAR,EAAW,+BAAiC,IAG/CxB,SAAAuB,IAEJE,GACGxB,EAAC,IAAE,CAAAC,UAAU,gDACRF,SACLyB,OAGPzB,OACL,IAKZc,EAAQyB,YAAc"}
1
+ {"version":3,"file":"NavCard.js","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":["InfoBlock","children","jsx","className","NavCardTag","text","type","density","CardTag","InfoTag","SuccessTag","WarningTag","ErrorTag","Tag","getTag","NavCard","React","forwardRef","props","ref","component","padding","image","tag","title","external","description","rest","Component","tagArr","Array","isArray","jsxs","clsx","Image","style","getPaddingStyles","map","t","index","displayName"],"mappings":"4SAkBa,MAAAA,EAA8B,EAAGC,SAAAA,KACzCC,EAAA,MAAA,CAAIC,UAAU,qBAAsBF,SAAAA,IAoCnCG,EAAa,EACfC,KAAAA,EACAC,KAAAA,EACAC,QAAAA,MAEMC,MAAAA,EAnBK,CAACF,IACZ,OAAQA,GACJ,IAAK,OACMG,OAAAA,EACX,IAAK,UACMC,OAAAA,EACX,IAAK,UACMC,OAAAA,EACX,IAAK,QACMC,OAAAA,EACX,QACWC,OAAAA,EAAA,EAQCC,CAAOR,GAChB,OAAAJ,EAACM,EAAQ,CAAAD,QAAAA,EAAmBN,SAAKI,GAAA,EAG/BU,EAA4BC,EAAMC,YAG7C,CAACC,EAAOC,KACA,MACFC,UAAAA,EAAY,IACZC,QAAAA,EAAU,IACVC,MAAAA,EACAC,IAAAA,EACAC,MAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAzB,SAAAA,EACAE,UAAAA,EACAI,QAAAA,KACGoB,GACHT,EAEEU,EAAYR,EAEZS,EAAUN,EAAkBO,MAAMC,QAAQR,GAAOA,EAAM,CAACA,QAAxC,EAGlB,OAAAS,EAACJ,EAAA,CACGT,IAAAA,EACA,aAAYK,EACZrB,UAAW8B,EAAK,eAAgB9B,GAChC,eAAcI,KACVoB,EAEH1B,SAAA,CAAAqB,GAAUpB,EAAAgC,EAAA,CAAM/B,UAAU,yBAA0BmB,IACrDU,EAAC,MAAA,CACG7B,UAAU,wBACVgC,MAAOC,EAAiBf,GAEvBpB,SAAA,CACG4B,GAAA3B,EAAC,OAAIC,UAAU,4BACVF,WAAOoC,KAAI,CAACC,EAAGC,IACZrC,EAACE,EAAA,CACGE,KAAMgC,EAAEhC,KACRD,KAAMiC,EAAEjC,MACHkC,SAKpB,MACG,CAAAtC,SAAA,CAAAC,EAAC,IAAA,CACGC,UAAW8B,EACP,qBACAR,EAAW,+BAAiC,IAG/CxB,SAAAuB,IAEJE,GACGxB,EAAC,IAAE,CAAAC,UAAU,gDACRF,SACLyB,OAGPzB,OAET,IAIRc,EAAQyB,YAAc"}
@@ -1,2 +1,2 @@
1
- import{jsx as a,jsxs as r}from"react/jsx-runtime";import"react";import{formatValuta as e}from"../../../utilities/formatters/valuta/formatValuta.js";import{Flex as t}from"../../flex/Flex.js";import{ErrorTag as s}from"../../tag/Tag.js";import{Card as i}from"../Card.js";import{CARD_VARIANTS as o,CARD_PADDINGS as n}from"../types.js";const l={title:"Komponenter/Card",component:i,parameters:{layout:"centered"},tags:["autodocs"],args:{},argTypes:{variant:{control:"select",options:o},padding:{control:"select",options:n}}},d={args:{padding:"m",variant:"outlined",children:"Hei, verden!"}},c={args:{padding:"m",clickable:!0,variant:"outlined",children:""},render:({asChild:o,as:n,...l})=>a(i,{asChild:!0,...l,children:r(t,{as:"a",href:"#test",colGap:40,children:[r(t,{direction:"column",gap:4,children:[r("p",{className:"jkl-heading-2",children:[e(18856),a("span",{"aria-hidden":!0,children:" →"})]}),a("p",{className:"jkl-body",children:"Frist 20.03.2023"})]}),r(t,{direction:"column",gap:12,children:[a(s,{children:"Ubetalt"}),a("p",{className:"jkl-body",children:"Purring"})]})]})})};export{d as Card,c as Fakturainformasjon,l as default};
1
+ import{jsx as a,jsxs as r}from"react/jsx-runtime";import"react";import{formatValuta as e}from"../../../utilities/formatters/valuta/formatValuta.js";import{Flex as t}from"../../flex/Flex.js";import{ErrorTag as s}from"../../tag/Tag.js";import{Card as i}from"../Card.js";import{CARD_PADDINGS as o,CARD_VARIANTS as n}from"../types.js";const l={title:"Komponenter/Card",component:i,parameters:{layout:"centered"},tags:["autodocs"],args:{},argTypes:{variant:{control:"select",options:n},padding:{control:"select",options:o}}},d={args:{padding:"m",variant:"outlined",children:"Hei, verden!"}},c={args:{padding:"m",clickable:!0,variant:"outlined",children:""},render:({asChild:o,as:n,...l})=>a(i,{asChild:!0,...l,children:r(t,{as:"a",href:"#test",colGap:40,children:[r(t,{direction:"column",gap:4,children:[r("p",{className:"jkl-heading-2",children:[e(18856),a("span",{"aria-hidden":!0,children:" →"})]}),a("p",{className:"jkl-body",children:"Frist 20.03.2023"})]}),r(t,{direction:"column",gap:12,children:[a(s,{children:"Ubetalt"}),a("p",{className:"jkl-body",children:"Purring"})]})]})})};export{d as Card,c as Fakturainformasjon,l as default};
2
2
  //# sourceMappingURL=Card.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","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":"qOAUO,MAAMA,EAAWC,GACpB,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,EAAyB,MAC1CC,EACIb,GACA,IAAMW,EAASG,SACf,IAGEC,MAAAA,EAAUC,EAAMf,GAAM,eAAgB,CAAEgB,gBAAiBhB,IAE/D,OAAAiB,GAAU,MAEU,IAAZV,IACkB,IAAlBC,GACyB,eAAzBU,QAAQC,IAAIC,UAEJC,QAAAC,KACJ,wFAGJZ,EAASG,UACTH,EAASG,QAAQL,eAAiBD,KAAaC,EAAAA,GAEpD,CAACD,EAASC,IAGTe,EAAC,MAAA,CACGpB,UAAWqB,EAAK,eAAgBrB,EAAW,CACvC,uBAAwBC,EACxB,sBAAuBF,IAE3B,eAAcG,EAEdJ,SAAA,CAAAwB,EAAC,QAAA,CACGzB,GAAIc,EACJf,IAAKW,EACLP,UAAU,sBACV,cAAY,qBACZ,eAAcD,EACdwB,KAAK,WACL,kBAAiBpB,EACjBC,QAAAA,KACIE,IAEPc,EAAA,QAAA,CAAMI,QAASb,EAASX,UAAU,sBAC/BF,SAAA,CAACsB,EAAA,OAAA,CAAKpB,UAAU,qBACZF,SAAA,CAACwB,EAAA,OAAA,CAAKtB,UAAU,qCAChBsB,EAAC,OAAK,CAAAtB,UAAU,gCAEnBsB,EAAA,OAAA,CAAKtB,UAAU,qBAAsBF,SAAAA,SAC1C,IAMhBL,EAASgC,YAAc"}
1
+ {"version":3,"file":"Checkbox.js","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":"qOAUO,MAAMA,EAAWC,GACpB,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,EAAyB,MAC1CC,EACIb,GACA,IAAMW,EAASG,SACf,IAGEC,MAAAA,EAAUC,EAAMf,GAAM,eAAgB,CAAEgB,gBAAiBhB,IAE/D,OAAAiB,GAAU,MAEU,IAAZV,IACkB,IAAlBC,GACyB,eAAzBU,QAAQC,IAAIC,UAEJC,QAAAC,KACJ,wFAGJZ,EAASG,UACTH,EAASG,QAAQL,eAAiBD,KAAaC,EAAAA,GAEpD,CAACD,EAASC,IAGTe,EAAC,MAAA,CACGpB,UAAWqB,EAAK,eAAgBrB,EAAW,CACvC,uBAAwBC,EACxB,sBAAuBF,IAE3B,eAAcG,EAEdJ,SAAA,CAAAwB,EAAC,QAAA,CACGzB,GAAIc,EACJf,IAAKW,EACLP,UAAU,sBACV,cAAY,qBACZ,eAAcD,EACdwB,KAAK,WACL,kBAAiBpB,EACjBC,QAAAA,KACIE,IAEPc,EAAA,QAAA,CAAMI,QAASb,EAASX,UAAU,sBAC/BF,SAAA,CAACsB,EAAA,OAAA,CAAKpB,UAAU,qBACZF,SAAA,CAACwB,EAAA,OAAA,CAAKtB,UAAU,qCAChBsB,EAAC,OAAK,CAAAtB,UAAU,gCAEnBsB,EAAA,OAAA,CAAKtB,UAAU,qBAAsBF,SAAAA,SAE9C,IAKZL,EAASgC,YAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxPanel.stories.js","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","CheckboxPanelComponent","parameters","layout","tags","argTypes","alwaysOpen","table","defaultValue","summary","CheckboxPanel","args","label","children","jsx","extraLabel","jsxs","Flex","as","alignItems","justifyContent","gap","className","SuccessTag","decorators","Story","style","maxWidth"],"mappings":"4MAQA,MAAMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,UAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,WAAY,CACRC,MAAO,CACHC,aAAc,CACVC,aAAS,OAUhBC,EAAuB,CAChCC,KAAM,CACFC,MAAO,QACPC,SACKC,EAAA,IAAA,CAAED,SAIH,4IAEJE,WACIC,EAACC,EAAA,CACGC,GAAG,OACHC,WAAW,SACXC,eAAe,WACfC,IAAK,GACLC,UAAU,4EAEVT,SAAA,CAAAC,EAACS,GAAWV,SAAQ,aAAa,iBAK7CW,WAAaC,GACTX,EAAC,MAAI,CAAAY,MAAO,CAAEC,SAAU,KACpBd,SAACC,EAAAW,EAAA,CAAA"}
1
+ {"version":3,"file":"CheckboxPanel.stories.js","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","CheckboxPanelComponent","parameters","layout","tags","argTypes","alwaysOpen","table","defaultValue","summary","CheckboxPanel","args","label","children","jsx","extraLabel","jsxs","Flex","as","alignItems","justifyContent","gap","className","SuccessTag","decorators","Story","style","maxWidth"],"mappings":"4MAQA,MAAMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,UAEZC,KAAM,CAAC,YACPC,SAAU,CACNC,WAAY,CACRC,MAAO,CACHC,aAAc,CACVC,aAAS,OAUhBC,EAAuB,CAChCC,KAAM,CACFC,MAAO,QACPC,SACKC,EAAA,IAAA,CAAED,SAIH,4IAEJE,WACIC,EAACC,EAAA,CACGC,GAAG,OACHC,WAAW,SACXC,eAAe,WACfC,IAAK,GACLC,UAAU,4EAEVT,SAAA,CAAAC,EAACS,GAAWV,SAAQ,aAAa,iBAK7CW,WAAaC,GACTX,EAAC,MAAI,CAAAY,MAAO,CAAEC,SAAU,KACpBd,SAACC,EAAAW,EAAA,CAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","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.js","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.js","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","parameters","layout","tags","Combobox","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"gGAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEC,EAAkB,CAC3BC,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,EAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAD,EAAA,CAAA"}
1
+ {"version":3,"file":"Combobox.stories.js","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","parameters","layout","tags","Combobox","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"gGAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEC,EAAkB,CAC3BC,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,EAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAD,EAAA,CAAM"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{RequirementCheckbox as g}from"./RequirementCheckbox.js";import{setConsentCookie as p,convertBooleanConsentObjectToConsentObject as j}from"./cookieConsentUtils.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,cookiePath:x,requirement:O,isOpen:T,setIsOpen:D,updateCurrentConsents:I}=f(),[B,$]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{T?null==B||B.show():null==B||B.hide()}),[B,T]),o((()=>{const e=()=>D(!1);return null==B||B.on("hide",e),()=>{null==B||B.off("hide",e)}}),[B,D]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const q=(e=j({functional:!0,statistics:!0,marketing:!0},O))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};p({consent:n,name:y,domain:M,path:x}),I(),null==b||b(n),null==B||B.hide()};return a.createPortal(e(s,{...$.container,...C,"data-cookie-consent-open":T,children:[t(r,{...$.overlay}),e(l,{component:"form",...$.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=j({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},O);q(n)},children:[t(d,{children:t(c,{...$.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),O.functional&&t(g,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),O.statistics&&t(g,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),O.marketing&&t(g,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>q(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{RequirementCheckbox as g}from"./RequirementCheckbox.js";import{convertBooleanConsentObjectToConsentObject as p,setConsentCookie as j}from"./cookieConsentUtils.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,cookiePath:x,requirement:O,isOpen:T,setIsOpen:D,updateCurrentConsents:I}=f(),[B,$]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{T?null==B||B.show():null==B||B.hide()}),[B,T]),o((()=>{const e=()=>D(!1);return null==B||B.on("hide",e),()=>{null==B||B.off("hide",e)}}),[B,D]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const q=(e=p({functional:!0,statistics:!0,marketing:!0},O))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};j({consent:n,name:y,domain:M,path:x}),I(),null==b||b(n),null==B||B.hide()};return a.createPortal(e(s,{...$.container,...C,"data-cookie-consent-open":T,children:[t(r,{...$.overlay}),e(l,{component:"form",...$.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},O);q(n)},children:[t(d,{children:t(c,{...$.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),O.functional&&t(g,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),O.statistics&&t(g,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),O.marketing&&t(g,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>q(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
2
2
  //# sourceMappingURL=CookieConsent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.js","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":["CookieConsent","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":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAAM,GAEjC,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,GAAIC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOyB,EAASC,aACZC,EAACC,EAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAC,EAAA,IAAiBxC,EAAYyC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAChB,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,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAetD,EAAYK,MAAOiC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAACiB,EAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,kBAS5C2C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KAAA"}
1
+ {"version":3,"file":"CookieConsent.js","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":["CookieConsent","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":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAC1B,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,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,EAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOyB,EAASC,aACZC,EAACC,EAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAC,EAAA,IAAiBxC,EAAYyC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAChB,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,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAetD,EAAYK,MAAOiC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAACiB,EAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,kBAS5C2C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KACb"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsentContext.js","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","CookieConsentProvider","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","useInternalState","context","useContext","Error","useCookieConsent","openConsentModal","consents"],"mappings":"8NAYO,MAAMA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,GAEpDC,EAA8D,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaV,EACbW,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,GAAS,IAAMC,KAAKC,QAEhDC,EAAcC,GAChB,IAAMC,EAAwB,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAKtBY,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,GAAS,IAC1BY,EAAwBT,EAAaG,KAI5C,OAAAO,EAAC3B,EAAQ4B,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,EAKA4B,EAAmB,KACtBC,MAAAA,EAAUhC,EAAMiC,WAAWlC,GACjC,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,6DAIDF,OAAAA,CAAAA,EAQEG,EAAmB,KACtBH,MAAAA,EAAUC,EAAWlC,GAE3B,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEE,iBANgB,KACrBJ,EAAQR,WAAU,EAAI,EAKCa,SAFVL,EAAQF"}
1
+ {"version":3,"file":"CookieConsentContext.js","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","CookieConsentProvider","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","useInternalState","context","useContext","Error","useCookieConsent","openConsentModal","consents"],"mappings":"8NAYO,MAAMA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,GAEpDC,EAA8D,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaV,EACbW,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,GAAS,IAAMC,KAAKC,QAEhDC,EAAcC,GAChB,IAAMC,EAAwB,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAKtBY,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,GAAS,IAC1BY,EAAwBT,EAAaG,KAI5C,OAAAO,EAAC3B,EAAQ4B,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,EAIK4B,EAAmB,KACtBC,MAAAA,EAAUhC,EAAMiC,WAAWlC,GACjC,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,6DAIDF,OAAAA,CAAAA,EAQEG,EAAmB,KACtBH,MAAAA,EAAUC,EAAWlC,GAE3B,QAAgB,IAAZiC,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEE,iBANgB,KACrBJ,EAAQR,WAAU,EAAI,EAKCa,SAFVL,EAAQF,eAEW"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.stories.js","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":"oQAWA,MAAMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAC,GAmBFC,EAAuB,CAChCC,KAAM,CACFC,SACIC,GAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,IAE7B,SACK,MACG,CAAAH,SAAA,CAAAC,EAACG,EAAc,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAACK,GAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
1
+ {"version":3,"file":"CookieConsent.stories.js","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":"oQAWA,MAAMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAA,GAmBDC,EAAuB,CAChCC,KAAM,CACFC,SACIC,GAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,IAE7B,SACK,MACG,CAAAH,SAAA,CAAAC,EAACG,EAAc,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAACK,GAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"Countdown.js","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":["Countdown","className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"kGAGO,MAAMA,EAAgC,EACzCC,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAC5CC,KAAKC,MAAMP,EAAO,MAGtB,OAAAQ,GAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUE,IAGVQ,EAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MAAA"}
1
+ {"version":3,"file":"Countdown.js","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":["Countdown","className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"kGAGO,MAAMA,EAAgC,EACzCC,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAC5CC,KAAKC,MAAMP,EAAO,MAGtB,OAAAQ,GAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUE,IAGVQ,EAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MACpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"Countdown.stories.js","sources":["../../../../../src/components/countdown/stories/Countdown.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Countdown as CountdownComponent } from \"../Countdown.js\";\nimport \"../styles/_index.scss\";\nimport React, { type FC, useState } from \"react\";\nimport type { WithChildren } from \"../../../core/types.js\";\nimport { PrimaryButton } from \"../../button/Button.js\";\nimport { Flex } from \"../../flex/Flex.js\";\n\nconst meta = {\n title: \"Komponenter/Countdown\",\n component: CountdownComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof CountdownComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst Wrapper: FC<WithChildren> = ({ children }) => {\n const [key, setKey] = useState(0);\n\n return (\n <Flex style={{ width: 500 }} direction=\"column\" gap={24}>\n <div key={key}>{children}</div>\n <PrimaryButton\n onClick={() => setKey(Date.now())}\n style={{ width: 200 }}\n >\n Restart\n </PrimaryButton>\n </Flex>\n );\n};\n\nexport const Countdown: Story = {\n args: {\n from: 5000,\n },\n decorators: (Story) => (\n <Wrapper>\n <Story />\n </Wrapper>\n ),\n};\n"],"names":["meta","title","component","CountdownComponent","parameters","layout","tags","Wrapper","children","key","setKey","useState","jsxs","Flex","style","width","direction","gap","jsx","PrimaryButton","onClick","Date","now","Countdown","args","from","decorators","Story"],"mappings":"gOAQA,MAAMA,EAAO,CACTC,MAAO,wBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMLC,EAA4B,EAAGC,SAAAA,MACjC,MAAOC,EAAKC,GAAUC,EAAS,GAG3B,OAAAC,EAACC,EAAK,CAAAC,MAAO,CAAEC,MAAO,KAAOC,UAAU,SAASC,IAAK,GACjDT,SAAA,CAACU,EAAA,MAAA,CAAeV,SAAAA,GAANC,GACVS,EAACC,EAAA,CACGC,QAAS,IAAMV,EAAOW,KAAKC,OAC3BR,MAAO,CAAEC,MAAO,KACnBP,SAAA,cAGL,EAIKe,EAAmB,CAC5BC,KAAM,CACFC,KAAM,KAEVC,WAAaC,KACRpB,EACG,CAAAC,SAAAU,EAACS,GAAM"}
1
+ {"version":3,"file":"Countdown.stories.js","sources":["../../../../../src/components/countdown/stories/Countdown.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Countdown as CountdownComponent } from \"../Countdown.js\";\nimport \"../styles/_index.scss\";\nimport React, { type FC, useState } from \"react\";\nimport type { WithChildren } from \"../../../core/types.js\";\nimport { PrimaryButton } from \"../../button/Button.js\";\nimport { Flex } from \"../../flex/Flex.js\";\n\nconst meta = {\n title: \"Komponenter/Countdown\",\n component: CountdownComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof CountdownComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst Wrapper: FC<WithChildren> = ({ children }) => {\n const [key, setKey] = useState(0);\n\n return (\n <Flex style={{ width: 500 }} direction=\"column\" gap={24}>\n <div key={key}>{children}</div>\n <PrimaryButton\n onClick={() => setKey(Date.now())}\n style={{ width: 200 }}\n >\n Restart\n </PrimaryButton>\n </Flex>\n );\n};\n\nexport const Countdown: Story = {\n args: {\n from: 5000,\n },\n decorators: (Story) => (\n <Wrapper>\n <Story />\n </Wrapper>\n ),\n};\n"],"names":["meta","title","component","CountdownComponent","parameters","layout","tags","Wrapper","children","key","setKey","useState","jsxs","Flex","style","width","direction","gap","jsx","PrimaryButton","onClick","Date","now","Countdown","args","from","decorators","Story"],"mappings":"gOAQA,MAAMA,EAAO,CACTC,MAAO,wBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMLC,EAA4B,EAAGC,SAAAA,MACjC,MAAOC,EAAKC,GAAUC,EAAS,GAG3B,OAAAC,EAACC,EAAK,CAAAC,MAAO,CAAEC,MAAO,KAAOC,UAAU,SAASC,IAAK,GACjDT,SAAA,CAACU,EAAA,MAAA,CAAeV,SAAAA,GAANC,GACVS,EAACC,EAAA,CACGC,QAAS,IAAMV,EAAOW,KAAKC,OAC3BR,MAAO,CAAEC,MAAO,KACnBP,SAAA,cAGL,EAIKe,EAAmB,CAC5BC,KAAM,CACFC,KAAM,KAEVC,WAAaC,KACRpB,EACG,CAAAC,SAAAU,EAACS"}
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { startOfDay } from \"date-fns\";\nimport React, {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CalendarIcon } from \"../icon/icons/CalendarIcon.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport Popover from \"../popover/Popover.js\";\nimport { BaseTextInput } from \"../text-input/BaseTextInput.js\";\nimport { Calendar } from \"./internal/Calendar.js\";\nimport { type DateInfo, getInitialDate } from \"./internal/utils.js\";\nimport type { DatePickerProps, DateValidationError } from \"./types.js\";\nimport { formatInput, parseDateString } from \"./utils.js\";\nimport { isWithinLowerBound, isWithinUpperBound } from \"./validation.js\";\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(\n (props, forwardedInputRef) => {\n const {\n \"data-testautoid\": testAutoId,\n id,\n className = \"\",\n label = \"Velg dato\",\n labelProps,\n defaultValue,\n defaultShow = false,\n value,\n disableBeforeDate: disableBefore,\n disableAfterDate: disableAfter,\n yearsToShow,\n name,\n helpLabel,\n errorLabel,\n invalid,\n density,\n days,\n months,\n monthLabel,\n yearLabel,\n placeholder = \"dd.mm.åååå\",\n width = \"11.25rem\",\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n action,\n showCalendarLabel = \"Åpne kalender\",\n hideCalendarLabel = \"Lukk kalender\",\n supportLabelProps,\n tooltip,\n textInputProps,\n ...rest\n } = props;\n\n if (process.env.NODE_ENV !== \"production\" && value && defaultValue) {\n console.warn(\n \"DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.\",\n );\n }\n /// Input state\n\n const disableBeforeDate = parseDateString(disableBefore);\n const minDate = disableBeforeDate\n ? startOfDay(disableBeforeDate)\n : undefined;\n const disableAfterDate = parseDateString(disableAfter);\n const maxDate = disableAfterDate\n ? startOfDay(disableAfterDate)\n : undefined;\n\n const [date, setDate] = useState(\n getInitialDate(value, defaultValue, minDate, maxDate),\n );\n const [error, setError] = useState<DateValidationError | null>(null);\n\n /// Calendar state\n\n const [showCalendar, setShowCalendar] = useState(defaultShow);\n\n const calendarRef = useRef<HTMLDivElement>(null);\n const datepickerRef = useRef<HTMLDivElement>(null);\n\n /// Input events\n\n const iconButtonRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Hjelper for å gjøre det enklere å både forwarde refen men også bruke den selv internt\n const unifiedInputRef = useCallback(\n (instance: HTMLInputElement | null) => {\n inputRef.current = instance;\n if (forwardedInputRef) {\n if (typeof forwardedInputRef === \"function\") {\n forwardedInputRef(instance);\n } else {\n forwardedInputRef.current = instance;\n }\n }\n },\n [forwardedInputRef],\n );\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (!onFocus || !datepickerRef.current) {\n return;\n }\n\n const nextFocusIsInside = datepickerRef.current.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInside) {\n onFocus(e, date, { error, value: e.target.value });\n }\n },\n [onFocus, date, error],\n );\n\n const handleBlur = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(e, date, { error, value: e.target.value });\n }\n },\n [onBlur, date, error],\n );\n\n const handleKeyDownAction = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") {\n setShowCalendar(false);\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (action?.onKeyDown) {\n action.onKeyDown(e);\n }\n },\n [action],\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let nextDate: Date | null = null;\n let nextError: DateValidationError | null = null;\n\n if (e.target.value) {\n const val = parseDateString(e.target.value);\n if (!val) {\n nextError = \"WRONG_FORMAT\";\n } else if (minDate && !isWithinLowerBound(val, minDate)) {\n nextError = \"OUTSIDE_LOWER_BOUND\";\n } else if (maxDate && !isWithinUpperBound(val, maxDate)) {\n nextError = \"OUTSIDE_UPPER_BOUND\";\n } else {\n setShowCalendar(false);\n }\n nextDate = val || null;\n }\n\n setError(nextError);\n setDate(nextDate);\n\n if (onChange) {\n onChange(e, nextDate, {\n error: nextError,\n value: e.target.value,\n });\n }\n },\n [onChange, minDate, maxDate],\n );\n\n /// Calendar events\n\n const clickCalendar = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n flushSync(() => {\n setShowCalendar(!showCalendar);\n });\n\n const calendarEl = calendarRef.current;\n const button =\n calendarEl &&\n (calendarEl.querySelector(\n '[aria-pressed=\"true\"]',\n ) as HTMLButtonElement);\n // Make sure the popover-modal is correctly positioned before focusing a button\n // so we avoid accidentally scrolling to the top of the page\n window.requestAnimationFrame(() => button?.focus());\n\n if (action?.onClick) {\n action.onClick(e);\n }\n },\n [showCalendar, action],\n );\n\n const handleClickCalendarDay = useCallback(\n ({ date }: DateInfo) => {\n setShowCalendar(false);\n setDate(date);\n\n if (inputRef.current) {\n const node = inputRef.current;\n\n node.value = formatInput(date);\n\n // Simulér et change-event så APIet blir så likt som mulig en endring av inputfeltet\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"input\", true, false);\n node.dispatchEvent(event);\n\n node.focus();\n\n if (onChange) {\n // Det er ikke helt sant at dette er et React.SyntheticEvent, men it's fine – probably?\n // Den har tingene man kan forvente, men hvis du gjør serdeles fancy ting med events\n // så kan det hende du må utvide denne for å dekke behovet ditt.\n onChange(\n event as unknown as ChangeEvent<HTMLInputElement>,\n date,\n {\n error: null,\n value: node.value,\n },\n );\n }\n }\n },\n [onChange],\n );\n\n const handleTabOutsideCalendar = useCallback((e: KeyboardEvent) => {\n e.preventDefault();\n setShowCalendar(false);\n iconButtonRef.current?.focus();\n }, []);\n\n return (\n <InputGroup\n id={id}\n className={clsx(\"jkl-datepicker\", className)}\n {...rest}\n ref={datepickerRef}\n label={label}\n labelProps={labelProps}\n density={density}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n supportLabelProps={supportLabelProps}\n tooltip={tooltip}\n render={(inputProps) => (\n <BaseTextInput\n data-focused={showCalendar ? \"true\" : undefined}\n ref={unifiedInputRef}\n data-testid=\"jkl-datepicker__input\"\n data-testautoid={testAutoId}\n className=\"jkl-datepicker__input\"\n name={name}\n defaultValue={defaultValue}\n density={density}\n value={value}\n type=\"text\"\n placeholder={placeholder}\n width={width}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n actionButton={\n <Popover\n positionReference={inputRef}\n open={showCalendar}\n onOpenChange={() =>\n setShowCalendar(!showCalendar)\n }\n offset={8}\n >\n <Popover.Trigger\n {...action}\n data-testid=\"jkl-datepicker__trigger\"\n className=\"jkl-text-input-action-button\"\n title={\n showCalendar\n ? hideCalendarLabel\n : showCalendarLabel\n }\n tabIndex={0}\n onClick={clickCalendar}\n onKeyDown={handleKeyDownAction}\n asChild\n >\n <IconButton>\n <CalendarIcon />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content initialFocus={-1} padding={24}>\n <Calendar\n ref={calendarRef}\n density={density}\n date={date}\n minDate={minDate}\n maxDate={maxDate}\n days={days}\n months={months}\n monthLabel={monthLabel}\n yearLabel={yearLabel}\n yearsToShow={yearsToShow}\n onDateSelected={handleClickCalendarDay}\n onTabOutside={handleTabOutsideCalendar}\n />\n </Popover.Content>\n </Popover>\n }\n {...textInputProps}\n {...inputProps}\n aria-invalid={invalid || !!errorLabel}\n />\n )}\n />\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n"],"names":["DatePicker","forwardRef","props","forwardedInputRef","testAutoId","id","className","label","labelProps","defaultValue","defaultShow","value","disableBeforeDate","disableBefore","disableAfterDate","disableAfter","yearsToShow","name","helpLabel","errorLabel","invalid","density","days","months","monthLabel","yearLabel","placeholder","width","onChange","onBlur","onFocus","onKeyDown","action","showCalendarLabel","hideCalendarLabel","supportLabelProps","tooltip","textInputProps","rest","process","env","NODE_ENV","console","warn","parseDateString","minDate","startOfDay","maxDate","date","setDate","useState","getInitialDate","error","setError","showCalendar","setShowCalendar","calendarRef","useRef","datepickerRef","iconButtonRef","inputRef","unifiedInputRef","useCallback","instance","current","handleFocus","e","contains","relatedTarget","target","handleBlur","handleKeyDownAction","key","preventDefault","stopPropagation","handleChange","nextDate","nextError","val","isWithinLowerBound","isWithinUpperBound","clickCalendar","flushSync","calendarEl","button","querySelector","window","requestAnimationFrame","focus","onClick","handleClickCalendarDay","node","formatInput","event","document","createEvent","initEvent","dispatchEvent","handleTabOutsideCalendar","_a","jsx","InputGroup","clsx","ref","render","inputProps","BaseTextInput","type","actionButton","jsxs","Popover","positionReference","open","onOpenChange","offset","children","Trigger","title","tabIndex","asChild","IconButton","CalendarIcon","Content","initialFocus","padding","Calendar","onDateSelected","onTabOutside","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","sources":["../../../../src/components/datepicker/DatePicker.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport { startOfDay } from \"date-fns\";\nimport React, {\n type ChangeEvent,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CalendarIcon } from \"../icon/icons/CalendarIcon.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport Popover from \"../popover/Popover.js\";\nimport { BaseTextInput } from \"../text-input/BaseTextInput.js\";\nimport { Calendar } from \"./internal/Calendar.js\";\nimport { type DateInfo, getInitialDate } from \"./internal/utils.js\";\nimport type { DatePickerProps, DateValidationError } from \"./types.js\";\nimport { formatInput, parseDateString } from \"./utils.js\";\nimport { isWithinLowerBound, isWithinUpperBound } from \"./validation.js\";\n\nexport const DatePicker = forwardRef<HTMLInputElement, DatePickerProps>(\n (props, forwardedInputRef) => {\n const {\n \"data-testautoid\": testAutoId,\n id,\n className = \"\",\n label = \"Velg dato\",\n labelProps,\n defaultValue,\n defaultShow = false,\n value,\n disableBeforeDate: disableBefore,\n disableAfterDate: disableAfter,\n yearsToShow,\n name,\n helpLabel,\n errorLabel,\n invalid,\n density,\n days,\n months,\n monthLabel,\n yearLabel,\n placeholder = \"dd.mm.åååå\",\n width = \"11.25rem\",\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n action,\n showCalendarLabel = \"Åpne kalender\",\n hideCalendarLabel = \"Lukk kalender\",\n supportLabelProps,\n tooltip,\n textInputProps,\n ...rest\n } = props;\n\n if (process.env.NODE_ENV !== \"production\" && value && defaultValue) {\n console.warn(\n \"DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.\",\n );\n }\n /// Input state\n\n const disableBeforeDate = parseDateString(disableBefore);\n const minDate = disableBeforeDate\n ? startOfDay(disableBeforeDate)\n : undefined;\n const disableAfterDate = parseDateString(disableAfter);\n const maxDate = disableAfterDate\n ? startOfDay(disableAfterDate)\n : undefined;\n\n const [date, setDate] = useState(\n getInitialDate(value, defaultValue, minDate, maxDate),\n );\n const [error, setError] = useState<DateValidationError | null>(null);\n\n /// Calendar state\n\n const [showCalendar, setShowCalendar] = useState(defaultShow);\n\n const calendarRef = useRef<HTMLDivElement>(null);\n const datepickerRef = useRef<HTMLDivElement>(null);\n\n /// Input events\n\n const iconButtonRef = useRef<HTMLButtonElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Hjelper for å gjøre det enklere å både forwarde refen men også bruke den selv internt\n const unifiedInputRef = useCallback(\n (instance: HTMLInputElement | null) => {\n inputRef.current = instance;\n if (forwardedInputRef) {\n if (typeof forwardedInputRef === \"function\") {\n forwardedInputRef(instance);\n } else {\n forwardedInputRef.current = instance;\n }\n }\n },\n [forwardedInputRef],\n );\n\n const handleFocus = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (!onFocus || !datepickerRef.current) {\n return;\n }\n\n const nextFocusIsInside = datepickerRef.current.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInside) {\n onFocus(e, date, { error, value: e.target.value });\n }\n },\n [onFocus, date, error],\n );\n\n const handleBlur = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(e, date, { error, value: e.target.value });\n }\n },\n [onBlur, date, error],\n );\n\n const handleKeyDownAction = useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") {\n setShowCalendar(false);\n e.preventDefault();\n e.stopPropagation();\n }\n\n if (action?.onKeyDown) {\n action.onKeyDown(e);\n }\n },\n [action],\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let nextDate: Date | null = null;\n let nextError: DateValidationError | null = null;\n\n if (e.target.value) {\n const val = parseDateString(e.target.value);\n if (!val) {\n nextError = \"WRONG_FORMAT\";\n } else if (minDate && !isWithinLowerBound(val, minDate)) {\n nextError = \"OUTSIDE_LOWER_BOUND\";\n } else if (maxDate && !isWithinUpperBound(val, maxDate)) {\n nextError = \"OUTSIDE_UPPER_BOUND\";\n } else {\n setShowCalendar(false);\n }\n nextDate = val || null;\n }\n\n setError(nextError);\n setDate(nextDate);\n\n if (onChange) {\n onChange(e, nextDate, {\n error: nextError,\n value: e.target.value,\n });\n }\n },\n [onChange, minDate, maxDate],\n );\n\n /// Calendar events\n\n const clickCalendar = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n flushSync(() => {\n setShowCalendar(!showCalendar);\n });\n\n const calendarEl = calendarRef.current;\n const button =\n calendarEl &&\n (calendarEl.querySelector(\n '[aria-pressed=\"true\"]',\n ) as HTMLButtonElement);\n // Make sure the popover-modal is correctly positioned before focusing a button\n // so we avoid accidentally scrolling to the top of the page\n window.requestAnimationFrame(() => button?.focus());\n\n if (action?.onClick) {\n action.onClick(e);\n }\n },\n [showCalendar, action],\n );\n\n const handleClickCalendarDay = useCallback(\n ({ date }: DateInfo) => {\n setShowCalendar(false);\n setDate(date);\n\n if (inputRef.current) {\n const node = inputRef.current;\n\n node.value = formatInput(date);\n\n // Simulér et change-event så APIet blir så likt som mulig en endring av inputfeltet\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"input\", true, false);\n node.dispatchEvent(event);\n\n node.focus();\n\n if (onChange) {\n // Det er ikke helt sant at dette er et React.SyntheticEvent, men it's fine – probably?\n // Den har tingene man kan forvente, men hvis du gjør serdeles fancy ting med events\n // så kan det hende du må utvide denne for å dekke behovet ditt.\n onChange(\n event as unknown as ChangeEvent<HTMLInputElement>,\n date,\n {\n error: null,\n value: node.value,\n },\n );\n }\n }\n },\n [onChange],\n );\n\n const handleTabOutsideCalendar = useCallback((e: KeyboardEvent) => {\n e.preventDefault();\n setShowCalendar(false);\n iconButtonRef.current?.focus();\n }, []);\n\n return (\n <InputGroup\n id={id}\n className={clsx(\"jkl-datepicker\", className)}\n {...rest}\n ref={datepickerRef}\n label={label}\n labelProps={labelProps}\n density={density}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n supportLabelProps={supportLabelProps}\n tooltip={tooltip}\n render={(inputProps) => (\n <BaseTextInput\n data-focused={showCalendar ? \"true\" : undefined}\n ref={unifiedInputRef}\n data-testid=\"jkl-datepicker__input\"\n data-testautoid={testAutoId}\n className=\"jkl-datepicker__input\"\n name={name}\n defaultValue={defaultValue}\n density={density}\n value={value}\n type=\"text\"\n placeholder={placeholder}\n width={width}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n actionButton={\n <Popover\n positionReference={inputRef}\n open={showCalendar}\n onOpenChange={() =>\n setShowCalendar(!showCalendar)\n }\n offset={8}\n >\n <Popover.Trigger\n {...action}\n data-testid=\"jkl-datepicker__trigger\"\n className=\"jkl-text-input-action-button\"\n title={\n showCalendar\n ? hideCalendarLabel\n : showCalendarLabel\n }\n tabIndex={0}\n onClick={clickCalendar}\n onKeyDown={handleKeyDownAction}\n asChild\n >\n <IconButton>\n <CalendarIcon />\n </IconButton>\n </Popover.Trigger>\n <Popover.Content initialFocus={-1} padding={24}>\n <Calendar\n ref={calendarRef}\n density={density}\n date={date}\n minDate={minDate}\n maxDate={maxDate}\n days={days}\n months={months}\n monthLabel={monthLabel}\n yearLabel={yearLabel}\n yearsToShow={yearsToShow}\n onDateSelected={handleClickCalendarDay}\n onTabOutside={handleTabOutsideCalendar}\n />\n </Popover.Content>\n </Popover>\n }\n {...textInputProps}\n {...inputProps}\n aria-invalid={invalid || !!errorLabel}\n />\n )}\n />\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n"],"names":["DatePicker","forwardRef","props","forwardedInputRef","testAutoId","id","className","label","labelProps","defaultValue","defaultShow","value","disableBeforeDate","disableBefore","disableAfterDate","disableAfter","yearsToShow","name","helpLabel","errorLabel","invalid","density","days","months","monthLabel","yearLabel","placeholder","width","onChange","onBlur","onFocus","onKeyDown","action","showCalendarLabel","hideCalendarLabel","supportLabelProps","tooltip","textInputProps","rest","process","env","NODE_ENV","console","warn","parseDateString","minDate","startOfDay","maxDate","date","setDate","useState","getInitialDate","error","setError","showCalendar","setShowCalendar","calendarRef","useRef","datepickerRef","iconButtonRef","inputRef","unifiedInputRef","useCallback","instance","current","handleFocus","e","contains","relatedTarget","target","handleBlur","handleKeyDownAction","key","preventDefault","stopPropagation","handleChange","nextDate","nextError","val","isWithinLowerBound","isWithinUpperBound","clickCalendar","flushSync","calendarEl","button","querySelector","window","requestAnimationFrame","focus","onClick","handleClickCalendarDay","node","formatInput","event","document","createEvent","initEvent","dispatchEvent","handleTabOutsideCalendar","_a","jsx","InputGroup","clsx","ref","render","inputProps","BaseTextInput","type","actionButton","jsxs","Popover","positionReference","open","onOpenChange","offset","children","Trigger","title","tabIndex","asChild","IconButton","CalendarIcon","Content","initialFocus","padding","Calendar","onDateSelected","onTabOutside","displayName"],"mappings":"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"}