Files
qiming/qimingclaw/crates/agent-electron-client/src/renderer/index.css

955 lines
18 KiB
CSS

/*
* 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);
}
}