import { useCallback, useEffect, useRef, useState } from 'react'; import GlassSurface from '../ui/GlassSurface.js'; import ScannerToast from './ScannerToast.js'; import ScannerCountPill from './ScannerCountPill.js'; import ScannerScanPeek from './ScannerScanPeek.js'; import ScannerDisambiguation from './ScannerDisambiguation.js'; import { useScannerSound } from '../../lib/use-scanner-sound.js'; import { useScannerFlash } from '../../lib/use-scanner-flash.js'; import { cardGuideToContainerStyle, computeObjectCoverLayout, videoBoundsToContainerStyle, } from '../../lib/scanner-video-layout.js'; const TOAST_DURATION_MS = 2500; function CardGuideFrame({ layout }) { if (!layout) return null; const style = cardGuideToContainerStyle(layout); return ( ); } function DetectionFrame({ card, layout }) { const label = card.status === 'scanned' ? `Card ${card.id} scanned` : `Card ${card.id} identified`; if (!layout) return null; const style = videoBoundsToContainerStyle(card.bounds, layout); return (
); } function ChromeIconButton({ onClick, label, pressed, busy, children, className = '', }) { return ( ); } function CameraViewport({ viewportRef, videoRef, isStreaming, displayLayout, foundCards, }) { return (