import React, { type CSSProperties, PureComponent, type ReactElement } from "react";
import { type Modifier } from "react-popper";
import { type DialogAnimationType, type DialogTriggerEvent } from "../Dialog/Dialog.types";
import { HideShowEvent as HideShowEventEnum, AnimationType as AnimationTypeEnum } from "../Dialog/DialogConstants";
import type VibeComponentProps from "../../types/VibeComponentProps";
import { TooltipTheme as TooltipThemeEnum, TooltipPositions as TooltipPositionsEnum } from "./TooltipConstants";
import { type ElementContent } from "../../types/ElementContent";
import { type MoveBy } from "../../types/MoveBy";
import { type SubIcon } from "@vibe/icon";
import { type TooltipPositions, type TooltipTheme } from "./Tooltip.types";
export type TooltipProps = TooltipBaseProps & (TooltipWithChildrenProps | TooltipWithoutChildrenProps);
interface TooltipWithoutChildrenProps {
    /**
     * If true, the tooltip will be rendered even if there are no children.
     */
    forceRenderWithoutChildren: boolean;
    /**
     * The children elements that the tooltip is attached to.
     */
    children?: ReactElement | Array<ReactElement>;
}
interface TooltipWithChildrenProps {
    /**
     * If true, the tooltip will be rendered even if there are no children.
     */
    forceRenderWithoutChildren?: boolean;
    /**
     * The children elements that the tooltip is attached to.
     */
    children: ReactElement | Array<ReactElement>;
}
interface TooltipBaseProps extends VibeComponentProps {
    /**
     * The content displayed inside the tooltip.
     */
    content: ElementContent;
    /**
     * Inline styles applied to the tooltip container.
     */
    style?: CSSProperties;
    /**
     * Class name applied to the tooltip arrow.
     */
    arrowClassName?: string;
    /**
     * Offset values for positioning adjustments.
     */
    moveBy?: MoveBy;
    /**
     * The theme of the tooltip.
     */
    theme?: TooltipTheme;
    /**
     * Function to get the container where the tooltip should be rendered.
     */
    getContainer?: () => HTMLElement;
    /**
     * Delay in milliseconds before hiding the tooltip.
     */
    hideDelay?: number;
    /**
     * Delay in milliseconds before showing the tooltip.
     */
    showDelay?: number;
    /**
     * If true, disables the slide animation of the tooltip.
     */
    disableDialogSlide?: boolean;
    /**
     * The animation type used for showing/hiding the tooltip.
     */
    animationType?: DialogAnimationType;
    /**
     * If true, renders the tooltip without a dialog.
     */
    withoutDialog?: boolean;
    /**
     * The CSS selector of the container where the tooltip should be rendered.
     */
    containerSelector?: string;
    /**
     * Delay in milliseconds before showing the tooltip immediately.
     */
    immediateShowDelay?: number;
    /**
     * If false, hides the arrow of the tooltip.
     */
    tip?: boolean;
    /**
     * If true, the tooltip is shown when the component mounts.
     */
    shouldShowOnMount?: boolean;
    /**
     * If true, hides the tooltip when the reference element is hidden.
     */
    hideWhenReferenceHidden?: boolean;
    /**
     * Callback fired when the tooltip is hidden.
     */
    onTooltipHide?: () => void;
    /**
     * Callback fired when the tooltip is shown.
     */
    onTooltipShow?: () => void;
    /**
     * Custom Popper.js modifiers.
     * https://popper.js.org/docs/v2/modifiers/
     */
    modifiers?: Array<Modifier<unknown>>;
    /**
     * The placement of the tooltip relative to the reference element.
     */
    position?: TooltipPositions;
    /**
     * Events that trigger showing the tooltip.
     */
    showTrigger?: DialogTriggerEvent | Array<DialogTriggerEvent>;
    /**
     * Events that trigger hiding the tooltip.
     */
    hideTrigger?: DialogTriggerEvent | Array<DialogTriggerEvent>;
    /**
     * If true, prevents closing the tooltip when the mouse enters it.
     */
    showOnDialogEnter?: boolean;
    /**
     * Class name applied to the reference wrapper element.
     */
    referenceWrapperClassName?: string;
    /**
     * If true, keyboard focus/blur events behave like mouse enter/leave.
     */
    addKeyboardHideShowTriggersByDefault?: boolean;
    /**
     * If true, controls the open state of the tooltip.
     */
    open?: boolean;
    /**
     * The z-index applied to the tooltip.
     */
    zIndex?: number;
    /**
     * The title of the tooltip.
     */
    title?: string;
    /**
     * The image displayed inside the tooltip.
     */
    image?: string;
    /**
     * The icon displayed next to the title.
     */
    icon?: SubIcon;
    /**
     * The maximum width of the tooltip.
     */
    maxWidth?: number;
    /**
     * The text direction of the tooltip: "ltr", "rtl", or "auto".
     */
    dir?: "ltr" | "rtl" | "auto";
}
export default class Tooltip extends PureComponent<TooltipProps> {
    wasShown: boolean;
    static positions: typeof TooltipPositionsEnum;
    static hideShowTriggers: typeof HideShowEventEnum;
    static themes: typeof TooltipThemeEnum;
    static animationTypes: typeof AnimationTypeEnum;
    static defaultProps: {
        moveBy: {
            main: number;
            secondary: number;
        };
        theme: string;
        position: string;
        hideDelay: number;
        showDelay: number;
        disableDialogSlide: boolean;
        animationType: AnimationTypeEnum;
        withoutDialog: boolean;
        tip: boolean;
        hideWhenReferenceHidden: boolean;
        modifiers: Partial<import("@popperjs/core").Modifier<unknown, object>>[];
        showTrigger: HideShowEventEnum;
        hideTrigger: HideShowEventEnum;
        showOnDialogEnter: boolean;
        referenceWrapperClassName: string;
        addKeyboardHideShowTriggersByDefault: boolean;
        open: boolean;
    };
    constructor(props: TooltipProps);
    renderTooltipContent(): React.JSX.Element;
    onTooltipShow(): void;
    onTooltipHide(): void;
    getTimeSinceLastTooltip(): number;
    getShowDelay(): {
        showDelay: number;
        preventAnimation: boolean;
    };
    render(): React.JSX.Element;
}
export {};
