import { IModuleCallbacksMap, IModuleMutableProps, IModuleStaticProps } from '../../base';
import { TEasingType } from '../../utils/math';
import { ISwipeCoords } from '../Swipe';
import { ITimelineProgressArg } from '../Timeline';
import { SnapSlide } from './logic/Slide';
import { ISnapSlideProps } from './logic/Slide/types';
import { ISnapSwipeProps } from './logic/Swipe/types';
import { ISnapWheelProps } from './logic/Wheel/types';
/** Static properties for the Snap component */
export interface ISnapStaticProps extends IModuleStaticProps {
    /** HTML container  */
    container: HTMLElement;
    /** HTML Element used to emit events
     * @default null
     */
    eventsEmitter?: HTMLElement | null;
    /**
     * Default active index
     * @default 0
     */
    activeIndex?: number;
}
/** Mutable properties for the Snap component */
export interface ISnapMutableProps extends IModuleMutableProps, ISnapWheelProps, ISnapSwipeProps {
    /**
     * Slides instances. If `false`, all container's children will be considered as slides.
     * @default false
     */
    slides?: (HTMLElement | SnapSlide)[] | false;
    /**
     * Container size. Supported values:
     * - `auto` detects slide size depending on the container size.
     * - `number` defines the slide size in pixels.
     * - css units like `px`, `rem`, `vw`, `vh`, `svh`.
     * @default 'auto'
     */
    containerSize?: number | 'auto' | (string & {});
    /**
     * Indicates the number of slides to scroll on swipe or wheel.
     * @default 1
     */
    slidesToScroll?: number;
    /**
     * Sliding direction
     * @default 'horizontal'
     */
    direction?: 'horizontal' | 'vertical';
    /**
     * Centered slides
     * @default false
     */
    centered?: boolean;
    /**
     * Detects if need to loop the progress
     * @default false
     */
    loop?: boolean;
    /**
     * The gap between slides. Supports css units like `px`, `rem`, `vw`, `vh`, `svh`.
     * @default 0
     */
    gap?: number | string;
    /**
     * Linear interpolation factor for smooth coordinates updates.
     * @default `vevet.mobile ? 1 : 0.3`
     */
    lerp?: number;
    /**
     * Enables freemode, with or without sticky magnets.
     * @default false
     */
    freemode?: boolean | 'sticky';
    /**
     * Enables wrap-around navigation: advancing from the last slide jumps to the first,
     * and going back from the first jumps to the last. Has no effect when `loop` mode is enabled.
     * @default false
     */
    rewind?: boolean;
    /**
     * Snap to the nearest slide on carousel resize
     * @default true
     */
    stickOnResize?: boolean;
    /**
     * Friction that makes the slides tend to the nearest slide magnet. The value is a number between 0 and 1
     * which is multiplied by the `lerp` value.
     * 0 disables friction
     * @default 0
     */
    friction?: number;
    /**
     * Maximum friction between the final slide and the maximum translation value.
     * From 0 to 1. The higher value the more resistance is applied.
     * @default 0.7
     */
    edgeFriction?: number;
    /**
     * Change slide duration
     * @default 500
     */
    duration?: TSnapDuration;
    /**
     * Easing type for timelines
     * @default EaseOutCubic
     */
    easing?: TEasingType;
    /**
     * Slide size. Supported values:
     * - `auto` detects slide size depending on the element or container size.
     * - `stretch` detects slide size as the container size.
     * - `number` defines the slide size in pixels.
     * - css units like `px`, `rem`, `vw`, `vh`, `svh`.
     * @default 'auto'
     */
    slideSize?: ISnapSlideProps['size'];
    /**
     * Interval between automatic slide changes in milliseconds. If `null`, the interval is disabled.
     * @default null
     */
    interval?: number | null;
    /**
     * Direction of automatic slide changes. Can be either 'next' or 'prev'.
     * @default 'next'
     */
    intervalDirection?: 'next' | 'prev';
}
/** Callbacks map for the Snap component */
export interface ISnapCallbacksMap extends IModuleCallbacksMap<ISnapMutableProps> {
    /** Fired on resize */
    resize: undefined;
    /** Fired on reflow: staticValues update */
    reflow: undefined;
    /** Fired during the rendering process */
    update: undefined;
    /** Fired after active slide change */
    activeSlide: SnapSlide;
    /** Fired on requestAnimationFrame play */
    rafPlay?: undefined;
    /** Fired on requestAnimationFrame pause */
    rafPause?: undefined;
    /** Fired on wheel start */
    wheelStart: undefined;
    /** Fired on wheel event */
    wheel: WheelEvent;
    /** Fired on wheel end */
    wheelEnd: undefined;
    /** Fired on swipe start */
    swipeStart: ISwipeCoords;
    /** Fired on swipe move */
    swipe: ISwipeCoords;
    /** Fired on swipe end */
    swipeEnd: ISwipeCoords;
    /** Fired on timeline animation start */
    timelineStart: undefined;
    /** Fired on timeline animation update */
    timelineUpdate: ITimelineProgressArg;
    /** Fired on timeline animation end */
    timelineEnd: undefined;
    /** Fired on inertia start */
    swipeInertiaStart: undefined;
    /** Fired on inertia end */
    swipeInertiaEnd: undefined;
    /** Fired on inertia cancel */
    swipeInertiaCancel: undefined;
    /** Fired on inertia fail */
    swipeInertiaFail: undefined;
    /** Fired on idle */
    idle: undefined;
}
export type TSnapDuration = number | ((distance: number) => number);
export interface ISnapMagnet {
    /** Slide */
    slide: SnapSlide;
    /** Static magnet coordinate */
    magnet: number;
    /** Difference with current coordinate */
    diff: number;
}
export interface ISnapTransitionArg {
    duration?: TSnapDuration;
    easing?: TEasingType;
    onStart?: () => void;
    onUpdate?: (data: ITimelineProgressArg) => void;
    onEnd?: () => void;
}
export interface ISnapNexPrevArg extends ISnapTransitionArg {
    skip?: number;
}
export interface ISnapToSlideArg extends ISnapTransitionArg {
    direction?: 'next' | 'prev' | null;
    duration?: TSnapDuration;
}
//# sourceMappingURL=types.d.ts.map