@fremtind/jokul 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/build/NativeSelect-DSmX3GZo.cjs +2 -0
  2. package/build/NativeSelect-DSmX3GZo.cjs.map +1 -0
  3. package/build/NativeSelect-EidDABsT.js +2 -0
  4. package/build/NativeSelect-EidDABsT.js.map +1 -0
  5. package/build/build-stats.html +1 -1
  6. package/build/cjs/components/accordion/Accordion.js +2 -0
  7. package/build/cjs/components/accordion/Accordion.js.map +1 -0
  8. package/build/cjs/components/accordion/AccordionItem.js +2 -0
  9. package/build/cjs/components/accordion/AccordionItem.js.map +1 -0
  10. package/build/cjs/components/accordion/index.js +2 -0
  11. package/build/cjs/components/accordion/index.js.map +1 -0
  12. package/build/cjs/components/breadcrumb/Breadcrumb.js +2 -0
  13. package/build/cjs/components/breadcrumb/Breadcrumb.js.map +1 -0
  14. package/build/cjs/components/breadcrumb/BreadcrumbItem.js +2 -0
  15. package/build/cjs/components/breadcrumb/BreadcrumbItem.js.map +1 -0
  16. package/build/cjs/components/breadcrumb/index.js +2 -0
  17. package/build/cjs/components/breadcrumb/index.js.map +1 -0
  18. package/build/cjs/components/button/Button.js +2 -0
  19. package/build/cjs/components/button/Button.js.map +1 -0
  20. package/build/cjs/components/button/index.js +2 -0
  21. package/build/cjs/components/button/index.js.map +1 -0
  22. package/build/cjs/components/button/types.js +2 -0
  23. package/build/cjs/components/button/types.js.map +1 -0
  24. package/build/cjs/components/checkbox/Checkbox.js +2 -0
  25. package/build/cjs/components/checkbox/Checkbox.js.map +1 -0
  26. package/build/cjs/components/checkbox/index.js +2 -0
  27. package/build/cjs/components/checkbox/index.js.map +1 -0
  28. package/build/cjs/components/combobox/Combobox.js +2 -0
  29. package/build/cjs/components/combobox/Combobox.js.map +1 -0
  30. package/build/cjs/components/combobox/index.js +2 -0
  31. package/build/cjs/components/combobox/index.js.map +1 -0
  32. package/build/cjs/components/cookie-consent/CookieConsent.js +2 -0
  33. package/build/cjs/components/cookie-consent/CookieConsent.js.map +1 -0
  34. package/build/cjs/components/cookie-consent/CookieConsentContext.js +2 -0
  35. package/build/cjs/components/cookie-consent/CookieConsentContext.js.map +1 -0
  36. package/build/cjs/components/cookie-consent/CookieConsentModal.js +2 -0
  37. package/build/cjs/components/cookie-consent/CookieConsentModal.js.map +1 -0
  38. package/build/cjs/components/cookie-consent/consents/CustomConsents.js +2 -0
  39. package/build/cjs/components/cookie-consent/consents/CustomConsents.js.map +1 -0
  40. package/build/cjs/components/cookie-consent/consents/DefaultConsents.js +2 -0
  41. package/build/cjs/components/cookie-consent/consents/DefaultConsents.js.map +1 -0
  42. package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.js +2 -0
  43. package/build/cjs/components/cookie-consent/consents/RequirementCheckbox.js.map +1 -0
  44. package/build/cjs/components/cookie-consent/cookieConsentUtils.js +2 -0
  45. package/build/cjs/components/cookie-consent/cookieConsentUtils.js.map +1 -0
  46. package/build/cjs/components/cookie-consent/index.js +2 -0
  47. package/build/cjs/components/cookie-consent/index.js.map +1 -0
  48. package/build/cjs/components/cookie-consent/types.js +2 -0
  49. package/build/cjs/components/cookie-consent/types.js.map +1 -0
  50. package/build/cjs/components/datepicker/DatePicker.js +2 -0
  51. package/build/cjs/components/datepicker/DatePicker.js.map +1 -0
  52. package/build/cjs/components/datepicker/index.js +2 -0
  53. package/build/cjs/components/datepicker/index.js.map +1 -0
  54. package/build/cjs/components/datepicker/internal/Calendar.js +2 -0
  55. package/build/cjs/components/datepicker/internal/Calendar.js.map +1 -0
  56. package/build/cjs/components/datepicker/internal/calendarReducer.js +2 -0
  57. package/build/cjs/components/datepicker/internal/calendarReducer.js.map +1 -0
  58. package/build/cjs/components/datepicker/internal/useCalendar.js +2 -0
  59. package/build/cjs/components/datepicker/internal/useCalendar.js.map +1 -0
  60. package/build/cjs/components/datepicker/internal/utils.js +2 -0
  61. package/build/cjs/components/datepicker/internal/utils.js.map +1 -0
  62. package/build/cjs/components/datepicker/types.js +2 -0
  63. package/build/cjs/components/datepicker/types.js.map +1 -0
  64. package/build/cjs/components/datepicker/utils.js +2 -0
  65. package/build/cjs/components/datepicker/utils.js.map +1 -0
  66. package/build/cjs/components/datepicker/validation.js +2 -0
  67. package/build/cjs/components/datepicker/validation.js.map +1 -0
  68. package/build/cjs/components/index.js +1 -1
  69. package/build/cjs/components/input-group/FieldGroup.js +1 -1
  70. package/build/cjs/components/input-group/FieldGroup.js.map +1 -1
  71. package/build/cjs/components/input-group/InputGroup.js +1 -1
  72. package/build/cjs/components/input-group/InputGroup.js.map +1 -1
  73. package/build/cjs/components/input-group/Label.js +1 -1
  74. package/build/cjs/components/input-group/Label.js.map +1 -1
  75. package/build/cjs/components/input-group/SupportLabel.js +1 -1
  76. package/build/cjs/components/input-group/SupportLabel.js.map +1 -1
  77. package/build/cjs/components/list/List.js +2 -0
  78. package/build/cjs/components/list/List.js.map +1 -0
  79. package/build/cjs/components/list/ListItem.js +2 -0
  80. package/build/cjs/components/list/ListItem.js.map +1 -0
  81. package/build/cjs/components/list/index.js +2 -0
  82. package/build/cjs/components/list/index.js.map +1 -0
  83. package/build/cjs/components/modal/Modal.js +2 -0
  84. package/build/cjs/components/modal/Modal.js.map +1 -0
  85. package/build/cjs/components/modal/index.js +2 -0
  86. package/build/cjs/components/modal/index.js.map +1 -0
  87. package/build/cjs/components/modal/useModal.js +2 -0
  88. package/build/cjs/components/modal/useModal.js.map +1 -0
  89. package/build/cjs/components/radio-button/BaseRadioButton.js +2 -0
  90. package/build/cjs/components/radio-button/BaseRadioButton.js.map +1 -0
  91. package/build/cjs/components/radio-button/RadioButton.js +2 -0
  92. package/build/cjs/components/radio-button/RadioButton.js.map +1 -0
  93. package/build/cjs/components/radio-button/RadioButtonGroup.js +2 -0
  94. package/build/cjs/components/radio-button/RadioButtonGroup.js.map +1 -0
  95. package/build/cjs/components/radio-button/index.js +2 -0
  96. package/build/cjs/components/radio-button/index.js.map +1 -0
  97. package/build/cjs/components/radio-button/radioGroupContext.js +2 -0
  98. package/build/cjs/components/radio-button/radioGroupContext.js.map +1 -0
  99. package/build/cjs/components/select/NativeSelect.js +2 -0
  100. package/build/cjs/components/select/NativeSelect.js.map +1 -0
  101. package/build/cjs/components/select/Select.js +2 -0
  102. package/build/cjs/components/select/Select.js.map +1 -0
  103. package/build/cjs/components/select/index.js +2 -0
  104. package/build/cjs/components/select/index.js.map +1 -0
  105. package/build/cjs/components/select/select-utils.js +2 -0
  106. package/build/cjs/components/select/select-utils.js.map +1 -0
  107. package/build/cjs/components/tag/Tag.js +1 -1
  108. package/build/cjs/components/tag/Tag.js.map +1 -1
  109. package/build/cjs/components/text-input/BaseTextArea.js +2 -0
  110. package/build/cjs/components/text-input/BaseTextArea.js.map +1 -0
  111. package/build/cjs/components/text-input/BaseTextInput.js +2 -0
  112. package/build/cjs/components/text-input/BaseTextInput.js.map +1 -0
  113. package/build/cjs/components/text-input/TextArea.js +2 -0
  114. package/build/cjs/components/text-input/TextArea.js.map +1 -0
  115. package/build/cjs/components/text-input/TextInput.js +2 -0
  116. package/build/cjs/components/text-input/TextInput.js.map +1 -0
  117. package/build/cjs/components/text-input/index.js +2 -0
  118. package/build/cjs/components/text-input/index.js.map +1 -0
  119. package/build/cjs/components/tooltip/PopupTip.js +1 -1
  120. package/build/cjs/components/tooltip/PopupTip.js.map +1 -1
  121. package/build/cjs/components/tooltip/TooltipContent.js +1 -1
  122. package/build/cjs/components/tooltip/TooltipContent.js.map +1 -1
  123. package/build/cjs/components/tooltip/TooltipTrigger.js +1 -1
  124. package/build/cjs/components/tooltip/TooltipTrigger.js.map +1 -1
  125. package/build/cjs/index.js +1 -1
  126. package/build/components/accordion/Accordion.d.ts +8 -0
  127. package/build/components/accordion/AccordionItem.d.ts +10 -0
  128. package/build/components/accordion/index.d.ts +4 -0
  129. package/build/components/breadcrumb/Breadcrumb.d.ts +6 -0
  130. package/build/components/breadcrumb/BreadcrumbItem.d.ts +10 -0
  131. package/build/components/breadcrumb/index.d.ts +4 -0
  132. package/build/components/button/Button.d.ts +7 -0
  133. package/build/components/button/index.d.ts +2 -0
  134. package/build/components/button/types.d.ts +19 -0
  135. package/build/components/checkbox/Checkbox.d.ts +17 -0
  136. package/build/components/checkbox/index.d.ts +2 -0
  137. package/build/components/combobox/Combobox.d.ts +39 -0
  138. package/build/components/combobox/index.d.ts +2 -0
  139. package/build/components/cookie-consent/CookieConsent.d.ts +6 -0
  140. package/build/components/cookie-consent/CookieConsentContext.d.ts +48 -0
  141. package/build/components/cookie-consent/CookieConsentModal.d.ts +3 -0
  142. package/build/components/cookie-consent/consents/CustomConsents.d.ts +9 -0
  143. package/build/components/cookie-consent/consents/DefaultConsents.d.ts +9 -0
  144. package/build/components/cookie-consent/consents/RequirementCheckbox.d.ts +9 -0
  145. package/build/components/cookie-consent/cookieConsentUtils.d.ts +23 -0
  146. package/build/components/cookie-consent/index.d.ts +5 -0
  147. package/build/components/cookie-consent/types.d.ts +12 -0
  148. package/build/components/datepicker/DatePicker.d.ts +3 -0
  149. package/build/components/datepicker/index.d.ts +4 -0
  150. package/build/components/datepicker/internal/Calendar.d.ts +18 -0
  151. package/build/components/datepicker/internal/calendarReducer.d.ts +18 -0
  152. package/build/components/datepicker/internal/useCalendar.d.ts +59 -0
  153. package/build/components/datepicker/internal/utils.d.ts +167 -0
  154. package/build/components/datepicker/types.d.ts +269 -0
  155. package/build/components/datepicker/utils.d.ts +23 -0
  156. package/build/components/datepicker/validation.d.ts +11 -0
  157. package/build/components/index.d.ts +12 -0
  158. package/build/components/list/List.d.ts +8 -0
  159. package/build/components/list/ListItem.d.ts +8 -0
  160. package/build/components/list/index.d.ts +3 -0
  161. package/build/components/modal/Modal.d.ts +72 -0
  162. package/build/components/modal/index.d.ts +4 -0
  163. package/build/components/modal/useModal.d.ts +69 -0
  164. package/build/components/radio-button/BaseRadioButton.d.ts +10 -0
  165. package/build/components/radio-button/RadioButton.d.ts +15 -0
  166. package/build/components/radio-button/RadioButtonGroup.d.ts +24 -0
  167. package/build/components/radio-button/index.d.ts +6 -0
  168. package/build/components/radio-button/radioGroupContext.d.ts +16 -0
  169. package/build/components/select/NativeSelect.d.ts +19 -0
  170. package/build/components/select/Select.d.ts +53 -0
  171. package/build/components/select/index.d.ts +4 -0
  172. package/build/components/select/select-utils.d.ts +2 -0
  173. package/build/components/text-input/BaseTextArea.d.ts +27 -0
  174. package/build/components/text-input/BaseTextInput.d.ts +34 -0
  175. package/build/components/text-input/TextArea.d.ts +6 -0
  176. package/build/components/text-input/TextInput.d.ts +9 -0
  177. package/build/components/text-input/index.d.ts +4 -0
  178. package/build/es/components/accordion/Accordion.js +2 -0
  179. package/build/es/components/accordion/Accordion.js.map +1 -0
  180. package/build/es/components/accordion/AccordionItem.js +2 -0
  181. package/build/es/components/accordion/AccordionItem.js.map +1 -0
  182. package/build/es/components/accordion/index.js +2 -0
  183. package/build/es/components/accordion/index.js.map +1 -0
  184. package/build/es/components/breadcrumb/Breadcrumb.js +2 -0
  185. package/build/es/components/breadcrumb/Breadcrumb.js.map +1 -0
  186. package/build/es/components/breadcrumb/BreadcrumbItem.js +2 -0
  187. package/build/es/components/breadcrumb/BreadcrumbItem.js.map +1 -0
  188. package/build/es/components/breadcrumb/index.js +2 -0
  189. package/build/es/components/breadcrumb/index.js.map +1 -0
  190. package/build/es/components/button/Button.js +2 -0
  191. package/build/es/components/button/Button.js.map +1 -0
  192. package/build/es/components/button/index.js +2 -0
  193. package/build/es/components/button/index.js.map +1 -0
  194. package/build/es/components/button/types.js +2 -0
  195. package/build/es/components/button/types.js.map +1 -0
  196. package/build/es/components/checkbox/Checkbox.js +2 -0
  197. package/build/es/components/checkbox/Checkbox.js.map +1 -0
  198. package/build/es/components/checkbox/index.js +2 -0
  199. package/build/es/components/checkbox/index.js.map +1 -0
  200. package/build/es/components/combobox/Combobox.js +2 -0
  201. package/build/es/components/combobox/Combobox.js.map +1 -0
  202. package/build/es/components/combobox/index.js +2 -0
  203. package/build/es/components/combobox/index.js.map +1 -0
  204. package/build/es/components/cookie-consent/CookieConsent.js +2 -0
  205. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -0
  206. package/build/es/components/cookie-consent/CookieConsentContext.js +2 -0
  207. package/build/es/components/cookie-consent/CookieConsentContext.js.map +1 -0
  208. package/build/es/components/cookie-consent/CookieConsentModal.js +2 -0
  209. package/build/es/components/cookie-consent/CookieConsentModal.js.map +1 -0
  210. package/build/es/components/cookie-consent/consents/CustomConsents.js +2 -0
  211. package/build/es/components/cookie-consent/consents/CustomConsents.js.map +1 -0
  212. package/build/es/components/cookie-consent/consents/DefaultConsents.js +2 -0
  213. package/build/es/components/cookie-consent/consents/DefaultConsents.js.map +1 -0
  214. package/build/es/components/cookie-consent/consents/RequirementCheckbox.js +2 -0
  215. package/build/es/components/cookie-consent/consents/RequirementCheckbox.js.map +1 -0
  216. package/build/es/components/cookie-consent/cookieConsentUtils.js +2 -0
  217. package/build/es/components/cookie-consent/cookieConsentUtils.js.map +1 -0
  218. package/build/es/components/cookie-consent/index.js +2 -0
  219. package/build/es/components/cookie-consent/index.js.map +1 -0
  220. package/build/es/components/cookie-consent/types.js +2 -0
  221. package/build/es/components/cookie-consent/types.js.map +1 -0
  222. package/build/es/components/datepicker/DatePicker.js +2 -0
  223. package/build/es/components/datepicker/DatePicker.js.map +1 -0
  224. package/build/es/components/datepicker/index.js +2 -0
  225. package/build/es/components/datepicker/index.js.map +1 -0
  226. package/build/es/components/datepicker/internal/Calendar.js +2 -0
  227. package/build/es/components/datepicker/internal/Calendar.js.map +1 -0
  228. package/build/es/components/datepicker/internal/calendarReducer.js +2 -0
  229. package/build/es/components/datepicker/internal/calendarReducer.js.map +1 -0
  230. package/build/es/components/datepicker/internal/useCalendar.js +2 -0
  231. package/build/es/components/datepicker/internal/useCalendar.js.map +1 -0
  232. package/build/es/components/datepicker/internal/utils.js +2 -0
  233. package/build/es/components/datepicker/internal/utils.js.map +1 -0
  234. package/build/es/components/datepicker/types.js +2 -0
  235. package/build/es/components/datepicker/types.js.map +1 -0
  236. package/build/es/components/datepicker/utils.js +2 -0
  237. package/build/es/components/datepicker/utils.js.map +1 -0
  238. package/build/es/components/datepicker/validation.js +2 -0
  239. package/build/es/components/datepicker/validation.js.map +1 -0
  240. package/build/es/components/index.js +1 -1
  241. package/build/es/components/input-group/FieldGroup.js +1 -1
  242. package/build/es/components/input-group/FieldGroup.js.map +1 -1
  243. package/build/es/components/input-group/InputGroup.js +1 -1
  244. package/build/es/components/input-group/InputGroup.js.map +1 -1
  245. package/build/es/components/input-group/Label.js +1 -1
  246. package/build/es/components/input-group/Label.js.map +1 -1
  247. package/build/es/components/input-group/SupportLabel.js +1 -1
  248. package/build/es/components/input-group/SupportLabel.js.map +1 -1
  249. package/build/es/components/list/List.js +2 -0
  250. package/build/es/components/list/List.js.map +1 -0
  251. package/build/es/components/list/ListItem.js +2 -0
  252. package/build/es/components/list/ListItem.js.map +1 -0
  253. package/build/es/components/list/index.js +2 -0
  254. package/build/es/components/list/index.js.map +1 -0
  255. package/build/es/components/modal/Modal.js +2 -0
  256. package/build/es/components/modal/Modal.js.map +1 -0
  257. package/build/es/components/modal/index.js +2 -0
  258. package/build/es/components/modal/index.js.map +1 -0
  259. package/build/es/components/modal/useModal.js +2 -0
  260. package/build/es/components/modal/useModal.js.map +1 -0
  261. package/build/es/components/radio-button/BaseRadioButton.js +2 -0
  262. package/build/es/components/radio-button/BaseRadioButton.js.map +1 -0
  263. package/build/es/components/radio-button/RadioButton.js +2 -0
  264. package/build/es/components/radio-button/RadioButton.js.map +1 -0
  265. package/build/es/components/radio-button/RadioButtonGroup.js +2 -0
  266. package/build/es/components/radio-button/RadioButtonGroup.js.map +1 -0
  267. package/build/es/components/radio-button/index.js +2 -0
  268. package/build/es/components/radio-button/index.js.map +1 -0
  269. package/build/es/components/radio-button/radioGroupContext.js +2 -0
  270. package/build/es/components/radio-button/radioGroupContext.js.map +1 -0
  271. package/build/es/components/select/NativeSelect.js +2 -0
  272. package/build/es/components/select/NativeSelect.js.map +1 -0
  273. package/build/es/components/select/Select.js +2 -0
  274. package/build/es/components/select/Select.js.map +1 -0
  275. package/build/es/components/select/index.js +2 -0
  276. package/build/es/components/select/index.js.map +1 -0
  277. package/build/es/components/select/select-utils.js +2 -0
  278. package/build/es/components/select/select-utils.js.map +1 -0
  279. package/build/es/components/tag/Tag.js +1 -1
  280. package/build/es/components/tag/Tag.js.map +1 -1
  281. package/build/es/components/text-input/BaseTextArea.js +2 -0
  282. package/build/es/components/text-input/BaseTextArea.js.map +1 -0
  283. package/build/es/components/text-input/BaseTextInput.js +2 -0
  284. package/build/es/components/text-input/BaseTextInput.js.map +1 -0
  285. package/build/es/components/text-input/TextArea.js +2 -0
  286. package/build/es/components/text-input/TextArea.js.map +1 -0
  287. package/build/es/components/text-input/TextInput.js +2 -0
  288. package/build/es/components/text-input/TextInput.js.map +1 -0
  289. package/build/es/components/text-input/index.js +2 -0
  290. package/build/es/components/text-input/index.js.map +1 -0
  291. package/build/es/components/tooltip/PopupTip.js +1 -1
  292. package/build/es/components/tooltip/PopupTip.js.map +1 -1
  293. package/build/es/components/tooltip/TooltipContent.js +1 -1
  294. package/build/es/components/tooltip/TooltipContent.js.map +1 -1
  295. package/build/es/components/tooltip/TooltipTrigger.js +1 -1
  296. package/build/es/components/tooltip/TooltipTrigger.js.map +1 -1
  297. package/build/es/index.js +1 -1
  298. package/build/hooks/useAriaLiveRegion/useAriaLiveRegion.d.ts +1 -1
  299. package/package.json +31 -4
  300. package/src/components/accordion/styles/_index.scss +1 -0
  301. package/src/components/accordion/styles/accordion.css +166 -0
  302. package/src/components/accordion/styles/accordion.min.css +1 -0
  303. package/src/components/accordion/styles/accordion.scss +147 -0
  304. package/src/components/breadcrumb/styles/_index.scss +1 -0
  305. package/src/components/breadcrumb/styles/breadcrumb.css +29 -0
  306. package/src/components/breadcrumb/styles/breadcrumb.min.css +1 -0
  307. package/src/components/breadcrumb/styles/breadcrumb.scss +34 -0
  308. package/src/components/button/styles/_index.scss +1 -0
  309. package/src/components/button/styles/button.css +251 -0
  310. package/src/components/button/styles/button.min.css +1 -0
  311. package/src/components/button/styles/button.scss +294 -0
  312. package/src/components/checkbox/styles/_index.scss +1 -0
  313. package/src/components/checkbox/styles/checkbox.css +191 -0
  314. package/src/components/checkbox/styles/checkbox.min.css +1 -0
  315. package/src/components/checkbox/styles/checkbox.scss +229 -0
  316. package/src/components/combobox/styles/_index.scss +1 -0
  317. package/src/components/combobox/styles/combobox.css +337 -0
  318. package/src/components/combobox/styles/combobox.min.css +1 -0
  319. package/src/components/combobox/styles/combobox.scss +307 -0
  320. package/src/components/cookie-consent/styles/_index.scss +1 -0
  321. package/src/components/cookie-consent/styles/cookie-consent.css +94 -0
  322. package/src/components/cookie-consent/styles/cookie-consent.min.css +1 -0
  323. package/src/components/cookie-consent/styles/cookie-consent.scss +79 -0
  324. package/src/components/datepicker/styles/_calendar-date-button.scss +100 -0
  325. package/src/components/datepicker/styles/_calendar-navigation-dropdown.scss +53 -0
  326. package/src/components/datepicker/styles/_calendar-navigation.scss +54 -0
  327. package/src/components/datepicker/styles/_calendar-table.scss +27 -0
  328. package/src/components/datepicker/styles/_calendar.scss +68 -0
  329. package/src/components/datepicker/styles/_index.scss +1 -0
  330. package/src/components/datepicker/styles/datepicker.css +453 -0
  331. package/src/components/datepicker/styles/datepicker.min.css +1 -0
  332. package/src/components/datepicker/styles/datepicker.scss +63 -0
  333. package/src/components/list/styles/_index.scss +1 -0
  334. package/src/components/list/styles/list.css +128 -0
  335. package/src/components/list/styles/list.min.css +1 -0
  336. package/src/components/list/styles/list.scss +166 -0
  337. package/src/components/loader/styles/loader.css +6 -6
  338. package/src/components/loader/styles/loader.min.css +1 -1
  339. package/src/components/loader/styles/skeleton-loader.css +5 -5
  340. package/src/components/loader/styles/skeleton-loader.min.css +1 -1
  341. package/src/components/modal/styles/_index.scss +1 -0
  342. package/src/components/modal/styles/modal.css +115 -0
  343. package/src/components/modal/styles/modal.min.css +1 -0
  344. package/src/components/modal/styles/modal.scss +100 -0
  345. package/src/components/radio-button/styles/_index.scss +1 -0
  346. package/src/components/radio-button/styles/radio-button.css +180 -0
  347. package/src/components/radio-button/styles/radio-button.min.css +1 -0
  348. package/src/components/radio-button/styles/radio-button.scss +201 -0
  349. package/src/components/select/styles/_index.scss +1 -0
  350. package/src/components/select/styles/select.css +350 -0
  351. package/src/components/select/styles/select.min.css +1 -0
  352. package/src/components/select/styles/select.scss +330 -0
  353. package/src/components/text-input/styles/_index.scss +1 -0
  354. package/src/components/text-input/styles/text-input.css +513 -0
  355. package/src/components/text-input/styles/text-input.min.css +1 -0
  356. package/src/components/text-input/styles/text-input.scss +389 -0
  357. package/src/components/tooltip/styles/_index.scss +1 -0
  358. package/src/components/tooltip/styles/tooltip.css +136 -0
  359. package/src/components/tooltip/styles/tooltip.min.css +1 -0
  360. package/src/components/tooltip/styles/tooltip.scss +105 -0
