@react-md/core 6.4.0 → 6.5.1

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 (431) hide show
  1. package/dist/_a11y.scss +3 -1
  2. package/dist/_box-shadows.scss +20 -12
  3. package/dist/_core.scss +1 -1
  4. package/dist/_utils.scss +26 -11
  5. package/dist/app-bar/_app-bar.scss +3 -3
  6. package/dist/autocomplete/AutocompleteChip.js +2 -2
  7. package/dist/autocomplete/AutocompleteChip.js.map +1 -1
  8. package/dist/autocomplete/AutocompleteListboxChildren.js +1 -1
  9. package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
  10. package/dist/autocomplete/_autocomplete.scss +20 -16
  11. package/dist/autocomplete/useAutocomplete.js +4 -4
  12. package/dist/autocomplete/useAutocomplete.js.map +1 -1
  13. package/dist/autocomplete/utils.js +3 -3
  14. package/dist/autocomplete/utils.js.map +1 -1
  15. package/dist/avatar/_avatar.scss +2 -1
  16. package/dist/box/styles.js +2 -2
  17. package/dist/box/styles.js.map +1 -1
  18. package/dist/button/AsyncButton.js +1 -1
  19. package/dist/button/AsyncButton.js.map +1 -1
  20. package/dist/button/_button.scss +9 -5
  21. package/dist/card/_card.scss +6 -6
  22. package/dist/chip/Chip.js +1 -1
  23. package/dist/chip/Chip.js.map +1 -1
  24. package/dist/chip/_chip.scss +6 -6
  25. package/dist/cssUtils.d.ts +11 -6
  26. package/dist/cssUtils.js.map +1 -1
  27. package/dist/datetime/useTimeField.js +1 -1
  28. package/dist/datetime/useTimeField.js.map +1 -1
  29. package/dist/delegateEvent.js +9 -9
  30. package/dist/delegateEvent.js.map +1 -1
  31. package/dist/dialog/_dialog.scss +6 -6
  32. package/dist/divider/_divider.scss +6 -2
  33. package/dist/draggable/useDraggable.js +4 -4
  34. package/dist/draggable/useDraggable.js.map +1 -1
  35. package/dist/draggable/utils.js +1 -1
  36. package/dist/draggable/utils.js.map +1 -1
  37. package/dist/expansion-panel/ExpansionPanel.js +1 -1
  38. package/dist/expansion-panel/ExpansionPanel.js.map +1 -1
  39. package/dist/expansion-panel/useExpansionPanels.js +1 -1
  40. package/dist/expansion-panel/useExpansionPanels.js.map +1 -1
  41. package/dist/files/FileInput.js +1 -1
  42. package/dist/files/FileInput.js.map +1 -1
  43. package/dist/files/createAcceptFromExtensions.d.ts +5 -0
  44. package/dist/files/createAcceptFromExtensions.js +15 -0
  45. package/dist/files/createAcceptFromExtensions.js.map +1 -0
  46. package/dist/files/useFileUpload.js +45 -41
  47. package/dist/files/useFileUpload.js.map +1 -1
  48. package/dist/files/utils.js +14 -10
  49. package/dist/files/utils.js.map +1 -1
  50. package/dist/files/validation.js +7 -8
  51. package/dist/files/validation.js.map +1 -1
  52. package/dist/focus/useFocusContainer.js +1 -1
  53. package/dist/focus/useFocusContainer.js.map +1 -1
  54. package/dist/focus/utils.js +12 -7
  55. package/dist/focus/utils.js.map +1 -1
  56. package/dist/form/InputToggleIcon.js +5 -1
  57. package/dist/form/InputToggleIcon.js.map +1 -1
  58. package/dist/form/NativeSelect.js +1 -1
  59. package/dist/form/NativeSelect.js.map +1 -1
  60. package/dist/form/Select.d.ts +24 -0
  61. package/dist/form/Select.js +19 -8
  62. package/dist/form/Select.js.map +1 -1
  63. package/dist/form/SelectedOption.d.ts +1 -2
  64. package/dist/form/SelectedOption.js +2 -2
  65. package/dist/form/SelectedOption.js.map +1 -1
  66. package/dist/form/_input-toggle.scss +6 -5
  67. package/dist/form/_label.scss +2 -2
  68. package/dist/form/_legend.scss +22 -13
  69. package/dist/form/_slider.scss +7 -5
  70. package/dist/form/_switch.scss +7 -5
  71. package/dist/form/_text-field.scss +13 -11
  72. package/dist/form/formConfig.js +1 -1
  73. package/dist/form/formConfig.js.map +1 -1
  74. package/dist/form/inputToggleStyles.js +7 -1
  75. package/dist/form/inputToggleStyles.js.map +1 -1
  76. package/dist/form/legendStyles.d.ts +1 -1
  77. package/dist/form/legendStyles.js.map +1 -1
  78. package/dist/form/selectUtils.js +2 -2
  79. package/dist/form/selectUtils.js.map +1 -1
  80. package/dist/form/useCombobox.js +1 -0
  81. package/dist/form/useCombobox.js.map +1 -1
  82. package/dist/form/useFormReset.js +2 -2
  83. package/dist/form/useFormReset.js.map +1 -1
  84. package/dist/form/useNumberField.js +1 -1
  85. package/dist/form/useNumberField.js.map +1 -1
  86. package/dist/form/useResizingTextArea.js +4 -4
  87. package/dist/form/useResizingTextArea.js.map +1 -1
  88. package/dist/form/useSelectCombobox.js +1 -1
  89. package/dist/form/useSelectCombobox.js.map +1 -1
  90. package/dist/form/validation.js +1 -1
  91. package/dist/form/validation.js.map +1 -1
  92. package/dist/hoverMode/useHoverMode.js +8 -8
  93. package/dist/hoverMode/useHoverMode.js.map +1 -1
  94. package/dist/hoverMode/useHoverModeProvider.js +3 -3
  95. package/dist/hoverMode/useHoverModeProvider.js.map +1 -1
  96. package/dist/icon/config.js +3 -3
  97. package/dist/icon/config.js.map +1 -1
  98. package/dist/icon/materialConfig.js +1 -1
  99. package/dist/icon/materialConfig.js.map +1 -1
  100. package/dist/interaction/UserInteractionModeProvider.js +11 -10
  101. package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
  102. package/dist/interaction/_interaction.scss +5 -3
  103. package/dist/interaction/utils.js +7 -3
  104. package/dist/interaction/utils.js.map +1 -1
  105. package/dist/layout/useExpandableLayout.js +3 -4
  106. package/dist/layout/useExpandableLayout.js.map +1 -1
  107. package/dist/layout/useMainTabIndex.js +1 -1
  108. package/dist/layout/useMainTabIndex.js.map +1 -1
  109. package/dist/list/ListItem.js +1 -1
  110. package/dist/list/ListItem.js.map +1 -1
  111. package/dist/media-queries/AppSizeProvider.js +1 -1
  112. package/dist/media-queries/AppSizeProvider.js.map +1 -1
  113. package/dist/media-queries/config.js +2 -2
  114. package/dist/media-queries/config.js.map +1 -1
  115. package/dist/media-queries/useMediaQuery.js +3 -3
  116. package/dist/media-queries/useMediaQuery.js.map +1 -1
  117. package/dist/menu/Menu.js +4 -4
  118. package/dist/menu/Menu.js.map +1 -1
  119. package/dist/menu/MenuItemButton.js +1 -1
  120. package/dist/menu/MenuItemButton.js.map +1 -1
  121. package/dist/menu/MenuItemFileInput.js +1 -1
  122. package/dist/menu/MenuItemFileInput.js.map +1 -1
  123. package/dist/menu/MenuWidget.js +2 -2
  124. package/dist/menu/MenuWidget.js.map +1 -1
  125. package/dist/movement/findMatchIndex.js +2 -2
  126. package/dist/movement/findMatchIndex.js.map +1 -1
  127. package/dist/movement/useKeyboardMovementProvider.js +2 -2
  128. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  129. package/dist/movement/utils.js +12 -10
  130. package/dist/movement/utils.js.map +1 -1
  131. package/dist/navigation/getTableOfContentsHeadings.js +4 -3
  132. package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
  133. package/dist/navigation/useActiveHeadingId.js +9 -9
  134. package/dist/navigation/useActiveHeadingId.js.map +1 -1
  135. package/dist/navigation/useTableOfContentsHeadings.js +1 -1
  136. package/dist/navigation/useTableOfContentsHeadings.js.map +1 -1
  137. package/dist/navigation/utils.js +6 -5
  138. package/dist/navigation/utils.js.map +1 -1
  139. package/dist/portal/PortalContainerProvider.js +5 -3
  140. package/dist/portal/PortalContainerProvider.js.map +1 -1
  141. package/dist/positioning/getFixedPosition.js +2 -4
  142. package/dist/positioning/getFixedPosition.js.map +1 -1
  143. package/dist/positioning/useFixedPositioning.js +2 -2
  144. package/dist/positioning/useFixedPositioning.js.map +1 -1
  145. package/dist/positioning/utils.js +3 -3
  146. package/dist/positioning/utils.js.map +1 -1
  147. package/dist/scroll/getScrollbarWidth.js +4 -4
  148. package/dist/scroll/getScrollbarWidth.js.map +1 -1
  149. package/dist/searching/fuzzy.js +3 -2
  150. package/dist/searching/fuzzy.js.map +1 -1
  151. package/dist/searching/toSearchQuery.js +1 -1
  152. package/dist/searching/toSearchQuery.js.map +1 -1
  153. package/dist/searching/utils.js +1 -1
  154. package/dist/searching/utils.js.map +1 -1
  155. package/dist/snackbar/Toast.js +1 -1
  156. package/dist/snackbar/Toast.js.map +1 -1
  157. package/dist/snackbar/ToastContent.js +2 -2
  158. package/dist/snackbar/ToastContent.js.map +1 -1
  159. package/dist/snackbar/ToastManager.d.ts +1 -1
  160. package/dist/snackbar/ToastManager.js +11 -11
  161. package/dist/snackbar/ToastManager.js.map +1 -1
  162. package/dist/snackbar/_snackbar.scss +3 -3
  163. package/dist/spinbutton/useSpinButton.js +1 -1
  164. package/dist/spinbutton/useSpinButton.js.map +1 -1
  165. package/dist/spinbutton/utils/deselectNode.js +1 -1
  166. package/dist/spinbutton/utils/deselectNode.js.map +1 -1
  167. package/dist/spinbutton/utils/resolveInputEvent.js +1 -1
  168. package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -1
  169. package/dist/spinbutton/utils/selectNode.js +1 -1
  170. package/dist/spinbutton/utils/selectNode.js.map +1 -1
  171. package/dist/storage/useStorage.js +8 -3
  172. package/dist/storage/useStorage.js.map +1 -1
  173. package/dist/table/useStickyTableSection.js +1 -1
  174. package/dist/table/useStickyTableSection.js.map +1 -1
  175. package/dist/tabs/TabList.js +2 -2
  176. package/dist/tabs/TabList.js.map +1 -1
  177. package/dist/tabs/_tabs.scss +5 -6
  178. package/dist/tabs/useMaxTabPanelHeight.js +4 -3
  179. package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
  180. package/dist/tabs/useTabList.js +1 -1
  181. package/dist/tabs/useTabList.js.map +1 -1
  182. package/dist/test-utils/jest-globals/match-media.d.ts +1 -1
  183. package/dist/test-utils/jest-globals/match-media.js +1 -1
  184. package/dist/test-utils/jest-globals/match-media.js.map +1 -1
  185. package/dist/test-utils/jest-globals/timers.js +1 -1
  186. package/dist/test-utils/jest-globals/timers.js.map +1 -1
  187. package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js +1 -1
  188. package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js.map +1 -1
  189. package/dist/test-utils/mocks/ResizeObserver.js +2 -2
  190. package/dist/test-utils/mocks/ResizeObserver.js.map +1 -1
  191. package/dist/test-utils/polyfills/IntersectionObserver.js +2 -2
  192. package/dist/test-utils/polyfills/IntersectionObserver.js.map +1 -1
  193. package/dist/test-utils/polyfills/ResizeObserver.js +2 -2
  194. package/dist/test-utils/polyfills/ResizeObserver.js.map +1 -1
  195. package/dist/test-utils/polyfills/TextDecoder.js +2 -2
  196. package/dist/test-utils/polyfills/TextDecoder.js.map +1 -1
  197. package/dist/test-utils/polyfills/TextEncoder.js +2 -2
  198. package/dist/test-utils/polyfills/TextEncoder.js.map +1 -1
  199. package/dist/test-utils/polyfills/matchMedia.js +2 -2
  200. package/dist/test-utils/polyfills/matchMedia.js.map +1 -1
  201. package/dist/test-utils/polyfills/offsetParent.js +2 -2
  202. package/dist/test-utils/polyfills/offsetParent.js.map +1 -1
  203. package/dist/test-utils/polyfills/scrollIntoView.js +1 -1
  204. package/dist/test-utils/polyfills/scrollIntoView.js.map +1 -1
  205. package/dist/test-utils/queries/select.js +2 -2
  206. package/dist/test-utils/queries/select.js.map +1 -1
  207. package/dist/test-utils/queries/slider.js +1 -1
  208. package/dist/test-utils/queries/slider.js.map +1 -1
  209. package/dist/test-utils/utils/createFileList.js +2 -0
  210. package/dist/test-utils/utils/createFileList.js.map +1 -1
  211. package/dist/test-utils/utils/createMatchMediaSpy.d.ts +1 -1
  212. package/dist/test-utils/utils/createMatchMediaSpy.js +3 -3
  213. package/dist/test-utils/utils/createMatchMediaSpy.js.map +1 -1
  214. package/dist/test-utils/vitest/match-media.d.ts +1 -1
  215. package/dist/test-utils/vitest/match-media.js +1 -1
  216. package/dist/test-utils/vitest/match-media.js.map +1 -1
  217. package/dist/test-utils/vitest/timers.js +1 -1
  218. package/dist/test-utils/vitest/timers.js.map +1 -1
  219. package/dist/test-utils/vitest/uploadMenuItemFileInput.js +1 -1
  220. package/dist/test-utils/vitest/uploadMenuItemFileInput.js.map +1 -1
  221. package/dist/theme/ThemeProvider.js +2 -2
  222. package/dist/theme/ThemeProvider.js.map +1 -1
  223. package/dist/theme/_a11y.scss +3 -1
  224. package/dist/theme/_theme.scss +16 -12
  225. package/dist/theme/getDerivedTheme.js +1 -1
  226. package/dist/theme/getDerivedTheme.js.map +1 -1
  227. package/dist/theme/useCSSVariables.js +5 -5
  228. package/dist/theme/useCSSVariables.js.map +1 -1
  229. package/dist/theme/useColorSchemeMetaTag.js +2 -2
  230. package/dist/theme/useColorSchemeMetaTag.js.map +1 -1
  231. package/dist/theme/useInlineCSSVariables.js +4 -3
  232. package/dist/theme/useInlineCSSVariables.js.map +1 -1
  233. package/dist/theme/utils.js +8 -8
  234. package/dist/theme/utils.js.map +1 -1
  235. package/dist/tooltip/useTooltip.js +7 -7
  236. package/dist/tooltip/useTooltip.js.map +1 -1
  237. package/dist/tooltip/useTooltipPosition.js +1 -1
  238. package/dist/tooltip/useTooltipPosition.js.map +1 -1
  239. package/dist/transition/useCarousel.js +2 -2
  240. package/dist/transition/useCarousel.js.map +1 -1
  241. package/dist/transition/useCollapseTransition.js +1 -1
  242. package/dist/transition/useCollapseTransition.js.map +1 -1
  243. package/dist/transition/useSkeletonPlaceholder.js +4 -4
  244. package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
  245. package/dist/transition/useTransition.js +2 -2
  246. package/dist/transition/useTransition.js.map +1 -1
  247. package/dist/transition/utils.js +5 -5
  248. package/dist/transition/utils.js.map +1 -1
  249. package/dist/tree/TreeItem.js +1 -1
  250. package/dist/tree/TreeItem.js.map +1 -1
  251. package/dist/tree/useTreeItems.js +7 -5
  252. package/dist/tree/useTreeItems.js.map +1 -1
  253. package/dist/tree/useTreeMovement.js +1 -1
  254. package/dist/tree/useTreeMovement.js.map +1 -1
  255. package/dist/tree/utils.js +6 -9
  256. package/dist/tree/utils.js.map +1 -1
  257. package/dist/typography/HighlightText.js +2 -1
  258. package/dist/typography/HighlightText.js.map +1 -1
  259. package/dist/typography/SrOnly.js +7 -1
  260. package/dist/typography/SrOnly.js.map +1 -1
  261. package/dist/useDebouncedFunction.js +4 -4
  262. package/dist/useDebouncedFunction.js.map +1 -1
  263. package/dist/useDropzone.js +9 -9
  264. package/dist/useDropzone.js.map +1 -1
  265. package/dist/useEnsuredState.js +5 -5
  266. package/dist/useEnsuredState.js.map +1 -1
  267. package/dist/useIntersectionObserver.js +3 -3
  268. package/dist/useIntersectionObserver.js.map +1 -1
  269. package/dist/useIsomorphicLayoutEffect.js +1 -1
  270. package/dist/useIsomorphicLayoutEffect.js.map +1 -1
  271. package/dist/useOrientation.js +1 -1
  272. package/dist/useOrientation.js.map +1 -1
  273. package/dist/useReadonlySet.js +1 -1
  274. package/dist/useReadonlySet.js.map +1 -1
  275. package/dist/useResizeListener.js +2 -2
  276. package/dist/useResizeListener.js.map +1 -1
  277. package/dist/useResizeObserver.js +3 -4
  278. package/dist/useResizeObserver.js.map +1 -1
  279. package/dist/useThrottledFunction.js +3 -3
  280. package/dist/useThrottledFunction.js.map +1 -1
  281. package/dist/useWindowSize.js +1 -1
  282. package/dist/useWindowSize.js.map +1 -1
  283. package/dist/utils/alphaNumericSort.js +3 -1
  284. package/dist/utils/alphaNumericSort.js.map +1 -1
  285. package/dist/utils/bem.js +9 -12
  286. package/dist/utils/bem.js.map +1 -1
  287. package/dist/utils/getNumberOfDigits.js +1 -0
  288. package/dist/utils/getNumberOfDigits.js.map +1 -1
  289. package/dist/utils/getRangeDefaultValue.js +1 -1
  290. package/dist/utils/getRangeDefaultValue.js.map +1 -1
  291. package/dist/utils/nearest.js +2 -2
  292. package/dist/utils/nearest.js.map +1 -1
  293. package/dist/utils/parseCssLengthUnit.js +3 -3
  294. package/dist/utils/parseCssLengthUnit.js.map +1 -1
  295. package/dist/utils/trigonometry.js +1 -1
  296. package/dist/utils/trigonometry.js.map +1 -1
  297. package/dist/window-splitter/_window-splitter.scss +15 -17
  298. package/package.json +9 -7
  299. package/src/autocomplete/AutocompleteChip.tsx +2 -2
  300. package/src/autocomplete/AutocompleteListboxChildren.tsx +1 -1
  301. package/src/autocomplete/useAutocomplete.ts +4 -4
  302. package/src/autocomplete/utils.ts +3 -3
  303. package/src/box/styles.ts +2 -2
  304. package/src/button/AsyncButton.tsx +1 -3
  305. package/src/chip/Chip.tsx +1 -2
  306. package/src/cssUtils.ts +12 -6
  307. package/src/datetime/useTimeField.ts +1 -1
  308. package/src/delegateEvent.ts +9 -9
  309. package/src/draggable/useDraggable.ts +4 -4
  310. package/src/draggable/utils.ts +1 -1
  311. package/src/expansion-panel/ExpansionPanel.tsx +1 -1
  312. package/src/expansion-panel/useExpansionPanels.ts +1 -1
  313. package/src/files/FileInput.tsx +1 -1
  314. package/src/files/createAcceptFromExtensions.ts +18 -0
  315. package/src/files/useFileUpload.ts +36 -37
  316. package/src/files/utils.ts +15 -11
  317. package/src/files/validation.ts +7 -9
  318. package/src/focus/useFocusContainer.ts +1 -1
  319. package/src/focus/utils.ts +11 -6
  320. package/src/form/InputToggleIcon.tsx +5 -5
  321. package/src/form/NativeSelect.tsx +1 -1
  322. package/src/form/Select.tsx +58 -7
  323. package/src/form/SelectedOption.tsx +2 -4
  324. package/src/form/formConfig.ts +1 -1
  325. package/src/form/inputToggleStyles.ts +9 -4
  326. package/src/form/legendStyles.ts +1 -1
  327. package/src/form/selectUtils.ts +2 -2
  328. package/src/form/useCombobox.ts +1 -0
  329. package/src/form/useFormReset.ts +2 -2
  330. package/src/form/useNumberField.ts +1 -1
  331. package/src/form/useResizingTextArea.ts +5 -5
  332. package/src/form/useSelectCombobox.ts +1 -4
  333. package/src/form/validation.ts +1 -1
  334. package/src/hoverMode/useHoverMode.ts +9 -9
  335. package/src/hoverMode/useHoverModeProvider.ts +4 -4
  336. package/src/icon/config.tsx +3 -3
  337. package/src/icon/materialConfig.ts +1 -1
  338. package/src/interaction/UserInteractionModeProvider.tsx +11 -10
  339. package/src/interaction/utils.ts +3 -3
  340. package/src/layout/useExpandableLayout.ts +3 -4
  341. package/src/layout/useMainTabIndex.ts +1 -1
  342. package/src/list/ListItem.tsx +1 -1
  343. package/src/media-queries/AppSizeProvider.tsx +1 -1
  344. package/src/media-queries/config.ts +2 -2
  345. package/src/media-queries/useMediaQuery.ts +3 -3
  346. package/src/menu/Menu.tsx +4 -4
  347. package/src/menu/MenuItemButton.tsx +1 -1
  348. package/src/menu/MenuItemFileInput.tsx +1 -1
  349. package/src/menu/MenuWidget.tsx +6 -4
  350. package/src/movement/findMatchIndex.ts +2 -2
  351. package/src/movement/useKeyboardMovementProvider.ts +2 -2
  352. package/src/movement/utils.ts +15 -14
  353. package/src/navigation/getTableOfContentsHeadings.ts +4 -3
  354. package/src/navigation/useActiveHeadingId.ts +8 -8
  355. package/src/navigation/useTableOfContentsHeadings.ts +1 -1
  356. package/src/navigation/utils.ts +6 -5
  357. package/src/portal/PortalContainerProvider.tsx +5 -3
  358. package/src/positioning/getFixedPosition.ts +9 -6
  359. package/src/positioning/useFixedPositioning.ts +2 -2
  360. package/src/positioning/utils.ts +3 -3
  361. package/src/scroll/getScrollbarWidth.ts +4 -4
  362. package/src/searching/fuzzy.ts +7 -3
  363. package/src/searching/toSearchQuery.ts +1 -1
  364. package/src/searching/utils.ts +1 -1
  365. package/src/snackbar/Toast.tsx +1 -1
  366. package/src/snackbar/ToastContent.tsx +2 -2
  367. package/src/snackbar/ToastManager.ts +11 -12
  368. package/src/spinbutton/useSpinButton.ts +1 -1
  369. package/src/spinbutton/utils/deselectNode.ts +1 -1
  370. package/src/spinbutton/utils/resolveInputEvent.ts +1 -1
  371. package/src/spinbutton/utils/selectNode.ts +1 -1
  372. package/src/storage/useStorage.ts +7 -2
  373. package/src/table/useStickyTableSection.tsx +1 -1
  374. package/src/tabs/TabList.tsx +2 -2
  375. package/src/tabs/useMaxTabPanelHeight.ts +6 -3
  376. package/src/tabs/useTabList.ts +2 -2
  377. package/src/test-utils/jest-globals/match-media.ts +5 -2
  378. package/src/test-utils/jest-globals/timers.ts +1 -1
  379. package/src/test-utils/jest-globals/uploadMenuItemFileInput.ts +1 -1
  380. package/src/test-utils/mocks/ResizeObserver.ts +2 -2
  381. package/src/test-utils/polyfills/IntersectionObserver.ts +2 -2
  382. package/src/test-utils/polyfills/ResizeObserver.ts +2 -2
  383. package/src/test-utils/polyfills/TextDecoder.ts +2 -2
  384. package/src/test-utils/polyfills/TextEncoder.ts +2 -2
  385. package/src/test-utils/polyfills/matchMedia.ts +5 -2
  386. package/src/test-utils/polyfills/offsetParent.ts +2 -2
  387. package/src/test-utils/polyfills/scrollIntoView.ts +1 -1
  388. package/src/test-utils/queries/select.ts +2 -2
  389. package/src/test-utils/queries/slider.ts +1 -1
  390. package/src/test-utils/utils/createFileList.ts +2 -0
  391. package/src/test-utils/utils/createMatchMediaSpy.ts +4 -4
  392. package/src/test-utils/vitest/match-media.ts +2 -2
  393. package/src/test-utils/vitest/timers.ts +1 -1
  394. package/src/test-utils/vitest/uploadMenuItemFileInput.ts +1 -1
  395. package/src/theme/ThemeProvider.tsx +2 -2
  396. package/src/theme/getDerivedTheme.ts +1 -1
  397. package/src/theme/useCSSVariables.ts +5 -5
  398. package/src/theme/useColorSchemeMetaTag.ts +2 -2
  399. package/src/theme/useInlineCSSVariables.ts +6 -7
  400. package/src/theme/utils.ts +8 -8
  401. package/src/tooltip/useTooltip.ts +7 -7
  402. package/src/tooltip/useTooltipPosition.ts +1 -1
  403. package/src/transition/useCarousel.ts +2 -2
  404. package/src/transition/useCollapseTransition.ts +1 -1
  405. package/src/transition/useSkeletonPlaceholder.ts +4 -4
  406. package/src/transition/useTransition.ts +2 -2
  407. package/src/transition/utils.ts +5 -5
  408. package/src/tree/TreeItem.tsx +1 -1
  409. package/src/tree/useTreeItems.ts +5 -5
  410. package/src/tree/useTreeMovement.ts +1 -1
  411. package/src/tree/utils.ts +9 -9
  412. package/src/typography/HighlightText.tsx +4 -3
  413. package/src/typography/SrOnly.tsx +9 -2
  414. package/src/useDebouncedFunction.ts +5 -5
  415. package/src/useDropzone.ts +10 -10
  416. package/src/useEnsuredState.ts +5 -5
  417. package/src/useIntersectionObserver.ts +3 -3
  418. package/src/useIsomorphicLayoutEffect.ts +3 -3
  419. package/src/useOrientation.ts +1 -1
  420. package/src/useReadonlySet.ts +3 -1
  421. package/src/useResizeListener.ts +2 -2
  422. package/src/useResizeObserver.ts +3 -4
  423. package/src/useThrottledFunction.ts +4 -4
  424. package/src/useWindowSize.ts +1 -1
  425. package/src/utils/alphaNumericSort.ts +1 -1
  426. package/src/utils/bem.ts +15 -16
  427. package/src/utils/getNumberOfDigits.ts +1 -0
  428. package/src/utils/getRangeDefaultValue.ts +1 -1
  429. package/src/utils/nearest.ts +5 -2
  430. package/src/utils/parseCssLengthUnit.ts +5 -4
  431. package/src/utils/trigonometry.ts +1 -1
