import { useState } from 'react';
import './ContextPanel.css';
const ChevronIcon = ({ open }) => (
);
const PinIcon = () => (
);
function Section({ title, icon, children, defaultOpen = true }) {
const [open, setOpen] = useState(defaultOpen);
return (
{open &&
{children}
}
);
}
function EvidenceChunk({ chunk, idx }) {
const [expanded, setExpanded] = useState(false);
return (
[E{idx + 1}]
{chunk.doc_id}
p.{chunk.page_start}ā{chunk.page_end}
{chunk.cross_score != null && (
{(chunk.cross_score * 100).toFixed(0)}%
)}
{chunk.text}
{chunk.text?.length > 180 && (
)}
);
}
function CitationCard({ citation, idx }) {
return (
[{citation.evidence_id}]
{citation.doc_id}
p.{citation.pages}
{citation.text_preview && (
{citation.text_preview}
)}
);
}
function VerificationBlock({ turn }) {
if (!turn) return Select a response to view verification
;
const confidence = turn.confidence ?? 0;
const coverage = turn.citation_coverage ?? 0;
const support = turn.support_ratio ?? 0;
const verdictColors = {
supported: 'var(--success)',
partially_supported: 'var(--warning)',
refused: 'var(--error)',
};
return (
Verdict
{turn.verdict?.replace(/_/g, ' ')}
Confidence{Math.round(confidence * 100)}%
0.75 ? 'linear-gradient(90deg,#10b981,#34d399)'
: confidence > 0.45 ? 'linear-gradient(90deg,#f59e0b,#fbbf24)'
: 'linear-gradient(90deg,#ef4444,#f87171)' }} />
Support Ratio{Math.round(support * 100)}%
Citation Coverage{Math.round(coverage * 100)}%
);
}
export default function ContextPanel({ activeEvidence, activeTurn, pins, onPin, onUnpin }) {
const evidence = activeEvidence?.evidence || [];
const citations = activeEvidence?.citations || [];
return (
);
}