import * as React from 'react'; export interface StreamingTextHandle { /** Replaces the text. Same-frame calls coalesce into one commit (next animation frame). */ setText(text: string): void; /** Appends a chunk. Same-frame calls coalesce into one commit (next animation frame). */ append(chunk: string): void; } export interface StreamingTextProps { /** Text received so far. */ text: string; /** More text is still arriving; shows the streaming cursor. */ streaming?: boolean | undefined; /** Live-annunciation policy; complete announcements go through the MAT announcer. */ announce?: 'complete' | 'sentences' | 'off' | undefined; /** Class name merged onto the root element. */ className?: string | undefined; /** Imperative token sink: `setText`/`append` from a transport without re-rendering the parent. */ ref?: React.Ref | undefined; } /** REQ-SURF-113: the complete announcement is capped; the transcript keeps the rest. */ export declare const ANNOUNCE_MAX_CHARS = 600; export declare const ANNOUNCE_TRUNCATION_SUFFIX = "\u2026response continues in the conversation"; /** REQ-SURF-113: `announce="sentences"` batches are at least this far apart. */ export declare const SENTENCE_BATCH_MS = 1000; export declare function truncateAnnouncement(text: string): string; /** * REQ-SURF-113: renders `text` plus a blinking caret while `streaming`. * Imperative writes through the `ref` handle are coalesced by a per-instance * external store (`useSyncExternalStore`) flushed in one animation frame, so * 1,000 `setText` calls in one frame make one commit. The content carries * `aria-busy` only while streaming; speech goes through the MAT announcer. */ export declare const StreamingText: React.NamedExoticComponent; //# sourceMappingURL=StreamingText.d.ts.map