/* ===== 七虎AI Design System v2 - Light Theme ===== */ /* 设计方向:明亮简洁 + 透明玻璃态 */ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap'); /* CSS Custom Properties - Light Theme */ :root { /* Colors - Dark Theme */ --color-bg-primary: #FFFFFF; --color-bg-secondary: #F5F7FC; --color-bg-tertiary: #FFFFFF; --color-bg-hover: #F0F2F8; --color-bg-active: #E8EBF5; --color-text-primary: #1A1F36; --color-text-secondary: #5A6480; --color-text-tertiary: #8892B0; --color-text-disabled: #C4C9D9; --color-text-inverse: #FFFFFF; --color-accent: #6C63FF; --color-accent-hover: #8B85FF; --color-accent-light: rgba(108, 99, 255, 0.15); --color-accent-subtle: rgba(108, 99, 255, 0.08); --color-success: #10B981; --color-success-light: rgba(16, 185, 129, 0.12); --color-warning: #F59E0B; --color-warning-light: rgba(245, 158, 11, 0.12); --color-error: #EF4444; --color-error-light: rgba(239, 68, 68, 0.12); --color-info: #3B82F6; --color-info-light: rgba(59, 130, 246, 0.12); --color-border: rgba(0, 0, 0, 0.10); --color-border-light: rgba(0, 0, 0, 0.06); --color-border-hover: rgba(0, 0, 0, 0.16); --color-sidebar-bg: #FFFFFF; --color-sidebar-hover: rgba(108, 99, 255, 0.06); --color-sidebar-active: rgba(108, 99, 255, 0.12); /* Surface/card colors */ --color-surface: #FFFFFF; --color-surface-hover: #F5F7FC; --color-surface-elevated: #FFFFFF; /* Shadows - Dark theme */ --shadow-xs: 0 1px 2px rgba(0,0,0,0.06); --shadow-sm: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.04); --shadow-md: 0 4px 12px rgba(0,0,0,0.10), 0 1px 3px rgba(0,0,0,0.06); --shadow-lg: 0 12px 32px rgba(0,0,0,0.12), 0 2px 6px rgba(0,0,0,0.06); --shadow-xl: 0 20px 48px rgba(0,0,0,0.15), 0 4px 12px rgba(0,0,0,0.08); /* Spacing */ --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 16px; --space-xl: 20px; --space-2xl: 24px; --space-3xl: 32px; --space-4xl: 40px; --space-5xl: 48px; /* Border Radius */ --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-2xl: 20px; --radius-full: 9999px; /* Typography */ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace; --text-xs: 11px; --text-sm: 13px; --text-base: 14px; --text-md: 15px; --text-lg: 18px; --text-xl: 22px; --text-2xl: 28px; --text-3xl: 36px; /* Layout */ --sidebar-width: 240px; --sidebar-collapsed: 64px; --header-height: 56px; --admin-sidebar-width: 220px; /* Transitions */ --transition-fast: 120ms ease; --transition-normal: 200ms ease; --transition-slow: 300ms ease; /* Z-index */ --z-base: 1; --z-dropdown: 100; --z-sticky: 200; --z-overlay: 300; --z-modal: 400; --z-toast: 500; } /* Reset & Base */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: var(--text-base); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } body { font-family: var(--font-sans); color: var(--color-text-primary); background: var(--color-bg-primary); line-height: 1.6; overflow: hidden; height: 100vh; } #root { height: 100vh; overflow: hidden; } a { color: var(--color-accent); text-decoration: none; } a:hover { color: var(--color-accent-hover); } button { font-family: inherit; cursor: pointer; border: none; background: none; } input, textarea, select { font-family: inherit; font-size: inherit; } /* Scrollbar - Dark theme */ ::-webkit-scrollbar { width: 5px; height: 5px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-text-disabled); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-tertiary); } /* Utility Classes */ .flex { display: flex; } .flex-col { flex-direction: column; } .flex-1 { flex: 1; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .justify-center { justify-content: center; } .gap-xs { gap: var(--space-xs); } .gap-sm { gap: var(--space-sm); } .gap-md { gap: var(--space-md); } .gap-lg { gap: var(--space-lg); } .gap-xl { gap: var(--space-xl); } .text-center { text-align: center; } .text-right { text-align: right; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .w-full { width: 100%; } .h-full { height: 100%; } .relative { position: relative; } .absolute { position: absolute; } .hidden { display: none; } .pointer { cursor: pointer; } .select-none { user-select: none; } /* Animation utilities */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideDown { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideLeft { from { opacity: 0; transform: translateX(8px); } to { opacity: 1; transform: translateX(0); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } @keyframes glow { 0%, 100% { box-shadow: 0 0 5px rgba(108, 99, 255, 0.3); } 50% { box-shadow: 0 0 20px rgba(108, 99, 255, 0.5); } } .animate-fadeIn { animation: fadeIn var(--transition-normal); } .animate-slideUp { animation: slideUp var(--transition-normal); } .animate-slideDown { animation: slideDown var(--transition-normal); } .animate-pulse { animation: pulse 2s ease infinite; } /* Skeleton loading */ .skeleton { background: linear-gradient(90deg, var(--color-bg-tertiary) 25%, var(--color-bg-hover) 50%, var(--color-bg-tertiary) 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: var(--radius-sm); } /* Spinner */ .audit-spinner { width: 24px; height: 24px; border: 2px solid rgba(108, 99, 255, 0.2); border-top-color: var(--color-accent); border-radius: 50%; animation: spin 0.6s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Loading screen */ .loading-screen { display: flex; align-items: center; justify-content: center; height: 100vh; font-size: 18px; color: var(--color-text-secondary); background: var(--color-bg-primary); } /* Responsive breakpoints */ @media (max-width: 768px) { :root { --sidebar-width: 0px; } } @media (min-width: 769px) and (max-width: 1024px) { :root { --sidebar-width: 64px; } } /* === Glass card effect === */ .glass-card { background: rgba(255, 255, 255, 0.8); backdrop-filter: blur(16px); border: 1px solid rgba(0, 0, 0, 0.08); border-radius: var(--radius-lg); } /* === Gradient text === */ .gradient-text { background: linear-gradient(135deg, #6C63FF, #A78BFA, #C084FC); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* === Admin stats card grid === */ .admin-stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--space-lg); margin-bottom: var(--space-2xl); } .stat-card { padding: var(--space-xl); background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); transition: all var(--transition-normal); } .stat-card:hover { border-color: rgba(108, 99, 255, 0.3); transform: translateY(-2px); box-shadow: 0 4px 16px rgba(108, 99, 255, 0.08); } .stat-card .stat-label { font-size: var(--text-xs); color: var(--color-text-tertiary); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: var(--space-xs); } .stat-card .stat-value { font-size: var(--text-2xl); font-weight: 700; color: var(--color-text-primary); line-height: 1.2; } .stat-card .stat-sub { font-size: var(--text-xs); color: var(--color-text-tertiary); margin-top: var(--space-xs); } /* === Common button styles === */ .btn-primary { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: var(--radius-md); font-size: var(--text-base); font-weight: 600; color: white; background: var(--color-accent); border: none; cursor: pointer; transition: all var(--transition-fast); } .btn-primary:hover { background: var(--color-accent-hover); box-shadow: 0 4px 16px rgba(108, 99, 255, 0.3); } .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: var(--radius-md); font-size: var(--text-base); font-weight: 500; color: var(--color-text-secondary); background: transparent; border: 1px solid var(--color-border); cursor: pointer; transition: all var(--transition-fast); } .btn-secondary:hover { color: var(--color-text-primary); border-color: var(--color-border-hover); background: var(--color-bg-hover); } .btn-danger { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: var(--radius-md); font-size: var(--text-base); font-weight: 500; color: white; background: var(--color-error); border: none; cursor: pointer; transition: all var(--transition-fast); } .btn-danger:hover { background: #DC2626; } .btn-sm { padding: 6px 12px; font-size: var(--text-sm); } /* === Form elements === */ .form-input-dark { padding: 10px 14px; border-radius: var(--radius-md); border: 1px solid var(--color-border); background: var(--color-bg-tertiary); color: var(--color-text-primary); font-size: var(--text-base); outline: none; transition: all var(--transition-fast); width: 100%; } .form-input-dark:focus { border-color: rgba(108, 99, 255, 0.4); box-shadow: 0 0 0 3px rgba(108, 99, 255, 0.1); } .form-input-dark::placeholder { color: var(--color-text-disabled); } .form-select-dark { padding: 10px 14px; border-radius: var(--radius-md); border: 1px solid var(--color-border); background: var(--color-bg-tertiary); color: var(--color-text-primary); font-size: var(--text-base); outline: none; cursor: pointer; transition: all var(--transition-fast); } .form-select-dark:focus { border-color: rgba(108, 99, 255, 0.4); } /* === Table (dark theme) === */ .data-table { width: 100%; border-collapse: collapse; } .data-table th { padding: 12px 16px; text-align: left; font-size: var(--text-xs); font-weight: 600; color: var(--color-text-tertiary); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--color-border); } .data-table td { padding: 12px 16px; font-size: var(--text-sm); color: var(--color-text-primary); border-bottom: 1px solid var(--color-border-light); } .data-table tr:hover td { background: var(--color-bg-hover); } /* === Badge === */ .badge { display: inline-block; padding: 2px 10px; border-radius: 100px; font-size: var(--text-xs); font-weight: 600; } .badge-success { background: var(--color-success-light); color: var(--color-success); } .badge-warning { background: var(--color-warning-light); color: var(--color-warning); } .badge-error { background: var(--color-error-light); color: var(--color-error); } .badge-info { background: var(--color-info-light); color: var(--color-info); } .badge-accent { background: var(--color-accent-light); color: var(--color-accent); } /* === Modal/Dialog === */ .modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.6); backdrop-filter: blur(4px); display: flex; align-items: center; justify-content: center; z-index: var(--z-modal); } .modal-content { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-xl); padding: var(--space-2xl); max-width: 90vw; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-xl); } .modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-xl); } .modal-header h3 { font-size: var(--text-lg); font-weight: 600; color: var(--color-text-primary); } /* === Toast === */ .toast { position: fixed; top: 24px; left: 50%; transform: translateX(-50%); padding: 12px 24px; border-radius: var(--radius-lg); background: var(--color-surface-elevated); border: 1px solid var(--color-border); color: var(--color-text-primary); font-size: var(--text-sm); z-index: var(--z-toast); animation: slideDown var(--transition-normal); box-shadow: var(--shadow-lg); } /* ===== Color Scheme Improvements v2 ===== */ /* Glassmorphism + Text Highlighting + Consistency Fixes */ /* Glass card effect */ .admin-page-card, .admin-card, .stat-card, .dashboard-card { background: rgba(255, 255, 255, 0.7) !important; backdrop-filter: blur(12px) !important; -webkit-backdrop-filter: blur(12px) !important; border: 1px solid rgba(0, 0, 0, 0.08) !important; } /* Stat number highlight */ .stat-value, .stat-number, .metric-value { color: var(--color-text-primary) !important; font-weight: 700 !important; text-shadow: 0 0 20px rgba(108, 99, 255, 0.15); } /* Section title highlight */ .section-title, .page-title, .card-title, h1, h2, h3 { color: var(--color-text-primary) !important; } /* Accent text highlight */ .text-accent, .text-primary, .highlight-text { color: var(--color-accent) !important; font-weight: 600; } /* Table header improvements */ table th, .table-header { background: rgba(108, 99, 255, 0.08) !important; color: var(--color-text-primary) !important; font-weight: 600 !important; } /* Table row hover */ table tbody tr:hover, .table-row:hover { background: rgba(108, 99, 255, 0.04) !important; } /* Input/Select consistency */ input, textarea, select, .form-input, .form-control { background: #FFFFFF !important; border: 1px solid rgba(0, 0, 0, 0.10) !important; color: var(--color-text-primary) !important; border-radius: var(--radius-md) !important; transition: border-color 0.2s, box-shadow 0.2s !important; } input:focus, textarea:focus, select:focus, .form-input:focus, .form-control:focus { border-color: var(--color-accent) !important; box-shadow: 0 0 0 3px rgba(108, 99, 255, 0.12) !important; outline: none !important; } /* Button consistency */ button, .btn, .admin-btn { border-radius: var(--radius-md) !important; transition: all 0.2s !important; } /* Primary button */ .btn-primary, .admin-btn-primary, button[type="submit"] { background: var(--color-accent) !important; color: white !important; border: none !important; } .btn-primary:hover, .admin-btn-primary:hover { background: var(--color-accent-hover) !important; box-shadow: 0 4px 12px rgba(108, 99, 255, 0.3) !important; } /* Secondary/ghost button */ .btn-secondary, .admin-btn-secondary { background: rgba(108, 99, 255, 0.06) !important; color: var(--color-text-secondary) !important; border: 1px solid rgba(0, 0, 0, 0.08) !important; } .btn-secondary:hover, .admin-btn-secondary:hover { background: rgba(108, 99, 255, 0.10) !important; color: var(--color-text-primary) !important; } /* Badge/tag improvements */ .badge, .tag, .admin-badge { border-radius: var(--radius-full) !important; font-weight: 600 !important; padding: 2px 10px !important; } /* Badge variants */ .badge-success, .admin-badge-success { background: rgba(16, 185, 129, 0.12) !important; color: #10B981 !important; } .badge-warning, .admin-badge-warning { background: rgba(245, 158, 11, 0.12) !important; color: #F59E0B !important; } .badge-error, .admin-badge-danger { background: rgba(239, 68, 68, 0.12) !important; color: #EF4444 !important; } .badge-info, .admin-badge-info { background: rgba(59, 130, 246, 0.12) !important; color: #3B82F6 !important; } /* Empty state */ .empty-state, .admin-empty { color: var(--color-text-tertiary) !important; text-align: center; padding: 48px 24px !important; } /* Scrollbar improvement */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-thumb { background: rgba(108, 99, 255, 0.2); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: rgba(108, 99, 255, 0.4); } /* Link color */ a { color: var(--color-accent); transition: color 0.2s; } a:hover { color: var(--color-accent-hover); } /* Tab improvements */ .tab-active, .tab-item.active { color: var(--color-accent) !important; border-bottom-color: var(--color-accent) !important; } /* Modal/dialog overlay */ .modal-overlay, .dialog-overlay { background: rgba(0, 0, 0, 0.3) !important; backdrop-filter: blur(4px) !important; } /* Card hover effect */ .admin-card:hover, .stat-card:hover { border-color: rgba(108, 99, 255, 0.2) !important; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08) !important; }