@navikt/ds-react 6.1.1 → 6.3.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 (438) hide show
  1. package/cjs/accordion/Accordion.d.ts +4 -4
  2. package/cjs/alert/Alert.d.ts +12 -10
  3. package/cjs/alert/Alert.js.map +1 -1
  4. package/cjs/button/Button.d.ts +9 -8
  5. package/cjs/button/Button.js.map +1 -1
  6. package/cjs/chat/Chat.d.ts +6 -6
  7. package/cjs/chips/Chips.d.ts +2 -2
  8. package/cjs/copybutton/CopyButton.d.ts +14 -12
  9. package/cjs/copybutton/CopyButton.js.map +1 -1
  10. package/cjs/date/datepicker/types.d.ts +7 -6
  11. package/cjs/date/hooks/useDatepicker.d.ts +4 -3
  12. package/cjs/date/hooks/useDatepicker.js.map +1 -1
  13. package/cjs/date/hooks/useMonthPicker.d.ts +4 -3
  14. package/cjs/date/hooks/useMonthPicker.js.map +1 -1
  15. package/cjs/date/monthpicker/types.d.ts +2 -1
  16. package/cjs/date/parts/DateInput.d.ts +1 -1
  17. package/cjs/expansion-card/ExpansionCardTitle.d.ts +1 -1
  18. package/cjs/form/checkbox/CheckboxGroup.d.ts +3 -3
  19. package/cjs/form/checkbox/types.d.ts +4 -4
  20. package/cjs/form/combobox/ComboboxProvider.js +5 -1
  21. package/cjs/form/combobox/ComboboxProvider.js.map +1 -1
  22. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
  23. package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  24. package/cjs/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
  25. package/cjs/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
  26. package/cjs/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
  27. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
  28. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
  29. package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  30. package/cjs/form/combobox/Input/Input.js +9 -7
  31. package/cjs/form/combobox/Input/Input.js.map +1 -1
  32. package/cjs/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
  33. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
  34. package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  35. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
  36. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
  37. package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  38. package/cjs/form/combobox/combobox-utils.d.ts +10 -0
  39. package/cjs/form/combobox/combobox-utils.js +27 -0
  40. package/cjs/form/combobox/combobox-utils.js.map +1 -0
  41. package/cjs/form/combobox/customOptionsContext.d.ts +5 -4
  42. package/cjs/form/combobox/customOptionsContext.js +1 -1
  43. package/cjs/form/combobox/customOptionsContext.js.map +1 -1
  44. package/cjs/form/combobox/types.d.ts +33 -22
  45. package/cjs/form/error-summary/ErrorSummary.d.ts +5 -5
  46. package/cjs/form/file-upload/FileUpload.context.d.ts +8 -0
  47. package/cjs/form/file-upload/FileUpload.context.js +7 -0
  48. package/cjs/form/file-upload/FileUpload.context.js.map +1 -0
  49. package/cjs/form/file-upload/FileUpload.d.ts +118 -0
  50. package/cjs/form/file-upload/FileUpload.js +73 -0
  51. package/cjs/form/file-upload/FileUpload.js.map +1 -0
  52. package/cjs/form/file-upload/FileUpload.types.d.ts +55 -0
  53. package/cjs/form/file-upload/FileUpload.types.js +8 -0
  54. package/cjs/form/file-upload/FileUpload.types.js.map +1 -0
  55. package/cjs/form/file-upload/i18n/get.d.ts +2 -0
  56. package/cjs/form/file-upload/i18n/get.js +38 -0
  57. package/cjs/form/file-upload/i18n/get.js.map +1 -0
  58. package/cjs/form/file-upload/i18n/i18n.context.d.ts +11 -0
  59. package/cjs/form/file-upload/i18n/i18n.context.js +39 -0
  60. package/cjs/form/file-upload/i18n/i18n.context.js.map +1 -0
  61. package/cjs/form/file-upload/i18n/i18n.types.d.ts +13 -0
  62. package/cjs/form/file-upload/i18n/i18n.types.js +3 -0
  63. package/cjs/form/file-upload/i18n/i18n.types.js.map +1 -0
  64. package/cjs/form/file-upload/i18n/locales/nb.json +20 -0
  65. package/cjs/form/file-upload/i18n/merge.d.ts +2 -0
  66. package/cjs/form/file-upload/i18n/merge.js +29 -0
  67. package/cjs/form/file-upload/i18n/merge.js.map +1 -0
  68. package/cjs/form/file-upload/index.d.ts +7 -0
  69. package/cjs/form/file-upload/index.js +16 -0
  70. package/cjs/form/file-upload/index.js.map +1 -0
  71. package/cjs/form/file-upload/parts/Trigger.d.ts +7 -0
  72. package/cjs/form/file-upload/parts/Trigger.js +43 -0
  73. package/cjs/form/file-upload/parts/Trigger.js.map +1 -0
  74. package/cjs/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
  75. package/cjs/form/file-upload/parts/dropzone/Dropzone.js +106 -0
  76. package/cjs/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
  77. package/cjs/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
  78. package/cjs/form/file-upload/parts/dropzone/dropzone.types.js +3 -0
  79. package/cjs/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
  80. package/cjs/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
  81. package/cjs/form/file-upload/parts/dropzone/useDropzone.js +34 -0
  82. package/cjs/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
  83. package/cjs/form/file-upload/parts/item/Item.d.ts +55 -0
  84. package/cjs/form/file-upload/parts/item/Item.js +79 -0
  85. package/cjs/form/file-upload/parts/item/Item.js.map +1 -0
  86. package/cjs/form/file-upload/parts/item/Item.types.d.ts +5 -0
  87. package/cjs/form/file-upload/parts/item/Item.types.js +3 -0
  88. package/cjs/form/file-upload/parts/item/Item.types.js.map +1 -0
  89. package/cjs/form/file-upload/parts/item/ItemButton.d.ts +12 -0
  90. package/cjs/form/file-upload/parts/item/ItemButton.js +22 -0
  91. package/cjs/form/file-upload/parts/item/ItemButton.js.map +1 -0
  92. package/cjs/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
  93. package/cjs/form/file-upload/parts/item/ItemIcon.js +51 -0
  94. package/cjs/form/file-upload/parts/item/ItemIcon.js.map +1 -0
  95. package/cjs/form/file-upload/parts/item/ItemName.d.ts +9 -0
  96. package/cjs/form/file-upload/parts/item/ItemName.js +32 -0
  97. package/cjs/form/file-upload/parts/item/ItemName.js.map +1 -0
  98. package/cjs/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
  99. package/cjs/form/file-upload/parts/item/utils/download-file.js +13 -0
  100. package/cjs/form/file-upload/parts/item/utils/download-file.js.map +1 -0
  101. package/cjs/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
  102. package/cjs/form/file-upload/parts/item/utils/file-type-checker.js +6 -0
  103. package/cjs/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
  104. package/cjs/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
  105. package/cjs/form/file-upload/parts/item/utils/format-file-size.js +24 -0
  106. package/cjs/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
  107. package/cjs/form/file-upload/useFileUpload.d.ts +12 -0
  108. package/cjs/form/file-upload/useFileUpload.js +33 -0
  109. package/cjs/form/file-upload/useFileUpload.js.map +1 -0
  110. package/cjs/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
  111. package/cjs/form/file-upload/utils/is-accepted-file-type.js +26 -0
  112. package/cjs/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
  113. package/cjs/form/file-upload/utils/is-accepted-size.d.ts +1 -0
  114. package/cjs/form/file-upload/utils/is-accepted-size.js +11 -0
  115. package/cjs/form/file-upload/utils/is-accepted-size.js.map +1 -0
  116. package/cjs/form/file-upload/utils/validate-files.d.ts +8 -0
  117. package/cjs/form/file-upload/utils/validate-files.js +48 -0
  118. package/cjs/form/file-upload/utils/validate-files.js.map +1 -0
  119. package/cjs/form/radio/RadioGroup.d.ts +1 -1
  120. package/cjs/form/search/Search.d.ts +3 -2
  121. package/cjs/form/search/Search.js.map +1 -1
  122. package/cjs/form/select/Select.d.ts +9 -9
  123. package/cjs/form/switch/Switch.d.ts +5 -5
  124. package/cjs/form/textarea/Textarea.d.ts +5 -4
  125. package/cjs/form/textarea/Textarea.js.map +1 -1
  126. package/cjs/form/useFormField.d.ts +10 -8
  127. package/cjs/form/useFormField.js.map +1 -1
  128. package/cjs/index.d.ts +1 -0
  129. package/cjs/index.js +3 -1
  130. package/cjs/index.js.map +1 -1
  131. package/cjs/layout/bleed/Bleed.d.ts +9 -1
  132. package/cjs/layout/bleed/Bleed.js.map +1 -1
  133. package/cjs/layout/box/Box.d.ts +5 -5
  134. package/cjs/layout/grid/HGrid.d.ts +1 -3
  135. package/cjs/layout/grid/HGrid.js.map +1 -1
  136. package/cjs/layout/page/Page.d.ts +2 -2
  137. package/cjs/layout/responsive/Responsive.d.ts +2 -4
  138. package/cjs/layout/responsive/Responsive.js.map +1 -1
  139. package/cjs/layout/stack/Stack.d.ts +18 -4
  140. package/cjs/layout/stack/Stack.js.map +1 -1
  141. package/cjs/list/types.d.ts +1 -1
  142. package/cjs/loader/Loader.d.ts +0 -6
  143. package/cjs/loader/Loader.js.map +1 -1
  144. package/cjs/modal/Modal.js +2 -2
  145. package/cjs/modal/types.d.ts +8 -8
  146. package/cjs/pagination/Pagination.d.ts +3 -2
  147. package/cjs/pagination/Pagination.js.map +1 -1
  148. package/cjs/pagination/PaginationItem.d.ts +1 -1
  149. package/cjs/popover/Popover.d.ts +2 -1
  150. package/cjs/popover/Popover.js.map +1 -1
  151. package/cjs/read-more/ReadMore.d.ts +7 -7
  152. package/cjs/stepper/Step.d.ts +4 -4
  153. package/cjs/stepper/Stepper.d.ts +7 -5
  154. package/cjs/stepper/Stepper.js.map +1 -1
  155. package/cjs/table/AnimateHeight.d.ts +1 -1
  156. package/cjs/table/DataCell.d.ts +1 -3
  157. package/cjs/table/DataCell.js.map +1 -1
  158. package/cjs/tabs/TabList.d.ts +1 -1
  159. package/cjs/tabs/Tabs.d.ts +7 -7
  160. package/cjs/timeline/Timeline.d.ts +6 -3
  161. package/cjs/timeline/Timeline.js +2 -1
  162. package/cjs/timeline/Timeline.js.map +1 -1
  163. package/cjs/timeline/period/index.d.ts +3 -2
  164. package/cjs/timeline/period/index.js.map +1 -1
  165. package/cjs/tooltip/Tooltip.d.ts +19 -12
  166. package/cjs/tooltip/Tooltip.js.map +1 -1
  167. package/cjs/util/create-context.d.ts +1 -0
  168. package/cjs/util/create-context.js.map +1 -1
  169. package/cjs/util/hooks/useEventListener.d.ts +1 -1
  170. package/cjs/util/hooks/useMergeRefs.d.ts +1 -1
  171. package/esm/accordion/Accordion.d.ts +4 -4
  172. package/esm/alert/Alert.d.ts +12 -10
  173. package/esm/alert/Alert.js.map +1 -1
  174. package/esm/button/Button.d.ts +9 -8
  175. package/esm/button/Button.js.map +1 -1
  176. package/esm/chat/Chat.d.ts +6 -6
  177. package/esm/chips/Chips.d.ts +2 -2
  178. package/esm/copybutton/CopyButton.d.ts +14 -12
  179. package/esm/copybutton/CopyButton.js.map +1 -1
  180. package/esm/date/datepicker/types.d.ts +7 -6
  181. package/esm/date/hooks/useDatepicker.d.ts +4 -3
  182. package/esm/date/hooks/useDatepicker.js.map +1 -1
  183. package/esm/date/hooks/useMonthPicker.d.ts +4 -3
  184. package/esm/date/hooks/useMonthPicker.js.map +1 -1
  185. package/esm/date/monthpicker/types.d.ts +2 -1
  186. package/esm/date/parts/DateInput.d.ts +1 -1
  187. package/esm/expansion-card/ExpansionCardTitle.d.ts +1 -1
  188. package/esm/form/checkbox/CheckboxGroup.d.ts +3 -3
  189. package/esm/form/checkbox/types.d.ts +4 -4
  190. package/esm/form/combobox/ComboboxProvider.js +5 -1
  191. package/esm/form/combobox/ComboboxProvider.js.map +1 -1
  192. package/esm/form/combobox/FilteredOptions/FilteredOptions.js +14 -12
  193. package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
  194. package/esm/form/combobox/FilteredOptions/filtered-options-util.d.ts +3 -3
  195. package/esm/form/combobox/FilteredOptions/filtered-options-util.js +1 -3
  196. package/esm/form/combobox/FilteredOptions/filtered-options-util.js.map +1 -1
  197. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.d.ts +8 -5
  198. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +8 -13
  199. package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
  200. package/esm/form/combobox/Input/Input.js +9 -7
  201. package/esm/form/combobox/Input/Input.js.map +1 -1
  202. package/esm/form/combobox/SelectedOptions/SelectedOptions.d.ts +2 -1
  203. package/esm/form/combobox/SelectedOptions/SelectedOptions.js +3 -3
  204. package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
  205. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +10 -7
  206. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +6 -8
  207. package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
  208. package/esm/form/combobox/combobox-utils.d.ts +10 -0
  209. package/esm/form/combobox/combobox-utils.js +22 -0
  210. package/esm/form/combobox/combobox-utils.js.map +1 -0
  211. package/esm/form/combobox/customOptionsContext.d.ts +5 -4
  212. package/esm/form/combobox/customOptionsContext.js +1 -1
  213. package/esm/form/combobox/customOptionsContext.js.map +1 -1
  214. package/esm/form/combobox/types.d.ts +33 -22
  215. package/esm/form/error-summary/ErrorSummary.d.ts +5 -5
  216. package/esm/form/file-upload/FileUpload.context.d.ts +8 -0
  217. package/esm/form/file-upload/FileUpload.context.js +3 -0
  218. package/esm/form/file-upload/FileUpload.context.js.map +1 -0
  219. package/esm/form/file-upload/FileUpload.d.ts +118 -0
  220. package/esm/form/file-upload/FileUpload.js +44 -0
  221. package/esm/form/file-upload/FileUpload.js.map +1 -0
  222. package/esm/form/file-upload/FileUpload.types.d.ts +55 -0
  223. package/esm/form/file-upload/FileUpload.types.js +5 -0
  224. package/esm/form/file-upload/FileUpload.types.js.map +1 -0
  225. package/esm/form/file-upload/i18n/get.d.ts +2 -0
  226. package/esm/form/file-upload/i18n/get.js +34 -0
  227. package/esm/form/file-upload/i18n/get.js.map +1 -0
  228. package/esm/form/file-upload/i18n/i18n.context.d.ts +11 -0
  229. package/esm/form/file-upload/i18n/i18n.context.js +32 -0
  230. package/esm/form/file-upload/i18n/i18n.context.js.map +1 -0
  231. package/esm/form/file-upload/i18n/i18n.types.d.ts +13 -0
  232. package/esm/form/file-upload/i18n/i18n.types.js +2 -0
  233. package/esm/form/file-upload/i18n/i18n.types.js.map +1 -0
  234. package/esm/form/file-upload/i18n/locales/nb.json +20 -0
  235. package/esm/form/file-upload/i18n/merge.d.ts +2 -0
  236. package/esm/form/file-upload/i18n/merge.js +25 -0
  237. package/esm/form/file-upload/i18n/merge.js.map +1 -0
  238. package/esm/form/file-upload/index.d.ts +7 -0
  239. package/esm/form/file-upload/index.js +6 -0
  240. package/esm/form/file-upload/index.js.map +1 -0
  241. package/esm/form/file-upload/parts/Trigger.d.ts +7 -0
  242. package/esm/form/file-upload/parts/Trigger.js +18 -0
  243. package/esm/form/file-upload/parts/Trigger.js.map +1 -0
  244. package/esm/form/file-upload/parts/dropzone/Dropzone.d.ts +4 -0
  245. package/esm/form/file-upload/parts/dropzone/Dropzone.js +78 -0
  246. package/esm/form/file-upload/parts/dropzone/Dropzone.js.map +1 -0
  247. package/esm/form/file-upload/parts/dropzone/dropzone.types.d.ts +18 -0
  248. package/esm/form/file-upload/parts/dropzone/dropzone.types.js +2 -0
  249. package/esm/form/file-upload/parts/dropzone/dropzone.types.js.map +1 -0
  250. package/esm/form/file-upload/parts/dropzone/useDropzone.d.ts +13 -0
  251. package/esm/form/file-upload/parts/dropzone/useDropzone.js +30 -0
  252. package/esm/form/file-upload/parts/dropzone/useDropzone.js.map +1 -0
  253. package/esm/form/file-upload/parts/item/Item.d.ts +55 -0
  254. package/esm/form/file-upload/parts/item/Item.js +50 -0
  255. package/esm/form/file-upload/parts/item/Item.js.map +1 -0
  256. package/esm/form/file-upload/parts/item/Item.types.d.ts +5 -0
  257. package/esm/form/file-upload/parts/item/Item.types.js +2 -0
  258. package/esm/form/file-upload/parts/item/Item.types.js.map +1 -0
  259. package/esm/form/file-upload/parts/item/ItemButton.d.ts +12 -0
  260. package/esm/form/file-upload/parts/item/ItemButton.js +17 -0
  261. package/esm/form/file-upload/parts/item/ItemButton.js.map +1 -0
  262. package/esm/form/file-upload/parts/item/ItemIcon.d.ts +9 -0
  263. package/esm/form/file-upload/parts/item/ItemIcon.js +46 -0
  264. package/esm/form/file-upload/parts/item/ItemIcon.js.map +1 -0
  265. package/esm/form/file-upload/parts/item/ItemName.d.ts +9 -0
  266. package/esm/form/file-upload/parts/item/ItemName.js +27 -0
  267. package/esm/form/file-upload/parts/item/ItemName.js.map +1 -0
  268. package/esm/form/file-upload/parts/item/utils/download-file.d.ts +1 -0
  269. package/esm/form/file-upload/parts/item/utils/download-file.js +9 -0
  270. package/esm/form/file-upload/parts/item/utils/download-file.js.map +1 -0
  271. package/esm/form/file-upload/parts/item/utils/file-type-checker.d.ts +2 -0
  272. package/esm/form/file-upload/parts/item/utils/file-type-checker.js +2 -0
  273. package/esm/form/file-upload/parts/item/utils/file-type-checker.js.map +1 -0
  274. package/esm/form/file-upload/parts/item/utils/format-file-size.d.ts +2 -0
  275. package/esm/form/file-upload/parts/item/utils/format-file-size.js +20 -0
  276. package/esm/form/file-upload/parts/item/utils/format-file-size.js.map +1 -0
  277. package/esm/form/file-upload/useFileUpload.d.ts +12 -0
  278. package/esm/form/file-upload/useFileUpload.js +29 -0
  279. package/esm/form/file-upload/useFileUpload.js.map +1 -0
  280. package/esm/form/file-upload/utils/is-accepted-file-type.d.ts +1 -0
  281. package/esm/form/file-upload/utils/is-accepted-file-type.js +22 -0
  282. package/esm/form/file-upload/utils/is-accepted-file-type.js.map +1 -0
  283. package/esm/form/file-upload/utils/is-accepted-size.d.ts +1 -0
  284. package/esm/form/file-upload/utils/is-accepted-size.js +7 -0
  285. package/esm/form/file-upload/utils/is-accepted-size.js.map +1 -0
  286. package/esm/form/file-upload/utils/validate-files.d.ts +8 -0
  287. package/esm/form/file-upload/utils/validate-files.js +44 -0
  288. package/esm/form/file-upload/utils/validate-files.js.map +1 -0
  289. package/esm/form/radio/RadioGroup.d.ts +1 -1
  290. package/esm/form/search/Search.d.ts +3 -2
  291. package/esm/form/search/Search.js.map +1 -1
  292. package/esm/form/select/Select.d.ts +9 -9
  293. package/esm/form/switch/Switch.d.ts +5 -5
  294. package/esm/form/textarea/Textarea.d.ts +5 -4
  295. package/esm/form/textarea/Textarea.js.map +1 -1
  296. package/esm/form/useFormField.d.ts +10 -8
  297. package/esm/form/useFormField.js.map +1 -1
  298. package/esm/index.d.ts +1 -0
  299. package/esm/index.js +1 -0
  300. package/esm/index.js.map +1 -1
  301. package/esm/layout/bleed/Bleed.d.ts +9 -1
  302. package/esm/layout/bleed/Bleed.js.map +1 -1
  303. package/esm/layout/box/Box.d.ts +5 -5
  304. package/esm/layout/grid/HGrid.d.ts +1 -3
  305. package/esm/layout/grid/HGrid.js.map +1 -1
  306. package/esm/layout/page/Page.d.ts +2 -2
  307. package/esm/layout/responsive/Responsive.d.ts +2 -4
  308. package/esm/layout/responsive/Responsive.js.map +1 -1
  309. package/esm/layout/stack/Stack.d.ts +18 -4
  310. package/esm/layout/stack/Stack.js.map +1 -1
  311. package/esm/list/types.d.ts +1 -1
  312. package/esm/loader/Loader.d.ts +0 -6
  313. package/esm/loader/Loader.js.map +1 -1
  314. package/esm/modal/Modal.js +2 -2
  315. package/esm/modal/types.d.ts +8 -8
  316. package/esm/pagination/Pagination.d.ts +3 -2
  317. package/esm/pagination/Pagination.js.map +1 -1
  318. package/esm/pagination/PaginationItem.d.ts +1 -1
  319. package/esm/popover/Popover.d.ts +2 -1
  320. package/esm/popover/Popover.js.map +1 -1
  321. package/esm/read-more/ReadMore.d.ts +7 -7
  322. package/esm/stepper/Step.d.ts +4 -4
  323. package/esm/stepper/Stepper.d.ts +7 -5
  324. package/esm/stepper/Stepper.js.map +1 -1
  325. package/esm/table/AnimateHeight.d.ts +1 -1
  326. package/esm/table/DataCell.d.ts +1 -3
  327. package/esm/table/DataCell.js.map +1 -1
  328. package/esm/tabs/TabList.d.ts +1 -1
  329. package/esm/tabs/Tabs.d.ts +7 -7
  330. package/esm/timeline/Timeline.d.ts +6 -3
  331. package/esm/timeline/Timeline.js +2 -1
  332. package/esm/timeline/Timeline.js.map +1 -1
  333. package/esm/timeline/period/index.d.ts +3 -2
  334. package/esm/timeline/period/index.js.map +1 -1
  335. package/esm/tooltip/Tooltip.d.ts +19 -12
  336. package/esm/tooltip/Tooltip.js.map +1 -1
  337. package/esm/util/create-context.d.ts +1 -0
  338. package/esm/util/create-context.js.map +1 -1
  339. package/esm/util/hooks/useEventListener.d.ts +1 -1
  340. package/esm/util/hooks/useMergeRefs.d.ts +1 -1
  341. package/package.json +13 -3
  342. package/src/accordion/Accordion.tsx +4 -4
  343. package/src/accordion/accordion.stories.tsx +0 -2
  344. package/src/alert/Alert.tsx +12 -10
  345. package/src/button/Button.tsx +9 -8
  346. package/src/chat/Chat.tsx +6 -6
  347. package/src/chips/Chips.tsx +2 -2
  348. package/src/copybutton/CopyButton.tsx +14 -12
  349. package/src/date/datepicker/datepicker.stories.tsx +0 -1
  350. package/src/date/datepicker/types.ts +7 -6
  351. package/src/date/hooks/useDatepicker.tsx +4 -3
  352. package/src/date/hooks/useMonthPicker.tsx +4 -3
  353. package/src/date/monthpicker/types.ts +2 -1
  354. package/src/date/parts/DateInput.tsx +1 -1
  355. package/src/expansion-card/ExpansionCardTitle.tsx +1 -1
  356. package/src/form/checkbox/CheckboxGroup.tsx +3 -3
  357. package/src/form/checkbox/types.ts +4 -4
  358. package/src/form/combobox/ComboboxProvider.tsx +7 -3
  359. package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +22 -15
  360. package/src/form/combobox/FilteredOptions/filtered-options-util.ts +5 -10
  361. package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +19 -29
  362. package/src/form/combobox/Input/Input.tsx +14 -8
  363. package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +8 -5
  364. package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +24 -25
  365. package/src/form/combobox/combobox-utils.test.ts +67 -0
  366. package/src/form/combobox/combobox-utils.ts +32 -0
  367. package/src/form/combobox/combobox.stories.tsx +67 -32
  368. package/src/form/combobox/combobox.test.tsx +32 -1
  369. package/src/form/combobox/customOptionsContext.tsx +9 -8
  370. package/src/form/combobox/types.ts +34 -22
  371. package/src/form/error-summary/ErrorSummary.tsx +5 -5
  372. package/src/form/file-upload/FileUpload.context.tsx +9 -0
  373. package/src/form/file-upload/FileUpload.tsx +142 -0
  374. package/src/form/file-upload/FileUpload.types.ts +57 -0
  375. package/src/form/file-upload/file-upload-dropzone.stories.tsx +123 -0
  376. package/src/form/file-upload/file-upload-item.stories.tsx +136 -0
  377. package/src/form/file-upload/file-upload.stories.tsx +236 -0
  378. package/src/form/file-upload/i18n/get.ts +48 -0
  379. package/src/form/file-upload/i18n/i18n.context.test.tsx +92 -0
  380. package/src/form/file-upload/i18n/i18n.context.ts +67 -0
  381. package/src/form/file-upload/i18n/i18n.types.ts +20 -0
  382. package/src/form/file-upload/i18n/locales/nb.json +20 -0
  383. package/src/form/file-upload/i18n/merge.ts +35 -0
  384. package/src/form/file-upload/index.ts +21 -0
  385. package/src/form/file-upload/parts/Trigger.tsx +48 -0
  386. package/src/form/file-upload/parts/dropzone/Dropzone.tsx +180 -0
  387. package/src/form/file-upload/parts/dropzone/dropzone.types.ts +22 -0
  388. package/src/form/file-upload/parts/dropzone/useDropzone.ts +43 -0
  389. package/src/form/file-upload/parts/item/Item.tsx +165 -0
  390. package/src/form/file-upload/parts/item/Item.types.ts +6 -0
  391. package/src/form/file-upload/parts/item/ItemButton.tsx +52 -0
  392. package/src/form/file-upload/parts/item/ItemIcon.tsx +74 -0
  393. package/src/form/file-upload/parts/item/ItemName.tsx +58 -0
  394. package/src/form/file-upload/parts/item/utils/download-file.ts +9 -0
  395. package/src/form/file-upload/parts/item/utils/file-type-checker.ts +4 -0
  396. package/src/form/file-upload/parts/item/utils/format-file-size.test.ts +76 -0
  397. package/src/form/file-upload/parts/item/utils/format-file-size.ts +25 -0
  398. package/src/form/file-upload/useFileUpload.ts +54 -0
  399. package/src/form/file-upload/utils/is-accepted-file-type.test.ts +69 -0
  400. package/src/form/file-upload/utils/is-accepted-file-type.ts +25 -0
  401. package/src/form/file-upload/utils/is-accepted-size.test.ts +26 -0
  402. package/src/form/file-upload/utils/is-accepted-size.ts +7 -0
  403. package/src/form/file-upload/utils/validate-files.test.ts +132 -0
  404. package/src/form/file-upload/utils/validate-files.ts +62 -0
  405. package/src/form/radio/RadioGroup.tsx +1 -1
  406. package/src/form/search/Search.tsx +3 -2
  407. package/src/form/select/Select.tsx +9 -9
  408. package/src/form/select/select.stories.tsx +32 -37
  409. package/src/form/switch/Switch.tsx +5 -5
  410. package/src/form/textarea/Textarea.tsx +5 -4
  411. package/src/form/useFormField.ts +10 -8
  412. package/src/index.ts +14 -0
  413. package/src/internal-header/header.stories.tsx +8 -5
  414. package/src/layout/bleed/Bleed.tsx +9 -1
  415. package/src/layout/box/Box.tsx +5 -5
  416. package/src/layout/grid/HGrid.tsx +1 -3
  417. package/src/layout/page/Page.tsx +2 -2
  418. package/src/layout/responsive/Responsive.tsx +2 -4
  419. package/src/layout/stack/Stack.tsx +18 -4
  420. package/src/list/types.ts +1 -1
  421. package/src/loader/Loader.tsx +0 -6
  422. package/src/modal/Modal.tsx +2 -2
  423. package/src/modal/types.ts +8 -8
  424. package/src/pagination/Pagination.tsx +3 -2
  425. package/src/pagination/PaginationItem.tsx +1 -1
  426. package/src/popover/Popover.tsx +2 -1
  427. package/src/read-more/ReadMore.tsx +7 -7
  428. package/src/stepper/Step.tsx +4 -4
  429. package/src/stepper/Stepper.tsx +7 -5
  430. package/src/table/AnimateHeight.tsx +1 -1
  431. package/src/table/DataCell.tsx +1 -6
  432. package/src/tabs/TabList.tsx +1 -1
  433. package/src/tabs/Tabs.tsx +7 -7
  434. package/src/timeline/Timeline.tsx +6 -3
  435. package/src/timeline/period/index.tsx +3 -2
  436. package/src/tooltip/Tooltip.tsx +19 -12
  437. package/src/util/create-context.tsx +1 -0
  438. package/src/util/hooks/useMergeRefs.ts +1 -1