@@ -19,7 +19,7 @@
19
19
  * @since 6.3.0
20
20
  */ export function calcHypotenuse(point) {
21
21
  const { x, y } = point;
22
- return Math.sqrt(x * x + y * y);
22
+ return Math.hypot(x, y);
23
23
  }
24
24
 
25
25
  //# sourceMappingURL=trigonometry.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/trigonometry.ts"],"sourcesContent":["import { type Point } from \"../types.js\";\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const radiansToDegrees = (radians: number): number =>\n (radians * 180) / Math.PI;\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const degreesToRadians = (degrees: number): number =>\n (degrees * Math.PI) / 180;\n\n/**\n * @since 6.3.0\n * @internal\n */\ninterface IsPointInCircleOptions {\n point: Point;\n center: Point;\n radius: number;\n}\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport function isPointInCircle(options: IsPointInCircleOptions): boolean {\n const { point, center, radius } = options;\n\n const distance = (center.x - point.x) ** 2 + (center.y - point.y) ** 2;\n return distance <= radius ** 2;\n}\n\n/**\n * @internal\n * @since 6.3.0\n */\nexport function calcHypotenuse(point: Point): number {\n const { x, y } = point;\n\n return Math.sqrt(x * x + y * y);\n}\n"],"names":["radiansToDegrees","radians","Math","PI","degreesToRadians","degrees","isPointInCircle","options","point","center","radius","distance","x","y","calcHypotenuse","sqrt"],"mappings":"AAEA;;;CAGC,GACD,OAAO,MAAMA,mBAAmB,CAACC,UAC/B,AAACA,UAAU,MAAOC,KAAKC,EAAE,CAAC;AAE5B;;;CAGC,GACD,OAAO,MAAMC,mBAAmB,CAACC,UAC/B,AAACA,UAAUH,KAAKC,EAAE,GAAI,IAAI;AAY5B;;;CAGC,GACD,OAAO,SAASG,gBAAgBC,OAA+B;IAC7D,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAElC,MAAMI,WAAW,AAACF,CAAAA,OAAOG,CAAC,GAAGJ,MAAMI,CAAC,AAADA,KAAM,IAAI,AAACH,CAAAA,OAAOI,CAAC,GAAGL,MAAMK,CAAC,AAADA,KAAM;IACrE,OAAOF,YAAYD,UAAU;AAC/B;AAEA;;;CAGC,GACD,OAAO,SAASI,eAAeN,KAAY;IACzC,MAAM,EAAEI,CAAC,EAAEC,CAAC,EAAE,GAAGL;IAEjB,OAAON,KAAKa,IAAI,CAACH,IAAIA,IAAIC,IAAIA;AAC/B"}
