Build [v1.14.24]

This commit is contained in:
2026-04-25 12:04:02 +03:00
parent 33c1555d8c
commit 3257a2cf48
50 changed files with 837 additions and 845 deletions

View File

@@ -44,13 +44,13 @@ export default function CameraView({
return (
<div className="w-full max-w-md mx-auto flex flex-col gap-3 md:gap-4">
{/* Video Viewport Area */}
<div className="relative w-full aspect-square overflow-hidden rounded-[2.5rem] shadow-[0_20px_50px_rgba(0,0,0,0.5)] bg-background border-2 border-slate-800/50 p-4 sm:p-6">
<div className="relative w-full aspect-square overflow-hidden ] shadow-[0_20px_50px_rgba(0,0,0,0.5)] bg-background border-2 border-outline/20 p-4 sm:p-6">
<div className="absolute inset-4 sm:inset-6 z-10 pointer-events-none flex items-center justify-center">
<div className="w-full h-full border border-primary/30 rounded-[2rem] relative">
<div className="absolute top-0 left-0 w-10 h-10 border-t-4 border-l-4 border-primary rounded-tl-2xl shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute top-0 right-0 w-10 h-10 border-t-4 border-r-4 border-primary rounded-tr-2xl shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute bottom-0 left-0 w-10 h-10 border-b-4 border-l-4 border-primary rounded-bl-2xl shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute bottom-0 right-0 w-10 h-10 border-b-4 border-r-4 border-primary rounded-br-2xl shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="w-full h-full border border-primary/30 ] relative">
<div className="absolute top-0 left-0 w-10 h-10 border-t-4 border-l-4 border-primary shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute top-0 right-0 w-10 h-10 border-t-4 border-r-4 border-primary shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute bottom-0 left-0 w-10 h-10 border-b-4 border-l-4 border-primary shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
<div className="absolute bottom-0 right-0 w-10 h-10 border-b-4 border-r-4 border-primary shadow-[0_0_15px_rgba(59,130,246,0.5)]" />
{isStarted && !paused && !isSelecting && (
<div className="absolute top-0 left-0 right-0 h-1 bg-primary animate-scan-fast" />
@@ -77,7 +77,7 @@ export default function CameraView({
key={i}
onClick={() => onWordSelect(w.text)}
aria-label={`Select text: ${w.text}`}
className="absolute border border-primary bg-primary/20 rounded-sm active:bg-primary/50 cursor-pointer transition-colors pointer-events-auto focus:ring-2 focus:ring-primary focus:outline-none"
className="absolute border border-primary bg-primary/20 active:bg-primary/50 cursor-pointer transition-colors pointer-events-auto focus:ring-2 focus:ring-primary focus:outline-none"
style={{
left: `${(w.bbox.x0 / 1600) * 100}%`,
top: `${(w.bbox.y0 / (1600 * (9 / 16))) * 100}%`,
@@ -89,15 +89,15 @@ export default function CameraView({
</div>
</div>
</div>
<div className="p-6 bg-surface/90 border-t border-slate-800 flex flex-col gap-4">
<div className="p-6 bg-surface/90 border-t border-outline/30 flex flex-col gap-4">
<div className="flex flex-col items-center gap-1">
<p className="text-sm font-normal text-white italic text-center">Text Found</p>
<p className="text-xs text-muted font-normal text-center">Tap any text to use it</p>
<p className="text-sm font-normal text-foreground text-center">Text Found</p>
<p className="text-xs text-secondary font-normal text-center">Tap any text to use it</p>
</div>
<button
onClick={onCancelSelection}
aria-label="Cancel text selection"
className="w-full py-4 bg-slate-800 hover:bg-slate-700 text-white rounded-2xl font-normal text-xs cursor-pointer transition-all active:scale-95 border border-slate-700 focus:ring-2 focus:ring-blue-500 focus:outline-none"
className="w-full py-4 bg-surface-container hover:bg-surface-bright text-foreground font-normal text-xs cursor-pointer transition-all active:scale-95 border border-outline-variant focus:ring-2 focus:ring-primary focus:outline-none"
>
Cancel
</button>
@@ -114,15 +114,15 @@ export default function CameraView({
{error && (
<div className="absolute inset-0 z-20 flex flex-col items-center justify-center bg-surface text-secondary px-8 text-center gap-4">
<XCircle className="w-10 h-10 text-red-500" />
<XCircle className="w-10 h-10 text-error" />
<div>
<p className="font-normal text-white">Camera Error</p>
<p className="font-normal text-foreground">Camera Error</p>
<p className="text-xs text-secondary mt-1">{error}</p>
</div>
<button
onClick={() => window.location.reload()}
aria-label="Reload page and try again"
className="mt-4 px-6 py-2 bg-slate-800 rounded-full text-sm font-normal cursor-pointer hover:bg-slate-700 transition-colors focus:ring-2 focus:ring-blue-500 focus:outline-none"
className="mt-4 px-6 py-2 bg-surface-container text-sm font-normal cursor-pointer hover:bg-surface-bright transition-colors focus:ring-2 focus:ring-primary focus:outline-none"
>
Try Again
</button>
@@ -131,7 +131,7 @@ export default function CameraView({
</div>
{/* External Controls Area */}
<div className="flex flex-col gap-4 bg-surface/50 p-5 rounded-[2.5rem] border border-slate-800/50 shadow-2xl">
<div className="flex flex-col gap-4 bg-surface/50 p-5 ] border border-outline/20 shadow-2xl">
<div className="flex items-center gap-3 w-full">
{hasZoom && (
<button
@@ -146,14 +146,14 @@ export default function CameraView({
}}
data-testid="zoom-control"
aria-label={`Zoom ${zoom.toFixed(1)}x`}
className="h-14 px-5 bg-slate-800/80 hover:bg-slate-700 border border-slate-700 text-white rounded-2xl flex flex-col items-center justify-center shadow-lg cursor-pointer transition-all active:scale-95 shrink-0 focus:ring-2 focus:ring-blue-500 focus:outline-none"
className="h-14 px-5 bg-surface-container/80 hover:bg-surface-bright border border-outline-variant text-foreground flex flex-col items-center justify-center shadow-lg cursor-pointer transition-all active:scale-95 shrink-0 focus:ring-2 focus:ring-primary focus:outline-none"
>
<span className="text-xs font-normal tabular-nums">{zoom.toFixed(1)}x</span>
<span className="text-xs text-primary font-normal tracking-tighter">Zoom</span>
</button>
)}
<div className="flex-1 h-14 bg-background/40 border border-slate-800/50 rounded-2xl flex items-center justify-center gap-3 px-4 relative overflow-hidden group">
<div className="flex-1 h-14 bg-background/40 border border-outline/20 flex items-center justify-center gap-3 px-4 relative overflow-hidden group">
{ocrProcessing ? (
<>
<RefreshCw className="animate-spin text-primary" size={18} />
@@ -166,7 +166,7 @@ export default function CameraView({
size={18}
/>
<div className="flex flex-col">
<span className="text-xs text-muted font-normal leading-none">Smart Scan</span>
<span className="text-xs text-secondary font-normal leading-none">Smart Scan</span>
<span className="text-xs font-normal text-primary leading-tight tabular-nums">
{countdown === 0 ? 'Scanning' : `${countdown}s`}
</span>
@@ -183,7 +183,7 @@ export default function CameraView({
</div>
<div className="w-full flex justify-center items-center gap-2">
<div className="w-1 h-1 rounded-full bg-green-500 animate-pulse" />
<div className="w-1 h-1 bg-success animate-pulse" />
<p className="text-xs text-secondary font-normal">
Scanner active · Use zoom or tap scan
</p>