diff --git a/src/App.tsx b/src/App.tsx index 7b8fab8..8f92382 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -244,7 +244,7 @@ function App() { }, [handleExportSessions, handleImportSessions, handleOpenSettings]) return ( -
+
{/* Title bar spacer for macOS — left area draggable, right area handles double-click */}
@@ -299,7 +299,7 @@ function App() { {isMobile && ( diff --git a/src/components/PortForwardView.tsx b/src/components/PortForwardView.tsx index b8b978c..f3c32c4 100644 --- a/src/components/PortForwardView.tsx +++ b/src/components/PortForwardView.tsx @@ -168,11 +168,11 @@ export default function PortForwardView({ tabId, isActive: _isActive = true }: P {needsReconnect && currentTab?.sessionId && (
-
+
-
会话已恢复
-
+
会话已恢复
+
上次关闭时的端口转发标签已恢复
需要重新建立 SSH 连接才能使用
@@ -181,7 +181,7 @@ export default function PortForwardView({ tabId, isActive: _isActive = true }: P updateTab(tabId, { needsReconnect: false }) // 刷新页面或触发连接逻辑 }} - className="px-6 py-2.5 bg-accent-blue hover:bg-blue-500 text-white rounded-lg transition-colors" + className="px-6 py-2.5 bg-surface-baseccent-blue hover:bg-surface-baselue-500 text-content-primary rounded-lg transition-colors" > 重新连接 @@ -194,8 +194,8 @@ export default function PortForwardView({ tabId, isActive: _isActive = true }: P
-

端口转发

-

+

端口转发

+

{connection ? `已连接: ${connection.config.username}@${connection.config.host}` : '未连接 - 请先建立 SSH 连接'} @@ -205,7 +205,7 @@ export default function PortForwardView({ tabId, isActive: _isActive = true }: P diff --git a/src/components/QuickConnectDialog.tsx b/src/components/QuickConnectDialog.tsx index 444682e..8fa9ebb 100644 --- a/src/components/QuickConnectDialog.tsx +++ b/src/components/QuickConnectDialog.tsx @@ -60,22 +60,22 @@ export default function QuickConnectDialog({ isOpen, onClose }: QuickConnectDial } return ( -

+
{/* Header */}
-
+
-

快速连接

-

临时连接到服务器

+

快速连接

+

临时连接到服务器

@@ -86,7 +86,7 @@ export default function QuickConnectDialog({ isOpen, onClose }: QuickConnectDial {/* Host and Port */}
-
-
{/* Username */}
-
{/* Password */}
-
@@ -155,7 +155,7 @@ export default function QuickConnectDialog({ isOpen, onClose }: QuickConnectDial {/* Hint */}
-

+

快速连接不会保存会话信息。如需保存,请使用"新建会话"。

@@ -165,14 +165,14 @@ export default function QuickConnectDialog({ isOpen, onClose }: QuickConnectDial @@ -168,7 +168,7 @@ export default function SessionDialog({ isOpen, onClose, editSession }: SessionD {/* Basic info */}
-
-
-
-
@@ -232,7 +232,7 @@ export default function SessionDialog({ isOpen, onClose, editSession }: SessionD {/* Authentication */}
-
- + setSetting('idleTimeoutMs', (parseInt(e.target.value) || 5) * 60000)} - className="w-full mt-1 px-3 py-2 bg-dark-900 border border-dark-700/30 rounded-lg text-gray-300 focus:outline-none focus:border-accent-blue" + className="w-full mt-1 px-3 py-2 bg-dark-900 border border-dark-700/30 rounded-lg text-content-secondary focus:outline-none focus:border-accent-blue" /> -
无操作后进入挂起
+
无操作后进入挂起
- + setSetting('suspendTimeoutMs', (parseInt(e.target.value) || 30) * 60000)} - className="w-full mt-1 px-3 py-2 bg-dark-900 border border-dark-700/30 rounded-lg text-gray-300 focus:outline-none focus:border-accent-blue" + className="w-full mt-1 px-3 py-2 bg-dark-900 border border-dark-700/30 rounded-lg text-content-secondary focus:outline-none focus:border-accent-blue" /> -
挂起后自动断开
+
挂起后自动断开
@@ -571,11 +571,11 @@ export default function SettingsView() {
- +
-

OpsXShell

-

版本 {appVersion}

-

+

OpsXShell

+

版本 {appVersion}

+

跨平台 SSH/SFTP 终端工具 · 简洁高效 · 安全可靠 · 操作便捷人性化

@@ -595,8 +595,8 @@ export default function SettingsView() { ['Lucide React', '0.294+'], ].map(([name, ver]) => (
- {name} - {ver} + {name} + {ver}
))}
@@ -604,10 +604,10 @@ export default function SettingsView() { 开源许可 -

+

OpsXShell 基于 MIT 许可证开源。本项目使用了以下开源组件:

-
    +
    • ssh2 — MIT License
    • xterm.js — MIT License
    • zmodem-ts — MIT License
    • @@ -631,18 +631,18 @@ export default function SettingsView() { {/* 搜索框 */}
      - + setSearchQuery(e.target.value)} - className="w-full pl-8 pr-8 py-1.5 text-sm bg-dark-900 border border-dark-700/30 rounded-lg text-gray-300 placeholder-gray-600 focus:outline-none focus:border-accent-blue/60" + className="w-full pl-8 pr-8 py-1.5 text-sm bg-dark-900 border border-dark-700/30 rounded-lg text-content-secondary placeholder-ph focus:outline-none focus:border-accent-blue/60" /> {searchQuery && ( @@ -661,14 +661,14 @@ export default function SettingsView() { onClick={() => setActiveTab(tab.id)} className={`w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-all ${ active - ? 'bg-accent-blue text-white shadow-sm' - : 'text-gray-400 hover:bg-dark-700/50 hover:text-gray-200' + ? 'bg-surface-baseccent-blue text-content-primary shadow-sm' + : 'text-txt-muted hover:bg-dark-700/50 hover:text-content-primary' }`} > - +
      {tab.label}
      -
      +
      {tab.description}
      @@ -682,8 +682,8 @@ export default function SettingsView() {
      {/* Header bar */}
      -

      {currentMeta.label}

      -

      {currentMeta.description}

      +

      {currentMeta.label}

      +

      {currentMeta.description}

      {/* 内容 */} @@ -727,7 +727,7 @@ function SettingSectionTitle({ className?: string }) { return ( -
      +
      {children}
      ) @@ -748,13 +748,13 @@ function SettingToggle({ return (
      -
      {label}
      -
      {description}
      +
      {label}
      +
      {description}
      diff --git a/src/components/StatusBar.tsx b/src/components/StatusBar.tsx index 2ba83ea..6f5c80d 100644 --- a/src/components/StatusBar.tsx +++ b/src/components/StatusBar.tsx @@ -54,7 +54,7 @@ const STATUS_CONFIG: Record = { disconnected: { icon: , label: '未连接', - colorClass: 'text-gray-400', + colorClass: 'text-txt-muted', animateClass: '', }, } @@ -163,7 +163,7 @@ export default function StatusBar() { : null return ( -
      +
      {/* Left: Connection status area — clickable to toggle ConnectionPanel */} {/* Center: Transfer stats */} {transferLabel && ( -
      +
      {transferLabel}
      @@ -204,11 +204,11 @@ export default function StatusBar() { {/* Right: Clock + version */}
      -
      +
      {formatTime(currentTime)}
      - OpsXShell v{version} + OpsXShell v{version}
      ) diff --git a/src/components/TabBar.tsx b/src/components/TabBar.tsx index 9596826..80e208b 100644 --- a/src/components/TabBar.tsx +++ b/src/components/TabBar.tsx @@ -137,7 +137,7 @@ function TabBar() { {/* Add Tab Button */} diff --git a/src/components/WelcomeView.tsx b/src/components/WelcomeView.tsx index 23d509d..b454387 100644 --- a/src/components/WelcomeView.tsx +++ b/src/components/WelcomeView.tsx @@ -27,7 +27,7 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie
      - +
      @@ -36,12 +36,12 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie onClick={onQuickConnect} className="flex items-center gap-4 p-6 bg-dark-800 hover:bg-dark-700 rounded-xl border border-dark-700/30 hover:border-accent-blue transition-all group" > -
      +
      -
      快速连接
      -
      输入地址快速建立连接
      +
      快速连接
      +
      输入地址快速建立连接
      @@ -49,12 +49,12 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie onClick={onNewSession} className="flex items-center gap-4 p-6 bg-dark-800 hover:bg-dark-700 rounded-xl border border-dark-700/30 hover:border-accent-green transition-all group" > -
      - +
      +
      -
      新建会话
      -
      创建并保存新的会话
      +
      新建会话
      +
      创建并保存新的会话
      @@ -62,12 +62,12 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie onClick={() => addTab({ title: 'SFTP', type: 'sftp' })} className="flex items-center gap-4 p-6 bg-dark-800 hover:bg-dark-700 rounded-xl border border-dark-700/30 hover:border-accent-purple transition-all group" > -
      +
      -
      SFTP 传输
      -
      可视化文件管理
      +
      SFTP 传输
      +
      可视化文件管理
      @@ -79,15 +79,15 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie
      -
      端口转发
      -
      本地/远程/SOCKS5 代理
      +
      端口转发
      +
      本地/远程/SOCKS5 代理
      {/* Recent connections */}
      -

      最近连接

      +

      最近连接

      {recentSessions.length === 0 ? (
      -
      {session.name}
      -
      +
      {session.name}
      +
      {session.username}@{session.host}{session.port !== 22 ? `:${session.port}` : ''}
      - -- + -- ))}
      @@ -119,7 +119,7 @@ export default function WelcomeView({ onNewSession, onQuickConnect }: WelcomeVie
      {/* Shortcuts hint */} -
      +
      快捷键: Ctrl+N 新建会话 Ctrl+K 快速连接 diff --git a/src/components/common/Button.tsx b/src/components/common/Button.tsx index 17aba34..d4913b6 100644 --- a/src/components/common/Button.tsx +++ b/src/components/common/Button.tsx @@ -20,10 +20,10 @@ interface ButtonProps extends ButtonHTMLAttributes { } const variantStyles = { - primary: 'bg-accent-blue hover:bg-blue-600 text-white', - secondary: 'bg-dark-700 hover:bg-dark-600 text-gray-200', - danger: 'bg-red-600 hover:bg-red-500 text-white', - ghost: 'hover:bg-dark-700 text-gray-400 hover:text-gray-200', + primary: 'bg-surface-baseccent-blue hover:bg-surface-baselue-600 text-content-primary', + secondary: 'bg-dark-700 hover:bg-dark-600 text-content-primary', + danger: 'bg-red-600 hover:bg-red-500 text-content-primary', + ghost: 'hover:bg-dark-700 text-txt-muted hover:text-content-primary', } const sizeStyles = { diff --git a/src/components/common/CommandPalette.tsx b/src/components/common/CommandPalette.tsx index 874ee44..e3d7af4 100644 --- a/src/components/common/CommandPalette.tsx +++ b/src/components/common/CommandPalette.tsx @@ -45,9 +45,9 @@ interface CommandPaletteProps { // ─── 类型 badge 颜色映射 ────────────────────────────────────────────── const TYPE_BADGE: Record = { - command: { label: '命令', className: 'bg-accent-blue/20 text-accent-blue' }, - session: { label: '会话', className: 'bg-accent-green/20 text-accent-green' }, - snippet: { label: '片段', className: 'bg-accent-purple/20 text-accent-purple' }, + command: { label: '命令', className: 'bg-surface-baseccent-blue/20 text-accent-blue' }, + session: { label: '会话', className: 'bg-surface-baseccent-green/20 text-accent-green' }, + snippet: { label: '片段', className: 'bg-surface-baseccent-purple/20 text-accent-purple' }, } // ─── 组件 ────────────────────────────────────────────────────────────── @@ -305,7 +305,7 @@ export function CommandPalette({ onKeyDown={handleKeyDown} > {/* Backdrop */} -
      +
      {/* Palette container */}
      {/* Search input */}
      - + setQuery(e.target.value)} placeholder="搜索命令、会话或片段..." - className="flex-1 bg-transparent text-gray-200 placeholder-gray-500 outline-none text-sm" + className="flex-1 bg-transparent text-content-primary placeholder-ph outline-none text-sm" autoComplete="off" spellCheck={false} /> - + ESC
      @@ -335,10 +335,10 @@ export function CommandPalette({ {/* Results list */}
      {filteredItems.length === 0 ? ( -
      +

      没有找到匹配的结果

      -

      试试其他关键词

      +

      试试其他关键词

      ) : ( groupedItems.map((group) => { @@ -348,14 +348,14 @@ export function CommandPalette({ return (
      {/* Group header */} -
      +
      {TYPE_BADGE[group.type].label} - {group.items.length} + {group.items.length}
      {/* Group items */} @@ -369,8 +369,8 @@ export function CommandPalette({ className={` flex items-center gap-3 px-4 py-2 cursor-pointer transition-colors duration-75 ${isSelected - ? 'bg-accent-blue/15 text-gray-100' - : 'text-gray-300 hover:bg-dark-700' + ? 'bg-surface-baseccent-blue/15 text-content-primary' + : 'text-content-secondary hover:bg-dark-700' } `} onClick={() => { @@ -382,7 +382,7 @@ export function CommandPalette({ {/* Icon */} {item.icon} @@ -392,7 +392,7 @@ export function CommandPalette({
      {item.label}
      {item.description && ( -
      +
      {item.description}
      )} @@ -400,7 +400,7 @@ export function CommandPalette({ {/* Shortcut */} {item.shortcut && ( - + {item.shortcut} )} @@ -421,7 +421,7 @@ export function CommandPalette({
      {/* Footer hint */} -
      +
      ↑↓ diff --git a/src/components/common/ConfirmDialog.tsx b/src/components/common/ConfirmDialog.tsx index 7396063..2d9de57 100644 --- a/src/components/common/ConfirmDialog.tsx +++ b/src/components/common/ConfirmDialog.tsx @@ -94,7 +94,7 @@ export function useConfirmDialog() { {state.danger && ( )} -

      {state.message}

      +

      {state.message}

      ) diff --git a/src/components/common/DefaultFallback.tsx b/src/components/common/DefaultFallback.tsx index ca0850c..d1155e9 100644 --- a/src/components/common/DefaultFallback.tsx +++ b/src/components/common/DefaultFallback.tsx @@ -18,13 +18,13 @@ export default function DefaultFallback({ error, onReset }: DefaultFallbackProps
      -

      出错了

      -

      应用遇到意外问题

      +

      出错了

      +

      应用遇到意外问题

      -

      {appError.message}

      +

      {appError.message}

      {appError.recoverable && (

      此错误可以恢复,请尝试刷新页面

      )} @@ -33,19 +33,19 @@ export default function DefaultFallback({ error, onReset }: DefaultFallbackProps
      -

      +

      如果问题持续存在,请检查日志或联系支持

      diff --git a/src/components/common/EmptyState.tsx b/src/components/common/EmptyState.tsx index e59b23e..158dccb 100644 --- a/src/components/common/EmptyState.tsx +++ b/src/components/common/EmptyState.tsx @@ -38,10 +38,10 @@ export default function EmptyState({
      {/* 标题 */} -

      {title}

      +

      {title}

      {/* 描述 */} -

      {description}

      +

      {description}

      {/* 操作按钮 */} {action && ( diff --git a/src/components/common/Loading.tsx b/src/components/common/Loading.tsx index 3d88548..dfa853a 100644 --- a/src/components/common/Loading.tsx +++ b/src/components/common/Loading.tsx @@ -50,7 +50,7 @@ export default function Loading({
      {text && ( - {text} + {text} )}
      ) diff --git a/src/components/common/Modal.tsx b/src/components/common/Modal.tsx index 3cc56b1..ae1e96e 100644 --- a/src/components/common/Modal.tsx +++ b/src/components/common/Modal.tsx @@ -74,7 +74,7 @@ export default function Modal({
      {/* 遮罩 */}
      @@ -82,12 +82,12 @@ export default function Modal({
      {/* 头部 */}
      -

      {title}

      +

      {title}

      diff --git a/src/components/common/PromptDialog.tsx b/src/components/common/PromptDialog.tsx index 26be7e8..0d0c49b 100644 --- a/src/components/common/PromptDialog.tsx +++ b/src/components/common/PromptDialog.tsx @@ -104,7 +104,7 @@ export function usePromptDialog() { cancelText={state.cancelText} >
      -

      {state.message}

      +

      {state.message}

      setState((prev) => ({ ...prev, value: e.target.value }))} onKeyDown={handleKeyDown} placeholder={state.placeholder} - className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-accent-blue" + className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-content-primary placeholder-ph focus:outline-none focus:border-accent-blue" />
      diff --git a/src/components/common/Skeleton.tsx b/src/components/common/Skeleton.tsx index a3e0cda..0f984d9 100644 --- a/src/components/common/Skeleton.tsx +++ b/src/components/common/Skeleton.tsx @@ -257,7 +257,7 @@ export function TabContentSkeleton({ className }: TabContentSkeletonProps) { return (
      @@ -287,7 +287,7 @@ export function TabContentSkeleton({ className }: TabContentSkeletonProps) {
      $
      diff --git a/src/components/common/Toast.tsx b/src/components/common/Toast.tsx index 32d59b8..4d75a76 100644 --- a/src/components/common/Toast.tsx +++ b/src/components/common/Toast.tsx @@ -32,13 +32,13 @@ const colorMap: Record - +
      ) diff --git a/src/components/common/ToastContainer.tsx b/src/components/common/ToastContainer.tsx index fba3849..340b213 100644 --- a/src/components/common/ToastContainer.tsx +++ b/src/components/common/ToastContainer.tsx @@ -18,7 +18,7 @@ const iconMap: Record = { } const bgMap: Record = { - info: 'bg-blue-900/80 border-blue-700', + info: 'bg-surface-baselue-900/80 border-blue-700', success: 'bg-green-900/80 border-green-700', error: 'bg-red-900/80 border-red-700', warning: 'bg-yellow-900/80 border-yellow-700', @@ -32,7 +32,7 @@ export function ToastContainer({ toasts, onRemove }: ToastContainerProps) { {toasts.map((toast) => (
      {iconMap[toast.type]} {toast.message} @@ -40,7 +40,7 @@ export function ToastContainer({ toasts, onRemove }: ToastContainerProps) { onClick={() => onRemove(toast.id)} className="p-0.5 hover:bg-white/10 rounded" > - +
      ))} diff --git a/src/components/sftp/Breadcrumb.tsx b/src/components/sftp/Breadcrumb.tsx index 8471f18..35b272f 100644 --- a/src/components/sftp/Breadcrumb.tsx +++ b/src/components/sftp/Breadcrumb.tsx @@ -20,11 +20,11 @@ export function Breadcrumb({ path, onNavigate, onHome }: BreadcrumbProps) { className="p-1.5 hover:bg-dark-700 rounded transition-colors flex-shrink-0" title="主目录" > - + @@ -33,7 +33,7 @@ export function Breadcrumb({ path, onNavigate, onHome }: BreadcrumbProps) { diff --git a/src/components/sftp/ChmodDialog.tsx b/src/components/sftp/ChmodDialog.tsx index 92e3d1e..af136bf 100644 --- a/src/components/sftp/ChmodDialog.tsx +++ b/src/components/sftp/ChmodDialog.tsx @@ -108,7 +108,7 @@ export default function ChmodDialog({ onChange={() => togglePerm(scope, perm)} className="w-4 h-4 rounded border-dark-500 bg-dark-700 text-accent-blue focus:ring-accent-blue focus:ring-offset-0" /> - {label} + {label} ) @@ -120,7 +120,7 @@ export default function ChmodDialog({ label: string }) => (
      - {label} + {label} @@ -141,14 +141,14 @@ export default function ChmodDialog({
      -

      {fileName}

      -

      {filePath}

      +

      {fileName}

      +

      {filePath}

      {/* Current octal mode display */}
      - 当前权限: + 当前权限: {octalString}
      @@ -156,9 +156,9 @@ export default function ChmodDialog({
      - 读取 (r) - 写入 (w) - 执行 (x) + 读取 (r) + 写入 (w) + 执行 (x)
      diff --git a/src/components/sftp/ConnectionPanel.tsx b/src/components/sftp/ConnectionPanel.tsx index 4f37a33..b23de8f 100644 --- a/src/components/sftp/ConnectionPanel.tsx +++ b/src/components/sftp/ConnectionPanel.tsx @@ -42,7 +42,7 @@ export function ConnectionPanel({ // Connecting State if (isConnecting) { return ( -
      +
      连接中...
      @@ -71,10 +71,10 @@ export function ConnectionPanel({ return ( <>
      - 未连接 + 未连接 diff --git a/src/components/sftp/ConnectionSelector.tsx b/src/components/sftp/ConnectionSelector.tsx index 2de403a..ceabbcf 100644 --- a/src/components/sftp/ConnectionSelector.tsx +++ b/src/components/sftp/ConnectionSelector.tsx @@ -16,14 +16,14 @@ export function ConnectionSelector({ sessions, onSelect, onClose }: ConnectionSe
      -

      选择服务器

      +

      选择服务器

      {sessions.length === 0 ? ( -
      +

      暂无保存的会话

      请先在侧边栏创建会话

      @@ -38,12 +38,12 @@ export function ConnectionSelector({ sessions, onSelect, onClose }: ConnectionSe >
      -
      {session.name}
      -
      +
      {session.name}
      +
      {session.username}@{session.host}:{session.port}
      - + ))}
      diff --git a/src/components/sftp/ContextMenu.tsx b/src/components/sftp/ContextMenu.tsx index 6349d75..7901a22 100644 --- a/src/components/sftp/ContextMenu.tsx +++ b/src/components/sftp/ContextMenu.tsx @@ -56,7 +56,7 @@ export function ContextMenu({ x, y, items, onClose }: ContextMenuProps) { onClose() }} className={`w-full flex items-center gap-3 px-4 py-2 text-sm transition-colors ${ - item.danger ? 'text-red-400 hover:bg-red-500/20' : 'text-gray-200 hover:bg-dark-700 hover:text-white' + item.danger ? 'text-red-400 hover:bg-red-500/20' : 'text-content-primary hover:bg-dark-700 hover:text-content-primary' }`} > {item.icon} diff --git a/src/components/sftp/FileListPanel.tsx b/src/components/sftp/FileListPanel.tsx index 23f27d2..e502605 100644 --- a/src/components/sftp/FileListPanel.tsx +++ b/src/components/sftp/FileListPanel.tsx @@ -156,7 +156,7 @@ export function FileListPanel({
      {/* Column Headers */} -
      +
      @@ -185,7 +185,7 @@ export function FileListPanel({ {/* Drag overlay - pointer-events-none so it doesn't interfere with drop events */} {isDragOver && ( -
      +
      拖拽文件到此处上传 @@ -195,7 +195,7 @@ export function FileListPanel({
      {/* Status Bar */} -
      +
      {loading ? '加载中...' : selected.size > 0 ? `已选择 ${selected.size} 项` : `共 ${files.length} 项`}
      diff --git a/src/components/sftp/FilePropertiesDialog.tsx b/src/components/sftp/FilePropertiesDialog.tsx index d1b3a82..8c2c484 100644 --- a/src/components/sftp/FilePropertiesDialog.tsx +++ b/src/components/sftp/FilePropertiesDialog.tsx @@ -128,13 +128,13 @@ export default function FilePropertiesDialog({
      -

      {fileName}

      -

      {typeLabel}

      +

      {fileName}

      +

      {typeLabel}

      {loading && ( -
      +
      加载详细信息...
      @@ -169,10 +169,10 @@ function PropertyRow({ }) { return (
      - {icon} - {label} + {icon} + {label} {value} diff --git a/src/components/sftp/FileRow.tsx b/src/components/sftp/FileRow.tsx index 5b93cb3..5f10648 100644 --- a/src/components/sftp/FileRow.tsx +++ b/src/components/sftp/FileRow.tsx @@ -24,7 +24,7 @@ export function FileRow({ file, isSelected, onSelect, onOpen, onContextMenu, onD draggable={file.type === 'file'} onDragStart={onDragStart} className={`h-10 flex items-center px-4 cursor-pointer border-b border-dark-700/20 transition-colors group ${ - isSelected ? 'bg-accent-blue/20 hover:bg-accent-blue/25' : 'hover:bg-dark-700/50' + isSelected ? 'bg-surface-baseccent-blue/20 hover:bg-surface-baseccent-blue/25' : 'hover:bg-dark-700/50' }`} >
      @@ -33,16 +33,16 @@ export function FileRow({ file, isSelected, onSelect, onOpen, onContextMenu, onD ) : file.type === 'symlink' ? ( ) : ( - + )} - {file.name} + {file.name} {file.type === 'symlink' && →}
      -
      {formatDate(file.modified)}
      -
      +
      {formatDate(file.modified)}
      +
      {file.type === 'directory' ? '--' : formatSize(file.size)}
      -
      +
      {file.type === 'directory' ? '文件夹' : file.type === 'symlink' diff --git a/src/components/sftp/SortHeader.tsx b/src/components/sftp/SortHeader.tsx index b46ef10..a9622ba 100644 --- a/src/components/sftp/SortHeader.tsx +++ b/src/components/sftp/SortHeader.tsx @@ -20,12 +20,12 @@ export function SortHeader({ onSort, sortField, sortOrder }: SortHeaderProps) { ] return ( -
      +
      {fields.map(({ key, label, width, align }) => (
      -
      {task.fileName}
      +
      {task.fileName}
      {isActive && ( <>
      -
      +
      - {task.progress}% - {task.speed !== undefined && {formatSpeed(task.speed)}} + {task.progress}% + {task.speed !== undefined && {formatSpeed(task.speed)}} )} {task.status === 'pending' && ( - + 等待中 @@ -51,7 +51,7 @@ export function TransferItem({ task, onCancel, onRemove }: TransferItemProps) { )} {task.status === 'canceled' && ( - + 已取消 @@ -62,7 +62,7 @@ export function TransferItem({ task, onCancel, onRemove }: TransferItemProps) { {task.status === 'transferring' && ( @@ -61,7 +61,7 @@ export function TransferPanel({ tasks, isOpen, onToggle, onCancel, onRemove }: T )} {isOpen && tasks.length === 0 && ( -
      +
      暂无传输任务
      )} diff --git a/src/components/sidebar/SearchBox.tsx b/src/components/sidebar/SearchBox.tsx index 2fae7ab..a76a589 100644 --- a/src/components/sidebar/SearchBox.tsx +++ b/src/components/sidebar/SearchBox.tsx @@ -13,7 +13,7 @@ interface SearchBoxProps { export function SearchBox({ value, onChange, placeholder = '搜索...' }: SearchBoxProps) { return (
      - + onToggleGroup(group)} - className="w-full flex items-center gap-2 px-4 py-2 text-sm text-gray-400 hover:bg-dark-700 transition-colors" + className="w-full flex items-center gap-2 px-4 py-2 text-sm text-txt-muted hover:bg-dark-700 transition-colors" > {group === 'default' ? '默认分组' : group} - {groupSessions.length} + {groupSessions.length} {/* Sessions - CSS Grid collapse animation */} @@ -100,8 +100,8 @@ export function SessionTree({ >
      -
      {session.name}
      -
      {session.host}:{session.port}
      +
      {session.name}
      +
      {session.host}:{session.port}
      ))} diff --git a/src/components/snippets/SnippetPanel.tsx b/src/components/snippets/SnippetPanel.tsx index d97921f..03593f7 100644 --- a/src/components/snippets/SnippetPanel.tsx +++ b/src/components/snippets/SnippetPanel.tsx @@ -54,37 +54,37 @@ function SnippetFormModal({ isOpen, initial, title, confirmText, onConfirm, onCl
      {/* 名称 */}
      - + setForm((f) => ({ ...f, name: e.target.value }))} placeholder="例如:重启 Nginx" - className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-white placeholder-gray-500 focus:outline-none focus:border-accent-blue text-sm" + className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-content-primary placeholder-ph focus:outline-none focus:border-accent-blue text-sm" />
      {/* 命令内容 */}
      - +