UNPKG

@sanity/ui

Version:

The Sanity UI components.

1,008 lines (908 loc) 23.4 kB
import {BaseTheme} from '@sanity/ui/theme' import {DetailedHTMLProps} from 'react' import {FastOmit} from 'styled-components' import {ForwardRefExoticComponent} from 'react' import {HTMLAttributes} from 'react' import {HTMLProps} from 'react' import {IStyledComponentBase} from 'styled-components/dist/types' import {Ref} from 'react' import {RefAttributes} from 'react' import {RootTheme} from '@sanity/ui/theme' import {Theme_v2} from '@sanity/ui/theme' import {ThemeColorButtonModeKey} from '@sanity/ui/theme' import {ThemeColorCardToneKey} from '@sanity/ui/theme' import {ThemeColorSchemeKey} from '@sanity/ui/theme' import {ThemeColorStateToneKey} from '@sanity/ui/theme' import {ThemeFontWeightKey} from '@sanity/ui/theme' /** * The `Box` component is a basic layout wrapper component which provides utility properties * for flex, margins and padding. * * @public */ export declare const Box: ForwardRefExoticComponent< Omit<BoxProps & Omit<HTMLProps<HTMLDivElement>, 'height' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare type BoxDisplay = 'none' | 'block' | 'grid' | 'flex' | 'inline-block' /** * @public */ declare type BoxHeight = 'stretch' | 'fill' /** * @public */ declare type BoxOverflow = 'visible' | 'hidden' | 'auto' /** * @public */ declare interface BoxProps extends ResponsiveFlexItemProps, ResponsiveBoxProps, ResponsiveGridItemProps, ResponsiveMarginProps, ResponsivePaddingProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements forwardedAs?: React.ElementType | keyof React.JSX.IntrinsicElements } /** * @public */ declare type BoxSizing = 'content' | 'border' /** * @public */ export declare const Button: ForwardRefExoticComponent< Omit<ButtonProps & Omit<HTMLProps<HTMLButtonElement>, 'width' | 'as'>, 'ref'> & RefAttributes<HTMLButtonElement> > /** * @public */ declare type ButtonMode = ThemeColorButtonModeKey /** * @public */ declare interface ButtonProps extends ResponsivePaddingProps, ResponsiveRadiusProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements fontSize?: number | number[] mode?: ButtonMode icon?: React.ElementType | React.ReactNode iconRight?: React.ElementType | React.ReactNode justify?: FlexJustify | FlexJustify[] /** * @beta Do not use in production, as this might change. */ loading?: boolean selected?: boolean space?: number | number[] muted?: boolean text?: React.ReactNode textAlign?: ButtonTextAlign textWeight?: ThemeFontWeightKey tone?: ButtonTone type?: 'button' | 'reset' | 'submit' width?: ButtonWidth } /** * @public */ declare type ButtonTextAlign = 'left' | 'right' | 'center' /** * @public */ declare type ButtonTone = ThemeColorStateToneKey /** * @public */ declare type ButtonWidth = 'fill' /** * The `Card` component acts much like a `Box`, but with a background and foreground color. * Components within a `Card` inherit its colors. * * @public */ export declare const Card: ForwardRefExoticComponent< Omit<CardProps & Omit<HTMLProps<HTMLDivElement>, 'height' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare interface CardProps extends BoxProps, ResponsiveBorderProps, ResponsiveRadiusProps, ResponsiveShadowProps { /** * Do not use in production. * @beta */ __unstable_checkered?: boolean /** * Do not use in production. * @beta */ __unstable_focusRing?: boolean muted?: boolean pressed?: boolean scheme?: ThemeColorSchemeKey tone?: CardTone } /** * @public */ declare type CardTone = ThemeColorCardToneKey | 'inherit' /** * @public */ declare type Delay = | number | Partial<{ open: number close: number }> /** * The `Flex` component is a wrapper component for flexible elements (`Box`, `Card` and `Flex`). * * @public */ export declare const Flex: ForwardRefExoticComponent< Omit<FlexProps & Omit<HTMLProps<HTMLDivElement>, 'wrap' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare type FlexAlign = 'flex-start' | 'flex-end' | 'center' | 'baseline' | 'stretch' /** * @public */ declare type FlexDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse' /** * @public */ declare type FlexJustify = | 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly' /** * @public */ declare interface FlexProps extends Omit<BoxProps, 'display'>, ResponsiveFlexProps, ResponsiveFlexItemProps { gap?: number | number[] } /** * @public */ declare type FlexValue = number | 'none' | 'auto' | 'initial' /** * @public */ declare type FlexWrap = 'wrap' | 'wrap-reverse' | 'nowrap' /** * The `Grid` component is for building 2-dimensional layers (based on CSS grid). * * @public */ export declare const Grid: ForwardRefExoticComponent< Omit<GridProps & Omit<HTMLProps<HTMLDivElement>, 'height' | 'as' | 'rows'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare type GridAutoCols = 'auto' | 'min' | 'max' | 'fr' /** * @public */ declare type GridAutoFlow = 'row' | 'column' | 'row dense' | 'column dense' /** * @public */ declare type GridAutoRows = 'auto' | 'min' | 'max' | 'fr' /** * @public */ declare type GridItemColumn = 'auto' | 'full' | number /** * @public */ declare type GridItemColumnEnd = 'auto' | number /** * @public */ declare type GridItemColumnStart = 'auto' | number /** * @public */ declare type GridItemRow = 'auto' | 'full' | number /** * @public */ declare type GridItemRowEnd = 'auto' | number /** * @public */ declare type GridItemRowStart = 'auto' | number /** * @public */ declare interface GridProps extends Omit<BoxProps, 'display'>, ResponsiveGridProps {} /** * Represent hotkeys (a keyboard combination) with semantic `<kbd>` elements. * * @public */ export declare const Hotkeys: ForwardRefExoticComponent< HotkeysProps & Omit<HTMLProps<HTMLElement>, 'size' | 'ref' | 'as'> & RefAttributes<HTMLElement> > /** * @public */ declare interface HotkeysProps { fontSize?: number | number[] padding?: number | number[] radius?: Radius | Radius[] space?: number | number[] keys?: string[] } /** * @public */ declare interface InlineProps extends Omit<BoxProps, 'display'> { /** The spacing between children. */ space?: number | number[] } /** * @internal */ export declare function isHTMLAnchorElement(element: unknown): element is HTMLAnchorElement /** * @internal */ export declare function isHTMLElement(node: unknown): node is HTMLElement /** * @public */ declare interface LayerProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements /** A callback that fires when the layer becomes the top layer when it was not the top layer before. */ onActivate?: (props: {activeElement: HTMLElement | null}) => void zOffset?: number | number[] } /** * @public */ export declare function LayerProvider(props: LayerProviderProps): React.JSX.Element export declare namespace LayerProvider { var displayName: string } /** * @public */ declare interface LayerProviderProps { children?: React.ReactNode zOffset?: number | number[] } /** * The `Menu` component is a building block for application menus. * * @public */ export declare const Menu: ForwardRefExoticComponent< Omit<MenuProps & Omit<HTMLProps<HTMLDivElement>, 'height' | 'tabIndex' | 'role' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ export declare const MenuDivider: IStyledComponentBase< 'web', FastOmit<DetailedHTMLProps<HTMLAttributes<HTMLHRElement>, HTMLHRElement>, never> > & string /** * @public */ export declare function MenuGroup( props: Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'height' | 'popover' | 'ref' | 'tabIndex'> & MenuGroupProps, ): React.JSX.Element export declare namespace MenuGroup { var displayName: string } /** * @public */ declare interface MenuGroupProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements fontSize?: number | number[] icon?: React.ElementType | React.ReactNode menu?: Omit< MenuProps, | 'onClickOutside' | 'onEscape' | 'onItemClick' | 'onKeyDown' | 'onMouseEnter' | 'registerElement' | 'shouldFocus' | 'onBlurCapture' > padding?: number | number[] popover?: Omit<PopoverProps, 'content' | 'open'> radius?: Radius | Radius[] space?: number | number[] text: React.ReactNode tone?: SelectableTone } /** * @public */ export declare const MenuItem: ForwardRefExoticComponent< MenuItemProps & Omit<HTMLProps<HTMLDivElement>, 'selected' | 'height' | 'ref' | 'tabIndex' | 'as'> & RefAttributes<HTMLDivElement> > /** * @public */ export declare interface MenuItemProps extends ResponsivePaddingProps, ResponsiveRadiusProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements fontSize?: number | number[] hotkeys?: string[] icon?: React.ElementType | React.ReactNode iconRight?: React.ElementType | React.ReactNode pressed?: boolean selected?: boolean space?: number | number[] text?: React.ReactNode tone?: SelectableTone } /** * @public */ declare interface MenuProps extends ResponsivePaddingProps { /** * @deprecated Use `shouldFocus="first"` instead. */ 'focusFirst'?: boolean /** * @deprecated Use `shouldFocus="last"` instead. */ 'focusLast'?: boolean 'onClickOutside'?: (event: MouseEvent) => void 'onEscape'?: () => void 'onItemClick'?: () => void 'onItemSelect'?: (index: number) => void 'originElement'?: HTMLElement | null 'registerElement'?: (el: HTMLElement) => () => void 'shouldFocus'?: 'first' | 'last' | null 'space'?: number | number[] 'aria-labelledby'?: string 'onBlurCapture'?: (event: FocusEvent) => void } /** * Placement of floating UI elements. * * @public */ declare type Placement = | 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' /** * The `Popover` component is used to display some content on top of another. * * @public */ export declare const Popover: ForwardRefExoticComponent< Omit< PopoverProps & Omit<HTMLProps<HTMLDivElement>, 'content' | 'width' | 'children' | 'as'>, 'ref' > & RefAttributes<HTMLDivElement> > /** * @beta */ export declare type PopoverMargins = [number, number, number, number] /** @public */ declare interface PopoverProps extends Omit<LayerProps, 'as'>, ResponsiveRadiusProps, ResponsiveShadowProps { /** @beta */ __unstable_margins?: PopoverMargins /** * Whether the popover should animate in and out. * * @beta * @defaultValue false */ animate?: boolean arrow?: boolean /** @deprecated Use `floatingBoundary` and/or `referenceBoundary` instead */ boundaryElement?: HTMLElement | null children?: React.JSX.Element /** * When `true`, prevent overflow within the current boundary: * - by flipping on its side axis * - by resizing /* * Note that: * - setting `preventOverflow` to `true` also prevents overflow on its side axis * - setting `matchReferenceWidth` to `true` also causes the popover to resize * * @defaultValue false */ constrainSize?: boolean content?: React.ReactNode disabled?: boolean fallbackPlacements?: Placement[] floatingBoundary?: HTMLElement | null /** * When `true`, set the maximum width to match the reference element, and also prevent overflow within * the current boundary by resizing. * * Note that setting `constrainSize` to `true` also causes the popover to resize * * @defaultValue false */ matchReferenceWidth?: boolean /** * When true, blocks all pointer interaction with elements beneath the popover until closed. * * @beta * @defaultValue false */ modal?: boolean open?: boolean overflow?: BoxOverflow padding?: number | number[] placement?: Placement /** * When 'flip' (default), the placement is determined from the initial placement and the * fallback placements in order. Whichever fits in the viewport first. * * When 'autoPlacement', the initial placement and all fallback placements are evaluated * and the placement with the most viewport space available. * * Option is only relevant if either `constrainSize` or `preventOverflow` is `true` */ placementStrategy?: 'flip' | 'autoPlacement' /** Whether or not to render the popover in a portal element. */ portal?: boolean | string preventOverflow?: boolean referenceBoundary?: HTMLElement | null /** * When defined, the popover will be positioned relative to this element. * The children of the popover won't be rendered. */ referenceElement?: HTMLElement | null scheme?: ThemeColorSchemeKey tone?: CardTone /** @beta */ updateRef?: Ref<PopoverUpdateCallback | undefined> width?: PopoverWidth | PopoverWidth[] } /** @beta */ declare type PopoverUpdateCallback = () => void /** @public */ declare type PopoverWidth = number | 'auto' /** * @public */ export declare function Portal(props: PortalProps): React.ReactPortal | null export declare namespace Portal { var displayName: string } /** * @public */ declare interface PortalProps { children: React.ReactNode /** * @beta This API might change. DO NOT USE IN PRODUCTION. */ __unstable_name?: string } /** * @public */ export declare function PortalProvider(props: PortalProviderProps): React.JSX.Element export declare namespace PortalProvider { var displayName: string } /** * @public */ declare interface PortalProviderProps { /** * @deprecated Use `<BoundaryElementProvider element={...} />` instead */ boundaryElement?: HTMLElement | null children: React.ReactNode element?: HTMLElement | null /** * @beta */ __unstable_elements?: Record<string, HTMLElement | null | undefined> } /** * @public */ declare type Radius = number | 'full' /** * @public */ declare interface ResponsiveBorderProps { border?: boolean | boolean[] borderTop?: boolean | boolean[] borderRight?: boolean | boolean[] borderBottom?: boolean | boolean[] borderLeft?: boolean | boolean[] } /** * @public */ declare interface ResponsiveBoxProps { display?: BoxDisplay | BoxDisplay[] height?: BoxHeight | BoxHeight[] overflow?: BoxOverflow | BoxOverflow[] sizing?: BoxSizing | BoxSizing[] } /** * @public */ declare interface ResponsiveFlexItemProps { /** Sets the flex CSS attribute. The property is responsive. */ flex?: FlexValue | FlexValue[] } /** * @public */ declare interface ResponsiveFlexProps { align?: FlexAlign | FlexAlign[] direction?: FlexDirection | FlexDirection[] justify?: FlexJustify | FlexJustify[] wrap?: FlexWrap | FlexWrap[] } /** * @public */ declare interface ResponsiveGridItemProps { column?: GridItemColumn | GridItemColumn[] columnStart?: GridItemColumnStart | GridItemColumnStart[] columnEnd?: GridItemColumnEnd | GridItemColumnEnd[] row?: GridItemRow | GridItemRow[] rowStart?: GridItemRowStart | GridItemRowStart[] rowEnd?: GridItemRowEnd | GridItemRowEnd[] } /** * @public */ declare interface ResponsiveGridProps { autoRows?: GridAutoRows | GridAutoRows[] autoCols?: GridAutoCols | GridAutoCols[] autoFlow?: GridAutoFlow | GridAutoFlow[] columns?: number | number[] gap?: number | number[] gapX?: number | number[] gapY?: number | number[] rows?: number | number[] } /** * @public */ declare interface ResponsiveMarginProps { /** Applies margins to all sides. The property is responsive. */ margin?: number | number[] /** Applies margins to the left and right sides. The property is responsive. */ marginX?: number | number[] /** Applies margins to the top and bottom sides. The property is responsive. */ marginY?: number | number[] marginTop?: number | number[] marginRight?: number | number[] marginBottom?: number | number[] marginLeft?: number | number[] } /** * @public */ declare interface ResponsivePaddingProps { padding?: number | number[] paddingX?: number | number[] paddingY?: number | number[] paddingTop?: number | number[] paddingRight?: number | number[] paddingBottom?: number | number[] paddingLeft?: number | number[] } /** * @public */ declare interface ResponsiveRadiusProps { radius?: Radius | Radius[] } /** * @public */ declare interface ResponsiveShadowProps { shadow?: number | number[] } /** * @public */ declare type SelectableTone = ThemeColorStateToneKey /** * Indicate that something is loading for an indeterminate amount of time. * * @public */ export declare const Spinner: ForwardRefExoticComponent< Omit<SpinnerProps & Omit<HTMLProps<HTMLDivElement>, 'size' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare interface SpinnerProps { muted?: boolean size?: number | number[] } /** * The `Stack` component is used to place elements on top of each other. * * @public */ export declare const Stack: ForwardRefExoticComponent< StackProps & Omit<HTMLProps<HTMLDivElement>, 'ref' | 'as'> & RefAttributes<HTMLDivElement> > /** * @public */ declare interface StackProps extends BoxProps { as?: React.ElementType | keyof React.JSX.IntrinsicElements space?: number | number[] } /** * @public * @deprecated Use `buildTheme` from `@sanity/ui/theme` instead. */ export declare const studioTheme: BaseTheme /** * @public */ export declare const Tab: ForwardRefExoticComponent< Omit< TabProps & Omit< HTMLProps<HTMLButtonElement>, 'label' | 'id' | 'type' | 'width' | 'aria-controls' | 'as' >, 'ref' > & RefAttributes<HTMLButtonElement> > /** * @public */ export declare const TabList: ForwardRefExoticComponent< Omit<TabListProps & Omit<HTMLProps<HTMLDivElement>, 'height' | 'as'>, 'ref'> & RefAttributes<unknown> > /** * @public */ declare interface TabListProps extends Omit<InlineProps, 'as' | 'height'> { children: Array<React.JSX.Element | null | undefined | false> } /** * @public */ declare interface TabProps { /** * The `id` of the correlating `TabPanel` component. */ 'aria-controls': string 'id': string 'icon'?: React.ElementType | React.ReactNode 'focused'?: boolean 'fontSize'?: number | number[] 'label'?: React.ReactNode 'padding'?: number | number[] 'selected'?: boolean 'tone'?: ButtonTone } /** * The `Text` component is an agile, themed typographic element. * * @public */ declare const Text_2: ForwardRefExoticComponent< Omit<TextProps & Omit<HTMLProps<HTMLDivElement>, 'size' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > export {Text_2 as Text} /** * @public */ declare type TextAlign = 'left' | 'right' | 'center' | 'justify' | 'initial' /** * Single line text input. * * @public */ export declare const TextInput: ForwardRefExoticComponent< Omit<TextInputProps & Omit<HTMLProps<HTMLInputElement>, 'type' | 'prefix' | 'as'>, 'ref'> & RefAttributes<HTMLInputElement> > /** * @public */ declare type TextInputClearButtonProps = Omit<ButtonProps, 'as'> & Omit<React.HTMLProps<HTMLButtonElement>, 'as' | 'onClick' | 'onMouseDown' | 'ref'> /** * @public */ declare interface TextInputProps { /** * @beta */ __unstable_disableFocusRing?: boolean border?: boolean /** * @beta */ clearButton?: boolean | TextInputClearButtonProps customValidity?: string fontSize?: number | number[] icon?: React.ElementType | React.ReactNode iconRight?: React.ElementType | React.ReactNode /** * @beta */ onClear?: () => void padding?: number | number[] prefix?: React.ReactNode radius?: Radius | Radius[] space?: number | number[] suffix?: React.ReactNode type?: TextInputType weight?: ThemeFontWeightKey } /** * @public */ declare type TextInputType = | 'search' | 'date' | 'datetime-local' | 'email' | 'url' | 'month' | 'number' | 'password' | 'tel' | 'time' | 'text' | 'week' | 'color' /** * @public */ declare interface TextProps { accent?: boolean align?: TextAlign | TextAlign[] as?: React.ElementType | keyof React.JSX.IntrinsicElements /** When `true` the text color will be muted. */ muted?: boolean size?: number | number[] /** * Controls how overflowing text is treated. * Use `textOverflow="ellipsis"` to render text as a single line which is concatenated with a `…` symbol. * @beta */ textOverflow?: 'ellipsis' weight?: ThemeFontWeightKey } /** * @public */ export declare function ThemeProvider(props: ThemeProviderProps): React.JSX.Element export declare namespace ThemeProvider { var displayName: string } /** * @public */ declare interface ThemeProviderProps { children?: React.ReactNode scheme?: ThemeColorSchemeKey theme?: RootTheme tone?: ThemeColorCardToneKey } /** * Tooltips display information when hovering, focusing or tapping. * * @public */ export declare const Tooltip: ForwardRefExoticComponent< Omit<TooltipProps & Omit<HTMLProps<HTMLDivElement>, 'content' | 'children' | 'as'>, 'ref'> & RefAttributes<HTMLDivElement> > /** * @public */ declare interface TooltipProps extends Omit<LayerProps, 'as'> { /** @deprecated Use `fallbackPlacements` instead. */ allowedAutoPlacements?: Placement[] arrow?: boolean boundaryElement?: HTMLElement | null children?: React.JSX.Element content?: React.ReactNode disabled?: boolean fallbackPlacements?: Placement[] padding?: number | number[] placement?: Placement /** Whether or not to render the tooltip in a portal element. */ portal?: boolean | string radius?: number | number[] scheme?: ThemeColorSchemeKey shadow?: number | number[] /** * Adds a delay to open or close the tooltip. * * If only a `number` is passed, it will be used for both opening and closing. * * If an object `{open: number; close:number}` is passed, it can be used to set different delays for each action. * * @public * @defaultValue 0 */ delay?: Delay /** * Whether the tooltip should animate in and out. * * @beta * @defaultValue false */ animate?: boolean } /** * Returns true if a dark color scheme is preferred, false if a light color scheme is preferred or the preference is not known. * * @param getServerSnapshot - Only called during server-side rendering, and hydration if using hydrateRoot. Since the server environment doesn't have access to the DOM, we can't determine the current value of the media query and we assume `(prefers-color-scheme: light)` since it's the most common scheme (https://react.dev/reference/react/useSyncExternalStore#adding-support-for-server-rendering) * * If you persist the detected preference in a cookie or a header then you may implement your own server snapshot to read it. * Chrome supports reading the `prefers-color-scheme` media query from a header if the server response: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-Prefers-Color-Scheme * @example https://gist.github.com/stipsan/13c0cccf8dfc34f4b44bb1b984baf7df * * @public */ export declare function usePrefersDark(getServerSnapshot?: () => boolean): boolean /** * @public */ export declare function useTheme_v2(): Theme_v2 export {}