import { EventEmitter } from '@angular/core'; import { FormControl } from '@angular/forms'; import { InputMetadata } from '../../types'; import { CodeValidatorMetadata, ValidateFn, ValidationEntry, ValidationResult } from './types'; import * as i0 from "@angular/core"; /** * val-code-validator * * Sesión de escaneo a pantalla completa: se lee un código tras otro sin parar, * y cada uno se valida contra la regla que aporta el producto. * * Es un MODO, no un bloque de una página. Esa es la diferencia con poner un * escáner suelto en una vista: cuando alguien está en la puerta validando * entradas, la pantalla no tiene que competir con listas ni buscadores. * * El componente no sabe de dominios. El producto le pasa `validate` y recibe * `validated`; qué significa cada resultado lo decide quien valida. * * @example * */ export declare class CodeValidatorComponent { props: CodeValidatorMetadata; /** * La regla del producto. Sin esto el componente no valida nada: lee y avisa. */ validate?: ValidateFn; /** * Se emite apenas se lee un código, ANTES de invocar `validate`. Sirve para * lo que no depende del resultado: analítica de intento de escaneo, o que * el producto decida su propia estrategia de reintento alrededor de * `validate` sin que el componente sepa de HTTP. */ scanned: EventEmitter; validated: EventEmitter; closed: EventEmitter; /** * Referencia del modal, inyectada por ModalService. * * Un @Output NO llega al consumer cuando el componente se monta con * modalController.create(): el modal se crea fuera del árbol de plantillas y * no hay dónde enganchar el binding. Por eso el botón de cerrar no cerraba * nada. Está documentado en frontend/CLAUDE.md, Regla #5. */ _modalRef?: { dismiss: (data?: unknown, role?: string) => void; }; private i18n; private haptics; readonly busy: import("@angular/core").WritableSignal; readonly current: import("@angular/core").WritableSignal; readonly history: import("@angular/core").WritableSignal; readonly manualOpen: import("@angular/core").WritableSignal; readonly historyOpen: import("@angular/core").WritableSignal; /** Cuántas lecturas se muestran en el pie. El resto, en la lista completa. */ readonly recentLimit = 3; readonly soundOn: import("@angular/core").WritableSignal; /** * Control del ingreso manual. Es un FormControl y no un ngModel porque el * campo lo renderiza `val-text-input`, el mismo input que usa `val-form`: * así este campo se ve igual que cualquier otro de la lib en vez de tener * su propia caja dibujada a mano. */ readonly manualControl: FormControl; /** * Props del input manual, derivadas de la config del consumidor. * * Cacheado: `val-text-input` implementa OnChanges, y devolver un objeto nuevo * en cada ciclo de detección lo haría re-resolver props sin parar. */ private manualInputPropsCache?; manualInputProps(manual: { label: string; placeholder?: string; inputmode?: string; }): Partial; /** Código en vuelo: evita validar dos veces la misma lectura. */ private inFlight; private resultTimer; constructor(); t(key: string): string; readonly recentHistory: import("@angular/core").Signal; /** * Recorta el código para que quepa. * * Un token de QR o una URL miden decenas de caracteres y, sin recortar, * empujaban el ancho de la fila y toda la lista se movía de lado. Se muestran * las puntas porque son las que sirven para reconocerlo de un vistazo. */ shortCode(code: string): string; readonly okCount: import("@angular/core").Signal; /** * El escáner arranca solo y no se detiene: la sesión es "uno tras otro". * El anti-rebote sube porque acá cada lectura dispara una llamada de red. */ readonly scannerProps: import("@angular/core").Signal<{ autoStart: boolean; startLabel?: string; stopLabel?: string; continuous: boolean; dedupeMs: number; torch?: boolean; allowImage?: boolean; onDark: boolean; }>; iconFor(tone: string): string; toggleSound(): void; onScanned(code: string): Promise; submitManual(): Promise; /** Cierra el resultado y vuelve a escanear sin esperar al temporizador. */ dismiss(): void; close(): void; private run; /** Sonido + háptica. Los dos son best-effort y ninguno frena la sesión. */ private announce; private clearTimer; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; }