@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&display=swap'); :root { --color-bg-page: #07070f; --color-bg-input-bar: rgba(255, 255, 255, 0.06); --color-border-input-bar: rgba(255, 255, 255, 0.10); --color-primary: #6c63ff; --color-text-primary: #f1f0ff; --color-text-secondary: #8b8ea8; --color-text-disabled: #4c4f6b; --color-bg-hover: rgba(255, 255, 255, 0.08); --color-bg-dropdown: rgba(13, 13, 26, 0.92); --color-bg-upload: rgba(255, 255, 255, 0.04); --color-border-upload: rgba(255, 255, 255, 0.08); --color-btn-send-disabled: #3a3a4a; --color-btn-send-active: #6c63ff; --color-sidebar-bg: rgba(7, 7, 15, 0.80); /* Phase 3: Admin theme tokens */ --color-bg-sidebar: rgba(7, 7, 15, 0.80); --color-sidebar-active: rgba(255, 255, 255, 0.08); --color-sidebar-hover: rgba(255, 255, 255, 0.04); --color-bg-card: rgba(255, 255, 255, 0.06); --color-border-card: rgba(255, 255, 255, 0.10); --color-success: #00b894; --color-danger: #e74c3c; --color-warning: #f39c12; --radius-card: 12px; --sidebar-width: 240px; --sidebar-collapsed-width: 64px; --radius-input-bar: 20px; --radius-btn: 8px; --radius-send-btn: 50%; --radius-thumbnail: 8px; --radius-dropdown: 12px; --input-bar-max-width: 950px; --send-btn-size: 36px; --thumbnail-size: 80px; --toolbar-height: 44px; --toolbar-btn-height: 32px; } * { margin: 0; padding: 0; box-sizing: border-box; } html, body, #root { height: 100%; overflow: hidden; } body { font-family: 'Noto Sans SC', system-ui, -apple-system, sans-serif; background: var(--color-bg-page); color: var(--color-text-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Scrollbar: Firefox */ * { scrollbar-width: thin; scrollbar-color: transparent transparent; } *:hover { scrollbar-color: rgba(255, 255, 255, 0.1) transparent; } /* Scrollbar: Webkit — hidden by default, visible on hover */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: transparent; border-radius: 3px; transition: background 0.2s; } *:hover::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); } *:hover::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.2); } /* ═══════════════════════════════════════════ LAYER 1: Aurora Gradient Background ═══════════════════════════════════════════ */ .aurora-bg { position: fixed; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; } .aurora-bg::before, .aurora-bg::after { content: ""; position: absolute; border-radius: 50%; filter: blur(110px); opacity: 0.4; will-change: transform; } .aurora-bg::before { width: 600px; height: 600px; top: -10%; right: -5%; background: radial-gradient(circle, rgba(108, 99, 255, 0.6) 0%, transparent 70%); animation: aurora-drift-1 20s ease-in-out infinite alternate; } .aurora-bg::after { width: 500px; height: 500px; bottom: -5%; left: -5%; background: radial-gradient(circle, rgba(59, 130, 246, 0.5) 0%, transparent 70%); animation: aurora-drift-2 25s ease-in-out infinite alternate; } @keyframes aurora-drift-1 { 0% { transform: translate(0, 0) scale(1); } 33% { transform: translate(-15vw, 10vh) scale(1.1); } 66% { transform: translate(-5vw, 25vh) scale(0.95); } 100% { transform: translate(-20vw, 15vh) scale(1.05); } } @keyframes aurora-drift-2 { 0% { transform: translate(0, 0) scale(1); } 33% { transform: translate(10vw, -15vh) scale(1.15); } 66% { transform: translate(20vw, -5vh) scale(0.9); } 100% { transform: translate(15vw, -20vh) scale(1.1); } } .aurora-blob-3 { position: absolute; width: 400px; height: 400px; top: 40%; left: 50%; border-radius: 50%; background: radial-gradient(circle, rgba(139, 92, 246, 0.35) 0%, transparent 70%); filter: blur(100px); opacity: 0.3; will-change: transform; animation: aurora-drift-3 30s ease-in-out infinite alternate; pointer-events: none; } @keyframes aurora-drift-3 { 0% { transform: translate(-50%, -50%) scale(1); } 50% { transform: translate(-30%, -60%) scale(1.2); } 100% { transform: translate(-70%, -40%) scale(0.85); } } /* ═══════════════════════════════════════════ LAYER 2: Noise Texture Overlay ═══════════════════════════════════════════ */ .noise-overlay { position: fixed; inset: 0; z-index: 1; pointer-events: none; opacity: 0.03; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E"); background-repeat: repeat; background-size: 256px 256px; } /* ═══════════════════════════════════════════ LAYER 3: Mouse-tracking Glow ═══════════════════════════════════════════ */ .cursor-glow { position: fixed; inset: 0; z-index: 1; pointer-events: none; background: radial-gradient( 600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(108, 99, 255, 0.06) 0%, transparent 60% ); transition: opacity 0.3s ease; } /* ═══════════════════════════════════════════ LAYER 4: Subtle grid pattern ═══════════════════════════════════════════ */ .grid-pattern { position: fixed; inset: 0; z-index: 0; pointer-events: none; background-image: linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px); background-size: 64px 64px; mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 20%, transparent 100%); -webkit-mask-image: radial-gradient(ellipse 80% 60% at 50% 50%, black 20%, transparent 100%); } /* ═══════════════════════════════════════════ Reduced motion ═══════════════════════════════════════════ */ @media (prefers-reduced-motion: reduce) { .aurora-bg::before, .aurora-bg::after, .aurora-blob-3 { animation: none !important; opacity: 0.2 !important; } }