@sanity/ui 4.0.0-beta.8 → 4.0.0-next.2
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/LICENSE +1 -1
- package/README.md +21 -7
- package/dist/_chunks/getScopedTheme.cjs +4043 -0
- package/dist/_chunks/getScopedTheme.cjs.map +1 -0
- package/dist/_chunks/getScopedTheme.js +3803 -0
- package/dist/_chunks/getScopedTheme.js.map +1 -0
- package/dist/_chunks/refractor.cjs +18 -0
- package/dist/_chunks/refractor.cjs.map +1 -0
- package/dist/_chunks/refractor.js +20 -0
- package/dist/_chunks/refractor.js.map +1 -0
- package/dist/_chunks/rgba.d.cts +929 -0
- package/dist/_chunks/rgba.d.cts.map +1 -0
- package/dist/_chunks/rgba.d.ts +929 -0
- package/dist/_chunks/rgba.d.ts.map +1 -0
- package/dist/index.cjs +6243 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2332 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +1767 -1190
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6134 -4725
- package/dist/index.js.map +1 -1
- package/dist/theme.cjs +54 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.cts +278 -0
- package/dist/theme.d.cts.map +1 -0
- package/dist/theme.d.ts +278 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +53 -0
- package/dist/theme.js.map +1 -0
- package/package.json +55 -86
- package/dist/_chunks-es/Syntax.js +0 -23
- package/dist/_chunks-es/Syntax.js.map +0 -1
- package/dist/index.css +0 -1
- package/exports/index.css +0 -1
- package/exports/index.ts +0 -125
- package/src/components/autocomplete/Autocomplete.tsx +0 -665
- package/src/components/autocomplete/AutocompleteOption.tsx +0 -42
- package/src/components/autocomplete/__workshop__/Async.tsx +0 -162
- package/src/components/autocomplete/__workshop__/ConstrainedHeight.tsx +0 -121
- package/src/components/autocomplete/__workshop__/Custom.tsx +0 -91
- package/src/components/autocomplete/__workshop__/Example.tsx +0 -70
- package/src/components/autocomplete/__workshop__/FocusAndBlur.tsx +0 -39
- package/src/components/autocomplete/__workshop__/Fullscreen.tsx +0 -307
- package/src/components/autocomplete/__workshop__/index.ts +0 -41
- package/src/components/autocomplete/__workshop__/mock/apiStore.ts +0 -49
- package/src/components/autocomplete/__workshop__/mock/countries.ts +0 -245
- package/src/components/autocomplete/__workshop__/types.ts +0 -4
- package/src/components/autocomplete/autocompleteReducer.ts +0 -47
- package/src/components/autocomplete/constants.ts +0 -28
- package/src/components/autocomplete/types.ts +0 -103
- package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -163
- package/src/components/breadcrumbs/__workshop__/Example.tsx +0 -48
- package/src/components/breadcrumbs/__workshop__/index.ts +0 -16
- package/src/components/dialog/Dialog.tsx +0 -230
- package/src/components/dialog/DialogCard.tsx +0 -233
- package/src/components/dialog/DialogContext.ts +0 -21
- package/src/components/dialog/DialogProvider.tsx +0 -34
- package/src/components/dialog/__workshop__/Activate.tsx +0 -141
- package/src/components/dialog/__workshop__/AutoFocus.tsx +0 -29
- package/src/components/dialog/__workshop__/Layering.tsx +0 -41
- package/src/components/dialog/__workshop__/Nested.tsx +0 -71
- package/src/components/dialog/__workshop__/OnScroll.tsx +0 -51
- package/src/components/dialog/__workshop__/Panes.tsx +0 -75
- package/src/components/dialog/__workshop__/Position.tsx +0 -30
- package/src/components/dialog/__workshop__/Props.tsx +0 -93
- package/src/components/dialog/__workshop__/Provider.tsx +0 -11
- package/src/components/dialog/__workshop__/Wrapped.tsx +0 -76
- package/src/components/dialog/__workshop__/index.ts +0 -21
- package/src/components/dialog/isTargetWithinScope.ts +0 -14
- package/src/components/dialog/types.ts +0 -2
- package/src/components/dialog/useDialog.ts +0 -11
- package/src/components/hotkeys/Hotkeys.tsx +0 -70
- package/src/components/hotkeys/__workshop__/Plain.tsx +0 -9
- package/src/components/hotkeys/__workshop__/index.ts +0 -16
- package/src/components/menu/Menu.test.tsx +0 -125
- package/src/components/menu/Menu.tsx +0 -174
- package/src/components/menu/MenuButton.tsx +0 -231
- package/src/components/menu/MenuContext.ts +0 -19
- package/src/components/menu/MenuDivider.tsx +0 -32
- package/src/components/menu/MenuGroup.tsx +0 -240
- package/src/components/menu/MenuItem.tsx +0 -153
- package/src/components/menu/__workshop__/AsComponent.tsx +0 -45
- package/src/components/menu/__workshop__/AvatarMenu.tsx +0 -36
- package/src/components/menu/__workshop__/ClosableMenuButton.tsx +0 -47
- package/src/components/menu/__workshop__/ConstrainedInBoundary.tsx +0 -133
- package/src/components/menu/__workshop__/CustomMenuItem.tsx +0 -47
- package/src/components/menu/__workshop__/CustomSelectedState.tsx +0 -35
- package/src/components/menu/__workshop__/DataProps.tsx +0 -27
- package/src/components/menu/__workshop__/DisableFocusOnClose.tsx +0 -40
- package/src/components/menu/__workshop__/Groups.tsx +0 -164
- package/src/components/menu/__workshop__/MenuButton.tsx +0 -79
- package/src/components/menu/__workshop__/MenuGroupRight.tsx +0 -73
- package/src/components/menu/__workshop__/NestedMenu.tsx +0 -22
- package/src/components/menu/__workshop__/OnCloseMenuButton.tsx +0 -50
- package/src/components/menu/__workshop__/SelectedItem.tsx +0 -69
- package/src/components/menu/__workshop__/ShouldFocus.tsx +0 -42
- package/src/components/menu/__workshop__/Tones.tsx +0 -19
- package/src/components/menu/__workshop__/index.ts +0 -91
- package/src/components/menu/helpers.ts +0 -82
- package/src/components/menu/useMenu.ts +0 -21
- package/src/components/menu/useMenuController.ts +0 -245
- package/src/components/tab/Tab.tsx +0 -135
- package/src/components/tab/TabList.tsx +0 -157
- package/src/components/tab/TabListContext.ts +0 -10
- package/src/components/tab/TabPanel.tsx +0 -94
- package/src/components/tab/__workshop__/Example.tsx +0 -135
- package/src/components/tab/__workshop__/index.ts +0 -16
- package/src/components/tab/types.ts +0 -11
- package/src/components/toast/Toast.test.tsx +0 -103
- package/src/components/toast/Toast.tsx +0 -191
- package/src/components/toast/ToastContext.ts +0 -7
- package/src/components/toast/ToastLayer.tsx +0 -54
- package/src/components/toast/ToastProvider.tsx +0 -127
- package/src/components/toast/__workshop__/Hook.tsx +0 -71
- package/src/components/toast/__workshop__/Toast.tsx +0 -26
- package/src/components/toast/__workshop__/index.ts +0 -21
- package/src/components/toast/toastState.ts +0 -6
- package/src/components/toast/types.ts +0 -24
- package/src/components/toast/useToast.ts +0 -23
- package/src/components/tree/Tree.tsx +0 -248
- package/src/components/tree/TreeContext.ts +0 -10
- package/src/components/tree/TreeGroup.tsx +0 -46
- package/src/components/tree/TreeItem.tsx +0 -236
- package/src/components/tree/__workshop__/Basic.tsx +0 -108
- package/src/components/tree/__workshop__/TabFromElement.tsx +0 -84
- package/src/components/tree/__workshop__/basic.perf.ts +0 -19
- package/src/components/tree/__workshop__/index.ts +0 -23
- package/src/components/tree/helpers.ts +0 -105
- package/src/components/tree/types.ts +0 -24
- package/src/components/tree/useTree.ts +0 -17
- package/src/components/virtualList/VirtualList.tsx +0 -254
- package/src/components/virtualList/__workshop__/ChangingProps.tsx +0 -41
- package/src/components/virtualList/__workshop__/ElementScroll.tsx +0 -43
- package/src/components/virtualList/__workshop__/InfiniteList.tsx +0 -40
- package/src/components/virtualList/__workshop__/WindowScrolll.tsx +0 -23
- package/src/components/virtualList/__workshop__/index.ts +0 -31
- package/src/core/_keys.ts +0 -26
- package/src/core/constants.ts +0 -67
- package/src/core/getElementRef.ts +0 -29
- package/src/core/helpers/animation.ts +0 -26
- package/src/core/helpers/element.ts +0 -55
- package/src/core/helpers/focus.ts +0 -92
- package/src/core/helpers/props.ts +0 -51
- package/src/core/helpers/scroll.ts +0 -15
- package/src/core/lib/createGlobalScopedContext.ts +0 -39
- package/src/core/lib/globalScope.ts +0 -19
- package/src/core/lib/isArray.ts +0 -3
- package/src/core/lib/isRecord.ts +0 -3
- package/src/core/types.ts +0 -57
- package/src/hooks/useClickOutsideEvent.test.tsx +0 -114
- package/src/hooks/useClickOutsideEvent.ts +0 -66
- package/src/hooks/useCustomValidity.ts +0 -13
- package/src/hooks/useElementSize.ts +0 -19
- package/src/hooks/useGlobalKeyDown.ts +0 -23
- package/src/hooks/useMatchMedia.ts +0 -28
- package/src/hooks/useMediaIndex/__workshop__/Test.tsx +0 -14
- package/src/hooks/useMediaIndex/__workshop__/index.ts +0 -16
- package/src/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -21
- package/src/hooks/useMediaIndex/useMediaIndex.ts +0 -111
- package/src/hooks/useMounted.ts +0 -15
- package/src/hooks/usePrefersDark.hydration.test.tsx +0 -56
- package/src/hooks/usePrefersDark.test.tsx +0 -20
- package/src/hooks/usePrefersDark.ts +0 -16
- package/src/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
- package/src/hooks/usePrefersReducedMotion.test.tsx +0 -20
- package/src/hooks/usePrefersReducedMotion.ts +0 -16
- package/src/hooks/useResponsiveProp.ts +0 -14
- package/src/hooks/useUnique.ts +0 -54
- package/src/middleware/origin.ts +0 -47
- package/src/observers/elementSize.ts +0 -114
- package/src/primitives/_syntax/LazySyntax.tsx +0 -4
- package/src/primitives/_syntax/Syntax.tsx +0 -26
- package/src/primitives/avatar/Avatar.tsx +0 -145
- package/src/primitives/avatar/AvatarCounter.tsx +0 -69
- package/src/primitives/avatar/AvatarStack.tsx +0 -77
- package/src/primitives/avatar/__workshop__/AsButton.tsx +0 -12
- package/src/primitives/avatar/__workshop__/PropsStory.tsx +0 -24
- package/src/primitives/avatar/__workshop__/Stack.tsx +0 -27
- package/src/primitives/avatar/__workshop__/WithinButton.tsx +0 -51
- package/src/primitives/avatar/__workshop__/WithinMenuItem.tsx +0 -52
- package/src/primitives/avatar/__workshop__/index.ts +0 -36
- package/src/primitives/avatar/types.ts +0 -2
- package/src/primitives/badge/Badge.test.tsx +0 -16
- package/src/primitives/badge/Badge.tsx +0 -53
- package/src/primitives/badge/__workshop__/Props.tsx +0 -27
- package/src/primitives/badge/__workshop__/Tones.tsx +0 -15
- package/src/primitives/badge/__workshop__/index.ts +0 -26
- package/src/primitives/badge/__workshop__/within-button.tsx +0 -36
- package/src/primitives/box/Box.tsx +0 -73
- package/src/primitives/box/__workshop__/Props.tsx +0 -26
- package/src/primitives/box/__workshop__/Responsive.tsx +0 -19
- package/src/primitives/box/__workshop__/index.ts +0 -21
- package/src/primitives/button/Button.test.tsx +0 -30
- package/src/primitives/button/Button.tsx +0 -148
- package/src/primitives/button/__workshop__/Custom.tsx +0 -39
- package/src/primitives/button/__workshop__/CustomIcons.tsx +0 -37
- package/src/primitives/button/__workshop__/DataProps.tsx +0 -18
- package/src/primitives/button/__workshop__/Disabled.tsx +0 -43
- package/src/primitives/button/__workshop__/MixedChildren.tsx +0 -12
- package/src/primitives/button/__workshop__/Props.tsx +0 -60
- package/src/primitives/button/__workshop__/Stacked.tsx +0 -60
- package/src/primitives/button/__workshop__/Styled1.css.ts +0 -7
- package/src/primitives/button/__workshop__/Styled1.tsx +0 -11
- package/src/primitives/button/__workshop__/TextOverflow.tsx +0 -17
- package/src/primitives/button/__workshop__/UploadButton.tsx +0 -28
- package/src/primitives/button/__workshop__/index.ts +0 -61
- package/src/primitives/button/types.ts +0 -2
- package/src/primitives/card/Card.tsx +0 -124
- package/src/primitives/card/CardContext.ts +0 -10
- package/src/primitives/card/CardInternalContext.ts +0 -10
- package/src/primitives/card/CardInternalProvider.tsx +0 -15
- package/src/primitives/card/CardProvider.tsx +0 -16
- package/src/primitives/card/__workshop__/AsButton.tsx +0 -103
- package/src/primitives/card/__workshop__/AsComponent.tsx +0 -25
- package/src/primitives/card/__workshop__/Checkered.tsx +0 -25
- package/src/primitives/card/__workshop__/DataProps.tsx +0 -25
- package/src/primitives/card/__workshop__/Interactive.tsx +0 -29
- package/src/primitives/card/__workshop__/ListNavigation.tsx +0 -78
- package/src/primitives/card/__workshop__/Props.tsx +0 -59
- package/src/primitives/card/__workshop__/Selected.tsx +0 -62
- package/src/primitives/card/__workshop__/Styled.tsx +0 -11
- package/src/primitives/card/__workshop__/Tones.tsx +0 -26
- package/src/primitives/card/__workshop__/index.ts +0 -21
- package/src/primitives/card/types.ts +0 -21
- package/src/primitives/card/useCard.ts +0 -20
- package/src/primitives/checkbox/Checkbox.tsx +0 -80
- package/src/primitives/checkbox/__workshop__/Example.tsx +0 -25
- package/src/primitives/checkbox/__workshop__/Props.tsx +0 -35
- package/src/primitives/checkbox/__workshop__/ReadOnly.tsx +0 -16
- package/src/primitives/checkbox/__workshop__/Tones.tsx +0 -26
- package/src/primitives/checkbox/__workshop__/index.ts +0 -15
- package/src/primitives/code/Code.tsx +0 -47
- package/src/primitives/code/__workshop__/OpticalAlignment.tsx +0 -25
- package/src/primitives/code/__workshop__/Props.tsx +0 -20
- package/src/primitives/code/__workshop__/index.ts +0 -21
- package/src/primitives/container/Container.tsx +0 -43
- package/src/primitives/container/__workshop__/Example.tsx +0 -16
- package/src/primitives/container/__workshop__/index.ts +0 -16
- package/src/primitives/container/types.ts +0 -6
- package/src/primitives/flex/Flex.tsx +0 -38
- package/src/primitives/flex/__workshop__/Example.tsx +0 -26
- package/src/primitives/flex/__workshop__/Gap.tsx +0 -25
- package/src/primitives/flex/__workshop__/index.ts +0 -13
- package/src/primitives/flex/__workshop__/styles.css.ts +0 -12
- package/src/primitives/grid/Grid.tsx +0 -38
- package/src/primitives/grid/__workshop__/Responsive.tsx +0 -54
- package/src/primitives/grid/__workshop__/index.ts +0 -12
- package/src/primitives/heading/Heading.tsx +0 -68
- package/src/primitives/heading/__workshop__/OpticalAlignment.tsx +0 -27
- package/src/primitives/heading/__workshop__/Plain.tsx +0 -25
- package/src/primitives/heading/__workshop__/index.ts +0 -21
- package/src/primitives/inline/Inline.tsx +0 -37
- package/src/primitives/inline/__workshop__/Plain.tsx +0 -22
- package/src/primitives/inline/__workshop__/index.ts +0 -10
- package/src/primitives/kbd/Kbd.tsx +0 -36
- package/src/primitives/kbd/__workshop__/Plain.tsx +0 -9
- package/src/primitives/kbd/__workshop__/index.ts +0 -10
- package/src/primitives/label/Label.tsx +0 -67
- package/src/primitives/label/__workshop__/OpticalAlignment.tsx +0 -27
- package/src/primitives/label/__workshop__/Plain.tsx +0 -27
- package/src/primitives/label/__workshop__/index.ts +0 -21
- package/src/primitives/layer/Layer.test.tsx +0 -110
- package/src/primitives/layer/Layer.tsx +0 -35
- package/src/primitives/layer/LayerCard.tsx +0 -90
- package/src/primitives/layer/LayerContext.ts +0 -7
- package/src/primitives/layer/LayerProvider.tsx +0 -106
- package/src/primitives/layer/__workshop__/MultipleRoots.tsx +0 -49
- package/src/primitives/layer/__workshop__/Nested.tsx +0 -107
- package/src/primitives/layer/__workshop__/ResponsiveZOffset.tsx +0 -17
- package/src/primitives/layer/__workshop__/_debug.tsx +0 -17
- package/src/primitives/layer/__workshop__/index.ts +0 -26
- package/src/primitives/layer/getLayerContext.test.ts +0 -32
- package/src/primitives/layer/getLayerContext.ts +0 -21
- package/src/primitives/layer/types.ts +0 -9
- package/src/primitives/layer/useLayer.ts +0 -24
- package/src/primitives/popover/Popover.tsx +0 -291
- package/src/primitives/popover/PopoverLayer.tsx +0 -101
- package/src/primitives/popover/__workshop__/AlignedStory.tsx +0 -75
- package/src/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
- package/src/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
- package/src/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
- package/src/primitives/popover/__workshop__/PlainStory.tsx +0 -67
- package/src/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
- package/src/primitives/popover/__workshop__/SidePanelStory.tsx +0 -95
- package/src/primitives/popover/__workshop__/TestStory.tsx +0 -97
- package/src/primitives/popover/__workshop__/index.ts +0 -56
- package/src/primitives/popover/__workshop__/portal-inheritance.tsx +0 -15
- package/src/primitives/popover/constants.ts +0 -20
- package/src/primitives/popover/floating-ui/size.ts +0 -75
- package/src/primitives/popover/types.ts +0 -12
- package/src/primitives/popover/useMiddleware.ts +0 -126
- package/src/primitives/radio/Radio.tsx +0 -64
- package/src/primitives/radio/__workshop__/Example.tsx +0 -63
- package/src/primitives/radio/__workshop__/Plain.tsx +0 -28
- package/src/primitives/radio/__workshop__/index.ts +0 -13
- package/src/primitives/select/Select.tsx +0 -76
- package/src/primitives/select/__workshop__/Plain.tsx +0 -37
- package/src/primitives/select/__workshop__/ReadOnly.tsx +0 -23
- package/src/primitives/select/__workshop__/index.ts +0 -13
- package/src/primitives/selectable/Selectable.tsx +0 -48
- package/src/primitives/selectable/__workshop__/DataProps.tsx +0 -24
- package/src/primitives/selectable/__workshop__/as-link.tsx +0 -13
- package/src/primitives/selectable/__workshop__/index.ts +0 -19
- package/src/primitives/skeleton/CodeSkeleton.tsx +0 -49
- package/src/primitives/skeleton/HeadingSkeleton.tsx +0 -48
- package/src/primitives/skeleton/LabelSkeleton.tsx +0 -47
- package/src/primitives/skeleton/Skeleton.tsx +0 -70
- package/src/primitives/skeleton/TextSkeleton.tsx +0 -49
- package/src/primitives/skeleton/__workshop__/Delay.tsx +0 -69
- package/src/primitives/skeleton/__workshop__/Skeleton.tsx +0 -63
- package/src/primitives/skeleton/__workshop__/index.ts +0 -13
- package/src/primitives/spinner/Spinner.tsx +0 -45
- package/src/primitives/spinner/SpinnerAnimatedIcon.tsx +0 -14
- package/src/primitives/spinner/__workshop__/Props.tsx +0 -13
- package/src/primitives/spinner/__workshop__/index.ts +0 -16
- package/src/primitives/srOnly/SrOnly.tsx +0 -33
- package/src/primitives/stack/Stack.tsx +0 -38
- package/src/primitives/stack/__workshop__/Plain.tsx +0 -30
- package/src/primitives/stack/__workshop__/index.ts +0 -16
- package/src/primitives/switch/Switch.tsx +0 -76
- package/src/primitives/switch/__workshop__/Example.tsx +0 -25
- package/src/primitives/switch/__workshop__/Props.tsx +0 -23
- package/src/primitives/switch/__workshop__/index.ts +0 -13
- package/src/primitives/text/InlineCode.tsx +0 -25
- package/src/primitives/text/Text.tsx +0 -68
- package/src/primitives/text/__workshop__/Example.tsx +0 -26
- package/src/primitives/text/__workshop__/OpticalAlignment.tsx +0 -27
- package/src/primitives/text/__workshop__/index.ts +0 -26
- package/src/primitives/text/__workshop__/inline-code.tsx +0 -13
- package/src/primitives/textArea/TextArea.tsx +0 -97
- package/src/primitives/textArea/__workshop__/Plain.tsx +0 -46
- package/src/primitives/textArea/__workshop__/index.ts +0 -16
- package/src/primitives/textInput/TextInput.tsx +0 -279
- package/src/primitives/textInput/__workshop__/ClearButton.tsx +0 -32
- package/src/primitives/textInput/__workshop__/CustomValidity.tsx +0 -17
- package/src/primitives/textInput/__workshop__/Plain.tsx +0 -102
- package/src/primitives/textInput/__workshop__/ReadOnly.tsx +0 -14
- package/src/primitives/textInput/__workshop__/States.tsx +0 -53
- package/src/primitives/textInput/__workshop__/Tones.tsx +0 -40
- package/src/primitives/textInput/__workshop__/Typed.tsx +0 -23
- package/src/primitives/textInput/__workshop__/index.ts +0 -46
- package/src/primitives/tooltip/Tooltip.test.tsx +0 -496
- package/src/primitives/tooltip/Tooltip.tsx +0 -546
- package/src/primitives/tooltip/TooltipLayer.tsx +0 -72
- package/src/primitives/tooltip/__workshop__/CustomPortal.tsx +0 -102
- package/src/primitives/tooltip/__workshop__/OverflowingBoundary.tsx +0 -74
- package/src/primitives/tooltip/__workshop__/Props.tsx +0 -107
- package/src/primitives/tooltip/__workshop__/ResizableBoundary.tsx +0 -91
- package/src/primitives/tooltip/__workshop__/index.ts +0 -31
- package/src/primitives/tooltip/constants.ts +0 -24
- package/src/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupContext.tsx +0 -13
- package/src/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupProvider.tsx +0 -96
- package/src/primitives/tooltip/tooltipDelayGroup/types.ts +0 -7
- package/src/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
- package/src/root/Root.tsx +0 -93
- package/src/root/RootProvider.tsx +0 -37
- package/src/root/__workshop__/Boundary.tsx +0 -43
- package/src/root/__workshop__/index.ts +0 -24
- package/src/root/__workshop__/primitives.tsx +0 -49
- package/src/root/__workshop__/tone-inheritance.tsx +0 -65
- package/src/utils/ErrorBoundary.tsx +0 -50
- package/src/utils/boundaryElement/BoundaryElementContext.ts +0 -7
- package/src/utils/boundaryElement/BoundaryElementProvider.tsx +0 -16
- package/src/utils/boundaryElement/__workshop__/Plain.tsx +0 -49
- package/src/utils/boundaryElement/__workshop__/index.ts +0 -16
- package/src/utils/boundaryElement/types.ts +0 -2
- package/src/utils/boundaryElement/useBoundaryElement.ts +0 -12
- package/src/utils/elementQuery/ElementQuery.tsx +0 -75
- package/src/utils/elementQuery/__workshop__/CustomMedia.tsx +0 -19
- package/src/utils/elementQuery/__workshop__/index.ts +0 -16
- package/src/utils/elementQuery/__workshop__/styles.css.ts +0 -31
- package/src/utils/elementQuery/helpers.ts +0 -27
- package/src/utils/portal/Portal.test.tsx +0 -105
- package/src/utils/portal/Portal.tsx +0 -42
- package/src/utils/portal/PortalContext.ts +0 -37
- package/src/utils/portal/PortalProvider.tsx +0 -38
- package/src/utils/portal/__workshop__/Named.tsx +0 -69
- package/src/utils/portal/__workshop__/index.ts +0 -16
- package/src/utils/portal/types.ts +0 -7
- package/src/utils/portal/usePortal.ts +0 -30
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isHTMLAnchorElement,
|
|
3
|
-
isHTMLButtonElement,
|
|
4
|
-
isHTMLElement,
|
|
5
|
-
isHTMLInputElement,
|
|
6
|
-
isHTMLSelectElement,
|
|
7
|
-
isHTMLTextAreaElement,
|
|
8
|
-
} from './element'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
export function _hasFocus(element: HTMLElement): boolean {
|
|
14
|
-
return Boolean(document.activeElement) && element.contains(document.activeElement)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* @internal
|
|
19
|
-
*/
|
|
20
|
-
export function isFocusable(element: HTMLElement): boolean {
|
|
21
|
-
if (
|
|
22
|
-
element.tabIndex > 0 ||
|
|
23
|
-
(element.tabIndex === 0 && element.getAttribute('tabIndex') !== null)
|
|
24
|
-
) {
|
|
25
|
-
return true
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (isHTMLAnchorElement(element)) {
|
|
29
|
-
return Boolean(element.href) && element.rel !== 'ignore'
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (isHTMLInputElement(element)) {
|
|
33
|
-
return element.type !== 'hidden' && element.type !== 'file' && !element.disabled
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
isHTMLButtonElement(element) ||
|
|
38
|
-
isHTMLSelectElement(element) ||
|
|
39
|
-
isHTMLTextAreaElement(element)
|
|
40
|
-
) {
|
|
41
|
-
return !element.disabled
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return false
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* @internal
|
|
49
|
-
*/
|
|
50
|
-
export function attemptFocus(element: HTMLElement): boolean {
|
|
51
|
-
if (!isFocusable(element)) {
|
|
52
|
-
return false
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
element.focus()
|
|
57
|
-
} catch {
|
|
58
|
-
// ignore
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return document.activeElement === element
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @internal
|
|
66
|
-
*/
|
|
67
|
-
export function focusFirstDescendant(element: HTMLElement): boolean {
|
|
68
|
-
for (let i = 0; i < element.childNodes.length; i++) {
|
|
69
|
-
const child = element.childNodes[i]
|
|
70
|
-
|
|
71
|
-
if (isHTMLElement(child) && (attemptFocus(child) || focusFirstDescendant(child))) {
|
|
72
|
-
return true
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return false
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* @internal
|
|
81
|
-
*/
|
|
82
|
-
export function focusLastDescendant(element: HTMLElement): boolean {
|
|
83
|
-
for (let i = element.childNodes.length - 1; i >= 0; i--) {
|
|
84
|
-
const child = element.childNodes[i]
|
|
85
|
-
|
|
86
|
-
if (isHTMLElement(child) && (attemptFocus(child) || focusLastDescendant(child))) {
|
|
87
|
-
return true
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return false
|
|
92
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {BREAKPOINT_KEYS, type ResponsiveProp, type ResponsivePropArray} from '@sanity/ui-css'
|
|
2
|
-
|
|
3
|
-
import {EMPTY_ARRAY} from '../constants'
|
|
4
|
-
import {isArray} from '../lib/isArray'
|
|
5
|
-
import {isRecord} from '../lib/isRecord'
|
|
6
|
-
|
|
7
|
-
// WeakMap for object/array values (automatic GC when objects are no longer referenced)
|
|
8
|
-
const objectCache = new WeakMap<object, ResponsivePropArray<unknown>>()
|
|
9
|
-
|
|
10
|
-
// Map for primitive values (bounded growth - only primitives like numbers/strings)
|
|
11
|
-
const primitiveCache = new Map<unknown, ResponsivePropArray<unknown>>()
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
export function _getResponsiveProp<T>(
|
|
17
|
-
val: ResponsiveProp<T> | undefined,
|
|
18
|
-
defaultVal?: ResponsivePropArray<T>,
|
|
19
|
-
): ResponsivePropArray<T> {
|
|
20
|
-
// Fast path: undefined
|
|
21
|
-
if (val === undefined) {
|
|
22
|
-
return defaultVal || (EMPTY_ARRAY as unknown as ResponsivePropArray<T>)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Fast path: already an array or object - use WeakMap for identity-based caching
|
|
26
|
-
if (isArray(val)) {
|
|
27
|
-
let v = val
|
|
28
|
-
|
|
29
|
-
// convert to array
|
|
30
|
-
if (isRecord(val)) {
|
|
31
|
-
v = BREAKPOINT_KEYS.map((key) => val[key]) as ResponsivePropArray<T>
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const cached = objectCache.get(v)
|
|
35
|
-
if (cached) return cached as ResponsivePropArray<T>
|
|
36
|
-
|
|
37
|
-
const ret = v as ResponsivePropArray<T>
|
|
38
|
-
objectCache.set(v, ret)
|
|
39
|
-
return ret
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Primitive value - wrap in array and cache by value
|
|
43
|
-
const cached = primitiveCache.get(val)
|
|
44
|
-
if (cached) return cached as ResponsivePropArray<T>
|
|
45
|
-
|
|
46
|
-
const ret = [val] as ResponsivePropArray<T>
|
|
47
|
-
|
|
48
|
-
primitiveCache.set(val, ret)
|
|
49
|
-
|
|
50
|
-
return ret
|
|
51
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @internal
|
|
3
|
-
*/
|
|
4
|
-
export function _isScrollable(el: Node): boolean {
|
|
5
|
-
if (!(el instanceof Element)) return false
|
|
6
|
-
|
|
7
|
-
const style = window.getComputedStyle(el)
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
style.overflowX.includes('auto') ||
|
|
11
|
-
style.overflowX.includes('scroll') ||
|
|
12
|
-
style.overflowY.includes('auto') ||
|
|
13
|
-
style.overflowY.includes('scroll')
|
|
14
|
-
)
|
|
15
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* As `@sanity/ui` is declared as a dependency, and may be duplicated, sometimes across major versions
|
|
3
|
-
* it's critical that vital react contexts are shared even when there is a duplicate.
|
|
4
|
-
* If we used a model similar to `sanity` itself this would be unnecessary as
|
|
5
|
-
* those libraries enforce single instances.
|
|
6
|
-
* Since we don't enforce it we have to support a sanity plugin being able to call hooks like `useToast`, and then
|
|
7
|
-
* read the context setup by `sanity`, which calls `ToastProvider`, even if the provider and hook are different instances in memory.
|
|
8
|
-
* It's also why it's vital that all changes to globally scoped providers remain fully backwards compatible to v1.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import {type Context, createContext} from 'react'
|
|
12
|
-
|
|
13
|
-
import {globalScope} from './globalScope'
|
|
14
|
-
|
|
15
|
-
export function createGlobalScopedContext<ContextType, const T extends ContextType = ContextType>(
|
|
16
|
-
/**
|
|
17
|
-
* Enforce that all Symbol.for keys used for globally scoped contexts have a predictable prefix
|
|
18
|
-
*/
|
|
19
|
-
key: `@sanity/ui/v4/${string}`,
|
|
20
|
-
defaultValue: T,
|
|
21
|
-
): Context<ContextType> {
|
|
22
|
-
const symbol = Symbol.for(key)
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Prevent errors about re-renders on React SSR on Next.js App Router
|
|
26
|
-
*/
|
|
27
|
-
if (typeof document === 'undefined') {
|
|
28
|
-
const context = createContext<ContextType>(defaultValue)
|
|
29
|
-
context.displayName = key
|
|
30
|
-
return context
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Use the global scope as a map of symbols to contexts
|
|
34
|
-
const symbolMap = globalScope as Record<symbol, Context<ContextType>>
|
|
35
|
-
|
|
36
|
-
symbolMap[symbol] = symbolMap[symbol] || createContext<T>(defaultValue)
|
|
37
|
-
|
|
38
|
-
return symbolMap[symbol]
|
|
39
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gets the global scope instance in a given environment.
|
|
3
|
-
*
|
|
4
|
-
* The strategy is to return the most modern, and if not, the most common:
|
|
5
|
-
* - The `globalThis` variable is the modern approach to accessing the global scope
|
|
6
|
-
* - The `window` variable is the global scope in a web browser
|
|
7
|
-
* - The `self` variable is the global scope in workers and others
|
|
8
|
-
* - The `global` variable is the global scope in Node.js
|
|
9
|
-
*/
|
|
10
|
-
function getGlobalScope() {
|
|
11
|
-
if (typeof globalThis !== 'undefined') return globalThis
|
|
12
|
-
if (typeof window !== 'undefined') return window
|
|
13
|
-
if (typeof self !== 'undefined') return self
|
|
14
|
-
if (typeof global !== 'undefined') return global
|
|
15
|
-
|
|
16
|
-
throw new Error('@sanity/ui: could not locate global scope')
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const globalScope: typeof globalThis = getGlobalScope()
|
package/src/core/lib/isArray.ts
DELETED
package/src/core/lib/isRecord.ts
DELETED
package/src/core/types.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Assign properties from `U` to `T`, excluding properties that already exist in `T`.
|
|
6
|
-
*
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
export type Assign<T extends {}, U extends {}> = Omit<T, keyof U> & U
|
|
10
|
-
|
|
11
|
-
/** @public */
|
|
12
|
-
export type EmptyProps = {}
|
|
13
|
-
|
|
14
|
-
/** @public */
|
|
15
|
-
export type TagType = keyof React.JSX.IntrinsicElements
|
|
16
|
-
|
|
17
|
-
/** @public */
|
|
18
|
-
export type ComponentType<P = any> =
|
|
19
|
-
| React.FunctionComponent<P>
|
|
20
|
-
| React.ComponentClass<P>
|
|
21
|
-
| React.ExoticComponent<P>
|
|
22
|
-
|
|
23
|
-
/** @public */
|
|
24
|
-
export type ElementType<P> = TagType | ComponentType<P>
|
|
25
|
-
|
|
26
|
-
/** @public */
|
|
27
|
-
export type Props<P extends EmptyProps, E extends ElementType<P>> = Assign<
|
|
28
|
-
E extends TagType ? React.JSX.IntrinsicElements[E] : React.ComponentProps<E>,
|
|
29
|
-
P & {as?: E}
|
|
30
|
-
>
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Placement of floating UI elements.
|
|
34
|
-
*
|
|
35
|
-
* @public
|
|
36
|
-
*/
|
|
37
|
-
export type Placement =
|
|
38
|
-
| 'top'
|
|
39
|
-
| 'top-start'
|
|
40
|
-
| 'top-end'
|
|
41
|
-
| 'right'
|
|
42
|
-
| 'right-start'
|
|
43
|
-
| 'right-end'
|
|
44
|
-
| 'bottom'
|
|
45
|
-
| 'bottom-start'
|
|
46
|
-
| 'bottom-end'
|
|
47
|
-
| 'left'
|
|
48
|
-
| 'left-start'
|
|
49
|
-
| 'left-end'
|
|
50
|
-
|
|
51
|
-
/** @public */
|
|
52
|
-
export type Delay =
|
|
53
|
-
| number
|
|
54
|
-
| Partial<{
|
|
55
|
-
open: number
|
|
56
|
-
close: number
|
|
57
|
-
}>
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import {render, screen} from '@testing-library/react'
|
|
2
|
-
import userEvent from '@testing-library/user-event'
|
|
3
|
-
import {useRef} from 'react'
|
|
4
|
-
import {describe, expect, it, vi} from 'vitest'
|
|
5
|
-
|
|
6
|
-
import {useClickOutsideEvent} from './useClickOutsideEvent'
|
|
7
|
-
|
|
8
|
-
describe('useClickOutsideEvent', () => {
|
|
9
|
-
/**
|
|
10
|
-
* This suite demonstrates the new hook `useClickOutsideEvent` that replaces `useClickOutside`
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
it('calls the handler when clicking outside of the array of elements', async () => {
|
|
14
|
-
const user = userEvent.setup()
|
|
15
|
-
const handler = vi.fn()
|
|
16
|
-
|
|
17
|
-
const TestComponent = () => {
|
|
18
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
19
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
20
|
-
|
|
21
|
-
useClickOutsideEvent(handler, () => [buttonRef.current, popoverRef.current])
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<>
|
|
25
|
-
<button ref={buttonRef} data-testid="button" />
|
|
26
|
-
<div ref={popoverRef} data-testid="popover" />
|
|
27
|
-
<div data-testid="outside" />
|
|
28
|
-
</>
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
render(<TestComponent />)
|
|
33
|
-
|
|
34
|
-
await user.click(screen.getByTestId('button'))
|
|
35
|
-
await user.click(screen.getByTestId('popover'))
|
|
36
|
-
expect(handler).not.toHaveBeenCalled()
|
|
37
|
-
|
|
38
|
-
await user.click(screen.getByTestId('outside'))
|
|
39
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
it('the elements array flattens nested arrays one level deep', async () => {
|
|
43
|
-
const user = userEvent.setup()
|
|
44
|
-
const handler = vi.fn()
|
|
45
|
-
|
|
46
|
-
const TestComponent = () => {
|
|
47
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
48
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
49
|
-
|
|
50
|
-
useClickOutsideEvent(handler, () => [
|
|
51
|
-
null,
|
|
52
|
-
[null, buttonRef.current],
|
|
53
|
-
[popoverRef.current, null],
|
|
54
|
-
null,
|
|
55
|
-
])
|
|
56
|
-
|
|
57
|
-
return (
|
|
58
|
-
<>
|
|
59
|
-
<button ref={buttonRef} data-testid="button" />
|
|
60
|
-
<div ref={popoverRef} data-testid="popover" />
|
|
61
|
-
<div data-testid="outside" />
|
|
62
|
-
</>
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
render(<TestComponent />)
|
|
67
|
-
|
|
68
|
-
await user.click(screen.getByTestId('button'))
|
|
69
|
-
await user.click(screen.getByTestId('popover'))
|
|
70
|
-
expect(handler).not.toHaveBeenCalled()
|
|
71
|
-
|
|
72
|
-
await user.click(screen.getByTestId('outside'))
|
|
73
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('it can set a boundary to scope outside click events', async () => {
|
|
77
|
-
const user = userEvent.setup()
|
|
78
|
-
const handler = vi.fn()
|
|
79
|
-
|
|
80
|
-
const TestComponent = () => {
|
|
81
|
-
const buttonRef = useRef<HTMLButtonElement | null>(null)
|
|
82
|
-
const popoverRef = useRef<HTMLDivElement | null>(null)
|
|
83
|
-
const boundaryRef = useRef<HTMLDivElement | null>(null)
|
|
84
|
-
|
|
85
|
-
useClickOutsideEvent(
|
|
86
|
-
handler,
|
|
87
|
-
() => [buttonRef.current, popoverRef.current],
|
|
88
|
-
() => boundaryRef.current,
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
return (
|
|
92
|
-
<>
|
|
93
|
-
<div ref={boundaryRef}>
|
|
94
|
-
<button ref={buttonRef} data-testid="button" />
|
|
95
|
-
<div ref={popoverRef} data-testid="popover" />
|
|
96
|
-
<div data-testid="inside" />
|
|
97
|
-
</div>
|
|
98
|
-
<div data-testid="outside" />
|
|
99
|
-
</>
|
|
100
|
-
)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
render(<TestComponent />)
|
|
104
|
-
|
|
105
|
-
await user.click(screen.getByTestId('button'))
|
|
106
|
-
await user.click(screen.getByTestId('popover'))
|
|
107
|
-
// Since it's outside the boundary it should be ignored
|
|
108
|
-
await user.click(screen.getByTestId('outside'))
|
|
109
|
-
expect(handler).not.toHaveBeenCalled()
|
|
110
|
-
|
|
111
|
-
await user.click(screen.getByTestId('inside'))
|
|
112
|
-
expect(handler).toHaveBeenCalledTimes(1)
|
|
113
|
-
})
|
|
114
|
-
})
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import {useDebugValue, useEffect, useEffectEvent} from 'react'
|
|
2
|
-
|
|
3
|
-
import {EMPTY_ARRAY} from '../core/constants'
|
|
4
|
-
|
|
5
|
-
/** @public */
|
|
6
|
-
export type ClickOutsideEventListener = (event: MouseEvent) => void
|
|
7
|
-
|
|
8
|
-
/** @public */
|
|
9
|
-
export type ClickOutsideEventElements = (HTMLElement | null | (HTMLElement | null)[])[]
|
|
10
|
-
|
|
11
|
-
/** @public */
|
|
12
|
-
export function useClickOutsideEvent(
|
|
13
|
-
listener: ClickOutsideEventListener | false | undefined,
|
|
14
|
-
elementsArg: () => ClickOutsideEventElements = () => EMPTY_ARRAY,
|
|
15
|
-
boundaryElement?: () => HTMLElement | null,
|
|
16
|
-
): void {
|
|
17
|
-
/**
|
|
18
|
-
* The `useEffectEvent` hook allow us to always see the latest value of `listener`, `elementsArg` and `boundaryElement` without needing to
|
|
19
|
-
* juggle `useState`, `useRef` and `useState` to make sure the `mousedown` event listener isn't constantly being added and removed.
|
|
20
|
-
*/
|
|
21
|
-
const onEvent = useEffectEvent((evt: MouseEvent) => {
|
|
22
|
-
if (!listener) {
|
|
23
|
-
return
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const target = evt.target
|
|
27
|
-
|
|
28
|
-
if (!(target instanceof Node)) {
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const resolvedBoundaryElement = boundaryElement?.()
|
|
33
|
-
|
|
34
|
-
if (resolvedBoundaryElement && !resolvedBoundaryElement.contains(target)) {
|
|
35
|
-
return
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const elements = elementsArg().flat()
|
|
39
|
-
|
|
40
|
-
for (const el of elements) {
|
|
41
|
-
if (!el) continue
|
|
42
|
-
|
|
43
|
-
if (target === el || el.contains(target)) {
|
|
44
|
-
return
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
listener(evt)
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
const hasListener = Boolean(listener)
|
|
52
|
-
|
|
53
|
-
useEffect(() => {
|
|
54
|
-
if (!hasListener) return undefined
|
|
55
|
-
|
|
56
|
-
const handleEvent = (evt: MouseEvent) => onEvent(evt)
|
|
57
|
-
|
|
58
|
-
document.addEventListener('mousedown', handleEvent)
|
|
59
|
-
|
|
60
|
-
return () => {
|
|
61
|
-
document.removeEventListener('mousedown', handleEvent)
|
|
62
|
-
}
|
|
63
|
-
}, [hasListener])
|
|
64
|
-
|
|
65
|
-
useDebugValue(listener ? 'MouseDown On' : 'MouseDown Off')
|
|
66
|
-
}
|
|
@@ -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,19 +0,0 @@
|
|
|
1
|
-
import {useEffect, useState} from 'react'
|
|
2
|
-
|
|
3
|
-
import {_elementSizeObserver, type ElementSize} from '../observers/elementSize'
|
|
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,23 +0,0 @@
|
|
|
1
|
-
import {useEffect, useEffectEvent} from 'react'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Adds global keydown event listener to the window.
|
|
5
|
-
*
|
|
6
|
-
* @param onKeyDown - The function to call when a keydown event is triggered.
|
|
7
|
-
* @param options - The options to pass to the addEventListener function (example, capture: true)
|
|
8
|
-
* @beta
|
|
9
|
-
*/
|
|
10
|
-
export function useGlobalKeyDown(
|
|
11
|
-
onKeyDown: (event: KeyboardEvent) => void,
|
|
12
|
-
options?: AddEventListenerOptions,
|
|
13
|
-
): void {
|
|
14
|
-
const handleKeyDown = useEffectEvent((event: KeyboardEvent) => onKeyDown(event))
|
|
15
|
-
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
const handler = (event: KeyboardEvent) => handleKeyDown(event)
|
|
18
|
-
|
|
19
|
-
window.addEventListener('keydown', handler, options)
|
|
20
|
-
|
|
21
|
-
return () => window.removeEventListener('keydown', handler, options)
|
|
22
|
-
}, [options])
|
|
23
|
-
}
|
|
@@ -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://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,14 +0,0 @@
|
|
|
1
|
-
import {Card, Stack, Text, useMediaIndex} from '@sanity/ui'
|
|
2
|
-
|
|
3
|
-
export default function TestStory(): React.JSX.Element {
|
|
4
|
-
const mediaIndex = useMediaIndex()
|
|
5
|
-
|
|
6
|
-
return (
|
|
7
|
-
<Card padding={5}>
|
|
8
|
-
<Stack gap={3}>
|
|
9
|
-
<Text weight="medium">The current media index is {mediaIndex}.</Text>
|
|
10
|
-
<Text muted>Try resizing the browser.</Text>
|
|
11
|
-
</Stack>
|
|
12
|
-
</Card>
|
|
13
|
-
)
|
|
14
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type {WorkshopScope} from '@sanity/ui-workshop'
|
|
2
|
-
import {lazy} from 'react'
|
|
3
|
-
|
|
4
|
-
const scope: WorkshopScope = {
|
|
5
|
-
name: 'hooks/use-media-index',
|
|
6
|
-
title: 'useMediaIndex',
|
|
7
|
-
stories: [
|
|
8
|
-
{
|
|
9
|
-
name: 'test',
|
|
10
|
-
title: 'Test',
|
|
11
|
-
component: lazy(() => import('./Test')),
|
|
12
|
-
},
|
|
13
|
-
],
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export default scope
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/** @jest-environment node */
|
|
2
|
-
|
|
3
|
-
import {renderToStaticMarkup, renderToString} from 'react-dom/server'
|
|
4
|
-
import {describe, expect, it} from 'vitest'
|
|
5
|
-
|
|
6
|
-
import {useMediaIndex} from './useMediaIndex'
|
|
7
|
-
|
|
8
|
-
function Log() {
|
|
9
|
-
const mediaIndex = useMediaIndex()
|
|
10
|
-
|
|
11
|
-
return <>mediaIndex: {JSON.stringify(mediaIndex)}</>
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
describe('useMediaIndex', () => {
|
|
15
|
-
it(`SSR to static markup returns 0`, () => {
|
|
16
|
-
expect(renderToStaticMarkup(<Log />)).toBe('mediaIndex: 0')
|
|
17
|
-
})
|
|
18
|
-
it(`SSR to markup for hydration doesn't throw`, () => {
|
|
19
|
-
expect(renderToString(<Log />)).toBe('mediaIndex: <!-- -->0')
|
|
20
|
-
})
|
|
21
|
-
})
|