@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,135 +0,0 @@
|
|
|
1
|
-
import {Box, Button, Card, Tab, TabList, TabPanel, Text} from '@sanity/ui'
|
|
2
|
-
import {useBoolean} from '@sanity/ui-workshop'
|
|
3
|
-
import {useState} from 'react'
|
|
4
|
-
|
|
5
|
-
import {CardWrapper} from '../../../../workshop'
|
|
6
|
-
|
|
7
|
-
export default function ExampleStory(): React.JSX.Element {
|
|
8
|
-
const [tab, setTab] = useState('foo')
|
|
9
|
-
|
|
10
|
-
const autoActivate = useBoolean('Auto activate')
|
|
11
|
-
const useLongTitle = useBoolean('Use long title', false)
|
|
12
|
-
|
|
13
|
-
const longTitle =
|
|
14
|
-
"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
|
|
15
|
-
|
|
16
|
-
const hasFocusableChildren = useBoolean('Has focusable children', false)
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<CardWrapper pattern="halftone" tone="transparent">
|
|
20
|
-
<Card
|
|
21
|
-
display="flex"
|
|
22
|
-
flexDirection="column"
|
|
23
|
-
overflow="hidden"
|
|
24
|
-
radius={5}
|
|
25
|
-
shadow={2}
|
|
26
|
-
style={{minHeight: 300}}
|
|
27
|
-
>
|
|
28
|
-
<TabList autoActivate={autoActivate} flex="none" padding={3} shadow={1}>
|
|
29
|
-
<Tab
|
|
30
|
-
aria-controls="example-panel-foo"
|
|
31
|
-
id="example-tab-foo"
|
|
32
|
-
label="Foo"
|
|
33
|
-
selected={tab === 'foo'}
|
|
34
|
-
onActivate={() => setTab('foo')}
|
|
35
|
-
/>
|
|
36
|
-
<Tab
|
|
37
|
-
aria-controls="example-panel-bar"
|
|
38
|
-
id="example-tab-bar"
|
|
39
|
-
label="Bar"
|
|
40
|
-
selected={tab === 'bar'}
|
|
41
|
-
onActivate={() => setTab('bar')}
|
|
42
|
-
/>
|
|
43
|
-
<Tab
|
|
44
|
-
aria-controls="example-panel-baz"
|
|
45
|
-
id="example-tab-baz"
|
|
46
|
-
label={useLongTitle ? longTitle : 'Baz'}
|
|
47
|
-
selected={tab === 'baz'}
|
|
48
|
-
onActivate={() => setTab('baz')}
|
|
49
|
-
/>
|
|
50
|
-
</TabList>
|
|
51
|
-
|
|
52
|
-
<TabPanel
|
|
53
|
-
aria-labelledby="example-panel-foo"
|
|
54
|
-
display="flex"
|
|
55
|
-
flex={1}
|
|
56
|
-
flexDirection="column"
|
|
57
|
-
gap={4}
|
|
58
|
-
hidden={tab !== 'foo'}
|
|
59
|
-
id="example-panel-foo"
|
|
60
|
-
padding={4}
|
|
61
|
-
style={{
|
|
62
|
-
borderBottomLeftRadius: 'inherit',
|
|
63
|
-
borderBottomRightRadius: 'inherit',
|
|
64
|
-
// @ts-expect-error - `cornerShape` is not yet fully supported in CSS
|
|
65
|
-
cornerShape: 'inherit',
|
|
66
|
-
}}
|
|
67
|
-
>
|
|
68
|
-
<Text size={1}>
|
|
69
|
-
The <strong>Foo</strong> tab panel
|
|
70
|
-
</Text>
|
|
71
|
-
|
|
72
|
-
{hasFocusableChildren && (
|
|
73
|
-
<Box>
|
|
74
|
-
<Button mode="ghost" text="Focusable child" />
|
|
75
|
-
</Box>
|
|
76
|
-
)}
|
|
77
|
-
</TabPanel>
|
|
78
|
-
|
|
79
|
-
<TabPanel
|
|
80
|
-
aria-labelledby="example-panel-bar"
|
|
81
|
-
display="flex"
|
|
82
|
-
flex={1}
|
|
83
|
-
flexDirection="column"
|
|
84
|
-
gap={4}
|
|
85
|
-
hidden={tab !== 'bar'}
|
|
86
|
-
id="example-panel-bar"
|
|
87
|
-
padding={4}
|
|
88
|
-
style={{
|
|
89
|
-
borderBottomLeftRadius: 'inherit',
|
|
90
|
-
borderBottomRightRadius: 'inherit',
|
|
91
|
-
// @ts-expect-error - `cornerShape` is not yet fully supported in CSS
|
|
92
|
-
cornerShape: 'inherit',
|
|
93
|
-
}}
|
|
94
|
-
>
|
|
95
|
-
<Text size={1}>
|
|
96
|
-
The <strong>Bar</strong> tab panel
|
|
97
|
-
</Text>
|
|
98
|
-
|
|
99
|
-
{hasFocusableChildren && (
|
|
100
|
-
<Box>
|
|
101
|
-
<Button mode="ghost" text="Focusable child" />
|
|
102
|
-
</Box>
|
|
103
|
-
)}
|
|
104
|
-
</TabPanel>
|
|
105
|
-
|
|
106
|
-
<TabPanel
|
|
107
|
-
aria-labelledby="example-panel-baz"
|
|
108
|
-
display="flex"
|
|
109
|
-
flex={1}
|
|
110
|
-
flexDirection="column"
|
|
111
|
-
gap={4}
|
|
112
|
-
hidden={tab !== 'baz'}
|
|
113
|
-
id="example-panel-baz"
|
|
114
|
-
padding={4}
|
|
115
|
-
style={{
|
|
116
|
-
borderBottomLeftRadius: 'inherit',
|
|
117
|
-
borderBottomRightRadius: 'inherit',
|
|
118
|
-
// @ts-expect-error - `cornerShape` is not yet fully supported in CSS
|
|
119
|
-
cornerShape: 'inherit',
|
|
120
|
-
}}
|
|
121
|
-
>
|
|
122
|
-
<Text size={1}>
|
|
123
|
-
The <strong>Baz</strong> tab panel
|
|
124
|
-
</Text>
|
|
125
|
-
|
|
126
|
-
{hasFocusableChildren && (
|
|
127
|
-
<Box>
|
|
128
|
-
<Button mode="ghost" text="Focusable child" />
|
|
129
|
-
</Box>
|
|
130
|
-
)}
|
|
131
|
-
</TabPanel>
|
|
132
|
-
</Card>
|
|
133
|
-
</CardWrapper>
|
|
134
|
-
)
|
|
135
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type {WorkshopScope} from '@sanity/ui-workshop'
|
|
2
|
-
import {lazy} from 'react'
|
|
3
|
-
|
|
4
|
-
const scope: WorkshopScope = {
|
|
5
|
-
name: 'components/tab',
|
|
6
|
-
title: 'Tab',
|
|
7
|
-
stories: [
|
|
8
|
-
{
|
|
9
|
-
name: 'example',
|
|
10
|
-
title: 'Example',
|
|
11
|
-
component: lazy(() => import('./Example')),
|
|
12
|
-
},
|
|
13
|
-
],
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export default scope
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @beta
|
|
3
|
-
*/
|
|
4
|
-
export interface TabContextListValue {
|
|
5
|
-
version: 0.0
|
|
6
|
-
focusedId: string | undefined
|
|
7
|
-
activeId: string | undefined
|
|
8
|
-
focusTab: (id: string | undefined) => void
|
|
9
|
-
activateTab: (id: string) => void
|
|
10
|
-
registerTab: (id: string, element: HTMLElement, selected: boolean | undefined) => () => void
|
|
11
|
-
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import {describe, expect, it, vi} from 'vitest'
|
|
2
|
-
|
|
3
|
-
import {render} from '$test/utils'
|
|
4
|
-
|
|
5
|
-
import {ToastContext} from './ToastContext'
|
|
6
|
-
import type {ToastContextValue} from './types'
|
|
7
|
-
import {useToast} from './useToast'
|
|
8
|
-
|
|
9
|
-
describe('components/toast', () => {
|
|
10
|
-
describe('useToast', () => {
|
|
11
|
-
it('should get context value', async () => {
|
|
12
|
-
const log = vi.fn()
|
|
13
|
-
|
|
14
|
-
function Debug() {
|
|
15
|
-
const rootToast = useToast()
|
|
16
|
-
|
|
17
|
-
log(rootToast)
|
|
18
|
-
|
|
19
|
-
return <>debug</>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function Root() {
|
|
23
|
-
const value: ToastContextValue = {
|
|
24
|
-
version: 0.0,
|
|
25
|
-
push: () => '',
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<ToastContext value={value}>
|
|
30
|
-
<Debug />
|
|
31
|
-
</ToastContext>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
render(<Root />)
|
|
36
|
-
|
|
37
|
-
expect(log.mock.calls[0][0].version).toBe(0.0)
|
|
38
|
-
expect(typeof log.mock.calls[0][0].push).toBe('function')
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should fail when no context value is provided', async () => {
|
|
42
|
-
const log = vi.fn()
|
|
43
|
-
|
|
44
|
-
function Debug() {
|
|
45
|
-
try {
|
|
46
|
-
useToast()
|
|
47
|
-
} catch (err) {
|
|
48
|
-
log(err)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return null
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function Root() {
|
|
55
|
-
return (
|
|
56
|
-
<ToastContext
|
|
57
|
-
// @ts-expect-error - we want to test the error case
|
|
58
|
-
value={undefined}
|
|
59
|
-
>
|
|
60
|
-
<Debug />
|
|
61
|
-
</ToastContext>
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
render(<Root />)
|
|
66
|
-
|
|
67
|
-
expect(log.mock.calls[0][0].message).toEqual('useToast(): missing context value')
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('should fail when context value is not compatible', async () => {
|
|
71
|
-
const log = vi.fn()
|
|
72
|
-
|
|
73
|
-
function Debug() {
|
|
74
|
-
try {
|
|
75
|
-
useToast()
|
|
76
|
-
} catch (err) {
|
|
77
|
-
log(err)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return null
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function Root() {
|
|
84
|
-
// NOTE: we’re testing this because the context value may be a function in the future
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<ToastContext
|
|
88
|
-
// @ts-expect-error - we want to test the error case
|
|
89
|
-
value={() => ({version: 1})}
|
|
90
|
-
>
|
|
91
|
-
<Debug />
|
|
92
|
-
</ToastContext>
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
render(<Root />)
|
|
97
|
-
|
|
98
|
-
expect(log.mock.calls[0][0].message).toEqual(
|
|
99
|
-
'useToast(): the context value is not compatible',
|
|
100
|
-
)
|
|
101
|
-
})
|
|
102
|
-
})
|
|
103
|
-
})
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import {CloseIcon} from '@sanity/icons'
|
|
2
|
-
import {type RadiusStyleProps, toast} from '@sanity/ui-css'
|
|
3
|
-
import {motion, type Variant, type Variants} from 'motion/react'
|
|
4
|
-
import {type ReactNode} from 'react'
|
|
5
|
-
|
|
6
|
-
import type {ComponentType, Props} from '../../core/types'
|
|
7
|
-
import {usePrefersReducedMotion} from '../../hooks/usePrefersReducedMotion'
|
|
8
|
-
import {Box} from '../../primitives/box/Box'
|
|
9
|
-
import {Button} from '../../primitives/button/Button'
|
|
10
|
-
import {Card} from '../../primitives/card/Card'
|
|
11
|
-
import {Flex} from '../../primitives/flex/Flex'
|
|
12
|
-
import {Stack} from '../../primitives/stack/Stack'
|
|
13
|
-
import {Text} from '../../primitives/text/Text'
|
|
14
|
-
|
|
15
|
-
/** @internal */
|
|
16
|
-
export const DEFAULT_TOAST_ELEMENT = 'li'
|
|
17
|
-
|
|
18
|
-
/** @internal */
|
|
19
|
-
export type ToastOwnProps = RadiusStyleProps & {
|
|
20
|
-
closable?: boolean
|
|
21
|
-
description?: ReactNode
|
|
22
|
-
onClose?: () => void
|
|
23
|
-
title?: ReactNode
|
|
24
|
-
status?: 'error' | 'warning' | 'success' | 'info'
|
|
25
|
-
duration?: number
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** @internal */
|
|
29
|
-
export type ToastElementType = 'li' | ComponentType
|
|
30
|
-
|
|
31
|
-
/** @internal */
|
|
32
|
-
export type ToastProps<E extends ToastElementType = ToastElementType> = Props<ToastOwnProps, E>
|
|
33
|
-
|
|
34
|
-
// Support pattern used by Sanity Studio, that works around the lack of `duration: Infinity` support in older @sanity/ui versions
|
|
35
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value
|
|
36
|
-
const LONG_ENOUGH_BUT_NOT_TOO_LONG = 1000 * 60 * 60 * 24 * 24
|
|
37
|
-
|
|
38
|
-
const ROLES = {
|
|
39
|
-
error: 'alert',
|
|
40
|
-
warning: 'alert',
|
|
41
|
-
success: 'alert',
|
|
42
|
-
info: 'alert',
|
|
43
|
-
} as const
|
|
44
|
-
|
|
45
|
-
const STATUS_CARD_TONE = {
|
|
46
|
-
error: 'critical',
|
|
47
|
-
warning: 'caution',
|
|
48
|
-
success: 'positive',
|
|
49
|
-
info: 'neutral',
|
|
50
|
-
} as const
|
|
51
|
-
|
|
52
|
-
const BUTTON_TONE = {
|
|
53
|
-
error: 'critical',
|
|
54
|
-
warning: 'caution',
|
|
55
|
-
success: 'positive',
|
|
56
|
-
info: 'neutral',
|
|
57
|
-
} as const
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The `Toast` component gives feedback to users when an action has taken place.
|
|
61
|
-
*
|
|
62
|
-
* Toasts can be closed with a close button, or auto-dismiss when the duration expires.
|
|
63
|
-
*
|
|
64
|
-
* @internal
|
|
65
|
-
*/
|
|
66
|
-
export function Toast<E extends ToastElementType = typeof DEFAULT_TOAST_ELEMENT>(
|
|
67
|
-
props: ToastProps<E>,
|
|
68
|
-
): React.JSX.Element {
|
|
69
|
-
const {
|
|
70
|
-
as = DEFAULT_TOAST_ELEMENT,
|
|
71
|
-
closable,
|
|
72
|
-
description,
|
|
73
|
-
duration,
|
|
74
|
-
onClose,
|
|
75
|
-
radius = 3,
|
|
76
|
-
title,
|
|
77
|
-
status,
|
|
78
|
-
...rest
|
|
79
|
-
} = props as ToastProps<typeof DEFAULT_TOAST_ELEMENT>
|
|
80
|
-
|
|
81
|
-
const cardTone = status ? STATUS_CARD_TONE[status] : 'default'
|
|
82
|
-
const buttonTone = status ? BUTTON_TONE[status] : 'default'
|
|
83
|
-
const role = status ? ROLES[status] : 'status'
|
|
84
|
-
|
|
85
|
-
const prefersReducedMotion = usePrefersReducedMotion()
|
|
86
|
-
|
|
87
|
-
const visualDuration: number = prefersReducedMotion ? 0 : 0.26
|
|
88
|
-
const transition = visualDuration
|
|
89
|
-
? {type: 'spring' as const, visualDuration, bounce: 0.25}
|
|
90
|
-
: {duration: 0}
|
|
91
|
-
|
|
92
|
-
const hasDuration = duration && isFinite(duration) && duration < LONG_ENOUGH_BUT_NOT_TOO_LONG
|
|
93
|
-
const initial: ContainerVariants[] = ['hidden', 'initial']
|
|
94
|
-
const animate: ContainerVariants[] = ['visible', 'slideIn']
|
|
95
|
-
const exit: ContainerVariants[] = ['hidden', 'slideOut']
|
|
96
|
-
|
|
97
|
-
return (
|
|
98
|
-
<MotionCard
|
|
99
|
-
as={as}
|
|
100
|
-
className={toast()}
|
|
101
|
-
data-ui="Toast"
|
|
102
|
-
role={role}
|
|
103
|
-
{...rest}
|
|
104
|
-
animate={animate}
|
|
105
|
-
custom={visualDuration}
|
|
106
|
-
data-has-duration={hasDuration ? '' : undefined}
|
|
107
|
-
exit={exit}
|
|
108
|
-
initial={initial}
|
|
109
|
-
layout="position"
|
|
110
|
-
position="relative"
|
|
111
|
-
radius={radius}
|
|
112
|
-
shadow={2}
|
|
113
|
-
tone={cardTone}
|
|
114
|
-
transition={transition}
|
|
115
|
-
variants={container}
|
|
116
|
-
>
|
|
117
|
-
<MotionFlex align="flex-start" transition={transition} variants={content}>
|
|
118
|
-
<Flex flex={1} overflowX="auto" padding={3}>
|
|
119
|
-
<Stack gap={3}>
|
|
120
|
-
{title && (
|
|
121
|
-
<Text size={1} weight="medium">
|
|
122
|
-
{title}
|
|
123
|
-
</Text>
|
|
124
|
-
)}
|
|
125
|
-
{description && (
|
|
126
|
-
<MotionText muted size={1} transition={transition} variants={content}>
|
|
127
|
-
{description}
|
|
128
|
-
</MotionText>
|
|
129
|
-
)}
|
|
130
|
-
</Stack>
|
|
131
|
-
</Flex>
|
|
132
|
-
|
|
133
|
-
{closable && (
|
|
134
|
-
<Box padding={1}>
|
|
135
|
-
<Button
|
|
136
|
-
as="button"
|
|
137
|
-
icon={CloseIcon}
|
|
138
|
-
mode="bleed"
|
|
139
|
-
padding={2}
|
|
140
|
-
style={{verticalAlign: 'top'}}
|
|
141
|
-
tone={buttonTone}
|
|
142
|
-
onClick={onClose}
|
|
143
|
-
/>
|
|
144
|
-
</Box>
|
|
145
|
-
)}
|
|
146
|
-
</MotionFlex>
|
|
147
|
-
</MotionCard>
|
|
148
|
-
)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const container = {
|
|
152
|
-
initial: {y: 32, scale: 0.5, zIndex: 1},
|
|
153
|
-
hidden: {opacity: 0},
|
|
154
|
-
visible: (visualDuration: number) => {
|
|
155
|
-
if (!visualDuration) return {opacity: 1}
|
|
156
|
-
|
|
157
|
-
return {
|
|
158
|
-
opacity: 1,
|
|
159
|
-
transition: {
|
|
160
|
-
when: 'beforeChildren',
|
|
161
|
-
staggerChildren: visualDuration / 3,
|
|
162
|
-
duration: visualDuration / 3,
|
|
163
|
-
},
|
|
164
|
-
}
|
|
165
|
-
},
|
|
166
|
-
slideIn: {
|
|
167
|
-
y: 0,
|
|
168
|
-
scale: 1,
|
|
169
|
-
},
|
|
170
|
-
slideOut: {
|
|
171
|
-
zIndex: 0,
|
|
172
|
-
scale: 0.75,
|
|
173
|
-
},
|
|
174
|
-
} satisfies Variants
|
|
175
|
-
type ContainerVariants = keyof typeof container
|
|
176
|
-
|
|
177
|
-
const content = {
|
|
178
|
-
initial: {
|
|
179
|
-
willChange: 'transform',
|
|
180
|
-
},
|
|
181
|
-
hidden: {
|
|
182
|
-
opacity: 0,
|
|
183
|
-
},
|
|
184
|
-
visible: {
|
|
185
|
-
opacity: 1,
|
|
186
|
-
},
|
|
187
|
-
} satisfies Partial<Record<ContainerVariants, Variant>>
|
|
188
|
-
|
|
189
|
-
const MotionCard = motion.create(Card)
|
|
190
|
-
const MotionFlex = motion.create(Flex)
|
|
191
|
-
const MotionText = motion.create(Text)
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type {Context} from 'react'
|
|
2
|
-
|
|
3
|
-
import {createGlobalScopedContext} from '../../core/lib/createGlobalScopedContext'
|
|
4
|
-
import type {ToastContextValue} from './types'
|
|
5
|
-
|
|
6
|
-
export const ToastContext: Context<ToastContextValue | null> =
|
|
7
|
-
createGlobalScopedContext<ToastContextValue | null>('@sanity/ui/v4/toast', null)
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import {type GapStyleProps, type PaddingStyleProps, toast_layer} from '@sanity/ui-css'
|
|
2
|
-
|
|
3
|
-
import type {ComponentType, Props} from '../../core/types'
|
|
4
|
-
import {Grid} from '../../primitives/grid/Grid'
|
|
5
|
-
import {useLayer} from '../../primitives/layer/useLayer'
|
|
6
|
-
|
|
7
|
-
/** @internal */
|
|
8
|
-
export const DEFAULT_TOAST_LAYER_ELEMENT = 'ul'
|
|
9
|
-
|
|
10
|
-
/** @internal */
|
|
11
|
-
export type ToastLayerOwnProps = GapStyleProps & PaddingStyleProps
|
|
12
|
-
|
|
13
|
-
/** @internal */
|
|
14
|
-
export type ToastLayerElementType = 'ul' | ComponentType
|
|
15
|
-
|
|
16
|
-
/** @internal */
|
|
17
|
-
export type ToastLayerProps<E extends ToastLayerElementType = ToastLayerElementType> = Props<
|
|
18
|
-
ToastLayerOwnProps,
|
|
19
|
-
E
|
|
20
|
-
>
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @internal
|
|
24
|
-
*/
|
|
25
|
-
export function ToastLayer<E extends ToastLayerElementType = typeof DEFAULT_TOAST_LAYER_ELEMENT>(
|
|
26
|
-
props: ToastLayerProps<E>,
|
|
27
|
-
): React.JSX.Element {
|
|
28
|
-
const {
|
|
29
|
-
as = DEFAULT_TOAST_LAYER_ELEMENT,
|
|
30
|
-
children,
|
|
31
|
-
padding = 4,
|
|
32
|
-
paddingX,
|
|
33
|
-
paddingY,
|
|
34
|
-
gap = 3,
|
|
35
|
-
} = props as ToastLayerProps<typeof DEFAULT_TOAST_LAYER_ELEMENT>
|
|
36
|
-
|
|
37
|
-
const {zIndex} = useLayer()
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<Grid
|
|
41
|
-
as={as}
|
|
42
|
-
className={toast_layer()}
|
|
43
|
-
data-ui="ToastProvider"
|
|
44
|
-
gap={gap}
|
|
45
|
-
gridTemplateColumns={1}
|
|
46
|
-
padding={padding}
|
|
47
|
-
paddingX={paddingX}
|
|
48
|
-
paddingY={paddingY}
|
|
49
|
-
style={{zIndex}}
|
|
50
|
-
>
|
|
51
|
-
{children}
|
|
52
|
-
</Grid>
|
|
53
|
-
)
|
|
54
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import type {ResponsiveProp} from '@sanity/ui-css'
|
|
2
|
-
import {AnimatePresence} from 'motion/react'
|
|
3
|
-
import {startTransition, useMemo, useRef, useState} from 'react'
|
|
4
|
-
|
|
5
|
-
import {useMounted} from '../../hooks/useMounted'
|
|
6
|
-
import {LayerProvider} from '../../primitives/layer/LayerProvider'
|
|
7
|
-
import {Toast} from './Toast'
|
|
8
|
-
import {ToastContext} from './ToastContext'
|
|
9
|
-
import {ToastLayer, type ToastLayerProps} from './ToastLayer'
|
|
10
|
-
import {generateToastId} from './toastState'
|
|
11
|
-
import type {ToastContextValue, ToastParams} from './types'
|
|
12
|
-
|
|
13
|
-
type ToastState = {
|
|
14
|
-
dismiss: () => void
|
|
15
|
-
id: string
|
|
16
|
-
params: ToastParams
|
|
17
|
-
}[]
|
|
18
|
-
|
|
19
|
-
/** @public */
|
|
20
|
-
export interface ToastProviderProps extends Omit<ToastLayerProps, 'children'> {
|
|
21
|
-
children?: React.ReactNode
|
|
22
|
-
zOffset?: ResponsiveProp<number>
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** @public */
|
|
26
|
-
export function ToastProvider(props: ToastProviderProps): React.JSX.Element {
|
|
27
|
-
const {children, padding, paddingX, paddingY, gap, zOffset = 1} = props
|
|
28
|
-
const [state, setState] = useState<ToastState>([])
|
|
29
|
-
const mounted = useMounted()
|
|
30
|
-
|
|
31
|
-
const timeoutIdsRef = useRef<Record<string, NodeJS.Timeout | undefined>>({})
|
|
32
|
-
|
|
33
|
-
const value: ToastContextValue = useMemo(() => {
|
|
34
|
-
const push = (params: ToastParams) => {
|
|
35
|
-
const id = params.id ?? generateToastId()
|
|
36
|
-
const duration = params.duration ?? 5000
|
|
37
|
-
|
|
38
|
-
// If the `id` is reused, clear the previous timeout
|
|
39
|
-
const existingTimeoutId = timeoutIdsRef.current[id]
|
|
40
|
-
if (existingTimeoutId) {
|
|
41
|
-
clearTimeout(existingTimeoutId)
|
|
42
|
-
timeoutIdsRef.current[id] = undefined
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
startTransition(() => {
|
|
46
|
-
setState((prevState): ToastState => {
|
|
47
|
-
/**
|
|
48
|
-
* Backwards compatibility for `sanity` patterns workaround a lack of programatically dismissible toasts.
|
|
49
|
-
* It uses a super short duration that closes the toast immediately in previous versions of `@sanity/ui`.
|
|
50
|
-
* We interpret this as a request to dismiss the toast immediately, and remove it from the state right away.
|
|
51
|
-
* Even once we support programatic dismissal we'll need to keep this for backwards compatibility with v2 and v1.
|
|
52
|
-
*/
|
|
53
|
-
if (duration === 0.01) {
|
|
54
|
-
return prevState.filter((toast) => toast.id !== id)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Creates a function to dismiss this specific toast.
|
|
59
|
-
* This function will be passed to the Toast component
|
|
60
|
-
* and called either on close button click or after duration.
|
|
61
|
-
*/
|
|
62
|
-
function dismiss() {
|
|
63
|
-
startTransition(() => {
|
|
64
|
-
if (timeoutId) {
|
|
65
|
-
clearTimeout(timeoutId)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
setState((currentState) => currentState.filter((toast) => toast.id !== id))
|
|
69
|
-
|
|
70
|
-
// Clear the timeout id from the ref to prevent memory leaks
|
|
71
|
-
timeoutIdsRef.current[id] = undefined
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const timeoutId = duration === Infinity ? undefined : setTimeout(dismiss, duration)
|
|
76
|
-
|
|
77
|
-
// Set the timeout id in the ref
|
|
78
|
-
timeoutIdsRef.current[id] = timeoutId
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Create updated state by:
|
|
82
|
-
* 1. Removing any existing toast with the same ID (prevents duplicates)
|
|
83
|
-
* 2. Adding the new toast with its dismiss handler
|
|
84
|
-
* 3. Updates the `updatedAt` timestamp, which resets progress bar count downs.
|
|
85
|
-
*/
|
|
86
|
-
return [
|
|
87
|
-
...prevState.filter((toast) => toast.id !== id),
|
|
88
|
-
{
|
|
89
|
-
dismiss,
|
|
90
|
-
id,
|
|
91
|
-
params: {...params, duration},
|
|
92
|
-
},
|
|
93
|
-
]
|
|
94
|
-
})
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
return id
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return {version: 0.0, push}
|
|
101
|
-
}, [])
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<ToastContext value={value}>
|
|
105
|
-
{children}
|
|
106
|
-
{mounted && (
|
|
107
|
-
<LayerProvider zOffset={zOffset}>
|
|
108
|
-
<ToastLayer gap={gap} padding={padding} paddingX={paddingX} paddingY={paddingY}>
|
|
109
|
-
<AnimatePresence initial={false} mode="popLayout">
|
|
110
|
-
{state.map(({dismiss, id, params}) => (
|
|
111
|
-
<Toast
|
|
112
|
-
key={id}
|
|
113
|
-
closable={params.closable}
|
|
114
|
-
description={params.description}
|
|
115
|
-
duration={params.duration}
|
|
116
|
-
status={params.status}
|
|
117
|
-
title={params.title}
|
|
118
|
-
onClose={dismiss}
|
|
119
|
-
/>
|
|
120
|
-
))}
|
|
121
|
-
</AnimatePresence>
|
|
122
|
-
</ToastLayer>
|
|
123
|
-
</LayerProvider>
|
|
124
|
-
)}
|
|
125
|
-
</ToastContext>
|
|
126
|
-
)
|
|
127
|
-
}
|