1
+ {"version":3,"sources":["../../src/utils/trigonometry.ts"],"sourcesContent":["import { type Point } from \"../types.js\";\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const radiansToDegrees = (radians: number): number =>\n (radians * 180) / Math.PI;\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport const degreesToRadians = (degrees: number): number =>\n (degrees * Math.PI) / 180;\n\n/**\n * @since 6.3.0\n * @internal\n */\ninterface IsPointInCircleOptions {\n point: Point;\n center: Point;\n radius: number;\n}\n\n/**\n * @since 6.3.0\n * @internal\n */\nexport function isPointInCircle(options: IsPointInCircleOptions): boolean {\n const { point, center, radius } = options;\n\n const distance = (center.x - point.x) ** 2 + (center.y - point.y) ** 2;\n return distance <= radius ** 2;\n}\n\n/**\n * @internal\n * @since 6.3.0\n */\nexport function calcHypotenuse(point: Point): number {\n const { x, y } = point;\n\n return Math.hypot(x, y);\n}\n"],"names":["radiansToDegrees","radians","Math","PI","degreesToRadians","degrees","isPointInCircle","options","point","center","radius","distance","x","y","calcHypotenuse","hypot"],"mappings":"AAEA;;;CAGC,GACD,OAAO,MAAMA,mBAAmB,CAACC,UAC/B,AAACA,UAAU,MAAOC,KAAKC,EAAE,CAAC;AAE5B;;;CAGC,GACD,OAAO,MAAMC,mBAAmB,CAACC,UAC/B,AAACA,UAAUH,KAAKC,EAAE,GAAI,IAAI;AAY5B;;;CAGC,GACD,OAAO,SAASG,gBAAgBC,OAA+B;IAC7D,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAElC,MAAMI,WAAW,AAACF,CAAAA,OAAOG,CAAC,GAAGJ,MAAMI,CAAC,AAADA,KAAM,IAAI,AAACH,CAAAA,OAAOI,CAAC,GAAGL,MAAMK,CAAC,AAADA,KAAM;IACrE,OAAOF,YAAYD,UAAU;AAC/B;AAEA;;;CAGC,GACD,OAAO,SAASI,eAAeN,KAAY;IACzC,MAAM,EAAEI,CAAC,EAAEC,CAAC,EAAE,GAAGL;IAEjB,OAAON,KAAKa,KAAK,CAACH,GAAGC;AACvB"}
@@ -125,12 +125,11 @@ $variables: (
125
125
  /// layer behavior
126
126
  @mixin styles($disable-layer: false) {
127
127
  @if not $disable-everything {
128
+ // prettier-ignore
128
129
  $pseudo-selectors: if(
129
- not $disable-inactive-background-color,
130
- "&::before, ",
131
- ""
132
- ) +
133
- "&::after";
130
+ sass(not $disable-inactive-background-color): "&::before, ";
131
+ else: "",
132
+ ) + "&::after";
134
133
 
135
134
  @include utils.optional-layer(window-splitter, $disable-layer) {
136
135
  .rmd-window-splitter {
@@ -150,14 +149,12 @@ $variables: (
150
149
  }
151
150
 
152
151
  &::after {
153
- @include use-var(
154
- background-color,
155
- $fallback: if(
156
- $background-color == interaction.get-var(focus-color),
157
- $background-color,
158
- null
159
- )
152
+ // prettier-ignore
153
+ $fallback: if(
154
+ sass($background-color == interaction.get-var(focus-color)): $background-color;
155
+ else: null
160
156
  );
157
+ @include use-var(background-color, $fallback: $fallback);
161
158
  @include use-var(opacity);
162
159
 
163
160
  transition: opacity transition.$linear-duration;
@@ -169,14 +166,15 @@ $variables: (
169
166
  }
170
167
 
171
168
  &::before {
169
+ // prettier-ignore
170
+ $fallback: if(
171
+ sass($inactive-background-color == divider.get-var(color)): $inactive-background-color;
172
+ else: null,
173
+ );
172
174
  @include use-var(
173
175
  background-color,
174
176
  inactive-background-color,
175
- if(
176
- $inactive-background-color == divider.get-var(color),
177
- $inactive-background-color,
178
- null
179
- )
177
+ $fallback
180
178
  );
181
179
 
182
180
  pointer-events: none;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-md/core",
3
- "version": "6.4.0",
3
+ "version": "6.5.1",
4
4
  "description": "The core components and functionality for react-md.",
5
5
  "type": "module",
6
6
  "sass": "./dist/_core.scss",
@@ -29,6 +29,7 @@
29
29
  "./autocomplete/AutocompleteListboxChildren": null,
30
30
  "./autocomplete/utils": null,
31
31
  "./error-boundary/context": null,
32
+ "./files/createAcceptFromExtensions": null,
32
33
  "./form/InputToggleIcon": null,
33
34
  "./form/ResizingTextAreaWrapper": null,
34
35
  "./form/SliderTrack": null,
@@ -80,25 +81,25 @@
80
81
  "devDependencies": {
81
82
  "@jest/globals": "^30.2.0",
82
83
  "@jest/types": "^30.2.0",
83
- "@microsoft/api-extractor": "^7.55.1",
84
+ "@microsoft/api-extractor": "^7.55.2",
84
85
  "@swc/cli": "^0.7.9",
85
- "@swc/core": "^1.15.3",
86
+ "@swc/core": "^1.15.7",
86
87
  "@testing-library/dom": "^10.4.1",
87
88
  "@testing-library/jest-dom": "^6.9.1",
88
- "@testing-library/react": "^16.3.0",
89
+ "@testing-library/react": "^16.3.1",
89
90
  "@testing-library/user-event": "^14.6.1",
90
91
  "@trivago/prettier-plugin-sort-imports": "^6.0.0",
91
92
  "@types/lodash": "^4.17.21",
92
- "@types/node": "^24.10.1",
93
+ "@types/node": "^24.10.4",
93
94
  "@types/react": "^18.3.27",
94
95
  "@types/react-dom": "^18.3.7",
95
96
  "@vitejs/plugin-react-swc": "^4.2.2",
96
97
  "@vitest/coverage-v8": "^3.2.4",
97
98
  "chokidar": "^5.0.0",
98
- "eslint": "^9.39.1",
99
+ "eslint": "^9.39.2",
99
100
  "filesize": "^11.0.13",
100
101
  "glob": "13.0.0",
101
- "jsdom": "^27.2.0",
102
+ "jsdom": "^27.3.0",
102
103
  "lodash": "^4.17.21",
103
104
  "lz-string": "^1.5.0",
104
105
  "npm-run-all2": "^8.0.2",
@@ -177,6 +178,7 @@
177
178
  "clean-dist": "rm -rf dist",
178
179
  "clean": "rm -rf .turbo dist node_modules",
179
180
  "typecheck": "tsc --noEmit",
181
+ "typecheck-watch": "pnpm typecheck --watch",
180
182
  "check-format": "prettier --check .",
181
183
  "format": "prettier --write .",
182
184
  "lint-scripts": "eslint \"src/**/*.{ts,tsx,js,jsx,cjs,mjs}\"",
@@ -28,11 +28,11 @@ export const AutocompleteChip = forwardRef<
28
28
  let rightAddon = propRightAddon;
29
29
  let ariaDescription = propAriaDescription;
30
30
  const removeIcon = getIcon("remove", propRemoveIcon);
31
- if (typeof rightAddon === "undefined") {
31
+ if (rightAddon === undefined) {
32
32
  rightAddon = removeIcon;
33
33
  }
34
34
 
35
- if (typeof ariaDescription === "undefined" && typeof children === "string") {
35
+ if (ariaDescription === undefined && typeof children === "string") {
36
36
  ariaDescription = `Remove "${children}"`;
37
37
  }
38
38
 
@@ -49,7 +49,7 @@ export function AutocompleteListboxChildren<Option extends AutocompleteOption>(
49
49
  return (
50
50
  <>
51
51
  {children}
52
- {!availableOptions.length && noOptionsChildren}
52
+ {availableOptions.length === 0 && noOptionsChildren}
53
53
  {availableOptions.map((option, index) => {
54
54
  const label = getOptionLabel(option);
55
55
  const optionProps = getOptionProps({
@@ -136,7 +136,7 @@ export function useAutocomplete<
136
136
  propMultiselect ??
137
137
  (!!value && typeof value === "object" && "length" in value);
138
138
  let updateQueryOnSelect = propUpdateQueryOnSelect;
139
- if (typeof propUpdateQueryOnSelect === "undefined") {
139
+ if (propUpdateQueryOnSelect === undefined) {
140
140
  updateQueryOnSelect = multiselect ? "clear" : "selected";
141
141
  }
142
142
 
@@ -294,13 +294,13 @@ export function useAutocomplete<
294
294
  let unselectedIcon = propUnselectedIcon;
295
295
  let disableSelectedIcon = propDisableSelectedIcon;
296
296
  if (multiselect && checkboxes) {
297
- if (typeof selectedIcon === "undefined") {
297
+ if (selectedIcon === undefined) {
298
298
  selectedIcon = getIcon("checkboxChecked");
299
299
  }
300
- if (typeof unselectedIcon === "undefined") {
300
+ if (unselectedIcon === undefined) {
301
301
  unselectedIcon = getIcon("checkbox");
302
302
  }
303
- } else if (typeof disableSelectedIcon === "undefined") {
303
+ } else if (disableSelectedIcon === undefined) {
304
304
  disableSelectedIcon = true;
305
305
  }
306
306
 
@@ -46,7 +46,7 @@ export function getDefaultValue<Option extends AutocompleteOption>(
46
46
  getOptionLabel,
47
47
  } = options;
48
48
 
49
- if (typeof defaultValue !== "undefined") {
49
+ if (defaultValue !== undefined) {
50
50
  return defaultValue;
51
51
  }
52
52
 
@@ -66,7 +66,7 @@ export function getDefaultValue<Option extends AutocompleteOption>(
66
66
  if (query) {
67
67
  q = query;
68
68
  } else if (defaultQuery) {
69
- q = defaultQuery instanceof Function ? defaultQuery() : defaultQuery;
69
+ q = typeof defaultQuery === "function" ? defaultQuery() : defaultQuery;
70
70
  }
71
71
 
72
72
  if (!q) {
@@ -178,7 +178,7 @@ export function enforceSelectedValue<Option extends AutocompleteOption>(
178
178
  return;
179
179
  }
180
180
 
181
- window.requestAnimationFrame(() => {
181
+ globalThis.requestAnimationFrame(() => {
182
182
  if (
183
183
  container.contains(document.activeElement) ||
184
184
  popupRef.current?.contains(document.activeElement)
package/src/box/styles.ts CHANGED
@@ -428,14 +428,14 @@ function applyBoxVarGroup(
428
428
  value,
429
429
  });
430
430
  if (value && typeof value === "object") {
431
- BREAKPOINTS.forEach((media) => {
431
+ for (const media of BREAKPOINTS) {
432
432
  style = applyBoxVar({
433
433
  type,
434
434
  style,
435
435
  media,
436
436
  value: value[media],
437
437
  });
438
- });
438
+ }
439
439
  }
440
440
  return style;
441
441
  }
@@ -310,9 +310,7 @@ export const AsyncButton = forwardRef<HTMLButtonElement, AsyncButtonProps>(
310
310
  onClick={handleAsync((event) => Promise.resolve(onClick(event)))}
311
311
  >
312
312
  {beforeAddon}
313
- {loading && typeof loadingChildren !== "undefined"
314
- ? loadingChildren
315
- : children}
313
+ {loading && loadingChildren !== undefined ? loadingChildren : children}
316
314
  {afterAddon}
317
315
  {overlayElement}
318
316
  </Button>
package/src/chip/Chip.tsx CHANGED
@@ -271,8 +271,7 @@ export const Chip = forwardRef<HTMLButtonElement, ChipProps>(
271
271
  const isTransitionable =
272
272
  !selectedThemed &&
273
273
  typeof selected === "boolean" &&
274
- typeof (selectedIconAfter ? propRightAddon : propLeftAddon) ===
275
- "undefined";
274
+ (selectedIconAfter ? propRightAddon : propLeftAddon) === undefined;
276
275
  const selectedIcon = useMaxWidthTransition({
277
276
  element: selectedIconNode,
278
277
  transitionIn: !!selected,
package/src/cssUtils.ts CHANGED
@@ -115,6 +115,16 @@ export interface TextCssUtilsOptions {
115
115
  textOverflow?: TextOverflow;
116
116
  }
117
117
 
118
+ /**
119
+ * Set this to `true` to allow the content to only be visible for screen
120
+ * readers. Set this to `"focusable"` to allow the content to be visible to
121
+ * screen readers and once focused. Set this to `"phone"` to only render the
122
+ * content as screen reader only text on phones.
123
+ *
124
+ * @since 6.5.1
125
+ */
126
+ export type SrOnlyBehavior = boolean | "focusable" | "phone";
127
+
118
128
  /**
119
129
  * @since 6.0.0
120
130
  */
@@ -122,14 +132,10 @@ export interface CssUtilsOptions extends TextCssUtilsOptions {
122
132
  className?: string;
123
133
 
124
134
  /**
125
- * Set this to `true` to allow the content to only be visible for screen
126
- * readers. Set this to `"focusable"` to allow the content to be visible to
127
- * screen readers and once focused. Set this to `"phone"` to only render the
128
- * the content as screen reader only text on phones.
129
- *
135
+ * @see {@link SrOnlyBehavior}
130
136
  * @defaultValue `false`
131
137
  */
132
- srOnly?: boolean | "focusable" | "phone";
138
+ srOnly?: SrOnlyBehavior;
133
139
 
134
140
  /**
135
141
  * Set this to `"current-color"` to inherit the current text color or a
@@ -201,7 +201,7 @@ export function useTimeField(
201
201
  const { min, max, step, ...fieldOptions } = options;
202
202
  if (
203
203
  process.env.NODE_ENV !== "production" &&
204
- typeof step !== "undefined" &&
204
+ step !== undefined &&
205
205
  (!min || !max)
206
206
  ) {
207
207
  throw new Error(
@@ -49,8 +49,8 @@ function createEventHandler(
49
49
  ): (event: WindowEventMap[keyof WindowEventMap]) => void {
50
50
  let running = false;
51
51
  const runCallbacks = (event: WindowEventMap[keyof WindowEventMap]) => () => {
52
- for (let i = 0; i < callbacks.length; i += 1) {
53
- callbacks[i](event);
52
+ for (const callback of callbacks) {
53
+ callback(event);
54
54
  }
55
55
 
56
56
  running = false;
@@ -67,7 +67,7 @@ function createEventHandler(
67
67
  }
68
68
 
69
69
  running = true;
70
- window.requestAnimationFrame(runCallbacks(event));
70
+ globalThis.requestAnimationFrame(runCallbacks(event));
71
71
  };
72
72
  }
73
73
 
@@ -77,7 +77,7 @@ function createEventHandler(
77
77
  */
78
78
  function createDelegatedEventHandler(
79
79
  eventType: string,
80
- eventTarget: DelegatedEventTarget = window,
80
+ eventTarget: DelegatedEventTarget = globalThis.window,
81
81
  throttle = false,
82
82
  options?: boolean | AddEventListenerOptions
83
83
  ): DelegatedEventHandler {
@@ -91,11 +91,11 @@ function createDelegatedEventHandler(
91
91
  * event will also be started.
92
92
  */
93
93
  add: (callback: EventListener) => {
94
- if (!callbacks.length) {
94
+ if (callbacks.length === 0) {
95
95
  eventTarget.addEventListener(eventType, handler, options);
96
96
  }
97
97
 
98
- if (callbacks.indexOf(callback) === -1) {
98
+ if (!callbacks.includes(callback)) {
99
99
  callbacks.push(callback);
100
100
  }
101
101
  },
@@ -107,10 +107,10 @@ function createDelegatedEventHandler(
107
107
  */
108
108
  remove: (callback: EventListener) => {
109
109
  const i = callbacks.indexOf(callback);
110
- if (i >= 0) {
110
+ if (i !== -1) {
111
111
  callbacks.splice(i, 1);
112
112
 
113
- if (!callbacks.length) {
113
+ if (callbacks.length === 0) {
114
114
  eventTarget.removeEventListener(eventType, handler, options);
115
115
  }
116
116
  }
@@ -145,7 +145,7 @@ function createDelegatedEventHandler(
145
145
  */
146
146
  export function delegateEvent(
147
147
  eventType: string,
148
- eventTarget: DelegatedEventTarget = window,
148
+ eventTarget: DelegatedEventTarget = globalThis.window,
149
149
  throttle: boolean = eventType === "resize" || eventType === "scroll",
150
150
  options?: boolean | AddEventListenerOptions
151
151
  ): DelegatedEventHandler {
@@ -477,11 +477,11 @@ export function useDraggable<E extends HTMLElement>(
477
477
  const stopKey = isTouch ? "touchend" : "mouseup";
478
478
  const passive = isTouch ? { passive: false } : undefined;
479
479
 
480
- window.addEventListener(updateKey, updatePosition, passive);
481
- window.addEventListener(stopKey, stopDragging);
480
+ globalThis.addEventListener(updateKey, updatePosition, passive);
481
+ globalThis.addEventListener(stopKey, stopDragging);
482
482
  return () => {
483
- window.removeEventListener(updateKey, updatePosition);
484
- window.removeEventListener(stopKey, stopDragging);
483
+ globalThis.removeEventListener(updateKey, updatePosition);
484
+ globalThis.removeEventListener(stopKey, stopDragging);
485
485
  };
486
486
  }, [
487
487
  dragging,
@@ -232,7 +232,7 @@ export function deserializeDraggableValue(
232
232
  ): number {
233
233
  const { item, min, max } = options;
234
234
 
235
- const value = parseFloat(item);
235
+ const value = Number.parseFloat(item);
236
236
  if (Number.isNaN(item)) {
237
237
  return min;
238
238
  }
@@ -241,7 +241,7 @@ export const ExpansionPanel = forwardRef<
241
241
  });
242
242
 
243
243
  let header = propHeader;
244
- if (typeof header === "undefined") {
244
+ if (header === undefined) {
245
245
  header = (
246
246
  <ExpansionPanelHeader
247
247
  style={headerStyle}
@@ -215,7 +215,7 @@ export function useExpansionPanels(
215
215
  } = useReadonlySet({
216
216
  toggleType: multiple ? "multiple" : "single",
217
217
  defaultValue: () => {
218
- if (typeof defaultExpandedIds === "undefined") {
218
+ if (defaultExpandedIds === undefined) {
219
219
  const initialList: string[] = [];
220
220
  if (typeof defaultExpandedIndex === "number" || preventAllCollapsed) {
221
221
  initialList.push(createId(defaultExpandedIndex ?? 0));
@@ -166,7 +166,7 @@ export const FileInput = forwardRef<HTMLInputElement, FileInputProps>(
166
166
  const icon = getIcon("upload", propIcon);
167
167
  let children = propChildren;
168
168
  if (
169
- typeof propChildren === "undefined" &&
169
+ propChildren === undefined &&
170
170
  !props["aria-label"] &&
171
171
  !props["aria-labelledby"]
172
172
  ) {
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @since 6.5.1
3
+ * @internal
4
+ */
5
+ export function createAcceptFromExtensions(
6
+ extensions: readonly string[]
7
+ ): string {
8
+ let accept = "";
9
+ for (const extension of extensions) {
10
+ if (accept) {
11
+ accept += ",";
12
+ }
13
+
14
+ accept += `.${extension}`;
15
+ }
16
+
17
+ return accept;
18
+ }
@@ -9,6 +9,7 @@ import {
9
9
  useReducer,
10
10
  } from "react";
11
11
 
12
+ import { createAcceptFromExtensions } from "./createAcceptFromExtensions.js";
12
13
  import {
13
14
  type CompletedFileUploadStats,
14
15
  type FileReaderResult,
@@ -259,28 +260,27 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
259
260
  stats,
260
261
  };
261
262
  }
262
- case "queue":
263
+ case "queue": {
264
+ const nextStats: Record<string, ProcessingFileUploadStats> = {};
265
+ for (const file of action.files) {
266
+ const key = nanoid();
267
+ nextStats[key] = {
268
+ key,
269
+ file,
270
+ progress: 0,
271
+ status: "pending",
272
+ };
273
+ }
274
+
263
275
  return {
264
276
  ...state,
265
277
  stats: {
266
278
  ...state.stats,
267
- ...action.files.reduce<Record<string, ProcessingFileUploadStats>>(
268
- (files, file) => {
269
- const key = nanoid();
270
- files[key] = {
271
- key,
272
- file,
273
- progress: 0,
274
- status: "pending",
275
- };
276
-
277
- return files;
278
- },
279
- {}
280
- ),
279
+ ...nextStats,
281
280
  },
282
281
  errors: [...state.errors, ...action.errors],
283
282
  };
283
+ }
284
284
  case "start": {
285
285
  const { key, reader } = action;
286
286
  const fileStats: ProcessingFileUploadStats = {
@@ -389,14 +389,16 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
389
389
  try {
390
390
  const files = event.dataTransfer.files;
391
391
  if (files) {
392
- queueFiles(Array.from(files));
392
+ queueFiles([...files]);
393
393
  }
394
- } catch (e) {
394
+ } catch (error) {
395
395
  dispatch({
396
396
  type: "queue",
397
397
  files: [],
398
398
  errors: [
399
- new FileAccessError(e instanceof Error ? e.message : undefined),
399
+ new FileAccessError(
400
+ error instanceof Error ? error.message : undefined
401
+ ),
400
402
  ],
401
403
  });
402
404
  }
@@ -409,16 +411,18 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
409
411
  try {
410
412
  const files = event.currentTarget.files;
411
413
  if (files) {
412
- queueFiles(Array.from(files));
414
+ queueFiles([...files]);
413
415
  } else {
414
- throw new Error();
416
+ throw new Error("There are no files");
415
417
  }
416
- } catch (e) {
418
+ } catch (error) {
417
419
  dispatch({
418
420
  type: "queue",
419
421
  files: [],
420
422
  errors: [
421
- new FileAccessError(e instanceof Error ? e.message : undefined),
423
+ new FileAccessError(
424
+ error instanceof Error ? error.message : undefined
425
+ ),
422
426
  ],
423
427
  });
424
428
  }
@@ -429,18 +433,18 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
429
433
  const remove = useCallback(
430
434
  (keyOrKeys: string | readonly string[]) => {
431
435
  const files = typeof keyOrKeys === "string" ? [keyOrKeys] : keyOrKeys;
432
- files.forEach((fileKey) => {
436
+ for (const fileKey of files) {
433
437
  readers[fileKey]?.abort();
434
- });
438
+ }
435
439
 
436
440
  dispatch({ type: "remove", files });
437
441
  },
438
442
  [readers]
439
443
  );
440
444
  const reset = useCallback(() => {
441
- Object.values(readers).forEach((reader) => {
445
+ for (const reader of Object.values(readers)) {
442
446
  reader.abort();
443
- });
447
+ }
444
448
 
445
449
  dispatch({ type: "reset" });
446
450
  }, [readers]);
@@ -469,24 +473,24 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
469
473
  useEffect(() => {
470
474
  const pending: ProcessingFileUploadStats[] = [];
471
475
  const uploading: ProcessingFileUploadStats[] = [];
472
- Object.values(stats).forEach((file) => {
476
+ for (const file of Object.values(stats)) {
473
477
  if (file.status === "pending") {
474
478
  pending.push(file);
475
479
  } else if (file.status === "uploading") {
476
480
  uploading.push(file);
477
481
  }
478
- });
482
+ }
479
483
 
480
484
  const lastIndex =
481
485
  concurrency === -1
482
486
  ? pending.length
483
487
  : Math.max(0, concurrency - uploading.length);
484
488
  const queue = pending.slice(0, lastIndex);
485
- if (!queue.length) {
489
+ if (queue.length === 0) {
486
490
  return;
487
491
  }
488
492
 
489
- queue.forEach((stats) => {
493
+ for (const stats of queue) {
490
494
  const { key, file } = stats;
491
495
  const reader = new FileReader();
492
496
 
@@ -508,7 +512,7 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
508
512
  }
509
513
 
510
514
  reader[parser](file);
511
- });
515
+ }
512
516
  }, [
513
517
  concurrency,
514
518
  stats,
@@ -518,15 +522,10 @@ export function useFileUpload<E extends HTMLElement, CustomError = never>(
518
522
  complete,
519
523
  ]);
520
524
 
521
- let accept = "";
522
- if (extensions.length) {
523
- accept = extensions.reduce((s, ext) => `${s ? `${s},` : ""}.${ext}`, "");
524
- }
525
-
526
525
  return {
527
526
  stats: statsList,
528
527
  errors,
529
- accept,
528
+ accept: createAcceptFromExtensions(extensions),
530
529
  totalBytes,
531
530
  totalFiles,
532
531
  onDrop,
@@ -247,18 +247,22 @@ export function getSplitFileUploads(
247
247
  const pending: ProcessingFileUploadStats[] = [];
248
248
  const uploading: ProcessingFileUploadStats[] = [];
249
249
  const complete: CompletedFileUploadStats[] = [];
250
- stats.forEach((stat) => {
251
- if (stat.status === "pending") {
252
- pending.push(stat);
253
- } else if (stat.status === "uploading") {
254
- uploading.push(stat);
255
- } else if (stat.status === "complete") {
256
- complete.push(stat);
257
- } else {
258
- /* istanbul ignore next */
259
- throw new Error("Invalid upload stat");
250
+ for (const stat of stats) {
251
+ switch (stat.status) {
252
+ case "pending":
253
+ pending.push(stat);
254
+ break;
255
+ case "uploading":
256
+ uploading.push(stat);
257
+ break;
258
+ case "complete":
259
+ complete.push(stat);
260
+ break;
261
+ default:
262
+ /* istanbul ignore next */
263
+ throw new Error("Invalid upload stat");
260
264
  }
261
- });
265
+ }
262
266
 
263
267
  return { pending, uploading, complete };
264
268
  }