@fremtind/jokul 0.37.14 → 0.37.15

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 (340) hide show
  1. package/build/build-stats.html +2230 -2123
  2. package/build/cjs/components/accordion/AccordionItem.cjs.map +1 -1
  3. package/build/cjs/components/autosuggest/Autosuggest.cjs +1 -1
  4. package/build/cjs/components/autosuggest/Autosuggest.cjs.map +1 -1
  5. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs +3 -3
  6. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
  7. package/build/cjs/components/autosuggest/ControllerButton.cjs.map +1 -1
  8. package/build/cjs/components/autosuggest/utils.cjs.map +1 -1
  9. package/build/cjs/components/breadcrumb/Breadcrumb.cjs.map +1 -1
  10. package/build/cjs/components/button/Button.cjs.map +1 -1
  11. package/build/cjs/components/card/Card.cjs.map +1 -1
  12. package/build/cjs/components/card/CardImage.cjs.map +1 -1
  13. package/build/cjs/components/card/NavCard.cjs.map +1 -1
  14. package/build/cjs/components/checkbox/Checkbox.cjs.map +1 -1
  15. package/build/cjs/components/combobox/Combobox.cjs.map +1 -1
  16. package/build/cjs/components/cookie-consent/CookieConsentContext.cjs.map +1 -1
  17. package/build/cjs/components/cookie-consent/CookieConsentModal.cjs.map +1 -1
  18. package/build/cjs/components/cookie-consent/consents/CustomConsents.cjs.map +1 -1
  19. package/build/cjs/components/cookie-consent/consents/DefaultConsents.cjs.map +1 -1
  20. package/build/cjs/components/cookie-consent/cookieConsentUtils.cjs.map +1 -1
  21. package/build/cjs/components/cookie-consent/cookieConsentUtils.d.cts +3 -3
  22. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  23. package/build/cjs/components/datepicker/internal/Calendar.cjs.map +1 -1
  24. package/build/cjs/components/datepicker/internal/calendarReducer.cjs.map +1 -1
  25. package/build/cjs/components/datepicker/internal/useCalendar.cjs.map +1 -1
  26. package/build/cjs/components/datepicker/internal/utils.cjs.map +1 -1
  27. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  28. package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
  29. package/build/cjs/components/expander/Expander.cjs.map +1 -1
  30. package/build/cjs/components/expander/deprecated/ExpandSection.cjs.map +1 -1
  31. package/build/cjs/components/expander/deprecated/Expander.cjs.map +1 -1
  32. package/build/cjs/components/feedback/Feedback.cjs.map +1 -1
  33. package/build/cjs/components/feedback/feedbackContext.cjs.map +1 -1
  34. package/build/cjs/components/feedback/followup/Followup.cjs.map +1 -1
  35. package/build/cjs/components/feedback/followup/useFollowup.cjs.map +1 -1
  36. package/build/cjs/components/feedback/main-question/MainQuestion.cjs.map +1 -1
  37. package/build/cjs/components/feedback/main-question/useMainQuestion.cjs.map +1 -1
  38. package/build/cjs/components/feedback/questions/AddonQuestion.cjs.map +1 -1
  39. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs.map +1 -1
  40. package/build/cjs/components/feedback/questions/ContactQuestion.cjs.map +1 -1
  41. package/build/cjs/components/feedback/questions/RadioQuestion.cjs.map +1 -1
  42. package/build/cjs/components/feedback/questions/SmileyQuestion.cjs.map +1 -1
  43. package/build/cjs/components/feedback/questions/TextQuestion.cjs.map +1 -1
  44. package/build/cjs/components/feedback/questions/smileyUtils.cjs.map +1 -1
  45. package/build/cjs/components/feedback/utils.cjs.map +1 -1
  46. package/build/cjs/components/file-input/File.cjs.map +1 -1
  47. package/build/cjs/components/file-input/FileInput.cjs.map +1 -1
  48. package/build/cjs/components/file-input/internal/Dropzone.cjs.map +1 -1
  49. package/build/cjs/components/file-input/internal/Input.cjs.map +1 -1
  50. package/build/cjs/components/file-input/internal/fileInputContext.cjs.map +1 -1
  51. package/build/cjs/components/file-input/internal/validateFile.cjs.map +1 -1
  52. package/build/cjs/components/flex/Flex.cjs.map +1 -1
  53. package/build/cjs/components/icon/icons/GreenCheckIcon.cjs.map +1 -1
  54. package/build/cjs/components/icon/icons/RedCrossIcon.cjs.map +1 -1
  55. package/build/cjs/components/icon/types.d.cts +0 -1
  56. package/build/cjs/components/icon-button/IconButton.cjs.map +1 -1
  57. package/build/cjs/components/image/Image.cjs.map +1 -1
  58. package/build/cjs/components/image/useImageLoadingStatus.cjs.map +1 -1
  59. package/build/cjs/components/input-group/FieldGroup.cjs.map +1 -1
  60. package/build/cjs/components/input-group/InputGroup.cjs.map +1 -1
  61. package/build/cjs/components/input-group/InputGroup.d.cts +9 -9
  62. package/build/cjs/components/input-group/Label.cjs.map +1 -1
  63. package/build/cjs/components/input-group/SupportLabel.cjs.map +1 -1
  64. package/build/cjs/components/input-panel/RadioPanel.cjs.map +1 -1
  65. package/build/cjs/components/input-panel/RadioPanelGroup.cjs.map +1 -1
  66. package/build/cjs/components/input-panel/radioPanelContext.d.cts +0 -1
  67. package/build/cjs/components/link-list/LinkList.cjs.map +1 -1
  68. package/build/cjs/components/list/List.cjs.map +1 -1
  69. package/build/cjs/components/list/types.d.cts +0 -1
  70. package/build/cjs/components/loader/Loader.cjs.map +1 -1
  71. package/build/cjs/components/loader/skeletons/SkeletonAnimation.cjs.map +1 -1
  72. package/build/cjs/components/loader/skeletons/SkeletonLabel.cjs.map +1 -1
  73. package/build/cjs/components/loader/skeletons/SkeletonTextArea.cjs.map +1 -1
  74. package/build/cjs/components/logo/Logo.cjs.map +1 -1
  75. package/build/cjs/components/logo/LogoStamp.cjs.map +1 -1
  76. package/build/cjs/components/logo/useTextSpinner.cjs.map +1 -1
  77. package/build/cjs/components/menu/Menu.cjs.map +1 -1
  78. package/build/cjs/components/menu/MenuItem.cjs.map +1 -1
  79. package/build/cjs/components/menu/MenuItemCheckbox.cjs.map +1 -1
  80. package/build/cjs/components/menu/useMenuWideEvents.cjs.map +1 -1
  81. package/build/cjs/components/message/FormErrorMessage.cjs.map +1 -1
  82. package/build/cjs/components/message/Message.cjs.map +1 -1
  83. package/build/cjs/components/modal/Modal.cjs.map +1 -1
  84. package/build/cjs/components/modal/Modal.d.cts +2 -2
  85. package/build/cjs/components/modal/useModal.cjs.map +1 -1
  86. package/build/cjs/components/pagination/Pagination.cjs.map +1 -1
  87. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  88. package/build/cjs/components/progress-bar/Countdown.cjs.map +1 -1
  89. package/build/cjs/components/progress-bar/ProgressBar.cjs.map +1 -1
  90. package/build/cjs/components/radio-button/BaseRadioButton.cjs.map +1 -1
  91. package/build/cjs/components/radio-button/RadioButton.cjs.map +1 -1
  92. package/build/cjs/components/radio-button/RadioButtonGroup.cjs.map +1 -1
  93. package/build/cjs/components/select/NativeSelect.cjs.map +1 -1
  94. package/build/cjs/components/select/Select.cjs.map +1 -1
  95. package/build/cjs/components/system-message/SystemMessage.cjs.map +1 -1
  96. package/build/cjs/components/system-message/common/MessageIcon.cjs.map +1 -1
  97. package/build/cjs/components/table/ExpandableTableRowController.cjs.map +1 -1
  98. package/build/cjs/components/table/Table.cjs.map +1 -1
  99. package/build/cjs/components/table/TableCell.cjs.map +1 -1
  100. package/build/cjs/components/table/TableHead.cjs.map +1 -1
  101. package/build/cjs/components/table/TableHeader.cjs.map +1 -1
  102. package/build/cjs/components/table/TablePagination.cjs.map +1 -1
  103. package/build/cjs/components/table/TableRow.cjs.map +1 -1
  104. package/build/cjs/components/table/utils.cjs.map +1 -1
  105. package/build/cjs/components/tabs/NavTab.cjs.map +1 -1
  106. package/build/cjs/components/tabs/NavTabs.cjs.map +1 -1
  107. package/build/cjs/components/tabs/Tab.cjs.map +1 -1
  108. package/build/cjs/components/tabs/TabList.cjs.map +1 -1
  109. package/build/cjs/components/tabs/TabPanel.cjs.map +1 -1
  110. package/build/cjs/components/tabs/Tabs.cjs.map +1 -1
  111. package/build/cjs/components/text-input/BaseTextArea.cjs.map +1 -1
  112. package/build/cjs/components/text-input/BaseTextInput.cjs.map +1 -1
  113. package/build/cjs/components/text-input/TextArea.cjs.map +1 -1
  114. package/build/cjs/components/text-input/TextInput.cjs.map +1 -1
  115. package/build/cjs/components/toast/Toast.cjs.map +1 -1
  116. package/build/cjs/components/toast/toastContext.cjs.map +1 -1
  117. package/build/cjs/components/toggle-switch/ToggleSlider.cjs.map +1 -1
  118. package/build/cjs/components/toggle-switch/ToggleSwitch.cjs.map +1 -1
  119. package/build/cjs/components/toggle-switch/ToggleSwitch.d.cts +2 -2
  120. package/build/cjs/components/toggle-switch/usePillStyles.cjs.map +1 -1
  121. package/build/cjs/components/tooltip/PopupTip.cjs.map +1 -1
  122. package/build/cjs/components/tooltip/Tooltip.cjs.map +1 -1
  123. package/build/cjs/components/tooltip/TooltipContent.cjs.map +1 -1
  124. package/build/cjs/components/tooltip/TooltipContent.d.cts +1 -1
  125. package/build/cjs/components/tooltip/TooltipTrigger.cjs.map +1 -1
  126. package/build/cjs/hooks/useAnimatedDetails/useAnimatedDetails.cjs.map +1 -1
  127. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs.map +1 -1
  128. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs.map +1 -1
  129. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs.map +1 -1
  130. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.cjs.map +1 -1
  131. package/build/cjs/hooks/useBrowserPreferences/useBrowserPreferences.cjs.map +1 -1
  132. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
  133. package/build/cjs/hooks/useElementDimensions/useElementDimensions.cjs.map +1 -1
  134. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs.map +1 -1
  135. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs.map +1 -1
  136. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs.map +1 -1
  137. package/build/cjs/hooks/useListNavigation/useListNavigation.cjs.map +1 -1
  138. package/build/cjs/hooks/useMutationObserver/useMutationObserver.cjs.map +1 -1
  139. package/build/cjs/hooks/useProgressiveImg/useProgressiveImg.cjs.map +1 -1
  140. package/build/cjs/hooks/useScreen/state.cjs.map +1 -1
  141. package/build/cjs/hooks/useScreen/useScreen.cjs.map +1 -1
  142. package/build/cjs/utilities/formatters/avstand/formatAvstand.cjs.map +1 -1
  143. package/build/cjs/utilities/formatters/bytes/formatBytes.cjs.map +1 -1
  144. package/build/cjs/utilities/formatters/fodselsnummer/formatFodselsnummer.cjs.map +1 -1
  145. package/build/cjs/utilities/formatters/kontonummer/formatKontonummer.cjs.map +1 -1
  146. package/build/cjs/utilities/formatters/kortnummer/formatKortnummer.cjs.map +1 -1
  147. package/build/cjs/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.cjs.map +1 -1
  148. package/build/cjs/utilities/formatters/telefonnummer/formatTelefonnummer.cjs.map +1 -1
  149. package/build/cjs/utilities/formatters/util/registerWithMask.cjs.map +1 -1
  150. package/build/cjs/utilities/formatters/util/registerWithMask.d.cts +11 -11
  151. package/build/cjs/utilities/getThemeAndDensity.cjs.map +1 -1
  152. package/build/cjs/utilities/getThemeAndDensity.d.cts +2 -2
  153. package/build/cjs/utilities/polymorphism/SlotComponent.cjs.map +1 -1
  154. package/build/cjs/utilities/polymorphism/mergeProps.cjs.map +1 -1
  155. package/build/cjs/utilities/polymorphism/polymorphism.d.cts +0 -1
  156. package/build/cjs/utilities/tabListener.cjs.map +1 -1
  157. package/build/cjs/utilities/validators/isValidKortnummer/isValidKortnummer.cjs.map +1 -1
  158. package/build/es/components/accordion/AccordionItem.js.map +1 -1
  159. package/build/es/components/autosuggest/Autosuggest.js +1 -1
  160. package/build/es/components/autosuggest/Autosuggest.js.map +1 -1
  161. package/build/es/components/autosuggest/BaseAutosuggest.js +4 -4
  162. package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
  163. package/build/es/components/autosuggest/utils.js.map +1 -1
  164. package/build/es/components/breadcrumb/Breadcrumb.js.map +1 -1
  165. package/build/es/components/button/Button.js.map +1 -1
  166. package/build/es/components/card/NavCard.js.map +1 -1
  167. package/build/es/components/checkbox/Checkbox.js.map +1 -1
  168. package/build/es/components/combobox/Combobox.js.map +1 -1
  169. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -1
  170. package/build/es/components/cookie-consent/CookieConsentModal.js.map +1 -1
  171. package/build/es/components/cookie-consent/consents/CustomConsents.js.map +1 -1
  172. package/build/es/components/cookie-consent/cookieConsentUtils.d.ts +3 -3
  173. package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -1
  174. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  175. package/build/es/components/datepicker/internal/Calendar.js.map +1 -1
  176. package/build/es/components/datepicker/internal/calendarReducer.js.map +1 -1
  177. package/build/es/components/datepicker/internal/useCalendar.js.map +1 -1
  178. package/build/es/components/datepicker/internal/utils.js.map +1 -1
  179. package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
  180. package/build/es/components/expander/Expander.js.map +1 -1
  181. package/build/es/components/expander/deprecated/ExpandSection.js.map +1 -1
  182. package/build/es/components/expander/deprecated/Expander.js.map +1 -1
  183. package/build/es/components/feedback/Feedback.js.map +1 -1
  184. package/build/es/components/feedback/followup/useFollowup.js.map +1 -1
  185. package/build/es/components/feedback/main-question/useMainQuestion.js.map +1 -1
  186. package/build/es/components/feedback/questions/CheckboxQuestion.js.map +1 -1
  187. package/build/es/components/feedback/questions/ContactQuestion.js.map +1 -1
  188. package/build/es/components/feedback/questions/RadioQuestion.js.map +1 -1
  189. package/build/es/components/feedback/questions/SmileyQuestion.js.map +1 -1
  190. package/build/es/components/feedback/questions/TextQuestion.js.map +1 -1
  191. package/build/es/components/feedback/questions/smileyUtils.js.map +1 -1
  192. package/build/es/components/feedback/utils.js.map +1 -1
  193. package/build/es/components/file-input/File.js.map +1 -1
  194. package/build/es/components/file-input/FileInput.js.map +1 -1
  195. package/build/es/components/file-input/internal/Dropzone.js.map +1 -1
  196. package/build/es/components/file-input/internal/Input.js.map +1 -1
  197. package/build/es/components/flex/Flex.js.map +1 -1
  198. package/build/es/components/icon/types.d.ts +0 -1
  199. package/build/es/components/icon-button/IconButton.js.map +1 -1
  200. package/build/es/components/image/Image.js.map +1 -1
  201. package/build/es/components/image/useImageLoadingStatus.js.map +1 -1
  202. package/build/es/components/input-group/FieldGroup.js.map +1 -1
  203. package/build/es/components/input-group/InputGroup.d.ts +9 -9
  204. package/build/es/components/input-group/InputGroup.js.map +1 -1
  205. package/build/es/components/input-group/Label.js.map +1 -1
  206. package/build/es/components/input-group/SupportLabel.js.map +1 -1
  207. package/build/es/components/input-panel/RadioPanel.js.map +1 -1
  208. package/build/es/components/input-panel/radioPanelContext.d.ts +0 -1
  209. package/build/es/components/list/types.d.ts +0 -1
  210. package/build/es/components/loader/Loader.js.map +1 -1
  211. package/build/es/components/loader/skeletons/SkeletonAnimation.js.map +1 -1
  212. package/build/es/components/loader/skeletons/SkeletonLabel.js.map +1 -1
  213. package/build/es/components/loader/skeletons/SkeletonTextArea.js.map +1 -1
  214. package/build/es/components/logo/Logo.js.map +1 -1
  215. package/build/es/components/logo/LogoStamp.js.map +1 -1
  216. package/build/es/components/menu/Menu.js.map +1 -1
  217. package/build/es/components/menu/MenuItem.js.map +1 -1
  218. package/build/es/components/menu/MenuItemCheckbox.js.map +1 -1
  219. package/build/es/components/menu/useMenuWideEvents.js.map +1 -1
  220. package/build/es/components/message/FormErrorMessage.js.map +1 -1
  221. package/build/es/components/message/Message.js.map +1 -1
  222. package/build/es/components/modal/Modal.d.ts +2 -2
  223. package/build/es/components/pagination/Pagination.js.map +1 -1
  224. package/build/es/components/popover/Popover.js.map +1 -1
  225. package/build/es/components/progress-bar/Countdown.js.map +1 -1
  226. package/build/es/components/progress-bar/ProgressBar.js.map +1 -1
  227. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -1
  228. package/build/es/components/radio-button/RadioButtonGroup.js.map +1 -1
  229. package/build/es/components/select/NativeSelect.js.map +1 -1
  230. package/build/es/components/select/Select.js.map +1 -1
  231. package/build/es/components/system-message/SystemMessage.js.map +1 -1
  232. package/build/es/components/system-message/common/MessageIcon.js.map +1 -1
  233. package/build/es/components/table/ExpandableTableRowController.js.map +1 -1
  234. package/build/es/components/table/Table.js.map +1 -1
  235. package/build/es/components/table/TableCell.js.map +1 -1
  236. package/build/es/components/table/TableHead.js.map +1 -1
  237. package/build/es/components/table/TableHeader.js.map +1 -1
  238. package/build/es/components/table/TablePagination.js.map +1 -1
  239. package/build/es/components/table/TableRow.js.map +1 -1
  240. package/build/es/components/table/utils.js.map +1 -1
  241. package/build/es/components/tabs/NavTab.js.map +1 -1
  242. package/build/es/components/tabs/NavTabs.js.map +1 -1
  243. package/build/es/components/tabs/Tab.js.map +1 -1
  244. package/build/es/components/tabs/TabList.js.map +1 -1
  245. package/build/es/components/tabs/Tabs.js.map +1 -1
  246. package/build/es/components/text-input/BaseTextArea.js.map +1 -1
  247. package/build/es/components/text-input/BaseTextInput.js.map +1 -1
  248. package/build/es/components/text-input/TextArea.js.map +1 -1
  249. package/build/es/components/text-input/TextInput.js.map +1 -1
  250. package/build/es/components/toast/Toast.js.map +1 -1
  251. package/build/es/components/toast/toastContext.js.map +1 -1
  252. package/build/es/components/toggle-switch/ToggleSlider.js.map +1 -1
  253. package/build/es/components/toggle-switch/ToggleSwitch.d.ts +2 -2
  254. package/build/es/components/toggle-switch/ToggleSwitch.js.map +1 -1
  255. package/build/es/components/toggle-switch/usePillStyles.js.map +1 -1
  256. package/build/es/components/tooltip/Tooltip.js.map +1 -1
  257. package/build/es/components/tooltip/TooltipContent.d.ts +1 -1
  258. package/build/es/components/tooltip/TooltipTrigger.js.map +1 -1
  259. package/build/es/hooks/useAnimatedDetails/useAnimatedDetails.js.map +1 -1
  260. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js.map +1 -1
  261. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js.map +1 -1
  262. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js.map +1 -1
  263. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.js.map +1 -1
  264. package/build/es/hooks/useBrowserPreferences/useBrowserPreferences.js.map +1 -1
  265. package/build/es/hooks/useClickOutside/useClickOutside.js.map +1 -1
  266. package/build/es/hooks/useElementDimensions/useElementDimensions.js.map +1 -1
  267. package/build/es/hooks/useFocusOutside/useFocusOutside.js.map +1 -1
  268. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  269. package/build/es/hooks/useKeyListener/useKeyListener.js.map +1 -1
  270. package/build/es/hooks/useListNavigation/useListNavigation.js.map +1 -1
  271. package/build/es/hooks/useMutationObserver/useMutationObserver.js.map +1 -1
  272. package/build/es/hooks/useProgressiveImg/useProgressiveImg.js.map +1 -1
  273. package/build/es/hooks/useScreen/state.js.map +1 -1
  274. package/build/es/hooks/useScreen/useScreen.js.map +1 -1
  275. package/build/es/utilities/formatters/util/registerWithMask.d.ts +11 -11
  276. package/build/es/utilities/formatters/util/registerWithMask.js.map +1 -1
  277. package/build/es/utilities/getThemeAndDensity.d.ts +2 -2
  278. package/build/es/utilities/getThemeAndDensity.js.map +1 -1
  279. package/build/es/utilities/polymorphism/SlotComponent.js.map +1 -1
  280. package/build/es/utilities/polymorphism/mergeProps.js.map +1 -1
  281. package/build/es/utilities/polymorphism/polymorphism.d.ts +0 -1
  282. package/build/es/utilities/tabListener.js.map +1 -1
  283. package/build/es/utilities/validators/isValidKortnummer/isValidKortnummer.js.map +1 -1
  284. package/package.json +25 -25
  285. package/styles/components/accordion/accordion.min.css +1 -1
  286. package/styles/components/breadcrumb/breadcrumb.min.css +1 -1
  287. package/styles/components/button/button.css +2 -2
  288. package/styles/components/button/button.min.css +1 -1
  289. package/styles/components/card/card.min.css +1 -1
  290. package/styles/components/checkbox/checkbox.css +4 -4
  291. package/styles/components/checkbox/checkbox.min.css +1 -1
  292. package/styles/components/chip/chip.min.css +1 -1
  293. package/styles/components/combobox/combobox.min.css +1 -1
  294. package/styles/components/cookie-consent/cookie-consent.min.css +1 -1
  295. package/styles/components/datepicker/datepicker.min.css +1 -1
  296. package/styles/components/description-list/description-list.min.css +1 -1
  297. package/styles/components/expander/deprecated/expander.min.css +1 -1
  298. package/styles/components/expander/expandable.min.css +1 -1
  299. package/styles/components/feedback/feedback.css +2 -2
  300. package/styles/components/feedback/feedback.min.css +1 -1
  301. package/styles/components/file-input/file-input.min.css +1 -1
  302. package/styles/components/icon-button/icon-button.min.css +1 -1
  303. package/styles/components/input-group/input-group.css +2 -2
  304. package/styles/components/input-group/input-group.min.css +1 -1
  305. package/styles/components/input-panel/checkbox-panel.css +2 -2
  306. package/styles/components/input-panel/checkbox-panel.min.css +1 -1
  307. package/styles/components/input-panel/radio-panel.css +2 -2
  308. package/styles/components/input-panel/radio-panel.min.css +1 -1
  309. package/styles/components/input-panel/shared.min.css +1 -1
  310. package/styles/components/link/link.min.css +1 -1
  311. package/styles/components/link-list/link-list.min.css +1 -1
  312. package/styles/components/loader/loader.css +6 -6
  313. package/styles/components/loader/loader.min.css +1 -1
  314. package/styles/components/loader/skeleton-loader.css +5 -5
  315. package/styles/components/loader/skeleton-loader.min.css +1 -1
  316. package/styles/components/menu/menu.min.css +1 -1
  317. package/styles/components/message/message.css +2 -2
  318. package/styles/components/message/message.min.css +1 -1
  319. package/styles/components/modal/modal.min.css +1 -1
  320. package/styles/components/popover/popover.min.css +1 -1
  321. package/styles/components/progress-bar/progress-bar.css +2 -2
  322. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  323. package/styles/components/radio-button/radio-button.css +2 -2
  324. package/styles/components/radio-button/radio-button.min.css +1 -1
  325. package/styles/components/select/select.min.css +1 -1
  326. package/styles/components/system-message/system-message.css +2 -2
  327. package/styles/components/system-message/system-message.min.css +1 -1
  328. package/styles/components/table/table.min.css +1 -1
  329. package/styles/components/tabs/tabs.css +1 -2
  330. package/styles/components/tabs/tabs.min.css +1 -1
  331. package/styles/components/tabs/tabs.scss +1 -2
  332. package/styles/components/text-input/text-input.min.css +1 -1
  333. package/styles/components/toast/toast.css +4 -4
  334. package/styles/components/toast/toast.min.css +1 -1
  335. package/styles/components/toggle-switch/toggle-switch.min.css +1 -1
  336. package/styles/components/tooltip/tooltip.min.css +1 -1
  337. package/styles/core/core.min.css +1 -1
  338. package/styles/styles.css +38 -39
  339. package/styles/styles.min.css +1 -1
  340. package/styles/vind/vind.min.css +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"usePillStyles.js","sources":["../../../../src/components/toggle-switch/usePillStyles.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useMemo, useState } from \"react\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction throttle<R, A extends any[]>(fn: (...args: A) => R) {\n let wait = false;\n\n return (...args: A) => {\n if (wait) return undefined;\n\n const result = fn(...args);\n\n wait = true;\n window.setTimeout(() => {\n wait = false;\n }, 200);\n\n return result;\n };\n}\n\nexport const usePillStyles = (\n ref: RefObject<HTMLLabelElement>,\n shouldTransform: boolean,\n dependencies: unknown[],\n) => {\n const [width, setWidth] = useState(0);\n const [distance, setDistance] = useState(0);\n\n const setStyles = useCallback(() => {\n if (ref.current && ref.current.parentElement) {\n setWidth(ref.current.clientWidth);\n\n const translateDistance = shouldTransform\n ? ref.current.parentElement.clientWidth -\n ref.current.clientWidth\n : 0;\n\n setDistance(translateDistance);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref, shouldTransform, ...dependencies]);\n\n const throttledSetStyles = useMemo(() => throttle(setStyles), [setStyles]);\n\n useEffect(() => {\n setStyles();\n typeof window !== \"undefined\" &&\n window.addEventListener(\"resize\", throttledSetStyles);\n return () => {\n typeof window !== \"undefined\" &&\n window.removeEventListener(\"resize\", throttledSetStyles);\n };\n }, [setStyles, throttledSetStyles]);\n\n return {\n width,\n transform: `translateX(${distance}px)`,\n };\n};\n"],"names":["usePillStyles","ref","shouldTransform","dependencies","width","setWidth","useState","distance","setDistance","setStyles","useCallback","current","parentElement","clientWidth","translateDistance","throttledSetStyles","useMemo","fn","wait","args","result","window","setTimeout","throttle","useEffect","addEventListener","removeEventListener","transform"],"mappings":"8EAoBO,MAAMA,EAAgB,CACzBC,EACAC,EACAC,KAEA,MAAOC,EAAOC,GAAYC,EAAS,IAC5BC,EAAUC,GAAeF,EAAS,GAEnCG,EAAYC,GAAY,KAC1B,GAAIT,EAAIU,SAAWV,EAAIU,QAAQC,cAAe,CACjCP,EAAAJ,EAAIU,QAAQE,aAEfC,MAAAA,EAAoBZ,EACpBD,EAAIU,QAAQC,cAAcC,YAC1BZ,EAAIU,QAAQE,YACZ,EAENL,EAAYM,EAChB,IAED,CAACb,EAAKC,KAAoBC,IAEvBY,EAAqBC,GAAQ,IAvCvC,SAAsCC,GAClC,IAAIC,GAAO,EAEX,MAAO,IAAIC,KACP,GAAID,EAAa,OAEXE,MAAAA,EAASH,KAAME,GAEd,OAAAD,GAAA,EACPG,OAAOC,YAAW,KACPJ,GAAA,CAAA,GACR,KAEIE,CAAAA,CAEf,CAwB6CG,CAASd,IAAY,CAACA,IAE/D,OAAAe,GAAU,KACIf,WACHY,OAAW,KACdA,OAAOI,iBAAiB,SAAUV,GAC/B,YACIM,OAAW,KACdA,OAAOK,oBAAoB,SAAUX,EAAkB,IAEhE,CAACN,EAAWM,IAER,CACHX,MAAAA,EACAuB,UAAW,cAAcpB,OAAQ"}
