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;
}