import { HTMLAttributes, ReactNode } from "react";
/**
 * Size of the 3D perspective effect
 */
export type CardStackPerspective = "sm" | "md" | "lg";
/**
 * Direction of card swipe
 */
export type CardStackSwipeDirection = "left" | "right";
/**
 * Card state for styling
 */
export type CardStackCardState = "idle" | "dragging" | "exiting";
/**
 * Props for the CardStack root component
 */
export interface CardStackProps extends Omit<HTMLAttributes<HTMLDivElement>, "onError"> {
    /** Enable drag interaction @default true */
    draggable?: boolean;
    /** Enable swipe on mobile @default true */
    swipeable?: boolean;
    /** Drag sensitivity threshold (0-1) @default 0.3 */
    dragThreshold?: number;
    /** Enable infinite loop of cards @default false */
    loop?: boolean;
    /** Random rotation range in degrees @default 3 */
    rotationRange?: number;
    /** Enable autoplay @default false */
    autoPlay?: boolean;
    /** Autoplay interval in milliseconds @default 5000 */
    autoPlayInterval?: number;
    /** Called when active card changes */
    onCardChange?: (index: number) => void;
    /** Called when card is swiped */
    onCardSwipe?: (index: number, direction: CardStackSwipeDirection) => void;
    /** Called when all cards are exhausted */
    onStackEmpty?: () => void;
    /** Current active card index (controlled) */
    currentIndex?: number;
    /** Initial card index (uncontrolled) @default 0 */
    defaultIndex?: number;
    /** Stack perspective depth @default 'md' */
    perspective?: CardStackPerspective;
    /** Maximum visible cards in stack @default 3 */
    stackDepth?: number;
    /** Scale reduction per stacked card @default 0.05 */
    scaleStep?: number;
    /** Vertical offset per stacked card in pixels @default 10 */
    offsetStep?: number;
    /** Accessible label for the card stack */
    "aria-label"?: string;
    /** Disable all interactions @default false */
    disabled?: boolean;
    /** Custom theme overrides */
    theme?: CardStackThemeOverrides;
    /** Custom class name */
    className?: string;
    /** Children (CardStack.Card components) */
    children?: ReactNode;
}
/**
 * Props for CardStack.Card component
 */
export interface CardStackCardProps extends HTMLAttributes<HTMLDivElement> {
    /** Unique identifier for the card (required) */
    value: string;
    /** Card content */
    children?: ReactNode;
    /** Custom class name for card styling */
    className?: string;
    /** Disable interaction for this specific card @default false */
    disabled?: boolean;
    /** Override rotation for this card (in degrees) */
    rotation?: number;
    /** Custom data attached to card for callbacks */
    data?: Record<string, unknown>;
    /** Called when this card is focused */
    onFocus?: () => void;
    /** Called when this card is removed from stack */
    onRemove?: () => void;
}
/**
 * Context value shared between CardStack components
 */
export interface CardStackContextValue {
    currentIndex: number;
    totalCards: number;
    stackOrder: number[];
    sendToBack: (index: number) => void;
    goToNext: () => void;
    goToPrevious: () => void;
    goToCard: (index: number) => void;
    reset: () => void;
    draggable: boolean;
    swipeable: boolean;
    dragThreshold: number;
    rotationRange: number;
    disabled: boolean;
    perspective: CardStackPerspective;
    stackDepth: number;
    scaleStep: number;
    offsetStep: number;
    canGoNext: boolean;
    canGoPrevious: boolean;
    isStackEmpty: boolean;
    onCardSwipe?: (index: number, direction: CardStackSwipeDirection) => void;
    theme: CardStackTheme;
}
/**
 * Theme configuration for CardStack
 */
export interface CardStackTheme {
    rootStyle: string;
    containerStyle: string;
    cardBaseStyle: string;
    cardDisabledStyle: string;
    perspective: Record<CardStackPerspective, string>;
    states: Record<CardStackCardState, string>;
}
/**
 * Theme overrides for CardStack
 */
export interface CardStackThemeOverrides {
    rootStyle?: string;
    containerStyle?: string;
    cardBaseStyle?: string;
    cardDisabledStyle?: string;
    perspective?: Partial<Record<CardStackPerspective, string>>;
    states?: Partial<Record<CardStackCardState, string>>;
}
/**
 * Animation custom values for card positioning
 */
export interface CardStackAnimationCustom {
    index: number;
    stackDepth: number;
    scaleStep: number;
    offsetStep: number;
}
