UNPKG

@floating-ui/react

Version:
1,449 lines (1,294 loc) 48.9 kB
import { AlignedPlacement } from '@floating-ui/react-dom'; import { Alignment } from '@floating-ui/react-dom'; import { arrow } from '@floating-ui/react-dom'; import { ArrowOptions } from '@floating-ui/react-dom'; import { autoPlacement } from '@floating-ui/react-dom'; import { AutoPlacementOptions } from '@floating-ui/react-dom'; import { autoUpdate } from '@floating-ui/react-dom'; import { AutoUpdateOptions } from '@floating-ui/react-dom'; import { Axis } from '@floating-ui/react-dom'; import { Boundary } from '@floating-ui/react-dom'; import { ClientRectObject } from '@floating-ui/react-dom'; import { computePosition } from '@floating-ui/react-dom'; import { ComputePositionConfig } from '@floating-ui/react-dom'; import { ComputePositionReturn } from '@floating-ui/react-dom'; import { Coords } from '@floating-ui/react-dom'; import { Derivable } from '@floating-ui/react-dom'; import { detectOverflow } from '@floating-ui/react-dom'; import { DetectOverflowOptions } from '@floating-ui/react-dom'; import { Dimensions } from '@floating-ui/react-dom'; import { ElementContext } from '@floating-ui/react-dom'; import { ElementRects } from '@floating-ui/react-dom'; import { Elements } from '@floating-ui/react-dom'; import { flip } from '@floating-ui/react-dom'; import { FlipOptions } from '@floating-ui/react-dom'; import { FloatingElement } from '@floating-ui/react-dom'; import { getOverflowAncestors } from '@floating-ui/react-dom'; import { hide } from '@floating-ui/react-dom'; import { HideOptions } from '@floating-ui/react-dom'; import { inline } from '@floating-ui/react-dom'; import { InlineOptions } from '@floating-ui/react-dom'; import { Length } from '@floating-ui/react-dom'; import { limitShift } from '@floating-ui/react-dom'; import { Middleware } from '@floating-ui/react-dom'; import { MiddlewareArguments } from '@floating-ui/react-dom'; import { MiddlewareData } from '@floating-ui/react-dom'; import { MiddlewareReturn } from '@floating-ui/react-dom'; import { MiddlewareState } from '@floating-ui/react-dom'; import { NodeScroll } from '@floating-ui/react-dom'; import { offset } from '@floating-ui/react-dom'; import { OffsetOptions } from '@floating-ui/react-dom'; import { Padding } from '@floating-ui/react-dom'; import { Placement } from '@floating-ui/react-dom'; import { Platform } from '@floating-ui/react-dom'; import { platform } from '@floating-ui/react-dom'; import * as React from 'react'; import { Rect } from '@floating-ui/react-dom'; import { ReferenceElement } from '@floating-ui/react-dom'; import { RootBoundary } from '@floating-ui/react-dom'; import { shift } from '@floating-ui/react-dom'; import { ShiftOptions } from '@floating-ui/react-dom'; import { Side } from '@floating-ui/react-dom'; import { SideObject } from '@floating-ui/react-dom'; import { size } from '@floating-ui/react-dom'; import { SizeOptions } from '@floating-ui/react-dom'; import { Strategy } from '@floating-ui/react-dom'; import type { UseFloatingOptions as UseFloatingOptions_2 } from '@floating-ui/react-dom'; import type { UseFloatingReturn as UseFloatingReturn_2 } from '@floating-ui/react-dom'; import { VirtualElement } from '@floating-ui/react-dom'; declare const ACTIVE_KEY = "active"; export { AlignedPlacement } export { Alignment } declare type AriaRole = 'tooltip' | 'dialog' | 'alertdialog' | 'menu' | 'listbox' | 'grid' | 'tree'; export { arrow } export { ArrowOptions } export { autoPlacement } export { AutoPlacementOptions } export { autoUpdate } export { AutoUpdateOptions } export { Axis } export { Boundary } export { ClientRectObject } declare type ComponentRole = 'select' | 'label' | 'combobox'; /** * Creates a single tab stop whose items are navigated by arrow keys, which * provides list navigation outside of floating element contexts. * * This is useful to enable navigation of a list of items that aren’t part of a * floating element. A menubar is an example of a composite, with each reference * element being an item. * @see https://floating-ui.com/docs/Composite */ export declare const Composite: React.ForwardRefExoticComponent<Omit<React.HTMLProps<HTMLElement> & CompositeProps, "ref"> & React.RefAttributes<HTMLElement>>; /** * @see https://floating-ui.com/docs/Composite */ export declare const CompositeItem: React.ForwardRefExoticComponent<Omit<React.HTMLProps<HTMLElement> & CompositeItemProps, "ref"> & React.RefAttributes<HTMLElement>>; export declare interface CompositeItemProps { /** * Determines the element to render. * @example * ```jsx * <CompositeItem render={<li />} /> * <CompositeItem render={(htmlProps) => <li {...htmlProps} />} /> * ``` */ render?: RenderProp; } export declare interface CompositeProps { /** * Determines the element to render. * @example * ```jsx * <Composite render={<ul />} /> * <Composite render={(htmlProps) => <ul {...htmlProps} />} /> * ``` */ render?: RenderProp; /** * Determines the orientation of the composite. */ orientation?: 'horizontal' | 'vertical' | 'both'; /** * Determines whether focus should loop around when navigating past the first * or last item. */ loop?: boolean; /** * Whether the direction of the composite’s navigation is in RTL layout. */ rtl?: boolean; /** * Determines the number of columns there are in the composite * (i.e. it’s a grid). */ cols?: number; /** * Determines which items are disabled. The `disabled` or `aria-disabled` * attributes are used by default. */ disabledIndices?: number[] | ((index: number) => boolean); /** * Determines which item is active. Used to externally control the active * item. */ activeIndex?: number; /** * Called when the user navigates to a new item. Used to externally control * the active item. */ onNavigate?(index: number): void; /** * Only for `cols > 1`, specify sizes for grid items. * `{ width: 2, height: 2 }` means an item is 2 columns wide and 2 rows tall. */ itemSizes?: Dimensions[]; /** * Only relevant for `cols > 1` and items with different sizes, specify if * the grid is dense (as defined in the CSS spec for grid-auto-flow). */ dense?: boolean; } export { computePosition } export { ComputePositionConfig } export { ComputePositionReturn } export declare interface ContextData { openEvent?: Event; floatingContext?: FloatingContext; /** @deprecated use `onTypingChange` prop in `useTypeahead` */ typing?: boolean; [key: string]: any; } export { Coords } declare type CSSStylesProperty = React.CSSProperties | ((params: { side: Side; placement: Placement; }) => React.CSSProperties); export declare type Delay = number | Partial<{ open: number; close: number; }>; declare type Delay_2 = number | Partial<{ open: number; close: number; }>; export { detectOverflow } export { DetectOverflowOptions } export { Dimensions } declare type Duration = number | { open?: number; close?: number; }; export { ElementContext } export declare interface ElementProps { reference?: React.HTMLProps<Element>; floating?: React.HTMLProps<HTMLElement>; item?: React.HTMLProps<HTMLElement> | ((props: ExtendedUserProps) => React.HTMLProps<HTMLElement>); } export { ElementRects } export { Elements } export declare interface ExtendedElements<RT> { reference: ReferenceType | null; floating: HTMLElement | null; domReference: NarrowedElement<RT> | null; } export declare interface ExtendedRefs<RT> { reference: React.MutableRefObject<ReferenceType | null>; floating: React.MutableRefObject<HTMLElement | null>; domReference: React.MutableRefObject<NarrowedElement<RT> | null>; setReference(node: RT | null): void; setFloating(node: HTMLElement | null): void; setPositionReference(node: ReferenceType | null): void; } declare type ExtendedUserProps = { [ACTIVE_KEY]?: boolean; [SELECTED_KEY]?: boolean; }; export { flip } export { FlipOptions } /** * Renders a pointing arrow triangle. * @see https://floating-ui.com/docs/FloatingArrow */ export declare const FloatingArrow: React.ForwardRefExoticComponent<Omit<FloatingArrowProps, "ref"> & React.RefAttributes<SVGSVGElement>>; export declare interface FloatingArrowProps extends React.ComponentPropsWithRef<'svg'> { /** * The floating context. */ context: Omit<FloatingContext, 'refs'> & { refs: any; }; /** * Width of the arrow. * @default 14 */ width?: number; /** * Height of the arrow. * @default 7 */ height?: number; /** * The corner radius (rounding) of the arrow tip. * @default 0 (sharp) */ tipRadius?: number; /** * Forces a static offset over dynamic positioning under a certain condition. * If the shift() middleware causes the popover to shift, this value will be * ignored. */ staticOffset?: string | number | null; /** * Custom path string. */ d?: string; /** * Stroke (border) color of the arrow. */ stroke?: string; /** * Stroke (border) width of the arrow. */ strokeWidth?: number; } export declare type FloatingContext<RT extends ReferenceType = ReferenceType> = Omit<UseFloatingReturn_2<RT>, 'refs' | 'elements'> & { open: boolean; onOpenChange(open: boolean, event?: Event, reason?: OpenChangeReason): void; events: FloatingEvents; dataRef: React.MutableRefObject<ContextData>; nodeId: string | undefined; floatingId: string | undefined; refs: ExtendedRefs<RT>; elements: ExtendedElements<RT>; }; /** * Provides context for a group of floating elements that should share a * `delay`. * @see https://floating-ui.com/docs/FloatingDelayGroup */ export declare function FloatingDelayGroup(props: FloatingDelayGroupProps): React.JSX.Element; export declare interface FloatingDelayGroupProps { children?: React.ReactNode; /** * The delay to use for the group. */ delay: Delay_2; /** * An optional explicit timeout to use for the group, which represents when * grouping logic will no longer be active after the close delay completes. * This is useful if you want grouping to “last” longer than the close delay, * for example if there is no close delay at all. */ timeoutMs?: number; } export { FloatingElement } export declare interface FloatingEvents { emit<T extends string>(event: T, data?: any): void; on(event: string, handler: (data: any) => void): void; off(event: string, handler: (data: any) => void): void; } /** * Provides focus management for the floating element. * @see https://floating-ui.com/docs/FloatingFocusManager */ export declare function FloatingFocusManager(props: FloatingFocusManagerProps): React.JSX.Element; export declare interface FloatingFocusManagerProps { children: React.JSX.Element; /** * The floating context returned from `useFloatingRootContext`. */ context: FloatingRootContext; /** * Whether or not the focus manager should be disabled. Useful to delay focus * management until after a transition completes or some other conditional * state. * @default false */ disabled?: boolean; /** * The order in which focus cycles. * @default ['content'] */ order?: Array<'reference' | 'floating' | 'content'>; /** * Which element to initially focus. Can be either a number (tabbable index as * specified by the `order`) or a ref. * @default 0 */ initialFocus?: number | React.MutableRefObject<HTMLElement | null>; /** * Determines if the focus guards are rendered. If not, focus can escape into * the address bar/console/browser UI, like in native dialogs. * @default true */ guards?: boolean; /** * Determines if focus should be returned to the reference element once the * floating element closes/unmounts (or if that is not available, the * previously focused element). This prop is ignored if the floating element * lost focus. * It can be also set to a ref to explicitly control the element to return focus to. * @default true */ returnFocus?: boolean | React.MutableRefObject<HTMLElement | null>; /** * Determines if focus should be restored to the nearest tabbable element if * focus inside the floating element is lost (such as due to the removal of * the currently focused element from the DOM). * @default false */ restoreFocus?: boolean; /** * Determines if focus is “modal”, meaning focus is fully trapped inside the * floating element and outside content cannot be accessed. This includes * screen reader virtual cursors. * @default true */ modal?: boolean; /** * If your focus management is modal and there is no explicit close button * available, you can use this prop to render a visually-hidden dismiss * button at the start and end of the floating element. This allows * touch-based screen readers to escape the floating element due to lack of * an `esc` key. * @default undefined */ visuallyHiddenDismiss?: boolean | string; /** * Determines whether `focusout` event listeners that control whether the * floating element should be closed if the focus moves outside of it are * attached to the reference and floating elements. This affects non-modal * focus management. * @default true */ closeOnFocusOut?: boolean; /** * Determines whether outside elements are `inert` when `modal` is enabled. * This enables pointer modality without a backdrop. * @default false */ outsideElementsInert?: boolean; /** * Returns a list of elements that should be considered part of the * floating element. */ getInsideElements?: () => Element[]; } /** * Provides context for a list of items within the floating element. * @see https://floating-ui.com/docs/FloatingList */ export declare function FloatingList(props: FloatingListProps): React.JSX.Element; declare interface FloatingListProps { children: React.ReactNode; /** * A ref to the list of HTML elements, ordered by their index. * `useListNavigation`'s `listRef` prop. */ elementsRef: React.MutableRefObject<Array<HTMLElement | null>>; /** * A ref to the list of element labels, ordered by their index. * `useTypeahead`'s `listRef` prop. */ labelsRef?: React.MutableRefObject<Array<string | null>>; } /** * Provides parent node context for nested floating elements. * @see https://floating-ui.com/docs/FloatingTree */ export declare function FloatingNode(props: FloatingNodeProps): React.JSX.Element; export declare interface FloatingNodeProps { children?: React.ReactNode; id: string | undefined; } export declare interface FloatingNodeType<RT extends ReferenceType = ReferenceType> { id: string | undefined; parentId: string | null; context?: FloatingContext<RT>; } /** * Provides base styling for a fixed overlay element to dim content or block * pointer events behind a floating element. * It's a regular `<div>`, so it can be styled via any CSS solution you prefer. * @see https://floating-ui.com/docs/FloatingOverlay */ export declare const FloatingOverlay: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & FloatingOverlayProps & React.RefAttributes<HTMLDivElement>>; export declare interface FloatingOverlayProps { /** * Whether the overlay should lock scrolling on the document body. * @default false */ lockScroll?: boolean; } /** * Portals the floating element into a given container element — by default, * outside of the app root and into the body. * This is necessary to ensure the floating element can appear outside any * potential parent containers that cause clipping (such as `overflow: hidden`), * while retaining its location in the React tree. * @see https://floating-ui.com/docs/FloatingPortal */ export declare function FloatingPortal(props: FloatingPortalProps): React.JSX.Element; export declare interface FloatingPortalProps { children?: React.ReactNode; /** * Optionally selects the node with the id if it exists, or create it and * append it to the specified `root` (by default `document.body`). */ id?: string; /** * Specifies the root node the portal container will be appended to. */ root?: HTMLElement | null | React.MutableRefObject<HTMLElement | null>; /** * When using non-modal focus management using `FloatingFocusManager`, this * will preserve the tab order context based on the React tree instead of the * DOM tree. */ preserveTabOrder?: boolean; } export declare interface FloatingRootContext<RT extends ReferenceType = ReferenceType> { dataRef: React.MutableRefObject<ContextData>; open: boolean; onOpenChange: (open: boolean, event?: Event, reason?: OpenChangeReason) => void; elements: { domReference: Element | null; reference: RT | null; floating: HTMLElement | null; }; events: FloatingEvents; floatingId: string | undefined; refs: { setPositionReference(node: ReferenceType | null): void; }; } /** * Provides context for nested floating elements when they are not children of * each other on the DOM. * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for: * - The `bubbles` option in the `useDismiss()` Hook * - Nested virtual list navigation * - Nested floating elements that each open on hover * - Custom communication between parent and child floating elements * @see https://floating-ui.com/docs/FloatingTree */ export declare function FloatingTree(props: FloatingTreeProps): React.JSX.Element; export declare interface FloatingTreeProps { children?: React.ReactNode; } export declare interface FloatingTreeType<RT extends ReferenceType = ReferenceType> { nodesRef: React.MutableRefObject<Array<FloatingNodeType<RT>>>; events: FloatingEvents; addNode(node: FloatingNodeType): void; removeNode(node: FloatingNodeType): void; } export { getOverflowAncestors } declare interface GroupContext extends GroupState { setCurrentId: React.Dispatch<React.SetStateAction<any>>; setState: React.Dispatch<Partial<GroupState>>; } declare interface GroupState { delay: Delay_2; initialDelay: Delay_2; currentId: any; timeoutMs: number; isInstantPhase: boolean; } export declare interface HandleClose { (context: HandleCloseContext): (event: MouseEvent) => void; __options?: SafePolygonOptions; } export declare interface HandleCloseContext extends FloatingContext { onClose: () => void; tree?: FloatingTreeType | null; leave?: boolean; } export { hide } export { HideOptions } export { inline } export { InlineOptions } /** * Positions the floating element such that an inner element inside of it is * anchored to the reference element. * @see https://floating-ui.com/docs/inner * @deprecated */ export declare const inner: (props: InnerProps | Derivable<InnerProps>) => Middleware; export declare interface InnerProps extends DetectOverflowOptions { /** * A ref which contains an array of HTML elements. * @default empty list */ listRef: React.MutableRefObject<Array<HTMLElement | null>>; /** * The index of the active (focused or highlighted) item in the list. * @default 0 */ index: number; /** * Callback invoked when the fallback state changes. */ onFallbackChange?: null | ((fallback: boolean) => void); /** * The offset to apply to the floating element. * @default 0 */ offset?: number; /** * A ref which contains the overflow of the floating element. */ overflowRef?: React.MutableRefObject<SideObject | null>; /** * An optional ref containing an HTMLElement. This may be used as the * scrolling container instead of the floating element — for instance, * to position inner elements as direct children without being interfered by * scrolling layout. */ scrollRef?: React.MutableRefObject<HTMLElement | null>; /** * The minimum number of items that should be visible in the list. * @default 4 */ minItemsVisible?: number; /** * The threshold for the reference element's overflow in pixels. * @default 0 */ referenceOverflowThreshold?: number; } export { Length } export { limitShift } export { Middleware } export { MiddlewareArguments } export { MiddlewareData } export { MiddlewareReturn } export { MiddlewareState } export declare type NarrowedElement<T> = T extends Element ? T : Element; /** * Experimental next version of `FloatingDelayGroup` to become the default * in the future. This component is not yet stable. * Provides context for a group of floating elements that should share a * `delay`. Unlike `FloatingDelayGroup`, `useNextDelayGroup` with this * component does not cause a re-render of unrelated consumers of the * context when the delay changes. * @see https://floating-ui.com/docs/FloatingDelayGroup */ export declare function NextFloatingDelayGroup(props: NextFloatingDelayGroupProps): React.JSX.Element; export declare interface NextFloatingDelayGroupProps { children?: React.ReactNode; /** * The delay to use for the group when it's not in the instant phase. */ delay: Delay; /** * An optional explicit timeout to use for the group, which represents when * grouping logic will no longer be active after the close delay completes. * This is useful if you want grouping to “last” longer than the close delay, * for example if there is no close delay at all. */ timeoutMs?: number; } export { NodeScroll } export { offset } export { OffsetOptions } export declare type OpenChangeReason = 'outside-press' | 'escape-key' | 'ancestor-scroll' | 'reference-press' | 'click' | 'hover' | 'focus' | 'focus-out' | 'list-navigation' | 'safe-polygon'; export { Padding } export { Placement } export { Platform } export { platform } declare type Prettify<T> = { [K in keyof T]: T[K]; } & {}; export { Rect } export { ReferenceElement } export declare type ReferenceType = Element | VirtualElement; declare type RenderProp = React.JSX.Element | ((props: React.HTMLAttributes<HTMLElement>) => React.JSX.Element); export { RootBoundary } /** * Generates a safe polygon area that the user can traverse without closing the * floating element once leaving the reference element. * @see https://floating-ui.com/docs/useHover#safepolygon */ export declare function safePolygon(options?: SafePolygonOptions): HandleClose; export declare interface SafePolygonOptions { buffer?: number; blockPointerEvents?: boolean; requireIntent?: boolean; } declare const SELECTED_KEY = "selected"; export { shift } export { ShiftOptions } export { Side } export { SideObject } export { size } export { SizeOptions } export { Strategy } declare type TransitionStatus = 'unmounted' | 'initial' | 'open' | 'close'; /** * Opens or closes the floating element when clicking the reference element. * @see https://floating-ui.com/docs/useClick */ export declare function useClick(context: FloatingRootContext, props?: UseClickProps): ElementProps; export declare interface UseClickProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * The type of event to use to determine a “click” with mouse input. * Keyboard clicks work as normal. * @default 'click' */ event?: 'click' | 'mousedown'; /** * Whether to toggle the open state with repeated clicks. * @default true */ toggle?: boolean; /** * Whether to ignore the logic for mouse input (for example, if `useHover()` * is also being used). * @default false */ ignoreMouse?: boolean; /** * Whether to add keyboard handlers (Enter and Space key functionality) for * non-button elements (to open/close the floating element via keyboard * “click”). * @default true */ keyboardHandlers?: boolean; /** * If already open from another event such as the `useHover()` Hook, * determines whether to keep the floating element open when clicking the * reference element for the first time. * @default true */ stickIfOpen?: boolean; } /** * Positions the floating element relative to a client point (in the viewport), * such as the mouse position. By default, it follows the mouse cursor. * @see https://floating-ui.com/docs/useClientPoint */ export declare function useClientPoint(context: FloatingRootContext, props?: UseClientPointProps): ElementProps; export declare interface UseClientPointProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * Whether to restrict the client point to an axis and use the reference * element (if it exists) as the other axis. This can be useful if the * floating element is also interactive. * @default 'both' */ axis?: 'x' | 'y' | 'both'; /** * An explicitly defined `x` client coordinate. * @default null */ x?: number | null; /** * An explicitly defined `y` client coordinate. * @default null */ y?: number | null; } /** * Enables grouping when called inside a component that's a child of a * `FloatingDelayGroup`. * @see https://floating-ui.com/docs/FloatingDelayGroup */ export declare function useDelayGroup(context: FloatingRootContext, options?: UseGroupOptions): GroupContext; /** * @deprecated * Use the return value of `useDelayGroup()` instead. */ export declare const useDelayGroupContext: () => GroupContext; /** * Closes the floating element when a dismissal is requested — by default, when * the user presses the `escape` key or outside of the floating element. * @see https://floating-ui.com/docs/useDismiss */ export declare function useDismiss(context: FloatingRootContext, props?: UseDismissProps): ElementProps; export declare interface UseDismissProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * Whether to dismiss the floating element upon pressing the `esc` key. * @default true */ escapeKey?: boolean; /** * Whether to dismiss the floating element upon pressing the reference * element. You likely want to ensure the `move` option in the `useHover()` * Hook has been disabled when this is in use. * @default false */ referencePress?: boolean; /** * The type of event to use to determine a “press”. * - `pointerdown` is eager on both mouse + touch input. * - `mousedown` is eager on mouse input, but lazy on touch input. * - `click` is lazy on both mouse + touch input. * @default 'pointerdown' */ referencePressEvent?: 'pointerdown' | 'mousedown' | 'click'; /** * Whether to dismiss the floating element upon pressing outside of the * floating element. * If you have another element, like a toast, that is rendered outside the * floating element’s React tree and don’t want the floating element to close * when pressing it, you can guard the check like so: * ```jsx * useDismiss(context, { * outsidePress: (event) => !event.target.closest('.toast'), * }); * ``` * @default true */ outsidePress?: boolean | ((event: MouseEvent) => boolean); /** * The type of event to use to determine an outside “press”. * - `pointerdown` is eager on both mouse + touch input. * - `mousedown` is eager on mouse input, but lazy on touch input. * - `click` is lazy on both mouse + touch input. * @default 'pointerdown' */ outsidePressEvent?: 'pointerdown' | 'mousedown' | 'click'; /** * Whether to dismiss the floating element upon scrolling an overflow * ancestor. * @default false */ ancestorScroll?: boolean; /** * Determines whether event listeners bubble upwards through a tree of * floating elements. */ bubbles?: boolean | { escapeKey?: boolean; outsidePress?: boolean; }; /** * Determines whether to use capture phase event listeners. */ capture?: boolean | { escapeKey?: boolean; outsidePress?: boolean; }; } /** * Provides data to position a floating element and context to add interactions. * @see https://floating-ui.com/docs/useFloating */ export declare function useFloating<RT extends ReferenceType = ReferenceType>(options?: UseFloatingOptions): UseFloatingReturn<RT>; export declare type UseFloatingData = Prettify<UseFloatingReturn>; /** * Registers a node into the `FloatingTree`, returning its id. * @see https://floating-ui.com/docs/FloatingTree */ export declare function useFloatingNodeId(customParentId?: string): string | undefined; export declare interface UseFloatingOptions<RT extends ReferenceType = ReferenceType> extends Omit<UseFloatingOptions_2<RT>, 'elements'> { rootContext?: FloatingRootContext<RT>; /** * Object of external elements as an alternative to the `refs` object setters. */ elements?: { /** * Externally passed reference element. Store in state. */ reference?: Element | null; /** * Externally passed floating element. Store in state. */ floating?: HTMLElement | null; }; /** * An event callback that is invoked when the floating element is opened or * closed. */ onOpenChange?(open: boolean, event?: Event, reason?: OpenChangeReason): void; /** * Unique node id when using `FloatingTree`. */ nodeId?: string; } /** * Returns the parent node id for nested floating elements, if available. * Returns `null` for top-level floating elements. */ export declare const useFloatingParentNodeId: () => string | null; /** * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode */ export declare function useFloatingPortalNode(props?: UseFloatingPortalNodeProps): HTMLElement | null; export declare interface UseFloatingPortalNodeProps { id?: string; root?: HTMLElement | null | React.MutableRefObject<HTMLElement | null>; } export declare type UseFloatingReturn<RT extends ReferenceType = ReferenceType> = Prettify<UseFloatingReturn_2 & { /** * `FloatingContext` */ context: Prettify<FloatingContext<RT>>; /** * Object containing the reference and floating refs and reactive setters. */ refs: ExtendedRefs<RT>; elements: ExtendedElements<RT>; }>; export declare function useFloatingRootContext(options: UseFloatingRootContextOptions): FloatingRootContext; export declare interface UseFloatingRootContextOptions { open?: boolean; onOpenChange?: (open: boolean, event?: Event, reason?: OpenChangeReason) => void; elements: { reference: Element | null; floating: HTMLElement | null; }; } /** * Returns the nearest floating tree context, if available. */ export declare const useFloatingTree: <RT extends ReferenceType = ReferenceType>() => FloatingTreeType<RT> | null; /** * Opens the floating element while the reference element has focus, like CSS * `:focus`. * @see https://floating-ui.com/docs/useFocus */ export declare function useFocus(context: FloatingRootContext, props?: UseFocusProps): ElementProps; export declare interface UseFocusProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * Whether the open state only changes if the focus event is considered * visible (`:focus-visible` CSS selector). * @default true */ visibleOnly?: boolean; } declare interface UseGroupOptions { /** * Whether delay grouping should be enabled. * @default true */ enabled?: boolean; id?: any; } /** * Opens the floating element while hovering over the reference element, like * CSS `:hover`. * @see https://floating-ui.com/docs/useHover */ export declare function useHover(context: FloatingRootContext, props?: UseHoverProps): ElementProps; export declare interface UseHoverProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * Accepts an event handler that runs on `mousemove` to control when the * floating element closes once the cursor leaves the reference element. * @default null */ handleClose?: HandleClose | null; /** * Waits until the user’s cursor is at “rest” over the reference element * before changing the `open` state. * @default 0 */ restMs?: number | (() => number); /** * Waits for the specified time when the event listener runs before changing * the `open` state. * @default 0 */ delay?: Delay | (() => Delay); /** * Whether the logic only runs for mouse input, ignoring touch input. * Note: due to a bug with Linux Chrome, "pen" inputs are considered "mouse". * @default false */ mouseOnly?: boolean; /** * Whether moving the cursor over the floating element will open it, without a * regular hover event required. * @default true */ move?: boolean; } /** * Uses React 18's built-in `useId()` when available, or falls back to a * slightly less performant (requiring a double render) implementation for * earlier React versions. * @see https://floating-ui.com/docs/react-utils#useid */ export declare const useId: () => string | undefined; /** * Changes the `inner` middleware's `offset` upon a `wheel` event to * expand the floating element's height, revealing more list items. * @see https://floating-ui.com/docs/inner * @deprecated */ export declare function useInnerOffset(context: FloatingRootContext, props: UseInnerOffsetProps): ElementProps; export declare interface UseInnerOffsetProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * A ref which contains the overflow of the floating element. */ overflowRef: React.MutableRefObject<SideObject | null>; /** * An optional ref containing an HTMLElement. This may be used as the * scrolling container instead of the floating element — for instance, * to position inner elements as direct children without being interfered by * scrolling layout. */ scrollRef?: React.MutableRefObject<HTMLElement | null>; /** * Callback invoked when the offset changes. */ onChange: (offset: number | ((offset: number) => number)) => void; } /** * Merges an array of interaction hooks' props into prop getters, allowing * event handler functions to be composed together without overwriting one * another. * @see https://floating-ui.com/docs/useInteractions */ export declare function useInteractions(propsList?: Array<ElementProps | void>): UseInteractionsReturn; export declare interface UseInteractionsReturn { getReferenceProps: (userProps?: React.HTMLProps<Element>) => Record<string, unknown>; getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>; getItemProps: (userProps?: Omit<React.HTMLProps<HTMLElement>, 'selected' | 'active'> & ExtendedUserProps) => Record<string, unknown>; } /** * Used to register a list item and its index (DOM position) in the * `FloatingList`. * @see https://floating-ui.com/docs/FloatingList#uselistitem */ export declare function useListItem(props?: UseListItemProps): { ref: (node: HTMLElement | null) => void; index: number; }; declare interface UseListItemProps { label?: string | null; } /** * Adds arrow key-based navigation of a list of items, either using real DOM * focus or virtual focus. * @see https://floating-ui.com/docs/useListNavigation */ export declare function useListNavigation(context: FloatingRootContext, props: UseListNavigationProps): ElementProps; export declare interface UseListNavigationProps { /** * A ref that holds an array of list items. * @default empty list */ listRef: React.MutableRefObject<Array<HTMLElement | null>>; /** * The index of the currently active (focused or highlighted) item, which may * or may not be selected. * @default null */ activeIndex: number | null; /** * A callback that is called when the user navigates to a new active item, * passed in a new `activeIndex`. */ onNavigate?: (activeIndex: number | null) => void; /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * The currently selected item index, which may or may not be active. * @default null */ selectedIndex?: number | null; /** * Whether to focus the item upon opening the floating element. 'auto' infers * what to do based on the input type (keyboard vs. pointer), while a boolean * value will force the value. * @default 'auto' */ focusItemOnOpen?: boolean | 'auto'; /** * Whether hovering an item synchronizes the focus. * @default true */ focusItemOnHover?: boolean; /** * Whether pressing an arrow key on the navigation’s main axis opens the * floating element. * @default true */ openOnArrowKeyDown?: boolean; /** * By default elements with either a `disabled` or `aria-disabled` attribute * are skipped in the list navigation — however, this requires the items to * be rendered. * This prop allows you to manually specify indices which should be disabled, * overriding the default logic. * For Windows-style select menus, where the menu does not open when * navigating via arrow keys, specify an empty array. * @default undefined */ disabledIndices?: Array<number> | ((index: number) => boolean); /** * Determines whether focus can escape the list, such that nothing is selected * after navigating beyond the boundary of the list. In some * autocomplete/combobox components, this may be desired, as screen * readers will return to the input. * `loop` must be `true`. * @default false */ allowEscape?: boolean; /** * Determines whether focus should loop around when navigating past the first * or last item. * @default false */ loop?: boolean; /** * If the list is nested within another one (e.g. a nested submenu), the * navigation semantics change. * @default false */ nested?: boolean; /** * Allows to specify the orientation of the parent list, which is used to * determine the direction of the navigation. * This is useful when list navigation is used within a Composite, * as the hook can't determine the orientation of the parent list automatically. */ parentOrientation?: UseListNavigationProps['orientation']; /** * Whether the direction of the floating element’s navigation is in RTL * layout. * @default false */ rtl?: boolean; /** * Whether the focus is virtual (using `aria-activedescendant`). * Use this if you need focus to remain on the reference element * (such as an input), but allow arrow keys to navigate list items. * This is common in autocomplete listbox components. * Your virtually-focused list items must have a unique `id` set on them. * If you’re using a component role with the `useRole()` Hook, then an `id` is * generated automatically. * @default false */ virtual?: boolean; /** * The orientation in which navigation occurs. * @default 'vertical' */ orientation?: 'vertical' | 'horizontal' | 'both'; /** * Specifies how many columns the list has (i.e., it’s a grid). Use an * orientation of 'horizontal' (e.g. for an emoji picker/date picker, where * pressing ArrowRight or ArrowLeft can change rows), or 'both' (where the * current row cannot be escaped with ArrowRight or ArrowLeft, only ArrowUp * and ArrowDown). * @default 1 */ cols?: number; /** * Whether to scroll the active item into view when navigating. The default * value uses nearest options. */ scrollItemIntoView?: boolean | ScrollIntoViewOptions; /** * When using virtual focus management, this holds a ref to the * virtually-focused item. This allows nested virtual navigation to be * enabled, and lets you know when a nested element is virtually focused from * the root reference handling the events. Requires `FloatingTree` to be * setup. */ virtualItemRef?: React.MutableRefObject<HTMLElement | null>; /** * Only for `cols > 1`, specify sizes for grid items. * `{ width: 2, height: 2 }` means an item is 2 columns wide and 2 rows tall. */ itemSizes?: Dimensions[]; /** * Only relevant for `cols > 1` and items with different sizes, specify if * the grid is dense (as defined in the CSS spec for `grid-auto-flow`). * @default false */ dense?: boolean; } /** * Merges an array of refs into a single memoized callback ref or `null`. * @see https://floating-ui.com/docs/react-utils#usemergerefs */ export declare function useMergeRefs<Instance>(refs: Array<React.Ref<Instance> | undefined>): null | React.RefCallback<Instance>; /** * Enables grouping when called inside a component that's a child of a * `NextFloatingDelayGroup`. * @see https://floating-ui.com/docs/FloatingDelayGroup */ export declare function useNextDelayGroup(context: FloatingRootContext, options?: UseNextDelayGroupOptions): UseNextDelayGroupReturn; declare interface UseNextDelayGroupOptions { /** * Whether delay grouping should be enabled. * @default true */ enabled?: boolean; } declare interface UseNextDelayGroupReturn { /** * The delay reference object. */ delayRef: React.MutableRefObject<Delay>; /** * Whether animations should be removed. */ isInstantPhase: boolean; /** * Whether a `<NextFloatingDelayGroup>` provider is present. */ hasProvider: boolean; } /** * Adds base screen reader props to the reference and floating elements for a * given floating element `role`. * @see https://floating-ui.com/docs/useRole */ export declare function useRole(context: FloatingRootContext, props?: UseRoleProps): ElementProps; export declare interface UseRoleProps { /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * The role of the floating element. * @default 'dialog' */ role?: AriaRole | ComponentRole; } /** * Provides a status string to apply CSS transitions to a floating element, * correctly handling placement-aware transitions. * @see https://floating-ui.com/docs/useTransition#usetransitionstatus */ export declare function useTransitionStatus(context: FloatingContext, props?: UseTransitionStatusProps): { isMounted: boolean; status: TransitionStatus; }; export declare interface UseTransitionStatusProps { /** * The duration of the transition in milliseconds, or an object containing * `open` and `close` keys for different durations. */ duration?: Duration; } /** * Provides styles to apply CSS transitions to a floating element, correctly * handling placement-aware transitions. Wrapper around `useTransitionStatus`. * @see https://floating-ui.com/docs/useTransition#usetransitionstyles */ export declare function useTransitionStyles<RT extends ReferenceType = ReferenceType>(context: FloatingContext<RT>, props?: UseTransitionStylesProps): { isMounted: boolean; styles: React.CSSProperties; }; export declare interface UseTransitionStylesProps extends UseTransitionStatusProps { /** * The styles to apply when the floating element is initially mounted. */ initial?: CSSStylesProperty; /** * The styles to apply when the floating element is transitioning to the * `open` state. */ open?: CSSStylesProperty; /** * The styles to apply when the floating element is transitioning to the * `close` state. */ close?: CSSStylesProperty; /** * The styles to apply to all states. */ common?: CSSStylesProperty; } /** * Provides a matching callback that can be used to focus an item as the user * types, often used in tandem with `useListNavigation()`. * @see https://floating-ui.com/docs/useTypeahead */ export declare function useTypeahead(context: FloatingRootContext, props: UseTypeaheadProps): ElementProps; export declare interface UseTypeaheadProps { /** * A ref which contains an array of strings whose indices match the HTML * elements of the list. * @default empty list */ listRef: React.MutableRefObject<Array<string | null>>; /** * The index of the active (focused or highlighted) item in the list. * @default null */ activeIndex: number | null; /** * Callback invoked with the matching index if found as the user types. */ onMatch?: (index: number) => void; /** * Callback invoked with the typing state as the user types. */ onTypingChange?: (isTyping: boolean) => void; /** * Whether the Hook is enabled, including all internal Effects and event * handlers. * @default true */ enabled?: boolean; /** * A function that returns the matching string from the list. * @default lowercase-finder */ findMatch?: null | ((list: Array<string | null>, typedString: string) => string | null | undefined); /** * The number of milliseconds to wait before resetting the typed string. * @default 750 */ resetMs?: number; /** * An array of keys to ignore when typing. * @default [] */ ignoreKeys?: Array<string>; /** * The index of the selected item in the list, if available. * @default null */ selectedIndex?: number | null; } export { VirtualElement } export { }