import { DOMRectLikeType } from '../utils/dom';
import BaseFoundation, { DefaultAdapter } from '../base/foundation';
import { ArrayElement } from '../utils/type';
import { strings } from './constants';
export interface TooltipAdapter
, S = Record> extends DefaultAdapter {
registerPortalEvent(portalEventSet: any): void;
registerResizeHandler(onResize: () => void): void;
unregisterResizeHandler(onResize?: () => void): void;
on(arg0: string, arg1: () => void): void;
notifyVisibleChange(isVisible: any): void;
getPopupContainerRect(): PopupContainerDOMRect;
containerIsBody(): boolean;
off(arg0: string, arg1?: () => void): void;
canMotion(): boolean;
registerScrollHandler(arg: () => Record): void;
unregisterScrollHandler(): void;
insertPortal(...args: any[]): void;
removePortal(...args: any[]): void;
setDisplayNone: (displayNone: boolean, cb?: () => void) => void;
getEventName(): {
mouseEnter: string;
mouseLeave: string;
mouseOut: string;
mouseOver: string;
click: string;
focus: string;
blur: string;
keydown: string;
contextMenu: string;
};
registerTriggerEvent(...args: any[]): void;
getTriggerBounding(...args: any[]): DOMRect;
getWrapperBounding(...args: any[]): DOMRect;
setPosition(...args: any[]): void;
togglePortalVisible(...args: any[]): void;
registerClickOutsideHandler(...args: any[]): void;
unregisterClickOutsideHandler(...args: any[]): void;
containerIsRelative(): boolean;
containerIsRelativeOrAbsolute(): boolean;
getDocumentElementBounding(): DOMRect;
updateContainerPosition(): void;
updatePlacementAttr(placement: Position): void;
getContainerPosition(): string;
getFocusableElements(node: any): any[];
getActiveElement(): any;
getContainer(): any;
setInitialFocus(): void;
notifyEscKeydown(event: any): void;
getTriggerNode(): any;
setId(): void;
getTriggerDOM(): HTMLElement | null;
getAnimatingState(): boolean;
}
export type Position = ArrayElement;
export interface PopupContainerDOMRect extends DOMRectLikeType {
scrollLeft?: number;
scrollTop?: number;
}
export default class Tooltip, S = Record> extends BaseFoundation, P, S> {
_timer: ReturnType;
_mounted: boolean;
constructor(adapter: TooltipAdapter);
init(): void;
destroy(): void;
_bindEvent(): void;
unBindEvent(): void;
_bindTriggerEvent(triggerEventSet: Record): void;
_bindPortalEvent(portalEventSet: Record): void;
_bindResizeEvent(): void;
unBindResizeEvent(): void;
removePortal: () => void;
setDisplayNone: (displayNone: boolean, cb?: () => void) => void;
_adjustPos(position?: string, isVertical?: boolean, adjustType?: string, concatPos?: any): string;
_reversePos(position?: string, isVertical?: boolean): string;
_expandPos(position: string, concatPos: string): string;
_reducePos(position?: string): string;
clearDelayTimer(): void;
updateStateIfCursorOnTrigger: (trigger: HTMLElement) => void;
_generateEvent(types: ArrayElement): {
triggerEventSet: {
[x: string]: (event: any) => void;
};
portalEventSet: {};
};
onResize: () => void;
_shouldShow(): void;
delayShow: () => void;
show: () => void;
_togglePortalVisible(isVisible: boolean): void;
_roundPixel(pixel: number): number;
calcTransformOrigin(position: Position, triggerRect: DOMRect, translateX: number, translateY: number): string;
calcPosStyle(props: {
triggerRect: DOMRect;
wrapperRect: DOMRect;
containerRect: PopupContainerDOMRect;
position?: Position;
spacing?: number;
isOverFlow?: [boolean, boolean];
}): Record;
/**
* 耦合的东西比较多,稍微罗列一下:
*
* - 根据 trigger 和 wrapper 的 boundingClient 计算当前的 left、top、transform-origin
* - 根据当前的 position 和 wrapper 的 boundingClient 决定是否需要自动调整位置
* - 根据当前的 position、trigger 的 boundingClient 以及 motion.handleStyle 调整当前的 style
*
* There are many coupling things, a little list:
*
* - calculate the current left, top, and transfer-origin according to the boundingClient of trigger and wrapper
* - decide whether to automatically adjust the position according to the current position and the boundingClient of wrapper
* - adjust the current style according to the current position, the boundingClient of trigger and motion.handle Style
*/
calcPosition: (triggerRect?: DOMRect, wrapperRect?: DOMRect, containerRect?: PopupContainerDOMRect, shouldUpdatePos?: boolean) => Record;
isLR(position?: string): boolean;
isTB(position?: string): boolean;
isReverse(rowSpace: number, reverseSpace: number, size: number): boolean;
isOverFlow(rowSpace: number, reverseSpace: number, size: number): boolean;
isHalfOverFlow(posSpace: number, negSpace: number, size: number): boolean;
isHalfAllEnough(posSpace: number, negSpace: number, size: number): boolean;
getReverse(viewOverFlow: boolean, containerOverFlow: boolean, shouldReverseView: boolean, shouldReverseContainer: boolean): boolean;
adjustPosIfNeed(position: Position | string, style: Record, triggerRect: DOMRect, wrapperRect: DOMRect, containerRect: PopupContainerDOMRect): {
position: string;
isHeightOverFlow: boolean;
isWidthOverFlow: boolean;
};
delayHide: () => void;
hide: () => void;
_bindScrollEvent(): void;
unBindScrollEvent(): void;
_initContainerPosition(): void;
handleContainerKeydown: (event: any) => void;
_handleTriggerKeydown(event: any): void;
/**
* focus trigger
*
* when trigger is 'focus' or 'hover', onFocus is bind to show popup
* if we focus trigger, popup will show again
*
* 如果 trigger 是 focus 或者 hover,则它绑定了 onFocus,这里我们如果重新 focus 的话,popup 会再次打开
* 因此 returnFocusOnClose 只支持 click trigger
*/
focusTrigger(): void;
_handleEscKeyDown(event: any): void;
_handleContainerTabKeyDown(focusableElements: any[], event: any): void;
_handleContainerShiftTabKeyDown(focusableElements: any[], event: any): void;
_handleTriggerArrowDownKeydown(focusableElements: any[], event: any): void;
_handleTriggerArrowUpKeydown(focusableElements: any[], event: any): void;
}