/** * One-shot arrival: `active` starts true and goes false for good. * * Callers hang a mount animation off `active` and call `end` from * `animationend`. The timer is not a duplicate of that event — it is the only * thing that ends the intro when the animation never runs at all, and there are * three ordinary ways for that to happen: * * - `prefers-reduced-motion`, where the stylesheet cancels the animation * - `forced-colors`, where the animated element is hidden outright * - a background tab at mount, where animations are throttled or skipped * * Without it, anything gated on the intro being *over* — the Ask Leo chip's * resting glow, for one — would stay in its pre-arrival state permanently for * exactly the users least able to afford a missing affordance. * * Pass an `id` when the animating element can unmount and come back inside one * page load, and the arrival should not play again when it does. Call this hook * in the component that owns the animated element rather than an ancestor that * outlives it: an ancestor starts the clock while the element is absent, and by * the time it mounts the intro is already spent on nothing. */ declare function useOneShotIntro(id?: string, enabled?: boolean): { active: boolean; end: () => void; }; export { useOneShotIntro };