/* =========================================================== THEMES.CSS — Премиальная тёмная тема Gramaton Messenger Стек: Glassmorphism + Неоновые градиенты + OLED-чёрный =========================================================== */ /* ── CSS-переменные (Design Tokens) ────────────────────────── */ :root { /* Базовые цвета */ --bg-primary: #000000; --bg-secondary: #050112; --bg-tertiary: #0A0224; --bg-glass: rgba(18, 11, 34, 0.45); --bg-glass-hover: rgba(30, 18, 50, 0.6); --bg-glass-active: rgba(40, 25, 65, 0.7); /* Текст */ --text-primary: #FFFFFF; --text-secondary: rgba(255, 255, 255, 0.7); --text-tertiary: rgba(255, 255, 255, 0.4); --text-accent: #C084FC; /* Неоновые градиенты */ --neon-purple: linear-gradient(135deg, #7A22A6, #3B1154); --neon-gold: linear-gradient(135deg, #FFB800, #4A3300); --neon-blue: linear-gradient(135deg, #00A3FF, #002940); --neon-cyan: linear-gradient(135deg, #06B6D4, #003340); --neon-green: linear-gradient(135deg, #22C55E, #0A4220); /* Цвета для неон-рамок */ --border-purple: rgba(122, 34, 166, 0.4); --border-gold: rgba(255, 184, 0, 0.3); --border-blue: rgba(0, 163, 255, 0.3); --border-cyan: rgba(6, 182, 212, 0.3); /* Glassmorphism */ --glass-blur: 25px; --glass-blur-mobile: 10px; --glass-radius: 16px; --glass-radius-sm: 10px; --glass-border: 1px solid var(--border-purple); /* Тени */ --shadow-neon-purple: 0 0 20px rgba(122, 34, 166, 0.15), 0 0 60px rgba(122, 34, 166, 0.05); --shadow-neon-gold: 0 0 20px rgba(255, 184, 0, 0.1), 0 0 60px rgba(255, 184, 0, 0.03); --shadow-card: 0 8px 32px rgba(0, 0, 0, 0.4); /* Размеры */ --sidebar-width: 280px; --topbar-height: 56px; --input-height: 64px; --radius-full: 9999px; /* Типографика */ --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-size-xs: 11px; --font-size-sm: 13px; --font-size-base: 14px; --font-size-lg: 16px; --font-size-xl: 20px; --font-size-2xl: 24px; /* Анимации */ --transition-fast: 150ms ease; --transition-base: 250ms ease; --transition-slow: 350ms cubic-bezier(0.22, 1, 0.36, 1); --transition-spring: 500ms cubic-bezier(0.34, 1.56, 0.64, 1); } /* ── Базовый сброс и глобальные стили ─────────────────────── */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html, body { height: 100%; overflow: hidden; } body { font-family: var(--font-primary); font-size: var(--font-size-base); color: var(--text-primary); background: var(--bg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* ── Звёздный фон ─────────────────────────────────────────── */ .starfield { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; background: radial-gradient(ellipse at 20% 50%, rgba(122, 34, 166, 0.08) 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, rgba(0, 163, 255, 0.06) 0%, transparent 50%), radial-gradient(ellipse at 50% 80%, rgba(255, 184, 0, 0.04) 0%, transparent 50%); } .starfield::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: radial-gradient(1px 1px at 10% 20%, rgba(255,255,255,0.3) 0%, transparent 100%), radial-gradient(1px 1px at 30% 65%, rgba(255,255,255,0.2) 0%, transparent 100%), radial-gradient(1.5px 1.5px at 50% 10%, rgba(255,255,255,0.4) 0%, transparent 100%), radial-gradient(1px 1px at 70% 40%, rgba(255,255,255,0.2) 0%, transparent 100%), radial-gradient(1px 1px at 80% 80%, rgba(255,255,255,0.3) 0%, transparent 100%), radial-gradient(1.5px 1.5px at 90% 15%, rgba(255,255,255,0.2) 0%, transparent 100%), radial-gradient(1px 1px at 15% 90%, rgba(255,255,255,0.15) 0%, transparent 100%), radial-gradient(1px 1px at 45% 45%, rgba(255,255,255,0.1) 0%, transparent 100%), radial-gradient(1.5px 1.5px at 60% 55%, rgba(255,255,255,0.25) 0%, transparent 100%), radial-gradient(1px 1px at 25% 35%, rgba(255,255,255,0.15) 0%, transparent 100%), radial-gradient(1px 1px at 5% 70%, rgba(200,200,255,0.2) 0%, transparent 100%), radial-gradient(1.5px 1.5px at 75% 30%, rgba(200,200,255,0.15) 0%, transparent 100%), radial-gradient(1px 1px at 35% 75%, rgba(255,255,255,0.1) 0%, transparent 100%), radial-gradient(1px 1px at 65% 5%, rgba(200,200,255,0.2) 0%, transparent 100%), radial-gradient(1.5px 1.5px at 55% 60%, rgba(255,255,255,0.15) 0%, transparent 100%); opacity: 0.6; } /* ── Glassmorphism-карточки ────────────────────────────────── */ .glass-card { background: var(--bg-glass); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: var(--glass-border); border-radius: var(--glass-radius); box-shadow: var(--shadow-card); } .glass-card-sm { background: var(--bg-glass); backdrop-filter: blur(var(--glass-blur)); -webkit-backdrop-filter: blur(var(--glass-blur)); border: var(--glass-border); border-radius: var(--glass-radius-sm); } .glass-card-hover:hover { background: var(--bg-glass-hover); border-color: rgba(122, 34, 166, 0.6); box-shadow: var(--shadow-neon-purple); transition: all var(--transition-base); } /* ── Неоновые рамки ────────────────────────────────────────── */ .neon-border-purple { border: 1px solid var(--border-purple); box-shadow: var(--shadow-neon-purple); } .neon-border-gold { border: 1px solid var(--border-gold); box-shadow: var(--shadow-neon-gold); } .neon-border-blue { border: 1px solid var(--border-blue); } /* ── Кнопки ────────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 20px; border: none; border-radius: var(--glass-radius-sm); font-family: var(--font-primary); font-size: var(--font-size-sm); font-weight: 600; cursor: pointer; transition: all var(--transition-base); text-decoration: none; white-space: nowrap; } .btn-primary { background: var(--neon-purple); color: var(--text-primary); box-shadow: var(--shadow-neon-purple); } .btn-primary:hover { transform: translateY(-1px); box-shadow: 0 4px 20px rgba(122, 34, 166, 0.3); } .btn-primary:active { transform: translateY(0px); } .btn-gold { background: var(--neon-gold); color: #1a1a1a; box-shadow: var(--shadow-neon-gold); } .btn-gold:hover { transform: translateY(-1px); } .btn-ghost { background: transparent; color: var(--text-secondary); border: 1px solid rgba(255, 255, 255, 0.1); } .btn-ghost:hover { background: var(--bg-glass); border-color: var(--border-purple); color: var(--text-primary); } .btn-icon { width: 40px; height: 40px; padding: 0; border-radius: var(--radius-full); font-size: var(--font-size-lg); } .btn-icon-sm { width: 32px; height: 32px; padding: 0; border-radius: var(--radius-full); font-size: var(--font-size-base); } /* ── Скроллбар ─────────────────────────────────────────────── */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: rgba(122, 34, 166, 0.3); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: rgba(122, 34, 166, 0.5); } /* Firefox */ * { scrollbar-width: thin; scrollbar-color: rgba(122, 34, 166, 0.3) transparent; } /* ── Утилиты ───────────────────────────────────────────────── */ .text-gradient-purple { background: var(--neon-purple); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .text-gradient-gold { background: var(--neon-gold); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .text-gradient-blue { background: var(--neon-blue); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .text-gradient { background: linear-gradient(135deg, #C084FC, #7C3AED, #3B82F6); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .glass-divider { height: 1px; background: linear-gradient(90deg, transparent, var(--border-purple), transparent); margin: 8px 0; } /* ── Анимация появления ────────────────────────────────────── */ @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInScale { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } @keyframes shimmer { 0% { background-position: -200% center; } 100% { background-position: 200% center; } } .fade-in { animation: fadeIn 0.4s ease forwards; } .fade-in-stagger { opacity: 0; animation: fadeIn 0.4s ease forwards; } /* ── Индикатор загрузки ────────────────────────────────────── */ .loading-dots { display: inline-flex; gap: 4px; align-items: center; } .loading-dots span { width: 6px; height: 6px; border-radius: 50%; background: var(--border-purple); animation: pulse 1.5s ease-in-out infinite; } .loading-dots span:nth-child(2) { animation-delay: 0.2s; } .loading-dots span:nth-child(3) { animation-delay: 0.4s; } @keyframes pulse { 0%, 100% { opacity: 0.3; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1.2); } } /* ── Статус онлайн ─────────────────────────────────────────── */ .status-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; position: relative; } .status-dot.online { background: #22C55E; box-shadow: 0 0 8px rgba(34, 197, 94, 0.5); } .status-dot.offline { background: rgba(255, 255, 255, 0.2); } .status-dot.away { background: #F59E0B; box-shadow: 0 0 8px rgba(245, 158, 11, 0.3); } /* ── Badge/индикатор непрочитанных ─────────────────────────── */ .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: var(--radius-full); background: var(--neon-purple); color: var(--text-primary); font-size: 10px; font-weight: 700; line-height: 1; } /* ── Анимация отправки ─────────────────────────────────────── */ @keyframes sendPulse { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } } .btn-send:active { animation: sendPulse 0.2s ease; } /* ── Haptic touch (мобильные) ──────────────────────────────── */ @media (hover: none) and (pointer: coarse) { .btn:active { transform: scale(0.96); } }