From 730186948365e2eb443adfecd6e270ee80bc7bd9 Mon Sep 17 00:00:00 2001 From: Misaka_Company Date: Wed, 1 Apr 2026 11:08:45 +0800 Subject: [PATCH] feat(ui): migrate LogPanel and SegmentedProgressBar to shadcn theming - LogPanel: Use shadcn Button, ScrollArea, and semantic color tokens - SegmentedProgressBar: Use shadcn semantic color tokens for dark mode support - Both components now properly support light/dark themes Co-Authored-By: Claude Opus 4.6 --- src/renderer/src/components/ui/LogPanel.tsx | 55 +++++++++++-------- .../components/ui/SegmentedProgressBar.tsx | 41 +++++++------- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/src/renderer/src/components/ui/LogPanel.tsx b/src/renderer/src/components/ui/LogPanel.tsx index e174ca5..7e05646 100644 --- a/src/renderer/src/components/ui/LogPanel.tsx +++ b/src/renderer/src/components/ui/LogPanel.tsx @@ -1,5 +1,8 @@ import React, { useEffect, useRef } from 'react' import { Terminal } from 'lucide-react' +import { Button } from './Button' +import { ScrollArea } from './shadcn/scroll-area' +import { cn } from '@renderer/lib/utils' import type { LogEntry, LogLevel } from '../../stores/extractorStore' interface LogPanelProps { @@ -10,15 +13,15 @@ interface LogPanelProps { const getLogColor = (level: LogLevel): string => { switch (level) { case 'error': - return 'text-red-400' + return 'text-destructive' case 'warning': - return 'text-amber-400' + return 'text-amber-500 dark:text-amber-400' case 'success': - return 'text-emerald-400' + return 'text-emerald-500 dark:text-emerald-400' case 'system': - return 'text-blue-400' + return 'text-blue-500 dark:text-blue-400' default: - return 'text-slate-400' + return 'text-muted-foreground' } } @@ -30,32 +33,36 @@ const LogPanel: React.FC = ({ logs, onClear }) => { }, [logs]) return ( -
-
-
+
+
+
执行日志
- -
-
- {logs.length === 0 ? ( -
等待执行...
- ) : ( - logs.map((log, index) => ( -
- [{log.timestamp}]{' '} - [{log.level.toUpperCase()}] {log.message} -
- )) - )} -
+
+ +
+ {logs.length === 0 ? ( +
等待执行...
+ ) : ( + logs.map((log, index) => ( +
+ [{log.timestamp}]{' '} + [{log.level.toUpperCase()}] {log.message} +
+ )) + )} +
+
+
) } diff --git a/src/renderer/src/components/ui/SegmentedProgressBar.tsx b/src/renderer/src/components/ui/SegmentedProgressBar.tsx index 741da37..61f6309 100644 --- a/src/renderer/src/components/ui/SegmentedProgressBar.tsx +++ b/src/renderer/src/components/ui/SegmentedProgressBar.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { cn } from '@renderer/lib/utils' import type { ExtractionPhase } from '../../stores/extractorStore' interface SegmentedProgressBarProps { @@ -13,11 +14,11 @@ interface SegmentedProgressBarProps { } } -const PHASES: { key: ExtractionPhase; label: string; color: string }[] = [ - { key: 'login', label: '登录', color: 'bg-purple-500' }, - { key: 'downloading', label: '下载', color: 'bg-blue-500' }, - { key: 'merging', label: '合并', color: 'bg-amber-500' }, - { key: 'importing', label: '入库', color: 'bg-emerald-500' } +const PHASES: { key: ExtractionPhase; label: string; color: string; dotColor: string }[] = [ + { key: 'login', label: '登录', color: 'bg-purple-500 dark:bg-purple-600', dotColor: 'bg-purple-600 dark:bg-purple-500' }, + { key: 'downloading', label: '下载', color: 'bg-blue-500 dark:bg-blue-600', dotColor: 'bg-blue-600 dark:bg-blue-500' }, + { key: 'merging', label: '合并', color: 'bg-amber-500 dark:bg-amber-600', dotColor: 'bg-amber-600 dark:bg-amber-500' }, + { key: 'importing', label: '入库', color: 'bg-emerald-500 dark:bg-emerald-600', dotColor: 'bg-emerald-600 dark:bg-emerald-500' } ] export const SegmentedProgressBar: React.FC = ({ @@ -58,15 +59,15 @@ export const SegmentedProgressBar: React.FC = ({ } const getStatusDot = (status: string) => { - if (status === 'completed') return 'bg-emerald-600' - if (status === 'active') return 'bg-blue-600 animate-pulse' - return 'bg-slate-300' + if (status === 'completed') return 'bg-emerald-600 dark:bg-emerald-500' + if (status === 'active') return 'bg-blue-600 dark:bg-blue-500 animate-pulse' + return 'bg-muted-foreground/30' } const getStatusText = (status: string) => { - if (status === 'completed') return 'text-emerald-600' - if (status === 'active') return 'text-blue-600 font-semibold' - return 'text-slate-400' + if (status === 'completed') return 'text-emerald-600 dark:text-emerald-400' + if (status === 'active') return 'text-blue-600 dark:text-blue-400 font-semibold' + return 'text-muted-foreground' } const getDetailText = () => { @@ -121,7 +122,7 @@ export const SegmentedProgressBar: React.FC = ({ const segments = getSegments() return ( -
+
{/* 阶段标签 */}
{PHASES.map((p, index) => { @@ -129,9 +130,9 @@ export const SegmentedProgressBar: React.FC = ({ return (
-
+
{p.label}
) @@ -139,7 +140,7 @@ export const SegmentedProgressBar: React.FC = ({
{/* 分段进度条 */} -
+
{segments.map((segment, index) => { const prevEnd = index === 0 ? 0 : segments[index - 1].end const segmentWidth = segment.end - prevEnd @@ -161,7 +162,7 @@ export const SegmentedProgressBar: React.FC = ({ }} /> {index < PHASES.length - 1 && ( -
+
)}
) @@ -170,11 +171,11 @@ export const SegmentedProgressBar: React.FC = ({ {/* 详细信息 */}
-
- 当前进度: - {getDetailText()} +
+ 当前进度: + {getDetailText()}
-
{Math.round(progress)}%
+
{Math.round(progress)}%
)