import { Interpolation, Theme } from '@emotion/react';
import { Keyframes } from '@emotion/serialize';

interface RevealProps {
    /**
     * Stagger its children animations.
     * @default false
     */
    cascade?: boolean;
    /**
     * Factor that affects the delay that each animated element in a cascade animation will be assigned.
     * @default 0.5
     */
    damping?: number;
    /**
     * Initial delay, in milliseconds.
     * @default 0
     */
    delay?: number;
    /**
     * Animation duration, in milliseconds.
     * @default 1000
     */
    duration?: number;
    /**
     * Float number between 0 and 1 indicating how much the element should be in viewport before the animation is triggered.
     * @default 0
     */
    fraction?: number;
    /**
     * Custom Emotion animation keyframes.
     */
    keyframes?: Keyframes;
    /**
     * Specifies if the animation should run only once or everytime the element enters/exits/re-enters the viewport.
     * @default false
     */
    triggerOnce?: boolean;
    /**
     * Custom Emotion styles.
     */
    css?: Interpolation<Theme>;
    /**
     * Class names to add to the container element.
     */
    className?: string;
    /**
     * Inline styles to add to the container element.
     */
    style?: React.CSSProperties;
    /**
     * Class names to add to the child element.
     */
    childClassName?: string;
    /**
     * Inline styles to add to the child element.
     */
    childStyle?: React.CSSProperties;
    /**
     * From React 18, children must be explicitly typed.
     * @see https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-typescript-definitions
     */
    children?: React.ReactNode;
    /**
     * Callback executed when the element enters or leaves the viewport.
     * If more than one element is being animated, this function is called
     * on each element.
     *
     * @param inView The current visibility flag.
     * @param entry The current IntersectionObserverEntry.
     */
    onVisibilityChange?(inView: boolean, entry: IntersectionObserverEntry): void;
}
declare const Reveal: React.FC<RevealProps>;

declare type AttentionSeekerEffect = "bounce" | "flash" | "headShake" | "heartBeat" | "jello" | "pulse" | "rubberBand" | "shake" | "shakeX" | "shakeY" | "swing" | "tada" | "wobble";
interface AttentionSeekerProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * The animation effect to use for this attention seeker.
     * @default "bounce"
     */
    effect?: AttentionSeekerEffect;
}
declare const AttentionSeeker: React.FC<AttentionSeekerProps>;

declare type BounceDirection = "down" | "left" | "right" | "up";
interface BounceProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Origin of the animation.
     * @default undefined
     */
    direction?: BounceDirection;
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Bounce: React.FC<BounceProps>;

declare type FadeDirection = "bottom-left" | "bottom-right" | "down" | "left" | "right" | "top-left" | "top-right" | "up";
interface FadeProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Causes the animation to start farther. Only works with "down", "left", "right" and "up" directions.
     * @default false
     */
    big?: boolean;
    /**
     * Origin of the animation.
     * @default undefined
     */
    direction?: FadeDirection;
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Fade: React.FC<FadeProps>;

declare type FlipDirection = "horizontal" | "vertical";
interface FlipProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Axis direction of the animation.
     * @default undefined
     */
    direction?: FlipDirection;
    /**
     * Specifies if the animation should make element(s) disappear. It only has effect if a direction is specified.
     * @default false
     */
    reverse?: boolean;
}
declare const Flip: React.FC<FlipProps>;

declare type HingeProps = Omit<RevealProps, "keyframes" | "css">;
declare const Hinge: React.FC<HingeProps>;

declare type JackInTheBoxProps = Omit<RevealProps, "keyframes" | "css">;
declare const JackInTheBox: React.FC<JackInTheBoxProps>;

interface RollProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Roll: React.FC<RollProps>;

declare type RotateDirection = "bottom-left" | "bottom-right" | "top-left" | "top-right";
interface RotateProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Origin of the animation.
     * @default undefined
     */
    direction?: RotateDirection;
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Rotate: React.FC<RotateProps>;

declare type SlideDirection = "down" | "left" | "right" | "up";
interface SlideProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Origin of the animation.
     * @default undefined
     */
    direction?: SlideDirection;
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Slide: React.FC<SlideProps>;

declare type ZoomDirection = "down" | "left" | "right" | "up";
interface ZoomProps extends Omit<RevealProps, "keyframes" | "css"> {
    /**
     * Origin of the animation.
     * @default undefined
     */
    direction?: ZoomDirection;
    /**
     * Specifies if the animation should make element(s) disappear.
     * @default false
     */
    reverse?: boolean;
}
declare const Zoom: React.FC<ZoomProps>;

export { AttentionSeeker, AttentionSeekerProps, Bounce, BounceProps, Fade, FadeProps, Flip, FlipProps, Hinge, HingeProps, JackInTheBox, JackInTheBoxProps, Reveal, RevealProps, Roll, RollProps, Rotate, RotateProps, Slide, SlideProps, Zoom, ZoomProps, Reveal as default };
