/* 导入字体 */ @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Plus+Jakarta+Sans:wght@300;400;500;600;700&display=swap'); :root { --font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-heading: 'Outfit', var(--font-sans); /* HSL 调和色彩系统 */ --bg-base: hsl(230, 20%, 8%); --bg-card: hsla(230, 20%, 12%, 0.7); --bg-card-hover: hsla(230, 20%, 15%, 0.85); --bg-sidebar: hsla(230, 20%, 10%, 0.8); --primary-color: hsl(270, 85%, 65%); --primary-glow: hsla(270, 85%, 65%, 0.35); --accent-blue: hsl(200, 85%, 60%); --accent-pink: hsl(320, 85%, 60%); --accent-green: hsl(150, 75%, 50%); --accent-red: hsl(360, 75%, 60%); --text-primary: hsl(0, 0%, 96%); --text-secondary: hsl(230, 12%, 72%); --text-muted: hsl(230, 10%, 58%); --border-light: rgba(255, 255, 255, 0.1); --border-glow: hsla(270, 85%, 65%, 0.28); --glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); --transition-smooth: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { box-sizing: border-box; margin: 0; padding: 0; } body { background-color: var(--bg-base); color: var(--text-primary); font-family: var(--font-sans); min-height: 100vh; overflow-x: hidden; position: relative; } /* 装饰性背景光晕 */ body::before { content: ''; position: absolute; top: -10%; left: 20%; width: 40vw; height: 40vw; background: radial-gradient(circle, var(--primary-glow) 0%, transparent 70%); z-index: -2; filter: blur(80px); pointer-events: none; } body::after { content: ''; position: absolute; bottom: 10%; right: 10%; width: 50vw; height: 50vw; background: radial-gradient(circle, hsla(320, 85%, 60%, 0.15) 0%, transparent 70%); z-index: -2; filter: blur(100px); pointer-events: none; } /* 滚动条美化 */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--bg-base); } ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.15); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--primary-color); } #app { min-height: 100vh; } /* Ant Design Override for Premium Look */ .ant-layout { background: transparent !important; } .ant-layout-sider { background: var(--bg-sidebar) !important; backdrop-filter: blur(16px); border-right: 1px solid var(--border-light); } .ant-layout-header { background: hsla(230, 20%, 8%, 0.5) !important; backdrop-filter: blur(12px); border-bottom: 1px solid var(--border-light); color: var(--text-primary); display: flex; align-items: center; justify-content: space-between; padding: 0 24px !important; } /* Glassmorphism Cards */ .glass-card { background: var(--bg-card); backdrop-filter: blur(12px); border: 1px solid var(--border-light); border-radius: 16px; padding: 24px; box-shadow: var(--glass-shadow); transition: var(--transition-smooth); } .glass-card:hover { background: var(--bg-card-hover); border-color: var(--border-glow); box-shadow: 0 12px 40px 0 hsla(270, 85%, 65%, 0.1); transform: translateY(-2px); } /* Typography */ h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading); font-weight: 600; color: var(--text-primary); } .text-gradient { background: linear-gradient(135deg, var(--primary-color) 0%, var(--accent-pink) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } /* Active status indicator animation */ @keyframes pulse-green { 0% { box-shadow: 0 0 0 0 rgba(21, 200, 100, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(21, 200, 100, 0); } 100% { box-shadow: 0 0 0 0 rgba(21, 200, 100, 0); } } .status-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 8px; } .status-online { background-color: var(--accent-green); animation: pulse-green 2s infinite; } .status-offline { background-color: var(--text-muted); } .status-logging_in { background-color: var(--accent-blue); animation: pulse-blue 1.5s infinite; } .status-error { background-color: var(--accent-red); } @keyframes pulse-blue { 0% { box-shadow: 0 0 0 0 rgba(0, 170, 255, 0.4); } 70% { box-shadow: 0 0 0 10px rgba(0, 170, 255, 0); } 100% { box-shadow: 0 0 0 0 rgba(0, 170, 255, 0); } } /* QR Code scanning container */ .qr-container { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; background: rgba(0, 0, 0, 0.3); border-radius: 12px; border: 1px dashed var(--border-light); position: relative; overflow: hidden; } .qr-laser { position: absolute; top: 0; left: 0; width: 100%; height: 2px; background: var(--primary-color); box-shadow: 0 0 10px var(--primary-color); animation: scanning 2s linear infinite; } @keyframes scanning { 0% { top: 5%; } 50% { top: 95%; } 100% { top: 5%; } } /* 全局 Modal 深色主题(与页面 glass 风格一致,避免白底 + 浅色字不可读) */ .ant-modal .ant-modal-content { background: hsl(230, 20%, 11%) !important; border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 24px 48px rgba(0, 0, 0, 0.45); border-radius: 14px; overflow: hidden; color: var(--text-primary); } .ant-modal .ant-modal-header { background: transparent !important; border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important; padding: 16px 20px !important; } .ant-modal .ant-modal-title { color: var(--text-primary) !important; font-family: var(--font-heading); font-weight: 600; } .ant-modal .ant-modal-body { padding: 16px 20px 20px !important; background: transparent !important; color: var(--text-primary); } .ant-modal .ant-modal-footer { background: transparent !important; border-top: 1px solid rgba(255, 255, 255, 0.06) !important; } .ant-modal .ant-modal-close, .ant-modal .ant-modal-close-x { color: var(--text-secondary) !important; } .ant-modal .ant-modal-close:hover, .ant-modal .ant-modal-close-x:hover { color: #fff !important; } .ant-modal .ant-form-item-label > label { color: var(--text-secondary) !important; } .ant-modal .ant-input, .ant-modal .ant-input-number, .ant-modal .ant-input-number-input, .ant-modal .ant-input-affix-wrapper, .ant-modal .ant-input-password .ant-input, .ant-modal textarea.ant-input, .ant-modal .ant-select-selector { background: rgba(255, 255, 255, 0.08) !important; border-color: rgba(255, 255, 255, 0.16) !important; color: var(--text-primary) !important; box-shadow: none !important; } .ant-modal .ant-input:hover, .ant-modal .ant-input-affix-wrapper:hover, .ant-modal .ant-select-selector:hover, .ant-modal .ant-input-number:hover { border-color: rgba(192, 132, 252, 0.45) !important; } .ant-modal .ant-input:focus, .ant-modal .ant-input-focused, .ant-modal .ant-input-affix-wrapper-focused, .ant-modal .ant-select-focused .ant-select-selector, .ant-modal .ant-input-number-focused { border-color: rgba(192, 132, 252, 0.65) !important; box-shadow: 0 0 0 2px rgba(170, 59, 255, 0.18) !important; } .ant-modal .ant-input::placeholder, .ant-modal .ant-input-number-input::placeholder, .ant-modal textarea.ant-input::placeholder { color: hsl(230, 10%, 62%) !important; opacity: 1 !important; } .ant-modal .ant-input-affix-wrapper input::placeholder { color: hsl(230, 10%, 62%) !important; opacity: 1 !important; } .ant-modal .ant-checkbox-wrapper { color: var(--text-primary) !important; } .ant-modal .ant-checkbox-inner { background: rgba(255, 255, 255, 0.06) !important; border-color: rgba(255, 255, 255, 0.35) !important; } .ant-modal .ant-checkbox-checked .ant-checkbox-inner { background: #7c3aed !important; border-color: #a78bfa !important; } .ant-modal .ant-select-arrow, .ant-modal .ant-select-selection-placeholder { color: var(--text-muted) !important; } .ant-modal .ant-select-selection-item { color: var(--text-primary) !important; } .ant-modal .ant-alert-info { background: rgba(59, 130, 246, 0.12) !important; border: 1px solid rgba(96, 165, 250, 0.35) !important; } .ant-modal .ant-alert-message { color: #dbeafe !important; } /* Tabs / 搜索框 / 分页 — 暗色可读性 */ .ant-tabs-top > .ant-tabs-nav::before { border-bottom-color: rgba(255, 255, 255, 0.08) !important; } .ant-tabs .ant-tabs-tab { color: var(--text-secondary) !important; } .ant-tabs .ant-tabs-tab:hover { color: #e9d5ff !important; } .ant-tabs .ant-tabs-tab-active .ant-tabs-tab-btn { color: #f3e8ff !important; text-shadow: none; } .ant-tabs .ant-tabs-ink-bar { background: linear-gradient(90deg, #aa3bff, #c084fc) !important; } .ant-input, .ant-input-affix-wrapper, .ant-select:not(.ant-select-customize-input) .ant-select-selector { background: rgba(255, 255, 255, 0.06) !important; border-color: rgba(255, 255, 255, 0.14) !important; color: var(--text-primary) !important; } .ant-input::placeholder, .ant-input-affix-wrapper input::placeholder { color: var(--text-muted) !important; opacity: 1 !important; } .ant-pagination { color: var(--text-secondary) !important; } .ant-pagination .ant-pagination-item { background: rgba(255, 255, 255, 0.04) !important; border-color: rgba(255, 255, 255, 0.12) !important; } .ant-pagination .ant-pagination-item a { color: var(--text-secondary) !important; } .ant-pagination .ant-pagination-item-active { background: rgba(147, 51, 234, 0.25) !important; border-color: rgba(192, 132, 252, 0.55) !important; } .ant-pagination .ant-pagination-item-active a { color: #f3e8ff !important; } .ant-pagination .ant-pagination-prev .ant-pagination-item-link, .ant-pagination .ant-pagination-next .ant-pagination-item-link, .ant-pagination .ant-select-selector { background: rgba(255, 255, 255, 0.04) !important; border-color: rgba(255, 255, 255, 0.12) !important; color: var(--text-secondary) !important; } .ant-pagination-options-quick-jumper input { background: rgba(255, 255, 255, 0.06) !important; border-color: rgba(255, 255, 255, 0.14) !important; color: var(--text-primary) !important; } .ant-table-pagination.ant-pagination { margin: 16px 20px !important; } .ant-modal .ant-radio-button-wrapper { color: var(--text-secondary) !important; background: rgba(255, 255, 255, 0.03) !important; border-color: rgba(255, 255, 255, 0.12) !important; } .ant-modal .ant-radio-button-wrapper-checked { color: #f3e8ff !important; background: rgba(147, 51, 234, 0.25) !important; border-color: rgba(192, 132, 252, 0.55) !important; } .ant-modal .ant-btn-default { background: rgba(255, 255, 255, 0.06) !important; border-color: var(--border-light) !important; color: var(--text-primary) !important; } .ant-modal .ant-btn-default:hover { background: rgba(170, 59, 255, 0.15) !important; border-color: rgba(170, 59, 255, 0.35) !important; color: #fff !important; } .ant-modal .ant-tag-default { color: #cbd5e1 !important; background: rgba(148, 163, 184, 0.2) !important; border-color: rgba(203, 213, 225, 0.4) !important; } /* 暗色主题标签 — 半透明底 + 彩色边框/文字,避免 Ant 默认浅色底 */ .ant-tag { border-radius: 6px; font-weight: 500; line-height: 1.4; } .ant-tag-purple, .ant-tag-magenta, .ant-tag-volcano { color: #e9d5ff !important; background: rgba(147, 51, 234, 0.16) !important; border-color: rgba(192, 132, 252, 0.42) !important; } .ant-tag-blue, .ant-tag-processing, .ant-tag-geekblue, .ant-tag-cyan { color: #c4b5fd !important; background: rgba(129, 140, 248, 0.14) !important; border-color: rgba(167, 139, 250, 0.38) !important; } .ant-tag-green, .ant-tag-success, .ant-tag-lime { color: #86efac !important; background: rgba(34, 197, 94, 0.12) !important; border-color: rgba(74, 222, 128, 0.32) !important; } .ant-tag-red, .ant-tag-error { color: #fca5a5 !important; background: rgba(239, 68, 68, 0.12) !important; border-color: rgba(248, 113, 113, 0.35) !important; } .ant-tag-orange, .ant-tag-warning, .ant-tag-gold, .ant-tag-yellow { color: #fcd34d !important; background: rgba(245, 158, 11, 0.12) !important; border-color: rgba(251, 191, 36, 0.35) !important; } .ant-tag-default { color: #cbd5e1 !important; background: rgba(148, 163, 184, 0.1) !important; border-color: rgba(148, 163, 184, 0.28) !important; } @media (max-width: 768px) { .glass-card { padding: 16px; border-radius: 12px; } .ant-layout-header { padding: 0 12px !important; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .glass-card:hover { transform: none; } }