@@ -0,0 +1,48 @@
1
+ import { TranslationObject } from "./i18n.types";
2
+
3
+ /**
4
+ * https://github.com/Shopify/polaris/blob/main/polaris-react/src/utilities/get.ts#L3
5
+ */
6
+ const OBJECT_NOTATION_MATCHER = /(\w+)/g;
7
+
8
+ export function get(
9
+ keypath: string | string[],
10
+ ...objs: (TranslationObject | undefined)[]
11
+ ) {
12
+ const keys = Array.isArray(keypath) ? keypath : getKeypath(keypath);
13
+
14
+ for (const obj of objs) {
15
+ if (!obj) {
16
+ continue;
17
+ }
18
+
19
+ let acc: string | TranslationObject = obj;
20
+
21
+ for (let i = 0; i < keys.length; i++) {
22
+ const val = acc[keys[i]];
23
+ if (val === undefined) {
24
+ continue;
25
+ }
26
+ acc = val;
27
+ }
28
+
29
+ if (typeof acc === "string") {
30
+ return acc;
31
+ }
32
+ }
33
+
34
+ throw new Error(
35
+ "Error translating key. The keypath does not resolve to a string.",
36
+ );
37
+ }
38
+
39
+ function getKeypath(str: string) {
40
+ const path: string[] = [];
41
+ let result: RegExpExecArray | null;
42
+ while ((result = OBJECT_NOTATION_MATCHER.exec(str))) {
43
+ const [, first, second] = result;
44
+ path.push(first || second);
45
+ }
46
+
47
+ return path;
48
+ }
@@ -0,0 +1,92 @@
1
+ import { renderHook } from "@testing-library/react";
2
+ import React from "react";
3
+ import { describe, expect, test } from "vitest";
4
+ import { I18nContext, useI18n } from "./i18n.context";
5
+
6
+ describe("useI18n", () => {
7
+ test("should throw error if key is not found", () => {
8
+ const { result } = renderHook(() => useI18n("FileUpload"));
9
+ const translate = result.current;
10
+ // @ts-expect-error - Testing nonexistent key
11
+ expect(() => translate("item.nonexistentKey")).toThrowError();
12
+ });
13
+
14
+ test("should return the translated text from I18nContext", () => {
15
+ const i18n = { FileUpload: { item: { uploading: "Test translation" } } };
16
+ const { result } = renderHook(() => useI18n("FileUpload"), {
17
+ wrapper: ({ children }) => (
18
+ <I18nContext.Provider value={i18n}>{children}</I18nContext.Provider>
19
+ ),
20
+ });
21
+ const translate = result.current;
22
+ expect(translate("item.uploading")).toBe("Test translation");
23
+ });
24
+
25
+ test("should return the translated text from first context object", () => {
26
+ const i18n1 = {
27
+ FileUpload: { item: { uploading: "Correct translation" } },
28
+ };
29
+ const i18n2 = { FileUpload: { item: { uploading: "Wrong translation" } } };
30
+ const { result } = renderHook(() => useI18n("FileUpload"), {
31
+ wrapper: ({ children }) => (
32
+ <I18nContext.Provider value={[i18n1, i18n2]}>
33
+ {children}
34
+ </I18nContext.Provider>
35
+ ),
36
+ });
37
+ const translate = result.current;
38
+ expect(translate("item.uploading")).toBe("Correct translation");
39
+ });
40
+
41
+ test("should return the translated text from second context object", () => {
42
+ const i18n1 = { FileUpload: { item: { uploading: "Foo" } } };
43
+ const i18n2 = {
44
+ FileUpload: { item: { downloading: "Correct translation" } },
45
+ };
46
+ const { result } = renderHook(() => useI18n("FileUpload"), {
47
+ wrapper: ({ children }) => (
48
+ <I18nContext.Provider value={[i18n1, i18n2]}>
49
+ {children}
50
+ </I18nContext.Provider>
51
+ ),
52
+ });
53
+ const translate = result.current;
54
+ expect(translate("item.downloading")).toBe("Correct translation");
55
+ });
56
+
57
+ test("should return the translated text from first local object", () => {
58
+ const i18n1 = { item: { uploading: "Correct translation" } };
59
+ const i18n2 = { item: { uploading: "Wrong translation" } };
60
+ const { result } = renderHook(() => useI18n("FileUpload", i18n1, i18n2));
61
+ const translate = result.current;
62
+ expect(translate("item.uploading")).toBe("Correct translation");
63
+ });
64
+
65
+ test("should return the translated text from second local object", () => {
66
+ const i18n1 = { item: { uploading: "Foo" } };
67
+ const i18n2 = { item: { downloading: "Correct translation" } };
68
+ const { result } = renderHook(() => useI18n("FileUpload", i18n1, i18n2));
69
+ const translate = result.current;
70
+ expect(translate("item.downloading")).toBe("Correct translation");
71
+ });
72
+
73
+ test("should replace placeholders in the translated text", () => {
74
+ const i18n = {
75
+ item: { uploading: "Hello, {name}. You have {cnt} messages." },
76
+ };
77
+ const { result } = renderHook(() => useI18n("FileUpload", i18n));
78
+ const translate = result.current;
79
+ expect(
80
+ translate("item.uploading", { replacements: { name: "John", cnt: 3 } }),
81
+ ).toBe("Hello, John. You have 3 messages.");
82
+ });
83
+
84
+ test("should throw an error if replacement key is not found", () => {
85
+ const i18n = { item: { uploading: "Hello, {name}" } };
86
+ const { result } = renderHook(() => useI18n("FileUpload", i18n));
87
+ const translate = result.current;
88
+ expect(() =>
89
+ translate("item.uploading", { replacements: { other: "John" } }),
90
+ ).toThrowError();
91
+ });
92
+ });
@@ -0,0 +1,67 @@
1
+ import { createContext, useContext } from "react";
2
+ import { get } from "./get";
3
+ import {
4
+ Component,
5
+ ComponentTranslation,
6
+ TranslationDictionary,
7
+ } from "./i18n.types";
8
+ import nb from "./locales/nb.json";
9
+
10
+ /**
11
+ * https://regex101.com/r/LYKWi3/1
12
+ */
13
+ const REPLACE_REGEX = /{[^}]*}/g;
14
+
15
+ export const I18nContext = createContext<
16
+ TranslationDictionary | TranslationDictionary[]
17
+ >(nb);
18
+
19
+ /* https://dev.to/pffigueiredo/typescript-utility-keyof-nested-object-2pa3 */
20
+ type NestedKeyOf<ObjectType extends object> = {
21
+ [Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object
22
+ ? `${Key}.${NestedKeyOf<ObjectType[Key]>}`
23
+ : `${Key}`;
24
+ }[keyof ObjectType & (string | number)];
25
+
26
+ export function useI18n<T extends Component>(
27
+ componentName: T,
28
+ ...local: (ComponentTranslation<T> | undefined)[]
29
+ ) {
30
+ const i18n = useContext(I18nContext);
31
+
32
+ /**
33
+ * https://github.com/Shopify/polaris/blob/2115f9ba2f5bcbf2ad15745233501bff2db81ecf/polaris-react/src/utilities/i18n/I18n.ts#L24
34
+ */
35
+ const translate = (
36
+ keypath: NestedKeyOf<(typeof nb)[T]>,
37
+ options?: { replacements: Record<string, string | number> },
38
+ ) => {
39
+ const text = get(
40
+ keypath,
41
+ ...local,
42
+ ...(Array.isArray(i18n)
43
+ ? i18n.map((t) => t[componentName])
44
+ : [i18n[componentName]]),
45
+ );
46
+
47
+ if (options?.replacements) {
48
+ return text.replace(REPLACE_REGEX, (match) => {
49
+ const replacement = match.substring(1, match.length - 1);
50
+
51
+ if (options.replacements[replacement] === undefined) {
52
+ const replacementData = JSON.stringify(options.replacements);
53
+
54
+ throw new Error(
55
+ `Error translating key '${keypath}'. No replacement syntax ({}) found for key '${replacement}'. The following replacements were passed: '${replacementData}'`,
56
+ );
57
+ }
58
+
59
+ return options.replacements[replacement] as string; // can also be a number, but JS doesn't mind...
60
+ });
61
+ }
62
+
63
+ return text;
64
+ };
65
+
66
+ return translate;
67
+ }
@@ -0,0 +1,20 @@
1
+ import nb from "./locales/nb.json";
2
+
3
+ export interface TranslationObject {
4
+ [key: string]: string | TranslationObject | undefined;
5
+ }
6
+
7
+ export interface TranslationDictionary {
8
+ [key: string]: TranslationObject | undefined;
9
+ }
10
+
11
+ /* https://stackoverflow.com/questions/47914536/use-partial-in-nested-property-with-typescripts */
12
+ type RecursivePartial<T> = {
13
+ [P in keyof T]?: RecursivePartial<T[P]>;
14
+ };
15
+
16
+ export type Component = keyof typeof nb;
17
+
18
+ export type ComponentTranslation<T extends Component> = RecursivePartial<
19
+ (typeof nb)[T]
20
+ >;
@@ -0,0 +1,20 @@
1
+ {
2
+ "FileUpload": {
3
+ "dropzone": {
4
+ "button": "Velg fil",
5
+ "buttonMultiple": "Velg filer",
6
+ "dragAndDrop": "Dra og slipp filen her",
7
+ "dragAndDropMultiple": "Dra og slipp filer her",
8
+ "drop": "Slipp",
9
+ "or": "eller",
10
+ "disabled": "Filopplasting er deaktivert",
11
+ "disabledFilelimit": "Du kan ikke laste opp flere filer"
12
+ },
13
+ "item": {
14
+ "retryButtonTitle": "Prøv å laste opp filen på nytt",
15
+ "deleteButtonTitle": "Slett filen",
16
+ "uploading": "Laster opp…",
17
+ "downloading": "Laster ned…"
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,35 @@
1
+ import { TranslationDictionary, TranslationObject } from "./i18n.types";
2
+
3
+ export function merge(...objs: TranslationDictionary[]) {
4
+ let final: TranslationDictionary = {};
5
+
6
+ for (const obj of objs) {
7
+ final = mergeRecursively(final, obj);
8
+ }
9
+
10
+ return final;
11
+ }
12
+
13
+ function mergeRecursively<T>(
14
+ objA: T,
15
+ objB: TranslationDictionary | TranslationObject,
16
+ ) {
17
+ const objARes = { ...objA };
18
+
19
+ for (const key in objB) {
20
+ if (!(key in objB)) {
21
+ continue;
22
+ }
23
+
24
+ const a = objARes[key];
25
+ const b = objB[key];
26
+
27
+ if (b && typeof b !== "string" && typeof a !== "string") {
28
+ objARes[key] = mergeRecursively(a, b);
29
+ } else {
30
+ objARes[key] = b;
31
+ }
32
+ }
33
+
34
+ return objARes;
35
+ }
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ export { default as UNSAFE_FileUpload } from "./FileUpload";
3
+ export { default as UNSAFE_FileUploadDropzone } from "./parts/dropzone/Dropzone";
4
+ export { type FileUploadDropzoneProps } from "./parts/dropzone/dropzone.types";
5
+ export {
6
+ default as UNSAFE_FileUploadTrigger,
7
+ type FileUploadTriggerProps,
8
+ } from "./parts/Trigger";
9
+ export {
10
+ type FileObject,
11
+ type FileRejected,
12
+ type FileAccepted,
13
+ type FileRejectedPartitioned,
14
+ type FilesPartitioned,
15
+ type FileRejectionReason,
16
+ } from "./FileUpload.types";
17
+ export {
18
+ default as UNSAFE_FileUploadItem,
19
+ type FileUploadItemProps,
20
+ } from "./parts/item/Item";
21
+ export { type FileItem, type FileMetadata } from "./parts/item/Item.types";
@@ -0,0 +1,48 @@
1
+ import React, { forwardRef } from "react";
2
+ import { Slot } from "../../../util/Slot";
3
+ import { FileUploadBaseProps } from "../FileUpload.types";
4
+ import { useFileUpload } from "../useFileUpload";
5
+
6
+ export interface FileUploadTriggerProps
7
+ extends Omit<FileUploadBaseProps, "fileLimit"> {
8
+ children: React.ReactNode;
9
+ }
10
+
11
+ const Trigger = forwardRef<HTMLInputElement, FileUploadTriggerProps>(
12
+ (
13
+ {
14
+ children,
15
+ multiple = true,
16
+ accept,
17
+ onSelect,
18
+ validator,
19
+ maxSizeInBytes,
20
+ }: FileUploadTriggerProps,
21
+ ref,
22
+ ) => {
23
+ const { onChange, inputRef, mergedRef } = useFileUpload({
24
+ ref,
25
+ onSelect,
26
+ validator,
27
+ accept,
28
+ maxSizeInBytes,
29
+ disabled: false,
30
+ });
31
+
32
+ return (
33
+ <>
34
+ <Slot onClick={() => inputRef.current?.click()}>{children}</Slot>
35
+ <input
36
+ ref={mergedRef}
37
+ type="file"
38
+ style={{ display: "none" }}
39
+ multiple={multiple}
40
+ accept={accept}
41
+ onChange={onChange}
42
+ />
43
+ </>
44
+ );
45
+ },
46
+ );
47
+
48
+ export default Trigger;
@@ -0,0 +1,180 @@
1
+ import cl from "clsx";
2
+ import React, { forwardRef } from "react";
3
+ import { CircleSlashIcon, CloudUpIcon } from "@navikt/aksel-icons";
4
+ import { Button } from "../../../../button";
5
+ import { BodyShort, ErrorMessage, Label } from "../../../../typography";
6
+ import { composeEventHandlers } from "../../../../util/composeEventHandlers";
7
+ import { useId } from "../../../../util/hooks";
8
+ import { omit } from "../../../../util/omit";
9
+ import { useFormField } from "../../../useFormField";
10
+ import { useFileUploadTranslation } from "../../FileUpload.context";
11
+ import { useI18n } from "../../i18n/i18n.context";
12
+ import { useFileUpload } from "../../useFileUpload";
13
+ import { FileUploadDropzoneProps } from "./dropzone.types";
14
+ import { useDropzone } from "./useDropzone";
15
+
16
+ const Dropzone = forwardRef<HTMLInputElement, FileUploadDropzoneProps>(
17
+ (props: FileUploadDropzoneProps, ref) => {
18
+ const {
19
+ onSelect,
20
+ error,
21
+ label,
22
+ description,
23
+ className,
24
+ multiple = true,
25
+ accept,
26
+ validator,
27
+ maxSizeInBytes,
28
+ fileLimit,
29
+ icon: DropzoneIcon = CloudUpIcon,
30
+ disabled,
31
+ translations,
32
+ onClick,
33
+ ...rest
34
+ } = props;
35
+
36
+ const context = useFileUploadTranslation(false);
37
+ const translate = useI18n(
38
+ "FileUpload",
39
+ { dropzone: translations },
40
+ context?.translations,
41
+ );
42
+
43
+ const fileLimitReached =
44
+ fileLimit && fileLimit?.current >= fileLimit?.max && fileLimit?.max > 0;
45
+
46
+ const _disabled = disabled ?? fileLimitReached;
47
+
48
+ const { inputProps, errorId, showErrorMsg, hasError, inputDescriptionId } =
49
+ useFormField({ ...props, disabled: _disabled }, "fileUpload");
50
+ const {
51
+ id: inputId,
52
+ "aria-describedby": ariaDescribedby,
53
+ ...inputPropsRest
54
+ } = inputProps;
55
+ const labelId = useId();
56
+
57
+ const { upload, onChange, inputRef, mergedRef } = useFileUpload({
58
+ ref,
59
+ onSelect,
60
+ validator,
61
+ accept,
62
+ maxSizeInBytes,
63
+ disabled: inputProps.disabled,
64
+ });
65
+
66
+ const dropzoneCtx = useDropzone({
67
+ upload,
68
+ disabled: inputProps.disabled,
69
+ });
70
+
71
+ return (
72
+ <div
73
+ className={cl("navds-form-field", "navds-dropzone", className, {
74
+ "navds-dropzone--error": hasError,
75
+ "navds-dropzone--dragging": dropzoneCtx.isDraggingOver,
76
+ "navds-dropzone--disabled": inputProps.disabled,
77
+ })}
78
+ >
79
+ <Label
80
+ htmlFor={inputId}
81
+ id={labelId}
82
+ className="navds-form-field__label"
83
+ >
84
+ {label}
85
+ </Label>
86
+ {!!description && (
87
+ <BodyShort
88
+ id={inputDescriptionId}
89
+ className="navds-form-field__description"
90
+ as="div"
91
+ >
92
+ {description}
93
+ </BodyShort>
94
+ )}
95
+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
96
+ <div
97
+ className="navds-dropzone__area"
98
+ onDragEnter={dropzoneCtx.onDragEnter}
99
+ onDragOver={dropzoneCtx.onDragOver}
100
+ onDragLeave={dropzoneCtx.onDragLeave}
101
+ onDrop={dropzoneCtx.onDrop}
102
+ onClick={composeEventHandlers(
103
+ onClick,
104
+ () => inputRef.current?.click(),
105
+ )}
106
+ >
107
+ {!inputProps.disabled && (
108
+ <>
109
+ <div className="navds-dropzone__area-icon">
110
+ <DropzoneIcon fontSize="1.5rem" aria-hidden />
111
+ </div>
112
+ <div className="navds-dropzone__area-release">
113
+ <div className="navds-dropzone__area-release__icon">
114
+ <DropzoneIcon aria-hidden />
115
+ </div>
116
+ <span
117
+ aria-hidden={!dropzoneCtx.isDraggingOver}
118
+ className="navds-dropzone__area-release__text"
119
+ >
120
+ {translate("dropzone.drop")}
121
+ </span>
122
+ </div>
123
+ <div aria-hidden>
124
+ <BodyShort as="div" spacing>
125
+ {multiple
126
+ ? translate("dropzone.dragAndDropMultiple")
127
+ : translate("dropzone.dragAndDrop")}
128
+ </BodyShort>
129
+ <BodyShort as="div">{translate("dropzone.or")}</BodyShort>
130
+ </div>
131
+ <Button
132
+ {...omit(rest, ["errorId"])}
133
+ {...inputPropsRest}
134
+ aria-describedby={cl(labelId, ariaDescribedby)}
135
+ className="navds-dropzone__area-button"
136
+ type="button"
137
+ variant="secondary"
138
+ >
139
+ {multiple
140
+ ? translate("dropzone.buttonMultiple")
141
+ : translate("dropzone.button")}
142
+ </Button>
143
+ </>
144
+ )}
145
+
146
+ {inputProps.disabled && (
147
+ <div className="navds-dropzone__area-disabled">
148
+ <CircleSlashIcon aria-hidden fontSize="1.75rem" />
149
+ <BodyShort as="div">
150
+ {fileLimitReached
151
+ ? translate("dropzone.disabledFilelimit")
152
+ : translate("dropzone.disabled")}
153
+ </BodyShort>
154
+ </div>
155
+ )}
156
+
157
+ <input
158
+ id={inputId}
159
+ type="file"
160
+ style={{ display: "none" }}
161
+ multiple={multiple}
162
+ accept={accept}
163
+ onChange={onChange}
164
+ ref={mergedRef}
165
+ />
166
+ </div>
167
+ <div
168
+ className="navds-form-field__error"
169
+ id={errorId}
170
+ aria-relevant="additions removals"
171
+ aria-live="polite"
172
+ >
173
+ {showErrorMsg && <ErrorMessage>{error}</ErrorMessage>}
174
+ </div>
175
+ </div>
176
+ );
177
+ },
178
+ );
179
+
180
+ export default Dropzone;
@@ -0,0 +1,22 @@
1
+ import { FormFieldProps } from "../../../useFormField";
2
+ import { FileUploadBaseProps } from "../../FileUpload.types";
3
+ import { ComponentTranslation } from "../../i18n/i18n.types";
4
+
5
+ export interface FileUploadDropzoneProps
6
+ extends FileUploadBaseProps,
7
+ Omit<FormFieldProps, "size" | "readOnly">,
8
+ Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onSelect" | "onClick">,
9
+ Pick<React.HTMLAttributes<HTMLDivElement>, "onClick"> {
10
+ /**
11
+ * Text shown to the user.
12
+ */
13
+ label: string;
14
+ /**
15
+ * @default CloudUpIcon
16
+ */
17
+ icon?: React.ComponentType<any>;
18
+ /**
19
+ * i18n-API for customizing texts and labels
20
+ */
21
+ translations?: ComponentTranslation<"FileUpload">["dropzone"];
22
+ }
@@ -0,0 +1,43 @@
1
+ import { useState } from "react";
2
+ import { UseFileUploadProps } from "../../useFileUpload";
3
+
4
+ interface Props {
5
+ upload: (fileList: FileList) => void;
6
+ disabled: UseFileUploadProps["disabled"];
7
+ }
8
+
9
+ export const useDropzone = ({ upload, disabled }: Props) => {
10
+ const [isDraggingOver, setIsDraggingOver] = useState(false);
11
+
12
+ const onDragEnter = () => {
13
+ setIsDraggingOver(true);
14
+ };
15
+
16
+ const onDragOver = (event: React.DragEvent<HTMLDivElement>) => {
17
+ event.preventDefault(); // Prevents the browser from opening the file in a new tab
18
+ };
19
+
20
+ const onDragLeave = () => {
21
+ setIsDraggingOver(false);
22
+ };
23
+
24
+ const onDrop = (event: React.DragEvent<HTMLDivElement>) => {
25
+ event.preventDefault(); // Prevents the browser from opening the file in a new tab
26
+ setIsDraggingOver(false);
27
+
28
+ const fileList = event.dataTransfer.files;
29
+ if (!fileList) {
30
+ return;
31
+ }
32
+
33
+ upload(fileList);
34
+ };
35
+
36
+ return {
37
+ isDraggingOver,
38
+ onDragEnter: disabled ? undefined : onDragEnter,
39
+ onDragOver: disabled ? undefined : onDragOver,
40
+ onDragLeave: disabled ? undefined : onDragLeave,
41
+ onDrop: disabled ? undefined : onDrop,
42
+ };
43
+ };