@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.
- package/dist/_a11y.scss +3 -1
- package/dist/_box-shadows.scss +20 -12
- package/dist/_core.scss +1 -1
- package/dist/_utils.scss +26 -11
- package/dist/app-bar/_app-bar.scss +3 -3
- package/dist/autocomplete/AutocompleteChip.js +2 -2
- package/dist/autocomplete/AutocompleteChip.js.map +1 -1
- package/dist/autocomplete/AutocompleteListboxChildren.js +1 -1
- package/dist/autocomplete/AutocompleteListboxChildren.js.map +1 -1
- package/dist/autocomplete/_autocomplete.scss +20 -16
- package/dist/autocomplete/useAutocomplete.js +4 -4
- package/dist/autocomplete/useAutocomplete.js.map +1 -1
- package/dist/autocomplete/utils.js +3 -3
- package/dist/autocomplete/utils.js.map +1 -1
- package/dist/avatar/_avatar.scss +2 -1
- package/dist/box/styles.js +2 -2
- package/dist/box/styles.js.map +1 -1
- package/dist/button/AsyncButton.js +1 -1
- package/dist/button/AsyncButton.js.map +1 -1
- package/dist/button/_button.scss +9 -5
- package/dist/card/_card.scss +6 -6
- package/dist/chip/Chip.js +1 -1
- package/dist/chip/Chip.js.map +1 -1
- package/dist/chip/_chip.scss +6 -6
- package/dist/cssUtils.d.ts +11 -6
- package/dist/cssUtils.js.map +1 -1
- package/dist/datetime/useTimeField.js +1 -1
- package/dist/datetime/useTimeField.js.map +1 -1
- package/dist/delegateEvent.js +9 -9
- package/dist/delegateEvent.js.map +1 -1
- package/dist/dialog/_dialog.scss +6 -6
- package/dist/divider/_divider.scss +6 -2
- package/dist/draggable/useDraggable.js +4 -4
- package/dist/draggable/useDraggable.js.map +1 -1
- package/dist/draggable/utils.js +1 -1
- package/dist/draggable/utils.js.map +1 -1
- package/dist/expansion-panel/ExpansionPanel.js +1 -1
- package/dist/expansion-panel/ExpansionPanel.js.map +1 -1
- package/dist/expansion-panel/useExpansionPanels.js +1 -1
- package/dist/expansion-panel/useExpansionPanels.js.map +1 -1
- package/dist/files/FileInput.js +1 -1
- package/dist/files/FileInput.js.map +1 -1
- package/dist/files/createAcceptFromExtensions.d.ts +5 -0
- package/dist/files/createAcceptFromExtensions.js +15 -0
- package/dist/files/createAcceptFromExtensions.js.map +1 -0
- package/dist/files/useFileUpload.js +45 -41
- package/dist/files/useFileUpload.js.map +1 -1
- package/dist/files/utils.js +14 -10
- package/dist/files/utils.js.map +1 -1
- package/dist/files/validation.js +7 -8
- package/dist/files/validation.js.map +1 -1
- package/dist/focus/useFocusContainer.js +1 -1
- package/dist/focus/useFocusContainer.js.map +1 -1
- package/dist/focus/utils.js +12 -7
- package/dist/focus/utils.js.map +1 -1
- package/dist/form/InputToggleIcon.js +5 -1
- package/dist/form/InputToggleIcon.js.map +1 -1
- package/dist/form/NativeSelect.js +1 -1
- package/dist/form/NativeSelect.js.map +1 -1
- package/dist/form/Select.d.ts +24 -0
- package/dist/form/Select.js +19 -8
- package/dist/form/Select.js.map +1 -1
- package/dist/form/SelectedOption.d.ts +1 -2
- package/dist/form/SelectedOption.js +2 -2
- package/dist/form/SelectedOption.js.map +1 -1
- package/dist/form/_input-toggle.scss +6 -5
- package/dist/form/_label.scss +2 -2
- package/dist/form/_legend.scss +22 -13
- package/dist/form/_slider.scss +7 -5
- package/dist/form/_switch.scss +7 -5
- package/dist/form/_text-field.scss +13 -11
- package/dist/form/formConfig.js +1 -1
- package/dist/form/formConfig.js.map +1 -1
- package/dist/form/inputToggleStyles.js +7 -1
- package/dist/form/inputToggleStyles.js.map +1 -1
- package/dist/form/legendStyles.d.ts +1 -1
- package/dist/form/legendStyles.js.map +1 -1
- package/dist/form/selectUtils.js +2 -2
- package/dist/form/selectUtils.js.map +1 -1
- package/dist/form/useCombobox.js +1 -0
- package/dist/form/useCombobox.js.map +1 -1
- package/dist/form/useFormReset.js +2 -2
- package/dist/form/useFormReset.js.map +1 -1
- package/dist/form/useNumberField.js +1 -1
- package/dist/form/useNumberField.js.map +1 -1
- package/dist/form/useResizingTextArea.js +4 -4
- package/dist/form/useResizingTextArea.js.map +1 -1
- package/dist/form/useSelectCombobox.js +1 -1
- package/dist/form/useSelectCombobox.js.map +1 -1
- package/dist/form/validation.js +1 -1
- package/dist/form/validation.js.map +1 -1
- package/dist/hoverMode/useHoverMode.js +8 -8
- package/dist/hoverMode/useHoverMode.js.map +1 -1
- package/dist/hoverMode/useHoverModeProvider.js +3 -3
- package/dist/hoverMode/useHoverModeProvider.js.map +1 -1
- package/dist/icon/config.js +3 -3
- package/dist/icon/config.js.map +1 -1
- package/dist/icon/materialConfig.js +1 -1
- package/dist/icon/materialConfig.js.map +1 -1
- package/dist/interaction/UserInteractionModeProvider.js +11 -10
- package/dist/interaction/UserInteractionModeProvider.js.map +1 -1
- package/dist/interaction/_interaction.scss +5 -3
- package/dist/interaction/utils.js +7 -3
- package/dist/interaction/utils.js.map +1 -1
- package/dist/layout/useExpandableLayout.js +3 -4
- package/dist/layout/useExpandableLayout.js.map +1 -1
- package/dist/layout/useMainTabIndex.js +1 -1
- package/dist/layout/useMainTabIndex.js.map +1 -1
- package/dist/list/ListItem.js +1 -1
- package/dist/list/ListItem.js.map +1 -1
- package/dist/media-queries/AppSizeProvider.js +1 -1
- package/dist/media-queries/AppSizeProvider.js.map +1 -1
- package/dist/media-queries/config.js +2 -2
- package/dist/media-queries/config.js.map +1 -1
- package/dist/media-queries/useMediaQuery.js +3 -3
- package/dist/media-queries/useMediaQuery.js.map +1 -1
- package/dist/menu/Menu.js +4 -4
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/MenuItemButton.js +1 -1
- package/dist/menu/MenuItemButton.js.map +1 -1
- package/dist/menu/MenuItemFileInput.js +1 -1
- package/dist/menu/MenuItemFileInput.js.map +1 -1
- package/dist/menu/MenuWidget.js +2 -2
- package/dist/menu/MenuWidget.js.map +1 -1
- package/dist/movement/findMatchIndex.js +2 -2
- package/dist/movement/findMatchIndex.js.map +1 -1
- package/dist/movement/useKeyboardMovementProvider.js +2 -2
- package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
- package/dist/movement/utils.js +12 -10
- package/dist/movement/utils.js.map +1 -1
- package/dist/navigation/getTableOfContentsHeadings.js +4 -3
- package/dist/navigation/getTableOfContentsHeadings.js.map +1 -1
- package/dist/navigation/useActiveHeadingId.js +9 -9
- package/dist/navigation/useActiveHeadingId.js.map +1 -1
- package/dist/navigation/useTableOfContentsHeadings.js +1 -1
- package/dist/navigation/useTableOfContentsHeadings.js.map +1 -1
- package/dist/navigation/utils.js +6 -5
- package/dist/navigation/utils.js.map +1 -1
- package/dist/portal/PortalContainerProvider.js +5 -3
- package/dist/portal/PortalContainerProvider.js.map +1 -1
- package/dist/positioning/getFixedPosition.js +2 -4
- package/dist/positioning/getFixedPosition.js.map +1 -1
- package/dist/positioning/useFixedPositioning.js +2 -2
- package/dist/positioning/useFixedPositioning.js.map +1 -1
- package/dist/positioning/utils.js +3 -3
- package/dist/positioning/utils.js.map +1 -1
- package/dist/scroll/getScrollbarWidth.js +4 -4
- package/dist/scroll/getScrollbarWidth.js.map +1 -1
- package/dist/searching/fuzzy.js +3 -2
- package/dist/searching/fuzzy.js.map +1 -1
- package/dist/searching/toSearchQuery.js +1 -1
- package/dist/searching/toSearchQuery.js.map +1 -1
- package/dist/searching/utils.js +1 -1
- package/dist/searching/utils.js.map +1 -1
- package/dist/snackbar/Toast.js +1 -1
- package/dist/snackbar/Toast.js.map +1 -1
- package/dist/snackbar/ToastContent.js +2 -2
- package/dist/snackbar/ToastContent.js.map +1 -1
- package/dist/snackbar/ToastManager.d.ts +1 -1
- package/dist/snackbar/ToastManager.js +11 -11
- package/dist/snackbar/ToastManager.js.map +1 -1
- package/dist/snackbar/_snackbar.scss +3 -3
- package/dist/spinbutton/useSpinButton.js +1 -1
- package/dist/spinbutton/useSpinButton.js.map +1 -1
- package/dist/spinbutton/utils/deselectNode.js +1 -1
- package/dist/spinbutton/utils/deselectNode.js.map +1 -1
- package/dist/spinbutton/utils/resolveInputEvent.js +1 -1
- package/dist/spinbutton/utils/resolveInputEvent.js.map +1 -1
- package/dist/spinbutton/utils/selectNode.js +1 -1
- package/dist/spinbutton/utils/selectNode.js.map +1 -1
- package/dist/storage/useStorage.js +8 -3
- package/dist/storage/useStorage.js.map +1 -1
- package/dist/table/useStickyTableSection.js +1 -1
- package/dist/table/useStickyTableSection.js.map +1 -1
- package/dist/tabs/TabList.js +2 -2
- package/dist/tabs/TabList.js.map +1 -1
- package/dist/tabs/_tabs.scss +5 -6
- package/dist/tabs/useMaxTabPanelHeight.js +4 -3
- package/dist/tabs/useMaxTabPanelHeight.js.map +1 -1
- package/dist/tabs/useTabList.js +1 -1
- package/dist/tabs/useTabList.js.map +1 -1
- package/dist/test-utils/jest-globals/match-media.d.ts +1 -1
- package/dist/test-utils/jest-globals/match-media.js +1 -1
- package/dist/test-utils/jest-globals/match-media.js.map +1 -1
- package/dist/test-utils/jest-globals/timers.js +1 -1
- package/dist/test-utils/jest-globals/timers.js.map +1 -1
- package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js +1 -1
- package/dist/test-utils/jest-globals/uploadMenuItemFileInput.js.map +1 -1
- package/dist/test-utils/mocks/ResizeObserver.js +2 -2
- package/dist/test-utils/mocks/ResizeObserver.js.map +1 -1
- package/dist/test-utils/polyfills/IntersectionObserver.js +2 -2
- package/dist/test-utils/polyfills/IntersectionObserver.js.map +1 -1
- package/dist/test-utils/polyfills/ResizeObserver.js +2 -2
- package/dist/test-utils/polyfills/ResizeObserver.js.map +1 -1
- package/dist/test-utils/polyfills/TextDecoder.js +2 -2
- package/dist/test-utils/polyfills/TextDecoder.js.map +1 -1
- package/dist/test-utils/polyfills/TextEncoder.js +2 -2
- package/dist/test-utils/polyfills/TextEncoder.js.map +1 -1
- package/dist/test-utils/polyfills/matchMedia.js +2 -2
- package/dist/test-utils/polyfills/matchMedia.js.map +1 -1
- package/dist/test-utils/polyfills/offsetParent.js +2 -2
- package/dist/test-utils/polyfills/offsetParent.js.map +1 -1
- package/dist/test-utils/polyfills/scrollIntoView.js +1 -1
- package/dist/test-utils/polyfills/scrollIntoView.js.map +1 -1
- package/dist/test-utils/queries/select.js +2 -2
- package/dist/test-utils/queries/select.js.map +1 -1
- package/dist/test-utils/queries/slider.js +1 -1
- package/dist/test-utils/queries/slider.js.map +1 -1
- package/dist/test-utils/utils/createFileList.js +2 -0
- package/dist/test-utils/utils/createFileList.js.map +1 -1
- package/dist/test-utils/utils/createMatchMediaSpy.d.ts +1 -1
- package/dist/test-utils/utils/createMatchMediaSpy.js +3 -3
- package/dist/test-utils/utils/createMatchMediaSpy.js.map +1 -1
- package/dist/test-utils/vitest/match-media.d.ts +1 -1
- package/dist/test-utils/vitest/match-media.js +1 -1
- package/dist/test-utils/vitest/match-media.js.map +1 -1
- package/dist/test-utils/vitest/timers.js +1 -1
- package/dist/test-utils/vitest/timers.js.map +1 -1
- package/dist/test-utils/vitest/uploadMenuItemFileInput.js +1 -1
- package/dist/test-utils/vitest/uploadMenuItemFileInput.js.map +1 -1
- package/dist/theme/ThemeProvider.js +2 -2
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/_a11y.scss +3 -1
- package/dist/theme/_theme.scss +16 -12
- package/dist/theme/getDerivedTheme.js +1 -1
- package/dist/theme/getDerivedTheme.js.map +1 -1
- package/dist/theme/useCSSVariables.js +5 -5
- package/dist/theme/useCSSVariables.js.map +1 -1
- package/dist/theme/useColorSchemeMetaTag.js +2 -2
- package/dist/theme/useColorSchemeMetaTag.js.map +1 -1
- package/dist/theme/useInlineCSSVariables.js +4 -3
- package/dist/theme/useInlineCSSVariables.js.map +1 -1
- package/dist/theme/utils.js +8 -8
- package/dist/theme/utils.js.map +1 -1
- package/dist/tooltip/useTooltip.js +7 -7
- package/dist/tooltip/useTooltip.js.map +1 -1
- package/dist/tooltip/useTooltipPosition.js +1 -1
- package/dist/tooltip/useTooltipPosition.js.map +1 -1
- package/dist/transition/useCarousel.js +2 -2
- package/dist/transition/useCarousel.js.map +1 -1
- package/dist/transition/useCollapseTransition.js +1 -1
- package/dist/transition/useCollapseTransition.js.map +1 -1
- package/dist/transition/useSkeletonPlaceholder.js +4 -4
- package/dist/transition/useSkeletonPlaceholder.js.map +1 -1
- package/dist/transition/useTransition.js +2 -2
- package/dist/transition/useTransition.js.map +1 -1
- package/dist/transition/utils.js +5 -5
- package/dist/transition/utils.js.map +1 -1
- package/dist/tree/TreeItem.js +1 -1
- package/dist/tree/TreeItem.js.map +1 -1
- package/dist/tree/useTreeItems.js +7 -5
- package/dist/tree/useTreeItems.js.map +1 -1
- package/dist/tree/useTreeMovement.js +1 -1
- package/dist/tree/useTreeMovement.js.map +1 -1
- package/dist/tree/utils.js +6 -9
- package/dist/tree/utils.js.map +1 -1
- package/dist/typography/HighlightText.js +2 -1
- package/dist/typography/HighlightText.js.map +1 -1
- package/dist/typography/SrOnly.js +7 -1
- package/dist/typography/SrOnly.js.map +1 -1
- package/dist/useDebouncedFunction.js +4 -4
- package/dist/useDebouncedFunction.js.map +1 -1
- package/dist/useDropzone.js +9 -9
- package/dist/useDropzone.js.map +1 -1
- package/dist/useEnsuredState.js +5 -5
- package/dist/useEnsuredState.js.map +1 -1
- package/dist/useIntersectionObserver.js +3 -3
- package/dist/useIntersectionObserver.js.map +1 -1
- package/dist/useIsomorphicLayoutEffect.js +1 -1
- package/dist/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/useOrientation.js +1 -1
- package/dist/useOrientation.js.map +1 -1
- package/dist/useReadonlySet.js +1 -1
- package/dist/useReadonlySet.js.map +1 -1
- package/dist/useResizeListener.js +2 -2
- package/dist/useResizeListener.js.map +1 -1
- package/dist/useResizeObserver.js +3 -4
- package/dist/useResizeObserver.js.map +1 -1
- package/dist/useThrottledFunction.js +3 -3
- package/dist/useThrottledFunction.js.map +1 -1
- package/dist/useWindowSize.js +1 -1
- package/dist/useWindowSize.js.map +1 -1
- package/dist/utils/alphaNumericSort.js +3 -1
- package/dist/utils/alphaNumericSort.js.map +1 -1
- package/dist/utils/bem.js +9 -12
- package/dist/utils/bem.js.map +1 -1
- package/dist/utils/getNumberOfDigits.js +1 -0
- package/dist/utils/getNumberOfDigits.js.map +1 -1
- package/dist/utils/getRangeDefaultValue.js +1 -1
- package/dist/utils/getRangeDefaultValue.js.map +1 -1
- package/dist/utils/nearest.js +2 -2
- package/dist/utils/nearest.js.map +1 -1
- package/dist/utils/parseCssLengthUnit.js +3 -3
- package/dist/utils/parseCssLengthUnit.js.map +1 -1
- package/dist/utils/trigonometry.js +1 -1
- package/dist/utils/trigonometry.js.map +1 -1
- package/dist/window-splitter/_window-splitter.scss +15 -17
- package/package.json +9 -7
- package/src/autocomplete/AutocompleteChip.tsx +2 -2
- package/src/autocomplete/AutocompleteListboxChildren.tsx +1 -1
- package/src/autocomplete/useAutocomplete.ts +4 -4
- package/src/autocomplete/utils.ts +3 -3
- package/src/box/styles.ts +2 -2
- package/src/button/AsyncButton.tsx +1 -3
- package/src/chip/Chip.tsx +1 -2
- package/src/cssUtils.ts +12 -6
- package/src/datetime/useTimeField.ts +1 -1
- package/src/delegateEvent.ts +9 -9
- package/src/draggable/useDraggable.ts +4 -4
- package/src/draggable/utils.ts +1 -1
- package/src/expansion-panel/ExpansionPanel.tsx +1 -1
- package/src/expansion-panel/useExpansionPanels.ts +1 -1
- package/src/files/FileInput.tsx +1 -1
- package/src/files/createAcceptFromExtensions.ts +18 -0
- package/src/files/useFileUpload.ts +36 -37
- package/src/files/utils.ts +15 -11
- package/src/files/validation.ts +7 -9
- package/src/focus/useFocusContainer.ts +1 -1
- package/src/focus/utils.ts +11 -6
- package/src/form/InputToggleIcon.tsx +5 -5
- package/src/form/NativeSelect.tsx +1 -1
- package/src/form/Select.tsx +58 -7
- package/src/form/SelectedOption.tsx +2 -4
- package/src/form/formConfig.ts +1 -1
- package/src/form/inputToggleStyles.ts +9 -4
- package/src/form/legendStyles.ts +1 -1
- package/src/form/selectUtils.ts +2 -2
- package/src/form/useCombobox.ts +1 -0
- package/src/form/useFormReset.ts +2 -2
- package/src/form/useNumberField.ts +1 -1
- package/src/form/useResizingTextArea.ts +5 -5
- package/src/form/useSelectCombobox.ts +1 -4
- package/src/form/validation.ts +1 -1
- package/src/hoverMode/useHoverMode.ts +9 -9
- package/src/hoverMode/useHoverModeProvider.ts +4 -4
- package/src/icon/config.tsx +3 -3
- package/src/icon/materialConfig.ts +1 -1
- package/src/interaction/UserInteractionModeProvider.tsx +11 -10
- package/src/interaction/utils.ts +3 -3
- package/src/layout/useExpandableLayout.ts +3 -4
- package/src/layout/useMainTabIndex.ts +1 -1
- package/src/list/ListItem.tsx +1 -1
- package/src/media-queries/AppSizeProvider.tsx +1 -1
- package/src/media-queries/config.ts +2 -2
- package/src/media-queries/useMediaQuery.ts +3 -3
- package/src/menu/Menu.tsx +4 -4
- package/src/menu/MenuItemButton.tsx +1 -1
- package/src/menu/MenuItemFileInput.tsx +1 -1
- package/src/menu/MenuWidget.tsx +6 -4
- package/src/movement/findMatchIndex.ts +2 -2
- package/src/movement/useKeyboardMovementProvider.ts +2 -2
- package/src/movement/utils.ts +15 -14
- package/src/navigation/getTableOfContentsHeadings.ts +4 -3
- package/src/navigation/useActiveHeadingId.ts +8 -8
- package/src/navigation/useTableOfContentsHeadings.ts +1 -1
- package/src/navigation/utils.ts +6 -5
- package/src/portal/PortalContainerProvider.tsx +5 -3
- package/src/positioning/getFixedPosition.ts +9 -6
- package/src/positioning/useFixedPositioning.ts +2 -2
- package/src/positioning/utils.ts +3 -3
- package/src/scroll/getScrollbarWidth.ts +4 -4
- package/src/searching/fuzzy.ts +7 -3
- package/src/searching/toSearchQuery.ts +1 -1
- package/src/searching/utils.ts +1 -1
- package/src/snackbar/Toast.tsx +1 -1
- package/src/snackbar/ToastContent.tsx +2 -2
- package/src/snackbar/ToastManager.ts +11 -12
- package/src/spinbutton/useSpinButton.ts +1 -1
- package/src/spinbutton/utils/deselectNode.ts +1 -1
- package/src/spinbutton/utils/resolveInputEvent.ts +1 -1
- package/src/spinbutton/utils/selectNode.ts +1 -1
- package/src/storage/useStorage.ts +7 -2
- package/src/table/useStickyTableSection.tsx +1 -1
- package/src/tabs/TabList.tsx +2 -2
- package/src/tabs/useMaxTabPanelHeight.ts +6 -3
- package/src/tabs/useTabList.ts +2 -2
- package/src/test-utils/jest-globals/match-media.ts +5 -2
- package/src/test-utils/jest-globals/timers.ts +1 -1
- package/src/test-utils/jest-globals/uploadMenuItemFileInput.ts +1 -1
- package/src/test-utils/mocks/ResizeObserver.ts +2 -2
- package/src/test-utils/polyfills/IntersectionObserver.ts +2 -2
- package/src/test-utils/polyfills/ResizeObserver.ts +2 -2
- package/src/test-utils/polyfills/TextDecoder.ts +2 -2
- package/src/test-utils/polyfills/TextEncoder.ts +2 -2
- package/src/test-utils/polyfills/matchMedia.ts +5 -2
- package/src/test-utils/polyfills/offsetParent.ts +2 -2
- package/src/test-utils/polyfills/scrollIntoView.ts +1 -1
- package/src/test-utils/queries/select.ts +2 -2
- package/src/test-utils/queries/slider.ts +1 -1
- package/src/test-utils/utils/createFileList.ts +2 -0
- package/src/test-utils/utils/createMatchMediaSpy.ts +4 -4
- package/src/test-utils/vitest/match-media.ts +2 -2
- package/src/test-utils/vitest/timers.ts +1 -1
- package/src/test-utils/vitest/uploadMenuItemFileInput.ts +1 -1
- package/src/theme/ThemeProvider.tsx +2 -2
- package/src/theme/getDerivedTheme.ts +1 -1
- package/src/theme/useCSSVariables.ts +5 -5
- package/src/theme/useColorSchemeMetaTag.ts +2 -2
- package/src/theme/useInlineCSSVariables.ts +6 -7
- package/src/theme/utils.ts +8 -8
- package/src/tooltip/useTooltip.ts +7 -7
- package/src/tooltip/useTooltipPosition.ts +1 -1
- package/src/transition/useCarousel.ts +2 -2
- package/src/transition/useCollapseTransition.ts +1 -1
- package/src/transition/useSkeletonPlaceholder.ts +4 -4
- package/src/transition/useTransition.ts +2 -2
- package/src/transition/utils.ts +5 -5
- package/src/tree/TreeItem.tsx +1 -1
- package/src/tree/useTreeItems.ts +5 -5
- package/src/tree/useTreeMovement.ts +1 -1
- package/src/tree/utils.ts +9 -9
- package/src/typography/HighlightText.tsx +4 -3
- package/src/typography/SrOnly.tsx +9 -2
- package/src/useDebouncedFunction.ts +5 -5
- package/src/useDropzone.ts +10 -10
- package/src/useEnsuredState.ts +5 -5
- package/src/useIntersectionObserver.ts +3 -3
- package/src/useIsomorphicLayoutEffect.ts +3 -3
- package/src/useOrientation.ts +1 -1
- package/src/useReadonlySet.ts +3 -1
- package/src/useResizeListener.ts +2 -2
- package/src/useResizeObserver.ts +3 -4
- package/src/useThrottledFunction.ts +4 -4
- package/src/useWindowSize.ts +1 -1
- package/src/utils/alphaNumericSort.ts +1 -1
- package/src/utils/bem.ts +15 -16
- package/src/utils/getNumberOfDigits.ts +1 -0
- package/src/utils/getRangeDefaultValue.ts +1 -1
- package/src/utils/nearest.ts +5 -2
- package/src/utils/parseCssLengthUnit.ts +5 -4
- package/src/utils/trigonometry.ts +1 -1
|
@@ -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.
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
$
|
|
156
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
84
|
+
"@microsoft/api-extractor": "^7.55.2",
|
|
84
85
|
"@swc/cli": "^0.7.9",
|
|
85
|
-
"@swc/core": "^1.15.
|
|
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.
|
|
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.
|
|
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.
|
|
99
|
+
"eslint": "^9.39.2",
|
|
99
100
|
"filesize": "^11.0.13",
|
|
100
101
|
"glob": "13.0.0",
|
|
101
|
-
"jsdom": "^27.
|
|
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 (
|
|
31
|
+
if (rightAddon === undefined) {
|
|
32
32
|
rightAddon = removeIcon;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
if (
|
|
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
|
-
{
|
|
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 (
|
|
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 (
|
|
297
|
+
if (selectedIcon === undefined) {
|
|
298
298
|
selectedIcon = getIcon("checkboxChecked");
|
|
299
299
|
}
|
|
300
|
-
if (
|
|
300
|
+
if (unselectedIcon === undefined) {
|
|
301
301
|
unselectedIcon = getIcon("checkbox");
|
|
302
302
|
}
|
|
303
|
-
} else if (
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
*
|
|
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?:
|
|
138
|
+
srOnly?: SrOnlyBehavior;
|
|
133
139
|
|
|
134
140
|
/**
|
|
135
141
|
* Set this to `"current-color"` to inherit the current text color or a
|
package/src/delegateEvent.ts
CHANGED
|
@@ -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 (
|
|
53
|
-
|
|
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
|
-
|
|
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 (
|
|
94
|
+
if (callbacks.length === 0) {
|
|
95
95
|
eventTarget.addEventListener(eventType, handler, options);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
if (callbacks.
|
|
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
|
|
110
|
+
if (i !== -1) {
|
|
111
111
|
callbacks.splice(i, 1);
|
|
112
112
|
|
|
113
|
-
if (
|
|
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
|
-
|
|
481
|
-
|
|
480
|
+
globalThis.addEventListener(updateKey, updatePosition, passive);
|
|
481
|
+
globalThis.addEventListener(stopKey, stopDragging);
|
|
482
482
|
return () => {
|
|
483
|
-
|
|
484
|
-
|
|
483
|
+
globalThis.removeEventListener(updateKey, updatePosition);
|
|
484
|
+
globalThis.removeEventListener(stopKey, stopDragging);
|
|
485
485
|
};
|
|
486
486
|
}, [
|
|
487
487
|
dragging,
|
package/src/draggable/utils.ts
CHANGED
|
@@ -215,7 +215,7 @@ export function useExpansionPanels(
|
|
|
215
215
|
} = useReadonlySet({
|
|
216
216
|
toggleType: multiple ? "multiple" : "single",
|
|
217
217
|
defaultValue: () => {
|
|
218
|
-
if (
|
|
218
|
+
if (defaultExpandedIds === undefined) {
|
|
219
219
|
const initialList: string[] = [];
|
|
220
220
|
if (typeof defaultExpandedIndex === "number" || preventAllCollapsed) {
|
|
221
221
|
initialList.push(createId(defaultExpandedIndex ?? 0));
|
package/src/files/FileInput.tsx
CHANGED
|
@@ -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
|
-
|
|
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
|
-
...
|
|
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(
|
|
392
|
+
queueFiles([...files]);
|
|
393
393
|
}
|
|
394
|
-
} catch (
|
|
394
|
+
} catch (error) {
|
|
395
395
|
dispatch({
|
|
396
396
|
type: "queue",
|
|
397
397
|
files: [],
|
|
398
398
|
errors: [
|
|
399
|
-
new FileAccessError(
|
|
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(
|
|
414
|
+
queueFiles([...files]);
|
|
413
415
|
} else {
|
|
414
|
-
throw new Error();
|
|
416
|
+
throw new Error("There are no files");
|
|
415
417
|
}
|
|
416
|
-
} catch (
|
|
418
|
+
} catch (error) {
|
|
417
419
|
dispatch({
|
|
418
420
|
type: "queue",
|
|
419
421
|
files: [],
|
|
420
422
|
errors: [
|
|
421
|
-
new FileAccessError(
|
|
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
|
-
|
|
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)
|
|
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)
|
|
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 (
|
|
489
|
+
if (queue.length === 0) {
|
|
486
490
|
return;
|
|
487
491
|
}
|
|
488
492
|
|
|
489
|
-
|
|
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,
|
package/src/files/utils.ts
CHANGED
|
@@ -247,18 +247,22 @@ export function getSplitFileUploads(
|
|
|
247
247
|
const pending: ProcessingFileUploadStats[] = [];
|
|
248
248
|
const uploading: ProcessingFileUploadStats[] = [];
|
|
249
249
|
const complete: CompletedFileUploadStats[] = [];
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
pending
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
}
|