// @flow export type Position = 'top' | 'right' | 'bottom' | 'left'; export type Placement = | 'auto-start' | 'auto' | 'auto-end' | 'top-start' | 'top' | 'top-end' | 'right-start' | 'right' | 'right-end' | 'bottom-end' | 'bottom' | 'bottom-start' | 'left-end' | 'left' | 'left-start'; export type Offset = { top: number, left: number, width: number, height: number, position: Position, }; export type Boundary = 'scrollParent' | 'viewport' | 'window'; export type Behavior = 'flip' | 'clockwise' | 'counterclockwise'; export type Data = { instance: Popper, placement: Placement, originalPlacement: Placement, flipped: boolean, hide: boolean, arrowElement: Element, styles: CSSStyleDeclaration, arrowStyles: CSSStyleDeclaration, boundaries: Object, offsets: { popper: Offset, reference: Offset, arrow: { top: number, left: number, }, }, }; export type ModifierFn = (data: Data, options: Object) => Data; export type Padding = { top?: number, bottom?: number, left?: number, right?: number, }; export type BaseModifier = { order?: number, enabled?: boolean, fn?: ModifierFn, }; export type Modifiers = { shift?: BaseModifier, offset?: BaseModifier & { offset?: number | string, }, preventOverflow?: BaseModifier & { priority?: Position[], padding?: number | Padding, boundariesElement?: Boundary | Element, escapeWithReference?: boolean, }, keepTogether?: BaseModifier, arrow?: BaseModifier & { element?: string | Element | null, }, flip?: BaseModifier & { behavior?: Behavior | Position[], padding?: number | Padding, boundariesElement?: Boundary | Element, flipVariations?: boolean, flipVariationsByContent?: boolean, }, inner?: BaseModifier, hide?: BaseModifier, applyStyle?: BaseModifier & { onLoad?: Function, gpuAcceleration?: boolean, }, computeStyle?: BaseModifier & { gpuAcceleration?: boolean, x?: 'bottom' | 'top', y?: 'left' | 'right', }, [name: string]: (BaseModifier & { [string]: * }) | null, }; export type Options = { placement?: Placement, positionFixed?: boolean, eventsEnabled?: boolean, modifiers?: Modifiers, removeOnDestroy?: boolean, onCreate?: (data: Data) => void, onUpdate?: (data: Data) => void, }; export type ReferenceObject = { +clientHeight: number, +clientWidth: number, +referenceNode?: Node, getBoundingClientRect(): | ClientRect | { width: number, height: number, top: number, right: number, bottom: number, left: number, }, }; export type Instance = { destroy: () => void, scheduleUpdate: () => void, update: () => void, enableEventListeners: () => void, disableEventListeners: () => void, }; declare class Popper { static placements: Placement; popper: Element; reference: Element | ReferenceObject; constructor( reference: Element | ReferenceObject, popper: Element, options?: Options ): Instance; } declare export default typeof Popper;