/// import { SideProp } from "./Sides"; import { PlacementType } from "./PlacementType"; import { IBounds } from "./Bounds"; export declare type PositionConfig = Required>; export interface Offsets { readonly trigger: number; readonly container: number; readonly arrow: number; } export interface ScrollOffsets { left: number; top: number; } export interface BorderOffsets extends ScrollOffsets { } export declare type DisappearType = "partial" | "full"; export declare type ResizeObserverCallback = (entries: any[], observer: ResizeObserver) => void; export interface ResizeObserver { observe(target: Element, options?: any): void; unobserve(target: Element): void; disconnect(): void; } export declare type ResizeObserverClass = { new (cb: ResizeObserverCallback): ResizeObserver; }; export declare type LayerSide = SideProp; export declare type LayerDimensions = (layerSide: LayerSide) => { width: number; height: number; } | { width: number; height: number; }; export declare type Options = { /** * @description signals whether the layer is open or closed */ isOpen: boolean; /** * @description should the layer be contained within the closest scroll-container (false) * or is the layer allowed to overflow its closest scroll-container (true)? * @default true */ overflowContainer?: boolean; /** * @description useful when working with iframes for instance, when things like * event-listeners should be attached to anonther context (environment) * default is `window` */ environment?: Window; /** * @description let the use pass a polyfill when the browser does not support ResizeObserver * out of the box */ ResizeObserver?: ResizeObserverClass; /** * @description preferred placement of the layer * @default "top-center" */ placement?: PlacementType; /** * @description in case of `auto=true` -> describes which placements are possible. * default are all placements ("top-center", "bottom-left", ...etc) * @default allPlacements */ possiblePlacements?: PlacementType[]; /** * @description when both left and right sides are available -> which one is preferred? * @default "right" */ preferX?: "left" | "right"; /** * @description when both top and bottom sides are available -> which one is preferred? * @default "bottom" */ preferY?: "top" | "bottom"; /** * @description should we switch automatically to a placement that is more visible * on the screen? * @default false */ auto?: boolean; /** * @description should we gradually move between two placements (false)? * @default false */ snap?: boolean; /** * @description distance in pixels between layer and trigger * @default 0 */ triggerOffset?: number; /** * @description distance in pixels between layer and scroll-containers * @default 10 */ containerOffset?: number; /** * @description minimal distance between arrow and edges of layer and trigger * @default 0 */ arrowOffset?: number; /** * @description lets you anticipate on the dimensions of the layer. Usefull when the dimensions * of the layer differ per side, preventing an infinite loop of re-positioning * @default null * * @example * ```tsx * const layerDimenions = (layerSide) => ({ * width: layerside === "top" ? 200 : 100: * height: 50 * }); * ``` */ layerDimensions?: LayerDimensions | null; /** * @description gets called when the layer or trigger partially or fully disappears from the screen * when the layer is open. * * If `overflowContainer` is set to true, it looks at the trigger element. * If `overflowContainer` is set to false, it looks at the layer element. * * @default null * * @example * ```tsx * const onDisappear = (type) => * type === "partial" && setOpen(false); * ``` */ onDisappear?: (type: DisappearType) => void; /** * @description gets called when user clicks somewhere except the trigger or layer when the layer is open * @default undefined */ onOutsideClick?: () => void; /** * @description Useful when working with nested layers. It is used by the parent layer to signal * child layers that their layers should close * * @default undefined * * @example * ```tsx * const onParentClose = () => setOpen(false); * ``` */ onParentClose?: () => void; /** * @description (optional) Specify in which container (html-element) the layers should mount into * when `overflowContainer` is set to true or when there's no scroll-container found. * By default, in such cases the layers are mounted into a generated div#layers which gets attached * to the body of the document. * This prop accepts various values. When an string is passed, it is interpreted as the id of an element. * * @example * ```tsx * const container = 'my-layer-container'; // interpreted as element-id * const container = document.getElementById('my-layer-container'); * const container = () => document.getElementById('my-layer-container'); * ``` */ container?: string | HTMLElement | (() => HTMLElement); /** * @description This prop let's you specify information about the trigger you don't know beforehand. * This is typically for situations like context-clicks (right-mouse-clicks) and text-selection. * By using this prop the returning `triggerProps` of this hook will have no effect. */ trigger?: { /** * @description A callback function that returns the bounds of the trigger. * * @example * ```tsx * const getBounds = () => myTextRange.getBoundingClientRect(); * ``` */ getBounds: () => IBounds; /** * @description A callback function that returns the parent element. * This is optional but may be needed in cases where you'll want to prevent overflow * of the layer. In other words, if you use the default option `overflowContainer=true`, this * callback will have no effect. The returning element is used to position the layer relatively * and to register event-listeners. * * @example * ```tsx * const parentRef = React.useRef(); * const getParent = () => parentRef.current; * ``` */ getParent?: () => HTMLElement; }; }; export declare type Container = string | HTMLElement | (() => HTMLElement); export declare type Styles = { readonly layer: React.CSSProperties; readonly arrow: React.CSSProperties; }; export declare type RefCallback = (element: any) => void; export declare const dummy = "";