'use client'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table'
import { AlertTriangle } from 'lucide-react'
import { scoreGradient } from './chart-theme'
interface JurorMetric {
userId: string
name: string
evaluationCount: number
averageScore: number
stddev: number
deviationFromOverall: number
isOutlier: boolean
}
interface JurorConsistencyProps {
data: {
overallAverage: number
jurors: JurorMetric[]
}
}
function ScoreDot({ score, maxScore = 10 }: { score: number; maxScore?: number }) {
const pct = ((score / maxScore) * 100).toFixed(1)
return (
)
}
export function JurorConsistencyChart({ data }: JurorConsistencyProps) {
if (!data?.jurors?.length) {
return (
No juror consistency data available
)
}
const outlierCount = data.jurors.filter((j) => j.isOutlier).length
const sorted = [...data.jurors].sort((a, b) => b.averageScore - a.averageScore)
return (
{/* Juror Scoring Patterns — bar-based visual instead of scatter */}
Juror Scoring Patterns
Overall Avg: {data.overallAverage.toFixed(2)}
{outlierCount > 0 && (
{outlierCount} outlier{outlierCount > 1 ? 's' : ''}
)}
{sorted.map((juror) => (
{juror.name}
σ {juror.stddev.toFixed(1)}
{juror.evaluationCount} eval{juror.evaluationCount !== 1 ? 's' : ''}
{juror.isOutlier && (
)}
))}
{/* Overall average line */}
Bars show average score per juror. σ = standard deviation. Outliers deviate 2+ points from the overall mean.
{/* Juror details table */}
Juror Consistency Details
{/* Desktop table */}
Juror
Evaluations
Avg Score
Std Dev
Deviation
Status
{sorted.map((juror) => (
{juror.name}
{juror.evaluationCount}
{juror.averageScore.toFixed(2)}
{juror.stddev.toFixed(2)}
{juror.deviationFromOverall >= 0 ? '+' : ''}{juror.deviationFromOverall.toFixed(2)}
{juror.isOutlier ? (
Outlier
) : (
Normal
)}
))}
{/* Mobile card stack */}
{sorted.map((juror) => (
{juror.name}
{juror.isOutlier ? (
Outlier
) : (
Normal
)}
Avg Score
{juror.averageScore.toFixed(2)}
Std Dev
{juror.stddev.toFixed(2)}
Evals
{juror.evaluationCount}
))}
)
}