'use client' import type { TrainingJob } from '../types' // Tab Button export function TabButton({ active, onClick, children }: { active: boolean onClick: () => void children: React.ReactNode }) { return ( ) } // Progress Ring Component export function ProgressRing({ progress, size = 120, strokeWidth = 8, color = '#10B981' }: { progress: number size?: number strokeWidth?: number color?: string }) { const radius = (size - strokeWidth) / 2 const circumference = radius * 2 * Math.PI const offset = circumference - (progress / 100) * circumference return (
{Math.round(progress)}%
) } // Mini Line Chart Component export function MiniChart({ data, color = '#10B981', height = 60 }: { data: number[] color?: string height?: number }) { if (!data.length) return null const max = Math.max(...data) const min = Math.min(...data) const range = max - min || 1 const width = 200 const padding = 4 const points = data.map((value, i) => { const x = padding + (i / (data.length - 1)) * (width - 2 * padding) const y = padding + (1 - (value - min) / range) * (height - 2 * padding) return `${x},${y}` }).join(' ') return ( {data.length > 0 && ( )} ) } // Status Badge export function StatusBadge({ status }: { status: TrainingJob['status'] }) { const styles = { queued: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300', preparing: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200', training: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200', validating: 'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-200', completed: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200', failed: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200', paused: 'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-200', } const labels = { queued: 'In Warteschlange', preparing: 'Vorbereitung', training: 'Indexierung laeuft', validating: 'Validierung', completed: 'Abgeschlossen', failed: 'Fehlgeschlagen', paused: 'Pausiert', } return ( {status === 'training' && ( )} {labels[status]} ) } // Metric Card export function MetricCard({ label, value, trend, color }: { label: string value: number | string trend?: 'up' | 'down' | 'neutral' color?: string }) { return (

{label}

{typeof value === 'number' ? value.toFixed(3) : value} {trend && ( {trend === 'up' ? '\u2191' : trend === 'down' ? '\u2193' : '\u2192'} )}
) }