@fremtind/jokul 0.71.1 → 1.0.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 (588) hide show
  1. package/README.md +5 -37
  2. package/build/build-stats.html +1 -1
  3. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs +1 -1
  4. package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
  5. package/build/cjs/components/autosuggest/Menu.cjs +1 -1
  6. package/build/cjs/components/autosuggest/Menu.cjs.map +1 -1
  7. package/build/cjs/components/button/Button.cjs +1 -1
  8. package/build/cjs/components/button/Button.cjs.map +1 -1
  9. package/build/cjs/components/card/index.cjs +1 -1
  10. package/build/cjs/components/card/index.d.cts +1 -4
  11. package/build/cjs/components/card/types.cjs +1 -1
  12. package/build/cjs/components/card/types.cjs.map +1 -1
  13. package/build/cjs/components/card/types.d.cts +0 -51
  14. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs +1 -1
  15. package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs.map +1 -1
  16. package/build/cjs/components/combobox/Combobox.cjs +1 -1
  17. package/build/cjs/components/combobox/Combobox.cjs.map +1 -1
  18. package/build/cjs/components/combobox/stories/Combobox.stories.cjs +1 -1
  19. package/build/cjs/components/combobox/stories/Combobox.stories.cjs.map +1 -1
  20. package/build/cjs/components/combobox/stories/Combobox.stories.d.cts +1 -0
  21. package/build/cjs/components/cookie-consent/CookieConsent.cjs +1 -1
  22. package/build/cjs/components/cookie-consent/CookieConsent.cjs.map +1 -1
  23. package/build/cjs/components/datepicker/DatePicker.cjs +1 -1
  24. package/build/cjs/components/datepicker/DatePicker.cjs.map +1 -1
  25. package/build/cjs/components/datepicker/internal/Calendar.cjs +1 -1
  26. package/build/cjs/components/datepicker/internal/Calendar.cjs.map +1 -1
  27. package/build/cjs/components/datepicker/internal/utils.cjs +1 -1
  28. package/build/cjs/components/datepicker/internal/utils.cjs.map +1 -1
  29. package/build/cjs/components/datepicker/stories/Datepicker.stories.cjs +1 -1
  30. package/build/cjs/components/datepicker/stories/Datepicker.stories.cjs.map +1 -1
  31. package/build/cjs/components/datepicker/stories/Datepicker.stories.d.cts +13 -0
  32. package/build/cjs/components/description-list/stories/DescriptionList.stories.cjs +1 -1
  33. package/build/cjs/components/description-list/stories/DescriptionList.stories.cjs.map +1 -1
  34. package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
  35. package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
  36. package/build/cjs/components/expander/ExpandablePanelContent.cjs +1 -1
  37. package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
  38. package/build/cjs/components/expander/Expander.cjs +1 -1
  39. package/build/cjs/components/expander/Expander.cjs.map +1 -1
  40. package/build/cjs/components/expander/index.cjs +1 -1
  41. package/build/cjs/components/expander/index.d.cts +0 -1
  42. package/build/cjs/components/expander/stories/{ExpanderPanel.stories.cjs → ExpandablePanel.stories.cjs} +1 -1
  43. package/build/cjs/components/expander/stories/ExpandablePanel.stories.cjs.map +1 -0
  44. package/build/cjs/components/feedback/followup/Followup.cjs +1 -1
  45. package/build/cjs/components/feedback/followup/Followup.cjs.map +1 -1
  46. package/build/cjs/components/feedback/followup/useFollowup.cjs +1 -1
  47. package/build/cjs/components/feedback/followup/useFollowup.cjs.map +1 -1
  48. package/build/cjs/components/feedback/main-question/MainQuestion.cjs +1 -1
  49. package/build/cjs/components/feedback/main-question/MainQuestion.cjs.map +1 -1
  50. package/build/cjs/components/feedback/main-question/useMainQuestion.cjs +1 -1
  51. package/build/cjs/components/feedback/main-question/useMainQuestion.cjs.map +1 -1
  52. package/build/cjs/components/feedback/questions/AddonQuestion.cjs +1 -1
  53. package/build/cjs/components/feedback/questions/AddonQuestion.cjs.map +1 -1
  54. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs +1 -1
  55. package/build/cjs/components/feedback/questions/CheckboxQuestion.cjs.map +1 -1
  56. package/build/cjs/components/feedback/questions/ContactQuestion.cjs +1 -1
  57. package/build/cjs/components/feedback/questions/ContactQuestion.cjs.map +1 -1
  58. package/build/cjs/components/feedback/questions/RadioQuestion.cjs +1 -1
  59. package/build/cjs/components/feedback/questions/RadioQuestion.cjs.map +1 -1
  60. package/build/cjs/components/feedback/questions/SmileyQuestion.cjs +1 -1
  61. package/build/cjs/components/feedback/questions/SmileyQuestion.cjs.map +1 -1
  62. package/build/cjs/components/feedback/questions/TextQuestion.cjs +1 -1
  63. package/build/cjs/components/feedback/questions/TextQuestion.cjs.map +1 -1
  64. package/build/cjs/components/file/File.cjs.map +1 -1
  65. package/build/cjs/components/file/stories/File.stories.cjs.map +1 -1
  66. package/build/cjs/components/file/stories/File.stories.d.cts +1 -1
  67. package/build/cjs/components/file-input/FileInput.cjs.map +1 -1
  68. package/build/cjs/components/file-input/index.d.cts +1 -1
  69. package/build/cjs/components/file-input/internal/Dropzone.cjs.map +1 -1
  70. package/build/cjs/components/file-input/internal/Input.cjs.map +1 -1
  71. package/build/cjs/components/file-input/internal/fileInputContext.cjs.map +1 -1
  72. package/build/cjs/components/file-input/internal/validateFileInputFiles.cjs +1 -1
  73. package/build/cjs/components/file-input/internal/validateFileInputFiles.cjs.map +1 -1
  74. package/build/cjs/components/file-input/stories/FileInput.stories.cjs.map +1 -1
  75. package/build/cjs/components/icon/stories/Icons.stories.cjs +1 -1
  76. package/build/cjs/components/image/useImageLoadingStatus.cjs +1 -1
  77. package/build/cjs/components/image/useImageLoadingStatus.cjs.map +1 -1
  78. package/build/cjs/components/input-group/InputGroup.cjs +1 -1
  79. package/build/cjs/components/input-group/InputGroup.cjs.map +1 -1
  80. package/build/cjs/components/input-group/stories/FieldGroup.stories.cjs +1 -1
  81. package/build/cjs/components/link/stories/Link.stories.cjs +1 -1
  82. package/build/cjs/components/link/stories/Link.stories.cjs.map +1 -1
  83. package/build/cjs/components/menu/Menu.cjs +1 -1
  84. package/build/cjs/components/menu/Menu.cjs.map +1 -1
  85. package/build/cjs/components/menu/MenuItemCheckbox.cjs +1 -1
  86. package/build/cjs/components/menu/MenuItemCheckbox.cjs.map +1 -1
  87. package/build/cjs/components/message/Message.cjs +1 -1
  88. package/build/cjs/components/message/Message.cjs.map +1 -1
  89. package/build/cjs/components/modal/stories/ModalCloseButton.stories.d.cts +1 -1
  90. package/build/cjs/components/modal/stories/ModalOverlay.stories.cjs +1 -1
  91. package/build/cjs/components/modal/stories/ModalOverlay.stories.cjs.map +1 -1
  92. package/build/cjs/components/popover/Popover.cjs +1 -1
  93. package/build/cjs/components/popover/Popover.cjs.map +1 -1
  94. package/build/cjs/components/radio-panel/RadioPanel.cjs +1 -1
  95. package/build/cjs/components/radio-panel/RadioPanel.cjs.map +1 -1
  96. package/build/cjs/components/screen-reader-only/ScreenReaderOnly.cjs.map +1 -0
  97. package/build/cjs/components/screen-reader-only/ScreenReaderOnly.d.cts +3 -0
  98. package/build/cjs/components/screen-reader-only/index.cjs +2 -0
  99. package/build/cjs/components/screen-reader-only/index.d.cts +2 -0
  100. package/build/cjs/components/screen-reader-only/types.d.cts +4 -0
  101. package/build/cjs/components/select/Select.cjs +1 -1
  102. package/build/cjs/components/select/Select.cjs.map +1 -1
  103. package/build/cjs/components/select/select-utils.cjs +1 -1
  104. package/build/cjs/components/select/select-utils.cjs.map +1 -1
  105. package/build/cjs/components/system-message/SystemMessage.cjs +1 -1
  106. package/build/cjs/components/system-message/SystemMessage.cjs.map +1 -1
  107. package/build/cjs/components/table/TableHeader.cjs +1 -1
  108. package/build/cjs/components/table/TableHeader.cjs.map +1 -1
  109. package/build/cjs/components/table/TableRow.cjs +1 -1
  110. package/build/cjs/components/table/TableRow.cjs.map +1 -1
  111. package/build/cjs/components/table/stories/data.cjs +2 -0
  112. package/build/cjs/components/table/stories/data.cjs.map +1 -0
  113. package/build/cjs/components/table/stories/data.d.cts +8 -0
  114. package/build/cjs/components/table/stories/table.stories.cjs +1 -1
  115. package/build/cjs/components/table/stories/table.stories.cjs.map +1 -1
  116. package/build/cjs/components/table/stories/table.stories.d.cts +10 -1
  117. package/build/cjs/components/table/stories/tableCollapsing.stories.cjs +2 -0
  118. package/build/cjs/components/table/stories/tableCollapsing.stories.cjs.map +1 -0
  119. package/build/cjs/components/table/stories/tableCollapsing.stories.d.cts +16 -0
  120. package/build/cjs/components/table/stories/tableComplex.stories.cjs +2 -0
  121. package/build/cjs/components/table/stories/tableComplex.stories.cjs.map +1 -0
  122. package/build/cjs/components/table/stories/tableComplex.stories.d.cts +21 -0
  123. package/build/cjs/components/table/stories/tableFiltering.stories.cjs +2 -0
  124. package/build/cjs/components/table/stories/tableFiltering.stories.cjs.map +1 -0
  125. package/build/cjs/components/table/stories/tableFiltering.stories.d.cts +21 -0
  126. package/build/cjs/components/table/stories/tablePagination.stories.cjs +2 -0
  127. package/build/cjs/components/table/stories/tablePagination.stories.cjs.map +1 -0
  128. package/build/cjs/components/{accordion/stories/Accordion.stories.d.cts → table/stories/tablePagination.stories.d.cts} +2 -2
  129. package/build/cjs/components/tabs/NavTab.cjs +1 -1
  130. package/build/cjs/components/tabs/NavTab.cjs.map +1 -1
  131. package/build/cjs/components/tabs/NavTabs.cjs +1 -1
  132. package/build/cjs/components/tabs/NavTabs.cjs.map +1 -1
  133. package/build/cjs/components/tabs/TabList.cjs +1 -1
  134. package/build/cjs/components/tabs/TabList.cjs.map +1 -1
  135. package/build/cjs/components/text-area/BaseTextArea.cjs +1 -1
  136. package/build/cjs/components/text-area/BaseTextArea.cjs.map +1 -1
  137. package/build/cjs/components/toast/Toast.cjs +1 -1
  138. package/build/cjs/components/toast/Toast.cjs.map +1 -1
  139. package/build/cjs/components/toast/toastContext.cjs +1 -1
  140. package/build/cjs/components/toast/toastContext.cjs.map +1 -1
  141. package/build/cjs/components/toggle-switch/ToggleSwitch.cjs +1 -1
  142. package/build/cjs/components/toggle-switch/ToggleSwitch.cjs.map +1 -1
  143. package/build/cjs/components/toggle-switch/usePillStyles.cjs +1 -1
  144. package/build/cjs/components/toggle-switch/usePillStyles.cjs.map +1 -1
  145. package/build/cjs/components/tooltip/PopupTip.cjs +1 -1
  146. package/build/cjs/components/tooltip/PopupTip.cjs.map +1 -1
  147. package/build/cjs/components/tooltip/Tooltip.cjs +1 -1
  148. package/build/cjs/components/tooltip/Tooltip.cjs.map +1 -1
  149. package/build/cjs/components/tooltip/TooltipTrigger.cjs +1 -1
  150. package/build/cjs/components/tooltip/TooltipTrigger.cjs.map +1 -1
  151. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs +1 -1
  152. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeight.cjs.map +1 -1
  153. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs +1 -1
  154. package/build/cjs/hooks/useAnimatedHeight/useAnimatedHeightBetween.cjs.map +1 -1
  155. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs +1 -1
  156. package/build/cjs/hooks/useAnimatedHeight/useAutoAnimateHeight.cjs.map +1 -1
  157. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.cjs +1 -1
  158. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.cjs.map +1 -1
  159. package/build/cjs/hooks/useAriaLiveRegion/useAriaLiveRegion.d.cts +1 -1
  160. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs +1 -1
  161. package/build/cjs/hooks/useClickOutside/useClickOutside.cjs.map +1 -1
  162. package/build/cjs/hooks/useElementDimensions/useElementDimensions.cjs +1 -1
  163. package/build/cjs/hooks/useElementDimensions/useElementDimensions.cjs.map +1 -1
  164. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs +1 -1
  165. package/build/cjs/hooks/useFocusOutside/useFocusOutside.cjs.map +1 -1
  166. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs +1 -1
  167. package/build/cjs/hooks/useIntersectionObserver/useIntersectionObserver.cjs.map +1 -1
  168. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs +1 -1
  169. package/build/cjs/hooks/useKeyListener/useKeyListener.cjs.map +1 -1
  170. package/build/cjs/hooks/useScrollIntoView/useScrollIntoView.cjs +1 -1
  171. package/build/cjs/hooks/useScrollIntoView/useScrollIntoView.cjs.map +1 -1
  172. package/build/cjs/hooks/useSwipeGesture/useSwipeGesture.cjs +1 -1
  173. package/build/cjs/hooks/useSwipeGesture/useSwipeGesture.cjs.map +1 -1
  174. package/build/cjs/index.cjs +1 -1
  175. package/build/cjs/index.d.cts +0 -1
  176. package/build/cjs/utilities/formatters/date/formatDate.cjs +1 -1
  177. package/build/cjs/utilities/formatters/date/formatDate.cjs.map +1 -1
  178. package/build/cjs/utilities/formatters/fodselsnummer/formatFodselsnummer.cjs +1 -1
  179. package/build/cjs/utilities/formatters/fodselsnummer/formatFodselsnummer.cjs.map +1 -1
  180. package/build/cjs/utilities/formatters/kontonummer/formatKontonummer.cjs +1 -1
  181. package/build/cjs/utilities/formatters/kontonummer/formatKontonummer.cjs.map +1 -1
  182. package/build/cjs/utilities/formatters/kortnummer/formatKortnummer.cjs +1 -1
  183. package/build/cjs/utilities/formatters/kortnummer/formatKortnummer.cjs.map +1 -1
  184. package/build/cjs/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.cjs +1 -1
  185. package/build/cjs/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.cjs.map +1 -1
  186. package/build/cjs/utilities/formatters/telefonnummer/formatTelefonnummer.cjs +1 -1
  187. package/build/cjs/utilities/formatters/telefonnummer/formatTelefonnummer.cjs.map +1 -1
  188. package/build/cjs/utilities/formatters/util/registerWithMask.cjs +1 -1
  189. package/build/cjs/utilities/formatters/util/registerWithMask.cjs.map +1 -1
  190. package/build/cjs/utilities/formatters/valuta/formatValuta.cjs +1 -1
  191. package/build/cjs/utilities/formatters/valuta/formatValuta.cjs.map +1 -1
  192. package/build/cjs/utilities/tabListener.cjs +1 -1
  193. package/build/cjs/utilities/tabListener.cjs.map +1 -1
  194. package/build/cjs/utilities/validators/hasMinimumWords/hasMinimumWords.cjs +1 -1
  195. package/build/cjs/utilities/validators/hasMinimumWords/hasMinimumWords.cjs.map +1 -1
  196. package/build/es/components/autosuggest/BaseAutosuggest.js +2 -2
  197. package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
  198. package/build/es/components/autosuggest/Menu.js +1 -1
  199. package/build/es/components/autosuggest/Menu.js.map +1 -1
  200. package/build/es/components/button/Button.js +1 -1
  201. package/build/es/components/button/Button.js.map +1 -1
  202. package/build/es/components/card/index.d.ts +1 -4
  203. package/build/es/components/card/index.js +1 -1
  204. package/build/es/components/card/types.d.ts +0 -51
  205. package/build/es/components/card/types.js +1 -1
  206. package/build/es/components/card/types.js.map +1 -1
  207. package/build/es/components/checkbox-panel/CheckboxPanel.js +1 -1
  208. package/build/es/components/checkbox-panel/CheckboxPanel.js.map +1 -1
  209. package/build/es/components/combobox/Combobox.js +1 -1
  210. package/build/es/components/combobox/Combobox.js.map +1 -1
  211. package/build/es/components/combobox/stories/Combobox.stories.d.ts +1 -0
  212. package/build/es/components/combobox/stories/Combobox.stories.js +1 -1
  213. package/build/es/components/combobox/stories/Combobox.stories.js.map +1 -1
  214. package/build/es/components/cookie-consent/CookieConsent.js +1 -1
  215. package/build/es/components/cookie-consent/CookieConsent.js.map +1 -1
  216. package/build/es/components/datepicker/DatePicker.js +1 -1
  217. package/build/es/components/datepicker/DatePicker.js.map +1 -1
  218. package/build/es/components/datepicker/internal/Calendar.js +1 -1
  219. package/build/es/components/datepicker/internal/Calendar.js.map +1 -1
  220. package/build/es/components/datepicker/internal/utils.js +1 -1
  221. package/build/es/components/datepicker/internal/utils.js.map +1 -1
  222. package/build/es/components/datepicker/stories/Datepicker.stories.d.ts +13 -0
  223. package/build/es/components/datepicker/stories/Datepicker.stories.js +1 -1
  224. package/build/es/components/datepicker/stories/Datepicker.stories.js.map +1 -1
  225. package/build/es/components/description-list/stories/DescriptionList.stories.js +1 -1
  226. package/build/es/components/description-list/stories/DescriptionList.stories.js.map +1 -1
  227. package/build/es/components/expander/ExpandablePanel.js +1 -1
  228. package/build/es/components/expander/ExpandablePanel.js.map +1 -1
  229. package/build/es/components/expander/ExpandablePanelContent.js +1 -1
  230. package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
  231. package/build/es/components/expander/Expander.js +1 -1
  232. package/build/es/components/expander/Expander.js.map +1 -1
  233. package/build/es/components/expander/index.d.ts +0 -1
  234. package/build/es/components/expander/index.js +1 -1
  235. package/build/es/components/expander/stories/{ExpanderPanel.stories.js → ExpandablePanel.stories.js} +1 -1
  236. package/build/es/components/expander/stories/ExpandablePanel.stories.js.map +1 -0
  237. package/build/es/components/feedback/followup/Followup.js +1 -1
  238. package/build/es/components/feedback/followup/Followup.js.map +1 -1
  239. package/build/es/components/feedback/followup/useFollowup.js +1 -1
  240. package/build/es/components/feedback/followup/useFollowup.js.map +1 -1
  241. package/build/es/components/feedback/main-question/MainQuestion.js +1 -1
  242. package/build/es/components/feedback/main-question/MainQuestion.js.map +1 -1
  243. package/build/es/components/feedback/main-question/useMainQuestion.js +1 -1
  244. package/build/es/components/feedback/main-question/useMainQuestion.js.map +1 -1
  245. package/build/es/components/feedback/questions/AddonQuestion.js +1 -1
  246. package/build/es/components/feedback/questions/AddonQuestion.js.map +1 -1
  247. package/build/es/components/feedback/questions/CheckboxQuestion.js +1 -1
  248. package/build/es/components/feedback/questions/CheckboxQuestion.js.map +1 -1
  249. package/build/es/components/feedback/questions/ContactQuestion.js +1 -1
  250. package/build/es/components/feedback/questions/ContactQuestion.js.map +1 -1
  251. package/build/es/components/feedback/questions/RadioQuestion.js +1 -1
  252. package/build/es/components/feedback/questions/RadioQuestion.js.map +1 -1
  253. package/build/es/components/feedback/questions/SmileyQuestion.js +1 -1
  254. package/build/es/components/feedback/questions/SmileyQuestion.js.map +1 -1
  255. package/build/es/components/feedback/questions/TextQuestion.js +1 -1
  256. package/build/es/components/feedback/questions/TextQuestion.js.map +1 -1
  257. package/build/es/components/file/File.js.map +1 -1
  258. package/build/es/components/file/stories/File.stories.d.ts +1 -1
  259. package/build/es/components/file/stories/File.stories.js.map +1 -1
  260. package/build/es/components/file-input/FileInput.js.map +1 -1
  261. package/build/es/components/file-input/index.d.ts +1 -1
  262. package/build/es/components/file-input/internal/Dropzone.js.map +1 -1
  263. package/build/es/components/file-input/internal/Input.js.map +1 -1
  264. package/build/es/components/file-input/internal/fileInputContext.js.map +1 -1
  265. package/build/es/components/file-input/internal/validateFileInputFiles.js +1 -1
  266. package/build/es/components/file-input/internal/validateFileInputFiles.js.map +1 -1
  267. package/build/es/components/file-input/stories/FileInput.stories.js.map +1 -1
  268. package/build/es/components/icon/stories/Icons.stories.js +1 -1
  269. package/build/es/components/image/useImageLoadingStatus.js +1 -1
  270. package/build/es/components/image/useImageLoadingStatus.js.map +1 -1
  271. package/build/es/components/input-group/InputGroup.js +1 -1
  272. package/build/es/components/input-group/InputGroup.js.map +1 -1
  273. package/build/es/components/link/stories/Link.stories.js +1 -1
  274. package/build/es/components/link/stories/Link.stories.js.map +1 -1
  275. package/build/es/components/loader/stories/Skeleton.stories.js +1 -1
  276. package/build/es/components/menu/Menu.js +1 -1
  277. package/build/es/components/menu/Menu.js.map +1 -1
  278. package/build/es/components/menu/MenuItemCheckbox.js +1 -1
  279. package/build/es/components/menu/MenuItemCheckbox.js.map +1 -1
  280. package/build/es/components/message/Message.js +1 -1
  281. package/build/es/components/message/Message.js.map +1 -1
  282. package/build/es/components/modal/stories/ModalCloseButton.stories.d.ts +1 -1
  283. package/build/es/components/modal/stories/ModalOverlay.stories.js +1 -1
  284. package/build/es/components/modal/stories/ModalOverlay.stories.js.map +1 -1
  285. package/build/es/components/popover/Popover.js +1 -1
  286. package/build/es/components/popover/Popover.js.map +1 -1
  287. package/build/es/components/radio-panel/RadioPanel.js +1 -1
  288. package/build/es/components/radio-panel/RadioPanel.js.map +1 -1
  289. package/build/es/components/screen-reader-only/ScreenReaderOnly.d.ts +3 -0
  290. package/build/es/components/screen-reader-only/ScreenReaderOnly.js.map +1 -0
  291. package/build/es/components/screen-reader-only/index.d.ts +2 -0
  292. package/build/es/components/screen-reader-only/index.js +2 -0
  293. package/build/es/components/screen-reader-only/types.d.ts +4 -0
  294. package/build/es/components/select/Select.js +1 -1
  295. package/build/es/components/select/Select.js.map +1 -1
  296. package/build/es/components/select/select-utils.js +1 -1
  297. package/build/es/components/select/select-utils.js.map +1 -1
  298. package/build/es/components/system-message/SystemMessage.js +1 -1
  299. package/build/es/components/system-message/SystemMessage.js.map +1 -1
  300. package/build/es/components/table/TableHeader.js +1 -1
  301. package/build/es/components/table/TableHeader.js.map +1 -1
  302. package/build/es/components/table/TableRow.js +1 -1
  303. package/build/es/components/table/TableRow.js.map +1 -1
  304. package/build/es/components/table/stories/data.d.ts +8 -0
  305. package/build/es/components/table/stories/data.js +2 -0
  306. package/build/es/components/table/stories/data.js.map +1 -0
  307. package/build/es/components/table/stories/table.stories.d.ts +10 -1
  308. package/build/es/components/table/stories/table.stories.js +1 -1
  309. package/build/es/components/table/stories/table.stories.js.map +1 -1
  310. package/build/es/components/table/stories/tableCollapsing.stories.d.ts +16 -0
  311. package/build/es/components/table/stories/tableCollapsing.stories.js +2 -0
  312. package/build/es/components/table/stories/tableCollapsing.stories.js.map +1 -0
  313. package/build/es/components/table/stories/tableComplex.stories.d.ts +21 -0
  314. package/build/es/components/table/stories/tableComplex.stories.js +2 -0
  315. package/build/es/components/table/stories/tableComplex.stories.js.map +1 -0
  316. package/build/es/components/table/stories/tableFiltering.stories.d.ts +21 -0
  317. package/build/es/components/table/stories/tableFiltering.stories.js +2 -0
  318. package/build/es/components/table/stories/tableFiltering.stories.js.map +1 -0
  319. package/build/{cjs/components/accordion/stories/AccordionItem.stories.d.cts → es/components/table/stories/tablePagination.stories.d.ts} +2 -2
  320. package/build/es/components/table/stories/tablePagination.stories.js +2 -0
  321. package/build/es/components/table/stories/tablePagination.stories.js.map +1 -0
  322. package/build/es/components/tabs/NavTab.js +1 -1
  323. package/build/es/components/tabs/NavTab.js.map +1 -1
  324. package/build/es/components/tabs/NavTabs.js +1 -1
  325. package/build/es/components/tabs/NavTabs.js.map +1 -1
  326. package/build/es/components/tabs/TabList.js +1 -1
  327. package/build/es/components/tabs/TabList.js.map +1 -1
  328. package/build/es/components/text-area/BaseTextArea.js +1 -1
  329. package/build/es/components/text-area/BaseTextArea.js.map +1 -1
  330. package/build/es/components/toast/Toast.js +1 -1
  331. package/build/es/components/toast/Toast.js.map +1 -1
  332. package/build/es/components/toast/toastContext.js +1 -1
  333. package/build/es/components/toast/toastContext.js.map +1 -1
  334. package/build/es/components/toggle-switch/ToggleSwitch.js +1 -1
  335. package/build/es/components/toggle-switch/ToggleSwitch.js.map +1 -1
  336. package/build/es/components/toggle-switch/usePillStyles.js +1 -1
  337. package/build/es/components/toggle-switch/usePillStyles.js.map +1 -1
  338. package/build/es/components/tooltip/PopupTip.js +1 -1
  339. package/build/es/components/tooltip/PopupTip.js.map +1 -1
  340. package/build/es/components/tooltip/Tooltip.js +1 -1
  341. package/build/es/components/tooltip/Tooltip.js.map +1 -1
  342. package/build/es/components/tooltip/TooltipTrigger.js +1 -1
  343. package/build/es/components/tooltip/TooltipTrigger.js.map +1 -1
  344. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js +1 -1
  345. package/build/es/hooks/useAnimatedHeight/useAnimatedHeight.js.map +1 -1
  346. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js +1 -1
  347. package/build/es/hooks/useAnimatedHeight/useAnimatedHeightBetween.js.map +1 -1
  348. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js +1 -1
  349. package/build/es/hooks/useAnimatedHeight/useAutoAnimateHeight.js.map +1 -1
  350. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.d.ts +1 -1
  351. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.js +1 -1
  352. package/build/es/hooks/useAriaLiveRegion/useAriaLiveRegion.js.map +1 -1
  353. package/build/es/hooks/useClickOutside/useClickOutside.js +1 -1
  354. package/build/es/hooks/useClickOutside/useClickOutside.js.map +1 -1
  355. package/build/es/hooks/useElementDimensions/useElementDimensions.js +1 -1
  356. package/build/es/hooks/useElementDimensions/useElementDimensions.js.map +1 -1
  357. package/build/es/hooks/useFocusOutside/useFocusOutside.js +1 -1
  358. package/build/es/hooks/useFocusOutside/useFocusOutside.js.map +1 -1
  359. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js +1 -1
  360. package/build/es/hooks/useIntersectionObserver/useIntersectionObserver.js.map +1 -1
  361. package/build/es/hooks/useKeyListener/useKeyListener.js +1 -1
  362. package/build/es/hooks/useKeyListener/useKeyListener.js.map +1 -1
  363. package/build/es/hooks/useScrollIntoView/useScrollIntoView.js +1 -1
  364. package/build/es/hooks/useScrollIntoView/useScrollIntoView.js.map +1 -1
  365. package/build/es/hooks/useSwipeGesture/useSwipeGesture.js +1 -1
  366. package/build/es/hooks/useSwipeGesture/useSwipeGesture.js.map +1 -1
  367. package/build/es/index.d.ts +0 -1
  368. package/build/es/index.js +1 -1
  369. package/build/es/utilities/formatters/date/formatDate.js +1 -1
  370. package/build/es/utilities/formatters/date/formatDate.js.map +1 -1
  371. package/build/es/utilities/formatters/fodselsnummer/formatFodselsnummer.js +1 -1
  372. package/build/es/utilities/formatters/fodselsnummer/formatFodselsnummer.js.map +1 -1
  373. package/build/es/utilities/formatters/kontonummer/formatKontonummer.js +1 -1
  374. package/build/es/utilities/formatters/kontonummer/formatKontonummer.js.map +1 -1
  375. package/build/es/utilities/formatters/kortnummer/formatKortnummer.js +1 -1
  376. package/build/es/utilities/formatters/kortnummer/formatKortnummer.js.map +1 -1
  377. package/build/es/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.js +1 -1
  378. package/build/es/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.js.map +1 -1
  379. package/build/es/utilities/formatters/telefonnummer/formatTelefonnummer.js +1 -1
  380. package/build/es/utilities/formatters/telefonnummer/formatTelefonnummer.js.map +1 -1
  381. package/build/es/utilities/formatters/util/registerWithMask.js +1 -1
  382. package/build/es/utilities/formatters/util/registerWithMask.js.map +1 -1
  383. package/build/es/utilities/formatters/valuta/formatValuta.js +1 -1
  384. package/build/es/utilities/formatters/valuta/formatValuta.js.map +1 -1
  385. package/build/es/utilities/tabListener.js +1 -1
  386. package/build/es/utilities/tabListener.js.map +1 -1
  387. package/build/es/utilities/validators/hasMinimumWords/hasMinimumWords.js +1 -1
  388. package/build/es/utilities/validators/hasMinimumWords/hasMinimumWords.js.map +1 -1
  389. package/build/jokul.css +1 -1
  390. package/build/paginated-table-data-VQZB3_Aj.cjs +2 -0
  391. package/build/paginated-table-data-VQZB3_Aj.cjs.map +1 -0
  392. package/build/paginated-table-data-ZMeh4d0Y.js +2 -0
  393. package/build/paginated-table-data-ZMeh4d0Y.js.map +1 -0
  394. package/package.json +61 -81
  395. package/styles/components/autosuggest/autosuggest.scss +4 -4
  396. package/styles/components/card/card.css +0 -248
  397. package/styles/components/card/card.min.css +1 -1
  398. package/styles/components/card/card.scss +0 -3
  399. package/styles/components/checkbox/checkbox.css +4 -4
  400. package/styles/components/checkbox/checkbox.min.css +1 -1
  401. package/styles/components/checkbox-panel/checkbox-panel.css +2 -2
  402. package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
  403. package/styles/components/chip/chip.css +9 -1
  404. package/styles/components/chip/chip.min.css +1 -1
  405. package/styles/components/chip/chip.scss +8 -1
  406. package/styles/components/combobox/combobox.css +17 -19
  407. package/styles/components/combobox/combobox.min.css +1 -1
  408. package/styles/components/combobox/combobox.scss +18 -18
  409. package/styles/components/countdown/countdown.css +2 -2
  410. package/styles/components/countdown/countdown.min.css +1 -1
  411. package/styles/components/datepicker/_index.scss +1 -0
  412. package/styles/components/description-list/description-list.scss +7 -7
  413. package/styles/components/expander/_index.scss +0 -1
  414. package/styles/components/feedback/feedback.css +2 -2
  415. package/styles/components/feedback/feedback.min.css +1 -1
  416. package/styles/components/feedback/feedback.scss +4 -3
  417. package/styles/components/file-input/file-input.css +13 -14
  418. package/styles/components/file-input/file-input.min.css +1 -1
  419. package/styles/components/input-group/_labels.scss +21 -21
  420. package/styles/components/input-group/input-group.css +2 -2
  421. package/styles/components/input-group/input-group.min.css +1 -1
  422. package/styles/components/link/link.css +2 -3
  423. package/styles/components/link/link.min.css +1 -1
  424. package/styles/components/link/link.scss +3 -2
  425. package/styles/components/loader/loader.css +6 -6
  426. package/styles/components/loader/loader.min.css +1 -1
  427. package/styles/components/loader/skeleton-loader.css +5 -5
  428. package/styles/components/loader/skeleton-loader.min.css +1 -1
  429. package/styles/components/loader/skeleton-loader.scss +10 -10
  430. package/styles/components/menu/menu.css +5 -5
  431. package/styles/components/menu/menu.min.css +1 -1
  432. package/styles/components/menu/menu.scss +3 -3
  433. package/styles/components/message/message.css +2 -2
  434. package/styles/components/message/message.min.css +1 -1
  435. package/styles/components/progress-bar/progress-bar.css +1 -1
  436. package/styles/components/progress-bar/progress-bar.min.css +1 -1
  437. package/styles/components/radio-button/radio-button.css +4 -3
  438. package/styles/components/radio-button/radio-button.min.css +1 -1
  439. package/styles/components/radio-button/radio-button.scss +18 -19
  440. package/styles/components/radio-panel/radio-panel.css +2 -2
  441. package/styles/components/radio-panel/radio-panel.min.css +1 -1
  442. package/styles/components/summary-table/summary-table.scss +3 -3
  443. package/styles/components/system-message/system-message.css +2 -2
  444. package/styles/components/system-message/system-message.min.css +1 -1
  445. package/styles/components/system-message/system-message.scss +8 -8
  446. package/styles/components/table/_table-cell.scss +4 -4
  447. package/styles/components/table/_table-header.scss +4 -2
  448. package/styles/components/table/_table-row.scss +13 -12
  449. package/styles/components/table/table.css +13 -11
  450. package/styles/components/text-area/text-area.css +6 -4
  451. package/styles/components/text-area/text-area.min.css +5 -1
  452. package/styles/components/text-input/text-input.css +6 -4
  453. package/styles/components/text-input/text-input.min.css +5 -1
  454. package/styles/components/toast/toast.css +4 -4
  455. package/styles/components/toast/toast.min.css +1 -1
  456. package/styles/components/toggle-switch/_toggle-slider.scss +2 -2
  457. package/styles/core/core.css +0 -160
  458. package/styles/core/core.min.css +1 -1
  459. package/styles/core/jkl/_spacing.scss +1 -62
  460. package/styles/core/jkl/_typography.scss +21 -91
  461. package/styles/shared/input/shared-input-styles.css +6 -4
  462. package/styles/shared/input/shared-input-styles.min.css +5 -1
  463. package/styles/shared/input/shared-input-styles.scss +15 -11
  464. package/styles/styles.css +265 -766
  465. package/styles/styles.min.css +5 -7
  466. package/styles/styles.scss +0 -1
  467. package/build/cjs/components/ScreenReaderOnly.cjs.map +0 -1
  468. package/build/cjs/components/ScreenReaderOnly.d.cts +0 -6
  469. package/build/cjs/components/accordion/Accordion.cjs +0 -2
  470. package/build/cjs/components/accordion/Accordion.cjs.map +0 -1
  471. package/build/cjs/components/accordion/Accordion.d.cts +0 -7
  472. package/build/cjs/components/accordion/AccordionItem.cjs +0 -2
  473. package/build/cjs/components/accordion/AccordionItem.cjs.map +0 -1
  474. package/build/cjs/components/accordion/AccordionItem.d.cts +0 -7
  475. package/build/cjs/components/accordion/documentation/AccordionDocs.cjs +0 -2
  476. package/build/cjs/components/accordion/documentation/AccordionDocs.cjs.map +0 -1
  477. package/build/cjs/components/accordion/documentation/AccordionDocs.d.cts +0 -2
  478. package/build/cjs/components/accordion/index.cjs +0 -2
  479. package/build/cjs/components/accordion/index.d.cts +0 -3
  480. package/build/cjs/components/accordion/stories/Accordion.stories.cjs +0 -2
  481. package/build/cjs/components/accordion/stories/Accordion.stories.cjs.map +0 -1
  482. package/build/cjs/components/accordion/stories/AccordionItem.stories.cjs +0 -2
  483. package/build/cjs/components/accordion/stories/AccordionItem.stories.cjs.map +0 -1
  484. package/build/cjs/components/accordion/types.d.cts +0 -13
  485. package/build/cjs/components/accordion/vite-env.d.cjs +0 -2
  486. package/build/cjs/components/accordion/vite-env.d.cjs.map +0 -1
  487. package/build/cjs/components/card/InfoCard.cjs +0 -2
  488. package/build/cjs/components/card/InfoCard.cjs.map +0 -1
  489. package/build/cjs/components/card/InfoCard.d.cts +0 -13
  490. package/build/cjs/components/card/NavCard.cjs +0 -2
  491. package/build/cjs/components/card/NavCard.cjs.map +0 -1
  492. package/build/cjs/components/card/NavCard.d.cts +0 -26
  493. package/build/cjs/components/card/TaskCard.cjs +0 -2
  494. package/build/cjs/components/card/TaskCard.cjs.map +0 -1
  495. package/build/cjs/components/card/TaskCard.d.cts +0 -23
  496. package/build/cjs/components/card/development/examples/InfoCardExample.d.cts +0 -3
  497. package/build/cjs/components/card/development/examples/NavCardExample.d.cts +0 -3
  498. package/build/cjs/components/card/development/examples/TaskCardExample.d.cts +0 -3
  499. package/build/cjs/components/card/development/examples/TopExample.d.cts +0 -3
  500. package/build/cjs/components/card/development/examples/cardExampleProps.d.cts +0 -13
  501. package/build/cjs/components/card/utils.cjs +0 -2
  502. package/build/cjs/components/card/utils.cjs.map +0 -1
  503. package/build/cjs/components/card/utils.d.cts +0 -3
  504. package/build/cjs/components/expander/deprecated/ExpandSection.cjs +0 -2
  505. package/build/cjs/components/expander/deprecated/ExpandSection.cjs.map +0 -1
  506. package/build/cjs/components/expander/deprecated/ExpandSection.d.cts +0 -26
  507. package/build/cjs/components/expander/deprecated/Expander.cjs +0 -2
  508. package/build/cjs/components/expander/deprecated/Expander.cjs.map +0 -1
  509. package/build/cjs/components/expander/deprecated/Expander.d.cts +0 -27
  510. package/build/cjs/components/expander/stories/ExpanderPanel.stories.cjs.map +0 -1
  511. package/build/cjs/components/index.cjs +0 -2
  512. package/build/cjs/components/index.cjs.map +0 -1
  513. package/build/cjs/components/index.d.cts +0 -47
  514. package/build/es/components/ScreenReaderOnly.d.ts +0 -6
  515. package/build/es/components/ScreenReaderOnly.js.map +0 -1
  516. package/build/es/components/accordion/Accordion.d.ts +0 -7
  517. package/build/es/components/accordion/Accordion.js +0 -2
  518. package/build/es/components/accordion/Accordion.js.map +0 -1
  519. package/build/es/components/accordion/AccordionItem.d.ts +0 -7
  520. package/build/es/components/accordion/AccordionItem.js +0 -2
  521. package/build/es/components/accordion/AccordionItem.js.map +0 -1
  522. package/build/es/components/accordion/documentation/AccordionDocs.d.ts +0 -2
  523. package/build/es/components/accordion/documentation/AccordionDocs.js +0 -2
  524. package/build/es/components/accordion/documentation/AccordionDocs.js.map +0 -1
  525. package/build/es/components/accordion/index.d.ts +0 -3
  526. package/build/es/components/accordion/index.js +0 -2
  527. package/build/es/components/accordion/stories/Accordion.stories.d.ts +0 -13
  528. package/build/es/components/accordion/stories/Accordion.stories.js +0 -2
  529. package/build/es/components/accordion/stories/Accordion.stories.js.map +0 -1
  530. package/build/es/components/accordion/stories/AccordionItem.stories.d.ts +0 -13
  531. package/build/es/components/accordion/stories/AccordionItem.stories.js +0 -2
  532. package/build/es/components/accordion/stories/AccordionItem.stories.js.map +0 -1
  533. package/build/es/components/accordion/types.d.ts +0 -13
  534. package/build/es/components/accordion/vite-env.d.js +0 -2
  535. package/build/es/components/accordion/vite-env.d.js.map +0 -1
  536. package/build/es/components/card/InfoCard.d.ts +0 -13
  537. package/build/es/components/card/InfoCard.js +0 -2
  538. package/build/es/components/card/InfoCard.js.map +0 -1
  539. package/build/es/components/card/NavCard.d.ts +0 -26
  540. package/build/es/components/card/NavCard.js +0 -2
  541. package/build/es/components/card/NavCard.js.map +0 -1
  542. package/build/es/components/card/TaskCard.d.ts +0 -23
  543. package/build/es/components/card/TaskCard.js +0 -2
  544. package/build/es/components/card/TaskCard.js.map +0 -1
  545. package/build/es/components/card/development/examples/InfoCardExample.d.ts +0 -3
  546. package/build/es/components/card/development/examples/NavCardExample.d.ts +0 -3
  547. package/build/es/components/card/development/examples/TaskCardExample.d.ts +0 -3
  548. package/build/es/components/card/development/examples/TopExample.d.ts +0 -3
  549. package/build/es/components/card/development/examples/cardExampleProps.d.ts +0 -13
  550. package/build/es/components/card/utils.d.ts +0 -3
  551. package/build/es/components/card/utils.js +0 -2
  552. package/build/es/components/card/utils.js.map +0 -1
  553. package/build/es/components/expander/deprecated/ExpandSection.d.ts +0 -26
  554. package/build/es/components/expander/deprecated/ExpandSection.js +0 -2
  555. package/build/es/components/expander/deprecated/ExpandSection.js.map +0 -1
  556. package/build/es/components/expander/deprecated/Expander.d.ts +0 -27
  557. package/build/es/components/expander/deprecated/Expander.js +0 -2
  558. package/build/es/components/expander/deprecated/Expander.js.map +0 -1
  559. package/build/es/components/expander/stories/ExpanderPanel.stories.js.map +0 -1
  560. package/build/es/components/index.d.ts +0 -47
  561. package/build/es/components/index.js +0 -2
  562. package/build/es/components/index.js.map +0 -1
  563. package/styles/components/accordion/_index.scss +0 -2
  564. package/styles/components/accordion/accordion.css +0 -189
  565. package/styles/components/accordion/accordion.min.css +0 -7
  566. package/styles/components/accordion/accordion.scss +0 -168
  567. package/styles/components/card/_info-card.scss +0 -42
  568. package/styles/components/card/_nav-card.scss +0 -119
  569. package/styles/components/card/_task-card.scss +0 -55
  570. package/styles/components/card/development/info-card-example.css +0 -26
  571. package/styles/components/card/development/info-card-example.min.css +0 -1
  572. package/styles/components/card/development/info-card-example.scss +0 -14
  573. package/styles/components/card/development/task-card-example.css +0 -9
  574. package/styles/components/card/development/task-card-example.min.css +0 -1
  575. package/styles/components/card/development/task-card-example.scss +0 -8
  576. package/styles/components/expander/deprecated/expander.css +0 -82
  577. package/styles/components/expander/deprecated/expander.min.css +0 -1
  578. package/styles/components/expander/deprecated/expander.scss +0 -87
  579. /package/build/cjs/components/expander/stories/{ExpanderPanel.stories.d.cts → ExpandablePanel.stories.d.cts} +0 -0
  580. /package/build/cjs/components/{ScreenReaderOnly.cjs → screen-reader-only/ScreenReaderOnly.cjs} +0 -0
  581. /package/build/cjs/components/{accordion → screen-reader-only}/index.cjs.map +0 -0
  582. /package/build/cjs/components/{accordion → screen-reader-only}/types.cjs +0 -0
  583. /package/build/cjs/components/{accordion → screen-reader-only}/types.cjs.map +0 -0
  584. /package/build/es/components/expander/stories/{ExpanderPanel.stories.d.ts → ExpandablePanel.stories.d.ts} +0 -0
  585. /package/build/es/components/{ScreenReaderOnly.js → screen-reader-only/ScreenReaderOnly.js} +0 -0
  586. /package/build/es/components/{accordion → screen-reader-only}/index.js.map +0 -0
  587. /package/build/es/components/{accordion → screen-reader-only}/types.js +0 -0
  588. /package/build/es/components/{accordion → screen-reader-only}/types.js.map +0 -0