@@ -0,0 +1,27 @@
1
+ import { default as React, TextareaHTMLAttributes } from 'react';
2
+ type Counter = {
3
+ /** Antall tegn før telleren når maksimum og vi viser en feilmelding */
4
+ maxLength: number;
5
+ /**
6
+ * Med teller vises en progress-bar i bunnen av tekstfeltet som krymper
7
+ * ned fra 100% (null tegn skrevet) til 0% (maks antall tegn skrevet).
8
+ * Om du vil skjule den, sett denne propen til true.
9
+ *
10
+ * @default false
11
+ */
12
+ hideProgress?: boolean;
13
+ };
14
+ export interface BaseTextAreaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "children"> {
15
+ /**
16
+ * Viser en teller i tekstfeltet når det har fokus.
17
+ */
18
+ counter?: Counter;
19
+ /** Sett antall rader skjemafeltet ekspanderes til ved focus. Innholdet scroller om feltet fylles med mer innhold enn det er plass til. */
20
+ rows?: number;
21
+ inline?: boolean;
22
+ startOpen?: boolean;
23
+ /** Gjør så skjemafeltet ekspanderer seg til å vise alt innhold i stedet for å scrolle */
24
+ autoExpand?: boolean;
25
+ }
26
+ export declare const BaseTextArea: React.ForwardRefExoticComponent<BaseTextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
27
+ export {};
@@ -0,0 +1,34 @@
1
+ import { default as React, MouseEventHandler, ReactNode, InputHTMLAttributes, HTMLProps } from 'react';
2
+ import { Density } from '../../core';
3
+ import { IconProps } from '../icon';
4
+ interface ActionBaseProps extends Exclude<HTMLProps<HTMLButtonElement>, "disabled"> {
5
+ icon: React.ReactElement<IconProps>;
6
+ label: string;
7
+ buttonRef?: React.Ref<HTMLButtonElement>;
8
+ }
9
+ export interface ActionButton extends ActionBaseProps {
10
+ type?: "button" | "reset";
11
+ onClick: MouseEventHandler<HTMLButtonElement>;
12
+ }
13
+ export interface ActionSubmit extends ActionBaseProps {
14
+ type: "submit";
15
+ onClick?: MouseEventHandler<HTMLButtonElement>;
16
+ }
17
+ export type Action = ActionButton | ActionSubmit;
18
+ export interface BaseTextInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "children"> {
19
+ /**
20
+ * Brukes til inputfelter hvor det brukes maskering, for formatering av store tall. Brukes typisk bare til valuta.
21
+ * @default "left"
22
+ */
23
+ align?: "left" | "right";
24
+ action?: Action;
25
+ density?: Density;
26
+ /**
27
+ * Benevnelse for feltet. Unngå å bruke både benevnelse og handling samtidig
28
+ * @example "kr"
29
+ * */
30
+ unit?: ReactNode;
31
+ width?: string;
32
+ }
33
+ export declare const BaseTextInput: React.ForwardRefExoticComponent<BaseTextInputProps & React.RefAttributes<HTMLInputElement>>;
34
+ export {};
@@ -0,0 +1,6 @@
1
+ import { default as React } from 'react';
2
+ import { InputGroupProps } from '../input-group';
3
+ import { BaseTextAreaProps } from './BaseTextArea';
4
+ export interface TextAreaProps extends Omit<InputGroupProps, "children">, BaseTextAreaProps {
5
+ }
6
+ export declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ import { InputGroupProps } from '../input-group';
3
+ import { BaseTextInputProps } from './BaseTextInput';
4
+ export interface TextInputProps extends Omit<InputGroupProps, "children">, BaseTextInputProps {
5
+ "data-testautoid"?: string;
6
+ inline?: boolean;
7
+ inputClassName?: string;
8
+ }
9
+ export declare const TextInput: React.ForwardRefExoticComponent<TextInputProps & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,4 @@
1
+ export { BaseTextArea, type BaseTextAreaProps } from './BaseTextArea';
2
+ export { BaseTextInput, type BaseTextInputProps } from './BaseTextInput';
3
+ export { TextArea, type TextAreaProps } from './TextArea';
4
+ export { TextInput, type TextInputProps } from './TextInput';
@@ -0,0 +1,2 @@
1
+ import{jsx as s}from"react/jsx-runtime";import{c as o}from"../../../clsx-BeLtu-UY.js";const a=({className:a,density:c,id:t,...i})=>s("section",{role:"group","data-testid":"jkl-accordion",className:o("jkl-accordion",a),"data-density":c,id:t,...i});export{a as Accordion};
2
+ //# sourceMappingURL=Accordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.js","sources":["../../../../src/components/accordion/Accordion.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { FC } from \"react\";\nimport { Density, WithChildren } from \"../..\";\n\nexport interface AccordionProps extends WithChildren {\n className?: string;\n density?: Density;\n id?: string;\n}\n\nexport const Accordion: FC<AccordionProps> = ({ className, density, id, ...rest }) => {\n return (\n <section\n role=\"group\"\n data-testid=\"jkl-accordion\"\n className={clsx(\"jkl-accordion\", className)}\n data-density={density}\n id={id}\n {...rest}\n />\n );\n};\n"],"names":["Accordion","className","density","id","rest","jsx","role","clsx"],"mappings":"sFAUa,MAAAA,EAAgC,EAAGC,UAAAA,EAAWC,QAAAA,EAASC,GAAAA,KAAOC,KAEnEC,EAAC,UAAA,CACGC,KAAK,QACL,cAAY,gBACZL,UAAWM,EAAK,gBAAiBN,GACjC,eAAcC,EACdC,GAAAA,KACIC"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as o,jsx as i}from"react/jsx-runtime";import{c as n}from"../../../clsx-BeLtu-UY.js";import{useState as c}from"react";import{useAnimatedDetails as s}from"../../hooks/useAnimatedDetails/useAnimatedDetails.js";import"../../hooks/useScreen/useScreen.js";import"../../hooks/useId/useId.js";import"../icon/Icon.js";import{ArrowVerticalAnimated as r}from"../icon/icons/animated/ArrowVerticalAnimated.js";import"../icon/icons/animated/ArrowHorizontalAnimated.js";import"../icon/icons/animated/PlusRemoveAnimated.js";import"../icon/icons/ArrowDownIcon.js";import"../icon/icons/ArrowLeftIcon.js";import"../icon/icons/ArrowNorthEastIcon.js";import"../icon/icons/ArrowRightIcon.js";import"../icon/icons/ArrowUpIcon.js";import"../icon/icons/CalendarIcon.js";import"../icon/icons/CheckIcon.js";import"../icon/icons/ChevronDownIcon.js";import"../icon/icons/ChevronLeftIcon.js";import"../icon/icons/ChevronRightIcon.js";import"../icon/icons/ChevronUpIcon.js";import"../icon/icons/CloseIcon.js";import"../icon/icons/CopyIcon.js";import"../icon/icons/DotsIcon.js";import"../icon/icons/DragIcon.js";import"../icon/icons/ErrorIcon.js";import"../icon/icons/GreenCheckIcon.js";import"../icon/icons/HamburgerIcon.js";import"../icon/icons/InfoIcon.js";import"../icon/icons/LinkIcon.js";import"../icon/icons/PlusIcon.js";import"../icon/icons/QuestionIcon.js";import"../icon/icons/RedCrossIcon.js";import"../icon/icons/SearchIcon.js";import"../icon/icons/SuccessIcon.js";import"../icon/icons/WarningIcon.js";import"../icon/icons/MinusIcon.js";import"../icon/icons/ThumbDownIcon.js";import"../icon/icons/ThumbUpIcon.js";import"../icon/icons/TrashCanIcon.js";import"../icon/icons/PenIcon.js";const t=({children:t,title:e,className:m,startExpanded:a=!1,onClick:p,id:j,...d})=>{const[l,I]=c(a),[h]=c((()=>a)),{detailsRef:u,summaryRef:k,contentRef:A,onSummaryClick:w}=s({onOpenChange:(o,i)=>{I(o),p&&p(i,o)},isExpanded:h});return o("details",{"data-testid":"jkl-accordion-item",...d,className:n("jkl-accordion-item",m),ref:u,id:j,children:[o("summary",{"data-testid":"jkl-accordion-item__title",className:"jkl-accordion-item__title",onClick:w,ref:k,children:[e,i(r,{variant:"inherit",className:"jkl-accordion-item__arrow",pointingDown:!l,bold:l})]}),i("div",{"data-testid":"jkl-accordion-item__content-wrapper",className:"jkl-accordion-item__content-wrapper",ref:A,children:i("div",{className:"jkl-accordion-item__content",children:t})})]})};export{t as AccordionItem};
2
+ //# sourceMappingURL=AccordionItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccordionItem.js","sources":["../../../../src/components/accordion/AccordionItem.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { FC, useState } from \"react\";\nimport { WithChildren } from \"../..\";\nimport { useAnimatedDetails } from \"../../hooks\";\nimport { ArrowVerticalAnimated } from \"../icon\";\n\nexport interface AccordionItemProps extends WithChildren {\n title: string;\n startExpanded?: boolean;\n className?: string;\n onClick?: (e: React.MouseEvent, isOpen: boolean) => void;\n id?: string;\n}\n\nexport const AccordionItem: FC<AccordionItemProps> = ({\n children,\n title,\n className,\n startExpanded = false,\n onClick,\n id,\n ...rest\n}) => {\n const [isOpen, setIsOpen] = useState(startExpanded);\n const [expandOnMount] = useState(() => startExpanded);\n\n const { detailsRef, summaryRef, contentRef, onSummaryClick } = useAnimatedDetails({\n onOpenChange: (open, e) => {\n setIsOpen(open);\n if (onClick) {\n onClick(e, open);\n }\n },\n isExpanded: expandOnMount,\n });\n\n return (\n <details\n data-testid=\"jkl-accordion-item\"\n {...rest}\n className={clsx(\"jkl-accordion-item\", className)}\n ref={detailsRef}\n id={id}\n >\n <summary\n data-testid=\"jkl-accordion-item__title\"\n className=\"jkl-accordion-item__title\"\n onClick={onSummaryClick}\n ref={summaryRef}\n >\n {title}\n <ArrowVerticalAnimated\n variant=\"inherit\"\n className=\"jkl-accordion-item__arrow\"\n pointingDown={!isOpen}\n bold={isOpen}\n />\n </summary>\n <div\n data-testid=\"jkl-accordion-item__content-wrapper\"\n className=\"jkl-accordion-item__content-wrapper\"\n ref={contentRef}\n >\n <div className=\"jkl-accordion-item__content\">{children}</div>\n </div>\n </details>\n );\n};\n"],"names":["AccordionItem","children","title","className","startExpanded","onClick","id","rest","isOpen","setIsOpen","useState","expandOnMount","detailsRef","summaryRef","contentRef","onSummaryClick","useAnimatedDetails","onOpenChange","open","e","isExpanded","jsxs","clsx","ref","jsx","ArrowVerticalAnimated","variant","pointingDown","bold"],"mappings":"4oDAcO,MAAMA,EAAwC,EACjDC,SAAAA,EACAC,MAAAA,EACAC,UAAAA,EACAC,cAAAA,GAAgB,EAChBC,QAAAA,EACAC,GAAAA,KACGC,MAEG,MAACC,EAAQC,GAAaC,EAASN,IAC9BO,GAAiBD,GAAS,IAAMN,KAE/BQ,WAAAA,EAAYC,WAAAA,EAAYC,WAAAA,EAAYC,eAAAA,GAAmBC,EAAmB,CAC9EC,aAAc,CAACC,EAAMC,KACjBV,EAAUS,GACNb,GACAA,EAAQc,EAAGD,EAAI,EAGvBE,WAAYT,IAIZ,OAAAU,EAAC,UAAA,CACG,cAAY,wBACRd,EACJJ,UAAWmB,EAAK,qBAAsBnB,GACtCoB,IAAKX,EACLN,GAAAA,EAEAL,SAAA,CAAAoB,EAAC,UAAA,CACG,cAAY,4BACZlB,UAAU,4BACVE,QAASU,EACTQ,IAAKV,EAEJZ,SAAA,CAAAC,EACDsB,EAACC,EAAA,CACGC,QAAQ,UACRvB,UAAU,4BACVwB,cAAenB,EACfoB,KAAMpB,OAGdgB,EAAC,MAAA,CACG,cAAY,sCACZrB,UAAU,sCACVoB,IAAKT,EAELb,SAACuB,EAAA,MAAA,CAAIrB,UAAU,8BAA+BF,SAAAA,QAClD"}
@@ -0,0 +1,2 @@
1
+ import{AccordionItem as o}from"./AccordionItem.js";import{Accordion as c}from"./Accordion.js";export{c as Accordion,o as AccordionItem};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{jsx as e,jsxs as a,Fragment as r}from"react/jsx-runtime";import{c as s}from"../../../clsx-BeLtu-UY.js";import t from"react";const l=({className:l,children:n,density:c,...i})=>{const m=t.Children.count(n);return e("nav",{"aria-label":"Sti",className:s("jkl-breadcrumb",l),"data-layout-density":c,...i,children:e("ol",{className:"jkl-breadcrumb__list",children:t.Children.map(n,((s,l)=>{const n=l+1===m;return a(r,{children:[t.isValidElement(s)?t.cloneElement(s,{isLastElement:n}):s,!n&&e("span",{className:"jkl-breadcrumb__item-separator","aria-hidden":"true",children:"›"})]})}))})})};export{l as Breadcrumb};
2
+ //# sourceMappingURL=Breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumb.js","sources":["../../../../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React from \"react\";\nimport { Density, WithChildren } from \"../..\";\nimport { BreadcrumbItemProps } from \"./BreadcrumbItem\";\n\nexport interface BreadcrumbProps extends WithChildren {\n className?: string;\n density?: Density;\n}\n\nexport const Breadcrumb = ({ className, children, density, ...rest }: BreadcrumbProps): JSX.Element => {\n const numberOfChildren = React.Children.count(children);\n return (\n <nav aria-label=\"Sti\" className={clsx(\"jkl-breadcrumb\", className)} data-layout-density={density} {...rest}>\n <ol className=\"jkl-breadcrumb__list\">\n {React.Children.map(children, (child, index) => {\n const isLastElement = index + 1 === numberOfChildren;\n return (\n <>\n {React.isValidElement<BreadcrumbItemProps>(child)\n ? React.cloneElement<BreadcrumbItemProps>(child, {\n isLastElement,\n })\n : child}\n {!isLastElement && (\n <span className=\"jkl-breadcrumb__item-separator\" aria-hidden=\"true\">\n ›\n </span>\n )}\n </>\n );\n })}\n </ol>\n </nav>\n );\n};\n"],"names":["Breadcrumb","className","children","density","rest","numberOfChildren","React","Children","count","jsx","clsx","map","child","index","isLastElement","jsxs","Fragment","isValidElement","cloneElement"],"mappings":"mIAUa,MAAAA,EAAa,EAAGC,UAAAA,EAAWC,SAAAA,EAAUC,QAAAA,KAAYC,MAC1D,MAAMC,EAAmBC,EAAMC,SAASC,MAAMN,GAE1C,OAAAO,EAAC,OAAI,aAAW,MAAMR,UAAWS,EAAK,iBAAkBT,GAAY,sBAAqBE,KAAaC,EAClGF,SAAAO,EAAC,KAAG,CAAAR,UAAU,uBACTC,SAAAI,EAAMC,SAASI,IAAIT,GAAU,CAACU,EAAOC,KAC5BC,MAAAA,EAAgBD,EAAQ,IAAMR,EACpC,OAESU,EAAAC,EAAA,CAAAd,SAAA,CAAAI,EAAMW,eAAoCL,GACrCN,EAAMY,aAAkCN,EAAO,CAC3CE,cAAAA,IAEJF,GACJE,GACGL,EAAA,OAAA,CAAKR,UAAU,iCAAiC,cAAY,OAAOC,SAEpE,QAER,OAIhB"}
@@ -0,0 +1,2 @@
1
+ import{jsx as e}from"react/jsx-runtime";import{c as r}from"../../../clsx-BeLtu-UY.js";import a from"react";const m=({className:m,children:s,isLastElement:l,...i})=>e("li",{className:r("jkl-breadcrumb__item",m),...i,children:a.Children.map(s,(e=>a.isValidElement(e)?a.cloneElement(e,{"aria-current":l?"page":void 0,className:"jkl-link"}):e))});export{m as BreadcrumbItem};
2
+ //# sourceMappingURL=BreadcrumbItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbItem.js","sources":["../../../../src/components/breadcrumb/BreadcrumbItem.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { AnchorHTMLAttributes } from \"react\";\nimport { WithChildren } from \"../..\";\n\nexport interface BreadcrumbItemProps extends WithChildren {\n className?: string;\n /**\n * Settes automatisk av Breadcrumb\n * @default false\n */\n isLastElement?: boolean;\n}\n\nexport const BreadcrumbItem = ({ className, children, isLastElement, ...rest }: BreadcrumbItemProps): JSX.Element => {\n return (\n <li className={clsx(\"jkl-breadcrumb__item\", className)} {...rest}>\n {React.Children.map(children, (child) => {\n if (React.isValidElement<AnchorHTMLAttributes<HTMLAnchorElement>>(child)) {\n return React.cloneElement<AnchorHTMLAttributes<HTMLAnchorElement>>(child, {\n \"aria-current\": isLastElement ? \"page\" : undefined,\n className: \"jkl-link\",\n });\n } else {\n return child;\n }\n })}\n </li>\n );\n};\n"],"names":["BreadcrumbItem","className","children","isLastElement","rest","jsx","clsx","React","Children","map","child","isValidElement","cloneElement"],"mappings":"2GAaa,MAAAA,EAAiB,EAAGC,UAAAA,EAAWC,SAAAA,EAAUC,cAAAA,KAAkBC,KAE/DC,EAAA,KAAA,CAAGJ,UAAWK,EAAK,uBAAwBL,MAAgBG,EACvDF,SAAMK,EAAAC,SAASC,IAAIP,GAAWQ,GACvBH,EAAMI,eAAwDD,GACvDH,EAAMK,aAAsDF,EAAO,CACtE,eAAgBP,EAAgB,YAAS,EACzCF,UAAW,aAGRS"}
@@ -0,0 +1,2 @@
1
+ import{Breadcrumb as r}from"./Breadcrumb.js";import{BreadcrumbItem as m}from"./BreadcrumbItem.js";export{r as Breadcrumb,m as BreadcrumbItem};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{jsx as t,jsxs as o}from"react/jsx-runtime";import{c as e}from"../../../clsx-BeLtu-UY.js";import r,{useCallback as n}from"react";import"../../hooks/useScreen/useScreen.js";import{useAriaLiveRegion as s}from"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js";import"../../hooks/useId/useId.js";import{Loader as a}from"../loader/Loader.js";const i=r.forwardRef((function(r,i){const{as:c="button",children:l,className:u,density:d,onTouchStart:h,loader:m,iconLeft:j,iconRight:p,variant:k="secondary",...y}=r,b=c,v=n((t=>{h&&h(t);const o=t.target;if(o&&t.targetTouches.length){const e=t.targetTouches[0].clientX-o.getBoundingClientRect().x,r=t.targetTouches[0].clientY-o.getBoundingClientRect().y;o.style.setProperty("--jkl-touch-xcoord",e.toPrecision(4)+"px"),o.style.setProperty("--jkl-touch-ycoord",r.toPrecision(4)+"px"),o.classList.add("jkl-button--pressed"),setTimeout((()=>{o.classList.remove("jkl-button--pressed"),o.style.removeProperty("--jkl-touch-xcoord"),o.style.removeProperty("--jkl-touch-ycoord")}),400)}}),[h]),f=s(null==m?void 0:m.showLoader);return t(b,{...f,"data-density":d,className:e("jkl-button","jkl-button--"+k,u,{"jkl-button--icon-left":j,"jkl-button--icon-right":p}),disabled:"button"===c?null==m?void 0:m.showLoader:void 0,onTouchStart:v,...y,ref:i,children:t("div",{className:"jkl-button__content",children:o("div",{className:e("jkl-button__slider",{"jkl-button__slider--show-loader":!(null==m||!m.showLoader)}),children:[j&&t("span",{className:"jkl-button__icon",children:j}),t("span",{className:"jkl-button__children",children:l}),p&&t("span",{className:"jkl-button__icon",children:p}),m&&t("div",{className:"jkl-button__loader",children:t(a,{textDescription:m.textDescription,"aria-hidden":!m.showLoader})})]})})})}));function c(o){const e={...o,variant:"primary"};return t(i,{...e})}function l(o){const e={...o,variant:"secondary"};return t(i,{...e})}function u(o){const e={...o,variant:"tertiary"};return t(i,{...e})}function d(o){const e={...o,variant:"ghost"};return t(i,{...e})}export{i as Button,d as GhostButton,c as PrimaryButton,l as SecondaryButton,u as TertiaryButton};
2
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../../src/components/button/Button.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, { ButtonHTMLAttributes, type TouchEvent, useCallback } from \"react\";\nimport type { PolymorphicRef } from \"../..\";\nimport { useAriaLiveRegion } from \"../../hooks\";\nimport { Loader } from \"../loader\";\nimport type { ButtonComponent, ButtonProps } from \"./types\";\n\nexport const Button = React.forwardRef(function Button<ElementType extends React.ElementType = \"button\">(\n props: ButtonProps<ElementType>,\n ref?: PolymorphicRef<ElementType>,\n) {\n const {\n as = \"button\",\n children,\n className,\n density,\n onTouchStart,\n loader,\n iconLeft,\n iconRight,\n variant = \"secondary\",\n ...rest\n } = props;\n\n const Component = as;\n\n const handleTouch = useCallback(\n (event: TouchEvent<HTMLButtonElement>) => {\n onTouchStart && onTouchStart(event);\n\n const target = event.target as HTMLButtonElement;\n if (target && event.targetTouches.length) {\n const Xcoord = event.targetTouches[0].clientX - target.getBoundingClientRect().x;\n const Ycoord = event.targetTouches[0].clientY - target.getBoundingClientRect().y;\n target.style.setProperty(\"--jkl-touch-xcoord\", Xcoord.toPrecision(4) + \"px\");\n target.style.setProperty(\"--jkl-touch-ycoord\", Ycoord.toPrecision(4) + \"px\");\n target.classList.add(\"jkl-button--pressed\");\n\n setTimeout(() => {\n target.classList.remove(\"jkl-button--pressed\");\n target.style.removeProperty(\"--jkl-touch-xcoord\");\n target.style.removeProperty(\"--jkl-touch-ycoord\");\n }, 400);\n }\n },\n [onTouchStart],\n );\n\n const ariaLive = useAriaLiveRegion(loader?.showLoader);\n\n return (\n <Component\n {...ariaLive}\n data-density={density}\n className={clsx(\"jkl-button\", \"jkl-button--\" + variant, className, {\n \"jkl-button--icon-left\": iconLeft,\n \"jkl-button--icon-right\": iconRight,\n })}\n disabled={as === \"button\" ? loader?.showLoader : undefined}\n onTouchStart={handleTouch}\n {...rest}\n ref={ref}\n >\n <div className=\"jkl-button__content\">\n <div\n className={clsx(\"jkl-button__slider\", {\n \"jkl-button__slider--show-loader\": !!loader?.showLoader,\n })}\n >\n {iconLeft && <span className=\"jkl-button__icon\">{iconLeft}</span>}\n <span className=\"jkl-button__children\">{children}</span>\n {iconRight && <span className=\"jkl-button__icon\">{iconRight}</span>}\n\n {loader && (\n <div className=\"jkl-button__loader\">\n <Loader textDescription={loader.textDescription} aria-hidden={!loader.showLoader} />\n </div>\n )}\n </div>\n </div>\n </Component>\n );\n}) as ButtonComponent;\n\nexport function PrimaryButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = { ...props, variant: \"primary\" } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function SecondaryButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = { ...props, variant: \"secondary\" } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function TertiaryButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = { ...props, variant: \"tertiary\" } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function GhostButton<ElementType extends React.ElementType = \"button\">(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"loader\">,\n) {\n const buttonProps = { ...props, variant: \"ghost\" } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n"],"names":["Button","React","forwardRef","props","ref","as","children","className","density","onTouchStart","loader","iconLeft","iconRight","variant","rest","Component","handleTouch","useCallback","event","target","targetTouches","length","Xcoord","clientX","getBoundingClientRect","x","Ycoord","clientY","y","style","setProperty","toPrecision","classList","add","setTimeout","remove","removeProperty","ariaLive","useAriaLiveRegion","showLoader","jsx","clsx","disabled","jsxs","Loader","textDescription","PrimaryButton","buttonProps","SecondaryButton","TertiaryButton","GhostButton"],"mappings":"yVAOO,MAAMA,EAASC,EAAMC,YAAW,SACnCC,EACAC,GAEM,MACFC,GAAAA,EAAK,SACLC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EAAU,eACPC,GACHX,EAEEY,EAAYV,EAEZW,EAAcC,GACfC,IACGT,GAAgBA,EAAaS,GAE7B,MAAMC,EAASD,EAAMC,OACjBA,GAAAA,GAAUD,EAAME,cAAcC,OAAQ,CAChC,MAAAC,EAASJ,EAAME,cAAc,GAAGG,QAAUJ,EAAOK,wBAAwBC,EACzEC,EAASR,EAAME,cAAc,GAAGO,QAAUR,EAAOK,wBAAwBI,EAC/ET,EAAOU,MAAMC,YAAY,qBAAsBR,EAAOS,YAAY,GAAK,MACvEZ,EAAOU,MAAMC,YAAY,qBAAsBJ,EAAOK,YAAY,GAAK,MAChEZ,EAAAa,UAAUC,IAAI,uBAErBC,YAAW,KACAf,EAAAa,UAAUG,OAAO,uBACjBhB,EAAAU,MAAMO,eAAe,sBACrBjB,EAAAU,MAAMO,eAAe,qBAAoB,GACjD,IACP,IAEJ,CAAC3B,IAGC4B,EAAWC,EAAkB,MAAA5B,OAAA,EAAAA,EAAQ6B,YAGvC,OAAAC,EAACzB,EAAA,IACOsB,EACJ,eAAc7B,EACdD,UAAWkC,EAAK,aAAc,eAAiB5B,EAASN,EAAW,CAC/D,wBAAyBI,EACzB,yBAA0BC,IAE9B8B,SAAiB,WAAPrC,EAAkB,MAAAK,OAAA,EAAAA,EAAQ6B,gBAAa,EACjD9B,aAAcO,KACVF,EACJV,IAAAA,EAEAE,SAAAkC,EAAC,MAAI,CAAAjC,UAAU,sBACXD,SAAAqC,EAAC,MAAA,CACGpC,UAAWkC,EAAK,qBAAsB,CAClC,oCAAqC,MAAA/B,IAAAA,EAAQ6B,cAGhDjC,SAAA,CAAAK,GAAa6B,EAAA,OAAA,CAAKjC,UAAU,mBAAoBD,SAASK,IACzD6B,EAAA,OAAA,CAAKjC,UAAU,uBAAwBD,SAAAA,IACvCM,GAAa4B,EAAC,OAAK,CAAAjC,UAAU,mBAAoBD,SAAUM,IAE3DF,GACG8B,EAAC,MAAI,CAAAjC,UAAU,qBACXD,SAACkC,EAAAI,EAAA,CAAOC,gBAAiBnC,EAAOmC,gBAAiB,eAAcnC,EAAO6B,qBAOlG,IAEO,SAASO,EACZ3C,GAGA,MAAM4C,EAAc,IAAK5C,EAAOU,QAAS,WAClC,OAAA2B,EAACxC,EAAQ,IAAG+C,GACvB,CAEO,SAASC,EACZ7C,GAGA,MAAM4C,EAAc,IAAK5C,EAAOU,QAAS,aAClC,OAAA2B,EAACxC,EAAQ,IAAG+C,GACvB,CAEO,SAASE,EACZ9C,GAGA,MAAM4C,EAAc,IAAK5C,EAAOU,QAAS,YAClC,OAAA2B,EAACxC,EAAQ,IAAG+C,GACvB,CAEO,SAASG,EACZ/C,GAEA,MAAM4C,EAAc,IAAK5C,EAAOU,QAAS,SAClC,OAAA2B,EAACxC,EAAQ,IAAG+C,GACvB"}
@@ -0,0 +1,2 @@
1
+ import{Button as t,PrimaryButton as a,SecondaryButton as o,TertiaryButton as r}from"./Button.js";export{t as Button,a as PrimaryButton,o as SecondaryButton,r as TertiaryButton};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ const t=["primary","secondary","tertiary","ghost"];export{t as buttonVariants};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../../src/components/button/types.ts"],"sourcesContent":["import { Density, PolymorphicPropsWithRef } from \"../..\";\n\nexport const buttonVariants = [\"primary\", \"secondary\", \"tertiary\", \"ghost\"] as const;\nexport type ButtonVariant = (typeof buttonVariants)[number];\n\nexport type ButtonProps<ElementType extends React.ElementType> = PolymorphicPropsWithRef<\n ElementType,\n {\n density?: Density;\n /**\n * Hvilken variant av knappen skal vises\n * @default \"secondary\"\n */\n variant?: ButtonVariant;\n className?: string;\n loader?: {\n showLoader: boolean;\n textDescription: string;\n };\n iconLeft?: React.ReactNode;\n iconRight?: React.ReactNode;\n }\n>;\n\nexport type ButtonComponent = <ElementType extends React.ElementType = \"button\">(\n props: ButtonProps<ElementType>,\n) => React.ReactElement | null;\n"],"names":["buttonVariants"],"mappings":"AAEO,MAAMA,EAAiB,CAAC,UAAW,YAAa,WAAY"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as e,jsx as c}from"react/jsx-runtime";import{c as a}from"../../../clsx-BeLtu-UY.js";import{forwardRef as s,useRef as t,useImperativeHandle as n,useEffect as r}from"react";import"../../hooks/useScreen/useScreen.js";import{useId as i}from"../../hooks/useId/useId.js";const o=s(((s,o)=>{const{id:l,children:d,invalid:k,className:h,inline:m=!1,density:x,"data-testautoid":u,checked:b,indeterminate:p,...j}=s,_=t(null);n(o,(()=>_.current),[]);const f=i(l||"jkl-checkbox",{generateSuffix:!l});return r((()=>{!0===b&&!0===p&&"production"!==process.env.NODE_ENV&&console.warn("A Checkbox can not be both checked and indeterminate, and will be treated as checked"),_.current&&(_.current.indeterminate=!b&&!!p)}),[b,p]),e("div",{className:a("jkl-checkbox",h,{"jkl-checkbox--inline":m,"jkl-checkbox--error":k}),"data-density":x,children:[c("input",{id:f,ref:_,className:"jkl-checkbox__input","data-testid":"jkl-checkbox-input","aria-invalid":k,type:"checkbox","data-testautoid":u,checked:b,...j}),e("label",{htmlFor:f,className:"jkl-checkbox__label",children:[e("span",{className:"jkl-checkbox__mark",children:[c("span",{className:"jkl-checkbox__indeterminate-mark"}),c("span",{className:"jkl-checkbox__check-mark"})]}),c("span",{className:"jkl-checkbox__text",children:d})]})]})}));o.displayName="Checkbox";export{o as Checkbox};
2
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checkbox.js","sources":["../../../../src/components/checkbox/Checkbox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n ReactNode,\n forwardRef,\n ChangeEventHandler,\n FocusEventHandler,\n InputHTMLAttributes,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { DataTestAutoId, Density } from \"../..\";\nimport { useId } from \"../../hooks\";\n\nexport interface CheckboxProps extends DataTestAutoId, InputHTMLAttributes<HTMLInputElement> {\n children: ReactNode;\n name: string;\n value: string;\n checked?: boolean;\n inline?: boolean;\n className?: string;\n density?: Density;\n invalid?: boolean;\n onChange?: ChangeEventHandler<HTMLInputElement>;\n onFocus?: FocusEventHandler<HTMLInputElement>;\n onBlur?: FocusEventHandler<HTMLInputElement>;\n indeterminate?: boolean;\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>((props, ref) => {\n const {\n id,\n children,\n invalid,\n className,\n inline = false,\n density,\n \"data-testautoid\": testAutoId,\n checked,\n indeterminate,\n ...rest\n } = props;\n\n const inputRef = useRef<HTMLInputElement>(null);\n useImperativeHandle(ref, () => inputRef.current!, []);\n\n const inputId = useId(id || \"jkl-checkbox\", { generateSuffix: !id });\n\n useEffect(() => {\n if (checked === true && indeterminate === true && process.env.NODE_ENV !== \"production\") {\n console.warn(\"A Checkbox can not be both checked and indeterminate, and will be treated as checked\");\n }\n if (inputRef.current) {\n inputRef.current.indeterminate = !checked && !!indeterminate;\n }\n }, [checked, indeterminate]);\n\n return (\n <div\n className={clsx(\"jkl-checkbox\", className, {\n \"jkl-checkbox--inline\": inline,\n \"jkl-checkbox--error\": invalid,\n })}\n data-density={density}\n >\n <input\n id={inputId}\n ref={inputRef}\n className=\"jkl-checkbox__input\"\n data-testid=\"jkl-checkbox-input\"\n aria-invalid={invalid}\n type=\"checkbox\"\n data-testautoid={testAutoId}\n checked={checked}\n {...rest}\n />\n <label htmlFor={inputId} className=\"jkl-checkbox__label\">\n <span className=\"jkl-checkbox__mark\">\n <span className=\"jkl-checkbox__indeterminate-mark\" />\n <span className=\"jkl-checkbox__check-mark\" />\n </span>\n <span className=\"jkl-checkbox__text\">{children}</span>\n </label>\n </div>\n );\n});\n\nCheckbox.displayName = \"Checkbox\";\n"],"names":["Checkbox","forwardRef","props","ref","id","children","invalid","className","inline","density","testAutoId","checked","indeterminate","rest","inputRef","useRef","useImperativeHandle","current","inputId","useId","generateSuffix","useEffect","process","env","NODE_ENV","console","warn","jsxs","clsx","jsx","type","htmlFor","displayName"],"mappings":"qRA6BO,MAAMA,EAAWC,GAA4C,CAACC,EAAOC,KAClE,MACFC,GAAAA,EACAC,SAAAA,EACAC,QAAAA,EACAC,UAAAA,EACAC,OAAAA,GAAS,EACTC,QAAAA,EACA,kBAAmBC,EACnBC,QAAAA,EACAC,cAAAA,KACGC,GACHX,EAEEY,EAAWC,EAAyB,MAC1CC,EAAoBb,GAAK,IAAMW,EAASG,SAAU,IAE5CC,MAAAA,EAAUC,EAAMf,GAAM,eAAgB,CAAEgB,gBAAiBhB,IAE/D,OAAAiB,GAAU,MACU,IAAZV,IAAsC,IAAlBC,GAAmD,eAAzBU,QAAQC,IAAIC,UAC1DC,QAAQC,KAAK,wFAEbZ,EAASG,UACTH,EAASG,QAAQL,eAAiBD,KAAaC,EAAAA,GAEpD,CAACD,EAASC,IAGTe,EAAC,MAAA,CACGpB,UAAWqB,EAAK,eAAgBrB,EAAW,CACvC,uBAAwBC,EACxB,sBAAuBF,IAE3B,eAAcG,EAEdJ,SAAA,CAAAwB,EAAC,QAAA,CACGzB,GAAIc,EACJf,IAAKW,EACLP,UAAU,sBACV,cAAY,qBACZ,eAAcD,EACdwB,KAAK,WACL,kBAAiBpB,EACjBC,QAAAA,KACIE,IAEPc,EAAA,QAAA,CAAMI,QAASb,EAASX,UAAU,sBAC/BF,SAAA,CAACsB,EAAA,OAAA,CAAKpB,UAAU,qBACZF,SAAA,CAACwB,EAAA,OAAA,CAAKtB,UAAU,qCAChBsB,EAAC,OAAK,CAAAtB,UAAU,gCAEnBsB,EAAA,OAAA,CAAKtB,UAAU,qBAAsBF,SAAAA,SAC1C,IAKZL,EAASgC,YAAc"}
@@ -0,0 +1,2 @@
1
+ import{Checkbox as o}from"./Checkbox.js";export{o as Checkbox};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{c as n}from"../../../clsx-BeLtu-UY.js";import{useState as t,useRef as i,useEffect as r,useCallback as a,useMemo as s}from"react";import{useAnimatedHeight as c}from"../../hooks/useAnimatedHeight/useAnimatedHeight.js";import"../../hooks/useScreen/useScreen.js";import{useId as l}from"../../hooks/useId/useId.js";import{useListNavigation as u}from"../../hooks/useListNavigation/useListNavigation.js";import"../icon/Icon.js";import{ArrowVerticalAnimated as p}from"../icon/icons/animated/ArrowVerticalAnimated.js";import"../icon/icons/animated/ArrowHorizontalAnimated.js";import"../icon/icons/animated/PlusRemoveAnimated.js";import"../icon/icons/ArrowDownIcon.js";import"../icon/icons/ArrowLeftIcon.js";import"../icon/icons/ArrowNorthEastIcon.js";import"../icon/icons/ArrowRightIcon.js";import"../icon/icons/ArrowUpIcon.js";import"../icon/icons/CalendarIcon.js";import{CheckIcon as m}from"../icon/icons/CheckIcon.js";import"../icon/icons/ChevronDownIcon.js";import"../icon/icons/ChevronLeftIcon.js";import"../icon/icons/ChevronRightIcon.js";import"../icon/icons/ChevronUpIcon.js";import"../icon/icons/CloseIcon.js";import"../icon/icons/CopyIcon.js";import"../icon/icons/DotsIcon.js";import"../icon/icons/DragIcon.js";import"../icon/icons/ErrorIcon.js";import"../icon/icons/GreenCheckIcon.js";import"../icon/icons/HamburgerIcon.js";import"../icon/icons/InfoIcon.js";import"../icon/icons/LinkIcon.js";import"../icon/icons/PlusIcon.js";import"../icon/icons/QuestionIcon.js";import"../icon/icons/RedCrossIcon.js";import"../icon/icons/SearchIcon.js";import"../icon/icons/SuccessIcon.js";import"../icon/icons/WarningIcon.js";import"../icon/icons/MinusIcon.js";import"../icon/icons/ThumbDownIcon.js";import"../icon/icons/ThumbUpIcon.js";import"../icon/icons/TrashCanIcon.js";import"../icon/icons/PenIcon.js";import{IconButton as d}from"../icon-button/IconButton.js";import{Tooltip as b}from"../tooltip/Tooltip.js";import{TooltipContent as j}from"../tooltip/TooltipContent.js";import{TooltipTrigger as v}from"../tooltip/TooltipTrigger.js";import{InputGroup as h}from"../input-group/InputGroup.js";import{Tag as f}from"../tag/Tag.js";function g(o){return"string"==typeof o?{value:o,label:o}:o}const k=({id:k,placeholder:_,items:I,onChange:x,onFocus:w,onBlur:y,value:C,label:A,noMatchingOption:L,labelProps:T,helpLabel:N,errorLabel:$,width:D,density:P,name:B,className:E,invalid:S,hasTagHover:F})=>{var M,O;const H=l(k||"jkl-combobox",{generateSuffix:!k}),K=`${H}_label`,R=`${H}_button`,V=`${H}_search-input`,[U,G]=t(C||[]),[q,z]=t(!0),[Q,W]=t(!1),[J,X]=t(""),[Y,Z]=t(!1),[oo,eo]=t(!1),no=i(null),to=i(null),io=i(!1);r((()=>{X(""),Q&&no.current&&no.current.focus()}),[Q]),r((()=>{G((o=>C||o))}),[C]);const ro=o=>!!U&&U.some((e=>e.value===o.value)),ao=a((o=>U.filter((e=>e.value!==o))),[U]),so=a(((o,e)=>{let n=ao(e);G(n),x({type:"change",target:{name:B,value:e,selectedOptions:n}}),o.stopPropagation(),0===n.length&&eo(!1)}),[ao,G,x,B,eo]),co=a((o=>{var e;let n;if(U.some((e=>e.value===o)))n=ao(o);else{const e=I.find((e=>e.value===o));n=[...U,e]}null==(e=no.current)||e.focus(),G(n),x({type:"change",target:{name:B,value:o,selectedOptions:n}})}),[U,G,x,B,ao,I]),lo=o=>{var e;null==(e=no.current)||e.focus(),W(!0),X(o.target.value)},uo=s((()=>{if(!J)return I;const o=I.filter((o=>o.label.toLowerCase().indexOf(J.toLowerCase())>=0));return Z(0===o.length),o}),[J,I]),[po,mo]=t(null!=(M=uo[0])&&M.value?`${H}-${null==(O=uo[0])?void 0:O.value}`:void 0);r((()=>{z(!Q)}),[Q]),r((()=>{const o=o=>{"Escape"===o.key&&Q&&W(!1)};return typeof window<"u"&&window.addEventListener("keydown",o),()=>{typeof window<"u"&&Q&&window.removeEventListener("keydown",o)}}),[W,Q]);const bo=a((o=>{o?no.current&&no.current.focus():io.current&&to.current&&to.current.focus()}),[]),jo=a((()=>{io.current||(w&&w({type:"change",target:{name:B,value:(null==U?void 0:U[0].value)||"",selectedOptions:U}}),io.current=!0,W(!0))}),[w,U,B]),[vo]=c(Q,{onFirstVisible:bo,onTransitionEnd:bo});u({ref:vo});const ho=i(null),fo=a((o=>{var e,n;const t=ho.current;t&&t.contains(o.relatedTarget)||(X(""),y&&(y({type:"blur",target:{name:B,value:(null==(e=null==U?void 0:U[0])?void 0:e.value)||"",selectedOptions:U}}),null==(n=to.current)||n.dispatchEvent(new Event("focusout",{bubbles:!0}))),io.current=!1,W(!1))}),[y,B,U]),go=a((o=>{o.target.focus({preventScroll:!0})}),[]),ko=a((o=>{var e;if("ArrowDown"===o.key){o.preventDefault(),o.stopPropagation();const n=vo.current;n&&(null==(e=n.querySelector('[role="option"]'))||e.focus())}else"Escape"===o.key&&(o.preventDefault(),o.stopPropagation(),W(!1));if(o.metaKey&&"a"===o.key||o.ctrlKey&&"a"===o.key){o.preventDefault(),o.stopPropagation();const e=U.map((o=>({...o,isMarked:!0})));eo(!0),G(e)}else if("Backspace"===o.key)if(o.stopPropagation(),eo(!1),U.some((o=>o.isMarked))){const o=U.filter((o=>!o.isMarked));G(o),X("")}else U.length>0&&""===J&&so(o,U[U.length-1].value)}),[U,J,vo,so]),_o=a((o=>{if("Tab"===o.key)no.current&&(o.preventDefault(),o.stopPropagation(),o.shiftKey||W(!1),no.current.focus());else if("ArrowUp"===o.key&&vo.current&&no.current){const e=vo.current.querySelector('[role="option"]:not([hidden])');o.currentTarget.id===(null==e?void 0:e.id)&&no.current&&no.current.focus()}}),[W,vo]),Io=U.length>=1;return o(h,{label:A,id:V,ref:ho,"data-testid":"jkl-combobox",className:n("jkl-combobox",E,{"jkl-combobox--invalid":!!$||S,"jkl-combobox--menu-open":Q,"jkl-combobox--menu-closed":!Q&&Io}),labelProps:{id:K,...T},helpLabel:N,errorLabel:$,density:P,render:t=>e("div",{className:n("jkl-combobox__wrapper",{"jkl-combobox__wrapper--active-value":Io}),style:{width:D},tabIndex:-1,onFocus:jo,onBlur:fo,children:[e("div",{className:"jkl-combobox__tags","data-testid":"jkl-combobox__tags",children:[U.map(g).map((n=>o(f,{className:`jkl-tag ${oo&&"jkl-tag__marked"}`,"data-testid":"jkl-tag",dismissAction:{onClick:o=>{no.current&&no.current.focus(),so(o,n.value)},onBlur:fo,label:`Fjern ${n.value}`},children:F?e(b,{children:[e(v,{children:[" ",o("span",{"aria-hidden":"true","data-testid":"jkl-tag__content",children:n.tagLabel?n.tagLabel:n.label})]}),o(j,{children:n.label})]},n.value):o("span",{"aria-hidden":"true","data-testid":"jkl-tag__content",children:n.tagLabel?n.tagLabel:n.label})},n.value))),o("input",{...t,className:"jkl-combobox__search-input",onChange:lo,"data-testid":"jkl-combobox__search-input",onFocus:jo,onBlur:fo,onKeyDown:ko,value:J,ref:no,"aria-controls":H,role:"combobox","aria-autocomplete":"list","aria-expanded":Q,placeholder:U.length>0?"":_,autoComplete:"off"})]}),e("div",{className:"jkl-combobox__menu",role:"listbox",ref:vo,id:H,"aria-labelledby":K,"aria-multiselectable":"true","aria-activedescendant":po,onFocus:jo,onBlur:fo,tabIndex:-1,children:[uo.map(((n,t)=>e("button",{type:"button",id:`${H}__${n.value}`,"aria-selected":ro(n),role:"option",value:n.value,onBlur:fo,className:`jkl-combobox__option ${ro(n)&&"jkl-combobox__option--selected"}`,"data-testid":"jkl-combobox__option","data-testautoid":`jkl-combobox__option-${t}`,onFocus:jo,onKeyDown:_o,onClick:o=>{mo(`${H}__${n.value}`),o.stopPropagation(),co(n.value),X("")},onMouseOver:go,children:[n.description?e("span",{children:[n.label,o("span",{className:"jkl-combobox__option-description",children:n.description})]}):n.label,ro(n)?e("span",{children:[o(m,{})," "]}):null]},`${H}-${n.value}`))),Y&&o("div",{className:"jkl-combobox__no-option",children:L})]}),o("div",{className:"jkl-combobox__actions",children:o(d,{id:R,onFocus:jo,onBlur:fo,className:"jkl-combobox__button","data-testid":"jkl-combobox__button","aria-label":`${U.map((o=>o.label))||"Velg"},${A}`,"aria-expanded":Q,"aria-controls":H,role:"button",onClick:()=>W(!0),onMouseDown:o=>{var e;o.preventDefault(),null==(e=to.current)||e.focus()},children:o(p,{pointingDown:q})})})]})})};k.displayName="Combobox";export{k as Combobox,g as getComboboxValuePair};
2
+ //# sourceMappingURL=Combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.js","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n FC,\n useEffect,\n useRef,\n useState,\n useCallback,\n KeyboardEvent,\n ChangeEvent,\n FocusEvent,\n MouseEvent,\n useMemo,\n} from \"react\";\nimport { ValuePair, Density } from \"../..\";\nimport { useId, useAnimatedHeight, useListNavigation } from \"../../hooks\";\nimport { ArrowVerticalAnimated, CheckIcon } from \"../icon\";\nimport { IconButton } from \"../icon-button\";\nimport { InputGroup, InputGroupProps, type LabelProps } from \"../input-group\";\nimport { Tag } from \"../tag\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\n\nexport type ComboboxValuePair = ValuePair & {\n tagLabel?: string;\n isMarked?: boolean;\n};\n\nexport function getComboboxValuePair(item: string | ComboboxValuePair): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\ninterface PartialChangeEvent extends Partial<Omit<ChangeEvent<HTMLElement>, \"target\">> {\n type: \"change\" | \"blur\";\n target: {\n name: string;\n value: string;\n selectedOptions: Array<ValuePair>;\n };\n}\n\ntype ChangeEventHandler = (event: PartialChangeEvent) => void;\n\ninterface ComboboxProps extends InputGroupProps {\n id?: string;\n placeholder?: string;\n labelProps?: Omit<LabelProps, \"children\" | \"density\" | \"htmlFor\" | \"standAlone\">;\n items: Array<ValuePair>;\n noMatchingOption?: string;\n label: string;\n name: string;\n value?: Array<ValuePair>;\n density?: Density;\n width?: string;\n helpLabel?: string;\n errorLabel?: string;\n className?: string;\n invalid?: boolean;\n hasTagHover?: boolean;\n onChange: ChangeEventHandler;\n onBlur?: ChangeEventHandler;\n onFocus?: ChangeEventHandler;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<Array<ComboboxValuePair>>(value || []);\n const [isPointingDown, setIsPointingDown] = useState<boolean>(true);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n } else {\n return selectedValue.some((value) => value.value === option.value);\n }\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e: React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent> | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n let newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, setSelectedValue, onChange, name, setMarked],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, setSelectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: { target: { value: React.SetStateAction<string> } }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) => option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >= 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<string | undefined>(\n options[0]?.value ? `${listId}-${options[0]?.value}` : undefined,\n );\n\n // Håndtere arrow-state\n useEffect(() => {\n if (showMenu) {\n setIsPointingDown(false);\n } else {\n setIsPointingDown(true);\n }\n }, [showMenu]);\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [setShowMenu, showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (e: FocusEvent<HTMLDivElement | HTMLInputElement | HTMLButtonElement>) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent =\n componentRootElement && componentRootElement.contains(e.relatedTarget as Node);\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(new Event(\"focusout\", { bubbles: true }));\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement.querySelector<HTMLButtonElement>('[role=\"option\"]')?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some((item) => item.isMarked);\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter((item) => !item.isMarked);\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(e, selectedValue[selectedValue.length - 1].value);\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector('[role=\"option\"]:not([hidden])');\n if (e.currentTarget.id === firstVisible?.id && searchRef.current) {\n searchRef.current.focus();\n }\n }\n }\n },\n [setShowMenu, dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", { \"jkl-combobox__wrapper--active-value\": hasSelection })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div className=\"jkl-combobox__tags\" data-testid=\"jkl-combobox__tags\">\n {selectedValue.map(getComboboxValuePair).map((option) => (\n <Tag\n key={option.value}\n className={`jkl-tag ${marked && \"jkl-tag__marked\"}`}\n data-testid=\"jkl-tag\"\n dismissAction={{\n onClick: (e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n },\n onBlur: handleBlur,\n label: `Fjern ${option.value}`,\n }}\n >\n {hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {\" \"}\n <span aria-hidden=\"true\" data-testid=\"jkl-tag__content\">\n {option.tagLabel ? option.tagLabel : option.label}\n </span>\n </TooltipTrigger>\n <TooltipContent>{option.label}</TooltipContent>\n </Tooltip>\n ) : (\n <span aria-hidden=\"true\" data-testid=\"jkl-tag__content\">\n {option.tagLabel ? option.tagLabel : option.label}\n </span>\n )}\n </Tag>\n ))}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={selectedValue.length > 0 ? \"\" : placeholder}\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) && \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(`${listId}__${option.value}`); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">{option.description}</span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && <div className=\"jkl-combobox__no-option\">{noMatchingOption}</div>}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label={`${selectedValue.map((value) => value.label) || \"Velg\"},${label}`}\n aria-expanded={showMenu}\n aria-controls={listId}\n role=\"button\"\n onClick={() => setShowMenu(true)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated pointingDown={isPointingDown} />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","isPointingDown","setIsPointingDown","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","_a","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","_b","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","componentRootElement","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","jsx","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","children","Tag","dismissAction","onClick","Tooltip","TooltipTrigger","tagLabel","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{Combobox as o,getComboboxValuePair as b}from"./Combobox.js";export{o as Combobox,b as getComboboxValuePair};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{jsx as o}from"react/jsx-runtime";import{useEffect as e}from"react";import{usePreviousValue as t}from"../../hooks/usePreviousValue/usePreviousValue.js";import"../../hooks/useScreen/useScreen.js";import"../../hooks/useId/useId.js";import{useCookieConsentState as s}from"./CookieConsentContext.js";import{CookieConsentModal as n}from"./CookieConsentModal.js";import{setConsentCookie as i}from"./cookieConsentUtils.js";const r=({blocking:r,onAccept:a,...c})=>{const{dispatch:u,consent:m,cookieName:l,cookieDomain:p}=s(),C=t(m);if(e((()=>{a&&m!==C&&a(m)}),[a,m,C]),typeof navigator<"u"&&!navigator.cookieEnabled)return a&&a({functional:"denied",marketing:"denied",statistics:"denied"}),null;return r?o(n,{...c,onAccept:o=>{const e=Object.fromEntries(Object.entries(o).filter((([,o])=>null!=o))),t={...m,...e};u({type:"UPDATE_CONSENT",payload:t}),u({type:"SET_SHOW_CONSENT",payload:!1}),i({consent:t,name:l,domain:p})}}):null};export{r as CookieConsent};
2
+ //# sourceMappingURL=CookieConsent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { usePreviousValue } from \"../../hooks\";\nimport { useCookieConsentState } from \"./CookieConsentContext\";\nimport { CookieConsentModal } from \"./CookieConsentModal\";\nimport { setConsentCookie } from \"./cookieConsentUtils\";\nimport { AcceptConsentCallback, Consent } from \"./types\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({ blocking, onAccept, ...rest }: CookieConsentProps): JSX.Element | null => {\n const { dispatch, consent, cookieName, cookieDomain } = useCookieConsentState();\n const prevConsent = usePreviousValue(consent);\n\n useEffect(() => {\n if (onAccept) {\n // Prevent onAccept from being triggered every time state changes\\\n if (consent !== prevConsent) {\n onAccept(consent);\n }\n }\n }, [onAccept, consent, prevConsent]);\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const handleAccept = (newConsent: Partial<Consent>) => {\n // Filter out null values from the new consent\n const newConsentWithoutNullValues = Object.fromEntries(\n Object.entries(newConsent).filter(([, value]) => value != null),\n );\n\n // Merge the existing consent with the new consent\n const updatedConsent: Consent = {\n ...consent,\n ...newConsentWithoutNullValues,\n };\n\n dispatch({ type: \"UPDATE_CONSENT\", payload: updatedConsent });\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: false });\n setConsentCookie({ consent: updatedConsent, name: cookieName, domain: cookieDomain });\n };\n\n // This returns different variants of consents based on the behavior required to get the consent\n // Blocking implies a blocking modal demanding an active action before the user can interact with the application\n if (blocking) {\n return <CookieConsentModal {...rest} onAccept={handleAccept} />;\n }\n\n return null;\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","dispatch","consent","cookieName","cookieDomain","useCookieConsentState","prevConsent","usePreviousValue","useEffect","navigator","cookieEnabled","functional","marketing","statistics","jsx","CookieConsentModal","newConsent","newConsentWithoutNullValues","Object","fromEntries","entries","filter","value","updatedConsent","type","payload","setConsentCookie","name","domain"],"mappings":"saAYO,MAAMA,EAAgB,EAAGC,SAAAA,EAAUC,SAAAA,KAAaC,MACnD,MAAQC,SAAAA,EAAUC,QAAAA,EAASC,WAAAA,EAAYC,aAAAA,GAAiBC,IAClDC,EAAcC,EAAiBL,GAYrC,GAVAM,GAAU,KACFT,GAEIG,IAAYI,GACZP,EAASG,EAAO,GAGzB,CAACH,EAAUG,EAASI,WAGZG,UAAc,MAAgBA,UAAUC,cAC/C,OAAIX,GACSA,EAAA,CACLY,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAsBPf,OAAAA,EACQgB,EAAAC,EAAA,IAAuBf,EAAMD,SApBnBiB,IAElB,MAAMC,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQJ,GAAYK,QAAO,GAAIC,KAAoB,MAATA,KAI/CC,EAA0B,IACzBrB,KACAe,GAGPhB,EAAS,CAAEuB,KAAM,iBAAkBC,QAASF,IAC5CtB,EAAS,CAAEuB,KAAM,mBAAoBC,SAAS,IAC9CC,EAAiB,CAAExB,QAASqB,EAAgBI,KAAMxB,EAAYyB,OAAQxB,GAAc,IASjF,IAAA"}
@@ -0,0 +1,2 @@
1
+ import{jsx as e}from"react/jsx-runtime";import t,{useMemo as o,useEffect as n}from"react";import{getConsentCookie as s,buildRequirementsObject as a,shouldShowConsentDialog as i}from"./cookieConsentUtils.js";const r="fremtind-cookie-consent",c=t.createContext(void 0),d=(e,t)=>{switch(t.type){case"SET_SHOW_CONSENT":return{...e,isOpen:t.payload};case"SET_SHOW_SETTINGS":return{...e,showSettings:t.payload};case"UPDATE_CONSENT":return{...e,consent:{...e.consent,...t.payload}};case"UPDATE_REQUIREMENTS":return{...e,requirement:{...e.requirement,...t.payload}};default:throw new Error(`Unhandled action type: ${t.type}`)}},u=({children:u,cookieAdapter:p,marketing:S,functional:l,statistics:C,cookieName:E=r,cookieDomain:m})=>{const T=o((()=>s({adapter:p,name:E})??{marketing:null,functional:null,statistics:null}),[p,E]),h=o((()=>a({marketing:S,functional:l,statistics:C})),[S,l,C]),[k,N]=t.useReducer(d,{isOpen:!1,showSettings:!1,requirement:h,consent:T});n((()=>{i(h,T)?N({type:"SET_SHOW_CONSENT",payload:!0}):T&&N({type:"UPDATE_CONSENT",payload:T})}),[h,T]);const y={state:k,dispatch:N,cookieName:E,cookieDomain:m};return e(c.Provider,{value:y,children:u})},p=()=>{const e=t.useContext(c);if(void 0===e)throw new Error("useCookieConsentState must be used within a CookieConsentProvider");return{dispatch:e.dispatch,cookieName:e.cookieName,cookieDomain:e.cookieDomain,...e.state}},S=()=>{const e=t.useContext(c);if(void 0===e)throw new Error("useCookieConsent must be used within a CookieConsentProvider");return{openConsentModalWithSettings:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!0})},openConsentModalWithDefaults:()=>{e.dispatch({type:"SET_SHOW_CONSENT",payload:!0}),e.dispatch({type:"SET_SHOW_SETTINGS",payload:!1})},consents:e.state.consent}};export{u as CookieConsentProvider,r as DEFAULT_COOKIE_NAME,S as useCookieConsent,p as useCookieConsentState};
2
+ //# sourceMappingURL=CookieConsentContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieConsentContext.js","sources":["../../../../src/components/cookie-consent/CookieConsentContext.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { WithChildren } from \"../..\";\nimport { shouldShowConsentDialog, getConsentCookie, buildRequirementsObject } from \"./cookieConsentUtils\";\nimport type { Consent, ConsentRequirement } from \"./types\";\n\n// https://kentcdodds.com/blog/how-to-use-react-context-effectively\n\ninterface SetShowConsentAction {\n type: \"SET_SHOW_CONSENT\";\n payload: boolean;\n}\n\ninterface SetShowSettingsAction {\n type: \"SET_SHOW_SETTINGS\";\n payload: boolean;\n}\n\ninterface UpdateConsentAction {\n type: \"UPDATE_CONSENT\";\n payload: Consent;\n}\n\ninterface UpdateRequirementsAction {\n type: \"UPDATE_REQUIREMENTS\";\n payload: ConsentRequirement;\n}\n\ntype Action = SetShowConsentAction | UpdateConsentAction | SetShowSettingsAction | UpdateRequirementsAction;\ntype Dispatch = (action: Action) => void;\n\ninterface State {\n isOpen: boolean;\n showSettings: boolean;\n requirement: ConsentRequirement;\n consent: Consent;\n}\n\nexport const DEFAULT_COOKIE_NAME = \"fremtind-cookie-consent\";\n\nconst CookieConsentContext = React.createContext<\n { state: State; dispatch: Dispatch; cookieName: string; cookieDomain?: string } | undefined\n>(undefined);\n\nconst cookieConsentReducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"SET_SHOW_CONSENT\":\n return { ...state, isOpen: action.payload };\n\n case \"SET_SHOW_SETTINGS\":\n return {\n ...state,\n showSettings: action.payload,\n };\n\n case \"UPDATE_CONSENT\":\n return {\n ...state,\n consent: {\n ...state.consent,\n ...action.payload,\n },\n };\n\n case \"UPDATE_REQUIREMENTS\":\n return {\n ...state,\n requirement: {\n ...state.requirement,\n ...action.payload,\n },\n };\n\n default: {\n // @ts-ignore Denne skal ikke oppstå, men den _kan_ oppstå\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n};\n\nexport interface CookieConsentProviderProps extends Partial<ConsentRequirement>, WithChildren {\n cookieAdapter?: () => Consent | undefined;\n cookieName?: string;\n cookieDomain?: string;\n}\n\nconst CookieConsentProvider: React.FC<CookieConsentProviderProps> = ({\n children,\n cookieAdapter,\n marketing,\n functional,\n statistics,\n cookieName = DEFAULT_COOKIE_NAME,\n cookieDomain,\n}) => {\n // Load existing consent at initial render\n const consentCookie = useMemo(() => {\n return (\n getConsentCookie({ adapter: cookieAdapter, name: cookieName }) ?? {\n marketing: null,\n functional: null,\n statistics: null,\n }\n );\n }, [cookieAdapter, cookieName]);\n\n const requirement = useMemo(\n () => buildRequirementsObject({ marketing, functional, statistics }),\n [marketing, functional, statistics],\n );\n\n const [state, dispatch] = React.useReducer(cookieConsentReducer, {\n isOpen: false,\n showSettings: false,\n requirement,\n consent: consentCookie,\n });\n\n useEffect(() => {\n if (shouldShowConsentDialog(requirement, consentCookie)) {\n dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n } else if (consentCookie) {\n dispatch({ type: \"UPDATE_CONSENT\", payload: consentCookie });\n }\n }, [requirement, consentCookie]);\n\n const value = { state, dispatch, cookieName, cookieDomain };\n return <CookieConsentContext.Provider value={value}>{children}</CookieConsentContext.Provider>;\n};\n\ninterface UseCookieConsentState extends State {\n dispatch: Dispatch;\n cookieName: string;\n cookieDomain?: string;\n}\n\n// control and state for internal use\nconst useCookieConsentState = (): UseCookieConsentState => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\"useCookieConsentState must be used within a CookieConsentProvider\");\n }\n\n return {\n dispatch: context.dispatch,\n cookieName: context.cookieName,\n cookieDomain: context.cookieDomain,\n ...context.state,\n };\n};\n\ntype UseCookieConsent = {\n openConsentModalWithSettings: () => void;\n openConsentModalWithDefaults: () => void;\n /** Se hvilke samtykker som er gitt, om du for eksempel trenger styre UI basert på samtykker. */\n consents: Consent;\n};\n\n// expose functionality to be used by consumers\nconst useCookieConsent = (): UseCookieConsent => {\n const context = React.useContext(CookieConsentContext);\n if (context === undefined) {\n throw new Error(\"useCookieConsent must be used within a CookieConsentProvider\");\n }\n\n const openConsentModalWithSettings = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: true });\n };\n\n const openConsentModalWithDefaults = () => {\n context.dispatch({ type: \"SET_SHOW_CONSENT\", payload: true });\n context.dispatch({ type: \"SET_SHOW_SETTINGS\", payload: false });\n };\n\n const consents = context.state.consent;\n\n return { openConsentModalWithSettings, openConsentModalWithDefaults, consents };\n};\n\nexport { CookieConsentProvider, useCookieConsentState, useCookieConsent };\n"],"names":["DEFAULT_COOKIE_NAME","CookieConsentContext","React","createContext","cookieConsentReducer","state","action","type","isOpen","payload","showSettings","consent","requirement","Error","CookieConsentProvider","children","cookieAdapter","marketing","functional","statistics","cookieName","cookieDomain","consentCookie","useMemo","getConsentCookie","adapter","name","buildRequirementsObject","dispatch","useReducer","useEffect","shouldShowConsentDialog","value","jsx","Provider","useCookieConsentState","context","useContext","useCookieConsent","openConsentModalWithSettings","openConsentModalWithDefaults","consents"],"mappings":"+MAqCO,MAAMA,EAAsB,0BAE7BC,EAAuBC,EAAMC,mBAEjC,GAEIC,EAAuB,CAACC,EAAcC,KACxC,OAAQA,EAAOC,MACX,IAAK,mBACD,MAAO,IAAKF,EAAOG,OAAQF,EAAOG,SAEtC,IAAK,oBACM,MAAA,IACAJ,EACHK,aAAcJ,EAAOG,SAG7B,IAAK,iBACM,MAAA,IACAJ,EACHM,QAAS,IACFN,EAAMM,WACNL,EAAOG,UAItB,IAAK,sBACM,MAAA,IACAJ,EACHO,YAAa,IACNP,EAAMO,eACNN,EAAOG,UAItB,QAEI,MAAM,IAAII,MAAM,0BAA0BP,EAAOC,QAEzD,EASEO,EAA8D,EAChEC,SAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,WAAAA,EACAC,WAAAA,EAAapB,EACbqB,aAAAA,MAGMC,MAAAA,EAAgBC,GAAQ,IAEtBC,EAAiB,CAAEC,QAAST,EAAeU,KAAMN,KAAiB,CAC9DH,UAAW,KACXC,WAAY,KACZC,WAAY,OAGrB,CAACH,EAAeI,IAEbR,EAAcW,GAChB,IAAMI,EAAwB,CAAEV,UAAAA,EAAWC,WAAAA,EAAYC,WAAAA,KACvD,CAACF,EAAWC,EAAYC,KAGrBd,EAAOuB,GAAY1B,EAAM2B,WAAWzB,EAAsB,CAC7DI,QAAQ,EACRE,cAAc,EACdE,YAAAA,EACAD,QAASW,IAGbQ,GAAU,KACFC,EAAwBnB,EAAaU,GACrCM,EAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACvCa,GACPM,EAAS,CAAErB,KAAM,iBAAkBE,QAASa,GAAe,GAEhE,CAACV,EAAaU,IAEXU,MAAAA,EAAQ,CAAE3B,MAAAA,EAAOuB,SAAAA,EAAUR,WAAAA,EAAYC,aAAAA,GACrC,OAAAY,EAAAhC,EAAqBiC,SAArB,CAA8BF,MAAAA,EAAejB,SAAAA,GAAS,EAU5DoB,EAAwB,KACpBC,MAAAA,EAAUlC,EAAMmC,WAAWpC,GACjC,QAAgB,IAAZmC,EACM,MAAA,IAAIvB,MAAM,qEAGb,MAAA,CACHe,SAAUQ,EAAQR,SAClBR,WAAYgB,EAAQhB,WACpBC,aAAce,EAAQf,gBACnBe,EAAQ/B,MAAA,EAYbiC,EAAmB,KACfF,MAAAA,EAAUlC,EAAMmC,WAAWpC,GACjC,QAAgB,IAAZmC,EACM,MAAA,IAAIvB,MAAM,gEAeb,MAAA,CAAE0B,6BAZ4B,KACjCH,EAAQR,SAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACtD2B,EAAQR,SAAS,CAAErB,KAAM,oBAAqBE,SAAS,GAAM,EAU1B+B,6BAPF,KACjCJ,EAAQR,SAAS,CAAErB,KAAM,mBAAoBE,SAAS,IACtD2B,EAAQR,SAAS,CAAErB,KAAM,oBAAqBE,SAAS,GAAO,EAKGgC,SAFpDL,EAAQ/B,MAAMM"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as o,jsx as e}from"react/jsx-runtime";import{useCallback as s,useEffect as t}from"react";import n from"react-dom";import"../../hooks/useScreen/useScreen.js";import{useId as a}from"../../hooks/useId/useId.js";import{ModalContainer as r,ModalOverlay as m}from"../modal/Modal.js";import{useModal as i}from"../modal/useModal.js";import{CustomConsents as l}from"./consents/CustomConsents.js";import{DefaultConsents as c}from"./consents/DefaultConsents.js";import{useCookieConsentState as d}from"./CookieConsentContext.js";import{convertBooleanConsentObjectToConsentObject as u}from"./cookieConsentUtils.js";const C=({onAccept:C,...p})=>{const{isOpen:f,requirement:j,showSettings:k}=d(),h=s((o=>{C("implicit"===o?u(j):o)}),[C,j]),[M,x]=i({id:a("jkl-cookie-modal"),role:"alertdialog",title:"Informasjonskapsler"});return t((()=>{M&&(f?M.show():M.hide())}),[M,f]),typeof document>"u"?null:n.createPortal(o(r,{...p,...x.container,"data-testautoid":"jkl-cookie-consent-modal",children:[e(m,{...x.overlay}),e(k?l:c,{modalConfig:x,handleAccept:h})]}),document.body)};export{C as CookieConsentModal};
2
+ //# sourceMappingURL=CookieConsentModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CookieConsentModal.js","sources":["../../../../src/components/cookie-consent/CookieConsentModal.tsx"],"sourcesContent":["import React, { FC, useCallback, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { useId } from \"../../hooks\";\nimport { ModalContainer, ModalOverlay, useModal } from \"../modal\";\nimport { CustomConsents } from \"./consents/CustomConsents\";\nimport { DefaultConsents } from \"./consents/DefaultConsents\";\nimport { useCookieConsentState } from \"./CookieConsentContext\";\nimport { convertBooleanConsentObjectToConsentObject } from \"./cookieConsentUtils\";\nimport { Consent, ConsentComponentBaseProps } from \"./types\";\n\nexport const CookieConsentModal: FC<ConsentComponentBaseProps> = ({ onAccept, ...rest }) => {\n const { isOpen, requirement, showSettings } = useCookieConsentState();\n\n const handleAccept = useCallback(\n (v: Consent | \"implicit\") => {\n if (v === \"implicit\") {\n onAccept(convertBooleanConsentObjectToConsentObject(requirement));\n } else {\n onAccept(v);\n }\n },\n [onAccept, requirement],\n );\n\n const [instance, modalConfig] = useModal({\n id: useId(\"jkl-cookie-modal\"),\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: \"alertdialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (!instance) {\n return;\n }\n if (isOpen) {\n instance.show();\n } else {\n instance.hide();\n }\n }, [instance, isOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n return ReactDOM.createPortal(\n <ModalContainer {...rest} {...modalConfig.container} data-testautoid=\"jkl-cookie-consent-modal\">\n <ModalOverlay {...modalConfig.overlay} />\n {showSettings ? (\n <CustomConsents modalConfig={modalConfig} handleAccept={handleAccept} />\n ) : (\n <DefaultConsents modalConfig={modalConfig} handleAccept={handleAccept} />\n )}\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsentModal","onAccept","rest","isOpen","requirement","showSettings","useCookieConsentState","handleAccept","useCallback","v","convertBooleanConsentObjectToConsentObject","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","document","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","CustomConsents","DefaultConsents","body"],"mappings":"smBAUO,MAAMA,EAAoD,EAAGC,SAAAA,KAAaC,MACvE,MAAEC,OAAAA,EAAQC,YAAAA,EAAaC,aAAAA,GAAiBC,IAExCC,EAAeC,GAChBC,IAEgBR,EADH,aAANQ,EACSC,EAA2CN,GAE3CK,EAFuD,GAKxE,CAACR,EAAUG,KAGRO,EAAUC,GAAeC,EAAS,CACrCC,GAAIC,EAAM,oBAIVC,KAAM,cAGNC,MAAO,wBAcP,OAXJC,GAAU,KACDP,IAGDR,EACAQ,EAASQ,OAETR,EAASS,OAAK,GAEnB,CAACT,EAAUR,WAEHkB,SAAa,IACb,KAGJC,EAASC,aACZC,EAACC,MAAmBvB,KAAUU,EAAYc,UAAW,kBAAgB,2BACjEC,SAAA,CAACC,EAAAC,EAAA,IAAiBjB,EAAYkB,YAC7BzB,EACI0B,EAEAC,EAFe,CAAApB,YAAAA,EAA0BL,aAAAA,OAKlDc,SAASY,KAAA"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useCallback as s}from"react";import{PrimaryButton as n}from"../../button/Button.js";import{UnorderedList as o}from"../../list/List.js";import{CheckListItem as a}from"../../list/ListItem.js";import{Modal as r,ModalHeader as i,ModalTitle as l,ModalBody as d,ModalActions as m}from"../../modal/Modal.js";import"react-a11y-dialog";import"../../../hooks/useScreen/useScreen.js";import"../../../hooks/useId/useId.js";import{useCookieConsentState as c}from"../CookieConsentContext.js";import{convertBooleanConsentObjectToConsentObject as k}from"../cookieConsentUtils.js";import{RequirementCheckbox as f}from"./RequirementCheckbox.js";const u=({modalConfig:u,handleAccept:p})=>{const{consent:j,requirement:g}=c(),h=s((e=>{e.preventDefault();const t={},s=Object.entries(g).map((([e,t])=>t?e:void 0)).filter(Boolean),n=new FormData(e.target);s.forEach((e=>{t[e]="True"===n.get(e)})),p(k(t))}),[p,g]);return e(r,{component:"form",...u.modal,onSubmit:h,children:[t(i,{children:t(l,{...u.title,children:"Informasjonskapsler"})}),e(d,{children:[t(o,{className:"jkl-cookie-consent-modal__checklist",children:t(a,{children:"Nettsidene skal fungere teknisk"})}),t("p",{className:"jkl-cookie-consent-modal__info-text",children:"For at nettsidene skal fungere, må vi bruke tekniske informasjonskapsler. Denne kan derfor ikke slås av."}),g.functional&&t(f,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===j.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."}),g.statistics&&t(f,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===j.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."}),g.marketing&&t(f,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===j.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."})]}),t(m,{children:t(n,{"data-testid":"jkl-cookie-consent-godta",children:"Godta"})})]})};export{u as CustomConsents};
2
+ //# sourceMappingURL=CustomConsents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomConsents.js","sources":["../../../../../src/components/cookie-consent/consents/CustomConsents.tsx"],"sourcesContent":["import React, { FC, FormEvent, useCallback } from \"react\";\nimport { PrimaryButton } from \"../../button\";\nimport { CheckListItem, UnorderedList } from \"../../list\";\nimport { Modal, ModalActions, ModalBody, ModalConfig, ModalHeader, ModalTitle } from \"../../modal\";\nimport { useCookieConsentState } from \"../CookieConsentContext\";\nimport { convertBooleanConsentObjectToConsentObject } from \"../cookieConsentUtils\";\nimport { Consent } from \"../types\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox\";\n\ntype Props = {\n modalConfig: ModalConfig;\n handleAccept: (v: Consent | \"implicit\") => void;\n};\n\nexport const CustomConsents: FC<Props> = ({ modalConfig, handleAccept }) => {\n const { consent, requirement } = useCookieConsentState();\n\n const onSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formValues: Partial<Record<keyof Consent, boolean>> = {};\n const requiredFormNames = Object.entries(requirement)\n .map(([name, required]) => (required ? name : undefined))\n .filter(Boolean) as Array<keyof Consent>;\n\n const formData = new FormData(event.target as HTMLFormElement);\n requiredFormNames.forEach((name) => {\n formValues[name] = formData.get(name) === \"True\";\n });\n\n handleAccept(convertBooleanConsentObjectToConsentObject(formValues));\n },\n [handleAccept, requirement],\n );\n\n return (\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>Informasjonskapsler</ModalTitle>\n </ModalHeader>\n <ModalBody>\n <UnorderedList className=\"jkl-cookie-consent-modal__checklist\">\n <CheckListItem>Nettsidene skal fungere teknisk</CheckListItem>\n </UnorderedList>\n <p className=\"jkl-cookie-consent-modal__info-text\">\n For at nettsidene skal fungere, må vi bruke tekniske informasjonskapsler. Denne kan derfor ikke slås\n av.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={consent.functional === \"accepted\"}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke\n innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg.\n </RequirementCheckbox>\n )}\n\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={consent.statistics === \"accepted\"}\n >\n Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir\n brukt, slik at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={consent.marketing === \"accepted\"}\n >\n Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <PrimaryButton data-testid=\"jkl-cookie-consent-godta\">Godta</PrimaryButton>\n </ModalActions>\n </Modal>\n );\n};\n"],"names":["CustomConsents","modalConfig","handleAccept","consent","requirement","useCookieConsentState","onSubmit","useCallback","event","preventDefault","formValues","requiredFormNames","Object","entries","map","name","required","filter","Boolean","formData","FormData","target","forEach","get","convertBooleanConsentObjectToConsentObject","jsxs","Modal","component","modal","children","jsx","ModalHeader","ModalTitle","title","ModalBody","UnorderedList","className","CheckListItem","functional","RequirementCheckbox","label","defaultChecked","statistics","marketing","ModalActions","PrimaryButton"],"mappings":"4qBAcO,MAAMA,EAA4B,EAAGC,YAAAA,EAAaC,aAAAA,MAC/C,MAAEC,QAAAA,EAASC,YAAAA,GAAgBC,IAE3BC,EAAWC,GACZC,IACGA,EAAMC,iBAEAC,MAAAA,EAAsD,CAAA,EACtDC,EAAoBC,OAAOC,QAAQT,GACpCU,KAAI,EAAEC,EAAMC,KAAeA,EAAWD,OAAO,IAC7CE,OAAOC,SAENC,EAAW,IAAIC,SAASZ,EAAMa,QAClBV,EAAAW,SAASP,IACvBL,EAAWK,GAA+B,SAAvBI,EAASI,IAAIR,EAAU,IAGjCb,EAAAsB,EAA2Cd,GAAW,GAEvE,CAACR,EAAcE,IAIf,OAAAqB,EAACC,EAAM,CAAAC,UAAU,UAAW1B,EAAY2B,MAAatB,SAAAA,EACjDuB,SAAA,CAAAC,EAACC,GACGF,SAACC,EAAAE,EAAA,IAAe/B,EAAYgC,MAAOJ,qCAEtCK,EACG,CAAAL,SAAA,CAAAC,EAACK,GAAcC,UAAU,sCACrBP,SAACC,EAAAO,EAAA,CAAcR,+CAElBC,EAAA,IAAA,CAAEM,UAAU,sCAAsCP,SAGnD,6GACCzB,EAAYkC,YACTR,EAACS,EAAA,CACGxB,KAAK,aACLyB,MAAM,sBACNC,eAAuC,aAAvBtC,EAAQmC,WAC3BT,SAAA,yKAMJzB,EAAYsC,YACTZ,EAACS,EAAA,CACGxB,KAAK,aACLyB,MAAM,oBACNC,eAAuC,aAAvBtC,EAAQuC,WAC3Bb,SAAA,0JAMJzB,EAAYuC,WACTb,EAACS,EAAA,CACGxB,KAAK,YACLyB,MAAM,iCACNC,eAAsC,aAAtBtC,EAAQwC,UAC3Bd,SAAA,6KAMRe,EACG,CAAAf,SAAAC,EAACe,GAAc,cAAY,2BAA2BhB,uBAE9D"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useCallback as s}from"react";import{PrimaryButton as o,TertiaryButton as i}from"../../button/Button.js";import{UnorderedList as n}from"../../list/List.js";import{CheckListItem as r}from"../../list/ListItem.js";import{Modal as a,ModalHeader as l,ModalTitle as d,ModalBody as m,ModalActions as c}from"../../modal/Modal.js";import"react-a11y-dialog";import"../../../hooks/useScreen/useScreen.js";import"../../../hooks/useId/useId.js";import{useCookieConsentState as k}from"../CookieConsentContext.js";const p=({modalConfig:p,handleAccept:u})=>{const{dispatch:h,requirement:g}=k(),f=s((e=>{e.preventDefault(),u("implicit")}),[u]);return e(a,{component:"form",...p.modal,onSubmit:f,children:[t(l,{children:t(d,{...p.title,children:"Vi bruker informasjonskapsler slik at:"})}),t(m,{children:e(n,{className:"jkl-cookie-consent-modal__checklist",children:[t(r,{children:"Nettsidene skal fungere teknisk"}),g.functional&&t(r,{children:"Nettsidene skal tilpasses din bruk, dine valg og dine innstillinger."}),g.statistics&&t(r,{children:"Vi kan samle statistikk på hvordan nettsidene brukes og dermed kunne forbedre tjenestene våre."}),g.marketing&&t(r,{children:"Vi kan gi deg personlig tilpasset innhold og relevante annonser, også gjennom våre samarbeidspartnere, på for eksempel nettsider og i sosiale medier."})]})}),e(c,{children:[t(o,{"data-testid":"jkl-cookie-consent-godta",...p.closeButton,type:"submit",children:"Godta"}),t(i,{type:"button",onClick:()=>{h({type:"SET_SHOW_SETTINGS",payload:!0})},children:"Innstillinger"})]})]})};export{p as DefaultConsents};
2
+ //# sourceMappingURL=DefaultConsents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultConsents.js","sources":["../../../../../src/components/cookie-consent/consents/DefaultConsents.tsx"],"sourcesContent":["import React, { FC, FormEvent, useCallback } from \"react\";\nimport { PrimaryButton, TertiaryButton } from \"../../button\";\nimport { CheckListItem, UnorderedList } from \"../../list\";\nimport { Modal, ModalActions, ModalBody, type ModalConfig, ModalHeader, ModalTitle } from \"../../modal\";\nimport { useCookieConsentState } from \"../CookieConsentContext\";\nimport { Consent } from \"../types\";\n\ntype Props = {\n modalConfig: ModalConfig;\n handleAccept: (v: Consent | \"implicit\") => void;\n};\n\nexport const DefaultConsents: FC<Props> = ({ modalConfig, handleAccept }) => {\n const { dispatch, requirement } = useCookieConsentState();\n\n const onSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n handleAccept(\"implicit\");\n },\n [handleAccept],\n );\n\n return (\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>Vi bruker informasjonskapsler slik at:</ModalTitle>\n </ModalHeader>\n <ModalBody>\n <UnorderedList className=\"jkl-cookie-consent-modal__checklist\">\n <CheckListItem>Nettsidene skal fungere teknisk</CheckListItem>\n {requirement.functional && (\n <CheckListItem>\n Nettsidene skal tilpasses din bruk, dine valg og dine innstillinger.\n </CheckListItem>\n )}\n {requirement.statistics && (\n <CheckListItem>\n Vi kan samle statistikk på hvordan nettsidene brukes og dermed kunne forbedre tjenestene\n våre.\n </CheckListItem>\n )}\n {requirement.marketing && (\n <CheckListItem>\n Vi kan gi deg personlig tilpasset innhold og relevante annonser, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider og i sosiale medier.\n </CheckListItem>\n )}\n </UnorderedList>\n </ModalBody>\n <ModalActions>\n <PrimaryButton data-testid=\"jkl-cookie-consent-godta\" {...modalConfig.closeButton} type={\"submit\"}>\n Godta\n </PrimaryButton>\n\n <TertiaryButton\n type=\"button\"\n onClick={() => {\n dispatch({ type: \"SET_SHOW_SETTINGS\", payload: true });\n }}\n >\n Innstillinger\n </TertiaryButton>\n </ModalActions>\n </Modal>\n );\n};\n"],"names":["DefaultConsents","modalConfig","handleAccept","dispatch","requirement","useCookieConsentState","onSubmit","useCallback","event","preventDefault","jsxs","Modal","component","modal","children","jsx","ModalHeader","ModalTitle","title","ModalBody","UnorderedList","className","CheckListItem","functional","statistics","marketing","ModalActions","PrimaryButton","closeButton","type","TertiaryButton","onClick","payload"],"mappings":"2iBAYO,MAAMA,EAA6B,EAAGC,YAAAA,EAAaC,aAAAA,MAChD,MAAEC,SAAAA,EAAUC,YAAAA,GAAgBC,IAE5BC,EAAWC,GACZC,IACGA,EAAMC,iBACNP,EAAa,WAAU,GAE3B,CAACA,IAID,OAAAQ,EAACC,EAAM,CAAAC,UAAU,UAAWX,EAAYY,MAAaP,SAAAA,EACjDQ,SAAA,CAAAC,EAACC,GACGF,SAACC,EAAAE,EAAA,IAAehB,EAAYiB,MAAOJ,sDAEtCC,EAAAI,EAAA,CACGL,SAACJ,EAAAU,EAAA,CAAcC,UAAU,sCACrBP,SAAA,CAAAC,EAACO,GAAcR,SAA+B,oCAC7CV,EAAYmB,YACRR,EAAAO,EAAA,CAAcR,SAEf,yEAEHV,EAAYoB,YACRT,EAAAO,EAAA,CAAcR,SAGf,mGAEHV,EAAYqB,WACRV,EAAAO,EAAA,CAAcR,SAGf,iKAIXY,EACG,CAAAZ,SAAA,CAACC,EAAAY,EAAA,CAAc,cAAY,8BAA+B1B,EAAY2B,YAAaC,KAAM,SAAUf,SAEnG,UAEAC,EAACe,EAAA,CACGD,KAAK,SACLE,QAAS,KACL5B,EAAS,CAAE0B,KAAM,oBAAqBG,SAAS,GAAM,EAE5DlB,SAAA,uBAIT"}
@@ -0,0 +1,2 @@
1
+ import{jsxs as e,Fragment as c,jsx as o}from"react/jsx-runtime";import{Checkbox as a}from"../../checkbox/Checkbox.js";const s=({defaultChecked:s,name:l,label:n,children:r})=>e(c,{children:[o(a,{className:"jkl-cookie-consent-modal__checkbox",value:"True",name:l,defaultChecked:s,children:n}),o("p",{className:"jkl-cookie-consent-modal__info-text",children:r})]});export{s as RequirementCheckbox};
2
+ //# sourceMappingURL=RequirementCheckbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequirementCheckbox.js","sources":["../../../../../src/components/cookie-consent/consents/RequirementCheckbox.tsx"],"sourcesContent":["import React from \"react\";\nimport { WithChildren } from \"../../..\";\nimport { Checkbox } from \"../../checkbox\";\n\ninterface RequirementCheckboxProps extends WithChildren {\n defaultChecked: boolean;\n name: \"functional\" | \"marketing\" | \"statistics\";\n label: string;\n}\n\nexport const RequirementCheckbox = ({ defaultChecked, name, label, children }: RequirementCheckboxProps) => {\n return (\n <>\n <Checkbox\n className=\"jkl-cookie-consent-modal__checkbox\"\n value=\"True\"\n name={name}\n defaultChecked={defaultChecked}\n >\n {label}\n </Checkbox>\n <p className=\"jkl-cookie-consent-modal__info-text\">{children}</p>\n </>\n );\n};\n"],"names":["RequirementCheckbox","defaultChecked","name","label","children","jsxs","Fragment","jsx","Checkbox","className","value"],"mappings":"sHAUO,MAAMA,EAAsB,EAAGC,eAAAA,EAAgBC,KAAAA,EAAMC,MAAAA,EAAOC,SAAAA,KAGvDC,EAAAC,EAAA,CAAAF,SAAA,CAAAG,EAACC,EAAA,CACGC,UAAU,qCACVC,MAAM,OACNR,KAAAA,EACAD,eAAAA,EAECG,SAAAD,IAEJI,EAAA,IAAA,CAAEE,UAAU,sCAAuCL,SAAAA"}
@@ -0,0 +1,2 @@
1
+ const e=({adapter:e,name:t})=>{const n=(e=>{if(typeof document>"u")return;const t=document.cookie.split(";").map((e=>e.trim().split("="))).find((t=>t[0]===e));return t||void 0})(t);return n?JSON.parse(n[1]):e?e():void 0},t=({consent:e,maxAge:t=10368e3,name:n,domain:o})=>{document.cookie=[`${n}=${JSON.stringify(e)}`,`max-age=${t}`,"SameSite=Lax",!!o&&`domain=${o}`].filter((e=>e)).join(";")},n=(e,t)=>{if(t){const n=new Map(Object.entries(t)),o=Object.entries(e);for(const[e,t]of o)if(t&&null===n.get(e))return!0;return!1}return Object.values(e).some((e=>e))},o=e=>{if(e)return"denied"!==e},s=e=>{const t=Object.entries({functional:null,marketing:null,statistics:null,...e}).map((([e,t])=>[e,o(t)]));return Object.fromEntries(t)},i=e=>typeof e>"u"?null:!1===e||"false"===String(e).toLowerCase()?"denied":"accepted",a=e=>{const t=Object.entries({functional:void 0,marketing:void 0,statistics:void 0,...e}).map((([e,t])=>[e,i(t)]));return Object.fromEntries(t)},r=({marketing:e,functional:t,statistics:n})=>({...e&&{marketing:e},...t&&{functional:t},...n&&{statistics:n}});export{r as buildRequirementsObject,a as convertBooleanConsentObjectToConsentObject,i as convertBooleanToConsentValue,s as convertConsentObjectToBooleans,o as convertConsentValueToFormValue,e as getConsentCookie,t as setConsentCookie,n as shouldShowConsentDialog};
2
+ //# sourceMappingURL=cookieConsentUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookieConsentUtils.js","sources":["../../../../src/components/cookie-consent/cookieConsentUtils.ts"],"sourcesContent":["import type { Consent, ConsentRequirement, ConsentState } from \"./types\";\n\nconst getCookie = (name: string) => {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n const cookie = document.cookie\n // split a string of cookies into array of cookies\n .split(\";\")\n // split cookies into [name, value]\n .map((s) => s.trim().split(\"=\"))\n // find our golden nugget\n .find((c) => c[0] === name);\n\n if (!cookie) {\n return undefined;\n }\n\n return cookie;\n};\n\nexport const getConsentCookie = ({\n adapter,\n name,\n}: {\n adapter?: () => Consent | undefined;\n name: string;\n}): Consent | undefined => {\n const cookie = getCookie(name);\n\n if (cookie) {\n const consent = JSON.parse(cookie[1]);\n\n return consent as Consent;\n }\n\n if (adapter) {\n return adapter();\n }\n\n return undefined;\n};\n\n// 120 days\nconst DEFAULT_MAX_AGE = 10368000;\n\nexport const setConsentCookie = ({\n consent,\n maxAge = DEFAULT_MAX_AGE,\n name,\n domain,\n}: {\n consent: Consent;\n maxAge?: number;\n name: string;\n domain?: string;\n}): void => {\n document.cookie = [\n `${name}=${JSON.stringify(consent)}`,\n `max-age=${maxAge}`,\n `SameSite=Lax`,\n !!domain && `domain=${domain}`,\n ]\n .filter((f) => f)\n .join(\";\");\n};\n\nexport const shouldShowConsentDialog = (requirement: ConsentRequirement, consent: Consent | undefined): boolean => {\n if (!consent) {\n // check if requirement has truthy values. should show consent if it has\n return Object.values(requirement).some((requirementValue) => requirementValue);\n } else {\n // convert to a map to ease accessing dynamic keys\n const consentMap = new Map(Object.entries(consent));\n\n // pls spare the CPU of converting to an entries array 3 times\n const requirementEntries = Object.entries(requirement);\n\n for (const [name, required] of requirementEntries) {\n // no need to check more if the value isn't required\n if (!required) {\n continue;\n }\n\n // cancel and show consent if a value isn't decided\n if (consentMap.get(name) === null) {\n return true;\n }\n }\n\n return false;\n }\n};\n\nexport const convertConsentValueToFormValue = (consent: ConsentState): boolean | undefined => {\n if (!consent) {\n return undefined;\n }\n\n if (consent === \"denied\") {\n return false;\n }\n\n return true;\n};\n\nexport const convertConsentObjectToBooleans = (\n consent: Partial<Record<keyof Consent, ConsentState>>,\n): { [k: string]: boolean | undefined } => {\n const defaultConsent = {\n functional: null,\n marketing: null,\n statistics: null,\n };\n\n const consentEntries: Array<[string, boolean | undefined]> = Object.entries({ ...defaultConsent, ...consent }).map(\n ([consentName, value]) => [consentName, convertConsentValueToFormValue(value)],\n );\n return Object.fromEntries(consentEntries);\n};\n\nexport const convertBooleanToConsentValue = (formValue: boolean | undefined): ConsentState => {\n if (typeof formValue === \"undefined\") {\n return null;\n }\n\n if (formValue === false || String(formValue).toLowerCase() === \"false\") {\n return \"denied\";\n }\n\n return \"accepted\";\n};\n\nexport const convertBooleanConsentObjectToConsentObject = (\n consent: Partial<Record<keyof Consent, boolean | undefined>>,\n): Consent => {\n const defaultObject = {\n functional: undefined,\n marketing: undefined,\n statistics: undefined,\n };\n\n const consentEntries = Object.entries({ ...defaultObject, ...consent }).map(([consentName, value]) => [\n consentName,\n convertBooleanToConsentValue(value),\n ]);\n\n return Object.fromEntries(consentEntries);\n};\n\nexport const buildRequirementsObject = ({ marketing, functional, statistics }: ConsentRequirement) => {\n return {\n ...(marketing && { marketing }),\n ...(functional && { functional }),\n ...(statistics && { statistics }),\n };\n};\n"],"names":["getConsentCookie","adapter","name","cookie","document","split","map","s","trim","find","c","getCookie","JSON","parse","setConsentCookie","consent","maxAge","domain","stringify","filter","f","join","shouldShowConsentDialog","requirement","consentMap","Map","Object","entries","requirementEntries","required","get","values","some","requirementValue","convertConsentValueToFormValue","convertConsentObjectToBooleans","consentEntries","functional","marketing","statistics","consentName","value","fromEntries","convertBooleanToConsentValue","formValue","String","toLowerCase","convertBooleanConsentObjectToConsentObject","buildRequirementsObject"],"mappings":"AAEA,MAoBaA,EAAmB,EAC5BC,QAAAA,EACAC,KAAAA,MAKMC,MAAAA,EA3BQ,CAACD,IACX,UAAOE,SAAa,IACb,OAGLD,MAAAA,EAASC,SAASD,OAEnBE,MAAM,KAENC,KAAKC,GAAMA,EAAEC,OAAOH,MAAM,OAE1BI,MAAMC,GAAMA,EAAE,KAAOR,IAErBC,OAAAA,QAAAA,CAIEA,EAUQQ,CAAUT,GAErBC,OAAAA,EACgBS,KAAKC,MAAMV,EAAO,IAKlCF,EACOA,SADPA,CACe,EASVa,EAAmB,EAC5BC,QAAAA,EACAC,OAAAA,EAAS,QACTd,KAAAA,EACAe,OAAAA,MAOAb,SAASD,OAAS,CACd,GAAGD,KAAQU,KAAKM,UAAUH,KAC1B,WAAWC,IACX,iBACEC,GAAU,UAAUA,KAErBE,QAAQC,GAAMA,IACdC,KAAK,IAAG,EAGJC,EAA0B,CAACC,EAAiCR,KACrE,GAAKA,EAGE,CAEGS,MAAAA,EAAa,IAAIC,IAAIC,OAAOC,QAAQZ,IAGpCa,EAAqBF,OAAOC,QAAQJ,GAE/B,IAAA,MAACrB,EAAM2B,KAAaD,EAE3B,GAAKC,GAKwB,OAAzBL,EAAWM,IAAI5B,GACR,OAAA,EAIR,OAAA,CACX,CArBI,OAAOwB,OAAOK,OAAOR,GAAaS,MAAMC,GAAqBA,GAAgB,EAwBxEC,EAAkCnB,IACtCA,GAAAA,EAIL,MAAgB,WAAZA,CAAY,EAOPoB,EACTpB,IAQM,MAAAqB,EAAuDV,OAAOC,QAAQ,CALxEU,WAAY,KACZC,UAAW,KACXC,WAAY,QAGoFxB,IAAWT,KAC3G,EAAEkC,EAAaC,KAAW,CAACD,EAAaN,EAA+BO,MAEpE,OAAAf,OAAOgB,YAAYN,EAAc,EAG/BO,EAAgCC,UAC9BA,EAAc,IACd,MAGO,IAAdA,GAA2D,UAApCC,OAAOD,GAAWE,cAClC,SAGJ,WAGEC,EACThC,IAQA,MAAMqB,EAAiBV,OAAOC,QAAQ,CALlCU,gBAAY,EACZC,eAAW,EACXC,gBAAY,KAG6CxB,IAAWT,KAAI,EAAEkC,EAAaC,KAAW,CAClGD,EACAG,EAA6BF,MAG1B,OAAAf,OAAOgB,YAAYN,EAAc,EAG/BY,EAA0B,EAAGV,UAAAA,EAAWD,WAAAA,EAAYE,WAAAA,MACtD,IACCD,GAAa,CAAEA,UAAAA,MACfD,GAAc,CAAEA,WAAAA,MAChBE,GAAc,CAAEA,WAAAA"}
@@ -0,0 +1,2 @@
1
+ import{CookieConsent as o}from"./CookieConsent.js";import{CookieConsentProvider as e,useCookieConsent as s}from"./CookieConsentContext.js";export{o as CookieConsent,e as CookieConsentProvider,s as useCookieConsent};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import t from"classnames";import n from"date-fns/startOfDay";import{forwardRef as r,useState as i,useRef as s,useCallback as a}from"react";import{flushSync as c}from"react-dom";import{useAnimatedHeight as l}from"../../hooks/useAnimatedHeight/useAnimatedHeight.js";import"../../hooks/useScreen/useScreen.js";import{useClickOutside as p}from"../../hooks/useClickOutside/useClickOutside.js";import{useFocusOutside as u}from"../../hooks/useFocusOutside/useFocusOutside.js";import"../../hooks/useId/useId.js";import{useKeyListener as m}from"../../hooks/useKeyListener/useKeyListener.js";import"../icon/Icon.js";import"../icon/icons/animated/ArrowVerticalAnimated.js";import"../icon/icons/animated/ArrowHorizontalAnimated.js";import"../icon/icons/animated/PlusRemoveAnimated.js";import"../icon/icons/ArrowDownIcon.js";import"../icon/icons/ArrowLeftIcon.js";import"../icon/icons/ArrowNorthEastIcon.js";import"../icon/icons/ArrowRightIcon.js";import"../icon/icons/ArrowUpIcon.js";import{CalendarIcon as d}from"../icon/icons/CalendarIcon.js";import"../icon/icons/CheckIcon.js";import"../icon/icons/ChevronDownIcon.js";import"../icon/icons/ChevronLeftIcon.js";import"../icon/icons/ChevronRightIcon.js";import"../icon/icons/ChevronUpIcon.js";import"../icon/icons/CloseIcon.js";import"../icon/icons/CopyIcon.js";import"../icon/icons/DotsIcon.js";import"../icon/icons/DragIcon.js";import"../icon/icons/ErrorIcon.js";import"../icon/icons/GreenCheckIcon.js";import"../icon/icons/HamburgerIcon.js";import"../icon/icons/InfoIcon.js";import"../icon/icons/LinkIcon.js";import"../icon/icons/PlusIcon.js";import"../icon/icons/QuestionIcon.js";import"../icon/icons/RedCrossIcon.js";import"../icon/icons/SearchIcon.js";import"../icon/icons/SuccessIcon.js";import"../icon/icons/WarningIcon.js";import"../icon/icons/MinusIcon.js";import"../icon/icons/ThumbDownIcon.js";import"../icon/icons/ThumbUpIcon.js";import"../icon/icons/TrashCanIcon.js";import"../icon/icons/PenIcon.js";import"../tooltip/Tooltip.js";import"../tooltip/TooltipContent.js";import"../tooltip/TooltipTrigger.js";import{InputGroup as j}from"../input-group/InputGroup.js";import"../text-input/BaseTextArea.js";import{BaseTextInput as f}from"../text-input/BaseTextInput.js";import"../text-input/TextArea.js";import"../text-input/TextInput.js";import{Calendar as h}from"./internal/Calendar.js";import{getInitialDate as I}from"./internal/utils.js";import{parseDateString as k,formatInput as v}from"./utils.js";import{isWithinLowerBound as y,isWithinUpperBound as D}from"./validation.js";const b=r(((r,b)=>{const{"data-testautoid":g,id:w,className:C="",label:L="Velg dato",labelProps:T,defaultValue:A,defaultShow:x=!1,value:O,disableBeforeDate:P,disableAfterDate:_,yearsToShow:E,name:S,helpLabel:N,errorLabel:R,invalid:B,density:U,days:K,months:H,monthLabel:V,yearLabel:F,placeholder:W="dd.mm.åååå",width:G="11.25rem",onChange:M,onBlur:q,onFocus:z,onKeyDown:Q,action:J,showCalendarLabel:X="Åpne kalender",hideCalendarLabel:Y="Lukk kalender",supportLabelProps:Z,tooltipProps:$,...oo}=r;"production"!==process.env.NODE_ENV&&O&&A&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const eo=k(P),to=eo?n(eo):void 0,no=k(_),ro=no?n(no):void 0,[io,so]=i(I(O,A,to,ro)),[ao,co]=i(null),[lo,po]=i(x),[uo]=l(lo),mo=s(null),jo=s(null),fo=a((o=>{jo.current=o,b&&("function"==typeof b?b(o):b.current=o)}),[jo,b]),ho=s(null),Io=a((o=>{z&&ho.current&&(ho.current.contains(o.relatedTarget)||z(o,io,{error:ao,value:o.target.value}))}),[z,io,ao]),ko=a((o=>{q&&q(o,io,{error:ao,value:o.target.value})}),[q,io,ao]),vo=a((o=>{"Escape"===o.key&&(po(!1),o.preventDefault(),o.stopPropagation()),null!=J&&J.onKeyDown&&J.onKeyDown(o)}),[po,J]),yo=a((o=>{if("Escape"===o.key&&(po(!1),o.preventDefault(),o.stopPropagation()),Q){let e=o.currentTarget.value;/[\d.]/.test(o.key)&&(e+=o.key),Q(o,io,{error:ao,value:e})}}),[Q,po,io,ao]),Do=a((o=>{let e=null,t=null;if(o.target.value){const n=k(o.target.value);n?to&&!y(n,to)?t="OUTSIDE_LOWER_BOUND":ro&&!D(n,ro)?t="OUTSIDE_UPPER_BOUND":po(!1):t="WRONG_FORMAT",e=n||null}co(t),so(e),M&&M(o,e,{error:t,value:o.target.value})}),[M,co,so,po,to,ro]),bo=a((o=>{c((()=>{po(!lo)}));const e=uo.current,t=e&&e.querySelector('[aria-pressed="true"]');t&&t.focus(),null!=J&&J.onClick&&J.onClick(o)}),[po,lo,J,uo]),go=a((()=>{po(!lo)}),[po,lo]),wo=a((()=>{po(!1)}),[po]),Co=a((({date:o})=>{if(po(!1),so(o),jo.current){const e=jo.current;e.value=v(o);const t=document.createEvent("HTMLEvents");t.initEvent("input",!0,!1),e.dispatchEvent(t),e.focus(),M&&M(t,o,{error:null,value:e.value})}}),[po,so,M]),Lo=a((o=>{o.preventDefault(),po(!1),mo.current&&mo.current.focus()}),[po]);return p(ho,wo),u(ho,wo),m(uo,["Escape"],(()=>{po(!1),jo.current&&jo.current.focus()})),o(j,{id:w,className:t("jkl-datepicker",C,{"jkl-datepicker--open":lo}),...oo,ref:ho,label:L,labelProps:T,density:U,helpLabel:N,errorLabel:R,supportLabelProps:Z,tooltipProps:$,render:t=>e("div",{"data-testid":"jkl-datepicker__input-wrapper",className:"jkl-datepicker__input-wrapper","data-density":U,tabIndex:-1,onKeyDown:yo,children:[o(f,{ref:fo,"data-testid":"jkl-datepicker__input","data-testautoid":g,className:"jkl-datepicker__input",name:S,defaultValue:A,density:U,value:O,type:"text",placeholder:W,width:G,onFocus:Io,onBlur:ko,onClick:go,onChange:Do,...t,action:{buttonRef:mo,icon:o(d,{}),label:lo?Y:X,...J,onClick:bo,onKeyDown:vo}}),o("div",{className:"jkl-datepicker__calendar-wrapper",children:o(h,{ref:uo,density:U,date:io,minDate:to,maxDate:ro,days:K,months:H,monthLabel:V,yearLabel:F,yearsToShow:E,hidden:!lo,onDateSelected:Co,onTabOutside:Lo})})]})})}));b.displayName="DatePicker";export{b as DatePicker};
2
+ //# sourceMappingURL=DatePicker.js.map