/* 全局样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } /* CSS变量主题系统 */ :root { /* 布局尺寸 */ --navbar-height: 69px; /* 亮色主题(默认) */ --bg-primary: #f5f7fa; --bg-secondary: #ffffff; --bg-tertiary: #f8f9fb; --bg-quaternary: #f7fafc; --bg-modal: rgba(0, 0, 0, 0.5); /* 侧边栏颜色 */ --sidebar-bg: #ffffff; --sidebar-hover: #f0f2f5; --sidebar-active: #e8f4ff; --sidebar-border: #e5e7eb; --text-primary: #1f2937; --text-secondary: #4b5563; --text-tertiary: #6b7280; --text-quaternary: #9ca3af; --text-inverse: white; --border-primary: #e5e7eb; --border-secondary: #d1d5db; --border-focus: #3b82f6; --accent-primary: #3b82f6; --accent-secondary: #e5e7eb; --accent-tertiary: #f3f4f6; --primary-color: #3b82f6; --primary-hover: #2563eb; --card-bg: #ffffff; --border-color: #e5e7eb; --success-bg: #d1fae5; --success-text: #065f46; --success-border: #6ee7b7; --error-bg: #fee2e2; --error-text: #991b1b; --error-border: #fca5a5; --warning-bg: #fef3c7; --warning-text: #92400e; --warning-border: #fbbf24; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-primary: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-secondary: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-modal: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); --glass-bg: rgba(255, 255, 255, 0.95); --glass-border: rgba(229, 231, 235, 0.8); } /* 暗色主题 */ [data-theme="dark"] { --bg-primary: #111827; --bg-secondary: #1f2937; --bg-tertiary: #1a202c; --bg-quaternary: #2d3748; --bg-modal: rgba(0, 0, 0, 0.7); /* 侧边栏颜色 */ --sidebar-bg: #1f2937; --sidebar-hover: #374151; --sidebar-active: #1e3a5f; --sidebar-border: #374151; --text-primary: #f9fafb; --text-secondary: #e5e7eb; --text-tertiary: #d1d5db; --text-quaternary: #9ca3af; --text-inverse: #ffffff; --border-primary: #374151; --border-secondary: #4b5563; --border-focus: #60a5fa; --accent-primary: #3b82f6; --accent-secondary: #374151; --accent-tertiary: #1f2937; --primary-color: #60a5fa; --primary-hover: #3b82f6; --card-bg: #1f2937; --border-color: #374151; --success-bg: #064e3b; --success-text: #6ee7b7; --success-border: #059669; --error-bg: #7f1d1d; --error-text: #fca5a5; --error-border: #dc2626; --warning-bg: #78350f; --warning-text: #fbbf24; --warning-border: #f59e0b; --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3); --shadow-primary: 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2); --shadow-secondary: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2); --shadow-modal: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.3); --glass-bg: rgba(31, 41, 59, 0.95); --glass-border: rgba(75, 85, 99, 0.8); } /* 登录页面样式 */ .login-container { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--bg-primary); padding: 20px; } /* 自动登录加载页面样式 */ .auto-login-content { text-align: center; padding: 20px; } .loading-spinner { margin: 0 auto 20px; width: 60px; height: 60px; } .spinner { width: 100%; height: 100%; border: 4px solid #e5e7eb; border-top: 4px solid #3b82f6; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .auto-login-content h2 { color: var(--text-secondary); margin-bottom: 10px; font-size: 24px; font-weight: 600; } .auto-login-content p { color: var(--text-tertiary); font-size: 16px; line-height: 1.5; } /* 登录页面头部布局 */ .login-header-top { display: flex; flex-direction: column; align-items: center; margin-bottom: 30px; position: relative; } .login-title { width: 100%; text-align: center; margin-bottom: 30px; } /* 头部控制按钮组 */ .header-controls { display: flex; gap: 8px; align-items: center; height: 100%; } /* 登录页面的控制按钮组样式 */ .login-header-top .header-controls { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border-radius: 12px; padding: 8px; border: 1px solid rgba(255, 255, 255, 0.2); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; margin-top: 8px; /* 与标题拉开距离,避免遮挡 */ margin-bottom: 20px; } .login-header-top .header-controls:hover { background: rgba(255, 255, 255, 0.15); border-color: rgba(255, 255, 255, 0.3); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); transform: translateY(-1px); } [data-theme="dark"] .login-header-top .header-controls { background: rgba(30, 41, 59, 0.8); border: 1px solid rgba(100, 116, 139, 0.3); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3); } [data-theme="dark"] .login-header-top .header-controls:hover { background: rgba(30, 41, 59, 0.9); border-color: rgba(100, 116, 139, 0.5); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4); } .language-switcher, .theme-switcher { position: relative; flex-shrink: 0; display: flex; align-items: center; height: 100%; } .language-btn, .theme-btn { padding: 8px 14px; font-size: 14px; font-weight: 500; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-tertiary); transition: all 0.3s ease; white-space: nowrap; backdrop-filter: blur(5px); min-height: 36px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .top-navbar .language-btn, .top-navbar .theme-btn { padding: 6px 12px; min-height: 36px; } .top-navbar-actions .btn, .top-navbar .language-btn, .top-navbar .theme-btn { display: inline-flex; align-items: center; height: 36px; } /* 登录页面的按钮样式优化 */ .login-header-top .language-btn, .login-header-top .theme-btn { padding: 8px 12px; font-size: 13px; height: 36px; min-width: 36px; border-radius: 8px; background: rgba(255, 255, 255, 0.9); border: 1px solid rgba(255, 255, 255, 0.3); color: #64748b; backdrop-filter: blur(10px); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .login-header-top .language-btn:hover, .login-header-top .theme-btn:hover { background: rgba(255, 255, 255, 1); border-color: rgba(100, 116, 139, 0.3); color: #475569; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } [data-theme="dark"] .login-header-top .language-btn, [data-theme="dark"] .login-header-top .theme-btn { background: rgba(30, 41, 59, 0.9); border: 1px solid rgba(100, 116, 139, 0.3); color: #94a3b8; } [data-theme="dark"] .login-header-top .language-btn:hover, [data-theme="dark"] .login-header-top .theme-btn:hover { background: rgba(51, 65, 85, 0.95); border-color: rgba(100, 116, 139, 0.5); color: #cbd5e1; } .language-btn:hover, .theme-btn:hover { background: var(--accent-secondary); border-color: var(--border-secondary); color: var(--text-secondary); } .language-btn i, .theme-btn i { margin-right: 6px; } .theme-btn.active { background: var(--accent-primary); color: var(--text-inverse); } .login-card { background: var(--glass-bg); backdrop-filter: blur(10px); border-radius: 20px; padding: 40px; width: 100%; max-width: 500px; box-shadow: var(--shadow-secondary); border: 1px solid var(--glass-border); } .login-header { text-align: center; margin-bottom: 25px; } .login-title { display: flex; align-items: center; justify-content: center; gap: 15px; color: var(--text-secondary); font-size: 1.8rem; font-weight: 600; margin-bottom: 0; line-height: 1.2; } #login-logo { height: 60px; width: auto; object-fit: contain; border-radius: 6px; padding: 2px; background: #fff; border: 1px solid rgba(15, 23, 42, 0.06); box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06); } .login-subtitle { color: #64748b; font-size: 1rem; margin: 0; text-align: center; } .login-body { display: flex; flex-direction: column; gap: 24px; } .login-connection-info { background: var(--bg-tertiary); border: 1px solid var(--border-primary); border-radius: 16px; padding: 20px; display: flex; flex-direction: column; gap: 12px; } [data-theme="dark"] .login-connection-info { background: rgba(30, 41, 59, 0.7); border-color: rgba(100, 116, 139, 0.3); } .connection-summary { display: flex; align-items: center; gap: 16px; color: var(--text-secondary); } .connection-summary i { font-size: 24px; color: var(--primary-color); } .connection-url { font-size: 16px; color: var(--text-secondary); } .connection-url-separator { margin: 0 8px; color: var(--text-tertiary); } #login-connection-url { font-family: "Fira Code", "Consolas", "Courier New", monospace; color: var(--text-primary); word-break: break-all; } [data-theme="dark"] #login-connection-url { color: var(--text-secondary); } .login-form { display: flex; flex-direction: column; gap: 20px; } .login-form .form-group { margin-bottom: 25px; } .login-form .form-group label { display: block; margin-bottom: 8px; color: var(--text-secondary); font-weight: 600; font-size: 0.95rem; } .login-form .form-hint { margin-top: 6px; color: #64748b; font-size: 12px; } .login-form .input-group { display: flex; gap: 10px; align-items: center; } .login-form input[type="text"], .login-form input[type="password"] { flex: 1; padding: 14px 16px; border: 2px solid var(--border-primary); border-radius: 10px; font-size: 15px; transition: all 0.3s ease; background: var(--bg-secondary); color: var(--text-primary); } .login-form input:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--border-primary); } .login-form .btn-secondary { padding: 14px 16px; border: 2px solid #e2e8f0; background: #f8fafc; color: #64748b; border-radius: 10px; transition: all 0.3s ease; } .login-form .btn-secondary:hover { background: #e2e8f0; border-color: #cbd5e0; } .form-actions { margin-top: 30px; text-align: center; } .login-btn { width: 100%; padding: 16px 24px; font-size: 16px; font-weight: 600; border-radius: 12px; background: linear-gradient(135deg, #475569, #334155); color: white; border: none; cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; justify-content: center; gap: 10px; } .login-btn:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(51, 65, 85, 0.4); } .login-btn:disabled { opacity: 0.7; cursor: not-allowed; transform: none; } .login-error { background: var(--error-bg); border: 1px solid var(--error-border); color: var(--error-text); padding: 12px 16px; border-radius: 8px; margin-top: 20px; display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 500; } .login-error i { color: var(--error-text); } /* 响应式设计 - 登录页面 */ @media (max-width: 640px) { .login-card { padding: 30px 20px; margin: 10px; max-width: 100%; } .login-header-top { flex-direction: column; gap: 20px; align-items: center; margin-bottom: 30px; } .header-controls { flex-direction: row; justify-content: center; gap: 8px; margin-bottom: 10px; /* 在小屏幕上给控制按钮组添加下边距 */ } /* 登录页面小屏幕优化 */ .login-header-top .header-controls { margin: 8px auto 0 auto; /* 顶部留白,避免与标题拥挤 */ background: rgba(255, 255, 255, 0.08); padding: 6px; border-radius: 10px; } .login-header-top .language-btn, .login-header-top .theme-btn { padding: 6px 10px; font-size: 12px; height: 32px; min-width: 32px; } .language-btn, .theme-btn { padding: 8px 16px; font-size: 13px; height: 36px; /* 在小屏幕上稍微减小高度 */ } .login-title { font-size: 1.5rem; flex-direction: column; gap: 10px; text-align: center; justify-content: center; margin-bottom: 25px; } #login-logo { height: 50px; } .login-form .input-group { flex-direction: column; align-items: stretch; } .login-form .btn-secondary { width: 100%; margin-top: 10px; } } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif; background: var(--bg-primary); min-height: 100vh; color: var(--text-primary); transition: background-color 0.3s ease, color 0.3s ease; overflow-x: hidden; } /* 侧边栏样式 */ .layout { display: grid; grid-template-columns: 240px 1fr; min-height: calc(100vh - var(--navbar-height, 69px)); width: 100%; transition: grid-template-columns 0.3s ease; } .layout.sidebar-collapsed { grid-template-columns: 64px 1fr; } .sidebar { width: 240px; background: var(--sidebar-bg); border-right: 1px solid var(--sidebar-border); height: calc(100vh - var(--navbar-height, 69px)); position: sticky; top: var(--navbar-height, 69px); overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; z-index: 5; box-shadow: var(--shadow-sm); transition: all 0.3s ease; } .sidebar.collapsed { width: 64px; } .sidebar.collapsed .nav-item span { opacity: 0; width: 0; overflow: hidden; white-space: nowrap; } .sidebar.collapsed .nav-item { justify-content: center; padding: 10px 0; } .sidebar.collapsed .nav-item i { margin-right: 0; } /* 侧边栏切换按钮(桌面端-在顶栏) */ .sidebar-toggle-btn-desktop { display: none; width: 40px; height: 40px; border: none; background: transparent; color: var(--text-primary); border-radius: 8px; cursor: pointer; align-items: center; justify-content: center; font-size: 18px; transition: all 0.2s ease; padding: 0; } .sidebar-toggle-btn-desktop:hover { background: var(--bg-tertiary); color: var(--primary-color); } .sidebar-toggle-btn-desktop i { transition: transform 0.3s ease; } .layout.sidebar-collapsed .sidebar-toggle-btn-desktop i { transform: rotate(90deg); } /* 在大屏幕上显示桌面端切换按钮 */ @media (min-width: 1025px) { .sidebar-toggle-btn-desktop { display: flex; } } /* 侧边栏品牌区域 */ .sidebar-brand { padding: 24px 20px; border-bottom: 1px solid var(--sidebar-border); display: flex; align-items: center; gap: 12px; background: var(--sidebar-bg); } .sidebar-brand-logo { width: 36px; height: 36px; object-fit: contain; border-radius: 8px; } .sidebar-brand-text { font-size: 18px; font-weight: 600; color: var(--text-primary); line-height: 1.2; } /* 侧边栏导航菜单 */ .sidebar .nav-menu { flex: 1; padding: 16px 12px; list-style: none; } .sidebar .nav-menu li { margin-bottom: 4px; position: relative; } .sidebar .nav-item { display: flex; align-items: center; padding: 10px 14px; color: var(--text-secondary); text-decoration: none; border-radius: 8px; transition: all 0.2s ease; font-size: 14px; font-weight: 500; cursor: pointer; position: relative; } .sidebar .nav-item:hover { background: var(--sidebar-hover); color: var(--text-primary); } .sidebar .nav-item.active { background: var(--sidebar-active); color: var(--primary-color); } .sidebar .nav-item i { margin-right: 12px; width: 18px; font-size: 16px; text-align: center; transition: margin 0.3s ease; } /* 收起状态时的工具提示 */ .sidebar.collapsed .nav-menu li:hover::after { content: attr(data-tooltip); position: absolute; left: 68px; top: 50%; transform: translateY(-50%); background: var(--bg-secondary); color: var(--text-primary); padding: 8px 12px; border-radius: 6px; font-size: 13px; font-weight: 500; white-space: nowrap; box-shadow: var(--shadow-md); border: 1px solid var(--border-primary); z-index: 1000; pointer-events: none; opacity: 0; animation: tooltipFadeIn 0.2s ease forwards; } @keyframes tooltipFadeIn { to { opacity: 1; } } /* 主内容区域包装器 */ .main-wrapper { display: flex; flex-direction: column; background: var(--bg-primary); min-height: 100%; } /* 顶部导航栏 */ .top-navbar { background: var(--bg-secondary); border-bottom: 1px solid var(--border-primary); padding: 16px 24px; display: flex; justify-content: space-between; align-items: center; position: sticky; top: 0; z-index: 200; box-shadow: var(--shadow-sm); height: var(--navbar-height, 69px); min-height: var(--navbar-height, 69px); box-sizing: border-box; } .top-navbar-left { display: flex; align-items: center; gap: 12px; flex: 1; } .top-navbar-brand { display: flex; align-items: center; gap: 12px; max-width: max-content; } .top-navbar-brand-logo { width: 32px; height: 32px; object-fit: contain; border-radius: 8px; } .top-navbar-brand-text { font-size: 18px; font-weight: 600; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; } .top-navbar-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; } .top-navbar-actions>* { display: inline-flex; align-items: center; height: 36px; } .top-navbar .header-controls { display: inline-flex; align-items: center; gap: 8px; height: 100%; } .top-navbar .language-btn, .top-navbar .theme-btn { width: 36px; height: 36px; min-height: 36px; padding: 0; justify-content: center; } .top-navbar-actions .btn { height: 36px; min-height: 36px; } @media (max-width: 768px) { .top-navbar-actions { flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .top-navbar .header-controls { width: 100%; justify-content: flex-end; order: 99; gap: 8px; } .top-navbar-actions>* { height: 34px; min-height: 34px; } .top-navbar .language-btn, .top-navbar .theme-btn { width: 34px; height: 34px; } .top-navbar-actions .btn { height: 34px; min-height: 34px; padding: 0 10px; } .top-navbar-actions .btn span { display: none; } } .top-navbar .language-btn i, .top-navbar .theme-btn i { margin: 0; } .header-actions { display: flex; gap: 10px; align-items: center; } .header-actions .btn { white-space: nowrap; } @media (max-width: 768px) { .header-actions .btn span { display: none; } .header-actions .btn { padding: 6px 10px; } } /* 连接信息样式 */ .connection-info { display: grid; gap: 16px; } .info-item { display: flex; justify-content: space-between; align-items: center; padding: 14px 0; border-bottom: 1px solid var(--border-primary); } .info-item:last-child { border-bottom: none; padding-bottom: 0; } .info-label { display: flex; align-items: center; gap: 10px; color: var(--text-primary); font-weight: 500; font-size: 14px; } .info-label i { color: var(--text-tertiary); width: 18px; font-size: 16px; } .info-value { color: var(--text-secondary); font-family: 'Monaco', 'Menlo', 'Consolas', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); padding: 6px 12px; border-radius: 6px; border: 1px solid var(--border-primary); max-width: 350px; word-break: break-all; } .status-indicator { display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border-radius: 16px; font-size: 13px; font-weight: 500; } .status-indicator.connected { background: var(--success-bg); color: var(--success-text); } .status-indicator.disconnected { background: var(--error-bg); color: var(--error-text); } .status-indicator.connecting { background: var(--warning-bg); color: var(--warning-text); } /* 响应式设计 - 连接信息 */ @media (max-width: 768px) { .info-item { flex-direction: column; align-items: flex-start; gap: 8px; } .info-value { max-width: 100%; width: 100%; } } /* 主内容区域 */ .main-content { flex: 1; padding: 24px 32px; max-width: 1400px; width: 100%; margin: 0 auto; } /* 内容区域 */ .content-area { flex: 1; width: 100%; } .content-section { display: none; animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .content-section.active { display: block; } .content-section h2 { color: var(--text-primary); margin-bottom: 24px; font-size: 24px; font-weight: 600; } /* 卡片样式 */ .card { background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 12px; margin-bottom: 20px; box-shadow: var(--shadow-sm); overflow: hidden; transition: box-shadow 0.2s ease; } .card:hover { box-shadow: var(--shadow-md); } .card-header { background: var(--bg-secondary); padding: 18px 24px; border-bottom: 1px solid var(--border-primary); display: flex; justify-content: space-between; align-items: center; } .card-header h3 { color: var(--text-primary); font-size: 16px; font-weight: 600; display: flex; align-items: center; } .card-header h3 i { color: var(--text-tertiary); margin-right: 10px; font-size: 18px; } .card-content { padding: 24px; } /* 按钮样式 */ .btn { padding: 8px 16px; border: 1px solid transparent; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: 500; transition: all 0.2s ease; display: inline-flex; align-items: center; justify-content: center; gap: 6px; text-decoration: none; min-height: 36px; white-space: nowrap; outline: none; } .btn-primary { background: var(--primary-color); color: white; border-color: var(--primary-color); } .btn-primary:hover { background: var(--primary-hover); border-color: var(--primary-hover); box-shadow: 0 2px 6px rgba(59, 130, 246, 0.3); } .btn-secondary { background: var(--bg-secondary); color: var(--text-secondary); border-color: var(--border-primary); } .btn-secondary:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } .btn-danger { background: #ef4444; color: white; border-color: #ef4444; } .btn-danger:hover { background: #dc2626; border-color: #dc2626; box-shadow: 0 2px 6px rgba(239, 68, 68, 0.3); } .btn-success { background: #10b981; color: white; border-color: #10b981; } .btn-success:hover { background: #059669; border-color: #059669; box-shadow: 0 2px 6px rgba(16, 185, 129, 0.3); } .btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none !important; } .btn i { font-size: 14px; } /* 小按钮样式 - 与stat-badge高度一致 */ .btn-small { padding: 4px 12px; border: 1px solid transparent; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s ease; display: inline-flex; align-items: center; justify-content: center; gap: 5px; min-height: 28px; white-space: nowrap; } .btn-small.btn-primary { background: var(--primary-color); color: white; border-color: var(--primary-color); } .btn-small.btn-primary:hover { background: var(--primary-hover); box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3); transform: translateY(-1px); } .btn-small.btn-danger { background: #ef4444; color: white; border-color: #ef4444; } .btn-small.btn-danger:hover { background: #dc2626; box-shadow: 0 2px 4px rgba(239, 68, 68, 0.3); transform: translateY(-1px); } .btn-small.btn-info { background: #06b6d4; color: white; border-color: #06b6d4; } .btn-small.btn-info:hover { background: #0891b2; box-shadow: 0 2px 4px rgba(6, 182, 212, 0.3); transform: translateY(-1px); } .btn-small.btn-warning { background: #ff9800; color: #fff; border-color: #ff9800; cursor: default; } .btn-small.btn-warning:disabled, .btn-small.btn-warning[disabled] { background: #fb8c00; border-color: #fb8c00; color: #fff; opacity: 1; } .btn-small i { font-size: 13px; } /* 响应式调整 */ @media (max-width: 768px) { .btn-small { padding: 3px 10px; font-size: 12px; min-height: 26px; } .btn-small i { font-size: 12px; } } /* 表单元素 */ .form-group { margin-bottom: 18px; } .form-group label { display: block; margin-bottom: 8px; color: var(--text-primary); font-weight: 500; font-size: 14px; } .form-hint { font-size: 13px; color: var(--text-tertiary); margin: 6px 0 0 0; line-height: 1.5; } .input-group { display: flex; gap: 10px; align-items: center; } input[type="text"], input[type="password"], input[type="number"], input[type="url"], textarea, select { flex: 1; padding: 10px 14px; border: 1px solid var(--border-primary); border-radius: 6px; font-size: 14px; transition: all 0.2s ease; background: var(--bg-secondary); color: var(--text-primary); font-family: inherit; } input:hover, textarea:hover, select:hover { border-color: var(--border-secondary); } input:focus, textarea:focus, select:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } input::placeholder, textarea::placeholder { color: var(--text-quaternary); } /* 切换开关 */ .toggle-group { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; } .toggle-switch { position: relative; display: inline-block; width: 44px; height: 24px; } .toggle-switch input { opacity: 0; width: 0; height: 0; } /* 配置管理编辑器 */ .editor-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; } .editor-actions .btn { white-space: nowrap; } .yaml-editor-container { display: flex; flex-direction: column; gap: 12px; min-height: 520px; } #config-management .card { display: flex; flex-direction: column; min-height: calc(100vh - 360px); margin-bottom: 12px; } #config-management .card-content { flex: 1; display: flex; flex-direction: column; } #config-management .yaml-editor-container { flex: 1; display: flex; flex-direction: column; min-height: 520px; } .yaml-editor { width: 100%; flex: 1; min-height: 520px; border: 1px solid var(--border-primary); border-radius: 6px; padding: 12px 14px; background: var(--bg-secondary); color: var(--text-primary); overflow-y: auto; font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Courier New', monospace; line-height: 1.5; resize: vertical; } #config-management .CodeMirror { flex: 1; min-height: 520px; height: 100%; font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Courier New', monospace; font-size: 14px; line-height: 1.5; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 6px; overflow: hidden; } #config-management .CodeMirror-scroll { min-height: 0; height: 100%; max-height: none; overflow-y: auto; overscroll-behavior: contain; } #config-management .CodeMirror.cm-s-default { background: var(--bg-secondary); color: var(--text-primary); } #config-management .CodeMirror-gutters { background: var(--bg-secondary); border-right: 1px solid var(--border-primary); } #config-management .CodeMirror-linenumber { color: var(--text-tertiary); } #config-management .CodeMirror .CodeMirror-lines { padding: 12px; } #config-management .CodeMirror .cm-comment { color: #6b7280; } [data-theme="dark"] #config-management .CodeMirror.cm-s-default { background: var(--bg-secondary); color: var(--text-primary); } [data-theme="dark"] #config-management .CodeMirror-gutters { background: var(--bg-secondary); border-right: 1px solid var(--border-secondary); } [data-theme="dark"] #config-management .CodeMirror .cm-comment { color: #9ca3af; } #config-management .CodeMirror.cm-readonly { opacity: 0.6; } @media (max-width: 768px) { .yaml-editor-container, #config-management .yaml-editor-container { min-height: 360px; } .yaml-editor, #config-management .CodeMirror { min-height: 360px; } } .editor-status { font-size: 13px; color: var(--text-quaternary); display: flex; align-items: center; gap: 6px; min-height: 18px; } .editor-status.success { color: #059669; } .editor-status.error { color: #dc2626; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #d1d5db; transition: .3s; border-radius: 24px; } .slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .3s; border-radius: 50%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); } input:checked+.slider { background: var(--primary-color); } input:checked+.slider:before { transform: translateX(20px); } .toggle-label { color: var(--text-primary); font-weight: 500; font-size: 14px; } /* 列表样式 */ .key-list { max-height: 400px; overflow-y: auto; } .file-list { /* 认证文件列表填满页面,保留版本信息空间 */ max-height: calc(100vh - 300px); /* 减去导航栏、padding和版本信息的高度 */ overflow-y: auto; margin-right: -12px; /* 向右扩展 */ padding-right: 12px; /* 滚动条不贴着最右侧卡片,保持左右边距一致 */ } /* 认证文件Grid布局 */ .file-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; } .pagination-controls { display: flex; align-items: center; justify-content: center; gap: 12px; margin-top: 20px; flex-wrap: wrap; } .pagination-btn { gap: 6px; min-width: 120px; justify-content: center; display: inline-flex; align-items: center; } .pagination-btn:disabled { opacity: 0.5; cursor: not-allowed; } .pagination-info { font-size: 0.95rem; color: var(--text-secondary); } /* 响应式:中等屏幕2列 */ @media (max-width: 1400px) { .file-grid { grid-template-columns: repeat(2, 1fr); } } /* 响应式:小屏幕单列 */ @media (max-width: 768px) { .file-grid { grid-template-columns: 1fr; } } /* 带筛选器的卡片头部布局 */ .card-header-with-filter { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px; } .card-header-with-filter .header-left { display: flex; align-items: center; gap: 20px; flex: 1; flex-wrap: wrap; } .card-header-with-filter .header-left h3 { margin: 0; white-space: nowrap; } /* 认证文件工具栏 */ .auth-file-toolbar { display: flex; flex-wrap: wrap; gap: 18px; align-items: flex-end; margin-bottom: 18px; } .auth-file-search-group { flex: 1; min-width: 240px; display: flex; flex-direction: column; gap: 6px; } .auth-file-search-group label, .auth-file-page-size label { font-weight: 600; color: var(--text-secondary); } .auth-file-search { display: flex; align-items: center; border: 1px solid var(--border-primary); border-radius: 10px; padding: 0 12px; background: var(--bg-secondary); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.03); } [data-theme="dark"] .auth-file-search { background: var(--bg-tertiary); box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.04); } .auth-file-search i { color: var(--text-tertiary); margin-right: 8px; } .auth-file-search input { border: none; background: transparent; color: var(--text-primary); width: 100%; padding: 10px 0; font-size: 0.95rem; } .auth-file-search input:focus { outline: none; } .auth-file-page-size { min-width: 180px; display: flex; flex-direction: column; gap: 6px; } .page-size-input { display: flex; align-items: center; gap: 8px; border: 1px solid var(--border-primary); border-radius: 10px; padding: 8px 12px; background: var(--bg-quaternary); } .page-size-input input { width: 80px; padding: 6px 8px; border: 1px solid var(--border-secondary); border-radius: 6px; background: var(--bg-primary); color: var(--text-primary); } .page-size-input span { font-size: 0.9rem; color: var(--text-tertiary); } /* 认证文件筛选按钮 */ .auth-file-filter { display: flex; gap: 8px; flex-wrap: wrap; } .filter-btn { padding: 6px 16px; border: 1px solid var(--border-primary); background: var(--bg-quaternary); color: var(--text-secondary); border-radius: 6px; cursor: pointer; font-size: 0.9rem; transition: all 0.2s ease; } .filter-btn:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); } .filter-btn.active { background: var(--primary-color); color: white; border-color: var(--primary-color); } /* 文件类型标签 */ .file-type-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; margin-right: 8px; } .file-type-badge.qwen { background: #e8f5e9; color: #2e7d32; } [data-theme="dark"] .file-type-badge.qwen { background: #1b5e20; color: #81c784; } .file-type-badge.gemini { background: #e3f2fd; color: #1565c0; } [data-theme="dark"] .file-type-badge.gemini { background: #0d47a1; color: #64b5f6; } .file-type-badge.claude { background: #fce4ec; color: #c2185b; } [data-theme="dark"] .file-type-badge.claude { background: #880e4f; color: #f48fb1; } .file-type-badge.codex { background: #fff3e0; color: #ef6c00; } [data-theme="dark"] .file-type-badge.codex { background: #e65100; color: #ffb74d; } .file-type-badge.iflow { background: #f3e5f5; color: #7b1fa2; } [data-theme="dark"] .file-type-badge.iflow { background: #4a148c; color: #ce93d8; } .file-type-badge.empty { background: #f5f5f5; color: #616161; } [data-theme="dark"] .file-type-badge.empty { background: #424242; color: #bdbdbd; } /* 未知类型通用样式 */ .file-type-badge:not(.qwen):not(.gemini):not(.claude):not(.codex):not(.iflow):not(.empty) { background: #f0f0f0; color: #666666; border: 1px dashed #999999; } [data-theme="dark"] .file-type-badge:not(.qwen):not(.gemini):not(.claude):not(.codex):not(.iflow):not(.empty) { background: #3a3a3a; color: #aaaaaa; border: 1px dashed #666666; } /* 虚拟认证文件标记样式 */ .virtual-auth-badge { background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%); color: white; font-size: 13px; padding: 4px 8px; border-radius: 12px; font-weight: 500; text-align: center; display: inline-block; width: 100%; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.25); letter-spacing: 0.3px; } [data-theme="dark"] .virtual-auth-badge { background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%); box-shadow: 0 2px 4px rgba(96, 165, 250, 0.25); } .provider-list { /* 默认不限制高度,动态设置 */ min-height: 0; } .key-item, .provider-item, .file-item { background: var(--bg-quaternary); border: 1px solid var(--border-primary); border-radius: 8px; padding: 15px; margin-bottom: 10px; display: flex; flex-direction: column; transition: all 0.3s ease; position: relative; } .file-item.hidden { display: none; } .key-item:hover, .provider-item:hover, .file-item:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); transform: translateY(-1px); } .item-content { flex: 1; width: 100%; } /* 为 API Keys 和 AI Providers 的项优化按钮位置 */ .key-item .item-content, .provider-item .item-content { padding-right: 120px; /* 为按钮预留空间,防止内容重叠 */ min-width: 0; /* 确保内容可以正常换行 */ } .item-footer { display: flex; justify-content: space-between; align-items: center; margin-top: 12px; flex-wrap: wrap; gap: 10px; align-items: flex-start; } .item-stats { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } .item-actions { display: flex; gap: 8px; flex-wrap: nowrap; align-items: center; justify-content: flex-end; } /* 认证文件项的底部布局优化 - 确保状态标签和操作按钮垂直对齐 */ .file-item .item-footer { align-items: center; /* 垂直居中对齐 */ gap: 12px; /* 增加状态标签和按钮之间的间距 */ } .file-item .item-stats { align-items: center; /* 状态徽章垂直居中 */ margin: 0; /* 移除默认外边距 */ } .file-item .item-actions { align-items: center; /* 操作按钮垂直居中 */ gap: 6px; /* 按钮之间适当间距 */ } /* API Keys 和 AI Providers 的按钮组 - 绝对定位到右侧垂直居中 */ .key-item .item-actions, .provider-item .item-actions { position: absolute; top: 50%; right: 15px; transform: translateY(-50%); gap: 8px; } /* 按钮样式优化 */ .key-item .item-actions .btn, .provider-item .item-actions .btn { min-width: 40px; height: 40px; padding: 0; display: flex; align-items: center; justify-content: center; border-radius: 8px; transition: all 0.3s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .key-item .item-actions .btn:hover, .provider-item .item-actions .btn:hover { transform: scale(1.05); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); } .key-item .item-actions .btn i, .provider-item .item-actions .btn i { font-size: 16px; margin: 0; } .item-title { font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; } .item-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 4px; } .item-subtitle { color: var(--text-tertiary); font-size: 0.9rem; } .provider-item .provider-models { margin-top: 8px; display: flex; flex-wrap: wrap; } .provider-model-tag { display: inline-flex; align-items: center; gap: 4px; background: var(--bg-quinary); color: var(--text-secondary); border: 1px solid var(--border-secondary); border-radius: 14px; padding: 4px 10px; margin-right: 6px; margin-top: 6px; font-size: 0.85rem; } .provider-model-tag .model-name { font-weight: 600; } .provider-model-tag .model-alias { color: var(--text-tertiary); font-style: italic; } .item-value { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; background: var(--bg-tertiary); padding: 4px 8px; border-radius: 4px; font-size: 0.85rem; color: var(--text-secondary); word-break: break-all; } /* 状态信息 */ .status-info { background: var(--bg-quaternary); border-radius: 8px; padding: 20px; } .status-item { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px solid var(--border-primary); } .status-item:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: none; } .status-label { font-weight: 600; color: var(--text-secondary); } .status-value { color: var(--text-tertiary); } /* JSON模态框 */ .json-modal { position: fixed; z-index: 2000; left: 0; top: 0; width: 100%; height: 100%; background-color: var(--bg-modal); backdrop-filter: blur(5px); display: flex; align-items: center; justify-content: center; animation: fadeIn 0.2s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .json-modal-content { background-color: var(--bg-secondary); border-radius: 12px; width: 90%; max-width: 800px; max-height: 90vh; box-shadow: var(--shadow-modal); display: flex; flex-direction: column; animation: slideUp 0.3s ease; } @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .json-modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px; border-bottom: 1px solid var(--border-primary); } .json-modal-header h3 { margin: 0; color: var(--text-secondary); font-size: 1.1rem; font-weight: 600; display: flex; align-items: center; gap: 10px; } .json-modal-close { background: none; border: none; color: var(--text-tertiary); font-size: 24px; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: all 0.2s ease; } .json-modal-close:hover { background: var(--bg-tertiary); color: var(--text-secondary); } .json-modal-body { flex: 1; overflow-y: auto; padding: 20px 24px; min-height: 200px; max-height: calc(90vh - 160px); } .json-content { background: var(--bg-tertiary); border: 1px solid var(--border-primary); border-radius: 8px; padding: 16px; margin: 0; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Courier New', monospace; font-size: 13px; line-height: 1.6; color: var(--text-secondary); overflow-x: auto; white-space: pre; } .json-modal-footer { display: flex; justify-content: flex-end; align-items: center; gap: 10px; padding: 16px 24px; border-top: 1px solid var(--border-primary); } @media (max-width: 768px) { .json-modal-content { width: 95%; max-height: 95vh; } .json-modal-header, .json-modal-body, .json-modal-footer { padding: 16px; } .json-content { font-size: 12px; padding: 12px; } .json-modal-footer { flex-wrap: wrap; } .json-modal-footer .btn { flex: 1; min-width: 80px; } } /* 模态框 */ .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: var(--bg-modal); backdrop-filter: blur(5px); } .modal-content { background-color: var(--bg-secondary); margin: 4% auto; padding: 0; border-radius: 15px; width: 90%; max-width: 550px; max-height: 90vh; box-shadow: var(--shadow-modal); animation: modalSlideIn 0.3s ease; position: relative; display: flex; flex-direction: column; overflow: hidden; } @keyframes modalSlideIn { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } .close { color: var(--text-tertiary); position: absolute; top: 15px; right: 20px; font-size: 28px; font-weight: bold; cursor: pointer; z-index: 1001; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: all 0.3s ease; } .close:hover, .close:focus { color: var(--text-secondary); background-color: var(--bg-tertiary); } #modal-body { padding: 35px 30px 30px 30px; flex: 1; min-height: 0; overflow-y: auto; } /* 模态框标题样式 */ #modal-body h3 { color: var(--text-secondary); font-size: 1.25rem; font-weight: 600; margin: 0 0 20px 0; text-align: center; border-bottom: 2px solid var(--border-primary); padding-bottom: 12px; } /* 模态框表单组 */ #modal-body .form-group { margin-bottom: 16px; } #modal-body .form-group label { display: block; margin-bottom: 6px; color: var(--text-secondary); font-weight: 600; font-size: 14px; } #modal-body .form-group input, #modal-body .form-group textarea { width: 100%; padding: 12px 16px; border: 2px solid var(--border-primary); border-radius: 8px; font-size: 14px; transition: all 0.3s ease; background: var(--bg-tertiary); color: var(--text-primary); font-family: inherit; } #modal-body .form-group input:focus, #modal-body .form-group textarea:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--border-primary); } #modal-body .form-group textarea { resize: vertical; min-height: 80px; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; } /* 模态框按钮组 */ #modal-body .modal-actions { display: flex; justify-content: flex-end; gap: 12px; margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--border-primary); } #modal-body .modal-actions .btn { min-width: 80px; padding: 10px 20px; } /* 通知 */ .notification { position: fixed; top: 20px; right: 20px; padding: 15px 20px; border-radius: 8px; color: white; font-weight: 500; z-index: 1001; transform: translateX(400px); transition: all 0.3s ease; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2); } .notification.show { transform: translateX(0); } .notification.success { background: linear-gradient(135deg, #68d391, #38a169); } .notification.error { background: linear-gradient(135deg, #fc8181, #e53e3e); } .notification.info { background: linear-gradient(135deg, #63b3ed, #3182ce); } /* 响应式设计 */ @media (max-width: 1024px) { .layout { position: relative; grid-template-columns: 1fr; min-height: calc(100vh - var(--navbar-height, 69px)); } .sidebar { position: fixed; left: 0; top: var(--navbar-height, 69px); height: calc(100vh - var(--navbar-height, 69px)); transform: translateX(-100%); z-index: 150; box-shadow: var(--shadow-sm); background: var(--sidebar-bg); width: 240px !important; } .sidebar.mobile-open { transform: translateX(0); box-shadow: var(--shadow-secondary); } /* 移动端强制恢复侧栏展开状态 */ .sidebar.collapsed { width: 240px !important; } .sidebar.collapsed .nav-item span { opacity: 1 !important; width: auto !important; overflow: visible !important; } .sidebar.collapsed .nav-item { justify-content: flex-start !important; padding: 10px 14px !important; } .sidebar.collapsed .nav-item i { margin-right: 12px !important; } .main-wrapper { margin-left: 0; width: 100%; min-height: calc(100vh - var(--navbar-height, 69px)); overflow: hidden; } .main-content { padding: 20px 16px; } } @media (max-width: 768px) { .top-navbar { padding: 12px 16px; } .top-navbar-title { font-size: 18px; } .top-navbar-actions { gap: 6px; flex-wrap: wrap; justify-content: flex-end; } .top-navbar-actions>* { height: 34px; min-height: 34px; } .top-navbar .header-controls { height: 34px; gap: 6px; } .top-navbar-actions .btn, .top-navbar .language-btn, .top-navbar .theme-btn { height: 34px; min-height: 34px; padding: 0 10px; } .top-navbar-actions .btn span { display: none; } .btn { padding: 6px 12px; font-size: 13px; } .card { border-radius: 8px; } .card-header { padding: 16px 20px; } .card-content { padding: 20px; } .input-group { flex-direction: column; align-items: stretch; } .card-header { flex-direction: column; gap: 12px; align-items: flex-start; } .card-header .header-actions { width: 100%; justify-content: flex-start; } /* 模态框响应式 */ .modal-content { margin: 5% auto; width: 95%; max-width: none; } #modal-body { padding: 40px 20px 20px 20px; } #modal-body h3 { font-size: 18px; margin-bottom: 16px; } #modal-body .modal-actions { flex-direction: column-reverse; gap: 10px; } #modal-body .modal-actions .btn { width: 100%; margin: 0; } .content-section h2 { font-size: 20px; margin-bottom: 20px; } } /* 移动端侧边栏遮罩 */ .sidebar-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 120; } .sidebar-overlay.active { display: block; } /* 移动端菜单按钮 */ .mobile-menu-btn { display: none; width: 40px; height: 40px; background: transparent; border: none; padding: 0; cursor: pointer; color: var(--text-primary); font-size: 20px; border-radius: 8px; align-items: center; justify-content: center; transition: all 0.2s ease; } .mobile-menu-btn:hover { background: var(--bg-tertiary); color: var(--primary-color); } @media (max-width: 1024px) { .mobile-menu-btn { display: flex; } } /* 加载动画 */ .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* 空状态 */ .empty-state { text-align: center; padding: 40px 20px; color: var(--text-tertiary); } .empty-state i { font-size: 48px; margin-bottom: 16px; color: var(--border-secondary); } .empty-state h3 { margin-bottom: 8px; color: var(--text-secondary); } /* 滚动条样式 */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--bg-tertiary); border-radius: 4px; } ::-webkit-scrollbar-thumb { background: var(--border-secondary); border-radius: 4px; transition: background 0.2s ease; } ::-webkit-scrollbar-thumb:hover { background: var(--text-quaternary); } /* 侧边栏滚动条 */ .sidebar::-webkit-scrollbar { width: 6px; } .sidebar::-webkit-scrollbar-track { background: transparent; } .sidebar::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.1); border-radius: 3px; } .sidebar::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.2); } [data-theme="dark"] .sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); } [data-theme="dark"] .sidebar::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.2); } /* 连接状态指示器 */ .connection-indicator { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 8px; } .connection-indicator.connected { background-color: #68d391; box-shadow: 0 0 8px rgba(104, 211, 145, 0.6); } .connection-indicator.disconnected { background-color: #fc8181; box-shadow: 0 0 8px rgba(252, 129, 129, 0.6); } .connection-indicator.connecting { background-color: #fbb040; animation: pulse 1.5s infinite; } @keyframes pulse { 0% { opacity: 1; } 50% { opacity: 0.5; } 100% { opacity: 1; } } /* 使用统计样式 */ .stats-overview { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 30px; } .usage-filter-bar { display: flex; justify-content: flex-start; gap: 16px; flex-wrap: wrap; margin-bottom: 20px; } .usage-filter-group { display: flex; flex-direction: column; gap: 6px; min-width: 220px; } .usage-filter-group label { font-weight: 600; color: var(--text-secondary); font-size: 14px; } .model-filter-select { border: 1px solid var(--border-color); border-radius: 10px; padding: 10px 14px; background: var(--bg-primary); color: var(--text-primary); min-height: 40px; font-size: 14px; } .model-filter-select:disabled { opacity: 0.7; cursor: not-allowed; } .stat-card { background: var(--card-bg); border: 1px solid var(--border-color); border-radius: 12px; padding: 24px; display: flex; align-items: center; gap: 16px; transition: all 0.2s ease; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .stat-card:hover { border-color: var(--border-primary); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); transform: translateY(-2px); } .stat-icon { width: 50px; height: 50px; border-radius: 12px; display: flex; align-items: center; justify-content: center; background: var(--primary-color); color: white; font-size: 20px; flex-shrink: 0; } .stat-icon.success { background: #10b981; } .stat-icon.error { background: #ef4444; } .stat-content { flex: 1; } .stat-number { font-size: 28px; font-weight: 700; color: var(--text-primary); line-height: 1; margin-bottom: 4px; } .stat-label { font-size: 14px; color: var(--text-secondary); font-weight: 500; } .charts-container { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-bottom: 30px; } @media (max-width: 1200px) { .charts-container { grid-template-columns: 1fr; } } .chart-card { min-height: 400px; } .chart-container { position: relative; height: 300px; width: 100%; } .chart-controls { display: flex; gap: 8px; } .btn.btn-small { padding: 6px 12px; font-size: 12px; border-radius: 6px; border: 1px solid var(--border-color); background: var(--card-bg); color: var(--text-secondary); cursor: pointer; transition: all 0.2s ease; } .btn.btn-small:hover { border-color: var(--border-primary); color: var(--text-primary); } .btn.btn-small.active { background: var(--primary-color); border-color: var(--primary-color); color: white; } .api-stats-table { overflow-x: auto; } .stats-table { width: 100%; border-collapse: collapse; margin-top: 16px; } .stats-table th, .stats-table td { padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border-color); } .stats-table th { background: var(--bg-secondary); font-weight: 600; color: var(--text-primary); font-size: 14px; } .stats-table td { color: var(--text-secondary); font-size: 14px; } .stats-table tr:hover { background: var(--bg-secondary); } .model-details { margin-top: 8px; padding: 8px 12px; background: var(--bg-tertiary); border-radius: 6px; font-size: 12px; } .model-item { display: flex; justify-content: space-between; margin-bottom: 4px; color: var(--text-tertiary); } .model-name { font-weight: 500; color: var(--text-secondary); } .loading-placeholder { display: flex; align-items: center; justify-content: center; height: 100px; color: var(--text-tertiary); font-size: 14px; } .no-data-message { text-align: center; color: var(--text-tertiary); font-style: italic; padding: 40px; } /* 暗色主题适配 */ [data-theme="dark"] .stat-card { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } [data-theme="dark"] .stat-card:hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); } [data-theme="dark"] .btn.btn-small { background: var(--bg-tertiary); } /* 版本信息样式 */ .version-footer { margin-top: 40px; padding: 24px 0; border-top: 1px solid var(--border-primary); } .version-info { text-align: center; font-size: 13px; color: var(--text-tertiary); } .version-info .separator { margin: 0 12px; color: var(--text-quaternary); } .connection-reset-btn { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; } .connection-reset-btn i { margin: 0; } .connection-reset-btn span { font-size: 13px; } [data-theme="dark"] .connection-reset-btn { background: rgba(30, 41, 59, 0.9); border-color: rgba(100, 116, 139, 0.4); color: #cbd5e1; } [data-theme="dark"] .connection-reset-btn:hover { background: rgba(51, 65, 85, 0.95); border-color: rgba(100, 116, 139, 0.6); } .model-input-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; } .model-input-row .input-group { display: flex; gap: 8px; } .model-input-row .model-name-input, .model-input-row .model-alias-input { flex: 1; } .model-input-row .model-alias-input { max-width: 220px; } .model-input-row .model-remove-btn { align-self: center; } .api-key-input-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; } .api-key-input-group { display: flex; gap: 8px; width: 100%; } .api-key-input-group .api-key-value-input { flex: 2; } .api-key-input-group .api-key-proxy-input { flex: 1; min-width: 180px; } .api-key-input-group .api-key-remove-btn { align-self: center; } .api-key-input-list + .btn, .model-input-list + .btn, .header-input-list + .btn { margin-top: 4px; align-self: flex-start; } .header-input-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; } .header-input-row .header-input-group { display: flex; align-items: center; gap: 8px; } .header-key-input { flex: 1; } .header-value-input { flex: 2; } .header-separator { color: var(--text-tertiary); } .header-badges-wrapper { display: flex; flex-direction: column; gap: 4px; } .header-badge-list { display: flex; flex-wrap: wrap; gap: 6px; } .header-badge { background: var(--accent-tertiary); border: 1px solid var(--border-primary); border-radius: 12px; padding: 4px 8px; font-size: 12px; color: var(--text-secondary); display: inline-flex; gap: 4px; } .header-badge strong { font-weight: 600; color: var(--text-primary); } [data-theme="dark"] .header-badge { background: rgba(59, 130, 246, 0.15); border-color: rgba(59, 130, 246, 0.3); color: var(--text-secondary); } [data-theme="dark"] .header-badge strong { color: var(--text-secondary); } /* Codex OAuth 样式 */ #codex-oauth-content { transition: all 0.3s ease; } #codex-oauth-url { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #codex-oauth-url:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } #codex-oauth-status { font-weight: 500; padding: 8px 12px; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); transition: all 0.3s ease; } #codex-oauth-status.success { background: var(--success-bg); border-color: var(--success-border); color: var(--success-text); } #codex-oauth-status.error { background: var(--error-bg); border-color: var(--error-border); color: var(--error-text); } #codex-oauth-status.warning { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-text); } /* Codex OAuth 按钮样式 */ #codex-open-link, #codex-copy-link { min-width: 100px; white-space: nowrap; } #codex-open-link { background: var(--primary-color); border-color: var(--primary-color); } #codex-open-link:hover { background: var(--primary-hover); border-color: var(--primary-hover); } #codex-copy-link { background: var(--bg-secondary); border-color: var(--border-primary); color: var(--text-secondary); } #codex-copy-link:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } /* 响应式设计 - Codex OAuth */ @media (max-width: 768px) { #codex-oauth-content .input-group { flex-direction: column; align-items: stretch; } #codex-open-link, #codex-copy-link { width: 100%; margin-top: 8px; } #codex-oauth-url { font-size: 12px; } } /* Anthropic OAuth 样式 */ #anthropic-oauth-content { transition: all 0.3s ease; } #anthropic-oauth-url { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #anthropic-oauth-url:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } #anthropic-oauth-status { font-weight: 500; padding: 8px 12px; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); transition: all 0.3s ease; } #anthropic-oauth-status.success { background: var(--success-bg); border-color: var(--success-border); color: var(--success-text); } #anthropic-oauth-status.error { background: var(--error-bg); border-color: var(--error-border); color: var(--error-text); } #anthropic-oauth-status.warning { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-text); } /* Anthropic OAuth 按钮样式 */ #anthropic-open-link, #anthropic-copy-link { min-width: 100px; white-space: nowrap; } #anthropic-open-link { background: var(--primary-color); border-color: var(--primary-color); } #anthropic-open-link:hover { background: var(--primary-hover); border-color: var(--primary-hover); } #anthropic-copy-link { background: var(--bg-secondary); border-color: var(--border-primary); color: var(--text-secondary); } #anthropic-copy-link:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } /* 响应式设计 - Anthropic OAuth */ @media (max-width: 768px) { #anthropic-oauth-content .input-group { flex-direction: column; align-items: stretch; } #anthropic-open-link, #anthropic-copy-link { width: 100%; margin-top: 8px; } #anthropic-oauth-url { font-size: 12px; } } /* Gemini CLI OAuth 样式 */ #gemini-cli-oauth-content { transition: all 0.3s ease; } #gemini-cli-oauth-url { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #gemini-cli-oauth-url:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } #gemini-cli-oauth-status { font-weight: 500; padding: 8px 12px; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); transition: all 0.3s ease; } #gemini-cli-oauth-status.success { background: var(--success-bg); border-color: var(--success-border); color: var(--success-text); } #gemini-cli-oauth-status.error { background: var(--error-bg); border-color: var(--error-border); color: var(--error-text); } #gemini-cli-oauth-status.warning { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-text); } /* Gemini CLI OAuth 按钮样式 */ #gemini-cli-open-link, #gemini-cli-copy-link { min-width: 100px; white-space: nowrap; } #gemini-cli-open-link { background: var(--primary-color); border-color: var(--primary-color); } #gemini-cli-open-link:hover { background: var(--primary-hover); border-color: var(--primary-hover); } #gemini-cli-copy-link { background: var(--bg-secondary); border-color: var(--border-primary); color: var(--text-secondary); } #gemini-cli-copy-link:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } /* Gemini CLI 项目 ID 输入框样式 */ #gemini-cli-project-id { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #gemini-cli-project-id:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } /* 响应式设计 - Gemini CLI OAuth */ @media (max-width: 768px) { #gemini-cli-oauth-content .input-group { flex-direction: column; align-items: stretch; } #gemini-cli-open-link, #gemini-cli-copy-link { width: 100%; margin-top: 8px; } #gemini-cli-oauth-url { font-size: 12px; } #gemini-cli-project-id { font-size: 12px; } } /* Qwen OAuth 样式 */ #qwen-oauth-content { transition: all 0.3s ease; } #qwen-oauth-url { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #qwen-oauth-url:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } #qwen-oauth-status { font-weight: 500; padding: 8px 12px; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); transition: all 0.3s ease; } #qwen-oauth-status.success { background: var(--success-bg); border-color: var(--success-border); color: var(--success-text); } #qwen-oauth-status.error { background: var(--error-bg); border-color: var(--error-border); color: var(--error-text); } #qwen-oauth-status.warning { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-text); } /* Qwen OAuth 按钮样式 */ #qwen-open-link, #qwen-copy-link { min-width: 100px; white-space: nowrap; } #qwen-open-link { background: var(--primary-color); border-color: var(--primary-color); } #qwen-open-link:hover { background: var(--primary-hover); border-color: var(--primary-hover); } #qwen-copy-link { background: var(--bg-secondary); border-color: var(--border-primary); color: var(--text-secondary); } #qwen-copy-link:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } /* 响应式设计 - Qwen OAuth */ @media (max-width: 768px) { #qwen-oauth-content .input-group { flex-direction: column; align-items: stretch; } #qwen-open-link, #qwen-copy-link { width: 100%; margin-top: 8px; } #qwen-oauth-url { font-size: 12px; } } /* iFlow OAuth 样式 */ #iflow-oauth-content { transition: all 0.3s ease; } #iflow-oauth-url { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 13px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); color: var(--text-secondary); } #iflow-oauth-url:focus { border-color: var(--border-focus); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } #iflow-oauth-status { font-weight: 500; padding: 8px 12px; border-radius: 6px; background: var(--bg-tertiary); border: 1px solid var(--border-primary); transition: all 0.3s ease; } #iflow-oauth-status.success { background: var(--success-bg); border-color: var(--success-border); color: var(--success-text); } #iflow-oauth-status.error { background: var(--error-bg); border-color: var(--error-border); color: var(--error-text); } #iflow-oauth-status.warning { background: var(--warning-bg); border-color: var(--warning-border); color: var(--warning-text); } /* iFlow OAuth 按钮样式 */ #iflow-open-link, #iflow-copy-link { min-width: 100px; white-space: nowrap; } #iflow-open-link { background: var(--primary-color); border-color: var(--primary-color); } #iflow-open-link:hover { background: var(--primary-hover); border-color: var(--primary-hover); } #iflow-copy-link { background: var(--bg-secondary); border-color: var(--border-primary); color: var(--text-secondary); } #iflow-copy-link:hover { background: var(--bg-tertiary); border-color: var(--border-secondary); color: var(--text-primary); } /* 响应式设计 - iFlow OAuth */ @media (max-width: 768px) { #iflow-oauth-content .input-group { flex-direction: column; align-items: stretch; } #iflow-open-link, #iflow-copy-link { width: 100%; margin-top: 8px; } #iflow-oauth-url { font-size: 12px; } } /* 日志查看样式 */ .logs-container { background: var(--bg-tertiary); border-radius: 8px; padding: 16px; min-height: 500px; max-height: calc(100vh - 400px); overflow-y: auto; font-family: 'Monaco', 'Menlo', 'Consolas', 'Ubuntu Mono', monospace; } .logs-info { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid var(--border-primary); font-size: 13px; color: var(--text-tertiary); } .logs-info span { display: flex; align-items: center; gap: 6px; } .logs-text { background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 6px; padding: 16px; font-size: 13px; line-height: 1.6; color: var(--text-secondary); font-weight: 600; white-space: pre-wrap; word-wrap: break-word; max-height: calc(100vh - 480px); min-height: 450px; overflow-y: auto; margin: 0; } .logs-text .log-line { display: block; padding: 2px 0; margin: 0; color: inherit; } .logs-text .log-line + .log-line { margin-top: 2px; } .logs-text .log-status-tag { display: inline-block; padding: 0 8px; margin-right: 6px; border-radius: 6px; font-weight: 700; letter-spacing: 0.3px; } .logs-text .log-status-tag.log-status-2xx { background: rgba(16, 185, 129, 0.18); color: #047857; } .logs-text .log-status-tag.log-status-3xx { background: rgba(6, 182, 212, 0.2); color: #0f766e; } .logs-text .log-status-tag.log-status-4xx { background: rgba(251, 191, 36, 0.26); color: #92400e; } .logs-text .log-status-tag.log-status-5xx { background: rgba(239, 68, 68, 0.22); color: #b91c1c; } .logs-text .log-status-tag.log-status-1xx { background: rgba(165, 180, 252, 0.22); color: #4338ca; } /* 日志高亮样式 */ /* 时间戳高亮 */ .logs-text .log-timestamp { color: #8b5cf6; font-weight: 600; } /* 日志级别高亮 */ .logs-text .log-level { display: inline-block; padding: 1px 6px; border-radius: 4px; font-weight: 700; font-size: 0.95em; letter-spacing: 0.5px; } .logs-text .log-level-error { background: rgba(239, 68, 68, 0.20); color: #dc2626; } .logs-text .log-level-warn { background: rgba(251, 191, 36, 0.25); color: #d97706; } .logs-text .log-level-info { background: rgba(59, 130, 246, 0.20); color: #2563eb; } .logs-text .log-level-debug { background: rgba(107, 114, 128, 0.18); color: #6b7280; } /* HTTP 方法高亮 */ .logs-text .log-http-method { color: #0891b2; font-weight: 700; } /* 路径/URL 高亮 */ .logs-text .log-path { color: #059669; text-decoration: underline; text-decoration-style: dotted; text-decoration-color: rgba(5, 150, 105, 0.3); } /* IP 地址高亮 */ .logs-text .log-ip { color: #7c3aed; font-weight: 600; } /* 关键字高亮 - 成功 */ .logs-text .log-keyword-success { color: #059669; font-weight: 600; } /* 关键字高亮 - 错误 */ .logs-text .log-keyword-error { color: #dc2626; font-weight: 600; } /* 关键字高亮 - 警告 */ .logs-text .log-keyword-warn { color: #ea580c; font-weight: 600; } /* 数字和单位高亮 */ .logs-text .log-number-unit { color: #db2777; font-weight: 600; } .logs-text::-webkit-scrollbar { width: 8px; height: 8px; } .logs-text::-webkit-scrollbar-track { background: var(--bg-tertiary); border-radius: 4px; } .logs-text::-webkit-scrollbar-thumb { background: var(--border-secondary); border-radius: 4px; } .logs-text::-webkit-scrollbar-thumb:hover { background: var(--text-quaternary); } /* 空状态和错误状态 */ .logs-container .empty-state, .logs-container .error-state, .logs-container .upgrade-notice { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 300px; text-align: center; color: var(--text-tertiary); } .logs-container .empty-state i, .logs-container .error-state i, .logs-container .upgrade-notice i { font-size: 48px; margin-bottom: 16px; color: var(--border-secondary); } .logs-container .error-state i { color: var(--error-text); } .logs-container .upgrade-notice i { color: var(--primary-color); } .logs-container .empty-state p, .logs-container .error-state p, .logs-container .upgrade-notice p { margin: 4px 0; font-size: 14px; } .logs-container .empty-state p:first-of-type, .logs-container .error-state p:first-of-type { font-weight: 600; color: var(--text-secondary); font-size: 16px; } .logs-container .upgrade-notice h3 { font-weight: 600; color: var(--text-secondary); font-size: 18px; margin-bottom: 8px; } .logs-container .upgrade-notice p { color: var(--text-tertiary); max-width: 500px; line-height: 1.6; } /* 日志页面头部操作区域 */ #logs .card-header .header-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; } #logs .card-header .header-actions .toggle-group { margin-bottom: 0; } /* 响应式设计 - 日志查看 */ @media (max-width: 768px) { .logs-container { min-height: 300px; max-height: calc(100vh - 350px); padding: 12px; } .logs-text { font-size: 11px; padding: 12px; max-height: calc(100vh - 430px); min-height: 250px; } .logs-info { font-size: 12px; } #logs .card-header .header-actions { width: 100%; justify-content: flex-start; } #logs .card-header .header-actions .btn { flex: 1; min-width: 0; } #logs .card-header .header-actions .btn span { display: none; } #logs .card-header .header-actions .toggle-group { width: 100%; justify-content: space-between; } } /* 暗色主题适配 */ [data-theme="dark"] .logs-text { background: rgba(15, 23, 42, 0.5); border-color: var(--border-primary); color: var(--text-tertiary); } [data-theme="dark"] .logs-text .log-status-tag.log-status-2xx { background: rgba(16, 185, 129, 0.32); color: #6ee7b7; } [data-theme="dark"] .logs-text .log-status-tag.log-status-3xx { background: rgba(6, 182, 212, 0.34); color: #5eead4; } [data-theme="dark"] .logs-text .log-status-tag.log-status-4xx { background: rgba(251, 191, 36, 0.38); color: #fcd34d; } [data-theme="dark"] .logs-text .log-status-tag.log-status-5xx { background: rgba(239, 68, 68, 0.38); color: #fca5a5; } [data-theme="dark"] .logs-text .log-status-tag.log-status-1xx { background: rgba(165, 180, 252, 0.38); color: #c7d2fe; } [data-theme="dark"] .logs-container { background: rgba(15, 23, 42, 0.3); } /* 暗色主题 - 日志高亮样式 */ [data-theme="dark"] .logs-text .log-timestamp { color: #c4b5fd; } [data-theme="dark"] .logs-text .log-level-error { background: rgba(239, 68, 68, 0.32); color: #fca5a5; } [data-theme="dark"] .logs-text .log-level-warn { background: rgba(251, 191, 36, 0.35); color: #fbbf24; } [data-theme="dark"] .logs-text .log-level-info { background: rgba(59, 130, 246, 0.32); color: #93c5fd; } [data-theme="dark"] .logs-text .log-level-debug { background: rgba(107, 114, 128, 0.28); color: #9ca3af; } [data-theme="dark"] .logs-text .log-http-method { color: #22d3ee; } [data-theme="dark"] .logs-text .log-path { color: #34d399; text-decoration-color: rgba(52, 211, 153, 0.3); } [data-theme="dark"] .logs-text .log-ip { color: #a78bfa; } [data-theme="dark"] .logs-text .log-keyword-success { color: #34d399; } [data-theme="dark"] .logs-text .log-keyword-error { color: #f87171; } [data-theme="dark"] .logs-text .log-keyword-warn { color: #fb923c; } [data-theme="dark"] .logs-text .log-number-unit { color: #f472b6; } /* Vertex AI Credential Import */ .vertex-import-actions { text-align: left; margin-top: 10px; } .vertex-import-result { margin-top: 20px; border: 1px dashed var(--border-primary); border-radius: 12px; padding: 16px; background: var(--bg-quaternary); color: var(--text-primary); } .vertex-import-result-header { display: flex; align-items: center; gap: 8px; font-weight: 600; margin-bottom: 10px; color: var(--success-text); } .vertex-import-result ul { list-style: none; margin: 0; padding: 0; } .vertex-import-result li { margin-bottom: 6px; font-size: 14px; color: var(--text-secondary); } .vertex-import-result code { background: var(--bg-secondary); border-radius: 6px; padding: 2px 6px; font-size: 13px; color: var(--text-primary); } [data-theme="dark"] .vertex-import-result { border-color: rgba(96, 165, 250, 0.4); background: rgba(15, 23, 42, 0.4); } [data-theme="dark"] .vertex-import-result code { background: rgba(7, 11, 22, 0.8); color: #f3f4f6; } /* ===== AI提供商统计徽章样式 ===== */ /* 统计信息容器 */ .item-stats { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; } /* 统计徽章基础样式 */ .stat-badge { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: 12px; font-size: 12px; font-weight: 500; transition: all 0.2s ease; } /* 成功统计徽章 */ .stat-badge.stat-success { background-color: var(--success-bg); color: var(--success-text); border: 1px solid var(--success-border); } .stat-badge.stat-success i { font-size: 13px; } /* 失败统计徽章 */ .stat-badge.stat-failure { background-color: var(--error-bg); color: var(--error-text); border: 1px solid var(--error-border); } .stat-badge.stat-failure i { font-size: 13px; } /* 悬停效果 */ .stat-badge:hover { transform: translateY(-1px); box-shadow: var(--shadow-sm); } /* 暗色主题适配 */ [data-theme="dark"] .stat-badge.stat-success { background-color: rgba(6, 78, 59, 0.3); color: #6ee7b7; border-color: rgba(5, 150, 105, 0.5); } [data-theme="dark"] .stat-badge.stat-failure { background-color: rgba(153, 27, 27, 0.3); color: #fca5a5; border-color: rgba(220, 38, 38, 0.5); } /* 响应式设计 */ @media (max-width: 768px) { .item-stats { gap: 6px; margin-top: 8px; } .stat-badge { padding: 3px 8px; font-size: 11px; } .stat-badge i { font-size: 11px !important; } } /* 响应式设计 - API Keys 和 AI Providers 按钮优化 */ @media (max-width: 768px) { /* 移动端按钮位置调整 */ .key-item .item-actions, .provider-item .item-actions { position: relative; top: auto; right: auto; transform: none; margin-top: 12px; justify-content: flex-start; } /* 移动端移除内容右侧内边距 */ .key-item .item-content, .provider-item .item-content { padding-right: 0; } /* 移动端按钮尺寸调整 */ .key-item .item-actions .btn, .provider-item .item-actions .btn { min-width: 36px; height: 36px; } .key-item .item-actions .btn:hover, .provider-item .item-actions .btn:hover { transform: scale(1.05); } .key-item .item-actions .btn i, .provider-item .item-actions .btn i { font-size: 14px; } } #config-management .CodeMirror .CodeMirror-lines { padding: 12px; }