import React, { useState } from "react"; import { CheckCircle2, XCircle, RotateCcw, ChevronRight, MousePointerClick, } from "lucide-react"; export interface EvidenceExercise { question: string; passage: string[]; // array of sentences rendered as a flowing paragraph evidenceIndex: number; // 0-based index of the correct sentence explanation: string; } interface EvidenceHunterWidgetProps { exercises: EvidenceExercise[]; accentColor?: string; } // Tailwind needs complete class strings — map accent to concrete classes const ACCENT: Record< string, { tab: string; header: string; label: string; hover: string; selected: string; btn: string; next: string; } > = { teal: { tab: "border-b-2 border-teal-600 text-teal-700", header: "bg-teal-50", label: "text-teal-500", hover: "hover:bg-teal-50 hover:border-teal-400", selected: "bg-teal-100 border-teal-500", btn: "bg-teal-600 hover:bg-teal-700", next: "text-teal-700 hover:text-teal-900", }, fuchsia: { tab: "border-b-2 border-fuchsia-600 text-fuchsia-700", header: "bg-fuchsia-50", label: "text-fuchsia-500", hover: "hover:bg-fuchsia-50 hover:border-fuchsia-400", selected: "bg-fuchsia-100 border-fuchsia-500", btn: "bg-fuchsia-600 hover:bg-fuchsia-700", next: "text-fuchsia-700 hover:text-fuchsia-900", }, purple: { tab: "border-b-2 border-purple-600 text-purple-700", header: "bg-purple-50", label: "text-purple-500", hover: "hover:bg-purple-50 hover:border-purple-400", selected: "bg-purple-100 border-purple-500", btn: "bg-purple-600 hover:bg-purple-700", next: "text-purple-700 hover:text-purple-900", }, amber: { tab: "border-b-2 border-amber-600 text-amber-700", header: "bg-amber-50", label: "text-amber-500", hover: "hover:bg-amber-50 hover:border-amber-400", selected: "bg-amber-100 border-amber-500", btn: "bg-amber-600 hover:bg-amber-700", next: "text-amber-700 hover:text-amber-900", }, }; export default function EvidenceHunterWidget({ exercises, accentColor = "teal", }: EvidenceHunterWidgetProps) { const [activeEx, setActiveEx] = useState(0); const [selected, setSelected] = useState(null); const [submitted, setSubmitted] = useState(false); const exercise = exercises[activeEx]; const isCorrect = submitted && selected === exercise.evidenceIndex; const c = ACCENT[accentColor] ?? ACCENT.teal; const reset = () => { setSelected(null); setSubmitted(false); }; const switchEx = (i: number) => { setActiveEx(i); setSelected(null); setSubmitted(false); }; return (
{/* Tab strip */} {exercises.length > 1 && (
{exercises.map((_, i) => ( ))}
)} {/* Question */}

Question

{exercise.question}

{/* Passage — flowing text with inline clickable sentences */}

Passage

{!submitted && ( click the sentence that answers the question )}
{/* Render as a flowing paragraph with clickable sentence spans */}
{exercise.passage.map((sentence, i) => { // Determine highlight class for this sentence let spanCls = `inline cursor-pointer rounded px-0.5 py-0.5 border border-transparent transition-all ${c.hover}`; if (submitted) { if (i === exercise.evidenceIndex) { spanCls = "inline rounded px-0.5 py-0.5 border bg-green-100 border-green-400 text-green-800 font-medium cursor-default"; } else if (i === selected) { spanCls = "inline rounded px-0.5 py-0.5 border bg-red-100 border-red-300 text-red-600 cursor-default line-through"; } else { spanCls = "inline rounded px-0.5 py-0.5 border border-transparent text-gray-400 cursor-default"; } } else if (selected === i) { spanCls = `inline rounded px-0.5 py-0.5 border cursor-pointer ${c.selected} font-medium`; } return ( { if (!submitted) setSelected(i); }} className={spanCls} title={ submitted ? undefined : `Click to select sentence ${i + 1}` } > {sentence} {i < exercise.passage.length - 1 ? " " : ""} ); })}
{/* Selection indicator */} {!submitted && selected !== null && (

Selected:{" "} "{exercise.passage[selected].slice(0, 60)} {exercise.passage[selected].length > 60 ? "…" : ""}"

)} {!submitted && selected === null && (

No sentence selected yet.

)}
{/* Submit / result */}
{!submitted ? ( ) : (
{isCorrect ? ( ) : ( )}

{isCorrect ? "Correct — that's the key sentence." : `Not quite. The highlighted sentence above is the correct one.`}

{exercise.explanation}

)}
{submitted && ( )} {submitted && activeEx < exercises.length - 1 && ( )}
); }