@@ -1,2 +1,2 @@
1
- import{jsxs as t,jsx as e}from"react/jsx-runtime";import{createElement as s}from"react";import{c as i}from"../../../clsx-BeLtu-UY.js";function a({downshiftProps:{getMenuProps:a,getItemProps:l},highlightedIndex:m,items:n,itemToString:o,noHitsMessage:u,maxNumberOfHits:g=Number.POSITIVE_INFINITY,noHits:r}){const c=n.length>g?n.slice(0,g):n;if(0===c.length&&!u&&!r)return null;const _=0===c.length&&r?r.items:c;return t("div",{"data-testid":"autosuggest__menu",className:"jkl-autosuggest__menu",children:[(u||r)&&0===c.length&&e("div",{className:"jkl-autosuggest__no-hits-message","aria-live":"polite",children:u||(null==r?void 0:r.text)}),_.length>0&&e("ul",{...a({className:"jkl-autosuggest__item-list"}),children:_.map(((t,e)=>s("li",{...l({item:t,className:i("jkl-autosuggest__item",{"jkl-autosuggest__item--active":e===m})}),"data-testid":"autosuggest__item",key:o(t)},o(t))))})]})}export{a as default};
1
+ import{jsxs as t,jsx as e}from"react/jsx-runtime";import{createElement as s}from"react";import{c as i}from"../../../clsx-BeLtu-UY.js";function a({downshiftProps:{getMenuProps:a,getItemProps:l},highlightedIndex:m,items:g,itemToString:n,noHitsMessage:o,maxNumberOfHits:u=Number.POSITIVE_INFINITY,noHits:r}){const c=g.length>u?g.slice(0,u):g;if(0===c.length&&!o&&!r)return null;const _=0===c.length&&r?r.items:c;return t("div",{"data-testid":"autosuggest__menu",className:"jkl-autosuggest__menu",children:[(o||r)&&0===c.length&&e("div",{className:"jkl-autosuggest__no-hits-message","aria-live":"polite",children:o||r?.text}),_.length>0&&e("ul",{...a({className:"jkl-autosuggest__item-list"}),children:_.map(((t,e)=>s("li",{...l({item:t,className:i("jkl-autosuggest__item",{"jkl-autosuggest__item--active":e===m})}),"data-testid":"autosuggest__item",key:n(t)},n(t))))})]})}export{a as default};
2
2
  //# sourceMappingURL=Menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.js","sources":["../../../../src/components/autosuggest/Menu.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { PropGetters } from \"downshift\";\nimport React, { type ReactNode } from \"react\";\n\ninterface MenuProps<T> {\n downshiftProps: Pick<PropGetters<T>, \"getMenuProps\" | \"getItemProps\">;\n highlightedIndex: number | undefined | null;\n items: T[];\n itemToString: (item: T | null) => string;\n noHitsMessage?: ReactNode;\n maxNumberOfHits?: number;\n noHits?: { items: T[]; text: ReactNode };\n}\n\nfunction Menu<T>({\n downshiftProps: { getMenuProps, getItemProps },\n highlightedIndex,\n items,\n itemToString,\n noHitsMessage,\n maxNumberOfHits = Number.POSITIVE_INFINITY,\n noHits,\n}: MenuProps<T>): JSX.Element | null {\n const visibleItems =\n items.length > maxNumberOfHits\n ? items.slice(0, maxNumberOfHits)\n : items;\n\n if (visibleItems.length === 0 && !noHitsMessage && !noHits) {\n return null;\n }\n\n const itemList =\n visibleItems.length === 0 && noHits ? noHits.items : visibleItems;\n\n return (\n <div data-testid=\"autosuggest__menu\" className=\"jkl-autosuggest__menu\">\n {(noHitsMessage || noHits) && visibleItems.length === 0 && (\n <div\n className=\"jkl-autosuggest__no-hits-message\"\n aria-live=\"polite\"\n >\n {noHitsMessage || noHits?.text}\n </div>\n )}\n\n {itemList.length > 0 && (\n <ul\n {...getMenuProps({\n className: \"jkl-autosuggest__item-list\",\n })}\n >\n {itemList.map((item, index) => (\n <li\n {...getItemProps({\n item,\n className: clsx(\"jkl-autosuggest__item\", {\n \"jkl-autosuggest__item--active\":\n index === highlightedIndex,\n }),\n })}\n data-testid=\"autosuggest__item\"\n key={itemToString(item)}\n >\n {itemToString(item)}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport default Menu;\n"],"names":["Menu","downshiftProps","getMenuProps","getItemProps","highlightedIndex","items","itemToString","noHitsMessage","maxNumberOfHits","Number","POSITIVE_INFINITY","noHits","visibleItems","length","slice","itemList","jsxs","className","children","jsx","text","map","item","index","createElement","clsx","key"],"mappings":"sIAcA,SAASA,GACLC,gBAAkBC,aAAAA,EAAcC,aAAAA,GAChCC,iBAAAA,EACAC,MAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAC,gBAAAA,EAAkBC,OAAOC,kBACzBC,OAAAA,IAEMC,MAAAA,EACFP,EAAMQ,OAASL,EACTH,EAAMS,MAAM,EAAGN,GACfH,EAEV,GAA4B,IAAxBO,EAAaC,SAAiBN,IAAkBI,EACzC,OAAA,KAGX,MAAMI,EACsB,IAAxBH,EAAaC,QAAgBF,EAASA,EAAON,MAAQO,EAGpD,OAAAI,EAAA,MAAA,CAAI,cAAY,oBAAoBC,UAAU,wBACzCC,SAAA,EAAiBX,GAAAI,IAAmC,IAAxBC,EAAaC,QACvCM,EAAC,MAAA,CACGF,UAAU,mCACV,YAAU,SAETC,aAAiB,MAAAP,OAAA,EAAAA,EAAQS,QAIjCL,EAASF,OAAS,GACfM,EAAC,KAAA,IACOjB,EAAa,CACbe,UAAW,+BAGdC,SAASH,EAAAM,KAAI,CAACC,EAAMC,IACjBC,EAAC,KAAA,IACOrB,EAAa,CACbmB,KAAAA,EACAL,UAAWQ,EAAK,wBAAyB,CACrC,gCACIF,IAAUnB,MAGtB,cAAY,oBACZsB,IAAKpB,EAAagB,IAEjBhB,EAAagB,UAO1C"}
