import { useState } from 'react'; import { motion } from 'framer-motion'; import { Film, AlertTriangle, CheckCircle, Clock } from 'lucide-react'; import styles from './TemporalTimeline.module.css'; const SEV_LABELS = { critical: 'Critical', high: 'High', medium: 'Medium' }; export default function TemporalTimeline({ timeline, duration = 23, totalFrames }) { const [hovered, setHovered] = useState(null); const durationSec = parseFloat(duration) || 23; const toPercent = (sec) => (sec / durationSec) * 100; const hasFlags = timeline.flaggedSegments.length > 0; return (
Temporal Analysis Timeline
{timeline.flaggedSegments.length} flagged segments {timeline.cleanSegments.length} clean
{/* Main timeline bar */}
{/* Clean segments */} {timeline.cleanSegments.map((seg, i) => (
))} {/* Flagged segments */} {timeline.flaggedSegments.map((seg, i) => ( setHovered(i)} onMouseLeave={() => setHovered(null)} > {/* Tooltip */} {hovered === i && (

{seg.reason}

{seg.start.toFixed(1)}s – {seg.end.toFixed(1)}s · {seg.frames.length} frames

{SEV_LABELS[seg.severity]}
)}
))}
{/* Timestamp rulers */}
{Array.from({ length: Math.ceil(durationSec / 5) + 1 }, (_, i) => i * 5).map(t => ( t <= durationSec && (
{t}s
) ))}
{/* Flagged segments list */}
{hasFlags ? timeline.flaggedSegments.map((seg, i) => (

{seg.reason}

{seg.start.toFixed(1)}s – {seg.end.toFixed(1)}s · {seg.frames.length} frames flagged

{SEV_LABELS[seg.severity]}
)) : (
No suspicious temporal segments crossed the current threshold.
)}
); }