@react-md/core 6.5.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/_utils.scss +2 -1
- 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/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/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/chip/Chip.js +1 -1
- package/dist/chip/Chip.js.map +1 -1
- 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/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.js +5 -5
- package/dist/form/Select.js.map +1 -1
- 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/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/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/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/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/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/package.json +3 -1
- 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 +5 -5
- package/src/form/formConfig.ts +1 -1
- package/src/form/inputToggleStyles.ts +9 -4
- 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
- package/dist/form/defaultGetSelectedOptionChildren.d.ts +0 -1
- package/dist/form/getSelectedOptionChildren.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/mocks/ResizeObserver.ts"],"sourcesContent":["import {\n type ResizeObserverManager,\n resizeObserverManager,\n} from \"../../useResizeObserver.js\";\nimport {\n type GetResizeObserverEntryMock,\n type ResizeObserverEntrySize,\n createResizeObserverEntry,\n} from \"../utils/createResizeObserverEntry.js\";\n\n/**\n * This is the default ResizeObserver implementation if it does not already\n * exist in jsdom. You normally should not use this directly and instead use the\n * {@link setupResizeObserverMock} instead.\n *\n * @since 6.0.0\n */\nexport class ResizeObserverMock implements ResizeObserver {\n elements: Set<Element>;\n\n constructor(public callback: ResizeObserverCallback) {\n this.elements = new Set();\n }\n\n observe = (target: Element): void => {\n this.elements.add(target);\n this.resizeAllElements(createResizeObserverEntry);\n };\n\n unobserve = (target: Element): void => {\n this.elements.delete(target);\n };\n\n disconnect = (): void => {\n this.elements.clear();\n };\n\n /**\n * Triggers the resize event for a specific element. This must be wrapped in\n * `act`.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { ExampleComponent } from \"../ExampleComponent.js\";\n *\n * // choose your test framework\n * import { afterEach, cleanupResizeObserverAfterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach();\n *\n * import { afterEach, cleanupResizeObserverAfterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach();\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />)\n *\n * const resizeTarget = screen.getByTestId(\"resize-target\")\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * // expect resize changes\n * });\n * })\n * ```\n */\n resizeElement = (\n target: Element,\n changesOrGetEntry:\n | GetResizeObserverEntryMock\n | ResizeObserverEntrySize\n | ResizeObserverEntry = createResizeObserverEntry\n ): void => {\n if (!this.elements.has(target)) {\n throw new Error(\n \"The `ResizeObserverMock` is not watching the target element and cannot be resized\"\n );\n }\n\n let entry: ResizeObserverEntry;\n if (typeof changesOrGetEntry === \"function\") {\n entry = changesOrGetEntry(target);\n } else if (!(\"contentRect\" in changesOrGetEntry)) {\n entry = createResizeObserverEntry(target, changesOrGetEntry);\n } else {\n entry = changesOrGetEntry;\n }\n\n this.callback([entry], this);\n };\n\n /**\n * You'll normally want to use {@link resizeElement} instead, but this can be\n * used to resize all the watched elements at once.\n *\n * @example\n * ```tsx\n * import {\n * act,\n * createResizeObserverEntry,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n *\n * const observer = setupResizeObserverMock();\n * const { container } = render(<Test />)\n * expect(container).toMatchSnapshot()\n *\n * const target1 = screen.getByTestId('target-1');\n * const target2 = screen.getByTestId('target-2');\n * const target3 = screen.getByTestId('target-3');\n *\n * act(() => {\n * observer.resizeAllElements((element) => {\n * let height: number | undefined;\n * let width: number | undefined;\n * switch (element) {\n * case target1:\n * height = 400;\n * width = 250;\n * break;\n * case target2:\n * height = 100;\n * width = 380;\n * break;\n * case target3:\n * height = 24;\n * width = 24;\n * break;\n * }\n *\n * return createResizeObserverEntry(element, { height, width });\n * });\n * });\n * expect(container).toMatchSnapshot()\n * ```\n */\n resizeAllElements = (getEntry = createResizeObserverEntry): void => {\n const entries = [...this.elements].map((element) => getEntry(element));\n this.callback(entries, this);\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SetupResizeObserverMockOptions {\n /**\n * Set this to `true` to mimic the real `ResizeObserver` behavior where the\n * updates occur after an animation frame instead of invoking immediately.\n *\n * Keeping this as `false` is recommended since this option was only added to\n * make testing this function itself easier.\n *\n * @defaultValue `false`\n */\n raf?: boolean;\n\n /**\n * Keeping this as the `resizeObserverManager` is recommended since this\n * option was only added to make testing this function easier itself.\n *\n * @defaultValue `resizeObserverManager`\n */\n manager?: ResizeObserverManager;\n}\n\n/**\n * Initializes the `ResizeObserverMock` to be used for tests.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * cleanupResizeObserverAfterEach,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { useCallback, useState } from \"react\";\n *\n * // choose your test framework\n * import { afterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach(afterEach, jest.restoreAllMocks);\n *\n * import { afterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach(afterEach, vitest.restoreAllMocks);\n *\n * function ExampleComponent() {\n * const [size, setSize] = useState({ height: 0, width: 0 });\n * const ref = useResizeObserver({\n * onUpdate: useCallback((entry) => {\n * setSize({\n * height: entry.contentRect.height,\n * width: entry.contentRect.width,\n * });\n * }, []),\n * });\n *\n * return (\n * <>\n * <div data-testid=\"size\">{JSON.stringify(size)}</div>\n * <div data-testid=\"resize-target\" ref={ref} />\n * </>\n * );\n * }\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />);\n *\n * const size = screen.getByTestId(\"size\");\n * const resizeTarget = screen.getByTestId(\"resize-target\");\n *\n * // jsdom sets all element sizes to 0 by default\n * expect(size).toHaveTextContent(JSON.stringify({ height: 0, width: 0 }));\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 100, width: 100 }));\n *\n * // or you can mock the `getBoundingClientRect` result\n * jest.spyOn(resizeTarget, \"getBoundingClientRect\").mockReturnValue({\n * ...document.body.getBoundingClientRect(),\n * height: 200,\n * width: 200,\n * });\n *\n * act(() => {\n * observer.resizeElement(resizeTarget);\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 200, width: 200 }));\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function setupResizeObserverMock(\n options: SetupResizeObserverMockOptions = {}\n): ResizeObserverMock {\n const { raf, manager = resizeObserverManager } = options;\n\n const resizeObserver = new ResizeObserverMock((entries) => {\n if (raf) {\n window.cancelAnimationFrame(manager.frame);\n manager.frame = window.requestAnimationFrame(() => {\n manager.handleResizeEntries(entries);\n });\n } else {\n manager.handleResizeEntries(entries);\n }\n });\n manager.sharedObserver = resizeObserver;\n return resizeObserver;\n}\n\n/**\n * @see {@link setupResizeObserverMock}\n * @since 6.0.0\n * @internal\n */\nexport function cleanupRO(\n afterEach: (callback: () => void) => void,\n restoreAllMocks: () => void = () => {}\n): void {\n afterEach(() => {\n resizeObserverManager.frame = 0;\n resizeObserverManager.subscriptions = new Map();\n resizeObserverManager.sharedObserver = undefined;\n restoreAllMocks();\n });\n}\n"],"names":["resizeObserverManager","createResizeObserverEntry","ResizeObserverMock","callback","elements","observe","unobserve","disconnect","resizeElement","resizeAllElements","target","add","delete","clear","changesOrGetEntry","has","Error","entry","getEntry","entries","map","element","Set","setupResizeObserverMock","options","raf","manager","resizeObserver","window","cancelAnimationFrame","frame","requestAnimationFrame","handleResizeEntries","sharedObserver","cleanupRO","afterEach","restoreAllMocks","subscriptions","Map","undefined"],"mappings":";;;;;;;;;;;;;AAAA,SAEEA,qBAAqB,QAChB,6BAA6B;AACpC,SAGEC,yBAAyB,QACpB,wCAAwC;AAE/C;;;;;;CAMC,GACD,OAAO,MAAMC;IAGX,YAAY,AAAOC,QAAgC,CAAE;;QAFrDC,uBAAAA,YAAAA,KAAAA;QAMAC,uBAAAA,WAAAA,KAAAA;QAKAC,uBAAAA,aAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCC,GACDC,uBAAAA,iBAAAA,KAAAA;QAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CC,GACDC,uBAAAA,qBAAAA,KAAAA;aA5HmBN,WAAAA;aAInBE,UAAU,CAACK;YACT,IAAI,CAACN,QAAQ,CAACO,GAAG,CAACD;YAClB,IAAI,CAACD,iBAAiB,CAACR;QACzB;aAEAK,YAAY,CAACI;YACX,IAAI,CAACN,QAAQ,CAACQ,MAAM,CAACF;QACvB;aAEAH,aAAa;YACX,IAAI,CAACH,QAAQ,CAACS,KAAK;QACrB;aAqCAL,gBAAgB,CACdE,QACAI,oBAG0Bb,yBAAyB;YAEnD,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACW,GAAG,CAACL,SAAS;gBAC9B,MAAM,IAAIM,MACR;YAEJ;YAEA,IAAIC;YACJ,IAAI,OAAOH,sBAAsB,YAAY;gBAC3CG,QAAQH,kBAAkBJ;YAC5B,OAAO,IAAI,CAAE,CAAA,iBAAiBI,iBAAgB,GAAI;gBAChDG,QAAQhB,0BAA0BS,QAAQI;YAC5C,OAAO;gBACLG,QAAQH;YACV;YAEA,IAAI,CAACX,QAAQ,CAAC;gBAACc;aAAM,EAAE,IAAI;QAC7B;aAiDAR,oBAAoB,CAACS,WAAWjB,yBAAyB;YACvD,MAAMkB,UAAU;mBAAI,IAAI,CAACf,QAAQ;aAAC,CAACgB,GAAG,CAAC,CAACC,UAAYH,SAASG;YAC7D,IAAI,CAAClB,QAAQ,CAACgB,SAAS,IAAI;QAC7B;QA9HE,IAAI,CAACf,QAAQ,GAAG,IAAIkB;IACtB;AA8HF;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEC,GACD,OAAO,SAASC,wBACdC,UAA0C,CAAC,CAAC;IAE5C,MAAM,EAAEC,GAAG,EAAEC,UAAU1B,qBAAqB,EAAE,GAAGwB;IAEjD,MAAMG,iBAAiB,IAAIzB,mBAAmB,CAACiB;QAC7C,IAAIM,KAAK;YACPG,OAAOC,oBAAoB,CAACH,QAAQI,KAAK;YACzCJ,QAAQI,KAAK,GAAGF,OAAOG,qBAAqB,CAAC;gBAC3CL,QAAQM,mBAAmB,CAACb;YAC9B;QACF,OAAO;YACLO,QAAQM,mBAAmB,CAACb;QAC9B;IACF;IACAO,QAAQO,cAAc,GAAGN;IACzB,OAAOA;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASO,UACdC,SAAyC,EACzCC,kBAA8B,KAAO,CAAC;IAEtCD,UAAU;QACRnC,sBAAsB8B,KAAK,GAAG;QAC9B9B,sBAAsBqC,aAAa,GAAG,IAAIC;QAC1CtC,sBAAsBiC,cAAc,GAAGM;QACvCH;IACF;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/mocks/ResizeObserver.ts"],"sourcesContent":["import {\n type ResizeObserverManager,\n resizeObserverManager,\n} from \"../../useResizeObserver.js\";\nimport {\n type GetResizeObserverEntryMock,\n type ResizeObserverEntrySize,\n createResizeObserverEntry,\n} from \"../utils/createResizeObserverEntry.js\";\n\n/**\n * This is the default ResizeObserver implementation if it does not already\n * exist in jsdom. You normally should not use this directly and instead use the\n * {@link setupResizeObserverMock} instead.\n *\n * @since 6.0.0\n */\nexport class ResizeObserverMock implements ResizeObserver {\n elements: Set<Element>;\n\n constructor(public callback: ResizeObserverCallback) {\n this.elements = new Set();\n }\n\n observe = (target: Element): void => {\n this.elements.add(target);\n this.resizeAllElements(createResizeObserverEntry);\n };\n\n unobserve = (target: Element): void => {\n this.elements.delete(target);\n };\n\n disconnect = (): void => {\n this.elements.clear();\n };\n\n /**\n * Triggers the resize event for a specific element. This must be wrapped in\n * `act`.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { ExampleComponent } from \"../ExampleComponent.js\";\n *\n * // choose your test framework\n * import { afterEach, cleanupResizeObserverAfterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach();\n *\n * import { afterEach, cleanupResizeObserverAfterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach();\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />)\n *\n * const resizeTarget = screen.getByTestId(\"resize-target\")\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * // expect resize changes\n * });\n * })\n * ```\n */\n resizeElement = (\n target: Element,\n changesOrGetEntry:\n | GetResizeObserverEntryMock\n | ResizeObserverEntrySize\n | ResizeObserverEntry = createResizeObserverEntry\n ): void => {\n if (!this.elements.has(target)) {\n throw new Error(\n \"The `ResizeObserverMock` is not watching the target element and cannot be resized\"\n );\n }\n\n let entry: ResizeObserverEntry;\n if (typeof changesOrGetEntry === \"function\") {\n entry = changesOrGetEntry(target);\n } else if (!(\"contentRect\" in changesOrGetEntry)) {\n entry = createResizeObserverEntry(target, changesOrGetEntry);\n } else {\n entry = changesOrGetEntry;\n }\n\n this.callback([entry], this);\n };\n\n /**\n * You'll normally want to use {@link resizeElement} instead, but this can be\n * used to resize all the watched elements at once.\n *\n * @example\n * ```tsx\n * import {\n * act,\n * createResizeObserverEntry,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n *\n * const observer = setupResizeObserverMock();\n * const { container } = render(<Test />)\n * expect(container).toMatchSnapshot()\n *\n * const target1 = screen.getByTestId('target-1');\n * const target2 = screen.getByTestId('target-2');\n * const target3 = screen.getByTestId('target-3');\n *\n * act(() => {\n * observer.resizeAllElements((element) => {\n * let height: number | undefined;\n * let width: number | undefined;\n * switch (element) {\n * case target1:\n * height = 400;\n * width = 250;\n * break;\n * case target2:\n * height = 100;\n * width = 380;\n * break;\n * case target3:\n * height = 24;\n * width = 24;\n * break;\n * }\n *\n * return createResizeObserverEntry(element, { height, width });\n * });\n * });\n * expect(container).toMatchSnapshot()\n * ```\n */\n resizeAllElements = (getEntry = createResizeObserverEntry): void => {\n const entries = [...this.elements].map((element) => getEntry(element));\n this.callback(entries, this);\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SetupResizeObserverMockOptions {\n /**\n * Set this to `true` to mimic the real `ResizeObserver` behavior where the\n * updates occur after an animation frame instead of invoking immediately.\n *\n * Keeping this as `false` is recommended since this option was only added to\n * make testing this function itself easier.\n *\n * @defaultValue `false`\n */\n raf?: boolean;\n\n /**\n * Keeping this as the `resizeObserverManager` is recommended since this\n * option was only added to make testing this function easier itself.\n *\n * @defaultValue `resizeObserverManager`\n */\n manager?: ResizeObserverManager;\n}\n\n/**\n * Initializes the `ResizeObserverMock` to be used for tests.\n *\n * @example Main Usage\n * ```tsx\n * import {\n * cleanupResizeObserverAfterEach,\n * render,\n * screen,\n * setupResizeObserverMock,\n * } from \"@react-md/core/test-utils\";\n * import { useResizeObserver } from \"@react-md/core/useResizeObserver\";\n * import { useCallback, useState } from \"react\";\n *\n * // choose your test framework\n * import { afterEach, jest } from \"@jest/globals\";\n * cleanupResizeObserverAfterEach(afterEach, jest.restoreAllMocks);\n *\n * import { afterEach, vitest } from \"vitest\";\n * cleanupResizeObserverAfterEach(afterEach, vitest.restoreAllMocks);\n *\n * function ExampleComponent() {\n * const [size, setSize] = useState({ height: 0, width: 0 });\n * const ref = useResizeObserver({\n * onUpdate: useCallback((entry) => {\n * setSize({\n * height: entry.contentRect.height,\n * width: entry.contentRect.width,\n * });\n * }, []),\n * });\n *\n * return (\n * <>\n * <div data-testid=\"size\">{JSON.stringify(size)}</div>\n * <div data-testid=\"resize-target\" ref={ref} />\n * </>\n * );\n * }\n *\n * describe(\"ExampleComponent\", () => {\n * it(\"should do stuff\", () => {\n * const observer = setupResizeObserverMock();\n * render(<ExampleComponent />);\n *\n * const size = screen.getByTestId(\"size\");\n * const resizeTarget = screen.getByTestId(\"resize-target\");\n *\n * // jsdom sets all element sizes to 0 by default\n * expect(size).toHaveTextContent(JSON.stringify({ height: 0, width: 0 }));\n *\n * // you can trigger with a custom change\n * act(() => {\n * observer.resizeElement(resizeTarget, { height: 100, width: 100 });\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 100, width: 100 }));\n *\n * // or you can mock the `getBoundingClientRect` result\n * jest.spyOn(resizeTarget, \"getBoundingClientRect\").mockReturnValue({\n * ...document.body.getBoundingClientRect(),\n * height: 200,\n * width: 200,\n * });\n *\n * act(() => {\n * observer.resizeElement(resizeTarget);\n * });\n * expect(size).toHaveTextContent(JSON.stringify({ height: 200, width: 200 }));\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function setupResizeObserverMock(\n options: SetupResizeObserverMockOptions = {}\n): ResizeObserverMock {\n const { raf, manager = resizeObserverManager } = options;\n\n const resizeObserver = new ResizeObserverMock((entries) => {\n if (raf) {\n globalThis.cancelAnimationFrame(manager.frame);\n manager.frame = globalThis.requestAnimationFrame(() => {\n manager.handleResizeEntries(entries);\n });\n } else {\n manager.handleResizeEntries(entries);\n }\n });\n manager.sharedObserver = resizeObserver;\n return resizeObserver;\n}\n\n/**\n * @see {@link setupResizeObserverMock}\n * @since 6.0.0\n * @internal\n */\nexport function cleanupRO(\n afterEach: (callback: () => void) => void,\n restoreAllMocks: () => void = () => {}\n): void {\n afterEach(() => {\n resizeObserverManager.frame = 0;\n resizeObserverManager.subscriptions = new Map();\n resizeObserverManager.sharedObserver = undefined;\n restoreAllMocks();\n });\n}\n"],"names":["resizeObserverManager","createResizeObserverEntry","ResizeObserverMock","callback","elements","observe","unobserve","disconnect","resizeElement","resizeAllElements","target","add","delete","clear","changesOrGetEntry","has","Error","entry","getEntry","entries","map","element","Set","setupResizeObserverMock","options","raf","manager","resizeObserver","globalThis","cancelAnimationFrame","frame","requestAnimationFrame","handleResizeEntries","sharedObserver","cleanupRO","afterEach","restoreAllMocks","subscriptions","Map","undefined"],"mappings":";;;;;;;;;;;;;AAAA,SAEEA,qBAAqB,QAChB,6BAA6B;AACpC,SAGEC,yBAAyB,QACpB,wCAAwC;AAE/C;;;;;;CAMC,GACD,OAAO,MAAMC;IAGX,YAAY,AAAOC,QAAgC,CAAE;;QAFrDC,uBAAAA,YAAAA,KAAAA;QAMAC,uBAAAA,WAAAA,KAAAA;QAKAC,uBAAAA,aAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCC,GACDC,uBAAAA,iBAAAA,KAAAA;QAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CC,GACDC,uBAAAA,qBAAAA,KAAAA;aA5HmBN,WAAAA;aAInBE,UAAU,CAACK;YACT,IAAI,CAACN,QAAQ,CAACO,GAAG,CAACD;YAClB,IAAI,CAACD,iBAAiB,CAACR;QACzB;aAEAK,YAAY,CAACI;YACX,IAAI,CAACN,QAAQ,CAACQ,MAAM,CAACF;QACvB;aAEAH,aAAa;YACX,IAAI,CAACH,QAAQ,CAACS,KAAK;QACrB;aAqCAL,gBAAgB,CACdE,QACAI,oBAG0Bb,yBAAyB;YAEnD,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACW,GAAG,CAACL,SAAS;gBAC9B,MAAM,IAAIM,MACR;YAEJ;YAEA,IAAIC;YACJ,IAAI,OAAOH,sBAAsB,YAAY;gBAC3CG,QAAQH,kBAAkBJ;YAC5B,OAAO,IAAI,CAAE,CAAA,iBAAiBI,iBAAgB,GAAI;gBAChDG,QAAQhB,0BAA0BS,QAAQI;YAC5C,OAAO;gBACLG,QAAQH;YACV;YAEA,IAAI,CAACX,QAAQ,CAAC;gBAACc;aAAM,EAAE,IAAI;QAC7B;aAiDAR,oBAAoB,CAACS,WAAWjB,yBAAyB;YACvD,MAAMkB,UAAU;mBAAI,IAAI,CAACf,QAAQ;aAAC,CAACgB,GAAG,CAAC,CAACC,UAAYH,SAASG;YAC7D,IAAI,CAAClB,QAAQ,CAACgB,SAAS,IAAI;QAC7B;QA9HE,IAAI,CAACf,QAAQ,GAAG,IAAIkB;IACtB;AA8HF;AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEC,GACD,OAAO,SAASC,wBACdC,UAA0C,CAAC,CAAC;IAE5C,MAAM,EAAEC,GAAG,EAAEC,UAAU1B,qBAAqB,EAAE,GAAGwB;IAEjD,MAAMG,iBAAiB,IAAIzB,mBAAmB,CAACiB;QAC7C,IAAIM,KAAK;YACPG,WAAWC,oBAAoB,CAACH,QAAQI,KAAK;YAC7CJ,QAAQI,KAAK,GAAGF,WAAWG,qBAAqB,CAAC;gBAC/CL,QAAQM,mBAAmB,CAACb;YAC9B;QACF,OAAO;YACLO,QAAQM,mBAAmB,CAACb;QAC9B;IACF;IACAO,QAAQO,cAAc,GAAGN;IACzB,OAAOA;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASO,UACdC,SAAyC,EACzCC,kBAA8B,KAAO,CAAC;IAEtCD,UAAU;QACRnC,sBAAsB8B,KAAK,GAAG;QAC9B9B,sBAAsBqC,aAAa,GAAG,IAAIC;QAC1CtC,sBAAsBiC,cAAc,GAAGM;QACvCH;IACF;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IntersectionObserverMock } from "../mocks/IntersectionObserver.js";
|
|
2
|
-
if (
|
|
3
|
-
|
|
2
|
+
if (globalThis.window !== undefined && typeof IntersectionObserver === "undefined") {
|
|
3
|
+
globalThis.IntersectionObserver = IntersectionObserverMock;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=IntersectionObserver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/IntersectionObserver.ts"],"sourcesContent":["import { IntersectionObserverMock } from \"../mocks/IntersectionObserver.js\";\n\nif (\n
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/IntersectionObserver.ts"],"sourcesContent":["import { IntersectionObserverMock } from \"../mocks/IntersectionObserver.js\";\n\nif (\n globalThis.window !== undefined &&\n typeof IntersectionObserver === \"undefined\"\n) {\n globalThis.IntersectionObserver = IntersectionObserverMock;\n}\n"],"names":["IntersectionObserverMock","globalThis","window","undefined","IntersectionObserver"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,mCAAmC;AAE5E,IACEC,WAAWC,MAAM,KAAKC,aACtB,OAAOC,yBAAyB,aAChC;IACAH,WAAWG,oBAAoB,GAAGJ;AACpC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResizeObserverMock } from "../mocks/ResizeObserver.js";
|
|
2
|
-
if (
|
|
3
|
-
|
|
2
|
+
if (globalThis.window !== undefined && typeof ResizeObserver === "undefined") {
|
|
3
|
+
globalThis.ResizeObserver = ResizeObserverMock;
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=ResizeObserver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/ResizeObserver.ts"],"sourcesContent":["import { ResizeObserverMock } from \"../mocks/ResizeObserver.js\";\n\nif (
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/ResizeObserver.ts"],"sourcesContent":["import { ResizeObserverMock } from \"../mocks/ResizeObserver.js\";\n\nif (globalThis.window !== undefined && typeof ResizeObserver === \"undefined\") {\n globalThis.ResizeObserver = ResizeObserverMock;\n}\n"],"names":["ResizeObserverMock","globalThis","window","undefined","ResizeObserver"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,6BAA6B;AAEhE,IAAIC,WAAWC,MAAM,KAAKC,aAAa,OAAOC,mBAAmB,aAAa;IAC5EH,WAAWG,cAAc,GAAGJ;AAC9B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TextDecoder } from "node:util";
|
|
2
|
-
if (
|
|
2
|
+
if (globalThis.TextDecoder === undefined) {
|
|
3
3
|
// @ts-expect-error browser TextDecoder does not support `null` while `node:util` does
|
|
4
|
-
|
|
4
|
+
globalThis.TextDecoder = TextDecoder;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
//# sourceMappingURL=TextDecoder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/TextDecoder.ts"],"sourcesContent":["import { TextDecoder } from \"node:util\";\n\nif (
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/TextDecoder.ts"],"sourcesContent":["import { TextDecoder } from \"node:util\";\n\nif (globalThis.TextDecoder === undefined) {\n // @ts-expect-error browser TextDecoder does not support `null` while `node:util` does\n globalThis.TextDecoder = TextDecoder;\n}\n"],"names":["TextDecoder","globalThis","undefined"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAIC,WAAWD,WAAW,KAAKE,WAAW;IACxC,sFAAsF;IACtFD,WAAWD,WAAW,GAAGA;AAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/TextEncoder.ts"],"sourcesContent":["import { TextEncoder } from \"node:util\";\n\nif (
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/TextEncoder.ts"],"sourcesContent":["import { TextEncoder } from \"node:util\";\n\nif (globalThis.TextEncoder === undefined) {\n globalThis.TextEncoder = TextEncoder;\n}\n"],"names":["TextEncoder","globalThis","undefined"],"mappings":"AAAA,SAASA,WAAW,QAAQ,YAAY;AAExC,IAAIC,WAAWD,WAAW,KAAKE,WAAW;IACxCD,WAAWD,WAAW,GAAGA;AAC3B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BASE_MEDIA_QUERY_LIST, matchDesktop } from "../mocks/match-media.js";
|
|
2
|
-
if (
|
|
3
|
-
|
|
2
|
+
if (globalThis.window !== undefined && typeof globalThis.matchMedia !== "function") {
|
|
3
|
+
globalThis.matchMedia = (query)=>({
|
|
4
4
|
...BASE_MEDIA_QUERY_LIST,
|
|
5
5
|
matches: matchDesktop(query)
|
|
6
6
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/matchMedia.ts"],"sourcesContent":["import { BASE_MEDIA_QUERY_LIST, matchDesktop } from \"../mocks/match-media.js\";\n\nif (
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/matchMedia.ts"],"sourcesContent":["import { BASE_MEDIA_QUERY_LIST, matchDesktop } from \"../mocks/match-media.js\";\n\nif (\n globalThis.window !== undefined &&\n typeof globalThis.matchMedia !== \"function\"\n) {\n globalThis.matchMedia = (query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n matches: matchDesktop(query),\n });\n}\n"],"names":["BASE_MEDIA_QUERY_LIST","matchDesktop","globalThis","window","undefined","matchMedia","query","matches"],"mappings":"AAAA,SAASA,qBAAqB,EAAEC,YAAY,QAAQ,0BAA0B;AAE9E,IACEC,WAAWC,MAAM,KAAKC,aACtB,OAAOF,WAAWG,UAAU,KAAK,YACjC;IACAH,WAAWG,UAAU,GAAG,CAACC,QAAW,CAAA;YAClC,GAAGN,qBAAqB;YACxBO,SAASN,aAAaK;QACxB,CAAA;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// this polyfill was added to support the tree keyboard movement behavior
|
|
2
|
-
if (
|
|
2
|
+
if (globalThis.window !== undefined) {
|
|
3
3
|
// Based off of https://github.com/jsdom/jsdom/issues/1261#issuecomment-512217225
|
|
4
4
|
//
|
|
5
5
|
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
|
|
@@ -11,7 +11,7 @@ if (typeof window !== "undefined") {
|
|
|
11
11
|
// - The element is <body> or <html>.
|
|
12
12
|
Object.defineProperty(HTMLElement.prototype, "offsetParent", {
|
|
13
13
|
get () {
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias, unicorn/no-this-assignment
|
|
15
15
|
let element = this;
|
|
16
16
|
while(element && // it'll almost always be an html element, unless using document fragments
|
|
17
17
|
!element.hidden && element.style?.display?.toLowerCase() !== "none"){
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/offsetParent.ts"],"sourcesContent":["// this polyfill was added to support the tree keyboard movement behavior\nif (
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/offsetParent.ts"],"sourcesContent":["// this polyfill was added to support the tree keyboard movement behavior\nif (globalThis.window !== undefined) {\n // Based off of https://github.com/jsdom/jsdom/issues/1261#issuecomment-512217225\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n //\n // Note: offsetParent returns null in the following situations:\n //\n // - The element or any ancestor has the display property set to none.\n // - The element has the position property set to fixed (Firefox returns <body>).\n // - The element is <body> or <html>.\n Object.defineProperty(HTMLElement.prototype, \"offsetParent\", {\n get(this: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias, unicorn/no-this-assignment\n let element: ParentNode | null = this;\n while (\n element &&\n // it'll almost always be an html element, unless using document fragments\n !(element as HTMLElement).hidden &&\n (element as HTMLElement).style?.display?.toLowerCase() !== \"none\"\n ) {\n element = element.parentNode;\n }\n\n if (\n // the current element or a parent has display: none\n element ||\n // the current element is fixed\n this.style?.position?.toLowerCase() === \"fixed\" ||\n this.tagName.toLowerCase() === \"html\" ||\n this.tagName.toLowerCase() === \"body\"\n ) {\n return null;\n }\n\n return this.parentNode;\n },\n });\n}\n"],"names":["globalThis","window","undefined","Object","defineProperty","HTMLElement","prototype","get","element","hidden","style","display","toLowerCase","parentNode","position","tagName"],"mappings":"AAAA,yEAAyE;AACzE,IAAIA,WAAWC,MAAM,KAAKC,WAAW;IACnC,iFAAiF;IACjF,EAAE;IACF,4EAA4E;IAC5E,EAAE;IACF,+DAA+D;IAC/D,EAAE;IACF,sEAAsE;IACtE,iFAAiF;IACjF,qCAAqC;IACrCC,OAAOC,cAAc,CAACC,YAAYC,SAAS,EAAE,gBAAgB;QAC3DC;YACE,wFAAwF;YACxF,IAAIC,UAA6B,IAAI;YACrC,MACEA,WACA,0EAA0E;YAC1E,CAAC,AAACA,QAAwBC,MAAM,IAChC,AAACD,QAAwBE,KAAK,EAAEC,SAASC,kBAAkB,OAC3D;gBACAJ,UAAUA,QAAQK,UAAU;YAC9B;YAEA,IACE,oDAAoD;YACpDL,WACA,+BAA+B;YAC/B,IAAI,CAACE,KAAK,EAAEI,UAAUF,kBAAkB,WACxC,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,UAC/B,IAAI,CAACG,OAAO,CAACH,WAAW,OAAO,QAC/B;gBACA,OAAO;YACT;YAEA,OAAO,IAAI,CAACC,UAAU;QACxB;IACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
if (
|
|
1
|
+
if (globalThis.window !== undefined && typeof HTMLElement.prototype.scrollIntoView !== "function") {
|
|
2
2
|
// this is required for keyboard movement behavior
|
|
3
3
|
HTMLElement.prototype.scrollIntoView = ()=>{
|
|
4
4
|
// do nothing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/polyfills/scrollIntoView.ts"],"sourcesContent":["if (\n
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/polyfills/scrollIntoView.ts"],"sourcesContent":["if (\n globalThis.window !== undefined &&\n typeof HTMLElement.prototype.scrollIntoView !== \"function\"\n) {\n // this is required for keyboard movement behavior\n HTMLElement.prototype.scrollIntoView = () => {\n // do nothing\n };\n}\n"],"names":["globalThis","window","undefined","HTMLElement","prototype","scrollIntoView"],"mappings":"AAAA,IACEA,WAAWC,MAAM,KAAKC,aACtB,OAAOC,YAAYC,SAAS,CAACC,cAAc,KAAK,YAChD;IACA,kDAAkD;IAClDF,YAAYC,SAAS,CAACC,cAAc,GAAG;IACrC,aAAa;IACf;AACF"}
|
|
@@ -38,7 +38,7 @@ import { screen, within } from "@testing-library/dom";
|
|
|
38
38
|
});
|
|
39
39
|
const selectedOption = select.firstElementChild;
|
|
40
40
|
if (!(selectedOption instanceof HTMLDivElement)) {
|
|
41
|
-
throw new
|
|
41
|
+
throw new TypeError("Unable to find the `Select` selected option element");
|
|
42
42
|
}
|
|
43
43
|
return {
|
|
44
44
|
select,
|
|
@@ -57,7 +57,7 @@ import { screen, within } from "@testing-library/dom";
|
|
|
57
57
|
});
|
|
58
58
|
const selectedOption = select.firstElementChild;
|
|
59
59
|
if (!(selectedOption instanceof HTMLDivElement)) {
|
|
60
|
-
throw new
|
|
60
|
+
throw new TypeError("Unable to find the `Select` selected option element");
|
|
61
61
|
}
|
|
62
62
|
return {
|
|
63
63
|
select,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/queries/select.ts"],"sourcesContent":["import { screen, within } from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface SelectTestElements {\n /**\n * The element that should be interacted with for showing and hiding the\n * listbox of available options in the `Select`.\n */\n select: HTMLDivElement;\n\n /**\n * The input element storing the current value for the `Select`. This should\n * be used to verify a specific option has been selected and will be the\n * `Option`'s `value` prop.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectInput`\n * would have value `\"a\"`.\n */\n selectInput: HTMLInputElement;\n\n /**\n * The current selected option that is shown in the `Select` underneath the\n * floating label. This should be used if the selected option label needs to\n * be verified instead of the value.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectedOption`\n * would have text content `\"Option 1\"`.\n */\n selectedOption: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * import {\n * getSelectTestElements,\n * screen,\n * rmdRender,\n * userEvent,\n * } from \"@react-md/core/test-utils\";\n *\n * it(\"should be able to verify the display value\", async () => {\n * const user = userEvent.setup();\n * rmdRender(<SimpleSelect />);\n *\n * const { select, selectInput, selectedOption } = getSelectTestElements({\n * name: \"Label\",\n * });\n * // this isn't required, but added to show what element this is\n * expect(selectedOption).toHaveClass(\"rmd-selected-option\");\n *\n * // there is currently no selected value\n * expect(selectedOption).toHaveTextContent(\"\");\n *\n * await user.click(select);\n * await user.click(screen.getByRole(\"option\", { name: \"Option 1\" }));\n * expect(selectInput).toHaveValue(\"a\");\n * expect(selectedOption).toHaveTextContent(\"Option 1\");\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function getSelectTestElements(\n options: GetPartsByRoleOptions\n): SelectTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const select = container.getByRole<HTMLDivElement>(\"combobox\", byRoleOptions);\n const selectInput = within(select).getByRole<HTMLInputElement>(\"textbox\", {\n hidden: true,\n });\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/queries/select.ts"],"sourcesContent":["import { screen, within } from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface SelectTestElements {\n /**\n * The element that should be interacted with for showing and hiding the\n * listbox of available options in the `Select`.\n */\n select: HTMLDivElement;\n\n /**\n * The input element storing the current value for the `Select`. This should\n * be used to verify a specific option has been selected and will be the\n * `Option`'s `value` prop.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectInput`\n * would have value `\"a\"`.\n */\n selectInput: HTMLInputElement;\n\n /**\n * The current selected option that is shown in the `Select` underneath the\n * floating label. This should be used if the selected option label needs to\n * be verified instead of the value.\n *\n * i.e. Selecting `<Option value=\"a\">Option 1</Option>` -> `selectedOption`\n * would have text content `\"Option 1\"`.\n */\n selectedOption: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * import {\n * getSelectTestElements,\n * screen,\n * rmdRender,\n * userEvent,\n * } from \"@react-md/core/test-utils\";\n *\n * it(\"should be able to verify the display value\", async () => {\n * const user = userEvent.setup();\n * rmdRender(<SimpleSelect />);\n *\n * const { select, selectInput, selectedOption } = getSelectTestElements({\n * name: \"Label\",\n * });\n * // this isn't required, but added to show what element this is\n * expect(selectedOption).toHaveClass(\"rmd-selected-option\");\n *\n * // there is currently no selected value\n * expect(selectedOption).toHaveTextContent(\"\");\n *\n * await user.click(select);\n * await user.click(screen.getByRole(\"option\", { name: \"Option 1\" }));\n * expect(selectInput).toHaveValue(\"a\");\n * expect(selectedOption).toHaveTextContent(\"Option 1\");\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport function getSelectTestElements(\n options: GetPartsByRoleOptions\n): SelectTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const select = container.getByRole<HTMLDivElement>(\"combobox\", byRoleOptions);\n const selectInput = within(select).getByRole<HTMLInputElement>(\"textbox\", {\n hidden: true,\n });\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new TypeError(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n\n/**\n * @see {@link getSelectTestElements}\n * @since 6.0.0\n */\nexport async function findSelectTestElements(\n options: GetPartsByRoleOptions\n): Promise<SelectTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const select = await container.findByRole<HTMLDivElement>(\n \"combobox\",\n byRoleOptions\n );\n const selectInput = await within(select).findByRole<HTMLInputElement>(\n \"textbox\",\n {\n hidden: true,\n }\n );\n const selectedOption = select.firstElementChild;\n if (!(selectedOption instanceof HTMLDivElement)) {\n throw new TypeError(\"Unable to find the `Select` selected option element\");\n }\n\n return {\n select,\n selectInput,\n selectedOption,\n };\n}\n"],"names":["screen","within","getSelectTestElements","options","container","byRoleOptions","select","getByRole","selectInput","hidden","selectedOption","firstElementChild","HTMLDivElement","TypeError","findSelectTestElements","findByRole"],"mappings":"AAAA,SAASA,MAAM,EAAEC,MAAM,QAAQ,uBAAuB;AAmCtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAASF,UAAUG,SAAS,CAAiB,YAAYF;IAC/D,MAAMG,cAAcP,OAAOK,QAAQC,SAAS,CAAmB,WAAW;QACxEE,QAAQ;IACV;IACA,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,UAAU;IACtB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeI,uBACpBX,OAA8B;IAE9B,MAAM,EAAEC,YAAYJ,MAAM,EAAE,GAAGK,eAAe,GAAGF;IACjD,MAAMG,SAAS,MAAMF,UAAUW,UAAU,CACvC,YACAV;IAEF,MAAMG,cAAc,MAAMP,OAAOK,QAAQS,UAAU,CACjD,WACA;QACEN,QAAQ;IACV;IAEF,MAAMC,iBAAiBJ,OAAOK,iBAAiB;IAC/C,IAAI,CAAED,CAAAA,0BAA0BE,cAAa,GAAI;QAC/C,MAAM,IAAIC,UAAU;IACtB;IAEA,OAAO;QACLP;QACAE;QACAE;IACF;AACF"}
|
|
@@ -4,7 +4,7 @@ function getElements(slider) {
|
|
|
4
4
|
const sliderTrack = slider.parentElement;
|
|
5
5
|
const sliderContainer = sliderTrack?.parentElement;
|
|
6
6
|
if (!(sliderInput instanceof HTMLInputElement)) {
|
|
7
|
-
throw new
|
|
7
|
+
throw new TypeError("Unable to find the `Slider` input element");
|
|
8
8
|
}
|
|
9
9
|
if (!(sliderTrack instanceof HTMLSpanElement) || !sliderTrack.classList.contains("rmd-slider-track")) {
|
|
10
10
|
throw new Error("Unable to find the `Slider` track element");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/queries/slider.ts"],"sourcesContent":["import {\n type BoundFunctions,\n type ByRoleOptions,\n type queries,\n screen,\n} from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\ntype Elements = Omit<SliderTestElements, \"slider\">;\n\nfunction getElements(slider: HTMLSpanElement): Elements {\n const sliderInput = slider.nextElementSibling;\n const sliderTrack = slider.parentElement;\n const sliderContainer = sliderTrack?.parentElement;\n if (!(sliderInput instanceof HTMLInputElement)) {\n throw new
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/queries/slider.ts"],"sourcesContent":["import {\n type BoundFunctions,\n type ByRoleOptions,\n type queries,\n screen,\n} from \"@testing-library/dom\";\n\nimport { type GetPartsByRoleOptions } from \"./types.js\";\n\ntype Elements = Omit<SliderTestElements, \"slider\">;\n\nfunction getElements(slider: HTMLSpanElement): Elements {\n const sliderInput = slider.nextElementSibling;\n const sliderTrack = slider.parentElement;\n const sliderContainer = sliderTrack?.parentElement;\n if (!(sliderInput instanceof HTMLInputElement)) {\n throw new TypeError(\"Unable to find the `Slider` input element\");\n }\n if (\n !(sliderTrack instanceof HTMLSpanElement) ||\n !sliderTrack.classList.contains(\"rmd-slider-track\")\n ) {\n throw new Error(\"Unable to find the `Slider` track element\");\n }\n if (\n !(sliderContainer instanceof HTMLDivElement) ||\n !sliderContainer.classList.contains(\"rmd-slider-container\")\n ) {\n throw new Error(\"Unable to find the `Slider` container element\");\n }\n\n return { sliderInput, sliderTrack, sliderContainer };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface SliderTestElements {\n /**\n * The element that is visible to screen readers and can be updated using\n * drag, touch, or keyboard events. Since this is usually annoying for tests,\n * the `sliderInput` should normally be used instead.\n */\n slider: HTMLSpanElement;\n\n /**\n * The element that is hidden to screen readers but stores the current value\n * and can be updated using\n * `fireEvent.change(sliderInput, { target: { value: \"100\" }})`.\n */\n sliderInput: HTMLInputElement;\n\n /**\n * This is only useful when needing to verify that clicking somewhere on the\n * track updates the value. Most test cases can be solved through the\n * {@link slider} or {@link sliderInput} instead.\n */\n sliderTrack: HTMLSpanElement;\n\n /**\n * Returns the slider container element if it is needed for testing. It's\n * useful for simple snapshot tests.\n */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useSlider({ defaultValue: 30 });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements({ name: \"Example\" });\n *\n * expect(slider).toHaveValue(30);\n * expect(sliderInput).toHaveValue(\"30\");\n *\n * fireEvent.change(sliderInput, { target: { value: \"55\" }});\n * expect(slider).toHaveValue(55);\n * expect(sliderInput).toHaveValue(\"55\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getSliderTestElements(\n options: GetPartsByRoleOptions\n): SliderTestElements {\n const { container = screen, ...byRoleOptions } = options;\n const slider = container.getByRole<HTMLSpanElement>(\"slider\", byRoleOptions);\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @see {@link getSliderTestElements}\n * @since 6.0.0\n */\nexport async function findSliderTestElements(\n options: GetPartsByRoleOptions\n): Promise<SliderTestElements> {\n const { container = screen, ...byRoleOptions } = options;\n const slider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n byRoleOptions\n );\n\n return {\n slider,\n ...getElements(slider),\n };\n}\n\n/**\n * @since 6.0.0\n */\nexport interface GetRangeSliderTestElementsOptions {\n /** @defaultValue `screen` */\n container?: BoundFunctions<typeof queries>;\n\n /** @defaultValue `{ name: \"Min\" }` */\n min?: ByRoleOptions;\n\n /** @defaultValue `{ name: \"Max\" }` */\n max?: ByRoleOptions;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface RangeSliderTestElements {\n /** @see {@link SliderTestElements.slider} */\n minSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n minSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.slider} */\n maxSlider: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderInput} */\n maxSliderInput: HTMLInputElement;\n /** @see {@link SliderTestElements.sliderTrack} */\n sliderTrack: HTMLSpanElement;\n /** @see {@link SliderTestElements.sliderContainer} */\n sliderContainer: HTMLDivElement;\n}\n\n/**\n * @example Simple Example\n * ```tsx\n * function Test(): ReactElement {\n * const slider = useRangeSlider({ defaultValue: [30, 60] });\n * return <Slider {...slider} aria-label=\"Example\" />;\n * }\n *\n * rmdRender(<Test />);\n *\n * const { slider, sliderInput } = getSliderTestElements();\n *\n * const { minSlider, minSliderInput, maxSlider, maxSliderInput } =\n * getRangeSliderTestElements();\n * expect(minSlider).toHaveValue(30);\n * expect(minSliderInput).toHaveValue(\"30\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(minSliderInput, { target: { value: \"55\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(60);\n * expect(maxSliderInput).toHaveValue(\"60\");\n *\n * fireEvent.change(maxSliderInput, { target: { value: \"88\" }});\n * expect(minSlider).toHaveValue(55);\n * expect(minSliderInput).toHaveValue(\"55\");\n * expect(maxSlider).toHaveAttribute(88);\n * expect(maxSliderInput).toHaveValue(\"88\");\n * ```\n *\n * @since 6.0.0\n */\nexport function getRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): RangeSliderTestElements {\n const { container = screen, min, max } = options;\n const minSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = container.getByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n\n/**\n * @see {@link getRangeSliderTestElements}\n * @since 6.0.0\n */\nexport async function findRangeSliderTestElements(\n options: GetRangeSliderTestElementsOptions = {}\n): Promise<RangeSliderTestElements> {\n const { container = screen, min, max } = options;\n const minSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n min ?? { name: \"Min\" }\n );\n const maxSlider = await container.findByRole<HTMLSpanElement>(\n \"slider\",\n max ?? { name: \"Max\" }\n );\n const {\n sliderInput: minSliderInput,\n sliderTrack,\n sliderContainer,\n } = getElements(minSlider);\n const { sliderInput: maxSliderInput } = getElements(maxSlider);\n\n return {\n minSlider,\n minSliderInput,\n maxSlider,\n maxSliderInput,\n sliderTrack,\n sliderContainer,\n };\n}\n"],"names":["screen","getElements","slider","sliderInput","nextElementSibling","sliderTrack","parentElement","sliderContainer","HTMLInputElement","TypeError","HTMLSpanElement","classList","contains","Error","HTMLDivElement","getSliderTestElements","options","container","byRoleOptions","getByRole","findSliderTestElements","findByRole","getRangeSliderTestElements","min","max","minSlider","name","maxSlider","minSliderInput","maxSliderInput","findRangeSliderTestElements"],"mappings":"AAAA,SAIEA,MAAM,QACD,uBAAuB;AAM9B,SAASC,YAAYC,MAAuB;IAC1C,MAAMC,cAAcD,OAAOE,kBAAkB;IAC7C,MAAMC,cAAcH,OAAOI,aAAa;IACxC,MAAMC,kBAAkBF,aAAaC;IACrC,IAAI,CAAEH,CAAAA,uBAAuBK,gBAAe,GAAI;QAC9C,MAAM,IAAIC,UAAU;IACtB;IACA,IACE,CAAEJ,CAAAA,uBAAuBK,eAAc,KACvC,CAACL,YAAYM,SAAS,CAACC,QAAQ,CAAC,qBAChC;QACA,MAAM,IAAIC,MAAM;IAClB;IACA,IACE,CAAEN,CAAAA,2BAA2BO,cAAa,KAC1C,CAACP,gBAAgBI,SAAS,CAACC,QAAQ,CAAC,yBACpC;QACA,MAAM,IAAIC,MAAM;IAClB;IAEA,OAAO;QAAEV;QAAaE;QAAaE;IAAgB;AACrD;AAkCA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASQ,sBACdC,OAA8B;IAE9B,MAAM,EAAEC,YAAYjB,MAAM,EAAE,GAAGkB,eAAe,GAAGF;IACjD,MAAMd,SAASe,UAAUE,SAAS,CAAkB,UAAUD;IAE9D,OAAO;QACLhB;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAEA;;;CAGC,GACD,OAAO,eAAekB,uBACpBJ,OAA8B;IAE9B,MAAM,EAAEC,YAAYjB,MAAM,EAAE,GAAGkB,eAAe,GAAGF;IACjD,MAAMd,SAAS,MAAMe,UAAUI,UAAU,CACvC,UACAH;IAGF,OAAO;QACLhB;QACA,GAAGD,YAAYC,OAAO;IACxB;AACF;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCC,GACD,OAAO,SAASoB,2BACdN,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYjB,MAAM,EAAEuB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAYR,UAAUE,SAAS,CACnC,UACAI,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAYV,UAAUE,SAAS,CACnC,UACAK,OAAO;QAAEE,MAAM;IAAM;IAGvB,MAAM,EACJvB,aAAayB,cAAc,EAC3BvB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYwB;IAChB,MAAM,EAAEtB,aAAa0B,cAAc,EAAE,GAAG5B,YAAY0B;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAxB;QACAE;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeuB,4BACpBd,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,YAAYjB,MAAM,EAAEuB,GAAG,EAAEC,GAAG,EAAE,GAAGR;IACzC,MAAMS,YAAY,MAAMR,UAAUI,UAAU,CAC1C,UACAE,OAAO;QAAEG,MAAM;IAAM;IAEvB,MAAMC,YAAY,MAAMV,UAAUI,UAAU,CAC1C,UACAG,OAAO;QAAEE,MAAM;IAAM;IAEvB,MAAM,EACJvB,aAAayB,cAAc,EAC3BvB,WAAW,EACXE,eAAe,EAChB,GAAGN,YAAYwB;IAChB,MAAM,EAAEtB,aAAa0B,cAAc,EAAE,GAAG5B,YAAY0B;IAEpD,OAAO;QACLF;QACAG;QACAD;QACAE;QACAxB;QACAE;IACF;AACF"}
|
|
@@ -11,11 +11,13 @@
|
|
|
11
11
|
// needs to be `any` to match the FileList definition
|
|
12
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
13
|
[Symbol.iterator]: function* nextFile() {
|
|
14
|
+
// eslint-disable-next-line unicorn/no-for-loop
|
|
14
15
|
for(let i = 0; i < fileList.length; i++){
|
|
15
16
|
yield fileList[i];
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
};
|
|
20
|
+
// eslint-disable-next-line unicorn/no-immediate-mutation
|
|
19
21
|
fileList.constructor = window.FileList;
|
|
20
22
|
if (window.FileList) {
|
|
21
23
|
Object.setPrototypeOf(fileList, window.FileList.prototype);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/utils/createFileList.ts"],"sourcesContent":["/**\n * @see https://github.com/testing-library/user-event/blob/d42954be66484bcf78486a298cc37f8a7c9e4bea/src/utils/dataTransfer/FileList.ts\n */\nexport function createFileList(\n window: Window & typeof globalThis,\n fileOrFiles: File | readonly File[]\n): FileList & Iterable<File> {\n const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];\n const fileList: FileList & Iterable<File> = {\n ...files,\n length: files.length,\n item: (index) => fileList[index],\n // needs to be `any` to match the FileList definition\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [Symbol.iterator]: function* nextFile(): Generator<File, any, any> {\n for (let i = 0; i < fileList.length; i++) {\n yield fileList[i];\n }\n },\n };\n fileList.constructor = window.FileList;\n if (window.FileList) {\n Object.setPrototypeOf(fileList, window.FileList.prototype);\n }\n Object.freeze(fileList);\n return fileList;\n}\n"],"names":["createFileList","window","fileOrFiles","files","Array","isArray","fileList","length","item","index","Symbol","iterator","nextFile","i","FileList","Object","setPrototypeOf","prototype","freeze"],"mappings":"AAAA;;CAEC,GACD,OAAO,SAASA,eACdC,MAAkC,EAClCC,WAAmC;IAEnC,MAAMC,QAAQC,MAAMC,OAAO,CAACH,eAAeA,cAAc;QAACA;KAAY;IACtE,MAAMI,WAAsC;QAC1C,GAAGH,KAAK;QACRI,QAAQJ,MAAMI,MAAM;QACpBC,MAAM,CAACC,QAAUH,QAAQ,CAACG,MAAM;QAChC,qDAAqD;QACrD,8DAA8D;QAC9D,CAACC,OAAOC,QAAQ,CAAC,EAAE,UAAUC;YAC3B,IAAK,IAAIC,IAAI,GAAGA,IAAIP,SAASC,MAAM,EAAEM,IAAK;gBACxC,MAAMP,QAAQ,CAACO,EAAE;YACnB;QACF;IACF;
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/utils/createFileList.ts"],"sourcesContent":["/**\n * @see https://github.com/testing-library/user-event/blob/d42954be66484bcf78486a298cc37f8a7c9e4bea/src/utils/dataTransfer/FileList.ts\n */\nexport function createFileList(\n window: Window & typeof globalThis,\n fileOrFiles: File | readonly File[]\n): FileList & Iterable<File> {\n const files = Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles];\n const fileList: FileList & Iterable<File> = {\n ...files,\n length: files.length,\n item: (index) => fileList[index],\n // needs to be `any` to match the FileList definition\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [Symbol.iterator]: function* nextFile(): Generator<File, any, any> {\n // eslint-disable-next-line unicorn/no-for-loop\n for (let i = 0; i < fileList.length; i++) {\n yield fileList[i];\n }\n },\n };\n // eslint-disable-next-line unicorn/no-immediate-mutation\n fileList.constructor = window.FileList;\n if (window.FileList) {\n Object.setPrototypeOf(fileList, window.FileList.prototype);\n }\n Object.freeze(fileList);\n return fileList;\n}\n"],"names":["createFileList","window","fileOrFiles","files","Array","isArray","fileList","length","item","index","Symbol","iterator","nextFile","i","FileList","Object","setPrototypeOf","prototype","freeze"],"mappings":"AAAA;;CAEC,GACD,OAAO,SAASA,eACdC,MAAkC,EAClCC,WAAmC;IAEnC,MAAMC,QAAQC,MAAMC,OAAO,CAACH,eAAeA,cAAc;QAACA;KAAY;IACtE,MAAMI,WAAsC;QAC1C,GAAGH,KAAK;QACRI,QAAQJ,MAAMI,MAAM;QACpBC,MAAM,CAACC,QAAUH,QAAQ,CAACG,MAAM;QAChC,qDAAqD;QACrD,8DAA8D;QAC9D,CAACC,OAAOC,QAAQ,CAAC,EAAE,UAAUC;YAC3B,+CAA+C;YAC/C,IAAK,IAAIC,IAAI,GAAGA,IAAIP,SAASC,MAAM,EAAEM,IAAK;gBACxC,MAAMP,QAAQ,CAACO,EAAE;YACnB;QACF;IACF;IACA,yDAAyD;IACzDP,SAAS,WAAW,GAAGL,OAAOa,QAAQ;IACtC,IAAIb,OAAOa,QAAQ,EAAE;QACnBC,OAAOC,cAAc,CAACV,UAAUL,OAAOa,QAAQ,CAACG,SAAS;IAC3D;IACAF,OAAOG,MAAM,CAACZ;IACd,OAAOA;AACT"}
|
|
@@ -3,7 +3,7 @@ import { type MatchMediaChangeViewport, type MatchMediaMatcher } from "../mocks/
|
|
|
3
3
|
* @since 6.0.0
|
|
4
4
|
*/
|
|
5
5
|
export interface MatchMediaMockFunction {
|
|
6
|
-
mockImplementation(fn: typeof
|
|
6
|
+
mockImplementation(fn: typeof globalThis.matchMedia): this;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Used to create a `spyOn(window, "matchMedia")` without knowing the test
|
|
@@ -51,15 +51,15 @@ import { BASE_MEDIA_QUERY_LIST, matchDesktop } from "../mocks/match-media.js";
|
|
|
51
51
|
}));
|
|
52
52
|
const changeViewport = (matcher, disableAct = false)=>{
|
|
53
53
|
const update = ()=>{
|
|
54
|
-
|
|
54
|
+
globalThis.dispatchEvent(new Event("resize"));
|
|
55
55
|
const event = new Event("change");
|
|
56
|
-
listeners.
|
|
56
|
+
for (const [query, listener] of listeners.entries()){
|
|
57
57
|
listener({
|
|
58
58
|
...event,
|
|
59
59
|
media: "",
|
|
60
60
|
matches: matcher(query)
|
|
61
61
|
});
|
|
62
|
-
}
|
|
62
|
+
}
|
|
63
63
|
};
|
|
64
64
|
if (disableAct) {
|
|
65
65
|
update();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/utils/createMatchMediaSpy.ts"],"sourcesContent":["import { act } from \"@testing-library/react\";\n\nimport {\n BASE_MEDIA_QUERY_LIST,\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface MatchMediaMockFunction {\n mockImplementation(fn: typeof
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/utils/createMatchMediaSpy.ts"],"sourcesContent":["import { act } from \"@testing-library/react\";\n\nimport {\n BASE_MEDIA_QUERY_LIST,\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface MatchMediaMockFunction {\n mockImplementation(fn: typeof globalThis.matchMedia): this;\n}\n\n/**\n * Used to create a `spyOn(window, \"matchMedia\")` without knowing the test\n * framework.\n *\n * @example Setup Test Framework\n * ```tsx\n * export function spyOnMatchMedia(\n * defaultMatch: MatchMediaMatcher = matchDesktop\n * ): jest.SpiedFunction<typeof window.matchMedia> & MatchMediaChangeViewport {\n * return createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"), defaultMatch);\n * }\n * ```\n *\n * NOTE: The `spyOnMatchMedia` function **must** not call the `.spyOn`\n * immediately to work correctly. The spy needs to be invoked whenever this is\n * called instead. For example, this is bad and will fail:\n *\n * @example Bad Example\n * ```tsx\n * export const spyOnMatchMedia = createMatchMediaSpy.bind(null, jest.spy(window, \"matchMedia\"));\n * ```\n *\n * This is mostly a reminder to myself since I wanted something like the\n * following code, but failed:\n *\n * ```ts\n * export const spyOnMatchMedia = createMatchMediaSpy(jest.spyOn(window, \"matchMedia\"));\n * ```\n *\n * @since 6.0.0\n * @internal\n */\nexport function createMatchMediaSpy<SpyFunction extends MatchMediaMockFunction>(\n matchMediaSpy: SpyFunction,\n defaultMatch: MatchMediaMatcher = matchDesktop\n): SpyFunction & MatchMediaChangeViewport {\n type Listener = (event: MediaQueryListEvent) => void;\n\n const listeners = new Map<string, Listener>();\n const matchMedia = matchMediaSpy.mockImplementation((query) => ({\n ...BASE_MEDIA_QUERY_LIST,\n addEventListener(type: string, listener: Listener | EventListenerObject) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.set(query, listener);\n },\n removeEventListener(\n type: string,\n listener: Listener | EventListenerObject\n ) {\n /* c8 ignore start */\n if (typeof listener !== \"function\" || type !== \"change\") {\n return;\n }\n /* c8 ignore stop */\n\n listeners.delete(query);\n },\n matches: defaultMatch(query),\n }));\n\n const changeViewport = (\n matcher: MatchMediaMatcher,\n disableAct = false\n ): void => {\n const update = (): void => {\n globalThis.dispatchEvent(new Event(\"resize\"));\n\n const event = new Event(\"change\");\n for (const [query, listener] of listeners.entries()) {\n listener({\n ...event,\n media: \"\",\n matches: matcher(query),\n });\n }\n };\n if (disableAct) {\n update();\n } else {\n act(update);\n }\n };\n\n const mock = matchMedia as SpyFunction & MatchMediaChangeViewport;\n mock.changeViewport = changeViewport;\n\n return mock;\n}\n"],"names":["act","BASE_MEDIA_QUERY_LIST","matchDesktop","createMatchMediaSpy","matchMediaSpy","defaultMatch","listeners","Map","matchMedia","mockImplementation","query","addEventListener","type","listener","set","removeEventListener","delete","matches","changeViewport","matcher","disableAct","update","globalThis","dispatchEvent","Event","event","entries","media","mock"],"mappings":"AAAA,SAASA,GAAG,QAAQ,yBAAyB;AAE7C,SACEC,qBAAqB,EAGrBC,YAAY,QACP,0BAA0B;AASjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BC,GACD,OAAO,SAASC,oBACdC,aAA0B,EAC1BC,eAAkCH,YAAY;IAI9C,MAAMI,YAAY,IAAIC;IACtB,MAAMC,aAAaJ,cAAcK,kBAAkB,CAAC,CAACC,QAAW,CAAA;YAC9D,GAAGT,qBAAqB;YACxBU,kBAAiBC,IAAY,EAAEC,QAAwC;gBACrE,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUQ,GAAG,CAACJ,OAAOG;YACvB;YACAE,qBACEH,IAAY,EACZC,QAAwC;gBAExC,mBAAmB,GACnB,IAAI,OAAOA,aAAa,cAAcD,SAAS,UAAU;oBACvD;gBACF;gBACA,kBAAkB,GAElBN,UAAUU,MAAM,CAACN;YACnB;YACAO,SAASZ,aAAaK;QACxB,CAAA;IAEA,MAAMQ,iBAAiB,CACrBC,SACAC,aAAa,KAAK;QAElB,MAAMC,SAAS;YACbC,WAAWC,aAAa,CAAC,IAAIC,MAAM;YAEnC,MAAMC,QAAQ,IAAID,MAAM;YACxB,KAAK,MAAM,CAACd,OAAOG,SAAS,IAAIP,UAAUoB,OAAO,GAAI;gBACnDb,SAAS;oBACP,GAAGY,KAAK;oBACRE,OAAO;oBACPV,SAASE,QAAQT;gBACnB;YACF;QACF;QACA,IAAIU,YAAY;YACdC;QACF,OAAO;YACLrB,IAAIqB;QACN;IACF;IAEA,MAAMO,OAAOpB;IACboB,KAAKV,cAAc,GAAGA;IAEtB,OAAOU;AACT"}
|
|
@@ -28,4 +28,4 @@ import { type MatchMediaChangeViewport, type MatchMediaMatcher } from "../mocks/
|
|
|
28
28
|
*
|
|
29
29
|
* @since 6.0.0
|
|
30
30
|
*/
|
|
31
|
-
export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): MockInstance<typeof
|
|
31
|
+
export declare function spyOnMatchMedia(defaultMatch?: MatchMediaMatcher): MockInstance<typeof globalThis.matchMedia> & MatchMediaChangeViewport;
|
|
@@ -29,7 +29,7 @@ import { createMatchMediaSpy } from "../utils/createMatchMediaSpy.js";
|
|
|
29
29
|
*
|
|
30
30
|
* @since 6.0.0
|
|
31
31
|
*/ export function spyOnMatchMedia(defaultMatch = matchDesktop) {
|
|
32
|
-
return createMatchMediaSpy(vi.spyOn(
|
|
32
|
+
return createMatchMediaSpy(vi.spyOn(globalThis, "matchMedia"), defaultMatch);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
//# sourceMappingURL=match-media.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/vitest/match-media.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): MockInstance<typeof
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/vitest/match-media.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\nimport {\n type MatchMediaChangeViewport,\n type MatchMediaMatcher,\n matchDesktop,\n} from \"../mocks/match-media.js\";\nimport { createMatchMediaSpy } from \"../utils/createMatchMediaSpy.js\";\n\n/**\n * @example Default Behavior\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia();\n * render(<Test />);\n *\n * // expect desktop results\n *\n * matchMedia.changeViewport(matchPhone);\n * // expect phone results\n * ```\n *\n * @example Set Default Media\n * ```tsx\n * import { matchPhone, render } from \"@react-md/core/test-utils\";\n * import { spyOnMatchMedia } from \"@react-md/core/test-utils/vitest\";\n *\n * const matchMedia = spyOnMatchMedia(matchPhone);\n * render(<Test />);\n *\n * // expect phone results\n * ```\n *\n * @since 6.0.0\n */\nexport function spyOnMatchMedia(\n defaultMatch: MatchMediaMatcher = matchDesktop\n): MockInstance<typeof globalThis.matchMedia> & MatchMediaChangeViewport {\n return createMatchMediaSpy(vi.spyOn(globalThis, \"matchMedia\"), defaultMatch);\n}\n"],"names":["vi","matchDesktop","createMatchMediaSpy","spyOnMatchMedia","defaultMatch","spyOn","globalThis"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAE/C,SAGEC,YAAY,QACP,0BAA0B;AACjC,SAASC,mBAAmB,QAAQ,kCAAkC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,gBACdC,eAAkCH,YAAY;IAE9C,OAAOC,oBAAoBF,GAAGK,KAAK,CAACC,YAAY,eAAeF;AACjE"}
|
|
@@ -34,7 +34,7 @@ import { vi } from "vitest";
|
|
|
34
34
|
* ```
|
|
35
35
|
*
|
|
36
36
|
* @since 6.0.0
|
|
37
|
-
*/ export const testImmediateRaf = ()=>vi.spyOn(
|
|
37
|
+
*/ export const testImmediateRaf = ()=>vi.spyOn(globalThis, "requestAnimationFrame").mockImplementation((cb)=>{
|
|
38
38
|
cb(0);
|
|
39
39
|
return 0;
|
|
40
40
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/vitest/timers.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = MockInstance<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n *\n * // reset to original at the end of the test\n * raf.mockRestore()\n * });\n * });\n * ```\n *\n * @example Automatic Cleanup\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * afterEach(() => {\n * vi.restoreAllMocks();\n * });\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport const testImmediateRaf = (): RafSpy =>\n vi.spyOn(
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/vitest/timers.ts"],"sourcesContent":["import { type MockInstance, vi } from \"vitest\";\n\n/**\n * @since 6.0.0\n */\nexport type RafSpy = MockInstance<typeof requestAnimationFrame>;\n\n/**\n * @example\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n *\n * // reset to original at the end of the test\n * raf.mockRestore()\n * });\n * });\n * ```\n *\n * @example Automatic Cleanup\n * ```ts\n * import { testImmediateRaf } from \"@react-md/core/test-utils/vitest\";\n *\n * afterEach(() => {\n * vi.restoreAllMocks();\n * });\n *\n * describe(\"some test suite\", () => {\n * it(\"should test something with requestAnimationFrame\", () => {\n * const raf = testImmediateRaf();\n *\n * // do some testing with requestAnimationFrame\n * });\n * });\n * ```\n *\n * @since 6.0.0\n */\nexport const testImmediateRaf = (): RafSpy =>\n vi.spyOn(globalThis, \"requestAnimationFrame\").mockImplementation((cb) => {\n cb(0);\n return 0;\n });\n"],"names":["vi","testImmediateRaf","spyOn","globalThis","mockImplementation","cb"],"mappings":"AAAA,SAA4BA,EAAE,QAAQ,SAAS;AAO/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCC,GACD,OAAO,MAAMC,mBAAmB,IAC9BD,GAAGE,KAAK,CAACC,YAAY,yBAAyBC,kBAAkB,CAAC,CAACC;QAChEA,GAAG;QACH,OAAO;IACT,GAAG"}
|
|
@@ -29,7 +29,7 @@ import { createFileList } from "../utils/createFileList.js";
|
|
|
29
29
|
vitest.spyOn(input, "click").mockImplementationOnce(()=>{
|
|
30
30
|
fireEvent.change(input, {
|
|
31
31
|
target: {
|
|
32
|
-
files: createFileList(window, files)
|
|
32
|
+
files: createFileList(globalThis.window, files)
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
35
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/test-utils/vitest/uploadMenuItemFileInput.ts"],"sourcesContent":["import { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\nimport { vitest } from \"vitest\";\n\nimport { createFileList } from \"../utils/createFileList.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface UploadMenuItemFileUploadOptions {\n user: UserEvent;\n files: File | readonly File[];\n menuItem: HTMLElement;\n}\n\n/**\n * @example Main Example\n * ```tsx\n * const user = userEvent.setup()\n * render(<Test />);\n *\n * await user.click(screen.getByRole(\"button\", { name: \"Dropdown Menu\" }));\n *\n * const menuItem = screen.getByRole(\"menuitem\", { name: \"Upload\" });\n * const file = new File([\"pretend-bytes\"], \"README.txt\");\n * await uploadMenuItemFileUpload({\n * user,\n * // can be a single file or multiple\n * files: file,\n * menuItem,\n * });\n *\n * // expect something with uploaded file\n * ```\n *\n * @since 6.0.0\n */\nexport async function uploadMenuItemFileUpload(\n options: UploadMenuItemFileUploadOptions\n): Promise<void> {\n const { user, files, menuItem } = options;\n\n const input = document.createElement(\"input\");\n vitest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n vitest.spyOn(input, \"click\").mockImplementationOnce(() => {\n fireEvent.change(input, {\n target: { files: createFileList(window, files) },\n });\n });\n\n await user.click(menuItem);\n}\n"],"names":["fireEvent","vitest","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","window","click"],"mappings":"AAAA,SAASA,SAAS,QAAQ,uBAAuB;AAEjD,SAASC,MAAM,QAAQ,SAAS;AAEhC,SAASC,cAAc,QAAQ,6BAA6B;AAW5D;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,yBACpBC,OAAwC;IAExC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGH;IAElC,MAAMI,QAAQC,SAASC,aAAa,CAAC;IACrCT,OAAOU,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC5DP,OAAOU,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAClDb,UAAUc,MAAM,CAACN,OAAO;YACtBO,QAAQ;gBAAET,OAAOJ,eAAec,
|
|
1
|
+
{"version":3,"sources":["../../../src/test-utils/vitest/uploadMenuItemFileInput.ts"],"sourcesContent":["import { fireEvent } from \"@testing-library/dom\";\nimport { type UserEvent } from \"@testing-library/user-event\";\nimport { vitest } from \"vitest\";\n\nimport { createFileList } from \"../utils/createFileList.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface UploadMenuItemFileUploadOptions {\n user: UserEvent;\n files: File | readonly File[];\n menuItem: HTMLElement;\n}\n\n/**\n * @example Main Example\n * ```tsx\n * const user = userEvent.setup()\n * render(<Test />);\n *\n * await user.click(screen.getByRole(\"button\", { name: \"Dropdown Menu\" }));\n *\n * const menuItem = screen.getByRole(\"menuitem\", { name: \"Upload\" });\n * const file = new File([\"pretend-bytes\"], \"README.txt\");\n * await uploadMenuItemFileUpload({\n * user,\n * // can be a single file or multiple\n * files: file,\n * menuItem,\n * });\n *\n * // expect something with uploaded file\n * ```\n *\n * @since 6.0.0\n */\nexport async function uploadMenuItemFileUpload(\n options: UploadMenuItemFileUploadOptions\n): Promise<void> {\n const { user, files, menuItem } = options;\n\n const input = document.createElement(\"input\");\n vitest.spyOn(document, \"createElement\").mockReturnValueOnce(input);\n vitest.spyOn(input, \"click\").mockImplementationOnce(() => {\n fireEvent.change(input, {\n target: { files: createFileList(globalThis.window, files) },\n });\n });\n\n await user.click(menuItem);\n}\n"],"names":["fireEvent","vitest","createFileList","uploadMenuItemFileUpload","options","user","files","menuItem","input","document","createElement","spyOn","mockReturnValueOnce","mockImplementationOnce","change","target","globalThis","window","click"],"mappings":"AAAA,SAASA,SAAS,QAAQ,uBAAuB;AAEjD,SAASC,MAAM,QAAQ,SAAS;AAEhC,SAASC,cAAc,QAAQ,6BAA6B;AAW5D;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,eAAeC,yBACpBC,OAAwC;IAExC,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGH;IAElC,MAAMI,QAAQC,SAASC,aAAa,CAAC;IACrCT,OAAOU,KAAK,CAACF,UAAU,iBAAiBG,mBAAmB,CAACJ;IAC5DP,OAAOU,KAAK,CAACH,OAAO,SAASK,sBAAsB,CAAC;QAClDb,UAAUc,MAAM,CAACN,OAAO;YACtBO,QAAQ;gBAAET,OAAOJ,eAAec,WAAWC,MAAM,EAAEX;YAAO;QAC5D;IACF;IAEA,MAAMD,KAAKa,KAAK,CAACX;AACnB"}
|
|
@@ -122,11 +122,11 @@ const { Provider } = context;
|
|
|
122
122
|
// NOTE: This will not be correct the first time a new theme is lazy-loaded
|
|
123
123
|
// and applied. It might be good to have a way to manually force this flow
|
|
124
124
|
// again?
|
|
125
|
-
const frame =
|
|
125
|
+
const frame = globalThis.requestAnimationFrame(()=>{
|
|
126
126
|
setDerivedTheme(getDerivedTheme(document.documentElement));
|
|
127
127
|
});
|
|
128
128
|
return ()=>{
|
|
129
|
-
|
|
129
|
+
globalThis.cancelAnimationFrame(frame);
|
|
130
130
|
};
|
|
131
131
|
}, [
|
|
132
132
|
theme,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ReactElement,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useSsr } from \"../SsrProvider.js\";\nimport { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME } from \"./constants.js\";\nimport { getDerivedTheme } from \"./getDerivedTheme.js\";\nimport { type ConfigurableThemeColors, type ThemeContext } from \"./types.js\";\nimport { useColorScheme } from \"./useColorScheme.js\";\n\nconst context = createContext<Readonly<ThemeContext> | undefined>(undefined);\ncontext.displayName = \"Theme\";\nconst { Provider } = context;\n\n/**\n * This hook can be used to access the current theme set by the\n * {@link ThemeProvider}.\n *\n * @example Simple Example\n * ```tsx\n * import { useTheme } from \"@react-md/core/theme/ThemeProvider\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const theme = useTheme();\n *\n * return <pre><code>{JSON.stringify(theme, null, 2)}</code></pre>;\n * }\n * ```\n *\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(): Readonly<ThemeContext>;\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function useTheme(\n allowUndefined: true\n): Readonly<ThemeContext> | undefined;\n\n/**\n * @internal\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(\n allowUndefined?: boolean\n): Readonly<ThemeContext> | undefined {\n const theme = useContext(context);\n if (!theme && !allowUndefined) {\n throw new Error(\"The `ThemeProvider` has not been initialized.\");\n }\n\n return theme;\n}\n\n/** @since 6.0.0 */\nexport interface ThemeProviderProps {\n /**\n * When this is `undefined`, the theme will be derived by computing the\n * `document.documentElement`'s styles for all the `react-md` theme custom\n * properties. The theme will also automatically update whenever the\n * `currentColor` or `colorScheme` change.\n *\n * It is recommended to manually provide your theme if you know it beforehand.\n * Deriving the theme is really only useful if you allow your user to\n * customize all these theme values themselves and persist through local\n * storage/cookies.\n *\n * @see {@link DEFAULT_DARK_THEME}\n * @see {@link DEFAULT_LIGHT_THEME}\n * @defaultValue `currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME`\n */\n theme?: Readonly<ConfigurableThemeColors>;\n\n children: ReactNode;\n}\n\n/**\n * **Client Component**\n *\n * The `ThemeProvider` should be added to the root of your app but as a child of\n * the `CoreProviders`.\n *\n * @example\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import {\n * black,\n * blue500,\n * greenAccent700,\n * orangeAccent200,\n * orangeAccent400,\n * red500,\n * } from \"@react-md/core/theme/colors\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ConfigurableThemeColors } from \"@react-md/core/theme/types\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const theme: Readonly<ConfigurableThemeColors> = {\n * primaryColor: blue500,\n * onPrimaryColor: black,\n * secondaryColor: orangeAccent400,\n * onSecondaryColor: black,\n * warningColor: orangeAccent200,\n * onWarningColor: black,\n * errorColor: red500,\n * onErrorColor: black,\n * successColor: greenAccent700,\n * onSuccessColor: black,\n * backgroundColor: \"#121212\",\n * textPrimaryColor: \"#d9d9d9\",\n * textSecondaryColor: \"#b3b3b3\",\n * textHintColor: \"gray\", // #808080\n * textDisabledColor: \"gray\", // #808080\n * };\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <ThemeProvider theme={theme}>\n * <App />\n * </ThemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @example Automatically Deriving the Theme\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import { LocalStorageColorSchemeProvider } from \"@react-md/core/theme/LocalStorageColorSchemeProvider\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <LocalStorageColorSchemeProvider>\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * </LocalStorageColorSchemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @see {@link https://react-md.dev/components/theme-provider | ThemeProvider Demos}\n * @since 6.0.0\n */\nexport function ThemeProvider(props: ThemeProviderProps): ReactElement {\n const { children, theme } = props;\n const ssr = useSsr();\n const { currentColor, colorScheme } = useColorScheme();\n const [derivedTheme, setDerivedTheme] = useState<ConfigurableThemeColors>(\n () => {\n if (theme) {\n return theme;\n }\n\n if (!ssr && typeof document !== \"undefined\") {\n return getDerivedTheme(document.documentElement);\n }\n\n return currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME;\n }\n );\n\n const derived = !theme;\n useEffect(() => {\n if (theme) {\n return;\n }\n\n // This has to be recalculated after an animation to ensure the new theme\n // styles have been applied. It will use the previous theme styles without\n // this frame.\n //\n // NOTE: This will not be correct the first time a new theme is lazy-loaded\n // and applied. It might be good to have a way to manually force this flow\n // again?\n const frame = window.requestAnimationFrame(() => {\n setDerivedTheme(getDerivedTheme(document.documentElement));\n });\n\n return () => {\n window.cancelAnimationFrame(frame);\n };\n }, [theme, currentColor, colorScheme]);\n\n const value = useMemo<ThemeContext>(() => {\n const backgroundColor =\n theme?.backgroundColor ?? derivedTheme.backgroundColor;\n const primaryColor = theme?.primaryColor ?? derivedTheme.primaryColor;\n const onPrimaryColor = theme?.onPrimaryColor ?? derivedTheme.onPrimaryColor;\n const secondaryColor = theme?.secondaryColor ?? derivedTheme.secondaryColor;\n const onSecondaryColor =\n theme?.onSecondaryColor ?? derivedTheme.onSecondaryColor;\n const warningColor = theme?.warningColor ?? derivedTheme.warningColor;\n const onWarningColor = theme?.onWarningColor ?? derivedTheme.onWarningColor;\n const errorColor = theme?.errorColor ?? derivedTheme.errorColor;\n const onErrorColor = theme?.onErrorColor ?? derivedTheme.onErrorColor;\n const successColor = theme?.successColor ?? derivedTheme.successColor;\n const onSuccessColor = theme?.onSuccessColor ?? derivedTheme.onSuccessColor;\n const textPrimaryColor =\n theme?.textPrimaryColor ?? derivedTheme.textPrimaryColor;\n const textSecondaryColor =\n theme?.textSecondaryColor ?? derivedTheme.textSecondaryColor;\n const textHintColor = theme?.textHintColor ?? derivedTheme.textHintColor;\n const textDisabledColor =\n theme?.textDisabledColor ?? derivedTheme.textDisabledColor;\n\n return {\n derived,\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n setDerivedTheme,\n };\n }, [\n derived,\n derivedTheme.backgroundColor,\n derivedTheme.errorColor,\n derivedTheme.onErrorColor,\n derivedTheme.onPrimaryColor,\n derivedTheme.onSecondaryColor,\n derivedTheme.onSuccessColor,\n derivedTheme.onWarningColor,\n derivedTheme.primaryColor,\n derivedTheme.secondaryColor,\n derivedTheme.successColor,\n derivedTheme.textDisabledColor,\n derivedTheme.textHintColor,\n derivedTheme.textPrimaryColor,\n derivedTheme.textSecondaryColor,\n derivedTheme.warningColor,\n theme?.backgroundColor,\n theme?.errorColor,\n theme?.onErrorColor,\n theme?.onPrimaryColor,\n theme?.onSecondaryColor,\n theme?.onSuccessColor,\n theme?.onWarningColor,\n theme?.primaryColor,\n theme?.secondaryColor,\n theme?.successColor,\n theme?.textDisabledColor,\n theme?.textHintColor,\n theme?.textPrimaryColor,\n theme?.textSecondaryColor,\n theme?.warningColor,\n ]);\n\n return <Provider value={value}>{children}</Provider>;\n}\n"],"names":["createContext","useContext","useEffect","useMemo","useState","useSsr","DEFAULT_DARK_THEME","DEFAULT_LIGHT_THEME","getDerivedTheme","useColorScheme","context","undefined","displayName","Provider","useTheme","allowUndefined","theme","Error","ThemeProvider","props","children","ssr","currentColor","colorScheme","derivedTheme","setDerivedTheme","document","documentElement","derived","frame","window","requestAnimationFrame","cancelAnimationFrame","value","backgroundColor","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type ReactElement,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\nimport { useSsr } from \"../SsrProvider.js\";\nimport { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME } from \"./constants.js\";\nimport { getDerivedTheme } from \"./getDerivedTheme.js\";\nimport { type ConfigurableThemeColors, type ThemeContext } from \"./types.js\";\nimport { useColorScheme } from \"./useColorScheme.js\";\n\nconst context = createContext<Readonly<ThemeContext> | undefined>(undefined);\ncontext.displayName = \"Theme\";\nconst { Provider } = context;\n\n/**\n * This hook can be used to access the current theme set by the\n * {@link ThemeProvider}.\n *\n * @example Simple Example\n * ```tsx\n * import { useTheme } from \"@react-md/core/theme/ThemeProvider\";\n * import type { ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const theme = useTheme();\n *\n * return <pre><code>{JSON.stringify(theme, null, 2)}</code></pre>;\n * }\n * ```\n *\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(): Readonly<ThemeContext>;\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function useTheme(\n allowUndefined: true\n): Readonly<ThemeContext> | undefined;\n\n/**\n * @internal\n * @since 6.0.0\n * @throws \"The `ThemeProvider` has not been initialized.\"\n */\nexport function useTheme(\n allowUndefined?: boolean\n): Readonly<ThemeContext> | undefined {\n const theme = useContext(context);\n if (!theme && !allowUndefined) {\n throw new Error(\"The `ThemeProvider` has not been initialized.\");\n }\n\n return theme;\n}\n\n/** @since 6.0.0 */\nexport interface ThemeProviderProps {\n /**\n * When this is `undefined`, the theme will be derived by computing the\n * `document.documentElement`'s styles for all the `react-md` theme custom\n * properties. The theme will also automatically update whenever the\n * `currentColor` or `colorScheme` change.\n *\n * It is recommended to manually provide your theme if you know it beforehand.\n * Deriving the theme is really only useful if you allow your user to\n * customize all these theme values themselves and persist through local\n * storage/cookies.\n *\n * @see {@link DEFAULT_DARK_THEME}\n * @see {@link DEFAULT_LIGHT_THEME}\n * @defaultValue `currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME`\n */\n theme?: Readonly<ConfigurableThemeColors>;\n\n children: ReactNode;\n}\n\n/**\n * **Client Component**\n *\n * The `ThemeProvider` should be added to the root of your app but as a child of\n * the `CoreProviders`.\n *\n * @example\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import {\n * black,\n * blue500,\n * greenAccent700,\n * orangeAccent200,\n * orangeAccent400,\n * red500,\n * } from \"@react-md/core/theme/colors\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ConfigurableThemeColors } from \"@react-md/core/theme/types\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const theme: Readonly<ConfigurableThemeColors> = {\n * primaryColor: blue500,\n * onPrimaryColor: black,\n * secondaryColor: orangeAccent400,\n * onSecondaryColor: black,\n * warningColor: orangeAccent200,\n * onWarningColor: black,\n * errorColor: red500,\n * onErrorColor: black,\n * successColor: greenAccent700,\n * onSuccessColor: black,\n * backgroundColor: \"#121212\",\n * textPrimaryColor: \"#d9d9d9\",\n * textSecondaryColor: \"#b3b3b3\",\n * textHintColor: \"gray\", // #808080\n * textDisabledColor: \"gray\", // #808080\n * };\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <ThemeProvider theme={theme}>\n * <App />\n * </ThemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @example Automatically Deriving the Theme\n * ```tsx\n * import { CoreProviders } from \"@react-md/core/CoreProviders\";\n * import { LocalStorageColorSchemeProvider } from \"@react-md/core/theme/LocalStorageColorSchemeProvider\";\n * import { ThemeProvider } from \"@react-md/core/theme/ThemeProvider\";\n * import { type ReactElement } from \"react\";\n * import { createRoot } from \"react-dom/client\";\n *\n * import App from \"./App\";\n *\n * const container = document.getElementById(\"app\");\n * const root = createRoot(container);\n * root.render(\n * <CoreProviders>\n * <LocalStorageColorSchemeProvider>\n * <ThemeProvider>\n * <App />\n * </ThemeProvider>\n * </LocalStorageColorSchemeProvider>\n * </CoreProviders>\n * );\n * ```\n *\n * @see {@link https://react-md.dev/components/theme-provider | ThemeProvider Demos}\n * @since 6.0.0\n */\nexport function ThemeProvider(props: ThemeProviderProps): ReactElement {\n const { children, theme } = props;\n const ssr = useSsr();\n const { currentColor, colorScheme } = useColorScheme();\n const [derivedTheme, setDerivedTheme] = useState<ConfigurableThemeColors>(\n () => {\n if (theme) {\n return theme;\n }\n\n if (!ssr && typeof document !== \"undefined\") {\n return getDerivedTheme(document.documentElement);\n }\n\n return currentColor === \"dark\" ? DEFAULT_DARK_THEME : DEFAULT_LIGHT_THEME;\n }\n );\n\n const derived = !theme;\n useEffect(() => {\n if (theme) {\n return;\n }\n\n // This has to be recalculated after an animation to ensure the new theme\n // styles have been applied. It will use the previous theme styles without\n // this frame.\n //\n // NOTE: This will not be correct the first time a new theme is lazy-loaded\n // and applied. It might be good to have a way to manually force this flow\n // again?\n const frame = globalThis.requestAnimationFrame(() => {\n setDerivedTheme(getDerivedTheme(document.documentElement));\n });\n\n return () => {\n globalThis.cancelAnimationFrame(frame);\n };\n }, [theme, currentColor, colorScheme]);\n\n const value = useMemo<ThemeContext>(() => {\n const backgroundColor =\n theme?.backgroundColor ?? derivedTheme.backgroundColor;\n const primaryColor = theme?.primaryColor ?? derivedTheme.primaryColor;\n const onPrimaryColor = theme?.onPrimaryColor ?? derivedTheme.onPrimaryColor;\n const secondaryColor = theme?.secondaryColor ?? derivedTheme.secondaryColor;\n const onSecondaryColor =\n theme?.onSecondaryColor ?? derivedTheme.onSecondaryColor;\n const warningColor = theme?.warningColor ?? derivedTheme.warningColor;\n const onWarningColor = theme?.onWarningColor ?? derivedTheme.onWarningColor;\n const errorColor = theme?.errorColor ?? derivedTheme.errorColor;\n const onErrorColor = theme?.onErrorColor ?? derivedTheme.onErrorColor;\n const successColor = theme?.successColor ?? derivedTheme.successColor;\n const onSuccessColor = theme?.onSuccessColor ?? derivedTheme.onSuccessColor;\n const textPrimaryColor =\n theme?.textPrimaryColor ?? derivedTheme.textPrimaryColor;\n const textSecondaryColor =\n theme?.textSecondaryColor ?? derivedTheme.textSecondaryColor;\n const textHintColor = theme?.textHintColor ?? derivedTheme.textHintColor;\n const textDisabledColor =\n theme?.textDisabledColor ?? derivedTheme.textDisabledColor;\n\n return {\n derived,\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n setDerivedTheme,\n };\n }, [\n derived,\n derivedTheme.backgroundColor,\n derivedTheme.errorColor,\n derivedTheme.onErrorColor,\n derivedTheme.onPrimaryColor,\n derivedTheme.onSecondaryColor,\n derivedTheme.onSuccessColor,\n derivedTheme.onWarningColor,\n derivedTheme.primaryColor,\n derivedTheme.secondaryColor,\n derivedTheme.successColor,\n derivedTheme.textDisabledColor,\n derivedTheme.textHintColor,\n derivedTheme.textPrimaryColor,\n derivedTheme.textSecondaryColor,\n derivedTheme.warningColor,\n theme?.backgroundColor,\n theme?.errorColor,\n theme?.onErrorColor,\n theme?.onPrimaryColor,\n theme?.onSecondaryColor,\n theme?.onSuccessColor,\n theme?.onWarningColor,\n theme?.primaryColor,\n theme?.secondaryColor,\n theme?.successColor,\n theme?.textDisabledColor,\n theme?.textHintColor,\n theme?.textPrimaryColor,\n theme?.textSecondaryColor,\n theme?.warningColor,\n ]);\n\n return <Provider value={value}>{children}</Provider>;\n}\n"],"names":["createContext","useContext","useEffect","useMemo","useState","useSsr","DEFAULT_DARK_THEME","DEFAULT_LIGHT_THEME","getDerivedTheme","useColorScheme","context","undefined","displayName","Provider","useTheme","allowUndefined","theme","Error","ThemeProvider","props","children","ssr","currentColor","colorScheme","derivedTheme","setDerivedTheme","document","documentElement","derived","frame","globalThis","requestAnimationFrame","cancelAnimationFrame","value","backgroundColor","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { backgroundColorVar, errorColorVar, onErrorColorVar, onPrimaryColorVar, onSecondaryColorVar, onSuccessColorVar, onWarningColorVar, primaryColorVar, secondaryColorVar, successColorVar, textDisabledColorVar, textHintColorVar, textPrimaryColorVar, textSecondaryColorVar, warningColorVar } from "./cssVars.js";
|
|
2
2
|
/** @since 6.0.0 */ export const getDerivedTheme = (container = document.documentElement)=>{
|
|
3
|
-
const rootStyles =
|
|
3
|
+
const rootStyles = globalThis.getComputedStyle(container);
|
|
4
4
|
const backgroundColor = rootStyles.getPropertyValue(backgroundColorVar);
|
|
5
5
|
const primaryColor = rootStyles.getPropertyValue(primaryColorVar);
|
|
6
6
|
const onPrimaryColor = rootStyles.getPropertyValue(onPrimaryColorVar);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theme/getDerivedTheme.ts"],"sourcesContent":["import {\n backgroundColorVar,\n errorColorVar,\n onErrorColorVar,\n onPrimaryColorVar,\n onSecondaryColorVar,\n onSuccessColorVar,\n onWarningColorVar,\n primaryColorVar,\n secondaryColorVar,\n successColorVar,\n textDisabledColorVar,\n textHintColorVar,\n textPrimaryColorVar,\n textSecondaryColorVar,\n warningColorVar,\n} from \"./cssVars.js\";\nimport { type ConfigurableThemeColors } from \"./types.js\";\n\n/** @since 6.0.0 */\nexport const getDerivedTheme = (\n container: Element = document.documentElement\n): Readonly<ConfigurableThemeColors> => {\n const rootStyles =
|
|
1
|
+
{"version":3,"sources":["../../src/theme/getDerivedTheme.ts"],"sourcesContent":["import {\n backgroundColorVar,\n errorColorVar,\n onErrorColorVar,\n onPrimaryColorVar,\n onSecondaryColorVar,\n onSuccessColorVar,\n onWarningColorVar,\n primaryColorVar,\n secondaryColorVar,\n successColorVar,\n textDisabledColorVar,\n textHintColorVar,\n textPrimaryColorVar,\n textSecondaryColorVar,\n warningColorVar,\n} from \"./cssVars.js\";\nimport { type ConfigurableThemeColors } from \"./types.js\";\n\n/** @since 6.0.0 */\nexport const getDerivedTheme = (\n container: Element = document.documentElement\n): Readonly<ConfigurableThemeColors> => {\n const rootStyles = globalThis.getComputedStyle(container);\n const backgroundColor = rootStyles.getPropertyValue(backgroundColorVar);\n const primaryColor = rootStyles.getPropertyValue(primaryColorVar);\n const onPrimaryColor = rootStyles.getPropertyValue(onPrimaryColorVar);\n const secondaryColor = rootStyles.getPropertyValue(secondaryColorVar);\n const onSecondaryColor = rootStyles.getPropertyValue(onSecondaryColorVar);\n const warningColor = rootStyles.getPropertyValue(warningColorVar);\n const onWarningColor = rootStyles.getPropertyValue(onWarningColorVar);\n const errorColor = rootStyles.getPropertyValue(errorColorVar);\n const onErrorColor = rootStyles.getPropertyValue(onErrorColorVar);\n const successColor = rootStyles.getPropertyValue(successColorVar);\n const onSuccessColor = rootStyles.getPropertyValue(onSuccessColorVar);\n const textPrimaryColor = rootStyles.getPropertyValue(textPrimaryColorVar);\n const textSecondaryColor = rootStyles.getPropertyValue(textSecondaryColorVar);\n const textHintColor = rootStyles.getPropertyValue(textHintColorVar);\n const textDisabledColor = rootStyles.getPropertyValue(textDisabledColorVar);\n\n return {\n backgroundColor,\n primaryColor,\n onPrimaryColor,\n secondaryColor,\n onSecondaryColor,\n warningColor,\n onWarningColor,\n errorColor,\n onErrorColor,\n successColor,\n onSuccessColor,\n textPrimaryColor,\n textSecondaryColor,\n textHintColor,\n textDisabledColor,\n };\n};\n"],"names":["backgroundColorVar","errorColorVar","onErrorColorVar","onPrimaryColorVar","onSecondaryColorVar","onSuccessColorVar","onWarningColorVar","primaryColorVar","secondaryColorVar","successColorVar","textDisabledColorVar","textHintColorVar","textPrimaryColorVar","textSecondaryColorVar","warningColorVar","getDerivedTheme","container","document","documentElement","rootStyles","globalThis","getComputedStyle","backgroundColor","getPropertyValue","primaryColor","onPrimaryColor","secondaryColor","onSecondaryColor","warningColor","onWarningColor","errorColor","onErrorColor","successColor","onSuccessColor","textPrimaryColor","textSecondaryColor","textHintColor","textDisabledColor"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,aAAa,EACbC,eAAe,EACfC,iBAAiB,EACjBC,mBAAmB,EACnBC,iBAAiB,EACjBC,iBAAiB,EACjBC,eAAe,EACfC,iBAAiB,EACjBC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,EAChBC,mBAAmB,EACnBC,qBAAqB,EACrBC,eAAe,QACV,eAAe;AAGtB,iBAAiB,GACjB,OAAO,MAAMC,kBAAkB,CAC7BC,YAAqBC,SAASC,eAAe;IAE7C,MAAMC,aAAaC,WAAWC,gBAAgB,CAACL;IAC/C,MAAMM,kBAAkBH,WAAWI,gBAAgB,CAACvB;IACpD,MAAMwB,eAAeL,WAAWI,gBAAgB,CAAChB;IACjD,MAAMkB,iBAAiBN,WAAWI,gBAAgB,CAACpB;IACnD,MAAMuB,iBAAiBP,WAAWI,gBAAgB,CAACf;IACnD,MAAMmB,mBAAmBR,WAAWI,gBAAgB,CAACnB;IACrD,MAAMwB,eAAeT,WAAWI,gBAAgB,CAACT;IACjD,MAAMe,iBAAiBV,WAAWI,gBAAgB,CAACjB;IACnD,MAAMwB,aAAaX,WAAWI,gBAAgB,CAACtB;IAC/C,MAAM8B,eAAeZ,WAAWI,gBAAgB,CAACrB;IACjD,MAAM8B,eAAeb,WAAWI,gBAAgB,CAACd;IACjD,MAAMwB,iBAAiBd,WAAWI,gBAAgB,CAAClB;IACnD,MAAM6B,mBAAmBf,WAAWI,gBAAgB,CAACX;IACrD,MAAMuB,qBAAqBhB,WAAWI,gBAAgB,CAACV;IACvD,MAAMuB,gBAAgBjB,WAAWI,gBAAgB,CAACZ;IAClD,MAAM0B,oBAAoBlB,WAAWI,gBAAgB,CAACb;IAEtD,OAAO;QACLY;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;AACF,EAAE"}
|