1
+ {"version":3,"file":"Menu.js","sources":["../../../../src/components/autosuggest/Menu.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport type { PropGetters } from \"downshift\";\nimport React, { type ReactNode } from \"react\";\n\ninterface MenuProps<T> {\n downshiftProps: Pick<PropGetters<T>, \"getMenuProps\" | \"getItemProps\">;\n highlightedIndex: number | undefined | null;\n items: T[];\n itemToString: (item: T | null) => string;\n noHitsMessage?: ReactNode;\n maxNumberOfHits?: number;\n noHits?: { items: T[]; text: ReactNode };\n}\n\nfunction Menu<T>({\n downshiftProps: { getMenuProps, getItemProps },\n highlightedIndex,\n items,\n itemToString,\n noHitsMessage,\n maxNumberOfHits = Number.POSITIVE_INFINITY,\n noHits,\n}: MenuProps<T>): JSX.Element | null {\n const visibleItems =\n items.length > maxNumberOfHits\n ? items.slice(0, maxNumberOfHits)\n : items;\n\n if (visibleItems.length === 0 && !noHitsMessage && !noHits) {\n return null;\n }\n\n const itemList =\n visibleItems.length === 0 && noHits ? noHits.items : visibleItems;\n\n return (\n <div data-testid=\"autosuggest__menu\" className=\"jkl-autosuggest__menu\">\n {(noHitsMessage || noHits) && visibleItems.length === 0 && (\n <div\n className=\"jkl-autosuggest__no-hits-message\"\n aria-live=\"polite\"\n >\n {noHitsMessage || noHits?.text}\n </div>\n )}\n\n {itemList.length > 0 && (\n <ul\n {...getMenuProps({\n className: \"jkl-autosuggest__item-list\",\n })}\n >\n {itemList.map((item, index) => (\n <li\n {...getItemProps({\n item,\n className: clsx(\"jkl-autosuggest__item\", {\n \"jkl-autosuggest__item--active\":\n index === highlightedIndex,\n }),\n })}\n data-testid=\"autosuggest__item\"\n key={itemToString(item)}\n >\n {itemToString(item)}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport default Menu;\n"],"names":["Menu","downshiftProps","getMenuProps","getItemProps","highlightedIndex","items","itemToString","noHitsMessage","maxNumberOfHits","Number","POSITIVE_INFINITY","noHits","visibleItems","length","slice","itemList","jsxs","className","children","jsx","text","map","item","index","createElement","clsx","key"],"mappings":"sIAcA,SAASA,GACLC,gBAAkBC,aAAAA,EAAcC,aAAAA,GAChCC,iBAAAA,EACAC,MAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAC,gBAAAA,EAAkBC,OAAOC,kBACzBC,OAAAA,IAEMC,MAAAA,EACFP,EAAMQ,OAASL,EACTH,EAAMS,MAAM,EAAGN,GACfH,EAEV,GAA4B,IAAxBO,EAAaC,SAAiBN,IAAkBI,EACzC,OAAA,KAGX,MAAMI,EACsB,IAAxBH,EAAaC,QAAgBF,EAASA,EAAON,MAAQO,EAGpD,OAAAI,EAAA,MAAA,CAAI,cAAY,oBAAoBC,UAAU,wBACzCC,SAAA,EAAiBX,GAAAI,IAAmC,IAAxBC,EAAaC,QACvCM,EAAC,MAAA,CACGF,UAAU,mCACV,YAAU,SAETC,YAAiBP,GAAQS,OAIjCL,EAASF,OAAS,GACfM,EAAC,KAAA,IACOjB,EAAa,CACbe,UAAW,+BAGdC,SAASH,EAAAM,KAAI,CAACC,EAAMC,IACjBC,EAAC,KAAA,IACOrB,EAAa,CACbmB,KAAAA,EACAL,UAAWQ,EAAK,wBAAyB,CACrC,gCACIF,IAAUnB,MAGtB,cAAY,oBACZsB,IAAKpB,EAAagB,IAEjBhB,EAAagB,UAO1C"}
@@ -1,2 +1,2 @@
1
- import{jsxs as t,jsx as n}from"react/jsx-runtime";import{c as e}from"../../../clsx-BeLtu-UY.js";import o from"react";import{useAriaLiveRegion as a}from"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js";import{Loader as r}from"../loader/Loader.js";const i=o.forwardRef((function(i,s){const{as:l="button",children:d,className:u,density:c,onTouchStart:m,onAnimationEnd:h,loader:v,icon:f,iconPosition:b="left",iconLeft:p,iconRight:y,variant:g="secondary",...j}=i,L=l;"production"!==process.env.NODE_ENV&&0===o.Children.count(d)&&!i["aria-label"]&&!i["aria-labelledby"]&&!i.title&&console.warn("Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title");const k=a(null==v?void 0:v.showLoader),x=!!d&&!(null==v||!v.showLoader);return t(L,{...k,"data-loading":x,"data-density":c,className:e("jkl-button",`jkl-button--${g}`,u),disabled:"button"===l?null==v?void 0:v.showLoader:void 0,...j,ref:s,children:[t("div",{className:"jkl-button__label",children:[p&&p,f&&"left"===b&&f,d&&n("span",{className:"jkl-button__text",children:d}),y&&y,f&&"right"===b&&f]}),d&&n(r,{className:"jkl-button__loader",variant:"medium",textDescription:(null==v?void 0:v.textDescription)||"Vennligst vent","aria-hidden":!(null!=v&&v.showLoader)})]})}));function s(t){const e={...t,variant:"primary"};return n(i,{...e})}function l(t){const e={...t,variant:"secondary"};return n(i,{...e})}function d(t){const e={...t,variant:"tertiary"};return n(i,{...e})}function u(t){const e={...t,variant:"ghost"};return n(i,{...e})}export{i as Button,u as GhostButton,s as PrimaryButton,l as SecondaryButton,d as TertiaryButton};
1
+ import{jsxs as t,jsx as n}from"react/jsx-runtime";import{c as e}from"../../../clsx-BeLtu-UY.js";import a from"react";import{useAriaLiveRegion as o}from"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js";import{Loader as r}from"../loader/Loader.js";const i=a.forwardRef((function(i,s){const{as:l="button",children:c,className:d,density:u,onTouchStart:m,onAnimationEnd:h,loader:f,icon:b,iconPosition:v="left",iconLeft:p,iconRight:y,variant:g="secondary",...j}=i,L=l;"production"!==process.env.NODE_ENV&&0===a.Children.count(c)&&!i["aria-label"]&&!i["aria-labelledby"]&&!i.title&&console.warn("Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title");const k=o(f?.showLoader);return t(L,{...k,"data-loading":!!c&&!!f?.showLoader,"data-density":u,className:e("jkl-button",`jkl-button--${g}`,d),disabled:"button"===l?f?.showLoader:void 0,...j,ref:s,children:[t("div",{className:"jkl-button__label",children:[p&&p,b&&"left"===v&&b,c&&n("span",{className:"jkl-button__text",children:c}),y&&y,b&&"right"===v&&b]}),c&&n(r,{className:"jkl-button__loader",variant:"medium",textDescription:f?.textDescription||"Vennligst vent","aria-hidden":!f?.showLoader})]})}));function s(t){const e={...t,variant:"primary"};return n(i,{...e})}function l(t){const e={...t,variant:"secondary"};return n(i,{...e})}function c(t){const e={...t,variant:"tertiary"};return n(i,{...e})}function d(t){const e={...t,variant:"ghost"};return n(i,{...e})}export{i as Button,d as GhostButton,s as PrimaryButton,l as SecondaryButton,c as TertiaryButton};
2
2
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../../../src/components/button/Button.tsx"],"sourcesContent":["import cn from \"clsx\";\nimport React, { type ButtonHTMLAttributes } from \"react\";\nimport { useAriaLiveRegion } from \"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport { Loader } from \"../loader/Loader.js\";\nimport type { ButtonComponent, ButtonProps } from \"./types.js\";\n\nexport const Button = React.forwardRef(function Button<\n ElementType extends React.ElementType = \"button\",\n>(props: ButtonProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n as = \"button\",\n children,\n className,\n density,\n onTouchStart,\n onAnimationEnd,\n loader,\n icon,\n iconPosition = \"left\",\n iconLeft,\n iconRight,\n variant = \"secondary\",\n ...rest\n } = props;\n\n const Component = as;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n React.Children.count(children) === 0 &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"] &&\n !props.title\n ) {\n console.warn(\n \"Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title\",\n );\n }\n\n const ariaLive = useAriaLiveRegion(loader?.showLoader);\n const showLoader = Boolean(children) && Boolean(loader?.showLoader);\n\n return (\n <Component\n {...ariaLive}\n data-loading={showLoader}\n data-density={density}\n className={cn(\"jkl-button\", `jkl-button--${variant}`, className)}\n disabled={as === \"button\" ? loader?.showLoader : undefined}\n {...rest}\n ref={ref}\n >\n <div className=\"jkl-button__label\">\n {iconLeft && iconLeft}\n {icon && iconPosition === \"left\" && icon}\n {children && (\n <span className=\"jkl-button__text\">{children}</span>\n )}\n {iconRight && iconRight}\n {icon && iconPosition === \"right\" && icon}\n </div>\n\n {children && (\n <Loader\n className=\"jkl-button__loader\"\n variant=\"medium\"\n textDescription={\n loader?.textDescription || \"Vennligst vent\"\n }\n aria-hidden={!loader?.showLoader}\n />\n )}\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 = {\n ...props,\n variant: \"primary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function SecondaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"secondary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function TertiaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"tertiary\",\n } 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 = {\n ...props,\n variant: \"ghost\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n"],"names":["Button","React","forwardRef","props","ref","as","children","className","density","onTouchStart","onAnimationEnd","loader","icon","iconPosition","iconLeft","iconRight","variant","rest","Component","process","env","NODE_ENV","Children","count","title","console","warn","ariaLive","useAriaLiveRegion","showLoader","jsxs","cn","disabled","jsx","Loader","textDescription","PrimaryButton","buttonProps","SecondaryButton","TertiaryButton","GhostButton"],"mappings":"yPAOO,MAAMA,EAASC,EAAMC,YAAW,SAErCC,EAAiCC,GACzB,MACFC,GAAAA,EAAK,SACLC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,OAAAA,EACAC,KAAAA,EACAC,aAAAA,EAAe,OACfC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EAAU,eACPC,GACHd,EAEEe,EAAYb,EAGW,eAAzBc,QAAQC,IAAIC,UACuB,IAAnCpB,EAAMqB,SAASC,MAAMjB,KACpBH,EAAM,gBACNA,EAAM,qBACNA,EAAMqB,OAECC,QAAAC,KACJ,2HAIF,MAAAC,EAAWC,EAAkB,MAAAjB,OAAA,EAAAA,EAAQkB,YACrCA,IAAqBvB,KAAqB,MAAAK,IAAAA,EAAQkB,YAGpD,OAAAC,EAACZ,EAAA,IACOS,EACJ,eAAcE,EACd,eAAcrB,EACdD,UAAWwB,EAAG,aAAc,eAAef,IAAWT,GACtDyB,SAAiB,WAAP3B,EAAkB,MAAAM,OAAA,EAAAA,EAAQkB,gBAAa,KAC7CZ,EACJb,IAAAA,EAEAE,SAAA,CAACwB,EAAA,MAAA,CAAIvB,UAAU,oBACVD,SAAA,CAAYQ,GAAAA,EACZF,GAAyB,SAAjBC,GAA2BD,EACnCN,GACG2B,EAAC,OAAK,CAAA1B,UAAU,mBAAoBD,SAAAA,IAEvCS,GAAaA,EACbH,GAAyB,UAAjBC,GAA4BD,KAGxCN,GACG2B,EAACC,EAAA,CACG3B,UAAU,qBACVS,QAAQ,SACRmB,iBACI,MAAAxB,OAAAA,EAAAA,EAAQwB,kBAAmB,iBAE/B,gBAAc,MAAAxB,GAAAA,EAAQkB,gBAK1C,IAEO,SAASO,EACZjC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,WAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASC,EAGZnC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,aAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASE,EAGZpC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,YAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASG,EACZrC,GAEA,MAAMkC,EAAc,IACblC,EACHa,QAAS,SAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB"}
1
+ {"version":3,"file":"Button.js","sources":["../../../../src/components/button/Button.tsx"],"sourcesContent":["import cn from \"clsx\";\nimport React, { type ButtonHTMLAttributes } from \"react\";\nimport { useAriaLiveRegion } from \"../../hooks/useAriaLiveRegion/useAriaLiveRegion.js\";\nimport type { PolymorphicRef } from \"../../utilities/polymorphism/polymorphism.js\";\nimport { Loader } from \"../loader/Loader.js\";\nimport type { ButtonComponent, ButtonProps } from \"./types.js\";\n\nexport const Button = React.forwardRef(function Button<\n ElementType extends React.ElementType = \"button\",\n>(props: ButtonProps<ElementType>, ref?: PolymorphicRef<ElementType>) {\n const {\n as = \"button\",\n children,\n className,\n density,\n onTouchStart,\n onAnimationEnd,\n loader,\n icon,\n iconPosition = \"left\",\n iconLeft,\n iconRight,\n variant = \"secondary\",\n ...rest\n } = props;\n\n const Component = as;\n\n if (\n process.env.NODE_ENV !== \"production\" &&\n React.Children.count(children) === 0 &&\n !props[\"aria-label\"] &&\n !props[\"aria-labelledby\"] &&\n !props.title\n ) {\n console.warn(\n \"Når du lager en Button uten synlig tekst må du huske å gi den et navn med enten aria-label, aria-labelledby eller title\",\n );\n }\n\n const ariaLive = useAriaLiveRegion(loader?.showLoader);\n const showLoader = Boolean(children) && Boolean(loader?.showLoader);\n\n return (\n <Component\n {...ariaLive}\n data-loading={showLoader}\n data-density={density}\n className={cn(\"jkl-button\", `jkl-button--${variant}`, className)}\n disabled={as === \"button\" ? loader?.showLoader : undefined}\n {...rest}\n ref={ref}\n >\n <div className=\"jkl-button__label\">\n {iconLeft && iconLeft}\n {icon && iconPosition === \"left\" && icon}\n {children && (\n <span className=\"jkl-button__text\">{children}</span>\n )}\n {iconRight && iconRight}\n {icon && iconPosition === \"right\" && icon}\n </div>\n\n {children && (\n <Loader\n className=\"jkl-button__loader\"\n variant=\"medium\"\n textDescription={\n loader?.textDescription || \"Vennligst vent\"\n }\n aria-hidden={!loader?.showLoader}\n />\n )}\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 = {\n ...props,\n variant: \"primary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function SecondaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"secondary\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n\nexport function TertiaryButton<\n ElementType extends React.ElementType = \"button\",\n>(\n props: Omit<ButtonProps<ElementType>, \"variant\" | \"onClick\" | \"as\"> &\n Pick<ButtonHTMLAttributes<HTMLButtonElement>, \"onClick\">,\n) {\n const buttonProps = {\n ...props,\n variant: \"tertiary\",\n } 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 = {\n ...props,\n variant: \"ghost\",\n } as ButtonProps<ElementType>;\n return <Button {...buttonProps} />;\n}\n"],"names":["Button","React","forwardRef","props","ref","as","children","className","density","onTouchStart","onAnimationEnd","loader","icon","iconPosition","iconLeft","iconRight","variant","rest","Component","process","env","NODE_ENV","Children","count","title","console","warn","ariaLive","useAriaLiveRegion","showLoader","jsxs","cn","disabled","jsx","Loader","textDescription","PrimaryButton","buttonProps","SecondaryButton","TertiaryButton","GhostButton"],"mappings":"yPAOO,MAAMA,EAASC,EAAMC,YAAW,SAErCC,EAAiCC,GACzB,MACFC,GAAAA,EAAK,SACLC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,OAAAA,EACAC,KAAAA,EACAC,aAAAA,EAAe,OACfC,SAAAA,EACAC,UAAAA,EACAC,QAAAA,EAAU,eACPC,GACHd,EAEEe,EAAYb,EAGW,eAAzBc,QAAQC,IAAIC,UACuB,IAAnCpB,EAAMqB,SAASC,MAAMjB,KACpBH,EAAM,gBACNA,EAAM,qBACNA,EAAMqB,OAECC,QAAAC,KACJ,2HAIFC,MAAAA,EAAWC,EAAkBjB,GAAQkB,YAIvC,OAAAC,EAACZ,EAAA,IACOS,EACJ,iBALmBrB,KAAqBK,GAAQkB,WAMhD,eAAcrB,EACdD,UAAWwB,EAAG,aAAc,eAAef,IAAWT,GACtDyB,SAAiB,WAAP3B,EAAkBM,GAAQkB,gBAAa,KAC7CZ,EACJb,IAAAA,EAEAE,SAAA,CAACwB,EAAA,MAAA,CAAIvB,UAAU,oBACVD,SAAA,CAAYQ,GAAAA,EACZF,GAAyB,SAAjBC,GAA2BD,EACnCN,GACG2B,EAAC,OAAK,CAAA1B,UAAU,mBAAoBD,SAAAA,IAEvCS,GAAaA,EACbH,GAAyB,UAAjBC,GAA4BD,KAGxCN,GACG2B,EAACC,EAAA,CACG3B,UAAU,qBACVS,QAAQ,SACRmB,gBACIxB,GAAQwB,iBAAmB,iBAE/B,eAAcxB,GAAQkB,eAK1C,IAEO,SAASO,EACZjC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,WAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASC,EAGZnC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,aAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASE,EAGZpC,GAGA,MAAMkC,EAAc,IACblC,EACHa,QAAS,YAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB,CAEO,SAASG,EACZrC,GAEA,MAAMkC,EAAc,IACblC,EACHa,QAAS,SAEN,OAAAiB,EAACjC,EAAQ,IAAGqC,GACvB"}
@@ -1,6 +1,3 @@
1
1
  export { Card } from './Card.js';
