@fremtind/jokul 0.64.2 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. package/build/build-stats.html +1 -1
  2. package/build/cjs/components/ScreenReaderOnly.cjs.map +1 -1
  3. package/build/cjs/components/accordion/Accordion.cjs.map +1 -1
  4. package/build/cjs/components/accordion/AccordionItem.cjs.map +1 -1
  5. package/build/cjs/components/autosuggest/Autosuggest.cjs.map +1 -1
  6. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
  7. package/build/cjs/components/autosuggest/ControllerButton.cjs +1 -1
  8. package/build/cjs/components/autosuggest/ControllerButton.cjs.map +1 -1
  9. package/build/cjs/components/autosuggest/Menu.cjs +1 -1
  10. package/build/cjs/components/autosuggest/Menu.cjs.map +1 -1
  11. package/build/cjs/components/breadcrumb/Breadcrumb.cjs.map +1 -1
  12. package/build/cjs/components/breadcrumb/BreadcrumbItem.cjs.map +1 -1
  13. package/build/cjs/components/button/Button.cjs +1 -1
  14. package/build/cjs/components/button/Button.cjs.map +1 -1
  15. package/build/cjs/components/button/types.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/InfoCard.cjs.map +1 -1
  19. package/build/cjs/components/card/NavCard.cjs.map +1 -1
  20. package/build/cjs/components/card/TaskCard.cjs.map +1 -1
  21. package/build/cjs/components/card/development/examples/FakturainfoExample.d.cts +1 -1
  22. package/build/cjs/components/card/development/examples/InfoCardExample.d.cts +1 -1
  23. package/build/cjs/components/card/development/examples/NavCardExample.d.cts +1 -1
  24. package/build/cjs/components/card/development/examples/StatuskortExample.d.cts +1 -1
  25. package/build/cjs/components/card/development/examples/TaskCardExample.d.cts +1 -1
  26. package/build/cjs/components/card/development/examples/TopExample.d.cts +1 -1
  27. package/build/cjs/components/card/types.cjs.map +1 -1
  28. package/build/cjs/components/card/utils.cjs.map +1 -1
  29. package/build/cjs/components/checkbox/Checkbox.cjs.map +1 -1
  30. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs +1 -1
  31. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs.map +1 -1
  32. package/build/cjs/components/chip/Chip.cjs.map +1 -1
  33. package/build/cjs/components/combobox/Combobox.cjs +1 -1
  34. package/build/cjs/components/combobox/Combobox.cjs.map +1 -1
  35. package/build/cjs/components/combobox/stories/Combobox.stories.cjs.map +1 -1
  36. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  37. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  38. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
  39. package/build/cjs/components/cookie-consent/RequirementCheckbox.cjs.map +1 -1
  40. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs +1 -1
  41. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs.map +1 -1
  42. package/build/cjs/components/cookie-consent/stories/CookieConsent.stories.cjs.map +1 -1
  43. package/build/cjs/components/countdown/Countdown.cjs +1 -1
  44. package/build/cjs/components/countdown/Countdown.cjs.map +1 -1
  45. package/build/cjs/components/countdown/stories/Countdown.stories.cjs.map +1 -1
  46. package/build/cjs/components/datepicker/DatePicker.cjs +1 -1
  47. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  48. package/build/cjs/components/datepicker/index.d.cts +1 -1
  49. package/build/cjs/components/datepicker/internal/Calendar.cjs +1 -1
  50. package/build/cjs/components/datepicker/internal/Calendar.cjs.map +1 -1
  51. package/build/cjs/components/datepicker/internal/calendarReducer.cjs.map +1 -1
  52. package/build/cjs/components/datepicker/internal/useCalendar.cjs.map +1 -1
  53. package/build/cjs/components/datepicker/internal/useCalendar.d.cts +1 -1
  54. package/build/cjs/components/datepicker/internal/utils.cjs +1 -1
  55. package/build/cjs/components/datepicker/internal/utils.cjs.map +1 -1
  56. package/build/cjs/components/datepicker/utils.cjs +1 -1
  57. package/build/cjs/components/datepicker/utils.cjs.map +1 -1
  58. package/build/cjs/components/datepicker/validation.cjs.map +1 -1
  59. package/build/cjs/components/description-list/DescriptionList.cjs.map +1 -1
  60. package/build/cjs/components/description-list/stories/DescriptionList.stories.cjs.map +1 -1
  61. package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
  62. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  63. package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
  64. package/build/cjs/components/expander/Expander.cjs +1 -1
  65. package/build/cjs/components/expander/Expander.cjs.map +1 -1
  66. package/build/cjs/components/expander/context.cjs.map +1 -1
  67. package/build/cjs/components/expander/deprecated/ExpandSection.cjs.map +1 -1
  68. package/build/cjs/components/expander/deprecated/Expander.cjs +1 -1
  69. package/build/cjs/components/expander/deprecated/Expander.cjs.map +1 -1
  70. package/build/cjs/components/expander/index.d.cts +1 -1
  71. package/build/cjs/components/expander/stories/Expander.stories.cjs.map +1 -1
  72. package/build/cjs/components/expander/stories/ExpanderPanel.stories.cjs.map +1 -1
  73. package/build/cjs/components/feedback/Feedback.cjs.map +1 -1
  74. package/build/cjs/components/feedback/FeedbackSuccess.cjs.map +1 -1
  75. package/build/cjs/components/feedback/FeedbackValues.cjs.map +1 -1
  76. package/build/cjs/components/feedback/feedbackContext.cjs.map +1 -1
  77. package/build/cjs/components/feedback/followup/Followup.cjs +1 -1
  78. package/build/cjs/components/feedback/followup/Followup.cjs.map +1 -1
  79. package/build/cjs/components/feedback/followup/followupContext.cjs.map +1 -1
  80. package/build/cjs/components/feedback/followup/useFollowup.cjs.map +1 -1
  81. package/build/cjs/components/feedback/index.d.cts +1 -1
  82. package/build/cjs/components/feedback/main-question/MainQuestion.cjs +1 -1
  83. package/build/cjs/components/feedback/main-question/MainQuestion.cjs.map +1 -1
  84. package/build/cjs/components/feedback/main-question/mainQuestionContext.cjs.map +1 -1
  85. package/build/cjs/components/feedback/main-question/useMainQuestion.cjs.map +1 -1
  86. package/build/cjs/components/feedback/main-question/useMainQuestion.d.cts +2 -2
  87. package/build/cjs/components/feedback/presets.cjs.map +1 -1
  88. package/build/cjs/components/feedback/questions/AddonQuestion.cjs.map +1 -1
  89. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs +1 -1
  90. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs.map +1 -1
  91. package/build/cjs/components/feedback/questions/ContactQuestion.cjs +1 -1
  92. package/build/cjs/components/feedback/questions/ContactQuestion.cjs.map +1 -1
  93. package/build/cjs/components/feedback/questions/RadioQuestion.cjs +1 -1
  94. package/build/cjs/components/feedback/questions/RadioQuestion.cjs.map +1 -1
  95. package/build/cjs/components/feedback/questions/SmileyQuestion.cjs.map +1 -1
  96. package/build/cjs/components/feedback/questions/TextQuestion.cjs +1 -1
  97. package/build/cjs/components/feedback/questions/TextQuestion.cjs.map +1 -1
  98. package/build/cjs/components/feedback/questions/smileyUtils.cjs.map +1 -1
  99. package/build/cjs/components/feedback/utils.cjs.map +1 -1
  100. package/build/cjs/components/file-input/File.cjs +1 -1
  101. package/build/cjs/components/file-input/File.cjs.map +1 -1
  102. package/build/cjs/components/file-input/FileInput.cjs +1 -1
  103. package/build/cjs/components/file-input/FileInput.cjs.map +1 -1
  104. package/build/cjs/components/file-input/internal/Dropzone.cjs.map +1 -1
  105. package/build/cjs/components/file-input/internal/Input.cjs +1 -1
  106. package/build/cjs/components/file-input/internal/Input.cjs.map +1 -1
  107. package/build/cjs/components/file-input/internal/MaxSize.cjs.map +1 -1
  108. package/build/cjs/components/file-input/internal/Thumbnail.cjs.map +1 -1
  109. package/build/cjs/components/file-input/internal/fileInputContext.cjs.map +1 -1
  110. package/build/cjs/components/file-input/internal/validateFile.cjs.map +1 -1
  111. package/build/cjs/components/file-input/utils.cjs +1 -1
  112. package/build/cjs/components/file-input/utils.cjs.map +1 -1
  113. package/build/cjs/components/flex/Flex.cjs.map +1 -1
  114. package/build/cjs/components/flex/stories/Flex.stories.cjs.map +1 -1
  115. package/build/cjs/components/icon/Icon.cjs.map +1 -1
  116. package/build/cjs/components/icon/icons/ArrowDownIcon.cjs.map +1 -1
  117. package/build/cjs/components/icon/icons/ArrowLeftIcon.cjs.map +1 -1
  118. package/build/cjs/components/icon/icons/ArrowNorthEastIcon.cjs.map +1 -1
  119. package/build/cjs/components/icon/icons/ArrowRightIcon.cjs.map +1 -1
  120. package/build/cjs/components/icon/icons/ArrowUpIcon.cjs.map +1 -1
  121. package/build/cjs/components/icon/icons/CalendarIcon.cjs.map +1 -1
  122. package/build/cjs/components/icon/icons/CheckIcon.cjs.map +1 -1
  123. package/build/cjs/components/icon/icons/ChevronDownIcon.cjs.map +1 -1
  124. package/build/cjs/components/icon/icons/ChevronLeftIcon.cjs.map +1 -1
  125. package/build/cjs/components/icon/icons/ChevronRightIcon.cjs.map +1 -1
  126. package/build/cjs/components/icon/icons/ChevronUpIcon.cjs.map +1 -1
  127. package/build/cjs/components/icon/icons/CloseIcon.cjs.map +1 -1
  128. package/build/cjs/components/icon/icons/CopyIcon.cjs.map +1 -1
  129. package/build/cjs/components/icon/icons/DotsIcon.cjs.map +1 -1
  130. package/build/cjs/components/icon/icons/DragIcon.cjs.map +1 -1
  131. package/build/cjs/components/icon/icons/ErrorIcon.cjs.map +1 -1
  132. package/build/cjs/components/icon/icons/GreenCheckIcon.cjs.map +1 -1
  133. package/build/cjs/components/icon/icons/HamburgerIcon.cjs.map +1 -1
  134. package/build/cjs/components/icon/icons/InfoIcon.cjs.map +1 -1
  135. package/build/cjs/components/icon/icons/LinkIcon.cjs.map +1 -1
  136. package/build/cjs/components/icon/icons/MinusIcon.cjs.map +1 -1
  137. package/build/cjs/components/icon/icons/OpenInNewIcon.cjs.map +1 -1
  138. package/build/cjs/components/icon/icons/PenIcon.cjs.map +1 -1
  139. package/build/cjs/components/icon/icons/PlusIcon.cjs.map +1 -1
  140. package/build/cjs/components/icon/icons/QuestionIcon.cjs.map +1 -1
  141. package/build/cjs/components/icon/icons/RedCrossIcon.cjs.map +1 -1
  142. package/build/cjs/components/icon/icons/SearchIcon.cjs.map +1 -1
  143. package/build/cjs/components/icon/icons/SuccessIcon.cjs.map +1 -1
  144. package/build/cjs/components/icon/icons/ThumbDownIcon.cjs.map +1 -1
  145. package/build/cjs/components/icon/icons/ThumbUpIcon.cjs.map +1 -1
  146. package/build/cjs/components/icon/icons/TrashCanIcon.cjs.map +1 -1
  147. package/build/cjs/components/icon/icons/WarningIcon.cjs.map +1 -1
  148. package/build/cjs/components/icon/icons/animated/ArrowHorizontalAnimated.cjs.map +1 -1
  149. package/build/cjs/components/icon/icons/animated/ArrowVerticalAnimated.cjs.map +1 -1
  150. package/build/cjs/components/icon/icons/animated/PlusRemoveAnimated.cjs.map +1 -1
  151. package/build/cjs/components/icon/stories/Icons.stories.cjs.map +1 -1
  152. package/build/cjs/components/icon/stories/internal/AnimatedIcon.cjs +2 -0
  153. package/build/cjs/components/icon/stories/internal/AnimatedIcon.cjs.map +1 -0
  154. package/build/cjs/components/icon/stories/internal/IconExample.cjs +2 -0
  155. package/build/cjs/components/icon/stories/internal/IconExample.cjs.map +1 -0
  156. package/build/cjs/components/icon/stories/internal/IconsExampleGrid.cjs +2 -0
  157. package/build/cjs/components/icon/stories/internal/IconsExampleGrid.cjs.map +1 -0
  158. package/build/cjs/components/icon-button/IconButton.cjs.map +1 -1
  159. package/build/cjs/components/icon-button/stories/IconButton.stories.cjs.map +1 -1
  160. package/build/cjs/components/image/Image.cjs.map +1 -1
  161. package/build/cjs/components/image/stories/Image.stories.cjs.map +1 -1
  162. package/build/cjs/components/image/useImageLoadingStatus.cjs.map +1 -1
  163. package/build/cjs/components/input-group/FieldGroup.cjs.map +1 -1
  164. package/build/cjs/components/input-group/InputGroup.cjs.map +1 -1
  165. package/build/cjs/components/input-group/Label.cjs.map +1 -1
  166. package/build/cjs/components/input-group/SupportLabel.cjs.map +1 -1
  167. package/build/cjs/components/input-group/stories/FieldGroup.stories.cjs.map +1 -1
  168. package/build/cjs/components/input-group/stories/InputGroup.stories.cjs.map +1 -1
  169. package/build/cjs/components/input-group/stories/Label.stories.cjs.map +1 -1
  170. package/build/cjs/components/input-group/stories/SupportLabel.stories.cjs.map +1 -1
  171. package/build/cjs/components/link/Link.cjs.map +1 -1
  172. package/build/cjs/components/link/stories/Link.stories.cjs.map +1 -1
  173. package/build/cjs/components/link-list/LinkList.cjs.map +1 -1
  174. package/build/cjs/components/link-list/index.d.cts +1 -1
  175. package/build/cjs/components/link-list/stories/LinkList.stories.cjs.map +1 -1
  176. package/build/cjs/components/list/List.cjs.map +1 -1
  177. package/build/cjs/components/list/ListItem.cjs.map +1 -1
  178. package/build/cjs/components/loader/Loader.cjs.map +1 -1
  179. package/build/cjs/components/loader/skeletons/SkeletonAnimation.cjs.map +1 -1
  180. package/build/cjs/components/loader/skeletons/SkeletonButton.cjs.map +1 -1
  181. package/build/cjs/components/loader/skeletons/SkeletonCheckboxGroup.cjs.map +1 -1
  182. package/build/cjs/components/loader/skeletons/SkeletonElement.cjs.map +1 -1
  183. package/build/cjs/components/loader/skeletons/SkeletonInput.cjs.map +1 -1
  184. package/build/cjs/components/loader/skeletons/SkeletonLabel.cjs.map +1 -1
  185. package/build/cjs/components/loader/skeletons/SkeletonRadioButtonGroup.cjs.map +1 -1
  186. package/build/cjs/components/loader/skeletons/SkeletonTable.cjs.map +1 -1
  187. package/build/cjs/components/loader/skeletons/SkeletonTextArea.cjs.map +1 -1
  188. package/build/cjs/components/loader/stories/Skeleton.stories.cjs.map +1 -1
  189. package/build/cjs/components/loader/useDelayedRender.cjs +1 -1
  190. package/build/cjs/components/loader/useDelayedRender.cjs.map +1 -1
  191. package/build/cjs/components/logo/Logo.cjs.map +1 -1
  192. package/build/cjs/components/logo/LogoStamp.cjs.map +1 -1
  193. package/build/cjs/components/logo/stories/Logo.stories.cjs.map +1 -1
  194. package/build/cjs/components/logo/stories/LogoStamp.stories.cjs.map +1 -1
  195. package/build/cjs/components/logo/text-paths/ForsikringLevertAvFremtind.cjs.map +1 -1
  196. package/build/cjs/components/logo/text-paths/FraSB1ogDNB.cjs.map +1 -1
  197. package/build/cjs/components/logo/text-paths/InnovasjonFraFremtind.cjs.map +1 -1
  198. package/build/cjs/components/logo/text-paths/TeknologiFraFremtind.cjs.map +1 -1
  199. package/build/cjs/components/logo/text-paths/VartEgetForsikringsselskap.cjs.map +1 -1
  200. package/build/cjs/components/logo/text-paths/VartForsikringsselskap.cjs.map +1 -1
  201. package/build/cjs/components/menu/Menu.cjs.map +1 -1
  202. package/build/cjs/components/menu/MenuItem.cjs.map +1 -1
  203. package/build/cjs/components/menu/MenuItemCheckbox.cjs.map +1 -1
  204. package/build/cjs/components/menu/stories/Menu.stories.cjs.map +1 -1
  205. package/build/cjs/components/menu/stories/MenuDivider.stories.cjs.map +1 -1
  206. package/build/cjs/components/menu/stories/MenuItem.stories.cjs.map +1 -1
  207. package/build/cjs/components/menu/stories/MenuItemCheckbox.stories.cjs.map +1 -1
  208. package/build/cjs/components/menu/types.d.cts +2 -2
  209. package/build/cjs/components/menu/useMenuWideEvents.cjs +1 -1
  210. package/build/cjs/components/menu/useMenuWideEvents.cjs.map +1 -1
  211. package/build/cjs/components/message/DismissButton.cjs.map +1 -1
  212. package/build/cjs/components/message/FormErrorMessage.cjs.map +1 -1
  213. package/build/cjs/components/message/Message.cjs +1 -1
  214. package/build/cjs/components/message/Message.cjs.map +1 -1
  215. package/build/cjs/components/message/stories/ErrorMessage.stories.cjs.map +1 -1
  216. package/build/cjs/components/message/stories/FormErrorMessage.stories.cjs.map +1 -1
  217. package/build/cjs/components/message/stories/InfoMessage.stories.cjs.map +1 -1
  218. package/build/cjs/components/message/stories/SuccessMessage.stories.cjs.map +1 -1
  219. package/build/cjs/components/message/stories/WarningMessage.stories.cjs.map +1 -1
  220. package/build/cjs/components/modal/Modal.cjs +1 -1
  221. package/build/cjs/components/modal/Modal.cjs.map +1 -1
  222. package/build/cjs/components/modal/stories/CompleteModal.stories.cjs.map +1 -1
  223. package/build/cjs/components/modal/stories/ModalCloseButton.stories.cjs +1 -1
  224. package/build/cjs/components/modal/stories/ModalCloseButton.stories.cjs.map +1 -1
  225. package/build/cjs/components/modal/stories/ModalOverlay.stories.cjs.map +1 -1
  226. package/build/cjs/components/modal/useModal.cjs.map +1 -1
  227. package/build/cjs/components/nav-link/NavLink.cjs.map +1 -1
  228. package/build/cjs/components/nav-link/stories/NavLink.stories.cjs.map +1 -1
  229. package/build/cjs/components/pagination/PageButton.cjs.map +1 -1
  230. package/build/cjs/components/pagination/Pagination.cjs +1 -1
  231. package/build/cjs/components/pagination/Pagination.cjs.map +1 -1
  232. package/build/cjs/components/pagination/stories/Pagination.stories.cjs.map +1 -1
  233. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  234. package/build/cjs/components/popover/stories/PopoverControlled.stories.cjs.map +1 -1
  235. package/build/cjs/components/popover/stories/PopoverUncontrolled.stories.cjs.map +1 -1
  236. package/build/cjs/components/popover/types.d.cts +1 -1
  237. package/build/cjs/components/progress-bar/ProgressBar.cjs +1 -1
  238. package/build/cjs/components/progress-bar/ProgressBar.cjs.map +1 -1
  239. package/build/cjs/components/progress-bar/stories/ProgressBar.stories.cjs.map +1 -1
  240. package/build/cjs/components/radio-button/BaseRadioButton.cjs.map +1 -1
  241. package/build/cjs/components/radio-button/RadioButton.cjs.map +1 -1
  242. package/build/cjs/components/radio-button/RadioButtonGroup.cjs.map +1 -1
  243. package/build/cjs/components/radio-button/radioGroupContext.cjs.map +1 -1
  244. package/build/cjs/components/radio-button/stories/BaseRadioButton.stories.cjs.map +1 -1
  245. package/build/cjs/components/radio-button/stories/RadioButton.stories.cjs.map +1 -1
  246. package/build/cjs/components/radio-button/stories/RadioButtonGroup.stories.cjs.map +1 -1
  247. package/build/cjs/components/radio-panel/RadioPanel.cjs.map +1 -1
  248. package/build/cjs/components/radio-panel/RadioPanelGroup.cjs.map +1 -1
  249. package/build/cjs/components/select/NativeSelect.cjs.map +1 -1
  250. package/build/cjs/components/select/Select.cjs +1 -1
  251. package/build/cjs/components/select/Select.cjs.map +1 -1
  252. package/build/cjs/components/select/stories/select.stories.cjs.map +1 -1
  253. package/build/cjs/components/summary-table/SummaryTable.cjs.map +1 -1
  254. package/build/cjs/components/summary-table/SummaryTableRow.cjs.map +1 -1
  255. package/build/cjs/components/summary-table/stories/summary-table.stories.cjs.map +1 -1
  256. package/build/cjs/components/system-message/SystemMessage.cjs +1 -1
  257. package/build/cjs/components/system-message/SystemMessage.cjs.map +1 -1
  258. package/build/cjs/components/system-message/common/DismissButton.cjs.map +1 -1
  259. package/build/cjs/components/system-message/common/MessageIcon.cjs.map +1 -1
  260. package/build/cjs/components/table/DataTable.cjs.map +1 -1
  261. package/build/cjs/components/table/ExpandableTableRow.cjs +1 -1
  262. package/build/cjs/components/table/ExpandableTableRow.cjs.map +1 -1
  263. package/build/cjs/components/table/ExpandableTableRowController.cjs.map +1 -1
  264. package/build/cjs/components/table/Table.cjs.map +1 -1
  265. package/build/cjs/components/table/TableBody.cjs.map +1 -1
  266. package/build/cjs/components/table/TableCaption.cjs.map +1 -1
  267. package/build/cjs/components/table/TableCell.cjs.map +1 -1
  268. package/build/cjs/components/table/TableColumn.cjs.map +1 -1
  269. package/build/cjs/components/table/TableColumnGroup.cjs.map +1 -1
  270. package/build/cjs/components/table/TableFooter.cjs.map +1 -1
  271. package/build/cjs/components/table/TableHead.cjs.map +1 -1
  272. package/build/cjs/components/table/TableHeader.cjs.map +1 -1
  273. package/build/cjs/components/table/TablePagination.cjs +1 -1
  274. package/build/cjs/components/table/TablePagination.cjs.map +1 -1
  275. package/build/cjs/components/table/TableRow.cjs.map +1 -1
  276. package/build/cjs/components/table/tableContext.cjs.map +1 -1
  277. package/build/cjs/components/table/tableSectionContext.cjs.map +1 -1
  278. package/build/cjs/components/table/utils.cjs.map +1 -1
  279. package/build/cjs/components/tabs/NavTab.cjs.map +1 -1
  280. package/build/cjs/components/tabs/NavTabs.cjs.map +1 -1
  281. package/build/cjs/components/tabs/Tab.cjs.map +1 -1
  282. package/build/cjs/components/tabs/TabList.cjs.map +1 -1
  283. package/build/cjs/components/tabs/TabPanel.cjs.map +1 -1
  284. package/build/cjs/components/tabs/Tabs.cjs.map +1 -1
  285. package/build/cjs/components/tabs/stories/Tabs.stories.cjs.map +1 -1
  286. package/build/cjs/components/tabs/tabsContext.cjs.map +1 -1
  287. package/build/cjs/components/tabs/types.d.cts +1 -1
  288. package/build/cjs/components/tag/Tag.cjs.map +1 -1
  289. package/build/cjs/components/tag/index.d.cts +1 -1
  290. package/build/cjs/components/tag/stories/Tag.stories.cjs.map +1 -1
  291. package/build/cjs/components/text-area/BaseTextArea.cjs.map +1 -1
  292. package/build/cjs/components/text-area/TextArea.cjs.map +1 -1
  293. package/build/cjs/components/text-area/stories/TextArea.stories.cjs.map +1 -1
  294. package/build/cjs/components/text-input/BaseTextInput.cjs.map +1 -1
  295. package/build/cjs/components/text-input/TextInput.cjs.map +1 -1
  296. package/build/cjs/components/toast/Toast.cjs +1 -1
  297. package/build/cjs/components/toast/Toast.cjs.map +1 -1
  298. package/build/cjs/components/toast/ToastRegion.cjs +1 -1
  299. package/build/cjs/components/toast/ToastRegion.cjs.map +1 -1
  300. package/build/cjs/components/toast/index.d.cts +1 -1
  301. package/build/cjs/components/toast/toastContext.cjs.map +1 -1
  302. package/build/cjs/components/toggle-switch/ToggleSlider.cjs.map +1 -1
  303. package/build/cjs/components/toggle-switch/ToggleSwitch.cjs.map +1 -1
  304. package/build/cjs/components/toggle-switch/stories/ToggleSwitch.stories.cjs.map +1 -1
  305. package/build/cjs/components/toggle-switch/usePillStyles.cjs +1 -1
  306. package/build/cjs/components/toggle-switch/usePillStyles.cjs.map +1 -1
  307. package/build/cjs/components/tooltip/PopupTip.cjs.map +1 -1
  308. package/build/cjs/components/tooltip/Tooltip.cjs +1 -1
  309. package/build/cjs/components/tooltip/Tooltip.cjs.map +1 -1
  310. package/build/cjs/components/tooltip/TooltipContent.cjs.map +1 -1
  311. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs +1 -1
  312. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs.map +1 -1
  313. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs +1 -1
  314. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs.map +1 -1
  315. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs +1 -1
  316. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs.map +1 -1
  317. package/build/cjs/hooks/useBrowserPreferences/useBrowserPreferences.cjs.map +1 -1
  318. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs +1 -1
  319. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
  320. package/build/cjs/hooks/useElementDimensions/useElementDimensions.cjs.map +1 -1
  321. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs +1 -1
  322. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs.map +1 -1
  323. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs +1 -1
  324. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs.map +1 -1
  325. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.d.cts +1 -1
  326. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs +1 -1
  327. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs.map +1 -1
  328. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs +1 -1
  329. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs.map +1 -1
  330. package/build/cjs/hooks/useMutationObserver/useMutationObserver.cjs.map +1 -1
  331. package/build/cjs/hooks/useProgressiveImg/useProgressiveImg.cjs.map +1 -1
  332. package/build/cjs/hooks/useScreen/index.d.cts +1 -1
  333. package/build/cjs/hooks/useScreen/useScreen.cjs +1 -1
  334. package/build/cjs/hooks/useScreen/useScreen.cjs.map +1 -1
  335. package/build/cjs/hooks/useScrollIntoView/useScrollIntoView.cjs.map +1 -1
  336. package/build/cjs/hooks/useSwipeGesture/useSwipeGesture.cjs.map +1 -1
  337. package/build/cjs/hooks/useSwipeGesture/useSwipeGesture.d.cts +1 -1
  338. package/build/cjs/shared/input-panel/BasePanel.cjs.map +1 -1
  339. package/build/cjs/utilities/formatters/avstand/formatAvstand.cjs.map +1 -1
  340. package/build/cjs/utilities/formatters/bytes/formatBytes.cjs.map +1 -1
  341. package/build/cjs/utilities/formatters/util/parseNumber.cjs.map +1 -1
  342. package/build/cjs/utilities/formatters/valuta/formatValuta.cjs +1 -1
  343. package/build/cjs/utilities/formatters/valuta/formatValuta.cjs.map +1 -1
  344. package/build/cjs/utilities/getThemeAndDensity.cjs +1 -1
  345. package/build/cjs/utilities/getThemeAndDensity.cjs.map +1 -1
  346. package/build/cjs/utilities/polymorphism/mergeRefs.cjs +1 -1
  347. package/build/cjs/utilities/polymorphism/mergeRefs.cjs.map +1 -1
  348. package/build/cjs/utilities/tabListener.cjs +1 -1
  349. package/build/cjs/utilities/tabListener.cjs.map +1 -1
  350. package/build/es/components/ScreenReaderOnly.js.map +1 -1
  351. package/build/es/components/accordion/Accordion.js.map +1 -1
  352. package/build/es/components/accordion/AccordionItem.js.map +1 -1
  353. package/build/es/components/autosuggest/Autosuggest.js.map +1 -1
  354. package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
  355. package/build/es/components/autosuggest/ControllerButton.js +1 -1
  356. package/build/es/components/autosuggest/ControllerButton.js.map +1 -1
  357. package/build/es/components/autosuggest/Menu.js +1 -1
  358. package/build/es/components/autosuggest/Menu.js.map +1 -1
  359. package/build/es/components/breadcrumb/Breadcrumb.js.map +1 -1
  360. package/build/es/components/breadcrumb/BreadcrumbItem.js.map +1 -1
  361. package/build/es/components/button/Button.js +1 -1
  362. package/build/es/components/button/Button.js.map +1 -1
  363. package/build/es/components/button/types.js.map +1 -1
  364. package/build/es/components/card/Card.js.map +1 -1
  365. package/build/es/components/card/CardImage.js.map +1 -1
  366. package/build/es/components/card/InfoCard.js.map +1 -1
  367. package/build/es/components/card/NavCard.js.map +1 -1
  368. package/build/es/components/card/TaskCard.js.map +1 -1
  369. package/build/es/components/card/development/examples/FakturainfoExample.d.ts +1 -1
  370. package/build/es/components/card/development/examples/InfoCardExample.d.ts +1 -1
  371. package/build/es/components/card/development/examples/NavCardExample.d.ts +1 -1
  372. package/build/es/components/card/development/examples/StatuskortExample.d.ts +1 -1
  373. package/build/es/components/card/development/examples/TaskCardExample.d.ts +1 -1
  374. package/build/es/components/card/development/examples/TopExample.d.ts +1 -1
  375. package/build/es/components/card/types.js.map +1 -1
  376. package/build/es/components/card/utils.js.map +1 -1
  377. package/build/es/components/checkbox/Checkbox.js.map +1 -1
  378. package/build/es/components/checkbox-panel/CheckboxPanel.js +1 -1
  379. package/build/es/components/checkbox-panel/CheckboxPanel.js.map +1 -1
  380. package/build/es/components/chip/Chip.js.map +1 -1
  381. package/build/es/components/combobox/Combobox.js +1 -1
  382. package/build/es/components/combobox/Combobox.js.map +1 -1
  383. package/build/es/components/combobox/stories/Combobox.stories.js.map +1 -1
  384. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  385. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  386. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
  387. package/build/es/components/cookie-consent/RequirementCheckbox.js.map +1 -1
  388. package/build/es/components/cookie-consent/cookieConsentUtils.js +1 -1
  389. package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -1
  390. package/build/es/components/cookie-consent/stories/CookieConsent.stories.js.map +1 -1
  391. package/build/es/components/countdown/Countdown.js +1 -1
  392. package/build/es/components/countdown/Countdown.js.map +1 -1
  393. package/build/es/components/countdown/stories/Countdown.stories.js.map +1 -1
  394. package/build/es/components/datepicker/DatePicker.js +1 -1
  395. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  396. package/build/es/components/datepicker/index.d.ts +1 -1
  397. package/build/es/components/datepicker/internal/Calendar.js +1 -1
  398. package/build/es/components/datepicker/internal/Calendar.js.map +1 -1
  399. package/build/es/components/datepicker/internal/calendarReducer.js.map +1 -1
  400. package/build/es/components/datepicker/internal/useCalendar.d.ts +1 -1
  401. package/build/es/components/datepicker/internal/useCalendar.js.map +1 -1
  402. package/build/es/components/datepicker/internal/utils.js +1 -1
  403. package/build/es/components/datepicker/internal/utils.js.map +1 -1
  404. package/build/es/components/datepicker/utils.js +1 -1
  405. package/build/es/components/datepicker/utils.js.map +1 -1
  406. package/build/es/components/datepicker/validation.js.map +1 -1
  407. package/build/es/components/description-list/DescriptionList.js.map +1 -1
  408. package/build/es/components/description-list/stories/DescriptionList.stories.js.map +1 -1
  409. package/build/es/components/expander/ExpandablePanel.js +1 -1
  410. package/build/es/components/expander/ExpandablePanel.js.map +1 -1
  411. package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
  412. package/build/es/components/expander/Expander.js +1 -1
  413. package/build/es/components/expander/Expander.js.map +1 -1
  414. package/build/es/components/expander/context.js.map +1 -1
  415. package/build/es/components/expander/deprecated/ExpandSection.js.map +1 -1
  416. package/build/es/components/expander/deprecated/Expander.js +1 -1
  417. package/build/es/components/expander/deprecated/Expander.js.map +1 -1
  418. package/build/es/components/expander/index.d.ts +1 -1
  419. package/build/es/components/expander/stories/Expander.stories.js.map +1 -1
  420. package/build/es/components/expander/stories/ExpanderPanel.stories.js.map +1 -1
  421. package/build/es/components/feedback/Feedback.js.map +1 -1
  422. package/build/es/components/feedback/FeedbackSuccess.js.map +1 -1
  423. package/build/es/components/feedback/FeedbackValues.js.map +1 -1
  424. package/build/es/components/feedback/feedbackContext.js.map +1 -1
  425. package/build/es/components/feedback/followup/Followup.js +1 -1
  426. package/build/es/components/feedback/followup/Followup.js.map +1 -1
  427. package/build/es/components/feedback/followup/followupContext.js.map +1 -1
  428. package/build/es/components/feedback/followup/useFollowup.js.map +1 -1
  429. package/build/es/components/feedback/index.d.ts +1 -1
  430. package/build/es/components/feedback/main-question/MainQuestion.js +1 -1
  431. package/build/es/components/feedback/main-question/MainQuestion.js.map +1 -1
  432. package/build/es/components/feedback/main-question/mainQuestionContext.js.map +1 -1
  433. package/build/es/components/feedback/main-question/useMainQuestion.d.ts +2 -2
  434. package/build/es/components/feedback/main-question/useMainQuestion.js.map +1 -1
  435. package/build/es/components/feedback/presets.js.map +1 -1
  436. package/build/es/components/feedback/questions/AddonQuestion.js.map +1 -1
  437. package/build/es/components/feedback/questions/CheckboxQuestion.js +1 -1
  438. package/build/es/components/feedback/questions/CheckboxQuestion.js.map +1 -1
  439. package/build/es/components/feedback/questions/ContactQuestion.js +1 -1
  440. package/build/es/components/feedback/questions/ContactQuestion.js.map +1 -1
  441. package/build/es/components/feedback/questions/RadioQuestion.js +1 -1
  442. package/build/es/components/feedback/questions/RadioQuestion.js.map +1 -1
  443. package/build/es/components/feedback/questions/SmileyQuestion.js.map +1 -1
  444. package/build/es/components/feedback/questions/TextQuestion.js +1 -1
  445. package/build/es/components/feedback/questions/TextQuestion.js.map +1 -1
  446. package/build/es/components/feedback/questions/smileyUtils.js.map +1 -1
  447. package/build/es/components/feedback/utils.js.map +1 -1
  448. package/build/es/components/file-input/File.js +1 -1
  449. package/build/es/components/file-input/File.js.map +1 -1
  450. package/build/es/components/file-input/FileInput.js +1 -1
  451. package/build/es/components/file-input/FileInput.js.map +1 -1
  452. package/build/es/components/file-input/internal/Dropzone.js.map +1 -1
  453. package/build/es/components/file-input/internal/Input.js +1 -1
  454. package/build/es/components/file-input/internal/Input.js.map +1 -1
  455. package/build/es/components/file-input/internal/MaxSize.js.map +1 -1
  456. package/build/es/components/file-input/internal/Thumbnail.js.map +1 -1
  457. package/build/es/components/file-input/internal/fileInputContext.js.map +1 -1
  458. package/build/es/components/file-input/internal/validateFile.js.map +1 -1
  459. package/build/es/components/file-input/utils.js +1 -1
  460. package/build/es/components/file-input/utils.js.map +1 -1
  461. package/build/es/components/flex/Flex.js.map +1 -1
  462. package/build/es/components/flex/stories/Flex.stories.js.map +1 -1
  463. package/build/es/components/icon/Icon.js.map +1 -1
  464. package/build/es/components/icon/icons/ArrowDownIcon.js.map +1 -1
  465. package/build/es/components/icon/icons/ArrowLeftIcon.js.map +1 -1
  466. package/build/es/components/icon/icons/ArrowNorthEastIcon.js.map +1 -1
  467. package/build/es/components/icon/icons/ArrowRightIcon.js.map +1 -1
  468. package/build/es/components/icon/icons/ArrowUpIcon.js.map +1 -1
  469. package/build/es/components/icon/icons/CalendarIcon.js.map +1 -1
  470. package/build/es/components/icon/icons/CheckIcon.js.map +1 -1
  471. package/build/es/components/icon/icons/ChevronDownIcon.js.map +1 -1
  472. package/build/es/components/icon/icons/ChevronLeftIcon.js.map +1 -1
  473. package/build/es/components/icon/icons/ChevronRightIcon.js.map +1 -1
  474. package/build/es/components/icon/icons/ChevronUpIcon.js.map +1 -1
  475. package/build/es/components/icon/icons/CloseIcon.js.map +1 -1
  476. package/build/es/components/icon/icons/CopyIcon.js.map +1 -1
  477. package/build/es/components/icon/icons/DotsIcon.js.map +1 -1
  478. package/build/es/components/icon/icons/DragIcon.js.map +1 -1
  479. package/build/es/components/icon/icons/ErrorIcon.js.map +1 -1
  480. package/build/es/components/icon/icons/GreenCheckIcon.js.map +1 -1
  481. package/build/es/components/icon/icons/HamburgerIcon.js.map +1 -1
  482. package/build/es/components/icon/icons/InfoIcon.js.map +1 -1
  483. package/build/es/components/icon/icons/LinkIcon.js.map +1 -1
  484. package/build/es/components/icon/icons/MinusIcon.js.map +1 -1
  485. package/build/es/components/icon/icons/OpenInNewIcon.js.map +1 -1
  486. package/build/es/components/icon/icons/PenIcon.js.map +1 -1
  487. package/build/es/components/icon/icons/PlusIcon.js.map +1 -1
  488. package/build/es/components/icon/icons/QuestionIcon.js.map +1 -1
  489. package/build/es/components/icon/icons/RedCrossIcon.js.map +1 -1
  490. package/build/es/components/icon/icons/SearchIcon.js.map +1 -1
  491. package/build/es/components/icon/icons/SuccessIcon.js.map +1 -1
  492. package/build/es/components/icon/icons/ThumbDownIcon.js.map +1 -1
  493. package/build/es/components/icon/icons/ThumbUpIcon.js.map +1 -1
  494. package/build/es/components/icon/icons/TrashCanIcon.js.map +1 -1
  495. package/build/es/components/icon/icons/WarningIcon.js.map +1 -1
  496. package/build/es/components/icon/icons/animated/ArrowHorizontalAnimated.js.map +1 -1
  497. package/build/es/components/icon/icons/animated/ArrowVerticalAnimated.js.map +1 -1
  498. package/build/es/components/icon/icons/animated/PlusRemoveAnimated.js.map +1 -1
  499. package/build/es/components/icon/stories/Icons.stories.js.map +1 -1
  500. package/build/es/components/icon/stories/internal/AnimatedIcon.js +2 -0
  501. package/build/es/components/icon/stories/internal/AnimatedIcon.js.map +1 -0
  502. package/build/es/components/icon/stories/internal/IconExample.js +2 -0
  503. package/build/es/components/icon/stories/internal/IconExample.js.map +1 -0
  504. package/build/es/components/icon/stories/internal/IconsExampleGrid.js +2 -0
  505. package/build/es/components/icon/stories/internal/IconsExampleGrid.js.map +1 -0
  506. package/build/es/components/icon-button/IconButton.js.map +1 -1
  507. package/build/es/components/icon-button/stories/IconButton.stories.js.map +1 -1
  508. package/build/es/components/image/Image.js.map +1 -1
  509. package/build/es/components/image/stories/Image.stories.js.map +1 -1
  510. package/build/es/components/image/useImageLoadingStatus.js.map +1 -1
  511. package/build/es/components/input-group/FieldGroup.js.map +1 -1
  512. package/build/es/components/input-group/InputGroup.js.map +1 -1
  513. package/build/es/components/input-group/Label.js.map +1 -1
  514. package/build/es/components/input-group/SupportLabel.js.map +1 -1
  515. package/build/es/components/input-group/stories/FieldGroup.stories.js.map +1 -1
  516. package/build/es/components/input-group/stories/InputGroup.stories.js.map +1 -1
  517. package/build/es/components/input-group/stories/Label.stories.js.map +1 -1
  518. package/build/es/components/input-group/stories/SupportLabel.stories.js.map +1 -1
  519. package/build/es/components/link/Link.js.map +1 -1
  520. package/build/es/components/link/stories/Link.stories.js.map +1 -1
  521. package/build/es/components/link-list/LinkList.js.map +1 -1
  522. package/build/es/components/link-list/index.d.ts +1 -1
  523. package/build/es/components/link-list/stories/LinkList.stories.js.map +1 -1
  524. package/build/es/components/list/List.js.map +1 -1
  525. package/build/es/components/list/ListItem.js.map +1 -1
  526. package/build/es/components/loader/Loader.js.map +1 -1
  527. package/build/es/components/loader/skeletons/SkeletonAnimation.js.map +1 -1
  528. package/build/es/components/loader/skeletons/SkeletonButton.js.map +1 -1
  529. package/build/es/components/loader/skeletons/SkeletonCheckboxGroup.js.map +1 -1
  530. package/build/es/components/loader/skeletons/SkeletonElement.js.map +1 -1
  531. package/build/es/components/loader/skeletons/SkeletonInput.js.map +1 -1
  532. package/build/es/components/loader/skeletons/SkeletonLabel.js.map +1 -1
  533. package/build/es/components/loader/skeletons/SkeletonRadioButtonGroup.js.map +1 -1
  534. package/build/es/components/loader/skeletons/SkeletonTable.js.map +1 -1
  535. package/build/es/components/loader/skeletons/SkeletonTextArea.js.map +1 -1
  536. package/build/es/components/loader/stories/Skeleton.stories.js.map +1 -1
  537. package/build/es/components/loader/useDelayedRender.js +1 -1
  538. package/build/es/components/loader/useDelayedRender.js.map +1 -1
  539. package/build/es/components/logo/Logo.js.map +1 -1
  540. package/build/es/components/logo/LogoStamp.js.map +1 -1
  541. package/build/es/components/logo/stories/Logo.stories.js.map +1 -1
  542. package/build/es/components/logo/stories/LogoStamp.stories.js.map +1 -1
  543. package/build/es/components/logo/text-paths/ForsikringLevertAvFremtind.js.map +1 -1
  544. package/build/es/components/logo/text-paths/FraSB1ogDNB.js.map +1 -1
  545. package/build/es/components/logo/text-paths/InnovasjonFraFremtind.js.map +1 -1
  546. package/build/es/components/logo/text-paths/TeknologiFraFremtind.js.map +1 -1
  547. package/build/es/components/logo/text-paths/VartEgetForsikringsselskap.js.map +1 -1
  548. package/build/es/components/logo/text-paths/VartForsikringsselskap.js.map +1 -1
  549. package/build/es/components/menu/Menu.js.map +1 -1
  550. package/build/es/components/menu/MenuItem.js.map +1 -1
  551. package/build/es/components/menu/MenuItemCheckbox.js.map +1 -1
  552. package/build/es/components/menu/stories/Menu.stories.js.map +1 -1
  553. package/build/es/components/menu/stories/MenuDivider.stories.js.map +1 -1
  554. package/build/es/components/menu/stories/MenuItem.stories.js.map +1 -1
  555. package/build/es/components/menu/stories/MenuItemCheckbox.stories.js.map +1 -1
  556. package/build/es/components/menu/types.d.ts +2 -2
  557. package/build/es/components/menu/useMenuWideEvents.js +1 -1
  558. package/build/es/components/menu/useMenuWideEvents.js.map +1 -1
  559. package/build/es/components/message/DismissButton.js.map +1 -1
  560. package/build/es/components/message/FormErrorMessage.js.map +1 -1
  561. package/build/es/components/message/Message.js +1 -1
  562. package/build/es/components/message/Message.js.map +1 -1
  563. package/build/es/components/message/stories/ErrorMessage.stories.js.map +1 -1
  564. package/build/es/components/message/stories/FormErrorMessage.stories.js.map +1 -1
  565. package/build/es/components/message/stories/InfoMessage.stories.js.map +1 -1
  566. package/build/es/components/message/stories/SuccessMessage.stories.js.map +1 -1
  567. package/build/es/components/message/stories/WarningMessage.stories.js.map +1 -1
  568. package/build/es/components/modal/Modal.js +1 -1
  569. package/build/es/components/modal/Modal.js.map +1 -1
  570. package/build/es/components/modal/stories/CompleteModal.stories.js.map +1 -1
  571. package/build/es/components/modal/stories/ModalCloseButton.stories.js +1 -1
  572. package/build/es/components/modal/stories/ModalCloseButton.stories.js.map +1 -1
  573. package/build/es/components/modal/stories/ModalOverlay.stories.js.map +1 -1
  574. package/build/es/components/modal/useModal.js.map +1 -1
  575. package/build/es/components/nav-link/NavLink.js.map +1 -1
  576. package/build/es/components/nav-link/stories/NavLink.stories.js.map +1 -1
  577. package/build/es/components/pagination/PageButton.js.map +1 -1
  578. package/build/es/components/pagination/Pagination.js +1 -1
  579. package/build/es/components/pagination/Pagination.js.map +1 -1
  580. package/build/es/components/pagination/stories/Pagination.stories.js.map +1 -1
  581. package/build/es/components/popover/Popover.js.map +1 -1
  582. package/build/es/components/popover/stories/PopoverControlled.stories.js.map +1 -1
  583. package/build/es/components/popover/stories/PopoverUncontrolled.stories.js.map +1 -1
  584. package/build/es/components/popover/types.d.ts +1 -1
  585. package/build/es/components/progress-bar/ProgressBar.js +1 -1
  586. package/build/es/components/progress-bar/ProgressBar.js.map +1 -1
  587. package/build/es/components/progress-bar/stories/ProgressBar.stories.js.map +1 -1
  588. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -1
  589. package/build/es/components/radio-button/RadioButton.js.map +1 -1
  590. package/build/es/components/radio-button/RadioButtonGroup.js.map +1 -1
  591. package/build/es/components/radio-button/radioGroupContext.js.map +1 -1
  592. package/build/es/components/radio-button/stories/BaseRadioButton.stories.js.map +1 -1
  593. package/build/es/components/radio-button/stories/RadioButton.stories.js.map +1 -1
  594. package/build/es/components/radio-button/stories/RadioButtonGroup.stories.js.map +1 -1
  595. package/build/es/components/radio-panel/RadioPanel.js.map +1 -1
  596. package/build/es/components/radio-panel/RadioPanelGroup.js.map +1 -1
  597. package/build/es/components/select/NativeSelect.js.map +1 -1
  598. package/build/es/components/select/Select.js +1 -1
  599. package/build/es/components/select/Select.js.map +1 -1
  600. package/build/es/components/select/stories/select.stories.js.map +1 -1
  601. package/build/es/components/summary-table/SummaryTable.js.map +1 -1
  602. package/build/es/components/summary-table/SummaryTableRow.js.map +1 -1
  603. package/build/es/components/summary-table/stories/summary-table.stories.js.map +1 -1
  604. package/build/es/components/system-message/SystemMessage.js +1 -1
  605. package/build/es/components/system-message/SystemMessage.js.map +1 -1
  606. package/build/es/components/system-message/common/DismissButton.js.map +1 -1
  607. package/build/es/components/system-message/common/MessageIcon.js.map +1 -1
  608. package/build/es/components/table/DataTable.js.map +1 -1
  609. package/build/es/components/table/ExpandableTableRow.js +1 -1
  610. package/build/es/components/table/ExpandableTableRow.js.map +1 -1
  611. package/build/es/components/table/ExpandableTableRowController.js.map +1 -1
  612. package/build/es/components/table/Table.js.map +1 -1
  613. package/build/es/components/table/TableBody.js.map +1 -1
  614. package/build/es/components/table/TableCaption.js.map +1 -1
  615. package/build/es/components/table/TableCell.js.map +1 -1
  616. package/build/es/components/table/TableColumn.js.map +1 -1
  617. package/build/es/components/table/TableColumnGroup.js.map +1 -1
  618. package/build/es/components/table/TableFooter.js.map +1 -1
  619. package/build/es/components/table/TableHead.js.map +1 -1
  620. package/build/es/components/table/TableHeader.js.map +1 -1
  621. package/build/es/components/table/TablePagination.js +1 -1
  622. package/build/es/components/table/TablePagination.js.map +1 -1
  623. package/build/es/components/table/TableRow.js.map +1 -1
  624. package/build/es/components/table/tableContext.js.map +1 -1
  625. package/build/es/components/table/tableSectionContext.js.map +1 -1
  626. package/build/es/components/table/utils.js.map +1 -1
  627. package/build/es/components/tabs/NavTab.js.map +1 -1
  628. package/build/es/components/tabs/NavTabs.js.map +1 -1
  629. package/build/es/components/tabs/Tab.js.map +1 -1
  630. package/build/es/components/tabs/TabList.js.map +1 -1
  631. package/build/es/components/tabs/TabPanel.js.map +1 -1
  632. package/build/es/components/tabs/Tabs.js.map +1 -1
  633. package/build/es/components/tabs/stories/Tabs.stories.js.map +1 -1
  634. package/build/es/components/tabs/tabsContext.js.map +1 -1
  635. package/build/es/components/tabs/types.d.ts +1 -1
  636. package/build/es/components/tag/Tag.js.map +1 -1
  637. package/build/es/components/tag/index.d.ts +1 -1
  638. package/build/es/components/tag/stories/Tag.stories.js.map +1 -1
  639. package/build/es/components/text-area/BaseTextArea.js.map +1 -1
  640. package/build/es/components/text-area/TextArea.js.map +1 -1
  641. package/build/es/components/text-area/stories/TextArea.stories.js.map +1 -1
  642. package/build/es/components/text-input/BaseTextInput.js.map +1 -1
  643. package/build/es/components/text-input/TextInput.js.map +1 -1
  644. package/build/es/components/toast/Toast.js +1 -1
  645. package/build/es/components/toast/Toast.js.map +1 -1
  646. package/build/es/components/toast/ToastRegion.js +1 -1
  647. package/build/es/components/toast/ToastRegion.js.map +1 -1
  648. package/build/es/components/toast/index.d.ts +1 -1
  649. package/build/es/components/toast/toastContext.js.map +1 -1
  650. package/build/es/components/toggle-switch/ToggleSlider.js.map +1 -1
  651. package/build/es/components/toggle-switch/ToggleSwitch.js.map +1 -1
  652. package/build/es/components/toggle-switch/stories/ToggleSwitch.stories.js.map +1 -1
  653. package/build/es/components/toggle-switch/usePillStyles.js +1 -1
  654. package/build/es/components/toggle-switch/usePillStyles.js.map +1 -1
  655. package/build/es/components/tooltip/PopupTip.js.map +1 -1
  656. package/build/es/components/tooltip/Tooltip.js +1 -1
  657. package/build/es/components/tooltip/Tooltip.js.map +1 -1
  658. package/build/es/components/tooltip/TooltipContent.js.map +1 -1
  659. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js +1 -1
  660. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js.map +1 -1
  661. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js +1 -1
  662. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js.map +1 -1
  663. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js +1 -1
  664. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js.map +1 -1
  665. package/build/es/hooks/useBrowserPreferences/useBrowserPreferences.js.map +1 -1
  666. package/build/es/hooks/useClickOutside/useClickOutside.js +1 -1
  667. package/build/es/hooks/useClickOutside/useClickOutside.js.map +1 -1
  668. package/build/es/hooks/useElementDimensions/useElementDimensions.js.map +1 -1
  669. package/build/es/hooks/useFocusOutside/useFocusOutside.js +1 -1
  670. package/build/es/hooks/useFocusOutside/useFocusOutside.js.map +1 -1
  671. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +1 -1
  672. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js +1 -1
  673. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  674. package/build/es/hooks/useKeyListener/useKeyListener.js +1 -1
  675. package/build/es/hooks/useKeyListener/useKeyListener.js.map +1 -1
  676. package/build/es/hooks/useListNavigation/useListNavigation.js +1 -1
  677. package/build/es/hooks/useListNavigation/useListNavigation.js.map +1 -1
  678. package/build/es/hooks/useMutationObserver/useMutationObserver.js.map +1 -1
  679. package/build/es/hooks/useProgressiveImg/useProgressiveImg.js.map +1 -1
  680. package/build/es/hooks/useScreen/index.d.ts +1 -1
  681. package/build/es/hooks/useScreen/useScreen.js +1 -1
  682. package/build/es/hooks/useScreen/useScreen.js.map +1 -1
  683. package/build/es/hooks/useScrollIntoView/useScrollIntoView.js.map +1 -1
  684. package/build/es/hooks/useSwipeGesture/useSwipeGesture.d.ts +1 -1
  685. package/build/es/hooks/useSwipeGesture/useSwipeGesture.js.map +1 -1
  686. package/build/es/shared/input-panel/BasePanel.js.map +1 -1
  687. package/build/es/utilities/formatters/avstand/formatAvstand.js.map +1 -1
  688. package/build/es/utilities/formatters/bytes/formatBytes.js.map +1 -1
  689. package/build/es/utilities/formatters/util/parseNumber.js.map +1 -1
  690. package/build/es/utilities/formatters/valuta/formatValuta.js +1 -1
  691. package/build/es/utilities/formatters/valuta/formatValuta.js.map +1 -1
  692. package/build/es/utilities/getThemeAndDensity.js +1 -1
  693. package/build/es/utilities/getThemeAndDensity.js.map +1 -1
  694. package/build/es/utilities/polymorphism/mergeRefs.js +1 -1
  695. package/build/es/utilities/polymorphism/mergeRefs.js.map +1 -1
  696. package/build/es/utilities/tabListener.js +1 -1
  697. package/build/es/utilities/tabListener.js.map +1 -1
  698. package/build/style.css +1 -1
  699. package/package.json +2 -2
  700. package/styles/components/button/button.css +3 -31
  701. package/styles/components/button/button.min.css +1 -1
  702. package/styles/components/button/button.scss +6 -67
  703. package/styles/components/button/development/public/fonts/_index.scss +1 -0
  704. package/styles/components/button/development/public/fonts/webfonts.css +108 -0
  705. package/styles/components/button/development/public/fonts/webfonts.min.css +1 -0
  706. package/styles/components/button/development/public/fonts/webfonts.scss +137 -0
  707. package/styles/components/checkbox/checkbox.css +4 -4
  708. package/styles/components/checkbox/checkbox.min.css +1 -1
  709. package/styles/components/checkbox-panel/checkbox-panel.css +2 -2
  710. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  711. package/styles/components/countdown/countdown.css +2 -2
  712. package/styles/components/countdown/countdown.min.css +1 -1
  713. package/styles/components/feedback/feedback.css +2 -2
  714. package/styles/components/feedback/feedback.min.css +1 -1
  715. package/styles/components/input-group/input-group.css +2 -2
  716. package/styles/components/input-group/input-group.min.css +1 -1
  717. package/styles/components/loader/loader.css +6 -6
  718. package/styles/components/loader/loader.min.css +1 -1
  719. package/styles/components/loader/skeleton-loader.css +5 -5
  720. package/styles/components/loader/skeleton-loader.min.css +1 -1
  721. package/styles/components/message/message.css +2 -2
  722. package/styles/components/message/message.min.css +1 -1
  723. package/styles/components/progress-bar/progress-bar.css +1 -1
  724. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  725. package/styles/components/radio-button/radio-button.css +2 -2
  726. package/styles/components/radio-button/radio-button.min.css +1 -1
  727. package/styles/components/radio-panel/development/public/fonts/_index.scss +1 -0
  728. package/styles/components/radio-panel/development/public/fonts/webfonts.css +108 -0
  729. package/styles/components/radio-panel/development/public/fonts/webfonts.min.css +1 -0
  730. package/styles/components/radio-panel/development/public/fonts/webfonts.scss +137 -0
  731. package/styles/components/radio-panel/radio-panel.css +2 -2
  732. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  733. package/styles/components/system-message/system-message.css +2 -2
  734. package/styles/components/system-message/system-message.min.css +1 -1
  735. package/styles/components/toast/toast.css +4 -4
  736. package/styles/components/toast/toast.min.css +1 -1
  737. package/styles/styles.css +39 -67
  738. package/styles/styles.min.css +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n FC,\n FocusEvent,\n KeyboardEvent,\n 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 { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { IconButton } from \"../icon-button/IconButton.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 { 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 } else {\n return selectedValue.some((value) => value.value === option.value);\n }\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 let 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, setSelectedValue, onChange, name, setMarked],\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, setSelectedValue, 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 }, [setShowMenu, 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 =\n componentRootElement &&\n componentRootElement.contains(e.relatedTarget as Node);\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 [setShowMenu, 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 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 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 role=\"button\"\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 { ComboboxValuePair } from \"../../combobox/types.js\";\nimport React from \"react\";\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":"kFAMA,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":"kFAMA,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,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{setConsentCookie as g,convertBooleanConsentObjectToConsentObject as p}from"./cookieConsentUtils.js";import{RequirementCheckbox as j}from"./RequirementCheckbox.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};g({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(j,{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(j,{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(j,{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{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};
2
2
  //# sourceMappingURL=CookieConsent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { 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 {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport { 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,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 +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 {\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 const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n /* Use timestamp as a dependency to be ablet to force re-reading of cookie */\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\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,IAGtBY,EAAgBF,GAAQ,IAEtBG,EAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,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,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 +1 @@
1
- {"version":3,"file":"RequirementCheckbox.js","sources":["../../../../src/components/cookie-consent/RequirementCheckbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { WithChildren } from \"../../core/types.js\";\nimport { Checkbox } from \"../checkbox/Checkbox.js\";\n\ninterface RequirementCheckboxProps extends WithChildren {\n defaultChecked: boolean;\n name: \"functional\" | \"marketing\" | \"statistics\";\n label: string;\n}\n\nexport const RequirementCheckbox = ({\n defaultChecked,\n name,\n label,\n children,\n}: RequirementCheckboxProps) => {\n return (\n <>\n <Checkbox\n className=\"jkl-cookie-consent-modal__checkbox\"\n value=\"true\"\n name={name}\n defaultChecked={defaultChecked}\n >\n {label}\n </Checkbox>\n <p className=\"jkl-cookie-consent-modal__info-text\">{children}</p>\n </>\n );\n};\n"],"names":["RequirementCheckbox","defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"mHAUO,MAAMA,EAAsB,EAC/BC,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAC,EAAA,CAAAF,SAAA,CAAAG,EAACC,EAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
1
+ {"version":3,"file":"RequirementCheckbox.js","sources":["../../../../src/components/cookie-consent/RequirementCheckbox.tsx"],"sourcesContent":["import React from \"react\";\nimport type { WithChildren } from \"../../core/types.js\";\nimport { Checkbox } from \"../checkbox/Checkbox.js\";\n\ninterface RequirementCheckboxProps extends WithChildren {\n defaultChecked: boolean;\n name: \"functional\" | \"marketing\" | \"statistics\";\n label: string;\n}\n\nexport const RequirementCheckbox = ({\n defaultChecked,\n name,\n label,\n children,\n}: RequirementCheckboxProps) => {\n return (\n <>\n <Checkbox\n className=\"jkl-cookie-consent-modal__checkbox\"\n value=\"true\"\n name={name}\n defaultChecked={defaultChecked}\n >\n {label}\n </Checkbox>\n <p className=\"jkl-cookie-consent-modal__info-text\">{children}</p>\n </>\n );\n};\n"],"names":["RequirementCheckbox","defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"mHAUO,MAAMA,EAAsB,EAC/BC,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAC,EAAA,CAAAF,SAAA,CAAAG,EAACC,EAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
@@ -1,2 +1,2 @@
1
- const t=({adapter:t,name:e})=>{const n=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return n?JSON.parse(n[1]):t?t():void 0},e=({consent:t,maxAge:e=10368e3,name:n,domain:o,path:i})=>{document.cookie=[`${n}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!o&&`domain=${o}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},n=(t,e)=>{if(e){const n=new Map(Object.entries(e)),o=Object.entries(t);for(const[t,e]of o)if(e&&null===n.get(t))return!0;return!1}return Object.values(t).some((t=>t))},o=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted",i=(t,e)=>({functional:e.functional?o(t.functional):void 0,statistics:e.statistics?o(t.statistics):void 0,marketing:e.marketing?o(t.marketing):void 0}),s=({marketing:t,functional:e,statistics:n})=>({...t&&{marketing:t},...e&&{functional:e},...n&&{statistics:n}});export{s as buildRequirementsObject,i as convertBooleanConsentObjectToConsentObject,o as convertBooleanToConsentValue,t as getConsentCookie,e as setConsentCookie,n as shouldShowConsentDialog};
1
+ const t=({adapter:t,name:e})=>{const n=(t=>{if(typeof document>"u")return;const e=document.cookie.split(";").map((t=>t.trim().split("="))).find((e=>e[0]===t));return e||void 0})(e);return n?JSON.parse(n[1]):t?t():void 0},e=({consent:t,maxAge:e=10368e3,name:n,domain:o,path:i})=>{document.cookie=[`${n}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!o&&`domain=${o}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},n=(t,e)=>{if(!e)return Object.values(t).some((t=>t));const n=new Map(Object.entries(e)),o=Object.entries(t);for(const[t,e]of o)if(e&&null===n.get(t))return!0;return!1},o=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted",i=(t,e)=>({functional:e.functional?o(t.functional):void 0,statistics:e.statistics?o(t.statistics):void 0,marketing:e.marketing?o(t.marketing):void 0}),s=({marketing:t,functional:e,statistics:n})=>({...t&&{marketing:t},...e&&{functional:e},...n&&{statistics:n}});export{s as buildRequirementsObject,i as convertBooleanConsentObjectToConsentObject,o as convertBooleanToConsentValue,t as getConsentCookie,e as setConsentCookie,n as shouldShowConsentDialog};
2
2
  //# sourceMappingURL=cookieConsentUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n path,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n path?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n !!path && `path=${path}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","path","stringify","filter","f","join","shouldShowConsentDialog","requirement","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","functional","statistics","marketing","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,EACAC,KAAAA,MAQAd,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKO,UAAUJ,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CACnCC,EACAT,KAEA,GAAKA,EAKE,CAEGU,MAAAA,EAAa,IAAIC,IAAIC,OAAOC,QAAQb,IAGpCc,EAAqBF,OAAOC,QAAQJ,GAE/B,IAAA,MAACtB,EAAM4B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAI7B,GACR,OAAA,EAIR,OAAA,CACX,CAvBW,OAAAyB,OAAOK,OAAOR,GAAaS,MAC7BC,GAAqBA,GAAA,EAyBrBC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EAA6C,CACtDxB,EACAS,KAEO,CACHgB,WAAYhB,EAAYgB,WAClBL,EAA6BpB,EAAQyB,iBACrC,EACNC,WAAYjB,EAAYiB,WAClBN,EAA6BpB,EAAQ0B,iBACrC,EACNC,UAAWlB,EAAYkB,UACjBP,EAA6BpB,EAAQ2B,gBACrC,IAIDC,EAA0B,EACnCD,UAAAA,EACAF,WAAAA,EACAC,WAAAA,MAEO,IACCC,GAAa,CAAEA,UAAAA,MACfF,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA"}
1
+ {"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types.js\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n path,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n path?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n \"SameSite=Lax\",\n !!domain && `domain=${domain}`,\n !!path && `path=${path}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (\n requirement: ConsentRequirement,\n consent: Consent | undefined,\n): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some(\n (requirementValue) => requirementValue,\n );\n }\n\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const convertBooleanToConsentValue = (\n formValue: boolean | undefined,\n): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n requirement: ConsentRequirement,\n): Consent => {\n return {\n functional: requirement.functional\n ? convertBooleanToConsentValue(consent.functional)\n : undefined,\n statistics: requirement.statistics\n ? convertBooleanToConsentValue(consent.statistics)\n : undefined,\n marketing: requirement.marketing\n ? convertBooleanToConsentValue(consent.marketing)\n : undefined,\n };\n};\n\nexport const buildRequirementsObject = ({\n marketing,\n functional,\n statistics,\n}: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","path","stringify","filter","f","join","shouldShowConsentDialog","requirement","Object","values","some","requirementValue","consentMap","Map","entries","requirementEntries","required","get","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","functional","statistics","marketing","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,EACAC,KAAAA,MAQAd,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKO,UAAUJ,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CACnCC,EACAT,KAEA,IAAKA,EAEM,OAAAU,OAAOC,OAAOF,GAAaG,MAC7BC,GAAqBA,IAKxBC,MAAAA,EAAa,IAAIC,IAAIL,OAAOM,QAAQhB,IAGpCiB,EAAqBP,OAAOM,QAAQP,GAE/B,IAAA,MAACtB,EAAM+B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBJ,EAAWK,IAAIhC,GACR,OAAA,EAIR,OAAA,CAAA,EAGEiC,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EAA6C,CACtDxB,EACAS,KAEO,CACHgB,WAAYhB,EAAYgB,WAClBL,EAA6BpB,EAAQyB,iBACrC,EACNC,WAAYjB,EAAYiB,WAClBN,EAA6BpB,EAAQ0B,iBACrC,EACNC,UAAWlB,EAAYkB,UACjBP,EAA6BpB,EAAQ2B,gBACrC,IAIDC,EAA0B,EACnCD,UAAAA,EACAF,WAAAA,EACAC,WAAAA,MAEO,IACCC,GAAa,CAAEA,UAAAA,MACfF,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA"}
@@ -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, { FC } from \"react\";\nimport { 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":"sPAWA,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":"sPAWA,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,2 +1,2 @@
1
- import{jsxs as t,jsx as s}from"react/jsx-runtime";import{useState as e,useEffect as a}from"react";const o=({className:o,from:n,isPaused:r,...c})=>{const[l,d]=e(Math.floor(n/1e3));return a((()=>{l<=0||setTimeout((()=>{r||d((t=>t-1))}),1e3)}),[r,n,l,d]),t("div",{className:`jkl-countdown ${o??""}`,role:"timer","data-testid":"jkl-countdown",...c,children:[s("span",{className:"jkl-countdown__tracker",role:"presentation",style:{"--duration":`${n}ms`,"--play-state":r?"paused":"running"},"data-testid":"jkl-countdown__tracker"}),s("span",{className:"jkl-sr-only",children:l})]})};export{o as Countdown};
1
+ import{jsxs as t,jsx as s}from"react/jsx-runtime";import{useState as e,useEffect as a}from"react";const o=({className:o,from:n,isPaused:r,...c})=>{const[l,d]=e(Math.floor(n/1e3));return a((()=>{l<=0||setTimeout((()=>{r||d((t=>t-1))}),1e3)}),[r,l]),t("div",{className:`jkl-countdown ${o??""}`,role:"timer","data-testid":"jkl-countdown",...c,children:[s("span",{className:"jkl-countdown__tracker",role:"presentation",style:{"--duration":`${n}ms`,"--play-state":r?"paused":"running"},"data-testid":"jkl-countdown__tracker"}),s("span",{className:"jkl-sr-only",children:l})]})};export{o as Countdown};
2
2
  //# sourceMappingURL=Countdown.js.map
@@ -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 { 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, from, remainingSeconds, setRemainingSeconds]);\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,EAAUD,EAAMG,EAAkBC,IAGlCO,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,MAAA"}
@@ -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, { FC, useState } from \"react\";\nimport { 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,GAAM"}
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as a}from"../../../clsx-BeLtu-UY.js";import{startOfDay as r}from"date-fns";import{forwardRef as o,useState as n,useRef as l,useCallback as s}from"react";import{flushSync as i}from"react-dom";import{CalendarIcon as u}from"../icon/icons/CalendarIcon.js";import{IconButton as d}from"../icon-button/IconButton.js";import{InputGroup as c}from"../input-group/InputGroup.js";import{Popover as p}from"../popover/Popover.js";import{BaseTextInput as m}from"../text-input/BaseTextInput.js";import{Calendar as f}from"./internal/Calendar.js";import{getInitialDate as v}from"./internal/utils.js";import{parseDateString as h,formatInput as b}from"./utils.js";import{isWithinLowerBound as k,isWithinUpperBound as D}from"./validation.js";const g=o(((o,g)=>{const{"data-testautoid":y,id:j,className:L="",label:w="Velg dato",labelProps:C,defaultValue:I,defaultShow:x=!1,value:P,disableBeforeDate:B,disableAfterDate:_,yearsToShow:E,name:O,helpLabel:T,errorLabel:N,invalid:S,density:R,days:U,months:V,monthLabel:F,yearLabel:K,placeholder:W="dd.mm.åååå",width:A="11.25rem",onChange:G,onBlur:q,onFocus:H,onKeyDown:M,action:z,showCalendarLabel:J="Åpne kalender",hideCalendarLabel:Q="Lukk kalender",supportLabelProps:X,tooltip:Y,textInputProps:Z,...$}=o;"production"!==process.env.NODE_ENV&&P&&I&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const ee=h(B),te=ee?r(ee):void 0,ae=h(_),re=ae?r(ae):void 0,[oe,ne]=n(v(P,I,te,re)),[le,se]=n(null),[ie,ue]=n(x),de=l(null),ce=l(null),pe=l(null),me=l(null),fe=s((e=>{me.current=e,g&&("function"==typeof g?g(e):g.current=e)}),[me,g]),ve=s((e=>{H&&ce.current&&(ce.current.contains(e.relatedTarget)||H(e,oe,{error:le,value:e.target.value}))}),[H,oe,le]),he=s((e=>{q&&q(e,oe,{error:le,value:e.target.value})}),[q,oe,le]),be=s((e=>{"Escape"===e.key&&(ue(!1),e.preventDefault(),e.stopPropagation()),null!=z&&z.onKeyDown&&z.onKeyDown(e)}),[ue,z]),ke=s((e=>{let t=null,a=null;if(e.target.value){const r=h(e.target.value);r?te&&!k(r,te)?a="OUTSIDE_LOWER_BOUND":re&&!D(r,re)?a="OUTSIDE_UPPER_BOUND":ue(!1):a="WRONG_FORMAT",t=r||null}se(a),ne(t),G&&G(e,t,{error:a,value:e.target.value})}),[G,se,ne,ue,te,re]),De=s((e=>{i((()=>{ue(!ie)}));const t=de.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>a&&a.focus())),null!=z&&z.onClick&&z.onClick(e)}),[ue,ie,z,de]),ge=s((({date:e})=>{if(ue(!1),ne(e),me.current){const t=me.current;t.value=b(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),G&&G(a,e,{error:null,value:t.value})}}),[ue,ne,G]),ye=s((e=>{e.preventDefault(),ue(!1),pe.current&&pe.current.focus()}),[ue]);return e(c,{id:j,className:a("jkl-datepicker",L),...$,ref:ce,label:w,labelProps:C,density:R,helpLabel:T,errorLabel:N,supportLabelProps:X,tooltip:Y,render:a=>e(m,{"data-focused":ie?"true":void 0,ref:fe,"data-testid":"jkl-datepicker__input","data-testautoid":y,className:"jkl-datepicker__input",name:O,defaultValue:I,density:R,value:P,type:"text",placeholder:W,width:A,onFocus:ve,onBlur:he,onChange:ke,actionButton:t(p,{positionReference:me,open:ie,onOpenChange:()=>ue(!ie),offset:8,children:[e(p.Trigger,{...z,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:ie?Q:J,tabIndex:0,onClick:De,onKeyDown:be,asChild:!0,children:e(d,{children:e(u,{})})}),e(p.Content,{initialFocus:-1,padding:24,children:e(f,{ref:de,density:R,date:oe,minDate:te,maxDate:re,days:U,months:V,monthLabel:F,yearLabel:K,yearsToShow:E,onDateSelected:ge,onTabOutside:ye})})]}),...Z,...a,"aria-invalid":S||!!N})})}));g.displayName="DatePicker";export{g as DatePicker};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as a}from"../../../clsx-BeLtu-UY.js";import{startOfDay as r}from"date-fns";import{forwardRef as o,useState as n,useRef as l,useCallback as s}from"react";import{flushSync as i}from"react-dom";import{IconButton as u}from"../icon-button/IconButton.js";import{CalendarIcon as d}from"../icon/icons/CalendarIcon.js";import{InputGroup as c}from"../input-group/InputGroup.js";import{Popover as p}from"../popover/Popover.js";import{BaseTextInput as m}from"../text-input/BaseTextInput.js";import{Calendar as f}from"./internal/Calendar.js";import{getInitialDate as v}from"./internal/utils.js";import{parseDateString as h,formatInput as b}from"./utils.js";import{isWithinLowerBound as k,isWithinUpperBound as D}from"./validation.js";const g=o(((o,g)=>{const{"data-testautoid":y,id:j,className:L="",label:w="Velg dato",labelProps:C,defaultValue:I,defaultShow:x=!1,value:P,disableBeforeDate:B,disableAfterDate:_,yearsToShow:E,name:O,helpLabel:T,errorLabel:N,invalid:S,density:R,days:U,months:V,monthLabel:F,yearLabel:K,placeholder:W="dd.mm.åååå",width:A="11.25rem",onChange:G,onBlur:q,onFocus:H,onKeyDown:M,action:z,showCalendarLabel:J="Åpne kalender",hideCalendarLabel:Q="Lukk kalender",supportLabelProps:X,tooltip:Y,textInputProps:Z,...$}=o;"production"!==process.env.NODE_ENV&&P&&I&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const ee=h(B),te=ee?r(ee):void 0,ae=h(_),re=ae?r(ae):void 0,[oe,ne]=n(v(P,I,te,re)),[le,se]=n(null),[ie,ue]=n(x),de=l(null),ce=l(null),pe=l(null),me=l(null),fe=s((e=>{me.current=e,g&&("function"==typeof g?g(e):g.current=e)}),[g]),ve=s((e=>{H&&ce.current&&(ce.current.contains(e.relatedTarget)||H(e,oe,{error:le,value:e.target.value}))}),[H,oe,le]),he=s((e=>{q&&q(e,oe,{error:le,value:e.target.value})}),[q,oe,le]),be=s((e=>{"Escape"===e.key&&(ue(!1),e.preventDefault(),e.stopPropagation()),null!=z&&z.onKeyDown&&z.onKeyDown(e)}),[z]),ke=s((e=>{let t=null,a=null;if(e.target.value){const r=h(e.target.value);r?te&&!k(r,te)?a="OUTSIDE_LOWER_BOUND":re&&!D(r,re)?a="OUTSIDE_UPPER_BOUND":ue(!1):a="WRONG_FORMAT",t=r||null}se(a),ne(t),G&&G(e,t,{error:a,value:e.target.value})}),[G,te,re]),De=s((e=>{i((()=>{ue(!ie)}));const t=de.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>null==a?void 0:a.focus())),null!=z&&z.onClick&&z.onClick(e)}),[ie,z]),ge=s((({date:e})=>{if(ue(!1),ne(e),me.current){const t=me.current;t.value=b(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),G&&G(a,e,{error:null,value:t.value})}}),[G]),ye=s((e=>{var t;e.preventDefault(),ue(!1),null==(t=pe.current)||t.focus()}),[]);return e(c,{id:j,className:a("jkl-datepicker",L),...$,ref:ce,label:w,labelProps:C,density:R,helpLabel:T,errorLabel:N,supportLabelProps:X,tooltip:Y,render:a=>e(m,{"data-focused":ie?"true":void 0,ref:fe,"data-testid":"jkl-datepicker__input","data-testautoid":y,className:"jkl-datepicker__input",name:O,defaultValue:I,density:R,value:P,type:"text",placeholder:W,width:A,onFocus:ve,onBlur:he,onChange:ke,actionButton:t(p,{positionReference:me,open:ie,onOpenChange:()=>ue(!ie),offset:8,children:[e(p.Trigger,{...z,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:ie?Q:J,tabIndex:0,onClick:De,onKeyDown:be,asChild:!0,children:e(u,{children:e(d,{})})}),e(p.Content,{initialFocus:-1,padding:24,children:e(f,{ref:de,density:R,date:oe,minDate:te,maxDate:re,days:U,months:V,monthLabel:F,yearLabel:K,yearsToShow:E,onDateSelected:ge,onTabOutside:ye})})]}),...Z,...a,"aria-invalid":S||!!N})})}));g.displayName="DatePicker";export{g as DatePicker};
2
2
  //# sourceMappingURL=DatePicker.js.map
@@ -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 ChangeEvent,\n FocusEvent,\n KeyboardEvent,\n MouseEvent,\n forwardRef,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { CalendarIcon } from \"../icon/icons/CalendarIcon.js\";\nimport { IconButton } from \"../icon-button/IconButton.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 { DateInfo, getInitialDate } from \"./internal/utils.js\";\nimport { 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 [inputRef, 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 [setShowCalendar, 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, setError, setDate, setShowCalendar, 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 && button.focus());\n\n if (action?.onClick) {\n action.onClick(e);\n }\n },\n [setShowCalendar, showCalendar, action, calendarRef],\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 [setShowCalendar, setDate, onChange],\n );\n\n const handleTabOutsideCalendar = useCallback(\n (e: KeyboardEvent) => {\n e.preventDefault();\n setShowCalendar(false);\n iconButtonRef.current && iconButtonRef.current.focus();\n },\n [setShowCalendar],\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","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":"4wBAwBO,MAAMA,EAAaC,GACtB,CAACC,EAAOC,KACE,MACF,kBAAmBC,EACnBC,GAAAA,EACAC,UAAAA,EAAY,GACZC,MAAAA,EAAQ,YACRC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,GAAc,EACdC,MAAAA,EACAC,kBAAmBC,EACnBC,iBAAkBC,EAClBC,YAAAA,EACAC,KAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,KAAAA,EACAC,OAAAA,EACAC,WAAAA,EACAC,UAAAA,EACAC,YAAAA,EAAc,aACdC,MAAAA,EAAQ,WACRC,SAAAA,EACAC,OAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,OAAAA,EACAC,kBAAAA,EAAoB,gBACpBC,kBAAAA,EAAoB,gBACpBC,kBAAAA,EACAC,QAAAA,EACAC,eAAAA,KACGC,GACHpC,EAEyB,eAAzBqC,QAAQC,IAAIC,UAA6B9B,GAASF,GAC1CiC,QAAAC,KACJ,sIAKF/B,MAAAA,GAAoBgC,EAAgB/B,GACpCgC,GAAUjC,GACVkC,EAAWlC,SACX,EACAE,GAAmB8B,EAAgB7B,GACnCgC,GAAUjC,GACVgC,EAAWhC,SACX,GAECkC,GAAMC,IAAWC,EACpBC,EAAexC,EAAOF,EAAcoC,GAASE,MAE1CK,GAAOC,IAAYH,EAAqC,OAIxDI,GAAcC,IAAmBL,EAASxC,GAE3C8C,GAAcC,EAAuB,MACrCC,GAAgBD,EAAuB,MAIvCE,GAAgBF,EAAiC,MACjDG,GAAWH,EAAgC,MAG3CI,GAAkBC,GACnBC,IACGH,GAASI,QAAUD,EACf5D,IACiC,mBAAtBA,EACPA,EAAkB4D,GAElB5D,EAAkB6D,QAAUD,EAAAA,GAIxC,CAACH,GAAUzD,IAGT8D,GAAcH,GACfI,IACQpC,GAAY4B,GAAcM,UAILN,GAAcM,QAAQG,SAC5CD,EAAEE,gBAGMtC,EAAAoC,EAAGlB,GAAM,CAAEI,MAAAA,GAAOzC,MAAOuD,EAAEG,OAAO1D,QAAO,GAGzD,CAACmB,EAASkB,GAAMI,KAGdkB,GAAaR,GACdI,IACOrC,GACOA,EAAAqC,EAAGlB,GAAM,CAAEI,MAAAA,GAAOzC,MAAOuD,EAAEG,OAAO1D,OAAO,GAGxD,CAACkB,EAAQmB,GAAMI,KAGbmB,GAAsBT,GACvBI,IACiB,WAAVA,EAAEM,MACFjB,IAAgB,GAChBW,EAAEO,iBACFP,EAAEQ,mBAGF,MAAA1C,GAAAA,EAAQD,WACRC,EAAOD,UAAUmC,EAAC,GAG1B,CAACX,GAAiBvB,IAGhB2C,GAAeb,GAChBI,IACOU,IAAAA,EAAwB,KACxBC,EAAwC,KAExC,GAAAX,EAAEG,OAAO1D,MAAO,CAChB,MAAMmE,EAAMlC,EAAgBsB,EAAEG,OAAO1D,OAChCmE,EAEMjC,KAAYkC,EAAmBD,EAAKjC,IAC/BgC,EAAA,sBACL9B,KAAYiC,EAAmBF,EAAK/B,IAC/B8B,EAAA,sBAEZtB,IAAgB,GANJsB,EAAA,eAQhBD,EAAWE,GAAO,IACtB,CAEAzB,GAASwB,GACT5B,GAAQ2B,GAEJhD,GACAA,EAASsC,EAAGU,EAAU,CAClBxB,MAAOyB,EACPlE,MAAOuD,EAAEG,OAAO1D,OACnB,GAGT,CAACiB,EAAUyB,GAAUJ,GAASM,GAAiBV,GAASE,KAKtDkC,GAAgBnB,GACjBI,IACGgB,GAAU,KACN3B,IAAiBD,GAAY,IAGjC,MAAM6B,EAAa3B,GAAYQ,QACzBoB,EACFD,GACCA,EAAWE,cACR,yBAIRC,OAAOC,uBAAsB,IAAMH,GAAUA,EAAOI,UAEhD,MAAAxD,GAAAA,EAAQyD,SACRzD,EAAOyD,QAAQvB,EAAC,GAGxB,CAACX,GAAiBD,GAActB,EAAQwB,KAGtCkC,GAAyB5B,GAC3B,EAAGd,KAAAA,MAIC,GAHAO,IAAgB,GAChBN,GAAQD,GAEJY,GAASI,QAAS,CAClB,MAAM2B,EAAO/B,GAASI,QAEjB2B,EAAAhF,MAAQiF,EAAY5C,GAGnB6C,MAAAA,EAAQC,SAASC,YAAY,cAC7BF,EAAAG,UAAU,SAAS,GAAM,GAC/BL,EAAKM,cAAcJ,GAEnBF,EAAKH,QAED5D,GAIAA,EACIiE,EACA7C,EACA,CACII,MAAO,KACPzC,MAAOgF,EAAKhF,OAI5B,IAEJ,CAAC4C,GAAiBN,GAASrB,IAGzBsE,GAA2BpC,GAC5BI,IACKA,EAAAO,iBACFlB,IAAgB,GACFI,GAAAK,SAAWL,GAAcK,QAAQwB,OAAM,GAEzD,CAACjC,KAID,OAAA4C,EAACC,EAAA,CACG/F,GAAAA,EACAC,UAAW+F,EAAK,iBAAkB/F,MAC9BgC,EACJgE,IAAK5C,GACLnD,MAAAA,EACAC,WAAAA,EACAa,QAAAA,EACAH,UAAAA,EACAC,WAAAA,EACAgB,kBAAAA,EACAC,QAAAA,EACAmE,OAASC,GACLL,EAACM,EAAA,CACG,eAAcnD,GAAe,YAAS,EACtCgD,IAAKzC,GACL,cAAY,wBACZ,kBAAiBzD,EACjBE,UAAU,wBACVW,KAAAA,EACAR,aAAAA,EACAY,QAAAA,EACAV,MAAAA,EACA+F,KAAK,OACLhF,YAAAA,EACAC,MAAAA,EACAG,QAASmC,GACTpC,OAAQyC,GACR1C,SAAU+C,GACVgC,aACIC,EAACC,EAAA,CACGC,kBAAmBlD,GACnBmD,KAAMzD,GACN0D,aAAc,IACVzD,IAAiBD,IAErB2D,OAAQ,EAERC,SAAA,CAAAf,EAACU,EAAQM,QAAR,IACOnF,EACJ,cAAY,0BACZ1B,UAAU,+BACV8G,MACI9D,GACMpB,EACAD,EAEVoF,SAAU,EACV5B,QAASR,GACTlD,UAAWwC,GACX+C,SAAO,EAEPJ,SAACf,EAAAoB,EAAA,CACGL,SAACf,EAAAqB,EAAA,CAAa,SAGrBX,EAAQY,QAAR,CAAgBC,cAAkB,EAAAC,QAAS,GACxCT,SAAAf,EAACyB,EAAA,CACGtB,IAAK9C,GACLnC,QAAAA,EACA2B,KAAAA,GACAH,QAAAA,GACAE,QAAAA,GACAzB,KAAAA,EACAC,OAAAA,EACAC,WAAAA,EACAC,UAAAA,EACAT,YAAAA,EACA6G,eAAgBnC,GAChBoC,aAAc5B,aAK1B7D,KACAmE,EACJ,eAAcpF,KAAaD,KAC/B,IAOpBnB,EAAW+H,YAAc"}
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,4 +1,4 @@
1
1
  export { DatePicker } from './DatePicker.js';
2
2
  export { isCorrectFormat, isWithinLowerBound, isWithinUpperBound, } from './validation.js';
3
3
  export { formatInput, parseDateString, isBlurTargetOutside } from './utils.js';
4
- export { type DatePickerProps, type YearsToShow, type DatePickerChangeEventHandler, type DatePickerFocusEventHandler, type DatePickerBlurEventHandler, type DatePickerKeyDownEventHandler, type DatePickerAction, type ComparisonOptions, type DatePickerMetadata, } from './types.js';
4
+ export type { DatePickerProps, YearsToShow, DatePickerChangeEventHandler, DatePickerFocusEventHandler, DatePickerBlurEventHandler, DatePickerKeyDownEventHandler, DatePickerAction, ComparisonOptions, DatePickerMetadata, } from './types.js';
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{forwardRef as a,useReducer as n,useEffect as r,useCallback as l,useRef as o}from"react";import{flushSync as s}from"react-dom";import{useId as d}from"../../../hooks/useId/useId.js";import{Button as c}from"../../button/Button.js";import{ArrowLeftIcon as i}from"../../icon/icons/ArrowLeftIcon.js";import{ArrowRightIcon as u}from"../../icon/icons/ArrowRightIcon.js";import{ChevronDownIcon as h}from"../../icon/icons/ChevronDownIcon.js";import{calendarReducer as g,calendarInitializer as m}from"./calendarReducer.js";import{useCalendar as f}from"./useCalendar.js";import{getInitialDateShown as p,isBackDisabled as b,subtractMonth as v,isForwardDisabled as D,addMonth as j,getYearSelectOptions as k,getMonthSelectOptions as w,DEFAULT_YEARS_TO_SHOW as y}from"./utils.js";const M=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],S=["man","tir","ons","tor","fre","lør","søn"],_=a(((a,_)=>{const{date:F,defaultSelected:A,density:N,minDate:E,maxDate:Y,days:x=S,months:O=M,monthLabel:C="Velg måned",yearLabel:I="Velg år",yearsToShow:$=y,onTabOutside:T,...R}=a,L=d("jkl-calendar"),[{offset:q,selectedDate:B,shownDate:K},J]=n(g,p(F,A,E,Y),m),P=K.getMonth(),U=K.getFullYear();r((()=>{J({type:"SET_SELECTED_DATE",newDate:p(F,A,E,Y)})}),[F,A,E,Y]);const V=l((e=>{J({type:"SET_OFFSET",newOffset:e})}),[]),{calendars:W,getBackProps:z,getDateProps:H,getForwardProps:G,handleOffsetChanged:Q}=f({date:B,selected:B,minDate:E,maxDate:Y,offset:q,onOffsetChanged:V,firstDayOfWeek:1,...R}),X=o(null),Z=l((e=>{if(!X.current)return;const t=document.activeElement,a=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]'),n=async e=>{null==t||t.setAttribute("tabindex","-1"),e.setAttribute("tabindex","0"),e.focus()};a.forEach(((r,l)=>{const o=l+e;if(r==t)if(o<=a.length-1&&o>=0)n(a[o]);else if(e<0){if(b({calendars:W,minDate:E})||(s((()=>{Q(q-v({calendars:W,offset:1,minDate:E}))})),!X.current))return;const e=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[e.length+o]&&(e[0].setAttribute("tabindex","-1"),n(e[e.length+o]))}else{if(D({calendars:W,maxDate:Y})||(s((()=>{Q(q+j({calendars:W,offset:1,maxDate:Y}))})),!X.current))return;const e=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[o-a.length]&&(e[0].setAttribute("tabindex","-1"),n(e[o-a.length]))}}))}),[Q,X,q,W,Y,E]),ee=l((e=>{switch(e.key){case"ArrowUp":Z(-7),e.preventDefault();break;case"ArrowRight":Z(1),e.preventDefault();break;case"ArrowDown":Z(7),e.preventDefault();break;case"ArrowLeft":Z(-1),e.preventDefault()}}),[Z]),te=l((e=>{var t;if("Tab"!==e.key)return;const a=null==(t=X.current)?void 0:t.querySelectorAll('button:not([disabled]):not([tabindex="-1"]), select');if(!a)return;const n=a[0],r=a[a.length-1];e.shiftKey||document.activeElement!==r?e.shiftKey&&document.activeElement===n&&(r.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}),[]),ae=l((e=>{const{date:t,selected:a,selectable:n,prevMonth:r,nextMonth:l}=e;return!!n&&!(!a&&t.toString()!==(null==E?void 0:E.toString())&&(r||l||K.getFullYear()!==t.getFullYear()||B.getMonth()===t.getMonth()||1!==t.getDate()))}),[K,E,B]),ne=l((()=>{E&&K.getFullYear()-E.getFullYear()==0&&K.getMonth()-E.getMonth()==1?document.querySelectorAll(".jkl-calendar-navigation__arrow")[1].focus():Y&&Y.getFullYear()-K.getFullYear()==0&&Y.getMonth()-K.getMonth()==1&&document.querySelectorAll(".jkl-calendar-navigation__arrow")[0].focus()}),[E,Y,K]),re=l((e=>{if(4!==e.target.value.length)return;const t=Number.parseInt(e.target.value);if(Number.isNaN(t))return;let a=12*(t-K.getFullYear());const n=new Date(K.getFullYear(),K.getMonth()+a,K.getDate());Y&&Y.getFullYear()===n.getFullYear()&&Y.getMonth()<n.getMonth()?a-=n.getMonth()-Y.getMonth():E&&E.getFullYear()===n.getFullYear()&&E.getMonth()>n.getMonth()&&(a+=E.getMonth()-n.getMonth()),J({type:"ADD_OFFSET",addedOffset:a})}),[K,E,Y]),le=l((e=>{if(!B&&!F)return;const t=K.getFullYear()-(B||new Date).getFullYear(),a=Number.parseInt(e.target.value)-(B||new Date).getMonth();J({type:"SET_OFFSET",newOffset:12*t+a})}),[B,F,K]),oe=k(U,E,Y,$),se=w(U,O,E,Y);return e("div",{ref:_,id:L,className:"jkl-calendar","data-testid":"jkl-calendar",children:t("div",{className:"jkl-calendar__padding",ref:X,onKeyDown:te,children:[t("fieldset",{className:"jkl-calendar-navigation",children:[t("div",{children:[e(c,{...z({calendars:W,onClick:ne}),variant:"ghost",icon:e(i,{variant:"medium",bold:!0})}),e(c,{...G({calendars:W,onClick:ne}),variant:"ghost",icon:e(u,{variant:"medium",bold:!0})})]}),t("div",{children:[t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:le,className:"jkl-calendar-navigation-dropdown__select","aria-label":C,value:P.toString(),children:se.map((({label:t,value:a})=>e("option",{value:a,children:t},a)))}),e(h,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]}),t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:re,className:"jkl-calendar-navigation-dropdown__select","aria-label":I,value:U.toString(),children:oe.map((t=>e("option",{value:t,children:t},t)))}),e(h,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]})]})]}),W.map((a=>t("table",{className:"jkl-calendar-table","data-testid":"jkl-datepicker-calendar",children:[t("caption",{className:"jkl-sr-only",children:[O[a.month],", ",a.year]}),e("thead",{children:e("tr",{children:x.map((t=>e("th",{children:t},`${a.month}${a.year}${t}`)))})}),e("tbody",{"data-testid":"jkl-datepicker-dates",children:a.weeks.map(((t,n)=>e("tr",{children:t.map(((t,r)=>{const l=`${a.month}${a.year}${n}${r}`;if("string"==typeof t)return e("td",{className:"jkl-calendar__date jkl-calendar__date--empty",children:t},l);const{date:o,selectable:s,today:d,prevMonth:c,nextMonth:i}=t;return e("td",{children:e("button",{...H({dateObj:t}),type:"button",className:"jkl-calendar-date-button",tabIndex:ae(t)?0:-1,"aria-label":`${o.getDate()}. ${O[o.getMonth()].toLowerCase()}`,"aria-current":d?"date":void 0,"data-adjacent":c||i?"true":void 0,disabled:!s,onKeyDown:ee,children:e("span",{"aria-hidden":"true",children:o.getDate()})})},l)}))},`${a.month}${a.year}${n}`)))})]},`${a.month}${a.year}`)))]})})}));_.displayName="Calendar";export{_ as Calendar};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{forwardRef as a,useReducer as n,useEffect as r,useCallback as l,useRef as o}from"react";import{flushSync as s}from"react-dom";import{useId as d}from"../../../hooks/useId/useId.js";import{Button as c}from"../../button/Button.js";import{ArrowLeftIcon as i}from"../../icon/icons/ArrowLeftIcon.js";import{ArrowRightIcon as u}from"../../icon/icons/ArrowRightIcon.js";import{ChevronDownIcon as h}from"../../icon/icons/ChevronDownIcon.js";import{calendarReducer as g,calendarInitializer as m}from"./calendarReducer.js";import{useCalendar as f}from"./useCalendar.js";import{getInitialDateShown as p,isBackDisabled as b,subtractMonth as v,isForwardDisabled as D,addMonth as j,getYearSelectOptions as k,getMonthSelectOptions as w,DEFAULT_YEARS_TO_SHOW as y}from"./utils.js";const M=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],S=["man","tir","ons","tor","fre","lør","søn"],_=a(((a,_)=>{const{date:F,defaultSelected:A,density:N,minDate:E,maxDate:Y,days:x=S,months:O=M,monthLabel:C="Velg måned",yearLabel:I="Velg år",yearsToShow:$=y,onTabOutside:T,...R}=a,L=d("jkl-calendar"),[{offset:q,selectedDate:B,shownDate:K},J]=n(g,p(F,A,E,Y),m),P=K.getMonth(),U=K.getFullYear();r((()=>{J({type:"SET_SELECTED_DATE",newDate:p(F,A,E,Y)})}),[F,A,E,Y]);const V=l((e=>{J({type:"SET_OFFSET",newOffset:e})}),[]),{calendars:W,getBackProps:z,getDateProps:H,getForwardProps:G,handleOffsetChanged:Q}=f({date:B,selected:B,minDate:E,maxDate:Y,offset:q,onOffsetChanged:V,firstDayOfWeek:1,...R}),X=o(null),Z=l((e=>{if(!X.current)return;const t=document.activeElement,a=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]'),n=async e=>{null==t||t.setAttribute("tabindex","-1"),e.setAttribute("tabindex","0"),e.focus()};a.forEach(((r,l)=>{const o=l+e;if(r===t)if(o<=a.length-1&&o>=0)n(a[o]);else if(e<0){if(b({calendars:W,minDate:E})||(s((()=>{Q(q-v({calendars:W,offset:1,minDate:E}))})),!X.current))return;const e=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[e.length+o]&&(e[0].setAttribute("tabindex","-1"),n(e[e.length+o]))}else{if(D({calendars:W,maxDate:Y})||(s((()=>{Q(q+j({calendars:W,offset:1,maxDate:Y}))})),!X.current))return;const e=X.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[o-a.length]&&(e[0].setAttribute("tabindex","-1"),n(e[o-a.length]))}}))}),[Q,q,W,Y,E]),ee=l((e=>{switch(e.key){case"ArrowUp":Z(-7),e.preventDefault();break;case"ArrowRight":Z(1),e.preventDefault();break;case"ArrowDown":Z(7),e.preventDefault();break;case"ArrowLeft":Z(-1),e.preventDefault()}}),[Z]),te=l((e=>{var t;if("Tab"!==e.key)return;const a=null==(t=X.current)?void 0:t.querySelectorAll('button:not([disabled]):not([tabindex="-1"]), select');if(!a)return;const n=a[0],r=a[a.length-1];e.shiftKey||document.activeElement!==r?e.shiftKey&&document.activeElement===n&&(r.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}),[]),ae=l((e=>{const{date:t,selected:a,selectable:n,prevMonth:r,nextMonth:l}=e;return!!n&&!(!a&&t.toString()!==(null==E?void 0:E.toString())&&(r||l||K.getFullYear()!==t.getFullYear()||B.getMonth()===t.getMonth()||1!==t.getDate()))}),[K,E,B]),ne=l((()=>{E&&K.getFullYear()-E.getFullYear()==0&&K.getMonth()-E.getMonth()==1?document.querySelectorAll(".jkl-calendar-navigation__arrow")[1].focus():Y&&Y.getFullYear()-K.getFullYear()==0&&Y.getMonth()-K.getMonth()==1&&document.querySelectorAll(".jkl-calendar-navigation__arrow")[0].focus()}),[E,Y,K]),re=l((e=>{if(4!==e.target.value.length)return;const t=Number.parseInt(e.target.value);if(Number.isNaN(t))return;let a=12*(t-K.getFullYear());const n=new Date(K.getFullYear(),K.getMonth()+a,K.getDate());Y&&Y.getFullYear()===n.getFullYear()&&Y.getMonth()<n.getMonth()?a-=n.getMonth()-Y.getMonth():E&&E.getFullYear()===n.getFullYear()&&E.getMonth()>n.getMonth()&&(a+=E.getMonth()-n.getMonth()),J({type:"ADD_OFFSET",addedOffset:a})}),[K,E,Y]),le=l((e=>{if(!B&&!F)return;const t=K.getFullYear()-(B||new Date).getFullYear(),a=Number.parseInt(e.target.value)-(B||new Date).getMonth();J({type:"SET_OFFSET",newOffset:12*t+a})}),[B,F,K]),oe=k(U,E,Y,$),se=w(U,O,E,Y);return e("div",{ref:_,id:L,className:"jkl-calendar","data-testid":"jkl-calendar",children:t("div",{className:"jkl-calendar__padding",ref:X,onKeyDown:te,children:[t("fieldset",{className:"jkl-calendar-navigation",children:[t("div",{children:[e(c,{...z({calendars:W,onClick:ne}),variant:"ghost",icon:e(i,{variant:"medium",bold:!0})}),e(c,{...G({calendars:W,onClick:ne}),variant:"ghost",icon:e(u,{variant:"medium",bold:!0})})]}),t("div",{children:[t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:le,className:"jkl-calendar-navigation-dropdown__select","aria-label":C,value:P.toString(),children:se.map((({label:t,value:a})=>e("option",{value:a,children:t},a)))}),e(h,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]}),t("div",{className:"jkl-calendar-navigation-dropdown",children:[e("select",{onChange:re,className:"jkl-calendar-navigation-dropdown__select","aria-label":I,value:U.toString(),children:oe.map((t=>e("option",{value:t,children:t},t)))}),e(h,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]})]})]}),W.map((a=>t("table",{className:"jkl-calendar-table","data-testid":"jkl-datepicker-calendar",children:[t("caption",{className:"jkl-sr-only",children:[O[a.month],", ",a.year]}),e("thead",{children:e("tr",{children:x.map((t=>e("th",{children:t},`${a.month}${a.year}${t}`)))})}),e("tbody",{"data-testid":"jkl-datepicker-dates",children:a.weeks.map(((t,n)=>e("tr",{children:t.map(((t,r)=>{const l=`${a.month}${a.year}${n}${r}`;if("string"==typeof t)return e("td",{className:"jkl-calendar__date jkl-calendar__date--empty",children:t},l);const{date:o,selectable:s,today:d,prevMonth:c,nextMonth:i}=t;return e("td",{children:e("button",{...H({dateObj:t}),type:"button",className:"jkl-calendar-date-button",tabIndex:ae(t)?0:-1,"aria-label":`${o.getDate()}. ${O[o.getMonth()].toLowerCase()}`,"aria-current":d?"date":void 0,"data-adjacent":c||i?"true":void 0,disabled:!s,onKeyDown:ee,children:e("span",{"aria-hidden":"true",children:o.getDate()})})},l)}))},`${a.month}${a.year}${n}`)))})]},`${a.month}${a.year}`)))]})})}));_.displayName="Calendar";export{_ as Calendar};
2
2
  //# sourceMappingURL=Calendar.js.map