1
+ {"version":3,"file":"usePillStyles.js","sources":["../../../../src/components/toggle-switch/usePillStyles.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useMemo, useState } from \"react\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction throttle<R, A extends any[]>(fn: (...args: A) => R) {\n let wait = false;\n\n return (...args: A) => {\n if (wait) return undefined;\n\n const result = fn(...args);\n\n wait = true;\n window.setTimeout(() => {\n wait = false;\n }, 200);\n\n return result;\n };\n}\n\nexport const usePillStyles = (\n ref: RefObject<HTMLLabelElement>,\n shouldTransform: boolean,\n dependencies: unknown[],\n) => {\n const [width, setWidth] = useState(0);\n const [distance, setDistance] = useState(0);\n\n const setStyles = useCallback(() => {\n if (ref.current && ref.current.parentElement) {\n setWidth(ref.current.clientWidth);\n\n const translateDistance = shouldTransform\n ? ref.current.parentElement.clientWidth -\n ref.current.clientWidth\n : 0;\n\n setDistance(translateDistance);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref, shouldTransform, ...dependencies]);\n\n const throttledSetStyles = useMemo(() => throttle(setStyles), [setStyles]);\n\n useEffect(() => {\n setStyles();\n typeof window !== \"undefined\" &&\n window.addEventListener(\"resize\", throttledSetStyles);\n return () => {\n typeof window !== \"undefined\" &&\n window.removeEventListener(\"resize\", throttledSetStyles);\n };\n }, [setStyles, throttledSetStyles]);\n\n return {\n width,\n transform: `translateX(${distance}px)`,\n };\n};\n"],"names":["usePillStyles","ref","shouldTransform","dependencies","width","setWidth","useState","distance","setDistance","setStyles","useCallback","current","parentElement","clientWidth","translateDistance","throttledSetStyles","useMemo","fn","wait","args","result","window","setTimeout","throttle","useEffect","addEventListener","removeEventListener","transform"],"mappings":"8EAoBO,MAAMA,EAAgB,CACzBC,EACAC,EACAC,KAEA,MAAOC,EAAOC,GAAYC,EAAS,IAC5BC,EAAUC,GAAeF,EAAS,GAEnCG,EAAYC,GAAY,KAC1B,GAAIT,EAAIU,SAAWV,EAAIU,QAAQC,cAAe,CACjCP,EAAAJ,EAAIU,QAAQE,aAEfC,MAAAA,EAAoBZ,EACpBD,EAAIU,QAAQC,cAAcC,YAC1BZ,EAAIU,QAAQE,YACZ,EAENL,EAAYM,EAAiB,IAGlC,CAACb,EAAKC,KAAoBC,IAEvBY,EAAqBC,GAAQ,IAvCvC,SAAsCC,GAClC,IAAIC,GAAO,EAEX,MAAO,IAAIC,KACP,GAAID,EAAa,OAEXE,MAAAA,EAASH,KAAME,GAEd,OAAAD,GAAA,EACPG,OAAOC,YAAW,KACPJ,GAAA,CAAA,GACR,KAEIE,CAAAA,CAEf,CAwB6CG,CAASd,IAAY,CAACA,IAE/D,OAAAe,GAAU,KACIf,WACHY,OAAW,KACdA,OAAOI,iBAAiB,SAAUV,GAC/B,YACIM,OAAW,KACdA,OAAOK,oBAAoB,SAAUX,EAAkB,IAEhE,CAACN,EAAWM,IAER,CACHX,MAAAA,EACAuB,UAAW,cAAcpB,OAC7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n type Placement,\n type UseFloatingReturn,\n arrow,\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport React, { FC, createContext, useContext, useRef, useState } from \"react\";\nimport { type WithChildren } from \"../../core/types.js\";\n\nexport type TooltipPlacement = Extract<\n Placement,\n \"top-start\" | \"top-end\" | \"left\" | \"right\" | \"top\"\n>;\n\nexport interface TooltipProps {\n /**\n * Sett til true dersom du ønsker at tooltipen skal være åpen som default\n * @default false\n */\n initialOpen?: boolean;\n /**\n * En funksjon som skal kalles når Tooltip åpnes eller lukkes\n * @param open Hvorvidt tooltip endres til å være åpen eller ikke\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Plassering av tooltipen i forhold til triggeren. Tooltipen vil automatisk\n * bytte posisjon dersom det ikke er plass.\n * @default \"top\"\n */\n placement?: TooltipPlacement;\n /**\n * Valgfri forsinkelse før tooltipen åpner. Ignoreres dersom triggerOn er satt til \"click\"\n * @default 250\n */\n delay?: number;\n /**\n * Angir om tooltipen skal åpnes ved klikk eller hover\n * @default \"hover\"\n */\n triggerOn?: \"click\" | \"hover\";\n}\n\ntype UseTooltipReturn = {\n triggerOn: NonNullable<TooltipProps[\"triggerOn\"]>;\n isOpen: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n arrowElement: React.RefObject<SVGSVGElement>;\n refs: {\n description: React.MutableRefObject<HTMLElement | null>;\n setDescription: (element: HTMLElement | null) => void;\n } & UseFloatingReturn[\"refs\"];\n} & UseFloatingReturn &\n ReturnType<typeof useInteractions>;\n\nconst useTooltip = ({\n initialOpen = false,\n placement = \"top\",\n delay = 250,\n triggerOn = \"hover\",\n onOpenChange,\n}: TooltipProps): UseTooltipReturn => {\n const [isOpen, setOpen] = useState(initialOpen);\n const arrowElement = useRef<SVGSVGElement>(null);\n const description = useRef<HTMLElement | null>(null);\n const setDescription = (element: HTMLElement | null) =>\n (description.current = element);\n\n const data = useFloating({\n open: isOpen,\n onOpenChange: (open) => {\n onOpenChange?.(open);\n setOpen(open);\n },\n placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(16),\n flip(),\n shift({ padding: 16 }),\n arrow({ element: arrowElement, padding: 8 }),\n ],\n });\n\n const role = useRole(data.context, { role: \"tooltip\" });\n const dismiss = useDismiss(data.context);\n const click = useClick(data.context, {\n enabled: triggerOn === \"click\",\n });\n const hover = useHover(data.context, {\n enabled: triggerOn === \"hover\",\n delay: isOpen ? 0 : delay,\n });\n const focus = useFocus(data.context, {\n enabled: triggerOn === \"hover\",\n });\n\n const interactions = useInteractions([dismiss, focus, role, click, hover]);\n\n return {\n triggerOn,\n isOpen,\n setOpen,\n arrowElement,\n ...data,\n refs: {\n ...data.refs,\n description,\n setDescription,\n },\n ...interactions,\n };\n};\n\nexport type TooltipContext = ReturnType<typeof useTooltip> | null;\n\nconst tooltipContext = createContext<TooltipContext>(null);\n\nexport const TooltipProvider = tooltipContext.Provider;\n\nexport const useTooltipContext = () => {\n const context = useContext(tooltipContext);\n\n if (context === null) {\n throw new Error(\n \"Tooltip-komponentene kan kun brukes inne i <Tooltip />\",\n );\n }\n\n return context;\n};\n\nexport const Tooltip: FC<TooltipProps & WithChildren> = ({\n children,\n ...options\n}) => {\n const tooltip = useTooltip(options);\n\n return <TooltipProvider value={tooltip}>{children}</TooltipProvider>;\n};\n"],"names":["tooltipContext","createContext","TooltipProvider","Provider","useTooltipContext","context","useContext","Error","Tooltip","children","options","tooltip","initialOpen","placement","delay","triggerOn","onOpenChange","isOpen","setOpen","useState","arrowElement","useRef","description","data","useFloating","open","whileElementsMounted","autoUpdate","middleware","offset","flip","shift","padding","arrow","element","role","useRole","dismiss","useDismiss","click","useClick","enabled","hover","useHover","focus","useFocus","interactions","useInteractions","refs","setDescription","current","useTooltip","jsx","value"],"mappings":"iUAiEA,MA6DMA,EAAiBC,EAA8B,MAExCC,EAAkBF,EAAeG,SAEjCC,EAAoB,KACvBC,MAAAA,EAAUC,EAAWN,GAE3B,GAAgB,OAAZK,EACA,MAAM,IAAIE,MACN,0DAIDF,OAAAA,CAAAA,EAGEG,EAA2C,EACpDC,SAAAA,KACGC,MAEGC,MAAAA,EAjFS,GACfC,YAAAA,GAAc,EACdC,UAAAA,EAAY,MACZC,MAAAA,EAAQ,IACRC,UAAAA,EAAY,QACZC,aAAAA,MAEM,MAACC,EAAQC,GAAWC,EAASP,GAC7BQ,EAAeC,EAAsB,MACrCC,EAAcD,EAA2B,MAIzCE,EAAOC,EAAY,CACrBC,KAAMR,EACND,aAAeS,IACX,MAAAT,GAAAA,EAAeS,GACfP,EAAQO,EAAI,EAEhBZ,UAAAA,EACAa,qBAAsBC,EACtBC,WAAY,CACRC,EAAO,IACPC,IACAC,EAAM,CAAEC,QAAS,KACjBC,EAAM,CAAEC,QAASd,EAAcY,QAAS,OAI1CG,EAAOC,EAAQb,EAAKlB,QAAS,CAAE8B,KAAM,YACrCE,EAAUC,EAAWf,EAAKlB,SAC1BkC,EAAQC,EAASjB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,IAEP2B,EAAQC,EAASpB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,EACTD,MAAOG,EAAS,EAAIH,IAElB8B,EAAQC,EAAStB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,IAGP+B,EAAeC,EAAgB,CAACV,EAASO,EAAOT,EAAMI,EAAOG,IAE5D,MAAA,CACH3B,UAAAA,EACAE,OAAAA,EACAC,QAAAA,EACAE,aAAAA,KACGG,EACHyB,KAAM,IACCzB,EAAKyB,KACR1B,YAAAA,EACA2B,eA3CgBf,GACnBZ,EAAY4B,QAAUhB,MA4CpBY,EAAA,EA0BSK,CAAWzC,GAEnB,OAAA0C,EAAAlD,EAAA,CAAgBmD,MAAO1C,EAAUF,SAAAA,GAAS"}
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n type Placement,\n type UseFloatingReturn,\n arrow,\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useRole,\n} from \"@floating-ui/react\";\nimport React, { FC, createContext, useContext, useRef, useState } from \"react\";\nimport { type WithChildren } from \"../../core/types.js\";\n\nexport type TooltipPlacement = Extract<\n Placement,\n \"top-start\" | \"top-end\" | \"left\" | \"right\" | \"top\"\n>;\n\nexport interface TooltipProps {\n /**\n * Sett til true dersom du ønsker at tooltipen skal være åpen som default\n * @default false\n */\n initialOpen?: boolean;\n /**\n * En funksjon som skal kalles når Tooltip åpnes eller lukkes\n * @param open Hvorvidt tooltip endres til å være åpen eller ikke\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * Plassering av tooltipen i forhold til triggeren. Tooltipen vil automatisk\n * bytte posisjon dersom det ikke er plass.\n * @default \"top\"\n */\n placement?: TooltipPlacement;\n /**\n * Valgfri forsinkelse før tooltipen åpner. Ignoreres dersom triggerOn er satt til \"click\"\n * @default 250\n */\n delay?: number;\n /**\n * Angir om tooltipen skal åpnes ved klikk eller hover\n * @default \"hover\"\n */\n triggerOn?: \"click\" | \"hover\";\n}\n\ntype UseTooltipReturn = {\n triggerOn: NonNullable<TooltipProps[\"triggerOn\"]>;\n isOpen: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n arrowElement: React.RefObject<SVGSVGElement>;\n refs: {\n description: React.MutableRefObject<HTMLElement | null>;\n setDescription: (element: HTMLElement | null) => void;\n } & UseFloatingReturn[\"refs\"];\n} & UseFloatingReturn &\n ReturnType<typeof useInteractions>;\n\nconst useTooltip = ({\n initialOpen = false,\n placement = \"top\",\n delay = 250,\n triggerOn = \"hover\",\n onOpenChange,\n}: TooltipProps): UseTooltipReturn => {\n const [isOpen, setOpen] = useState(initialOpen);\n const arrowElement = useRef<SVGSVGElement>(null);\n const description = useRef<HTMLElement | null>(null);\n const setDescription = (element: HTMLElement | null) =>\n (description.current = element);\n\n const data = useFloating({\n open: isOpen,\n onOpenChange: (open) => {\n onOpenChange?.(open);\n setOpen(open);\n },\n placement,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(16),\n flip(),\n shift({ padding: 16 }),\n arrow({ element: arrowElement, padding: 8 }),\n ],\n });\n\n const role = useRole(data.context, { role: \"tooltip\" });\n const dismiss = useDismiss(data.context);\n const click = useClick(data.context, {\n enabled: triggerOn === \"click\",\n });\n const hover = useHover(data.context, {\n enabled: triggerOn === \"hover\",\n delay: isOpen ? 0 : delay,\n });\n const focus = useFocus(data.context, {\n enabled: triggerOn === \"hover\",\n });\n\n const interactions = useInteractions([dismiss, focus, role, click, hover]);\n\n return {\n triggerOn,\n isOpen,\n setOpen,\n arrowElement,\n ...data,\n refs: {\n ...data.refs,\n description,\n setDescription,\n },\n ...interactions,\n };\n};\n\nexport type TooltipContext = ReturnType<typeof useTooltip> | null;\n\nconst tooltipContext = createContext<TooltipContext>(null);\n\nexport const TooltipProvider = tooltipContext.Provider;\n\nexport const useTooltipContext = () => {\n const context = useContext(tooltipContext);\n\n if (context === null) {\n throw new Error(\n \"Tooltip-komponentene kan kun brukes inne i <Tooltip />\",\n );\n }\n\n return context;\n};\n\nexport const Tooltip: FC<TooltipProps & WithChildren> = ({\n children,\n ...options\n}) => {\n const tooltip = useTooltip(options);\n\n return <TooltipProvider value={tooltip}>{children}</TooltipProvider>;\n};\n"],"names":["tooltipContext","createContext","TooltipProvider","Provider","useTooltipContext","context","useContext","Error","Tooltip","children","options","tooltip","initialOpen","placement","delay","triggerOn","onOpenChange","isOpen","setOpen","useState","arrowElement","useRef","description","data","useFloating","open","whileElementsMounted","autoUpdate","middleware","offset","flip","shift","padding","arrow","element","role","useRole","dismiss","useDismiss","click","useClick","enabled","hover","useHover","focus","useFocus","interactions","useInteractions","refs","setDescription","current","useTooltip","jsx","value"],"mappings":"iUAiEA,MA6DMA,EAAiBC,EAA8B,MAExCC,EAAkBF,EAAeG,SAEjCC,EAAoB,KACvBC,MAAAA,EAAUC,EAAWN,GAE3B,GAAgB,OAAZK,EACA,MAAM,IAAIE,MACN,0DAIDF,OAAAA,CAAAA,EAGEG,EAA2C,EACpDC,SAAAA,KACGC,MAEGC,MAAAA,EAjFS,GACfC,YAAAA,GAAc,EACdC,UAAAA,EAAY,MACZC,MAAAA,EAAQ,IACRC,UAAAA,EAAY,QACZC,aAAAA,MAEM,MAACC,EAAQC,GAAWC,EAASP,GAC7BQ,EAAeC,EAAsB,MACrCC,EAAcD,EAA2B,MAIzCE,EAAOC,EAAY,CACrBC,KAAMR,EACND,aAAeS,IACX,MAAAT,GAAAA,EAAeS,GACfP,EAAQO,EAAI,EAEhBZ,UAAAA,EACAa,qBAAsBC,EACtBC,WAAY,CACRC,EAAO,IACPC,IACAC,EAAM,CAAEC,QAAS,KACjBC,EAAM,CAAEC,QAASd,EAAcY,QAAS,OAI1CG,EAAOC,EAAQb,EAAKlB,QAAS,CAAE8B,KAAM,YACrCE,EAAUC,EAAWf,EAAKlB,SAC1BkC,EAAQC,EAASjB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,IAEP2B,EAAQC,EAASpB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,EACTD,MAAOG,EAAS,EAAIH,IAElB8B,EAAQC,EAAStB,EAAKlB,QAAS,CACjCoC,QAAuB,UAAd1B,IAGP+B,EAAeC,EAAgB,CAACV,EAASO,EAAOT,EAAMI,EAAOG,IAE5D,MAAA,CACH3B,UAAAA,EACAE,OAAAA,EACAC,QAAAA,EACAE,aAAAA,KACGG,EACHyB,KAAM,IACCzB,EAAKyB,KACR1B,YAAAA,EACA2B,eA3CgBf,GACnBZ,EAAY4B,QAAUhB,MA4CpBY,EACP,EAyBgBK,CAAWzC,GAEnB,OAAA0C,EAAAlD,EAAA,CAAgBmD,MAAO1C,EAAUF,SAAAA,GAAS"}
@@ -1,4 +1,4 @@
1
1
  import { default as React } from 'react';
2
2
  export declare const TooltipContent: React.ForwardRefExoticComponent<Omit<React.HTMLProps<HTMLDivElement> & {
3
- "data-ispopup"?: boolean | undefined;
3
+ "data-ispopup"?: boolean;
4
4
  }, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipTrigger.js","sources":["../../../../src/components/tooltip/TooltipTrigger.tsx"],"sourcesContent":["import { useMergeRefs } from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport React, { forwardRef, type HTMLProps } from \"react\";\nimport { useTooltipContext } from \"./Tooltip.js\";\n\nexport const TooltipTrigger = forwardRef<HTMLElement, HTMLProps<HTMLElement>>(\n function TooltipTrigger({ children, className, ...props }, forwardedRef) {\n const { isOpen, getReferenceProps, refs, triggerOn } =\n useTooltipContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([\n childrenRef,\n refs.setReference,\n forwardedRef,\n ]);\n\n const filterMaterialSymbols = (\n maybeText: string | null | undefined,\n ) => {\n return maybeText?.replaceAll(/[\\ue003-\\uf8aa]/g, \"\");\n };\n\n const ariaLabel = [\n (refs.reference.current as HTMLElement | null)?.textContent,\n refs.description.current?.textContent,\n ]\n .map(filterMaterialSymbols)\n .filter(Boolean)\n .join(\". \");\n\n if (React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n \"aria-label\": ariaLabel,\n ...children.props,\n ...props,\n className: clsx(children.props.className, className),\n \"data-tooltip-shown\": isOpen,\n style: { ...children.props.style },\n tabIndex: triggerOn === \"click\" ? 0 : undefined,\n }),\n );\n }\n\n return (\n <button\n data-tooltip-shown={isOpen}\n {...getReferenceProps({\n className: clsx(className, \"jkl-tooltip-trigger\"),\n // Sørg for at vi ikke sender inn skjemaer ved klikk på knappen\n type: \"button\",\n ref,\n \"aria-label\": ariaLabel,\n ...props,\n })}\n >\n {children}\n </button>\n );\n },\n);\n"],"names":["TooltipTrigger","forwardRef","children","className","props","forwardedRef","isOpen","getReferenceProps","refs","triggerOn","useTooltipContext","childrenRef","ref","useMergeRefs","setReference","ariaLabel","_a","reference","current","textContent","_b","description","map","maybeText","replaceAll","filter","Boolean","join","React","isValidElement","cloneElement","clsx","style","tabIndex","jsx","type"],"mappings":"+NAKO,MAAMA,EAAiBC,GAC1B,UAA0BC,SAAAA,EAAUC,UAAAA,KAAcC,GAASC,WACvD,MAAQC,OAAAA,EAAQC,kBAAAA,EAAmBC,KAAAA,EAAMC,UAAAA,GACrCC,IACEC,EAAeT,EAAiBU,IAChCA,EAAMC,EAAa,CACrBF,EACAH,EAAKM,aACLT,IASEU,EAAY,CACb,OAAAC,EAAAR,EAAKS,UAAUC,gBAAfF,EAA+CG,YAChD,OAAAC,EAAAZ,EAAKa,YAAYH,gBAAjBE,EAA0BD,aAEzBG,KATDC,GAEO,MAAAA,OAAA,EAAAA,EAAWC,WAAW,mBAAoB,MAQhDC,OAAOC,SACPC,KAAK,MAEN,OAAAC,EAAMC,eAAe3B,GACd0B,EAAME,aACT5B,EACAK,EAAkB,CACdK,IAAAA,EACA,aAAcG,KACXb,EAASE,SACTA,EACHD,UAAW4B,EAAK7B,EAASE,MAAMD,UAAWA,GAC1C,qBAAsBG,EACtB0B,MAAO,IAAK9B,EAASE,MAAM4B,OAC3BC,SAAwB,UAAdxB,EAAwB,OAAI,KAM9CyB,EAAC,SAAA,CACG,qBAAoB5B,KAChBC,EAAkB,CAClBJ,UAAW4B,EAAK5B,EAAW,uBAE3BgC,KAAM,SACNvB,IAAAA,EACA,aAAcG,KACXX,IAGNF,SAAAA,GAGb"}