2
2
  export { CardImage, type CardImageProps } from './CardImage.js';
3
- export { NavCard, InfoBlock, type NavCardProps } from './NavCard.js';
4
- export { TaskCard, type TaskCardProps } from './TaskCard.js';
5
- export { InfoCard, type InfoCardProps } from './InfoCard.js';
6
- export type { SpacingStep, PaddingOptions, CardProps, CardPadding, CardVariant, } from './types.js';
3
+ export type { CardProps, CardPadding, CardVariant, } from './types.js';
@@ -1,2 +1,2 @@
1
- import{Card as a}from"./Card.js";import{CardImage as r}from"./CardImage.js";import{InfoBlock as s,NavCard as o}from"./NavCard.js";import{TaskCard as d}from"./TaskCard.js";import{InfoCard as C}from"./InfoCard.js";export{a as Card,r as CardImage,s as InfoBlock,C as InfoCard,o as NavCard,d as TaskCard};
1
+ import{Card as a}from"./Card.js";import{CardImage as r}from"./CardImage.js";export{a as Card,r as CardImage};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,13 +1,4 @@
1
1
  import { PolymorphicPropsWithRef } from '../../utilities/polymorphism/polymorphism.js';
2
- export declare const SPACING_STEPS: readonly ["0", "m", "l", "xl", "2xl", "3xl", "4xl"];
3
- type SpacingSteps = typeof SPACING_STEPS;
4
- export declare const NEW_SPACING_STEPS: readonly ["0", "16", "24", "40", "64", "104", "168"];
5
- type NewSpacingSteps = typeof NEW_SPACING_STEPS;
6
- export type BasePadding = SpacingSteps[0 | 1 | 2 | 3] | NewSpacingSteps[0 | 1 | 2 | 3];
7
- export type OldSpacingStep = SpacingSteps[number];
8
- export type NewSpacingStep = NewSpacingSteps[number];
9
- export type SpacingStep = SpacingSteps[number] | NewSpacingSteps[number];
10
- export declare function isOldSpacingStep(value: SpacingStep): value is OldSpacingStep;
11
2
  export declare const CARD_PADDINGS: readonly ["s", "m", "l", "xl"];
12
3
  export type CardPadding = (typeof CARD_PADDINGS)[number];
13
4
  export declare const CARD_VARIANTS: readonly ["outlined", "high", "low"];
@@ -35,46 +26,4 @@ type Props = {
35
26
  clickable?: boolean;
36
27
  };
37
28
  export type CardProps<ElementType extends React.ElementType> = PolymorphicPropsWithRef<ElementType, Props> & Props;
38
- export interface PaddingShorthand {
39
- /**
40
- * Legger til ekstra rom i toppen av kortet, fra spacing-skalaen til Jøkul.
41
- * Ikke bruk ekstra topPadding sammen med tag. Verdier lavere enn for venstre og høyre padding
42
- * blir ignorert.
43
- * @default "24"
44
- */
45
- top?: SpacingStep;
46
- /**
47
- * Bruk stegene fra spacing-skalaen til Jøkul.
48
- * Hvis left og right har forskjellige verdier brukes den største for begge.
49
- * @default "24"
50
- */
51
- right?: BasePadding;
52
- /**
53
- * Legger til ekstra rom i bunnen av kortet, fra spacing-skalaen til Jøkul.
54
- * Verdier lavere enn for venstre og høyre padding blir ignorert.
55
- * @default "24"
56
- */
57
- bottom?: SpacingStep;
58
- /**
59
- * Bruk stegene fra spacing-skalaen til Jøkul.
60
- * Hvis left og right har forskjellige verdier brukes den største for begge.
61
- * @default "24"
62
- */
63
- left?: BasePadding;
64
- }
65
- export interface PaddingOptions {
66
- /**
67
- * Hvor mye rom skal det være rundt innholdet i kortet?
68
- * @default "24"
69
- */
70
- padding?: BasePadding | PaddingShorthand;
71
- }
72
- export type TagType = "success" | "warning" | "info" | "error";
73
- export type CardTag = {
74
- /**
75
- * @default <none> Rendres som nøytral tag
76
- */
77
- type?: TagType;
78
- text: string;
79
- };
80
29
  export {};
@@ -1,2 +1,2 @@
1
- const l=["0","m","l","xl","2xl","3xl","4xl"],s=["0","16","24","40","64","104","168"];function S(s){return l.includes(s)}const n=["s","m","l","xl"],t=["outlined","high","low"];export{n as CARD_PADDINGS,t as CARD_VARIANTS,s as NEW_SPACING_STEPS,l as SPACING_STEPS,S as isOldSpacingStep};
1
+ const A=["s","m","l","xl"],l=["outlined","high","low"];export{A as CARD_PADDINGS,l as CARD_VARIANTS};
2
2
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../src/components/card/types.ts"],"sourcesContent":["import type { PolymorphicPropsWithRef } from \"../../utilities/polymorphism/polymorphism.js\";\n\nexport const SPACING_STEPS = [\n \"0\",\n \"m\",\n \"l\",\n \"xl\",\n \"2xl\",\n \"3xl\",\n \"4xl\",\n] as const;\ntype SpacingSteps = typeof SPACING_STEPS;\nexport const NEW_SPACING_STEPS = [\n \"0\",\n \"16\",\n \"24\",\n \"40\",\n \"64\",\n \"104\",\n \"168\",\n] as const;\ntype NewSpacingSteps = typeof NEW_SPACING_STEPS;\nexport type BasePadding =\n | SpacingSteps[0 | 1 | 2 | 3]\n | NewSpacingSteps[0 | 1 | 2 | 3];\nexport type OldSpacingStep = SpacingSteps[number];\nexport type NewSpacingStep = NewSpacingSteps[number];\nexport type SpacingStep = SpacingSteps[number] | NewSpacingSteps[number];\n\nexport function isOldSpacingStep(value: SpacingStep): value is OldSpacingStep {\n return SPACING_STEPS.includes(value as OldSpacingStep);\n}\n\nexport const CARD_PADDINGS = [\"s\", \"m\", \"l\", \"xl\"] as const;\nexport type CardPadding = (typeof CARD_PADDINGS)[number];\nexport const CARD_VARIANTS = [\"outlined\", \"high\", \"low\"] as const;\nexport type CardVariant = (typeof CARD_VARIANTS)[number];\n\ntype Props = {\n className?: string;\n /**\n * Setter padding på kortet. Tilsvarer samme property i Figma.\n * @default \"s\"\n */\n padding?: CardPadding;\n /**\n * Angir hvilken kortvariant du vil bruke. Velg en variant som gir god kontrast\n * til bakgrunnen på siden, slik at det er enkelt å skille innholdet fra hverandre.\n * @default \"high\"\n */\n variant?: CardVariant;\n /**\n * Angir om kortet visuelt skal fremstå som klikkbart. Du må selv rendre\n * kortet som et klikkbart element (f.eks. `<a>` eller en `<Link>` fra\n * et ruting-bibliotek) og gi det en `href` eller `onClick`-handler.\n * HUSK: Sett aria-label for at støtteverktøy, som skjermlesere, ikke\n * skal lese alt innholdet i kortet.\n */\n clickable?: boolean;\n};\n\nexport type CardProps<ElementType extends React.ElementType> =\n PolymorphicPropsWithRef<ElementType, Props> & Props;\n\nexport interface PaddingShorthand {\n /**\n * Legger til ekstra rom i toppen av kortet, fra spacing-skalaen til Jøkul.\n * Ikke bruk ekstra topPadding sammen med tag. Verdier lavere enn for venstre og høyre padding\n * blir ignorert.\n * @default \"24\"\n */\n top?: SpacingStep;\n /**\n * Bruk stegene fra spacing-skalaen til Jøkul.\n * Hvis left og right har forskjellige verdier brukes den største for begge.\n * @default \"24\"\n */\n right?: BasePadding;\n /**\n * Legger til ekstra rom i bunnen av kortet, fra spacing-skalaen til Jøkul.\n * Verdier lavere enn for venstre og høyre padding blir ignorert.\n * @default \"24\"\n */\n bottom?: SpacingStep;\n /**\n * Bruk stegene fra spacing-skalaen til Jøkul.\n * Hvis left og right har forskjellige verdier brukes den største for begge.\n * @default \"24\"\n */\n left?: BasePadding;\n}\n\nexport interface PaddingOptions {\n /**\n * Hvor mye rom skal det være rundt innholdet i kortet?\n * @default \"24\"\n */\n padding?: BasePadding | PaddingShorthand;\n}\n\nexport type TagType = \"success\" | \"warning\" | \"info\" | \"error\";\n\nexport type CardTag = {\n /**\n * @default <none> Rendres som nøytral tag\n */\n type?: TagType;\n text: string;\n};\n"],"names":["SPACING_STEPS","NEW_SPACING_STEPS","isOldSpacingStep","value","includes","CARD_PADDINGS","CARD_VARIANTS"],"mappings":"AAEO,MAAMA,EAAgB,CACzB,IACA,IACA,IACA,KACA,MACA,MACA,OAGSC,EAAoB,CAC7B,IACA,KACA,KACA,KACA,KACA,MACA,OAUG,SAASC,EAAiBC,GACtBH,OAAAA,EAAcI,SAASD,EAClC,CAEO,MAAME,EAAgB,CAAC,IAAK,IAAK,IAAK,MAEhCC,EAAgB,CAAC,WAAY,OAAQ"}
1
+ {"version":3,"file":"types.js","sources":["../../../../src/components/card/types.ts"],"sourcesContent":["import type { PolymorphicPropsWithRef } from \"../../utilities/polymorphism/polymorphism.js\";\n\nexport const CARD_PADDINGS = [\"s\", \"m\", \"l\", \"xl\"] as const;\nexport type CardPadding = (typeof CARD_PADDINGS)[number];\nexport const CARD_VARIANTS = [\"outlined\", \"high\", \"low\"] as const;\nexport type CardVariant = (typeof CARD_VARIANTS)[number];\n\ntype Props = {\n className?: string;\n /**\n * Setter padding på kortet. Tilsvarer samme property i Figma.\n * @default \"s\"\n */\n padding?: CardPadding;\n /**\n * Angir hvilken kortvariant du vil bruke. Velg en variant som gir god kontrast\n * til bakgrunnen på siden, slik at det er enkelt å skille innholdet fra hverandre.\n * @default \"high\"\n */\n variant?: CardVariant;\n /**\n * Angir om kortet visuelt skal fremstå som klikkbart. Du må selv rendre\n * kortet som et klikkbart element (f.eks. `<a>` eller en `<Link>` fra\n * et ruting-bibliotek) og gi det en `href` eller `onClick`-handler.\n * HUSK: Sett aria-label for at støtteverktøy, som skjermlesere, ikke\n * skal lese alt innholdet i kortet.\n */\n clickable?: boolean;\n};\n\nexport type CardProps<ElementType extends React.ElementType> =\n PolymorphicPropsWithRef<ElementType, Props> & Props;\n"],"names":["CARD_PADDINGS","CARD_VARIANTS"],"mappings":"AAEO,MAAMA,EAAgB,CAAC,IAAK,IAAK,IAAK,MAEhCC,EAAgB,CAAC,WAAY,OAAQ"}
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{forwardRef as a,useState as t,useCallback as r}from"react";import{BasePanel as s}from"../../shared/input-panel/BasePanel.js";const c=a((function({label:a,extraLabel:c,alwaysOpen:l=!1,checked:n,defaultChecked:o,onChange:d,...h},f){const[p,u]=t(o||!1),k=r((e=>{null==d||d(e),u(e.target.checked)}),[d]),i=typeof n<"u";return e(s,{ref:f,type:"checkbox",isChecked:i?n:p,defaultChecked:o,checked:i?n:void 0,onChange:k,alwaysOpen:l,label:a,extraLabel:c,...h})}));export{c as CheckboxPanel};
1
+ import{jsx as e}from"react/jsx-runtime";import{forwardRef as a,useState as t,useCallback as r}from"react";import{BasePanel as s}from"../../shared/input-panel/BasePanel.js";const c=a((function({label:a,extraLabel:c,alwaysOpen:n=!1,checked:o,defaultChecked:l,onChange:d,...h},f){const[p,k]=t(l||!1),u=r((e=>{d?.(e),k(e.target.checked)}),[d]),i=typeof o<"u";return e(s,{ref:f,type:"checkbox",isChecked:i?o:p,defaultChecked:l,checked:i?o:void 0,onChange:u,alwaysOpen:n,label:a,extraLabel:c,...h})}));export{c as CheckboxPanel};
2
2
  //# sourceMappingURL=CheckboxPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxPanel.js","sources":["../../../../src/components/checkbox-panel/CheckboxPanel.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type ForwardedRef,\n forwardRef,\n useCallback,\n useState,\n} from \"react\";\nimport { BasePanel } from \"../../shared/input-panel/BasePanel.js\";\nimport type { CheckboxPanelProps } from \"./types.js\";\n\nexport const CheckboxPanel = forwardRef(function CheckboxPanel(\n {\n label,\n extraLabel,\n alwaysOpen = false,\n checked,\n defaultChecked,\n onChange,\n ...rest\n }: CheckboxPanelProps,\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const [_isChecked, setIsChecked] = useState(defaultChecked || false);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n setIsChecked(e.target.checked);\n },\n [onChange],\n );\n\n const isControlled = typeof checked !== \"undefined\";\n const isChecked = isControlled ? checked : _isChecked;\n\n return (\n <BasePanel\n ref={ref}\n type=\"checkbox\"\n isChecked={isChecked}\n defaultChecked={defaultChecked}\n checked={isControlled ? checked : undefined}\n onChange={handleChange}\n alwaysOpen={alwaysOpen}\n label={label}\n extraLabel={extraLabel}\n {...rest}\n />\n );\n});\n"],"names":["CheckboxPanel","forwardRef","label","extraLabel","alwaysOpen","checked","defaultChecked","onChange","rest","ref","_isChecked","setIsChecked","useState","handleChange","useCallback","e","target","isControlled","jsx","BasePanel","type","isChecked"],"mappings":"4KAUa,MAAAA,EAAgBC,GAAW,UAEhCC,MAAAA,EACAC,WAAAA,EACAC,WAAAA,GAAa,EACbC,QAAAA,EACAC,eAAAA,EACAC,SAAAA,KACGC,GAEPC,GAEM,MAACC,EAAYC,GAAgBC,EAASN,IAAkB,GAExDO,EAAeC,GAChBC,IACG,MAAAR,GAAAA,EAAWQ,GACEJ,EAAAI,EAAEC,OAAOX,QAAO,GAEjC,CAACE,IAGCU,SAAsBZ,EAAY,IAIpC,OAAAa,EAACC,EAAA,CACGV,IAAAA,EACAW,KAAK,WACLC,UANUJ,EAAeZ,EAAUK,EAOnCJ,eAAAA,EACAD,QAASY,EAAeZ,OAAU,EAClCE,SAAUM,EACVT,WAAAA,EACAF,MAAAA,EACAC,WAAAA,KACIK,GAGhB"}
