@fremtind/jokul 5.0.0-next.0 → 5.0.0-next.2

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 (636) hide show
  1. package/README.md +30 -7
  2. package/bin/jokul.mjs +10 -0
  3. package/bin/run-jokul-cli.mjs +63 -0
  4. package/build/build-stats.html +1 -1
  5. package/build/cjs/components/beta/description-list/DescriptionList.cjs +2 -0
  6. package/build/cjs/components/beta/description-list/DescriptionList.cjs.map +1 -0
  7. package/build/cjs/components/beta/description-list/DescriptionListItem.cjs +2 -0
  8. package/build/cjs/components/beta/description-list/DescriptionListItem.cjs.map +1 -0
  9. package/build/cjs/{components-beta → components/beta}/description-list/index.d.cts +2 -2
  10. package/build/cjs/components/beta/nav-link/NavLink.cjs +2 -0
  11. package/build/cjs/components/beta/nav-link/NavLink.cjs.map +1 -0
  12. package/build/cjs/components/beta/nav-link/index.d.cts +1 -0
  13. package/build/cjs/{components-beta → components/beta}/nav-link/types.d.cts +1 -1
  14. package/build/cjs/components/beta/select/Select.cjs +2 -0
  15. package/build/cjs/components/beta/select/Select.cjs.map +1 -0
  16. package/build/cjs/components/beta/select/index.d.cts +2 -0
  17. package/build/cjs/{components-beta → components/beta}/select/types.d.cts +1 -1
  18. package/build/cjs/components/breadcrumb/types.d.cts +1 -1
  19. package/build/cjs/components/card/Card.cjs +1 -1
  20. package/build/cjs/components/card/Card.cjs.map +1 -1
  21. package/build/cjs/components/card/types.cjs +1 -1
  22. package/build/cjs/components/card/types.cjs.map +1 -1
  23. package/build/cjs/components/card/types.d.cts +2 -2
  24. package/build/cjs/components/checkbox/Checkbox.cjs +1 -1
  25. package/build/cjs/components/checkbox/Checkbox.cjs.map +1 -1
  26. package/build/cjs/components/checkbox/types.d.cts +1 -1
  27. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  28. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  29. package/build/cjs/components/cookie-consent/CookieConsent.d.cts +1 -1
  30. package/build/cjs/components/cookie-consent/types.d.cts +5 -1
  31. package/build/cjs/components/datepicker/DatePicker.cjs +1 -1
  32. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  33. package/build/cjs/components/datepicker/types.d.cts +1 -1
  34. package/build/cjs/components/description-list/index.cjs +1 -1
  35. package/build/cjs/components/description-list/index.d.cts +3 -3
  36. package/build/cjs/components/description-list/types.d.cts +1 -1
  37. package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
  38. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  39. package/build/cjs/components/feedback/feedbackContext.cjs.map +1 -1
  40. package/build/cjs/components/feedback/feedbackContext.d.cts +1 -1
  41. package/build/cjs/components/feedback/followup/followupContext.cjs.map +1 -1
  42. package/build/cjs/components/feedback/followup/followupContext.d.cts +1 -1
  43. package/build/cjs/components/feedback/main-question/mainQuestionContext.cjs.map +1 -1
  44. package/build/cjs/components/feedback/main-question/mainQuestionContext.d.cts +1 -1
  45. package/build/cjs/components/feedback/questions/smileyUtils.cjs.map +1 -1
  46. package/build/cjs/components/file-input/internal/Dropzone.cjs.map +1 -1
  47. package/build/cjs/components/file-input/internal/Dropzone.d.cts +1 -1
  48. package/build/cjs/components/file-input/internal/fileInputContext.cjs.map +1 -1
  49. package/build/cjs/components/file-input/internal/fileInputContext.d.cts +1 -1
  50. package/build/cjs/components/icon/development/internal/IconsExampleGrid.d.cts +1 -1
  51. package/build/cjs/components/input-group/InputGroup.d.cts +2 -2
  52. package/build/cjs/components/input-group/types.d.cts +1 -1
  53. package/build/cjs/components/link/Link.cjs +1 -1
  54. package/build/cjs/components/link/Link.cjs.map +1 -1
  55. package/build/cjs/components/link/Link.d.cts +2 -2
  56. package/build/cjs/components/link/types.d.cts +1 -4
  57. package/build/cjs/components/link-list/LinkList.d.cts +1 -1
  58. package/build/cjs/components/list/ListItem.cjs.map +1 -1
  59. package/build/cjs/components/list/ListItem.d.cts +1 -1
  60. package/build/cjs/components/logo/types.d.cts +1 -1
  61. package/build/cjs/components/menu/types.d.cts +1 -1
  62. package/build/cjs/components/modal/Modal.cjs +1 -1
  63. package/build/cjs/components/modal/Modal.cjs.map +1 -1
  64. package/build/cjs/components/modal/Modal.d.cts +2 -9
  65. package/build/cjs/components/modal/index.d.cts +1 -1
  66. package/build/cjs/components/modal/types.d.cts +19 -1
  67. package/build/cjs/components/nav-link/index.cjs +1 -1
  68. package/build/cjs/components/nav-link/index.d.cts +2 -2
  69. package/build/cjs/components/popover/Popover.cjs +1 -1
  70. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  71. package/build/cjs/components/radio-button/BaseRadioButton.cjs +1 -1
  72. package/build/cjs/components/radio-button/BaseRadioButton.cjs.map +1 -1
  73. package/build/cjs/components/radio-button/radioGroupContext.cjs.map +1 -1
  74. package/build/cjs/components/radio-button/radioGroupContext.d.cts +1 -1
  75. package/build/cjs/components/screen-reader-only/types.d.cts +1 -1
  76. package/build/cjs/components/select/index.cjs +1 -1
  77. package/build/cjs/components/select/index.d.cts +2 -2
  78. package/build/cjs/components/select/types.d.cts +1 -1
  79. package/build/cjs/components/system-message/types.d.cts +1 -1
  80. package/build/cjs/components/table/types.d.cts +1 -1
  81. package/build/cjs/components/table-of-contents/TableOfContents.d.cts +1 -1
  82. package/build/cjs/components/tabs/types.d.cts +1 -1
  83. package/build/cjs/components/toast/types.d.cts +1 -1
  84. package/build/cjs/components/toggle-switch/types.d.cts +1 -1
  85. package/build/cjs/components/tooltip/Tooltip.cjs.map +1 -1
  86. package/build/cjs/components/tooltip/Tooltip.d.cts +1 -1
  87. package/build/cjs/hooks/useAnimatedHeight/types.d.cts +1 -1
  88. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs +1 -1
  89. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs.map +1 -1
  90. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs +1 -1
  91. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs.map +1 -1
  92. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs +1 -1
  93. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs.map +1 -1
  94. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.d.cts +1 -1
  95. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.d.cts +1 -1
  96. package/build/cjs/hooks/useBrowserPreferences/useBrowserPreferences.cjs.map +1 -1
  97. package/build/cjs/hooks/useBrowserPreferences/useBrowserPreferences.d.cts +1 -1
  98. package/build/cjs/hooks/useScreen/useScreen.cjs +1 -1
  99. package/build/cjs/hooks/useScreen/useScreen.cjs.map +1 -1
  100. package/build/cjs/tailwind/plugins/jokulTypographyPlugin.cjs +1 -1
  101. package/build/cjs/tailwind/plugins/jokulTypographyPlugin.cjs.map +1 -1
  102. package/build/cjs/tailwind/tailwindPreset.cjs +1 -1
  103. package/build/cjs/tailwind/tailwindPreset.cjs.map +1 -1
  104. package/build/cjs/tokens.cjs +2 -0
  105. package/build/cjs/tokens.cjs.map +1 -0
  106. package/build/cjs/tokens.d.cts +235 -0
  107. package/build/cjs/utilities/getThemeAndSize.cjs +1 -1
  108. package/build/cjs/utilities/getThemeAndSize.cjs.map +1 -1
  109. package/build/cjs/utilities/getThemeAndSize.d.cts +1 -1
  110. package/build/cjs/utilities/index.d.cts +1 -0
  111. package/build/cjs/{core → utilities}/types.d.cts +1 -1
  112. package/build/es/components/beta/description-list/DescriptionList.js +2 -0
  113. package/build/es/components/beta/description-list/DescriptionList.js.map +1 -0
  114. package/build/es/components/beta/description-list/DescriptionListItem.js +2 -0
  115. package/build/es/components/beta/description-list/DescriptionListItem.js.map +1 -0
  116. package/build/es/{components-beta → components/beta}/description-list/index.d.ts +2 -2
  117. package/build/es/components/beta/nav-link/NavLink.js +2 -0
  118. package/build/es/components/beta/nav-link/NavLink.js.map +1 -0
  119. package/build/es/components/beta/nav-link/index.d.ts +1 -0
  120. package/build/es/{components-beta → components/beta}/nav-link/types.d.ts +1 -1
  121. package/build/es/components/beta/select/Select.js +2 -0
  122. package/build/es/components/beta/select/Select.js.map +1 -0
  123. package/build/es/components/beta/select/index.d.ts +2 -0
  124. package/build/es/{components-beta → components/beta}/select/types.d.ts +1 -1
  125. package/build/es/components/breadcrumb/types.d.ts +1 -1
  126. package/build/es/components/card/Card.js +1 -1
  127. package/build/es/components/card/Card.js.map +1 -1
  128. package/build/es/components/card/types.d.ts +2 -2
  129. package/build/es/components/card/types.js +1 -1
  130. package/build/es/components/card/types.js.map +1 -1
  131. package/build/es/components/checkbox/Checkbox.js +1 -1
  132. package/build/es/components/checkbox/Checkbox.js.map +1 -1
  133. package/build/es/components/checkbox/types.d.ts +1 -1
  134. package/build/es/components/cookie-consent/CookieConsent.d.ts +1 -1
  135. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  136. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  137. package/build/es/components/cookie-consent/types.d.ts +5 -1
  138. package/build/es/components/datepicker/DatePicker.js +1 -1
  139. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  140. package/build/es/components/datepicker/types.d.ts +1 -1
  141. package/build/es/components/description-list/index.d.ts +3 -3
  142. package/build/es/components/description-list/index.js +1 -1
  143. package/build/es/components/description-list/types.d.ts +1 -1
  144. package/build/es/components/expander/ExpandablePanel.js +1 -1
  145. package/build/es/components/expander/ExpandablePanel.js.map +1 -1
  146. package/build/es/components/feedback/feedbackContext.d.ts +1 -1
  147. package/build/es/components/feedback/feedbackContext.js.map +1 -1
  148. package/build/es/components/feedback/followup/followupContext.d.ts +1 -1
  149. package/build/es/components/feedback/followup/followupContext.js.map +1 -1
  150. package/build/es/components/feedback/main-question/mainQuestionContext.d.ts +1 -1
  151. package/build/es/components/feedback/main-question/mainQuestionContext.js.map +1 -1
  152. package/build/es/components/feedback/questions/smileyUtils.js.map +1 -1
  153. package/build/es/components/file-input/internal/Dropzone.d.ts +1 -1
  154. package/build/es/components/file-input/internal/Dropzone.js.map +1 -1
  155. package/build/es/components/file-input/internal/fileInputContext.d.ts +1 -1
  156. package/build/es/components/file-input/internal/fileInputContext.js.map +1 -1
  157. package/build/es/components/icon/development/internal/IconsExampleGrid.d.ts +1 -1
  158. package/build/es/components/input-group/InputGroup.d.ts +2 -2
  159. package/build/es/components/input-group/types.d.ts +1 -1
  160. package/build/es/components/link/Link.d.ts +2 -2
  161. package/build/es/components/link/Link.js +1 -1
  162. package/build/es/components/link/Link.js.map +1 -1
  163. package/build/es/components/link/types.d.ts +1 -4
  164. package/build/es/components/link-list/LinkList.d.ts +1 -1
  165. package/build/es/components/list/ListItem.d.ts +1 -1
  166. package/build/es/components/list/ListItem.js.map +1 -1
  167. package/build/es/components/logo/types.d.ts +1 -1
  168. package/build/es/components/menu/types.d.ts +1 -1
  169. package/build/es/components/modal/Modal.d.ts +2 -9
  170. package/build/es/components/modal/Modal.js +1 -1
  171. package/build/es/components/modal/Modal.js.map +1 -1
  172. package/build/es/components/modal/index.d.ts +1 -1
  173. package/build/es/components/modal/types.d.ts +19 -1
  174. package/build/es/components/nav-link/index.d.ts +2 -2
  175. package/build/es/components/nav-link/index.js +1 -1
  176. package/build/es/components/popover/Popover.js +1 -1
  177. package/build/es/components/popover/Popover.js.map +1 -1
  178. package/build/es/components/radio-button/BaseRadioButton.js +1 -1
  179. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -1
  180. package/build/es/components/radio-button/radioGroupContext.d.ts +1 -1
  181. package/build/es/components/radio-button/radioGroupContext.js.map +1 -1
  182. package/build/es/components/screen-reader-only/types.d.ts +1 -1
  183. package/build/es/components/select/index.d.ts +2 -2
  184. package/build/es/components/select/index.js +1 -1
  185. package/build/es/components/select/types.d.ts +1 -1
  186. package/build/es/components/system-message/types.d.ts +1 -1
  187. package/build/es/components/table/types.d.ts +1 -1
  188. package/build/es/components/table-of-contents/TableOfContents.d.ts +1 -1
  189. package/build/es/components/tabs/types.d.ts +1 -1
  190. package/build/es/components/toast/types.d.ts +1 -1
  191. package/build/es/components/toggle-switch/types.d.ts +1 -1
  192. package/build/es/components/tooltip/Tooltip.d.ts +1 -1
  193. package/build/es/components/tooltip/Tooltip.js.map +1 -1
  194. package/build/es/hooks/useAnimatedHeight/types.d.ts +1 -1
  195. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js +1 -1
  196. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js.map +1 -1
  197. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js +1 -1
  198. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js.map +1 -1
  199. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.d.ts +1 -1
  200. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js +1 -1
  201. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js.map +1 -1
  202. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.d.ts +1 -1
  203. package/build/es/hooks/useBrowserPreferences/useBrowserPreferences.d.ts +1 -1
  204. package/build/es/hooks/useBrowserPreferences/useBrowserPreferences.js.map +1 -1
  205. package/build/es/hooks/useScreen/useScreen.js +1 -1
  206. package/build/es/hooks/useScreen/useScreen.js.map +1 -1
  207. package/build/es/tailwind/plugins/jokulTypographyPlugin.js +1 -1
  208. package/build/es/tailwind/plugins/jokulTypographyPlugin.js.map +1 -1
  209. package/build/es/tailwind/tailwindPreset.js +1 -1
  210. package/build/es/tailwind/tailwindPreset.js.map +1 -1
  211. package/build/es/tokens.d.ts +235 -0
  212. package/build/es/tokens.js +2 -0
  213. package/build/es/tokens.js.map +1 -0
  214. package/build/es/utilities/getThemeAndSize.d.ts +1 -1
  215. package/build/es/utilities/getThemeAndSize.js +1 -1
  216. package/build/es/utilities/getThemeAndSize.js.map +1 -1
  217. package/build/es/utilities/index.d.ts +1 -0
  218. package/build/es/{core → utilities}/types.d.ts +1 -1
  219. package/codemods/__tests__/import-paths.test.mjs +84 -0
  220. package/codemods/import-paths.mjs +393 -0
  221. package/package.json +12 -585
  222. package/styles/base.css +1822 -0
  223. package/styles/base.min.css +2 -0
  224. package/styles/components/autosuggest/autosuggest.css +6 -12
  225. package/styles/components/autosuggest/autosuggest.min.css +1 -1
  226. package/styles/components/autosuggest/autosuggest.scss +3 -3
  227. package/styles/{components-beta → components/beta}/description-list/description-list.css +1 -1
  228. package/styles/{components-beta → components/beta}/description-list/description-list.min.css +1 -1
  229. package/styles/{components-beta → components/beta}/description-list/description-list.scss +2 -2
  230. package/styles/{components-beta → components/beta}/nav-link/navlink.css +11 -14
  231. package/styles/components/beta/nav-link/navlink.min.css +1 -0
  232. package/styles/{components-beta → components/beta}/nav-link/navlink.scss +4 -4
  233. package/styles/components/beta/select/_index.scss +3 -0
  234. package/styles/{components-beta → components/beta}/select/select.css +13 -16
  235. package/styles/components/beta/select/select.min.css +1 -0
  236. package/styles/{components-beta → components/beta}/select/select.scss +9 -9
  237. package/styles/components/breadcrumb/breadcrumb.css +1 -1
  238. package/styles/components/breadcrumb/breadcrumb.min.css +1 -1
  239. package/styles/components/breadcrumb/breadcrumb.scss +1 -1
  240. package/styles/components/button/button.css +15 -14
  241. package/styles/components/button/button.min.css +1 -1
  242. package/styles/components/button/button.scss +14 -14
  243. package/styles/components/card/card.css +8 -11
  244. package/styles/components/card/card.min.css +1 -1
  245. package/styles/components/card/card.scss +7 -11
  246. package/styles/components/checkbox/checkbox.css +55 -42
  247. package/styles/components/checkbox/checkbox.min.css +1 -1
  248. package/styles/components/checkbox/checkbox.scss +43 -36
  249. package/styles/components/checkbox-panel/checkbox-panel.css +84 -72
  250. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  251. package/styles/components/checkbox-panel/checkbox-panel.scss +5 -1
  252. package/styles/components/checkbox-panel/development/styles.scss +1 -1
  253. package/styles/components/chip/chip.css +6 -9
  254. package/styles/components/chip/chip.min.css +1 -1
  255. package/styles/components/chip/chip.scss +3 -3
  256. package/styles/components/combobox/combobox.css +30 -39
  257. package/styles/components/combobox/combobox.min.css +1 -1
  258. package/styles/components/combobox/combobox.scss +10 -8
  259. package/styles/components/cookie-consent/cookie-consent.css +1 -5
  260. package/styles/components/cookie-consent/cookie-consent.min.css +1 -1
  261. package/styles/components/cookie-consent/cookie-consent.scss +1 -1
  262. package/styles/components/countdown/countdown.css +4 -4
  263. package/styles/components/countdown/countdown.min.css +1 -1
  264. package/styles/components/datepicker/_calendar-date-button.scss +9 -9
  265. package/styles/components/datepicker/_calendar-navigation-dropdown.scss +3 -3
  266. package/styles/components/datepicker/_calendar-navigation.scss +1 -1
  267. package/styles/components/datepicker/_calendar-table.scss +1 -1
  268. package/styles/components/datepicker/_calendar.scss +7 -8
  269. package/styles/components/datepicker/datepicker.css +27 -31
  270. package/styles/components/datepicker/datepicker.min.css +1 -1
  271. package/styles/components/datepicker/datepicker.scss +1 -1
  272. package/styles/components/description-list/description-list.css +2 -2
  273. package/styles/components/description-list/description-list.min.css +1 -1
  274. package/styles/components/description-list/description-list.scss +3 -3
  275. package/styles/components/expander/expandable.css +20 -20
  276. package/styles/components/expander/expandable.min.css +1 -1
  277. package/styles/components/expander/expandable.scss +16 -20
  278. package/styles/components/feedback/feedback.css +14 -20
  279. package/styles/components/feedback/feedback.min.css +1 -1
  280. package/styles/components/feedback/feedback.scss +5 -10
  281. package/styles/components/file/file.css +10 -18
  282. package/styles/components/file/file.min.css +1 -1
  283. package/styles/components/file/file.scss +7 -7
  284. package/styles/components/file-input/file-input.css +52 -70
  285. package/styles/components/file-input/file-input.min.css +1 -1
  286. package/styles/components/file-input/file-input.scss +4 -4
  287. package/styles/components/help/help.css +2 -2
  288. package/styles/components/help/help.min.css +1 -1
  289. package/styles/components/help/help.scss +3 -3
  290. package/styles/components/icon/_base-styles.scss +3 -5
  291. package/styles/components/icon/icon.css +13 -34
  292. package/styles/components/icon/icon.min.css +1 -1
  293. package/styles/components/icon/icon.scss +5 -19
  294. package/styles/components/icon-button/icon-button.css +3 -3
  295. package/styles/components/icon-button/icon-button.min.css +1 -1
  296. package/styles/components/icon-button/icon-button.scss +1 -1
  297. package/styles/components/image/image.css +2 -2
  298. package/styles/components/image/image.min.css +1 -1
  299. package/styles/components/image/image.scss +1 -1
  300. package/styles/components/input-group/_field-group.scss +1 -1
  301. package/styles/components/input-group/_labels.scss +1 -1
  302. package/styles/components/input-group/input-group.css +12 -27
  303. package/styles/components/input-group/input-group.min.css +1 -1
  304. package/styles/components/input-group/input-group.scss +1 -1
  305. package/styles/components/input-panel/input-panel.css +26 -30
  306. package/styles/components/input-panel/input-panel.min.css +1 -1
  307. package/styles/components/input-panel/input-panel.scss +22 -20
  308. package/styles/components/link/link.css +7 -8
  309. package/styles/components/link/link.min.css +1 -1
  310. package/styles/components/link/link.scss +1 -2
  311. package/styles/components/link-list/link-list.css +17 -23
  312. package/styles/components/link-list/link-list.min.css +1 -1
  313. package/styles/components/link-list/link-list.scss +7 -3
  314. package/styles/components/list/list.css +6 -27
  315. package/styles/components/list/list.min.css +1 -1
  316. package/styles/components/list/list.scss +11 -15
  317. package/styles/components/loader/loader.css +6 -6
  318. package/styles/components/loader/loader.min.css +1 -1
  319. package/styles/components/loader/loader.scss +1 -1
  320. package/styles/components/loader/skeleton-loader.css +4 -4
  321. package/styles/components/loader/skeleton-loader.min.css +1 -1
  322. package/styles/components/loader/skeleton-loader.scss +2 -2
  323. package/styles/components/logo/logo.css +4 -4
  324. package/styles/components/logo/logo.min.css +1 -1
  325. package/styles/components/logo/logo.scss +1 -1
  326. package/styles/components/menu/_menu-divider.scss +2 -2
  327. package/styles/components/menu/_menu-item.scss +1 -1
  328. package/styles/components/menu/menu.css +8 -23
  329. package/styles/components/menu/menu.min.css +1 -1
  330. package/styles/components/menu/menu.scss +8 -12
  331. package/styles/components/message/message.css +25 -27
  332. package/styles/components/message/message.min.css +1 -1
  333. package/styles/components/message/message.scss +17 -7
  334. package/styles/components/modal/_layout.scss +22 -0
  335. package/styles/components/modal/_modal-base.scss +32 -0
  336. package/styles/components/modal/_motion.scss +45 -0
  337. package/styles/components/modal/_overlay.scss +20 -0
  338. package/styles/components/modal/_parts.scss +33 -0
  339. package/styles/components/modal/_placement.scss +59 -0
  340. package/styles/components/modal/modal.css +120 -42
  341. package/styles/components/modal/modal.min.css +1 -1
  342. package/styles/components/modal/modal.scss +6 -95
  343. package/styles/components/nav-link/nav-link.css +5 -5
  344. package/styles/components/nav-link/nav-link.min.css +1 -1
  345. package/styles/components/nav-link/nav-link.scss +2 -2
  346. package/styles/components/pagination/development/styles.scss +1 -1
  347. package/styles/components/pagination/pagination.css +2 -2
  348. package/styles/components/pagination/pagination.min.css +1 -1
  349. package/styles/components/pagination/pagination.scss +1 -1
  350. package/styles/components/popover/popover.css +17 -18
  351. package/styles/components/popover/popover.min.css +1 -1
  352. package/styles/components/popover/popover.scss +21 -11
  353. package/styles/components/progress-bar/progress-bar.css +29 -5
  354. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  355. package/styles/components/progress-bar/progress-bar.scss +6 -1
  356. package/styles/components/radio-button/radio-button.css +53 -36
  357. package/styles/components/radio-button/radio-button.min.css +1 -1
  358. package/styles/components/radio-button/radio-button.scss +40 -31
  359. package/styles/components/radio-panel/development/styles.scss +1 -1
  360. package/styles/components/radio-panel/radio-panel.css +29 -30
  361. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  362. package/styles/components/radio-panel/radio-panel.scss +5 -1
  363. package/styles/components/search/search-with-submit-button.css +3 -3
  364. package/styles/components/search/search-with-submit-button.min.css +1 -1
  365. package/styles/components/search/search-with-submit-button.scss +2 -2
  366. package/styles/components/search/search.css +10 -16
  367. package/styles/components/search/search.min.css +1 -1
  368. package/styles/components/search/search.scss +2 -2
  369. package/styles/components/segmented-control/segmented-control.css +91 -114
  370. package/styles/components/segmented-control/segmented-control.min.css +1 -1
  371. package/styles/components/segmented-control/segmented-control.scss +5 -5
  372. package/styles/components/select/select.css +27 -36
  373. package/styles/components/select/select.min.css +1 -1
  374. package/styles/components/select/select.scss +13 -14
  375. package/styles/components/summary-table/development/summary-table-example.scss +1 -1
  376. package/styles/components/summary-table/summary-table.css +5 -8
  377. package/styles/components/summary-table/summary-table.min.css +1 -1
  378. package/styles/components/summary-table/summary-table.scss +5 -5
  379. package/styles/components/system-message/system-message.css +22 -15
  380. package/styles/components/system-message/system-message.min.css +1 -1
  381. package/styles/components/system-message/system-message.scss +18 -9
  382. package/styles/components/table/_table-caption.scss +1 -1
  383. package/styles/components/table/_table-cell.scss +1 -1
  384. package/styles/components/table/_table-head.scss +3 -13
  385. package/styles/components/table/_table-header.scss +4 -4
  386. package/styles/components/table/_table-pagination.scss +1 -1
  387. package/styles/components/table/_table-row.scss +3 -3
  388. package/styles/components/table/table.css +20 -48
  389. package/styles/components/table/table.min.css +1 -1
  390. package/styles/components/table/table.scss +1 -1
  391. package/styles/components/table-of-contents/table-of-contents.css +4 -8
  392. package/styles/components/table-of-contents/table-of-contents.min.css +1 -1
  393. package/styles/components/table-of-contents/table-of-contents.scss +2 -2
  394. package/styles/components/tabs/tabs.css +9 -12
  395. package/styles/components/tabs/tabs.min.css +1 -1
  396. package/styles/components/tabs/tabs.scss +3 -3
  397. package/styles/components/tag/tag.css +18 -11
  398. package/styles/components/tag/tag.min.css +1 -1
  399. package/styles/components/tag/tag.scss +18 -8
  400. package/styles/components/text-area/text-area.css +17 -26
  401. package/styles/components/text-area/text-area.min.css +1 -1
  402. package/styles/components/text-area/text-area.scss +1 -1
  403. package/styles/components/text-input/text-input.css +12 -18
  404. package/styles/components/text-input/text-input.min.css +1 -1
  405. package/styles/components/text-input/text-input.scss +2 -3
  406. package/styles/components/toast/toast.css +21 -20
  407. package/styles/components/toast/toast.min.css +1 -1
  408. package/styles/components/toast/toast.scss +16 -14
  409. package/styles/components/toggle-switch/_toggle-slider.scss +5 -5
  410. package/styles/components/toggle-switch/toggle-switch.css +21 -29
  411. package/styles/components/toggle-switch/toggle-switch.min.css +2 -2
  412. package/styles/components/toggle-switch/toggle-switch.scss +10 -17
  413. package/styles/components/tooltip/tooltip.css +7 -11
  414. package/styles/components/tooltip/tooltip.min.css +1 -1
  415. package/styles/components/tooltip/tooltip.scss +4 -4
  416. package/styles/{styles.css → components.css} +801 -872
  417. package/styles/components.min.css +3 -0
  418. package/styles/{styles.scss → components.scss} +2 -2
  419. package/styles/{core/global → global}/_base-class.scss +6 -4
  420. package/styles/{core/global → global}/_top-layer.scss +1 -1
  421. package/styles/hooks/stories/styles.scss +7 -9
  422. package/styles/{core/jkl/_theme.scss → jkl/_forced-colors.scss} +0 -49
  423. package/styles/{core/jkl → jkl}/_index.scss +3 -6
  424. package/styles/{core/jkl → jkl}/_motion.scss +8 -26
  425. package/styles/{core/jkl → jkl}/_ornaments.scss +1 -1
  426. package/styles/{core/jkl → jkl}/_reset.scss +2 -2
  427. package/styles/{core/jkl → jkl}/_spacing.scss +1 -6
  428. package/styles/jkl/_tokens.scss +386 -0
  429. package/styles/{core/jkl → jkl}/_typography.scss +5 -98
  430. package/styles/shared/input/shared-input-styles.scss +7 -7
  431. package/styles/shared/track/track.scss +3 -3
  432. package/styles/tailwind.css +213 -0
  433. package/styles/theme/_color-scheme.scss +153 -0
  434. package/styles/{core/theme → theme}/_dynamic-spacing.scss +9 -5
  435. package/styles/theme/_fonts.scss +147 -0
  436. package/styles/theme/_index.scss +8 -0
  437. package/styles/theme/_size.scss +53 -0
  438. package/styles/theme/_tokens.scss +94 -0
  439. package/styles/theme/brands/dnb/_color-scheme.scss +119 -0
  440. package/styles/theme/brands/eika/_color-scheme.scss +119 -0
  441. package/styles/theme/brands/sparebank1/_color-scheme.scss +119 -0
  442. package/styles/{core/utility → utility}/_headings.scss +1 -1
  443. package/styles/utility/_paragraphs.scss +24 -0
  444. package/styles/{core/utility → utility}/_screen-reader.scss +1 -1
  445. package/styles/{core/utility → utility}/_spacing.scss +4 -3
  446. package/build/cjs/components-beta/description-list/DescriptionList.cjs +0 -2
  447. package/build/cjs/components-beta/description-list/DescriptionList.cjs.map +0 -1
  448. package/build/cjs/components-beta/description-list/DescriptionListItem.cjs +0 -2
  449. package/build/cjs/components-beta/description-list/DescriptionListItem.cjs.map +0 -1
  450. package/build/cjs/components-beta/nav-link/NavLink.cjs +0 -2
  451. package/build/cjs/components-beta/nav-link/NavLink.cjs.map +0 -1
  452. package/build/cjs/components-beta/nav-link/index.d.cts +0 -1
  453. package/build/cjs/components-beta/select/Select.cjs +0 -2
  454. package/build/cjs/components-beta/select/Select.cjs.map +0 -1
  455. package/build/cjs/components-beta/select/index.d.cts +0 -2
  456. package/build/cjs/core/index.cjs +0 -2
  457. package/build/cjs/core/index.cjs.map +0 -1
  458. package/build/cjs/core/index.d.cts +0 -2
  459. package/build/cjs/core/tokens/build-tailwind-4.cjs +0 -2
  460. package/build/cjs/core/tokens/build-tailwind-4.cjs.map +0 -1
  461. package/build/cjs/core/tokens/build-tailwind-4.d.cts +0 -1
  462. package/build/cjs/core/tokens/style-dictionary/build.cjs +0 -2
  463. package/build/cjs/core/tokens/style-dictionary/build.cjs.map +0 -1
  464. package/build/cjs/core/tokens/style-dictionary/build.d.cts +0 -0
  465. package/build/cjs/core/tokens/style-dictionary/config.cjs +0 -2
  466. package/build/cjs/core/tokens/style-dictionary/config.cjs.map +0 -1
  467. package/build/cjs/core/tokens/style-dictionary/config.d.cts +0 -4
  468. package/build/cjs/core/tokens/style-dictionary/filters/index.cjs +0 -2
  469. package/build/cjs/core/tokens/style-dictionary/filters/index.cjs.map +0 -1
  470. package/build/cjs/core/tokens/style-dictionary/filters/index.d.cts +0 -3
  471. package/build/cjs/core/tokens/style-dictionary/formats/css-dynamic-color-variables.cjs +0 -2
  472. package/build/cjs/core/tokens/style-dictionary/formats/css-dynamic-color-variables.cjs.map +0 -1
  473. package/build/cjs/core/tokens/style-dictionary/formats/css-dynamic-color-variables.d.cts +0 -3
  474. package/build/cjs/core/tokens/style-dictionary/formats/css-theme-variables.cjs +0 -2
  475. package/build/cjs/core/tokens/style-dictionary/formats/css-theme-variables.cjs.map +0 -1
  476. package/build/cjs/core/tokens/style-dictionary/formats/css-theme-variables.d.cts +0 -3
  477. package/build/cjs/core/tokens/style-dictionary/formats/index.cjs +0 -2
  478. package/build/cjs/core/tokens/style-dictionary/formats/index.cjs.map +0 -1
  479. package/build/cjs/core/tokens/style-dictionary/formats/index.d.cts +0 -6
  480. package/build/cjs/core/tokens/style-dictionary/formats/javascript-esm.cjs +0 -2
  481. package/build/cjs/core/tokens/style-dictionary/formats/javascript-esm.cjs.map +0 -1
  482. package/build/cjs/core/tokens/style-dictionary/formats/javascript-esm.d.cts +0 -3
  483. package/build/cjs/core/tokens/style-dictionary/formats/scss-theme-variables.cjs +0 -2
  484. package/build/cjs/core/tokens/style-dictionary/formats/scss-theme-variables.cjs.map +0 -1
  485. package/build/cjs/core/tokens/style-dictionary/formats/scss-theme-variables.d.cts +0 -3
  486. package/build/cjs/core/tokens/style-dictionary/formats/tailwindcss-colors.cjs +0 -2
  487. package/build/cjs/core/tokens/style-dictionary/formats/tailwindcss-colors.cjs.map +0 -1
  488. package/build/cjs/core/tokens/style-dictionary/formats/tailwindcss-colors.d.cts +0 -3
  489. package/build/cjs/core/tokens/style-dictionary/register.cjs +0 -2
  490. package/build/cjs/core/tokens/style-dictionary/register.cjs.map +0 -1
  491. package/build/cjs/core/tokens/style-dictionary/register.d.cts +0 -1
  492. package/build/cjs/core/tokens/style-dictionary/transforms/index.cjs +0 -2
  493. package/build/cjs/core/tokens/style-dictionary/transforms/index.cjs.map +0 -1
  494. package/build/cjs/core/tokens/style-dictionary/transforms/index.d.cts +0 -2
  495. package/build/cjs/core/tokens/style-dictionary/transforms/strip-light-dark.cjs +0 -2
  496. package/build/cjs/core/tokens/style-dictionary/transforms/strip-light-dark.cjs.map +0 -1
  497. package/build/cjs/core/tokens/style-dictionary/transforms/strip-light-dark.d.cts +0 -3
  498. package/build/cjs/index.cjs +0 -2
  499. package/build/cjs/index.cjs.map +0 -1
  500. package/build/cjs/index.d.cts +0 -3
  501. package/build/es/components-beta/description-list/DescriptionList.js +0 -2
  502. package/build/es/components-beta/description-list/DescriptionList.js.map +0 -1
  503. package/build/es/components-beta/description-list/DescriptionListItem.js +0 -2
  504. package/build/es/components-beta/description-list/DescriptionListItem.js.map +0 -1
  505. package/build/es/components-beta/nav-link/NavLink.js +0 -2
  506. package/build/es/components-beta/nav-link/NavLink.js.map +0 -1
  507. package/build/es/components-beta/nav-link/index.d.ts +0 -1
  508. package/build/es/components-beta/select/Select.js +0 -2
  509. package/build/es/components-beta/select/Select.js.map +0 -1
  510. package/build/es/components-beta/select/index.d.ts +0 -2
  511. package/build/es/core/index.d.ts +0 -2
  512. package/build/es/core/index.js +0 -2
  513. package/build/es/core/index.js.map +0 -1
  514. package/build/es/core/tokens/build-tailwind-4.d.ts +0 -1
  515. package/build/es/core/tokens/build-tailwind-4.js +0 -2
  516. package/build/es/core/tokens/build-tailwind-4.js.map +0 -1
  517. package/build/es/core/tokens/style-dictionary/build.d.ts +0 -0
  518. package/build/es/core/tokens/style-dictionary/build.js +0 -2
  519. package/build/es/core/tokens/style-dictionary/build.js.map +0 -1
  520. package/build/es/core/tokens/style-dictionary/config.d.ts +0 -4
  521. package/build/es/core/tokens/style-dictionary/config.js +0 -2
  522. package/build/es/core/tokens/style-dictionary/config.js.map +0 -1
  523. package/build/es/core/tokens/style-dictionary/filters/index.d.ts +0 -3
  524. package/build/es/core/tokens/style-dictionary/filters/index.js +0 -2
  525. package/build/es/core/tokens/style-dictionary/filters/index.js.map +0 -1
  526. package/build/es/core/tokens/style-dictionary/formats/css-dynamic-color-variables.d.ts +0 -3
  527. package/build/es/core/tokens/style-dictionary/formats/css-dynamic-color-variables.js +0 -2
  528. package/build/es/core/tokens/style-dictionary/formats/css-dynamic-color-variables.js.map +0 -1
  529. package/build/es/core/tokens/style-dictionary/formats/css-theme-variables.d.ts +0 -3
  530. package/build/es/core/tokens/style-dictionary/formats/css-theme-variables.js +0 -2
  531. package/build/es/core/tokens/style-dictionary/formats/css-theme-variables.js.map +0 -1
  532. package/build/es/core/tokens/style-dictionary/formats/index.d.ts +0 -6
  533. package/build/es/core/tokens/style-dictionary/formats/index.js +0 -2
  534. package/build/es/core/tokens/style-dictionary/formats/index.js.map +0 -1
  535. package/build/es/core/tokens/style-dictionary/formats/javascript-esm.d.ts +0 -3
  536. package/build/es/core/tokens/style-dictionary/formats/javascript-esm.js +0 -2
  537. package/build/es/core/tokens/style-dictionary/formats/javascript-esm.js.map +0 -1
  538. package/build/es/core/tokens/style-dictionary/formats/scss-theme-variables.d.ts +0 -3
  539. package/build/es/core/tokens/style-dictionary/formats/scss-theme-variables.js +0 -2
  540. package/build/es/core/tokens/style-dictionary/formats/scss-theme-variables.js.map +0 -1
  541. package/build/es/core/tokens/style-dictionary/formats/tailwindcss-colors.d.ts +0 -3
  542. package/build/es/core/tokens/style-dictionary/formats/tailwindcss-colors.js +0 -2
  543. package/build/es/core/tokens/style-dictionary/formats/tailwindcss-colors.js.map +0 -1
  544. package/build/es/core/tokens/style-dictionary/register.d.ts +0 -1
  545. package/build/es/core/tokens/style-dictionary/register.js +0 -2
  546. package/build/es/core/tokens/style-dictionary/register.js.map +0 -1
  547. package/build/es/core/tokens/style-dictionary/transforms/index.d.ts +0 -2
  548. package/build/es/core/tokens/style-dictionary/transforms/index.js +0 -2
  549. package/build/es/core/tokens/style-dictionary/transforms/index.js.map +0 -1
  550. package/build/es/core/tokens/style-dictionary/transforms/strip-light-dark.d.ts +0 -3
  551. package/build/es/core/tokens/style-dictionary/transforms/strip-light-dark.js +0 -2
  552. package/build/es/core/tokens/style-dictionary/transforms/strip-light-dark.js.map +0 -1
  553. package/build/es/index.d.ts +0 -3
  554. package/build/es/index.js +0 -2
  555. package/build/es/index.js.map +0 -1
  556. package/build/index-Ck94bTpt.cjs +0 -2
  557. package/build/index-Ck94bTpt.cjs.map +0 -1
  558. package/build/index-DOHQmuhD.js +0 -2
  559. package/build/index-DOHQmuhD.js.map +0 -1
  560. package/src/fonts/styles/_index.scss +0 -1
  561. package/src/fonts/styles/webfonts.scss +0 -145
  562. package/src/tailwind/v4/jokul-tailwind.css +0 -266
  563. package/styles/components-beta/nav-link/navlink.min.css +0 -1
  564. package/styles/components-beta/select/_index.scss +0 -3
  565. package/styles/components-beta/select/select.min.css +0 -1
  566. package/styles/core/core.css +0 -1731
  567. package/styles/core/core.min.css +0 -2
  568. package/styles/core/jkl/_colors.scss +0 -26
  569. package/styles/core/jkl/_helpers.scss +0 -26
  570. package/styles/core/jkl/legacy/_index.scss +0 -2
  571. package/styles/core/theme/_index.scss +0 -10
  572. package/styles/core/theme/_old-vars.scss +0 -21
  573. package/styles/core/theme/_shape.scss +0 -12
  574. package/styles/core/theme/_spacing.scss +0 -64
  575. package/styles/core/theme/_typography.scss +0 -38
  576. package/styles/core/utility/_paragraphs.scss +0 -29
  577. package/styles/fonts/_index.scss +0 -1
  578. package/styles/fonts/webfonts.css +0 -115
  579. package/styles/fonts/webfonts.min.css +0 -1
  580. package/styles/fonts/webfonts.scss +0 -145
  581. package/styles/styles.min.css +0 -3
  582. /package/build/cjs/{components-beta → components/beta}/description-list/DescriptionList.d.cts +0 -0
  583. /package/build/cjs/{components-beta → components/beta}/description-list/DescriptionListItem.d.cts +0 -0
  584. /package/build/cjs/{components-beta → components/beta}/description-list/index.cjs +0 -0
  585. /package/build/cjs/{components-beta → components/beta}/description-list/index.cjs.map +0 -0
  586. /package/build/cjs/{components-beta → components/beta}/description-list/types.cjs +0 -0
  587. /package/build/cjs/{components-beta → components/beta}/description-list/types.cjs.map +0 -0
  588. /package/build/cjs/{components-beta → components/beta}/description-list/types.d.cts +0 -0
  589. /package/build/cjs/{components-beta → components/beta}/nav-link/NavLink.d.cts +0 -0
  590. /package/build/cjs/{components-beta → components/beta}/nav-link/index.cjs +0 -0
  591. /package/build/cjs/{components-beta → components/beta}/nav-link/index.cjs.map +0 -0
  592. /package/build/cjs/{components-beta → components/beta}/nav-link/types.cjs +0 -0
  593. /package/build/cjs/{components-beta → components/beta}/nav-link/types.cjs.map +0 -0
  594. /package/build/cjs/{components-beta → components/beta}/select/Select.d.cts +0 -0
  595. /package/build/cjs/{components-beta → components/beta}/select/index.cjs +0 -0
  596. /package/build/cjs/{components-beta → components/beta}/select/index.cjs.map +0 -0
  597. /package/build/cjs/{components-beta → components/beta}/select/types.cjs +0 -0
  598. /package/build/cjs/{components-beta → components/beta}/select/types.cjs.map +0 -0
  599. /package/build/cjs/{core → utilities}/types.cjs +0 -0
  600. /package/build/cjs/{core → utilities}/types.cjs.map +0 -0
  601. /package/build/es/{components-beta → components/beta}/description-list/DescriptionList.d.ts +0 -0
  602. /package/build/es/{components-beta → components/beta}/description-list/DescriptionListItem.d.ts +0 -0
  603. /package/build/es/{components-beta → components/beta}/description-list/index.js +0 -0
  604. /package/build/es/{components-beta → components/beta}/description-list/index.js.map +0 -0
  605. /package/build/es/{components-beta → components/beta}/description-list/types.d.ts +0 -0
  606. /package/build/es/{components-beta → components/beta}/description-list/types.js +0 -0
  607. /package/build/es/{components-beta → components/beta}/description-list/types.js.map +0 -0
  608. /package/build/es/{components-beta → components/beta}/nav-link/NavLink.d.ts +0 -0
  609. /package/build/es/{components-beta → components/beta}/nav-link/index.js +0 -0
  610. /package/build/es/{components-beta → components/beta}/nav-link/index.js.map +0 -0
  611. /package/build/es/{components-beta → components/beta}/nav-link/types.js +0 -0
  612. /package/build/es/{components-beta → components/beta}/nav-link/types.js.map +0 -0
  613. /package/build/es/{components-beta → components/beta}/select/Select.d.ts +0 -0
  614. /package/build/es/{components-beta → components/beta}/select/index.js +0 -0
  615. /package/build/es/{components-beta → components/beta}/select/index.js.map +0 -0
  616. /package/build/es/{components-beta → components/beta}/select/types.js +0 -0
  617. /package/build/es/{components-beta → components/beta}/select/types.js.map +0 -0
  618. /package/build/es/{core → utilities}/types.js +0 -0
  619. /package/build/es/{core → utilities}/types.js.map +0 -0
  620. /package/styles/{core/_layers.scss → _layers.scss} +0 -0
  621. /package/styles/{core/core.scss → base.scss} +0 -0
  622. /package/styles/{components-beta → components/beta}/description-list/_index.scss +0 -0
  623. /package/styles/{components-beta → components/beta}/nav-link/_index.scss +0 -0
  624. /package/styles/{core/global → global}/_index.scss +0 -0
  625. /package/styles/{core/jkl → jkl}/_convert.scss +0 -0
  626. /package/styles/{core/jkl → jkl}/_navigation.scss +0 -0
  627. /package/styles/{core/jkl → jkl}/_responsive-units.scss +0 -0
  628. /package/styles/{core/jkl → jkl}/_screenreader.scss +0 -0
  629. /package/styles/{core/jkl → jkl}/_screens.scss +0 -0
  630. /package/styles/{core/jkl → jkl}/_shadows.scss +0 -0
  631. /package/styles/{core/jkl → jkl}/_underline.scss +0 -0
  632. /package/styles/{core/jkl → jkl}/_z-index.scss +0 -0
  633. /package/styles/{core/resets → resets}/_index.scss +0 -0
  634. /package/styles/{core/resets → resets}/_normalize.scss +0 -0
  635. /package/styles/{core/resets → resets}/_reset.scss +0 -0
  636. /package/styles/{core/utility → utility}/_index.scss +0 -0
