/* * QimingClaw - 现代简洁全局样式 * 基于 Ant Design, 风格参考 shadcn/ui * 支持亮色/暗色主题 */ /* ========== CSS 变量 - 亮色主题 ========== */ :root, [data-theme="light"] { --color-primary: #18181b; --color-primary-hover: #27272a; --color-primary-active: #3f3f46; --color-success: #16a34a; --color-error: #EF4444; --color-warning: #F59E0B; --color-info: #3B82F6; --color-success-bg: #f0fdf4; --color-error-bg: #fef2f2; --color-warning-bg: #fffbeb; --color-bg-layout: #F8F9FA; --color-bg-container: #ffffff; --color-bg-elevated: #ffffff; --color-bg-header: #ffffff; --color-bg-sider: #ffffff; --color-bg-section: #ffffff; --color-bg-section-header: #F9FAFB; --color-border: #E5E7EB; --color-border-secondary: #F3F4F6; --color-text: #18181b; --color-text-secondary: #6B7280; --color-text-tertiary: #9CA3AF; --color-text-quaternary: #D1D5DB; --color-icon: #6B7280; --color-divider: #F3F4F6; --border-radius: 8px; --border-radius-lg: 10px; --border-radius-sm: 6px; } /* ========== CSS 变量 - 暗色主题 ========== */ [data-theme="dark"] { --color-primary: #fafafa; --color-primary-hover: #e4e4e7; --color-primary-active: #d4d4d8; --color-success: #22c55e; --color-error: #EF4444; --color-warning: #F59E0B; --color-info: #3B82F6; --color-success-bg: #052e16; --color-error-bg: #450a0a; --color-warning-bg: #422006; --color-bg-layout: #09090b; --color-bg-container: #18181b; --color-bg-elevated: #27272a; --color-bg-header: #18181b; --color-bg-sider: #18181b; --color-bg-section: #18181b; --color-bg-section-header: #27272a; --color-border: #27272a; --color-border-secondary: #3f3f46; --color-text: #fafafa; --color-text-secondary: #a1a1aa; --color-text-tertiary: #71717a; --color-text-quaternary: #52525b; --color-icon: #a1a1aa; --color-divider: #27272a; --border-radius: 8px; --border-radius-lg: 10px; --border-radius-sm: 6px; } /* ========== 基础重置 ========== */ * { margin: 0; padding: 0; box-sizing: border-box; } html, body, #root { height: 100%; width: 100%; overflow: hidden; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; color: var(--color-text); font-size: 13px; line-height: 1.5; background: var(--color-bg-layout); transition: background-color 0.2s ease, color 0.2s ease; } /* ========== 布局 ========== */ .app-container { height: 100vh; display: flex; flex-direction: column; overflow: hidden; background: var(--color-bg-layout); } .app-header { height: 48px; background: var(--color-bg-header); padding: 0 16px; display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; z-index: 100; border-bottom: 1px solid var(--color-border); } .app-header-logo { display: flex; align-items: center; gap: 8px; } .app-header-title { color: var(--color-text); font-size: 13px; font-weight: 600; margin: 0 !important; letter-spacing: -0.01em; } .app-header-update-tag { display: inline-flex; align-items: center; font-size: 11px; font-weight: 500; padding: 1px 8px; border-radius: 10px; line-height: 18px; white-space: nowrap; transition: opacity 0.2s, transform 0.15s; } .app-header-update-tag[role="button"] { cursor: pointer; } .app-header-update-tag[role="button"]:hover { opacity: 0.85; transform: scale(1.03); } .app-header-update-tag[role="button"]:active { transform: scale(0.97); } .app-header-update-tag--available { background: rgba(82, 196, 26, 0.12); color: #52c41a; border: 1px solid rgba(82, 196, 26, 0.25); } .app-header-update-tag--downloading { background: rgba(22, 119, 255, 0.1); color: #1677ff; border: 1px solid rgba(22, 119, 255, 0.2); } .app-header-update-tag--install { background: rgba(250, 173, 20, 0.12); color: #faad14; border: 1px solid rgba(250, 173, 20, 0.25); } .app-body { flex: 1; display: flex; overflow: hidden; } .app-sider { width: 140px; background: var(--color-bg-sider); overflow-y: auto; flex-shrink: 0; border-right: 1px solid var(--color-border); padding: 4px 0; } /* 英文菜单文案更长,单独加宽侧边栏,避免文本被截断 */ .app-sider.app-sider-en { width: 160px; } .app-sider .ant-menu { border-right: 0; } .app-content { flex: 1; padding: 20px 24px; background: var(--color-bg-layout); overflow-y: auto; display: flex; flex-direction: column; min-height: 0; transition: background-color 0.2s ease; } /* Full-width mode: no padding (used when webview is active) */ .app-content.app-content-fullwidth { padding: 0; overflow: hidden; } /* ========== 滚动条 ========== */ ::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-text-quaternary); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-tertiary); } /* ========== 侧边栏菜单 ========== */ /* Note: Selected colors handled by ConfigProvider in theme.ts */ .app-sider .ant-menu-light { background: transparent; border-inline-end: none; } .app-sider .ant-menu-light .ant-menu-item { height: 32px; line-height: 32px; margin: 1px 6px; padding: 0 10px !important; font-size: 13px; font-weight: 400; transition: all 0.15s ease; } .app-sider .ant-menu-light .ant-menu-item:hover { background: #F3F4F6; color: #18181b; } .app-sider .ant-menu-light .ant-menu-item .anticon { font-size: 14px; } /* ========== 按钮 ========== */ /* Note: Primary button colors handled by ConfigProvider in theme.ts */ .ant-btn { transition: all 0.15s ease; font-weight: 500; box-shadow: none; } .ant-btn-default { border-color: var(--color-border); color: var(--color-text-secondary); background: var(--color-bg-container); } .ant-btn-default:not(:disabled):hover { border-color: var(--color-border-secondary); color: var(--color-text); background: var(--color-bg-elevated); } .ant-btn-text:not(:disabled):hover { background: var(--color-bg-elevated); } /* 小号按钮更紧凑 */ .ant-btn-sm { font-size: 12px; padding: 0 8px; height: 26px; } /* ========== 卡片 ========== */ .ant-card { border: 1px solid #E5E7EB; border-radius: 10px; } .ant-card-head { min-height: auto; padding: 10px 16px; border-bottom: 1px solid #F3F4F6; font-size: 13px; } .ant-card-head-title { font-weight: 500; font-size: 13px; color: #18181b; } .ant-card-body { padding: 16px; } .ant-card-small .ant-card-head { padding: 8px 12px; } .ant-card-small .ant-card-body { padding: 12px; } /* ========== 标签 - 极简 ========== */ .ant-tag { margin-right: 0; padding: 0 6px; border-radius: 6px; font-size: 11px; font-weight: 500; line-height: 20px; border: 1px solid transparent; } .ant-tag-success, .ant-tag-green { background: #f0fdf4; color: #15803d; border-color: #dcfce7; } .ant-tag-error, .ant-tag-red { background: #FEF2F2; color: #EF4444; border-color: #FEE2E2; } .ant-tag-warning, .ant-tag-orange { background: #FFFBEB; color: #D97706; border-color: #FEF3C7; } .ant-tag-processing { background: #F3F4F6; color: #6B7280; border-color: #E5E7EB; } .ant-tag-default { background: #F3F4F6; color: #6B7280; border-color: #E5E7EB; } .ant-tag-blue { background: #EFF6FF; color: #2563EB; border-color: #DBEAFE; } .ant-tag-purple { background: #F5F3FF; color: #7C3AED; border-color: #EDE9FE; } .ant-tag-cyan { background: #ECFEFF; color: #0891B2; border-color: #CFFAFE; } /* ========== 输入框 ========== */ .ant-input, .ant-input-affix-wrapper, .ant-input-number { border-radius: 8px; border-color: #E5E7EB; } .ant-input:focus, .ant-input-affix-wrapper:focus, .ant-input-affix-wrapper-focused, .ant-input-number:focus, .ant-input-number-focused { border-color: #a1a1aa; box-shadow: 0 0 0 2px rgba(24, 24, 27, 0.05); } .ant-input:hover, .ant-input-affix-wrapper:hover, .ant-input-number:hover { border-color: #D1D5DB; } .ant-input::placeholder { color: #9CA3AF; } /* ========== 表单 ========== */ .ant-form-item-label > label { font-weight: 500; font-size: 12px; color: #6B7280; } .ant-form-item { margin-bottom: 16px; } /* ========== 列表 ========== */ .ant-list-item { transition: background-color 0.15s ease; border-radius: 8px; padding: 8px 12px; } .ant-list-item-meta-title { font-size: 13px; font-weight: 500; color: #18181b; } .ant-list-item-meta-description { font-size: 12px; color: #6B7280; } /* ========== 警告框 - 更柔和 ========== */ .ant-alert { border-radius: 8px; border-width: 1px; padding: 8px 12px; font-size: 12px; } .ant-alert-success { background: #f0fdf4; border-color: #dcfce7; } .ant-alert-warning { background: #FFFBEB; border-color: #FEF3C7; } .ant-alert-error { background: #FEF2F2; border-color: #FEE2E2; } .ant-alert-info { background: #F9FAFB; border-color: #E5E7EB; } .ant-alert-message { font-weight: 500; color: var(--color-text); font-size: 12px; } .ant-alert-description { font-size: 12px; color: var(--color-text-secondary); } /* ========== 描述列表 ========== */ .ant-descriptions-item-label { color: var(--color-text-secondary); font-size: 12px; } .ant-descriptions-item-content { font-size: 13px; color: var(--color-text); } /* ========== 开关 ========== */ /* Note: Switch colors handled by ConfigProvider in theme.ts */ /* ========== 选择器 ========== */ .ant-select-selector { border-radius: 8px; border-color: var(--color-border); } /* ========== 步骤条 ========== */ /* Note: Step colors handled by ConfigProvider in theme.ts */ /* ========== 进度条 ========== */ .ant-progress-text { font-size: 11px; color: #6B7280; } /* ========== Tabs ========== */ /* Note: Tab colors handled by ConfigProvider in theme.ts */ .ant-tabs .ant-tabs-tab { font-size: 13px; padding: 8px 0; transition: color 0.15s ease; } /* ========== Modal ========== */ .ant-modal-content { border-radius: 10px; padding: 0; } .ant-modal-header { padding: 16px 20px 12px; } .ant-modal-title { font-weight: 500; font-size: 14px; } .ant-modal-body { padding: 0 20px 16px; font-size: 13px; color: #52525b; } .ant-modal-footer { padding: 12px 20px 16px; border-top: 1px solid #F3F4F6; } /* ========== 徽章 ========== */ .ant-badge-status-text { font-size: 12px; color: #6B7280; } /* ========== Divider ========== */ .ant-divider { border-color: #F3F4F6; margin: 12px 0; } /* ========== Avatar ========== */ .ant-avatar { border: none; } /* ========== Result ========== */ .ant-result-title { font-size: 16px; font-weight: 500; color: #18181b; } .ant-result-subtitle { font-size: 13px; color: #71717a; } /* ========== 加载页面 ========== */ .app-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; background: #F8F9FA; } .app-loading-text { margin-top: 16px; color: #6B7280; font-size: 13px; } .app-loading .ant-spin-dot-item { background-color: #18181b; } /* ========== 页面通用 ========== */ .page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; } .page-title { font-size: 15px; font-weight: 600; color: #18181b; margin: 0; } .page-subtitle { font-size: 12px; color: #6B7280; margin-top: 2px; } /* 简洁的状态行 */ .status-row { display: flex; align-items: center; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #F3F4F6; } .status-row:last-child { border-bottom: none; } .status-row-label { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #3f3f46; } .status-row-value { font-size: 13px; color: #18181b; } /* 简洁信息网格 */ .info-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 24px; } .info-item { display: flex; justify-content: space-between; align-items: center; padding: 6px 0; } .info-label { font-size: 12px; color: #6B7280; } .info-value { font-size: 13px; color: #18181b; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; } /* section 分隔 */ .section { margin-bottom: 20px; background: #ffffff; border-radius: 10px; } .section-title { font-size: 12px; font-weight: 500; color: #6B7280; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; } /* ========== 消息气泡 ========== */ .message-user { background: #18181b; color: #fff; padding: 12px 16px; border-radius: 12px; max-width: 70%; margin-left: auto; } .message-assistant { background: #F3F4F6; color: #18181b; padding: 12px 16px; border-radius: 12px; max-width: 70%; } /* ============================================ 暗色主题覆盖 (Dark Theme Overrides) ============================================ */ [data-theme="dark"] { /* 侧边栏菜单 */ .app-sider .ant-menu-light .ant-menu-item:hover { background: var(--color-bg-elevated); color: var(--color-text); } /* 按钮 */ .ant-btn-default { border-color: var(--color-border); color: var(--color-text-secondary); background: var(--color-bg-container); } .ant-btn-default:not(:disabled):hover { border-color: var(--color-border-secondary); color: var(--color-text); background: var(--color-bg-elevated); } .ant-btn-text:not(:disabled):hover { background: var(--color-bg-elevated); } .ant-btn:disabled { border-color: var(--color-border); color: var(--color-text-quaternary); background: rgba(255, 255, 255, 0.04); } /* 卡片 */ .ant-card { border-color: var(--color-border); } .ant-card-head { border-bottom-color: var(--color-border); } .ant-card-head-title { color: var(--color-text); } /* 标签 */ .ant-tag-processing, .ant-tag-default { background: var(--color-bg-elevated); color: var(--color-text-secondary); border-color: var(--color-border); } /* 输入框 */ .ant-input, .ant-input-affix-wrapper, .ant-input-number { border-color: var(--color-border); background: var(--color-bg-container); } .ant-input:focus, .ant-input-affix-wrapper:focus, .ant-input-affix-wrapper-focused, .ant-input-number:focus, .ant-input-number-focused { border-color: var(--color-text-tertiary); } .ant-input:hover, .ant-input-affix-wrapper:hover, .ant-input-number:hover { border-color: var(--color-border-secondary); } .ant-input::placeholder { color: var(--color-text-quaternary); } /* 表单 */ .ant-form-item-label > label { color: var(--color-text-secondary); } /* 列表 */ .ant-list-item-meta-title { color: var(--color-text); } .ant-list-item-meta-description { color: var(--color-text-tertiary); } /* 警告框 */ .ant-alert-info, .ant-alert-success, .ant-alert-warning, .ant-alert-error { background: var(--color-bg-elevated); border-color: var(--color-border); } .ant-alert-message { color: var(--color-text); } .ant-alert-description { color: var(--color-text-secondary); } /* 描述列表 */ .ant-descriptions-item-label { color: var(--color-text-tertiary); } .ant-descriptions-item-content { color: var(--color-text); } /* 选择器 */ .ant-select-selector { border-color: var(--color-border) !important; background: var(--color-bg-container) !important; } .ant-select-dropdown { background: var(--color-bg-elevated) !important; } .ant-select-item { color: var(--color-text) !important; } .ant-select-item-option-active { background: var(--color-bg-elevated) !important; } .ant-select-item-option-selected { background: var(--color-bg-elevated) !important; color: var(--color-text) !important; } .ant-select-item:hover { background: var(--color-primary-hover) !important; color: var(--color-text) !important; } /* 进度条 */ .ant-progress-text { color: var(--color-text-secondary); } /* 开关 — darkAlgorithm + ConfigProvider token 已处理,无需额外覆盖 */ /* Modal */ .ant-modal-body { color: var(--color-text-secondary); } .ant-modal-footer { border-top-color: var(--color-border); } /* 徽章 */ .ant-badge-status-text { color: var(--color-text-secondary); } /* Divider */ .ant-divider { border-color: var(--color-border); } /* Result */ .ant-result-title { color: var(--color-text); } .ant-result-subtitle { color: var(--color-text-secondary); } /* 加载页面 */ .app-loading { background: var(--color-bg-layout); } .app-loading-text { color: var(--color-text-secondary); } .app-loading .ant-spin-dot-item { background-color: var(--color-text); } /* 页面通用 */ .page-subtitle { color: var(--color-text-secondary); } /* 状态行 */ .status-row { border-bottom-color: var(--color-border); } .status-row-label { color: var(--color-text-secondary); } .status-row-value { color: var(--color-text); } /* 信息网格 */ .info-label { color: var(--color-text-tertiary); } .info-value { color: var(--color-text); } /* section */ .section { background: var(--color-bg-section); } .section-title { color: var(--color-text-tertiary); } /* 消息气泡 */ .message-user { background: var(--color-primary); color: var(--color-bg-container); } .message-assistant { background: var(--color-bg-elevated); color: var(--color-text); } }