interface CoachMarkStep { /** Unique key — also used for localStorage persistence */ id: string; /** CSS selector for the target element this step attaches to */ target: string; /** Popover placement side for this step */ side?: "top" | "bottom" | "left" | "right"; /** Popover alignment for this step */ align?: "start" | "center" | "end"; /** Title shown in the coach mark */ title: string; /** Body text / description */ description: string; /** Optional image URL shown above the content */ image?: string; /** Image alt text (required when image is provided) */ imageAlt?: string; } /** Fired on `window` when any coach flow completes (skip or last step). `detail.flowId` is the completed flow. */ declare const COACH_MARK_FLOW_COMPLETED_EVENT: "exxat-coach-mark-flow-completed"; interface UseCoachMarkOptions { /** Unique ID for the entire flow (used as localStorage key) */ flowId: string; /** Steps in order — single-item array for a standalone coach mark */ steps: CoachMarkStep[]; /** Delay in ms before the coach mark appears (default 500) */ delay?: number; /** Called when the entire flow is completed or skipped */ onComplete?: () => void; /** If true, always show even if previously dismissed (dev mode) */ force?: boolean; /** * When false, the auto-open timer does not run (e.g. until the user switches to a view where the target exists). * Default true. */ enabled?: boolean; /** * If set, auto-open only runs after this flow id is dismissed (localStorage) or completes (same-tab via * `COACH_MARK_FLOW_COMPLETED_EVENT`). Used to run a follow-up tour after another flow finishes. */ dependsOnDismissedFlowId?: string; } interface CoachMarkState { /** Whether the coach mark is currently visible */ isOpen: boolean; /** Current step index (0-based) */ currentStep: number; /** Total number of steps */ totalSteps: number; /** The current step data */ step: CoachMarkStep | null; /** The resolved target element for the current step */ targetEl: HTMLElement | null; /** Virtual anchor rect for Radix positioning */ anchorRect: { x: number; y: number; width: number; height: number; } | null; /** Whether this is a multi-step flow */ isFlow: boolean; /** Whether we're on the first step */ isFirst: boolean; /** Whether we're on the last step */ isLast: boolean; /** Advance to the next step (or complete if last) */ next: () => void; /** Go back to the previous step */ prev: () => void; /** Skip/dismiss the entire flow */ skip: () => void; /** Programmatically open the coach mark */ open: () => void; /** Reset the flow (clears persistence and starts over) */ reset: () => void; } /** Exported for the Settings page — list all coach mark keys in localStorage */ declare function getAllCoachMarkKeys(): string[]; /** Exported for the Settings page — reset a specific flow */ declare function resetCoachMarkFlow(flowId: string): void; /** Exported for the Settings page — reset ALL coach marks */ declare function resetAllCoachMarks(): void; declare function useCoachMark({ flowId, steps, delay, onComplete, force, enabled, dependsOnDismissedFlowId, }: UseCoachMarkOptions): CoachMarkState; export { COACH_MARK_FLOW_COMPLETED_EVENT, type CoachMarkState, type CoachMarkStep, type UseCoachMarkOptions, getAllCoachMarkKeys, resetAllCoachMarks, resetCoachMarkFlow, useCoachMark };