@@ -1,4 +1,4 @@
1
1
  export { NavLink } from './NavLink.js';
2
2
  export type { NavLinkProps } from './types.js';
3
- export { NavLink as BETA_NavLink } from '../../components-beta/nav-link/NavLink.js';
4
- export type { NavLinkProps as BETA_NavLinkProps } from '../../components-beta/nav-link/types.js';
3
+ export { NavLink as BETA_NavLink } from '../beta/nav-link/NavLink.jsx';
4
+ export type { NavLinkProps as BETA_NavLinkProps } from '../beta/nav-link/types.js';
@@ -1,2 +1,2 @@
1
- import{NavLink as a}from"./NavLink.js";import{NavLink as n}from"../../components-beta/nav-link/NavLink.js";export{n as BETA_NavLink,a as NavLink};
1
+ import{NavLink as a}from"./NavLink.js";import{NavLink as i}from"../beta/nav-link/NavLink.js";export{i as BETA_NavLink,a as NavLink};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{useMergeRefs as t,FloatingPortal as n,FloatingFocusManager as o,useFloating as s,autoUpdate as r,offset as a,flip as i,shift as l,useClick as c,useHover as u,useFocus as d,useDismiss as p,useRole as f,useInteractions as m}from"@floating-ui/react";import{c as g}from"../../../clsx-BeLtu-UY.js";import*as h from"react";import{getThemeAndSize as v}from"../../utilities/getThemeAndSize.js";const x=h.createContext(null),F=()=>{const e=h.useContext(x);if(null==e)throw new Error("Popover komponenter må brukes innenfor en <Popover /> komponent");return e},R=({children:t,...n})=>{const o=(({open:e,onOpenChange:t,placement:n="bottom-start",strategy:o="absolute",modal:g=!0,offset:v=4,positionReference:x,hoverOptions:F,focusOptions:R,clickOptions:b,roleOptions:k,dismissOptions:C})=>{const[O,P]=h.useState(e),E=e??O,j=t??P,y=s({open:E,onOpenChange:j,placement:n,strategy:o,middleware:[a(v),i({padding:5,fallbackPlacements:["bottom","top"]}),l({padding:12})],whileElementsMounted:r}),w=y.context,z=c(w,{enabled:!1,...b}),M=u(w,{enabled:!1,...F}),S=d(w,{enabled:!1,...R}),T=p(w,C),A=f(w,k),N=m([z,T,S,M,A]);return h.useLayoutEffect(()=>{x&&y.refs.setPositionReference(x?.current)},[x,y.refs]),h.useMemo(()=>({open:E,onOpenChange:j,modal:g,...N,...y}),[E,j,g,N,y])})({...n});return e(x.Provider,{value:o,children:t})},b=h.forwardRef(function({children:n,asChild:o=!1,...s},r){const{refs:a,getReferenceProps:i,open:l,onOpenChange:c}=F(),u=n.ref,d=t([a.setReference,r,u]);return o&&h.isValidElement(n)?h.cloneElement(n,i({ref:d,...s,...n.props})):e("button",{ref:d,onClick:()=>c?.(!l),"aria-expanded":l,...i(s),children:n})}),k=h.forwardRef(function({style:s,className:r,padding:a=0,initialFocus:i=0,returnFocus:l=!0,...c},u){const{context:d,modal:p,refs:f,open:m,floatingStyles:x,getFloatingProps:R}=F(),b=t([f.setFloating,u]),k=f.reference.current,{theme:C,size:O}=v((E=k)&&"contextElement"in E?k.contextElement:k),P=h.useRef(null);var E;return h.useEffect(()=>{P.current=d.elements.domReference?.closest("[data-portal]")||document.body},[d.elements.domReference]),m?e(n,{root:P.current,children:e(o,{context:d,modal:p,initialFocus:i,returnFocus:l,children:e("div",{"data-theme":C,"data-size":O,className:g("jkl jkl-popover",r),ref:b,style:{...s,...x,"--popover-padding":`var(--jkl-spacing-${a})`},...R(c),children:c.children})})}):null});R.Trigger=b,R.Content=k;export{R as Popover,R as default};
1
+ import{jsx as e}from"react/jsx-runtime";import{useMergeRefs as t,FloatingPortal as n,FloatingFocusManager as o,useFloating as s,autoUpdate as r,offset as a,flip as i,shift as l,useClick as c,useHover as u,useFocus as p,useDismiss as d,useRole as f,useInteractions as m}from"@floating-ui/react";import{c as g}from"../../../clsx-BeLtu-UY.js";import*as h from"react";import{getThemeAndSize as v}from"../../utilities/getThemeAndSize.js";const x=h.createContext(null),k=()=>{const e=h.useContext(x);if(null==e)throw new Error("Popover komponenter må brukes innenfor en <Popover /> komponent");return e},F=({children:t,...n})=>{const o=(({open:e,onOpenChange:t,placement:n="bottom-start",strategy:o="absolute",modal:g=!0,offset:v=4,positionReference:x,hoverOptions:k,focusOptions:F,clickOptions:R,roleOptions:b,dismissOptions:C})=>{const[O,P]=h.useState(e),j=e??O,E=t??P,y=s({open:j,onOpenChange:E,placement:n,strategy:o,middleware:[a(v),i({padding:5,fallbackPlacements:["bottom","top"]}),l({padding:12})],whileElementsMounted:r}),w=y.context,z=c(w,{enabled:!1,...R}),M=u(w,{enabled:!1,...k}),N=p(w,{enabled:!1,...F}),S=d(w,C),T=f(w,b),A=m([z,S,N,M,T]);return h.useLayoutEffect(()=>{x&&y.refs.setPositionReference(x?.current)},[x,y.refs]),h.useMemo(()=>({open:j,onOpenChange:E,modal:g,...A,...y}),[j,E,g,A,y])})({...n});return e(x.Provider,{value:o,children:t})},R=h.forwardRef(function({children:n,asChild:o=!1,...s},r){const{refs:a,getReferenceProps:i,open:l,onOpenChange:c}=k(),u=n.ref,p=t([a.setReference,r,u]);return o&&h.isValidElement(n)?h.cloneElement(n,i({ref:p,...s,...n.props})):e("button",{ref:p,onClick:()=>c?.(!l),"aria-expanded":l,...i({...s,className:g("jkl-popover-trigger",s.className)}),children:n})}),b=h.forwardRef(function({style:s,className:r,padding:a=0,initialFocus:i=0,returnFocus:l=!0,...c},u){const{context:p,modal:d,refs:f,open:m,floatingStyles:x,getFloatingProps:F}=k(),R=t([f.setFloating,u]),b=f.reference.current,{theme:C,size:O}=v((j=b)&&"contextElement"in j?b.contextElement:b),P=h.useRef(null);var j;return h.useEffect(()=>{P.current=p.elements.domReference?.closest("[data-portal]")||document.body},[p.elements.domReference]),m?e(n,{root:P.current,children:e(o,{context:p,modal:d,initialFocus:i,returnFocus:l,children:e("div",{"data-theme":C,"data-size":O,className:g("jkl jkl-popover",r),ref:R,style:{...s,...x,"--popover-padding":`var(--jkl-spacing-${a})`},...F(c),children:c.children})})}):null});F.Trigger=R,F.Content=b;export{F as Popover,F as default};
2
2
  //# sourceMappingURL=Popover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.js","sources":["../../../../src/components/popover/Popover.tsx"],"sourcesContent":["import {\n FloatingFocusManager,\n FloatingPortal,\n type ReferenceElement,\n type VirtualElement,\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useMergeRefs,\n useRole,\n} from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport { getThemeAndSize } from \"../../utilities/getThemeAndSize.js\";\nimport type { PopoverOptions } from \"./types.js\";\n\nconst usePopover = ({\n open: _open,\n onOpenChange: _onOpenChange,\n placement = \"bottom-start\",\n strategy = \"absolute\",\n modal = true,\n offset: _offset = 4,\n positionReference,\n hoverOptions,\n focusOptions,\n clickOptions,\n roleOptions,\n dismissOptions,\n}: PopoverOptions) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(_open);\n\n const open = _open ?? uncontrolledOpen;\n const onOpenChange = _onOpenChange ?? setUncontrolledOpen;\n\n const data = useFloating({\n open,\n onOpenChange,\n placement,\n strategy,\n middleware: [\n offset(_offset),\n flip({ padding: 5, fallbackPlacements: [\"bottom\", \"top\"] }),\n shift({ padding: 12 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const context = data.context;\n\n const click = useClick(context, {\n enabled: false,\n ...clickOptions,\n });\n const hover = useHover(context, { enabled: false, ...hoverOptions });\n const focus = useFocus(context, { enabled: false, ...focusOptions });\n const dismiss = useDismiss(context, dismissOptions);\n const role = useRole(context, roleOptions);\n\n const interactions = useInteractions([click, dismiss, focus, hover, role]);\n\n React.useLayoutEffect(() => {\n if (positionReference) {\n data.refs.setPositionReference(positionReference?.current);\n }\n }, [positionReference, data.refs]);\n\n return React.useMemo(\n () => ({\n open,\n onOpenChange,\n modal,\n ...interactions,\n ...data,\n }),\n [open, onOpenChange, modal, interactions, data],\n );\n};\n\ntype PopoverContextType = ReturnType<typeof usePopover> | null;\n\nconst PopoverContext = React.createContext<PopoverContextType>(null);\n\nconst usePopoverContext = () => {\n const context = React.useContext(PopoverContext);\n\n if (context == null) {\n throw new Error(\n \"Popover komponenter må brukes innenfor en <Popover /> komponent\",\n );\n }\n\n return context;\n};\n\nexport const Popover = ({\n children,\n ...restOptions\n}: {\n children: React.ReactNode;\n} & PopoverOptions) => {\n const popover = usePopover({ ...restOptions });\n return (\n <PopoverContext.Provider value={popover}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\ninterface PopoverTriggerProps {\n children: React.ReactNode;\n /**\n * Rendrer komponenten som child-elementet sitt, og slår sammen egenskaper og props.\n *\n * Default er `false`.\n *\n * @example\n * ```tsx\n * <Component asChild foo=\"bar\">\n * <Child baz=\"qux\" />\n * </Component>\n *\n * // Rendrer følgende:\n * <Child foo=\"bar\" baz=\"qux\" />\n * ```\n */\n asChild?: boolean;\n}\n\nconst PopoverTrigger = React.forwardRef<\n HTMLElement,\n React.HTMLProps<HTMLElement> & PopoverTriggerProps\n>(function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const { refs, getReferenceProps, open, onOpenChange } = usePopoverContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([refs.setReference, propRef, childrenRef]);\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n ...props,\n ...children.props,\n }),\n );\n }\n\n return (\n <button\n ref={ref}\n onClick={() => onOpenChange?.(!open)}\n aria-expanded={open}\n {...getReferenceProps(props)}\n >\n {children}\n </button>\n );\n});\n\ninterface PopoverContentProps {\n /**\n * Padding rundt innholdet i popoveren.\n *\n * Default er `0`.\n */\n padding?: 0 | 8 | 16 | 24;\n /**\n *\n * Angir hvilket element som skal motta fokus ved åpning.\n * Kan være en tabbar index eller en referanse til et element.\"\n *\n * Default er `0`, som betyr at det første fokuserbare elementet i popoveren får fokus.\n * @see https://floating-ui.com/docs/FloatingFocusManager#initialfocus\n */\n initialFocus?: number | React.RefObject<HTMLElement>;\n /**\n * Angir om fokus skal returneres til triggeren når popoveren lukkes.\n *\n * Default er `true`.\n * @see https://floating-ui.com/docs/FloatingFocusManager#returnfocus\n */\n returnFocus?: boolean;\n}\n\n// Er popover-elementet posisjonert i forhold til et annet element enn triggeren?\nconst isCustomPositioned = (\n referenceElement: ReferenceElement,\n): referenceElement is VirtualElement => {\n if (!referenceElement) return false;\n\n return \"contextElement\" in referenceElement;\n};\n\nconst PopoverContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLProps<HTMLDivElement> & PopoverContentProps\n>(function PopoverContent(\n {\n style,\n className,\n padding = 0,\n initialFocus = 0,\n returnFocus = true,\n ...props\n },\n propRef,\n) {\n const { context, modal, refs, open, floatingStyles, getFloatingProps } =\n usePopoverContext();\n const ref = useMergeRefs([refs.setFloating, propRef]);\n\n const referenceElement = refs.reference.current as ReferenceElement;\n\n const { theme, size } = isCustomPositioned(referenceElement)\n ? getThemeAndSize(referenceElement.contextElement)\n : getThemeAndSize(referenceElement);\n\n const floatingPortalRef = React.useRef<HTMLElement | null>(null);\n\n // TODO: Løser et problem hvor nestede portaler ikke \"fester\" seg til det nærmeste portal-elementet. Fjernes når alle komponenter som rendres i en portal tar i bruk popover komponenten da den håndterer dette internt. Issue: https://github.com/fremtind/jokul/issues/4356\n React.useEffect(() => {\n floatingPortalRef.current =\n context.elements.domReference?.closest<HTMLElement>(\n \"[data-portal]\",\n ) || document.body;\n }, [context.elements.domReference]);\n\n if (!open) return null;\n\n return (\n <FloatingPortal root={floatingPortalRef.current}>\n <FloatingFocusManager\n context={context}\n modal={modal}\n initialFocus={initialFocus}\n returnFocus={returnFocus}\n >\n <div\n data-theme={theme}\n data-size={size}\n className={clsx(\"jkl jkl-popover\", className)}\n ref={ref}\n style={\n {\n ...style,\n ...floatingStyles,\n \"--popover-padding\": `var(--jkl-spacing-${padding})`,\n } as React.CSSProperties\n }\n {...getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n );\n});\n\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n\nexport default Popover;\n"],"names":["PopoverContext","React","createContext","usePopoverContext","context","useContext","Error","Popover","children","restOptions","popover","open","_open","onOpenChange","_onOpenChange","placement","strategy","modal","offset","_offset","positionReference","hoverOptions","focusOptions","clickOptions","roleOptions","dismissOptions","uncontrolledOpen","setUncontrolledOpen","useState","data","useFloating","middleware","flip","padding","fallbackPlacements","shift","whileElementsMounted","autoUpdate","click","useClick","enabled","hover","useHover","focus","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","useLayoutEffect","refs","setPositionReference","current","useMemo","usePopover","Provider","value","PopoverTrigger","forwardRef","asChild","props","propRef","getReferenceProps","childrenRef","ref","useMergeRefs","setReference","isValidElement","cloneElement","jsx","onClick","PopoverContent","style","className","initialFocus","returnFocus","floatingStyles","getFloatingProps","setFloating","referenceElement","reference","theme","size","getThemeAndSize","contextElement","floatingPortalRef","useRef","useEffect","elements","domReference","closest","document","body","FloatingPortal","root","FloatingFocusManager","clsx","Trigger","Content"],"mappings":"ibAuBA,MAiEMA,EAAiBC,EAAMC,cAAkC,MAEzDC,EAAoB,KACtB,MAAMC,EAAUH,EAAMI,WAAWL,GAEjC,GAAe,MAAXI,EACA,MAAM,IAAIE,MACN,mEAIR,OAAOF,GAGEG,EAAU,EACnBC,SAAAA,KACGC,MAIH,MAAMC,EArFS,GACfC,KAAMC,EACNC,aAAcC,EACdC,UAAAA,EAAY,eACZC,SAAAA,EAAW,WACXC,MAAAA,GAAQ,EACRC,OAAQC,EAAU,EAClBC,kBAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,eAAAA,MAEA,MAAOC,EAAkBC,GAAuB1B,EAAM2B,SAAShB,GAEzDD,EAAOC,GAASc,EAChBb,EAAeC,GAAiBa,EAEhCE,EAAOC,EAAY,CACrBnB,KAAAA,EACAE,aAAAA,EACAE,UAAAA,EACAC,SAAAA,EACAe,WAAY,CACRb,EAAOC,GACPa,EAAK,CAAEC,QAAS,EAAGC,mBAAoB,CAAC,SAAU,SAClDC,EAAM,CAAEF,QAAS,MAErBG,qBAAsBC,IAGpBjC,EAAUyB,EAAKzB,QAEfkC,EAAQC,EAASnC,EAAS,CAC5BoC,SAAS,KACNjB,IAEDkB,EAAQC,EAAStC,EAAS,CAAEoC,SAAS,KAAUnB,IAC/CsB,EAAQC,EAASxC,EAAS,CAAEoC,SAAS,KAAUlB,IAC/CuB,EAAUC,EAAW1C,EAASqB,GAC9BsB,EAAOC,EAAQ5C,EAASoB,GAExByB,EAAeC,EAAgB,CAACZ,EAAOO,EAASF,EAAOF,EAAOM,IAEpE,OAAA9C,EAAMkD,gBAAgB,KACd/B,GACAS,EAAKuB,KAAKC,qBAAqBjC,GAAmBkC,UAEvD,CAAClC,EAAmBS,EAAKuB,OAErBnD,EAAMsD,QACT,KAAA,CACI5C,KAAAA,EACAE,aAAAA,EACAI,MAAAA,KACGgC,KACApB,IAEP,CAAClB,EAAME,EAAcI,EAAOgC,EAAcpB,KA0B9B2B,CAAW,IAAK/C,IAChC,SACKT,EAAeyD,SAAf,CAAwBC,MAAOhD,EAC3BF,SAAAA,KAyBPmD,EAAiB1D,EAAM2D,WAG3B,UAA0BpD,SAAAA,EAAUqD,QAAAA,GAAU,KAAUC,GAASC,GAC/D,MAAQX,KAAAA,EAAMY,kBAAAA,EAAmBrD,KAAAA,EAAME,aAAAA,GAAiBV,IAClD8D,EAAezD,EAAiB0D,IAChCA,EAAMC,EAAa,CAACf,EAAKgB,aAAcL,EAASE,IAEtD,OAAIJ,GAAW5D,EAAMoE,eAAe7D,GACzBP,EAAMqE,aACT9D,EACAwD,EAAkB,CACdE,IAAAA,KACGJ,KACAtD,EAASsD,SAMpBS,EAAC,SAAA,CACGL,IAAAA,EACAM,QAAS,IAAM3D,KAAgBF,GAC/B,gBAAeA,KACXqD,EAAkBF,GAErBtD,SAAAA,GAGb,GAoCMiE,EAAiBxE,EAAM2D,WAG3B,UAEMc,MAAAA,EACAC,UAAAA,EACA1C,QAAAA,EAAU,EACV2C,aAAAA,EAAe,EACfC,YAAAA,GAAc,KACXf,GAEPC,GAEA,MAAQ3D,QAAAA,EAASa,MAAAA,EAAOmC,KAAAA,EAAMzC,KAAAA,EAAMmE,eAAAA,EAAgBC,iBAAAA,GAChD5E,IACE+D,EAAMC,EAAa,CAACf,EAAK4B,YAAajB,IAEtCkB,EAAmB7B,EAAK8B,UAAU5B,SAEhC6B,MAAAA,EAAOC,KAAAA,GACTC,GA5BNJ,EA2B2CA,IAvBpC,mBAAoBA,EAwBLA,EAAiBK,eACjBL,GAEhBM,EAAoBtF,EAAMuF,OAA2B,MAhCpC,IACvBP,EAyCA,OAPAhF,EAAMwF,UAAU,KACZF,EAAkBjC,QACdlD,EAAQsF,SAASC,cAAcC,QAC3B,kBACCC,SAASC,MACnB,CAAC1F,EAAQsF,SAASC,eAEhBhF,EAGD4D,EAACwB,EAAA,CAAeC,KAAMT,EAAkBjC,QACpC9C,SAAA+D,EAAC0B,EAAA,CACG7F,QAAAA,EACAa,MAAAA,EACA2D,aAAAA,EACAC,YAAAA,EAEArE,SAAA+D,EAAC,MAAA,CACG,aAAYY,EACZ,YAAWC,EACXT,UAAWuB,EAAK,kBAAmBvB,GACnCT,IAAAA,EACAQ,MACI,IACOA,KACAI,EACH,oBAAqB,qBAAqB7C,SAG9C8C,EAAiBjB,GAEpBtD,SAAAsD,EAAMtD,eAxBL,IA6BtB,GAEAD,EAAQ4F,QAAUxC,EAClBpD,EAAQ6F,QAAU3B"}
