import type { GsapHandle } from '../../core/gsap-detect'; import type { TabEntry, TabState } from './state'; export interface OpenOptions { /** * Hold the visual's `tab-active` emit (and the auto cross-fade) for this * many seconds. Set by the orchestrator to the previous entry's visual * duration so a user-defined animate-out finishes before the new one's * animate-in starts. */ visualDelay?: number; onComplete?: () => void; } export interface AnimationController { /** Set every entry to its closed/inactive visual state (no animation). */ applyInitialClosed: (entries: TabEntry[]) => void; /** Snap an entry into its open state without animating (used for initial active). */ applyInitialOpen: (entry: TabEntry) => void; /** Run the open animation: height 0 → auto, visual autoAlpha 0 → 1. Emits tab-active. */ open: (entry: TabEntry, opts?: OpenOptions) => void; /** Run the close animation: height current → 0, visual autoAlpha 1 → 0. Emits tab-inactive. */ close: (entry: TabEntry, onComplete?: () => void) => void; /** Kill all in-flight tweens and clear inline styles we added. */ cleanup: (entries: TabEntry[]) => void; } /** * When the author wraps their own `aa-animate` onto the visual element, we * step out of the way: their animation owns visibility (and any transform). * Auto-cross-fade only kicks in when the visual is decorative markup. */ export declare function hasVisualAnimation(visual: HTMLElement | null): boolean; export declare function createAnimationController(gsapHandle: GsapHandle): AnimationController; export interface AriaController { applyInitial: () => void; applyOpen: (entry: TabEntry) => void; applyClosed: (entry: TabEntry) => void; cleanup: () => void; } export declare function createAriaController(state: TabState): AriaController; //# sourceMappingURL=controller.d.ts.map