1
+ {"version":3,"file":"TooltipTrigger.js","sources":["../../../../src/components/tooltip/TooltipTrigger.tsx"],"sourcesContent":["import { useMergeRefs } from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport React, { forwardRef, type HTMLProps } from \"react\";\nimport { useTooltipContext } from \"./Tooltip.js\";\n\nexport const TooltipTrigger = forwardRef<HTMLElement, HTMLProps<HTMLElement>>(\n function TooltipTrigger({ children, className, ...props }, forwardedRef) {\n const { isOpen, getReferenceProps, refs, triggerOn } =\n useTooltipContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([\n childrenRef,\n refs.setReference,\n forwardedRef,\n ]);\n\n const filterMaterialSymbols = (\n maybeText: string | null | undefined,\n ) => {\n return maybeText?.replaceAll(/[\\ue003-\\uf8aa]/g, \"\");\n };\n\n const ariaLabel = [\n (refs.reference.current as HTMLElement | null)?.textContent,\n refs.description.current?.textContent,\n ]\n .map(filterMaterialSymbols)\n .filter(Boolean)\n .join(\". \");\n\n if (React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n \"aria-label\": ariaLabel,\n ...children.props,\n ...props,\n className: clsx(children.props.className, className),\n \"data-tooltip-shown\": isOpen,\n style: { ...children.props.style },\n tabIndex: triggerOn === \"click\" ? 0 : undefined,\n }),\n );\n }\n\n return (\n <button\n data-tooltip-shown={isOpen}\n {...getReferenceProps({\n className: clsx(className, \"jkl-tooltip-trigger\"),\n // Sørg for at vi ikke sender inn skjemaer ved klikk på knappen\n type: \"button\",\n ref,\n \"aria-label\": ariaLabel,\n ...props,\n })}\n >\n {children}\n </button>\n );\n },\n);\n"],"names":["TooltipTrigger","forwardRef","children","className","props","forwardedRef","isOpen","getReferenceProps","refs","triggerOn","useTooltipContext","childrenRef","ref","useMergeRefs","setReference","ariaLabel","_a","reference","current","textContent","_b","description","map","maybeText","replaceAll","filter","Boolean","join","React","isValidElement","cloneElement","clsx","style","tabIndex","jsx","type"],"mappings":"+NAKO,MAAMA,EAAiBC,GAC1B,UAA0BC,SAAAA,EAAUC,UAAAA,KAAcC,GAASC,WACvD,MAAQC,OAAAA,EAAQC,kBAAAA,EAAmBC,KAAAA,EAAMC,UAAAA,GACrCC,IACEC,EAAeT,EAAiBU,IAChCA,EAAMC,EAAa,CACrBF,EACAH,EAAKM,aACLT,IASEU,EAAY,CACb,OAAAC,EAAAR,EAAKS,UAAUC,gBAAfF,EAA+CG,YAChD,OAAAC,EAAAZ,EAAKa,YAAYH,gBAAjBE,EAA0BD,aAEzBG,KATDC,GAEO,MAAAA,OAAA,EAAAA,EAAWC,WAAW,mBAAoB,MAQhDC,OAAOC,SACPC,KAAK,MAEN,OAAAC,EAAMC,eAAe3B,GACd0B,EAAME,aACT5B,EACAK,EAAkB,CACdK,IAAAA,EACA,aAAcG,KACXb,EAASE,SACTA,EACHD,UAAW4B,EAAK7B,EAASE,MAAMD,UAAWA,GAC1C,qBAAsBG,EACtB0B,MAAO,IAAK9B,EAASE,MAAM4B,OAC3BC,SAAwB,UAAdxB,EAAwB,OAAI,KAM9CyB,EAAC,SAAA,CACG,qBAAoB5B,KAChBC,EAAkB,CAClBJ,UAAW4B,EAAK5B,EAAW,uBAE3BgC,KAAM,SACNvB,IAAAA,EACA,aAAcG,KACXX,IAGNF,SAAAA,GACL"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimatedDetails.js","sources":["../../../../src/hooks/useAnimatedDetails/useAnimatedDetails.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Lar deg animere et HTML details element med en summary trigger og noe innhold.\n * HTML strukturen din bør se ut som omtrent\n * <details ref={detailsRef}>\n * <summary ref={summaryRef} onClick={onSummaryClick}>Trigger for å åpne</summary>\n * <div ref={contentRef}>Ekspanderbart innhold</div>\n * </details>\n *\n * @param onOpenChange Callback med informasjon om når elementet åpner/lukker seg.\n * @param isExpanded Styr åpning/lukking utenfra.\n * @deprecated Bruk heller `useAnimatedHeightBetween` eller lignende på selve innholdet\n */\nexport const useAnimatedDetails = ({\n onOpenChange,\n isExpanded,\n}: {\n onOpenChange: (open: boolean, e: React.MouseEvent<HTMLElement>) => void;\n isExpanded: boolean;\n}): {\n detailsRef: React.RefObject<HTMLDetailsElement>;\n summaryRef: React.RefObject<HTMLButtonElement>;\n contentRef: React.RefObject<HTMLDivElement>;\n onSummaryClick: React.MouseEventHandler<HTMLElement>;\n} => {\n const detailsRef = useRef<HTMLDetailsElement>(null);\n const summaryRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const animation = useRef<Animation | null>(null);\n\n const [isClosing, setIsClosing] = useState(false);\n const [isExpanding, setIsExpanding] = useState(false);\n\n useEffect(() => {\n onAnimationFinish(isExpanded);\n }, [isExpanded]);\n\n const onAnimationFinish = (open: boolean) => {\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.open = open;\n animation.current = null;\n setIsClosing(false);\n setIsExpanding(false);\n detailsRef.current.style.overflow = \"\";\n detailsRef.current.style.height = \"\";\n }\n };\n\n const open = (e: React.MouseEvent<HTMLElement>) => {\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.style.height = `${detailsRef.current.offsetHeight}px`;\n detailsRef.current.open = true;\n requestAnimationFrame(() => {\n if (\n detailsRef.current &&\n summaryRef.current &&\n contentRef.current\n ) {\n setIsExpanding(true);\n onOpenChange(true, e);\n const startHeight = detailsRef.current.offsetHeight;\n const endHeight =\n summaryRef.current.offsetHeight +\n contentRef.current.offsetHeight;\n\n if (animation.current) {\n animation.current.cancel();\n }\n\n if (detailsRef.current.animate) {\n animation.current = detailsRef.current.animate(\n {\n height: [`${startHeight}px`, `${endHeight}px`],\n },\n {\n duration: 150,\n easing: \"ease\",\n },\n );\n animation.current.onfinish = () =>\n onAnimationFinish(true);\n animation.current.oncancel = () =>\n setIsExpanding(false);\n }\n }\n });\n }\n };\n\n const close = (e: React.MouseEvent<HTMLElement>) => {\n if (detailsRef.current && summaryRef.current) {\n setIsClosing(true);\n onOpenChange(false, e);\n const startHeight = detailsRef.current.offsetHeight;\n const endHeight = summaryRef.current.offsetHeight;\n if (animation.current) {\n animation.current.cancel();\n }\n\n if (detailsRef.current.animate) {\n animation.current = detailsRef.current.animate(\n {\n height: [`${startHeight}px`, `${endHeight}px`],\n },\n {\n duration: 150,\n easing: \"ease\",\n },\n );\n animation.current.onfinish = () => onAnimationFinish(false);\n animation.current.oncancel = () => setIsClosing(false);\n }\n }\n };\n\n const onSummaryClick = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.style.overflow = \"hidden\";\n if (isClosing || !detailsRef.current.open) {\n open(e);\n } else if (isExpanding || detailsRef.current.open) {\n close(e);\n }\n }\n };\n\n return { detailsRef, summaryRef, contentRef, onSummaryClick };\n};\n"],"names":["useAnimatedDetails","onOpenChange","isExpanded","detailsRef","useRef","summaryRef","contentRef","animation","isClosing","setIsClosing","useState","isExpanding","setIsExpanding","useEffect","onAnimationFinish","open","current","style","overflow","height","onSummaryClick","e","preventDefault","offsetHeight","requestAnimationFrame","startHeight","endHeight","cancel","animate","duration","easing","onfinish","oncancel","close"],"mappings":"4DAcO,MAAMA,EAAqB,EAC9BC,aAAAA,EACAC,WAAAA,MAUM,MAAAC,EAAaC,EAA2B,MACxCC,EAAaD,EAA0B,MACvCE,EAAaF,EAAuB,MACpCG,EAAYH,EAAyB,OAEpCI,EAAWC,GAAgBC,GAAS,IACpCC,EAAaC,GAAkBF,GAAS,GAE/CG,GAAU,KACNC,EAAkBZ,EAAU,GAC7B,CAACA,IAEEY,MAAAA,EAAqBC,IACnBZ,EAAWa,SAAWX,EAAWW,UACjCb,EAAWa,QAAQD,KAAOA,EAC1BR,EAAUS,QAAU,KACpBP,GAAa,GACbG,GAAe,GACJT,EAAAa,QAAQC,MAAMC,SAAW,GACzBf,EAAAa,QAAQC,MAAME,OAAS,GAAA,EAmFnC,MAAA,CAAEhB,WAAAA,EAAYE,WAAAA,EAAYC,WAAAA,EAAYc,eAZrBC,IACpBA,EAAEC,iBACEnB,EAAWa,SAAWX,EAAWW,UACtBb,EAAAa,QAAQC,MAAMC,SAAW,SAChCV,IAAcL,EAAWa,QAAQD,KAvEhC,CAACM,IACNlB,EAAWa,SAAWX,EAAWW,UACjCb,EAAWa,QAAQC,MAAME,OAAS,GAAGhB,EAAWa,QAAQO,iBACxDpB,EAAWa,QAAQD,MAAO,EAC1BS,uBAAsB,KAClB,GACIrB,EAAWa,SACXX,EAAWW,SACXV,EAAWU,QACb,CACEJ,GAAe,GACfX,GAAa,EAAMoB,GACbI,MAAAA,EAActB,EAAWa,QAAQO,aACjCG,EACFrB,EAAWW,QAAQO,aACnBjB,EAAWU,QAAQO,aAEnBhB,EAAUS,SACVT,EAAUS,QAAQW,SAGlBxB,EAAWa,QAAQY,UACTrB,EAAAS,QAAUb,EAAWa,QAAQY,QACnC,CACIT,OAAQ,CAAC,GAAGM,MAAiB,GAAGC,QAEpC,CACIG,SAAU,IACVC,OAAQ,SAGhBvB,EAAUS,QAAQe,SAAW,IACzBjB,GAAkB,GACtBP,EAAUS,QAAQgB,SAAW,IACzBpB,GAAe,GAE3B,KACH,EAmCGG,CAAKM,IACEV,GAAeR,EAAWa,QAAQD,OAhCvC,CAACM,IACPlB,GAAAA,EAAWa,SAAWX,EAAWW,QAAS,CAC1CP,GAAa,GACbR,GAAa,EAAOoB,GACd,MAAAI,EAActB,EAAWa,QAAQO,aACjCG,EAAYrB,EAAWW,QAAQO,aACjChB,EAAUS,SACVT,EAAUS,QAAQW,SAGlBxB,EAAWa,QAAQY,UACTrB,EAAAS,QAAUb,EAAWa,QAAQY,QACnC,CACIT,OAAQ,CAAC,GAAGM,MAAiB,GAAGC,QAEpC,CACIG,SAAU,IACVC,OAAQ,SAGhBvB,EAAUS,QAAQe,SAAW,IAAMjB,GAAkB,GACrDP,EAAUS,QAAQgB,SAAW,IAAMvB,GAAa,GAExD,GAUQwB,CAAMZ,GAAC,EAKyC"}
1
+ {"version":3,"file":"useAnimatedDetails.js","sources":["../../../../src/hooks/useAnimatedDetails/useAnimatedDetails.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\n/**\n * Lar deg animere et HTML details element med en summary trigger og noe innhold.\n * HTML strukturen din bør se ut som omtrent\n * <details ref={detailsRef}>\n * <summary ref={summaryRef} onClick={onSummaryClick}>Trigger for å åpne</summary>\n * <div ref={contentRef}>Ekspanderbart innhold</div>\n * </details>\n *\n * @param onOpenChange Callback med informasjon om når elementet åpner/lukker seg.\n * @param isExpanded Styr åpning/lukking utenfra.\n * @deprecated Bruk heller `useAnimatedHeightBetween` eller lignende på selve innholdet\n */\nexport const useAnimatedDetails = ({\n onOpenChange,\n isExpanded,\n}: {\n onOpenChange: (open: boolean, e: React.MouseEvent<HTMLElement>) => void;\n isExpanded: boolean;\n}): {\n detailsRef: React.RefObject<HTMLDetailsElement>;\n summaryRef: React.RefObject<HTMLButtonElement>;\n contentRef: React.RefObject<HTMLDivElement>;\n onSummaryClick: React.MouseEventHandler<HTMLElement>;\n} => {\n const detailsRef = useRef<HTMLDetailsElement>(null);\n const summaryRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const animation = useRef<Animation | null>(null);\n\n const [isClosing, setIsClosing] = useState(false);\n const [isExpanding, setIsExpanding] = useState(false);\n\n useEffect(() => {\n onAnimationFinish(isExpanded);\n }, [isExpanded]);\n\n const onAnimationFinish = (open: boolean) => {\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.open = open;\n animation.current = null;\n setIsClosing(false);\n setIsExpanding(false);\n detailsRef.current.style.overflow = \"\";\n detailsRef.current.style.height = \"\";\n }\n };\n\n const open = (e: React.MouseEvent<HTMLElement>) => {\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.style.height = `${detailsRef.current.offsetHeight}px`;\n detailsRef.current.open = true;\n requestAnimationFrame(() => {\n if (\n detailsRef.current &&\n summaryRef.current &&\n contentRef.current\n ) {\n setIsExpanding(true);\n onOpenChange(true, e);\n const startHeight = detailsRef.current.offsetHeight;\n const endHeight =\n summaryRef.current.offsetHeight +\n contentRef.current.offsetHeight;\n\n if (animation.current) {\n animation.current.cancel();\n }\n\n if (detailsRef.current.animate) {\n animation.current = detailsRef.current.animate(\n {\n height: [`${startHeight}px`, `${endHeight}px`],\n },\n {\n duration: 150,\n easing: \"ease\",\n },\n );\n animation.current.onfinish = () =>\n onAnimationFinish(true);\n animation.current.oncancel = () =>\n setIsExpanding(false);\n }\n }\n });\n }\n };\n\n const close = (e: React.MouseEvent<HTMLElement>) => {\n if (detailsRef.current && summaryRef.current) {\n setIsClosing(true);\n onOpenChange(false, e);\n const startHeight = detailsRef.current.offsetHeight;\n const endHeight = summaryRef.current.offsetHeight;\n if (animation.current) {\n animation.current.cancel();\n }\n\n if (detailsRef.current.animate) {\n animation.current = detailsRef.current.animate(\n {\n height: [`${startHeight}px`, `${endHeight}px`],\n },\n {\n duration: 150,\n easing: \"ease\",\n },\n );\n animation.current.onfinish = () => onAnimationFinish(false);\n animation.current.oncancel = () => setIsClosing(false);\n }\n }\n };\n\n const onSummaryClick = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n if (detailsRef.current && summaryRef.current) {\n detailsRef.current.style.overflow = \"hidden\";\n if (isClosing || !detailsRef.current.open) {\n open(e);\n } else if (isExpanding || detailsRef.current.open) {\n close(e);\n }\n }\n };\n\n return { detailsRef, summaryRef, contentRef, onSummaryClick };\n};\n"],"names":["useAnimatedDetails","onOpenChange","isExpanded","detailsRef","useRef","summaryRef","contentRef","animation","isClosing","setIsClosing","useState","isExpanding","setIsExpanding","useEffect","onAnimationFinish","open","current","style","overflow","height","onSummaryClick","e","preventDefault","offsetHeight","requestAnimationFrame","startHeight","endHeight","cancel","animate","duration","easing","onfinish","oncancel","close"],"mappings":"4DAcO,MAAMA,EAAqB,EAC9BC,aAAAA,EACAC,WAAAA,MAUM,MAAAC,EAAaC,EAA2B,MACxCC,EAAaD,EAA0B,MACvCE,EAAaF,EAAuB,MACpCG,EAAYH,EAAyB,OAEpCI,EAAWC,GAAgBC,GAAS,IACpCC,EAAaC,GAAkBF,GAAS,GAE/CG,GAAU,KACNC,EAAkBZ,EAAU,GAC7B,CAACA,IAEEY,MAAAA,EAAqBC,IACnBZ,EAAWa,SAAWX,EAAWW,UACjCb,EAAWa,QAAQD,KAAOA,EAC1BR,EAAUS,QAAU,KACpBP,GAAa,GACbG,GAAe,GACJT,EAAAa,QAAQC,MAAMC,SAAW,GACzBf,EAAAa,QAAQC,MAAME,OAAS,GAAA,EAmFnC,MAAA,CAAEhB,WAAAA,EAAYE,WAAAA,EAAYC,WAAAA,EAAYc,eAZrBC,IACpBA,EAAEC,iBACEnB,EAAWa,SAAWX,EAAWW,UACtBb,EAAAa,QAAQC,MAAMC,SAAW,SAChCV,IAAcL,EAAWa,QAAQD,KAvEhC,CAACM,IACNlB,EAAWa,SAAWX,EAAWW,UACjCb,EAAWa,QAAQC,MAAME,OAAS,GAAGhB,EAAWa,QAAQO,iBACxDpB,EAAWa,QAAQD,MAAO,EAC1BS,uBAAsB,KAClB,GACIrB,EAAWa,SACXX,EAAWW,SACXV,EAAWU,QACb,CACEJ,GAAe,GACfX,GAAa,EAAMoB,GACbI,MAAAA,EAActB,EAAWa,QAAQO,aACjCG,EACFrB,EAAWW,QAAQO,aACnBjB,EAAWU,QAAQO,aAEnBhB,EAAUS,SACVT,EAAUS,QAAQW,SAGlBxB,EAAWa,QAAQY,UACTrB,EAAAS,QAAUb,EAAWa,QAAQY,QACnC,CACIT,OAAQ,CAAC,GAAGM,MAAiB,GAAGC,QAEpC,CACIG,SAAU,IACVC,OAAQ,SAGhBvB,EAAUS,QAAQe,SAAW,IACzBjB,GAAkB,GACtBP,EAAUS,QAAQgB,SAAW,IACzBpB,GAAe,GACvB,KAEP,EAmCGG,CAAKM,IACEV,GAAeR,EAAWa,QAAQD,OAhCvC,CAACM,IACPlB,GAAAA,EAAWa,SAAWX,EAAWW,QAAS,CAC1CP,GAAa,GACbR,GAAa,EAAOoB,GACd,MAAAI,EAActB,EAAWa,QAAQO,aACjCG,EAAYrB,EAAWW,QAAQO,aACjChB,EAAUS,SACVT,EAAUS,QAAQW,SAGlBxB,EAAWa,QAAQY,UACTrB,EAAAS,QAAUb,EAAWa,QAAQY,QACnC,CACIT,OAAQ,CAAC,GAAGM,MAAiB,GAAGC,QAEpC,CACIG,SAAU,IACVC,OAAQ,SAGhBvB,EAAUS,QAAQe,SAAW,IAAMjB,GAAkB,GACrDP,EAAUS,QAAQgB,SAAW,IAAMvB,GAAa,GACpD,GAWIwB,CAAMZ,GAAC,EAKyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimatedHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAnimatedHeight.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultDisplay = \"block\";\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\n/**\n * Lar deg animere et element opp til sin maksimale høyde, eller ned til 0.\n *\n * @param isOpen Om elementet er åpent eller lukket.\n * @param options Konfigurer display-property, easing og timing, og eventuelle callbacks for life cycle til animasjonen.\n * @returns Ref til elementet som skal animeres, og en funksjon for å trigge animasjonen manuelt.\n */\nexport function useAnimatedHeight<T extends HTMLElement>(\n isOpen: boolean,\n options?: UseAnimatedHeightOptions<T>,\n): [RefObject<T>, () => void] {\n const wasOpen = usePreviousValue(isOpen);\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const display = options?.display || defaultDisplay;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n function handleTransitionEnd(event: TransitionEvent) {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n if (isOpen) {\n element.removeAttribute(\"style\");\n } else {\n element.removeAttribute(\"style\");\n element.style.display = \"none\";\n }\n options?.onTransitionEnd?.(isOpen, elementRef);\n }\n }\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n // Ikke kjør animasjonen hvis elementet ikke er rendret,\n // eller hvis det er første render.\n if (!element || wasOpen === undefined) {\n return;\n }\n\n if (!isOpen) {\n element.style.display = \"none\";\n if (!wasOpen) {\n // Første render eller rerender med isOpen false\n return;\n }\n } else if (isOpen && wasOpen) {\n // Re-render etter å ha vært lukket, men forblitt åpen.\n return;\n }\n\n options?.onTransitionStart?.(isOpen, elementRef);\n\n if (prefersReducedMotion) {\n element.removeAttribute(\"style\");\n if (isOpen) {\n options?.onFirstVisible?.(isOpen, elementRef);\n }\n options?.onTransitionEnd?.(isOpen, elementRef); // make sure to call callback when animation is off\n return;\n }\n\n element.style.transition = transition;\n element.style.display = display;\n element.style.overflow = \"hidden\";\n\n if (isOpen) {\n options?.onFirstVisible?.(isOpen, elementRef);\n element.style.height = \"0\";\n element.style.height = `${element.scrollHeight}px`;\n } else {\n // If the scrollHeight is 0 it means that we are transitioning from height 0 -> 0.\n // This causes the \"transitionend\"-event to never fire and the element gets stuck with\n // style: height: 0; display: block; overflow:hidden\n if (element.scrollHeight === 0) {\n element.removeAttribute(\"style\");\n return;\n }\n\n element.style.height = `${element.scrollHeight}px`;\n\n raf1.current = requestAnimationFrame(() => {\n raf2.current = requestAnimationFrame(() => {\n element.style.height = `${0}px`;\n });\n });\n }\n }, [isOpen, options, wasOpen, transition, prefersReducedMotion, display]);\n\n useEffect(() => {\n runAnimation();\n }, [isOpen, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return [elementRef, runAnimation];\n}\n"],"names":["useAnimatedHeight","isOpen","options","wasOpen","usePreviousValue","easing","timing","display","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","event","element","current","target","removeAttribute","style","_a","onTransitionEnd","call","runAnimation","useCallback","onTransitionStart","_b","onFirstVisible","_c","overflow","_d","height","scrollHeight","requestAnimationFrame","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiBgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAUC,EAAiBH,GAC3BI,GAAS,MAAAH,OAAA,EAAAA,EAASG,SAfN,WAgBZC,GAAS,MAAAJ,OAAAA,EAAAA,EAASI,SAfN,aAgBZC,GAAU,MAAAL,SAAAA,EAASK,UAlBN,QAmBbC,EAAa,GAAGC,EAAOC,OAAOJ,OAAOA,aAAkBG,EAAOC,OAAOL,OAAOA,MAE1EM,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAE7B,SAASG,EAAoBC,SACzB,MAAMC,EAAUH,EAAWI,QAGvBD,GAAWD,EAAMG,SAAWF,IACxBlB,EACAkB,EAAQG,gBAAgB,UAExBH,EAAQG,gBAAgB,SACxBH,EAAQI,MAAMhB,QAAU,QAEnB,OAAAiB,EAAA,MAAAtB,OAAA,EAAAA,EAAAuB,kBAAAD,EAAAE,KAAAxB,EAAkBD,EAAQe,GAE3C,CAEMW,MAAAA,EAAeC,GAAY,iBAC7B,MAAMT,EAAUH,EAAWI,QAIvB,GAACD,QAAuB,IAAZhB,EAIhB,CAAKF,GAAAA,GAML,GAAWA,GAAUE,EAEjB,YAAA,GAPAgB,EAAQI,MAAMhB,QAAU,QACnBJ,EAED,OAOCqB,GAAA,OAAAA,EAAA,MAAAtB,OAAA,EAAAA,EAAA2B,oBAAAL,EAAAE,KAAAxB,EAAoBD,EAAQe,GAEjCL,EAMA,OALAQ,EAAQG,gBAAgB,SACpBrB,IACS,OAAA6B,EAAA,MAAA5B,OAAA,EAAAA,EAAA6B,iBAAAD,EAAAJ,KAAAxB,EAAiBD,EAAQe,SAE7B,OAAAgB,EAAA,MAAA9B,OAAA,EAAAA,EAAAuB,kBAAAO,EAAAN,KAAAxB,EAAkBD,EAAQe,IAIvCG,GAAAA,EAAQI,MAAMf,WAAaA,EAC3BW,EAAQI,MAAMhB,QAAUA,EACxBY,EAAQI,MAAMU,SAAW,SAErBhC,EACS,OAAAiC,EAAA,MAAAhC,OAAAA,EAAAA,EAAA6B,iBAAAG,EAAAR,KAAAxB,EAAiBD,EAAQe,GAClCG,EAAQI,MAAMY,OAAS,IACvBhB,EAAQI,MAAMY,OAAS,GAAGhB,EAAQiB,qBAC/B,CAICjB,GAAyB,IAAzBA,EAAQiB,aAER,YADAjB,EAAQG,gBAAgB,SAI5BH,EAAQI,MAAMY,OAAS,GAAGhB,EAAQiB,iBAE7BvB,EAAAO,QAAUiB,uBAAsB,KAC5BtB,EAAAK,QAAUiB,uBAAsB,KACzBlB,EAAAI,MAAMY,OAAS,KAAA,GAC1B,GAET,CAAA,IACD,CAAClC,EAAQC,EAASC,EAASK,EAAYG,EAAsBJ,IAEhE,OAAA+B,GAAU,KACOX,MACd,CAAC1B,EAAQ0B,IAEZW,GAAU,KACN,MAAMnB,EAAUH,EAAWI,QAC3B,OAAID,GACQA,EAAAoB,iBAAiB,gBAAiBtB,GAGvC,KACCE,GACQA,EAAAqB,oBACJ,gBACAvB,EAAA,CAER,GAGL,CAAChB,IAEJqC,GAAU,KACN,MAAMG,EAAK5B,EAAKO,QACVsB,EAAK3B,EAAKK,QAChB,MAAO,KACHqB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CAAA,GAElC,CAAC7B,EAAME,IAEH,CAACC,EAAYW,EACxB"}
1
+ {"version":3,"file":"useAnimatedHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAnimatedHeight.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultDisplay = \"block\";\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\n/**\n * Lar deg animere et element opp til sin maksimale høyde, eller ned til 0.\n *\n * @param isOpen Om elementet er åpent eller lukket.\n * @param options Konfigurer display-property, easing og timing, og eventuelle callbacks for life cycle til animasjonen.\n * @returns Ref til elementet som skal animeres, og en funksjon for å trigge animasjonen manuelt.\n */\nexport function useAnimatedHeight<T extends HTMLElement>(\n isOpen: boolean,\n options?: UseAnimatedHeightOptions<T>,\n): [RefObject<T>, () => void] {\n const wasOpen = usePreviousValue(isOpen);\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const display = options?.display || defaultDisplay;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n function handleTransitionEnd(event: TransitionEvent) {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n if (isOpen) {\n element.removeAttribute(\"style\");\n } else {\n element.removeAttribute(\"style\");\n element.style.display = \"none\";\n }\n options?.onTransitionEnd?.(isOpen, elementRef);\n }\n }\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n // Ikke kjør animasjonen hvis elementet ikke er rendret,\n // eller hvis det er første render.\n if (!element || wasOpen === undefined) {\n return;\n }\n\n if (!isOpen) {\n element.style.display = \"none\";\n if (!wasOpen) {\n // Første render eller rerender med isOpen false\n return;\n }\n } else if (isOpen && wasOpen) {\n // Re-render etter å ha vært lukket, men forblitt åpen.\n return;\n }\n\n options?.onTransitionStart?.(isOpen, elementRef);\n\n if (prefersReducedMotion) {\n element.removeAttribute(\"style\");\n if (isOpen) {\n options?.onFirstVisible?.(isOpen, elementRef);\n }\n options?.onTransitionEnd?.(isOpen, elementRef); // make sure to call callback when animation is off\n return;\n }\n\n element.style.transition = transition;\n element.style.display = display;\n element.style.overflow = \"hidden\";\n\n if (isOpen) {\n options?.onFirstVisible?.(isOpen, elementRef);\n element.style.height = \"0\";\n element.style.height = `${element.scrollHeight}px`;\n } else {\n // If the scrollHeight is 0 it means that we are transitioning from height 0 -> 0.\n // This causes the \"transitionend\"-event to never fire and the element gets stuck with\n // style: height: 0; display: block; overflow:hidden\n if (element.scrollHeight === 0) {\n element.removeAttribute(\"style\");\n return;\n }\n\n element.style.height = `${element.scrollHeight}px`;\n\n raf1.current = requestAnimationFrame(() => {\n raf2.current = requestAnimationFrame(() => {\n element.style.height = `${0}px`;\n });\n });\n }\n }, [isOpen, options, wasOpen, transition, prefersReducedMotion, display]);\n\n useEffect(() => {\n runAnimation();\n }, [isOpen, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return [elementRef, runAnimation];\n}\n"],"names":["useAnimatedHeight","isOpen","options","wasOpen","usePreviousValue","easing","timing","display","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","event","element","current","target","removeAttribute","style","_a","onTransitionEnd","call","runAnimation","useCallback","onTransitionStart","_b","onFirstVisible","_c","overflow","_d","height","scrollHeight","requestAnimationFrame","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiBgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAUC,EAAiBH,GAC3BI,GAAS,MAAAH,OAAA,EAAAA,EAASG,SAfN,WAgBZC,GAAS,MAAAJ,OAAAA,EAAAA,EAASI,SAfN,aAgBZC,GAAU,MAAAL,SAAAA,EAASK,UAlBN,QAmBbC,EAAa,GAAGC,EAAOC,OAAOJ,OAAOA,aAAkBG,EAAOC,OAAOL,OAAOA,MAE1EM,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAE7B,SAASG,EAAoBC,SACzB,MAAMC,EAAUH,EAAWI,QAGvBD,GAAWD,EAAMG,SAAWF,IACxBlB,EACAkB,EAAQG,gBAAgB,UAExBH,EAAQG,gBAAgB,SACxBH,EAAQI,MAAMhB,QAAU,QAEnB,OAAAiB,EAAA,MAAAtB,OAAA,EAAAA,EAAAuB,kBAAAD,EAAAE,KAAAxB,EAAkBD,EAAQe,GACvC,CAGEW,MAAAA,EAAeC,GAAY,iBAC7B,MAAMT,EAAUH,EAAWI,QAIvB,GAACD,QAAuB,IAAZhB,EAIhB,CAAKF,GAAAA,GAML,GAAWA,GAAUE,EAEjB,YAAA,GAPAgB,EAAQI,MAAMhB,QAAU,QACnBJ,EAED,OAOCqB,GAAA,OAAAA,EAAA,MAAAtB,OAAA,EAAAA,EAAA2B,oBAAAL,EAAAE,KAAAxB,EAAoBD,EAAQe,GAEjCL,EAMA,OALAQ,EAAQG,gBAAgB,SACpBrB,IACS,OAAA6B,EAAA,MAAA5B,OAAA,EAAAA,EAAA6B,iBAAAD,EAAAJ,KAAAxB,EAAiBD,EAAQe,SAE7B,OAAAgB,EAAA,MAAA9B,OAAA,EAAAA,EAAAuB,kBAAAO,EAAAN,KAAAxB,EAAkBD,EAAQe,IAIvCG,GAAAA,EAAQI,MAAMf,WAAaA,EAC3BW,EAAQI,MAAMhB,QAAUA,EACxBY,EAAQI,MAAMU,SAAW,SAErBhC,EACS,OAAAiC,EAAA,MAAAhC,OAAAA,EAAAA,EAAA6B,iBAAAG,EAAAR,KAAAxB,EAAiBD,EAAQe,GAClCG,EAAQI,MAAMY,OAAS,IACvBhB,EAAQI,MAAMY,OAAS,GAAGhB,EAAQiB,qBAC/B,CAICjB,GAAyB,IAAzBA,EAAQiB,aAER,YADAjB,EAAQG,gBAAgB,SAI5BH,EAAQI,MAAMY,OAAS,GAAGhB,EAAQiB,iBAE7BvB,EAAAO,QAAUiB,uBAAsB,KAC5BtB,EAAAK,QAAUiB,uBAAsB,KACzBlB,EAAAI,MAAMY,OAAS,KAAA,GAC1B,GACJ,CAAA,IAEN,CAAClC,EAAQC,EAASC,EAASK,EAAYG,EAAsBJ,IAEhE,OAAA+B,GAAU,KACOX,GAAA,GACd,CAAC1B,EAAQ0B,IAEZW,GAAU,KACN,MAAMnB,EAAUH,EAAWI,QAC3B,OAAID,GACQA,EAAAoB,iBAAiB,gBAAiBtB,GAGvC,KACCE,GACQA,EAAAqB,oBACJ,gBACAvB,EACJ,CAER,GAED,CAAChB,IAEJqC,GAAU,KACN,MAAMG,EAAK5B,EAAKO,QACVsB,EAAK3B,EAAKK,QAChB,MAAO,KACHqB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CACjC,GACD,CAAC7B,EAAME,IAEH,CAACC,EAAYW,EACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAnimatedHeightBetween.js","sources":["../../../../src/hooks/useAnimatedHeight/useAnimatedHeightBetween.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\nfunction collapseElement<T extends HTMLElement>(\n elementRef: RefObject<T>,\n transition: string,\n raf1: React.MutableRefObject<number | undefined>,\n raf2: React.MutableRefObject<number | undefined>,\n) {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const expandedHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Hent kollapset høyde\n element.style.removeProperty(\"transition\");\n element.dataset[\"expanded\"] = \"false\";\n const collapsedHeight = element.getBoundingClientRect().height;\n element.dataset[\"expanded\"] = \"true\";\n\n // Sett høyde tilbake til utvidet høyde\n element.style.setProperty(\"height\", `${expandedHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til kollapset høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${collapsedHeight}px`);\n element.dataset[\"expanded\"] = \"false\";\n });\n });\n}\n\nfunction expandElement<T extends HTMLElement>(\n elementRef: RefObject<T>,\n transition: string,\n raf1: React.MutableRefObject<number | undefined>,\n raf2: React.MutableRefObject<number | undefined>,\n) {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const expandedHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Hent utvidet høyde\n element.style.removeProperty(\"transition\");\n element.dataset[\"expanded\"] = \"false\";\n const collapsedHeight = element.getBoundingClientRect().height;\n\n // Sett høyde tilbake til kollapset høyde\n element.style.setProperty(\"height\", `${collapsedHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til utvidet høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${expandedHeight}px`);\n element.dataset[\"expanded\"] = \"true\";\n });\n });\n}\n\n/**\n * Lar deg enklere animere mellom to tilstander, gitt ved å sette `data-expanded` på et element til `true` eller `false`.\n * Du bestemmer selv hvilke stiler elementet skal ha i de to tilstandene (vha CSS/Sass), og høyden animeres dersom den endrer seg.\n * @param isExpanded indikerer om elementet skal være utvidet eller ikke\n * @param options konfigurasjon for animasjonen, og lyttere for når animasjonen starter og slutter\n * @returns En tuple med referanse til elementet og en funksjon som kan trigge animasjonen\n */\nexport function useAnimatedHeightBetween<T extends HTMLElement>(\n isExpanded: boolean,\n options?: Omit<UseAnimatedHeightOptions<T>, \"display\" | \"onFirstVisible\">,\n): [RefObject<T>, () => void] {\n const wasExpanded = usePreviousValue(isExpanded);\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n const handleTransitionEnd = useCallback(\n (event: TransitionEvent) => {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n element.removeAttribute(\"style\");\n options?.onTransitionEnd?.(isExpanded, elementRef);\n }\n },\n [options, isExpanded],\n );\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n if (wasExpanded === undefined) {\n // Første render\n element.dataset[\"expanded\"] = isExpanded ? \"true\" : \"false\";\n }\n\n if ((!isExpanded && !wasExpanded) || (isExpanded && wasExpanded)) {\n // Ingen endring\n return;\n }\n\n options?.onTransitionStart?.(isExpanded, elementRef);\n\n if (prefersReducedMotion) {\n element.removeAttribute(\"style\");\n element.dataset[\"expanded\"] = isExpanded ? \"true\" : \"false\";\n options?.onTransitionEnd?.(isExpanded, elementRef); // make sure to call callback when animation is off\n return;\n }\n\n if (isExpanded) {\n expandElement(elementRef, transition, raf1, raf2);\n } else {\n collapseElement(elementRef, transition, raf1, raf2);\n }\n }, [wasExpanded, isExpanded, options, prefersReducedMotion, transition]);\n\n useEffect(() => {\n runAnimation();\n }, [isExpanded, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isExpanded]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return [elementRef, runAnimation];\n}\n"],"names":["useAnimatedHeightBetween","isExpanded","options","wasExpanded","usePreviousValue","easing","timing","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","useCallback","event","element","current","target","removeAttribute","_a","onTransitionEnd","call","runAnimation","dataset","expanded","onTransitionStart","_b","expandedHeight","scrollHeight","requestAnimationFrame","style","removeProperty","collapsedHeight","getBoundingClientRect","height","setProperty","expandElement","collapseElement","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiFgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAcC,EAAiBH,GAC/BI,GAAS,MAAAH,OAAA,EAAAA,EAASG,SAhFN,WAiFZC,GAAS,MAAAJ,OAAA,EAAAA,EAASI,SAhFN,aAiFZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,GACvBC,UACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACf,OAAAC,EAAA,MAAArB,SAAAA,EAAAsB,kBAAAD,EAAAE,KAAAvB,EAAkBD,EAAYc,GAAAA,GAG/C,CAACb,EAASD,IAGRyB,EAAeT,GAAY,aAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,SAEe,IAAhBhB,IAEAgB,EAAQQ,QAAQC,SAAc3B,EAAa,OAAS,YAGlDA,IAAeE,GAAiBF,GAAcE,IAOpD,CAFSoB,GAAA,OAAAA,EAAA,MAAArB,OAAA,EAAAA,EAAA2B,oBAAAN,EAAAE,KAAAvB,EAAoBD,EAAYc,GAErCL,EAIA,OAHAS,EAAQG,gBAAgB,SACxBH,EAAQQ,QAAQC,SAAc3B,EAAa,OAAS,aAC3C,OAAA6B,EAAA,MAAA5B,SAAAA,EAAAsB,kBAAAM,EAAAL,KAAAvB,EAAkBD,EAAYc,IAIvCd,EA3FZ,SACIc,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMS,EAAiBZ,EAAQa,aAE1BpB,EAAAQ,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMC,eAAe,cACrBhB,EAAAQ,QAAQC,SAAc,QACxBQ,MAAAA,EAAkBjB,EAAQkB,wBAAwBC,OAGxDnB,EAAQe,MAAMK,YAAY,SAAU,GAAGH,OAC/BjB,EAAAe,MAAMK,YAAY,aAAc,UAEnCzB,EAAAM,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMK,YAAY,aAAchC,GACxCY,EAAQe,MAAMK,YAAY,SAAU,GAAGR,OAC/BZ,EAAAQ,QAAQC,SAAc,MAAA,GACjC,GAET,CA8D0BY,CAAAzB,EAAYR,EAAYK,EAAME,GA7HxD,SACIC,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMS,EAAiBZ,EAAQa,aAE1BpB,EAAAQ,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMC,eAAe,cACrBhB,EAAAQ,QAAQC,SAAc,QACxBQ,MAAAA,EAAkBjB,EAAQkB,wBAAwBC,OAChDnB,EAAAQ,QAAQC,SAAc,OAG9BT,EAAQe,MAAMK,YAAY,SAAU,GAAGR,OAC/BZ,EAAAe,MAAMK,YAAY,aAAc,UAEnCzB,EAAAM,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMK,YAAY,aAAchC,GACxCY,EAAQe,MAAMK,YAAY,SAAU,GAAGH,OAC/BjB,EAAAQ,QAAQC,SAAc,OAAA,GACjC,GAET,CAgG4Ba,CAAA1B,EAAYR,EAAYK,EAAME,EAAI,IAEvD,CAACX,EAAaF,EAAYC,EAASQ,EAAsBH,IAE5D,OAAAmC,GAAU,KACOhB,MACd,CAACzB,EAAYyB,IAEhBgB,GAAU,KACN,MAAMvB,EAAUJ,EAAWK,QAC3B,OAAID,GACQA,EAAAwB,iBAAiB,gBAAiB3B,GAGvC,KACCG,GACQA,EAAAyB,oBACJ,gBACA5B,EAAA,CAER,GAGL,CAACf,IAEJyC,GAAU,KACN,MAAMG,EAAKjC,EAAKQ,QACV0B,EAAKhC,EAAKM,QAChB,MAAO,KACHyB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CAAA,GAElC,CAAClC,EAAME,IAEH,CAACC,EAAYW,EACxB"}
1
+ {"version":3,"file":"useAnimatedHeightBetween.js","sources":["../../../../src/hooks/useAnimatedHeight/useAnimatedHeightBetween.ts"],"sourcesContent":["import { type RefObject, useCallback, useEffect, useRef } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\nfunction collapseElement<T extends HTMLElement>(\n elementRef: RefObject<T>,\n transition: string,\n raf1: React.MutableRefObject<number | undefined>,\n raf2: React.MutableRefObject<number | undefined>,\n) {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const expandedHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Hent kollapset høyde\n element.style.removeProperty(\"transition\");\n element.dataset[\"expanded\"] = \"false\";\n const collapsedHeight = element.getBoundingClientRect().height;\n element.dataset[\"expanded\"] = \"true\";\n\n // Sett høyde tilbake til utvidet høyde\n element.style.setProperty(\"height\", `${expandedHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til kollapset høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${collapsedHeight}px`);\n element.dataset[\"expanded\"] = \"false\";\n });\n });\n}\n\nfunction expandElement<T extends HTMLElement>(\n elementRef: RefObject<T>,\n transition: string,\n raf1: React.MutableRefObject<number | undefined>,\n raf2: React.MutableRefObject<number | undefined>,\n) {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const expandedHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Hent utvidet høyde\n element.style.removeProperty(\"transition\");\n element.dataset[\"expanded\"] = \"false\";\n const collapsedHeight = element.getBoundingClientRect().height;\n\n // Sett høyde tilbake til kollapset høyde\n element.style.setProperty(\"height\", `${collapsedHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til utvidet høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${expandedHeight}px`);\n element.dataset[\"expanded\"] = \"true\";\n });\n });\n}\n\n/**\n * Lar deg enklere animere mellom to tilstander, gitt ved å sette `data-expanded` på et element til `true` eller `false`.\n * Du bestemmer selv hvilke stiler elementet skal ha i de to tilstandene (vha CSS/Sass), og høyden animeres dersom den endrer seg.\n * @param isExpanded indikerer om elementet skal være utvidet eller ikke\n * @param options konfigurasjon for animasjonen, og lyttere for når animasjonen starter og slutter\n * @returns En tuple med referanse til elementet og en funksjon som kan trigge animasjonen\n */\nexport function useAnimatedHeightBetween<T extends HTMLElement>(\n isExpanded: boolean,\n options?: Omit<UseAnimatedHeightOptions<T>, \"display\" | \"onFirstVisible\">,\n): [RefObject<T>, () => void] {\n const wasExpanded = usePreviousValue(isExpanded);\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n const handleTransitionEnd = useCallback(\n (event: TransitionEvent) => {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n element.removeAttribute(\"style\");\n options?.onTransitionEnd?.(isExpanded, elementRef);\n }\n },\n [options, isExpanded],\n );\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n if (wasExpanded === undefined) {\n // Første render\n element.dataset[\"expanded\"] = isExpanded ? \"true\" : \"false\";\n }\n\n if ((!isExpanded && !wasExpanded) || (isExpanded && wasExpanded)) {\n // Ingen endring\n return;\n }\n\n options?.onTransitionStart?.(isExpanded, elementRef);\n\n if (prefersReducedMotion) {\n element.removeAttribute(\"style\");\n element.dataset[\"expanded\"] = isExpanded ? \"true\" : \"false\";\n options?.onTransitionEnd?.(isExpanded, elementRef); // make sure to call callback when animation is off\n return;\n }\n\n if (isExpanded) {\n expandElement(elementRef, transition, raf1, raf2);\n } else {\n collapseElement(elementRef, transition, raf1, raf2);\n }\n }, [wasExpanded, isExpanded, options, prefersReducedMotion, transition]);\n\n useEffect(() => {\n runAnimation();\n }, [isExpanded, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isExpanded]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return [elementRef, runAnimation];\n}\n"],"names":["useAnimatedHeightBetween","isExpanded","options","wasExpanded","usePreviousValue","easing","timing","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","useCallback","event","element","current","target","removeAttribute","_a","onTransitionEnd","call","runAnimation","dataset","expanded","onTransitionStart","_b","expandedHeight","scrollHeight","requestAnimationFrame","style","removeProperty","collapsedHeight","getBoundingClientRect","height","setProperty","expandElement","collapseElement","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiFgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAcC,EAAiBH,GAC/BI,GAAS,MAAAH,OAAA,EAAAA,EAASG,SAhFN,WAiFZC,GAAS,MAAAJ,OAAA,EAAAA,EAASI,SAhFN,aAiFZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,GACvBC,UACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACf,OAAAC,EAAA,MAAArB,SAAAA,EAAAsB,kBAAAD,EAAAE,KAAAvB,EAAkBD,EAAYc,GAAAA,GAG/C,CAACb,EAASD,IAGRyB,EAAeT,GAAY,aAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,SAEe,IAAhBhB,IAEAgB,EAAQQ,QAAQC,SAAc3B,EAAa,OAAS,YAGlDA,IAAeE,GAAiBF,GAAcE,IAOpD,CAFSoB,GAAA,OAAAA,EAAA,MAAArB,OAAA,EAAAA,EAAA2B,oBAAAN,EAAAE,KAAAvB,EAAoBD,EAAYc,GAErCL,EAIA,OAHAS,EAAQG,gBAAgB,SACxBH,EAAQQ,QAAQC,SAAc3B,EAAa,OAAS,aAC3C,OAAA6B,EAAA,MAAA5B,SAAAA,EAAAsB,kBAAAM,EAAAL,KAAAvB,EAAkBD,EAAYc,IAIvCd,EA3FZ,SACIc,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMS,EAAiBZ,EAAQa,aAE1BpB,EAAAQ,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMC,eAAe,cACrBhB,EAAAQ,QAAQC,SAAc,QACxBQ,MAAAA,EAAkBjB,EAAQkB,wBAAwBC,OAGxDnB,EAAQe,MAAMK,YAAY,SAAU,GAAGH,OAC/BjB,EAAAe,MAAMK,YAAY,aAAc,UAEnCzB,EAAAM,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMK,YAAY,aAAchC,GACxCY,EAAQe,MAAMK,YAAY,SAAU,GAAGR,OAC/BZ,EAAAQ,QAAQC,SAAc,MAAA,GACjC,GAET,CA8D0BY,CAAAzB,EAAYR,EAAYK,EAAME,GA7HxD,SACIC,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMS,EAAiBZ,EAAQa,aAE1BpB,EAAAQ,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMC,eAAe,cACrBhB,EAAAQ,QAAQC,SAAc,QACxBQ,MAAAA,EAAkBjB,EAAQkB,wBAAwBC,OAChDnB,EAAAQ,QAAQC,SAAc,OAG9BT,EAAQe,MAAMK,YAAY,SAAU,GAAGR,OAC/BZ,EAAAe,MAAMK,YAAY,aAAc,UAEnCzB,EAAAM,QAAUa,uBAAsB,KAEzBd,EAAAe,MAAMK,YAAY,aAAchC,GACxCY,EAAQe,MAAMK,YAAY,SAAU,GAAGH,OAC/BjB,EAAAQ,QAAQC,SAAc,OAAA,GACjC,GAET,CAgG4Ba,CAAA1B,EAAYR,EAAYK,EAAME,EAAI,IAEvD,CAACX,EAAaF,EAAYC,EAASQ,EAAsBH,IAE5D,OAAAmC,GAAU,KACOhB,GAAA,GACd,CAACzB,EAAYyB,IAEhBgB,GAAU,KACN,MAAMvB,EAAUJ,EAAWK,QAC3B,OAAID,GACQA,EAAAwB,iBAAiB,gBAAiB3B,GAGvC,KACCG,GACQA,EAAAyB,oBACJ,gBACA5B,EACJ,CAER,GAED,CAACf,IAEJyC,GAAU,KACN,MAAMG,EAAKjC,EAAKQ,QACV0B,EAAKhC,EAAKM,QAChB,MAAO,KACHyB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CACjC,GACD,CAAClC,EAAME,IAEH,CAACC,EAAYW,EACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAutoAnimateHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAutoAnimateHeight.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { type Easing, type Timing } from \"../../core/types.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"expressive\";\n\nexport type UseAutoAnimatedHeightOptions<T extends HTMLElement> = {\n easing?: Easing;\n /**\n * Overstyr standard timing\n * @default \"expressive\"\n */\n timing?: Timing;\n onTransitionStart?: (ref: RefObject<T>) => void;\n onTransitionEnd?: (ref: RefObject<T>) => void;\n};\n\n/**\n * Gjør det enklere å animere høyden på et element når innholdet endrer seg, men kan brukes på mer generelt grunnlag.\n * Hooken tar inn en triggerverdi, og når denne endrer seg animeres høyden på elementet dersom den har endret seg.\n * @param trigger verdien som brukes til å trigge animasjonen. Dersom denne endrer seg animeres høyden på elementet.\n * @param options konfigurasjon for animasjonen, og lyttere for når animasjonen starter og slutter\n * @returns en referanse til elementet som skal animeres\n */\nexport function useAutoAnimatedHeight<T extends HTMLElement = HTMLElement>(\n trigger: any,\n options?: UseAutoAnimatedHeightOptions<T>,\n) {\n const previousTriggerValue = usePreviousValue(trigger);\n const [previousHeight, setPreviousHeight] = useState(0);\n\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n const handleTransitionEnd = useCallback(\n (event: TransitionEvent) => {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n element.removeAttribute(\"style\");\n options?.onTransitionEnd?.(elementRef);\n }\n },\n [options],\n );\n\n const animateElement = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const newHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Sett høyde tilbake til forrige høyde\n element.style.removeProperty(\"transition\");\n element.style.setProperty(\"height\", `${previousHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til kollapset høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${newHeight}px`);\n });\n });\n\n setPreviousHeight(newHeight);\n }, [transition, previousHeight]);\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n if (previousTriggerValue === undefined) {\n // Første render\n setPreviousHeight(element.scrollHeight);\n return;\n }\n\n if (trigger === previousTriggerValue) {\n // Ingen endring\n return;\n }\n\n options?.onTransitionStart?.(elementRef);\n\n if (prefersReducedMotion) {\n options?.onTransitionEnd?.(elementRef); // make sure to call callback when animation is off\n return;\n }\n\n animateElement();\n }, [\n animateElement,\n trigger,\n previousTriggerValue,\n options,\n prefersReducedMotion,\n ]);\n\n useEffect(() => {\n runAnimation();\n }, [trigger, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n }, [handleTransitionEnd]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return elementRef;\n}\n"],"names":["useAutoAnimatedHeight","trigger","options","previousTriggerValue","usePreviousValue","previousHeight","setPreviousHeight","useState","easing","timing","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","useCallback","event","element","current","target","removeAttribute","_a","onTransitionEnd","call","animateElement","newHeight","scrollHeight","requestAnimationFrame","style","removeProperty","setProperty","runAnimation","onTransitionStart","_b","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"sRA2BgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAuBC,EAAiBH,IACvCI,EAAgBC,GAAqBC,EAAS,GAE/CC,GAAS,MAAAN,OAAAA,EAAAA,EAASM,SA5BN,WA6BZC,GAAS,MAAAP,SAAAA,EAASO,SA5BN,aA6BZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,GACvBC,UACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxB,OAAAC,EAAA,MAAAxB,SAAAA,EAASyB,kBAATD,EAAAE,KAAA1B,EAA2BgB,GAAAA,GAGnC,CAAChB,IAGC2B,EAAiBT,GAAY,KAC/B,MAAME,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMK,EAAYR,EAAQS,aAErBhB,EAAAQ,QAAUS,uBAAsB,KAEzBV,EAAAW,MAAMC,eAAe,cAC7BZ,EAAQW,MAAME,YAAY,SAAU,GAAG9B,OAC/BiB,EAAAW,MAAME,YAAY,aAAc,UAEnClB,EAAAM,QAAUS,uBAAsB,KAEzBV,EAAAW,MAAME,YAAY,aAAczB,GACxCY,EAAQW,MAAME,YAAY,SAAU,GAAGL,MAAa,GACvD,IAGLxB,EAAkBwB,EAAS,GAC5B,CAACpB,EAAYL,IAEV+B,EAAehB,GAAY,aAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,EAEL,CAAA,QAA6B,IAAzBnB,EAGA,YADAG,EAAkBgB,EAAQS,cAI9B,GAAI9B,IAAYE,EAOhB,CAFAuB,GAAA,OAAAA,EAAA,MAAAxB,OAAA,EAAAA,EAASmC,oBAATX,EAAAE,KAAA1B,EAA6BgB,GAEzBL,EAEA,YADA,OAAAyB,EAAA,MAAApC,OAAAA,EAAAA,EAASyB,kBAATW,EAAAV,KAAA1B,EAA2BgB,IAIhBW,QAChB,CACCA,EACA5B,EACAE,EACAD,EACAW,IAGJ,OAAA0B,GAAU,KACOH,MACd,CAACnC,EAASmC,IAEbG,GAAU,KACN,MAAMjB,EAAUJ,EAAWK,QAC3B,OAAID,GACQA,EAAAkB,iBAAiB,gBAAiBrB,GAGvC,KACCG,GACQA,EAAAmB,oBACJ,gBACAtB,EAAA,CAER,GAEL,CAACA,IAEJoB,GAAU,KACN,MAAMG,EAAK3B,EAAKQ,QACVoB,EAAK1B,EAAKM,QAChB,MAAO,KACHmB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CAAA,GAElC,CAAC5B,EAAME,IAEHC,CACX"}
1
+ {"version":3,"file":"useAutoAnimateHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAutoAnimateHeight.ts"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport { type Easing, type Timing } from \"../../core/types.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"expressive\";\n\nexport type UseAutoAnimatedHeightOptions<T extends HTMLElement> = {\n easing?: Easing;\n /**\n * Overstyr standard timing\n * @default \"expressive\"\n */\n timing?: Timing;\n onTransitionStart?: (ref: RefObject<T>) => void;\n onTransitionEnd?: (ref: RefObject<T>) => void;\n};\n\n/**\n * Gjør det enklere å animere høyden på et element når innholdet endrer seg, men kan brukes på mer generelt grunnlag.\n * Hooken tar inn en triggerverdi, og når denne endrer seg animeres høyden på elementet dersom den har endret seg.\n * @param trigger verdien som brukes til å trigge animasjonen. Dersom denne endrer seg animeres høyden på elementet.\n * @param options konfigurasjon for animasjonen, og lyttere for når animasjonen starter og slutter\n * @returns en referanse til elementet som skal animeres\n */\nexport function useAutoAnimatedHeight<T extends HTMLElement = HTMLElement>(\n trigger: any,\n options?: UseAutoAnimatedHeightOptions<T>,\n) {\n const previousTriggerValue = usePreviousValue(trigger);\n const [previousHeight, setPreviousHeight] = useState(0);\n\n const easing = options?.easing || defaultEasing;\n const timing = options?.timing || defaultTiming;\n const transition = `${tokens.motion.timing[timing]} height ${tokens.motion.easing[easing]}`;\n\n const { prefersReducedMotion } = useBrowserPreferences();\n\n const raf1 = useRef<number>();\n const raf2 = useRef<number>();\n const elementRef = useRef<T>(null);\n\n const handleTransitionEnd = useCallback(\n (event: TransitionEvent) => {\n const element = elementRef.current;\n\n // Ignore bubbling transitions from within container\n if (element && event.target === element) {\n element.removeAttribute(\"style\");\n options?.onTransitionEnd?.(elementRef);\n }\n },\n [options],\n );\n\n const animateElement = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n element.removeAttribute(\"style\");\n const newHeight = element.scrollHeight;\n\n raf1.current = requestAnimationFrame(() => {\n // Sett høyde tilbake til forrige høyde\n element.style.removeProperty(\"transition\");\n element.style.setProperty(\"height\", `${previousHeight}px`);\n element.style.setProperty(\"overflow-y\", \"hidden\");\n\n raf2.current = requestAnimationFrame(() => {\n // Sett høyde til kollapset høyde og start transition\n element.style.setProperty(\"transition\", transition);\n element.style.setProperty(\"height\", `${newHeight}px`);\n });\n });\n\n setPreviousHeight(newHeight);\n }, [transition, previousHeight]);\n\n const runAnimation = useCallback(() => {\n const element = elementRef.current;\n\n if (!element) return;\n\n if (previousTriggerValue === undefined) {\n // Første render\n setPreviousHeight(element.scrollHeight);\n return;\n }\n\n if (trigger === previousTriggerValue) {\n // Ingen endring\n return;\n }\n\n options?.onTransitionStart?.(elementRef);\n\n if (prefersReducedMotion) {\n options?.onTransitionEnd?.(elementRef); // make sure to call callback when animation is off\n return;\n }\n\n animateElement();\n }, [\n animateElement,\n trigger,\n previousTriggerValue,\n options,\n prefersReducedMotion,\n ]);\n\n useEffect(() => {\n runAnimation();\n }, [trigger, runAnimation]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (element) {\n element.addEventListener(\"transitionend\", handleTransitionEnd);\n }\n\n return () => {\n if (element) {\n element.removeEventListener(\n \"transitionend\",\n handleTransitionEnd,\n );\n }\n };\n }, [handleTransitionEnd]);\n\n useEffect(() => {\n const r1 = raf1.current;\n const r2 = raf2.current;\n return () => {\n r1 && cancelAnimationFrame(r1);\n r2 && cancelAnimationFrame(r2);\n };\n }, [raf1, raf2]);\n\n return elementRef;\n}\n"],"names":["useAutoAnimatedHeight","trigger","options","previousTriggerValue","usePreviousValue","previousHeight","setPreviousHeight","useState","easing","timing","transition","tokens","motion","prefersReducedMotion","useBrowserPreferences","raf1","useRef","raf2","elementRef","handleTransitionEnd","useCallback","event","element","current","target","removeAttribute","_a","onTransitionEnd","call","animateElement","newHeight","scrollHeight","requestAnimationFrame","style","removeProperty","setProperty","runAnimation","onTransitionStart","_b","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"sRA2BgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAuBC,EAAiBH,IACvCI,EAAgBC,GAAqBC,EAAS,GAE/CC,GAAS,MAAAN,OAAAA,EAAAA,EAASM,SA5BN,WA6BZC,GAAS,MAAAP,SAAAA,EAASO,SA5BN,aA6BZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,GACvBC,UACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxB,OAAAC,EAAA,MAAAxB,SAAAA,EAASyB,kBAATD,EAAAE,KAAA1B,EAA2BgB,GAAAA,GAGnC,CAAChB,IAGC2B,EAAiBT,GAAY,KAC/B,MAAME,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMK,EAAYR,EAAQS,aAErBhB,EAAAQ,QAAUS,uBAAsB,KAEzBV,EAAAW,MAAMC,eAAe,cAC7BZ,EAAQW,MAAME,YAAY,SAAU,GAAG9B,OAC/BiB,EAAAW,MAAME,YAAY,aAAc,UAEnClB,EAAAM,QAAUS,uBAAsB,KAEzBV,EAAAW,MAAME,YAAY,aAAczB,GACxCY,EAAQW,MAAME,YAAY,SAAU,GAAGL,MAAa,GACvD,IAGLxB,EAAkBwB,EAAS,GAC5B,CAACpB,EAAYL,IAEV+B,EAAehB,GAAY,aAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,EAEL,CAAA,QAA6B,IAAzBnB,EAGA,YADAG,EAAkBgB,EAAQS,cAI9B,GAAI9B,IAAYE,EAOhB,CAFAuB,GAAA,OAAAA,EAAA,MAAAxB,OAAA,EAAAA,EAASmC,oBAATX,EAAAE,KAAA1B,EAA6BgB,GAEzBL,EAEA,YADA,OAAAyB,EAAA,MAAApC,OAAAA,EAAAA,EAASyB,kBAATW,EAAAV,KAAA1B,EAA2BgB,IAIhBW,GAAA,CAAA,IAChB,CACCA,EACA5B,EACAE,EACAD,EACAW,IAGJ,OAAA0B,GAAU,KACOH,GAAA,GACd,CAACnC,EAASmC,IAEbG,GAAU,KACN,MAAMjB,EAAUJ,EAAWK,QAC3B,OAAID,GACQA,EAAAkB,iBAAiB,gBAAiBrB,GAGvC,KACCG,GACQA,EAAAmB,oBACJ,gBACAtB,EACJ,CAER,GACD,CAACA,IAEJoB,GAAU,KACN,MAAMG,EAAK3B,EAAKQ,QACVoB,EAAK1B,EAAKM,QAChB,MAAO,KACHmB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,EAAE,CACjC,GACD,CAAC5B,EAAME,IAEHC,CACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAriaLiveRegion.js","sources":["../../../../src/hooks/useAriaLiveRegion/useAriaLiveRegion.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\n\nexport interface UseAriaLiveRegionOptions {\n /**\n * @default \"polite\"\n */\n politeness?: \"polite\" | \"assertive\" | \"off\";\n}\n\n/**\n * Hjelper for å bare sette aria-live dersom det har skjedd en endring. Unngår at innholdet annonseres ved sidelasting.\n * @param watch Verdi som indikerer at det har skjedd en endring. For eksempel en boolean som styrer en loader, eller selve teksten som skal bli lest opp.\n * @param options Bestem om aria-live skal være polite, assertive eller off.\n * @returns\n */\nexport function useAriaLiveRegion(\n watch: unknown | unknown[],\n options?: UseAriaLiveRegionOptions,\n) {\n const previousValue = usePreviousValue(watch);\n\n const [hasChanged, setHasChanged] = useState(false);\n useEffect(() => {\n if (Array.isArray(watch) && Array.isArray(previousValue)) {\n for (let i = 0; i < watch.length; i++) {\n if (watch[i] !== previousValue[i] && !hasChanged) {\n setHasChanged(true);\n break;\n }\n }\n } else if (previousValue && watch !== previousValue && !hasChanged) {\n setHasChanged(true);\n }\n }, [watch, previousValue, hasChanged]);\n\n return {\n \"aria-live\": hasChanged ? options?.politeness || \"polite\" : undefined,\n };\n}\n"],"names":["useAriaLiveRegion","watch","options","previousValue","usePreviousValue","hasChanged","setHasChanged","useState","useEffect","Array","isArray","i","length","politeness"],"mappings":"2HAgBgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAgBC,EAAiBH,IAEhCI,EAAYC,GAAiBC,GAAS,GAC7C,OAAAC,GAAU,KACN,GAAIC,MAAMC,QAAQT,IAAUQ,MAAMC,QAAQP,IACtC,IAAA,IAASQ,EAAI,EAAGA,EAAIV,EAAMW,OAAQD,IAC9B,GAAIV,EAAMU,KAAOR,EAAcQ,KAAON,EAAY,CAC9CC,GAAc,GACd,KACJ,OAEGH,GAAiBF,IAAUE,IAAkBE,GACpDC,GAAc,EAAI,GAEvB,CAACL,EAAOE,EAAeE,IAEnB,CACH,YAAaA,GAAa,MAAAH,OAAAA,EAAAA,EAASW,aAAc,cAAW,EAEpE"}
1
+ {"version":3,"file":"useAriaLiveRegion.js","sources":["../../../../src/hooks/useAriaLiveRegion/useAriaLiveRegion.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\n\nexport interface UseAriaLiveRegionOptions {\n /**\n * @default \"polite\"\n */\n politeness?: \"polite\" | \"assertive\" | \"off\";\n}\n\n/**\n * Hjelper for å bare sette aria-live dersom det har skjedd en endring. Unngår at innholdet annonseres ved sidelasting.\n * @param watch Verdi som indikerer at det har skjedd en endring. For eksempel en boolean som styrer en loader, eller selve teksten som skal bli lest opp.\n * @param options Bestem om aria-live skal være polite, assertive eller off.\n * @returns\n */\nexport function useAriaLiveRegion(\n watch: unknown | unknown[],\n options?: UseAriaLiveRegionOptions,\n) {\n const previousValue = usePreviousValue(watch);\n\n const [hasChanged, setHasChanged] = useState(false);\n useEffect(() => {\n if (Array.isArray(watch) && Array.isArray(previousValue)) {\n for (let i = 0; i < watch.length; i++) {\n if (watch[i] !== previousValue[i] && !hasChanged) {\n setHasChanged(true);\n break;\n }\n }\n } else if (previousValue && watch !== previousValue && !hasChanged) {\n setHasChanged(true);\n }\n }, [watch, previousValue, hasChanged]);\n\n return {\n \"aria-live\": hasChanged ? options?.politeness || \"polite\" : undefined,\n };\n}\n"],"names":["useAriaLiveRegion","watch","options","previousValue","usePreviousValue","hasChanged","setHasChanged","useState","useEffect","Array","isArray","i","length","politeness"],"mappings":"2HAgBgB,SAAAA,EACZC,EACAC,GAEMC,MAAAA,EAAgBC,EAAiBH,IAEhCI,EAAYC,GAAiBC,GAAS,GAC7C,OAAAC,GAAU,KACN,GAAIC,MAAMC,QAAQT,IAAUQ,MAAMC,QAAQP,IACtC,IAAA,IAASQ,EAAI,EAAGA,EAAIV,EAAMW,OAAQD,IAC9B,GAAIV,EAAMU,KAAOR,EAAcQ,KAAON,EAAY,CAC9CC,GAAc,GACd,KAAA,OAGDH,GAAiBF,IAAUE,IAAkBE,GACpDC,GAAc,EAAI,GAEvB,CAACL,EAAOE,EAAeE,IAEnB,CACH,YAAaA,GAAa,MAAAH,OAAAA,EAAAA,EAASW,aAAc,cAAW,EAEpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBrowserPreferences.js","sources":["../../../../src/hooks/useBrowserPreferences/useBrowserPreferences.tsx"],"sourcesContent":["import { Reducer, useEffect, useReducer, useState } from \"react\";\nimport { ColorScheme } from \"../../core/types.js\";\nimport {\n addMediaQueryListener,\n getInitialMediaQueryMatch,\n removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\n\ntype BrowserPreferences = {\n prefersReducedMotion: boolean;\n prefersColorScheme: ColorScheme;\n forcedColors: boolean;\n};\n\nenum ActionType {\n PrefersColorScheme = \"COLOR_SCHEME_CHANGED\",\n PrefersReducedMotion = \"REDUCED_MOTION_CHANGED\",\n ForcedColors = \"FORCED_COLORS_CHANGED\",\n}\n\ntype Action =\n | {\n type: ActionType.PrefersColorScheme;\n value: ColorScheme;\n }\n | {\n type: ActionType.PrefersReducedMotion;\n value: boolean;\n }\n | {\n type: ActionType.ForcedColors;\n value: boolean;\n };\n\nconst PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nconst PREFERS_LIGHT_COLOR_SCHEME = \"(prefers-color-scheme: light)\";\nconst FORCED_COLORS = \"(forced-colors: active)\";\n\nconst initialState: BrowserPreferences = {\n prefersReducedMotion: false,\n prefersColorScheme: \"light\",\n forcedColors: false,\n};\n\nconst reducer: Reducer<BrowserPreferences, Action> = (state, action) => {\n switch (action.type) {\n case ActionType.PrefersColorScheme:\n return {\n ...state,\n prefersColorScheme: action.value,\n };\n case ActionType.PrefersReducedMotion:\n return {\n ...state,\n prefersReducedMotion: action.value,\n };\n case ActionType.ForcedColors:\n return {\n ...state,\n forcedColors: action.value,\n };\n default:\n return state;\n }\n};\n\n/**\n * Hook som gir informasjon om brukerens foretrukne konfigurasjon.\n * @returns Objekt med informasjon om brukerens foretrukne tema (lyst vs mørkt), redusert bevegelse, og høykontrast (forced colors).\n */\nexport const useBrowserPreferences = (): BrowserPreferences => {\n const [hasMounted, setHasMounted] = useState(false);\n\n const [state, dispatch] = useReducer(reducer, initialState);\n\n useEffect(() => {\n setHasMounted(true);\n const prefersReducedMotion = getInitialMediaQueryMatch(\n PREFERS_REDUCED_MOTION,\n );\n const prefersColorScheme = getInitialMediaQueryMatch(\n PREFERS_LIGHT_COLOR_SCHEME,\n )\n ? \"light\"\n : \"dark\";\n const forcedColors = getInitialMediaQueryMatch(FORCED_COLORS);\n dispatch({\n type: ActionType.PrefersReducedMotion,\n value: prefersReducedMotion,\n });\n dispatch({\n type: ActionType.PrefersColorScheme,\n value: prefersColorScheme,\n });\n dispatch({ type: ActionType.ForcedColors, value: forcedColors });\n }, []);\n\n useEffect(() => {\n if (!hasMounted || !window.matchMedia) {\n return;\n }\n const onPrefersReducedMotionChange = (e: MediaQueryListEvent) => {\n dispatch({\n type: ActionType.PrefersReducedMotion,\n value: e.matches,\n });\n };\n const onPrefersColorSchemeChange = (e: MediaQueryListEvent) => {\n dispatch({\n type: ActionType.PrefersColorScheme,\n value: e.matches ? \"light\" : \"dark\",\n });\n };\n const onForcedColorsChange = (e: MediaQueryListEvent) => {\n dispatch({ type: ActionType.ForcedColors, value: e.matches });\n };\n\n addMediaQueryListener(\n window.matchMedia(PREFERS_REDUCED_MOTION),\n onPrefersReducedMotionChange,\n );\n addMediaQueryListener(\n window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n onPrefersColorSchemeChange,\n );\n addMediaQueryListener(\n window.matchMedia(FORCED_COLORS),\n onForcedColorsChange,\n );\n\n return () => {\n removeMediaQueryListener(\n window.matchMedia(PREFERS_REDUCED_MOTION),\n onPrefersReducedMotionChange,\n );\n removeMediaQueryListener(\n window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n onPrefersColorSchemeChange,\n );\n removeMediaQueryListener(\n window.matchMedia(FORCED_COLORS),\n onForcedColorsChange,\n );\n };\n }, [hasMounted]);\n\n return { ...state };\n};\n"],"names":["PREFERS_REDUCED_MOTION","PREFERS_LIGHT_COLOR_SCHEME","FORCED_COLORS","initialState","prefersReducedMotion","prefersColorScheme","forcedColors","reducer","state","action","type","value","useBrowserPreferences","hasMounted","setHasMounted","useState","dispatch","useReducer","useEffect","getInitialMediaQueryMatch","window","matchMedia","onPrefersReducedMotionChange","e","matches","onPrefersColorSchemeChange","onForcedColorsChange","addMediaQueryListener","removeMediaQueryListener"],"mappings":"2LAkCA,MAAMA,EAAyB,mCACzBC,EAA6B,gCAC7BC,EAAgB,0BAEhBC,EAAmC,CACrCC,sBAAsB,EACtBC,mBAAoB,QACpBC,cAAc,GAGZC,EAA+C,CAACC,EAAOC,KACzD,OAAQA,EAAOC,MACX,IAAK,uBACM,MAAA,IACAF,EACHH,mBAAoBI,EAAOE,OAEnC,IAAK,yBACM,MAAA,IACAH,EACHJ,qBAAsBK,EAAOE,OAErC,IAAK,wBACM,MAAA,IACAH,EACHF,aAAcG,EAAOE,OAE7B,QACWH,OAAAA,EACf,EAOSI,EAAwB,KACjC,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCP,EAAOQ,GAAYC,EAAWV,EAASJ,GAE9C,OAAAe,GAAU,KACNJ,GAAc,GACd,MAAMV,EAAuBe,EACzBnB,GAEEK,EAAqBc,EACvBlB,GAEE,QACA,OACAK,EAAea,EAA0BjB,GACtCc,EAAA,CACLN,KAAM,yBACNC,MAAOP,IAEFY,EAAA,CACLN,KAAM,uBACNC,MAAON,IAEXW,EAAS,CAAEN,KAAM,wBAAyBC,MAAOL,GAAc,GAChE,IAEHY,GAAU,KACF,IAACL,IAAeO,OAAOC,WACvB,OAEEC,MAAAA,EAAgCC,IACzBP,EAAA,CACLN,KAAM,yBACNC,MAAOY,EAAEC,SACZ,EAECC,EAA8BF,IACvBP,EAAA,CACLN,KAAM,uBACNC,MAAOY,EAAEC,QAAU,QAAU,QAChC,EAECE,EAAwBH,IAC1BP,EAAS,CAAEN,KAAM,wBAAyBC,MAAOY,EAAEC,SAAS,EAGhEG,OAAAA,EACIP,OAAOC,WAAWrB,GAClBsB,GAEJK,EACIP,OAAOC,WAAWpB,GAClBwB,GAEJE,EACIP,OAAOC,WAAWnB,GAClBwB,GAGG,KACHE,EACIR,OAAOC,WAAWrB,GAClBsB,GAEJM,EACIR,OAAOC,WAAWpB,GAClBwB,GAEJG,EACIR,OAAOC,WAAWnB,GAClBwB,EAAA,CACJ,GAEL,CAACb,IAEG,IAAKL"}
1
+ {"version":3,"file":"useBrowserPreferences.js","sources":["../../../../src/hooks/useBrowserPreferences/useBrowserPreferences.tsx"],"sourcesContent":["import { Reducer, useEffect, useReducer, useState } from \"react\";\nimport { ColorScheme } from \"../../core/types.js\";\nimport {\n addMediaQueryListener,\n getInitialMediaQueryMatch,\n removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\n\ntype BrowserPreferences = {\n prefersReducedMotion: boolean;\n prefersColorScheme: ColorScheme;\n forcedColors: boolean;\n};\n\nenum ActionType {\n PrefersColorScheme = \"COLOR_SCHEME_CHANGED\",\n PrefersReducedMotion = \"REDUCED_MOTION_CHANGED\",\n ForcedColors = \"FORCED_COLORS_CHANGED\",\n}\n\ntype Action =\n | {\n type: ActionType.PrefersColorScheme;\n value: ColorScheme;\n }\n | {\n type: ActionType.PrefersReducedMotion;\n value: boolean;\n }\n | {\n type: ActionType.ForcedColors;\n value: boolean;\n };\n\nconst PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nconst PREFERS_LIGHT_COLOR_SCHEME = \"(prefers-color-scheme: light)\";\nconst FORCED_COLORS = \"(forced-colors: active)\";\n\nconst initialState: BrowserPreferences = {\n prefersReducedMotion: false,\n prefersColorScheme: \"light\",\n forcedColors: false,\n};\n\nconst reducer: Reducer<BrowserPreferences, Action> = (state, action) => {\n switch (action.type) {\n case ActionType.PrefersColorScheme:\n return {\n ...state,\n prefersColorScheme: action.value,\n };\n case ActionType.PrefersReducedMotion:\n return {\n ...state,\n prefersReducedMotion: action.value,\n };\n case ActionType.ForcedColors:\n return {\n ...state,\n forcedColors: action.value,\n };\n default:\n return state;\n }\n};\n\n/**\n * Hook som gir informasjon om brukerens foretrukne konfigurasjon.\n * @returns Objekt med informasjon om brukerens foretrukne tema (lyst vs mørkt), redusert bevegelse, og høykontrast (forced colors).\n */\nexport const useBrowserPreferences = (): BrowserPreferences => {\n const [hasMounted, setHasMounted] = useState(false);\n\n const [state, dispatch] = useReducer(reducer, initialState);\n\n useEffect(() => {\n setHasMounted(true);\n const prefersReducedMotion = getInitialMediaQueryMatch(\n PREFERS_REDUCED_MOTION,\n );\n const prefersColorScheme = getInitialMediaQueryMatch(\n PREFERS_LIGHT_COLOR_SCHEME,\n )\n ? \"light\"\n : \"dark\";\n const forcedColors = getInitialMediaQueryMatch(FORCED_COLORS);\n dispatch({\n type: ActionType.PrefersReducedMotion,\n value: prefersReducedMotion,\n });\n dispatch({\n type: ActionType.PrefersColorScheme,\n value: prefersColorScheme,\n });\n dispatch({ type: ActionType.ForcedColors, value: forcedColors });\n }, []);\n\n useEffect(() => {\n if (!hasMounted || !window.matchMedia) {\n return;\n }\n const onPrefersReducedMotionChange = (e: MediaQueryListEvent) => {\n dispatch({\n type: ActionType.PrefersReducedMotion,\n value: e.matches,\n });\n };\n const onPrefersColorSchemeChange = (e: MediaQueryListEvent) => {\n dispatch({\n type: ActionType.PrefersColorScheme,\n value: e.matches ? \"light\" : \"dark\",\n });\n };\n const onForcedColorsChange = (e: MediaQueryListEvent) => {\n dispatch({ type: ActionType.ForcedColors, value: e.matches });\n };\n\n addMediaQueryListener(\n window.matchMedia(PREFERS_REDUCED_MOTION),\n onPrefersReducedMotionChange,\n );\n addMediaQueryListener(\n window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n onPrefersColorSchemeChange,\n );\n addMediaQueryListener(\n window.matchMedia(FORCED_COLORS),\n onForcedColorsChange,\n );\n\n return () => {\n removeMediaQueryListener(\n window.matchMedia(PREFERS_REDUCED_MOTION),\n onPrefersReducedMotionChange,\n );\n removeMediaQueryListener(\n window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n onPrefersColorSchemeChange,\n );\n removeMediaQueryListener(\n window.matchMedia(FORCED_COLORS),\n onForcedColorsChange,\n );\n };\n }, [hasMounted]);\n\n return { ...state };\n};\n"],"names":["PREFERS_REDUCED_MOTION","PREFERS_LIGHT_COLOR_SCHEME","FORCED_COLORS","initialState","prefersReducedMotion","prefersColorScheme","forcedColors","reducer","state","action","type","value","useBrowserPreferences","hasMounted","setHasMounted","useState","dispatch","useReducer","useEffect","getInitialMediaQueryMatch","window","matchMedia","onPrefersReducedMotionChange","e","matches","onPrefersColorSchemeChange","onForcedColorsChange","addMediaQueryListener","removeMediaQueryListener"],"mappings":"2LAkCA,MAAMA,EAAyB,mCACzBC,EAA6B,gCAC7BC,EAAgB,0BAEhBC,EAAmC,CACrCC,sBAAsB,EACtBC,mBAAoB,QACpBC,cAAc,GAGZC,EAA+C,CAACC,EAAOC,KACzD,OAAQA,EAAOC,MACX,IAAK,uBACM,MAAA,IACAF,EACHH,mBAAoBI,EAAOE,OAEnC,IAAK,yBACM,MAAA,IACAH,EACHJ,qBAAsBK,EAAOE,OAErC,IAAK,wBACM,MAAA,IACAH,EACHF,aAAcG,EAAOE,OAE7B,QACWH,OAAAA,EAAA,EAQNI,EAAwB,KACjC,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCP,EAAOQ,GAAYC,EAAWV,EAASJ,GAE9C,OAAAe,GAAU,KACNJ,GAAc,GACd,MAAMV,EAAuBe,EACzBnB,GAEEK,EAAqBc,EACvBlB,GAEE,QACA,OACAK,EAAea,EAA0BjB,GACtCc,EAAA,CACLN,KAAM,yBACNC,MAAOP,IAEFY,EAAA,CACLN,KAAM,uBACNC,MAAON,IAEXW,EAAS,CAAEN,KAAM,wBAAyBC,MAAOL,GAAc,GAChE,IAEHY,GAAU,KACF,IAACL,IAAeO,OAAOC,WACvB,OAEEC,MAAAA,EAAgCC,IACzBP,EAAA,CACLN,KAAM,yBACNC,MAAOY,EAAEC,SACZ,EAECC,EAA8BF,IACvBP,EAAA,CACLN,KAAM,uBACNC,MAAOY,EAAEC,QAAU,QAAU,QAChC,EAECE,EAAwBH,IAC1BP,EAAS,CAAEN,KAAM,wBAAyBC,MAAOY,EAAEC,SAAS,EAGhEG,OAAAA,EACIP,OAAOC,WAAWrB,GAClBsB,GAEJK,EACIP,OAAOC,WAAWpB,GAClBwB,GAEJE,EACIP,OAAOC,WAAWnB,GAClBwB,GAGG,KACHE,EACIR,OAAOC,WAAWrB,GAClBsB,GAEJM,EACIR,OAAOC,WAAWpB,GAClBwB,GAEJG,EACIR,OAAOC,WAAWnB,GAClBwB,EACJ,CACJ,GACD,CAACb,IAEG,IAAKL,EAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"useClickOutside.js","sources":["../../../../src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Hook for å sette opp en lytter ved klikk utenfor et element.\n * @param ref Elementet du ønsker å sjekke om en klikk er utenfor.\n * @param fn Callback-funksjon som kalles når det klikkes utenfor elementet.\n */\nexport function useClickOutside(\n ref: RefObject<HTMLElement> | null,\n fn: () => void,\n): void {\n function handleClickOutside(event: MouseEvent) {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n fn();\n }\n }\n\n useEffect(() => {\n if (ref) {\n document && document.addEventListener(\"click\", handleClickOutside);\n }\n return () => {\n document &&\n document.removeEventListener(\"click\", handleClickOutside);\n };\n });\n}\n"],"names":["useClickOutside","ref","fn","handleClickOutside","event","current","contains","target","useEffect","document","addEventListener","removeEventListener"],"mappings":"kCAOgB,SAAAA,EACZC,EACAC,GAEA,SAASC,EAAmBC,GACpB,MAAAH,GAAAA,EAAKI,UAAYJ,EAAII,QAAQC,SAASF,EAAMG,SACzCL,GAEX,CAEAM,GAAU,KACFP,GACYQ,UAAAA,SAASC,iBAAiB,QAASP,GAE5C,KAECM,UAAAA,SAASE,oBAAoB,QAASR,EAAkB,IAGxE"}
1
+ {"version":3,"file":"useClickOutside.js","sources":["../../../../src/hooks/useClickOutside/useClickOutside.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Hook for å sette opp en lytter ved klikk utenfor et element.\n * @param ref Elementet du ønsker å sjekke om en klikk er utenfor.\n * @param fn Callback-funksjon som kalles når det klikkes utenfor elementet.\n */\nexport function useClickOutside(\n ref: RefObject<HTMLElement> | null,\n fn: () => void,\n): void {\n function handleClickOutside(event: MouseEvent) {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n fn();\n }\n }\n\n useEffect(() => {\n if (ref) {\n document && document.addEventListener(\"click\", handleClickOutside);\n }\n return () => {\n document &&\n document.removeEventListener(\"click\", handleClickOutside);\n };\n });\n}\n"],"names":["useClickOutside","ref","fn","handleClickOutside","event","current","contains","target","useEffect","document","addEventListener","removeEventListener"],"mappings":"kCAOgB,SAAAA,EACZC,EACAC,GAEA,SAASC,EAAmBC,GACpB,MAAAH,GAAAA,EAAKI,UAAYJ,EAAII,QAAQC,SAASF,EAAMG,SACzCL,GACP,CAGJM,GAAU,KACFP,GACYQ,UAAAA,SAASC,iBAAiB,QAASP,GAE5C,KAECM,UAAAA,SAASE,oBAAoB,QAASR,EAAkB,IAGxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useElementDimensions.js","sources":["../../../../src/hooks/useElementDimensions/useElementDimensions.ts"],"sourcesContent":["import { RefObject, useEffect, useMemo, useRef, useState } from \"react\";\n\n// TODO: Denne er sikkert nyttig flere steder enn her!\n// eslint-disable-next-line\nfunction throttle<R, A extends any[]>(fn: (...args: A) => R, delay: number) {\n let wait = false;\n\n return (...args: A) => {\n if (wait) return undefined;\n\n const result = fn(...args);\n\n if (delay !== 0) {\n wait = true;\n window.setTimeout(() => {\n wait = false;\n }, delay);\n }\n\n return result;\n };\n}\n\nexport type Dimensions = {\n height: number;\n width: number;\n};\n\n/**\n * Lar deg måle størrelsen på et element, og oppdatere målene når vinduet endrer størrelse.\n * @param throttleDelay Antall milisekunder som skal gå mellom hver gang dimensjonene oppdateres.\n * @returns Ref til elementet som skal måles, og dimensjonene til elementet.\n */\nexport function useElementDimensions<T extends HTMLElement>(\n throttleDelay = 200,\n): [RefObject<T>, Dimensions] {\n const elementRef = useRef<T>(null);\n const [dimensions, setDimensions] = useState<Dimensions>({\n height: 0,\n width: 0,\n });\n\n const throttledSetDimensions = useMemo(\n () =>\n throttle(\n () =>\n setDimensions({\n height: elementRef.current?.scrollHeight || 0,\n width: elementRef.current?.scrollWidth || 0,\n }),\n throttleDelay,\n ),\n [throttleDelay],\n );\n\n useEffect(() => {\n setDimensions({\n height: elementRef.current?.scrollHeight || 0,\n width: elementRef.current?.scrollWidth || 0,\n });\n\n typeof window !== \"undefined\" &&\n window.addEventListener(\"resize\", throttledSetDimensions);\n\n return () => {\n typeof window !== \"undefined\" &&\n window.removeEventListener(\"resize\", throttledSetDimensions);\n };\n }, [throttledSetDimensions]);\n\n return [elementRef, dimensions];\n}\n"],"names":["useElementDimensions","throttleDelay","elementRef","useRef","dimensions","setDimensions","useState","height","width","throttledSetDimensions","useMemo","fn","delay","wait","args","result","window","setTimeout","throttle","_a","current","scrollHeight","_b","scrollWidth","useEffect","addEventListener","removeEventListener"],"mappings":"yEAiCgB,SAAAA,EACZC,EAAgB,KAEVC,MAAAA,EAAaC,EAAU,OACtBC,EAAYC,GAAiBC,EAAqB,CACrDC,OAAQ,EACRC,MAAO,IAGLC,EAAyBC,GAC3B,IAvCR,SAAsCC,EAAuBC,GACzD,IAAIC,GAAO,EAEX,MAAO,IAAIC,KACP,GAAID,EAAa,OAEXE,MAAAA,EAASJ,KAAMG,GAErB,OAAc,IAAVF,IACOC,GAAA,EACPG,OAAOC,YAAW,KACPJ,GAAA,CAAA,GACRD,IAGAG,CAAAA,CAEf,CAuBYG,EACI,aACI,OAAAb,EAAc,CACVE,QAAQ,OAAAY,EAAAjB,EAAWkB,cAAX,EAAAD,EAAoBE,eAAgB,EAC5Cb,OAAO,OAAAc,EAAApB,EAAWkB,cAAX,EAAAE,EAAoBC,cAAe,GAC7C,GACLtB,IAER,CAACA,IAGL,OAAAuB,GAAU,aACQ,OAAAnB,EAAA,CACVE,QAAQ,OAAAY,EAAAjB,EAAWkB,cAAX,EAAAD,EAAoBE,eAAgB,EAC5Cb,OAAO,OAAAc,EAAApB,EAAWkB,cAAX,EAAAE,EAAoBC,cAAe,WAGvCP,OAAW,KACdA,OAAOS,iBAAiB,SAAUhB,GAE/B,YACIO,OAAW,KACdA,OAAOU,oBAAoB,SAAUjB,EAAsB,CAAA,GAEpE,CAACA,IAEG,CAACP,EAAYE,EACxB"}
1
+ {"version":3,"file":"useElementDimensions.js","sources":["../../../../src/hooks/useElementDimensions/useElementDimensions.ts"],"sourcesContent":["import { RefObject, useEffect, useMemo, useRef, useState } from \"react\";\n\n// TODO: Denne er sikkert nyttig flere steder enn her!\n// eslint-disable-next-line\nfunction throttle<R, A extends any[]>(fn: (...args: A) => R, delay: number) {\n let wait = false;\n\n return (...args: A) => {\n if (wait) return undefined;\n\n const result = fn(...args);\n\n if (delay !== 0) {\n wait = true;\n window.setTimeout(() => {\n wait = false;\n }, delay);\n }\n\n return result;\n };\n}\n\nexport type Dimensions = {\n height: number;\n width: number;\n};\n\n/**\n * Lar deg måle størrelsen på et element, og oppdatere målene når vinduet endrer størrelse.\n * @param throttleDelay Antall milisekunder som skal gå mellom hver gang dimensjonene oppdateres.\n * @returns Ref til elementet som skal måles, og dimensjonene til elementet.\n */\nexport function useElementDimensions<T extends HTMLElement>(\n throttleDelay = 200,\n): [RefObject<T>, Dimensions] {\n const elementRef = useRef<T>(null);\n const [dimensions, setDimensions] = useState<Dimensions>({\n height: 0,\n width: 0,\n });\n\n const throttledSetDimensions = useMemo(\n () =>\n throttle(\n () =>\n setDimensions({\n height: elementRef.current?.scrollHeight || 0,\n width: elementRef.current?.scrollWidth || 0,\n }),\n throttleDelay,\n ),\n [throttleDelay],\n );\n\n useEffect(() => {\n setDimensions({\n height: elementRef.current?.scrollHeight || 0,\n width: elementRef.current?.scrollWidth || 0,\n });\n\n typeof window !== \"undefined\" &&\n window.addEventListener(\"resize\", throttledSetDimensions);\n\n return () => {\n typeof window !== \"undefined\" &&\n window.removeEventListener(\"resize\", throttledSetDimensions);\n };\n }, [throttledSetDimensions]);\n\n return [elementRef, dimensions];\n}\n"],"names":["useElementDimensions","throttleDelay","elementRef","useRef","dimensions","setDimensions","useState","height","width","throttledSetDimensions","useMemo","fn","delay","wait","args","result","window","setTimeout","throttle","_a","current","scrollHeight","_b","scrollWidth","useEffect","addEventListener","removeEventListener"],"mappings":"yEAiCgB,SAAAA,EACZC,EAAgB,KAEVC,MAAAA,EAAaC,EAAU,OACtBC,EAAYC,GAAiBC,EAAqB,CACrDC,OAAQ,EACRC,MAAO,IAGLC,EAAyBC,GAC3B,IAvCR,SAAsCC,EAAuBC,GACzD,IAAIC,GAAO,EAEX,MAAO,IAAIC,KACP,GAAID,EAAa,OAEXE,MAAAA,EAASJ,KAAMG,GAErB,OAAc,IAAVF,IACOC,GAAA,EACPG,OAAOC,YAAW,KACPJ,GAAA,CAAA,GACRD,IAGAG,CAAAA,CAEf,CAuBYG,EACI,aACI,OAAAb,EAAc,CACVE,QAAQ,OAAAY,EAAAjB,EAAWkB,cAAX,EAAAD,EAAoBE,eAAgB,EAC5Cb,OAAO,OAAAc,EAAApB,EAAWkB,cAAX,EAAAE,EAAoBC,cAAe,GAC7C,GACLtB,IAER,CAACA,IAGL,OAAAuB,GAAU,aACQ,OAAAnB,EAAA,CACVE,QAAQ,OAAAY,EAAAjB,EAAWkB,cAAX,EAAAD,EAAoBE,eAAgB,EAC5Cb,OAAO,OAAAc,EAAApB,EAAWkB,cAAX,EAAAE,EAAoBC,cAAe,WAGvCP,OAAW,KACdA,OAAOS,iBAAiB,SAAUhB,GAE/B,YACIO,OAAW,KACdA,OAAOU,oBAAoB,SAAUjB,EAAsB,CACnE,GACD,CAACA,IAEG,CAACP,EAAYE,EACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFocusOutside.js","sources":["../../../../src/hooks/useFocusOutside/useFocusOutside.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Hook for å lytte etter fokus utenfor et element. Nyttig dersom flere fokuserbare elementer samspiller i en komponent.\n * @param ref Elementet som skal observeres\n * @param fn Funksjon som kalles når fokus flyttes utenfor elementet\n */\nexport function useFocusOutside(\n ref: RefObject<HTMLElement> | null,\n fn: () => void,\n): void {\n function handleFocusOutside(event: FocusEvent) {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n fn();\n }\n }\n\n useEffect(() => {\n if (ref) {\n document &&\n document.addEventListener(\"focusin\", handleFocusOutside);\n }\n return () => {\n document &&\n document.removeEventListener(\"focusin\", handleFocusOutside);\n };\n });\n}\n"],"names":["useFocusOutside","ref","fn","handleFocusOutside","event","current","contains","target","useEffect","document","addEventListener","removeEventListener"],"mappings":"kCAOgB,SAAAA,EACZC,EACAC,GAEA,SAASC,EAAmBC,GACpB,MAAAH,GAAAA,EAAKI,UAAYJ,EAAII,QAAQC,SAASF,EAAMG,SACzCL,GAEX,CAEAM,GAAU,KACFP,GAEIQ,UAAAA,SAASC,iBAAiB,UAAWP,GAEtC,KAECM,UAAAA,SAASE,oBAAoB,UAAWR,EAAkB,IAG1E"}
1
+ {"version":3,"file":"useFocusOutside.js","sources":["../../../../src/hooks/useFocusOutside/useFocusOutside.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Hook for å lytte etter fokus utenfor et element. Nyttig dersom flere fokuserbare elementer samspiller i en komponent.\n * @param ref Elementet som skal observeres\n * @param fn Funksjon som kalles når fokus flyttes utenfor elementet\n */\nexport function useFocusOutside(\n ref: RefObject<HTMLElement> | null,\n fn: () => void,\n): void {\n function handleFocusOutside(event: FocusEvent) {\n if (ref?.current && !ref.current.contains(event.target as Node)) {\n fn();\n }\n }\n\n useEffect(() => {\n if (ref) {\n document &&\n document.addEventListener(\"focusin\", handleFocusOutside);\n }\n return () => {\n document &&\n document.removeEventListener(\"focusin\", handleFocusOutside);\n };\n });\n}\n"],"names":["useFocusOutside","ref","fn","handleFocusOutside","event","current","contains","target","useEffect","document","addEventListener","removeEventListener"],"mappings":"kCAOgB,SAAAA,EACZC,EACAC,GAEA,SAASC,EAAmBC,GACpB,MAAAH,GAAAA,EAAKI,UAAYJ,EAAII,QAAQC,SAASF,EAAMG,SACzCL,GACP,CAGJM,GAAU,KACFP,GAEIQ,UAAAA,SAASC,iBAAiB,UAAWP,GAEtC,KAECM,UAAAA,SAASE,oBAAoB,UAAWR,EAAkB,IAG1E"}
@@ -1 +1 @@
1
- {"version":3,"file":"useIntersectionObserver.js","sources":["../../../../src/hooks/useIntersectionObserver/useIntersectionObserver.ts"],"sourcesContent":["import { useEffect, useRef, RefObject, MutableRefObject } from \"react\";\n\ntype ValidElement = HTMLElement | SVGElement;\ntype Target =\n | MutableRefObject<ValidElement>\n | RefObject<ValidElement>\n | MutableRefObject<NodeListOf<ValidElement>>\n | RefObject<NodeListOf<ValidElement>>\n | NodeListOf<ValidElement>;\n\nfunction isNodeList(\n target: Target | ValidElement,\n): target is NodeListOf<ValidElement> {\n return (target as NodeListOf<ValidElement>).forEach !== undefined;\n}\n\nconst hasWindowWithIntersectionObserver = () =>\n typeof window !== \"undefined\" &&\n typeof IntersectionObserver !== \"undefined\";\n\n/**\n * Hook som gjør det enkelt å observere om et element er synlig i viewporten.\n *\n * @param target Elementet eller elementene som skal observeres. Du kan sende in en React ref til et HTMLElement eller SVG Element, eller en NodeList av samme type elementer (returneres f.eks. av document.querySelectorAll), eller en React ref med en NodeList av samme type elementer.\n * @param onIntersect Callback-funksjon som utføres når et av elementene som observeres overlapper angitt mål. Se https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#parameters for mer info.\n * @param fallback Funksjon som kalles dersom nettleseren ikke støtter IntersectionOpserver-APIet.\n * @param options Objekt med innstillinger for oberveren. Se https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#parameters for mer info.\n */\nexport const useIntersectionObserver = (\n target: Target,\n onIntersect: IntersectionObserverCallback,\n fallback?: VoidFunction | null,\n options?: Partial<IntersectionObserverInit>,\n): void => {\n const observerRef = useRef<IntersectionObserver>(null);\n\n useEffect(() => {\n let observer = observerRef.current;\n\n if (hasWindowWithIntersectionObserver()) {\n if (observer) {\n observer.disconnect();\n }\n\n observer = new IntersectionObserver(onIntersect, options);\n\n if (isNodeList(target)) {\n target.forEach((element) => observer?.observe(element));\n } else if (target.current && isNodeList(target.current)) {\n target.current.forEach((element) => observer?.observe(element));\n } else if (target.current) {\n observer.observe(target.current);\n }\n } else if (fallback) {\n fallback();\n }\n\n return () => {\n if (hasWindowWithIntersectionObserver() && observer) {\n observer.disconnect();\n }\n };\n }, [target, onIntersect, fallback, options]);\n};\n"],"names":["isNodeList","target","forEach","hasWindowWithIntersectionObserver","window","IntersectionObserver","useIntersectionObserver","onIntersect","fallback","options","observerRef","useRef","useEffect","observer","current","disconnect","element","observe"],"mappings":"8CAUA,SAASA,EACLC,GAEA,YAAwD,IAAhDA,EAAoCC,OAChD,CAEA,MAAMC,EAAoC,WAC/BC,OAAW,YACXC,qBAAyB,IAUvBC,EAA0B,CACnCL,EACAM,EACAC,EACAC,KAEMC,MAAAA,EAAcC,EAA6B,MAEjDC,GAAU,KACN,IAAIC,EAAWH,EAAYI,QAEvBX,OAAAA,KACIU,GACAA,EAASE,aAGFF,EAAA,IAAIR,qBAAqBE,EAAaE,GAE7CT,EAAWC,GACXA,EAAOC,SAASc,GAAY,MAAAH,OAAAA,EAAAA,EAAUI,QAAQD,KACvCf,EAAOa,SAAWd,EAAWC,EAAOa,SAC3Cb,EAAOa,QAAQZ,SAASc,GAAY,MAAAH,OAAA,EAAAA,EAAUI,QAAQD,KAC/Cf,EAAOa,SACLD,EAAAI,QAAQhB,EAAOa,UAErBN,GACEA,IAGN,KACCL,KAAuCU,GACvCA,EAASE,YAAW,CACxB,GAEL,CAACd,EAAQM,EAAaC,EAAUC,GAAQ"}
1
+ {"version":3,"file":"useIntersectionObserver.js","sources":["../../../../src/hooks/useIntersectionObserver/useIntersectionObserver.ts"],"sourcesContent":["import { useEffect, useRef, RefObject, MutableRefObject } from \"react\";\n\ntype ValidElement = HTMLElement | SVGElement;\ntype Target =\n | MutableRefObject<ValidElement>\n | RefObject<ValidElement>\n | MutableRefObject<NodeListOf<ValidElement>>\n | RefObject<NodeListOf<ValidElement>>\n | NodeListOf<ValidElement>;\n\nfunction isNodeList(\n target: Target | ValidElement,\n): target is NodeListOf<ValidElement> {\n return (target as NodeListOf<ValidElement>).forEach !== undefined;\n}\n\nconst hasWindowWithIntersectionObserver = () =>\n typeof window !== \"undefined\" &&\n typeof IntersectionObserver !== \"undefined\";\n\n/**\n * Hook som gjør det enkelt å observere om et element er synlig i viewporten.\n *\n * @param target Elementet eller elementene som skal observeres. Du kan sende in en React ref til et HTMLElement eller SVG Element, eller en NodeList av samme type elementer (returneres f.eks. av document.querySelectorAll), eller en React ref med en NodeList av samme type elementer.\n * @param onIntersect Callback-funksjon som utføres når et av elementene som observeres overlapper angitt mål. Se https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#parameters for mer info.\n * @param fallback Funksjon som kalles dersom nettleseren ikke støtter IntersectionOpserver-APIet.\n * @param options Objekt med innstillinger for oberveren. Se https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#parameters for mer info.\n */\nexport const useIntersectionObserver = (\n target: Target,\n onIntersect: IntersectionObserverCallback,\n fallback?: VoidFunction | null,\n options?: Partial<IntersectionObserverInit>,\n): void => {\n const observerRef = useRef<IntersectionObserver>(null);\n\n useEffect(() => {\n let observer = observerRef.current;\n\n if (hasWindowWithIntersectionObserver()) {\n if (observer) {\n observer.disconnect();\n }\n\n observer = new IntersectionObserver(onIntersect, options);\n\n if (isNodeList(target)) {\n target.forEach((element) => observer?.observe(element));\n } else if (target.current && isNodeList(target.current)) {\n target.current.forEach((element) => observer?.observe(element));\n } else if (target.current) {\n observer.observe(target.current);\n }\n } else if (fallback) {\n fallback();\n }\n\n return () => {\n if (hasWindowWithIntersectionObserver() && observer) {\n observer.disconnect();\n }\n };\n }, [target, onIntersect, fallback, options]);\n};\n"],"names":["isNodeList","target","forEach","hasWindowWithIntersectionObserver","window","IntersectionObserver","useIntersectionObserver","onIntersect","fallback","options","observerRef","useRef","useEffect","observer","current","disconnect","element","observe"],"mappings":"8CAUA,SAASA,EACLC,GAEA,YAAwD,IAAhDA,EAAoCC,OAChD,CAEA,MAAMC,EAAoC,WAC/BC,OAAW,YACXC,qBAAyB,IAUvBC,EAA0B,CACnCL,EACAM,EACAC,EACAC,KAEMC,MAAAA,EAAcC,EAA6B,MAEjDC,GAAU,KACN,IAAIC,EAAWH,EAAYI,QAEvBX,OAAAA,KACIU,GACAA,EAASE,aAGFF,EAAA,IAAIR,qBAAqBE,EAAaE,GAE7CT,EAAWC,GACXA,EAAOC,SAASc,GAAY,MAAAH,OAAAA,EAAAA,EAAUI,QAAQD,KACvCf,EAAOa,SAAWd,EAAWC,EAAOa,SAC3Cb,EAAOa,QAAQZ,SAASc,GAAY,MAAAH,OAAA,EAAAA,EAAUI,QAAQD,KAC/Cf,EAAOa,SACLD,EAAAI,QAAQhB,EAAOa,UAErBN,GACEA,IAGN,KACCL,KAAuCU,GACvCA,EAASE,YAAW,CAE5B,GACD,CAACd,EAAQM,EAAaC,EAAUC,GAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyListener.js","sources":["../../../../src/hooks/useKeyListener/useKeyListener.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Lar deg sette opp en tastaturlytter på et element.\n * @param ref Element som skal observeres\n * @param keys Taster som skal lyttes på\n * @param fn Funksjon som kalles når en tastetrykk observeres\n */\nexport function useKeyListener(\n ref: RefObject<HTMLElement> | null,\n keys: string[] | string | null,\n fn: (event: KeyboardEvent) => void,\n): void {\n if (typeof keys === \"string\") {\n keys = [keys];\n }\n function handleKeyDown(event: KeyboardEvent) {\n if (keys && !keys.includes(event.key)) {\n return;\n }\n fn(event);\n }\n\n useEffect(() => {\n const element = ref && ref.current;\n if (element) {\n element.addEventListener(\"keydown\", handleKeyDown);\n }\n return () => {\n if (element) {\n element.removeEventListener(\"keydown\", handleKeyDown);\n }\n };\n });\n}\n"],"names":["useKeyListener","ref","keys","fn","handleKeyDown","event","includes","key","useEffect","element","current","addEventListener","removeEventListener"],"mappings":"kCAQgB,SAAAA,EACZC,EACAC,EACAC,GAKA,SAASC,EAAcC,GACfH,IAASA,EAAKI,SAASD,EAAME,MAGjCJ,EAAGE,EACP,CARoB,iBAATH,IACPA,EAAO,CAACA,IASZM,GAAU,KACAC,MAAAA,EAAUR,GAAOA,EAAIS,QAC3B,OAAID,GACQA,EAAAE,iBAAiB,UAAWP,GAEjC,KACCK,GACQA,EAAAG,oBAAoB,UAAWR,EAAa,CACxD,GAGZ"}
1
+ {"version":3,"file":"useKeyListener.js","sources":["../../../../src/hooks/useKeyListener/useKeyListener.ts"],"sourcesContent":["import { RefObject, useEffect } from \"react\";\n\n/**\n * Lar deg sette opp en tastaturlytter på et element.\n * @param ref Element som skal observeres\n * @param keys Taster som skal lyttes på\n * @param fn Funksjon som kalles når en tastetrykk observeres\n */\nexport function useKeyListener(\n ref: RefObject<HTMLElement> | null,\n keys: string[] | string | null,\n fn: (event: KeyboardEvent) => void,\n): void {\n if (typeof keys === \"string\") {\n keys = [keys];\n }\n function handleKeyDown(event: KeyboardEvent) {\n if (keys && !keys.includes(event.key)) {\n return;\n }\n fn(event);\n }\n\n useEffect(() => {\n const element = ref && ref.current;\n if (element) {\n element.addEventListener(\"keydown\", handleKeyDown);\n }\n return () => {\n if (element) {\n element.removeEventListener(\"keydown\", handleKeyDown);\n }\n };\n });\n}\n"],"names":["useKeyListener","ref","keys","fn","handleKeyDown","event","includes","key","useEffect","element","current","addEventListener","removeEventListener"],"mappings":"kCAQgB,SAAAA,EACZC,EACAC,EACAC,GAKA,SAASC,EAAcC,GACfH,IAASA,EAAKI,SAASD,EAAME,MAGjCJ,EAAGE,EAAK,CAPQ,iBAATH,IACPA,EAAO,CAACA,IASZM,GAAU,KACAC,MAAAA,EAAUR,GAAOA,EAAIS,QAC3B,OAAID,GACQA,EAAAE,iBAAiB,UAAWP,GAEjC,KACCK,GACQA,EAAAG,oBAAoB,UAAWR,EAAa,CAE5D,GAER"}
@@ -1 +1 @@
1
- {"version":3,"file":"useListNavigation.js","sources":["../../../../src/hooks/useListNavigation/useListNavigation.ts"],"sourcesContent":["import { useEffect, RefObject } from \"react\";\n\ntype Timer = number | undefined;\ntype KeyBuffer = { keys: string } | undefined;\ntype Direction = \"prev\" | \"next\" | \"first\" | \"last\";\ninterface MoveDetails {\n event: KeyboardEvent;\n list: HTMLElement;\n currentFocus: HTMLButtonElement;\n}\ninterface ListDetails {\n list: HTMLElement;\n search: KeyBuffer;\n searchResetTimer: Timer;\n}\ninterface SearchDetails extends ListDetails {\n key: string;\n}\ninterface EventDetails extends ListDetails {\n event: KeyboardEvent;\n}\ntype UseListNavigationProps<T> = {\n /** Ref til et element med rollen `listbox` */\n ref: RefObject<T>;\n};\n\nexport function useListNavigation<T extends HTMLElement>({\n ref,\n}: UseListNavigationProps<T>): void {\n useEffect(() => {\n let searchResetTimer: Timer;\n const search: KeyBuffer = { keys: \"\" }; // keypress buffer is an object to preserve state\n const list = ref.current;\n const handler = (event: KeyboardEvent) => {\n if (list) {\n handleListKeyNav({ list, event, search, searchResetTimer });\n }\n };\n\n if (list) {\n list.addEventListener(\"keydown\", handler);\n }\n\n return () => {\n if (list) {\n list.removeEventListener(\"keydown\", handler);\n }\n };\n }, [ref]);\n}\n\nfunction handleMoveTo(\n direction: Direction,\n { event, list, currentFocus }: MoveDetails,\n) {\n event.preventDefault();\n moveFocusTo(direction, list, currentFocus);\n}\n\nfunction handleListKeyNav({\n list,\n event,\n search,\n searchResetTimer,\n}: EventDetails) {\n const { key, target } = event;\n const currentFocus = target as HTMLButtonElement;\n\n const moveDetails = {\n event,\n list,\n currentFocus,\n };\n\n switch (key) {\n case \"ArrowUp\":\n case \"PageUp\":\n handleMoveTo(\"prev\", moveDetails);\n break;\n case \"ArrowDown\":\n case \"PageDown\":\n handleMoveTo(\"next\", moveDetails);\n break;\n case \"Home\":\n handleMoveTo(\"first\", moveDetails);\n break;\n case \"End\":\n handleMoveTo(\"last\", moveDetails);\n break;\n case \"Tab\":\n // in a standard select, tab does nothing in-menu\n event.preventDefault();\n break;\n case \"Enter\":\n case \" \":\n break;\n\n default:\n if (search !== undefined) {\n const searchResult = findItem({\n list,\n key,\n search,\n searchResetTimer,\n });\n if (searchResult) {\n searchResult.focus();\n }\n }\n break;\n }\n}\n\nfunction moveFocusTo(\n direction: Direction,\n list: HTMLElement,\n current: HTMLButtonElement,\n) {\n const thisOption = current;\n switch (direction) {\n case \"prev\":\n const prevOption: HTMLButtonElement | null =\n thisOption &&\n (thisOption.previousElementSibling as HTMLButtonElement);\n if (prevOption) {\n prevOption.focus();\n }\n break;\n case \"next\":\n const nextOption: HTMLButtonElement | null =\n thisOption &&\n (thisOption.nextElementSibling as HTMLButtonElement);\n if (nextOption) {\n nextOption.focus();\n }\n break;\n case \"first\":\n const firstItem =\n list.querySelector<HTMLButtonElement>(`[role=\"option\"]`);\n if (firstItem) {\n firstItem.focus();\n }\n break;\n case \"last\":\n const listItems =\n list.querySelectorAll<HTMLButtonElement>(`[role=\"option\"]`);\n if (listItems.length) {\n listItems[listItems.length - 1].focus();\n }\n break;\n }\n}\n\nfunction findItem({\n list,\n key,\n search,\n searchResetTimer,\n}: SearchDetails): HTMLButtonElement | null {\n const listItems = list.querySelectorAll(`[role=\"option\"]`);\n if (!listItems.length) return null;\n\n if (search) {\n search.keys = search.keys.concat(key);\n resetWhenIdle(search, searchResetTimer);\n\n for (let n = 0; n < listItems.length; n++) {\n const label = (listItems[n] as HTMLButtonElement).innerText;\n if (label && label.toLowerCase().indexOf(search.keys) === 0) {\n return listItems[n] as HTMLButtonElement;\n }\n }\n }\n\n return null;\n}\n\nfunction resetWhenIdle(search: KeyBuffer, timer: Timer) {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n timer = setTimeout(\n () => {\n search ? (search.keys = \"\") : (search = { keys: \"\" });\n timer = undefined;\n },\n 500,\n search,\n timer,\n );\n}\n"],"names":["useListNavigation","ref","useEffect","search","keys","list","current","handler","event","searchResetTimer","key","target","moveDetails","currentFocus","handleMoveTo","preventDefault","searchResult","listItems","querySelectorAll","length","concat","timer","clearTimeout","setTimeout","resetWhenIdle","n","label","innerText","toLowerCase","indexOf","findItem","focus","handleListKeyNav","addEventListener","removeEventListener","direction","thisOption","prevOption","previousElementSibling","nextOption","nextElementSibling","firstItem","querySelector","moveFocusTo"],"mappings":"kCA0BO,SAASA,GACZC,IAAAA,IAEAC,GAAU,KAEAC,MAAAA,EAAoB,CAAEC,KAAM,IAC5BC,EAAOJ,EAAIK,QACXC,EAAWC,IACTH,GAyBhB,UACIA,KAAAA,EACAG,MAAAA,EACAL,OAAAA,EACAM,iBAAAA,IAEM,MAAEC,IAAAA,EAAKC,OAAAA,GAAWH,EAGlBI,EAAc,CAChBJ,MAAAA,EACAH,KAAAA,EACAQ,aALiBF,GAQrB,OAAQD,GACJ,IAAK,UACL,IAAK,SACDI,EAAa,OAAQF,GACrB,MACJ,IAAK,YACL,IAAK,WACDE,EAAa,OAAQF,GACrB,MACJ,IAAK,OACDE,EAAa,QAASF,GACtB,MACJ,IAAK,MACDE,EAAa,OAAQF,GACrB,MACJ,IAAK,MAEDJ,EAAMO,iBACN,MACJ,IAAK,QACL,IAAK,IACD,MAEJ,QACI,QAAe,IAAXZ,EAAsB,CACtB,MAAMa,EAsDtB,UACIX,KAAAA,EACAK,IAAAA,EACAP,OAAAA,EACAM,iBAAAA,IAEMQ,MAAAA,EAAYZ,EAAKa,iBAAiB,mBACpC,IAACD,EAAUE,OAAe,OAAA,KAE9B,GAAIhB,EAAQ,CACRA,EAAOC,KAAOD,EAAOC,KAAKgB,OAAOV,GAczC,SAAuBP,EAAmBkB,GAClCA,IACAC,aAAaD,GACLA,OAAA,GAEJA,EAAAE,YACJ,KACIpB,EAAUA,EAAOC,KAAO,GAAOD,EAAS,CAAEC,KAAM,IACxCiB,OAAA,CAAA,GAEZ,IACAlB,EACAkB,EAER,CA3BQG,CAAcrB,EAAQM,GAEtB,IAAA,IAASgB,EAAI,EAAGA,EAAIR,EAAUE,OAAQM,IAAK,CACjCC,MAAAA,EAAST,EAAUQ,GAAyBE,UAC9C,GAAAD,GAAsD,IAA7CA,EAAME,cAAcC,QAAQ1B,EAAOC,MAC5C,OAAOa,EAAUQ,EAEzB,CACJ,CAEO,OAAA,IACX,CA5EqCK,CAAS,CAC1BzB,KAAAA,EACAK,IAAAA,EACAP,OAAAA,EACAM,iBAAAA,IAEAO,GACAA,EAAae,OAErB,EAGZ,CA5EgBC,CAAiB,CAAE3B,KAAAA,EAAMG,MAAAA,EAAOL,OAAAA,EAAQM,iBAL5CA,WAK8D,EAIlE,OAAIJ,GACKA,EAAA4B,iBAAiB,UAAW1B,GAG9B,KACCF,GACKA,EAAA6B,oBAAoB,UAAW3B,EAAO,CAC/C,GAEL,CAACN,GACR,CAEA,SAASa,EACLqB,GACE3B,MAAAA,EAAOH,KAAAA,EAAMQ,aAAAA,IAEfL,EAAMO,iBA0DV,SACIoB,EACA9B,EACAC,GAEA,MAAM8B,EAAa9B,EACnB,OAAQ6B,GACJ,IAAK,OACKE,MAAAA,EACFD,GACCA,EAAWE,uBACZD,GACAA,EAAWN,QAEf,MACJ,IAAK,OACKQ,MAAAA,EACFH,GACCA,EAAWI,mBACZD,GACAA,EAAWR,QAEf,MACJ,IAAK,QACKU,MAAAA,EACFpC,EAAKqC,cAAiC,mBACtCD,GACAA,EAAUV,QAEd,MACJ,IAAK,OACKd,MAAAA,EACFZ,EAAKa,iBAAoC,mBACzCD,EAAUE,QACVF,EAAUA,EAAUE,OAAS,GAAGY,QAIhD,CA/FgBY,CAAAR,EAAW9B,EAAMQ,EACjC"}
1
+ {"version":3,"file":"useListNavigation.js","sources":["../../../../src/hooks/useListNavigation/useListNavigation.ts"],"sourcesContent":["import { useEffect, RefObject } from \"react\";\n\ntype Timer = number | undefined;\ntype KeyBuffer = { keys: string } | undefined;\ntype Direction = \"prev\" | \"next\" | \"first\" | \"last\";\ninterface MoveDetails {\n event: KeyboardEvent;\n list: HTMLElement;\n currentFocus: HTMLButtonElement;\n}\ninterface ListDetails {\n list: HTMLElement;\n search: KeyBuffer;\n searchResetTimer: Timer;\n}\ninterface SearchDetails extends ListDetails {\n key: string;\n}\ninterface EventDetails extends ListDetails {\n event: KeyboardEvent;\n}\ntype UseListNavigationProps<T> = {\n /** Ref til et element med rollen `listbox` */\n ref: RefObject<T>;\n};\n\nexport function useListNavigation<T extends HTMLElement>({\n ref,\n}: UseListNavigationProps<T>): void {\n useEffect(() => {\n let searchResetTimer: Timer;\n const search: KeyBuffer = { keys: \"\" }; // keypress buffer is an object to preserve state\n const list = ref.current;\n const handler = (event: KeyboardEvent) => {\n if (list) {\n handleListKeyNav({ list, event, search, searchResetTimer });\n }\n };\n\n if (list) {\n list.addEventListener(\"keydown\", handler);\n }\n\n return () => {\n if (list) {\n list.removeEventListener(\"keydown\", handler);\n }\n };\n }, [ref]);\n}\n\nfunction handleMoveTo(\n direction: Direction,\n { event, list, currentFocus }: MoveDetails,\n) {\n event.preventDefault();\n moveFocusTo(direction, list, currentFocus);\n}\n\nfunction handleListKeyNav({\n list,\n event,\n search,\n searchResetTimer,\n}: EventDetails) {\n const { key, target } = event;\n const currentFocus = target as HTMLButtonElement;\n\n const moveDetails = {\n event,\n list,\n currentFocus,\n };\n\n switch (key) {\n case \"ArrowUp\":\n case \"PageUp\":\n handleMoveTo(\"prev\", moveDetails);\n break;\n case \"ArrowDown\":\n case \"PageDown\":\n handleMoveTo(\"next\", moveDetails);\n break;\n case \"Home\":\n handleMoveTo(\"first\", moveDetails);\n break;\n case \"End\":\n handleMoveTo(\"last\", moveDetails);\n break;\n case \"Tab\":\n // in a standard select, tab does nothing in-menu\n event.preventDefault();\n break;\n case \"Enter\":\n case \" \":\n break;\n\n default:\n if (search !== undefined) {\n const searchResult = findItem({\n list,\n key,\n search,\n searchResetTimer,\n });\n if (searchResult) {\n searchResult.focus();\n }\n }\n break;\n }\n}\n\nfunction moveFocusTo(\n direction: Direction,\n list: HTMLElement,\n current: HTMLButtonElement,\n) {\n const thisOption = current;\n switch (direction) {\n case \"prev\":\n const prevOption: HTMLButtonElement | null =\n thisOption &&\n (thisOption.previousElementSibling as HTMLButtonElement);\n if (prevOption) {\n prevOption.focus();\n }\n break;\n case \"next\":\n const nextOption: HTMLButtonElement | null =\n thisOption &&\n (thisOption.nextElementSibling as HTMLButtonElement);\n if (nextOption) {\n nextOption.focus();\n }\n break;\n case \"first\":\n const firstItem =\n list.querySelector<HTMLButtonElement>(`[role=\"option\"]`);\n if (firstItem) {\n firstItem.focus();\n }\n break;\n case \"last\":\n const listItems =\n list.querySelectorAll<HTMLButtonElement>(`[role=\"option\"]`);\n if (listItems.length) {\n listItems[listItems.length - 1].focus();\n }\n break;\n }\n}\n\nfunction findItem({\n list,\n key,\n search,\n searchResetTimer,\n}: SearchDetails): HTMLButtonElement | null {\n const listItems = list.querySelectorAll(`[role=\"option\"]`);\n if (!listItems.length) return null;\n\n if (search) {\n search.keys = search.keys.concat(key);\n resetWhenIdle(search, searchResetTimer);\n\n for (let n = 0; n < listItems.length; n++) {\n const label = (listItems[n] as HTMLButtonElement).innerText;\n if (label && label.toLowerCase().indexOf(search.keys) === 0) {\n return listItems[n] as HTMLButtonElement;\n }\n }\n }\n\n return null;\n}\n\nfunction resetWhenIdle(search: KeyBuffer, timer: Timer) {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n timer = setTimeout(\n () => {\n search ? (search.keys = \"\") : (search = { keys: \"\" });\n timer = undefined;\n },\n 500,\n search,\n timer,\n );\n}\n"],"names":["useListNavigation","ref","useEffect","search","keys","list","current","handler","event","searchResetTimer","key","target","moveDetails","currentFocus","handleMoveTo","preventDefault","searchResult","listItems","querySelectorAll","length","concat","timer","clearTimeout","setTimeout","resetWhenIdle","n","label","innerText","toLowerCase","indexOf","findItem","focus","handleListKeyNav","addEventListener","removeEventListener","direction","thisOption","prevOption","previousElementSibling","nextOption","nextElementSibling","firstItem","querySelector","moveFocusTo"],"mappings":"kCA0BO,SAASA,GACZC,IAAAA,IAEAC,GAAU,KAEAC,MAAAA,EAAoB,CAAEC,KAAM,IAC5BC,EAAOJ,EAAIK,QACXC,EAAWC,IACTH,GAyBhB,UACIA,KAAAA,EACAG,MAAAA,EACAL,OAAAA,EACAM,iBAAAA,IAEM,MAAEC,IAAAA,EAAKC,OAAAA,GAAWH,EAGlBI,EAAc,CAChBJ,MAAAA,EACAH,KAAAA,EACAQ,aALiBF,GAQrB,OAAQD,GACJ,IAAK,UACL,IAAK,SACDI,EAAa,OAAQF,GACrB,MACJ,IAAK,YACL,IAAK,WACDE,EAAa,OAAQF,GACrB,MACJ,IAAK,OACDE,EAAa,QAASF,GACtB,MACJ,IAAK,MACDE,EAAa,OAAQF,GACrB,MACJ,IAAK,MAEDJ,EAAMO,iBACN,MACJ,IAAK,QACL,IAAK,IACD,MAEJ,QACI,QAAe,IAAXZ,EAAsB,CACtB,MAAMa,EAsDtB,UACIX,KAAAA,EACAK,IAAAA,EACAP,OAAAA,EACAM,iBAAAA,IAEMQ,MAAAA,EAAYZ,EAAKa,iBAAiB,mBACpC,IAACD,EAAUE,OAAe,OAAA,KAE9B,GAAIhB,EAAQ,CACRA,EAAOC,KAAOD,EAAOC,KAAKgB,OAAOV,GAczC,SAAuBP,EAAmBkB,GAClCA,IACAC,aAAaD,GACLA,OAAA,GAEJA,EAAAE,YACJ,KACIpB,EAAUA,EAAOC,KAAO,GAAOD,EAAS,CAAEC,KAAM,IACxCiB,OAAA,CAAA,GAEZ,IACAlB,EACAkB,EAER,CA3BQG,CAAcrB,EAAQM,GAEtB,IAAA,IAASgB,EAAI,EAAGA,EAAIR,EAAUE,OAAQM,IAAK,CACjCC,MAAAA,EAAST,EAAUQ,GAAyBE,UAC9C,GAAAD,GAAsD,IAA7CA,EAAME,cAAcC,QAAQ1B,EAAOC,MAC5C,OAAOa,EAAUQ,EACrB,CACJ,CAGG,OAAA,IACX,CA5EqCK,CAAS,CAC1BzB,KAAAA,EACAK,IAAAA,EACAP,OAAAA,EACAM,iBAAAA,IAEAO,GACAA,EAAae,OACjB,EAIhB,CA5EgBC,CAAiB,CAAE3B,KAAAA,EAAMG,MAAAA,EAAOL,OAAAA,EAAQM,iBAL5CA,WAK8D,EAIlE,OAAIJ,GACKA,EAAA4B,iBAAiB,UAAW1B,GAG9B,KACCF,GACKA,EAAA6B,oBAAoB,UAAW3B,EAAO,CAEnD,GACD,CAACN,GACR,CAEA,SAASa,EACLqB,GACE3B,MAAAA,EAAOH,KAAAA,EAAMQ,aAAAA,IAEfL,EAAMO,iBA0DV,SACIoB,EACA9B,EACAC,GAEA,MAAM8B,EAAa9B,EACnB,OAAQ6B,GACJ,IAAK,OACKE,MAAAA,EACFD,GACCA,EAAWE,uBACZD,GACAA,EAAWN,QAEf,MACJ,IAAK,OACKQ,MAAAA,EACFH,GACCA,EAAWI,mBACZD,GACAA,EAAWR,QAEf,MACJ,IAAK,QACKU,MAAAA,EACFpC,EAAKqC,cAAiC,mBACtCD,GACAA,EAAUV,QAEd,MACJ,IAAK,OACKd,MAAAA,EACFZ,EAAKa,iBAAoC,mBACzCD,EAAUE,QACVF,EAAUA,EAAUE,OAAS,GAAGY,QAIhD,CA/FgBY,CAAAR,EAAW9B,EAAMQ,EACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMutationObserver.js","sources":["../../../../src/hooks/useMutationObserver/useMutationObserver.ts"],"sourcesContent":["import { useEffect, useRef, RefObject } from \"react\";\n\nconst hasWindowWithMutationObserver = () =>\n typeof window !== \"undefined\" && typeof MutationObserver !== \"undefined\";\n\n/**\n * Hook som gjør det enklere å sjekke en komponents children for endringer.\n *\n * @param targetRef Container som skal observeres. Containeren må ikke rerendres, da vil observereren bli opprettet på nytt.\n * @param onObservation Callback-funksjon som utføres når en mutasjon observeres.\n * @param config Parametere til observereren. Se https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#properties for mer info.\n */\nexport const useMutationObserver = (\n targetRef: RefObject<HTMLElement>,\n onObservation: MutationCallback,\n config?: Partial<MutationObserverInit>,\n): void => {\n const observerRef = useRef<MutationObserver>(null);\n\n useEffect(() => {\n let observer = observerRef.current;\n\n if (hasWindowWithMutationObserver()) {\n const target = targetRef.current;\n\n if (observer) {\n observer.disconnect();\n }\n\n observer = new MutationObserver(onObservation);\n\n if (target) {\n observer.observe(target, config);\n }\n }\n return () => {\n if (hasWindowWithMutationObserver() && observer) {\n observer.disconnect();\n }\n };\n }, [targetRef, onObservation, config]);\n};\n"],"names":["hasWindowWithMutationObserver","window","MutationObserver","useMutationObserver","targetRef","onObservation","config","observerRef","useRef","useEffect","observer","current","target","disconnect","observe"],"mappings":"8CAEA,MAAMA,EAAgC,WAC3BC,OAAW,YAAsBC,iBAAqB,IASpDC,EAAsB,CAC/BC,EACAC,EACAC,KAEMC,MAAAA,EAAcC,EAAyB,MAE7CC,GAAU,KACN,IAAIC,EAAWH,EAAYI,QAE3B,GAAIX,IAAiC,CACjC,MAAMY,EAASR,EAAUO,QAErBD,GACAA,EAASG,aAGFH,EAAA,IAAIR,iBAAiBG,GAE5BO,GACSF,EAAAI,QAAQF,EAAQN,EAEjC,CACA,MAAO,KACCN,KAAmCU,GACnCA,EAASG,YAAW,CACxB,GAEL,CAACT,EAAWC,EAAeC,GAAO"}
1
+ {"version":3,"file":"useMutationObserver.js","sources":["../../../../src/hooks/useMutationObserver/useMutationObserver.ts"],"sourcesContent":["import { useEffect, useRef, RefObject } from \"react\";\n\nconst hasWindowWithMutationObserver = () =>\n typeof window !== \"undefined\" && typeof MutationObserver !== \"undefined\";\n\n/**\n * Hook som gjør det enklere å sjekke en komponents children for endringer.\n *\n * @param targetRef Container som skal observeres. Containeren må ikke rerendres, da vil observereren bli opprettet på nytt.\n * @param onObservation Callback-funksjon som utføres når en mutasjon observeres.\n * @param config Parametere til observereren. Se https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit#properties for mer info.\n */\nexport const useMutationObserver = (\n targetRef: RefObject<HTMLElement>,\n onObservation: MutationCallback,\n config?: Partial<MutationObserverInit>,\n): void => {\n const observerRef = useRef<MutationObserver>(null);\n\n useEffect(() => {\n let observer = observerRef.current;\n\n if (hasWindowWithMutationObserver()) {\n const target = targetRef.current;\n\n if (observer) {\n observer.disconnect();\n }\n\n observer = new MutationObserver(onObservation);\n\n if (target) {\n observer.observe(target, config);\n }\n }\n return () => {\n if (hasWindowWithMutationObserver() && observer) {\n observer.disconnect();\n }\n };\n }, [targetRef, onObservation, config]);\n};\n"],"names":["hasWindowWithMutationObserver","window","MutationObserver","useMutationObserver","targetRef","onObservation","config","observerRef","useRef","useEffect","observer","current","target","disconnect","observe"],"mappings":"8CAEA,MAAMA,EAAgC,WAC3BC,OAAW,YAAsBC,iBAAqB,IASpDC,EAAsB,CAC/BC,EACAC,EACAC,KAEMC,MAAAA,EAAcC,EAAyB,MAE7CC,GAAU,KACN,IAAIC,EAAWH,EAAYI,QAE3B,GAAIX,IAAiC,CACjC,MAAMY,EAASR,EAAUO,QAErBD,GACAA,EAASG,aAGFH,EAAA,IAAIR,iBAAiBG,GAE5BO,GACSF,EAAAI,QAAQF,EAAQN,EAC7B,CAEJ,MAAO,KACCN,KAAmCU,GACnCA,EAASG,YAAW,CAE5B,GACD,CAACT,EAAWC,EAAeC,GAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"useProgressiveImg.js","sources":["../../../../src/hooks/useProgressiveImg/useProgressiveImg.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\n\nexport interface ProgressiveImageProps {\n lowQualitySrc: string;\n highQualitySrc: string;\n}\n\ntype ProgressiveImage = { src: string; isBlurred: boolean };\n\nexport const useProgressiveImg = ({\n lowQualitySrc,\n highQualitySrc,\n}: ProgressiveImageProps): ProgressiveImage => {\n const [src, setSrc] = useState(lowQualitySrc);\n\n useEffect(() => {\n setSrc(lowQualitySrc);\n const img = new Image();\n img.src = highQualitySrc;\n\n img.onload = () => {\n setSrc(highQualitySrc);\n };\n }, [lowQualitySrc, highQualitySrc]);\n\n return { src, isBlurred: src === lowQualitySrc };\n};\n"],"names":["useProgressiveImg","lowQualitySrc","highQualitySrc","src","setSrc","useState","useEffect","img","Image","onload","isBlurred"],"mappings":"gDASO,MAAMA,EAAoB,EAC7BC,cAAAA,EACAC,eAAAA,MAEA,MAAOC,EAAKC,GAAUC,EAASJ,GAE/B,OAAAK,GAAU,KACNF,EAAOH,GACDM,MAAAA,EAAM,IAAIC,MAChBD,EAAIJ,IAAMD,EAEVK,EAAIE,OAAS,KACTL,EAAOF,EAAc,CAAA,GAE1B,CAACD,EAAeC,IAEZ,CAAEC,IAAAA,EAAKO,UAAWP,IAAQF,EAAc"}
1
+ {"version":3,"file":"useProgressiveImg.js","sources":["../../../../src/hooks/useProgressiveImg/useProgressiveImg.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\n\nexport interface ProgressiveImageProps {\n lowQualitySrc: string;\n highQualitySrc: string;\n}\n\ntype ProgressiveImage = { src: string; isBlurred: boolean };\n\nexport const useProgressiveImg = ({\n lowQualitySrc,\n highQualitySrc,\n}: ProgressiveImageProps): ProgressiveImage => {\n const [src, setSrc] = useState(lowQualitySrc);\n\n useEffect(() => {\n setSrc(lowQualitySrc);\n const img = new Image();\n img.src = highQualitySrc;\n\n img.onload = () => {\n setSrc(highQualitySrc);\n };\n }, [lowQualitySrc, highQualitySrc]);\n\n return { src, isBlurred: src === lowQualitySrc };\n};\n"],"names":["useProgressiveImg","lowQualitySrc","highQualitySrc","src","setSrc","useState","useEffect","img","Image","onload","isBlurred"],"mappings":"gDASO,MAAMA,EAAoB,EAC7BC,cAAAA,EACAC,eAAAA,MAEA,MAAOC,EAAKC,GAAUC,EAASJ,GAE/B,OAAAK,GAAU,KACNF,EAAOH,GACDM,MAAAA,EAAM,IAAIC,MAChBD,EAAIJ,IAAMD,EAEVK,EAAIE,OAAS,KACTL,EAAOF,EAAc,CACzB,GACD,CAACD,EAAeC,IAEZ,CAAEC,IAAAA,EAAKO,UAAWP,IAAQF,EAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sources":["../../../../src/hooks/useScreen/state.ts"],"sourcesContent":["export interface ScreenState {\n isSmallDevice: boolean;\n isMediumDevice: boolean;\n isLargeDevice: boolean;\n isXlDevice: boolean;\n isLandscape: boolean;\n isPortrait: boolean;\n}\n\nexport enum ActionType {\n orientation = \"ORIENTATION_CHANGED\",\n deviceSize = \"DEVICE_SIZE_CHANGED\",\n}\n\nexport interface ScreenAction {\n type: ActionType;\n property: keyof ScreenState;\n}\n\nfunction setDeviceSize(\n deviceSize: keyof ScreenState,\n): Omit<ScreenState, \"isLandscape\" | \"isPortrait\"> {\n return {\n isSmallDevice: deviceSize === \"isSmallDevice\",\n isMediumDevice: deviceSize === \"isMediumDevice\",\n isLargeDevice: deviceSize === \"isLargeDevice\",\n isXlDevice: deviceSize === \"isXlDevice\",\n };\n}\n\nfunction setOrientation(\n orientation: keyof ScreenState,\n): Pick<ScreenState, \"isLandscape\" | \"isPortrait\"> {\n return {\n isLandscape: orientation === \"isLandscape\",\n isPortrait: orientation === \"isPortrait\",\n };\n}\n\nexport const reducer = (\n state: ScreenState,\n action: ScreenAction,\n): ScreenState => {\n switch (action.type) {\n case ActionType.orientation:\n return {\n ...state,\n ...setOrientation(action.property),\n };\n case ActionType.deviceSize:\n return {\n ...state,\n ...setDeviceSize(action.property),\n };\n default:\n return state;\n }\n};\n"],"names":["ActionType","orientation","deviceSize","setDeviceSize","isSmallDevice","isMediumDevice","isLargeDevice","isXlDevice","setOrientation","isLandscape","isPortrait","reducer","state","action","type","property"],"mappings":"AASY,IAAAA,GAAAA,IACRA,EAAAC,YAAc,sBACdD,EAAAE,WAAa,sBAFLF,IAAAA,GAAA,CAAA,GAUZ,SAASG,EACLD,GAEO,MAAA,CACHE,cAA8B,kBAAfF,EACfG,eAA+B,mBAAfH,EAChBI,cAA8B,kBAAfJ,EACfK,WAA2B,eAAfL,EAEpB,CAEA,SAASM,EACLP,GAEO,MAAA,CACHQ,YAA6B,gBAAhBR,EACbS,WAA4B,eAAhBT,EAEpB,CAEa,MAAAU,EAAU,CACnBC,EACAC,KAEA,OAAQA,EAAOC,MACX,IAAK,sBACM,MAAA,IACAF,KACAJ,EAAeK,EAAOE,WAEjC,IAAK,sBACM,MAAA,IACAH,KACAT,EAAcU,EAAOE,WAEhC,QACWH,OAAAA,EACf"}
1
+ {"version":3,"file":"state.js","sources":["../../../../src/hooks/useScreen/state.ts"],"sourcesContent":["export interface ScreenState {\n isSmallDevice: boolean;\n isMediumDevice: boolean;\n isLargeDevice: boolean;\n isXlDevice: boolean;\n isLandscape: boolean;\n isPortrait: boolean;\n}\n\nexport enum ActionType {\n orientation = \"ORIENTATION_CHANGED\",\n deviceSize = \"DEVICE_SIZE_CHANGED\",\n}\n\nexport interface ScreenAction {\n type: ActionType;\n property: keyof ScreenState;\n}\n\nfunction setDeviceSize(\n deviceSize: keyof ScreenState,\n): Omit<ScreenState, \"isLandscape\" | \"isPortrait\"> {\n return {\n isSmallDevice: deviceSize === \"isSmallDevice\",\n isMediumDevice: deviceSize === \"isMediumDevice\",\n isLargeDevice: deviceSize === \"isLargeDevice\",\n isXlDevice: deviceSize === \"isXlDevice\",\n };\n}\n\nfunction setOrientation(\n orientation: keyof ScreenState,\n): Pick<ScreenState, \"isLandscape\" | \"isPortrait\"> {\n return {\n isLandscape: orientation === \"isLandscape\",\n isPortrait: orientation === \"isPortrait\",\n };\n}\n\nexport const reducer = (\n state: ScreenState,\n action: ScreenAction,\n): ScreenState => {\n switch (action.type) {\n case ActionType.orientation:\n return {\n ...state,\n ...setOrientation(action.property),\n };\n case ActionType.deviceSize:\n return {\n ...state,\n ...setDeviceSize(action.property),\n };\n default:\n return state;\n }\n};\n"],"names":["ActionType","orientation","deviceSize","setDeviceSize","isSmallDevice","isMediumDevice","isLargeDevice","isXlDevice","setOrientation","isLandscape","isPortrait","reducer","state","action","type","property"],"mappings":"AASY,IAAAA,GAAAA,IACRA,EAAAC,YAAc,sBACdD,EAAAE,WAAa,sBAFLF,IAAAA,GAAA,CAAA,GAUZ,SAASG,EACLD,GAEO,MAAA,CACHE,cAA8B,kBAAfF,EACfG,eAA+B,mBAAfH,EAChBI,cAA8B,kBAAfJ,EACfK,WAA2B,eAAfL,EAEpB,CAEA,SAASM,EACLP,GAEO,MAAA,CACHQ,YAA6B,gBAAhBR,EACbS,WAA4B,eAAhBT,EAEpB,CAEa,MAAAU,EAAU,CACnBC,EACAC,KAEA,OAAQA,EAAOC,MACX,IAAK,sBACM,MAAA,IACAF,KACAJ,EAAeK,EAAOE,WAEjC,IAAK,sBACM,MAAA,IACAH,KACAT,EAAcU,EAAOE,WAEhC,QACWH,OAAAA,EAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useScreen.js","sources":["../../../../src/hooks/useScreen/useScreen.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useState } from \"react\";\nimport { tokens } from \"../../core/index.js\";\nimport {\n addMediaQueryListener,\n getInitialMediaQueryMatch,\n removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\nimport { ScreenAction, ActionType, reducer, ScreenState } from \"./state.js\";\n\nconst { breakpoint } = tokens;\n\nconst breakpointsAsNumber = (breakpoint: string): number =>\n parseInt(breakpoint.replace(\"px\", \"\"));\n\nconst MEDIA_RULES: Record<keyof ScreenState, string> = {\n isSmallDevice: `(max-width: ${\n breakpointsAsNumber(breakpoint.medium) - 1\n }px)`,\n isMediumDevice: `(min-width: ${breakpoint.medium}) and (max-width: ${\n breakpointsAsNumber(breakpoint.large) - 1\n }px)`,\n isLargeDevice: `(min-width: ${breakpoint.large}) and (max-width: ${\n breakpointsAsNumber(breakpoint.xl) - 1\n }px)`,\n isXlDevice: `(min-width: ${breakpoint.xl})`,\n isPortrait: \"(orientation: portrait)\",\n isLandscape: \"(orientation: landscape)\",\n};\n\nconst createAction = (property: keyof ScreenState): ScreenAction => ({\n type:\n property === \"isLandscape\" || property === \"isPortrait\"\n ? ActionType.orientation\n : ActionType.deviceSize,\n property,\n});\n\n/**\n * Finn størrelsen og orienteringen til skjermen.\n * @returns Et objekt med boolean som indikerer om skjermstørrelsen er liten, medium, stor eller ekstra stor, og om skjermen er i portrett- eller landskapsmodus.\n */\nexport const useScreen = (): ScreenState => {\n const [hasMounted, setHasMounted] = useState(false);\n\n const [device, deviceDispatch] = useReducer(reducer, {\n isSmallDevice: false,\n isMediumDevice: false,\n isLargeDevice: false,\n isXlDevice: false,\n isLandscape: false,\n isPortrait: false,\n });\n\n useEffect(() => {\n setHasMounted(true);\n Object.entries(MEDIA_RULES)\n .map(([key, rule]) => [key, getInitialMediaQueryMatch(rule)])\n .forEach(([key, value]) => {\n if (value) {\n deviceDispatch(createAction(key as keyof ScreenState));\n }\n });\n }, []);\n\n const createListener = useCallback(\n (key: keyof ScreenState) => (e: MediaQueryListEvent) => {\n requestAnimationFrame(() => {\n if (e.matches) {\n deviceDispatch(createAction(key));\n }\n });\n },\n [],\n );\n\n useEffect(() => {\n if (!hasMounted || !window.matchMedia) {\n return;\n }\n const eventListenerPairs: Array<\n [MediaQueryList, (e: MediaQueryListEvent) => void]\n > = [];\n\n Object.entries(MEDIA_RULES).forEach(([key, rule]) => {\n const queryList = window.matchMedia(rule);\n const listener = createListener(key as keyof ScreenState);\n eventListenerPairs.push([queryList, listener]);\n addMediaQueryListener(queryList, listener);\n });\n\n return () => {\n eventListenerPairs.forEach(([queryList, listener]) =>\n removeMediaQueryListener(queryList, listener),\n );\n };\n }, [createListener, hasMounted]);\n\n return { ...device };\n};\n"],"names":["breakpoint","tokens","breakpointsAsNumber","parseInt","replace","MEDIA_RULES","isSmallDevice","medium","isMediumDevice","large","isLargeDevice","xl","isXlDevice","isPortrait","isLandscape","createAction","property","type","ActionType","orientation","deviceSize","useScreen","hasMounted","setHasMounted","useState","device","deviceDispatch","useReducer","reducer","useEffect","Object","entries","map","key","rule","getInitialMediaQueryMatch","forEach","value","createListener","useCallback","e","requestAnimationFrame","matches","window","matchMedia","eventListenerPairs","queryList","listener","push","addMediaQueryListener","removeMediaQueryListener"],"mappings":"qSASA,MAAQA,WAAAA,GAAeC,EAEjBC,EAAuBF,GACzBG,SAASH,EAAWI,QAAQ,KAAM,KAEhCC,EAAiD,CACnDC,cAAe,eACXJ,EAAoBF,EAAWO,QAAU,OAE7CC,eAAgB,eAAeR,EAAWO,2BACtCL,EAAoBF,EAAWS,OAAS,OAE5CC,cAAe,eAAeV,EAAWS,0BACrCP,EAAoBF,EAAWW,IAAM,OAEzCC,WAAY,eAAeZ,EAAWW,MACtCE,WAAY,0BACZC,YAAa,4BAGXC,EAAgBC,IAA+C,CACjEC,KACiB,gBAAbD,GAA2C,eAAbA,EACxBE,EAAWC,YACXD,EAAWE,WACrBJ,SAAAA,IAOSK,EAAY,KACrB,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCC,EAAQC,GAAkBC,EAAWC,EAAS,CACjDtB,eAAe,EACfE,gBAAgB,EAChBE,eAAe,EACfE,YAAY,EACZE,aAAa,EACbD,YAAY,IAGhBgB,GAAU,KACNN,GAAc,GACPO,OAAAC,QAAQ1B,GACV2B,KAAI,EAAEC,EAAKC,KAAU,CAACD,EAAKE,EAA0BD,MACrDE,SAAQ,EAAEH,EAAKI,MACRA,GACeX,EAAAX,EAAakB,GAAyB,GAE5D,GACN,IAEH,MAAMK,EAAiBC,GAClBN,GAA4BO,IACzBC,uBAAsB,KACdD,EAAEE,SACahB,EAAAX,EAAakB,GAAI,GAEvC,GAEL,IAGJ,OAAAJ,GAAU,KACF,IAACP,IAAeqB,OAAOC,WACvB,OAEJ,MAAMC,EAEF,GAEG,OAAAf,OAAAC,QAAQ1B,GAAa+B,SAAQ,EAAEH,EAAKC,MACjC,MAAAY,EAAYH,OAAOC,WAAWV,GAC9Ba,EAAWT,EAAeL,GAChCY,EAAmBG,KAAK,CAACF,EAAWC,IACpCE,EAAsBH,EAAWC,EAAQ,IAGtC,KACgBF,EAAAT,SAAQ,EAAEU,EAAWC,KACpCG,EAAyBJ,EAAWC,IAAQ,CAChD,GAEL,CAACT,EAAgBhB,IAEb,IAAKG"}
1
+ {"version":3,"file":"useScreen.js","sources":["../../../../src/hooks/useScreen/useScreen.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useState } from \"react\";\nimport { tokens } from \"../../core/index.js\";\nimport {\n addMediaQueryListener,\n getInitialMediaQueryMatch,\n removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\nimport { ScreenAction, ActionType, reducer, ScreenState } from \"./state.js\";\n\nconst { breakpoint } = tokens;\n\nconst breakpointsAsNumber = (breakpoint: string): number =>\n parseInt(breakpoint.replace(\"px\", \"\"));\n\nconst MEDIA_RULES: Record<keyof ScreenState, string> = {\n isSmallDevice: `(max-width: ${\n breakpointsAsNumber(breakpoint.medium) - 1\n }px)`,\n isMediumDevice: `(min-width: ${breakpoint.medium}) and (max-width: ${\n breakpointsAsNumber(breakpoint.large) - 1\n }px)`,\n isLargeDevice: `(min-width: ${breakpoint.large}) and (max-width: ${\n breakpointsAsNumber(breakpoint.xl) - 1\n }px)`,\n isXlDevice: `(min-width: ${breakpoint.xl})`,\n isPortrait: \"(orientation: portrait)\",\n isLandscape: \"(orientation: landscape)\",\n};\n\nconst createAction = (property: keyof ScreenState): ScreenAction => ({\n type:\n property === \"isLandscape\" || property === \"isPortrait\"\n ? ActionType.orientation\n : ActionType.deviceSize,\n property,\n});\n\n/**\n * Finn størrelsen og orienteringen til skjermen.\n * @returns Et objekt med boolean som indikerer om skjermstørrelsen er liten, medium, stor eller ekstra stor, og om skjermen er i portrett- eller landskapsmodus.\n */\nexport const useScreen = (): ScreenState => {\n const [hasMounted, setHasMounted] = useState(false);\n\n const [device, deviceDispatch] = useReducer(reducer, {\n isSmallDevice: false,\n isMediumDevice: false,\n isLargeDevice: false,\n isXlDevice: false,\n isLandscape: false,\n isPortrait: false,\n });\n\n useEffect(() => {\n setHasMounted(true);\n Object.entries(MEDIA_RULES)\n .map(([key, rule]) => [key, getInitialMediaQueryMatch(rule)])\n .forEach(([key, value]) => {\n if (value) {\n deviceDispatch(createAction(key as keyof ScreenState));\n }\n });\n }, []);\n\n const createListener = useCallback(\n (key: keyof ScreenState) => (e: MediaQueryListEvent) => {\n requestAnimationFrame(() => {\n if (e.matches) {\n deviceDispatch(createAction(key));\n }\n });\n },\n [],\n );\n\n useEffect(() => {\n if (!hasMounted || !window.matchMedia) {\n return;\n }\n const eventListenerPairs: Array<\n [MediaQueryList, (e: MediaQueryListEvent) => void]\n > = [];\n\n Object.entries(MEDIA_RULES).forEach(([key, rule]) => {\n const queryList = window.matchMedia(rule);\n const listener = createListener(key as keyof ScreenState);\n eventListenerPairs.push([queryList, listener]);\n addMediaQueryListener(queryList, listener);\n });\n\n return () => {\n eventListenerPairs.forEach(([queryList, listener]) =>\n removeMediaQueryListener(queryList, listener),\n );\n };\n }, [createListener, hasMounted]);\n\n return { ...device };\n};\n"],"names":["breakpoint","tokens","breakpointsAsNumber","parseInt","replace","MEDIA_RULES","isSmallDevice","medium","isMediumDevice","large","isLargeDevice","xl","isXlDevice","isPortrait","isLandscape","createAction","property","type","ActionType","orientation","deviceSize","useScreen","hasMounted","setHasMounted","useState","device","deviceDispatch","useReducer","reducer","useEffect","Object","entries","map","key","rule","getInitialMediaQueryMatch","forEach","value","createListener","useCallback","e","requestAnimationFrame","matches","window","matchMedia","eventListenerPairs","queryList","listener","push","addMediaQueryListener","removeMediaQueryListener"],"mappings":"qSASA,MAAQA,WAAAA,GAAeC,EAEjBC,EAAuBF,GACzBG,SAASH,EAAWI,QAAQ,KAAM,KAEhCC,EAAiD,CACnDC,cAAe,eACXJ,EAAoBF,EAAWO,QAAU,OAE7CC,eAAgB,eAAeR,EAAWO,2BACtCL,EAAoBF,EAAWS,OAAS,OAE5CC,cAAe,eAAeV,EAAWS,0BACrCP,EAAoBF,EAAWW,IAAM,OAEzCC,WAAY,eAAeZ,EAAWW,MACtCE,WAAY,0BACZC,YAAa,4BAGXC,EAAgBC,IAA+C,CACjEC,KACiB,gBAAbD,GAA2C,eAAbA,EACxBE,EAAWC,YACXD,EAAWE,WACrBJ,SAAAA,IAOSK,EAAY,KACrB,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCC,EAAQC,GAAkBC,EAAWC,EAAS,CACjDtB,eAAe,EACfE,gBAAgB,EAChBE,eAAe,EACfE,YAAY,EACZE,aAAa,EACbD,YAAY,IAGhBgB,GAAU,KACNN,GAAc,GACPO,OAAAC,QAAQ1B,GACV2B,KAAI,EAAEC,EAAKC,KAAU,CAACD,EAAKE,EAA0BD,MACrDE,SAAQ,EAAEH,EAAKI,MACRA,GACeX,EAAAX,EAAakB,GAAyB,GAE5D,GACN,IAEH,MAAMK,EAAiBC,GAClBN,GAA4BO,IACzBC,uBAAsB,KACdD,EAAEE,SACahB,EAAAX,EAAakB,GAAI,GAEvC,GAEL,IAGJ,OAAAJ,GAAU,KACF,IAACP,IAAeqB,OAAOC,WACvB,OAEJ,MAAMC,EAEF,GAEG,OAAAf,OAAAC,QAAQ1B,GAAa+B,SAAQ,EAAEH,EAAKC,MACjC,MAAAY,EAAYH,OAAOC,WAAWV,GAC9Ba,EAAWT,EAAeL,GAChCY,EAAmBG,KAAK,CAACF,EAAWC,IACpCE,EAAsBH,EAAWC,EAAQ,IAGtC,KACgBF,EAAAT,SAAQ,EAAEU,EAAWC,KACpCG,EAAyBJ,EAAWC,IACxC,CACJ,GACD,CAACT,EAAgBhB,IAEb,IAAKG,EAAO"}
@@ -18,24 +18,24 @@ declare const formatters: {
18
18
  export type Formatter = keyof typeof formatters;
19
19
  export type RegisterWithMaskOptions<T extends FieldValues> = Omit<RegisterOptions<T>, "setValueAs">;
20
20
  /** @deprecated Bruk `registerWithMasks` i stedet */
21
- export declare const registerWithFodselsnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
21
+ export declare const registerWithFodselsnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
22
22
  /** @deprecated Bruk `registerWithMasks` i stedet */
23
- export declare const registerWithKortnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
23
+ export declare const registerWithKortnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
24
24
  /** @deprecated Bruk `registerWithMasks` i stedet */
25
- export declare const registerWithKontonummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
25
+ export declare const registerWithKontonummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
26
26
  /** @deprecated Bruk `registerWithMasks` i stedet */
27
- export declare const registerWithTelefonnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
27
+ export declare const registerWithTelefonnummerMask: <T extends FieldValues>(form: UseFormReturn<T>, name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn<Path<T>> & Record<string, unknown>;
28
28
  /**
29
29
  * Hjelpefunksjon for React Hook Form som lar deg bruke formateringsfunksjonene i denne pakken som inputmasker.
30
30
  */
31
31
  export declare const registerWithMasks: <T extends FieldValues>(form: UseFormReturn<T>) => {
32
- registerWithFodselsnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
33
- registerWithKortnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
34
- registerWithKontonummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
35
- registerWithTelefonnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
36
- registerWithOrganisasjonsnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
37
- registerWithDateMask: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn;
38
- registerWithNumber: (name: Path<T>, options?: RegisterWithMaskOptions<T> | undefined) => UseFormRegisterReturn & {
32
+ registerWithFodselsnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
33
+ registerWithKortnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
34
+ registerWithKontonummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
35
+ registerWithTelefonnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
36
+ registerWithOrganisasjonsnummerMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
37
+ registerWithDateMask: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn;
38
+ registerWithNumber: (name: Path<T>, options?: RegisterWithMaskOptions<T>) => UseFormRegisterReturn & {
39
39
  align: "right";
40
40
  };
41
41
  };