1
+ {"version":3,"file":"Popover.js","sources":["../../../../src/components/popover/Popover.tsx"],"sourcesContent":["import {\n FloatingFocusManager,\n FloatingPortal,\n type ReferenceElement,\n type VirtualElement,\n autoUpdate,\n flip,\n offset,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useMergeRefs,\n useRole,\n} from \"@floating-ui/react\";\nimport clsx from \"clsx\";\nimport * as React from \"react\";\nimport { getThemeAndSize } from \"../../utilities/getThemeAndSize.js\";\nimport type { PopoverOptions } from \"./types.js\";\n\nconst usePopover = ({\n open: _open,\n onOpenChange: _onOpenChange,\n placement = \"bottom-start\",\n strategy = \"absolute\",\n modal = true,\n offset: _offset = 4,\n positionReference,\n hoverOptions,\n focusOptions,\n clickOptions,\n roleOptions,\n dismissOptions,\n}: PopoverOptions) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(_open);\n\n const open = _open ?? uncontrolledOpen;\n const onOpenChange = _onOpenChange ?? setUncontrolledOpen;\n\n const data = useFloating({\n open,\n onOpenChange,\n placement,\n strategy,\n middleware: [\n offset(_offset),\n flip({ padding: 5, fallbackPlacements: [\"bottom\", \"top\"] }),\n shift({ padding: 12 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const context = data.context;\n\n const click = useClick(context, {\n enabled: false,\n ...clickOptions,\n });\n const hover = useHover(context, { enabled: false, ...hoverOptions });\n const focus = useFocus(context, { enabled: false, ...focusOptions });\n const dismiss = useDismiss(context, dismissOptions);\n const role = useRole(context, roleOptions);\n\n const interactions = useInteractions([click, dismiss, focus, hover, role]);\n\n React.useLayoutEffect(() => {\n if (positionReference) {\n data.refs.setPositionReference(positionReference?.current);\n }\n }, [positionReference, data.refs]);\n\n return React.useMemo(\n () => ({\n open,\n onOpenChange,\n modal,\n ...interactions,\n ...data,\n }),\n [open, onOpenChange, modal, interactions, data],\n );\n};\n\ntype PopoverContextType = ReturnType<typeof usePopover> | null;\n\nconst PopoverContext = React.createContext<PopoverContextType>(null);\n\nconst usePopoverContext = () => {\n const context = React.useContext(PopoverContext);\n\n if (context == null) {\n throw new Error(\n \"Popover komponenter må brukes innenfor en <Popover /> komponent\",\n );\n }\n\n return context;\n};\n\nexport const Popover = ({\n children,\n ...restOptions\n}: {\n children: React.ReactNode;\n} & PopoverOptions) => {\n const popover = usePopover({ ...restOptions });\n return (\n <PopoverContext.Provider value={popover}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\ninterface PopoverTriggerProps {\n children: React.ReactNode;\n /**\n * Rendrer komponenten som child-elementet sitt, og slår sammen egenskaper og props.\n *\n * Default er `false`.\n *\n * @example\n * ```tsx\n * <Component asChild foo=\"bar\">\n * <Child baz=\"qux\" />\n * </Component>\n *\n * // Rendrer følgende:\n * <Child foo=\"bar\" baz=\"qux\" />\n * ```\n */\n asChild?: boolean;\n}\n\nconst PopoverTrigger = React.forwardRef<\n HTMLElement,\n React.HTMLProps<HTMLElement> & PopoverTriggerProps\n>(function PopoverTrigger({ children, asChild = false, ...props }, propRef) {\n const { refs, getReferenceProps, open, onOpenChange } = usePopoverContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([refs.setReference, propRef, childrenRef]);\n\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n getReferenceProps({\n ref,\n ...props,\n ...children.props,\n }),\n );\n }\n\n return (\n <button\n ref={ref}\n onClick={() => onOpenChange?.(!open)}\n aria-expanded={open}\n {...getReferenceProps({\n ...props,\n className: clsx(\"jkl-popover-trigger\", props.className),\n })}\n >\n {children}\n </button>\n );\n});\n\ninterface PopoverContentProps {\n /**\n * Padding rundt innholdet i popoveren.\n *\n * Default er `0`.\n */\n padding?: 0 | 8 | 16 | 24;\n /**\n *\n * Angir hvilket element som skal motta fokus ved åpning.\n * Kan være en tabbar index eller en referanse til et element.\"\n *\n * Default er `0`, som betyr at det første fokuserbare elementet i popoveren får fokus.\n * @see https://floating-ui.com/docs/FloatingFocusManager#initialfocus\n */\n initialFocus?: number | React.RefObject<HTMLElement>;\n /**\n * Angir om fokus skal returneres til triggeren når popoveren lukkes.\n *\n * Default er `true`.\n * @see https://floating-ui.com/docs/FloatingFocusManager#returnfocus\n */\n returnFocus?: boolean;\n}\n\n// Er popover-elementet posisjonert i forhold til et annet element enn triggeren?\nconst isCustomPositioned = (\n referenceElement: ReferenceElement,\n): referenceElement is VirtualElement => {\n if (!referenceElement) return false;\n\n return \"contextElement\" in referenceElement;\n};\n\nconst PopoverContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLProps<HTMLDivElement> & PopoverContentProps\n>(function PopoverContent(\n {\n style,\n className,\n padding = 0,\n initialFocus = 0,\n returnFocus = true,\n ...props\n },\n propRef,\n) {\n const { context, modal, refs, open, floatingStyles, getFloatingProps } =\n usePopoverContext();\n const ref = useMergeRefs([refs.setFloating, propRef]);\n\n const referenceElement = refs.reference.current as ReferenceElement;\n\n const { theme, size } = isCustomPositioned(referenceElement)\n ? getThemeAndSize(referenceElement.contextElement)\n : getThemeAndSize(referenceElement);\n\n const floatingPortalRef = React.useRef<HTMLElement | null>(null);\n\n // TODO: Løser et problem hvor nestede portaler ikke \"fester\" seg til det nærmeste portal-elementet. Fjernes når alle komponenter som rendres i en portal tar i bruk popover komponenten da den håndterer dette internt. Issue: https://github.com/fremtind/jokul/issues/4356\n React.useEffect(() => {\n floatingPortalRef.current =\n context.elements.domReference?.closest<HTMLElement>(\n \"[data-portal]\",\n ) || document.body;\n }, [context.elements.domReference]);\n\n if (!open) return null;\n\n return (\n <FloatingPortal root={floatingPortalRef.current}>\n <FloatingFocusManager\n context={context}\n modal={modal}\n initialFocus={initialFocus}\n returnFocus={returnFocus}\n >\n <div\n data-theme={theme}\n data-size={size}\n className={clsx(\"jkl jkl-popover\", className)}\n ref={ref}\n style={\n {\n ...style,\n ...floatingStyles,\n \"--popover-padding\": `var(--jkl-spacing-${padding})`,\n } as React.CSSProperties\n }\n {...getFloatingProps(props)}\n >\n {props.children}\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n );\n});\n\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n\nexport default Popover;\n"],"names":["PopoverContext","React","createContext","usePopoverContext","context","useContext","Error","Popover","children","restOptions","popover","open","_open","onOpenChange","_onOpenChange","placement","strategy","modal","offset","_offset","positionReference","hoverOptions","focusOptions","clickOptions","roleOptions","dismissOptions","uncontrolledOpen","setUncontrolledOpen","useState","data","useFloating","middleware","flip","padding","fallbackPlacements","shift","whileElementsMounted","autoUpdate","click","useClick","enabled","hover","useHover","focus","useFocus","dismiss","useDismiss","role","useRole","interactions","useInteractions","useLayoutEffect","refs","setPositionReference","current","useMemo","usePopover","Provider","value","PopoverTrigger","forwardRef","asChild","props","propRef","getReferenceProps","childrenRef","ref","useMergeRefs","setReference","isValidElement","cloneElement","jsx","onClick","className","clsx","PopoverContent","style","initialFocus","returnFocus","floatingStyles","getFloatingProps","setFloating","referenceElement","reference","theme","size","getThemeAndSize","contextElement","floatingPortalRef","useRef","useEffect","elements","domReference","closest","document","body","FloatingPortal","root","FloatingFocusManager","Trigger","Content"],"mappings":"ibAuBA,MAiEMA,EAAiBC,EAAMC,cAAkC,MAEzDC,EAAoB,KACtB,MAAMC,EAAUH,EAAMI,WAAWL,GAEjC,GAAe,MAAXI,EACA,MAAM,IAAIE,MACN,mEAIR,OAAOF,GAGEG,EAAU,EACnBC,SAAAA,KACGC,MAIH,MAAMC,EArFS,GACfC,KAAMC,EACNC,aAAcC,EACdC,UAAAA,EAAY,eACZC,SAAAA,EAAW,WACXC,MAAAA,GAAQ,EACRC,OAAQC,EAAU,EAClBC,kBAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,eAAAA,MAEA,MAAOC,EAAkBC,GAAuB1B,EAAM2B,SAAShB,GAEzDD,EAAOC,GAASc,EAChBb,EAAeC,GAAiBa,EAEhCE,EAAOC,EAAY,CACrBnB,KAAAA,EACAE,aAAAA,EACAE,UAAAA,EACAC,SAAAA,EACAe,WAAY,CACRb,EAAOC,GACPa,EAAK,CAAEC,QAAS,EAAGC,mBAAoB,CAAC,SAAU,SAClDC,EAAM,CAAEF,QAAS,MAErBG,qBAAsBC,IAGpBjC,EAAUyB,EAAKzB,QAEfkC,EAAQC,EAASnC,EAAS,CAC5BoC,SAAS,KACNjB,IAEDkB,EAAQC,EAAStC,EAAS,CAAEoC,SAAS,KAAUnB,IAC/CsB,EAAQC,EAASxC,EAAS,CAAEoC,SAAS,KAAUlB,IAC/CuB,EAAUC,EAAW1C,EAASqB,GAC9BsB,EAAOC,EAAQ5C,EAASoB,GAExByB,EAAeC,EAAgB,CAACZ,EAAOO,EAASF,EAAOF,EAAOM,IAEpE,OAAA9C,EAAMkD,gBAAgB,KACd/B,GACAS,EAAKuB,KAAKC,qBAAqBjC,GAAmBkC,UAEvD,CAAClC,EAAmBS,EAAKuB,OAErBnD,EAAMsD,QACT,KAAA,CACI5C,KAAAA,EACAE,aAAAA,EACAI,MAAAA,KACGgC,KACApB,IAEP,CAAClB,EAAME,EAAcI,EAAOgC,EAAcpB,KA0B9B2B,CAAW,IAAK/C,IAChC,SACKT,EAAeyD,SAAf,CAAwBC,MAAOhD,EAC3BF,SAAAA,KAyBPmD,EAAiB1D,EAAM2D,WAG3B,UAA0BpD,SAAAA,EAAUqD,QAAAA,GAAU,KAAUC,GAASC,GAC/D,MAAQX,KAAAA,EAAMY,kBAAAA,EAAmBrD,KAAAA,EAAME,aAAAA,GAAiBV,IAClD8D,EAAezD,EAAiB0D,IAChCA,EAAMC,EAAa,CAACf,EAAKgB,aAAcL,EAASE,IAEtD,OAAIJ,GAAW5D,EAAMoE,eAAe7D,GACzBP,EAAMqE,aACT9D,EACAwD,EAAkB,CACdE,IAAAA,KACGJ,KACAtD,EAASsD,SAMpBS,EAAC,SAAA,CACGL,IAAAA,EACAM,QAAS,IAAM3D,KAAgBF,GAC/B,gBAAeA,KACXqD,EAAkB,IACfF,EACHW,UAAWC,EAAK,sBAAuBZ,EAAMW,aAGhDjE,SAAAA,GAGb,GAoCMmE,EAAiB1E,EAAM2D,WAG3B,UAEMgB,MAAAA,EACAH,UAAAA,EACAxC,QAAAA,EAAU,EACV4C,aAAAA,EAAe,EACfC,YAAAA,GAAc,KACXhB,GAEPC,GAEA,MAAQ3D,QAAAA,EAASa,MAAAA,EAAOmC,KAAAA,EAAMzC,KAAAA,EAAMoE,eAAAA,EAAgBC,iBAAAA,GAChD7E,IACE+D,EAAMC,EAAa,CAACf,EAAK6B,YAAalB,IAEtCmB,EAAmB9B,EAAK+B,UAAU7B,SAEhC8B,MAAAA,EAAOC,KAAAA,GACTC,GA5BNJ,EA2B2CA,IAvBpC,mBAAoBA,EAwBLA,EAAiBK,eACjBL,GAEhBM,EAAoBvF,EAAMwF,OAA2B,MAhCpC,IACvBP,EAyCA,OAPAjF,EAAMyF,UAAU,KACZF,EAAkBlC,QACdlD,EAAQuF,SAASC,cAAcC,QAC3B,kBACCC,SAASC,MACnB,CAAC3F,EAAQuF,SAASC,eAEhBjF,EAGD4D,EAACyB,EAAA,CAAeC,KAAMT,EAAkBlC,QACpC9C,SAAA+D,EAAC2B,EAAA,CACG9F,QAAAA,EACAa,MAAAA,EACA4D,aAAAA,EACAC,YAAAA,EAEAtE,SAAA+D,EAAC,MAAA,CACG,aAAYa,EACZ,YAAWC,EACXZ,UAAWC,EAAK,kBAAmBD,GACnCP,IAAAA,EACAU,MACI,IACOA,KACAG,EACH,oBAAqB,qBAAqB9C,SAG9C+C,EAAiBlB,GAEpBtD,SAAAsD,EAAMtD,eAxBL,IA6BtB,GAEAD,EAAQ4F,QAAUxC,EAClBpD,EAAQ6F,QAAUzB"}
@@ -1,2 +1,2 @@
1
- import{jsxs as a,jsx as e}from"react/jsx-runtime";import{c as i}from"../../../clsx-BeLtu-UY.js";import{forwardRef as t}from"react";import{useId as o}from"../../hooks/useId/useId.js";const r=t((t,r)=>{const{id:l,className:n,checked:s,children:d,label:u,inline:c,invalid:m,name:j,value:b,onChange:k,...f}=t,h=o(l||"jkl-radio-button",{generateSuffix:!l});return a("div",{className:i("jkl-radio-button",n,{"jkl-radio-button--inline":c,"jkl-radio-button--error":m}),children:[e("label",{"data-testid":"jkl-radio-button__label-tag",htmlFor:h,className:"jkl-radio-button__label",children:u||d}),e("input",{name:j,ref:r,...f,id:h,className:"jkl-radio-button__input",type:"radio",onChange:k,value:b,checked:s,"aria-invalid":m||f["aria-invalid"]})]})});r.displayName="BaseRadioButton";export{r as BaseRadioButton};
1
+ import{jsxs as a,jsx as e}from"react/jsx-runtime";import{c as i}from"../../../clsx-BeLtu-UY.js";import{forwardRef as t}from"react";import{useId as o}from"../../hooks/useId/useId.js";const r=t((t,r)=>{const{id:l,className:n,checked:s,children:d,label:u,inline:c,invalid:m,name:j,value:b,onChange:k,...f}=t,h=o(l||"jkl-radio-button",{generateSuffix:!l});return a("div",{className:i("jkl-radio-button",n,{"jkl-radio-button--inline":c,"jkl-radio-button--error":m}),children:[e("input",{name:j,ref:r,...f,id:h,className:"jkl-radio-button__input",type:"radio",onChange:k,value:b,checked:s,"aria-invalid":m||f["aria-invalid"]}),e("label",{"data-testid":"jkl-radio-button__label-tag",htmlFor:h,className:"jkl-radio-button__label",children:u||d})]})});r.displayName="BaseRadioButton";export{r as BaseRadioButton};
2
2
  //# sourceMappingURL=BaseRadioButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseRadioButton.js","sources":["../../../../src/components/radio-button/BaseRadioButton.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { forwardRef } from \"react\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport type { BaseRadioButtonProps } from \"./types.js\";\n\nexport const BaseRadioButton = forwardRef<\n HTMLInputElement,\n BaseRadioButtonProps\n>((props, ref) => {\n const {\n id,\n className,\n checked,\n children,\n label,\n inline,\n invalid,\n name,\n value,\n onChange,\n ...rest\n } = props;\n\n const inputId = useId(id || \"jkl-radio-button\", { generateSuffix: !id });\n\n return (\n <div\n className={clsx(\"jkl-radio-button\", className, {\n \"jkl-radio-button--inline\": inline,\n \"jkl-radio-button--error\": invalid,\n })}\n >\n <label\n data-testid=\"jkl-radio-button__label-tag\"\n htmlFor={inputId}\n className=\"jkl-radio-button__label\"\n >\n {label || children}\n </label>\n <input\n name={name}\n ref={ref}\n {...rest}\n id={inputId}\n className=\"jkl-radio-button__input\"\n type=\"radio\"\n onChange={onChange}\n value={value}\n checked={checked}\n aria-invalid={invalid || rest[\"aria-invalid\"]}\n />\n </div>\n );\n});\n\nBaseRadioButton.displayName = \"BaseRadioButton\";\n"],"names":["BaseRadioButton","forwardRef","props","ref","id","className","checked","children","label","inline","invalid","name","value","onChange","rest","inputId","useId","generateSuffix","jsxs","clsx","jsx","htmlFor","type","displayName"],"mappings":"sLAKO,MAAMA,EAAkBC,EAG7B,CAACC,EAAOC,KACN,MACIC,GAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,SAAAA,EACAC,MAAAA,EACAC,OAAAA,EACAC,QAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KACGC,GACHZ,EAEEa,EAAUC,EAAMZ,GAAM,mBAAoB,CAAEa,gBAAiBb,IAEnE,OACIc,EAAC,MAAA,CACGb,UAAWc,EAAK,mBAAoBd,EAAW,CAC3C,2BAA4BI,EAC5B,0BAA2BC,IAG/BH,SAAA,CAAAa,EAAC,QAAA,CACG,cAAY,8BACZC,QAASN,EACTV,UAAU,0BAETE,SAAAC,GAASD,IAEda,EAAC,QAAA,CACGT,KAAAA,EACAR,IAAAA,KACIW,EACJV,GAAIW,EACJV,UAAU,0BACViB,KAAK,QACLT,SAAAA,EACAD,MAAAA,EACAN,QAAAA,EACA,eAAcI,GAAWI,EAAK,uBAM9Cd,EAAgBuB,YAAc"}
