'use client' import { useState } from 'react' import type { DewarpResult, DewarpGroundTruth } from '@/app/(admin)/ai/ocr-pipeline/types' interface DewarpControlsProps { dewarpResult: DewarpResult | null showGrid: boolean onToggleGrid: () => void onManualDewarp: (scale: number) => void onGroundTruth: (gt: DewarpGroundTruth) => void onNext: () => void isApplying: boolean } const METHOD_LABELS: Record = { vertical_edge: 'Vertikale Kanten', text_baseline: 'Textzeilen-Baseline', manual: 'Manuell', none: 'Keine Korrektur', } export function DewarpControls({ dewarpResult, showGrid, onToggleGrid, onManualDewarp, onGroundTruth, onNext, isApplying, }: DewarpControlsProps) { const [manualScale, setManualScale] = useState(0) const [gtFeedback, setGtFeedback] = useState<'correct' | 'incorrect' | null>(null) const [gtNotes, setGtNotes] = useState('') const [gtSaved, setGtSaved] = useState(false) const handleGroundTruth = (isCorrect: boolean) => { setGtFeedback(isCorrect ? 'correct' : 'incorrect') if (isCorrect) { onGroundTruth({ is_correct: true }) setGtSaved(true) } } const handleGroundTruthIncorrect = () => { onGroundTruth({ is_correct: false, corrected_scale: manualScale !== 0 ? manualScale : undefined, notes: gtNotes || undefined, }) setGtSaved(true) } return (
{/* Results */} {dewarpResult && (
Kruemmung:{' '} {dewarpResult.curvature_px} px
Methode:{' '} {METHOD_LABELS[dewarpResult.method_used] || dewarpResult.method_used}
Konfidenz:{' '} {Math.round(dewarpResult.confidence * 100)}%
{/* Toggle */}
)} {/* Manual scale slider */} {dewarpResult && (
Manuelle Staerke
-3.0 setManualScale(parseFloat(e.target.value))} className="flex-1 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700 accent-teal-500" /> +3.0 {manualScale.toFixed(1)}

0 = keine Korrektur, positiv = nach rechts entzerren, negativ = nach links

)} {/* Ground Truth */} {dewarpResult && (
Korrekt entzerrt?
{!gtSaved ? (
{gtFeedback === 'incorrect' && (