// V1 example detail page — ported from EvalReportExamplePage.tsx import { Page, View, Text } from '@react-pdf/renderer'; import { colors } from '../styles.js'; import { SCORE_THRESHOLDS, getScoreHexColor } from '../scoring.js'; import type { MatrixRow, EvaluatorInfo } from './types.js'; interface EvalReportExamplePageProps { exampleNumber: number; totalExamples: number; pageNumber: number; row: MatrixRow; evaluators: EvaluatorInfo[]; } export function EvalReportExamplePage({ exampleNumber, totalExamples, pageNumber: _pageNumber, row, evaluators, }: EvalReportExamplePageProps) { void _pageNumber; const passedCount = Object.values(row.cells).filter(c => c.passed).length; const totalCount = Object.keys(row.cells).length; const passRate = Math.round(row.avgScore * 100); const failed = evaluators.filter(e => row.cells[e.key] && !row.cells[e.key].passed); const passed = evaluators.filter(e => row.cells[e.key] && row.cells[e.key].passed); return ( {/* Header Row */} Question {exampleNumber} of {totalExamples} {passedCount}/{totalCount} passed = SCORE_THRESHOLDS.SUCCESS * 100 ? '#dcfce7' : passRate >= SCORE_THRESHOLDS.WARNING * 100 ? '#fef9c3' : '#fee2e2', paddingHorizontal: 8, paddingVertical: 4, borderRadius: 3 }}> {passRate}% {/* FULL Question */} Question {row.question} {/* FULL Agent Response */} Agent Response {row.response} {/* Evaluation Results - Two columns side by side */} {/* Failed Rules */} Failed ({failed.length}) {failed.length === 0 ? ( All rules passed! ) : ( failed.map((evaluator, idx) => { const cell = row.cells[evaluator.key]; return ( x {evaluator.name} [{evaluator.severity}] {cell?.comment && ( {cell.comment} )} ); }) )} {/* Passed Rules */} Passed ({passed.length}) {passed.length === 0 ? ( No rules passed ) : ( passed.map((evaluator) => ( + {evaluator.name} )) )} {/* Footer */} Indemn Evaluation Report `Page ${pn}`} /> ); }