1
+ {"version":3,"file":"BaseRadioButton.js","sources":["../../../../src/components/radio-button/BaseRadioButton.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { forwardRef } from \"react\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport type { BaseRadioButtonProps } from \"./types.js\";\n\nexport const BaseRadioButton = forwardRef<\n HTMLInputElement,\n BaseRadioButtonProps\n>((props, ref) => {\n const {\n id,\n className,\n checked,\n children,\n label,\n inline,\n invalid,\n name,\n value,\n onChange,\n ...rest\n } = props;\n\n const inputId = useId(id || \"jkl-radio-button\", { generateSuffix: !id });\n\n return (\n <div\n className={clsx(\"jkl-radio-button\", className, {\n \"jkl-radio-button--inline\": inline,\n \"jkl-radio-button--error\": invalid,\n })}\n >\n <input\n name={name}\n ref={ref}\n {...rest}\n id={inputId}\n className=\"jkl-radio-button__input\"\n type=\"radio\"\n onChange={onChange}\n value={value}\n checked={checked}\n aria-invalid={invalid || rest[\"aria-invalid\"]}\n />\n <label\n data-testid=\"jkl-radio-button__label-tag\"\n htmlFor={inputId}\n className=\"jkl-radio-button__label\"\n >\n {label || children}\n </label>\n </div>\n );\n});\n\nBaseRadioButton.displayName = \"BaseRadioButton\";\n"],"names":["BaseRadioButton","forwardRef","props","ref","id","className","checked","children","label","inline","invalid","name","value","onChange","rest","inputId","useId","generateSuffix","jsxs","clsx","jsx","type","htmlFor","displayName"],"mappings":"sLAKO,MAAMA,EAAkBC,EAG7B,CAACC,EAAOC,KACN,MACIC,GAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,SAAAA,EACAC,MAAAA,EACAC,OAAAA,EACAC,QAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,SAAAA,KACGC,GACHZ,EAEEa,EAAUC,EAAMZ,GAAM,mBAAoB,CAAEa,gBAAiBb,IAEnE,OACIc,EAAC,MAAA,CACGb,UAAWc,EAAK,mBAAoBd,EAAW,CAC3C,2BAA4BI,EAC5B,0BAA2BC,IAG/BH,SAAA,CAAAa,EAAC,QAAA,CACGT,KAAAA,EACAR,IAAAA,KACIW,EACJV,GAAIW,EACJV,UAAU,0BACVgB,KAAK,QACLR,SAAAA,EACAD,MAAAA,EACAN,QAAAA,EACA,eAAcI,GAAWI,EAAK,kBAElCM,EAAC,QAAA,CACG,cAAY,8BACZE,QAASP,EACTV,UAAU,0BAETE,SAAAC,GAASD,SAM1BP,EAAgBuB,YAAc"}
@@ -1,5 +1,5 @@
1
1
  import { default as React, ChangeEventHandler } from 'react';
