import * as PopperJS from '@popperjs/core'; import * as React from 'react'; // Utility type type UnionWhere = U extends M ? U : never; interface ManagerProps { children: React.ReactNode; } export class Manager extends React.Component {} export type RefHandler = (ref: HTMLElement | null) => void; interface ReferenceChildrenProps { // React refs are supposed to be contravariant (allows a more general type to be passed rather than a more specific one) // However, Typescript currently can't infer that fact for refs // See https://github.com/microsoft/TypeScript/issues/30748 for more information ref: React.Ref; } interface ReferenceProps { children: (props: ReferenceChildrenProps) => React.ReactNode; innerRef?: React.Ref; } export class Reference extends React.Component {} export interface PopperArrowProps { ref: React.Ref; style: React.CSSProperties; } export interface PopperChildrenProps { ref: React.Ref; style: React.CSSProperties; placement: PopperJS.Placement; isReferenceHidden?: boolean; hasPopperEscaped?: boolean; update: () => Promise>; forceUpdate: () => Partial; arrowProps: PopperArrowProps; } type StrictModifierNames = NonNullable; export type StrictModifier< Name extends StrictModifierNames = StrictModifierNames > = UnionWhere; export type Modifier< Name, Options extends object = object > = Name extends StrictModifierNames ? StrictModifier : Partial>; export interface PopperProps { children: (props: PopperChildrenProps) => React.ReactNode; innerRef?: React.Ref; modifiers?: ReadonlyArray>; placement?: PopperJS.Placement; strategy?: PopperJS.PositioningStrategy; referenceElement?: HTMLElement | PopperJS.VirtualElement; onFirstUpdate?: (state: Partial) => void; } export class Popper extends React.Component< PopperProps, {} > {} export function usePopper( referenceElement?: Element | PopperJS.VirtualElement | null, popperElement?: HTMLElement | null, options?: Omit, 'modifiers'> & { createPopper?: typeof PopperJS.createPopper; modifiers?: ReadonlyArray>; } ): { styles: { [key: string]: React.CSSProperties }; attributes: { [key: string]: { [key: string]: string } | undefined }; state: PopperJS.State | null; update: PopperJS.Instance['update'] | null; forceUpdate: PopperJS.Instance['forceUpdate'] | null; };