Spaces:
Runtime error
Runtime error
| 'use client'; | |
| // Color palette for labels | |
| const LABEL_COLORS = [ | |
| ['bg-green-100 text-green-800', 'bg-green-400'], | |
| ['bg-blue-100 text-blue-800', 'bg-blue-400'], | |
| ['bg-purple-100 text-purple-800', 'bg-purple-400'], | |
| ['bg-yellow-100 text-yellow-800', 'bg-yellow-400'], | |
| ['bg-pink-100 text-pink-800', 'bg-pink-400'], | |
| ['bg-indigo-100 text-indigo-800', 'bg-indigo-400'], | |
| ["bg-red-100 text-red-800", "bg-red-400"], | |
| ["bg-teal-100 text-teal-800", "bg-teal-400"], | |
| ["bg-orange-100 text-orange-800", "bg-orange-400"], | |
| ]; | |
| // Deterministically assign a color to each label | |
| const labelColorMap: Record<string, number> = {}; | |
| let colorIndex = 0; | |
| function getColorForLabel(label: string): string[] { | |
| if (!(label in labelColorMap)) { | |
| labelColorMap[label] = colorIndex % LABEL_COLORS.length; | |
| colorIndex++; | |
| } | |
| return LABEL_COLORS[labelColorMap[label]]; | |
| } | |
| export function ClassificationResultDisplay({ | |
| result, | |
| ready, | |
| task, | |
| }: { | |
| result: any; | |
| ready: boolean | null; | |
| task: string; | |
| // getColorForLabel: (label: string) => string[]; | |
| }) { | |
| if (ready === null) { | |
| return null; | |
| } | |
| if (!ready || !result) { | |
| return ( | |
| <div className="text-center text-gray-400 animate-pulse"> | |
| Results will appear here | |
| </div> | |
| ); | |
| } | |
| if (task === 'image-classification') { | |
| return ( | |
| <div className="space-y-6 w-full"> | |
| <div className="text-center"> | |
| <h2 className="text-2xl font-bold text-gray-800 mb-2"> | |
| {result[0].label} | |
| </h2> | |
| <div className="w-full bg-gray-200 rounded-full h-3 mb-2"> | |
| <div | |
| className={`h-3 rounded-full transition-all duration-1000 ease-out ${getColorForLabel(result[0].label)[1]}`} | |
| style={{ width: `${result[0].score * 100}%` }} | |
| /> | |
| </div> | |
| <div className="text-sm text-gray-500"> | |
| Confidence: {(result[0].score * 100).toFixed(2)}% | |
| </div> | |
| </div> | |
| <div className="border-t border-gray-200 my-4"></div> | |
| <div className="space-y-3"> | |
| {result.slice(1).map((item: any) => ( | |
| <div key={item.label} className="space-y-1"> | |
| <div className="flex justify-between items-center"> | |
| <span className="text-gray-700 text-sm">{item.label}</span> | |
| <span className={`px-2 py-0.5 rounded-full text-xs font-medium ${getColorForLabel(item.label)[0]}`}> | |
| {(item.score * 100).toFixed(2)}% | |
| </span> | |
| </div> | |
| <div className="w-full bg-gray-200 rounded-full h-2"> | |
| <div | |
| className={`h-2 rounded-full transition-all duration-1000 ease-out ${getColorForLabel(item.label)[1]}`} | |
| style={{ width: `${item.score * 100}%` }} | |
| /> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| ); | |
| } | |
| // Default: text-classification | |
| return ( | |
| <div className="space-y-6 w-full"> | |
| <div className="text-center"> | |
| <h2 className="text-2xl font-bold text-gray-800 mb-2"> | |
| {result[0].label} | |
| </h2> | |
| <div className="w-full bg-gray-200 rounded-full h-3 mb-2"> | |
| <div | |
| className={`h-3 rounded-full transition-all duration-1000 ease-out ${getColorForLabel(result[0].label)[1]}`} | |
| style={{ width: `${result[0].score * 100}%` }} | |
| /> | |
| </div> | |
| <div className="text-sm text-gray-500"> | |
| Confidence: {(result[0].score * 100).toFixed(2)}% | |
| </div> | |
| </div> | |
| <div className="border-t border-gray-200 my-4"></div> | |
| <div className="space-y-3"> | |
| {result.slice(1).map((item: any) => ( | |
| <div key={item.label} className="space-y-1"> | |
| <div className="flex justify-between items-center"> | |
| <span className="text-gray-700 text-sm">{item.label}</span> | |
| <span className={`px-2 py-0.5 rounded-full text-xs font-medium ${getColorForLabel(item.label)[0]}`}> | |
| {(item.score * 100).toFixed(2)}% | |
| </span> | |
| </div> | |
| <div className="w-full bg-gray-200 rounded-full h-2"> | |
| <div | |
| className={`h-2 rounded-full transition-all duration-1000 ease-out ${getColorForLabel(item.label)[1]}`} | |
| style={{ width: `${item.score * 100}%` }} | |
| /> | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| ); | |
| } |