/** * Metadata (object-first) del organism `val-qr-scanner`. * * Scanner de QR por cámara. Todos los campos son opcionales (la cámara * funciona con defaults). El consumer pasa los labels ya resueltos por i18n; * si no, el componente cae a sus defaults auto-registrados (namespace * `QrScanner`). */ export interface QrScannerMetadata { /** Arrancar la cámara automáticamente al montar (default false). */ autoStart?: boolean; /** Label del botón de iniciar (override del auto-i18n). */ startLabel?: string; /** Label del botón de detener (override del auto-i18n). */ stopLabel?: string; /** * Mantener la cámara encendida tras un escaneo exitoso (default true). Si es * `false`, el scanner se detiene solo al primer match — útil para flujos de * un solo canje. Si es `true`, sigue escaneando (la página decide cuándo * parar / reanudar). */ continuous?: boolean; /** * Anti-rebote entre lecturas del MISMO valor, en ms (default 1500). Evita * que el mismo QR dispare `scanned` muchas veces por segundo mientras está * frente a la cámara. */ dedupeMs?: number; /** * Ofrecer la linterna cuando la cámara la soporte (default true). * * El botón aparece SOLO si la pista de video declara `torch` en sus * capabilities. Safari iOS no la expone, así que ahí no se muestra: un botón * encendido que no hace nada es peor que no tenerlo. */ torch?: boolean; /** * Ofrecer leer el código desde una foto (default true). * * Es la salida cuando la cámara falla, cuando el permiso quedó bloqueado o * cuando el código llegó por mensaje en vez de estar impreso. */ allowImage?: boolean; /** * El escáner vive sobre una superficie oscura (default false). * * Cambia el color de los botones y del selector de cámara. Sin esto, los * botones "dark" del default desaparecen contra un fondo casi negro: es lo * que pasaba dentro de la sesión a pantalla completa. */ onDark?: boolean; } /** Estado interno del scanner (expuesto para feedback de UI). */ export type QrScannerState = 'idle' | 'starting' | 'scanning' | 'denied' | 'no-camera' | 'error';