import { FC } from 'react'; /** * The voice status line's markup: one live region that announces the STATUS, * beside visual copy that may differ from it. * * ★★ Both spans are mounted in EVERY state, and nothing here is keyed. Many * screen readers ignore a live region that is inserted at the moment its * content changes, so remounting the region — a structure that only split * while thinking, or a `key` that changes with the text — would silence the * very announcements it exists for. The region stays put; only its text * changes, and only when the status does. * * ★ The shown copy is `aria-hidden`, so a rotation is never read aloud — * neither through the live region nor when the line is read with a virtual * cursor, where the announced span supplies the text exactly once. * * ★★ `relative` + `left-0 top-0` CONTAIN the announced span. `sr-only` is * `position: absolute`; without a positioned line its containing block is the * voice dialog, so it sat after the full untruncated text and pushed scrollable * overflow into the chat area. A screen reader scrolling the status into view * then shifted the whole docked strip sideways (measured: 34px at 320px wide * for a long Spanish status with the microphone off). `left-0`, not the * logical `start-0`: the latter is absent from at least one consumer's * generated stylesheet, and for a 1px clipped box the side does not matter. * * ★ `data-testid="assistant-voice-status"` is on the ANNOUNCED span, so reading * that id still yields exactly the status, as it always has. The visible copy is * `assistant-voice-status-shown`; the line itself is `assistant-voice-status-line`. */ export declare const VoiceStatusLine: FC<{ announced: string; shown: string; className: string; }>; /** * The voice session's status line, rotating the SHOWN text while the assistant * thinks. What is announced is always `status` — see `voiceStatusParts`. * * ★ The clock lives HERE, not in `AssistantVoiceSession`: a tick re-renders only * this line, and the orchestrators stay free of timers. * * ★★ Under reduced motion — the OS setting OR the app's own (BOFF-7284) — the * line does not rotate: no clock runs, and it shows the status itself, e.g. * "Thinking…" (with "· Microphone off" when muted). A phrase swapped every * 2.5 seconds is exactly the self-starting movement that preference asks to stop. * The announced text was never affected, so nothing changes for a screen reader. * (The WCAG criterion for auto-updating text is 2.2.2 Pause, Stop, Hide; the * reduced-motion preferences are how a person asks for it here.) */ export declare const VoiceStatusText: FC<{ /** The meaningful status. This is what is announced. */ status: string; /** Kept visible while the shown phrase rotates, e.g. "Microphone off". */ suffix?: string | null; /** * The stage ASKS to rotate the shown text through the thinking phrases. The * line honours it only when motion is allowed — see `usePrefersReducedMotion`. */ rotating?: boolean; className: string; }>; //# sourceMappingURL=VoiceStatusText.d.ts.map