import { OnDestroy } from '@angular/core'; import { MessageReplyTo } from '../../../services/chat/types'; import * as i0 from "@angular/core"; type PendingKind = 'image' | 'audio' | 'file'; interface PendingAttachment { id: number; file: File; url?: string; kind: PendingKind; } /** Evento de envío: texto (caption) + adjuntos staged. files vacío => solo texto. */ export interface ChatComposerSendEvent { text: string; files: File[]; } /** * val-chat-composer — barra de redacción estilo Notion/Claude (full custom). * * El editor es un `contenteditable` (NO ion-textarea): crece hasta un max-height, * soporta pegar texto plano e imágenes del portapapeles, Enter envía / Shift+Enter * salta línea. Debajo, una fila de acciones propias: adjuntar (+), mic/enviar. * Los adjuntos (botón / pegar / audio grabado) se acumulan como miniaturas de * PREVIEW y se mandan en UN solo evento `send {text, files}` (caption + adjuntos). * * Pensado para vivir en un contenedor fijo al fondo del viewport (el consumer * ancla la posición). No incluye emoji picker (el teclado del sistema lo trae). */ export declare class ChatComposerComponent implements OnDestroy { private i18n; private modal; readonly placeholder: import("@angular/core").InputSignal; readonly disabled: import("@angular/core").InputSignal; readonly maxLength: import("@angular/core").InputSignal; readonly replyingTo: import("@angular/core").InputSignal; readonly showAttach: import("@angular/core").InputSignal; /** Botón de dictado voz→texto (SpeechRecognition). Nativo en Safari/iOS y Chrome. */ readonly showMic: import("@angular/core").InputSignal; /** Botón de mensaje de voz (grabar clip). Opt-in: la reproducción cross-device * requiere transcode server-side (pendiente), por eso default false. */ readonly showVoiceMessage: import("@angular/core").InputSignal; readonly send: import("@angular/core").OutputEmitterRef; readonly typing: import("@angular/core").OutputEmitterRef; readonly voice: import("@angular/core").OutputEmitterRef; readonly cancelReply: import("@angular/core").OutputEmitterRef; private readonly editableRef; protected readonly dictating: import("@angular/core").WritableSignal; protected readonly dictationSupported: boolean; private recognition?; protected readonly body: import("@angular/core").WritableSignal; protected readonly pending: import("@angular/core").WritableSignal; private pendingId; protected readonly recording: import("@angular/core").WritableSignal; private readonly recSeconds; private recorder?; private recStream?; private recChunks; private recTimer?; protected readonly recTimeLabel: import("@angular/core").Signal; private lastTypingEmit; constructor(); protected readonly canSend: import("@angular/core").Signal; protected readonly placeholderText: import("@angular/core").Signal; /** Lee el texto del contenteditable a la signal `body`. */ protected syncBody(): void; protected onKeydown(event: KeyboardEvent): void; /** Pegar: texto plano (sin formato) + imágenes del portapapeles. */ protected onPaste(event: ClipboardEvent): void; protected onSend(): void; private clearEditable; protected onFile(event: Event): void; private addPending; protected removePending(id: number): void; /** Abre el adjunto staged en el visor de medios (imagen full / descarga). */ protected viewAttachment(att: PendingAttachment): void; private emitTypingDebounced; private pickAudioMime; protected startRecording(): Promise; /** Para la grabación y la stagea como adjunto pendiente (con preview de audio). */ protected finishRecording(): void; protected cancelRecording(): void; private cleanupRecording; /** Diagnóstico: el navegador no pudo reproducir el adjunto de audio. */ protected onAudioError(where: string, file: File, event: Event): void; protected onAudioLoaded(where: string, file: File, event: Event): void; /** ¿El navegador declara que puede reproducir este tipo? '' / 'maybe' / 'probably'. */ private canPlay; protected toggleDictation(): void; private startDictation; private stopDictation; /** Inserta el texto dictado al final del editable y sincroniza el body. */ private insertDictated; ngOnDestroy(): void; t(key: string): string; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; } export {};