Spaces:
Sleeping
Sleeping
Download src/components/Examples/ExampleCard.tsx from samuellimabraz/quantum-assistant: direct link, hf CLI and curl.
- Browser
- Download file 3.5 kB
-
https://huggingface.co/spaces/samuellimabraz/quantum-assistant/resolve/main/src/components/Examples/ExampleCard.tsx
- Command line
-
hf download hf://spaces/samuellimabraz/quantum-assistant/src/components/Examples/ExampleCard.tsx
-
curl -L -o ExampleCard.tsx https://huggingface.co/spaces/samuellimabraz/quantum-assistant/resolve/main/src/components/Examples/ExampleCard.tsx
3.5 kB
| 'use client'; | |
| import { Image as ImageIcon, Code, FileQuestion, ChevronRight } from 'lucide-react'; | |
| import { clsx } from 'clsx'; | |
| import { TASK_LABELS, CATEGORY_LABELS } from '@/config/constants'; | |
| import { previewText } from '@/lib/utils/response'; | |
| import { ExpandableImage } from '../ui/ImageLightbox'; | |
| import type { DatasetExample } from '@/types'; | |
| interface ExampleCardProps { | |
| example: DatasetExample; | |
| onSelect: (example: DatasetExample) => void; | |
| isSelected?: boolean; | |
| } | |
| export function ExampleCard({ example, onSelect, isSelected }: ExampleCardProps) { | |
| const taskConfig = TASK_LABELS[example.type]; | |
| const categoryConfig = CATEGORY_LABELS[example.category]; | |
| const getTaskIcon = () => { | |
| switch (example.type) { | |
| case 'function_completion': | |
| return <Code className="w-3.5 h-3.5" />; | |
| case 'code_generation': | |
| return <Code className="w-3.5 h-3.5" />; | |
| case 'qa': | |
| return <FileQuestion className="w-3.5 h-3.5" />; | |
| } | |
| }; | |
| // Muted badge colors | |
| const badgeColors: Record<string, string> = { | |
| function_completion: 'bg-emerald-900/30 text-emerald-400 border-emerald-700/30', | |
| code_generation: 'bg-blue-900/30 text-blue-400 border-blue-700/30', | |
| qa: 'bg-amber-900/30 text-amber-400 border-amber-700/30', | |
| }; | |
| const selectExample = () => onSelect(example); | |
| return ( | |
| <div | |
| role="button" | |
| tabIndex={0} | |
| onClick={selectExample} | |
| onKeyDown={(e) => { | |
| if (e.key === 'Enter' || e.key === ' ') { | |
| e.preventDefault(); | |
| selectExample(); | |
| } | |
| }} | |
| className={clsx( | |
| 'w-full text-left p-3 rounded-lg transition-all duration-200 group cursor-pointer', | |
| 'border hover:border-teal-700/40', | |
| isSelected | |
| ? 'bg-teal-900/20 border-teal-700/40' | |
| : 'bg-zinc-800/50 border-zinc-700/30 hover:bg-zinc-800/80' | |
| )} | |
| > | |
| <div className="flex items-start gap-3"> | |
| {example.hasImage && ( | |
| <div className="flex-shrink-0 w-14 h-14" onClick={(e) => e.stopPropagation()}> | |
| {example.imageUrl ? ( | |
| <ExpandableImage | |
| src={example.imageUrl} | |
| alt="Example illustration" | |
| className="w-14 h-14 object-cover" | |
| wrapperClassName="w-14 h-14 rounded-md" | |
| /> | |
| ) : ( | |
| <div className="w-14 h-14 rounded-md bg-zinc-800 border border-zinc-700/50 flex items-center justify-center"> | |
| <ImageIcon className="w-5 h-5 text-zinc-500" /> | |
| </div> | |
| )} | |
| </div> | |
| )} | |
| <div className="flex-1 min-w-0"> | |
| <div className="flex items-center gap-2 mb-1.5 flex-wrap"> | |
| <span className={clsx('inline-flex items-center px-2 py-0.5 rounded text-[10px] font-medium border', badgeColors[example.type])}> | |
| {getTaskIcon()} | |
| <span className="ml-1">{taskConfig.label}</span> | |
| </span> | |
| <span className="text-[10px] text-zinc-500"> | |
| {categoryConfig} | |
| </span> | |
| </div> | |
| <p className="text-sm text-zinc-300 leading-snug font-mono"> | |
| {previewText(example.question, 120)} | |
| </p> | |
| </div> | |
| <ChevronRight | |
| className={clsx( | |
| 'w-4 h-4 flex-shrink-0 transition-transform duration-200', | |
| 'text-zinc-600 group-hover:text-teal-500', | |
| 'group-hover:translate-x-1' | |
| )} | |
| /> | |
| </div> | |
| </div> | |
| ); | |
| } | |