Avijit Ghosh commited on
Commit
42dac03
Β·
1 Parent(s): c417f2d

prettier cards

Browse files
app/evaluation/[id]/page.client.tsx CHANGED
@@ -5,7 +5,13 @@ import { useState, useEffect } from "react"
5
  import { Button } from "@/components/ui/button"
6
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
7
  import { Badge } from "@/components/ui/badge"
8
- import { ArrowLeft, Download, Eye, EyeOff, Info } from "lucide-react"
 
 
 
 
 
 
9
  import { getAllCategories, getCategoryById, getBenchmarkQuestions, getProcessQuestions } from "@/lib/schema"
10
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
11
  import { naReasonForCategoryFromEval } from "@/lib/na-utils"
@@ -35,6 +41,37 @@ const loadEvaluationDetails = async (id: string) => {
35
  return null
36
  }
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  export default function EvaluationDetailsPage() {
39
  const params = useParams()
40
  const router = useRouter()
@@ -201,35 +238,183 @@ export default function EvaluationDetailsPage() {
201
  </div>
202
  </div>
203
 
204
- {/* System Information */}
205
  <Card className="mb-6">
206
  <CardHeader>
207
- <CardTitle>System Information</CardTitle>
208
- </CardHeader>
209
- <CardContent className="grid grid-cols-2 gap-4">
210
- <div>
211
- <p className="text-sm text-muted-foreground">System Version</p>
212
- <p className="font-medium">{evaluation.version}</p>
213
- </div>
214
- <div>
215
- <p className="text-sm text-muted-foreground">Deployment Context</p>
216
- <p className="font-medium">{evaluation.deploymentContext}</p>
217
- </div>
218
- <div>
219
- <p className="text-sm text-muted-foreground">Evaluation Date</p>
220
- <p className="font-medium">{evaluation.evaluationDate}</p>
221
  </div>
222
- <div>
223
- <p className="text-sm text-muted-foreground">Evaluator</p>
224
- <p className="font-medium">{evaluation.evaluator}</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  </div>
226
- <div>
227
- <p className="text-sm text-muted-foreground">Modality</p>
228
- <p className="font-medium">{evaluation.modality}</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  </div>
230
- <div>
231
- <p className="text-sm text-muted-foreground">Completeness Score</p>
232
- <p className="font-medium">{evaluation.overallStats?.completenessScore || "N/A"}%</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  </div>
234
  </CardContent>
235
  </Card>
@@ -239,7 +424,8 @@ export default function EvaluationDetailsPage() {
239
  <CardHeader>
240
  <div className="flex items-center justify-between w-full">
241
  {/* compute applicable count as non-NA categories from the full CATEGORIES list */}
242
- <CardTitle>
 
243
  Applicable Categories ({
244
  getAllCategories().filter((c) => {
245
  const sel = new Set(evaluation.selectedCategories || [])
@@ -301,11 +487,27 @@ export default function EvaluationDetailsPage() {
301
  <span className="ml-2">
302
  {isNA ? (
303
  <span className="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium bg-muted/30 text-muted-foreground border-2 border-purple-500">
304
- {getCategoryById(category.id)?.name || category.name}
 
 
 
 
 
 
 
 
305
  </span>
306
  ) : (
307
  <Badge variant="secondary" className="cursor-pointer">
308
- {getCategoryById(category.id)?.name || category.name}
 
 
 
 
 
 
 
 
309
  </Badge>
310
  )}
311
  </span>
@@ -355,11 +557,27 @@ export default function EvaluationDetailsPage() {
355
  <span className="ml-2">
356
  {isNA ? (
357
  <span className="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium bg-muted/30 text-muted-foreground border-2 border-red-500">
358
- {getCategoryById(category.id)?.name || category.name}
 
 
 
 
 
 
 
 
359
  </span>
360
  ) : (
361
  <Badge variant="destructive" className="cursor-pointer">
362
- {getCategoryById(category.id)?.name || category.name}
 
 
 
 
 
 
 
 
363
  </Badge>
364
  )}
365
  </span>
@@ -375,7 +593,10 @@ export default function EvaluationDetailsPage() {
375
  {/* Overall Statistics */}
376
  <Card className="mb-6">
377
  <CardHeader>
378
- <CardTitle>Overall Statistics</CardTitle>
 
 
 
379
  </CardHeader>
380
  <CardContent>
381
  <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
@@ -411,7 +632,10 @@ export default function EvaluationDetailsPage() {
411
  {((evaluation.overallStats?.weakCategories || []).length > 0 || (evaluation.overallStats?.insufficientCategories || []).length > 0) && (
412
  <Card className="mb-6">
413
  <CardHeader>
414
- <CardTitle>Priority Areas</CardTitle>
 
 
 
415
  </CardHeader>
416
  <CardContent>
417
  <div className="grid grid-cols-1 md:grid-cols-2 gap-3">
@@ -422,8 +646,14 @@ export default function EvaluationDetailsPage() {
422
  return (
423
  <div key={catId} className="p-3 border rounded-md flex items-center justify-between">
424
  <div>
425
- <div className="font-medium">{category?.name || catId}</div>
426
- <div className="text-xs text-muted-foreground">{category?.description}</div>
 
 
 
 
 
 
427
  </div>
428
  <Badge variant={evaluation.overallStats?.insufficientCategories?.includes(catId) ? "destructive" : "outline"}>
429
  {evaluation.overallStats?.insufficientCategories?.includes(catId) ? "insufficient" : "weak"}
@@ -501,6 +731,10 @@ export default function EvaluationDetailsPage() {
501
  <div className="flex items-start justify-between w-full gap-4">
502
  <div>
503
  <CardTitle className="flex items-center gap-2">
 
 
 
 
504
  {category?.name || categoryId}
505
  <Badge variant={category?.type === "capability" ? "secondary" : "destructive"}>
506
  {category?.type || "unknown"}
 
5
  import { Button } from "@/components/ui/button"
6
  import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
7
  import { Badge } from "@/components/ui/badge"
8
+ import { ArrowLeft, Download, Eye, EyeOff, Info, Database, Globe, Calendar, User, Building, Cpu, MonitorSpeaker, Hash, Tags, Clock, Activity, Settings,
9
+ // Section icons
10
+ Target, BarChart3, Shield, AlertTriangle,
11
+ // Capability icons
12
+ MessageCircle, Heart, Brain, Lightbulb, BookOpen, Camera, Hand, Search, Bot,
13
+ // Risk icons
14
+ Skull, AlertCircle, Lock, Zap, Gavel, Users, Leaf, TrendingDown, Scale, Factory } from "lucide-react"
15
  import { getAllCategories, getCategoryById, getBenchmarkQuestions, getProcessQuestions } from "@/lib/schema"
16
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
17
  import { naReasonForCategoryFromEval } from "@/lib/na-utils"
 
41
  return null
42
  }
43
 
44
+ // Category icon mapping
45
+ const getCategoryIcon = (categoryId: string) => {
46
+ const iconMap: Record<string, any> = {
47
+ // Capabilities
48
+ "language-communication": MessageCircle,
49
+ "social-intelligence": Heart,
50
+ "problem-solving": Brain,
51
+ "creativity-innovation": Lightbulb,
52
+ "learning-memory": BookOpen,
53
+ "perception-vision": Camera,
54
+ "physical-manipulation": Hand,
55
+ "metacognition": Search,
56
+ "robotic-intelligence": Bot,
57
+
58
+ // Risks
59
+ "harmful-content": Skull,
60
+ "information-integrity": AlertCircle,
61
+ "privacy-data": Lock,
62
+ "bias-fairness": Scale,
63
+ "security-robustness": Shield,
64
+ "dangerous-capabilities": Zap,
65
+ "human-ai-interaction": Users,
66
+ "environmental-impact": Leaf,
67
+ "economic-displacement": TrendingDown,
68
+ "governance-accountability": Gavel,
69
+ "value-chain": Factory
70
+ }
71
+
72
+ return iconMap[categoryId] || Target
73
+ }
74
+
75
  export default function EvaluationDetailsPage() {
76
  const params = useParams()
77
  const router = useRouter()
 
238
  </div>
239
  </div>
240
 
241
+ {/* System Information (detailed) */}
242
  <Card className="mb-6">
243
  <CardHeader>
244
+ <div className="flex items-center justify-between w-full">
245
+ <div>
246
+ <CardTitle className="flex items-center gap-2">
247
+ <Database className="h-5 w-5 text-blue-600" />
248
+ System Information
249
+ </CardTitle>
250
+ <p className="text-sm text-muted-foreground">Metadata about the evaluated system</p>
251
+ </div>
 
 
 
 
 
 
252
  </div>
253
+ </CardHeader>
254
+ <CardContent>
255
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
256
+ {/* Left Column */}
257
+ <div className="space-y-6">
258
+ <div className="flex items-start gap-3">
259
+ <div className="p-2 bg-blue-50 dark:bg-blue-950 rounded-lg">
260
+ <Cpu className="h-4 w-4 text-blue-600 dark:text-blue-400" />
261
+ </div>
262
+ <div className="flex-1">
263
+ <p className="text-sm font-medium text-muted-foreground">System Name</p>
264
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.systemName || evaluation.systemName || "β€”"}</p>
265
+ </div>
266
+ </div>
267
+
268
+ <div className="flex items-start gap-3">
269
+ <div className="p-2 bg-green-50 dark:bg-green-950 rounded-lg">
270
+ <Tags className="h-4 w-4 text-green-600 dark:text-green-400" />
271
+ </div>
272
+ <div className="flex-1">
273
+ <p className="text-sm font-medium text-muted-foreground">System Version</p>
274
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.version || evaluation.modelTag || "β€”"}</p>
275
+ </div>
276
+ </div>
277
+
278
+ <div className="flex items-start gap-3">
279
+ <div className="p-2 bg-purple-50 dark:bg-purple-950 rounded-lg">
280
+ <Building className="h-4 w-4 text-purple-600 dark:text-purple-400" />
281
+ </div>
282
+ <div className="flex-1">
283
+ <p className="text-sm font-medium text-muted-foreground">Provider</p>
284
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.provider || "β€”"}</p>
285
+ </div>
286
+ </div>
287
+
288
+ <div className="flex items-start gap-3">
289
+ <div className="p-2 bg-indigo-50 dark:bg-indigo-950 rounded-lg">
290
+ <Globe className="h-4 w-4 text-indigo-600 dark:text-indigo-400" />
291
+ </div>
292
+ <div className="flex-1">
293
+ <p className="text-sm font-medium text-muted-foreground">URL</p>
294
+ <p className="text-lg font-semibold text-foreground mt-1 break-all">
295
+ {evaluation.url ? (
296
+ <a href={evaluation.url} target="_blank" rel="noreferrer" className="text-primary hover:text-primary/80 underline decoration-primary/30 hover:decoration-primary/60 transition-colors">
297
+ {evaluation.url}
298
+ </a>
299
+ ) : (
300
+ "β€”"
301
+ )}
302
+ </p>
303
+ </div>
304
+ </div>
305
+ </div>
306
+
307
+ {/* Right Column */}
308
+ <div className="space-y-6">
309
+ <div className="flex items-start gap-3">
310
+ <div className="p-2 bg-cyan-50 dark:bg-cyan-950 rounded-lg">
311
+ <Globe className="h-4 w-4 text-cyan-600 dark:text-cyan-400" />
312
+ </div>
313
+ <div className="flex-1">
314
+ <p className="text-sm font-medium text-muted-foreground">Deployment Context</p>
315
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.deploymentContext || (evaluation.deploymentContexts && evaluation.deploymentContexts.join(", ")) || "β€”"}</p>
316
+ </div>
317
+ </div>
318
+
319
+ <div className="flex items-start gap-3">
320
+ <div className="p-2 bg-emerald-50 dark:bg-emerald-950 rounded-lg">
321
+ <Activity className="h-4 w-4 text-emerald-600 dark:text-emerald-400" />
322
+ </div>
323
+ <div className="flex-1">
324
+ <p className="text-sm font-medium text-muted-foreground">Input Modalities</p>
325
+ <div className="text-lg font-semibold text-foreground mt-1">
326
+ {evaluation.inputModalities?.length ? (
327
+ <div className="flex flex-wrap gap-1">
328
+ {evaluation.inputModalities.map((modality: string, idx: number) => (
329
+ <Badge key={idx} variant="outline" className="text-xs">
330
+ {modality}
331
+ </Badge>
332
+ ))}
333
+ </div>
334
+ ) : "β€”"}
335
+ </div>
336
+ </div>
337
+ </div>
338
+
339
+ <div className="flex items-start gap-3">
340
+ <div className="p-2 bg-rose-50 dark:bg-rose-950 rounded-lg">
341
+ <MonitorSpeaker className="h-4 w-4 text-rose-600 dark:text-rose-400" />
342
+ </div>
343
+ <div className="flex-1">
344
+ <p className="text-sm font-medium text-muted-foreground">Output Modalities</p>
345
+ <div className="text-lg font-semibold text-foreground mt-1">
346
+ {evaluation.outputModalities?.length ? (
347
+ <div className="flex flex-wrap gap-1">
348
+ {evaluation.outputModalities.map((modality: string, idx: number) => (
349
+ <Badge key={idx} variant="outline" className="text-xs">
350
+ {modality}
351
+ </Badge>
352
+ ))}
353
+ </div>
354
+ ) : "β€”"}
355
+ </div>
356
+ </div>
357
+ </div>
358
+
359
+ <div className="flex items-start gap-3">
360
+ <div className="p-2 bg-amber-50 dark:bg-amber-950 rounded-lg">
361
+ <Clock className="h-4 w-4 text-amber-600 dark:text-amber-400" />
362
+ </div>
363
+ <div className="flex-1">
364
+ <p className="text-sm font-medium text-muted-foreground">Knowledge Cutoff</p>
365
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.knowledgeCutoff || "β€”"}</p>
366
+ </div>
367
+ </div>
368
+ </div>
369
  </div>
370
+
371
+ {/* Bottom Row - Metadata Cards */}
372
+ <div className="mt-8 grid grid-cols-1 md:grid-cols-3 gap-4">
373
+ <div className="p-4 bg-gradient-to-r from-blue-50 to-blue-100 dark:from-blue-950/50 dark:to-blue-900/50 rounded-lg border border-blue-200 dark:border-blue-800">
374
+ <div className="flex items-center gap-2 mb-2">
375
+ <Hash className="h-4 w-4 text-blue-600 dark:text-blue-400" />
376
+ <div className="text-sm font-medium text-blue-700 dark:text-blue-300">System ID</div>
377
+ </div>
378
+ <div className="font-mono text-sm text-blue-900 dark:text-blue-100 break-all">{evaluation.id || "β€”"}</div>
379
+ </div>
380
+
381
+ <div className="p-4 bg-gradient-to-r from-green-50 to-green-100 dark:from-green-950/50 dark:to-green-900/50 rounded-lg border border-green-200 dark:border-green-800">
382
+ <div className="flex items-center gap-2 mb-2">
383
+ <Tags className="h-4 w-4 text-green-600 dark:text-green-400" />
384
+ <div className="text-sm font-medium text-green-700 dark:text-green-300">System Types</div>
385
+ </div>
386
+ <div className="font-medium text-green-900 dark:text-green-100">{evaluation.systemTypes?.length ? evaluation.systemTypes.join(", ") : "β€”"}</div>
387
+ </div>
388
+
389
+ <div className="p-4 bg-gradient-to-r from-purple-50 to-purple-100 dark:from-purple-950/50 dark:to-purple-900/50 rounded-lg border border-purple-200 dark:border-purple-800">
390
+ <div className="flex items-center gap-2 mb-2">
391
+ <Calendar className="h-4 w-4 text-purple-600 dark:text-purple-400" />
392
+ <div className="text-sm font-medium text-purple-700 dark:text-purple-300">Evaluation Date</div>
393
+ </div>
394
+ <div className="font-medium text-purple-900 dark:text-purple-100">{evaluation.evaluationDate || "β€”"}</div>
395
+ </div>
396
  </div>
397
+
398
+ {/* Additional Bottom Fields */}
399
+ <div className="mt-6 grid grid-cols-1 md:grid-cols-2 gap-4">
400
+ <div className="flex items-start gap-3">
401
+ <div className="p-2 bg-violet-50 dark:bg-violet-950 rounded-lg">
402
+ <User className="h-4 w-4 text-violet-600 dark:text-violet-400" />
403
+ </div>
404
+ <div className="flex-1">
405
+ <p className="text-sm font-medium text-muted-foreground">Evaluator</p>
406
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.evaluator || "β€”"}</p>
407
+ </div>
408
+ </div>
409
+ <div className="flex items-start gap-3">
410
+ <div className="p-2 bg-pink-50 dark:bg-pink-950 rounded-lg">
411
+ <Activity className="h-4 w-4 text-pink-600 dark:text-pink-400" />
412
+ </div>
413
+ <div className="flex-1">
414
+ <p className="text-sm font-medium text-muted-foreground">Completeness Score</p>
415
+ <p className="text-lg font-semibold text-foreground mt-1">{evaluation.overallStats?.completenessScore ? `${evaluation.overallStats.completenessScore}%` : "N/A"}</p>
416
+ </div>
417
+ </div>
418
  </div>
419
  </CardContent>
420
  </Card>
 
424
  <CardHeader>
425
  <div className="flex items-center justify-between w-full">
426
  {/* compute applicable count as non-NA categories from the full CATEGORIES list */}
427
+ <CardTitle className="flex items-center gap-2">
428
+ <Target className="h-5 w-5 text-green-600" />
429
  Applicable Categories ({
430
  getAllCategories().filter((c) => {
431
  const sel = new Set(evaluation.selectedCategories || [])
 
487
  <span className="ml-2">
488
  {isNA ? (
489
  <span className="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium bg-muted/30 text-muted-foreground border-2 border-purple-500">
490
+ {(() => {
491
+ const IconComponent = getCategoryIcon(category.id)
492
+ return (
493
+ <>
494
+ <IconComponent className="h-3 w-3 mr-1" />
495
+ {getCategoryById(category.id)?.name || category.name}
496
+ </>
497
+ )
498
+ })()}
499
  </span>
500
  ) : (
501
  <Badge variant="secondary" className="cursor-pointer">
502
+ {(() => {
503
+ const IconComponent = getCategoryIcon(category.id)
504
+ return (
505
+ <>
506
+ <IconComponent className="h-3 w-3 mr-1" />
507
+ {getCategoryById(category.id)?.name || category.name}
508
+ </>
509
+ )
510
+ })()}
511
  </Badge>
512
  )}
513
  </span>
 
557
  <span className="ml-2">
558
  {isNA ? (
559
  <span className="inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium bg-muted/30 text-muted-foreground border-2 border-red-500">
560
+ {(() => {
561
+ const IconComponent = getCategoryIcon(category.id)
562
+ return (
563
+ <>
564
+ <IconComponent className="h-3 w-3 mr-1" />
565
+ {getCategoryById(category.id)?.name || category.name}
566
+ </>
567
+ )
568
+ })()}
569
  </span>
570
  ) : (
571
  <Badge variant="destructive" className="cursor-pointer">
572
+ {(() => {
573
+ const IconComponent = getCategoryIcon(category.id)
574
+ return (
575
+ <>
576
+ <IconComponent className="h-3 w-3 mr-1" />
577
+ {getCategoryById(category.id)?.name || category.name}
578
+ </>
579
+ )
580
+ })()}
581
  </Badge>
582
  )}
583
  </span>
 
593
  {/* Overall Statistics */}
594
  <Card className="mb-6">
595
  <CardHeader>
596
+ <CardTitle className="flex items-center gap-2">
597
+ <BarChart3 className="h-5 w-5 text-blue-600" />
598
+ Overall Statistics
599
+ </CardTitle>
600
  </CardHeader>
601
  <CardContent>
602
  <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
 
632
  {((evaluation.overallStats?.weakCategories || []).length > 0 || (evaluation.overallStats?.insufficientCategories || []).length > 0) && (
633
  <Card className="mb-6">
634
  <CardHeader>
635
+ <CardTitle className="flex items-center gap-2">
636
+ <AlertTriangle className="h-5 w-5 text-amber-600" />
637
+ Priority Areas
638
+ </CardTitle>
639
  </CardHeader>
640
  <CardContent>
641
  <div className="grid grid-cols-1 md:grid-cols-2 gap-3">
 
646
  return (
647
  <div key={catId} className="p-3 border rounded-md flex items-center justify-between">
648
  <div>
649
+ <div className="font-medium flex items-center gap-2">
650
+ {(() => {
651
+ const IconComponent = getCategoryIcon(catId)
652
+ return <IconComponent className="h-4 w-4 text-muted-foreground" />
653
+ })()}
654
+ {category?.name || catId}
655
+ </div>
656
+ <div className="text-xs text-muted-foreground ml-6">{category?.description}</div>
657
  </div>
658
  <Badge variant={evaluation.overallStats?.insufficientCategories?.includes(catId) ? "destructive" : "outline"}>
659
  {evaluation.overallStats?.insufficientCategories?.includes(catId) ? "insufficient" : "weak"}
 
731
  <div className="flex items-start justify-between w-full gap-4">
732
  <div>
733
  <CardTitle className="flex items-center gap-2">
734
+ {(() => {
735
+ const IconComponent = getCategoryIcon(categoryId)
736
+ return <IconComponent className="h-5 w-5" />
737
+ })()}
738
  {category?.name || categoryId}
739
  <Badge variant={category?.type === "capability" ? "secondary" : "destructive"}>
740
  {category?.type || "unknown"}
components/ai-evaluation-dashboard.tsx CHANGED
@@ -23,6 +23,12 @@ export type SystemInfo = {
23
  modelType?: "foundational" | "fine-tuned" | "na"
24
  inputModalities?: string[]
25
  outputModalities?: string[]
 
 
 
 
 
 
26
  }
27
 
28
  export type CategoryScore = {
 
23
  modelType?: "foundational" | "fine-tuned" | "na"
24
  inputModalities?: string[]
25
  outputModalities?: string[]
26
+ id?: string
27
+ systemName?: string
28
+ systemTypes?: string[]
29
+ deploymentContext?: string
30
+ evaluationDate?: string
31
+ evaluator?: string
32
  }
33
 
34
  export type CategoryScore = {
components/results-dashboard.tsx CHANGED
@@ -5,7 +5,7 @@ import { Badge } from "@/components/ui/badge"
5
  import { Button } from "@/components/ui/button"
6
  import type { SystemInfo, CategoryScore } from "@/components/ai-evaluation-dashboard"
7
  import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from "recharts"
8
- import { Download, AlertTriangle, CheckCircle, AlertCircle, XCircle } from "lucide-react"
9
 
10
  interface Category {
11
  id: string
@@ -217,6 +217,199 @@ export function ResultsDashboard({
217
  </CardContent>
218
  </Card>
219
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  {/* Status Overview */}
221
  <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
222
  {Object.entries(statusCounts).map(([status, count]) => {
 
5
  import { Button } from "@/components/ui/button"
6
  import type { SystemInfo, CategoryScore } from "@/components/ai-evaluation-dashboard"
7
  import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from "recharts"
8
+ import { Download, AlertTriangle, CheckCircle, AlertCircle, XCircle, Globe, Calendar, User, Building, Cpu, MonitorSpeaker, Database, Hash, Tags, Clock, Activity, Headphones, Settings } from "lucide-react"
9
 
10
  interface Category {
11
  id: string
 
217
  </CardContent>
218
  </Card>
219
 
220
+ {/* System Information (detailed) */}
221
+ <Card className="mb-6">
222
+ <CardHeader>
223
+ <div className="flex items-center justify-between">
224
+ <div>
225
+ <CardTitle className="font-heading flex items-center gap-2">
226
+ <Database className="h-5 w-5 text-blue-600" />
227
+ System Information
228
+ </CardTitle>
229
+ <CardDescription>A summary of metadata provided for the evaluated system</CardDescription>
230
+ </div>
231
+ </div>
232
+ </CardHeader>
233
+ <CardContent>
234
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
235
+ {/* Left Column */}
236
+ <div className="space-y-6">
237
+ <div className="flex items-start gap-3">
238
+ <div className="p-2 bg-blue-50 dark:bg-blue-950 rounded-lg">
239
+ <Cpu className="h-4 w-4 text-blue-600 dark:text-blue-400" />
240
+ </div>
241
+ <div className="flex-1">
242
+ <div className="text-sm font-medium text-muted-foreground">System Name</div>
243
+ <div className="text-lg font-semibold text-foreground mt-1">
244
+ {(systemInfo as any)?.systemName || systemInfo?.name || "β€”"}
245
+ </div>
246
+ </div>
247
+ </div>
248
+
249
+ <div className="flex items-start gap-3">
250
+ <div className="p-2 bg-green-50 dark:bg-green-950 rounded-lg">
251
+ <Tags className="h-4 w-4 text-green-600 dark:text-green-400" />
252
+ </div>
253
+ <div className="flex-1">
254
+ <div className="text-sm font-medium text-muted-foreground">System Version</div>
255
+ <div className="text-lg font-semibold text-foreground mt-1">
256
+ {systemInfo?.version || (systemInfo as any)?.modelTag || "β€”"}
257
+ </div>
258
+ </div>
259
+ </div>
260
+
261
+ <div className="flex items-start gap-3">
262
+ <div className="p-2 bg-purple-50 dark:bg-purple-950 rounded-lg">
263
+ <Building className="h-4 w-4 text-purple-600 dark:text-purple-400" />
264
+ </div>
265
+ <div className="flex-1">
266
+ <div className="text-sm font-medium text-muted-foreground">Provider</div>
267
+ <div className="text-lg font-semibold text-foreground mt-1">{systemInfo?.provider || "β€”"}</div>
268
+ </div>
269
+ </div>
270
+
271
+ <div className="flex items-start gap-3">
272
+ <div className="p-2 bg-indigo-50 dark:bg-indigo-950 rounded-lg">
273
+ <Globe className="h-4 w-4 text-indigo-600 dark:text-indigo-400" />
274
+ </div>
275
+ <div className="flex-1">
276
+ <div className="text-sm font-medium text-muted-foreground">URL</div>
277
+ <div className="text-lg font-semibold text-foreground mt-1 break-all">
278
+ {systemInfo?.url ? (
279
+ <a href={systemInfo.url} target="_blank" rel="noreferrer" className="text-primary hover:text-primary/80 underline decoration-primary/30 hover:decoration-primary/60 transition-colors">
280
+ {systemInfo.url}
281
+ </a>
282
+ ) : (
283
+ "β€”"
284
+ )}
285
+ </div>
286
+ </div>
287
+ </div>
288
+
289
+ <div className="flex items-start gap-3">
290
+ <div className="p-2 bg-orange-50 dark:bg-orange-950 rounded-lg">
291
+ <Settings className="h-4 w-4 text-orange-600 dark:text-orange-400" />
292
+ </div>
293
+ <div className="flex-1">
294
+ <div className="text-sm font-medium text-muted-foreground">Model Type</div>
295
+ <div className="text-lg font-semibold text-foreground mt-1">
296
+ {systemInfo?.modelType ? (
297
+ <Badge variant="secondary" className="text-sm">
298
+ {systemInfo.modelType === "foundational" ? "Foundational Model" :
299
+ systemInfo.modelType === "fine-tuned" ? "Fine-tuned Model" :
300
+ "Not Applicable"}
301
+ </Badge>
302
+ ) : "β€”"}
303
+ </div>
304
+ </div>
305
+ </div>
306
+ </div>
307
+
308
+ {/* Right Column */}
309
+ <div className="space-y-6">
310
+ <div className="flex items-start gap-3">
311
+ <div className="p-2 bg-cyan-50 dark:bg-cyan-950 rounded-lg">
312
+ <Globe className="h-4 w-4 text-cyan-600 dark:text-cyan-400" />
313
+ </div>
314
+ <div className="flex-1">
315
+ <div className="text-sm font-medium text-muted-foreground">Deployment Context</div>
316
+ <div className="text-lg font-semibold text-foreground mt-1">
317
+ {(systemInfo as any)?.deploymentContext || (systemInfo?.deploymentContexts && systemInfo.deploymentContexts.join(", ")) || "β€”"}
318
+ </div>
319
+ </div>
320
+ </div>
321
+
322
+ <div className="flex items-start gap-3">
323
+ <div className="p-2 bg-emerald-50 dark:bg-emerald-950 rounded-lg">
324
+ <Activity className="h-4 w-4 text-emerald-600 dark:text-emerald-400" />
325
+ </div>
326
+ <div className="flex-1">
327
+ <div className="text-sm font-medium text-muted-foreground">Input Modalities</div>
328
+ <div className="text-lg font-semibold text-foreground mt-1">
329
+ {systemInfo?.inputModalities?.length ? (
330
+ <div className="flex flex-wrap gap-1">
331
+ {systemInfo.inputModalities.map((modality: string, idx: number) => (
332
+ <Badge key={idx} variant="outline" className="text-xs">
333
+ {modality}
334
+ </Badge>
335
+ ))}
336
+ </div>
337
+ ) : "β€”"}
338
+ </div>
339
+ </div>
340
+ </div>
341
+
342
+ <div className="flex items-start gap-3">
343
+ <div className="p-2 bg-rose-50 dark:bg-rose-950 rounded-lg">
344
+ <MonitorSpeaker className="h-4 w-4 text-rose-600 dark:text-rose-400" />
345
+ </div>
346
+ <div className="flex-1">
347
+ <div className="text-sm font-medium text-muted-foreground">Output Modalities</div>
348
+ <div className="text-lg font-semibold text-foreground mt-1">
349
+ {systemInfo?.outputModalities?.length ? (
350
+ <div className="flex flex-wrap gap-1">
351
+ {systemInfo.outputModalities.map((modality: string, idx: number) => (
352
+ <Badge key={idx} variant="outline" className="text-xs">
353
+ {modality}
354
+ </Badge>
355
+ ))}
356
+ </div>
357
+ ) : "β€”"}
358
+ </div>
359
+ </div>
360
+ </div>
361
+
362
+ <div className="flex items-start gap-3">
363
+ <div className="p-2 bg-amber-50 dark:bg-amber-950 rounded-lg">
364
+ <Clock className="h-4 w-4 text-amber-600 dark:text-amber-400" />
365
+ </div>
366
+ <div className="flex-1">
367
+ <div className="text-sm font-medium text-muted-foreground">Knowledge Cutoff</div>
368
+ <div className="text-lg font-semibold text-foreground mt-1">{systemInfo?.knowledgeCutoff || "β€”"}</div>
369
+ </div>
370
+ </div>
371
+
372
+ <div className="flex items-start gap-3">
373
+ <div className="p-2 bg-violet-50 dark:bg-violet-950 rounded-lg">
374
+ <User className="h-4 w-4 text-violet-600 dark:text-violet-400" />
375
+ </div>
376
+ <div className="flex-1">
377
+ <div className="text-sm font-medium text-muted-foreground">Evaluator</div>
378
+ <div className="text-lg font-semibold text-foreground mt-1">{(systemInfo as any)?.evaluator || "β€”"}</div>
379
+ </div>
380
+ </div>
381
+ </div>
382
+ </div>
383
+
384
+ {/* Bottom Row - Metadata Cards */}
385
+ <div className="mt-8 grid grid-cols-1 md:grid-cols-3 gap-4">
386
+ <div className="p-4 bg-gradient-to-r from-blue-50 to-blue-100 dark:from-blue-950/50 dark:to-blue-900/50 rounded-lg border border-blue-200 dark:border-blue-800">
387
+ <div className="flex items-center gap-2 mb-2">
388
+ <Hash className="h-4 w-4 text-blue-600 dark:text-blue-400" />
389
+ <div className="text-sm font-medium text-blue-700 dark:text-blue-300">System ID</div>
390
+ </div>
391
+ <div className="font-mono text-sm text-blue-900 dark:text-blue-100 break-all">{(systemInfo as any)?.id || "β€”"}</div>
392
+ </div>
393
+
394
+ <div className="p-4 bg-gradient-to-r from-green-50 to-green-100 dark:from-green-950/50 dark:to-green-900/50 rounded-lg border border-green-200 dark:border-green-800">
395
+ <div className="flex items-center gap-2 mb-2">
396
+ <Tags className="h-4 w-4 text-green-600 dark:text-green-400" />
397
+ <div className="text-sm font-medium text-green-700 dark:text-green-300">System Types</div>
398
+ </div>
399
+ <div className="font-medium text-green-900 dark:text-green-100">{(systemInfo as any)?.systemTypes?.length ? (systemInfo as any).systemTypes.join(", ") : "β€”"}</div>
400
+ </div>
401
+
402
+ <div className="p-4 bg-gradient-to-r from-purple-50 to-purple-100 dark:from-purple-950/50 dark:to-purple-900/50 rounded-lg border border-purple-200 dark:border-purple-800">
403
+ <div className="flex items-center gap-2 mb-2">
404
+ <Calendar className="h-4 w-4 text-purple-600 dark:text-purple-400" />
405
+ <div className="text-sm font-medium text-purple-700 dark:text-purple-300">Evaluation Date</div>
406
+ </div>
407
+ <div className="font-medium text-purple-900 dark:text-purple-100">{(systemInfo as any)?.evaluationDate || "β€”"}</div>
408
+ </div>
409
+ </div>
410
+ </CardContent>
411
+ </Card>
412
+
413
  {/* Status Overview */}
414
  <div className="grid grid-cols-1 md:grid-cols-4 gap-4">
415
  {Object.entries(statusCounts).map(([status, count]) => {