/* ============================================================================= 企微IT智能服务台 — 管理后台全局样式(深色科技风) ============================================================================= 说明:定义深色主题 CSS 变量 + Element Plus 深色覆盖 + 全局基础样式 参考:PRD-admin.md §10.2 视觉风格 + ARCHITECTURE-admin.md §8.5 CSS 变量 ============================================================================= */ /* -------------------------------------------------------------------------- Tailwind CSS 指令 -------------------------------------------------------------------------- */ @tailwind base; @tailwind components; @tailwind utilities; /* -------------------------------------------------------------------------- 全局 CSS 变量(深色科技风) -------------------------------------------------------------------------- */ :root { /* 背景色 */ --bg-primary: #0f172a; --bg-secondary: #1e293b; --bg-tertiary: #334155; /* 语义色 */ --accent: #3b82f6; --accent-hover: #2563eb; --accent-light: rgba(59, 130, 246, 0.15); --success: #10b981; --success-bg: rgba(16, 185, 129, 0.12); --warning: #f59e0b; --warning-bg: rgba(245, 158, 11, 0.12); --danger: #ef4444; --danger-bg: rgba(239, 68, 68, 0.12); /* 文本色 */ --text-primary: #f1f5f9; --text-secondary: #94a3b8; --text-muted: #64748b; /* 边框 */ --border: rgba(148, 163, 184, 0.12); --border-hover: rgba(148, 163, 184, 0.25); /* 圆角 */ --radius: 8px; --radius-lg: 12px; /* 阴影 */ --shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } /* -------------------------------------------------------------------------- 全局基础样式 -------------------------------------------------------------------------- */ * { margin: 0; padding: 0; box-sizing: border-box; } html, body { height: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--bg-primary); color: var(--text-primary); overflow: hidden; } #app { height: 100%; } /* 滚动条样式 */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--bg-tertiary); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); } /* 链接样式 */ a { color: var(--accent); text-decoration: none; } a:hover { text-decoration: underline; } /* 代码样式 */ code { background: var(--bg-tertiary); color: var(--accent); padding: 1px 6px; border-radius: 4px; font-size: 12px; } /* -------------------------------------------------------------------------- Element Plus 深色主题覆盖 -------------------------------------------------------------------------- */ /* --- el-table 深色覆盖 --- */ .el-table { --el-table-bg-color: var(--bg-secondary); --el-table-tr-bg-color: var(--bg-secondary); --el-table-header-bg-color: var(--bg-tertiary); --el-table-text-color: var(--text-primary); --el-table-border-color: var(--border); --el-table-row-hover-bg-color: var(--bg-tertiary); --el-table-header-text-color: var(--text-secondary); --el-table-current-row-bg-color: var(--accent-light); } .el-table th.el-table__cell { background-color: var(--bg-tertiary); } .el-table tr { background-color: var(--bg-secondary); } /* --- el-dialog 深色覆盖 --- */ .el-dialog { --el-dialog-bg-color: var(--bg-secondary); --el-dialog-title-font-size: 18px; } .el-dialog__header { border-bottom: 1px solid var(--border); } .el-dialog__title { color: var(--text-primary); } .el-dialog__body { color: var(--text-secondary); } /* --- el-form 深色覆盖 --- */ .el-form { --el-form-label-color: var(--text-secondary); } .el-form-item__label { color: var(--text-secondary); } /* --- el-input 深色覆盖 --- */ .el-input__wrapper { background-color: var(--bg-primary); border-color: var(--border); box-shadow: none; } .el-input__inner { color: var(--text-primary); } .el-input__wrapper:hover { border-color: var(--border-hover); } .el-input__wrapper.is-focus { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; } .el-input.is-disabled .el-input__wrapper { background-color: var(--bg-tertiary); } /* --- el-select 深色覆盖 --- */ .el-select .el-input__wrapper { background-color: var(--bg-primary); } .el-select-dropdown { background-color: var(--bg-secondary); border: 1px solid var(--border); } .el-select-dropdown__item { color: var(--text-secondary); } .el-select-dropdown__item.hover, .el-select-dropdown__item:hover { background-color: var(--bg-tertiary); } .el-select-dropdown__item.selected { color: var(--accent); } /* --- el-switch 深色覆盖 --- */ .el-switch.is-checked .el-switch__core { background-color: var(--success); border-color: var(--success); } .el-switch__core { background-color: var(--bg-tertiary); border-color: var(--border); } /* --- el-card 深色覆盖 --- */ .el-card { background-color: var(--bg-secondary); border-color: var(--border); } .el-card__header { border-bottom-color: var(--border); color: var(--text-primary); } .el-card__body { color: var(--text-primary); } /* --- el-button 深色覆盖 --- */ .el-button--primary { --el-button-bg-color: var(--accent); --el-button-border-color: var(--accent); --el-button-hover-bg-color: var(--accent-hover); --el-button-hover-border-color: var(--accent-hover); } .el-button--default { --el-button-bg-color: var(--bg-tertiary); --el-button-border-color: var(--border); --el-button-text-color: var(--text-secondary); --el-button-hover-bg-color: var(--bg-tertiary); --el-button-hover-border-color: var(--border-hover); --el-button-hover-text-color: var(--text-primary); } .el-button--danger { --el-button-bg-color: var(--danger); --el-button-border-color: var(--danger); } .el-button--success { --el-button-bg-color: var(--success); --el-button-border-color: var(--success); } /* --- el-tag 深色覆盖 --- */ .el-tag { --el-tag-bg-color: var(--accent-light); --el-tag-border-color: var(--accent); --el-tag-text-color: var(--accent); } .el-tag--success { --el-tag-bg-color: var(--success-bg); --el-tag-border-color: var(--success); --el-tag-text-color: var(--success); } .el-tag--warning { --el-tag-bg-color: var(--warning-bg); --el-tag-border-color: var(--warning); --el-tag-text-color: var(--warning); } .el-tag--danger { --el-tag-bg-color: var(--danger-bg); --el-tag-border-color: var(--danger); --el-tag-text-color: var(--danger); } .el-tag--info { --el-tag-bg-color: var(--bg-tertiary); --el-tag-border-color: var(--text-muted); --el-tag-text-color: var(--text-muted); } /* --- el-pagination 深色覆盖 --- */ .el-pagination { color: var(--text-secondary); } .el-pagination .btn-prev, .el-pagination .btn-next { background-color: var(--bg-tertiary); color: var(--text-secondary); } .el-pagination .el-pager li { background-color: var(--bg-tertiary); color: var(--text-secondary); } .el-pagination .el-pager li.is-active { background-color: var(--accent); color: #fff; } .el-pagination .el-pager li:hover { color: var(--accent); } /* --- el-menu 深色覆盖(侧边栏用) --- */ .el-menu { border-right: none; } .el-menu--vertical { background-color: var(--bg-secondary); } .el-menu-item { color: var(--text-secondary); } .el-menu-item:hover { background-color: var(--bg-tertiary); color: var(--text-primary); } .el-menu-item.is-active { background-color: var(--accent-light); color: var(--accent); } /* --- el-divider 深色覆盖 --- */ .el-divider { border-top-color: var(--border); } /* --- el-checkbox 深色覆盖 --- */ .el-checkbox__label { color: var(--text-secondary); } /* --- el-radio 深色覆盖 --- */ .el-radio__label { color: var(--text-secondary); } /* --- el-popover / el-tooltip 深色覆盖 --- */ .el-popper.is-dark { background-color: var(--bg-secondary); color: var(--text-primary); } /* --- el-message-box 深色覆盖 --- */ .el-message-box { background-color: var(--bg-secondary); border: 1px solid var(--border); } .el-message-box__title { color: var(--text-primary); } .el-message-box__message { color: var(--text-secondary); } /* --- el-empty 深色覆盖 --- */ .el-empty__description p { color: var(--text-muted); } /* --- el-tabs 深色覆盖 --- */ .el-tabs__item { color: var(--text-secondary); } .el-tabs__item.is-active { color: var(--accent); } .el-tabs__nav-wrap::after { background-color: var(--border); } /* --- el-breadcrumb 深色覆盖 --- */ .el-breadcrumb__item span { color: var(--text-muted); } .el-breadcrumb__item:last-child span { color: var(--text-primary); } .el-breadcrumb__inner { color: var(--text-muted); } .el-breadcrumb__inner.is-link:hover { color: var(--accent); } /* --- el-input-number 深色覆盖 --- */ .el-input-number__decrease, .el-input-number__increase { background-color: var(--bg-tertiary); color: var(--text-secondary); } .el-input-number__decrease:hover, .el-input-number__increase:hover { color: var(--accent); } /* --- el-textarea 深色覆盖 --- */ .el-textarea__inner { background-color: var(--bg-primary); border-color: var(--border); color: var(--text-primary); } .el-textarea__inner:hover { border-color: var(--border-hover); } .el-textarea__inner:focus { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; } /* -------------------------------------------------------------------------- 自定义工具类 -------------------------------------------------------------------------- */ /* 页面标题 */ .page-title { font-size: 20px; font-weight: 600; margin-bottom: 4px; color: var(--text-primary); } /* 页面描述 */ .page-desc { font-size: 13px; color: var(--text-secondary); margin-bottom: 24px; } /* 统计卡片网格 */ .stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; } @media (max-width: 1200px) { .stats-grid { grid-template-columns: repeat(2, 1fr); } } /* 双栏布局 */ .two-column { display: grid; grid-template-columns: 2fr 1fr; gap: 16px; } /* 功能卡片网格 */ .feature-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; } @media (max-width: 1200px) { .feature-grid { grid-template-columns: 1fr; } } /* 集成卡片网格 */ .integration-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; } @media (max-width: 1400px) { .integration-grid { grid-template-columns: repeat(2, 1fr); } } /* 表格容器 */ .table-wrapper { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; } /* 表格标题行 */ .table-header-row { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--border); } .table-header-row .table-title { font-size: 15px; font-weight: 600; } /* 分类标签 */ .category-tabs { display: flex; gap: 8px; flex-wrap: wrap; } /* 弹性标签容器 */ .tag-group { display: flex; flex-wrap: wrap; gap: 4px; } /* 布局容器 */ .admin-layout { display: flex; height: 100vh; } /* 主内容区容器 */ .main-content { flex: 1; display: flex; flex-direction: column; overflow: hidden; } /* 内容滚动区 */ .content-scroll { flex: 1; overflow-y: auto; padding: 24px; } /* 顶部栏 */ .top-bar { height: 56px; background: var(--bg-secondary); border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; flex-shrink: 0; } /* 顶部栏左右区域 */ .top-bar-left { display: flex; align-items: center; gap: 16px; } .top-bar-right { display: flex; align-items: center; gap: 16px; } /* 用户头像 */ .user-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--accent); display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; color: white; } /* 锁定的导航项/卡片 */ .locked-item { opacity: 0.5; pointer-events: none; } .locked-text { font-size: 11px; color: var(--text-muted); font-style: italic; } /* 优先级标签 */ .priority-tag { font-size: 9px; padding: 1px 5px; border-radius: 3px; font-weight: 600; } .priority-p0 { background: var(--danger-bg); color: #f87171; } .priority-p1 { background: var(--warning-bg); color: #fbbf24; } .priority-p2 { background: var(--success-bg); color: #34d399; } /* 空状态占位 */ .placeholder-center { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--text-muted); } .placeholder-icon { font-size: 64px; margin-bottom: 16px; opacity: 0.3; } .placeholder-title { font-size: 18px; margin-bottom: 8px; color: var(--text-secondary); } .placeholder-desc { font-size: 13px; color: var(--text-muted); margin-bottom: 24px; } /* 开关按钮样式(自定义覆盖 Element Plus) */ .toggle-switch { cursor: pointer; } /* 审核操作按钮组 */ .review-actions { display: flex; gap: 8px; }