export interface ApprovalCountdown {
    /** Milliseconds until the request lapses, floored at 0; `null` when it never does. */
    remainingMs: number | null;
    /** The instant has passed. Always `false` for a request with no expiry. */
    isExpired: boolean;
}
export interface UseApprovalCountdownOptions {
    /** How often the value re-renders while counting. Default 1000 — a seconds label needs no more. */
    intervalMs?: number;
    /** Injectable clock for tests. */
    now?: () => number;
}
/** What {@link useApprovalCountdown} reads for `expiresAt` at `now`, without the ticking. */
export declare function approvalCountdown(expiresAt: string | null | undefined, now?: number): ApprovalCountdown;
/**
 * Time left on an approval request (`call.approval.expiresAt`), ticking until it lapses and then
 * holding at zero. Headless: pair `remainingMs` with `formatElapsed` or any label of your own, and
 * use `isExpired` to stop offering buttons the server would refuse (`410 Gone`). The server stays
 * the authority — a lapse is final only once the call settles `expired`.
 */
export declare function useApprovalCountdown(expiresAt: string | null | undefined, options?: UseApprovalCountdownOptions): ApprovalCountdown;
//# sourceMappingURL=countdown.d.ts.map