/** * The feedback flip every copy control shares: after a write SETTLES the control * reports what happened for a beat, then returns to rest. * * Three rules live here rather than in each control. The confirmation follows a * REAL write — `run` awaits, and a rejected write never sets `copied`, so a * control never confirms a copy that did not happen. A rejected write is * REPORTED rather than raised: the clipboard is denied on a non-secure origin * and behind a permission prompt, both of them a press away, and a control that * let that rejection escape put "Clipboard: Write permission denied" in the * console and nothing at all in front of the reader — so the outcome becomes * `failed`, which the control says in the reader's own words. And the timer is * cleared on unmount, so a control that disappears mid-beat (a row scrolled out * of a register, a message bar that loses its actions) never sets state on an * unmounted tree. * * `copied` and `failed` are the two sides of ONE outcome and are never both * true: a second press while a beat is running restarts it on the new answer. */ export declare function useCopyFeedback(resetMs?: number): { copied: boolean; failed: boolean; run: (write: () => void | Promise) => Promise; };