import { Component, ContextType, SyntheticEvent, ReactElement, ReactComponentElement, ReactInstance, MouseEvent, FocusEvent } from 'react';
import { EventListenerHandler } from '@befe/brick-utils';
import { Popper, PopperProps } from './popper';
import { PopperContext } from './popper-context';
type TriggerTarget = (() => HTMLElement | null | void) | HTMLElement | null;
export interface PopperTriggerProps {
/**
* 触发方式
*/
type?: 'click' | 'hover' | 'focus';
/**
* @todo 是否禁用
* @private
*
* 暂不提供
* - trigger 是个无实体的 wrap,按理说应没有所谓的 disabled
* - 考虑 `` 这种情况(目标 disabled, 但可以 hover 出 tips 的情景),
* 多一层次 disabled 实际有点混淆
* - `beforeChange` / `onChange` 可以满足 “(根据需要)不触发” 的情况,且api 使用复杂度没有比 `disabled` 大
*/
disabled?: boolean;
/**
* popper 是否显示控制值
*/
visible?: boolean;
/**
* 指定 popper 的目标元素
* 注意
* - 不接受 ReactNode
* - 不接受模拟的 PopperJS.ReferenceObject,因为一个模拟的 ReferenceObject 无所谓 trigger 触发方式,没有意义
* @type (() => HTMLElement | null | void) | HTMLElement | null
*/
target?: TriggerTarget;
/**
* popper 是否显示默认值
*/
defaultVisible?: boolean;
/**
* visible 变化回调
*/
onChange?: (visible: boolean, e?: Event | SyntheticEvent) => void;
/**
* visible 变化前的回调,根据返回值进行 visible 的变化
* - promise,当 promise resolve 后进行 visible change, promise reject 则不进行
* - false,visible 不进行 visible change
* - true | void,立即进行 visible change
*/
beforeChange?: (visible: boolean) => Promise | boolean | void;
/**
* mouseEnter 延迟触发,单位:毫秒
*/
mouseEnterDelay?: number;
/**
* mouseLeave 延迟触发,单位:毫秒
*/
mouseLeaveDelay?: number;
/**
* focus 延迟出发,单位:毫秒
*/
focusDelay?: number;
/**
* blur 延迟触发,单位:毫秒
*/
blurDelay?: number;
/**
* 是否隐藏时隐藏 parent
*/
shouldHideParent?: boolean;
/**
* 对于 type click,
* document 会绑定一个 mousedown 事件,实现 "点击 popper 外部时隐藏 popper" 行为
*
* - 设成 `false` 可去掉此行为
* - 也接受一个回调,以应付额外的自定义判断情况,比如,但如果点击 outside 的是某特定元素,则不关闭
*/
shouldHideOnMousedownDocument?: boolean | ((e: Event) => boolean);
}
type TriggerEventType = 'onClick' | 'onMouseEnter' | 'onMouseLeave' | 'onFocus' | 'onBlur';
type PopperEventType = 'onMouseEnter' | 'onMouseLeave';
export declare const PopperTriggerContext: import("react").Context<{}>;
export declare const PopperTriggerConsumer: import("react").Context<{}>;
export declare const POPPER_TRIGGER_MINIMUM_MOUSE_LEAVE_DELAY = 60;
export declare const POPPER_TRIGGER_INVALID_CHILDREN_WARNING = "PopperTrigger \u53EA\u5141\u8BB8 ReactElement \u4F5C\u4E3A children";
export declare const POPPER_TRIGGER_CONTROL_VISIBLE_INIT_WARNING: string;
interface PopperTriggerState {
visible: boolean;
target?: TriggerTarget;
}
export declare class PopperTrigger extends Component {
static displayName: string;
static defaultProps: {
type: string;
defaultVisible: boolean;
disabled: boolean;
mouseEnterDelay: number;
mouseLeaveDelay: number;
focusDelay: number;
blurDelay: number;
shouldHideOnMousedownDocument: boolean;
};
static contextType: import("react").Context;
static getDerivedStateFromProps(nextProps: PopperTriggerProps): Partial | null;
context: ContextType;
handleClickOutside: EventListenerHandler | null;
nodeTarget?: ReactInstance | null;
elemPopperWrap?: HTMLDivElement | null;
nodePopper?: Popper | null;
visibleTimeoutId: number | null;
scrollElement: HTMLElement | null;
constructor(props: PopperTriggerProps);
refTarget: (node: ReactInstance) => void;
refPopper: (node: Popper) => void;
refPopperWrap: (node: HTMLDivElement) => void;
get targetElement(): void | HTMLElement | null;
get contextValue(): {
hideByChild: () => void;
setChildPopperForParent?: ((childNodeGetter: import("./popper-context").ChildNodePopperGetter) => void) | undefined;
removeChildPopperFromParent?: ((childNodeGetter: import("./popper-context").ChildNodePopperGetter) => void) | undefined;
};
get childrenArray(): ReactElement>[];
get childTarget(): ReactComponentElement>;
get childPopper(): ReactElement> | null;
get targetInjectProps(): {
ref: (node: ReactInstance) => void;
} | {
onClick: (e: MouseEvent) => void | undefined;
onMouseEnter?: undefined;
onMouseLeave?: undefined;
onFocus?: undefined;
onBlur?: undefined;
ref: (node: ReactInstance) => void;
} | {
onMouseEnter: (e: MouseEvent) => void;
onMouseLeave: (e: MouseEvent) => void;
onClick?: undefined;
onFocus?: undefined;
onBlur?: undefined;
ref: (node: ReactInstance) => void;
} | {
onFocus: (e: FocusEvent) => void;
onBlur: (e: FocusEvent) => void;
onClick?: undefined;
onMouseEnter?: undefined;
onMouseLeave?: undefined;
ref: (node: ReactInstance) => void;
};
get popperInjectProps(): {
onMouseEnter?: ((e: MouseEvent) => void) | undefined;
onMouseLeave?: ((e: MouseEvent) => void) | undefined;
ref: (node: Popper) => void;
refPopperWrap: (node: HTMLDivElement) => void;
visible: boolean;
target: TriggerTarget | undefined;
};
handleClickTarget: (e: MouseEvent) => void | undefined;
handleMouseEnterTarget: (e: MouseEvent) => void;
handleMouseLeaveTarget: (e: MouseEvent) => void;
handleFocusTarget: (e: FocusEvent) => void;
handleBlurTarget: (e: FocusEvent) => void;
handleMouseEnterPopper: (e: MouseEvent) => void;
handleMouseLeavePopper: (e: MouseEvent) => void;
handleClickDoc: (e: Event) => void;
updateClickOutsideHandler(): void;
clearClickOutsideHandler(): void;
delaySetVisible(visible: boolean, delay: number, e: SyntheticEvent): void;
clearVisibleDelayTimeout(): void;
hideByChild: () => void;
hideParent(): void;
/**
* @public
*/
setVisible(visible: boolean, e?: Event | SyntheticEvent): void;
setTarget(target: HTMLElement): void;
getEventDelay(eventType: TriggerEventType | PopperEventType): number;
invokeTargetEventHandler(type: TriggerEventType, e: MouseEvent | FocusEvent, nextVisible?: boolean): void | undefined;
invokePopperEventHandler(type: PopperEventType, e: MouseEvent): void;
delayToggleVisible(e: MouseEvent | FocusEvent, delay: number, nextVisible: boolean): void;
componentWillUnmount(): void;
componentDidMount(): void;
componentDidUpdate(): void;
render(): import("react/jsx-runtime").JSX.Element;
}
export {};