| export function studioPanelClass(extra = ''): string { |
| const classes = [ |
| 'rounded-[28px]', |
| 'border', |
| 'border-black/10', |
| 'bg-white/75', |
| 'backdrop-blur-xl', |
| 'shadow-[0_24px_80px_rgba(15,23,42,0.08)]', |
| 'dark:border-white/10', |
| 'dark:bg-black/20', |
| ] |
| if (extra.trim()) { |
| classes.push(extra.trim()) |
| } |
| return classes.join(' ') |
| } |
|
|
| export function studioStatusBadge(status: string): string { |
| switch (status) { |
| case 'running': |
| case 'connected': |
| return 'bg-emerald-500/12 text-emerald-700 ring-1 ring-emerald-500/20 dark:text-emerald-300' |
| case 'completed': |
| return 'bg-sky-500/12 text-sky-700 ring-1 ring-sky-500/20 dark:text-sky-300' |
| case 'failed': |
| case 'reject': |
| case 'disconnected': |
| return 'bg-rose-500/12 text-rose-700 ring-1 ring-rose-500/20 dark:text-rose-300' |
| case 'queued': |
| case 'pending': |
| case 'pending_confirmation': |
| case 'connecting': |
| case 'reconnecting': |
| return 'bg-amber-500/12 text-amber-700 ring-1 ring-amber-500/20 dark:text-amber-300' |
| default: |
| return 'bg-bg-secondary/50 text-text-secondary ring-1 ring-border/10' |
| } |
| } |
|
|
| export function studioSeverityBadge(severity: string): string { |
| switch (severity) { |
| case 'high': |
| return 'bg-rose-500/12 text-rose-700 ring-1 ring-rose-500/20 dark:text-rose-300' |
| case 'medium': |
| return 'bg-amber-500/12 text-amber-700 ring-1 ring-amber-500/20 dark:text-amber-300' |
| case 'low': |
| return 'bg-sky-500/12 text-sky-700 ring-1 ring-sky-500/20 dark:text-sky-300' |
| default: |
| return studioStatusBadge(severity) |
| } |
| } |
|
|
| export function formatStudioTime(value?: string | number | null): string { |
| if (!value) { |
| return 'N/A' |
| } |
|
|
| const date = new Date(value) |
| if (Number.isNaN(date.getTime())) { |
| return String(value) |
| } |
|
|
| return new Intl.DateTimeFormat('zh-CN', { |
| month: '2-digit', |
| day: '2-digit', |
| hour: '2-digit', |
| minute: '2-digit', |
| }).format(date) |
| } |
|
|
| export function truncateStudioText(value: string, max = 120): string { |
| const text = value.trim() |
| if (text.length <= max) { |
| return text |
| } |
| return `${text.slice(0, max - 1)}…` |
| } |
|
|