2
- import { WithChildren } from '../../core/types.js';
2
+ import { WithChildren } from '../../utilities/types.js';
3
3
  type RadioGroupContext = {
4
4
  name: string | undefined;
5
5
  value: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"radioGroupContext.js","sources":["../../../../src/components/radio-button/radioGroupContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n type ChangeEventHandler,\n} from \"react\";\nimport type { WithChildren } from \"../../core/types.js\";\n\ntype RadioGroupContext = {\n name: string | undefined;\n value: string | undefined;\n inline: boolean;\n invalid: boolean;\n onChange: ChangeEventHandler<HTMLInputElement> | undefined;\n};\n\nconst radioGroupContext = createContext<RadioGroupContext>({\n name: undefined,\n value: undefined,\n onChange: () => {\n return;\n },\n inline: false,\n invalid: false,\n});\n\nexport const useRadioGroupContext = (): RadioGroupContext =>\n useContext(radioGroupContext);\n\ninterface Props extends WithChildren {\n state: RadioGroupContext;\n}\n\nexport const RadioGroupContextProvider: React.FC<Props> = ({\n state,\n children,\n}) => (\n <radioGroupContext.Provider value={state}>\n {children}\n </radioGroupContext.Provider>\n);\n"],"names":["radioGroupContext","createContext","name","value","onChange","inline","invalid","useRadioGroupContext","useContext","RadioGroupContextProvider","state","children","Provider"],"mappings":"8FAeA,MAAMA,EAAoBC,EAAiC,CACvDC,UAAM,EACNC,WAAO,EACPC,SAAU,OAGVC,QAAQ,EACRC,SAAS,IAGAC,EAAuB,IAChCC,EAAWR,GAMFS,EAA6C,EACtDC,MAAAA,EACAC,SAAAA,OAECX,EAAkBY,SAAlB,CAA2BT,MAAOO,EAC9BC,SAAAA"}
1
+ {"version":3,"file":"radioGroupContext.js","sources":["../../../../src/components/radio-button/radioGroupContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n type ChangeEventHandler,\n} from \"react\";\nimport type { WithChildren } from \"../../utilities/types.js\";\n\ntype RadioGroupContext = {\n name: string | undefined;\n value: string | undefined;\n inline: boolean;\n invalid: boolean;\n onChange: ChangeEventHandler<HTMLInputElement> | undefined;\n};\n\nconst radioGroupContext = createContext<RadioGroupContext>({\n name: undefined,\n value: undefined,\n onChange: () => {\n return;\n },\n inline: false,\n invalid: false,\n});\n\nexport const useRadioGroupContext = (): RadioGroupContext =>\n useContext(radioGroupContext);\n\ninterface Props extends WithChildren {\n state: RadioGroupContext;\n}\n\nexport const RadioGroupContextProvider: React.FC<Props> = ({\n state,\n children,\n}) => (\n <radioGroupContext.Provider value={state}>\n {children}\n </radioGroupContext.Provider>\n);\n"],"names":["radioGroupContext","createContext","name","value","onChange","inline","invalid","useRadioGroupContext","useContext","RadioGroupContextProvider","state","children","Provider"],"mappings":"8FAeA,MAAMA,EAAoBC,EAAiC,CACvDC,UAAM,EACNC,WAAO,EACPC,SAAU,OAGVC,QAAQ,EACRC,SAAS,IAGAC,EAAuB,IAChCC,EAAWR,GAMFS,EAA6C,EACtDC,MAAAA,EACAC,SAAAA,OAECX,EAAkBY,SAAlB,CAA2BT,MAAOO,EAC9BC,SAAAA"}
@@ -1,4 +1,4 @@
1
- import { WithChildren } from '../../core/types.js';
1
+ import { WithChildren } from '../../utilities/types.js';
2
2
  export interface ScreenReaderOnlyProps extends WithChildren {
3
3
  showOnFocus?: boolean;
4
4
  }
@@ -1,5 +1,5 @@
1
1
  export { Select } from './Select.js';
2
2
  export { NativeSelect } from './NativeSelect.js';
3
3
  export type { SelectProps, SelectChangeEventHandler, SelectPartialChangeEvent, NativeSelectProps, } from './types.js';
4
- export { Select as BETA_Select } from '../../components-beta/select/Select.js';
5
- export type { SelectProps as BETA_SelectProps } from '../../components-beta/select/types.js';
4
+ export { Select as BETA_Select } from '../beta/select/Select.jsx';
5
+ export type { SelectProps as BETA_SelectProps } from '../beta/select/types.js';
@@ -1,2 +1,2 @@
1
- import{Select as e}from"./Select.js";import{NativeSelect as t}from"./NativeSelect.js";import{Select as c}from"../../components-beta/select/Select.js";export{c as BETA_Select,t as NativeSelect,e as Select};
1
+ import{Select as e}from"./Select.js";import{NativeSelect as t}from"./NativeSelect.js";import{Select as a}from"../beta/select/Select.js";export{a as BETA_Select,t as NativeSelect,e as Select};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ChangeEvent, SelectHTMLAttributes } from 'react';
2
- import { DataTestAutoId } from '../../core/types.js';
2
+ import { DataTestAutoId } from '../../utilities/types.js';
3
3
  import { ValuePair } from '../../utilities/valuePair.js';
4
4
  import { LabelProps, InputGroupProps } from '../input-group/types.js';