1
+ {"version":3,"file":"CheckboxPanel.js","sources":["../../../../src/components/checkbox-panel/CheckboxPanel.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type ForwardedRef,\n forwardRef,\n useCallback,\n useState,\n} from \"react\";\nimport { BasePanel } from \"../../shared/input-panel/BasePanel.js\";\nimport type { CheckboxPanelProps } from \"./types.js\";\n\nexport const CheckboxPanel = forwardRef(function CheckboxPanel(\n {\n label,\n extraLabel,\n alwaysOpen = false,\n checked,\n defaultChecked,\n onChange,\n ...rest\n }: CheckboxPanelProps,\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const [_isChecked, setIsChecked] = useState(defaultChecked || false);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n onChange?.(e);\n setIsChecked(e.target.checked);\n },\n [onChange],\n );\n\n const isControlled = typeof checked !== \"undefined\";\n const isChecked = isControlled ? checked : _isChecked;\n\n return (\n <BasePanel\n ref={ref}\n type=\"checkbox\"\n isChecked={isChecked}\n defaultChecked={defaultChecked}\n checked={isControlled ? checked : undefined}\n onChange={handleChange}\n alwaysOpen={alwaysOpen}\n label={label}\n extraLabel={extraLabel}\n {...rest}\n />\n );\n});\n"],"names":["CheckboxPanel","forwardRef","label","extraLabel","alwaysOpen","checked","defaultChecked","onChange","rest","ref","_isChecked","setIsChecked","useState","handleChange","useCallback","e","target","isControlled","jsx","BasePanel","type","isChecked"],"mappings":"4KAUa,MAAAA,EAAgBC,GAAW,UAEhCC,MAAAA,EACAC,WAAAA,EACAC,WAAAA,GAAa,EACbC,QAAAA,EACAC,eAAAA,EACAC,SAAAA,KACGC,GAEPC,GAEM,MAACC,EAAYC,GAAgBC,EAASN,IAAkB,GAExDO,EAAeC,GAChBC,IACGR,IAAWQ,GACEJ,EAAAI,EAAEC,OAAOX,QAAO,GAEjC,CAACE,IAGCU,SAAsBZ,EAAY,IAIpC,OAAAa,EAACC,EAAA,CACGV,IAAAA,EACAW,KAAK,WACLC,UANUJ,EAAeZ,EAAUK,EAOnCJ,eAAAA,EACAD,QAASY,EAAeZ,OAAU,EAClCE,SAAUM,EACVT,WAAAA,EACAF,MAAAA,EACAC,WAAAA,KACIK,GAGhB"}
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{c as t}from"../../../clsx-BeLtu-UY.js";import{useState as a,useRef as n,useEffect as l,useCallback as r,useMemo as i}from"react";import{useAnimatedHeight as s}from"../../hooks/useAnimatedHeight/useAnimatedHeight.js";import{useId as c}from"../../hooks/useId/useId.js";import{useListNavigation as u}from"../../hooks/useListNavigation/useListNavigation.js";import{Chip as p}from"../chip/Chip.js";import{IconButton as d}from"../icon-button/IconButton.js";import{CheckIcon as m}from"../icon/icons/CheckIcon.js";import{ArrowVerticalAnimated as b}from"../icon/icons/animated/ArrowVerticalAnimated.js";import{InputGroup as v}from"../input-group/InputGroup.js";import{Tooltip as f}from"../tooltip/Tooltip.js";import{TooltipContent as h}from"../tooltip/TooltipContent.js";import{TooltipTrigger as k}from"../tooltip/TooltipTrigger.js";function g(e){return"string"==typeof e?{value:e,label:e}:e}const _=({id:_,placeholder:j,items:x,onChange:y,onFocus:w,onBlur:C,value:$,label:N,noMatchingOption:L,labelProps:T,helpLabel:I,errorLabel:B,width:D,density:P,name:A,className:E,invalid:F,hasTagHover:M})=>{var O,K;const S=c(_||"jkl-combobox",{generateSuffix:!_}),V=`${S}_label`,H=`${S}_button`,q=`${S}_search-input`,[G,R]=a($||[]),[U,z]=a(!1),[J,Q]=a(""),[W,X]=a(!1),[Y,Z]=a(!1),ee=n(null),oe=n(null),te=n(!1);l((()=>{Q(""),U&&ee.current&&ee.current.focus()}),[U]),l((()=>{R((e=>$||e))}),[$]);const ae=e=>!!G&&G.some((o=>o.value===e.value)),ne=r((e=>G.filter((o=>o.value!==e))),[G]),le=r(((e,o)=>{const t=ne(o);R(t),y({type:"change",target:{name:A,value:o,selectedOptions:t}}),e.stopPropagation(),0===t.length&&Z(!1)}),[ne,y,A]),re=r((e=>{var o;let t;if(G.some((o=>o.value===e)))t=ne(e);else{const o=x.find((o=>o.value===e));t=[...G,o]}null==(o=ee.current)||o.focus(),R(t),y({type:"change",target:{name:A,value:e,selectedOptions:t}})}),[G,y,A,ne,x]),ie=e=>{var o;null==(o=ee.current)||o.focus(),z(!0),Q(e.target.value)},se=i((()=>{if(!J)return x;const e=x.filter((e=>e.label.toLowerCase().indexOf(J.toLowerCase())>=0));return X(0===e.length),e}),[J,x]),[ce,ue]=a(null!=(O=se[0])&&O.value?`${S}-${null==(K=se[0])?void 0:K.value}`:void 0),pe=!U;l((()=>{const e=e=>{"Escape"===e.key&&U&&z(!1)};return typeof window<"u"&&window.addEventListener("keydown",e),()=>{typeof window<"u"&&U&&window.removeEventListener("keydown",e)}}),[U]);const de=r((e=>{e?ee.current&&ee.current.focus():te.current&&oe.current&&oe.current.focus()}),[]),me=r((()=>{te.current||(w&&w({type:"change",target:{name:A,value:(null==G?void 0:G[0].value)||"",selectedOptions:G}}),te.current=!0,z(!0))}),[w,G,A]),[be]=s(U,{onFirstVisible:de,onTransitionEnd:de});u({ref:be});const ve=n(null),fe=r((e=>{var o,t;const a=ve.current;(null==a?void 0:a.contains(e.relatedTarget))||(Q(""),C&&(C({type:"blur",target:{name:A,value:(null==(o=null==G?void 0:G[0])?void 0:o.value)||"",selectedOptions:G}}),null==(t=oe.current)||t.dispatchEvent(new Event("focusout",{bubbles:!0}))),te.current=!1,z(!1))}),[C,A,G]),he=r((e=>{e.target.focus({preventScroll:!0})}),[]),ke=r((e=>{var o;if("ArrowDown"===e.key){e.preventDefault(),e.stopPropagation();const t=be.current;t&&(null==(o=t.querySelector('[role="option"]'))||o.focus())}else"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),z(!1));if(e.metaKey&&"a"===e.key||e.ctrlKey&&"a"===e.key){e.preventDefault(),e.stopPropagation();const o=G.map((e=>({...e,isMarked:!0})));Z(!0),R(o)}else if("Backspace"===e.key)if(e.stopPropagation(),Z(!1),G.some((e=>e.isMarked))){const e=G.filter((e=>!e.isMarked));R(e),Q("")}else G.length>0&&""===J&&le(e,G[G.length-1].value)}),[G,J,be,le]),ge=r((e=>{if("Tab"===e.key)ee.current&&(e.preventDefault(),e.stopPropagation(),e.shiftKey||z(!1),ee.current.focus());else if("ArrowUp"===e.key&&be.current&&ee.current){const o=be.current.querySelector('[role="option"]:not([hidden])');e.currentTarget.id===(null==o?void 0:o.id)&&ee.current&&ee.current.focus()}}),[be]),_e=G.length>=1,je=r((o=>e(p,{"data-testid":"jkl-chip","aria-label":`Fjern ${o.tagLabel}`,className:`jkl-combobox__selected-option ${Y&&"jkl-combobox__selected-option--marked"}`,variant:"input",onClick:e=>{ee.current&&ee.current.focus(),le(e,o.value)},onBlur:fe,children:o.tagLabel?o.tagLabel:o.label},o.value)),[fe,le,Y]);return e(v,{label:N,id:q,ref:ve,"data-testid":"jkl-combobox",className:t("jkl-combobox",E,{"jkl-combobox--invalid":!!B||F,"jkl-combobox--menu-open":U,"jkl-combobox--menu-closed":!U&&_e}),labelProps:{id:V,...T},helpLabel:I,errorLabel:B,density:P,render:a=>o("div",{className:t("jkl-combobox__wrapper",{"jkl-combobox__wrapper--active-value":_e}),style:{width:D},tabIndex:-1,onFocus:me,onBlur:fe,children:[o("div",{className:"jkl-combobox__chips","data-testid":"jkl-combobox__chips",children:[G.map(g).map((t=>M?o(f,{children:[e(k,{children:je(t)}),e(h,{children:t.label})]},t.value):je(t))),e("input",{...a,className:"jkl-combobox__search-input",onChange:ie,"data-testid":"jkl-combobox__search-input",onFocus:me,onBlur:fe,onKeyDown:ke,value:J,ref:ee,"aria-controls":S,role:"combobox","aria-autocomplete":"list","aria-expanded":U,placeholder:G.length>0?"":j,autoComplete:"off"})]}),o("div",{className:"jkl-combobox__menu",role:"listbox",ref:be,id:S,"aria-labelledby":V,"aria-multiselectable":"true","aria-activedescendant":ce,onFocus:me,onBlur:fe,tabIndex:-1,children:[se.map(((t,a)=>o("button",{type:"button",id:`${S}__${t.value}`,"aria-selected":ae(t),role:"option",value:t.value,onBlur:fe,className:`jkl-combobox__option ${ae(t)&&"jkl-combobox__option--selected"}`,"data-testid":"jkl-combobox__option","data-testautoid":`jkl-combobox__option-${a}`,onFocus:me,onKeyDown:ge,onClick:e=>{ue(`${S}__${t.value}`),e.stopPropagation(),re(t.value),Q("")},onMouseOver:he,children:[t.description?o("span",{children:[t.label,e("span",{className:"jkl-combobox__option-description",children:t.description})]}):t.label,ae(t)?o("span",{children:[e(m,{})," "]}):null]},`${S}-${t.value}`))),W&&e("div",{className:"jkl-combobox__no-option",children:L})]}),e("div",{className:"jkl-combobox__actions",children:e(d,{id:H,onFocus:me,onBlur:fe,className:"jkl-combobox__button","data-testid":"jkl-combobox__button","aria-label":`${G.map((e=>e.label))||"Velg"},${N}`,"aria-expanded":U,"aria-controls":S,onClick:()=>z((e=>!e)),onMouseDown:e=>{var o;e.preventDefault(),null==(o=oe.current)||o.focus()},children:e(b,{pointingDown:pe})})})]})})};_.displayName="Combobox";export{_ as Combobox,g as getComboboxValuePair};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{c as t}from"../../../clsx-BeLtu-UY.js";import{useState as a,useRef as n,useEffect as r,useCallback as l,useMemo as i}from"react";import{useAnimatedHeight as s}from"../../hooks/useAnimatedHeight/useAnimatedHeight.js";import{useId as c}from"../../hooks/useId/useId.js";import{useListNavigation as u}from"../../hooks/useListNavigation/useListNavigation.js";import{Chip as p}from"../chip/Chip.js";import{IconButton as d}from"../icon-button/IconButton.js";import{CheckIcon as m}from"../icon/icons/CheckIcon.js";import{ArrowVerticalAnimated as b}from"../icon/icons/animated/ArrowVerticalAnimated.js";import{InputGroup as f}from"../input-group/InputGroup.js";import{Tooltip as v}from"../tooltip/Tooltip.js";import{TooltipContent as h}from"../tooltip/TooltipContent.js";import{TooltipTrigger as k}from"../tooltip/TooltipTrigger.js";function g(e){return"string"==typeof e?{value:e,label:e}:e}const _=({id:_,placeholder:j,items:x,onChange:y,onFocus:w,onBlur:C,value:N,label:$,noMatchingOption:L,labelProps:T,helpLabel:I,errorLabel:B,width:D,density:P,name:A,className:E,invalid:F,hasTagHover:M})=>{const O=c(_||"jkl-combobox",{generateSuffix:!_}),K=`${O}_label`,S=`${O}_button`,H=`${O}_search-input`,[V,q]=a(N||[]),[G,R]=a(!1),[U,z]=a(""),[J,Q]=a(!1),[W,X]=a(!1),Y=n(null),Z=n(null),ee=n(!1);r((()=>{z(""),G&&Y.current&&Y.current.focus()}),[G]),r((()=>{q((e=>N||e))}),[N]);const oe=e=>!!V&&V.some((o=>o.value===e.value)),te=l((e=>V.filter((o=>o.value!==e))),[V]),ae=l(((e,o)=>{const t=te(o);q(t),y({type:"change",target:{name:A,value:o,selectedOptions:t}}),e.stopPropagation(),0===t.length&&X(!1)}),[te,y,A]),ne=l((e=>{let o;if(V.some((o=>o.value===e)))o=te(e);else{const t=x.find((o=>o.value===e));o=[...V,t]}Y.current?.focus(),q(o),y({type:"change",target:{name:A,value:e,selectedOptions:o}})}),[V,y,A,te,x]),re=e=>{Y.current?.focus(),R(!0),z(e.target.value)},le=i((()=>{if(!U)return x;const e=x.filter((e=>e.label.toLowerCase().indexOf(U.toLowerCase())>=0));return Q(0===e.length),e}),[U,x]),[ie,se]=a(le[0]?.value?`${O}-${le[0]?.value}`:void 0),ce=!G;r((()=>{const e=e=>{"Escape"===e.key&&G&&R(!1)};return typeof window<"u"&&window.addEventListener("keydown",e),()=>{typeof window<"u"&&G&&window.removeEventListener("keydown",e)}}),[G]);const ue=l((e=>{e?Y.current&&Y.current.focus():ee.current&&Z.current&&Z.current.focus()}),[]),pe=l((()=>{ee.current||(w&&w({type:"change",target:{name:A,value:V?.[0].value||"",selectedOptions:V}}),ee.current=!0,R(!0))}),[w,V,A]),[de]=s(G,{onFirstVisible:ue,onTransitionEnd:ue});u({ref:de});const me=n(null),be=l((e=>{me.current?.contains(e.relatedTarget)||(z(""),C&&(C({type:"blur",target:{name:A,value:V?.[0]?.value||"",selectedOptions:V}}),Z.current?.dispatchEvent(new Event("focusout",{bubbles:!0}))),ee.current=!1,R(!1))}),[C,A,V]),fe=l((e=>{e.target.focus({preventScroll:!0})}),[]),ve=l((e=>{if("ArrowDown"===e.key){e.preventDefault(),e.stopPropagation();const o=de.current;o&&o.querySelector('[role="option"]')?.focus()}else"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),R(!1));if(e.metaKey&&"a"===e.key||e.ctrlKey&&"a"===e.key){e.preventDefault(),e.stopPropagation();const o=V.map((e=>({...e,isMarked:!0})));X(!0),q(o)}else if("Backspace"===e.key)if(e.stopPropagation(),X(!1),V.some((e=>e.isMarked))){const e=V.filter((e=>!e.isMarked));q(e),z("")}else V.length>0&&""===U&&ae(e,V[V.length-1].value)}),[V,U,de,ae]),he=l((e=>{if("Tab"===e.key)Y.current&&(e.preventDefault(),e.stopPropagation(),e.shiftKey||R(!1),Y.current.focus());else if("ArrowUp"===e.key&&de.current&&Y.current){const o=de.current.querySelector('[role="option"]:not([hidden])');e.currentTarget.id===o?.id&&Y.current&&Y.current.focus()}}),[de]),ke=V.length>=1,ge=l((o=>e(p,{"data-testid":"jkl-chip","aria-label":`Fjern ${o.tagLabel}`,className:`jkl-combobox__selected-option ${W&&"jkl-combobox__selected-option--marked"}`,variant:"input",onClick:e=>{Y.current&&Y.current.focus(),ae(e,o.value)},onBlur:be,children:o.tagLabel?o.tagLabel:o.label},o.value)),[be,ae,W]);return e(f,{label:$,id:H,ref:me,"data-testid":"jkl-combobox",className:t("jkl-combobox",E,{"jkl-combobox--invalid":!!B||F,"jkl-combobox--menu-open":G,"jkl-combobox--menu-closed":!G&&ke}),labelProps:{id:K,...T},helpLabel:I,errorLabel:B,density:P,render:a=>o("div",{className:t("jkl-combobox__wrapper",{"jkl-combobox__wrapper--active-value":ke}),style:{width:D},tabIndex:-1,onFocus:pe,onBlur:be,children:[o("div",{className:"jkl-combobox__chips","data-testid":"jkl-combobox__chips",children:[V.map(g).map((t=>M?o(v,{children:[e(k,{children:ge(t)}),e(h,{children:t.label})]},t.value):ge(t))),e("input",{...a,className:"jkl-combobox__search-input",onChange:re,"data-testid":"jkl-combobox__search-input",onFocus:pe,onBlur:be,onKeyDown:ve,value:U,ref:Y,"aria-controls":O,role:"combobox","aria-autocomplete":"list","aria-expanded":G,placeholder:V.length>0?"":j,autoComplete:"off"})]}),o("div",{className:"jkl-combobox__menu",role:"listbox",ref:de,id:O,"aria-labelledby":K,"aria-multiselectable":"true","aria-activedescendant":ie,onFocus:pe,onBlur:be,tabIndex:-1,children:[le.map(((t,a)=>o("button",{type:"button",id:`${O}__${t.value}`,"aria-selected":oe(t),role:"option",value:t.value,onBlur:be,className:`jkl-combobox__option ${oe(t)&&"jkl-combobox__option--selected"}`,"data-testid":"jkl-combobox__option","data-testautoid":`jkl-combobox__option-${a}`,onFocus:pe,onKeyDown:he,onClick:e=>{se(`${O}__${t.value}`),e.stopPropagation(),ne(t.value),z("")},onMouseOver:fe,children:[t.description?o("span",{children:[t.label,e("span",{className:"jkl-combobox__option-description",children:t.description})]}):t.label,oe(t)?o("span",{children:[e(m,{})," "]}):null]},`${O}-${t.value}`))),J&&e("div",{className:"jkl-combobox__no-option",children:L})]}),e("div",{className:"jkl-combobox__actions",children:e(d,{id:S,onFocus:pe,onBlur:be,className:"jkl-combobox__button","data-testid":"jkl-combobox__button","aria-label":"Åpne meny","aria-expanded":G,"aria-controls":O,onClick:()=>R((e=>!e)),onMouseDown:e=>{e.preventDefault(),Z.current?.focus()},children:e(b,{pointingDown:ce})})})]})})};_.displayName="Combobox";export{_ as Combobox,g as getComboboxValuePair};
2
2
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type FC,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useAnimatedHeight } from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport { useId } from \"../../hooks/useId/useId.js\";\nimport { useListNavigation } from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type { ValuePair } from \"../../utilities/valuePair.js\";\nimport { Chip } from \"../chip/Chip.js\";\nimport { IconButton } from \"../icon-button/IconButton.js\";\nimport { CheckIcon } from \"../icon/icons/CheckIcon.js\";\nimport { ArrowVerticalAnimated } from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport { InputGroup } from \"../input-group/InputGroup.js\";\nimport { Tooltip } from \"../tooltip/Tooltip.js\";\nimport { TooltipContent } from \"../tooltip/TooltipContent.js\";\nimport { TooltipTrigger } from \"../tooltip/TooltipTrigger.js\";\nimport type { ComboboxProps, ComboboxValuePair } from \"./types.js\";\n\nexport function getComboboxValuePair(\n item: string | ComboboxValuePair,\n): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<\n Array<ComboboxValuePair>\n >(value || []);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n }\n\n return selectedValue.some((value) => value.value === option.value);\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e:\n | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n const newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, onChange, name],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: {\n target: { value: React.SetStateAction<string> };\n }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) =>\n option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<\n string | undefined\n >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n // Håndtere arrow-state\n const isPointingDown = !showMenu;\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (\n e: FocusEvent<\n HTMLDivElement | HTMLInputElement | HTMLButtonElement\n >,\n ) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent = componentRootElement?.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(\n new Event(\"focusout\", { bubbles: true }),\n );\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement\n .querySelector<HTMLButtonElement>('[role=\"option\"]')\n ?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some(\n (item) => item.isMarked,\n );\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter(\n (item) => !item.isMarked,\n );\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(\n e,\n selectedValue[selectedValue.length - 1].value,\n );\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector(\n '[role=\"option\"]:not([hidden])',\n );\n if (\n e.currentTarget.id === firstVisible?.id &&\n searchRef.current\n ) {\n searchRef.current.focus();\n }\n }\n }\n },\n [dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n const renderSelectedOption = useCallback(\n (option: ComboboxValuePair) => (\n <Chip\n key={option.value}\n data-testid=\"jkl-chip\"\n aria-label={`Fjern ${option.tagLabel}`}\n className={`jkl-combobox__selected-option ${\n marked && \"jkl-combobox__selected-option--marked\"\n }`}\n variant=\"input\"\n onClick={(e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n }}\n onBlur={handleBlur}\n >\n {option.tagLabel ? option.tagLabel : option.label}\n </Chip>\n ),\n [handleBlur, onTagRemove, marked],\n );\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", {\n \"jkl-combobox__wrapper--active-value\": hasSelection,\n })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className=\"jkl-combobox__chips\"\n data-testid=\"jkl-combobox__chips\"\n >\n {selectedValue\n .map(getComboboxValuePair)\n .map((option) => {\n return hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {renderSelectedOption(option)}\n </TooltipTrigger>\n <TooltipContent>\n {option.label}\n </TooltipContent>\n </Tooltip>\n ) : (\n renderSelectedOption(option)\n );\n })}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={\n selectedValue.length > 0 ? \"\" : placeholder\n }\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) &&\n \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(\n `${listId}__${option.value}`,\n ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">\n {option.description}\n </span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && (\n <div className=\"jkl-combobox__no-option\">\n {noMatchingOption}\n </div>\n )}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label={`${\n selectedValue.map((value) => value.label) ||\n \"Velg\"\n },${label}`}\n aria-expanded={showMenu}\n aria-controls={listId}\n onClick={() => setShowMenu((previous) => !previous)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated\n pointingDown={isPointingDown}\n />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","_a","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","_b","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","componentRootElement","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.js","sources":["../../../../src/components/combobox/Combobox.tsx"],"sourcesContent":["import clsx from \"clsx\";\nimport React, {\n type FC,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {useAnimatedHeight} from \"../../hooks/useAnimatedHeight/useAnimatedHeight.js\";\nimport {useId} from \"../../hooks/useId/useId.js\";\nimport {useListNavigation} from \"../../hooks/useListNavigation/useListNavigation.js\";\nimport type {ValuePair} from \"../../utilities/valuePair.js\";\nimport {Chip} from \"../chip/Chip.js\";\nimport {IconButton} from \"../icon-button/IconButton.js\";\nimport {CheckIcon} from \"../icon/icons/CheckIcon.js\";\nimport {ArrowVerticalAnimated} from \"../icon/icons/animated/ArrowVerticalAnimated.js\";\nimport {InputGroup} from \"../input-group/InputGroup.js\";\nimport {Tooltip} from \"../tooltip/Tooltip.js\";\nimport {TooltipContent} from \"../tooltip/TooltipContent.js\";\nimport {TooltipTrigger} from \"../tooltip/TooltipTrigger.js\";\nimport type {ComboboxProps, ComboboxValuePair} from \"./types.js\";\n\nexport function getComboboxValuePair(\n item: string | ComboboxValuePair,\n): ComboboxValuePair {\n return typeof item === \"string\" ? { value: item, label: item } : item;\n}\n\nexport const Combobox: FC<ComboboxProps> = ({\n id,\n placeholder,\n items,\n onChange,\n onFocus,\n onBlur,\n value,\n label,\n noMatchingOption,\n labelProps,\n helpLabel,\n errorLabel,\n width,\n density,\n name,\n className,\n invalid,\n hasTagHover,\n}) => {\n const listId = useId(id || \"jkl-combobox\", { generateSuffix: !id });\n const labelId = `${listId}_label`;\n const buttonId = `${listId}_button`;\n const inputId = `${listId}_search-input`;\n\n const [selectedValue, setSelectedValue] = useState<\n Array<ComboboxValuePair>\n >(value || []);\n const [showMenu, setShowMenu] = useState<boolean>(false);\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [noResults, setNoResults] = useState(false);\n const [marked, setMarked] = useState<boolean>(false);\n\n const searchRef = useRef<HTMLInputElement>(null);\n const inputRef = useRef<HTMLDivElement>(null);\n const focusInsideRef = useRef(false);\n\n useEffect(() => {\n setSearchValue(\"\");\n if (showMenu && searchRef.current) {\n searchRef.current.focus();\n }\n }, [showMenu]);\n\n useEffect(() => {\n setSelectedValue((prev) => value || prev);\n }, [value]);\n\n // Funksjon for å stile valgt element\n const isSelected = (option: ValuePair) => {\n if (!selectedValue) {\n return false;\n }\n\n return selectedValue.some((value) => value.value === option.value);\n };\n\n // Fjerne ett eller flere valg\n const removeOption = useCallback(\n (option: string) => {\n return selectedValue.filter((value) => value.value !== option);\n },\n [selectedValue],\n );\n\n const onTagRemove = useCallback(\n (\n e:\n | React.MouseEvent<HTMLButtonElement, globalThis.MouseEvent>\n | React.KeyboardEvent<HTMLInputElement>,\n option: string,\n ) => {\n const newValue = removeOption(option);\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n e.stopPropagation();\n\n if (newValue.length === 0) {\n setMarked(false);\n }\n },\n [removeOption, onChange, name],\n );\n\n // Håndtere valgt verdi i listen\n const onItemClick = useCallback(\n (option: string) => {\n let newValue: Array<ValuePair>;\n\n if (selectedValue.some((value) => value.value === option)) {\n newValue = removeOption(option);\n } else {\n const item = items.find((i) => i.value === option);\n newValue = [...selectedValue, item as ValuePair];\n }\n searchRef.current?.focus();\n setSelectedValue(newValue);\n onChange({\n type: \"change\",\n target: { name, value: option, selectedOptions: newValue },\n });\n },\n [selectedValue, onChange, name, removeOption, items],\n );\n\n // Funksjon for søk\n const onSearch = (e: {\n target: { value: React.SetStateAction<string> };\n }) => {\n searchRef.current?.focus();\n setShowMenu(true);\n setSearchValue(e.target.value);\n };\n\n const options = useMemo(() => {\n if (!searchValue) {\n return items;\n }\n\n const filteredOptions = items.filter(\n (option) =>\n option.label.toLowerCase().indexOf(searchValue.toLowerCase()) >=\n 0,\n );\n\n setNoResults(filteredOptions.length === 0);\n\n return filteredOptions;\n }, [searchValue, items]);\n\n // Det første elementet i listen skal være aktivt fram til brukeren klikker på noe annet\n const [activeDescendant, setActiveDescendant] = useState<\n string | undefined\n >(options[0]?.value ? `${listId}-${options[0]?.value}` : undefined);\n\n // Håndtere arrow-state\n const isPointingDown = !showMenu;\n\n // Lukk meny med ESC\n useEffect(() => {\n const handleEscape = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\" && showMenu) {\n setShowMenu(false);\n }\n };\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEscape);\n }\n return () => {\n if (typeof window !== \"undefined\" && showMenu) {\n window.removeEventListener(\"keydown\", handleEscape);\n }\n };\n }, [showMenu]);\n\n // Fokushåndtering\n const handleFocusPlacement = useCallback((isOpen: boolean) => {\n if (isOpen) {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n } else {\n if (focusInsideRef.current && inputRef.current) {\n inputRef.current.focus();\n }\n }\n }, []);\n\n const handleFocus = useCallback(() => {\n if (!focusInsideRef.current) {\n if (onFocus) {\n onFocus({\n type: \"change\",\n target: {\n name,\n value: selectedValue?.[0].value || \"\",\n selectedOptions: selectedValue,\n },\n });\n }\n focusInsideRef.current = true;\n setShowMenu(true);\n }\n }, [onFocus, selectedValue, name]);\n\n const [dropdownRef] = useAnimatedHeight<HTMLDivElement>(showMenu, {\n onFirstVisible: handleFocusPlacement,\n onTransitionEnd: handleFocusPlacement,\n });\n\n useListNavigation({ ref: dropdownRef });\n\n const componentRootElementRef = useRef<HTMLDivElement>(null);\n\n const handleBlur = useCallback(\n (\n e: FocusEvent<\n HTMLDivElement | HTMLInputElement | HTMLButtonElement\n >,\n ) => {\n const componentRootElement = componentRootElementRef.current;\n const nextFocusIsInsideComponent = componentRootElement?.contains(\n e.relatedTarget as Node,\n );\n if (!nextFocusIsInsideComponent) {\n setSearchValue(\"\");\n\n if (onBlur) {\n onBlur({\n type: \"blur\",\n target: {\n name,\n value: selectedValue?.[0]?.value || \"\",\n selectedOptions: selectedValue,\n },\n });\n inputRef.current?.dispatchEvent(\n new Event(\"focusout\", { bubbles: true }),\n );\n }\n focusInsideRef.current = false;\n setShowMenu(false);\n }\n },\n [onBlur, name, selectedValue],\n );\n\n const handleMouseOver = useCallback((e: MouseEvent<HTMLButtonElement>) => {\n // Ved mouseOver på options flytter vi fokus til dem for å unngå \"dobbel fokus\"\n // der det ser ut som to forskjellige elementer er fokusert/hovered samtidig\n (e.target as HTMLButtonElement).focus({ preventScroll: true });\n }, []);\n\n // Tastaturnavigasjon\n const handleSearchOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n const listElement = dropdownRef.current;\n if (listElement) {\n listElement\n .querySelector<HTMLButtonElement>('[role=\"option\"]')\n ?.focus();\n }\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n setShowMenu(false);\n }\n\n if ((e.metaKey && e.key === \"a\") || (e.ctrlKey && e.key === \"a\")) {\n e.preventDefault();\n e.stopPropagation();\n const updatedSelectedValue = selectedValue.map((item) => ({\n ...item,\n isMarked: true,\n }));\n setMarked(true);\n setSelectedValue(updatedSelectedValue);\n } else if (e.key === \"Backspace\") {\n e.stopPropagation();\n setMarked(false);\n\n // Sjekk om selectedValue er markert\n const selectedValueIsMarked = selectedValue.some(\n (item) => item.isMarked,\n );\n\n if (selectedValueIsMarked) {\n const updatedSelectedValue = selectedValue.filter(\n (item) => !item.isMarked,\n );\n setSelectedValue(updatedSelectedValue);\n setSearchValue(\"\");\n } else if (selectedValue.length > 0 && searchValue === \"\") {\n // Hvis ingen items er markert, fjern siste valgte item\n onTagRemove(\n e,\n selectedValue[selectedValue.length - 1].value,\n );\n }\n }\n },\n [selectedValue, searchValue, dropdownRef, onTagRemove],\n );\n\n const handleOptionOnKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Tab\") {\n if (searchRef.current) {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.shiftKey) {\n searchRef.current.focus();\n } else {\n setShowMenu(false);\n searchRef.current.focus();\n }\n }\n } else if (e.key === \"ArrowUp\") {\n if (dropdownRef.current && searchRef.current) {\n // Can't be based on index since the first item might be filtered out\n const firstVisible = dropdownRef.current.querySelector(\n '[role=\"option\"]:not([hidden])',\n );\n if (\n e.currentTarget.id === firstVisible?.id &&\n searchRef.current\n ) {\n searchRef.current.focus();\n }\n }\n }\n },\n [dropdownRef],\n );\n\n const hasSelection = selectedValue.length >= 1;\n\n const renderSelectedOption = useCallback(\n (option: ComboboxValuePair) => (\n <Chip\n key={option.value}\n data-testid=\"jkl-chip\"\n aria-label={`Fjern ${option.tagLabel}`}\n className={`jkl-combobox__selected-option ${\n marked && \"jkl-combobox__selected-option--marked\"\n }`}\n variant=\"input\"\n onClick={(e) => {\n if (searchRef.current) {\n searchRef.current.focus();\n }\n onTagRemove(e, option.value);\n }}\n onBlur={handleBlur}\n >\n {option.tagLabel ? option.tagLabel : option.label}\n </Chip>\n ),\n [handleBlur, onTagRemove, marked],\n );\n\n return (\n <InputGroup\n label={label}\n id={inputId}\n ref={componentRootElementRef}\n data-testid=\"jkl-combobox\"\n className={clsx(\"jkl-combobox\", className, {\n \"jkl-combobox--invalid\": !!errorLabel || invalid,\n \"jkl-combobox--menu-open\": showMenu,\n \"jkl-combobox--menu-closed\": !showMenu && hasSelection,\n })}\n labelProps={{\n id: labelId,\n ...labelProps,\n }}\n helpLabel={helpLabel}\n errorLabel={errorLabel}\n density={density}\n render={(inputProps) => (\n <div\n className={clsx(\"jkl-combobox__wrapper\", {\n \"jkl-combobox__wrapper--active-value\": hasSelection,\n })}\n style={{ width }}\n tabIndex={-1}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n className=\"jkl-combobox__chips\"\n data-testid=\"jkl-combobox__chips\"\n >\n {selectedValue\n .map(getComboboxValuePair)\n .map((option) => {\n return hasTagHover ? (\n <Tooltip key={option.value}>\n <TooltipTrigger>\n {renderSelectedOption(option)}\n </TooltipTrigger>\n <TooltipContent>\n {option.label}\n </TooltipContent>\n </Tooltip>\n ) : (\n renderSelectedOption(option)\n );\n })}\n <input\n {...inputProps}\n className=\"jkl-combobox__search-input\"\n onChange={onSearch}\n data-testid=\"jkl-combobox__search-input\"\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleSearchOnKeyDown}\n value={searchValue}\n ref={searchRef}\n aria-controls={listId}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={showMenu}\n placeholder={\n selectedValue.length > 0 ? \"\" : placeholder\n }\n autoComplete=\"off\"\n />\n </div>\n\n <div\n className=\"jkl-combobox__menu\"\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"listbox\"\n ref={dropdownRef}\n id={listId}\n aria-labelledby={labelId}\n aria-multiselectable=\"true\"\n aria-activedescendant={activeDescendant}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={-1}\n >\n {options.map((option, i) => (\n <button\n key={`${listId}-${option.value}`}\n type=\"button\"\n id={`${listId}__${option.value}`}\n aria-selected={isSelected(option)}\n // biome-ignore lint/a11y/useSemanticElements: Dette er en reimplementering av en liste\n role=\"option\"\n value={option.value}\n onBlur={handleBlur}\n className={`jkl-combobox__option ${\n isSelected(option) &&\n \"jkl-combobox__option--selected\"\n }`}\n data-testid=\"jkl-combobox__option\"\n data-testautoid={`jkl-combobox__option-${i}`}\n onFocus={handleFocus}\n onKeyDown={handleOptionOnKeyDown}\n onClick={(e) => {\n setActiveDescendant(\n `${listId}__${option.value}`,\n ); // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/listbox_role#required_javascript_features\n e.stopPropagation();\n onItemClick(option.value);\n setSearchValue(\"\");\n }}\n onMouseOver={handleMouseOver}\n >\n {option.description ? (\n <span>\n {option.label}\n <span className=\"jkl-combobox__option-description\">\n {option.description}\n </span>\n </span>\n ) : (\n option.label\n )}\n {isSelected(option) ? (\n <span>\n <CheckIcon />{\" \"}\n </span>\n ) : null}\n </button>\n ))}\n {noResults && (\n <div className=\"jkl-combobox__no-option\">\n {noMatchingOption}\n </div>\n )}\n </div>\n <div className=\"jkl-combobox__actions\">\n <IconButton\n id={buttonId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"jkl-combobox__button\"\n data-testid=\"jkl-combobox__button\"\n aria-label=\"Åpne meny\"\n aria-expanded={showMenu}\n aria-controls={listId}\n onClick={() => setShowMenu((previous) => !previous)}\n onMouseDown={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <ArrowVerticalAnimated\n pointingDown={isPointingDown}\n />\n </IconButton>\n </div>\n </div>\n )}\n />\n );\n};\nCombobox.displayName = \"Combobox\";\n"],"names":["getComboboxValuePair","item","value","label","Combobox","id","placeholder","items","onChange","onFocus","onBlur","noMatchingOption","labelProps","helpLabel","errorLabel","width","density","name","className","invalid","hasTagHover","listId","useId","generateSuffix","labelId","buttonId","inputId","selectedValue","setSelectedValue","useState","showMenu","setShowMenu","searchValue","setSearchValue","noResults","setNoResults","marked","setMarked","searchRef","useRef","inputRef","focusInsideRef","useEffect","current","focus","prev","isSelected","option","some","removeOption","useCallback","filter","onTagRemove","e","newValue","type","target","selectedOptions","stopPropagation","length","onItemClick","find","i","onSearch","options","useMemo","filteredOptions","toLowerCase","indexOf","activeDescendant","setActiveDescendant","isPointingDown","handleEscape","key","window","addEventListener","removeEventListener","handleFocusPlacement","isOpen","handleFocus","dropdownRef","useAnimatedHeight","onFirstVisible","onTransitionEnd","useListNavigation","ref","componentRootElementRef","handleBlur","contains","relatedTarget","dispatchEvent","Event","bubbles","handleMouseOver","preventScroll","handleSearchOnKeyDown","preventDefault","listElement","querySelector","metaKey","ctrlKey","updatedSelectedValue","map","isMarked","handleOptionOnKeyDown","shiftKey","firstVisible","currentTarget","hasSelection","renderSelectedOption","jsx","Chip","tagLabel","variant","onClick","children","InputGroup","clsx","render","inputProps","jsxs","style","tabIndex","Tooltip","TooltipTrigger","TooltipContent","onKeyDown","role","autoComplete","onMouseOver","description","CheckIcon","IconButton","previous","onMouseDown","ArrowVerticalAnimated","pointingDown","displayName"],"mappings":"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"}
@@ -11,3 +11,4 @@ declare const meta: {
11
11
  export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
13
  export declare const Combobox: Story;
14
+ export declare const ComboboxNoTagLabel: Story;
@@ -1,2 +1,2 @@
1
- import{jsx as e}from"react/jsx-runtime";import{Combobox as a}from"../Combobox.js";import"react";const t={title:"Komponenter/Combobox",component:a,parameters:{layout:"centered"},tags:["autodocs"]},l={args:{items:[{value:"a080",label:"A080 - Rotavirusenteritt",tagLabel:"A080"},{value:"a081",label:"A081 - Akutt gastroenteritt som skyldes norovirus",tagLabel:"A081"},{value:"a082",label:"A082 - Adenovirusenteritt",tagLabel:"A082"},{value:"a083",label:"A083 - Annen virusenteritt",tagLabel:"A083"},{value:"a084",label:"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen",tagLabel:"A084"},{value:"a085",label:"A085 - Annen spesifisert mage-tarminfeksjon",tagLabel:"A085"},{value:"a090",label:"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak",tagLabel:"A090"},{value:"a099",label:"A099 - Gastroenteritt eller kolitt av uspesifisert årsak",tagLabel:"A099"},{value:"a150",label:"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur",tagLabel:"A150"}],label:"Velg sykdommer",name:"disease",onChange:()=>{}},decorators:a=>e("div",{style:{maxWidth:220},children:e(a,{})})};export{l as Combobox,t as default};
1
+ import{jsx as e}from"react/jsx-runtime";import{Combobox as a}from"../Combobox.js";/* empty css */import"react";const l={title:"Komponenter/Combobox",component:a,parameters:{layout:"centered"},tags:["autodocs"]},t={args:{items:[{value:"a080",label:"A080 - Rotavirusenteritt",tagLabel:"A080"},{value:"a081",label:"A081 - Akutt gastroenteritt som skyldes norovirus",tagLabel:"A081"},{value:"a082",label:"A082 - Adenovirusenteritt",tagLabel:"A082"},{value:"a083",label:"A083 - Annen virusenteritt",tagLabel:"A083"},{value:"a084",label:"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen",tagLabel:"A084"},{value:"a085",label:"A085 - Annen spesifisert mage-tarminfeksjon",tagLabel:"A085"},{value:"a090",label:"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak",tagLabel:"A090"},{value:"a099",label:"A099 - Gastroenteritt eller kolitt av uspesifisert årsak",tagLabel:"A099"},{value:"a150",label:"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur",tagLabel:"A150"}],label:"Velg sykdommer",name:"disease",onChange:()=>{}},decorators:a=>e("div",{children:e(a,{})})},r={name:"Combobox uten tag label",args:{items:[{label:"DNB",value:"dnb"},{label:"Sparebank 1",value:"sb1"},{label:"Eika",value:"eik"},{label:"Fremtind",value:"fre"}],label:"Filtrer",name:"filter",onChange:()=>{}},decorators:a=>e("div",{children:e(a,{})})};export{t as Combobox,r as ComboboxNoTagLabel,l as default};
2
2
  //# sourceMappingURL=Combobox.stories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.stories.js","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from \"@storybook/react\";\nimport { Combobox as ComboboxComponent } from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\nimport type { ComboboxValuePair } from \"../../combobox/types.js\";\n\nconst meta = {\n title: \"Komponenter/Combobox\",\n component: ComboboxComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof ComboboxComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst items: ComboboxValuePair[] = [\n { value: \"a080\", label: \"A080 - Rotavirusenteritt\", tagLabel: \"A080\" },\n {\n value: \"a081\",\n label: \"A081 - Akutt gastroenteritt som skyldes norovirus\",\n tagLabel: \"A081\",\n },\n { value: \"a082\", label: \"A082 - Adenovirusenteritt\", tagLabel: \"A082\" },\n {\n value: \"a083\",\n label: \"A083 - Annen virusenteritt\",\n tagLabel: \"A083\",\n },\n {\n value: \"a084\",\n label: \"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen\",\n tagLabel: \"A084\",\n },\n {\n value: \"a085\",\n label: \"A085 - Annen spesifisert mage-tarminfeksjon\",\n tagLabel: \"A085\",\n },\n {\n value: \"a090\",\n label: \"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak\",\n tagLabel: \"A090\",\n },\n {\n value: \"a099\",\n label: \"A099 - Gastroenteritt eller kolitt av uspesifisert årsak\",\n tagLabel: \"A099\",\n },\n {\n value: \"a150\",\n label: \"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur\",\n tagLabel: \"A150\",\n },\n];\n\nexport const Combobox: Story = {\n args: {\n items,\n label: \"Velg sykdommer\",\n name: \"disease\",\n onChange: () => {},\n },\n decorators: (Story) => (\n <div style={{ maxWidth: 220 }}>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","ComboboxComponent","parameters","layout","tags","Combobox","args","items","value","label","tagLabel","name","onChange","decorators","Story","jsx","style","maxWidth","children"],"mappings":"gGAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aA8CEC,EAAkB,CAC3BC,KAAM,CACFC,MA1C2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAOVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,GACTC,EAAC,MAAI,CAAAC,MAAO,CAAEC,SAAU,KACpBC,SAACH,EAAAD,EAAA,CAAM"}
1
+ {"version":3,"file":"Combobox.stories.js","sources":["../../../../../src/components/combobox/stories/Combobox.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from \"@storybook/react\";\nimport {Combobox as ComboboxComponent} from \"../Combobox.js\";\nimport \"../styles/_index.scss\";\nimport React from \"react\";\nimport type {ComboboxValuePair} from \"../../combobox/types.js\";\n\nconst meta = {\n title: \"Komponenter/Combobox\",\n component: ComboboxComponent,\n parameters: {\n layout: \"centered\",\n },\n tags: [\"autodocs\"],\n} satisfies Meta<typeof ComboboxComponent>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nconst items: ComboboxValuePair[] = [\n { value: \"a080\", label: \"A080 - Rotavirusenteritt\", tagLabel: \"A080\" },\n {\n value: \"a081\",\n label: \"A081 - Akutt gastroenteritt som skyldes norovirus\",\n tagLabel: \"A081\",\n },\n { value: \"a082\", label: \"A082 - Adenovirusenteritt\", tagLabel: \"A082\" },\n {\n value: \"a083\",\n label: \"A083 - Annen virusenteritt\",\n tagLabel: \"A083\",\n },\n {\n value: \"a084\",\n label: \"A084 - Uspesifisert virusinfeksjon i mage-tarmkanalen\",\n tagLabel: \"A084\",\n },\n {\n value: \"a085\",\n label: \"A085 - Annen spesifisert mage-tarminfeksjon\",\n tagLabel: \"A085\",\n },\n {\n value: \"a090\",\n label: \"A090 - Annen eller uspesifisert gastroenteritt eller kolitt av infeksiøs årsak\",\n tagLabel: \"A090\",\n },\n {\n value: \"a099\",\n label: \"A099 - Gastroenteritt eller kolitt av uspesifisert årsak\",\n tagLabel: \"A099\",\n },\n {\n value: \"a150\",\n label: \"A150 - Lungetuberkulose bekreftet ved mikroskopi av sputum med eller uten kultur\",\n tagLabel: \"A150\",\n },\n];\n\nconst itemsNoTagLabel: ComboboxValuePair[] = [\n {label: \"DNB\", value: \"dnb\"},\n {label: \"Sparebank 1\", value: \"sb1\"},\n {label: \"Eika\", value: \"eik\"},\n {label: \"Fremtind\", value: \"fre\"},\n];\n\nexport const Combobox: Story = {\n args: {\n items,\n label: \"Velg sykdommer\",\n name: \"disease\",\n onChange: () => {},\n },\n decorators: (Story) => (\n <div>\n <Story/>\n </div>\n ),\n};\n\nexport const ComboboxNoTagLabel: Story = {\n name: \"Combobox uten tag label\",\n args: {\n items: itemsNoTagLabel,\n label: \"Filtrer\",\n name: \"filter\",\n onChange: () => {\n },\n },\n decorators: (Story) => (\n <div>\n <Story />\n </div>\n ),\n};\n"],"names":["meta","title","component","ComboboxComponent","parameters","layout","tags","Combobox","args","items","value","label","tagLabel","name","onChange","decorators","Story","children","jsx","ComboboxNoTagLabel"],"mappings":"uIAMA,MAAMA,EAAO,CACTC,MAAO,uBACPC,UAAWC,EACXC,WAAY,CACRC,OAAQ,YAEZC,KAAM,CAAC,aAqDEC,EAAkB,CAC3BC,KAAM,CACFC,MAjD2B,CAC/B,CAAEC,MAAO,OAAQC,MAAO,2BAA4BC,SAAU,QAC9D,CACIF,MAAO,OACPC,MAAO,oDACPC,SAAU,QAEd,CAAEF,MAAO,OAAQC,MAAO,4BAA6BC,SAAU,QAC/D,CACIF,MAAO,OACPC,MAAO,6BACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,wDACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,8CACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,iFACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,2DACPC,SAAU,QAEd,CACIF,MAAO,OACPC,MAAO,mFACPC,SAAU,SAcVD,MAAO,iBACPE,KAAM,UACNC,SAAU,QAEdC,WAAaC,KACR,MACG,CAAAC,SAAAC,EAACF,SAKAG,EAA4B,CACrCN,KAAM,0BACNL,KAAM,CACFC,MAxBqC,CACzC,CAACE,MAAO,MAAOD,MAAO,OACtB,CAACC,MAAO,cAAeD,MAAO,OAC9B,CAACC,MAAO,OAAQD,MAAO,OACvB,CAACC,MAAO,WAAYD,MAAO,QAqBvBC,MAAO,UACPE,KAAM,SACNC,SAAU,QAGdC,WAAaC,KACR,MACG,CAAAC,SAAAC,EAACF"}
@@ -1,2 +1,2 @@
1
- import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as u}from"../modal/Modal.js";import{useModal as k}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{RequirementCheckbox as g}from"./RequirementCheckbox.js";import{convertBooleanConsentObjectToConsentObject as p,setConsentCookie as j}from"./cookieConsentUtils.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,cookiePath:x,requirement:O,isOpen:T,setIsOpen:D,updateCurrentConsents:I}=f(),[B,$]=k({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{T?null==B||B.show():null==B||B.hide()}),[B,T]),o((()=>{const e=()=>D(!1);return null==B||B.on("hide",e),()=>{null==B||B.off("hide",e)}}),[B,D]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const q=(e=p({functional:!0,statistics:!0,marketing:!0},O))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};j({consent:n,name:y,domain:M,path:x}),I(),null==b||b(n),null==B||B.hide()};return a.createPortal(e(s,{...$.container,...C,"data-cookie-consent-open":T,children:[t(r,{...$.overlay}),e(l,{component:"form",...$.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},O);q(n)},children:[t(d,{children:t(c,{...$.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),O.functional&&t(g,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),O.statistics&&t(g,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),O.marketing&&t(g,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(u,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>q(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useId as n,useEffect as o}from"react";import a from"react-dom";import{SecondaryButton as i}from"../button/Button.js";import{ModalContainer as s,ModalOverlay as r,Modal as l,ModalHeader as d,ModalTitle as c,ModalBody as m,ModalActions as k}from"../modal/Modal.js";import{useModal as u}from"../modal/useModal.js";import{useInternalState as f}from"./CookieConsentContext.js";import{RequirementCheckbox as g}from"./RequirementCheckbox.js";import{convertBooleanConsentObjectToConsentObject as p,setConsentCookie as j}from"./cookieConsentUtils.js";const h=({blocking:h,onAccept:b,...C})=>{const{currentConsent:v,cookieName:y,cookieDomain:M,cookiePath:x,requirement:O,isOpen:T,setIsOpen:D,updateCurrentConsents:I}=f(),[B,$]=u({id:`jkl-cookie-modal-${n()}`,role:h?"alertdialog":"dialog",title:"Informasjonskapsler"});if(o((()=>{T?B?.show():B?.hide()}),[B,T]),o((()=>{const e=()=>D(!1);return B?.on("hide",e),()=>{B?.off("hide",e)}}),[B,D]),typeof document>"u")return null;if(typeof navigator<"u"&&!navigator.cookieEnabled)return b&&b({functional:"denied",marketing:"denied",statistics:"denied"}),null;const q=(e=p({functional:!0,statistics:!0,marketing:!0},O))=>{const t=Object.fromEntries(Object.entries(e).filter((([,e])=>typeof e<"u"))),n={...v,...t};j({consent:n,name:y,domain:M,path:x}),I(),b?.(n),B?.hide()};return a.createPortal(e(s,{...$.container,...C,"data-cookie-consent-open":T,children:[t(r,{...$.overlay}),e(l,{component:"form",...$.modal,onSubmit:e=>{e.preventDefault();const t=new FormData(e.currentTarget),n=p({functional:"true"===t.get("functional"),statistics:"true"===t.get("statistics"),marketing:"true"===t.get("marketing")},O);q(n)},children:[t(d,{children:t(c,{...$.title,children:"Velg informasjonskapsler"})}),e(m,{children:[t("p",{children:"For at nettsidene skal fungere må vi bruke tekniske informasjonskaplser. Disse lagres derfor uten samtykke."}),O.functional&&t(g,{name:"functional",label:"Tillat funksjonelle",defaultChecked:"accepted"===v.functional,children:"Funksjonelle informasjonskapsler lagrer opplysninger om din bruk av nettsidene og hvilke innstillinger du har gjort, slik at du kan få funksjonalitet tilpasset deg."},`functional-${v.functional}`),O.statistics&&t(g,{name:"statistics",label:"Tillat statistikk",defaultChecked:"accepted"===v.statistics,children:"Informasjonskapslene lagrer statistikk som hjelper oss med å forstå hvordan nettsidene blir brukt, slik at vi kan gjøre dem bedre og enklere å bruke."},`statistics-${v.statistics}`),O.marketing&&t(g,{name:"marketing",label:"Tillat personlig markedsføring",defaultChecked:"accepted"===v.marketing,children:"Dette gjør at vi kan gi deg mer relevant og tilpasset markedsføring, også gjennom våre samarbeidspartnere, på for eksempel nettsider, annonser og i sosiale medier."},`marketing-${v.marketing}`)]}),e(k,{children:[t(i,{"data-testid":"jkl-cookie-consent-godta-alle",type:"button",onClick:()=>q(),children:"Godta alle"}),t(i,{"data-testid":"jkl-cookie-consent-godta",type:"submit",children:"Godta mine valg"})]})]})]}),document.body)};export{h as CookieConsent};
2
2
  //# sourceMappingURL=CookieConsent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { type FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport type { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACA,MAAAI,GAAAA,EAAUQ,OAEV,MAAAR,GAAAA,EAAUS,MAAA,GAEf,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAA,MAAAG,GAAAA,EAAAW,GAAG,OAAQD,GACd,KACO,MAAAV,GAAAA,EAAAY,IAAI,OAAQF,EAAAA,CAC1B,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,EAAI,CAAAC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtB,MAAAT,GAAAA,EAAWuC,GAEX,MAAA5B,GAAAA,EAAUS,MAAA,EAoBd,OAAOyB,EAASC,aACZC,EAACC,EAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAC,EAAA,IAAiBxC,EAAYyC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAChB,CACIL,WAA2C,SAA/BiC,EAASI,IAAI,cACzBnC,WAA2C,SAA/B+B,EAASI,IAAI,cACzBpC,UAAyC,SAA9BgC,EAASI,IAAI,cAE5B1D,GAGJwB,EAAOiC,EAAW,EAWVb,SAAA,CAAAC,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAetD,EAAYK,MAAOiC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAACiB,EAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,kBAS5C2C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KACb"}
1
+ {"version":3,"file":"CookieConsent.js","sources":["../../../../src/components/cookie-consent/CookieConsent.tsx"],"sourcesContent":["import React, { type FormEventHandler, useEffect, useId } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { SecondaryButton } from \"../button/Button.js\";\nimport {\n Modal,\n ModalActions,\n ModalBody,\n ModalContainer,\n ModalHeader,\n ModalOverlay,\n ModalTitle,\n} from \"../modal/Modal.js\";\nimport { useModal } from \"../modal/useModal.js\";\nimport { useInternalState } from \"./CookieConsentContext.js\";\nimport { RequirementCheckbox } from \"./RequirementCheckbox.js\";\nimport {\n convertBooleanConsentObjectToConsentObject,\n setConsentCookie,\n} from \"./cookieConsentUtils.js\";\nimport type { AcceptConsentCallback, Consent } from \"./types.js\";\n\nexport interface CookieConsentProps {\n blocking?: boolean;\n onAccept?: AcceptConsentCallback;\n}\n\nexport const CookieConsent = ({\n blocking,\n onAccept,\n ...rest\n}: CookieConsentProps): JSX.Element | null => {\n const {\n currentConsent,\n cookieName,\n cookieDomain,\n cookiePath,\n requirement,\n isOpen,\n setIsOpen,\n updateCurrentConsents,\n } = useInternalState();\n\n const [instance, modalConfig] = useModal({\n id: `jkl-cookie-modal-${useId()}`,\n // The optional `role` attribute of the dialog element, either `dialog`\n // (default) or `alertdialog` to make it a modal (preventing closing on\n // click outside of ESC key).\n role: blocking ? \"alertdialog\" : \"dialog\",\n // The required dialog title, mandatory in the document\n // to provide context to assistive technology.\n title: \"Informasjonskapsler\",\n });\n\n useEffect(() => {\n if (isOpen) {\n instance?.show();\n } else {\n instance?.hide();\n }\n }, [instance, isOpen]);\n\n useEffect(() => {\n const onHide = () => setIsOpen(false);\n instance?.on(\"hide\", onHide);\n return () => {\n instance?.off(\"hide\", onHide);\n };\n }, [instance, setIsOpen]);\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n // Cookies are disabled in the browser\n if (typeof navigator !== \"undefined\" && !navigator.cookieEnabled) {\n if (onAccept) {\n onAccept({\n functional: \"denied\",\n marketing: \"denied\",\n statistics: \"denied\",\n });\n }\n\n return null;\n }\n\n const accept = (\n selection = convertBooleanConsentObjectToConsentObject(\n {\n functional: true,\n statistics: true,\n marketing: true,\n },\n requirement,\n ),\n ) => {\n const selectionWithoutEmptyValues = Object.fromEntries(\n Object.entries(selection).filter(\n ([, value]) => typeof value !== \"undefined\",\n ),\n );\n\n const updatedConsent: Consent = {\n ...currentConsent,\n ...selectionWithoutEmptyValues,\n };\n\n setConsentCookie({\n consent: updatedConsent,\n name: cookieName,\n domain: cookieDomain,\n path: cookiePath,\n });\n\n updateCurrentConsents();\n\n onAccept?.(updatedConsent);\n\n instance?.hide();\n };\n\n const onSubmit: FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n const formData = new FormData(e.currentTarget);\n\n const newConsents = convertBooleanConsentObjectToConsentObject(\n {\n functional: formData.get(\"functional\") === \"true\",\n statistics: formData.get(\"statistics\") === \"true\",\n marketing: formData.get(\"marketing\") === \"true\",\n },\n requirement,\n );\n\n accept(newConsents);\n };\n\n return ReactDOM.createPortal(\n <ModalContainer\n {...modalConfig.container}\n {...rest}\n data-cookie-consent-open={isOpen}\n >\n <ModalOverlay {...modalConfig.overlay} />\n <Modal component=\"form\" {...modalConfig.modal} {...{ onSubmit }}>\n <ModalHeader>\n <ModalTitle {...modalConfig.title}>\n Velg informasjonskapsler\n </ModalTitle>\n </ModalHeader>\n <ModalBody>\n <p>\n For at nettsidene skal fungere må vi bruke tekniske\n informasjonskaplser. Disse lagres derfor uten samtykke.\n </p>\n {requirement.functional && (\n <RequirementCheckbox\n name=\"functional\"\n label=\"Tillat funksjonelle\"\n defaultChecked={\n currentConsent.functional === \"accepted\"\n }\n key={`functional-${currentConsent.functional}`}\n >\n Funksjonelle informasjonskapsler lagrer opplysninger\n om din bruk av nettsidene og hvilke innstillinger du\n har gjort, slik at du kan få funksjonalitet\n tilpasset deg.\n </RequirementCheckbox>\n )}\n {requirement.statistics && (\n <RequirementCheckbox\n name=\"statistics\"\n label=\"Tillat statistikk\"\n defaultChecked={\n currentConsent.statistics === \"accepted\"\n }\n key={`statistics-${currentConsent.statistics}`}\n >\n Informasjonskapslene lagrer statistikk som hjelper\n oss med å forstå hvordan nettsidene blir brukt, slik\n at vi kan gjøre dem bedre og enklere å bruke.\n </RequirementCheckbox>\n )}\n {requirement.marketing && (\n <RequirementCheckbox\n name=\"marketing\"\n label=\"Tillat personlig markedsføring\"\n defaultChecked={\n currentConsent.marketing === \"accepted\"\n }\n key={`marketing-${currentConsent.marketing}`}\n >\n Dette gjør at vi kan gi deg mer relevant og\n tilpasset markedsføring, også gjennom våre\n samarbeidspartnere, på for eksempel nettsider,\n annonser og i sosiale medier.\n </RequirementCheckbox>\n )}\n </ModalBody>\n <ModalActions>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta-alle\"\n type=\"button\"\n onClick={() => accept()}\n >\n Godta alle\n </SecondaryButton>\n <SecondaryButton\n data-testid=\"jkl-cookie-consent-godta\"\n type=\"submit\"\n >\n Godta mine valg\n </SecondaryButton>\n </ModalActions>\n </Modal>\n </ModalContainer>,\n document.body,\n );\n};\n"],"names":["CookieConsent","blocking","onAccept","rest","currentConsent","cookieName","cookieDomain","cookiePath","requirement","isOpen","setIsOpen","updateCurrentConsents","useInternalState","instance","modalConfig","useModal","id","useId","role","title","useEffect","show","hide","onHide","on","off","document","navigator","cookieEnabled","functional","marketing","statistics","accept","selection","convertBooleanConsentObjectToConsentObject","selectionWithoutEmptyValues","Object","fromEntries","entries","filter","value","updatedConsent","setConsentCookie","consent","name","domain","path","ReactDOM","createPortal","jsxs","ModalContainer","container","children","jsx","ModalOverlay","overlay","Modal","component","modal","onSubmit","e","preventDefault","formData","FormData","currentTarget","newConsents","get","ModalHeader","ModalTitle","ModalBody","RequirementCheckbox","label","defaultChecked","ModalActions","SecondaryButton","type","onClick","body"],"mappings":"ulBA0BO,MAAMA,EAAgB,EACzBC,SAAAA,EACAC,SAAAA,KACGC,MAEG,MACFC,eAAAA,EACAC,WAAAA,EACAC,aAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAC,UAAAA,EACAC,sBAAAA,GACAC,KAEGC,EAAUC,GAAeC,EAAS,CACrCC,GAAI,oBAAoBC,MAIxBC,KAAMjB,EAAW,cAAgB,SAGjCkB,MAAO,wBAmBP,GAhBJC,GAAU,KACFX,EACAI,GAAUQ,OAEVR,GAAUS,MAAK,GAEpB,CAACT,EAAUJ,IAEdW,GAAU,KACAG,MAAAA,EAAS,IAAMb,GAAU,GACrB,OAAAG,GAAAW,GAAG,OAAQD,GACd,KACOV,GAAAY,IAAI,OAAQF,EAAM,CAChC,GACD,CAACV,EAAUH,WAEHgB,SAAa,IACb,OAAA,KAIX,UAAWC,UAAc,MAAgBA,UAAUC,cAC/C,OAAI1B,GACSA,EAAA,CACL2B,WAAY,SACZC,UAAW,SACXC,WAAY,WAIb,KAGLC,MAAAA,EAAS,CACXC,EAAYC,EACR,CACIL,YAAY,EACZE,YAAY,EACZD,WAAW,GAEftB,MAGJ,MAAM2B,EAA8BC,OAAOC,YACvCD,OAAOE,QAAQL,GAAWM,QACtB,EAAI,CAAAC,YAAkBA,EAAU,OAIlCC,EAA0B,IACzBrC,KACA+B,GAGUO,EAAA,CACbC,QAASF,EACTG,KAAMvC,EACNwC,OAAQvC,EACRwC,KAAMvC,IAGYI,IAEtBT,IAAWuC,GAEX5B,GAAUS,MAAK,EAoBnB,OAAOyB,EAASC,aACZC,EAACC,EAAA,IACOpC,EAAYqC,aACZhD,EACJ,2BAA0BM,EAE1B2C,SAAA,CAACC,EAAAC,EAAA,IAAiBxC,EAAYyC,UAC9BN,EAACO,EAAM,CAAAC,UAAU,UAAW3C,EAAY4C,MAAaC,SAxBRC,IACjDA,EAAEC,iBAEF,MAAMC,EAAW,IAAIC,SAASH,EAAEI,eAE1BC,EAAc/B,EAChB,CACIL,WAA2C,SAA/BiC,EAASI,IAAI,cACzBnC,WAA2C,SAA/B+B,EAASI,IAAI,cACzBpC,UAAyC,SAA9BgC,EAASI,IAAI,cAE5B1D,GAGJwB,EAAOiC,EAAW,EAWVb,SAAA,CAAAC,EAACc,GACGf,SAACC,EAAAe,EAAA,IAAetD,EAAYK,MAAOiC,0CAItCiB,EACG,CAAAjB,SAAA,CAAAC,EAAC,KAAED,SAGH,gHACC5C,EAAYqB,YACTwB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,sBACNC,eACkC,aAA9BpE,EAAeyB,WAGtBuB,SAAA,wKADQ,cAAchD,EAAeyB,cAQzCrB,EAAYuB,YACTsB,EAACiB,EAAA,CACG1B,KAAK,aACL2B,MAAM,oBACNC,eACkC,aAA9BpE,EAAe2B,WAGtBqB,SAAA,yJADQ,cAAchD,EAAe2B,cAOzCvB,EAAYsB,WACTuB,EAACiB,EAAA,CACG1B,KAAK,YACL2B,MAAM,iCACNC,eACiC,aAA7BpE,EAAe0B,UAGtBsB,SAAA,uKADQ,aAAahD,EAAe0B,kBAS5C2C,EACG,CAAArB,SAAA,CAAAC,EAACqB,EAAA,CACG,cAAY,gCACZC,KAAK,SACLC,QAAS,IAAM5C,IAClBoB,SAAA,eAGDC,EAACqB,EAAA,CACG,cAAY,2BACZC,KAAK,SACRvB,SAAA,6BAMb1B,SAASmD,KACb"}
@@ -1,2 +1,2 @@
1
- import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as a}from"../../../clsx-BeLtu-UY.js";import{startOfDay as r}from"date-fns";import{forwardRef as o,useState as n,useRef as l,useCallback as s}from"react";import{flushSync as i}from"react-dom";import{IconButton as u}from"../icon-button/IconButton.js";import{CalendarIcon as d}from"../icon/icons/CalendarIcon.js";import{InputGroup as c}from"../input-group/InputGroup.js";import{Popover as p}from"../popover/Popover.js";import{BaseTextInput as m}from"../text-input/BaseTextInput.js";import{Calendar as f}from"./internal/Calendar.js";import{getInitialDate as v}from"./internal/utils.js";import{parseDateString as h,formatInput as b}from"./utils.js";import{isWithinLowerBound as k,isWithinUpperBound as D}from"./validation.js";const g=o(((o,g)=>{const{"data-testautoid":y,id:j,className:L="",label:w="Velg dato",labelProps:C,defaultValue:I,defaultShow:x=!1,value:P,disableBeforeDate:B,disableAfterDate:_,yearsToShow:E,name:O,helpLabel:T,errorLabel:N,invalid:S,density:R,days:U,months:V,monthLabel:F,yearLabel:K,placeholder:W="dd.mm.åååå",width:A="11.25rem",onChange:G,onBlur:q,onFocus:H,onKeyDown:M,action:z,showCalendarLabel:J="Åpne kalender",hideCalendarLabel:Q="Lukk kalender",supportLabelProps:X,tooltip:Y,textInputProps:Z,...$}=o;"production"!==process.env.NODE_ENV&&P&&I&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const ee=h(B),te=ee?r(ee):void 0,ae=h(_),re=ae?r(ae):void 0,[oe,ne]=n(v(P,I,te,re)),[le,se]=n(null),[ie,ue]=n(x),de=l(null),ce=l(null),pe=l(null),me=l(null),fe=s((e=>{me.current=e,g&&("function"==typeof g?g(e):g.current=e)}),[g]),ve=s((e=>{H&&ce.current&&(ce.current.contains(e.relatedTarget)||H(e,oe,{error:le,value:e.target.value}))}),[H,oe,le]),he=s((e=>{q&&q(e,oe,{error:le,value:e.target.value})}),[q,oe,le]),be=s((e=>{"Escape"===e.key&&(ue(!1),e.preventDefault(),e.stopPropagation()),null!=z&&z.onKeyDown&&z.onKeyDown(e)}),[z]),ke=s((e=>{let t=null,a=null;if(e.target.value){const r=h(e.target.value);r?te&&!k(r,te)?a="OUTSIDE_LOWER_BOUND":re&&!D(r,re)?a="OUTSIDE_UPPER_BOUND":ue(!1):a="WRONG_FORMAT",t=r||null}se(a),ne(t),G&&G(e,t,{error:a,value:e.target.value})}),[G,te,re]),De=s((e=>{i((()=>{ue(!ie)}));const t=de.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>null==a?void 0:a.focus())),null!=z&&z.onClick&&z.onClick(e)}),[ie,z]),ge=s((({date:e})=>{if(ue(!1),ne(e),me.current){const t=me.current;t.value=b(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),G&&G(a,e,{error:null,value:t.value})}}),[G]),ye=s((e=>{var t;e.preventDefault(),ue(!1),null==(t=pe.current)||t.focus()}),[]);return e(c,{id:j,className:a("jkl-datepicker",L),...$,ref:ce,label:w,labelProps:C,density:R,helpLabel:T,errorLabel:N,supportLabelProps:X,tooltip:Y,render:a=>e(m,{"data-focused":ie?"true":void 0,ref:fe,"data-testid":"jkl-datepicker__input","data-testautoid":y,className:"jkl-datepicker__input",name:O,defaultValue:I,density:R,value:P,type:"text",placeholder:W,width:A,onFocus:ve,onBlur:he,onChange:ke,actionButton:t(p,{positionReference:me,open:ie,onOpenChange:()=>ue(!ie),offset:8,children:[e(p.Trigger,{...z,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:ie?Q:J,tabIndex:0,onClick:De,onKeyDown:be,asChild:!0,children:e(u,{children:e(d,{})})}),e(p.Content,{initialFocus:-1,padding:24,children:e(f,{ref:de,density:R,date:oe,minDate:te,maxDate:re,days:U,months:V,monthLabel:F,yearLabel:K,yearsToShow:E,onDateSelected:ge,onTabOutside:ye})})]}),...Z,...a,"aria-invalid":S||!!N})})}));g.displayName="DatePicker";export{g as DatePicker};
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{c as a}from"../../../clsx-BeLtu-UY.js";import{startOfDay as r}from"date-fns";import{forwardRef as o,useState as n,useRef as l,useCallback as s}from"react";import{flushSync as i}from"react-dom";import{IconButton as u}from"../icon-button/IconButton.js";import{CalendarIcon as d}from"../icon/icons/CalendarIcon.js";import{InputGroup as c}from"../input-group/InputGroup.js";import{Popover as p}from"../popover/Popover.js";import{BaseTextInput as m}from"../text-input/BaseTextInput.js";import{Calendar as f}from"./internal/Calendar.js";import{getInitialDate as v}from"./internal/utils.js";import{parseDateString as h,formatInput as b}from"./utils.js";import{isWithinLowerBound as k,isWithinUpperBound as D}from"./validation.js";const g=o(((o,g)=>{const{"data-testautoid":y,id:j,className:L="",label:w="Velg dato",labelProps:C,defaultValue:I,defaultShow:x=!1,value:P,disableBeforeDate:B,disableAfterDate:_,yearsToShow:E,name:O,helpLabel:T,errorLabel:N,invalid:S,density:R,days:U,months:V,monthLabel:F,yearLabel:K,placeholder:W="dd.mm.åååå",width:A="11.25rem",onChange:G,onBlur:q,onFocus:H,onKeyDown:M,action:z,showCalendarLabel:J="Åpne kalender",hideCalendarLabel:Q="Lukk kalender",supportLabelProps:X,tooltip:Y,textInputProps:Z,...$}=o;"production"!==process.env.NODE_ENV&&P&&I&&console.warn("DatePicker må enten være controlled eller uncontrolled. Hvis du bruker defaultValue og value sammen vil defaultValue bli ignorert.");const ee=h(B),te=ee?r(ee):void 0,ae=h(_),re=ae?r(ae):void 0,[oe,ne]=n(v(P,I,te,re)),[le,se]=n(null),[ie,ue]=n(x),de=l(null),ce=l(null),pe=l(null),me=l(null),fe=s((e=>{me.current=e,g&&("function"==typeof g?g(e):g.current=e)}),[g]),ve=s((e=>{H&&ce.current&&(ce.current.contains(e.relatedTarget)||H(e,oe,{error:le,value:e.target.value}))}),[H,oe,le]),he=s((e=>{q&&q(e,oe,{error:le,value:e.target.value})}),[q,oe,le]),be=s((e=>{"Escape"===e.key&&(ue(!1),e.preventDefault(),e.stopPropagation()),z?.onKeyDown&&z.onKeyDown(e)}),[z]),ke=s((e=>{let t=null,a=null;if(e.target.value){const r=h(e.target.value);r?te&&!k(r,te)?a="OUTSIDE_LOWER_BOUND":re&&!D(r,re)?a="OUTSIDE_UPPER_BOUND":ue(!1):a="WRONG_FORMAT",t=r||null}se(a),ne(t),G&&G(e,t,{error:a,value:e.target.value})}),[G,te,re]),De=s((e=>{i((()=>{ue(!ie)}));const t=de.current,a=t&&t.querySelector('[aria-pressed="true"]');window.requestAnimationFrame((()=>a?.focus())),z?.onClick&&z.onClick(e)}),[ie,z]),ge=s((({date:e})=>{if(ue(!1),ne(e),me.current){const t=me.current;t.value=b(e);const a=document.createEvent("HTMLEvents");a.initEvent("input",!0,!1),t.dispatchEvent(a),t.focus(),G&&G(a,e,{error:null,value:t.value})}}),[G]),ye=s((e=>{e.preventDefault(),ue(!1),pe.current?.focus()}),[]);return e(c,{id:j,className:a("jkl-datepicker",L),...$,ref:ce,label:w,labelProps:C,density:R,helpLabel:T,errorLabel:N,supportLabelProps:X,tooltip:Y,render:a=>e(m,{"data-focused":ie?"true":void 0,ref:fe,"data-testid":"jkl-datepicker__input","data-testautoid":y,className:"jkl-datepicker__input",name:O,defaultValue:I,density:R,value:P,type:"text",placeholder:W,width:A,onFocus:ve,onBlur:he,onChange:ke,actionButton:t(p,{positionReference:me,open:ie,onOpenChange:()=>ue(!ie),offset:8,children:[e(p.Trigger,{...z,"data-testid":"jkl-datepicker__trigger",className:"jkl-text-input-action-button",title:ie?Q:J,tabIndex:0,onClick:De,onKeyDown:be,asChild:!0,children:e(u,{children:e(d,{})})}),e(p.Content,{initialFocus:-1,padding:24,children:e(f,{ref:de,density:R,date:oe,minDate:te,maxDate:re,days:U,months:V,monthLabel:F,yearLabel:K,yearsToShow:E,onDateSelected:ge,onTabOutside:ye})})]}),...Z,...a,"aria-invalid":S||!!N})})}));g.displayName="DatePicker";export{g as DatePicker};
2
2
  //# sourceMappingURL=DatePicker.js.map