@sanity/ui 3.3.2 → 3.3.4
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/index.d.mts +8 -8
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.mjs +16 -16
- package/dist/index.mjs.map +1 -1
- package/dist/tabList.js +2 -2
- package/dist/tabList.mjs +2 -2
- package/dist/tabList.mjs.map +1 -1
- package/dist/useTheme.d.mts +3 -3
- package/dist/useTheme.d.mts.map +1 -1
- package/dist/useTheme.d.ts +3 -3
- package/dist/useTheme.d.ts.map +1 -1
- package/package.json +8 -13
- package/exports/_visual-editing.ts +0 -32
- package/exports/index.ts +0 -1
- package/exports/theme.ts +0 -1
- package/src/core/_compat.ts +0 -294
- package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
- package/src/core/components/autocomplete/autocomplete.tsx +0 -775
- package/src/core/components/autocomplete/autocompleteOption.tsx +0 -46
- package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
- package/src/core/components/autocomplete/constants.ts +0 -28
- package/src/core/components/autocomplete/index.ts +0 -2
- package/src/core/components/autocomplete/types.ts +0 -108
- package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
- package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -54
- package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -136
- package/src/core/components/breadcrumbs/index.ts +0 -1
- package/src/core/components/dialog/dialog.tsx +0 -433
- package/src/core/components/dialog/dialogContext.ts +0 -20
- package/src/core/components/dialog/dialogProvider.tsx +0 -35
- package/src/core/components/dialog/index.ts +0 -4
- package/src/core/components/dialog/styles.ts +0 -77
- package/src/core/components/dialog/useDialog.ts +0 -11
- package/src/core/components/hotkeys/hotkeys.test.tsx +0 -47
- package/src/core/components/hotkeys/hotkeys.tsx +0 -68
- package/src/core/components/hotkeys/index.ts +0 -1
- package/src/core/components/index.ts +0 -9
- package/src/core/components/menu/helpers.ts +0 -82
- package/src/core/components/menu/index.ts +0 -5
- package/src/core/components/menu/menu.spacing.test.tsx +0 -68
- package/src/core/components/menu/menu.test.tsx +0 -128
- package/src/core/components/menu/menu.tsx +0 -180
- package/src/core/components/menu/menuButton.tsx +0 -276
- package/src/core/components/menu/menuContext.ts +0 -18
- package/src/core/components/menu/menuDivider.ts +0 -24
- package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -66
- package/src/core/components/menu/menuGroup.tsx +0 -237
- package/src/core/components/menu/menuItem.spacing.test.tsx +0 -62
- package/src/core/components/menu/menuItem.tsx +0 -201
- package/src/core/components/menu/useMenu.ts +0 -21
- package/src/core/components/menu/useMenuController.ts +0 -233
- package/src/core/components/skeleton/index.ts +0 -2
- package/src/core/components/skeleton/skeleton.tsx +0 -58
- package/src/core/components/skeleton/styles.ts +0 -50
- package/src/core/components/skeleton/textSkeleton.tsx +0 -122
- package/src/core/components/tab/index.ts +0 -3
- package/src/core/components/tab/tab.tsx +0 -102
- package/src/core/components/tab/tabList.test.tsx +0 -50
- package/src/core/components/tab/tabList.tsx +0 -71
- package/src/core/components/tab/tabPanel.tsx +0 -39
- package/src/core/components/toast/index.ts +0 -4
- package/src/core/components/toast/styles.ts +0 -77
- package/src/core/components/toast/toast.test.tsx +0 -106
- package/src/core/components/toast/toast.tsx +0 -199
- package/src/core/components/toast/toastContext.ts +0 -7
- package/src/core/components/toast/toastLayer.tsx +0 -52
- package/src/core/components/toast/toastProvider.tsx +0 -113
- package/src/core/components/toast/toastState.ts +0 -6
- package/src/core/components/toast/types.ts +0 -26
- package/src/core/components/toast/useToast.ts +0 -25
- package/src/core/components/tree/helpers.ts +0 -105
- package/src/core/components/tree/index.ts +0 -4
- package/src/core/components/tree/style.ts +0 -105
- package/src/core/components/tree/tree.test.tsx +0 -60
- package/src/core/components/tree/tree.tsx +0 -242
- package/src/core/components/tree/treeContext.ts +0 -10
- package/src/core/components/tree/treeGroup.tsx +0 -29
- package/src/core/components/tree/treeItem.test.tsx +0 -70
- package/src/core/components/tree/treeItem.tsx +0 -225
- package/src/core/components/tree/types.ts +0 -25
- package/src/core/components/tree/useTree.ts +0 -17
- package/src/core/constants.ts +0 -79
- package/src/core/helpers/animation.ts +0 -27
- package/src/core/helpers/element.ts +0 -55
- package/src/core/helpers/focus.ts +0 -100
- package/src/core/helpers/index.ts +0 -4
- package/src/core/helpers/scroll.ts +0 -15
- package/src/core/hooks/index.ts +0 -13
- package/src/core/hooks/useArrayProp.ts +0 -17
- package/src/core/hooks/useClickOutside.test.tsx +0 -510
- package/src/core/hooks/useClickOutside.ts +0 -118
- package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -119
- package/src/core/hooks/useClickOutsideEvent.ts +0 -73
- package/src/core/hooks/useCustomValidity.ts +0 -13
- package/src/core/hooks/useDelayed.test.ts +0 -89
- package/src/core/hooks/useDelayedState.ts +0 -36
- package/src/core/hooks/useElementRect/index.ts +0 -1
- package/src/core/hooks/useElementRect/useElementRect.ts +0 -14
- package/src/core/hooks/useElementSize.ts +0 -19
- package/src/core/hooks/useForwardedRef.ts +0 -20
- package/src/core/hooks/useGlobalKeyDown.ts +0 -24
- package/src/core/hooks/useIsomorphicEffect.ts +0 -7
- package/src/core/hooks/useMatchMedia.ts +0 -28
- package/src/core/hooks/useMediaIndex/index.ts +0 -1
- package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -37
- package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
- package/src/core/hooks/useMounted.ts +0 -15
- package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -58
- package/src/core/hooks/usePrefersDark.test.tsx +0 -21
- package/src/core/hooks/usePrefersDark.ts +0 -16
- package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -58
- package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -21
- package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
- package/src/core/index.ts +0 -10
- package/src/core/lib/createGlobalScopedContext.ts +0 -37
- package/src/core/lib/globalScope.ts +0 -20
- package/src/core/lib/isRecord.ts +0 -3
- package/src/core/middleware/origin.ts +0 -47
- package/src/core/observers/elementSizeObserver.ts +0 -117
- package/src/core/observers/index.ts +0 -2
- package/src/core/observers/resizeObserver.ts +0 -9
- package/src/core/primitives/_selectable/index.ts +0 -1
- package/src/core/primitives/_selectable/selectable.tsx +0 -15
- package/src/core/primitives/_selectable/style.ts +0 -115
- package/src/core/primitives/avatar/avatar.tsx +0 -200
- package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
- package/src/core/primitives/avatar/avatarStack.tsx +0 -101
- package/src/core/primitives/avatar/index.ts +0 -4
- package/src/core/primitives/avatar/styles.ts +0 -167
- package/src/core/primitives/avatar/types.ts +0 -17
- package/src/core/primitives/badge/badge.test.tsx +0 -17
- package/src/core/primitives/badge/badge.tsx +0 -72
- package/src/core/primitives/badge/index.ts +0 -1
- package/src/core/primitives/badge/styles.ts +0 -20
- package/src/core/primitives/badge/types.ts +0 -8
- package/src/core/primitives/box/box.test.tsx +0 -155
- package/src/core/primitives/box/box.tsx +0 -162
- package/src/core/primitives/box/index.ts +0 -1
- package/src/core/primitives/button/button.test.tsx +0 -86
- package/src/core/primitives/button/button.tsx +0 -214
- package/src/core/primitives/button/index.ts +0 -1
- package/src/core/primitives/button/styles.ts +0 -118
- package/src/core/primitives/card/card.tsx +0 -125
- package/src/core/primitives/card/index.ts +0 -2
- package/src/core/primitives/card/styles.ts +0 -147
- package/src/core/primitives/card/types.ts +0 -12
- package/src/core/primitives/checkbox/checkbox.tsx +0 -73
- package/src/core/primitives/checkbox/index.ts +0 -1
- package/src/core/primitives/checkbox/styles.ts +0 -128
- package/src/core/primitives/code/code.tsx +0 -56
- package/src/core/primitives/code/index.ts +0 -1
- package/src/core/primitives/code/refractor.tsx +0 -22
- package/src/core/primitives/code/styles.ts +0 -77
- package/src/core/primitives/container/container.tsx +0 -55
- package/src/core/primitives/container/index.ts +0 -2
- package/src/core/primitives/container/styles.ts +0 -23
- package/src/core/primitives/container/types.ts +0 -6
- package/src/core/primitives/flex/flex.tsx +0 -63
- package/src/core/primitives/flex/index.ts +0 -1
- package/src/core/primitives/grid/grid.test.tsx +0 -86
- package/src/core/primitives/grid/grid.tsx +0 -77
- package/src/core/primitives/grid/index.ts +0 -1
- package/src/core/primitives/heading/heading.tsx +0 -89
- package/src/core/primitives/heading/index.ts +0 -1
- package/src/core/primitives/heading/styles.ts +0 -64
- package/src/core/primitives/heading/types.ts +0 -7
- package/src/core/primitives/index.ts +0 -27
- package/src/core/primitives/inline/index.ts +0 -1
- package/src/core/primitives/inline/inline.test.tsx +0 -55
- package/src/core/primitives/inline/inline.tsx +0 -66
- package/src/core/primitives/inline/styles.ts +0 -32
- package/src/core/primitives/inline/types.ts +0 -6
- package/src/core/primitives/kbd/index.ts +0 -1
- package/src/core/primitives/kbd/kbd.tsx +0 -73
- package/src/core/primitives/label/index.ts +0 -1
- package/src/core/primitives/label/label.tsx +0 -88
- package/src/core/primitives/label/styles.ts +0 -45
- package/src/core/primitives/popover/constants.ts +0 -22
- package/src/core/primitives/popover/floating-ui/size.ts +0 -99
- package/src/core/primitives/popover/helpers.ts +0 -31
- package/src/core/primitives/popover/index.ts +0 -2
- package/src/core/primitives/popover/popover.tsx +0 -512
- package/src/core/primitives/popover/popoverCard.tsx +0 -167
- package/src/core/primitives/popover/types.ts +0 -6
- package/src/core/primitives/radio/index.ts +0 -1
- package/src/core/primitives/radio/radio.tsx +0 -51
- package/src/core/primitives/radio/styles.ts +0 -117
- package/src/core/primitives/select/index.ts +0 -1
- package/src/core/primitives/select/select.test.tsx +0 -56
- package/src/core/primitives/select/select.tsx +0 -95
- package/src/core/primitives/select/styles.ts +0 -166
- package/src/core/primitives/spinner/index.ts +0 -1
- package/src/core/primitives/spinner/spinner.tsx +0 -46
- package/src/core/primitives/stack/index.ts +0 -1
- package/src/core/primitives/stack/stack.test.tsx +0 -61
- package/src/core/primitives/stack/stack.tsx +0 -59
- package/src/core/primitives/stack/styles.ts +0 -33
- package/src/core/primitives/switch/index.ts +0 -1
- package/src/core/primitives/switch/styles.ts +0 -173
- package/src/core/primitives/switch/switch.tsx +0 -68
- package/src/core/primitives/text/index.ts +0 -1
- package/src/core/primitives/text/styles.ts +0 -74
- package/src/core/primitives/text/text.tsx +0 -90
- package/src/core/primitives/textArea/index.ts +0 -1
- package/src/core/primitives/textArea/textArea.tsx +0 -120
- package/src/core/primitives/textInput/index.ts +0 -1
- package/src/core/primitives/textInput/textInput.test.tsx +0 -52
- package/src/core/primitives/textInput/textInput.tsx +0 -398
- package/src/core/primitives/tooltip/constants.ts +0 -23
- package/src/core/primitives/tooltip/index.ts +0 -2
- package/src/core/primitives/tooltip/tooltip.test.tsx +0 -485
- package/src/core/primitives/tooltip/tooltip.tsx +0 -497
- package/src/core/primitives/tooltip/tooltipCard.tsx +0 -110
- package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
- package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -12
- package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
- package/src/core/primitives/types.ts +0 -179
- package/src/core/styles/border/borderStyle.ts +0 -56
- package/src/core/styles/border/index.ts +0 -2
- package/src/core/styles/border/types.ts +0 -10
- package/src/core/styles/box/boxStyle.ts +0 -69
- package/src/core/styles/box/index.ts +0 -2
- package/src/core/styles/box/types.ts +0 -11
- package/src/core/styles/card/_cardColorStyle.ts +0 -108
- package/src/core/styles/card/index.ts +0 -1
- package/src/core/styles/flex/flexItemStyle.ts +0 -27
- package/src/core/styles/flex/flexStyle.ts +0 -70
- package/src/core/styles/flex/index.ts +0 -3
- package/src/core/styles/flex/types.ts +0 -24
- package/src/core/styles/focusRing/index.ts +0 -25
- package/src/core/styles/font/codeFontStyle.ts +0 -13
- package/src/core/styles/font/headingFontStyle.ts +0 -13
- package/src/core/styles/font/index.ts +0 -6
- package/src/core/styles/font/labelFontStyle.ts +0 -13
- package/src/core/styles/font/responsiveFont.ts +0 -100
- package/src/core/styles/font/textAlignStyle.ts +0 -19
- package/src/core/styles/font/textFontStyle.ts +0 -13
- package/src/core/styles/font/types.ts +0 -33
- package/src/core/styles/grid/gridItemStyle.ts +0 -82
- package/src/core/styles/grid/gridStyle.ts +0 -109
- package/src/core/styles/grid/index.ts +0 -3
- package/src/core/styles/grid/types.ts +0 -37
- package/src/core/styles/helpers.ts +0 -72
- package/src/core/styles/index.ts +0 -5
- package/src/core/styles/input/index.ts +0 -2
- package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
- package/src/core/styles/input/textInputStyle.ts +0 -263
- package/src/core/styles/internal.ts +0 -12
- package/src/core/styles/margin/index.ts +0 -2
- package/src/core/styles/margin/marginStyle.ts +0 -22
- package/src/core/styles/margin/marginsStyle.test.ts +0 -34
- package/src/core/styles/margin/types.ts +0 -9
- package/src/core/styles/padding/index.ts +0 -2
- package/src/core/styles/padding/paddingStyle.test.ts +0 -34
- package/src/core/styles/padding/paddingStyle.ts +0 -22
- package/src/core/styles/padding/types.ts +0 -12
- package/src/core/styles/radius/index.ts +0 -2
- package/src/core/styles/radius/radiusStyle.ts +0 -23
- package/src/core/styles/radius/types.ts +0 -8
- package/src/core/styles/shadow/index.ts +0 -2
- package/src/core/styles/shadow/shadowStyle.ts +0 -29
- package/src/core/styles/shadow/types.ts +0 -6
- package/src/core/styles/types.ts +0 -8
- package/src/core/theme/index.ts +0 -5
- package/src/core/theme/theme.test.tsx +0 -77
- package/src/core/theme/themeColorProvider.tsx +0 -29
- package/src/core/theme/themeContext.ts +0 -10
- package/src/core/theme/themeProvider.tsx +0 -62
- package/src/core/theme/types.ts +0 -12
- package/src/core/theme/useRootTheme.ts +0 -18
- package/src/core/theme/useTheme.ts +0 -18
- package/src/core/types/avatar.ts +0 -14
- package/src/core/types/badge.ts +0 -12
- package/src/core/types/box.ts +0 -19
- package/src/core/types/button.ts +0 -21
- package/src/core/types/card.ts +0 -6
- package/src/core/types/component.ts +0 -32
- package/src/core/types/dialog.ts +0 -4
- package/src/core/types/flex.ts +0 -30
- package/src/core/types/grid.ts +0 -14
- package/src/core/types/gridItem.ts +0 -29
- package/src/core/types/index.ts +0 -15
- package/src/core/types/placement.ts +0 -18
- package/src/core/types/popover.ts +0 -4
- package/src/core/types/radius.ts +0 -4
- package/src/core/types/selectable.ts +0 -6
- package/src/core/types/text.ts +0 -4
- package/src/core/utils/arrow/arrow.tsx +0 -124
- package/src/core/utils/arrow/cmds.ts +0 -91
- package/src/core/utils/arrow/index.ts +0 -1
- package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -105
- package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
- package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
- package/src/core/utils/boundaryElement/index.ts +0 -3
- package/src/core/utils/boundaryElement/types.ts +0 -7
- package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
- package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -22
- package/src/core/utils/conditionalWrapper/index.ts +0 -1
- package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
- package/src/core/utils/elementQuery/helpers.ts +0 -27
- package/src/core/utils/elementQuery/index.ts +0 -1
- package/src/core/utils/errorBoundary.tsx +0 -48
- package/src/core/utils/getElementRef.ts +0 -31
- package/src/core/utils/index.ts +0 -9
- package/src/core/utils/layer/getLayerContext.test.ts +0 -32
- package/src/core/utils/layer/getLayerContext.ts +0 -21
- package/src/core/utils/layer/index.ts +0 -4
- package/src/core/utils/layer/layer.test.tsx +0 -113
- package/src/core/utils/layer/layer.tsx +0 -99
- package/src/core/utils/layer/layerContext.ts +0 -7
- package/src/core/utils/layer/layerProvider.tsx +0 -111
- package/src/core/utils/layer/types.ts +0 -9
- package/src/core/utils/layer/useLayer.ts +0 -28
- package/src/core/utils/portal/index.ts +0 -4
- package/src/core/utils/portal/portal.test.tsx +0 -108
- package/src/core/utils/portal/portal.ts +0 -32
- package/src/core/utils/portal/portalContext.ts +0 -31
- package/src/core/utils/portal/portalProvider.tsx +0 -48
- package/src/core/utils/portal/types.ts +0 -9
- package/src/core/utils/portal/usePortal.ts +0 -25
- package/src/core/utils/spanWithTextOverflow.tsx +0 -10
- package/src/core/utils/srOnly/index.ts +0 -1
- package/src/core/utils/srOnly/srOnly.tsx +0 -36
- package/src/core/utils/virtualList/index.ts +0 -1
- package/src/core/utils/virtualList/virtualList.tsx +0 -201
- package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -86
- package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -58
- package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -27
- package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -60
- package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -66
- package/src/theme/build/_deprecated/color/color.test.ts +0 -67
- package/src/theme/build/_deprecated/color/defaults.ts +0 -391
- package/src/theme/build/_deprecated/color/factory.ts +0 -178
- package/src/theme/build/_deprecated/color/index.ts +0 -1
- package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -86
- package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -58
- package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -23
- package/src/theme/build/buildColorTheme.test.ts +0 -185
- package/src/theme/build/buildColorTheme.ts +0 -507
- package/src/theme/build/buildTheme.test.ts +0 -89
- package/src/theme/build/buildTheme.ts +0 -36
- package/src/theme/build/colorToken/colorToken.ts +0 -19
- package/src/theme/build/colorToken/compileColorToken.ts +0 -21
- package/src/theme/build/colorToken/index.ts +0 -2
- package/src/theme/build/colorToken/types.ts +0 -6
- package/src/theme/build/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
- package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
- package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
- package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -70
- package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
- package/src/theme/build/lib/color-fns/convert.ts +0 -150
- package/src/theme/build/lib/color-fns/index.ts +0 -6
- package/src/theme/build/lib/color-fns/parse.ts +0 -60
- package/src/theme/build/lib/color-fns/rgba.ts +0 -10
- package/src/theme/build/lib/color-fns/types.ts +0 -28
- package/src/theme/build/lib/isRecord.ts +0 -3
- package/src/theme/build/lib/lazy.ts +0 -30
- package/src/theme/build/lib/utils.ts +0 -19
- package/src/theme/build/merge.ts +0 -31
- package/src/theme/build/mixThemeColor.test.ts +0 -23
- package/src/theme/build/mixThemeColor.ts +0 -53
- package/src/theme/build/renderColorTheme.ts +0 -538
- package/src/theme/build/renderColorValue.ts +0 -83
- package/src/theme/build/resolveColorTokens.ts +0 -274
- package/src/theme/build/theme.test.ts +0 -29
- package/src/theme/config/helpers.ts +0 -60
- package/src/theme/config/index.ts +0 -4
- package/src/theme/config/system.ts +0 -117
- package/src/theme/config/tokens/color/index.ts +0 -1
- package/src/theme/config/tokens/color/types.ts +0 -135
- package/src/theme/config/tokens/index.ts +0 -4
- package/src/theme/config/tokens/parseTokenKey.test.ts +0 -66
- package/src/theme/config/tokens/parseTokenKey.ts +0 -67
- package/src/theme/config/tokens/parseTokenValue.test.ts +0 -44
- package/src/theme/config/tokens/parseTokenValue.ts +0 -134
- package/src/theme/config/tokens/types.ts +0 -53
- package/src/theme/config/types.ts +0 -46
- package/src/theme/defaults/colorPalette.ts +0 -5
- package/src/theme/defaults/colorTokens.ts +0 -648
- package/src/theme/defaults/config.ts +0 -84
- package/src/theme/defaults/fonts.ts +0 -227
- package/src/theme/getScopedTheme.ts +0 -103
- package/src/theme/index.ts +0 -5
- package/src/theme/system/avatar.ts +0 -14
- package/src/theme/system/color/_constants.ts +0 -45
- package/src/theme/system/color/_helpers.ts +0 -28
- package/src/theme/system/color/_system.ts +0 -40
- package/src/theme/system/color/avatar.ts +0 -15
- package/src/theme/system/color/badge.ts +0 -16
- package/src/theme/system/color/button.ts +0 -17
- package/src/theme/system/color/color.ts +0 -34
- package/src/theme/system/color/index.ts +0 -13
- package/src/theme/system/color/input.ts +0 -25
- package/src/theme/system/color/kbd.ts +0 -8
- package/src/theme/system/color/selectable.ts +0 -12
- package/src/theme/system/color/shadow.ts +0 -7
- package/src/theme/system/color/state.ts +0 -43
- package/src/theme/system/color/syntax.ts +0 -41
- package/src/theme/system/css.ts +0 -14
- package/src/theme/system/focusRing.ts +0 -7
- package/src/theme/system/font.ts +0 -52
- package/src/theme/system/index.ts +0 -11
- package/src/theme/system/input.ts +0 -33
- package/src/theme/system/layer.ts +0 -8
- package/src/theme/system/shadow.ts +0 -19
- package/src/theme/system/styles.ts +0 -13
- package/src/theme/system/theme.ts +0 -142
- package/src/theme/system/v0/avatar.ts +0 -10
- package/src/theme/system/v0/color/_generic.ts +0 -35
- package/src/theme/system/v0/color/_system.ts +0 -18
- package/src/theme/system/v0/color/base.ts +0 -21
- package/src/theme/system/v0/color/button.ts +0 -56
- package/src/theme/system/v0/color/card.ts +0 -25
- package/src/theme/system/v0/color/color.ts +0 -51
- package/src/theme/system/v0/color/index.ts +0 -11
- package/src/theme/system/v0/color/input.ts +0 -40
- package/src/theme/system/v0/color/muted.ts +0 -37
- package/src/theme/system/v0/color/selectable.ts +0 -42
- package/src/theme/system/v0/color/solid.ts +0 -37
- package/src/theme/system/v0/color/spot.ts +0 -14
- package/src/theme/system/v0/index.ts +0 -3
- package/src/theme/system/v0/input.ts +0 -23
- package/src/theme/versioning/getTheme_v2.ts +0 -72
- package/src/theme/versioning/index.ts +0 -5
- package/src/theme/versioning/is_v0.ts +0 -6
- package/src/theme/versioning/is_v2.ts +0 -6
- package/src/theme/versioning/themeColor_v0_v2.ts +0 -250
- package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -50
- package/src/theme/versioning/v0_v2.ts +0 -106
- package/src/theme/versioning/v2_v0.ts +0 -153
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/** @vitest-environment jsdom */
|
|
2
|
-
|
|
3
|
-
import {render, screen} from '@testing-library/react'
|
|
4
|
-
import userEvent from '@testing-library/user-event'
|
|
5
|
-
import {useRef} from 'react'
|
|
6
|
-
import {describe, expect, it, vi} from 'vitest'
|
|
7
|
-
|
|
8
|
-
import {useClickOutsideEvent} from './useClickOutsideEvent'
|
|
9
|
-
|
|
10
|
-
describe('useClickOutsideEvent', () => {
|
|
11
|
-
/**
|
|
12
|
-
* This suite demonstrates the new hook `useClickOutsideEvent` that replaces `useClickOutside`
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
it('calls the handler when clicking outside of the array of elements', async () => {
|
|
16
|
-
const user = userEvent.setup()
|
|
17
|
-
const handler = vi.fn()
|
|
18
|
-
|
|
19
|
-
const TestComponent = () => {
|
|
20
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
21
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
22
|
-
|
|
23
|
-
useClickOutsideEvent(handler, () => [buttonRef.current, popoverRef.current])
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<>
|
|
27
|
-
{/* oxlint-disable-next-line control-has-associated-label */}
|
|
28
|
-
<button data-testid="button" ref={buttonRef} />
|
|
29
|
-
<div data-testid="popover" ref={popoverRef} />
|
|
30
|
-
<div data-testid="outside" />
|
|
31
|
-
</>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
render(<TestComponent />)
|
|
36
|
-
|
|
37
|
-
await user.click(screen.getByTestId('button'))
|
|
38
|
-
await user.click(screen.getByTestId('popover'))
|
|
39
|
-
expect(handler).not.toHaveBeenCalled()
|
|
40
|
-
|
|
41
|
-
await user.click(screen.getByTestId('outside'))
|
|
42
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('the elements array flattens nested arrays one level deep', async () => {
|
|
46
|
-
const user = userEvent.setup()
|
|
47
|
-
const handler = vi.fn()
|
|
48
|
-
|
|
49
|
-
const TestComponent = () => {
|
|
50
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
51
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
52
|
-
|
|
53
|
-
useClickOutsideEvent(handler, () => [
|
|
54
|
-
null,
|
|
55
|
-
[null, buttonRef.current],
|
|
56
|
-
[popoverRef.current, null],
|
|
57
|
-
null,
|
|
58
|
-
])
|
|
59
|
-
|
|
60
|
-
return (
|
|
61
|
-
<>
|
|
62
|
-
{/* oxlint-disable-next-line control-has-associated-label */}
|
|
63
|
-
<button data-testid="button" ref={buttonRef} />
|
|
64
|
-
<div data-testid="popover" ref={popoverRef} />
|
|
65
|
-
<div data-testid="outside" />
|
|
66
|
-
</>
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
render(<TestComponent />)
|
|
71
|
-
|
|
72
|
-
await user.click(screen.getByTestId('button'))
|
|
73
|
-
await user.click(screen.getByTestId('popover'))
|
|
74
|
-
expect(handler).not.toHaveBeenCalled()
|
|
75
|
-
|
|
76
|
-
await user.click(screen.getByTestId('outside'))
|
|
77
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
it('it can set a boundary to scope outside click events', async () => {
|
|
81
|
-
const user = userEvent.setup()
|
|
82
|
-
const handler = vi.fn()
|
|
83
|
-
|
|
84
|
-
const TestComponent = () => {
|
|
85
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
86
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
87
|
-
const boundaryRef = useRef<HTMLDivElement | null>(null)
|
|
88
|
-
|
|
89
|
-
useClickOutsideEvent(
|
|
90
|
-
handler,
|
|
91
|
-
() => [buttonRef.current, popoverRef.current],
|
|
92
|
-
() => boundaryRef.current,
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
return (
|
|
96
|
-
<>
|
|
97
|
-
<div ref={boundaryRef}>
|
|
98
|
-
{/* oxlint-disable-next-line control-has-associated-label */}
|
|
99
|
-
<button data-testid="button" ref={buttonRef} />
|
|
100
|
-
<div data-testid="popover" ref={popoverRef} />
|
|
101
|
-
<div data-testid="inside" />
|
|
102
|
-
</div>
|
|
103
|
-
<div data-testid="outside" />
|
|
104
|
-
</>
|
|
105
|
-
)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
render(<TestComponent />)
|
|
109
|
-
|
|
110
|
-
await user.click(screen.getByTestId('button'))
|
|
111
|
-
await user.click(screen.getByTestId('popover'))
|
|
112
|
-
// Since it's outside the boundary it should be ignored
|
|
113
|
-
await user.click(screen.getByTestId('outside'))
|
|
114
|
-
expect(handler).not.toHaveBeenCalled()
|
|
115
|
-
|
|
116
|
-
await user.click(screen.getByTestId('inside'))
|
|
117
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
118
|
-
})
|
|
119
|
-
})
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import {useDebugValue, useEffect} from 'react'
|
|
2
|
-
import {useEffectEvent} from 'use-effect-event'
|
|
3
|
-
|
|
4
|
-
import {EMPTY_ARRAY} from '../constants'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
export type ClickOutsideEventListener = (event: MouseEvent) => void
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @public
|
|
13
|
-
*/
|
|
14
|
-
export type ClickOutsideEventElements = (HTMLElement | null | (HTMLElement | null)[])[]
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* @public
|
|
18
|
-
*/
|
|
19
|
-
export function useClickOutsideEvent(
|
|
20
|
-
listener: ClickOutsideEventListener | false | undefined,
|
|
21
|
-
elementsArg: () => ClickOutsideEventElements = () => EMPTY_ARRAY,
|
|
22
|
-
boundaryElement?: () => HTMLElement | null,
|
|
23
|
-
): void {
|
|
24
|
-
/**
|
|
25
|
-
* The `useEffectEvent` hook allow us to always see the latest value of `listener`, `elementsArg` and `boundaryElement` without needing to
|
|
26
|
-
* juggle `useState`, `useRef` and `useState` to make sure the `mousedown` event listener isn't constantly being added and removed.
|
|
27
|
-
*/
|
|
28
|
-
const onEvent = useEffectEvent((evt: MouseEvent) => {
|
|
29
|
-
if (!listener) {
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const target = evt.target
|
|
34
|
-
|
|
35
|
-
if (!(target instanceof Node)) {
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const resolvedBoundaryElement = boundaryElement?.()
|
|
40
|
-
|
|
41
|
-
if (resolvedBoundaryElement && !resolvedBoundaryElement.contains(target)) {
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const elements = elementsArg().flat()
|
|
46
|
-
|
|
47
|
-
for (const el of elements) {
|
|
48
|
-
if (!el) continue
|
|
49
|
-
|
|
50
|
-
if (target === el || el.contains(target)) {
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
listener(evt)
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
const hasListener = Boolean(listener)
|
|
59
|
-
|
|
60
|
-
useEffect(() => {
|
|
61
|
-
if (!hasListener) return undefined
|
|
62
|
-
|
|
63
|
-
const handleEvent = (evt: MouseEvent) => onEvent(evt)
|
|
64
|
-
|
|
65
|
-
document.addEventListener('mousedown', handleEvent)
|
|
66
|
-
|
|
67
|
-
return () => {
|
|
68
|
-
document.removeEventListener('mousedown', handleEvent)
|
|
69
|
-
}
|
|
70
|
-
}, [hasListener])
|
|
71
|
-
|
|
72
|
-
useDebugValue(listener ? 'MouseDown On' : 'MouseDown Off')
|
|
73
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import {useEffect} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @beta
|
|
5
|
-
*/
|
|
6
|
-
export function useCustomValidity(
|
|
7
|
-
ref: {current: null | {setCustomValidity: (validity: string) => void}},
|
|
8
|
-
customValidity: string | undefined,
|
|
9
|
-
): void {
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
ref.current?.setCustomValidity(customValidity || '')
|
|
12
|
-
}, [customValidity, ref])
|
|
13
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/** @vitest-environment jsdom */
|
|
2
|
-
|
|
3
|
-
import {act, renderHook} from '@testing-library/react'
|
|
4
|
-
import {describe, expect, it, vi} from 'vitest'
|
|
5
|
-
|
|
6
|
-
import {useDelayedState} from './useDelayedState'
|
|
7
|
-
|
|
8
|
-
describe('useDelayedState', () => {
|
|
9
|
-
it('should update state immediately if delay is not provided', () => {
|
|
10
|
-
const {result} = renderHook(() => useDelayedState(false))
|
|
11
|
-
const [, setState] = result.current
|
|
12
|
-
|
|
13
|
-
act(() => {
|
|
14
|
-
setState(true)
|
|
15
|
-
})
|
|
16
|
-
expect(result.current[0]).toBe(true)
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it('should update state after delay if delay is provided', async () => {
|
|
20
|
-
vi.useFakeTimers()
|
|
21
|
-
const {result} = renderHook(() => useDelayedState(false))
|
|
22
|
-
const [, setState] = result.current
|
|
23
|
-
|
|
24
|
-
act(() => {
|
|
25
|
-
setState(true, 1000)
|
|
26
|
-
})
|
|
27
|
-
expect(result.current[0]).toBe(false)
|
|
28
|
-
act(() => {
|
|
29
|
-
vi.advanceTimersByTime(500)
|
|
30
|
-
})
|
|
31
|
-
expect(result.current[0]).toBe(false)
|
|
32
|
-
|
|
33
|
-
act(() => {
|
|
34
|
-
vi.advanceTimersByTime(500)
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
expect(result.current[0]).toBe(true)
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('should update state with callback function', () => {
|
|
41
|
-
const {result} = renderHook(() => useDelayedState(false))
|
|
42
|
-
const [, setState] = result.current
|
|
43
|
-
|
|
44
|
-
act(() => {
|
|
45
|
-
setState((prev: boolean) => !prev)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
expect(result.current[0]).toBe(true)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should clear pending timeout on unmount', () => {
|
|
52
|
-
vi.useFakeTimers()
|
|
53
|
-
const clearTimeoutSpy = vi.spyOn(global, 'clearTimeout')
|
|
54
|
-
const {result, unmount} = renderHook(() => useDelayedState(false))
|
|
55
|
-
const [, setState] = result.current
|
|
56
|
-
|
|
57
|
-
act(() => {
|
|
58
|
-
setState(true, 1000)
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
clearTimeoutSpy.mockClear()
|
|
62
|
-
|
|
63
|
-
// Unmount while the delayed update is still pending
|
|
64
|
-
unmount()
|
|
65
|
-
|
|
66
|
-
// clearTimeout should have been called during cleanup
|
|
67
|
-
expect(clearTimeoutSpy).toHaveBeenCalledTimes(1)
|
|
68
|
-
clearTimeoutSpy.mockRestore()
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('should cancel update if the set state was called with a new state', () => {
|
|
72
|
-
const {result} = renderHook(() => useDelayedState(false))
|
|
73
|
-
const [, setState] = result.current
|
|
74
|
-
|
|
75
|
-
act(() => {
|
|
76
|
-
setState(true, 1000)
|
|
77
|
-
})
|
|
78
|
-
expect(result.current[0]).toBe(false)
|
|
79
|
-
|
|
80
|
-
vi.advanceTimersByTime(500)
|
|
81
|
-
|
|
82
|
-
act(() => {
|
|
83
|
-
setState(false)
|
|
84
|
-
})
|
|
85
|
-
vi.advanceTimersByTime(600)
|
|
86
|
-
// Even after 1.1 seconds, the state should continue being false, because it was cancelled by a next setState call
|
|
87
|
-
expect(result.current[0]).toBe(false)
|
|
88
|
-
})
|
|
89
|
-
})
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import {SetStateAction, useCallback, useEffect, useRef, useState} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @beta
|
|
5
|
-
*/
|
|
6
|
-
export function useDelayedState<S>(
|
|
7
|
-
initialState: S | (() => S),
|
|
8
|
-
): [S, (nextState: SetStateAction<S>, delay?: number) => void] {
|
|
9
|
-
const [state, setState] = useState(initialState)
|
|
10
|
-
const delayedAction = useRef<NodeJS.Timeout | undefined>(undefined)
|
|
11
|
-
|
|
12
|
-
const onStateChange = useCallback((nextState: SetStateAction<S>, delay?: number) => {
|
|
13
|
-
const action = () => {
|
|
14
|
-
setState(nextState)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// A new state change has been initiated, cancel the previous one.
|
|
18
|
-
if (delayedAction.current) {
|
|
19
|
-
clearTimeout(delayedAction.current)
|
|
20
|
-
delayedAction.current = undefined
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (!delay) return action()
|
|
24
|
-
delayedAction.current = setTimeout(action, delay)
|
|
25
|
-
}, [])
|
|
26
|
-
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
return () => {
|
|
29
|
-
if (delayedAction.current) {
|
|
30
|
-
clearTimeout(delayedAction.current)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}, [])
|
|
34
|
-
|
|
35
|
-
return [state, onStateChange]
|
|
36
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './useElementRect'
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {useElementSize} from '../useElementSize'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Subscribe to the rect of a DOM element.
|
|
5
|
-
* @beta
|
|
6
|
-
*
|
|
7
|
-
* @deprecated Use `useElementSize` instead
|
|
8
|
-
*/
|
|
9
|
-
export function useElementRect(element: HTMLElement | null): DOMRectReadOnly | null {
|
|
10
|
-
const elementSize = useElementSize(element)
|
|
11
|
-
|
|
12
|
-
// oxlint-disable-next-line no-deprecated
|
|
13
|
-
return elementSize?._contentRect || null
|
|
14
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {useEffect, useState} from 'react'
|
|
2
|
-
|
|
3
|
-
import {_elementSizeObserver, ElementSize} from '../observers/elementSizeObserver'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Subscribe to the size of a DOM element.
|
|
7
|
-
* @beta
|
|
8
|
-
*/
|
|
9
|
-
export function useElementSize(element: HTMLElement | null): ElementSize | null {
|
|
10
|
-
const [size, setSize] = useState<ElementSize | null>(null)
|
|
11
|
-
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
if (!element) return undefined
|
|
14
|
-
|
|
15
|
-
return _elementSizeObserver.subscribe(element, setSize)
|
|
16
|
-
}, [element])
|
|
17
|
-
|
|
18
|
-
return size
|
|
19
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import {useImperativeHandle, useRef} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @beta
|
|
5
|
-
* @deprecated use `useImperativeHandle` instead
|
|
6
|
-
* @example
|
|
7
|
-
* ```diff
|
|
8
|
-
* -const ref = useForwardedRef(forwardedRef)
|
|
9
|
-
* +const ref = useRef(null)
|
|
10
|
-
* +useImperativeHandle(forwardedRef, () => ref.current)
|
|
11
|
-
* ```
|
|
12
|
-
*/
|
|
13
|
-
// oxlint-disable-next-line no-deprecated
|
|
14
|
-
export function useForwardedRef<T>(ref: React.ForwardedRef<T>): React.MutableRefObject<T | null> {
|
|
15
|
-
const innerRef = useRef<T | null>(null)
|
|
16
|
-
|
|
17
|
-
useImperativeHandle(ref, () => innerRef.current!)
|
|
18
|
-
|
|
19
|
-
return innerRef
|
|
20
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import {useEffect} from 'react'
|
|
2
|
-
import {useEffectEvent} from 'use-effect-event'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Adds global keydown event listener to the window.
|
|
6
|
-
*
|
|
7
|
-
* @param onKeyDown - The function to call when a keydown event is triggered.
|
|
8
|
-
* @param options - The options to pass to the addEventListener function (example, capture: true)
|
|
9
|
-
* @beta
|
|
10
|
-
*/
|
|
11
|
-
export function useGlobalKeyDown(
|
|
12
|
-
onKeyDown: (event: KeyboardEvent) => void,
|
|
13
|
-
options?: AddEventListenerOptions,
|
|
14
|
-
): void {
|
|
15
|
-
const handleKeyDown = useEffectEvent((event: KeyboardEvent) => onKeyDown(event))
|
|
16
|
-
|
|
17
|
-
useEffect(() => {
|
|
18
|
-
const handler = (event: KeyboardEvent) => handleKeyDown(event)
|
|
19
|
-
|
|
20
|
-
window.addEventListener('keydown', handler, options)
|
|
21
|
-
|
|
22
|
-
return () => window.removeEventListener('keydown', handler, options)
|
|
23
|
-
}, [options])
|
|
24
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import {useCallback, useDebugValue, useSyncExternalStore} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Efficiently subscribes to `window.matchMedia` queries
|
|
5
|
-
*
|
|
6
|
-
* @param getServerSnapshot - Only called during server-side rendering, and hydration if using hydrateRoot. Required if the hook is called during SSR (https://react.dev/reference/react/useSyncExternalStore#adding-support-for-server-rendering)
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
|
-
export function useMatchMedia(
|
|
11
|
-
mediaQueryString: `(${string})`,
|
|
12
|
-
getServerSnapshot?: () => boolean,
|
|
13
|
-
): boolean {
|
|
14
|
-
useDebugValue(mediaQueryString)
|
|
15
|
-
|
|
16
|
-
return useSyncExternalStore(
|
|
17
|
-
useCallback(
|
|
18
|
-
(onStoreChange) => {
|
|
19
|
-
const media = window.matchMedia(mediaQueryString)
|
|
20
|
-
media.addEventListener('change', onStoreChange)
|
|
21
|
-
return () => media.removeEventListener('change', onStoreChange)
|
|
22
|
-
},
|
|
23
|
-
[mediaQueryString],
|
|
24
|
-
),
|
|
25
|
-
() => window.matchMedia(mediaQueryString).matches,
|
|
26
|
-
getServerSnapshot,
|
|
27
|
-
)
|
|
28
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './useMediaIndex'
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/** @vitest-environment node */
|
|
2
|
-
|
|
3
|
-
import {buildTheme} from '@sanity/ui/theme'
|
|
4
|
-
import {renderToStaticMarkup, renderToString} from 'react-dom/server'
|
|
5
|
-
import {describe, expect, it} from 'vitest'
|
|
6
|
-
|
|
7
|
-
import {ThemeProvider} from '../../theme'
|
|
8
|
-
import {useMediaIndex} from './useMediaIndex'
|
|
9
|
-
|
|
10
|
-
const theme = buildTheme()
|
|
11
|
-
|
|
12
|
-
function Log() {
|
|
13
|
-
const mediaIndex = useMediaIndex()
|
|
14
|
-
|
|
15
|
-
return <>mediaIndex: {JSON.stringify(mediaIndex)}</>
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
describe('useMediaIndex', () => {
|
|
19
|
-
it(`SSR to static markup returns 0`, () => {
|
|
20
|
-
expect(
|
|
21
|
-
renderToStaticMarkup(
|
|
22
|
-
<ThemeProvider theme={theme}>
|
|
23
|
-
<Log />
|
|
24
|
-
</ThemeProvider>,
|
|
25
|
-
),
|
|
26
|
-
).toBe('mediaIndex: 0')
|
|
27
|
-
})
|
|
28
|
-
it(`SSR to markup for hydration doesn't throw`, () => {
|
|
29
|
-
expect(
|
|
30
|
-
renderToString(
|
|
31
|
-
<ThemeProvider theme={theme}>
|
|
32
|
-
<Log />
|
|
33
|
-
</ThemeProvider>,
|
|
34
|
-
),
|
|
35
|
-
).toMatchInlineSnapshot(`"mediaIndex: <!-- -->0"`)
|
|
36
|
-
})
|
|
37
|
-
})
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import {useMemo, useSyncExternalStore} from 'react'
|
|
2
|
-
|
|
3
|
-
import {useTheme_v2} from '../../theme'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @internal
|
|
7
|
-
*/
|
|
8
|
-
export interface _MediaStore {
|
|
9
|
-
subscribe: (onStoreChange: () => void) => () => void
|
|
10
|
-
getSnapshot: () => number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
type MediaQueryMinWidth = `(min-width: ${number}px)`
|
|
14
|
-
type MediaQueryMaxWidth = `(max-width: ${number}px)`
|
|
15
|
-
type MediaQueryMinMaxWidth = `${MediaQueryMinWidth} and ${MediaQueryMaxWidth}`
|
|
16
|
-
type MediaQuery = `screen and ${MediaQueryMinWidth | MediaQueryMaxWidth | MediaQueryMinMaxWidth}`
|
|
17
|
-
|
|
18
|
-
function _getMediaQuery(media: number[], index: number): MediaQuery {
|
|
19
|
-
if (index === 0) {
|
|
20
|
-
return `screen and (max-width: ${media[index] - 1}px)`
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (index === media.length) {
|
|
24
|
-
return `screen and (min-width: ${media[index - 1]}px)`
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return `screen and (min-width: ${media[index - 1]}px) and (max-width: ${media[index] - 1}px)`
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function _createMediaStore(media: number[]): _MediaStore {
|
|
31
|
-
const mediaLen = media.length
|
|
32
|
-
let sizes: {mq: MediaQueryList; index: number}[]
|
|
33
|
-
|
|
34
|
-
// The _createMediaStore function is called in both server and client environments.
|
|
35
|
-
// However since subscribe and getSnapshot are only called on the client we lazy init what we need for them
|
|
36
|
-
// so that we don't need to run checks for wether it's safe to call `window.matchMedia`
|
|
37
|
-
const getSizes = () => {
|
|
38
|
-
if (!sizes) {
|
|
39
|
-
sizes = []
|
|
40
|
-
|
|
41
|
-
for (let index = mediaLen; index > -1; index -= 1) {
|
|
42
|
-
const mediaQuery = _getMediaQuery(media, index)
|
|
43
|
-
|
|
44
|
-
sizes.push({index, mq: window.matchMedia(mediaQuery)})
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return sizes
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const getSnapshot = () => {
|
|
52
|
-
for (const {index, mq} of getSizes()) {
|
|
53
|
-
if (mq.matches) return index
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return 0
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const subscribe = (onStoreChange: () => void) => {
|
|
60
|
-
const disposeFns: (() => void)[] = []
|
|
61
|
-
|
|
62
|
-
for (const {mq} of getSizes()) {
|
|
63
|
-
const handleChange = () => {
|
|
64
|
-
if (mq.matches) onStoreChange()
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
mq.addEventListener('change', handleChange)
|
|
68
|
-
|
|
69
|
-
disposeFns.push(() => mq.removeEventListener('change', handleChange))
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return () => {
|
|
73
|
-
for (const disposeFn of disposeFns) {
|
|
74
|
-
disposeFn()
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return {getSnapshot, subscribe}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Only called during server-side rendering, and hydration if using hydrateRoot
|
|
84
|
-
* Since the server environment doesn't have access to the DOM, we can't determine the current value of the media query
|
|
85
|
-
* and we assume `(prefers-color-scheme: light)` since it's the most common scheme
|
|
86
|
-
*
|
|
87
|
-
* @link https://beta.reactjs.org/apis/react/useSyncExternalStore#adding-support-for-server-rendering
|
|
88
|
-
*/
|
|
89
|
-
function getServerSnapshot() {
|
|
90
|
-
return 0
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* This API might change. DO NOT USE IN PRODUCTION.
|
|
95
|
-
* @beta
|
|
96
|
-
*/
|
|
97
|
-
export function useMediaIndex(): number {
|
|
98
|
-
const {media} = useTheme_v2()
|
|
99
|
-
const store = useMemo(() => _createMediaStore(media), [media])
|
|
100
|
-
|
|
101
|
-
return useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot)
|
|
102
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import {useSyncExternalStore} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Some components should only render after mounting to the DOM, and not be rendered at all during SSR renderToString or equivalent.
|
|
5
|
-
* @public
|
|
6
|
-
*/
|
|
7
|
-
export function useMounted(): boolean {
|
|
8
|
-
return useSyncExternalStore(
|
|
9
|
-
subscribe,
|
|
10
|
-
() => true,
|
|
11
|
-
() => false,
|
|
12
|
-
)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const subscribe = () => () => {}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/** @vitest-environment jsdom */
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* As this hook is used for top-level theming it's likely to be called while server-rendering
|
|
5
|
-
* and that's why it's worth it to have a testing suite for hydration
|
|
6
|
-
*/
|
|
7
|
-
import {waitFor} from '@testing-library/dom'
|
|
8
|
-
import {hydrateRoot} from 'react-dom/client'
|
|
9
|
-
import {afterAll, beforeAll, describe, expect, it, vi} from 'vitest'
|
|
10
|
-
|
|
11
|
-
import {usePrefersDark} from './usePrefersDark'
|
|
12
|
-
|
|
13
|
-
function Log() {
|
|
14
|
-
const dark = usePrefersDark()
|
|
15
|
-
|
|
16
|
-
return <>dark: {JSON.stringify(dark)}</>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const originalMatchMedia = window.matchMedia
|
|
20
|
-
|
|
21
|
-
describe('usePrefersDark SSR hydration', () => {
|
|
22
|
-
beforeAll(() => {
|
|
23
|
-
window.matchMedia = () =>
|
|
24
|
-
// oxlint-disable-next-line no-unsafe-type-assertion
|
|
25
|
-
({
|
|
26
|
-
addEventListener: vi.fn(),
|
|
27
|
-
removeEventListener: vi.fn(),
|
|
28
|
-
matches: true,
|
|
29
|
-
}) as any
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
afterAll(() => {
|
|
33
|
-
window.matchMedia = originalMatchMedia
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it(`hydrates without any warnings`, async () => {
|
|
37
|
-
const spy = vi.spyOn(console, 'error').mockImplementation(() => {})
|
|
38
|
-
|
|
39
|
-
const node = document.createElement('div')
|
|
40
|
-
|
|
41
|
-
document.body.appendChild(node)
|
|
42
|
-
|
|
43
|
-
node.innerHTML = `dark: <!-- -->false`
|
|
44
|
-
|
|
45
|
-
hydrateRoot(node, <Log />)
|
|
46
|
-
|
|
47
|
-
// It's false initially
|
|
48
|
-
await waitFor(() => expect(node.innerHTML).toBe('dark: <!-- -->false'))
|
|
49
|
-
|
|
50
|
-
// After hydration it should switch to true
|
|
51
|
-
await waitFor(() => expect(node.innerHTML).toBe('dark: <!-- -->true'))
|
|
52
|
-
|
|
53
|
-
expect(console.error).not.toHaveBeenCalled()
|
|
54
|
-
|
|
55
|
-
spy.mockReset()
|
|
56
|
-
spy.mockRestore()
|
|
57
|
-
})
|
|
58
|
-
})
|