@fremtind/jokul 0.64.1 → 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 (740) 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/tabs/tabs.css +0 -2
  736. package/styles/components/tabs/tabs.scss +0 -2
  737. package/styles/components/toast/toast.css +4 -4
  738. package/styles/components/toast/toast.min.css +1 -1
  739. package/styles/styles.css +39 -69
  740. package/styles/styles.min.css +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.cjs","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.cjs","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type FC,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAnimatedHeight } from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport { useListNavigation } from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { TooltipContent } from \"../tooltip/TooltipContent.js\";\nimport { TooltipTrigger } from \"../tooltip/TooltipTrigger.js\";\nimport type { ComboboxProps, ComboboxValuePair } from \"./types.js\";\n\nexport function getComboboxValuePair(\n item: string | ComboboxValuePair,\n): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<\n Array<ComboboxValuePair>\n >(value || []);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n }\n\n return selectedValue.some((value) => value.value === option.value);\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e:\n | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n const newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, onChange, name],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: {\n target: { value: React.SetStateAction<string> };\n }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) =>\n option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<\n string | undefined\n >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n // Håndtere arrow-state\n const isPointingDown = !showMenu;\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (\n e: FocusEvent<\n HTMLDivElement | HTMLInputElement | HTMLButtonElement\n >,\n ) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent = componentRootElement?.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(\n new Event(\"focusout\", { bubbles: true }),\n );\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement\n .querySelector<HTMLButtonElement>('[role=\"option\"]')\n ?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some(\n (item) => item.isMarked,\n );\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter(\n (item) => !item.isMarked,\n );\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(\n e,\n selectedValue[selectedValue.length - 1].value,\n );\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector(\n '[role=\"option\"]:not([hidden])',\n );\n if (\n e.currentTarget.id === firstVisible?.id &&\n searchRef.current\n ) {\n searchRef.current.focus();\n }\n }\n }\n },\n [dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n const renderSelectedOption = useCallback(\n (option: ComboboxValuePair) => (\n <Chip\n key={option.value}\n data-testid=\"jkl-chip\"\n aria-label={`Fjern ${option.tagLabel}`}\n className={`jkl-combobox__selected-option ${\n marked && \"jkl-combobox__selected-option--marked\"\n }`}\n variant=\"input\"\n onClick={(e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n }}\n onBlur={handleBlur}\n >\n {option.tagLabel ? option.tagLabel : option.label}\n </Chip>\n ),\n [handleBlur, onTagRemove, marked],\n );\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", {\n \"jkl-combobox__wrapper--active-value\": hasSelection,\n })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className=\"jkl-combobox__chips\"\n data-testid=\"jkl-combobox__chips\"\n >\n {selectedValue\n .map(getComboboxValuePair)\n .map((option) => {\n return hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {renderSelectedOption(option)}\n </TooltipTrigger>\n <TooltipContent>\n {option.label}\n </TooltipContent>\n </Tooltip>\n ) : (\n renderSelectedOption(option)\n );\n })}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={\n selectedValue.length > 0 ? \"\" : placeholder\n }\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) &&\n \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(\n `${listId}__${option.value}`,\n ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">\n {option.description}\n </span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && (\n <div className=\"jkl-combobox__no-option\">\n {noMatchingOption}\n </div>\n )}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label={`${\n selectedValue.map((value) => value.label) ||\n \"Velg\"\n },${label}`}\n aria-expanded={showMenu}\n aria-controls={listId}\n onClick={() => setShowMenu((previous) => !previous)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated\n pointingDown={isPointingDown}\n />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","_a","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","_b","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","componentRootElement","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.stories.cjs","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Combobox as ComboboxComponent } from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport { 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","Combobox","parameters","layout","tags","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"iJAMMA,EAAO,CACTC,MAAO,uBACPC,qCAAWC,SACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEH,EAAkB,CAC3BI,KAAM,CACFC,MA1C2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAOVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,GACTC,EAAAA,IAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAA,IAAAD,EAAA,CAAA"}
1
+ {"version":3,"file":"Combobox.stories.cjs","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Combobox as ComboboxComponent } from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\nimport type { ComboboxValuePair } from \"../../combobox/types.js\";\n\nconst meta = {\n title: \"Komponenter/Combobox\",\n component: ComboboxComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof ComboboxComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst items: ComboboxValuePair[] = [\n { value: \"a080\", label: \"A080 - Rotavirusenteritt\", tagLabel: \"A080\" },\n {\n value: \"a081\",\n label: \"A081 - Akutt gastroenteritt som skyldes norovirus\",\n tagLabel: \"A081\",\n },\n { value: \"a082\", label: \"A082 - Adenovirusenteritt\", tagLabel: \"A082\" },\n {\n value: \"a083\",\n label: \"A083 - Annen virusenteritt\",\n tagLabel: \"A083\",\n },\n {\n value: \"a084\",\n label: \"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen\",\n tagLabel: \"A084\",\n },\n {\n value: \"a085\",\n label: \"A085 - Annen spesifisert mage-tarminfeksjon\",\n tagLabel: \"A085\",\n },\n {\n value: \"a090\",\n label: \"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak\",\n tagLabel: \"A090\",\n },\n {\n value: \"a099\",\n label: \"A099 - Gastroenteritt eller kolitt av uspesifisert årsak\",\n tagLabel: \"A099\",\n },\n {\n value: \"a150\",\n label: \"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur\",\n tagLabel: \"A150\",\n },\n];\n\nexport const Combobox: Story = {\n args: {\n items,\n label: \"Velg sykdommer\",\n name: \"disease\",\n onChange: () => {},\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 220 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","Combobox","parameters","layout","tags","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"iJAMMA,EAAO,CACTC,MAAO,uBACPC,qCAAWC,SACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEH,EAAkB,CAC3BI,KAAM,CACFC,MA1C2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAOVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,GACTC,EAAAA,IAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAA,IAAAD,EAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom"),o=require("../button/Button.cjs"),i=require("../modal/Modal.cjs"),s=require("../modal/useModal.cjs"),r=require("./CookieConsentContext.cjs"),a=require("./cookieConsentUtils.cjs"),l=require("./RequirementCheckbox.cjs");exports.CookieConsent=({blocking:c,onAccept:d,...u})=>{const{currentConsent:k,cookieName:m,cookieDomain:g,cookiePath:j,requirement:f,isOpen:p,setIsOpen:h,updateCurrentConsents:b}=r.useInternalState(),[C,x]=s.useModal({id:`jkl-cookie-modal-${t.useId()}`,role:c?"alertdialog":"dialog",title:"Informasjonskapsler"});if(t.useEffect((()=>{p?null==C||C.show():null==C||C.hide()}),[C,p]),t.useEffect((()=>{const e=()=>h(!1);return null==C||C.on("hide",e),()=>{null==C||C.off("hide",e)}}),[C,h]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return d&&d({functional:"denied",marketing:"denied",statistics:"denied"}),null;const v=(e=a.convertBooleanConsentObjectToConsentObject({functional:!0,statistics:!0,marketing:!0},f))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...k,...t};a.setConsentCookie({consent:n,name:m,domain:g,path:j}),b(),null==d||d(n),null==C||C.hide()};return n.createPortal(e.jsxs(i.ModalContainer,{...x.container,...u,"data-cookie-consent-open":p,children:[e.jsx(i.ModalOverlay,{...x.overlay}),e.jsxs(i.Modal,{component:"form",...x.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=a.convertBooleanConsentObjectToConsentObject({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},f);v(n)},children:[e.jsx(i.ModalHeader,{children:e.jsx(i.ModalTitle,{...x.title,children:"Velg informasjonskapsler"})}),e.jsxs(i.ModalBody,{children:[e.jsx("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),f.functional&&e.jsx(l.RequirementCheckbox,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===k.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-${k.functional}`),f.statistics&&e.jsx(l.RequirementCheckbox,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===k.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-${k.statistics}`),f.marketing&&e.jsx(l.RequirementCheckbox,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===k.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-${k.marketing}`)]}),e.jsxs(i.ModalActions,{children:[e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>v(),children:"Godta alle"}),e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),n=require("react-dom"),o=require("../button/Button.cjs"),i=require("../modal/Modal.cjs"),s=require("../modal/useModal.cjs"),r=require("./CookieConsentContext.cjs"),a=require("./RequirementCheckbox.cjs"),l=require("./cookieConsentUtils.cjs");exports.CookieConsent=({blocking:c,onAccept:d,...u})=>{const{currentConsent:k,cookieName:m,cookieDomain:g,cookiePath:j,requirement:f,isOpen:p,setIsOpen:h,updateCurrentConsents:b}=r.useInternalState(),[C,x]=s.useModal({id:`jkl-cookie-modal-${t.useId()}`,role:c?"alertdialog":"dialog",title:"Informasjonskapsler"});if(t.useEffect((()=>{p?null==C||C.show():null==C||C.hide()}),[C,p]),t.useEffect((()=>{const e=()=>h(!1);return null==C||C.on("hide",e),()=>{null==C||C.off("hide",e)}}),[C,h]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return d&&d({functional:"denied",marketing:"denied",statistics:"denied"}),null;const v=(e=l.convertBooleanConsentObjectToConsentObject({functional:!0,statistics:!0,marketing:!0},f))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...k,...t};l.setConsentCookie({consent:n,name:m,domain:g,path:j}),b(),null==d||d(n),null==C||C.hide()};return n.createPortal(e.jsxs(i.ModalContainer,{...x.container,...u,"data-cookie-consent-open":p,children:[e.jsx(i.ModalOverlay,{...x.overlay}),e.jsxs(i.Modal,{component:"form",...x.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=l.convertBooleanConsentObjectToConsentObject({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},f);v(n)},children:[e.jsx(i.ModalHeader,{children:e.jsx(i.ModalTitle,{...x.title,children:"Velg informasjonskapsler"})}),e.jsxs(i.ModalBody,{children:[e.jsx("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),f.functional&&e.jsx(a.RequirementCheckbox,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===k.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-${k.functional}`),f.statistics&&e.jsx(a.RequirementCheckbox,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===k.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-${k.statistics}`),f.marketing&&e.jsx(a.RequirementCheckbox,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===k.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-${k.marketing}`)]}),e.jsxs(i.ModalActions,{children:[e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>v(),children:"Godta alle"}),e.jsx(o.SecondaryButton,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};
2
2
  //# sourceMappingURL=CookieConsent.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.cjs","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":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"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"}
1
+ {"version":3,"file":"CookieConsent.cjs","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { type FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport type { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport {\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","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAGtBY,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAKrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GAAA,yDAqBmB,KACtB,MAAA4B,EAAUC,aAAWhC,GAE3B,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,0CA7BG,KACtB,MAAAC,EAAU9B,EAAM+B,WAAWhC,GACjC,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
1
+ {"version":3,"file":"CookieConsentContext.cjs","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from \"react\";\nimport {\n buildRequirementsObject,\n getConsentCookie,\n shouldShowConsentDialog,\n} from \"./cookieConsentUtils.js\";\nimport type {\n Consent,\n CookieConsentProviderProps,\n InternalContext,\n} from \"./types.js\";\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst Context = React.createContext<InternalContext | undefined>(undefined);\n\nexport const CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n cookiePath,\n}) => {\n const [timestamp, setTimestamp] = useState(() => Date.now());\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n /* Use timestamp as a dependency to be able to force re-reading of cookie */\n // biome-ignore lint/correctness/useExhaustiveDependencies:\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName, timestamp]);\n\n const [isOpen, setIsOpen] = useState(() => {\n return shouldShowConsentDialog(requirement, consentCookie);\n });\n\n return (\n <Context.Provider\n value={{\n isOpen,\n setIsOpen,\n updateCurrentConsents: () => setTimestamp(Date.now()),\n requirement,\n currentConsent: consentCookie,\n cookieName,\n cookieDomain,\n cookiePath,\n }}\n >\n {children}\n </Context.Provider>\n );\n};\n\nexport const useInternalState = () => {\n const context = React.useContext(Context);\n if (context === undefined) {\n throw new Error(\n \"CookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n return context;\n};\n\ntype UseCookieConsent = {\n openConsentModal: () => void;\n consents: Consent;\n};\n\nexport const useCookieConsent = (): UseCookieConsent => {\n const context = useContext(Context);\n\n if (context === undefined) {\n throw new Error(\n \"useCookieConsent must be used within a CookieConsentProvider\",\n );\n }\n\n const openConsentModal = () => {\n context.setIsOpen(true);\n };\n\n const consents = context.currentConsent;\n\n return { openConsentModal, consents };\n};\n"],"names":["DEFAULT_COOKIE_NAME","Context","React","createContext","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","cookiePath","timestamp","setTimestamp","useState","Date","now","requirement","useMemo","buildRequirementsObject","consentCookie","getConsentCookie","adapter","name","isOpen","setIsOpen","shouldShowConsentDialog","jsx","Provider","value","updateCurrentConsents","currentConsent","context","useContext","Error","openConsentModal","consents"],"mappings":"8KAYaA,EAAsB,0BAE7BC,EAAUC,EAAMC,mBAA2C,iCAEU,EACvEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAaT,EACbU,aAAAA,EACAC,WAAAA,MAEM,MAACC,EAAWC,GAAgBC,YAAS,IAAMC,KAAKC,QAEhDC,EAAcC,EAAAA,SAChB,IAAMC,EAAwBA,wBAAA,CAAEb,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,IAKtBY,EAAgBF,EAAAA,SAAQ,IAEtBG,EAAAA,iBAAiB,CAAEC,QAASjB,EAAekB,KAAMd,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,EAAYG,KAExBY,EAAQC,GAAaX,YAAS,IAC1BY,EAAAA,wBAAwBT,EAAaG,KAI5C,OAAAO,EAAAA,IAAC1B,EAAQ2B,SAAR,CACGC,MAAO,CACHL,OAAAA,EACAC,UAAAA,EACAK,sBAAuB,IAAMjB,EAAaE,KAAKC,OAC/CC,YAAAA,EACAc,eAAgBX,EAChBX,WAAAA,EACAC,aAAAA,EACAC,WAAAA,GAGHP,SAAAA,GAAA,yDAqBmB,KACtB,MAAA4B,EAAUC,aAAWhC,GAE3B,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,gEAUD,MAAA,CAAEC,iBANgB,KACrBH,EAAQP,WAAU,EAAI,EAKCW,SAFVJ,EAAQD,0CA7BG,KACtB,MAAAC,EAAU9B,EAAM+B,WAAWhC,GACjC,QAAgB,IAAZ+B,EACA,MAAM,IAAIE,MACN,6DAID,OAAAF"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequirementCheckbox.cjs","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":["defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"uLAUmC,EAC/BA,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAA,KAAAC,WAAA,CAAAF,SAAA,CAAAG,EAAAA,IAACC,EAAAA,SAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAAA,IAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
1
+ {"version":3,"file":"RequirementCheckbox.cjs","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":["defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"uLAUmC,EAC/BA,eAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KAIQC,EAAAA,KAAAC,WAAA,CAAAF,SAAA,CAAAG,EAAAA,IAACC,EAAAA,SAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAAA,IAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:t,functional:e,statistics:o})=>({...t&&{marketing:t},...e&&{functional:e},...o&&{statistics:o}}),exports.convertBooleanConsentObjectToConsentObject=(e,o)=>({functional:o.functional?t(e.functional):void 0,statistics:o.statistics?t(e.statistics):void 0,marketing:o.marketing?t(e.marketing):void 0}),exports.convertBooleanToConsentValue=t,exports.getConsentCookie=({adapter:t,name:e})=>{const o=(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 o?JSON.parse(o[1]):t?t():void 0},exports.setConsentCookie=({consent:t,maxAge:e=10368e3,name:o,domain:n,path:i})=>{document.cookie=[`${o}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!n&&`domain=${n}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},exports.shouldShowConsentDialog=(t,e)=>{if(e){const o=new Map(Object.entries(e)),n=Object.entries(t);for(const[t,e]of n)if(e&&null===o.get(t))return!0;return!1}return Object.values(t).some((t=>t))};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=t=>typeof t>"u"?null:!1===t||"false"===String(t).toLowerCase()?"denied":"accepted";exports.buildRequirementsObject=({marketing:t,functional:e,statistics:o})=>({...t&&{marketing:t},...e&&{functional:e},...o&&{statistics:o}}),exports.convertBooleanConsentObjectToConsentObject=(e,o)=>({functional:o.functional?t(e.functional):void 0,statistics:o.statistics?t(e.statistics):void 0,marketing:o.marketing?t(e.marketing):void 0}),exports.convertBooleanToConsentValue=t,exports.getConsentCookie=({adapter:t,name:e})=>{const o=(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 o?JSON.parse(o[1]):t?t():void 0},exports.setConsentCookie=({consent:t,maxAge:e=10368e3,name:o,domain:n,path:i})=>{document.cookie=[`${o}=${JSON.stringify(t)}`,`max-age=${e}`,"SameSite=Lax",!!n&&`domain=${n}`,!!i&&`path=${i}`].filter((t=>t)).join(";")},exports.shouldShowConsentDialog=(t,e)=>{if(!e)return Object.values(t).some((t=>t));const o=new Map(Object.entries(e)),n=Object.entries(t);for(const[t,e]of n)if(e&&null===o.get(t))return!0;return!1};
2
2
  //# sourceMappingURL=cookieConsentUtils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookieConsentUtils.cjs","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":["convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consent","requirement","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","path","stringify","filter","f","join","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue"],"mappings":"gFAEA,MAqGaA,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAoB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,MACJ,IAEYF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDAzB8B,CACtDC,EACAC,KAAAA,CAGIH,WAAYG,EAAYH,WAClBL,EAA6BO,EAAQF,iBACrC,EACNC,WAAYE,EAAYF,WAClBN,EAA6BO,EAAQD,iBACrC,EACNF,UAAWI,EAAYJ,UACjBJ,EAA6BO,EAAQH,gBACrC,oEA5GkB,EAC5BK,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAE1B,OAAKC,QAAL,CAIOA,EAUQQ,CAAUT,GAEzB,OAAIC,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5BF,QAAAA,EACAe,OAAAA,EAJoB,QAKpBZ,KAAAA,EACAa,OAAAA,EACAC,KAAAA,MAQAZ,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKK,UAAUlB,KAC1B,WAAWe,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCpB,EACAD,KAEA,GAAKA,EAKE,CAEH,MAAMsB,EAAa,IAAIC,IAAIC,OAAOC,QAAQzB,IAGpC0B,EAAqBF,OAAOC,QAAQxB,GAE1C,IAAA,MAAYE,EAAMwB,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAIzB,GACR,OAAA,EAIR,OAAA,CACX,CAvBW,OAAAqB,OAAOK,OAAO5B,GAAa6B,MAC7BC,GAAqBA,GAAA"}
1
+ {"version":3,"file":"cookieConsentUtils.cjs","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":["convertBooleanToConsentValue","formValue","String","toLowerCase","marketing","functional","statistics","consent","requirement","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","maxAge","domain","path","stringify","filter","f","join","Object","values","some","requirementValue","consentMap","Map","entries","requirementEntries","required","get"],"mappings":"gFAEA,MAqGaA,EACTC,UAEWA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,2CAoB4B,EACnCC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,MACJ,IAEYF,GAAa,CAAEA,UAAAA,MACfC,GAAc,CAAEA,WAAAA,MAChBC,GAAc,CAAEA,WAAAA,wDAzB8B,CACtDC,EACAC,KAAAA,CAGIH,WAAYG,EAAYH,WAClBL,EAA6BO,EAAQF,iBACrC,EACNC,WAAYE,EAAYF,WAClBN,EAA6BO,EAAQD,iBACrC,EACNF,UAAWI,EAAYJ,UACjBJ,EAA6BO,EAAQH,gBACrC,oEA5GkB,EAC5BK,QAAAA,EACAC,KAAAA,MAKM,MAAAC,EA3BSD,KACX,UAAOE,SAAa,IACb,OAGL,MAAAD,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAE1B,OAAKC,QAAL,CAIOA,EAUQQ,CAAUT,GAEzB,OAAIC,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADX,CACmB,2BASS,EAC5BF,QAAAA,EACAe,OAAAA,EAJoB,QAKpBZ,KAAAA,EACAa,OAAAA,EACAC,KAAAA,MAQAZ,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKK,UAAUlB,KAC1B,WAAWe,IACX,iBACEC,GAAU,UAAUA,MACpBC,GAAQ,QAAQA,KAEjBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,kCAGsB,CACnCpB,EACAD,KAEA,IAAKA,EAEM,OAAAsB,OAAOC,OAAOtB,GAAauB,MAC7BC,GAAqBA,IAK9B,MAAMC,EAAa,IAAIC,IAAIL,OAAOM,QAAQ5B,IAGpC6B,EAAqBP,OAAOM,QAAQ3B,GAE1C,IAAW,MAACE,EAAM2B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBJ,EAAWK,IAAI5B,GACR,OAAA,EAIR,OAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.stories.cjs","sources":["../../../../../src/components/cookie-consent/stories/CookieConsent.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React, { 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":"iQAWMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EAAAA,sBACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAC,GAmBFC,EAAuB,CAChCC,KAAM,CACFC,SACIC,EAAAA,KAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,EAAAA,mBAE7B,cACK,MACG,CAAAH,SAAA,CAAAC,EAAAA,IAACG,EAAcA,cAAA,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAAAA,IAACK,iBAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
1
+ {"version":3,"file":"CookieConsent.stories.cjs","sources":["../../../../../src/components/cookie-consent/stories/CookieConsent.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport React, { type FC } from \"react\";\nimport type { WithChildren } from \"../../../core/types.js\";\nimport { PrimaryButton } from \"../../button/Button.js\";\nimport { CookieConsent as CookieConsentComponent } from \"../CookieConsent.js\";\nimport {\n CookieConsentProvider,\n useCookieConsent,\n} from \"../CookieConsentContext.js\";\nimport \"../styles/_index.scss\";\n\nconst meta = {\n title: \"Komponenter/CookieConsent\",\n component: CookieConsentProvider,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n argTypes: {},\n} satisfies Meta<typeof CookieConsentProvider>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst Wrapper: FC<WithChildren> = ({ children }) => {\n const { openConsentModal } = useCookieConsent();\n\n return (\n <div>\n <PrimaryButton onClick={() => openConsentModal()}>\n Åpne samtykker\n </PrimaryButton>\n {children}\n </div>\n );\n};\n\nexport const CookieConsent: Story = {\n args: {\n children: (\n <Wrapper>\n <CookieConsentComponent />\n </Wrapper>\n ),\n cookieName: \"demo-consent-cookie\",\n functional: true,\n statistics: true,\n marketing: true,\n },\n};\n"],"names":["meta","title","component","CookieConsentProvider","parameters","layout","tags","argTypes","CookieConsent","args","children","jsx","openConsentModal","useCookieConsent","PrimaryButton","onClick","CookieConsentComponent","cookieName","functional","statistics","marketing"],"mappings":"iQAWMA,EAAO,CACTC,MAAO,4BACPC,UAAWC,EAAAA,sBACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,YACPC,SAAU,CAAC,GAmBFC,EAAuB,CAChCC,KAAM,CACFC,SACIC,EAAAA,KAhBsB,EAAGD,SAAAA,MAC3B,MAAEE,iBAAAA,GAAqBC,EAAAA,mBAE7B,cACK,MACG,CAAAH,SAAA,CAAAC,EAAAA,IAACG,EAAcA,cAAA,CAAAC,QAAS,IAAMH,IAAoBF,SAElD,mBACCA,IACL,GAQQ,CAAAA,SAAAC,EAAAA,IAACK,iBAAuB,KAGhCC,WAAY,sBACZC,YAAY,EACZC,YAAY,EACZC,WAAW"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react");exports.Countdown=({className:s,from:r,isPaused:a,...n})=>{const[o,l]=t.useState(Math.floor(r/1e3));return t.useEffect((()=>{o<=0||setTimeout((()=>{a||l((e=>e-1))}),1e3)}),[a,r,o,l]),e.jsxs("div",{className:`jkl-countdown ${s??""}`,role:"timer","data-testid":"jkl-countdown",...n,children:[e.jsx("span",{className:"jkl-countdown__tracker",role:"presentation",style:{"--duration":`${r}ms`,"--play-state":a?"paused":"running"},"data-testid":"jkl-countdown__tracker"}),e.jsx("span",{className:"jkl-sr-only",children:o})]})};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react");exports.Countdown=({className:s,from:r,isPaused:a,...n})=>{const[o,l]=t.useState(Math.floor(r/1e3));return t.useEffect((()=>{o<=0||setTimeout((()=>{a||l((e=>e-1))}),1e3)}),[a,o]),e.jsxs("div",{className:`jkl-countdown ${s??""}`,role:"timer","data-testid":"jkl-countdown",...n,children:[e.jsx("span",{className:"jkl-countdown__tracker",role:"presentation",style:{"--duration":`${r}ms`,"--play-state":a?"paused":"running"},"data-testid":"jkl-countdown__tracker"}),e.jsx("span",{className:"jkl-sr-only",children:o})]})};
2
2
  //# sourceMappingURL=Countdown.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Countdown.cjs","sources":["../../../../src/components/countdown/Countdown.tsx"],"sourcesContent":["import React, { useState, type CSSProperties, type FC, useEffect } from \"react\";\nimport { 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":["className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"0JAG6C,EACzCA,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAAAA,SAC5CC,KAAKC,MAAMP,EAAO,MAGtBQ,OAAAA,EAAAA,WAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUD,EAAMG,EAAkBC,IAGlCO,EAAAA,KAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAAA,IAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MAAA"}
1
+ {"version":3,"file":"Countdown.cjs","sources":["../../../../src/components/countdown/Countdown.tsx"],"sourcesContent":["import React, { useState, type CSSProperties, type FC, useEffect } from \"react\";\nimport type { CountdownProps } from \"./types.js\";\n\nexport const Countdown: FC<CountdownProps> = ({\n className,\n from,\n isPaused,\n ...rest\n}) => {\n const [remainingSeconds, setRemainingSeconds] = useState(\n Math.floor(from / 1000),\n );\n\n useEffect(() => {\n if (remainingSeconds <= 0) {\n return;\n }\n\n setTimeout(() => {\n if (!isPaused) {\n setRemainingSeconds((sec) => sec - 1);\n }\n }, 1000);\n }, [isPaused, remainingSeconds]);\n\n return (\n <div\n className={`jkl-countdown ${className ?? \"\"}`}\n role=\"timer\"\n data-testid=\"jkl-countdown\"\n {...rest}\n >\n <span\n className=\"jkl-countdown__tracker\"\n role=\"presentation\"\n style={\n {\n \"--duration\": `${from}ms`,\n \"--play-state\": isPaused ? \"paused\" : \"running\",\n } as CSSProperties\n }\n data-testid=\"jkl-countdown__tracker\"\n />\n <span className=\"jkl-sr-only\">{remainingSeconds}</span>\n </div>\n );\n};\n"],"names":["className","from","isPaused","rest","remainingSeconds","setRemainingSeconds","useState","Math","floor","useEffect","setTimeout","sec","jsxs","role","children","jsx","style"],"mappings":"0JAG6C,EACzCA,UAAAA,EACAC,KAAAA,EACAC,SAAAA,KACGC,MAEG,MAACC,EAAkBC,GAAuBC,EAAAA,SAC5CC,KAAKC,MAAMP,EAAO,MAGtBQ,OAAAA,EAAAA,WAAU,KACFL,GAAoB,GAIxBM,YAAW,KACFR,GACmBG,GAACM,GAAQA,EAAM,GAAC,GAEzC,IAAI,GACR,CAACT,EAAUE,IAGVQ,EAAAA,KAAC,MAAA,CACGZ,UAAW,iBAAiBA,GAAa,KACzCa,KAAK,QACL,cAAY,mBACRV,EAEJW,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACGf,UAAU,yBACVa,KAAK,eACLG,MACI,CACI,aAAc,GAAGf,MACjB,eAAgBC,EAAW,SAAW,WAG9C,cAAY,2BAEfa,EAAAA,IAAA,OAAA,CAAKf,UAAU,cAAec,SAAiBV,MAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Countdown.stories.cjs","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","Countdown","parameters","layout","tags","Wrapper","children","key","setKey","useState","jsxs","Flex","style","width","direction","gap","jsx","PrimaryButton","onClick","Date","now","args","from","decorators","Story"],"mappings":"wQAQMA,EAAO,CACTC,MAAO,wBACPC,UAAWC,EAAAC,UACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMLC,EAA4B,EAAGC,SAAAA,MACjC,MAAOC,EAAKC,GAAUC,WAAS,GAG3B,OAAAC,OAACC,EAAAA,KAAK,CAAAC,MAAO,CAAEC,MAAO,KAAOC,UAAU,SAASC,IAAK,GACjDT,SAAA,CAACU,EAAAA,IAAA,MAAA,CAAeV,SAAAA,GAANC,GACVS,EAAAA,IAACC,EAAAA,cAAA,CACGC,QAAS,IAAMV,EAAOW,KAAKC,OAC3BR,MAAO,CAAEC,MAAO,KACnBP,SAAA,cAGL,EAIKL,EAAmB,CAC5BoB,KAAM,CACFC,KAAM,KAEVC,WAAaC,SACRnB,EACG,CAAAC,SAAAU,MAACQ,GAAM"}
1
+ {"version":3,"file":"Countdown.stories.cjs","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","Countdown","parameters","layout","tags","Wrapper","children","key","setKey","useState","jsxs","Flex","style","width","direction","gap","jsx","PrimaryButton","onClick","Date","now","args","from","decorators","Story"],"mappings":"wQAQMA,EAAO,CACTC,MAAO,wBACPC,UAAWC,EAAAC,UACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAMLC,EAA4B,EAAGC,SAAAA,MACjC,MAAOC,EAAKC,GAAUC,WAAS,GAG3B,OAAAC,OAACC,EAAAA,KAAK,CAAAC,MAAO,CAAEC,MAAO,KAAOC,UAAU,SAASC,IAAK,GACjDT,SAAA,CAACU,EAAAA,IAAA,MAAA,CAAeV,SAAAA,GAANC,GACVS,EAAAA,IAACC,EAAAA,cAAA,CACGC,QAAS,IAAMV,EAAOW,KAAKC,OAC3BR,MAAO,CAAEC,MAAO,KACnBP,SAAA,cAGL,EAIKL,EAAmB,CAC5BoB,KAAM,CACFC,KAAM,KAEVC,WAAaC,SACRnB,EACG,CAAAC,SAAAU,MAACQ,GAAM"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("../../../clsx-E3yX_9sL.cjs"),a=require("date-fns"),r=require("react"),n=require("react-dom"),l=require("../icon/icons/CalendarIcon.cjs"),o=require("../icon-button/IconButton.cjs"),u=require("../input-group/InputGroup.cjs"),s=require("../popover/Popover.cjs"),i=require("../text-input/BaseTextInput.cjs"),c=require("./internal/Calendar.cjs"),d=require("./internal/utils.cjs"),p=require("./utils.cjs"),v=require("./validation.cjs"),f=r.forwardRef(((f,b)=>{const{"data-testautoid":k,id:h,className:m="",label:g="Velg dato",labelProps:j,defaultValue:D,defaultShow:y=!1,value:C,disableBeforeDate:x,disableAfterDate:q,yearsToShow:L,name:P,helpLabel:S,errorLabel:w,invalid:I,density:O,days:B,months:T,monthLabel:_,yearLabel:E,placeholder:N="dd.mm.åååå",width:R="11.25rem",onChange:U,onBlur:V,onFocus:F,onKeyDown:K,action:W,showCalendarLabel:A="Åpne kalender",hideCalendarLabel:G="Lukk kalender",supportLabelProps:M,tooltip:H,textInputProps:z,...J}=f;"production"!==process.env.NODE_ENV&&C&&D&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const Q=p.parseDateString(x),X=Q?a.startOfDay(Q):void 0,Y=p.parseDateString(q),Z=Y?a.startOfDay(Y):void 0,[$,ee]=r.useState(d.getInitialDate(C,D,X,Z)),[te,ae]=r.useState(null),[re,ne]=r.useState(y),le=r.useRef(null),oe=r.useRef(null),ue=r.useRef(null),se=r.useRef(null),ie=r.useCallback((e=>{se.current=e,b&&("function"==typeof b?b(e):b.current=e)}),[se,b]),ce=r.useCallback((e=>{F&&oe.current&&(oe.current.contains(e.relatedTarget)||F(e,$,{error:te,value:e.target.value}))}),[F,$,te]),de=r.useCallback((e=>{V&&V(e,$,{error:te,value:e.target.value})}),[V,$,te]),pe=r.useCallback((e=>{"Escape"===e.key&&(ne(!1),e.preventDefault(),e.stopPropagation()),null!=W&&W.onKeyDown&&W.onKeyDown(e)}),[ne,W]),ve=r.useCallback((e=>{let t=null,a=null;if(e.target.value){const r=p.parseDateString(e.target.value);r?X&&!v.isWithinLowerBound(r,X)?a="OUTSIDE_LOWER_BOUND":Z&&!v.isWithinUpperBound(r,Z)?a="OUTSIDE_UPPER_BOUND":ne(!1):a="WRONG_FORMAT",t=r||null}ae(a),ee(t),U&&U(e,t,{error:a,value:e.target.value})}),[U,ae,ee,ne,X,Z]),fe=r.useCallback((e=>{n.flushSync((()=>{ne(!re)}));const t=le.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>a&&a.focus())),null!=W&&W.onClick&&W.onClick(e)}),[ne,re,W,le]),be=r.useCallback((({date:e})=>{if(ne(!1),ee(e),se.current){const t=se.current;t.value=p.formatInput(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),U&&U(a,e,{error:null,value:t.value})}}),[ne,ee,U]),ke=r.useCallback((e=>{e.preventDefault(),ne(!1),ue.current&&ue.current.focus()}),[ne]);return e.jsx(u.InputGroup,{id:h,className:t.clsx("jkl-datepicker",m),...J,ref:oe,label:g,labelProps:j,density:O,helpLabel:S,errorLabel:w,supportLabelProps:M,tooltip:H,render:t=>e.jsx(i.BaseTextInput,{"data-focused":re?"true":void 0,ref:ie,"data-testid":"jkl-datepicker__input","data-testautoid":k,className:"jkl-datepicker__input",name:P,defaultValue:D,density:O,value:C,type:"text",placeholder:N,width:R,onFocus:ce,onBlur:de,onChange:ve,actionButton:e.jsxs(s.Popover,{positionReference:se,open:re,onOpenChange:()=>ne(!re),offset:8,children:[e.jsx(s.Popover.Trigger,{...W,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:re?G:A,tabIndex:0,onClick:fe,onKeyDown:pe,asChild:!0,children:e.jsx(o.IconButton,{children:e.jsx(l.CalendarIcon,{})})}),e.jsx(s.Popover.Content,{initialFocus:-1,padding:24,children:e.jsx(c.Calendar,{ref:le,density:O,date:$,minDate:X,maxDate:Z,days:B,months:T,monthLabel:_,yearLabel:E,yearsToShow:L,onDateSelected:be,onTabOutside:ke})})]}),...z,...t,"aria-invalid":I||!!w})})}));f.displayName="DatePicker",exports.DatePicker=f;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("../../../clsx-E3yX_9sL.cjs"),a=require("date-fns"),r=require("react"),n=require("react-dom"),l=require("../icon-button/IconButton.cjs"),o=require("../icon/icons/CalendarIcon.cjs"),u=require("../input-group/InputGroup.cjs"),s=require("../popover/Popover.cjs"),i=require("../text-input/BaseTextInput.cjs"),c=require("./internal/Calendar.cjs"),d=require("./internal/utils.cjs"),p=require("./utils.cjs"),v=require("./validation.cjs"),f=r.forwardRef(((f,b)=>{const{"data-testautoid":k,id:h,className:m="",label:g="Velg dato",labelProps:j,defaultValue:D,defaultShow:y=!1,value:C,disableBeforeDate:x,disableAfterDate:q,yearsToShow:L,name:P,helpLabel:S,errorLabel:w,invalid:I,density:O,days:B,months:T,monthLabel:_,yearLabel:E,placeholder:N="dd.mm.åååå",width:R="11.25rem",onChange:U,onBlur:V,onFocus:F,onKeyDown:K,action:W,showCalendarLabel:A="Åpne kalender",hideCalendarLabel:G="Lukk kalender",supportLabelProps:M,tooltip:H,textInputProps:z,...J}=f;"production"!==process.env.NODE_ENV&&C&&D&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const Q=p.parseDateString(x),X=Q?a.startOfDay(Q):void 0,Y=p.parseDateString(q),Z=Y?a.startOfDay(Y):void 0,[$,ee]=r.useState(d.getInitialDate(C,D,X,Z)),[te,ae]=r.useState(null),[re,ne]=r.useState(y),le=r.useRef(null),oe=r.useRef(null),ue=r.useRef(null),se=r.useRef(null),ie=r.useCallback((e=>{se.current=e,b&&("function"==typeof b?b(e):b.current=e)}),[b]),ce=r.useCallback((e=>{F&&oe.current&&(oe.current.contains(e.relatedTarget)||F(e,$,{error:te,value:e.target.value}))}),[F,$,te]),de=r.useCallback((e=>{V&&V(e,$,{error:te,value:e.target.value})}),[V,$,te]),pe=r.useCallback((e=>{"Escape"===e.key&&(ne(!1),e.preventDefault(),e.stopPropagation()),null!=W&&W.onKeyDown&&W.onKeyDown(e)}),[W]),ve=r.useCallback((e=>{let t=null,a=null;if(e.target.value){const r=p.parseDateString(e.target.value);r?X&&!v.isWithinLowerBound(r,X)?a="OUTSIDE_LOWER_BOUND":Z&&!v.isWithinUpperBound(r,Z)?a="OUTSIDE_UPPER_BOUND":ne(!1):a="WRONG_FORMAT",t=r||null}ae(a),ee(t),U&&U(e,t,{error:a,value:e.target.value})}),[U,X,Z]),fe=r.useCallback((e=>{n.flushSync((()=>{ne(!re)}));const t=le.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>null==a?void 0:a.focus())),null!=W&&W.onClick&&W.onClick(e)}),[re,W]),be=r.useCallback((({date:e})=>{if(ne(!1),ee(e),se.current){const t=se.current;t.value=p.formatInput(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),U&&U(a,e,{error:null,value:t.value})}}),[U]),ke=r.useCallback((e=>{var t;e.preventDefault(),ne(!1),null==(t=ue.current)||t.focus()}),[]);return e.jsx(u.InputGroup,{id:h,className:t.clsx("jkl-datepicker",m),...J,ref:oe,label:g,labelProps:j,density:O,helpLabel:S,errorLabel:w,supportLabelProps:M,tooltip:H,render:t=>e.jsx(i.BaseTextInput,{"data-focused":re?"true":void 0,ref:ie,"data-testid":"jkl-datepicker__input","data-testautoid":k,className:"jkl-datepicker__input",name:P,defaultValue:D,density:O,value:C,type:"text",placeholder:N,width:R,onFocus:ce,onBlur:de,onChange:ve,actionButton:e.jsxs(s.Popover,{positionReference:se,open:re,onOpenChange:()=>ne(!re),offset:8,children:[e.jsx(s.Popover.Trigger,{...W,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:re?G:A,tabIndex:0,onClick:fe,onKeyDown:pe,asChild:!0,children:e.jsx(l.IconButton,{children:e.jsx(o.CalendarIcon,{})})}),e.jsx(s.Popover.Content,{initialFocus:-1,padding:24,children:e.jsx(c.Calendar,{ref:le,density:O,date:$,minDate:X,maxDate:Z,days:B,months:T,monthLabel:_,yearLabel:E,yearsToShow:L,onDateSelected:be,onTabOutside:ke})})]}),...z,...t,"aria-invalid":I||!!w})})}));f.displayName="DatePicker",exports.DatePicker=f;
2
2
  //# sourceMappingURL=DatePicker.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.cjs","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":"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"}
1
+ {"version":3,"file":"DatePicker.cjs","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.cjs';
2
2
  export { isCorrectFormat, isWithinLowerBound, isWithinUpperBound, } from './validation.cjs';
3
3
  export { formatInput, parseDateString, isBlurTargetOutside } from './utils.cjs';
4
- export { type DatePickerProps, type YearsToShow, type DatePickerChangeEventHandler, type DatePickerFocusEventHandler, type DatePickerBlurEventHandler, type DatePickerKeyDownEventHandler, type DatePickerAction, type ComparisonOptions, type DatePickerMetadata, } from './types.cjs';
4
+ export type { DatePickerProps, YearsToShow, DatePickerChangeEventHandler, DatePickerFocusEventHandler, DatePickerBlurEventHandler, DatePickerKeyDownEventHandler, DatePickerAction, ComparisonOptions, DatePickerMetadata, } from './types.cjs';
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),a=require("react-dom"),n=require("../../../hooks/useId/useId.cjs"),r=require("../../button/Button.cjs"),l=require("../../icon/icons/ArrowLeftIcon.cjs"),o=require("../../icon/icons/ArrowRightIcon.cjs"),s=require("../../icon/icons/ChevronDownIcon.cjs"),c=require("./calendarReducer.cjs"),d=require("./useCalendar.cjs"),i=require("./utils.cjs"),u=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],h=["man","tir","ons","tor","fre","lør","søn"],g=t.forwardRef(((g,j)=>{const{date:b,defaultSelected:f,density:m,minDate:v,maxDate:p,days:k=h,months:x=u,monthLabel:D="Velg måned",yearLabel:w="Velg år",yearsToShow:y=i.DEFAULT_YEARS_TO_SHOW,onTabOutside:S,...M}=g,_=n.useId("jkl-calendar"),[{offset:F,selectedDate:A,shownDate:C},N]=t.useReducer(c.calendarReducer,i.getInitialDateShown(b,f,v,p),c.calendarInitializer),q=C.getMonth(),E=C.getFullYear();t.useEffect((()=>{N({type:"SET_SELECTED_DATE",newDate:i.getInitialDateShown(b,f,v,p)})}),[b,f,v,p]);const O=t.useCallback((e=>{N({type:"SET_OFFSET",newOffset:e})}),[]),{calendars:Y,getBackProps:I,getDateProps:T,getForwardProps:$,handleOffsetChanged:R}=d.useCalendar({date:A,selected:A,minDate:v,maxDate:p,offset:F,onOffsetChanged:O,firstDayOfWeek:1,...M}),L=t.useRef(null),B=t.useCallback((e=>{if(!L.current)return;const t=document.activeElement,n=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]'),r=async e=>{null==t||t.setAttribute("tabindex","-1"),e.setAttribute("tabindex","0"),e.focus()};n.forEach(((l,o)=>{const s=o+e;if(l==t)if(s<=n.length-1&&s>=0)r(n[s]);else if(e<0){if(i.isBackDisabled({calendars:Y,minDate:v})||(a.flushSync((()=>{R(F-i.subtractMonth({calendars:Y,offset:1,minDate:v}))})),!L.current))return;const e=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[e.length+s]&&(e[0].setAttribute("tabindex","-1"),r(e[e.length+s]))}else{if(i.isForwardDisabled({calendars:Y,maxDate:p})||(a.flushSync((()=>{R(F+i.addMonth({calendars:Y,offset:1,maxDate:p}))})),!L.current))return;const e=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[s-n.length]&&(e[0].setAttribute("tabindex","-1"),r(e[s-n.length]))}}))}),[R,L,F,Y,p,v]),K=t.useCallback((e=>{switch(e.key){case"ArrowUp":B(-7),e.preventDefault();break;case"ArrowRight":B(1),e.preventDefault();break;case"ArrowDown":B(7),e.preventDefault();break;case"ArrowLeft":B(-1),e.preventDefault()}}),[B]),P=t.useCallback((e=>{var t;if("Tab"!==e.key)return;const a=null==(t=L.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())}),[]),J=t.useCallback((e=>{const{date:t,selected:a,selectable:n,prevMonth:r,nextMonth:l}=e;return!!n&&!(!a&&t.toString()!==(null==v?void 0:v.toString())&&(r||l||C.getFullYear()!==t.getFullYear()||A.getMonth()===t.getMonth()||1!==t.getDate()))}),[C,v,A]),U=t.useCallback((()=>{v&&C.getFullYear()-v.getFullYear()==0&&C.getMonth()-v.getMonth()==1?document.querySelectorAll(".jkl-calendar-navigation__arrow")[1].focus():p&&p.getFullYear()-C.getFullYear()==0&&p.getMonth()-C.getMonth()==1&&document.querySelectorAll(".jkl-calendar-navigation__arrow")[0].focus()}),[v,p,C]),V=t.useCallback((e=>{if(4!==e.target.value.length)return;const t=Number.parseInt(e.target.value);if(Number.isNaN(t))return;let a=12*(t-C.getFullYear());const n=new Date(C.getFullYear(),C.getMonth()+a,C.getDate());p&&p.getFullYear()===n.getFullYear()&&p.getMonth()<n.getMonth()?a-=n.getMonth()-p.getMonth():v&&v.getFullYear()===n.getFullYear()&&v.getMonth()>n.getMonth()&&(a+=v.getMonth()-n.getMonth()),N({type:"ADD_OFFSET",addedOffset:a})}),[C,v,p]),W=t.useCallback((e=>{if(!A&&!b)return;const t=C.getFullYear()-(A||new Date).getFullYear(),a=Number.parseInt(e.target.value)-(A||new Date).getMonth();N({type:"SET_OFFSET",newOffset:12*t+a})}),[A,b,C]),z=i.getYearSelectOptions(E,v,p,y),H=i.getMonthSelectOptions(E,x,v,p);return e.jsx("div",{ref:j,id:_,className:"jkl-calendar","data-testid":"jkl-calendar",children:e.jsxs("div",{className:"jkl-calendar__padding",ref:L,onKeyDown:P,children:[e.jsxs("fieldset",{className:"jkl-calendar-navigation",children:[e.jsxs("div",{children:[e.jsx(r.Button,{...I({calendars:Y,onClick:U}),variant:"ghost",icon:e.jsx(l.ArrowLeftIcon,{variant:"medium",bold:!0})}),e.jsx(r.Button,{...$({calendars:Y,onClick:U}),variant:"ghost",icon:e.jsx(o.ArrowRightIcon,{variant:"medium",bold:!0})})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"jkl-calendar-navigation-dropdown",children:[e.jsx("select",{onChange:W,className:"jkl-calendar-navigation-dropdown__select","aria-label":D,value:q.toString(),children:H.map((({label:t,value:a})=>e.jsx("option",{value:a,children:t},a)))}),e.jsx(s.ChevronDownIcon,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]}),e.jsxs("div",{className:"jkl-calendar-navigation-dropdown",children:[e.jsx("select",{onChange:V,className:"jkl-calendar-navigation-dropdown__select","aria-label":w,value:E.toString(),children:z.map((t=>e.jsx("option",{value:t,children:t},t)))}),e.jsx(s.ChevronDownIcon,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]})]})]}),Y.map((t=>e.jsxs("table",{className:"jkl-calendar-table","data-testid":"jkl-datepicker-calendar",children:[e.jsxs("caption",{className:"jkl-sr-only",children:[x[t.month],", ",t.year]}),e.jsx("thead",{children:e.jsx("tr",{children:k.map((a=>e.jsx("th",{children:a},`${t.month}${t.year}${a}`)))})}),e.jsx("tbody",{"data-testid":"jkl-datepicker-dates",children:t.weeks.map(((a,n)=>e.jsx("tr",{children:a.map(((a,r)=>{const l=`${t.month}${t.year}${n}${r}`;if("string"==typeof a)return e.jsx("td",{className:"jkl-calendar__date jkl-calendar__date--empty",children:a},l);const{date:o,selectable:s,today:c,prevMonth:d,nextMonth:i}=a;return e.jsx("td",{children:e.jsx("button",{...T({dateObj:a}),type:"button",className:"jkl-calendar-date-button",tabIndex:J(a)?0:-1,"aria-label":`${o.getDate()}. ${x[o.getMonth()].toLowerCase()}`,"aria-current":c?"date":void 0,"data-adjacent":d||i?"true":void 0,disabled:!s,onKeyDown:K,children:e.jsx("span",{"aria-hidden":"true",children:o.getDate()})})},l)}))},`${t.month}${t.year}${n}`)))})]},`${t.month}${t.year}`)))]})})}));g.displayName="Calendar",exports.Calendar=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),a=require("react-dom"),n=require("../../../hooks/useId/useId.cjs"),r=require("../../button/Button.cjs"),l=require("../../icon/icons/ArrowLeftIcon.cjs"),o=require("../../icon/icons/ArrowRightIcon.cjs"),s=require("../../icon/icons/ChevronDownIcon.cjs"),c=require("./calendarReducer.cjs"),d=require("./useCalendar.cjs"),i=require("./utils.cjs"),u=["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],h=["man","tir","ons","tor","fre","lør","søn"],g=t.forwardRef(((g,j)=>{const{date:b,defaultSelected:f,density:m,minDate:v,maxDate:p,days:k=h,months:x=u,monthLabel:D="Velg måned",yearLabel:w="Velg år",yearsToShow:y=i.DEFAULT_YEARS_TO_SHOW,onTabOutside:S,...M}=g,_=n.useId("jkl-calendar"),[{offset:F,selectedDate:A,shownDate:C},N]=t.useReducer(c.calendarReducer,i.getInitialDateShown(b,f,v,p),c.calendarInitializer),q=C.getMonth(),E=C.getFullYear();t.useEffect((()=>{N({type:"SET_SELECTED_DATE",newDate:i.getInitialDateShown(b,f,v,p)})}),[b,f,v,p]);const O=t.useCallback((e=>{N({type:"SET_OFFSET",newOffset:e})}),[]),{calendars:Y,getBackProps:I,getDateProps:T,getForwardProps:$,handleOffsetChanged:R}=d.useCalendar({date:A,selected:A,minDate:v,maxDate:p,offset:F,onOffsetChanged:O,firstDayOfWeek:1,...M}),L=t.useRef(null),B=t.useCallback((e=>{if(!L.current)return;const t=document.activeElement,n=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]'),r=async e=>{null==t||t.setAttribute("tabindex","-1"),e.setAttribute("tabindex","0"),e.focus()};n.forEach(((l,o)=>{const s=o+e;if(l===t)if(s<=n.length-1&&s>=0)r(n[s]);else if(e<0){if(i.isBackDisabled({calendars:Y,minDate:v})||(a.flushSync((()=>{R(F-i.subtractMonth({calendars:Y,offset:1,minDate:v}))})),!L.current))return;const e=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[e.length+s]&&(e[0].setAttribute("tabindex","-1"),r(e[e.length+s]))}else{if(i.isForwardDisabled({calendars:Y,maxDate:p})||(a.flushSync((()=>{R(F+i.addMonth({calendars:Y,offset:1,maxDate:p}))})),!L.current))return;const e=L.current.querySelectorAll('button.jkl-calendar-date-button:not([data-adjacent="true"]');e[s-n.length]&&(e[0].setAttribute("tabindex","-1"),r(e[s-n.length]))}}))}),[R,F,Y,p,v]),K=t.useCallback((e=>{switch(e.key){case"ArrowUp":B(-7),e.preventDefault();break;case"ArrowRight":B(1),e.preventDefault();break;case"ArrowDown":B(7),e.preventDefault();break;case"ArrowLeft":B(-1),e.preventDefault()}}),[B]),P=t.useCallback((e=>{var t;if("Tab"!==e.key)return;const a=null==(t=L.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())}),[]),J=t.useCallback((e=>{const{date:t,selected:a,selectable:n,prevMonth:r,nextMonth:l}=e;return!!n&&!(!a&&t.toString()!==(null==v?void 0:v.toString())&&(r||l||C.getFullYear()!==t.getFullYear()||A.getMonth()===t.getMonth()||1!==t.getDate()))}),[C,v,A]),U=t.useCallback((()=>{v&&C.getFullYear()-v.getFullYear()==0&&C.getMonth()-v.getMonth()==1?document.querySelectorAll(".jkl-calendar-navigation__arrow")[1].focus():p&&p.getFullYear()-C.getFullYear()==0&&p.getMonth()-C.getMonth()==1&&document.querySelectorAll(".jkl-calendar-navigation__arrow")[0].focus()}),[v,p,C]),V=t.useCallback((e=>{if(4!==e.target.value.length)return;const t=Number.parseInt(e.target.value);if(Number.isNaN(t))return;let a=12*(t-C.getFullYear());const n=new Date(C.getFullYear(),C.getMonth()+a,C.getDate());p&&p.getFullYear()===n.getFullYear()&&p.getMonth()<n.getMonth()?a-=n.getMonth()-p.getMonth():v&&v.getFullYear()===n.getFullYear()&&v.getMonth()>n.getMonth()&&(a+=v.getMonth()-n.getMonth()),N({type:"ADD_OFFSET",addedOffset:a})}),[C,v,p]),W=t.useCallback((e=>{if(!A&&!b)return;const t=C.getFullYear()-(A||new Date).getFullYear(),a=Number.parseInt(e.target.value)-(A||new Date).getMonth();N({type:"SET_OFFSET",newOffset:12*t+a})}),[A,b,C]),z=i.getYearSelectOptions(E,v,p,y),H=i.getMonthSelectOptions(E,x,v,p);return e.jsx("div",{ref:j,id:_,className:"jkl-calendar","data-testid":"jkl-calendar",children:e.jsxs("div",{className:"jkl-calendar__padding",ref:L,onKeyDown:P,children:[e.jsxs("fieldset",{className:"jkl-calendar-navigation",children:[e.jsxs("div",{children:[e.jsx(r.Button,{...I({calendars:Y,onClick:U}),variant:"ghost",icon:e.jsx(l.ArrowLeftIcon,{variant:"medium",bold:!0})}),e.jsx(r.Button,{...$({calendars:Y,onClick:U}),variant:"ghost",icon:e.jsx(o.ArrowRightIcon,{variant:"medium",bold:!0})})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"jkl-calendar-navigation-dropdown",children:[e.jsx("select",{onChange:W,className:"jkl-calendar-navigation-dropdown__select","aria-label":D,value:q.toString(),children:H.map((({label:t,value:a})=>e.jsx("option",{value:a,children:t},a)))}),e.jsx(s.ChevronDownIcon,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]}),e.jsxs("div",{className:"jkl-calendar-navigation-dropdown",children:[e.jsx("select",{onChange:V,className:"jkl-calendar-navigation-dropdown__select","aria-label":w,value:E.toString(),children:z.map((t=>e.jsx("option",{value:t,children:t},t)))}),e.jsx(s.ChevronDownIcon,{bold:!0,className:"jkl-calendar-navigation-dropdown__chevron"})]})]})]}),Y.map((t=>e.jsxs("table",{className:"jkl-calendar-table","data-testid":"jkl-datepicker-calendar",children:[e.jsxs("caption",{className:"jkl-sr-only",children:[x[t.month],", ",t.year]}),e.jsx("thead",{children:e.jsx("tr",{children:k.map((a=>e.jsx("th",{children:a},`${t.month}${t.year}${a}`)))})}),e.jsx("tbody",{"data-testid":"jkl-datepicker-dates",children:t.weeks.map(((a,n)=>e.jsx("tr",{children:a.map(((a,r)=>{const l=`${t.month}${t.year}${n}${r}`;if("string"==typeof a)return e.jsx("td",{className:"jkl-calendar__date jkl-calendar__date--empty",children:a},l);const{date:o,selectable:s,today:c,prevMonth:d,nextMonth:i}=a;return e.jsx("td",{children:e.jsx("button",{...T({dateObj:a}),type:"button",className:"jkl-calendar-date-button",tabIndex:J(a)?0:-1,"aria-label":`${o.getDate()}. ${x[o.getMonth()].toLowerCase()}`,"aria-current":c?"date":void 0,"data-adjacent":d||i?"true":void 0,disabled:!s,onKeyDown:K,children:e.jsx("span",{"aria-hidden":"true",children:o.getDate()})})},l)}))},`${t.month}${t.year}${n}`)))})]},`${t.month}${t.year}`)))]})})}));g.displayName="Calendar",exports.Calendar=g;
2
2
  //# sourceMappingURL=Calendar.cjs.map