5
5
  export interface NativeSelectProps extends Omit<InputGroupProps, "children">, SelectHTMLAttributes<HTMLSelectElement> {
@@ -1,4 +1,4 @@
1
- import { WithChildren } from '../../core/types.js';
1
+ import { WithChildren } from '../../utilities/types.js';
2
2
  export interface SystemMessageProps extends WithChildren {
3
3
  id?: string;
4
4
  className?: string;
@@ -1,5 +1,5 @@
1
1
  import { default as React, ChangeEventHandler, ColgroupHTMLAttributes, ColHTMLAttributes, HTMLAttributes, ReactNode, TableHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes } from 'react';
2
- import { WithChildren } from '../../core/types.js';
2
+ import { WithChildren } from '../../utilities/types.js';
3
3
  import { TableSortProps } from './utils.js';
4
4
  export interface DataTableProps extends TableHTMLAttributes<HTMLTableElement> {
5
5
  /** Beskrivelse av tabellen for skjermlesere */
@@ -2,5 +2,5 @@ import { default as React } from 'react';
2
2
  import { TableOfContentsProps } from './types.js';
3
3
  export declare const TableOfContents: {
4
4
  ({ label, className, ...rest }: TableOfContentsProps): React.JSX.Element;
5
- Link: React.ForwardRefExoticComponent<Omit<import('../../index.js').PolymorphicPropsWithRef<React.ElementType<any, keyof React.JSX.IntrinsicElements>>, "ref"> & React.RefAttributes<unknown>>;
5
+ Link: React.ForwardRefExoticComponent<Omit<import('../../utilities/index.js').PolymorphicPropsWithRef<React.ElementType<any, keyof React.JSX.IntrinsicElements>>, "ref"> & React.RefAttributes<unknown>>;
6
6
  };
@@ -1,5 +1,5 @@
1
- import { WithChildren } from '../../core/types.js';
2
1
  import { PolymorphicPropsWithRef } from '../../utilities/index.js';
2
+ import { WithChildren } from '../../utilities/types.js';
3
3
  export type NavTabProps<ElementType extends React.ElementType> = PolymorphicPropsWithRef<ElementType, {
4
4
  /**
5
5
  * Hook for å kunne stoppe default oppførsel ved tastaturnavigasjon.
@@ -1,6 +1,6 @@
1
1
  import { ToastOptions as StatelyToastOptions } from '@react-stately/toast';
2
2
  import { ReactNode } from 'react';
3
- import { WithChildren } from '../../core/types.js';
3
+ import { WithChildren } from '../../utilities/types.js';
4
4
  export type ToastContent = {
5
5
  content: ReactNode;
6
6
  title?: string;
@@ -1,6 +1,6 @@
1
1
  import { ButtonHTMLAttributes } from 'react';
2
- import { WithChildren } from '../../core/types.js';
3
2
  import { SwipeChangeHandler } from '../../hooks/useSwipeGesture/useSwipeGesture.js';
3
+ import { WithChildren } from '../../utilities/types.js';
4
4
  export interface ToggleSliderProps extends WithChildren {
5
5
  labels: [string, string];
6
6
  onToggle: (value: string) => void;
@@ -1,6 +1,6 @@
1
1
  import { UseFloatingReturn, useInteractions } from '@floating-ui/react';
2
2
  import { default as React, FC } from 'react';
3
- import { WithChildren } from '../../core/types.js';
3
+ import { WithChildren } from '../../utilities/types.js';
4
4
  import { TooltipProps } from './types.js';
5
5
  type UseTooltipReturn = {
6
6
  triggerOn: NonNullable<TooltipProps["triggerOn"]>;
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.js","sources":["../../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\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, {\n type FC,\n createContext,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport type { WithChildren } from \"../../core/types.js\";\nimport type { TooltipProps } from \"./types.js\";\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\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":"iUAqCA,MA8DMA,EAAiBC,EAA8B,MAExCC,EAAkBF,EAAeG,SAEjCC,EAAoB,KAC7B,MAAMC,EAAUC,EAAWN,GAE3B,GAAgB,OAAZK,EACA,MAAM,IAAIE,MACN,0DAIR,OAAOF,GAGEG,EAA2C,EACpDC,SAAAA,KACGC,MAEH,MAAMC,EAlFS,GACfC,YAAAA,GAAc,EACdC,UAAAA,EAAY,MACZC,MAAAA,EAAQ,IACRC,UAAAA,EAAY,QACZC,aAAAA,MAEA,MAAOC,EAAQC,GAAWC,EAASP,GAC7BQ,EAAeC,EAAsB,MACrCC,EAAcD,EAA2B,MAKzCE,EAAOC,EAAY,CACrBC,KAAMR,EACND,aAAeS,IACXT,IAAeS,GACfP,EAAQO,IAEZZ,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,IAEnE,MAAO,CACH3B,UAAAA,EACAE,OAAAA,EACAC,QAAAA,EACAE,aAAAA,KACGG,EACHyB,KAAM,IACCzB,EAAKyB,KACR1B,YAAAA,EACA2B,eA5CgBf,IACpBZ,EAAY4B,QAAUhB,OA6CnBY,IA0BSK,CAAWzC,GAE3B,OAAO0C,EAAClD,EAAA,CAAgBmD,MAAO1C,EAAUF,SAAAA"}
1
+ {"version":3,"file":"Tooltip.js","sources":["../../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\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, {\n type FC,\n createContext,\n useContext,\n useRef,\n useState,\n} from \"react\";\nimport type { WithChildren } from \"../../utilities/types.js\";\nimport type { TooltipProps } from \"./types.js\";\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\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":"iUAqCA,MA8DMA,EAAiBC,EAA8B,MAExCC,EAAkBF,EAAeG,SAEjCC,EAAoB,KAC7B,MAAMC,EAAUC,EAAWN,GAE3B,GAAgB,OAAZK,EACA,MAAM,IAAIE,MACN,0DAIR,OAAOF,GAGEG,EAA2C,EACpDC,SAAAA,KACGC,MAEH,MAAMC,EAlFS,GACfC,YAAAA,GAAc,EACdC,UAAAA,EAAY,MACZC,MAAAA,EAAQ,IACRC,UAAAA,EAAY,QACZC,aAAAA,MAEA,MAAOC,EAAQC,GAAWC,EAASP,GAC7BQ,EAAeC,EAAsB,MACrCC,EAAcD,EAA2B,MAKzCE,EAAOC,EAAY,CACrBC,KAAMR,EACND,aAAeS,IACXT,IAAeS,GACfP,EAAQO,IAEZZ,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,IAEnE,MAAO,CACH3B,UAAAA,EACAE,OAAAA,EACAC,QAAAA,EACAE,aAAAA,KACGG,EACHyB,KAAM,IACCzB,EAAKyB,KACR1B,YAAAA,EACA2B,eA5CgBf,IACpBZ,EAAY4B,QAAUhB,OA6CnBY,IA0BSK,CAAWzC,GAE3B,OAAO0C,EAAClD,EAAA,CAAgBmD,MAAO1C,EAAUF,SAAAA"}
@@ -1,5 +1,5 @@
1
1
  import { RefObject } from 'react';
2
- import { Easing, Timing } from '../../core/types.js';
2
+ import { Easing, Timing } from '../../utilities/types.js';
3
3
  export interface UseAnimatedHeightOptions<T extends HTMLElement = HTMLElement> {
4
4
  display?: "block" | "grid" | "flex";
5
5
  /**
@@ -1,2 +1,2 @@
1
- import{useRef as e,useCallback as t,useEffect as r}from"react";import n from"../../core/tokens.js";import{useBrowserPreferences as i}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as s}from"../usePreviousValue/usePreviousValue.js";function o(o,a){const u=s(o),l=a?.easing||"standard",c=a?.timing||"productive",m=a?.display||"block",d=`${n.motion.timing[c]} height ${n.motion.easing[l]}`,{prefersReducedMotion:f}=i(),y=e(),h=e(),p=e(null);function v(e){const t=p.current;t&&e.target===t&&(o?t.removeAttribute("style"):(t.removeAttribute("style"),t.style.display="none"),a?.onTransitionEnd?.(o,p))}const g=t(()=>{const e=p.current;if(e&&void 0!==u){if(o){if(o&&u)return}else if(e.style.display="none",!u)return;if(a?.onTransitionStart?.(o,p),f)return e.removeAttribute("style"),o?a?.onFirstVisible?.(o,p):e.style.display="none",void a?.onTransitionEnd?.(o,p);if(e.style.transition=d,e.style.display=m,e.style.overflow="hidden",o)a?.onFirstVisible?.(o,p),e.style.height="0",e.style.height=`${e.scrollHeight}px`;else{if(0===e.scrollHeight)return void e.removeAttribute("style");e.style.height=`${e.scrollHeight}px`,y.current=requestAnimationFrame(()=>{h.current=requestAnimationFrame(()=>{e.style.height="0px"})})}}},[o,a,u,d,f,m]);return r(()=>{g()},[o,g]),r(()=>{const e=p.current;return e&&e.addEventListener("transitionend",v),()=>{e&&e.removeEventListener("transitionend",v)}},[o]),r(()=>{const e=y.current,t=h.current;return()=>{e&&cancelAnimationFrame(e),t&&cancelAnimationFrame(t)}},[]),[p,g]}export{o as useAnimatedHeight};
1
+ import{useRef as e,useCallback as t,useEffect as r}from"react";import n from"../../tokens.js";import{useBrowserPreferences as i}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as s}from"../usePreviousValue/usePreviousValue.js";function o(o,a){const u=s(o),l=a?.easing||"standard",c=a?.timing||"productive",m=a?.display||"block",d=`${n.motion.timing[c]} height ${n.motion.easing[l]}`,{prefersReducedMotion:f}=i(),y=e(),h=e(),p=e(null);function v(e){const t=p.current;t&&e.target===t&&(o?t.removeAttribute("style"):(t.removeAttribute("style"),t.style.display="none"),a?.onTransitionEnd?.(o,p))}const g=t(()=>{const e=p.current;if(e&&void 0!==u){if(o){if(o&&u)return}else if(e.style.display="none",!u)return;if(a?.onTransitionStart?.(o,p),f)return e.removeAttribute("style"),o?a?.onFirstVisible?.(o,p):e.style.display="none",void a?.onTransitionEnd?.(o,p);if(e.style.transition=d,e.style.display=m,e.style.overflow="hidden",o)a?.onFirstVisible?.(o,p),e.style.height="0",e.style.height=`${e.scrollHeight}px`;else{if(0===e.scrollHeight)return void e.removeAttribute("style");e.style.height=`${e.scrollHeight}px`,y.current=requestAnimationFrame(()=>{h.current=requestAnimationFrame(()=>{e.style.height="0px"})})}}},[o,a,u,d,f,m]);return r(()=>{g()},[o,g]),r(()=>{const e=p.current;return e&&e.addEventListener("transitionend",v),()=>{e&&e.removeEventListener("transitionend",v)}},[o]),r(()=>{const e=y.current,t=h.current;return()=>{e&&cancelAnimationFrame(e),t&&cancelAnimationFrame(t)}},[]),[p,g]}export{o as useAnimatedHeight};
2
2
  //# sourceMappingURL=useAnimatedHeight.js.map
@@ -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 type { 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 } else {\n element.style.display = \"none\";\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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi trigger med isOpen\n useEffect(() => {\n runAnimation();\n }, [isOpen, runAnimation]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies:\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 }, [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 }, []);\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","onTransitionEnd","runAnimation","useCallback","onTransitionStart","onFirstVisible","overflow","height","scrollHeight","requestAnimationFrame","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiBO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAUC,EAAiBH,GAC3BI,EAASH,GAASG,QAfN,WAgBZC,EAASJ,GAASI,QAfN,aAgBZC,EAAUL,GAASK,SAlBN,QAmBbC,EAAa,GAAGC,EAAOC,OAAOJ,OAAOA,aAAkBG,EAAOC,OAAOL,OAAOA,MAE1EM,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAE7B,SAASG,EAAoBC,GACzB,MAAMC,EAAUH,EAAWI,QAGvBD,GAAWD,EAAMG,SAAWF,IACxBlB,EACAkB,EAAQG,gBAAgB,UAExBH,EAAQG,gBAAgB,SACxBH,EAAQI,MAAMhB,QAAU,QAE5BL,GAASsB,kBAAkBvB,EAAQe,GAE3C,CAEA,MAAMS,EAAeC,EAAY,KAC7B,MAAMP,EAAUH,EAAWI,QAI3B,GAAKD,QAAuB,IAAZhB,EAIhB,CAAA,GAAKF,GAML,GAAWA,GAAUE,EAEjB,YAAA,GAPAgB,EAAQI,MAAMhB,QAAU,QACnBJ,EAED,OASR,GAFAD,GAASyB,oBAAoB1B,EAAQe,GAEjCL,EAQA,OAPAQ,EAAQG,gBAAgB,SACpBrB,EACAC,GAAS0B,iBAAiB3B,EAAQe,GAElCG,EAAQI,MAAMhB,QAAU,YAE5BL,GAASsB,kBAAkBvB,EAAQe,GAQvC,GAJAG,EAAQI,MAAMf,WAAaA,EAC3BW,EAAQI,MAAMhB,QAAUA,EACxBY,EAAQI,MAAMM,SAAW,SAErB5B,EACAC,GAAS0B,iBAAiB3B,EAAQe,GAClCG,EAAQI,MAAMO,OAAS,IACvBX,EAAQI,MAAMO,OAAS,GAAGX,EAAQY,qBAC/B,CAIH,GAA6B,IAAzBZ,EAAQY,aAER,YADAZ,EAAQG,gBAAgB,SAI5BH,EAAQI,MAAMO,OAAS,GAAGX,EAAQY,iBAElClB,EAAKO,QAAUY,sBAAsB,KACjCjB,EAAKK,QAAUY,sBAAsB,KACjCb,EAAQI,MAAMO,OAAS,SAGnC,CAAA,GACD,CAAC7B,EAAQC,EAASC,EAASK,EAAYG,EAAsBJ,IAGhE,OAAA0B,EAAU,KACNR,KACD,CAACxB,EAAQwB,IAGZQ,EAAU,KACN,MAAMd,EAAUH,EAAWI,QAC3B,OAAID,GACAA,EAAQe,iBAAiB,gBAAiBjB,GAGvC,KACCE,GACAA,EAAQgB,oBACJ,gBACAlB,KAIb,CAAChB,IAEJgC,EAAU,KACN,MAAMG,EAAKvB,EAAKO,QACViB,EAAKtB,EAAKK,QAChB,MAAO,KACHgB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEI,CAACrB,EAAYS,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 \"../../tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport type { 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 } else {\n element.style.display = \"none\";\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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi trigger med isOpen\n useEffect(() => {\n runAnimation();\n }, [isOpen, runAnimation]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies:\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 }, [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 }, []);\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","onTransitionEnd","runAnimation","useCallback","onTransitionStart","onFirstVisible","overflow","height","scrollHeight","requestAnimationFrame","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"mQAiBO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAUC,EAAiBH,GAC3BI,EAASH,GAASG,QAfN,WAgBZC,EAASJ,GAASI,QAfN,aAgBZC,EAAUL,GAASK,SAlBN,QAmBbC,EAAa,GAAGC,EAAOC,OAAOJ,OAAOA,aAAkBG,EAAOC,OAAOL,OAAOA,MAE1EM,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAE7B,SAASG,EAAoBC,GACzB,MAAMC,EAAUH,EAAWI,QAGvBD,GAAWD,EAAMG,SAAWF,IACxBlB,EACAkB,EAAQG,gBAAgB,UAExBH,EAAQG,gBAAgB,SACxBH,EAAQI,MAAMhB,QAAU,QAE5BL,GAASsB,kBAAkBvB,EAAQe,GAE3C,CAEA,MAAMS,EAAeC,EAAY,KAC7B,MAAMP,EAAUH,EAAWI,QAI3B,GAAKD,QAAuB,IAAZhB,EAIhB,CAAA,GAAKF,GAML,GAAWA,GAAUE,EAEjB,YAAA,GAPAgB,EAAQI,MAAMhB,QAAU,QACnBJ,EAED,OASR,GAFAD,GAASyB,oBAAoB1B,EAAQe,GAEjCL,EAQA,OAPAQ,EAAQG,gBAAgB,SACpBrB,EACAC,GAAS0B,iBAAiB3B,EAAQe,GAElCG,EAAQI,MAAMhB,QAAU,YAE5BL,GAASsB,kBAAkBvB,EAAQe,GAQvC,GAJAG,EAAQI,MAAMf,WAAaA,EAC3BW,EAAQI,MAAMhB,QAAUA,EACxBY,EAAQI,MAAMM,SAAW,SAErB5B,EACAC,GAAS0B,iBAAiB3B,EAAQe,GAClCG,EAAQI,MAAMO,OAAS,IACvBX,EAAQI,MAAMO,OAAS,GAAGX,EAAQY,qBAC/B,CAIH,GAA6B,IAAzBZ,EAAQY,aAER,YADAZ,EAAQG,gBAAgB,SAI5BH,EAAQI,MAAMO,OAAS,GAAGX,EAAQY,iBAElClB,EAAKO,QAAUY,sBAAsB,KACjCjB,EAAKK,QAAUY,sBAAsB,KACjCb,EAAQI,MAAMO,OAAS,SAGnC,CAAA,GACD,CAAC7B,EAAQC,EAASC,EAASK,EAAYG,EAAsBJ,IAGhE,OAAA0B,EAAU,KACNR,KACD,CAACxB,EAAQwB,IAGZQ,EAAU,KACN,MAAMd,EAAUH,EAAWI,QAC3B,OAAID,GACAA,EAAQe,iBAAiB,gBAAiBjB,GAGvC,KACCE,GACAA,EAAQgB,oBACJ,gBACAlB,KAIb,CAAChB,IAEJgC,EAAU,KACN,MAAMG,EAAKvB,EAAKO,QACViB,EAAKtB,EAAKK,QAChB,MAAO,KACHgB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEI,CAACrB,EAAYS,EACxB"}
@@ -1,2 +1,2 @@
1
- import{useRef as e,useCallback as t,useEffect as r}from"react";import n from"../../core/tokens.js";import{useBrowserPreferences as s}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as o}from"../usePreviousValue/usePreviousValue.js";function i(i,a){const u=o(i),c=a?.easing||"standard",d=a?.timing||"productive",l=`${n.motion.timing[d]} height ${n.motion.easing[c]}`,{prefersReducedMotion:m}=s(),p=e(),y=e(),f=e(null),g=t(e=>{const t=f.current;t&&e.target===t&&(t.removeAttribute("style"),a?.onTransitionEnd?.(i,f))},[a,i]),h=t(()=>{const e=f.current;if(e&&(void 0===u&&(e.dataset.expanded=i?"true":"false"),!(!i&&!u||i&&u))){if(a?.onTransitionStart?.(i,f),m)return e.removeAttribute("style"),e.dataset.expanded=i?"true":"false",void a?.onTransitionEnd?.(i,f);i?function(e,t,r,n){const s=e.current;if(!s)return;s.removeAttribute("style");const o=s.scrollHeight;r.current=requestAnimationFrame(()=>{s.style.removeProperty("transition"),s.dataset.expanded="false";const e=s.getBoundingClientRect().height;s.style.setProperty("height",`${e}px`),s.style.setProperty("overflow-y","hidden"),n.current=requestAnimationFrame(()=>{s.style.setProperty("transition",t),s.style.setProperty("height",`${o}px`),s.dataset.expanded="true"})})}(f,l,p,y):function(e,t,r,n){const s=e.current;if(!s)return;s.removeAttribute("style");const o=s.scrollHeight;r.current=requestAnimationFrame(()=>{s.style.removeProperty("transition"),s.dataset.expanded="false";const e=s.getBoundingClientRect().height;s.dataset.expanded="true",s.style.setProperty("height",`${o}px`),s.style.setProperty("overflow-y","hidden"),n.current=requestAnimationFrame(()=>{s.style.setProperty("transition",t),s.style.setProperty("height",`${e}px`),s.dataset.expanded="false"})})}(f,l,p,y)}},[u,i,a,m,l]);return r(()=>{h()},[i,h]),r(()=>{const e=f.current;return e&&e.addEventListener("transitionend",g),()=>{e&&e.removeEventListener("transitionend",g)}},[i]),r(()=>{const e=p.current,t=y.current;return()=>{e&&cancelAnimationFrame(e),t&&cancelAnimationFrame(t)}},[]),[f,h]}export{i as useAnimatedHeightBetween};
1
+ import{useRef as e,useCallback as t,useEffect as r}from"react";import n from"../../tokens.js";import{useBrowserPreferences as s}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as o}from"../usePreviousValue/usePreviousValue.js";function i(i,a){const u=o(i),c=a?.easing||"standard",d=a?.timing||"productive",l=`${n.motion.timing[d]} height ${n.motion.easing[c]}`,{prefersReducedMotion:m}=s(),p=e(),y=e(),f=e(null),g=t(e=>{const t=f.current;t&&e.target===t&&(t.removeAttribute("style"),a?.onTransitionEnd?.(i,f))},[a,i]),h=t(()=>{const e=f.current;if(e&&(void 0===u&&(e.dataset.expanded=i?"true":"false"),!(!i&&!u||i&&u))){if(a?.onTransitionStart?.(i,f),m)return e.removeAttribute("style"),e.dataset.expanded=i?"true":"false",void a?.onTransitionEnd?.(i,f);i?function(e,t,r,n){const s=e.current;if(!s)return;s.removeAttribute("style");const o=s.scrollHeight;r.current=requestAnimationFrame(()=>{s.style.removeProperty("transition"),s.dataset.expanded="false";const e=s.getBoundingClientRect().height;s.style.setProperty("height",`${e}px`),s.style.setProperty("overflow-y","hidden"),n.current=requestAnimationFrame(()=>{s.style.setProperty("transition",t),s.style.setProperty("height",`${o}px`),s.dataset.expanded="true"})})}(f,l,p,y):function(e,t,r,n){const s=e.current;if(!s)return;s.removeAttribute("style");const o=s.scrollHeight;r.current=requestAnimationFrame(()=>{s.style.removeProperty("transition"),s.dataset.expanded="false";const e=s.getBoundingClientRect().height;s.dataset.expanded="true",s.style.setProperty("height",`${o}px`),s.style.setProperty("overflow-y","hidden"),n.current=requestAnimationFrame(()=>{s.style.setProperty("transition",t),s.style.setProperty("height",`${e}px`),s.dataset.expanded="false"})})}(f,l,p,y)}},[u,i,a,m,l]);return r(()=>{h()},[i,h]),r(()=>{const e=f.current;return e&&e.addEventListener("transitionend",g),()=>{e&&e.removeEventListener("transitionend",g)}},[i]),r(()=>{const e=p.current,t=y.current;return()=>{e&&cancelAnimationFrame(e),t&&cancelAnimationFrame(t)}},[]),[f,h]}export{i as useAnimatedHeightBetween};
2
2
  //# sourceMappingURL=useAnimatedHeightBetween.js.map
@@ -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 type { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\nfunction collapseElement<T extends HTMLElement>(\n elementRef: RefObject<T | null>,\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 | null>,\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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi trigger med isExpanded\n useEffect(() => {\n runAnimation();\n }, [isExpanded, runAnimation]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies:\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 }, [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 }, []);\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","onTransitionEnd","runAnimation","dataset","expanded","onTransitionStart","expandedHeight","scrollHeight","requestAnimationFrame","style","removeProperty","collapsedHeight","getBoundingClientRect","height","setProperty","expandElement","collapseElement","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"wQAiFO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAcC,EAAiBH,GAC/BI,EAASH,GAASG,QAhFN,WAiFZC,EAASJ,GAASI,QAhFN,aAiFZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,EACvBC,IACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxBpB,GAASqB,kBAAkBtB,EAAYc,KAG/C,CAACb,EAASD,IAGRuB,EAAeP,EAAY,KAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,SAEe,IAAhBhB,IAEAgB,EAAQM,QAAQC,SAAWzB,EAAa,OAAS,YAG/CA,IAAeE,GAAiBF,GAAcE,IAOpD,CAAA,GAFAD,GAASyB,oBAAoB1B,EAAYc,GAErCL,EAIA,OAHAS,EAAQG,gBAAgB,SACxBH,EAAQM,QAAQC,SAAWzB,EAAa,OAAS,aACjDC,GAASqB,kBAAkBtB,EAAYc,GAIvCd,EA3FZ,SACIc,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMM,EAAiBT,EAAQU,aAE/BjB,EAAKQ,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMC,eAAe,cAC7Bb,EAAQM,QAAQC,SAAW,QAC3B,MAAMO,EAAkBd,EAAQe,wBAAwBC,OAGxDhB,EAAQY,MAAMK,YAAY,SAAU,GAAGH,OACvCd,EAAQY,MAAMK,YAAY,aAAc,UAExCtB,EAAKM,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMK,YAAY,aAAc7B,GACxCY,EAAQY,MAAMK,YAAY,SAAU,GAAGR,OACvCT,EAAQM,QAAQC,SAAW,UAGvC,CA8DYW,CAActB,EAAYR,EAAYK,EAAME,GA7HxD,SACIC,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMM,EAAiBT,EAAQU,aAE/BjB,EAAKQ,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMC,eAAe,cAC7Bb,EAAQM,QAAQC,SAAW,QAC3B,MAAMO,EAAkBd,EAAQe,wBAAwBC,OACxDhB,EAAQM,QAAQC,SAAW,OAG3BP,EAAQY,MAAMK,YAAY,SAAU,GAAGR,OACvCT,EAAQY,MAAMK,YAAY,aAAc,UAExCtB,EAAKM,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMK,YAAY,aAAc7B,GACxCY,EAAQY,MAAMK,YAAY,SAAU,GAAGH,OACvCd,EAAQM,QAAQC,SAAW,WAGvC,CAgGYY,CAAgBvB,EAAYR,EAAYK,EAAME,EAAI,GAEvD,CAACX,EAAaF,EAAYC,EAASQ,EAAsBH,IAG5D,OAAAgC,EAAU,KACNf,KACD,CAACvB,EAAYuB,IAGhBe,EAAU,KACN,MAAMpB,EAAUJ,EAAWK,QAC3B,OAAID,GACAA,EAAQqB,iBAAiB,gBAAiBxB,GAGvC,KACCG,GACAA,EAAQsB,oBACJ,gBACAzB,KAIb,CAACf,IAEJsC,EAAU,KACN,MAAMG,EAAK9B,EAAKQ,QACVuB,EAAK7B,EAAKM,QAChB,MAAO,KACHsB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEI,CAAC5B,EAAYS,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 \"../../tokens.js\";\nimport { useBrowserPreferences } from \"../useBrowserPreferences/useBrowserPreferences.js\";\nimport { usePreviousValue } from \"../usePreviousValue/usePreviousValue.js\";\nimport type { UseAnimatedHeightOptions } from \"./types.js\";\n\nconst defaultEasing = \"standard\";\nconst defaultTiming = \"productive\";\n\nfunction collapseElement<T extends HTMLElement>(\n elementRef: RefObject<T | null>,\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 | null>,\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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi trigger med isExpanded\n useEffect(() => {\n runAnimation();\n }, [isExpanded, runAnimation]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies:\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 }, [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 }, []);\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","onTransitionEnd","runAnimation","dataset","expanded","onTransitionStart","expandedHeight","scrollHeight","requestAnimationFrame","style","removeProperty","collapsedHeight","getBoundingClientRect","height","setProperty","expandElement","collapseElement","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"mQAiFO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAcC,EAAiBH,GAC/BI,EAASH,GAASG,QAhFN,WAiFZC,EAASJ,GAASI,QAhFN,aAiFZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,EACvBC,IACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxBpB,GAASqB,kBAAkBtB,EAAYc,KAG/C,CAACb,EAASD,IAGRuB,EAAeP,EAAY,KAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,SAEe,IAAhBhB,IAEAgB,EAAQM,QAAQC,SAAWzB,EAAa,OAAS,YAG/CA,IAAeE,GAAiBF,GAAcE,IAOpD,CAAA,GAFAD,GAASyB,oBAAoB1B,EAAYc,GAErCL,EAIA,OAHAS,EAAQG,gBAAgB,SACxBH,EAAQM,QAAQC,SAAWzB,EAAa,OAAS,aACjDC,GAASqB,kBAAkBtB,EAAYc,GAIvCd,EA3FZ,SACIc,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMM,EAAiBT,EAAQU,aAE/BjB,EAAKQ,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMC,eAAe,cAC7Bb,EAAQM,QAAQC,SAAW,QAC3B,MAAMO,EAAkBd,EAAQe,wBAAwBC,OAGxDhB,EAAQY,MAAMK,YAAY,SAAU,GAAGH,OACvCd,EAAQY,MAAMK,YAAY,aAAc,UAExCtB,EAAKM,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMK,YAAY,aAAc7B,GACxCY,EAAQY,MAAMK,YAAY,SAAU,GAAGR,OACvCT,EAAQM,QAAQC,SAAW,UAGvC,CA8DYW,CAActB,EAAYR,EAAYK,EAAME,GA7HxD,SACIC,EACAR,EACAK,EACAE,GAEA,MAAMK,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMM,EAAiBT,EAAQU,aAE/BjB,EAAKQ,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMC,eAAe,cAC7Bb,EAAQM,QAAQC,SAAW,QAC3B,MAAMO,EAAkBd,EAAQe,wBAAwBC,OACxDhB,EAAQM,QAAQC,SAAW,OAG3BP,EAAQY,MAAMK,YAAY,SAAU,GAAGR,OACvCT,EAAQY,MAAMK,YAAY,aAAc,UAExCtB,EAAKM,QAAUU,sBAAsB,KAEjCX,EAAQY,MAAMK,YAAY,aAAc7B,GACxCY,EAAQY,MAAMK,YAAY,SAAU,GAAGH,OACvCd,EAAQM,QAAQC,SAAW,WAGvC,CAgGYY,CAAgBvB,EAAYR,EAAYK,EAAME,EAAI,GAEvD,CAACX,EAAaF,EAAYC,EAASQ,EAAsBH,IAG5D,OAAAgC,EAAU,KACNf,KACD,CAACvB,EAAYuB,IAGhBe,EAAU,KACN,MAAMpB,EAAUJ,EAAWK,QAC3B,OAAID,GACAA,EAAQqB,iBAAiB,gBAAiBxB,GAGvC,KACCG,GACAA,EAAQsB,oBACJ,gBACAzB,KAIb,CAACf,IAEJsC,EAAU,KACN,MAAMG,EAAK9B,EAAKQ,QACVuB,EAAK7B,EAAKM,QAChB,MAAO,KACHsB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEI,CAAC5B,EAAYS,EACxB"}
@@ -1,5 +1,5 @@
1
1
  import { RefObject } from 'react';
2
- import { Easing, Timing } from '../../core/types.js';
2
+ import { Easing, Timing } from '../../utilities/types.js';
3
3
  export type UseAutoAnimatedHeightOptions<T extends HTMLElement> = {
4
4
  easing?: Easing;
5
5
  /**
@@ -1,2 +1,2 @@
1
- import{useState as e,useRef as r,useCallback as t,useEffect as n}from"react";import s from"../../core/tokens.js";import{useBrowserPreferences as o}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as i}from"../usePreviousValue/usePreviousValue.js";function a(a,u){const c=i(a),[m,l]=e(0),f=u?.easing||"standard",d=u?.timing||"expressive",p=`${s.motion.timing[d]} height ${s.motion.easing[f]}`,{prefersReducedMotion:v}=o(),y=r(),g=r(),P=r(null),h=t(e=>{const r=P.current;r&&e.target===r&&(r.removeAttribute("style"),u?.onTransitionEnd?.(P))},[u]),A=t(()=>{const e=P.current;if(!e)return;e.removeAttribute("style");const r=e.scrollHeight;y.current=requestAnimationFrame(()=>{e.style.removeProperty("transition"),e.style.setProperty("height",`${m}px`),e.style.setProperty("overflow-y","hidden"),g.current=requestAnimationFrame(()=>{e.style.setProperty("transition",p),e.style.setProperty("height",`${r}px`)})}),l(r)},[p,m]),E=t(()=>{const e=P.current;if(e){if(void 0===c)return void l(e.scrollHeight);if(a!==c){if(u?.onTransitionStart?.(P),v)return void u?.onTransitionEnd?.(P);A()}}},[A,a,c,u,v]);return n(()=>{E()},[a,E]),n(()=>{const e=P.current;return e&&e.addEventListener("transitionend",h),()=>{e&&e.removeEventListener("transitionend",h)}},[h]),n(()=>{const e=y.current,r=g.current;return()=>{e&&cancelAnimationFrame(e),r&&cancelAnimationFrame(r)}},[]),P}export{a as useAutoAnimatedHeight};
1
+ import{useState as e,useRef as r,useCallback as t,useEffect as n}from"react";import s from"../../tokens.js";import{useBrowserPreferences as o}from"../useBrowserPreferences/useBrowserPreferences.js";import{usePreviousValue as i}from"../usePreviousValue/usePreviousValue.js";function a(a,u){const c=i(a),[m,l]=e(0),f=u?.easing||"standard",d=u?.timing||"expressive",p=`${s.motion.timing[d]} height ${s.motion.easing[f]}`,{prefersReducedMotion:v}=o(),y=r(),g=r(),P=r(null),h=t(e=>{const r=P.current;r&&e.target===r&&(r.removeAttribute("style"),u?.onTransitionEnd?.(P))},[u]),A=t(()=>{const e=P.current;if(!e)return;e.removeAttribute("style");const r=e.scrollHeight;y.current=requestAnimationFrame(()=>{e.style.removeProperty("transition"),e.style.setProperty("height",`${m}px`),e.style.setProperty("overflow-y","hidden"),g.current=requestAnimationFrame(()=>{e.style.setProperty("transition",p),e.style.setProperty("height",`${r}px`)})}),l(r)},[p,m]),E=t(()=>{const e=P.current;if(e){if(void 0===c)return void l(e.scrollHeight);if(a!==c){if(u?.onTransitionStart?.(P),v)return void u?.onTransitionEnd?.(P);A()}}},[A,a,c,u,v]);return n(()=>{E()},[a,E]),n(()=>{const e=P.current;return e&&e.addEventListener("transitionend",h),()=>{e&&e.removeEventListener("transitionend",h)}},[h]),n(()=>{const e=y.current,r=g.current;return()=>{e&&cancelAnimationFrame(e),r&&cancelAnimationFrame(r)}},[]),P}export{a as useAutoAnimatedHeight};
2
2
  //# sourceMappingURL=useAutoAnimateHeight.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAutoAnimateHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAutoAnimateHeight.ts"],"sourcesContent":["import {\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport tokens from \"../../core/tokens.js\";\nimport type { Easing, 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 | null>) => void;\n onTransitionEnd?: (ref: RefObject<T | null>) => 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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi vil trige med trigger\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 }, []);\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","onTransitionEnd","animateElement","newHeight","scrollHeight","requestAnimationFrame","style","removeProperty","setProperty","runAnimation","onTransitionStart","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"sRAiCO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAuBC,EAAiBH,IACvCI,EAAgBC,GAAqBC,EAAS,GAE/CC,EAASN,GAASM,QA5BN,WA6BZC,EAASP,GAASO,QA5BN,aA6BZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,EACvBC,IACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxBvB,GAASwB,kBAAkBR,KAGnC,CAAChB,IAGCyB,EAAiBP,EAAY,KAC/B,MAAME,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMG,EAAYN,EAAQO,aAE1Bd,EAAKQ,QAAUO,sBAAsB,KAEjCR,EAAQS,MAAMC,eAAe,cAC7BV,EAAQS,MAAME,YAAY,SAAU,GAAG5B,OACvCiB,EAAQS,MAAME,YAAY,aAAc,UAExChB,EAAKM,QAAUO,sBAAsB,KAEjCR,EAAQS,MAAME,YAAY,aAAcvB,GACxCY,EAAQS,MAAME,YAAY,SAAU,GAAGL,WAI/CtB,EAAkBsB,IACnB,CAAClB,EAAYL,IAEV6B,EAAed,EAAY,KAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,EAEL,CAAA,QAA6B,IAAzBnB,EAGA,YADAG,EAAkBgB,EAAQO,cAI9B,GAAI5B,IAAYE,EAOhB,CAAA,GAFAD,GAASiC,oBAAoBjB,GAEzBL,EAEA,YADAX,GAASwB,kBAAkBR,GAI/BS,GAAA,CAAA,GACD,CACCA,EACA1B,EACAE,EACAD,EACAW,IAIJ,OAAAuB,EAAU,KACNF,KACD,CAACjC,EAASiC,IAEbE,EAAU,KACN,MAAMd,EAAUJ,EAAWK,QAC3B,OAAID,GACAA,EAAQe,iBAAiB,gBAAiBlB,GAGvC,KACCG,GACAA,EAAQgB,oBACJ,gBACAnB,KAIb,CAACA,IAEJiB,EAAU,KACN,MAAMG,EAAKxB,EAAKQ,QACViB,EAAKvB,EAAKM,QAChB,MAAO,KACHgB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEItB,CACX"}
1
+ {"version":3,"file":"useAutoAnimateHeight.js","sources":["../../../../src/hooks/useAnimatedHeight/useAutoAnimateHeight.ts"],"sourcesContent":["import {\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport tokens from \"../../tokens.js\";\nimport type { Easing, Timing } from \"../../utilities/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 | null>) => void;\n onTransitionEnd?: (ref: RefObject<T | null>) => 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 // biome-ignore lint/correctness/useExhaustiveDependencies: Vi vil trige med trigger\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 }, []);\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","onTransitionEnd","animateElement","newHeight","scrollHeight","requestAnimationFrame","style","removeProperty","setProperty","runAnimation","onTransitionStart","useEffect","addEventListener","removeEventListener","r1","r2","cancelAnimationFrame"],"mappings":"iRAiCO,SAASA,EACZC,EACAC,GAEA,MAAMC,EAAuBC,EAAiBH,IACvCI,EAAgBC,GAAqBC,EAAS,GAE/CC,EAASN,GAASM,QA5BN,WA6BZC,EAASP,GAASO,QA5BN,aA6BZC,EAAa,GAAGC,EAAOC,OAAOH,OAAOA,aAAkBE,EAAOC,OAAOJ,OAAOA,MAE1EK,qBAAAA,GAAyBC,IAE3BC,EAAOC,IACPC,EAAOD,IACPE,EAAaF,EAAU,MAEvBG,EAAsBC,EACvBC,IACG,MAAMC,EAAUJ,EAAWK,QAGvBD,GAAWD,EAAMG,SAAWF,IAC5BA,EAAQG,gBAAgB,SACxBvB,GAASwB,kBAAkBR,KAGnC,CAAChB,IAGCyB,EAAiBP,EAAY,KAC/B,MAAME,EAAUJ,EAAWK,QAE3B,IAAKD,EAAS,OAEdA,EAAQG,gBAAgB,SACxB,MAAMG,EAAYN,EAAQO,aAE1Bd,EAAKQ,QAAUO,sBAAsB,KAEjCR,EAAQS,MAAMC,eAAe,cAC7BV,EAAQS,MAAME,YAAY,SAAU,GAAG5B,OACvCiB,EAAQS,MAAME,YAAY,aAAc,UAExChB,EAAKM,QAAUO,sBAAsB,KAEjCR,EAAQS,MAAME,YAAY,aAAcvB,GACxCY,EAAQS,MAAME,YAAY,SAAU,GAAGL,WAI/CtB,EAAkBsB,IACnB,CAAClB,EAAYL,IAEV6B,EAAed,EAAY,KAC7B,MAAME,EAAUJ,EAAWK,QAE3B,GAAKD,EAEL,CAAA,QAA6B,IAAzBnB,EAGA,YADAG,EAAkBgB,EAAQO,cAI9B,GAAI5B,IAAYE,EAOhB,CAAA,GAFAD,GAASiC,oBAAoBjB,GAEzBL,EAEA,YADAX,GAASwB,kBAAkBR,GAI/BS,GAAA,CAAA,GACD,CACCA,EACA1B,EACAE,EACAD,EACAW,IAIJ,OAAAuB,EAAU,KACNF,KACD,CAACjC,EAASiC,IAEbE,EAAU,KACN,MAAMd,EAAUJ,EAAWK,QAC3B,OAAID,GACAA,EAAQe,iBAAiB,gBAAiBlB,GAGvC,KACCG,GACAA,EAAQgB,oBACJ,gBACAnB,KAIb,CAACA,IAEJiB,EAAU,KACN,MAAMG,EAAKxB,EAAKQ,QACViB,EAAKvB,EAAKM,QAChB,MAAO,KACHgB,GAAME,qBAAqBF,GAC3BC,GAAMC,qBAAqBD,KAEhC,IAEItB,CACX"}
@@ -11,5 +11,5 @@ export interface UseAriaLiveRegionOptions {
11
11
  * @returns
12
12
  */
13
13
  export declare function useAriaLiveRegion(watch: unknown | unknown[], options?: UseAriaLiveRegionOptions): {
14
- "aria-live": "polite" | "assertive" | "off" | undefined;
14
+ "aria-live": "off" | "assertive" | "polite" | undefined;
15
15
  };
@@ -1,4 +1,4 @@
1
- import { ColorScheme } from '../../core/types.js';
1
+ import { ColorScheme } from '../../utilities/types.js';
2
2
  type BrowserPreferences = {
3
3
  prefersReducedMotion: boolean;
4
4
  prefersColorScheme: ColorScheme;
@@ -1 +1 @@
1
- {"version":3,"file":"useBrowserPreferences.js","sources":["../../../../src/hooks/useBrowserPreferences/useBrowserPreferences.tsx"],"sourcesContent":["import { type Reducer, useEffect, useReducer, useState } from \"react\";\nimport type { 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\nconst ActionType = {\n PrefersColorScheme: \"COLOR_SCHEME_CHANGED\",\n PrefersReducedMotion: \"REDUCED_MOTION_CHANGED\",\n ForcedColors: \"FORCED_COLORS_CHANGED\",\n} as const;\n\ntype Action =\n | {\n type: typeof ActionType.PrefersColorScheme;\n value: ColorScheme;\n }\n | {\n type: typeof ActionType.PrefersReducedMotion;\n value: boolean;\n }\n | {\n type: typeof 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":["ActionType","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":"2LAcA,MAAMA,EACkB,uBADlBA,EAEoB,yBAFpBA,EAGY,wBAiBZC,EAAyB,mCACzBC,EAA6B,gCAC7BC,EAAgB,0BAEhBC,EAAmC,CACrCC,sBAAsB,EACtBC,mBAAoB,QACpBC,cAAc,GAGZC,EAA+C,CAACC,EAAOC,KACzD,OAAQA,EAAOC,MACX,KAAKX,EACD,MAAO,IACAS,EACHH,mBAAoBI,EAAOE,OAEnC,KAAKZ,EACD,MAAO,IACAS,EACHJ,qBAAsBK,EAAOE,OAErC,KAAKZ,EACD,MAAO,IACAS,EACHF,aAAcG,EAAOE,OAE7B,QACI,OAAOH,IAQNI,EAAwB,KACjC,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCP,EAAOQ,GAAYC,EAAWV,EAASJ,GAE9C,OAAAe,EAAU,KACNJ,GAAc,GACd,MAAMV,EAAuBe,EACzBnB,GAEEK,EAAqBc,EACvBlB,GAEE,QACA,OACAK,EAAea,EAA0BjB,GAC/Cc,EAAS,CACLN,KAAMX,EACNY,MAAOP,IAEXY,EAAS,CACLN,KAAMX,EACNY,MAAON,IAEXW,EAAS,CAAEN,KAAMX,EAAyBY,MAAOL,KAClD,IAEHY,EAAU,KACN,IAAKL,IAAeO,OAAOC,WACvB,OAEJ,MAAMC,EAAgCC,IAClCP,EAAS,CACLN,KAAMX,EACNY,MAAOY,EAAEC,WAGXC,EAA8BF,IAChCP,EAAS,CACLN,KAAMX,EACNY,MAAOY,EAAEC,QAAU,QAAU,UAG/BE,EAAwBH,IAC1BP,EAAS,CAAEN,KAAMX,EAAyBY,MAAOY,EAAEC,WAGvD,OAAAG,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,KAGT,CAACb,IAEG,IAAKL"}
1
+ {"version":3,"file":"useBrowserPreferences.js","sources":["../../../../src/hooks/useBrowserPreferences/useBrowserPreferences.tsx"],"sourcesContent":["import { type Reducer, useEffect, useReducer, useState } from \"react\";\nimport type { ColorScheme } from \"../../utilities/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\nconst ActionType = {\n PrefersColorScheme: \"COLOR_SCHEME_CHANGED\",\n PrefersReducedMotion: \"REDUCED_MOTION_CHANGED\",\n ForcedColors: \"FORCED_COLORS_CHANGED\",\n} as const;\n\ntype Action =\n | {\n type: typeof ActionType.PrefersColorScheme;\n value: ColorScheme;\n }\n | {\n type: typeof ActionType.PrefersReducedMotion;\n value: boolean;\n }\n | {\n type: typeof 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":["ActionType","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":"2LAcA,MAAMA,EACkB,uBADlBA,EAEoB,yBAFpBA,EAGY,wBAiBZC,EAAyB,mCACzBC,EAA6B,gCAC7BC,EAAgB,0BAEhBC,EAAmC,CACrCC,sBAAsB,EACtBC,mBAAoB,QACpBC,cAAc,GAGZC,EAA+C,CAACC,EAAOC,KACzD,OAAQA,EAAOC,MACX,KAAKX,EACD,MAAO,IACAS,EACHH,mBAAoBI,EAAOE,OAEnC,KAAKZ,EACD,MAAO,IACAS,EACHJ,qBAAsBK,EAAOE,OAErC,KAAKZ,EACD,MAAO,IACAS,EACHF,aAAcG,EAAOE,OAE7B,QACI,OAAOH,IAQNI,EAAwB,KACjC,MAAOC,EAAYC,GAAiBC,GAAS,IAEtCP,EAAOQ,GAAYC,EAAWV,EAASJ,GAE9C,OAAAe,EAAU,KACNJ,GAAc,GACd,MAAMV,EAAuBe,EACzBnB,GAEEK,EAAqBc,EACvBlB,GAEE,QACA,OACAK,EAAea,EAA0BjB,GAC/Cc,EAAS,CACLN,KAAMX,EACNY,MAAOP,IAEXY,EAAS,CACLN,KAAMX,EACNY,MAAON,IAEXW,EAAS,CAAEN,KAAMX,EAAyBY,MAAOL,KAClD,IAEHY,EAAU,KACN,IAAKL,IAAeO,OAAOC,WACvB,OAEJ,MAAMC,EAAgCC,IAClCP,EAAS,CACLN,KAAMX,EACNY,MAAOY,EAAEC,WAGXC,EAA8BF,IAChCP,EAAS,CACLN,KAAMX,EACNY,MAAOY,EAAEC,QAAU,QAAU,UAG/BE,EAAwBH,IAC1BP,EAAS,CAAEN,KAAMX,EAAyBY,MAAOY,EAAEC,WAGvD,OAAAG,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,KAGT,CAACb,IAEG,IAAKL"}
@@ -1,2 +1,2 @@
1
- import{useState as e,useReducer as i,useEffect as t,useCallback as a}from"react";import r from"../../core/tokens.js";import{getInitialMediaQueryMatch as s,addMediaQueryListener as o,removeMediaQueryListener as n}from"../mediaQueryUtils.js";import{reducer as c,ActionType as m}from"./state.js";const{breakpoint:d}=r,p=e=>Number.parseInt(e.replace("px","")),u={isSmallDevice:`(max-width: ${p(d.medium)-1}px)`,isMediumDevice:`(min-width: ${d.medium}) and (max-width: ${p(d.large)-1}px)`,isLargeDevice:`(min-width: ${d.large}) and (max-width: ${p(d.xl)-1}px)`,isXlDevice:`(min-width: ${d.xl})`,isPortrait:"(orientation: portrait)",isLandscape:"(orientation: landscape)"},l=e=>({type:"isLandscape"===e||"isPortrait"===e?m.orientation:m.deviceSize,property:e}),f=()=>{const[r,m]=e(!1),[d,p]=i(c,{isSmallDevice:!1,isMediumDevice:!1,isLargeDevice:!1,isXlDevice:!1,isLandscape:!1,isPortrait:!1});t(()=>{m(!0);const e=Object.entries(u).map(([e,i])=>[e,s(i)]);for(const[i,t]of e)t&&p(l(i))},[]);const f=a(e=>i=>{requestAnimationFrame(()=>{i.matches&&p(l(e))})},[]);return t(()=>{if(!r||!window.matchMedia)return;const e=[];for(const[i,t]of Object.entries(u)){const a=window.matchMedia(t),r=f(i);e.push([a,r]),o(a,r)}return()=>{for(const[i,t]of e)n(i,t)}},[f,r]),{...d}};export{f as useScreen};
1
+ import{useState as e,useReducer as i,useEffect as t,useCallback as a}from"react";import s from"../../tokens.js";import{getInitialMediaQueryMatch as r,addMediaQueryListener as o,removeMediaQueryListener as n}from"../mediaQueryUtils.js";import{reducer as c,ActionType as m}from"./state.js";const{breakpoint:d}=s,p=e=>Number.parseInt(e.replace("px","")),u={isSmallDevice:`(max-width: ${p(d.medium)-1}px)`,isMediumDevice:`(min-width: ${d.medium}) and (max-width: ${p(d.large)-1}px)`,isLargeDevice:`(min-width: ${d.large}) and (max-width: ${p(d.xl)-1}px)`,isXlDevice:`(min-width: ${d.xl})`,isPortrait:"(orientation: portrait)",isLandscape:"(orientation: landscape)"},l=e=>({type:"isLandscape"===e||"isPortrait"===e?m.orientation:m.deviceSize,property:e}),f=()=>{const[s,m]=e(!1),[d,p]=i(c,{isSmallDevice:!1,isMediumDevice:!1,isLargeDevice:!1,isXlDevice:!1,isLandscape:!1,isPortrait:!1});t(()=>{m(!0);const e=Object.entries(u).map(([e,i])=>[e,r(i)]);for(const[i,t]of e)t&&p(l(i))},[]);const f=a(e=>i=>{requestAnimationFrame(()=>{i.matches&&p(l(e))})},[]);return t(()=>{if(!s||!window.matchMedia)return;const e=[];for(const[i,t]of Object.entries(u)){const a=window.matchMedia(t),s=f(i);e.push([a,s]),o(a,s)}return()=>{for(const[i,t]of e)n(i,t)}},[f,s]),{...d}};export{f as useScreen};
2
2
  //# sourceMappingURL=useScreen.js.map
@@ -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 {\n ActionType,\n type ScreenAction,\n type ScreenState,\n reducer,\n} from \"./state.js\";\n\nconst { breakpoint } = tokens;\n\nconst breakpointsAsNumber = (breakpoint: string): number =>\n Number.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 const initialMatches = Object.entries(MEDIA_RULES).map(\n ([key, rule]) => [key, getInitialMediaQueryMatch(rule)],\n );\n\n for (const [key, value] of initialMatches) {\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 for (const [key, rule] of Object.entries(MEDIA_RULES)) {\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 for (const [queryList, listener] of eventListenerPairs) {\n removeMediaQueryListener(queryList, listener);\n }\n };\n }, [createListener, hasMounted]);\n\n return { ...device };\n};\n"],"names":["breakpoint","tokens","breakpointsAsNumber","Number","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","initialMatches","Object","entries","map","key","rule","getInitialMediaQueryMatch","value","createListener","useCallback","e","requestAnimationFrame","matches","window","matchMedia","eventListenerPairs","queryList","listener","push","addMediaQueryListener","removeMediaQueryListener"],"mappings":"qSAcA,MAAQA,WAAAA,GAAeC,EAEjBC,EAAuBF,GACzBG,OAAOC,SAASJ,EAAWK,QAAQ,KAAM,KAEvCC,EAAiD,CACnDC,cAAe,eACXL,EAAoBF,EAAWQ,QAAU,OAE7CC,eAAgB,eAAeT,EAAWQ,2BACtCN,EAAoBF,EAAWU,OAAS,OAE5CC,cAAe,eAAeX,EAAWU,0BACrCR,EAAoBF,EAAWY,IAAM,OAEzCC,WAAY,eAAeb,EAAWY,MACtCE,WAAY,0BACZC,YAAa,4BAGXC,EAAgBC,IAAAA,CAClBC,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,EAAU,KACNN,GAAc,GACd,MAAMO,EAAiBC,OAAOC,QAAQ3B,GAAa4B,IAC/C,EAAEC,EAAKC,KAAU,CAACD,EAAKE,EAA0BD,KAGrD,IAAA,MAAYD,EAAKG,KAAUP,EACnBO,GACAX,EAAeX,EAAamB,KAGrC,IAEH,MAAMI,EAAiBC,EAClBL,GAA4BM,IACzBC,sBAAsB,KACdD,EAAEE,SACFhB,EAAeX,EAAamB,OAIxC,IAGJ,OAAAL,EAAU,KACN,IAAKP,IAAeqB,OAAOC,WACvB,OAEJ,MAAMC,EAEF,GAEJ,IAAA,MAAYX,EAAKC,KAASJ,OAAOC,QAAQ3B,GAAc,CACnD,MAAMyC,EAAYH,OAAOC,WAAWT,GAC9BY,EAAWT,EAAeJ,GAChCW,EAAmBG,KAAK,CAACF,EAAWC,IACpCE,EAAsBH,EAAWC,EACrC,CAEA,MAAO,KACH,IAAA,MAAYD,EAAWC,KAAaF,EAChCK,EAAyBJ,EAAWC,KAG7C,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 \"../../tokens.js\";\nimport {\n addMediaQueryListener,\n getInitialMediaQueryMatch,\n removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\nimport {\n ActionType,\n type ScreenAction,\n type ScreenState,\n reducer,\n} from \"./state.js\";\n\nconst { breakpoint } = tokens;\n\nconst breakpointsAsNumber = (breakpoint: string): number =>\n Number.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 const initialMatches = Object.entries(MEDIA_RULES).map(\n ([key, rule]) => [key, getInitialMediaQueryMatch(rule)],\n );\n\n for (const [key, value] of initialMatches) {\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 for (const [key, rule] of Object.entries(MEDIA_RULES)) {\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 for (const [queryList, listener] of eventListenerPairs) {\n removeMediaQueryListener(queryList, listener);\n }\n };\n }, [createListener, hasMounted]);\n\n return { ...device };\n};\n"],"names":["breakpoint","tokens","breakpointsAsNumber","Number","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","initialMatches","Object","entries","map","key","rule","getInitialMediaQueryMatch","value","createListener","useCallback","e","requestAnimationFrame","matches","window","matchMedia","eventListenerPairs","queryList","listener","push","addMediaQueryListener","removeMediaQueryListener"],"mappings":"gSAcA,MAAQA,WAAAA,GAAeC,EAEjBC,EAAuBF,GACzBG,OAAOC,SAASJ,EAAWK,QAAQ,KAAM,KAEvCC,EAAiD,CACnDC,cAAe,eACXL,EAAoBF,EAAWQ,QAAU,OAE7CC,eAAgB,eAAeT,EAAWQ,2BACtCN,EAAoBF,EAAWU,OAAS,OAE5CC,cAAe,eAAeX,EAAWU,0BACrCR,EAAoBF,EAAWY,IAAM,OAEzCC,WAAY,eAAeb,EAAWY,MACtCE,WAAY,0BACZC,YAAa,4BAGXC,EAAgBC,IAAAA,CAClBC,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,EAAU,KACNN,GAAc,GACd,MAAMO,EAAiBC,OAAOC,QAAQ3B,GAAa4B,IAC/C,EAAEC,EAAKC,KAAU,CAACD,EAAKE,EAA0BD,KAGrD,IAAA,MAAYD,EAAKG,KAAUP,EACnBO,GACAX,EAAeX,EAAamB,KAGrC,IAEH,MAAMI,EAAiBC,EAClBL,GAA4BM,IACzBC,sBAAsB,KACdD,EAAEE,SACFhB,EAAeX,EAAamB,OAIxC,IAGJ,OAAAL,EAAU,KACN,IAAKP,IAAeqB,OAAOC,WACvB,OAEJ,MAAMC,EAEF,GAEJ,IAAA,MAAYX,EAAKC,KAASJ,OAAOC,QAAQ3B,GAAc,CACnD,MAAMyC,EAAYH,OAAOC,WAAWT,GAC9BY,EAAWT,EAAeJ,GAChCW,EAAmBG,KAAK,CAACF,EAAWC,IACpCE,EAAsBH,EAAWC,EACrC,CAEA,MAAO,KACH,IAAA,MAAYD,EAAWC,KAAaF,EAChCK,EAAyBJ,EAAWC,KAG7C,CAACT,EAAgBhB,IAEb,IAAKG"}
@@ -1,2 +1,2 @@
1
- import{k as o}from"../../../index-DOHQmuhD.js";import t from"tailwindcss/plugin.js";import s from"../../core/tokens.js";const{breakpoint:e,typography:i}=s,m=t(({addComponents:t})=>{const s=Object.entries(i.style).map(([t,s])=>[`.${o(t)}`,{...s.small,[`@media (min-width: ${e.medium})`]:{...s.base}}]);t(Object.fromEntries(s))});export{m as jokulTypographyPlugin};
1
+ import e from"tailwindcss/plugin.js";import t from"../../tokens.js";const n=new RegExp("([\\p{Ll}\\d])(\\p{Lu})","gu"),r=new RegExp("(\\p{Lu})([\\p{Lu}][\\p{Ll}])","gu"),c=new RegExp("(\\d)\\p{Ll}|(\\p{L})\\d","u"),o=/[^\p{L}\d]+/giu,i="$1\0$2";function s(e){let t=e.trim();t=t.replace(n,i).replace(r,i),t=t.replace(o,"\0");let c=0,s=t.length;for(;"\0"===t.charAt(c);)c++;if(c===s)return[];for(;"\0"===t.charAt(s-1);)s--;return t.slice(c,s).split(/\0/g)}function l(e){const t=s(e);for(let e=0;e<t.length;e++){const n=t[e],r=c.exec(n);if(r){const c=r.index+(r[1]??r[2]).length;t.splice(e,1,n.slice(0,c),n.slice(c))}}return t}function p(e,t){const[n,r,c]=function(e,t={}){const n=t.split??(t.separateNumbers?l:s),r=t.prefixCharacters??"",c=t.suffixCharacters??"";let o=0,i=e.length;for(;o<e.length;){const t=e.charAt(o);if(!r.includes(t))break;o++}for(;i>o;){const t=i-1,n=e.charAt(t);if(!c.includes(n))break;i=t}return[e.slice(0,o),n(e.slice(o,i)),e.slice(i)]}(e,t);return n+r.map(function(e){return!1===e?e=>e.toLowerCase():t=>t.toLocaleLowerCase(e)}(t?.locale)).join(t?.delimiter??" ")+c}function u(e,t){return p(e,{delimiter:"-",...t})}const{textStyle:a}=t,f=e(({addComponents:e})=>{const t=Object.entries(a).map(([e,t])=>[`.${u(e)}`,{font:t}]);e(Object.fromEntries(t))});export{f as jokulTypographyPlugin};
2
2
  //# sourceMappingURL=jokulTypographyPlugin.js.map