Haven/public/css/style.css

10316 lines
283 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ═══════════════════════════════════════════════════════════
HAVEN — Multi-Theme Stylesheet
Themes: Haven (default), Discord, Matrix, Tron, HALO, LoTR
═══════════════════════════════════════════════════════════ */
@import url('https://fonts.googleapis.com/css2?family=VT323&family=Share+Tech+Mono&display=swap');
/* ─── THEME: Haven (Default) ───────────────────────────── */
:root, [data-theme="haven"] {
--bg-primary: #191b28;
--bg-secondary: #1e2035;
--bg-tertiary: #252840;
--bg-hover: #2c2f4a;
--bg-active: #333660;
--bg-input: #15172a;
--bg-card: #1c1e33;
--accent: #7c5cfc;
--accent-hover: #9478ff;
--accent-dim: #5a3fd4;
--accent-glow: rgba(124, 92, 252, 0.25);
--text-primary: #e2e4f0;
--text-secondary:#9498b3;
--text-muted: #5d6180;
--text-link: #82aaff;
--border: #2d3050;
--border-light: #383b5e;
--success: #43b581;
--danger: #f04747;
--warning: #faa61a;
--led-on: #43b581;
--led-off: #555;
--led-glow: rgba(67, 181, 129, 0.5);
--font-main: 'Segoe UI', system-ui, -apple-system, sans-serif;
--font-mono: 'Consolas', 'Courier New', monospace;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--radius: 8px;
--radius-sm: 4px;
--transition: 0.15s ease;
--sidebar-width: 270px;
--right-width: 260px;
--theme-logo: "⬡";
--msg-glow: none;
--scanline: none;
}
/* ─── THEME: Discord ───────────────────────────────────── */
[data-theme="discord"] {
--bg-primary: #313338;
--bg-secondary: #2b2d31;
--bg-tertiary: #383a40;
--bg-hover: #3a3c42;
--bg-active: #43454d;
--bg-input: #1e1f22;
--bg-card: #2b2d31;
--accent: #5865f2;
--accent-hover: #6d78f5;
--accent-dim: #4752c4;
--accent-glow: rgba(88, 101, 242, 0.25);
--text-primary: #f2f3f5;
--text-secondary:#b5bac1;
--text-muted: #6d6f78;
--text-link: #00a8fc;
--border: #3f4147;
--border-light: #4e5058;
--success: #23a55a;
--danger: #f23f43;
--warning: #f0b232;
--led-on: #23a55a;
--led-glow: rgba(35, 165, 90, 0.5);
--theme-logo: "🎮";
}
/* ─── THEME: Matrix ────────────────────────────────────── */
[data-theme="matrix"] {
--bg-primary: #0a0a0a;
--bg-secondary: #0d0d0d;
--bg-tertiary: #141414;
--bg-hover: #1a1a1a;
--bg-active: #002200;
--bg-input: #050505;
--bg-card: #0d0d0d;
--accent: #00ff41;
--accent-hover: #33ff66;
--accent-dim: #00cc33;
--accent-glow: rgba(0, 255, 65, 0.3);
--text-primary: #00ff41;
--text-secondary:#00bb30;
--text-muted: #006618;
--text-link: #00ff99;
--border: #003300;
--border-light: #004400;
--success: #00ff41;
--danger: #ff0040;
--warning: #ccff00;
--led-on: #00ff41;
--led-glow: rgba(0, 255, 65, 0.6);
--font-main: 'Courier New', 'Consolas', monospace;
--font-heading: 'Courier New', monospace;
--font-mono: 'Courier New', monospace;
--theme-logo: "";
--msg-glow: 0 0 4px rgba(0, 255, 65, 0.15);
--scanline: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(0, 255, 65, 0.015) 2px,
rgba(0, 255, 65, 0.015) 4px
);
}
/* Matrix accent overrides — glitch aesthetic */
[data-theme="matrix"] .brand-text { text-shadow: 0 0 8px rgba(0, 255, 65, 0.4); }
[data-theme="matrix"] .channel-badge { background: #00ff41; color: #000; }
[data-theme="matrix"] .message-avatar, [data-theme="matrix"] .message-avatar-img { border: 1px solid rgba(0, 255, 65, 0.3); }
/* ─── THEME: Tron ──────────────────────────────────────── */
[data-theme="tron"] {
--bg-primary: #0c141f;
--bg-secondary: #0a1018;
--bg-tertiary: #111d2b;
--bg-hover: #162536;
--bg-active: #0d3a5c;
--bg-input: #060d16;
--bg-card: #0a1018;
--accent: #6fecff;
--accent-hover: #9df3ff;
--accent-dim: #3ec6df;
--accent-glow: rgba(111, 236, 255, 0.3);
--text-primary: #d4f6ff;
--text-secondary:#7ab8cc;
--text-muted: #3a6a7a;
--text-link: #6fecff;
--border: #1a3344;
--border-light: #244455;
--success: #6fecff;
--danger: #ff6f3f;
--warning: #ffe76f;
--led-on: #6fecff;
--led-glow: rgba(111, 236, 255, 0.6);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--theme-logo: "◈";
--msg-glow: 0 0 4px rgba(111, 236, 255, 0.08);
}
/* Tron accent overrides — identity disc glow */
[data-theme="tron"] .brand-text { text-shadow: 0 0 10px rgba(111, 236, 255, 0.4); color: #6fecff; }
[data-theme="tron"] .server-icon.home { background: transparent; border: 2px solid #6fecff; box-shadow: 0 0 8px rgba(111, 236, 255, 0.4); }
[data-theme="tron"] .channel-item.active::before { background: #6fecff; box-shadow: 0 0 6px rgba(111, 236, 255, 0.5); }
[data-theme="tron"] .btn-send { box-shadow: 0 0 8px rgba(111, 236, 255, 0.3); }
[data-theme="tron"] .message-avatar, [data-theme="tron"] .message-avatar-img { border: 1px solid rgba(111, 236, 255, 0.25); }
/* ─── THEME: HALO ──────────────────────────────────────── */
[data-theme="halo"] {
--bg-primary: #0d1a0d;
--bg-secondary: #0a150a;
--bg-tertiary: #142214;
--bg-hover: #1a2e1a;
--bg-active: #1f3a1f;
--bg-input: #070e07;
--bg-card: #0c170c;
--accent: #d4a020;
--accent-hover: #e8b832;
--accent-dim: #b08818;
--accent-glow: rgba(212, 160, 32, 0.35);
--text-primary: #d4e0c8;
--text-secondary:#8aaa78;
--text-muted: #4a6a3a;
--text-link: #4fc3f7;
--border: #1a3318;
--border-light: #264a22;
--success: #4ca64c;
--danger: #cc3333;
--warning: #d4a020;
--led-on: #d4a020;
--led-glow: rgba(212, 160, 32, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⌁";
--msg-glow: 0 0 4px rgba(212, 160, 32, 0.06);
}
/* HALO accent overrides — energy sword blue highlights */
[data-theme="halo"] .channel-item.active::before { background: #4fc3f7; }
[data-theme="halo"] .btn-send { background: #4fc3f7; }
[data-theme="halo"] .btn-send:hover { background: #6fd4ff; }
[data-theme="halo"] .mention { background: rgba(79, 195, 247, 0.15); color: #4fc3f7; }
[data-theme="halo"] .reaction-badge.own { background: rgba(79, 195, 247, 0.2); border-color: #4fc3f7; }
[data-theme="halo"] .reaction-badge:hover { background: rgba(79, 195, 247, 0.15); border-color: #4fc3f7; }
[data-theme="halo"] .channel-badge { background: #4fc3f7; }
[data-theme="halo"] .server-icon.home { background: linear-gradient(135deg, #4ca64c, #d4a020); }
[data-theme="halo"] .server-icon:hover { background: #4fc3f7; }
[data-theme="halo"] .brand-text { background: linear-gradient(90deg, #4ca64c, #d4a020, #4fc3f7); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="halo"] .inline-code { color: #4fc3f7; }
/* ─── THEME: LoTR ──────────────────────────────────────── */
[data-theme="lotr"] {
--bg-primary: #1a1510;
--bg-secondary: #1e1812;
--bg-tertiary: #2a221a;
--bg-hover: #342a20;
--bg-active: #3e3225;
--bg-input: #140f0a;
--bg-card: #1e1812;
--accent: #d4a844;
--accent-hover: #e0be66;
--accent-dim: #b08830;
--accent-glow: rgba(212, 168, 68, 0.3);
--text-primary: #e8dcc8;
--text-secondary:#b0a088;
--text-muted: #6e6050;
--text-link: #e0c070;
--border: #3a3028;
--border-light: #4a3e32;
--success: #6e9e3a;
--danger: #b03030;
--warning: #d4a844;
--led-on: #d4a844;
--led-glow: rgba(212, 168, 68, 0.5);
--font-main: 'Palatino Linotype', 'Book Antiqua', Palatino, Georgia, serif;
--font-heading: 'Palatino Linotype', 'Book Antiqua', Georgia, serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⚜";
/* Worn parchment scanlines */
--scanline: repeating-linear-gradient(
0deg,
transparent,
transparent 3px,
rgba(212, 168, 68, 0.008) 3px,
rgba(212, 168, 68, 0.008) 6px
);
}
/* LoTR accent overrides — elvish warmth */
[data-theme="lotr"] .brand-text { font-style: italic; }
[data-theme="lotr"] .welcome-icon { color: #d4a844; }
[data-theme="lotr"] .server-icon.home { background: linear-gradient(135deg, #8a6a20, #d4a844); }
/* ─── THEME: Cyberpunk ─────────────────────────────────── */
[data-theme="cyberpunk"] {
--bg-primary: #0a0a12;
--bg-secondary: #0e0e1a;
--bg-tertiary: #151525;
--bg-hover: #1c1c32;
--bg-active: #2a1a3a;
--bg-input: #06060e;
--bg-card: #0e0e1a;
--accent: #ff2d6f;
--accent-hover: #ff5a90;
--accent-dim: #cc1a55;
--accent-glow: rgba(255, 45, 111, 0.3);
--text-primary: #f0e6ff;
--text-secondary:#b090d0;
--text-muted: #5a4080;
--text-link: #00f0ff;
--border: #2a1a40;
--border-light: #3a2a55;
--success: #00ff88;
--danger: #ff2d6f;
--warning: #ffe14d;
--led-on: #00ff88;
--led-glow: rgba(0, 255, 136, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⚡";
--msg-glow: 0 0 4px rgba(255, 45, 111, 0.08);
}
/* Cyberpunk accent splashes — neon contrasts */
[data-theme="cyberpunk"] .channel-item.active::before { background: #00f0ff; }
[data-theme="cyberpunk"] .inline-code { color: #00f0ff; }
[data-theme="cyberpunk"] .brand-text { background: linear-gradient(90deg, #ff2d6f, #00f0ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="cyberpunk"] .server-icon.home { background: linear-gradient(135deg, #ff2d6f, #00f0ff); }
/* ─── THEME: Nord ──────────────────────────────────────── */
[data-theme="nord"] {
--bg-primary: #2e3440;
--bg-secondary: #3b4252;
--bg-tertiary: #434c5e;
--bg-hover: #4c566a;
--bg-active: #5e6a82;
--bg-input: #2a2f3b;
--bg-card: #3b4252;
--accent: #88c0d0;
--accent-hover: #8fbcbb;
--accent-dim: #5e81ac;
--accent-glow: rgba(136, 192, 208, 0.25);
--text-primary: #eceff4;
--text-secondary:#d8dee9;
--text-muted: #7b88a1;
--text-link: #88c0d0;
--border: #4c566a;
--border-light: #5e6a82;
--success: #a3be8c;
--danger: #bf616a;
--warning: #ebcb8b;
--led-on: #a3be8c;
--led-glow: rgba(163, 190, 140, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "❄";
}
/* Nord accent splashes — aurora colors */
[data-theme="nord"] .mention { background: rgba(180, 142, 173, 0.2); color: #b48ead; }
[data-theme="nord"] .brand-text { color: #88c0d0; }
/* ─── THEME: Dracula ───────────────────────────────────── */
[data-theme="dracula"] {
--bg-primary: #1a1b26;
--bg-secondary: #16171f;
--bg-tertiary: #22232e;
--bg-hover: #2a2c3a;
--bg-active: #32344a;
--bg-input: #12131a;
--bg-card: #16171f;
--accent: #bd93f9;
--accent-hover: #caa6fc;
--accent-dim: #9d73d9;
--accent-glow: rgba(189, 147, 249, 0.3);
--text-primary: #f8f8f2;
--text-secondary:#b0b0c0;
--text-muted: #565a7a;
--text-link: #8be9fd;
--border: #2a2c40;
--border-light: #383a52;
--success: #50fa7b;
--danger: #ff5555;
--warning: #f1fa8c;
--led-on: #50fa7b;
--led-glow: rgba(80, 250, 123, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🧛";
--msg-glow: 0 0 4px rgba(189, 147, 249, 0.06);
}
/* Dracula accent splashes */
[data-theme="dracula"] .inline-code { color: #50fa7b; }
[data-theme="dracula"] .mention { background: rgba(255, 121, 198, 0.15); color: #ff79c6; }
[data-theme="dracula"] .brand-text { background: linear-gradient(90deg, #bd93f9, #ff79c6); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
/* ─── THEME: Bloodborne (Red & Black) ──────────────────── */
[data-theme="bloodborne"] {
--bg-primary: #0a0000;
--bg-secondary: #110808;
--bg-tertiary: #1a0c0c;
--bg-hover: #2a1010;
--bg-active: #3a1515;
--bg-input: #060000;
--bg-card: #110808;
--accent: #cc0020;
--accent-hover: #ff1a3a;
--accent-dim: #990018;
--accent-glow: rgba(204, 0, 32, 0.4);
--text-primary: #f0d0d0;
--text-secondary:#b08080;
--text-muted: #6a3a3a;
--text-link: #ff4060;
--border: #2a1515;
--border-light: #3a2020;
--success: #cc0020;
--danger: #ff0030;
--warning: #ff6600;
--led-on: #ff0030;
--led-off: #330000;
--led-glow: rgba(255, 0, 48, 0.6);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🩸";
--msg-glow: 0 0 6px rgba(204, 0, 32, 0.12);
}
/* Bloodborne accent overrides — blood and darkness */
[data-theme="bloodborne"] .brand-text { color: #cc0020; text-shadow: 0 0 12px rgba(204, 0, 32, 0.5); }
[data-theme="bloodborne"] .server-icon.home { background: linear-gradient(135deg, #660010, #cc0020); box-shadow: 0 0 10px rgba(204, 0, 32, 0.4); }
[data-theme="bloodborne"] .channel-item.active::before { background: #ff0030; box-shadow: 0 0 8px rgba(255, 0, 48, 0.6); }
[data-theme="bloodborne"] .btn-send { box-shadow: 0 0 8px rgba(204, 0, 32, 0.4); }
[data-theme="bloodborne"] .message-avatar, [data-theme="bloodborne"] .message-avatar-img { border: 1px solid rgba(204, 0, 32, 0.3); }
[data-theme="bloodborne"] .channel-badge { background: #cc0020; color: #fff; }
[data-theme="bloodborne"] .inline-code { color: #ff4060; }
/* ─── THEME: Ice (Ice Blue) ────────────────────────────── */
[data-theme="ice"] {
--bg-primary: #0a1520;
--bg-secondary: #0c1a28;
--bg-tertiary: #102030;
--bg-hover: #142838;
--bg-active: #183040;
--bg-input: #060e18;
--bg-card: #0c1a28;
--accent: #00d4ff;
--accent-hover: #40e0ff;
--accent-dim: #00a8cc;
--accent-glow: rgba(0, 212, 255, 0.35);
--text-primary: #d8f0ff;
--text-secondary:#80b8d8;
--text-muted: #3a6a88;
--text-link: #00d4ff;
--border: #1a3048;
--border-light: #224058;
--success: #00d4ff;
--danger: #ff3060;
--warning: #ffcc00;
--led-on: #00d4ff;
--led-off: #0a1a2a;
--led-glow: rgba(0, 212, 255, 0.6);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🧊";
--msg-glow: 0 0 4px rgba(0, 212, 255, 0.08);
}
/* Ice accent overrides — frozen glow */
[data-theme="ice"] .brand-text { color: #00d4ff; text-shadow: 0 0 12px rgba(0, 212, 255, 0.5); }
[data-theme="ice"] .server-icon.home { background: linear-gradient(135deg, #005580, #00d4ff); box-shadow: 0 0 10px rgba(0, 212, 255, 0.3); }
[data-theme="ice"] .channel-item.active::before { background: #00d4ff; box-shadow: 0 0 8px rgba(0, 212, 255, 0.5); }
[data-theme="ice"] .btn-send { box-shadow: 0 0 8px rgba(0, 212, 255, 0.3); }
[data-theme="ice"] .message-avatar, [data-theme="ice"] .message-avatar-img { border: 1px solid rgba(0, 212, 255, 0.25); }
[data-theme="ice"] .channel-badge { background: #00d4ff; color: #0a1520; }
[data-theme="ice"] .inline-code { color: #40e0ff; }
/* ─── THEME: Abyss (Deep Ocean / Navy Blue) ────────────── */
[data-theme="abyss"] {
--bg-primary: #040810;
--bg-secondary: #060c18;
--bg-tertiary: #0a1220;
--bg-hover: #0e1830;
--bg-active: #122040;
--bg-input: #020610;
--bg-card: #060c18;
--accent: #1a5aff;
--accent-hover: #3a70ff;
--accent-dim: #0040cc;
--accent-glow: rgba(26, 90, 255, 0.35);
--text-primary: #c8d8f0;
--text-secondary:#7088b0;
--text-muted: #384868;
--text-link: #4488ff;
--border: #101830;
--border-light: #182240;
--success: #00cc88;
--danger: #ff2050;
--warning: #ff8800;
--led-on: #1a5aff;
--led-off: #0a0e1a;
--led-glow: rgba(26, 90, 255, 0.6);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🌊";
--msg-glow: 0 0 4px rgba(26, 90, 255, 0.08);
}
/* Abyss accent overrides — deep ocean pressure */
[data-theme="abyss"] .brand-text { color: #4488ff; text-shadow: 0 0 12px rgba(26, 90, 255, 0.5); }
[data-theme="abyss"] .server-icon.home { background: linear-gradient(135deg, #0a2060, #1a5aff); box-shadow: 0 0 10px rgba(26, 90, 255, 0.3); }
[data-theme="abyss"] .channel-item.active::before { background: #1a5aff; box-shadow: 0 0 8px rgba(26, 90, 255, 0.5); }
[data-theme="abyss"] .btn-send { box-shadow: 0 0 8px rgba(26, 90, 255, 0.3); }
[data-theme="abyss"] .message-avatar, [data-theme="abyss"] .message-avatar-img { border: 1px solid rgba(26, 90, 255, 0.25); }
[data-theme="abyss"] .channel-badge { background: #1a5aff; color: #fff; }
[data-theme="abyss"] .inline-code { color: #4488ff; }
/* ─── THEME: Dark Souls ────────────────────────────────── */
[data-theme="darksouls"] {
--bg-primary: #0c0a08;
--bg-secondary: #110e0b;
--bg-tertiary: #1a1510;
--bg-hover: #241e16;
--bg-active: #2e261c;
--bg-input: #080604;
--bg-card: #110e0b;
--accent: #c8a84e;
--accent-hover: #dcc06a;
--accent-dim: #a08030;
--accent-glow: rgba(200, 168, 78, 0.35);
--text-primary: #d8ccb0;
--text-secondary:#9a8a70;
--text-muted: #5a4e3a;
--text-link: #d4a844;
--border: #2a2218;
--border-light: #3a3020;
--success: #b0a030;
--danger: #a03020;
--warning: #c8a84e;
--led-on: #c8a84e;
--led-off: #1a1208;
--led-glow: rgba(200, 168, 78, 0.5);
--font-main: 'Palatino Linotype', Georgia, serif;
--font-heading: 'Palatino Linotype', Georgia, serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🔥";
--msg-glow: 0 0 6px rgba(200, 168, 78, 0.08);
}
[data-theme="darksouls"] .brand-text { color: #c8a84e; text-shadow: 0 0 10px rgba(200, 168, 78, 0.4); }
[data-theme="darksouls"] .server-icon.home { background: linear-gradient(135deg, #5a4420, #c8a84e); box-shadow: 0 0 8px rgba(200, 168, 78, 0.3); }
[data-theme="darksouls"] .channel-item.active::before { background: #c8a84e; box-shadow: 0 0 6px rgba(200, 168, 78, 0.5); }
[data-theme="darksouls"] .inline-code { color: #dcc06a; }
[data-theme="darksouls"] .message-avatar, [data-theme="darksouls"] .message-avatar-img { border: 1px solid rgba(200, 168, 78, 0.2); }
/* ─── THEME: Elden Ring ────────────────────────────────── */
[data-theme="eldenring"] {
--bg-primary: #08080e;
--bg-secondary: #0c0c16;
--bg-tertiary: #14141e;
--bg-hover: #1c1c2a;
--bg-active: #242438;
--bg-input: #060608;
--bg-card: #0c0c16;
--accent: #d4a832;
--accent-hover: #e8c050;
--accent-dim: #b08820;
--accent-glow: rgba(212, 168, 50, 0.35);
--text-primary: #e0d8c8;
--text-secondary:#a098a0;
--text-muted: #584860;
--text-link: #80a0d0;
--border: #1e1e30;
--border-light: #2a2a40;
--success: #60b060;
--danger: #c03020;
--warning: #d4a832;
--led-on: #d4a832;
--led-off: #0a0a10;
--led-glow: rgba(212, 168, 50, 0.5);
--font-main: 'Palatino Linotype', Georgia, serif;
--font-heading: 'Palatino Linotype', Georgia, serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "💍";
--msg-glow: 0 0 4px rgba(212, 168, 50, 0.06);
}
[data-theme="eldenring"] .brand-text { background: linear-gradient(90deg, #d4a832, #8080c0); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="eldenring"] .server-icon.home { background: linear-gradient(135deg, #3a3060, #d4a832); box-shadow: 0 0 10px rgba(212, 168, 50, 0.3); }
[data-theme="eldenring"] .channel-item.active::before { background: #d4a832; box-shadow: 0 0 8px rgba(212, 168, 50, 0.5); }
[data-theme="eldenring"] .inline-code { color: #80a0d0; }
[data-theme="eldenring"] .message-avatar, [data-theme="eldenring"] .message-avatar-img { border: 1px solid rgba(212, 168, 50, 0.2); }
/* ─── THEME: Minecraft ─────────────────────────────────── */
[data-theme="minecraft"] {
--bg-primary: #1a1a1a;
--bg-secondary: #222222;
--bg-tertiary: #2e2e2e;
--bg-hover: #3a3a3a;
--bg-active: #444444;
--bg-input: #141414;
--bg-card: #222222;
--accent: #55bb55;
--accent-hover: #70d070;
--accent-dim: #3a8a3a;
--accent-glow: rgba(85, 187, 85, 0.3);
--text-primary: #e8e8e8;
--text-secondary:#aaaaaa;
--text-muted: #666666;
--text-link: #55bbff;
--border: #3a3a3a;
--border-light: #4a4a4a;
--success: #55bb55;
--danger: #cc3333;
--warning: #ffaa00;
--led-on: #55bb55;
--led-off: #1a1a1a;
--led-glow: rgba(85, 187, 85, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⛏️";
}
[data-theme="minecraft"] .brand-text { color: #55bb55; text-shadow: 2px 2px 0 #2a5a2a; }
[data-theme="minecraft"] .server-icon.home { background: #55bb55; box-shadow: 2px 2px 0 #2a5a2a; border-radius: 4px; }
[data-theme="minecraft"] .server-icon:hover { border-radius: 4px; }
[data-theme="minecraft"] .channel-item.active::before { background: #55bb55; }
[data-theme="minecraft"] .inline-code { color: #55bbff; }
[data-theme="minecraft"] .message-avatar, [data-theme="minecraft"] .message-avatar-img { border: 2px solid #3a3a3a; border-radius: 4px; }
[data-theme="minecraft"] .channel-badge { background: #55bb55; color: #1a1a1a; }
/* ─── THEME: Final Fantasy X ───────────────────────────── */
[data-theme="ffx"] {
--bg-primary: #080e1a;
--bg-secondary: #0b1325;
--bg-tertiary: #101a30;
--bg-hover: #16223e;
--bg-active: #1c2a4a;
--bg-input: #060a14;
--bg-card: #0b1325;
--accent: #40a8e0;
--accent-hover: #60c0f0;
--accent-dim: #2080b0;
--accent-glow: rgba(64, 168, 224, 0.3);
--text-primary: #d0e4f0;
--text-secondary:#80a0c0;
--text-muted: #3a5a78;
--text-link: #60c0f0;
--border: #1a2a40;
--border-light: #223450;
--success: #40c8a0;
--danger: #e0504a;
--warning: #f0c040;
--led-on: #40a8e0;
--led-off: #0a1020;
--led-glow: rgba(64, 168, 224, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⚔️";
--msg-glow: 0 0 4px rgba(64, 168, 224, 0.06);
}
[data-theme="ffx"] .brand-text { background: linear-gradient(90deg, #40a8e0, #c0a040); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="ffx"] .server-icon.home { background: linear-gradient(135deg, #1a4070, #40a8e0); box-shadow: 0 0 10px rgba(64, 168, 224, 0.3); }
[data-theme="ffx"] .channel-item.active::before { background: #40a8e0; box-shadow: 0 0 8px rgba(64, 168, 224, 0.4); }
[data-theme="ffx"] .inline-code { color: #60c0f0; }
[data-theme="ffx"] .message-avatar, [data-theme="ffx"] .message-avatar-img { border: 1px solid rgba(64, 168, 224, 0.25); }
/* ─── THEME: Legend of Zelda ───────────────────────────── */
[data-theme="zelda"] {
--bg-primary: #0a120a;
--bg-secondary: #0e180e;
--bg-tertiary: #142014;
--bg-hover: #1c2c1c;
--bg-active: #243424;
--bg-input: #060e06;
--bg-card: #0e180e;
--accent: #44bb44;
--accent-hover: #60d060;
--accent-dim: #2a8a2a;
--accent-glow: rgba(68, 187, 68, 0.3);
--text-primary: #d8e8d0;
--text-secondary:#90b088;
--text-muted: #4a6a42;
--text-link: #70c870;
--border: #1c2e1c;
--border-light: #283a28;
--success: #44bb44;
--danger: #cc3030;
--warning: #e8c030;
--led-on: #44bb44;
--led-off: #0a140a;
--led-glow: rgba(68, 187, 68, 0.5);
--font-main: 'Segoe UI', system-ui, sans-serif;
--font-heading: 'Segoe UI', system-ui, sans-serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🗡️";
}
[data-theme="zelda"] .brand-text { background: linear-gradient(90deg, #44bb44, #e8c030); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="zelda"] .server-icon.home { background: linear-gradient(135deg, #1a6a1a, #e8c030); box-shadow: 0 0 8px rgba(68, 187, 68, 0.3); }
[data-theme="zelda"] .channel-item.active::before { background: #44bb44; box-shadow: 0 0 6px rgba(68, 187, 68, 0.5); }
[data-theme="zelda"] .inline-code { color: #70c870; }
[data-theme="zelda"] .mention { background: rgba(68, 187, 68, 0.15); color: #60d060; }
[data-theme="zelda"] .message-avatar, [data-theme="zelda"] .message-avatar-img { border: 1px solid rgba(68, 187, 68, 0.25); }
[data-theme="zelda"] .channel-badge { background: #44bb44; color: #0a120a; }
/* ─── THEME: Fallout / PIP-Boy ─────────────────────────── */
[data-theme="fallout"] {
--bg-primary: #0a0e08;
--bg-secondary: #0e1410;
--bg-tertiary: #141c14;
--bg-hover: #1a2818;
--bg-active: #1e3020;
--bg-input: #060a04;
--bg-card: #0c1208;
--accent: #14fe17;
--accent-hover: #44ff44;
--accent-dim: #0abc0e;
--accent-glow: rgba(20, 254, 23, 0.25);
--text-primary: #14fe17;
--text-secondary:#0ecc12;
--text-muted: #0a6e0c;
--text-link: #44ff44;
--border: #0f5e10;
--border-light: #148014;
--success: #14fe17;
--danger: #ff4444;
--warning: #cccc00;
--led-on: #14fe17;
--led-off: #0a1408;
--led-glow: rgba(20, 254, 23, 0.6);
--font-main: 'Share Tech Mono', 'Courier New', monospace;
--font-heading: 'Share Tech Mono', 'Courier New', monospace;
--font-mono: 'Share Tech Mono', 'Courier New', monospace;
--theme-logo: "☢️";
--scanline: repeating-linear-gradient(
0deg,
transparent,
transparent 2px,
rgba(20, 254, 23, 0.03) 2px,
rgba(20, 254, 23, 0.03) 4px
);
}
[data-theme="fallout"] .brand-text { color: #14fe17; text-shadow: 0 0 8px rgba(20, 254, 23, 0.6); letter-spacing: 2px; text-transform: uppercase; }
[data-theme="fallout"] .server-icon.home { background: #0a1a08; border: 1px solid #14fe17; box-shadow: 0 0 8px rgba(20, 254, 23, 0.3); color: #14fe17; }
[data-theme="fallout"] .channel-item.active::before { background: #14fe17; box-shadow: 0 0 8px rgba(20, 254, 23, 0.6); }
[data-theme="fallout"] .message-avatar, [data-theme="fallout"] .message-avatar-img { border: 1px solid #14fe17; border-radius: 2px; }
[data-theme="fallout"] .inline-code { color: #14fe17; background: rgba(20, 254, 23, 0.08); border: 1px solid rgba(20, 254, 23, 0.2); }
[data-theme="fallout"] .channel-badge { background: #14fe17; color: #0a0e08; }
[data-theme="fallout"] .btn-voice { border: 1px solid rgba(20, 254, 23, 0.3); }
[data-theme="fallout"] .btn-voice.active { background: #14fe17; color: #0a0e08; text-shadow: none; }
[data-theme="fallout"] .sidebar { border-right: 1px solid rgba(20, 254, 23, 0.2); }
[data-theme="fallout"] .channel-header { border-bottom: 1px solid rgba(20, 254, 23, 0.2); }
[data-theme="fallout"] .message-row { text-shadow: 0 0 2px rgba(20, 254, 23, 0.15); }
[data-theme="fallout"] .modal { border: 1px solid rgba(20, 254, 23, 0.3); box-shadow: 0 0 20px rgba(20, 254, 23, 0.15); }
[data-theme="fallout"] input, [data-theme="fallout"] textarea { border: 1px solid rgba(20, 254, 23, 0.15) !important; }
[data-theme="fallout"] .message-input-container { border: 1px solid rgba(20, 254, 23, 0.2); border-radius: 2px; }
[data-theme="fallout"] ::selection { background: #14fe17; color: #0a0e08; }
/* ─── THEME: Scripture (Parchment & Gold) ──────────────── */
[data-theme="scripture"] {
--bg-primary: #1a1610;
--bg-secondary: #201c14;
--bg-tertiary: #2a2418;
--bg-hover: #342c20;
--bg-active: #3e3428;
--bg-input: #14120c;
--bg-card: #1e1a12;
--accent: #c8a84c;
--accent-hover: #dcc06a;
--accent-dim: #a08030;
--accent-glow: rgba(200, 168, 76, 0.25);
--text-primary: #e8dcc8;
--text-secondary:#b8a888;
--text-muted: #6e6048;
--text-link: #dcc06a;
--border: #302818;
--border-light: #3e3422;
--success: #6aaa4a;
--danger: #b84030;
--warning: #d4a030;
--led-on: #c8a84c;
--led-off: #1a1408;
--led-glow: rgba(200, 168, 76, 0.5);
--font-main: 'Georgia', 'Times New Roman', serif;
--font-heading: 'Georgia', 'Times New Roman', serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "✝️";
}
[data-theme="scripture"] .brand-text { color: #c8a84c; text-shadow: 0 0 10px rgba(200, 168, 76, 0.3); font-style: italic; }
[data-theme="scripture"] .server-icon.home { background: linear-gradient(135deg, #2a2010, #c8a84c); box-shadow: 0 0 8px rgba(200, 168, 76, 0.2); }
[data-theme="scripture"] .channel-item.active::before { background: #c8a84c; box-shadow: 0 0 6px rgba(200, 168, 76, 0.4); }
[data-theme="scripture"] .inline-code { color: #dcc06a; background: rgba(200, 168, 76, 0.08); }
[data-theme="scripture"] .mention { background: rgba(200, 168, 76, 0.12); color: #dcc06a; }
[data-theme="scripture"] .message-avatar, [data-theme="scripture"] .message-avatar-img { border: 1px solid rgba(200, 168, 76, 0.2); }
[data-theme="scripture"] .channel-badge { background: #c8a84c; color: #1a1610; }
[data-theme="scripture"] .modal { border: 1px solid rgba(200, 168, 76, 0.2); box-shadow: 0 0 20px rgba(200, 168, 76, 0.08); }
[data-theme="scripture"] ::selection { background: #c8a84c; color: #1a1610; }
/* Scripture ambient: sunlight through a crucifix window */
@keyframes scripture-cross-pulse {
0%, 100% { opacity: 0.03; }
50% { opacity: 0.07; }
}
[data-theme="scripture"] .main {
position: relative;
}
[data-theme="scripture"] .main::after {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
z-index: 0;
background:
/* vertical beam */
linear-gradient(to bottom,
transparent 10%,
rgba(200, 168, 76, 0.08) 25%,
rgba(200, 168, 76, 0.14) 40%,
rgba(200, 168, 76, 0.08) 55%,
transparent 75%)
center / 6% 100% no-repeat,
/* horizontal beam */
linear-gradient(to right,
transparent 25%,
rgba(200, 168, 76, 0.08) 38%,
rgba(200, 168, 76, 0.12) 46%,
rgba(200, 168, 76, 0.12) 54%,
rgba(200, 168, 76, 0.08) 62%,
transparent 75%)
center 30% / 100% 5% no-repeat,
/* warm radial glow behind the cross */
radial-gradient(ellipse 30% 50% at 50% 38%,
rgba(200, 168, 76, 0.06) 0%,
transparent 70%);
animation: scripture-cross-pulse 8s ease-in-out infinite;
mix-blend-mode: screen;
}
/* ─── THEME: Chapel (Stained Glass) ────────────────────── */
[data-theme="chapel"] {
--bg-primary: #0e0c18;
--bg-secondary: #12101e;
--bg-tertiary: #1a1628;
--bg-hover: #221e32;
--bg-active: #2a263c;
--bg-input: #0a0814;
--bg-card: #12101e;
--accent: #8a5cf0;
--accent-hover: #a07af8;
--accent-dim: #6a3cc8;
--accent-glow: rgba(138, 92, 240, 0.25);
--text-primary: #e0d8f0;
--text-secondary:#a898c8;
--text-muted: #5e5078;
--text-link: #70b8ff;
--border: #201a30;
--border-light: #2c2640;
--success: #4acc70;
--danger: #cc4040;
--warning: #e8b840;
--led-on: #8a5cf0;
--led-off: #0e0a18;
--led-glow: rgba(138, 92, 240, 0.5);
--font-main: 'Georgia', 'Times New Roman', serif;
--font-heading: 'Georgia', 'Times New Roman', serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "⛪";
}
[data-theme="chapel"] .brand-text { background: linear-gradient(90deg, #8a5cf0, #70b8ff, #e8b840); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
[data-theme="chapel"] .server-icon.home { background: linear-gradient(135deg, #4a2ca0, #8a5cf0); box-shadow: 0 0 10px rgba(138, 92, 240, 0.3); }
[data-theme="chapel"] .channel-item.active::before { background: #8a5cf0; box-shadow: 0 0 6px rgba(138, 92, 240, 0.5); }
[data-theme="chapel"] .inline-code { color: #a07af8; background: rgba(138, 92, 240, 0.08); }
[data-theme="chapel"] .mention { background: rgba(138, 92, 240, 0.12); color: #a07af8; }
[data-theme="chapel"] .message-avatar, [data-theme="chapel"] .message-avatar-img { border: 1px solid rgba(138, 92, 240, 0.2); }
[data-theme="chapel"] .channel-badge { background: #8a5cf0; color: #0e0c18; }
[data-theme="chapel"] .modal { border: 1px solid rgba(138, 92, 240, 0.2); box-shadow: 0 0 20px rgba(138, 92, 240, 0.1); }
[data-theme="chapel"] ::selection { background: #8a5cf0; color: #0e0c18; }
/* Chapel ambient: prismatic stained glass light beams */
@keyframes chapel-glass-shift {
0% { opacity: 0.04; filter: hue-rotate(0deg); }
33% { opacity: 0.07; filter: hue-rotate(15deg); }
66% { opacity: 0.05; filter: hue-rotate(-10deg); }
100% { opacity: 0.04; filter: hue-rotate(0deg); }
}
[data-theme="chapel"] .main {
position: relative;
}
[data-theme="chapel"] .main::after {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
z-index: 0;
background:
/* left violet beam */
linear-gradient(155deg,
transparent 15%,
rgba(138, 92, 240, 0.06) 25%,
rgba(102, 51, 204, 0.09) 35%,
transparent 50%)
no-repeat,
/* center rose beam */
linear-gradient(175deg,
transparent 20%,
rgba(200, 80, 140, 0.05) 35%,
rgba(220, 100, 160, 0.08) 45%,
transparent 60%)
no-repeat,
/* right gold beam */
linear-gradient(195deg,
transparent 30%,
rgba(200, 168, 76, 0.04) 45%,
rgba(220, 190, 100, 0.07) 55%,
transparent 70%)
no-repeat,
/* warm highlight core */
radial-gradient(ellipse 40% 35% at 50% 25%,
rgba(138, 92, 240, 0.04) 0%,
transparent 70%);
animation: chapel-glass-shift 12s ease-in-out infinite;
mix-blend-mode: screen;
}
/* ─── THEME: Gospel (Light Cream & Ruby) ───────────────── */
[data-theme="gospel"] {
--bg-primary: #f5f0e8;
--bg-secondary: #ebe4d8;
--bg-tertiary: #ddd5c8;
--bg-hover: #d0c8b8;
--bg-active: #c5bca8;
--bg-input: #faf7f0;
--bg-card: #eee8dc;
--accent: #8b2032;
--accent-hover: #a83040;
--accent-dim: #6e1828;
--accent-glow: rgba(139, 32, 50, 0.2);
--text-primary: #2a2018;
--text-secondary:#5a4e40;
--text-muted: #8a7e70;
--text-link: #8b2032;
--border: #d0c4b0;
--border-light: #c0b4a0;
--success: #3a7a30;
--danger: #b83030;
--warning: #c08a20;
--led-on: #3a7a30;
--led-off: #c0b4a0;
--led-glow: rgba(58, 122, 48, 0.5);
--font-main: 'Georgia', 'Times New Roman', serif;
--font-heading: 'Georgia', 'Times New Roman', serif;
--font-mono: 'Consolas', monospace;
--theme-logo: "🕊️";
}
[data-theme="gospel"] .brand-text { color: #8b2032; font-style: italic; }
[data-theme="gospel"] .server-icon.home { background: linear-gradient(135deg, #8b2032, #c8a84c); color: #fff; }
[data-theme="gospel"] .channel-item.active::before { background: #8b2032; box-shadow: 0 0 4px rgba(139, 32, 50, 0.3); }
[data-theme="gospel"] .inline-code { color: #8b2032; background: rgba(139, 32, 50, 0.06); border: 1px solid rgba(139, 32, 50, 0.12); }
[data-theme="gospel"] .mention { background: rgba(139, 32, 50, 0.08); color: #8b2032; }
[data-theme="gospel"] .message-avatar, [data-theme="gospel"] .message-avatar-img { border: 1px solid rgba(139, 32, 50, 0.15); }
[data-theme="gospel"] .channel-badge { background: #8b2032; color: #f5f0e8; }
[data-theme="gospel"] .sidebar { background: var(--bg-secondary); border-right: 1px solid var(--border); }
[data-theme="gospel"] .modal { border: 1px solid var(--border); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); }
[data-theme="gospel"] ::selection { background: #8b2032; color: #f5f0e8; }
/* Gospel ambient: soft divine radiance descending */
@keyframes gospel-radiance {
0%, 100% { opacity: 0.04; transform: scale(1); }
50% { opacity: 0.08; transform: scale(1.03); }
}
[data-theme="gospel"] .main {
position: relative;
}
[data-theme="gospel"] .main::after {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
z-index: 0;
background:
/* warm descending ray from top center */
linear-gradient(180deg,
rgba(200, 168, 76, 0.06) 0%,
rgba(220, 195, 120, 0.04) 15%,
transparent 45%)
no-repeat,
/* ruby tinted glow */
radial-gradient(ellipse 50% 40% at 50% 20%,
rgba(139, 32, 50, 0.04) 0%,
rgba(200, 168, 76, 0.02) 40%,
transparent 70%),
/* soft dove-like light spread */
radial-gradient(circle at 50% 10%,
rgba(255, 250, 240, 0.05) 0%,
transparent 50%);
animation: gospel-radiance 10s ease-in-out infinite;
}
/* ─── THEME: CRT ───────────────────────────────────────── */
[data-theme="crt"] {
--bg-primary: #080808;
--bg-secondary: #0a0a0a;
--bg-tertiary: #111111;
--bg-hover: #1a1a1a;
--bg-active: #222222;
--bg-input: #050505;
--bg-card: #0a0a0a;
--accent: #ffb000;
--accent-hover: #ffc844;
--accent-dim: #cc8800;
--accent-glow: rgba(255, 176, 0, 0.3);
--text-primary: #ffb000;
--text-secondary:#cc8800;
--text-muted: #664400;
--text-link: #ffc844;
--border: #332800;
--border-light: #4a3a10;
--success: #00cc00;
--danger: #ff2222;
--warning: #ffcc00;
--led-on: #ffb000;
--led-off: #221800;
--led-glow: rgba(255, 176, 0, 0.5);
--font-main: 'VT323', 'Courier New', monospace;
--font-heading: 'VT323', 'Courier New', monospace;
--font-mono: 'VT323', 'Courier New', monospace;
--theme-logo: "📺";
}
[data-theme="crt"] .brand-text { color: #ffb000; text-shadow: 0 0 6px rgba(255, 176, 0, 0.5); letter-spacing: 3px; text-transform: uppercase; }
[data-theme="crt"] .server-icon.home { background: #111; border: 2px solid #ffb000; box-shadow: 0 0 10px rgba(255, 176, 0, 0.2); color: #ffb000; }
[data-theme="crt"] .channel-item.active::before { background: #ffb000; box-shadow: 0 0 6px rgba(255, 176, 0, 0.5); }
[data-theme="crt"] .message-avatar, [data-theme="crt"] .message-avatar-img { border: 1px solid rgba(255, 176, 0, 0.3); border-radius: 0; }
[data-theme="crt"] .inline-code { color: #ffb000; background: rgba(255, 176, 0, 0.08); }
[data-theme="crt"] .channel-badge { background: #ffb000; color: #080808; }
[data-theme="crt"] .sidebar { border-right: 1px solid rgba(255, 176, 0, 0.15); }
[data-theme="crt"] .channel-header { border-bottom: 1px solid rgba(255, 176, 0, 0.15); }
[data-theme="crt"] .message-row { text-shadow: 0 0 1px rgba(255, 176, 0, 0.3); }
[data-theme="crt"] .modal { border: 2px solid #ffb000; box-shadow: 0 0 30px rgba(255, 176, 0, 0.15), inset 0 0 60px rgba(255, 176, 0, 0.03); border-radius: 0; }
[data-theme="crt"] input, [data-theme="crt"] textarea { border: 1px solid rgba(255, 176, 0, 0.2) !important; border-radius: 0 !important; }
[data-theme="crt"] .btn-voice { border: 1px solid rgba(255, 176, 0, 0.3); border-radius: 0; }
[data-theme="crt"] .btn-sm { border-radius: 0; }
[data-theme="crt"] .message-input-container { border: 1px solid rgba(255, 176, 0, 0.2); border-radius: 0; }
[data-theme="crt"] ::selection { background: #ffb000; color: #080808; }
/* ─── THEME: Windows 95 ────────────────────────────────── */
[data-theme="win95"] {
--bg-primary: #bfbfbf;
--bg-secondary: #bfbfbf;
--bg-tertiary: #bfbfbf;
--bg-hover: #000080;
--bg-active: #000080;
--bg-input: #ffffff;
--bg-card: #ffffff;
--accent: #000080;
--accent-hover: #0000aa;
--accent-dim: #000066;
--accent-glow: rgba(0, 0, 128, 0.2);
--text-primary: #000000;
--text-secondary:#000000;
--text-muted: #808080;
--text-link: #000080;
--border: #808080;
--border-light: #dfdfdf;
--success: #008000;
--danger: #cc0000;
--warning: #808000;
--led-on: #008000;
--led-off: #808080;
--led-glow: rgba(0, 128, 0, 0.4);
--font-main: 'MS Sans Serif', 'Tahoma', 'Arial', sans-serif;
--font-heading: 'MS Sans Serif', 'Tahoma', 'Arial', sans-serif;
--font-mono: 'Fixedsys', 'Courier New', monospace;
--theme-logo: "🪟";
--scanline: none;
}
[data-theme="win95"] .brand-text { color: #fff; font-weight: 700; text-shadow: none; }
[data-theme="win95"] .server-icon.home { background: #bfbfbf; border: 3px outset #fff; color: #000; border-radius: 0; box-shadow: none; }
[data-theme="win95"] .server-icon { border-radius: 0 !important; }
[data-theme="win95"] .channel-item.active::before { background: #000080; }
[data-theme="win95"] .inline-code { color: #000080; background: #fff; border: 1px inset #808080; }
[data-theme="win95"] .channel-badge { background: #000080; color: #fff; border-radius: 0; }
[data-theme="win95"] .sidebar { background: #bfbfbf; border-right: 3px outset #fff; }
[data-theme="win95"] .sidebar-header { background: linear-gradient(90deg, #000080, #1084d0); border-bottom: 3px outset #fff; }
[data-theme="win95"] .sidebar-header .brand-text { color: #fff; }
[data-theme="win95"] .sidebar .section-label,
[data-theme="win95"] .sidebar .panel-title { color: #000; font-weight: 700; }
[data-theme="win95"] .sidebar .channel-item { color: #000; border-radius: 0; }
[data-theme="win95"] .sidebar .channel-item:hover { background: #000080; color: #fff; }
[data-theme="win95"] .sidebar .channel-item.active { background: #000080; color: #fff; }
[data-theme="win95"] .sidebar .user-item-name { color: #000; }
[data-theme="win95"] .sidebar .channel-item.active .user-item-name,
[data-theme="win95"] .sidebar .channel-item:hover .user-item-name { color: #fff; }
[data-theme="win95"] .sidebar .current-user { color: #000; }
[data-theme="win95"] .sidebar .muted-text { color: #808080; }
[data-theme="win95"] .sidebar-bottom-bar { background: #bfbfbf; border-top: 3px outset #fff; }
[data-theme="win95"] .sidebar-bottom-btn { color: #000; background: #bfbfbf; border: 3px outset #fff; border-radius: 0; margin: 2px; }
[data-theme="win95"] .sidebar-bottom-btn:hover { background: #dfdfdf; }
[data-theme="win95"] .sidebar-bottom-btn:active { border: 3px inset #808080; }
[data-theme="win95"] .channel-header { background: linear-gradient(90deg, #000080, #1084d0); border-bottom: 3px outset #fff; color: #fff; }
[data-theme="win95"] .channel-header * { color: #fff; }
[data-theme="win95"] .channel-code-tag { background: #fff; color: #000; border: 1px inset #808080; border-radius: 0; }
[data-theme="win95"] .btn-voice { background: #bfbfbf; color: #000; border: 3px outset #fff; border-radius: 0; }
[data-theme="win95"] .btn-voice:hover { background: #dfdfdf; }
[data-theme="win95"] .btn-voice.active { background: #bfbfbf; color: #000; border: 3px inset #808080; }
[data-theme="win95"] .btn-voice.btn-danger { background: #bfbfbf; color: #cc0000; border: 3px outset #fff; font-weight: 700; }
[data-theme="win95"] .btn-sm { background: #bfbfbf; color: #000; border: 3px outset #fff; border-radius: 0; }
[data-theme="win95"] .btn-sm:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .btn-sm:active { border: 3px inset #808080; }
[data-theme="win95"] .btn-sm.btn-accent { background: #bfbfbf; color: #000; border: 3px outset #fff; }
[data-theme="win95"] .btn-sm.btn-accent:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .btn-sm.btn-danger { background: #bfbfbf; color: #cc0000; border: 3px outset #fff; }
/* Win95 voice panel buttons — beveled 3D boxes */
[data-theme="win95"] .voice-panel-btn {
background: #bfbfbf; color: #000; border: 3px outset #fff;
border-radius: 0 !important; width: 32px; height: 32px;
}
[data-theme="win95"] .voice-panel-btn:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .voice-panel-btn:active,
[data-theme="win95"] .voice-panel-btn.active,
[data-theme="win95"] .voice-panel-btn.muted,
[data-theme="win95"] .voice-panel-btn.sharing { border: 3px inset #808080; color: #000; background: #bfbfbf; }
[data-theme="win95"] .voice-panel-leave { background: #bfbfbf; color: #cc0000; border: 3px outset #fff; }
[data-theme="win95"] .voice-panel-leave:hover { background: #dfdfdf; color: #cc0000; }
/* Win95 icon buttons near username (rename, logout) — beveled */
[data-theme="win95"] .icon-btn {
background: #bfbfbf; color: #000; border: 2px outset #fff;
border-radius: 0 !important; padding: 3px 5px;
}
[data-theme="win95"] .icon-btn:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .icon-btn:active { border: 2px inset #808080; }
/* Win95 settings button */
[data-theme="win95"] .btn-settings-popout {
background: #bfbfbf; color: #000; border: 3px outset #fff;
border-radius: 0 !important;
}
[data-theme="win95"] .btn-settings-popout:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .btn-settings-popout:active { border: 3px inset #808080; }
[data-theme="win95"] .btn-settings-popout svg { color: #000; }
/* Win95 status picker dot — beveled */
[data-theme="win95"] .status-picker-dot { border: 2px outset #fff; border-radius: 0 !important; }
/* Win95 generic modal buttons — always black text on gray */
[data-theme="win95"] .modal button,
[data-theme="win95"] .modal-overlay button {
background: #bfbfbf; color: #000; border: 3px outset #fff; border-radius: 0 !important;
}
[data-theme="win95"] .modal button:hover,
[data-theme="win95"] .modal-overlay button:hover { background: #dfdfdf; color: #000; }
[data-theme="win95"] .modal button:active,
[data-theme="win95"] .modal-overlay button:active { border: 3px inset #808080; }
[data-theme="win95"] .modal .btn-danger,
[data-theme="win95"] .modal-overlay .btn-danger { color: #cc0000; }
/* Win95 message toolbar buttons */
[data-theme="win95"] .msg-toolbar button {
background: #bfbfbf; color: #000; border: 2px outset #fff; border-radius: 0 !important;
}
[data-theme="win95"] .msg-toolbar button:hover { background: #dfdfdf; }
[data-theme="win95"] .modal { background: #bfbfbf; border: 3px outset #fff; border-radius: 0; box-shadow: 2px 2px 0 #000; }
[data-theme="win95"] .modal h3 { background: linear-gradient(90deg, #000080, #1084d0); color: #fff; margin: -20px -24px 16px -24px; padding: 4px 8px; border-radius: 0; font-weight: 700; font-size: 12px; }
[data-theme="win95"] .message-row { border-bottom: 1px solid #808080; }
[data-theme="win95"] .message-row:hover { background: #dfdfdf; }
[data-theme="win95"] .message-author { color: #000080; font-weight: 700; }
[data-theme="win95"] .message-input-container { background: #fff; border: 3px inset #808080; border-radius: 0; }
[data-theme="win95"] .input-actions-box { background: #bfbfbf; border: 2px outset #fff; border-radius: 0; }
[data-theme="win95"] .input-actions-divider { background: #808080; }
[data-theme="win95"] .input-actions-box .btn-upload,
[data-theme="win95"] .input-actions-box .btn-emoji,
[data-theme="win95"] .input-actions-box .btn-gif { color: #000; border-radius: 0; }
[data-theme="win95"] .input-actions-box .btn-upload:hover,
[data-theme="win95"] .input-actions-box .btn-emoji:hover,
[data-theme="win95"] .input-actions-box .btn-gif:hover { background: #dfdfdf; }
[data-theme="win95"] .input-actions-box .btn-gif { border-color: #808080; }
[data-theme="win95"] input[type="text"], [data-theme="win95"] textarea { background: #fff; border: 3px inset #808080 !important; border-radius: 0 !important; }
[data-theme="win95"] .right-sidebar { background: #bfbfbf; border-left: 3px outset #fff; }
[data-theme="win95"] .user-item-avatar { border-radius: 0; }
[data-theme="win95"] .message-avatar, [data-theme="win95"] .message-avatar-img { border-radius: 0; border: 3px outset #fff; }
[data-theme="win95"] ::selection { background: #000080; color: #fff; }
/* Win95 scrollbars: use scrollbar-color: auto so Chrome falls through to the
::-webkit-scrollbar pseudo-element pipeline (which supports gradients / border-radius).
Setting explicit scrollbar-color triggers Chrome's flat-colour renderer that ignores
webkit pseudo-element styling and always draws rounded thumbs. */
[data-theme="win95"] * { scrollbar-width: auto !important; scrollbar-color: auto !important; }
[data-theme="win95"] ::-webkit-scrollbar { width: 18px !important; height: 18px !important; }
[data-theme="win95"] ::-webkit-scrollbar-thumb {
background:
linear-gradient(to right, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to bottom, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to left, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to top, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to right, #dfdfdf 2px, #dfdfdf 3px, transparent 3px),
linear-gradient(to bottom, #dfdfdf 2px, #dfdfdf 3px, transparent 3px),
linear-gradient(to left, #808080 2px, #808080 3px, transparent 3px),
linear-gradient(to top, #808080 2px, #808080 3px, transparent 3px),
#bfbfbf !important;
border: none !important;
box-shadow: none !important;
border-radius: 0 !important;
min-height: 32px;
min-width: 32px;
}
[data-theme="win95"] ::-webkit-scrollbar-thumb:hover {
background:
linear-gradient(to right, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to bottom, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to left, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to top, #404040 0, #404040 2px, transparent 2px),
#d4d0c8 !important;
}
[data-theme="win95"] ::-webkit-scrollbar-thumb:active {
background:
linear-gradient(to right, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to bottom, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to left, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to top, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to right, #808080 2px, #808080 3px, transparent 3px),
linear-gradient(to bottom, #808080 2px, #808080 3px, transparent 3px),
linear-gradient(to left, #dfdfdf 2px, #dfdfdf 3px, transparent 3px),
linear-gradient(to top, #dfdfdf 2px, #dfdfdf 3px, transparent 3px),
#bfbfbf !important;
}
[data-theme="win95"] ::-webkit-scrollbar-track {
background: repeating-conic-gradient(#bfbfbf 0% 25%, #fff 0% 50%) 50%/2px 2px !important;
border: none !important;
}
[data-theme="win95"] ::-webkit-scrollbar-button {
background:
linear-gradient(to right, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to bottom, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to left, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to top, #404040 0, #404040 2px, transparent 2px),
#bfbfbf !important;
border: none !important;
box-shadow: none !important;
display: block;
height: 18px !important;
width: 18px !important;
border-radius: 0 !important;
}
[data-theme="win95"] ::-webkit-scrollbar-button:hover {
background:
linear-gradient(to right, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to bottom, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to left, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to top, #404040 0, #404040 2px, transparent 2px),
#d4d0c8 !important;
}
[data-theme="win95"] ::-webkit-scrollbar-button:active {
background:
linear-gradient(to right, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to bottom, #404040 0, #404040 2px, transparent 2px),
linear-gradient(to left, #ffffff 0, #ffffff 2px, transparent 2px),
linear-gradient(to top, #ffffff 0, #ffffff 2px, transparent 2px),
#bfbfbf !important;
}
/* Hide duplicate scrollbar arrows — keep only one button at each end.
display:none alone is unreliable in some Chromium builds for scrollbar
pseudo-elements, so also collapse them to zero size. */
[data-theme="win95"] ::-webkit-scrollbar-button:vertical:start:increment,
[data-theme="win95"] ::-webkit-scrollbar-button:vertical:end:decrement,
[data-theme="win95"] ::-webkit-scrollbar-button:horizontal:start:increment,
[data-theme="win95"] ::-webkit-scrollbar-button:horizontal:end:decrement {
display: none !important;
height: 0 !important;
width: 0 !important;
padding: 0 !important;
border: none !important;
background: none !important;
}
[data-theme="win95"] ::-webkit-scrollbar-corner { background: #bfbfbf !important; }
[data-theme="win95"] .server-bar { background: #bfbfbf; border-right: 3px outset #fff; }
[data-theme="win95"] .server-bar .server-icon { border-radius: 0; }
[data-theme="win95"] .status-bar { background: #bfbfbf; border-top: 3px outset #fff; }
[data-theme="win95"] .status-bar .status-item { border: 1px inset #808080; border-radius: 0; }
[data-theme="win95"] * { border-radius: 0 !important; }
/* Win95 sliders — rectangular gray boxes with proper 3D bevel */
[data-theme="win95"] input[type="range"] {
-webkit-appearance: none; appearance: none;
height: 22px; background: transparent;
}
[data-theme="win95"] input[type="range"]::-webkit-slider-runnable-track {
background: #bfbfbf !important; height: 4px !important;
border-top: 2px solid #404040 !important;
border-left: 2px solid #404040 !important;
border-right: 2px solid #ffffff !important;
border-bottom: 2px solid #ffffff !important;
border-radius: 0 !important;
}
[data-theme="win95"] input[type="range"]::-moz-range-track {
background: #bfbfbf !important; height: 4px !important;
border-top: 2px solid #404040 !important;
border-left: 2px solid #404040 !important;
border-right: 2px solid #ffffff !important;
border-bottom: 2px solid #ffffff !important;
border-radius: 0 !important;
}
[data-theme="win95"] input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none; appearance: none;
width: 12px; height: 22px; margin-top: -10px;
background: #bfbfbf;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-right: 2px solid #404040;
border-bottom: 2px solid #404040;
box-shadow: inset 1px 1px 0 #dfdfdf, inset -1px -1px 0 #808080;
border-radius: 0 !important; cursor: pointer;
}
[data-theme="win95"] input[type="range"]::-webkit-slider-thumb:active {
border-top: 2px solid #404040;
border-left: 2px solid #404040;
border-right: 2px solid #ffffff;
border-bottom: 2px solid #ffffff;
box-shadow: inset 1px 1px 0 #808080, inset -1px -1px 0 #dfdfdf;
}
[data-theme="win95"] input[type="range"]::-moz-range-thumb {
width: 12px; height: 22px;
background: #bfbfbf;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-right: 2px solid #404040;
border-bottom: 2px solid #404040;
box-shadow: inset 1px 1px 0 #dfdfdf, inset -1px -1px 0 #808080;
border-radius: 0 !important; cursor: pointer;
}
[data-theme="win95"] input[type="range"]::-moz-range-thumb:active {
border-top: 2px solid #404040;
border-left: 2px solid #404040;
border-right: 2px solid #ffffff;
border-bottom: 2px solid #ffffff;
box-shadow: inset 1px 1px 0 #808080, inset -1px -1px 0 #dfdfdf;
}
/* Vertical range sliders (orient=vertical, writing-mode) */
[data-theme="win95"] input[type="range"][orient="vertical"],
[data-theme="win95"] input[type="range"].vertical {
writing-mode: bt-lr;
-webkit-appearance: slider-vertical;
width: 22px; height: auto;
}
[data-theme="win95"] input[type="range"][orient="vertical"]::-webkit-slider-thumb,
[data-theme="win95"] input[type="range"].vertical::-webkit-slider-thumb {
width: 22px; height: 12px; margin-top: 0; margin-left: -10px;
}
/* Win95 text color — white text on navy backgrounds (hover/active/selected states) */
[data-theme="win95"] .channel-item:hover *,
[data-theme="win95"] .channel-item.active *,
[data-theme="win95"] .user-item:hover .user-item-name,
[data-theme="win95"] .user-item:hover .user-item-status,
[data-theme="win95"] select option:checked,
[data-theme="win95"] .dropdown-menu .dropdown-item:hover,
[data-theme="win95"] .autocomplete-item:hover,
[data-theme="win95"] .autocomplete-item.selected,
[data-theme="win95"] .modal-overlay .btn-accent,
[data-theme="win95"] .organize-item.dragging { color: #fff !important; }
/* Win95 toggle-row / select-row items that sit on navy hover */
[data-theme="win95"] .settings-section .toggle-row:hover,
[data-theme="win95"] .settings-section .select-row:hover { background: transparent; }
/* Win95 checkboxes — square, period-correct */
[data-theme="win95"] input[type="checkbox"] {
-webkit-appearance: auto; appearance: auto;
accent-color: #000080;
}
/* Win95 settings modal — full blue title bar like real Win95 */
[data-theme="win95"] .settings-header {
background: linear-gradient(90deg, #000080, #1084d0);
padding: 4px 8px;
border-bottom: none;
min-height: 24px;
}
[data-theme="win95"] .settings-header h3 {
color: #fff;
font-size: 12px;
font-weight: 700;
font-family: "MS Sans Serif", "Microsoft Sans Serif", Tahoma, Arial, sans-serif;
margin: 0;
padding: 0;
background: none;
}
[data-theme="win95"] .settings-close-btn {
width: 18px; height: 18px;
background: #bfbfbf;
border: 2px outset #fff;
color: #000;
font-size: 12px;
font-weight: 700;
padding: 0;
line-height: 1;
}
[data-theme="win95"] .settings-close-btn:hover { background: #dfdfdf; }
/* Win95 admin save bar — beveled gray box with black text */
[data-theme="win95"] .admin-save-bar {
background: #bfbfbf;
border-top: 3px outset #fff;
}
[data-theme="win95"] .btn-admin-save {
background: #bfbfbf !important;
color: #000 !important;
border: 3px outset #fff;
font-family: "MS Sans Serif", "Microsoft Sans Serif", Tahoma, Arial, sans-serif;
font-size: 12px;
}
[data-theme="win95"] .btn-admin-save:hover { background: #dfdfdf !important; }
[data-theme="win95"] .btn-admin-save:active { border: 3px inset #808080; }
/* Win95 number inputs — boxy inset, no rounded corners */
[data-theme="win95"] .settings-number-input,
[data-theme="win95"] input[type="number"] {
background: #fff;
border: 2px inset #808080 !important;
border-radius: 0 !important;
color: #000;
font-family: "MS Sans Serif", "Microsoft Sans Serif", Tahoma, Arial, sans-serif;
}
/* Win95 text inputs in settings */
[data-theme="win95"] .settings-text-input {
background: #fff;
border: 2px inset #808080 !important;
border-radius: 0 !important;
color: #000;
}
/* Win95 select dropdowns */
[data-theme="win95"] select {
background: #fff;
border: 2px inset #808080 !important;
border-radius: 0 !important;
color: #000;
font-family: "MS Sans Serif", "Microsoft Sans Serif", Tahoma, Arial, sans-serif;
}
/* Win95 settings section titles — black text */
[data-theme="win95"] .settings-section-title,
[data-theme="win95"] .settings-section-subtitle {
color: #000;
}
[data-theme="win95"] .settings-hint { color: #444; }
/* Win95 context menus — beveled 3D edges like real Win95 menus */
[data-theme="win95"] .channel-ctx-menu {
background: #bfbfbf;
border: 3px outset #fff;
border-radius: 0;
box-shadow: 2px 2px 0 #000;
padding: 2px;
}
[data-theme="win95"] .channel-ctx-item {
color: #000;
border-radius: 0;
padding: 4px 12px;
font-family: "MS Sans Serif", "Microsoft Sans Serif", Tahoma, Arial, sans-serif;
font-size: 12px;
}
[data-theme="win95"] .channel-ctx-item:hover {
background: #000080;
color: #fff !important;
}
[data-theme="win95"] .channel-ctx-item.danger { color: #cc0000; }
[data-theme="win95"] .channel-ctx-item.danger:hover {
background: #000080;
color: #fff !important;
}
[data-theme="win95"] .channel-ctx-sep {
border-top: 1px solid #808080;
border-bottom: 1px solid #fff;
margin: 2px 0;
}
/* Win95 emoji picker — beveled box */
[data-theme="win95"] .emoji-picker {
background: #bfbfbf;
border: 3px outset #fff;
border-radius: 0;
box-shadow: 2px 2px 0 #000;
}
/* Win95 message toolbar — beveled */
[data-theme="win95"] .msg-toolbar {
background: #bfbfbf;
border: 2px outset #fff;
border-radius: 0;
box-shadow: 1px 1px 0 #000;
}
/* Win95 toasts — beveled */
[data-theme="win95"] .toast {
background: #bfbfbf;
border: 3px outset #fff;
border-radius: 0;
box-shadow: 2px 2px 0 #000;
color: #000;
}
[data-theme="win95"] .toast.error { background: #bfbfbf; border-color: #fff; color: #cc0000; }
[data-theme="win95"] .toast.success { background: #bfbfbf; border-color: #fff; color: #008000; }
/* ═══════════════════════════════════════════════════════════
RESET
═══════════════════════════════════════════════════════════ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--font-main);
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.5;
overflow: hidden;
height: 100vh;
}
/* Scanline overlay for Matrix theme */
body::after {
content: '';
position: fixed;
inset: 0;
background: var(--scanline);
pointer-events: none;
z-index: 99999;
}
a { color: var(--text-link); text-decoration: none; }
a:hover { text-decoration: underline; }
button { font-family: inherit; cursor: pointer; border: none; outline: none; }
input, textarea { font-family: inherit; outline: none; border: none; }
::selection { background: var(--accent); color: white; }
/* ── Range Input Track (slider background) ──────────────── */
/* Slider classes set --track-bg / --track-h / --track-r to override
the defaults below. Themed tracks use --track-bg for colouring. */
input[type="range"]:not(.rgb-slider)::-webkit-slider-runnable-track {
background: var(--track-bg, rgba(255,255,255,0.25));
height: var(--track-h, 6px);
border-radius: var(--track-r, 3px);
border: var(--track-border, 1px solid rgba(255,255,255,0.15));
}
input[type="range"]:not(.rgb-slider)::-moz-range-track {
background: var(--track-bg, rgba(255,255,255,0.25));
height: var(--track-h, 6px);
border-radius: var(--track-r, 3px);
border: var(--track-border, 1px solid rgba(255,255,255,0.15));
}
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }
/* ═══════════════════════════════════════════════════════════
LED / STATUS INDICATORS
═══════════════════════════════════════════════════════════ */
.led {
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
transition: all 0.3s ease;
border: 1px solid rgba(0,0,0,0.3);
}
.led.on {
background: var(--led-on);
box-shadow: 0 0 6px var(--led-glow), inset 0 -1px 2px rgba(0,0,0,0.2);
}
.led.off { background: var(--led-off); }
.led.warn {
background: var(--warning);
box-shadow: 0 0 6px rgba(250, 166, 26, 0.5);
}
.led.danger {
background: var(--danger);
box-shadow: 0 0 6px rgba(240, 71, 71, 0.5);
}
.led.pulse { animation: ledPulse 1.5s ease-in-out infinite; }
@keyframes ledPulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
/* ── Status Bar (bottom of app) ────────────────────────── */
.status-bar {
display: flex;
align-items: center;
gap: 16px;
padding: 5px 16px;
background: var(--bg-secondary);
border-top: 1px solid var(--border);
font-size: 11px;
color: var(--text-muted);
flex-shrink: 0;
min-height: 28px;
user-select: none;
}
.status-item {
display: flex;
align-items: center;
gap: 5px;
white-space: nowrap;
}
.status-item .label {
text-transform: uppercase;
letter-spacing: 0.3px;
font-weight: 600;
font-size: 10px;
}
.status-item .value {
color: var(--text-secondary);
font-family: var(--font-mono);
font-size: 11px;
}
.status-bar .spacer { flex: 1; }
#status-version {
opacity: 0.5;
font-size: 10px;
}
.status-bar .divider {
width: 1px;
height: 14px;
background: var(--border);
}
/* ═══════════════════════════════════════════════════════════
SIDEBAR BOTTOM BAR & THEME POPUP
═══════════════════════════════════════════════════════════ */
.sidebar-bottom {
margin-top: auto;
position: relative;
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.sidebar-bottom-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
}
.sidebar-bottom-btn {
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: 6px;
padding: 5px 10px;
cursor: pointer;
font-size: 14px;
color: var(--text-secondary);
transition: all 0.2s;
line-height: 1;
}
.sidebar-bottom-btn:hover {
background: var(--bg-hover);
color: var(--text-primary);
border-color: var(--accent);
}
.theme-popup {
position: absolute;
bottom: 100%;
left: 0;
right: 0;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-bottom: none;
border-radius: var(--radius) var(--radius) 0 0;
padding: 12px;
z-index: 100;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.4);
max-height: 60vh;
overflow-y: auto;
}
.theme-popup-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.theme-popup-title {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1.2px;
color: var(--text-muted);
}
/* ═══════════════════════════════════════════════════════════
THEME SELECTOR
═══════════════════════════════════════════════════════════ */
.theme-selector {
display: flex;
flex-wrap: wrap;
gap: 5px;
padding: 4px 0;
}
.theme-btn {
width: 28px;
height: 28px;
border-radius: 50%;
border: 2px solid var(--border);
cursor: pointer;
transition: all 0.2s ease;
position: relative;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
line-height: 1;
}
.theme-btn:hover {
border-color: var(--text-secondary);
transform: scale(1.15);
}
.theme-btn.active {
border-color: var(--accent);
box-shadow: 0 0 8px var(--accent-glow);
transform: scale(1.1);
}
.theme-btn[data-theme="haven"] { background: #191b28; color: #7c5cfc; }
.theme-btn[data-theme="discord"] { background: #313338; color: #5865f2; }
.theme-btn[data-theme="matrix"] { background: #0a0a0a; color: #00ff41; }
.theme-btn[data-theme="tron"] { background: #0c141f; color: #6fecff; }
.theme-btn[data-theme="halo"] { background: #0d1a0d; color: #d4a020; }
.theme-btn[data-theme="lotr"] { background: #1a1510; color: #d4a844; }
.theme-btn[data-theme="cyberpunk"] { background: #0a0a12; color: #ff2d6f; }
.theme-btn[data-theme="nord"] { background: #2e3440; color: #88c0d0; }
.theme-btn[data-theme="dracula"] { background: #1a1b26; color: #bd93f9; }
.theme-btn[data-theme="bloodborne"] { background: #0a0000; color: #cc0020; }
.theme-btn[data-theme="darksouls"] { background: #0c0a08; color: #c8a84e; }
.theme-btn[data-theme="eldenring"] { background: #08080e; color: #d4a832; }
.theme-btn[data-theme="ice"] { background: #0a1520; color: #00d4ff; }
.theme-btn[data-theme="abyss"] { background: #040810; color: #1a5aff; }
.theme-btn[data-theme="minecraft"] { background: #1a1a1a; color: #55bb55; }
.theme-btn[data-theme="ffx"] { background: #080e1a; color: #40a8e0; }
.theme-btn[data-theme="zelda"] { background: #0a120a; color: #44bb44; }
.theme-btn[data-theme="fallout"]{ background: #0a0e08; color: #14fe17; text-shadow: 0 0 4px rgba(20,254,23,0.6); }
.theme-btn[data-theme="scripture"]{ background: #1a1610; color: #c8a84c; }
.theme-btn[data-theme="chapel"] { background: #0e0c18; color: #8a5cf0; }
.theme-btn[data-theme="gospel"] { background: #f5f0e8; color: #8b2032; }
.theme-btn[data-theme="crt"] { background: #080808; color: #ffb000; text-shadow: 0 0 4px rgba(255,176,0,0.5); }
.theme-btn[data-theme="win95"] { background: #c0c0c0; color: #000; border: 2px outset #fff; }
.theme-btn[data-theme="custom"] { background: linear-gradient(135deg, #ff2d6f, #faa61a, #43b581, #7c5cfc); color: #fff; }
.theme-btn[data-theme="rgb"] {
background: linear-gradient(90deg, #ff0000, #ff8800, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000);
background-size: 200% 100%;
animation: rgb-btn-cycle 3s linear infinite;
color: #fff;
text-shadow: 0 0 2px rgba(0,0,0,0.6);
}
@keyframes rgb-btn-cycle {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
.theme-btn .theme-icon { pointer-events: none; }
/* ═══════════════════════════════════════════════════════════
EFFECT OVERLAY SELECTOR
═══════════════════════════════════════════════════════════ */
.effect-overlay-section {
border-top: 1px solid var(--border);
margin-top: 8px;
padding-top: 6px;
}
.effect-selector {
display: flex;
flex-wrap: wrap;
gap: 5px;
padding: 4px 0;
}
.effect-btn {
width: 28px;
height: 28px;
border-radius: 50%;
border: 2px solid var(--border);
background: var(--bg-tertiary);
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
line-height: 1;
color: var(--text-secondary);
}
.effect-btn:hover {
border-color: var(--text-secondary);
transform: scale(1.15);
}
.effect-btn.active {
border-color: var(--accent);
box-shadow: 0 0 8px var(--accent-glow);
transform: scale(1.1);
}
/* ─── Theme Creative Effects ─────────────────────────── */
/* ── Fallout: Phosphor glow + vignette burn ────────── */
[data-theme="fallout"] .main {
position: relative;
box-shadow: inset 0 0 120px rgba(20, 254, 23, 0.12);
}
[data-theme="fallout"] .main::before {
content: ''; position: fixed; inset: 0; z-index: 99998; pointer-events: none;
background: radial-gradient(ellipse at center, transparent 40%, rgba(0, 10, 0, 0.55) 100%);
}
/* ── CRT: Component styling (theme-appropriate, no effects) ── */
[data-theme="crt"] .main {
position: relative;
overflow: hidden;
}
@keyframes crt-flicker {
0% { opacity: 0.94; }
50% { opacity: 0.98; }
100% { opacity: 1; }
}
/* ── Win95: No effects — sharp, clean, period-correct ─ */
/* ── FFX: Flowing water overlay ────────────────────── */
[data-theme="ffx"] .sidebar { position: relative; }
[data-theme="ffx"] .sidebar::after {
content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
background: linear-gradient(180deg,
transparent 0%,
rgba(64, 168, 224, 0.25) 15%,
transparent 30%,
rgba(64, 168, 224, 0.20) 50%,
transparent 65%,
rgba(64, 168, 224, 0.15) 80%,
transparent 100%
);
background-size: 100% 200%;
animation: ffx-water calc(5s * var(--fx-mult, 1)) ease-in-out infinite;
}
[data-theme="ffx"] .main { position: relative; }
[data-theme="ffx"] .main::after {
content: ''; position: fixed; bottom: 0; left: 0; right: 0; height: 6px;
pointer-events: none; z-index: 99998;
background: linear-gradient(90deg,
transparent, rgba(64,168,224,0.6), rgba(100,200,255,0.8), rgba(64,168,224,0.6), transparent
);
background-size: 200% 100%;
animation: ffx-wave-bar calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
filter: blur(1px);
}
@keyframes ffx-water {
0%, 100% { background-position: 0% 0%; }
50% { background-position: 0% 100%; }
}
@keyframes ffx-wave-bar {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 200% 50%; }
}
/* ── Ice: Icicles + frost shimmer ──────────────────── */
[data-theme="ice"] .channel-header { position: relative; overflow: visible !important; }
[data-theme="ice"] .channel-header::after {
content: '';
position: absolute; bottom: -12px; left: 0; right: 0; height: 12px;
pointer-events: none; z-index: 2;
background:
linear-gradient(180deg, rgba(180,230,255,0.7), rgba(180,230,255,0.0));
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
-webkit-mask-size: 200px 12px;
mask-size: 200px 12px;
-webkit-mask-repeat: repeat-x;
mask-repeat: repeat-x;
animation: ice-drip calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
}
[data-theme="ice"] .sidebar-header { position: relative; overflow: visible !important; }
[data-theme="ice"] .sidebar-header::after {
content: '';
position: absolute; bottom: -10px; left: 0; right: 0; height: 10px;
pointer-events: none; z-index: 2;
background:
linear-gradient(180deg, rgba(180,230,255,0.6), rgba(180,230,255,0.0));
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
-webkit-mask-size: 200px 10px;
mask-size: 200px 10px;
-webkit-mask-repeat: repeat-x;
mask-repeat: repeat-x;
}
@keyframes ice-drip {
0%, 100% { transform: scaleY(1); opacity: 0.7; }
50% { transform: scaleY(1.3); opacity: 1; }
}
[data-theme="ice"] .main { position: relative; }
[data-theme="ice"] .main::after {
content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 99998;
background:
radial-gradient(3px 3px at 10% 25%, rgba(200,235,255,0.8), transparent),
radial-gradient(2px 2px at 25% 60%, rgba(200,235,255,0.6), transparent),
radial-gradient(3px 3px at 45% 15%, rgba(200,235,255,0.7), transparent),
radial-gradient(2px 2px at 60% 70%, rgba(200,235,255,0.5), transparent),
radial-gradient(3px 3px at 75% 35%, rgba(200,235,255,0.6), transparent),
radial-gradient(2px 2px at 90% 80%, rgba(200,235,255,0.7), transparent),
radial-gradient(3px 3px at 35% 45%, rgba(200,235,255,0.5), transparent),
radial-gradient(2px 2px at 80% 10%, rgba(200,235,255,0.6), transparent);
animation: ice-shimmer calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
@keyframes ice-shimmer {
0%, 100% { opacity: 0.4; }
50% { opacity: 0.9; }
}
/* ── Nord: Snowfall now handled by JS canvas ──────── */
[data-theme="nord"] .main { position: relative; }
/* ── Dark Souls: Campfire glow (muted, sporadic flicker) ── */
[data-theme="darksouls"] .sidebar::after {
content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 55vh;
pointer-events: none; z-index: 1;
background: linear-gradient(0deg,
rgba(180, 70, 10, 0.22) 0%,
rgba(140, 45, 5, 0.12) 25%,
rgba(100, 30, 0, 0.05) 50%,
transparent 100%
);
animation: ds-ember calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
[data-theme="darksouls"] .main { position: relative; }
[data-theme="darksouls"] .main::before {
content: ''; position: fixed; bottom: 0; left: 0; right: 0; height: 10px;
pointer-events: none; z-index: 99998;
background: linear-gradient(90deg,
transparent 0%,
rgba(180, 60, 5, 0.25) 15%,
rgba(200, 110, 20, 0.4) 35%,
rgba(210, 140, 40, 0.5) 50%,
rgba(200, 110, 20, 0.4) 65%,
rgba(180, 60, 5, 0.25) 85%,
transparent 100%
);
filter: blur(5px);
animation: ds-fireline calc(3s * var(--fx-mult, 1)) ease-in-out infinite alternate;
}
[data-theme="darksouls"] .main::after {
content: ''; position: fixed; bottom: 0; left: 0; right: 0; height: 50vh;
pointer-events: none; z-index: 99997;
background: radial-gradient(ellipse 80% 70% at 50% 100%,
rgba(180, 70, 10, 0.10) 0%,
rgba(140, 45, 5, 0.05) 40%,
transparent 100%
);
animation: ds-ambient calc(5s * var(--fx-mult, 1)) ease-in-out infinite;
}
@keyframes ds-ember {
0% { opacity: 0.5; }
8% { opacity: 0.85; }
15% { opacity: 0.35; }
22% { opacity: 0.7; }
30% { opacity: 0.45; }
45% { opacity: 0.9; }
52% { opacity: 0.30; }
60% { opacity: 0.65; }
70% { opacity: 0.85; }
78% { opacity: 0.40; }
88% { opacity: 0.75; }
100% { opacity: 0.5; }
}
@keyframes ds-fireline {
0% { opacity: 0.3; filter: blur(4px); height: 8px; }
12% { opacity: 0.55; filter: blur(6px); height: 12px; }
28% { opacity: 0.2; filter: blur(3px); height: 6px; }
45% { opacity: 0.5; filter: blur(5px); height: 11px; }
60% { opacity: 0.15; filter: blur(3px); height: 7px; }
75% { opacity: 0.45; filter: blur(6px); height: 13px; }
90% { opacity: 0.25; filter: blur(4px); height: 9px; }
100% { opacity: 0.35; filter: blur(5px); height: 10px; }
}
@keyframes ds-ambient {
0%, 100% { opacity: 0.3; }
15% { opacity: 0.55; }
30% { opacity: 0.2; }
50% { opacity: 0.6; }
65% { opacity: 0.25; }
80% { opacity: 0.5; }
}
/* ── Bloodborne: Blood vignette pulse ──────────────── */
[data-theme="bloodborne"] .main { position: relative; }
[data-theme="bloodborne"] .main::before {
content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 99998;
background: radial-gradient(ellipse at center, transparent 40%, rgba(120, 10, 10, 0.35) 100%);
animation: bb-vignette calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
@keyframes bb-vignette {
0%, 100% { opacity: 0.5; }
50% { opacity: 1; }
}
/* ── Matrix: Digital rain shimmer ──────────────────── */
[data-theme="matrix"] .sidebar { position: relative; overflow: hidden; }
[data-theme="matrix"] .sidebar::after {
content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;
background: repeating-linear-gradient(0deg,
transparent 0px, transparent 18px,
rgba(0, 255, 0, 0.15) 18px, rgba(0, 255, 0, 0.15) 20px
);
animation: matrix-rain calc(1.5s * var(--fx-mult, 1)) linear infinite;
}
@keyframes matrix-rain {
0% { transform: translateY(-20px); }
100% { transform: translateY(0); }
}
/* ── Cyberpunk: Text-scramble effect on header ─────── */
[data-theme="cyberpunk"] .brand-text {
text-shadow: 0 0 8px rgba(255,0,100,0.6);
}
/* ── Minecraft: Pixelated border style ─────────────── */
[data-theme="minecraft"] .message-avatar,
[data-theme="minecraft"] .message-avatar-img { image-rendering: pixelated; border-radius: 0 !important; }
[data-theme="minecraft"] .server-icon { border-radius: 2px; image-rendering: pixelated; }
[data-theme="minecraft"] .user-item-avatar { border-radius: 2px; image-rendering: pixelated; }
[data-theme="minecraft"] .sidebar { border-right: 3px solid #3a3a2a; }
[data-theme="minecraft"] .channel-header { border-bottom: 3px solid #3a3a2a; }
/* ── LOTR: Warm candlelight glow ───────────────────── */
[data-theme="lotr"] .sidebar { position: relative; }
[data-theme="lotr"] .sidebar::after {
content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;
background: radial-gradient(ellipse at 50% 100%, rgba(220, 170, 60, 0.2), transparent 60%);
animation: lotr-candle calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
}
@keyframes lotr-candle {
0%, 100% { opacity: 0.4; }
25% { opacity: 1; }
50% { opacity: 0.6; }
75% { opacity: 0.9; }
}
/* ── Abyss: Deep ocean pressure vignette ───────────── */
[data-theme="abyss"] .main { position: relative; }
[data-theme="abyss"] .main::before {
content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 99998;
background: radial-gradient(ellipse at center, transparent 30%, rgba(0, 0, 40, 0.35) 100%);
}
/* ═══════════════════════════════════════════════════════════
STACKABLE EFFECT OVERLAY SYSTEM
Effects are managed via JS-injected DOM elements so they
can stack. When [data-fx-custom] is on <html>, theme-native
pseudo-element effects are stripped and only the JS-managed
overlay layers render.
═══════════════════════════════════════════════════════════ */
/* Strip base theme pseudo-element effects when custom layers are active */
[data-fx-custom] .main::before,
[data-fx-custom] .main::after,
[data-fx-custom] .sidebar::after,
[data-fx-custom] .sidebar-header::after,
[data-fx-custom] .channel-header::after { content: none !important; }
[data-fx-custom] .brand-text { animation: none !important; }
[data-fx-custom] .sidebar,
[data-fx-custom] .main { position: relative; }
/* Full-screen overlay container */
#fx-layers {
position: fixed; inset: 0; z-index: 99990;
pointer-events: none; overflow: hidden;
}
#fx-layers > * { pointer-events: none; }
/* Canvas layers (matrix rain, embers) */
.fx-canvas {
position: fixed; inset: 0;
pointer-events: none; z-index: 0;
width: 100%; height: 100%;
}
/* Sidebar-injected overlay base */
.fx-sidebar-layer {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
}
/* Main-injected overlay base */
.fx-main-layer {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
}
/* ── CRT class on <html> (scanlines + font) ───────────── */
.fx-crt {
--scanline: repeating-linear-gradient(0deg, transparent, transparent 1px, rgba(0,0,0,0.35) 1px, rgba(0,0,0,0.35) 2px);
}
/* ── CRT vignette overlay — parabolic CRT simulation ──
Bright center, dark curved edges like old glass tube,
phosphor glow, and screen flicker */
.fx-crt-vignette {
position: fixed; inset: 0;
/* Parabolic vignette: bright center fading aggressively to dark edges */
background:
radial-gradient(ellipse 80% 70% at 50% 50%,
transparent 0%,
transparent 30%,
rgba(0,0,0,0.11) 50%,
rgba(0,0,0,0.34) 70%,
rgba(0,0,0,0.56) 85%,
rgba(0,0,0,0.69) 100%);
animation: crt-flicker calc(0.08s * var(--fx-mult, 1)) infinite alternate;
border-radius: 12px;
box-shadow:
inset 0 0 100px rgba(0,0,0,0.6),
inset 0 0 250px rgba(0,0,0,0.3);
z-index: 99998;
pointer-events: none;
}
/* ── Matrix sidebar bars overlay ──────────────────────── */
.fx-matrix-bars {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
background: repeating-linear-gradient(0deg,
transparent 0px, transparent 18px,
rgba(0,255,0,0.15) 18px, rgba(0,255,0,0.15) 20px);
animation: matrix-rain calc(1.5s * var(--fx-mult, 1)) linear infinite;
}
/* ── Fallout vignette overlay ─────────────────────────── */
.fx-fallout-vignette {
position: fixed; inset: 0;
background: radial-gradient(ellipse at center, transparent 40%, rgba(0,10,0,0.55) 100%);
}
/* ── FFX water (sidebar) overlay ──────────────────────── */
.fx-ffx-water {
position: absolute; inset: 0; z-index: 0;
pointer-events: none;
background: linear-gradient(180deg,
transparent 0%, rgba(64,168,224,0.25) 15%, transparent 30%,
rgba(64,168,224,0.20) 50%, transparent 65%,
rgba(64,168,224,0.15) 80%, transparent 100%);
background-size: 100% 200%;
animation: ffx-water calc(5s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── FFX wave bar overlay ─────────────────────────────── */
.fx-ffx-wave {
position: fixed; bottom: 0; left: 0; right: 0; height: 6px;
background: linear-gradient(90deg,
transparent, rgba(64,168,224,0.6), rgba(100,200,255,0.8),
rgba(64,168,224,0.6), transparent);
background-size: 200% 100%;
animation: ffx-wave-bar calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
filter: blur(1px);
}
/* ── Ice shimmer overlay ──────────────────────────────── */
.fx-ice-shimmer {
position: fixed; inset: 0;
background:
radial-gradient(3px 3px at 10% 25%, rgba(200,235,255,0.8), transparent),
radial-gradient(2px 2px at 25% 60%, rgba(200,235,255,0.6), transparent),
radial-gradient(3px 3px at 45% 15%, rgba(200,235,255,0.7), transparent),
radial-gradient(2px 2px at 60% 70%, rgba(200,235,255,0.5), transparent),
radial-gradient(3px 3px at 75% 35%, rgba(200,235,255,0.6), transparent),
radial-gradient(2px 2px at 90% 80%, rgba(200,235,255,0.7), transparent),
radial-gradient(3px 3px at 35% 45%, rgba(200,235,255,0.5), transparent),
radial-gradient(2px 2px at 80% 10%, rgba(200,235,255,0.6), transparent);
animation: ice-shimmer calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── Ice icicles overlays ─────────────────────────────── */
.fx-ice-icicle {
position: absolute; bottom: -12px; left: 0; right: 0; height: 12px;
pointer-events: none; z-index: 2;
background: linear-gradient(180deg, rgba(180,230,255,0.7), rgba(180,230,255,0.0));
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
-webkit-mask-size: 200px 12px; mask-size: 200px 12px;
-webkit-mask-repeat: repeat-x; mask-repeat: repeat-x;
animation: ice-drip calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
}
.fx-ice-icicle-sb {
position: absolute; bottom: -10px; left: 0; right: 0; height: 10px;
pointer-events: none; z-index: 2;
background: linear-gradient(180deg, rgba(180,230,255,0.6), rgba(180,230,255,0.0));
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 12' preserveAspectRatio='none'%3E%3Cpolygon points='0,0 8,0 10,10 12,0 20,0 22,7 24,0 32,0 35,12 38,0 46,0 48,8 50,0 58,0 61,11 64,0 72,0 74,6 76,0 84,0 87,12 90,0 98,0 100,9 102,0 110,0 113,11 116,0 124,0 126,7 128,0 136,0 139,12 142,0 150,0 152,8 154,0 162,0 165,10 168,0 176,0 178,6 180,0 188,0 191,12 194,0 200,0 200,0 0,0'/%3E%3C/svg%3E");
-webkit-mask-size: 200px 10px; mask-size: 200px 10px;
-webkit-mask-repeat: repeat-x; mask-repeat: repeat-x;
}
/* ── Nord snowfall: now handled by JS canvas ──────────── */
/* ── Dark Souls ember glow (sidebar) overlay ──────────── */
.fx-ds-ember-glow {
position: absolute; bottom: 0; left: 0; right: 0; height: 100%;
pointer-events: none; z-index: 1;
background: radial-gradient(ellipse 60% 80% at 50% 100%,
rgba(180,70,10,0.28) 0%, rgba(140,45,5,0.15) 20%,
rgba(100,30,0,0.06) 45%, transparent 80%);
animation: ds-ember calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── Dark Souls fireline overlay ──────────────────────── */
.fx-ds-fireline {
position: fixed; bottom: 0; left: 0; right: 0; height: 10px;
background: linear-gradient(90deg,
transparent 0%, rgba(180,60,5,0.25) 15%, rgba(200,110,20,0.4) 35%,
rgba(210,140,40,0.5) 50%, rgba(200,110,20,0.4) 65%,
rgba(180,60,5,0.25) 85%, transparent 100%);
filter: blur(5px);
animation: ds-fireline calc(3s * var(--fx-mult, 1)) ease-in-out infinite alternate;
}
/* ── Dark Souls ambient glow overlay ──────────────────── */
.fx-ds-ambient {
position: fixed; bottom: 0; left: 0; right: 0; height: 65vh;
background: radial-gradient(ellipse 50% 80% at 50% 100%,
rgba(180,70,10,0.14) 0%, rgba(140,45,5,0.07) 35%, transparent 85%);
animation: ds-ambient calc(5s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── Bloodborne blood vignette overlay ────────────────── */
.fx-bb-vignette {
position: fixed; inset: 0;
background: radial-gradient(ellipse at center, transparent 40%, rgba(120,10,10,0.35) 100%);
animation: bb-vignette calc(4s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── Cyberpunk class on <html> (text-scramble) ────────── */
.fx-cyberpunk .brand-text {
font-family: 'Courier New', monospace;
letter-spacing: 0.15em;
text-shadow:
0 0 8px rgba(255,0,100,0.7),
0 0 20px rgba(0,255,255,0.3);
transition: text-shadow 0.2s;
}
.fx-cyberpunk .brand-text.scrambling {
text-shadow:
-2px 0 #ff0066, 2px 0 #00ffff,
0 0 12px rgba(255,0,100,0.9),
0 0 30px rgba(0,255,255,0.5);
}
/* Scramble glow on sidebar / header text */
.fx-cyberpunk .scrambling {
text-shadow:
-1px 0 rgba(255,0,102,0.6), 1px 0 rgba(0,255,255,0.6),
0 0 6px rgba(255,0,102,0.4);
}
.fx-cyberpunk .channel-name,
.fx-cyberpunk .section-label,
.fx-cyberpunk .user-item-name,
.fx-cyberpunk #channel-header-name,
.fx-cyberpunk #current-user {
transition: text-shadow 0.2s;
}
/* ── LOTR candle (sidebar) overlay ────────────────────── */
.fx-lotr-candle {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
background: radial-gradient(ellipse at 50% 100%, rgba(220,170,60,0.2), transparent 60%);
animation: lotr-candle calc(3s * var(--fx-mult, 1)) ease-in-out infinite;
}
/* ── Abyss ocean vignette overlay ─────────────────────── */
.fx-abyss-vignette {
position: fixed; inset: 0;
background: radial-gradient(ellipse at center, transparent 30%, rgba(0,0,40,0.35) 100%);
}
/* ── Scripture cross overlay ──────────────────────────── */
.fx-scripture-cross {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
background:
linear-gradient(to bottom, transparent 5%, rgba(200,168,76,0.30) 22%, rgba(200,168,76,0.50) 40%, rgba(200,168,76,0.30) 58%, transparent 80%) center / 8% 100% no-repeat,
linear-gradient(to right, transparent 20%, rgba(200,168,76,0.28) 35%, rgba(200,168,76,0.42) 46%, rgba(200,168,76,0.42) 54%, rgba(200,168,76,0.28) 65%, transparent 80%) center 30% / 100% 6% no-repeat,
radial-gradient(ellipse 35% 55% at 50% 38%, rgba(200,168,76,0.22) 0%, transparent 70%);
animation: scripture-cross-pulse 8s ease-in-out infinite;
mix-blend-mode: screen;
filter: brightness(var(--fx-religious-intensity, 1));
}
/* ── Chapel stained glass overlay ─────────────────────── */
.fx-chapel-glass {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
background:
linear-gradient(155deg, transparent 10%, rgba(138,92,240,0.24) 22%, rgba(102,51,204,0.36) 35%, transparent 55%) no-repeat,
linear-gradient(175deg, transparent 15%, rgba(200,80,140,0.22) 30%, rgba(220,100,160,0.30) 45%, transparent 65%) no-repeat,
linear-gradient(195deg, transparent 25%, rgba(200,168,76,0.20) 40%, rgba(220,190,100,0.28) 55%, transparent 75%) no-repeat,
radial-gradient(ellipse 45% 40% at 50% 25%, rgba(138,92,240,0.18) 0%, transparent 70%);
animation: chapel-glass-shift 12s ease-in-out infinite;
mix-blend-mode: screen;
filter: brightness(var(--fx-religious-intensity, 1));
}
/* ── Gospel radiance overlay ──────────────────────────── */
.fx-gospel-radiance {
position: absolute; inset: 0;
pointer-events: none; z-index: 0;
background:
linear-gradient(180deg, rgba(200,168,76,0.26) 0%, rgba(220,195,120,0.18) 15%, transparent 50%) no-repeat,
radial-gradient(ellipse 55% 45% at 50% 18%, rgba(139,32,50,0.18) 0%, rgba(200,168,76,0.12) 40%, transparent 70%),
radial-gradient(circle at 50% 8%, rgba(255,250,240,0.22) 0%, transparent 55%);
animation: gospel-radiance 10s ease-in-out infinite;
filter: brightness(var(--fx-religious-intensity, 1));
}
/* ── Ice parent helpers ───────────────────────────────── */
.fx-ice-overflow { position: relative !important; overflow: visible !important; }
/* ─── Custom Theme Triangle Picker ───────────────────── */
#custom-theme-editor {
margin-top: 8px;
padding: 8px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
}
#custom-hue-bar {
width: 100%;
height: 18px;
border-radius: var(--radius-sm);
cursor: crosshair;
display: block;
margin-bottom: 6px;
}
#custom-triangle {
width: 100%;
height: 180px;
cursor: crosshair;
display: block;
border-radius: var(--radius-sm);
}
/* ─── RGB Theme Editor ───────────────────────── */
.rgb-theme-editor {
margin-top: 8px;
padding: 8px 10px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--radius);
}
.rgb-slider-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
margin-bottom: 4px;
cursor: default;
}
.rgb-slider-row:last-child { margin-bottom: 0; }
.rgb-slider-label {
font-size: 11px;
font-weight: 600;
color: var(--text-secondary);
min-width: 50px;
}
.rgb-slider {
flex: 1;
height: 4px;
accent-color: var(--accent);
cursor: pointer;
}
/* ═══════════════════════════════════════════════════════════
AUTH PAGE
═══════════════════════════════════════════════════════════ */
.auth-page {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-secondary) 50%, var(--bg-tertiary) 100%);
overflow: auto;
}
.auth-container { width: 100%; max-width: 400px; padding: 20px; }
.auth-card {
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 32px;
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
}
.auth-header { text-align: center; margin-bottom: 28px; }
.auth-header .logo { font-size: 48px; color: var(--accent); line-height: 1; }
.auth-header h1 {
font-size: 28px;
font-weight: 700;
letter-spacing: 6px;
color: var(--text-primary);
margin: 8px 0 4px;
font-family: var(--font-heading);
}
.auth-header .tagline { color: var(--text-secondary); font-size: 14px; }
.auth-tabs {
display: flex;
gap: 4px;
background: var(--bg-primary);
border-radius: var(--radius);
padding: 4px;
margin-bottom: 24px;
}
.auth-tab {
flex: 1;
padding: 8px;
border-radius: var(--radius-sm);
background: transparent;
color: var(--text-secondary);
font-size: 14px;
font-weight: 500;
transition: all var(--transition);
}
.auth-tab:hover { color: var(--text-primary); }
.auth-tab.active { background: var(--accent); color: white; }
.auth-form { display: flex; flex-direction: column; gap: 16px; }
.form-group { display: flex; flex-direction: column; gap: 4px; }
.form-group label {
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-secondary);
}
.form-group input {
padding: 10px 12px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 15px;
transition: border-color var(--transition);
}
.form-group input:focus { border-color: var(--accent); }
.form-group small { font-size: 11px; color: var(--text-muted); }
.form-select {
padding: 10px 12px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 14px;
transition: border-color var(--transition);
cursor: pointer;
appearance: auto;
}
.form-select:focus { border-color: var(--accent); outline: none; }
.btn-primary {
padding: 11px 20px;
background: var(--accent);
color: white;
border-radius: var(--radius);
font-size: 15px;
font-weight: 600;
transition: background var(--transition);
margin-top: 4px;
}
.btn-primary:hover { background: var(--accent-hover); }
.auth-error {
margin-top: 16px;
padding: 10px 14px;
background: rgba(240,71,71,0.12);
border: 1px solid var(--danger);
border-radius: var(--radius-sm);
color: var(--danger);
font-size: 13px;
text-align: center;
}
.auth-theme-bar {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 6px;
margin-top: 20px;
padding: 16px 12px 0;
border-top: 1px solid var(--border);
max-width: 360px;
margin-left: auto;
margin-right: auto;
}
.auth-theme-bar .theme-btn {
width: 28px;
height: 28px;
font-size: 11px;
flex-shrink: 0;
}
.auth-version {
text-align: center;
margin-top: 12px;
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-mono);
opacity: 0.7;
}
/* ═══════════════════════════════════════════════════════════
APP LAYOUT
═══════════════════════════════════════════════════════════ */
#app {
display: flex;
flex-direction: column;
height: 100vh;
height: 100dvh; /* dynamic viewport height — accounts for mobile browser chrome */
width: 100vw;
overflow: hidden;
}
#app-body {
display: flex;
flex: 1;
min-height: 0;
}
/* ── Left Sidebar ──────────────────────────────────────── */
.sidebar {
width: var(--sidebar-width);
min-width: 200px;
max-width: 400px;
background: var(--bg-secondary);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
}
/* Resize handle (right edge of left sidebar) */
.sidebar-resize-handle {
position: absolute;
top: 0;
right: -3px;
width: 6px;
height: 100%;
cursor: col-resize;
z-index: 10;
background: transparent;
transition: background 0.15s;
}
.sidebar[data-panel-pos="right"] .sidebar-resize-handle {
right: auto;
left: -3px;
}
.sidebar-resize-handle:hover,
.sidebar-resize-handle.dragging {
background: var(--accent);
opacity: 0.5;
}
.sidebar-header { padding: 16px; border-bottom: 1px solid var(--border); }
.brand { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.logo-sm { font-size: 24px; color: var(--accent); }
.brand-icon { width: 28px; height: 28px; border-radius: 6px; object-fit: cover; flex-shrink: 0; }
.brand-text {
font-size: 18px;
font-weight: 700;
letter-spacing: 4px;
color: var(--text-primary);
font-family: var(--font-heading);
}
.user-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
background: var(--bg-primary);
border-radius: var(--radius-sm);
}
.user-names {
display: flex;
flex-direction: column;
flex: 1;
overflow: hidden;
min-width: 0;
}
.current-user {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.login-name {
font-size: 10px;
color: var(--text-muted);
opacity: 0.7;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.icon-btn {
background: transparent;
color: var(--text-muted);
font-size: 16px;
padding: 4px;
border-radius: var(--radius-sm);
transition: all var(--transition);
display: flex;
align-items: center;
justify-content: center;
}
.icon-btn:hover { color: var(--text-primary); background: var(--bg-hover); }
.icon-btn.active { color: var(--accent); background: rgba(var(--accent-rgb, 124,92,252), 0.15); }
.icon-btn.small { font-size: 13px; }
.icon-btn.danger:hover { color: var(--danger); }
.sidebar-section { padding: 12px 16px; border-bottom: 1px solid var(--border); }
.sidebar-section.channel-section {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
padding-bottom: 0;
}
.section-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--text-muted);
margin-bottom: 8px;
}
.input-row { display: flex; gap: 6px; }
.input-row input {
flex: 1;
padding: 7px 10px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 13px;
min-width: 0;
}
.input-row input:focus { border-color: var(--accent); }
.btn-sm {
padding: 7px 12px;
background: var(--bg-tertiary);
color: var(--text-secondary);
border-radius: var(--radius-sm);
font-size: 12px;
font-weight: 600;
transition: all var(--transition);
white-space: nowrap;
}
.btn-sm:hover { background: var(--bg-hover); color: var(--text-primary); }
.btn-sm.btn-accent { background: var(--accent); color: white; font-size: 16px; padding: 7px 10px; line-height: 1; }
.btn-sm.btn-accent:hover { background: var(--accent-hover); }
/* ── Channel List ──────────────────────────────────────── */
.channel-list { flex: 1; overflow-y: auto; padding: 4px 0; }
.channel-item {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
cursor: pointer;
transition: background var(--transition);
position: relative;
}
.channel-item:hover { background: var(--bg-hover); }
.channel-item.active { background: var(--bg-active); }
.channel-item.active::before {
content: '';
position: absolute;
left: 0; top: 4px; bottom: 4px;
width: 3px;
background: var(--accent);
border-radius: 0 2px 2px 0;
}
.channel-hash { color: var(--text-muted); font-weight: 700; font-size: 16px; flex-shrink: 0; }
.channel-name {
font-size: 14px;
color: var(--text-secondary);
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.channel-item.active .channel-name,
.channel-item:hover .channel-name { color: var(--text-primary); }
.channel-badge {
background: var(--danger);
color: white;
font-size: 10px;
font-weight: 700;
min-width: 18px;
height: 18px;
border-radius: 9px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 5px;
}
/* ── Channel voice indicator (sidebar) ─── */
.channel-voice-indicator {
display: flex;
align-items: center;
gap: 3px;
font-size: 11px;
color: var(--success);
flex-shrink: 0;
}
.channel-voice-indicator .voice-icon { font-size: 12px; }
/* ── Main Content ──────────────────────────────────────── */
.main {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
background: var(--bg-primary);
}
.channel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 20px;
border-bottom: 1px solid var(--border);
min-height: 52px;
gap: 12px;
}
.channel-info { display: flex; align-items: center; gap: 10px; min-width: 0; }
/* ── Header actions box (code/settings | search/pin) ── */
.header-actions-box {
display: flex;
align-items: center;
gap: 5px;
padding: 3px 8px;
border: 1px solid var(--border, rgba(255,255,255,0.1));
border-radius: 8px;
background: var(--bg-tertiary, rgba(255,255,255,0.03));
flex-shrink: 0;
}
.header-actions-box .icon-btn {
opacity: 0.7;
transition: opacity 0.15s;
}
.header-actions-box .icon-btn:hover {
opacity: 1;
}
.header-actions-divider {
width: 1px;
height: 18px;
background: var(--border, rgba(255,255,255,0.12));
flex-shrink: 0;
margin: 0 2px;
}
.header-left-actions {
display: flex;
align-items: center;
gap: 5px;
flex-shrink: 0;
}
/* ── Update Available Banner ── */
.update-banner {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 12px;
background: linear-gradient(135deg, var(--accent), var(--accent-hover));
color: #fff;
font-size: 12px;
font-weight: 600;
border-radius: 20px;
text-decoration: none;
white-space: nowrap;
flex-shrink: 0;
cursor: pointer;
animation: updateFadeIn 0.4s ease;
transition: transform 0.15s, box-shadow 0.15s;
}
.update-banner:hover {
transform: scale(1.05);
box-shadow: 0 2px 12px rgba(var(--accent-rgb, 88, 101, 242), 0.4);
color: #fff;
}
.update-pulse {
width: 8px;
height: 8px;
background: #fff;
border-radius: 50%;
animation: updatePulse 1.5s ease-in-out infinite;
}
@keyframes updatePulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.5; transform: scale(0.8); }
}
@keyframes updateFadeIn {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Channel context menu (sidebar "..." hover button) */
.channel-item { position: relative; }
.channel-more-btn {
background: none;
border: none;
color: var(--text-secondary);
font-size: 16px;
cursor: pointer;
padding: 2px 5px;
border-radius: var(--radius-sm);
opacity: 0;
pointer-events: none;
transition: opacity .15s;
line-height: 1;
flex-shrink: 0;
margin-left: auto;
}
/* When voice indicator is present, don't double-auto-margin */
.channel-voice-indicator ~ .channel-more-btn {
margin-left: 2px;
}
.channel-item:hover .channel-more-btn,
.channel-item .channel-more-btn:focus {
opacity: 1;
pointer-events: auto;
}
.channel-more-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
.channel-ctx-menu {
position: fixed;
z-index: 9999;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 4px 16px rgba(0,0,0,0.35);
min-width: 170px;
padding: 4px;
}
.channel-ctx-item {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
background: none;
border: none;
color: var(--text-primary);
font-size: 13px;
cursor: pointer;
border-radius: var(--radius-sm);
white-space: nowrap;
width: 100%;
text-align: left;
}
.channel-ctx-item:hover { background: var(--bg-hover); }
.channel-ctx-item.danger { color: var(--danger); }
.channel-ctx-item.danger:hover { background: #3a1515; }
.ctx-indicator {
margin-left: auto;
font-size: 0.85em;
padding-left: 10px;
white-space: nowrap;
}
.channel-ctx-sep {
border: none;
border-top: 1px solid var(--border);
margin: 3px 6px;
}
.channel-info h3 {
font-size: 16px;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-family: var(--font-heading);
}
.channel-code-tag {
font-size: 11px;
font-family: var(--font-mono);
color: var(--text-muted);
background: var(--bg-tertiary);
padding: 2px 8px;
border-radius: 10px;
letter-spacing: 0.5px;
}
.channel-code-tag:empty { display: none; }
.voice-controls { display: flex; gap: 5px; flex-shrink: 0; align-items: center; margin-left: auto; }
.btn-voice {
padding: 5px 12px;
border-radius: var(--radius);
font-size: 13px;
font-weight: 500;
transition: all var(--transition);
background: var(--bg-tertiary);
color: var(--text-secondary);
line-height: 1.3;
height: 30px;
display: inline-flex;
align-items: center;
box-sizing: border-box;
}
.btn-voice:hover { background: var(--bg-hover); color: var(--text-primary); }
.btn-voice.active { background: var(--success); color: white; }
.btn-voice.btn-danger { background: var(--danger); color: white; padding: 5px 10px; font-size: 14px; }
.btn-voice.btn-danger:hover { background: #d93636; }
.btn-voice.muted { background: var(--warning); color: #1a1a2e; }
/* ── Voice Active Indicator (header) ─────────── */
.voice-active-indicator {
display: none;
align-items: center;
gap: 6px;
padding: 4px 10px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
white-space: nowrap;
}
.voice-indicator-icon { font-size: 13px; }
.voice-indicator-text { font-size: 12px; }
/* Backdrop (only visible on mobile via media query) */
.voice-dropdown-backdrop { display: none; }
.voice-dropdown-panel {
display: none;
position: absolute;
top: 100%;
right: 0;
margin-top: 6px;
flex-direction: column;
gap: 4px;
padding: 8px;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
z-index: 100;
min-width: 140px;
}
.voice-dropdown-panel .btn-voice {
width: 100%;
text-align: left;
white-space: nowrap;
}
.voice-dropdown-panel .voice-ns-wrap {
width: 100%;
}
/* ── Noise Suppression Slider ───────────────── */
.voice-ns-wrap {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 3px 8px;
border-radius: var(--radius);
background: var(--bg-tertiary);
}
.ns-label {
font-size: 14px;
line-height: 1;
cursor: default;
}
.ns-slider {
width: 60px;
height: 14px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 2px;
outline: none;
cursor: pointer;
}
.ns-slider::-webkit-slider-runnable-track {
background: var(--track-bg, var(--bg-hover, rgba(255,255,255,0.3)));
height: 6px;
border-radius: 3px;
border: 1px solid var(--border);
}
.ns-slider::-moz-range-track {
background: var(--track-bg, var(--bg-hover, rgba(255,255,255,0.3)));
height: 6px;
border-radius: 3px;
border: 1px solid var(--border);
}
.ns-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
margin-top: -5px;
box-shadow: 0 0 6px var(--accent-glow, rgba(124,92,252,0.4));
border: 2px solid var(--bg-secondary);
}
.ns-slider::-moz-range-thumb {
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
border: 2px solid var(--bg-secondary);
box-shadow: 0 0 6px var(--accent-glow, rgba(124,92,252,0.4));
}
/* ── Welcome Screen ────────────────────────────────────── */
.welcome-screen { flex: 1; display: flex; align-items: center; justify-content: center; }
.welcome-content { text-align: center; color: var(--text-secondary); }
.welcome-icon { font-size: 72px; color: var(--accent); opacity: 0.5; margin-bottom: 16px; }
.welcome-content h2 {
font-size: 24px;
color: var(--text-primary);
margin-bottom: 8px;
font-family: var(--font-heading);
}
.welcome-content p { font-size: 14px; line-height: 1.6; }
/* ── Message Area ──────────────────────────────────────── */
.message-area { flex: 1; display: flex; flex-direction: column; min-height: 0; position: relative; }
.messages {
flex: 1;
overflow-y: auto;
padding: 16px 20px;
display: flex;
flex-direction: column;
gap: 2px;
}
.message {
display: flex;
flex-direction: column;
border-radius: var(--radius-sm);
transition: background var(--transition);
box-shadow: var(--msg-glow);
}
.message:hover { background: rgba(255,255,255,0.02); }
.message-row {
display: flex;
gap: 12px;
padding: 4px 8px;
}
.message-avatar {
width: 36px;
height: 36px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 14px;
color: white;
flex-shrink: 0;
margin-top: 2px;
}
.message-avatar-img {
width: 36px;
height: 36px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
margin-top: 2px;
}
/* User list avatars */
/* Discord-style avatar wrapper with overlaid status dot */
.user-avatar-wrapper {
position: relative;
flex-shrink: 0;
width: 24px;
height: 24px;
}
.user-status-dot {
position: absolute;
bottom: -2px;
right: -2px;
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--success);
border: 2px solid var(--bg-secondary);
box-sizing: border-box;
}
/* Away: half-circle (dome) — visually distinct from full circle */
.user-status-dot.away {
background: #faa61a;
border-radius: 2px 2px 50% 50%;
}
/* DND: square — immediately distinguishable */
.user-status-dot.dnd {
background: var(--danger);
border-radius: 2px;
}
/* Invisible / Offline: hollow circle outline */
.user-status-dot.invisible {
background: transparent;
border: 2px solid var(--text-muted);
}
.user-item.offline .user-status-dot {
background: transparent;
border: 2px solid var(--text-muted);
}
.user-item-avatar {
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 10px;
color: white;
flex-shrink: 0;
}
.user-item-avatar-img {
width: 24px;
height: 24px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
}
/* Avatar settings */
.avatar-settings { padding: 4px 0; position: relative; z-index: 1; }
.settings-section-subtitle { font-size: 13px; font-weight: 600; color: var(--text-secondary); margin-bottom: 10px; margin-top: 16px; padding-bottom: 6px; border-bottom: 1px solid var(--border); }
/* Avatar Upload Row (Anmire-style) */
.avatar-upload-row { display: flex; align-items: center; gap: 8px; }
.avatar-upload-preview {
width: 48px;
height: 48px;
border-radius: 50%;
overflow: hidden;
flex-shrink: 0;
border: 2px solid var(--border);
background: var(--bg-tertiary);
}
.avatar-upload-preview img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
/* Avatar Shape Picker */
.avatar-shape-picker { display: flex; gap: 8px; flex-wrap: wrap; }
.avatar-shape-btn {
width: 38px; height: 38px;
display: flex; align-items: center; justify-content: center;
background: var(--bg-tertiary, #2a2a2e); border: 2px solid var(--border);
border-radius: 6px; cursor: pointer;
transition: border-color 0.2s, box-shadow 0.2s;
}
.avatar-shape-btn:hover { border-color: var(--text-secondary); }
.avatar-shape-btn.active { border-color: var(--accent); box-shadow: 0 0 8px rgba(var(--accent-rgb, 88,101,242), 0.4); }
.shape-preview { width: 20px; height: 20px; background: var(--accent, #5865f2); }
.shape-circle { border-radius: 50%; }
.shape-rounded { border-radius: 4px; }
.shape-squircle { border-radius: 28%; }
.shape-hex { clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); }
.shape-diamond { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }
/* Avatar Shape Classes — applied to .message-avatar and .message-avatar-img */
.avatar-circle { border-radius: 50% !important; }
.avatar-rounded { border-radius: 6px !important; }
.avatar-squircle { border-radius: 28% !important; }
.avatar-hex { clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%); border-radius: 0 !important; }
.avatar-diamond { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); border-radius: 0 !important; }
/* Size slider */
#avatar-size-slider {
width: 100%;
-webkit-appearance: none;
appearance: none;
height: 6px;
border-radius: 3px;
background: var(--bg-tertiary, #2a2a2e);
outline: none;
}
#avatar-size-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 16px; height: 16px;
border-radius: 50%;
background: var(--accent, #5865f2);
cursor: pointer;
border: 2px solid var(--bg-primary, #1e1e22);
}
#avatar-size-slider::-moz-range-thumb {
width: 16px; height: 16px;
border-radius: 50%;
background: var(--accent, #5865f2);
cursor: pointer;
border: 2px solid var(--bg-primary, #1e1e22);
}
/* Custom sounds admin */
.custom-sound-item {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 0;
border-bottom: 1px solid var(--border);
}
.custom-sound-item:last-child { border-bottom: none; }
.custom-sound-name { flex: 1; font-size: 13px; color: var(--text-primary); }
.btn-xs {
padding: 2px 8px;
font-size: 11px;
border-radius: 4px;
border: 1px solid var(--border);
background: var(--bg-secondary);
color: var(--text-primary);
cursor: pointer;
transition: background 0.15s;
}
.btn-xs:hover { background: var(--bg-tertiary); }
.message-body { flex: 1; min-width: 0; }
.message-header { display: flex; align-items: baseline; gap: 8px; margin-bottom: 2px; }
.message-author { font-weight: 600; font-size: 14px; }
.message-time { font-size: 11px; color: var(--text-muted); }
.message-content {
font-size: 14px;
color: var(--text-primary);
word-wrap: break-word;
overflow-wrap: break-word;
line-height: 1.45;
}
.message-content a { color: var(--text-link); }
.message-compact {
display: flex;
position: relative;
padding: 1px 8px 1px 56px;
border-radius: var(--radius-sm);
transition: background var(--transition);
box-shadow: var(--msg-glow);
}
.message-compact:hover { background: rgba(255,255,255,0.02); }
.message-compact .compact-time {
position: absolute;
left: 8px;
top: 2px;
font-size: 10px;
color: var(--text-muted);
display: none;
}
.message-compact:hover .compact-time { display: block; }
.system-message {
padding: 4px 8px;
font-size: 12px;
color: var(--text-muted);
font-style: italic;
text-align: center;
}
.typing-indicator {
padding: 0 20px;
height: 20px;
font-size: 12px;
color: var(--text-muted);
display: flex;
align-items: center;
}
/* ── Message Input ─────────────────────────────────────── */
.message-input-area {
display: flex;
align-items: flex-end;
gap: 8px;
padding: 12px 20px 16px;
position: relative;
}
.message-input-area textarea {
flex: 1;
padding: 10px 14px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text-primary);
font-size: 14px;
resize: none;
max-height: 120px;
line-height: 1.4;
transition: border-color var(--transition);
}
.message-input-area textarea:focus { border-color: var(--accent); }
.message-input-area textarea::placeholder { color: var(--text-muted); }
.btn-send {
width: 38px;
height: 38px;
background: var(--accent);
color: white;
border-radius: var(--radius);
display: flex;
align-items: center;
justify-content: center;
transition: background var(--transition);
flex-shrink: 0;
}
.btn-send:hover { background: var(--accent-hover); }
/* ── Right Sidebar ─────────────────────────────────────── */
.right-sidebar {
width: var(--right-width);
min-width: 200px;
max-width: 400px;
background: var(--bg-secondary);
border-left: 1px solid var(--border);
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
}
/* Voice section — pinned at top, shrinks if needed */
.right-sidebar-voice {
flex-shrink: 1;
overflow-y: auto;
min-height: 0;
}
/* Users section — fills remaining space and scrolls */
.right-sidebar-users {
flex: 1 1 0;
overflow-y: auto;
min-height: 0;
}
/* Resize handle (left edge of right sidebar) */
.right-sidebar-resize-handle {
position: absolute;
top: 0;
left: -3px;
width: 6px;
height: 100%;
cursor: col-resize;
z-index: 10;
background: transparent;
transition: background 0.15s;
}
.right-sidebar-resize-handle:hover,
.right-sidebar-resize-handle.dragging {
background: var(--accent);
opacity: 0.5;
}
.panel { padding: 16px; border-bottom: 1px solid var(--border); }
.panel-title {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: var(--text-muted);
margin-bottom: 10px;
}
.user-list { display: flex; flex-direction: column; gap: 4px; }
.muted-text { font-size: 12px; color: var(--text-muted); font-style: italic; }
.user-item {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 6px;
border-radius: var(--radius-sm);
position: relative;
}
.user-item:hover {
background: var(--bg-hover);
}
.user-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); flex-shrink: 0; }
.user-dot.voice { background: var(--voice-dot-color, var(--accent)); }
.user-item-name {
font-size: 13px;
color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
/* Role color dot (to the left of the username, inside avatar wrapper) */
.user-role-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
border: 1px solid rgba(0,0,0,0.3);
}
/* User tooltip (shown on hover over name) */
.user-item-tooltip {
display: none;
position: absolute;
left: 50%;
bottom: calc(100% + 6px);
transform: translateX(-50%);
background: var(--bg-secondary);
border: 1px solid var(--border-light);
border-radius: var(--radius);
padding: 8px 12px;
z-index: 1000;
white-space: nowrap;
pointer-events: none;
box-shadow: 0 6px 20px rgba(0,0,0,0.6);
font-size: 12px;
color: var(--text-primary);
max-width: 220px;
opacity: 1;
backdrop-filter: none;
}
.user-item-tooltip::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: var(--border-light);
}
.user-item:hover .user-item-tooltip {
display: block;
}
.tooltip-username {
font-weight: 700;
font-size: 13px;
margin-bottom: 2px;
}
.tooltip-role {
font-size: 11px;
opacity: 0.8;
}
.tooltip-status {
font-size: 11px;
color: var(--text-muted);
font-style: italic;
margin-top: 2px;
}
/* ═══════════════════════════════════════════════════════════
PROFILE POPUP (Discord-style mini profile card)
═══════════════════════════════════════════════════════════ */
.profile-popup {
position: fixed;
z-index: 10001;
width: 320px;
background: var(--bg-secondary);
border: 1px solid var(--border-light);
border-radius: var(--radius);
box-shadow: 0 8px 32px rgba(0,0,0,0.7);
overflow: hidden;
animation: profile-popup-in 0.18s ease-out;
opacity: 1;
backdrop-filter: none;
}
@keyframes profile-popup-in {
from { opacity: 0; transform: scale(0.95) translateY(6px); }
to { opacity: 1; transform: scale(1) translateY(0); }
}
.profile-popup-banner {
height: 60px;
position: relative;
background: var(--bg-tertiary);
}
.profile-popup-close {
position: absolute;
top: 6px; right: 8px;
background: none; border: none;
color: var(--text-muted);
font-size: 18px;
cursor: pointer;
line-height: 1;
padding: 2px 6px;
border-radius: 4px;
}
.profile-popup-close:hover { background: rgba(255,255,255,0.1); color: var(--text-primary); }
.profile-popup-avatar-wrapper {
position: relative;
width: 72px; height: 72px;
margin: -36px 0 0 16px;
}
.profile-popup-avatar {
width: 72px; height: 72px;
border-radius: 50%;
border: 4px solid var(--bg-primary);
object-fit: cover;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
font-weight: 700;
color: #fff;
}
.profile-popup-avatar.avatar-hexagon { border-radius: 0; clip-path: polygon(50% 0%,100% 25%,100% 75%,50% 100%,0% 75%,0% 25%); }
.profile-popup-avatar.avatar-squircle { border-radius: 22%; }
.profile-popup-avatar.avatar-diamond { border-radius: 0; clip-path: polygon(50% 0%,100% 50%,50% 100%,0% 50%); }
.profile-popup-avatar.avatar-shield { border-radius: 0; clip-path: polygon(50% 0%,100% 10%,100% 65%,50% 100%,0% 65%,0% 10%); }
.profile-popup-avatar-fallback {
background-color: var(--accent);
}
.profile-popup-status-dot {
position: absolute;
bottom: 2px; right: 2px;
width: 16px; height: 16px;
border-radius: 50%;
background: var(--success);
border: 3px solid var(--bg-primary);
}
.profile-popup-status-dot.away { background: var(--warning); }
.profile-popup-status-dot.dnd { background: var(--danger); }
.profile-popup-status-dot.invisible { background: var(--text-muted); }
.profile-popup-body {
padding: 10px 16px 16px;
background: var(--bg-secondary);
}
.profile-popup-names {
display: flex;
flex-direction: column;
gap: 1px;
margin-bottom: 6px;
}
.profile-popup-displayname {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
line-height: 1.2;
}
.profile-popup-username {
font-size: 13px;
color: var(--text-muted);
}
.profile-popup-status-text {
font-size: 13px;
color: var(--text-secondary);
font-style: italic;
padding: 4px 8px;
background: var(--bg-secondary);
border-radius: var(--radius-sm);
margin-bottom: 8px;
}
.profile-popup-bio {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.4;
margin-bottom: 4px;
word-break: break-word;
}
.profile-bio-empty {
color: var(--text-muted);
font-style: italic;
font-size: 12px;
}
.profile-bio-toggle {
background: none; border: none;
color: var(--accent);
cursor: pointer;
font-size: 12px;
padding: 2px 0;
}
.profile-bio-toggle:hover { text-decoration: underline; }
.profile-popup-divider {
height: 1px;
background: var(--border);
margin: 8px 0;
}
.profile-popup-section-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: 4px;
letter-spacing: 0.03em;
}
.profile-popup-roles {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 8px;
}
.profile-popup-role {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
font-size: 12px;
border: 1px solid;
border-radius: 12px;
background: var(--bg-secondary);
}
.profile-role-dot {
width: 8px; height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.profile-popup-join-date {
font-size: 12px;
color: var(--text-secondary);
margin-bottom: 8px;
}
.profile-popup-actions {
margin-top: 8px;
}
.profile-popup-action-btn {
width: 100%;
padding: 8px 12px;
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
font-size: 13px;
font-weight: 600;
transition: background var(--transition), transform 0.1s;
}
.profile-popup-action-btn:active { transform: scale(0.98); }
.profile-dm-btn {
background: var(--accent);
color: #fff;
}
.profile-dm-btn:hover { background: var(--accent-hover); }
.profile-edit-btn {
background: var(--bg-tertiary);
color: var(--text-primary);
border: 1px solid var(--border-light) !important;
}
.profile-edit-btn:hover { background: var(--bg-hover); }
/* ── Edit Profile Modal ──────────────────────────── */
.edit-profile-modal-box {
width: 380px;
max-width: 95vw;
}
.edit-profile-label {
display: block;
font-size: 12px;
font-weight: 600;
text-transform: uppercase;
color: var(--text-muted);
margin: 12px 0 6px;
letter-spacing: 0.03em;
}
.edit-profile-textarea {
width: 100%;
min-height: 80px;
padding: 8px 10px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 13px;
font-family: var(--font-main);
resize: vertical;
}
.edit-profile-textarea:focus {
outline: none;
border-color: var(--accent);
}
.edit-profile-char-count {
font-size: 11px;
color: var(--text-muted);
text-align: right;
margin-top: 2px;
}
/* Clickable message author and sidebar user items for profile popup */
.message-author { cursor: pointer; }
.message-author:hover { text-decoration: underline; }
.message-avatar, .message-avatar-img { cursor: pointer; }
.user-item { cursor: pointer; }
/* ═══════════════════════════════════════════════════════════
TOASTS
═══════════════════════════════════════════════════════════ */
#toast-container {
position: fixed;
top: 16px;
left: 50%;
transform: translateX(-50%);
z-index: 200000;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
pointer-events: none;
}
.toast {
padding: 10px 18px;
background: var(--bg-tertiary);
border: 1px solid var(--border-light);
border-radius: var(--radius);
color: var(--text-primary);
font-size: 13px;
box-shadow: 0 4px 16px rgba(0,0,0,0.3);
animation: toastIn 0.25s ease, toastOut 0.3s ease 3.5s forwards;
pointer-events: auto;
max-width: 360px;
word-break: break-word;
}
.toast.error { border-color: var(--danger); background: rgba(240,71,71,0.15); }
.toast.success { border-color: var(--success); background: rgba(67,181,129,0.15); }
@keyframes toastIn {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes toastOut {
from { opacity: 1; }
to { opacity: 0; transform: translateY(-10px); }
}
/* ═══════════════════════════════════════════════════════════
SERVER BAR (far left, Discord-style)
═══════════════════════════════════════════════════════════ */
.server-bar {
width: 56px;
min-width: 56px;
background: var(--bg-secondary);
border-right: 1px solid var(--border);
display: flex;
flex-direction: column;
align-items: center;
padding: 8px 0;
gap: 4px;
overflow-y: auto;
overflow-x: hidden;
}
.server-icon {
width: 40px;
height: 40px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
background: var(--bg-tertiary);
position: relative;
flex-shrink: 0;
}
.server-icon:hover { border-radius: 12px; background: var(--accent); }
.server-icon.home { border-radius: 12px; background: var(--accent); }
.server-icon.home.bounce {
animation: serverBounce 0.4s ease;
}
@keyframes serverBounce {
0%, 100% { transform: translateY(0); }
40% { transform: translateY(-6px); }
60% { transform: translateY(-3px); }
}
.server-icon-text {
font-size: 18px;
color: var(--text-primary);
pointer-events: none;
font-weight: 700;
}
.server-icon-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: inherit;
pointer-events: none;
}
.server-icon.add-server {
background: transparent;
border: 2px dashed var(--border-light);
}
.server-icon.add-server:hover {
border-color: var(--accent);
background: transparent;
border-radius: 12px;
}
.server-icon.add-server .server-icon-text {
font-size: 22px;
color: var(--accent);
}
.server-status-dot {
position: absolute;
bottom: -1px;
right: -1px;
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid var(--bg-secondary);
}
.server-status-dot.online { background: var(--success); }
.server-status-dot.offline { background: var(--text-muted); }
.server-status-dot.unknown { background: var(--warning); }
.server-separator {
width: 24px;
height: 2px;
background: var(--border);
border-radius: 1px;
margin: 4px 0;
flex-shrink: 0;
}
.server-remove {
position: absolute;
top: -4px;
right: -4px;
width: 16px;
height: 16px;
border-radius: 50%;
background: var(--danger);
color: white;
font-size: 12px;
line-height: 1;
display: none;
align-items: center;
justify-content: center;
cursor: pointer;
border: 1px solid var(--bg-secondary);
padding: 0;
}
.server-icon.remote:hover .server-remove { display: flex; }
/* Manage Servers gear button */
.server-icon.manage-servers {
background: transparent;
border: 2px dashed var(--border-light);
margin-top: 2px;
}
.server-icon.manage-servers:hover {
border-color: var(--accent);
background: transparent;
border-radius: 12px;
}
.server-icon.manage-servers .server-icon-text {
font-size: 18px;
color: var(--text-secondary);
transition: color 0.15s;
}
.server-icon.manage-servers:hover .server-icon-text {
color: var(--accent);
}
/* Manage Servers modal list */
.manage-servers-list {
max-height: 360px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 6px;
margin: 12px 0;
}
.manage-servers-list:empty::before {
content: 'No servers added yet. Click "+ Add Server" below.';
color: var(--text-muted);
text-align: center;
padding: 24px 0;
font-size: 13px;
}
.manage-server-row {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
background: var(--bg-tertiary);
border-radius: var(--radius);
border: 1px solid var(--border);
transition: background 0.15s;
}
.manage-server-row:hover {
background: var(--bg-hover);
}
.manage-server-icon {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--bg-secondary);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 14px;
font-weight: 700;
color: var(--text-primary);
overflow: hidden;
}
.manage-server-icon img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: inherit;
}
.manage-server-info {
flex: 1;
min-width: 0;
}
.manage-server-name {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.manage-server-url {
font-size: 11px;
color: var(--text-muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-family: var(--font-mono);
}
.manage-server-status {
font-size: 11px;
padding: 2px 6px;
border-radius: 9px;
flex-shrink: 0;
}
.manage-server-status.online {
background: rgba(67, 181, 129, 0.15);
color: var(--success);
}
.manage-server-status.offline {
background: rgba(240, 71, 71, 0.12);
color: var(--text-muted);
}
.manage-server-status.unknown {
background: rgba(250, 166, 26, 0.12);
color: var(--warning);
}
.manage-server-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
}
.manage-server-actions button {
background: none;
border: none;
font-size: 14px;
cursor: pointer;
padding: 4px 6px;
border-radius: var(--radius-sm);
color: var(--text-secondary);
transition: background 0.15s, color 0.15s;
}
.manage-server-actions button:hover {
background: var(--bg-active);
color: var(--text-primary);
}
.manage-server-actions button.danger-action:hover {
background: #3a1515;
color: var(--danger);
}
/* ═══════════════════════════════════════════════════════════
MODAL
═══════════════════════════════════════════════════════════ */
.modal-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: 100001;
backdrop-filter: blur(4px);
}
.modal {
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 12px;
padding: 28px;
width: 90%;
max-width: 400px;
box-shadow: 0 12px 48px rgba(0,0,0,0.5);
}
.modal h3 {
font-size: 20px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 4px;
font-family: var(--font-heading);
}
.modal .modal-desc {
font-size: 13px;
color: var(--text-secondary);
margin-bottom: 20px;
}
.modal .form-group { margin-bottom: 14px; }
.modal-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 20px;
}
/* ═══════════════════════════════════════════════════════════
SETUP WIZARD
═══════════════════════════════════════════════════════════ */
.modal-wizard {
max-width: 560px;
padding: 0;
overflow: hidden;
}
.wizard-header {
text-align: center;
padding: 32px 28px 20px;
border-bottom: 1px solid var(--border-light);
}
.wizard-hex {
font-size: 2.5rem;
display: block;
margin-bottom: 8px;
filter: drop-shadow(0 0 12px var(--accent-glow, rgba(124,92,252,0.3)));
}
.wizard-header h2 {
font-size: 22px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 4px;
}
.wizard-subtitle {
font-size: 13px;
color: var(--text-secondary);
}
.wizard-steps {
padding: 24px 28px;
min-height: 280px;
}
.wizard-step-indicators {
display: flex;
align-items: center;
justify-content: center;
gap: 0;
margin-bottom: 24px;
}
.wizard-indicator {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--bg-hover, #2c2f4a);
border: 2px solid var(--border-light);
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 700;
color: var(--text-secondary);
transition: all 0.2s ease;
}
.wizard-indicator.active {
background: var(--accent, #7c5cfc);
border-color: var(--accent, #7c5cfc);
color: #fff;
box-shadow: 0 0 12px var(--accent-glow, rgba(124,92,252,0.4));
}
.wizard-indicator.done {
background: var(--green, #43b581);
border-color: var(--green, #43b581);
color: #fff;
}
.wizard-indicator-line {
width: 32px;
height: 2px;
background: var(--border-light);
margin: 0 4px;
}
.wizard-step h3 {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 8px;
}
.wizard-step > p {
font-size: 13px;
color: var(--text-secondary);
margin-bottom: 16px;
line-height: 1.6;
}
.wizard-checklist {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 16px;
}
.wizard-check {
font-size: 13px;
color: var(--text-primary);
padding: 8px 12px;
background: var(--bg-hover, rgba(255,255,255,0.03));
border-radius: 8px;
border: 1px solid var(--border-light);
}
.wizard-info-box {
background: var(--bg-hover, rgba(255,255,255,0.03));
border: 1px solid var(--border-light);
border-radius: 8px;
padding: 14px;
margin-bottom: 12px;
}
.wizard-info-box strong {
display: block;
font-size: 12px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 8px;
}
.wizard-input {
width: 100%;
padding: 10px 12px;
background: var(--bg-input, #15172a);
border: 1px solid var(--border-light);
border-radius: 6px;
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
outline: none;
transition: border-color 0.15s ease;
}
.wizard-input:focus {
border-color: var(--accent, #7c5cfc);
box-shadow: 0 0 0 2px var(--accent-glow, rgba(124,92,252,0.2));
}
.wizard-hint {
display: block;
font-size: 12px;
color: var(--text-dim, #5d6180);
margin-top: 6px;
line-height: 1.5;
}
.wizard-code-display {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
background: var(--bg-input, #15172a);
border: 1px solid var(--border-light);
border-radius: 6px;
margin-top: 8px;
margin-bottom: 4px;
}
.wizard-code-display span {
font-size: 12px;
color: var(--text-secondary);
}
.wizard-code-display code {
font-size: 16px;
font-weight: 700;
color: var(--accent, #7c5cfc);
letter-spacing: 0.1em;
flex: 1;
}
.wizard-btn-small {
background: var(--bg-hover, #2c2f4a);
border: 1px solid var(--border-light);
border-radius: 4px;
color: var(--text-primary);
font-size: 11px;
padding: 4px 10px;
cursor: pointer;
transition: all 0.15s ease;
}
.wizard-btn-small:hover {
background: var(--accent, #7c5cfc);
color: #fff;
}
.wizard-steps-list {
margin: 8px 0 0 20px;
font-size: 13px;
color: var(--text-primary);
line-height: 1.8;
}
.wizard-steps-list code {
background: var(--bg-input, #15172a);
padding: 2px 6px;
border-radius: 3px;
font-size: 12px;
}
.wizard-footer {
display: flex;
align-items: center;
padding: 16px 28px;
border-top: 1px solid var(--border-light);
gap: 8px;
}
.wizard-btn-primary {
background: var(--accent, #7c5cfc);
color: #fff;
border: none;
border-radius: 6px;
padding: 10px 24px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
font-family: inherit;
}
.wizard-btn-primary:hover {
filter: brightness(1.15);
transform: translateY(-1px);
}
.wizard-btn-secondary {
background: var(--bg-hover, #2c2f4a);
color: var(--text-primary);
border: 1px solid var(--border-light);
border-radius: 6px;
padding: 10px 20px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
font-family: inherit;
}
.wizard-btn-secondary:hover {
background: var(--bg-active, #333660);
}
.wizard-btn-text {
background: none;
border: none;
color: var(--text-dim, #5d6180);
font-size: 13px;
cursor: pointer;
padding: 8px 12px;
transition: color 0.15s ease;
font-family: inherit;
}
.wizard-btn-text:hover {
color: var(--text-primary);
}
.wizard-spinner {
width: 20px;
height: 20px;
border: 2px solid var(--border-light);
border-top-color: var(--accent, #7c5cfc);
border-radius: 50%;
animation: wizard-spin 0.7s linear infinite;
display: inline-block;
vertical-align: middle;
margin-right: 8px;
}
@keyframes wizard-spin {
to { transform: rotate(360deg); }
}
.wizard-port-success {
padding: 12px;
background: rgba(67, 181, 129, 0.1);
border: 1px solid rgba(67, 181, 129, 0.3);
border-radius: 8px;
color: var(--text-primary);
font-size: 13px;
line-height: 1.6;
}
.wizard-port-fail {
padding: 12px;
background: rgba(240, 71, 71, 0.08);
border: 1px solid rgba(240, 71, 71, 0.25);
border-radius: 8px;
color: var(--text-primary);
font-size: 13px;
line-height: 1.6;
}
.wizard-port-fail ol {
margin: 8px 0 0 20px;
line-height: 1.8;
}
.wizard-port-fail code {
background: var(--bg-input, #15172a);
padding: 2px 6px;
border-radius: 3px;
font-size: 12px;
}
/* ═══════════════════════════════════════════════════════════
CHAT IMAGES
═══════════════════════════════════════════════════════════ */
.chat-image {
max-width: 400px;
max-height: 300px;
border-radius: var(--radius);
margin-top: 4px;
cursor: pointer;
transition: opacity 0.15s ease;
display: block;
}
.chat-image:hover { opacity: 0.85; }
/* ═══════════════════════════════════════════════════════════
UPLOAD BUTTON + DRAG-DROP
═══════════════════════════════════════════════════════════ */
/* ── Input actions box (upload | emoji | gif) ── */
.input-actions-box {
display: flex;
align-items: center;
gap: 2px;
padding: 3px 6px;
border: 1px solid var(--border, rgba(255,255,255,0.1));
border-radius: 8px;
background: var(--bg-tertiary, rgba(255,255,255,0.03));
flex-shrink: 0;
}
.input-actions-divider {
width: 1px;
height: 20px;
background: var(--border, rgba(255,255,255,0.12));
flex-shrink: 0;
margin: 0 1px;
}
/* Clippy icon hidden by default, shown only on Win95 */
.upload-icon-clippy { display: none; }
[data-theme="win95"] .upload-icon-default { display: none; }
[data-theme="win95"] .upload-icon-clippy { display: inline; font-size: 18px; }
.btn-upload {
width: 34px;
height: 34px;
background: transparent;
color: var(--text-muted);
border-radius: var(--radius);
display: flex;
align-items: center;
justify-content: center;
transition: all var(--transition);
flex-shrink: 0;
}
.btn-upload:hover { color: var(--text-primary); background: var(--bg-tertiary); }
.message-area.drag-over {
outline: 2px dashed var(--accent);
outline-offset: -4px;
background: rgba(124, 92, 252, 0.04);
}
/* ═══════════════════════════════════════════════════════════
VOICE VOLUME SLIDERS
═══════════════════════════════════════════════════════════ */
.voice-user-item { display: flex; align-items: center; flex-wrap: wrap; }
.voice-user-item.talking {
background: color-mix(in srgb, var(--voice-dot-color, var(--accent)) 12%, transparent);
border-radius: var(--radius-sm);
}
.voice-user-item.talking .user-dot.voice {
box-shadow: 0 0 6px 2px var(--voice-dot-color, var(--accent));
animation: voice-pulse 0.8s ease-in-out infinite alternate;
}
.voice-user-item.talking .user-item-name {
color: var(--accent);
font-weight: 600;
}
@keyframes voice-pulse {
from { box-shadow: 0 0 4px 1px var(--accent); }
to { box-shadow: 0 0 10px 4px var(--accent); }
}
.you-tag {
font-size: 10px;
color: var(--text-muted);
background: var(--bg-tertiary);
padding: 1px 6px;
border-radius: 8px;
margin-left: auto;
}
.volume-slider {
width: 100%;
height: 14px;
margin-top: 4px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 2px;
outline: none;
cursor: pointer;
}
.volume-slider::-webkit-slider-runnable-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.15);
}
.volume-slider::-moz-range-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.15);
}
.volume-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
margin-top: -4px;
}
.volume-slider::-moz-range-thumb {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
border: none;
}
/* ═══════════════════════════════════════════════════════════
NOTIFICATION SETTINGS
═══════════════════════════════════════════════════════════ */
.notif-settings { display: flex; flex-direction: column; gap: 10px; }
.toggle-row, .volume-row, .select-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 12px;
color: var(--text-secondary);
gap: 8px;
}
.toggle-row input[type="checkbox"] {
accent-color: var(--accent);
width: 16px;
height: 16px;
cursor: pointer;
}
.slider-sm {
width: 80px;
height: 14px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 2px;
outline: none;
cursor: pointer;
}
.slider-sm::-webkit-slider-runnable-track {
background: rgba(255,255,255,0.25);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.12);
}
.slider-sm::-moz-range-track {
background: rgba(255,255,255,0.25);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.12);
}
.slider-sm::-webkit-slider-thumb {
-webkit-appearance: none;
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
margin-top: -4px;
box-shadow: 0 0 4px var(--accent-glow, rgba(124,92,252,0.3));
}
.slider-sm::-moz-range-thumb {
width: 12px;
height: 12px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
border: none;
box-shadow: 0 0 4px var(--accent-glow, rgba(124,92,252,0.3));
}
.select-row select {
background: var(--bg-input);
color: var(--text-primary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 3px 6px;
font-size: 11px;
font-family: inherit;
cursor: pointer;
outline: none;
}
.select-row select:focus { border-color: var(--accent); }
/* ═══════════════════════════════════════════════════════════
EMOJI PICKER
═══════════════════════════════════════════════════════════ */
.btn-emoji {
width: 34px;
height: 34px;
background: transparent;
color: var(--text-muted);
border-radius: var(--radius);
display: flex;
align-items: center;
justify-content: center;
transition: all var(--transition);
flex-shrink: 0;
font-size: 18px;
}
.btn-emoji:hover { color: var(--text-primary); background: var(--bg-tertiary); }
.emoji-picker {
position: absolute;
bottom: 100%;
left: 48px;
margin-bottom: 8px;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 12px;
padding: 8px;
display: flex;
flex-direction: column;
width: 340px;
max-height: 360px;
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
z-index: 1000;
}
.emoji-search-row {
padding: 0 2px 6px;
}
.emoji-search-input {
width: 100%;
padding: 6px 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--bg-primary);
color: var(--text-primary);
font-size: 13px;
outline: none;
}
.emoji-search-input:focus {
border-color: var(--accent);
}
.emoji-tab-row {
display: flex;
gap: 2px;
padding: 0 2px 6px;
border-bottom: 1px solid var(--border);
margin-bottom: 6px;
}
.emoji-tab {
flex: 1;
padding: 4px 0;
font-size: 16px;
text-align: center;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
opacity: 0.5;
transition: opacity var(--transition), background var(--transition);
}
.emoji-tab:hover { opacity: 0.8; background: var(--bg-tertiary); }
.emoji-tab.active { opacity: 1; background: var(--bg-tertiary); }
.emoji-grid {
display: flex;
flex-wrap: wrap;
gap: 4px;
overflow-y: scroll;
max-height: 240px;
padding: 2px;
}
.emoji-item {
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
transition: background var(--transition), transform 0.1s ease;
}
.emoji-item:hover {
background: var(--bg-tertiary);
transform: scale(1.2);
}
/* Custom emoji (inline in messages + pickers) */
.custom-emoji {
width: 1.4em;
height: 1.4em;
vertical-align: middle;
object-fit: contain;
display: inline;
margin: 0 1px;
}
.reaction-custom-emoji {
width: 1em;
height: 1em;
}
.emoji-item .custom-emoji {
width: 24px;
height: 24px;
}
.reaction-full-btn .custom-emoji {
width: 22px;
height: 22px;
}
.custom-emoji-preview {
border-radius: 4px;
}
/* ═══════════════════════════════════════════════════════════
GIF PICKER
═══════════════════════════════════════════════════════════ */
.btn-gif {
width: 34px;
height: 24px;
background: transparent;
color: var(--text-muted);
border: 1px solid var(--text-muted);
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
transition: all var(--transition);
flex-shrink: 0;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.5px;
cursor: pointer;
align-self: center;
}
.btn-gif:hover {
color: var(--accent);
border-color: var(--accent);
background: var(--bg-tertiary);
}
.gif-picker {
position: absolute;
bottom: 100%;
left: 88px;
margin-bottom: 8px;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 12px;
width: 340px;
max-height: 420px;
display: flex;
flex-direction: column;
box-shadow: 0 8px 32px rgba(0,0,0,0.4);
z-index: 1000;
overflow: hidden;
}
.gif-picker-header {
padding: 10px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.gif-picker-header input {
width: 100%;
padding: 8px 12px;
border-radius: var(--radius);
border: 1px solid var(--border);
background: var(--bg-primary);
color: var(--text-primary);
font-size: 13px;
outline: none;
}
.gif-picker-header input:focus {
border-color: var(--accent);
}
.gif-picker-grid {
flex: 1;
overflow-y: auto;
padding: 6px;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
min-height: 200px;
}
.gif-picker-grid img {
width: 100%;
height: auto;
border-radius: var(--radius-sm);
cursor: pointer;
transition: transform 0.1s ease, opacity 0.2s;
display: block;
}
.gif-picker-grid img:hover {
transform: scale(1.03);
opacity: 0.85;
}
.gif-picker-footer {
padding: 4px 10px;
font-size: 10px;
color: var(--text-muted);
text-align: right;
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.gif-picker-empty {
grid-column: 1 / -1;
text-align: center;
padding: 40px 10px;
color: var(--text-muted);
font-size: 13px;
}
/* /gif slash command inline picker */
.gif-slash-picker {
background: var(--bg-secondary); border: 1px solid var(--border);
border-radius: 8px; margin: 0 8px 4px; max-height: 240px;
overflow-y: auto; box-shadow: 0 -4px 12px rgba(0,0,0,0.3);
}
.gif-slash-header {
display: flex; justify-content: space-between; align-items: center;
padding: 6px 10px; font-size: 12px; color: var(--text-muted);
border-bottom: 1px solid var(--border); position: sticky; top: 0;
background: var(--bg-secondary); z-index: 1;
}
.gif-slash-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 4px; padding: 6px;
}
.gif-slash-grid img {
width: 100%; height: 80px; object-fit: cover;
border-radius: 4px; cursor: pointer; transition: transform 0.1s;
}
.gif-slash-grid img:hover { transform: scale(1.05); }
.gif-slash-loading {
padding: 20px; text-align: center; color: var(--text-muted); font-size: 13px;
}
/* GIF setup guide (shown when GIPHY key not configured) */
.gif-setup-guide {
grid-column: 1 / -1;
padding: 16px 20px;
text-align: left;
color: var(--text-primary);
font-size: 13px;
line-height: 1.5;
}
.gif-setup-guide h3 {
margin: 0 0 8px;
font-size: 15px;
}
.gif-setup-guide ol {
margin: 8px 0;
padding-left: 20px;
}
.gif-setup-guide li {
margin-bottom: 4px;
}
.gif-setup-guide a {
color: var(--accent);
}
.gif-setup-input-row {
display: flex;
gap: 8px;
margin: 10px 0;
}
.gif-setup-input-row input {
flex: 1;
padding: 6px 10px;
border: 1px solid var(--border);
border-radius: 4px;
background: var(--bg-primary);
color: var(--text-primary);
font-size: 13px;
font-family: monospace;
}
.gif-setup-input-row button {
padding: 6px 16px;
border: none;
border-radius: 4px;
background: var(--accent);
color: #fff;
font-size: 13px;
cursor: pointer;
}
.gif-setup-input-row button:hover {
opacity: 0.9;
}
.gif-setup-note {
margin: 6px 0 0;
font-size: 12px;
color: var(--text-muted);
}
/* ═══════════════════════════════════════════════════════════
MESSAGE REACTIONS
═══════════════════════════════════════════════════════════ */
.reactions-row {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 4px;
}
.reaction-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: var(--bg-tertiary);
border: 1px solid transparent;
border-radius: 12px;
font-size: 13px;
color: var(--text-secondary);
cursor: pointer;
transition: all var(--transition);
}
.reaction-badge:hover {
background: rgba(124, 92, 252, 0.15);
border-color: var(--accent);
}
.reaction-badge.own {
background: rgba(124, 92, 252, 0.2);
border-color: var(--accent);
color: var(--text-primary);
}
.reaction-picker {
position: absolute;
top: -44px;
right: 8px;
display: flex;
gap: 2px;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 10px;
padding: 4px 6px;
box-shadow: 0 4px 20px rgba(0,0,0,0.35);
z-index: 100;
}
.reaction-pick-btn {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
transition: background 0.15s, transform 0.1s;
}
.reaction-pick-btn:hover {
background: var(--bg-tertiary);
transform: scale(1.15);
}
.reaction-more-btn {
font-size: 16px;
font-weight: 700;
color: var(--text-muted);
letter-spacing: 1px;
}
.reaction-pick-sep {
color: var(--text-muted);
font-size: 16px;
opacity: 0.4;
user-select: none;
display: flex;
align-items: center;
padding: 0 1px;
}
.reaction-gear-btn {
font-size: 14px;
color: var(--text-muted);
opacity: 0.6;
transition: opacity 0.15s;
}
.reaction-gear-btn:hover {
opacity: 1;
}
.quick-emoji-slots {
display: flex;
gap: 4px;
padding: 4px 8px;
border-bottom: 1px solid var(--border);
margin-bottom: 4px;
}
.quick-emoji-slot {
border: 2px solid transparent;
border-radius: var(--radius-sm);
}
.quick-emoji-slot.active {
border-color: var(--accent);
background: var(--accent-glow);
}
/* ── Full Reaction Emoji Picker (opened via "...") ── */
.reaction-full-picker {
position: absolute;
bottom: 100%;
right: 8px;
width: 320px;
max-height: 340px;
display: flex;
flex-direction: column;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 10px;
box-shadow: 0 8px 30px rgba(0,0,0,0.45);
z-index: 101;
margin-bottom: 4px;
overflow: hidden;
}
.reaction-full-search {
padding: 8px 10px 4px;
flex-shrink: 0;
}
.reaction-full-search-input {
width: 100%;
padding: 6px 10px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 13px;
outline: none;
}
.reaction-full-search-input:focus {
border-color: var(--accent);
}
.reaction-full-grid {
flex: 1;
overflow-y: auto;
padding: 4px 10px 8px;
}
.reaction-full-category {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 6px 0 2px;
}
.reaction-full-row {
display: flex;
flex-wrap: wrap;
gap: 2px;
}
.reaction-full-btn {
width: 34px;
height: 34px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
transition: background 0.12s, transform 0.1s;
}
.reaction-full-btn:hover {
background: var(--bg-tertiary);
transform: scale(1.15);
}
/* ═══════════════════════════════════════════════════════════
MESSAGE HOVER TOOLBAR
═══════════════════════════════════════════════════════════ */
.message, .message-compact { position: relative; }
.msg-toolbar {
position: absolute;
top: -6px;
right: 8px;
display: none;
gap: 2px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 8px;
padding: 2px 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
z-index: 10;
}
.message:hover .msg-toolbar,
.message-compact:hover .msg-toolbar { display: flex; }
/* Hide toolbar while in edit mode */
.message.editing .msg-toolbar,
.message-compact.editing .msg-toolbar { display: none !important; }
.msg-toolbar button {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
transition: background var(--transition);
}
.msg-toolbar button:hover { background: var(--bg-tertiary); }
/* ═══════════════════════════════════════════════════════════
REPLY BANNER (on messages + input area)
═══════════════════════════════════════════════════════════ */
.reply-banner {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 8px 4px 56px;
font-size: 12px;
color: var(--text-muted);
cursor: pointer;
overflow: hidden;
}
.reply-banner:hover { text-decoration: underline; }
.reply-line {
width: 2px;
height: 14px;
border-radius: 1px;
flex-shrink: 0;
}
.reply-author { font-weight: 600; flex-shrink: 0; }
.reply-preview {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Reply bar above input */
.reply-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 20px;
background: var(--bg-tertiary);
border-top: 2px solid var(--accent);
font-size: 13px;
color: var(--text-secondary);
}
.reply-bar-text {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.reply-bar-close {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
cursor: pointer;
background: none;
border: none;
color: var(--text-muted);
font-size: 16px;
flex-shrink: 0;
transition: all var(--transition);
}
.reply-bar-close:hover { color: var(--text-primary); background: var(--bg-secondary); }
/* ═══════════════════════════════════════════════════════════
IMAGE QUEUE BAR (paste/drop preview before sending)
═══════════════════════════════════════════════════════════ */
.image-queue-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
background: var(--bg-tertiary);
border-top: 1px solid var(--border);
overflow-x: auto;
flex-wrap: nowrap;
}
.image-queue-thumb {
position: relative;
width: 64px;
height: 64px;
border-radius: 6px;
overflow: hidden;
border: 2px solid var(--border);
flex-shrink: 0;
background: var(--bg-secondary);
transition: border-color 0.15s;
}
.image-queue-thumb:hover {
border-color: var(--accent);
}
.image-queue-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.image-queue-remove {
position: absolute;
top: 2px;
right: 2px;
width: 18px;
height: 18px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border: none;
border-radius: 50%;
font-size: 13px;
line-height: 1;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.15s;
}
.image-queue-thumb:hover .image-queue-remove {
opacity: 1;
}
.image-queue-remove:hover {
background: var(--danger);
}
.image-queue-clear-all {
background: var(--bg-secondary);
border: 1px solid var(--border);
color: var(--text-muted);
border-radius: 4px;
padding: 4px 10px;
font-size: 11px;
cursor: pointer;
white-space: nowrap;
flex-shrink: 0;
transition: all 0.15s;
}
.image-queue-clear-all:hover {
color: var(--danger);
border-color: var(--danger);
}
/* ═══════════════════════════════════════════════════════════
@MENTION STYLES
═══════════════════════════════════════════════════════════ */
.mention {
background: rgba(124, 92, 252, 0.15);
color: var(--accent);
padding: 0 3px;
border-radius: 4px;
font-weight: 600;
cursor: default;
}
.mention.mention-self {
background: rgba(124, 92, 252, 0.3);
}
/* @mention autocomplete dropdown */
.mention-dropdown {
position: absolute;
bottom: 100%;
left: 48px;
margin-bottom: 4px;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 8px;
overflow: hidden;
min-width: 180px;
max-width: 260px;
box-shadow: 0 8px 24px rgba(0,0,0,0.35);
z-index: 1001;
}
.mention-item {
padding: 8px 14px;
font-size: 13px;
color: var(--text-primary);
cursor: pointer;
transition: background var(--transition);
}
.mention-item:hover, .mention-item.active {
background: var(--accent);
color: white;
}
/* /slash command autocomplete dropdown */
.slash-dropdown {
position: absolute;
bottom: 100%;
left: 48px;
margin-bottom: 4px;
background: var(--bg-card);
border: 1px solid var(--border-light);
border-radius: 8px;
overflow-y: auto;
max-height: 320px;
min-width: 280px;
max-width: 400px;
box-shadow: 0 8px 24px rgba(0,0,0,0.35);
z-index: 1002;
}
.slash-item {
display: flex;
align-items: baseline;
gap: 8px;
padding: 8px 14px;
font-size: 13px;
color: var(--text-primary);
cursor: pointer;
transition: background var(--transition);
border-bottom: 1px solid var(--border-light);
}
.slash-item:last-child { border-bottom: none; }
.slash-item:hover, .slash-item.active {
background: var(--accent);
color: white;
}
.slash-cmd {
font-weight: 700;
color: var(--accent);
min-width: 82px;
flex-shrink: 0;
}
.slash-item:hover .slash-cmd,
.slash-item.active .slash-cmd {
color: white;
}
.slash-args {
font-size: 11px;
color: var(--text-muted);
font-style: italic;
flex-shrink: 0;
}
.slash-item:hover .slash-args,
.slash-item.active .slash-args {
color: rgba(255,255,255,0.7);
}
.slash-desc {
font-size: 11px;
color: var(--text-muted);
margin-left: auto;
text-align: right;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.slash-item:hover .slash-desc,
.slash-item.active .slash-desc {
color: rgba(255,255,255,0.7);
}
/* ═══════════════════════════════════════════════════════════
SEARCH
═══════════════════════════════════════════════════════════ */
.search-container {
display: flex;
align-items: center;
gap: 4px;
background: var(--bg-primary);
border: 1px solid var(--border-light);
border-radius: 6px;
padding: 2px 6px;
margin-right: 8px;
}
.search-input {
background: transparent;
border: none;
color: var(--text-primary);
font-size: 13px;
width: 160px;
outline: none;
padding: 4px 2px;
}
.search-input::placeholder {
color: var(--text-muted);
}
.search-results-panel {
position: absolute;
top: 0;
right: 0;
width: 340px;
max-height: 100%;
background: var(--bg-card);
border-left: 1px solid var(--border-light);
z-index: 100;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: -4px 0 12px rgba(0,0,0,0.2);
}
.search-results-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
border-bottom: 1px solid var(--border-light);
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
}
.search-results-list {
overflow-y: auto;
flex: 1;
}
.search-result-item {
padding: 10px 14px;
border-bottom: 1px solid var(--border-light);
cursor: pointer;
transition: background var(--transition);
}
.search-result-item:hover {
background: var(--bg-hover);
}
.search-result-author {
font-weight: 600;
font-size: 12px;
margin-right: 6px;
}
.search-result-time {
font-size: 10px;
color: var(--text-muted);
}
.search-result-content {
font-size: 13px;
color: var(--text-secondary);
margin-top: 4px;
word-break: break-word;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
.search-result-content mark {
background: rgba(250, 166, 26, 0.35);
color: inherit;
padding: 0 2px;
border-radius: 2px;
}
/* Highlight flash on message when clicking search result */
@keyframes highlightFlash {
0%, 100% { background: transparent; }
30% { background: rgba(250, 166, 26, 0.25); }
}
.highlight-flash {
animation: highlightFlash 2s ease;
}
/* ═══════════════════════════════════════════════════════════
EDITED MESSAGE TAG
═══════════════════════════════════════════════════════════ */
.edited-tag {
font-size: 10px;
color: var(--text-muted);
margin-left: 6px;
font-style: italic;
cursor: default;
user-select: none;
}
.e2e-tag {
font-size: 10px;
opacity: 0.4;
cursor: default;
user-select: none;
flex-shrink: 0;
}
/* In the header row (full messages), push the lock to the far right */
.message-header .e2e-tag {
margin-left: auto;
}
/* In compact messages, position lock absolutely on the far right */
.message-compact > .e2e-tag {
position: absolute;
right: 8px;
top: 2px;
}
.message-header-spacer {
flex: 1 1 0;
min-width: 0;
}
/* ── E2E Password Recovery Banner ─── */
#e2e-recovery-banner {
background: var(--bg-tertiary);
border-bottom: 2px solid var(--accent);
padding: 8px 16px;
z-index: 50;
flex-shrink: 0;
}
.e2e-recovery-inner {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
color: var(--text-secondary);
flex-wrap: wrap;
}
#e2e-recovery-pw {
padding: 4px 8px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--bg-primary);
color: var(--text-primary);
font-size: 13px;
width: 180px;
}
#e2e-recovery-dismiss {
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
font-size: 14px;
padding: 2px 6px;
}
#e2e-recovery-dismiss:hover { color: var(--text-primary); }
/* ═══════════════════════════════════════════════════════════
INLINE EDIT TEXTAREA
═══════════════════════════════════════════════════════════ */
.edit-textarea {
width: 100%;
padding: 6px 10px;
background: var(--bg-input);
border: 1px solid var(--accent);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 14px;
font-family: inherit;
resize: none;
max-height: 120px;
line-height: 1.4;
outline: none;
}
.edit-actions {
display: flex;
gap: 6px;
margin-top: 4px;
}
.edit-save-btn, .edit-cancel-btn {
padding: 3px 10px;
border-radius: var(--radius-sm);
font-size: 11px;
font-weight: 600;
cursor: pointer;
border: none;
transition: all var(--transition);
}
.edit-save-btn {
background: var(--accent);
color: white;
}
.edit-save-btn:hover { background: var(--accent-hover); }
.edit-cancel-btn {
background: var(--bg-tertiary);
color: var(--text-secondary);
}
.edit-cancel-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
/* ═══════════════════════════════════════════════════════════
SPOILER TEXT
═══════════════════════════════════════════════════════════ */
.spoiler {
background: var(--text-muted);
color: transparent;
border-radius: 3px;
padding: 0 4px;
cursor: pointer;
transition: all 0.2s ease;
user-select: none;
}
.spoiler.revealed {
background: var(--bg-tertiary);
color: var(--text-primary);
user-select: auto;
}
/* ═══════════════════════════════════════════════════════════
/me ACTION TEXT
═══════════════════════════════════════════════════════════ */
.action-text {
color: var(--text-secondary);
font-style: italic;
}
/* ═══════════════════════════════════════════════════════════
MARKDOWN / INLINE CODE
═══════════════════════════════════════════════════════════ */
.inline-code {
background: var(--bg-tertiary);
color: var(--accent);
padding: 1px 5px;
border-radius: 3px;
font-family: var(--font-mono);
font-size: 0.9em;
}
/* ═══════════════════════════════════════════════════════════
ADMIN PANEL / MODERATION
═══════════════════════════════════════════════════════════ */
.admin-settings {
display: flex;
flex-direction: column;
gap: 10px;
}
/* Admin save bar — sticky at bottom of admin section */
.admin-save-bar {
display: flex;
flex-direction: column;
align-items: center;
padding: 16px 24px 20px;
position: sticky;
bottom: 0;
background: var(--bg-card);
border-top: 1px solid var(--border);
z-index: 10;
margin-top: 10px;
}
.btn-admin-save {
width: 100%;
padding: 10px 20px;
font-size: 14px;
font-weight: 700;
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
letter-spacing: 0.3px;
transition: background 0.15s, transform 0.1s;
background: var(--accent);
color: white;
}
.btn-admin-save:hover { filter: brightness(1.15); }
.btn-admin-save:active { transform: scale(0.97); }
.btn-full {
width: 100%;
text-align: center;
}
.btn-danger-fill {
background: var(--danger) !important;
color: white !important;
}
.btn-danger-fill:hover {
background: #d93636 !important;
}
.notif-divider {
height: 1px;
background: var(--border);
margin: 4px 0;
}
.user-admin-actions {
display: none;
gap: 2px;
margin-left: auto;
flex-shrink: 0;
}
.user-item:hover .user-admin-actions {
display: flex;
}
.user-action-btn {
width: 22px;
height: 22px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
border-radius: var(--radius-sm);
cursor: pointer;
background: none;
border: none;
transition: background var(--transition);
padding: 0;
}
.user-action-btn:hover {
background: var(--bg-tertiary);
}
/* ── User gear dropdown menu ─────────────── */
.user-gear-menu {
position: fixed;
z-index: 10002;
min-width: 160px;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 6px 24px rgba(0,0,0,0.5);
padding: 4px;
display: flex;
flex-direction: column;
animation: gear-menu-in 0.12s ease-out;
}
@keyframes gear-menu-in {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
.gear-menu-item {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 10px;
font-size: 13px;
color: var(--text-secondary);
background: none;
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
white-space: nowrap;
transition: background 0.1s, color 0.1s;
width: 100%;
text-align: left;
}
.gear-menu-item:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.gear-menu-danger { color: var(--danger); }
.gear-menu-danger:hover { background: rgba(233,69,96,0.12); color: var(--danger); }
.gear-menu-divider { height: 1px; background: var(--border); margin: 4px 2px; }
/* ── Transfer Admin Modal ────────────────── */
.transfer-admin-modal {
max-width: 420px;
width: 90vw;
}
.transfer-admin-warning {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 14px;
background: rgba(233,69,96,0.08);
border: 1px solid rgba(233,69,96,0.2);
border-radius: var(--radius);
margin-bottom: 16px;
}
.transfer-admin-warning-icon {
font-size: 24px;
flex-shrink: 0;
line-height: 1;
}
.transfer-admin-warning-text {
font-size: 13px;
color: var(--text-secondary);
line-height: 1.5;
}
.transfer-admin-warning-text strong {
color: var(--text-primary);
}
.transfer-admin-note {
font-size: 12px;
color: var(--danger);
font-weight: 600;
margin-bottom: 16px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.transfer-admin-error {
color: var(--danger);
font-size: 12px;
display: none;
margin-top: 8px;
padding: 6px 10px;
background: rgba(233,69,96,0.08);
border-radius: var(--radius-sm);
}
.user-item.offline { opacity: 0.5; }
.user-dot.away { background: var(--text-muted); border-radius: 2px 2px 50% 50%; }
/* ═══════════════════════════════════════════════════════════
BANS MODAL
═══════════════════════════════════════════════════════════ */
.modal-wide { max-width: 720px; width: 95vw; }
/* ═══════════════════════════════════════════════════════════
SETTINGS POPOUT MODAL
═══════════════════════════════════════════════════════════ */
.settings-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px 12px;
position: sticky;
top: 0;
background: var(--bg-card);
z-index: 10;
border-bottom: 1px solid var(--border);
}
.settings-header h3 {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
font-family: var(--font-heading);
margin: 0;
}
.settings-close-btn {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
background: none;
border: none;
color: var(--text-muted);
border-radius: var(--radius-sm);
cursor: pointer;
transition: all 0.15s ease;
}
.settings-close-btn:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
/* ── Settings Layout (Nav + Body) ─────────────────────── */
.settings-layout {
display: flex;
min-height: 0;
flex: 1;
overflow: hidden;
}
.settings-nav {
width: 150px;
min-width: 150px;
padding: 8px 0 8px 8px;
overflow-y: auto;
border-right: 1px solid var(--border);
flex-shrink: 0;
}
.settings-nav-group {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--text-muted);
padding: 10px 10px 4px;
user-select: none;
}
.settings-nav-item {
padding: 5px 10px;
font-size: 12px;
color: var(--text-secondary);
border-radius: var(--radius-sm);
cursor: pointer;
margin-bottom: 1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
transition: background 0.15s, color 0.15s;
}
.settings-nav-item:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
}
.settings-nav-item.active {
background: var(--accent);
color: #fff;
}
.settings-body {
flex: 1;
overflow-y: auto;
padding: 0;
min-width: 0;
}
.modal-settings {
max-width: 640px;
max-height: 85vh;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 0;
}
/* ── Activities / Games Launcher ──────────────────────── */
.modal-activities {
max-width: 520px;
max-height: 80vh;
overflow-y: auto;
padding: 0;
}
.activities-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px 12px;
position: sticky;
top: 0;
background: var(--bg-card);
z-index: 10;
border-bottom: 1px solid var(--border);
}
.activities-header h3 {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
margin: 0;
}
.activities-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 12px;
padding: 16px 24px 24px;
}
.activity-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 16px 10px;
border-radius: 8px;
background: var(--bg-secondary);
border: 1px solid var(--border);
cursor: pointer;
transition: all 0.15s ease;
text-align: center;
}
.activity-card:hover {
background: var(--bg-hover);
border-color: var(--accent);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.activity-card-icon {
font-size: 36px;
line-height: 1;
}
.activity-card-name {
font-size: 13px;
font-weight: 600;
color: var(--text-primary);
}
.activity-card-desc {
font-size: 11px;
color: var(--text-muted);
line-height: 1.3;
}
.activity-card-disabled {
opacity: 0.45;
cursor: not-allowed;
pointer-events: none;
}
.flash-install-banner {
grid-column: 1 / -1;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 16px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: var(--radius-md);
font-size: 13px;
color: var(--text-secondary);
}
.flash-install-banner .btn-sm { pointer-events: auto; flex-shrink: 0; }
/* ── Iframe Game Overlay ──────────────────────────────── */
.game-iframe-overlay {
position: fixed;
inset: 0;
z-index: 10000;
background: var(--bg-primary);
display: flex;
flex-direction: column;
}
.game-iframe-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 16px;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.game-iframe-title {
font-size: 14px;
font-weight: 700;
color: var(--text-primary);
}
.game-iframe-actions {
display: flex;
gap: 8px;
}
.game-iframe {
flex: 1;
width: 100%;
border: none;
background: var(--bg-primary);
}
/* Win95 overrides for activities */
[data-theme="win95"] .modal-activities { background: #bfbfbf; border: 3px outset #fff; border-radius: 0; }
[data-theme="win95"] .activities-header { background: linear-gradient(90deg, #000080, #1084d0); padding: 4px 8px; border-bottom: none; }
[data-theme="win95"] .activities-header h3 { color: #fff; font-size: 12px; font-weight: 700; margin: 0; background: none; font-family: "MS Sans Serif","Microsoft Sans Serif",Tahoma,Arial,sans-serif; }
[data-theme="win95"] .activity-card { background: #bfbfbf; border: 3px outset #fff; border-radius: 0; }
[data-theme="win95"] .activity-card:hover { border: 3px inset #808080; transform: none; box-shadow: none; }
[data-theme="win95"] .game-iframe-header { background: linear-gradient(90deg, #000080, #1084d0); border-bottom: 2px solid #808080; }
[data-theme="win95"] .game-iframe-title { color: #fff; font-family: "MS Sans Serif","Microsoft Sans Serif",Tahoma,Arial,sans-serif; font-size: 12px; }
.settings-section {
padding: 16px 24px;
border-bottom: 1px solid var(--border);
}
.settings-section:last-child { border-bottom: none; }
.settings-section-title {
font-size: 14px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-secondary);
margin-bottom: 14px;
padding-bottom: 8px;
border-bottom: 2px solid var(--border);
}
.settings-section-subtitle {
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
margin-bottom: 10px;
margin-top: 16px;
padding-bottom: 6px;
border-bottom: 1px solid var(--border);
}
.settings-number-input {
width: 70px;
padding: 4px 6px;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 4px;
color: var(--text-primary);
font-size: 12px;
}
.settings-hint {
color: var(--text-muted);
font-size: 10px;
display: block;
margin-top: -2px;
}
.settings-hint.error { color: #e94560; }
.settings-hint.success { color: #43b581; }
.password-change-form {
display: flex;
flex-direction: column;
gap: 8px;
}
.password-change-form .form-group.compact {
margin: 0;
}
.password-change-form input {
width: 100%;
padding: 7px 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--bg-primary);
color: var(--text-primary);
font-size: 13px;
outline: none;
}
.password-change-form input:focus {
border-color: var(--accent);
}
.sidebar-settings-panel {
flex-shrink: 0;
border-top: 1px solid var(--border);
border-bottom: none;
padding: 10px 16px;
}
.btn-settings-popout {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 8px 12px;
background: var(--bg-tertiary);
color: var(--text-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
cursor: pointer;
font-size: 13px;
font-weight: 500;
transition: all 0.15s ease;
}
.btn-settings-popout:hover {
background: var(--bg-hover);
color: var(--text-primary);
border-color: var(--accent);
}
.btn-settings-popout svg {
flex-shrink: 0;
opacity: 0.7;
}
.btn-settings-popout:hover svg { opacity: 1; }
.bans-list {
max-height: 300px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 12px;
}
.ban-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 8px 10px;
background: var(--bg-tertiary);
border-radius: var(--radius-sm);
}
.ban-info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
flex: 1;
}
.ban-info strong {
font-size: 13px;
color: var(--text-primary);
}
.ban-reason {
font-size: 11px;
color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.ban-date {
font-size: 10px;
color: var(--text-muted);
}
.btn-unban {
flex-shrink: 0;
background: var(--success) !important;
color: white !important;
}
.btn-unban:hover { opacity: 0.85; }
.ban-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
align-items: center;
}
.btn-delete-user {
flex-shrink: 0;
background: var(--danger) !important;
color: white !important;
font-size: 12px;
padding: 4px 8px !important;
}
.btn-delete-user:hover { opacity: 0.85; }
.chat-image[src$=".gif"],
.chat-image[src*=".gif?"] {
border: 1px solid var(--border);
}
/* ═══════════════════════════════════════════════════════════
MOBILE MENU BUTTONS
═══════════════════════════════════════════════════════════ */
.mobile-menu-btn,
.mobile-users-btn {
display: none; /* hidden on desktop */
width: 40px;
height: 40px;
background: transparent;
color: var(--text-secondary);
border-radius: var(--radius-sm);
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all var(--transition);
-webkit-tap-highlight-color: transparent;
}
.mobile-menu-btn:hover,
.mobile-users-btn:hover {
color: var(--text-primary);
background: var(--bg-hover);
}
/* Mobile overlay (dim background when sidebar open) */
.mobile-overlay {
display: none;
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 90;
-webkit-tap-highlight-color: transparent;
}
.mobile-overlay.active { display: block; }
/* ── Mobile panel close button (hidden on desktop) ─────── */
.mobile-panel-close {
display: none;
position: absolute;
top: 10px;
right: 10px;
z-index: 110;
width: 32px;
height: 32px;
border: none;
border-radius: 50%;
background: rgba(255,255,255,0.1);
color: var(--text-primary, #eee);
font-size: 20px;
line-height: 1;
cursor: pointer;
align-items: center;
justify-content: center;
transition: background 0.15s;
-webkit-tap-highlight-color: transparent;
}
.mobile-panel-close:hover { background: rgba(255,255,255,0.2); }
.mobile-panel-close-right { left: 10px; right: auto; }
/* Mobile-only voice join button (inside right sidebar) */
.mobile-voice-join {
display: none; /* hidden on desktop, shown via mobile media query */
width: 100%;
margin-bottom: 8px;
justify-content: center;
}
/* ═══════════════════════════════════════════════════════════
RESPONSIVE — Tablet (≤ 900px)
═══════════════════════════════════════════════════════════ */
.mobile-settings-btn { display: none; }
@media (max-width: 900px) {
.right-sidebar { display: none; }
.mobile-users-btn { display: flex; }
.mobile-settings-btn { display: flex; }
.sidebar-settings-panel { display: none !important; }
}
/* ═══════════════════════════════════════════════════════════
RESPONSIVE — Small Tablet (≤ 768px)
═══════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
/* Show hamburger and users button */
.mobile-menu-btn,
.mobile-users-btn { display: flex !important; }
/* Show mobile close buttons */
.mobile-panel-close { display: flex; }
/* Collapse server bar */
.server-bar { width: 0; min-width: 0; overflow: hidden; border: none; padding: 0; }
/* Main area takes full width on mobile */
.main { width: 100%; min-width: 0; }
/* Welcome screen centered properly */
.welcome-screen { width: 100%; justify-content: center; align-items: center; }
.welcome-content { max-width: 90vw; padding: 0 16px; }
/* Left sidebar — slide out as overlay (! overrides theme [data-theme] .sidebar { position: relative }) */
.sidebar {
position: fixed !important;
left: 0;
top: 0;
bottom: 0;
width: 280px;
min-width: 280px;
z-index: 100;
transform: translateX(-100%);
transition: transform 0.25s ease;
box-shadow: 4px 0 24px rgba(0, 0, 0, 0.4);
}
#app-body.mobile-sidebar-open .sidebar {
transform: translateX(0);
}
/* Bring server bar back inside the sidebar overlay */
#app-body.mobile-sidebar-open .server-bar {
position: fixed;
left: 280px;
top: 0;
bottom: 0;
width: 52px;
min-width: 52px;
z-index: 100;
overflow-y: auto;
transform: translateX(-332px);
transition: transform 0.25s ease;
border-right: 1px solid var(--border);
padding: 8px 0;
}
#app-body.mobile-sidebar-open .server-bar {
transform: translateX(0);
}
/* Right sidebar — slide in from right as overlay */
.right-sidebar {
display: flex !important;
position: fixed;
right: 0;
top: 0;
bottom: 0;
width: 260px;
min-width: 260px;
z-index: 100;
transform: translateX(100%);
transition: transform 0.25s ease;
box-shadow: -4px 0 24px rgba(0, 0, 0, 0.4);
}
#app-body.mobile-right-open .right-sidebar {
transform: translateX(0);
}
/* Channel header adjustments */
.channel-header {
padding: 8px 12px;
min-height: 48px;
gap: 8px;
}
.channel-info h3 { font-size: 14px; }
.channel-code-tag { display: none; }
/* Voice buttons — smaller on tablet */
.btn-voice { padding: 5px 10px; font-size: 12px; }
.voice-label-text { display: none; }
/* Hide header clutter — search/pin/delete tucked into long-press or sidebar */
#delete-channel-btn,
#search-toggle-btn,
#pinned-toggle-btn,
#copy-code-btn { display: none !important; }
/* Voice join moves to right sidebar on mobile */
#voice-join-btn { display: none !important; }
.mobile-voice-join { display: flex !important; }
/* Message toolbar — hidden until tapped */
.msg-toolbar {
position: static;
display: none;
margin-top: 4px;
box-shadow: none;
border: none;
background: none;
padding: 0;
gap: 4px;
}
.msg-selected .msg-toolbar { display: flex; }
.msg-selected { background: rgba(255,255,255,0.04); border-radius: var(--radius); }
.msg-toolbar button {
width: 34px; height: 34px; font-size: 16px;
background: var(--bg-tertiary); border-radius: var(--radius);
}
/* Messages area */
.messages { padding: 12px; }
.message-input-area { padding: 8px 12px 12px; gap: 6px; }
/* GIF picker — constrained on tablet */
.gif-picker { max-width: 360px; }
/* Screen share — constrained */
.screen-share-container { max-height: 40vh; }
/* Status bar — hidden on mobile to save vertical space */
.status-bar { display: none; }
}
/* ═══════════════════════════════════════════════════════════
RESPONSIVE — Phone (≤ 480px)
═══════════════════════════════════════════════════════════ */
@media (max-width: 480px) {
/* Safe area insets for notched phones */
#app {
padding-top: env(safe-area-inset-top, 0px);
padding-bottom: env(safe-area-inset-bottom, 0px);
padding-left: env(safe-area-inset-left, 0px);
padding-right: env(safe-area-inset-right, 0px);
}
/* Sidebar full width on phones */
.sidebar { width: 85vw; min-width: 85vw; }
/* Hide server bar on phones — sidebar already covers enough, server bar eats space */
#app-body.mobile-sidebar-open .server-bar {
display: none;
}
.right-sidebar { width: 85vw; min-width: 85vw; }
/* Channel header — tight */
.channel-header {
padding: 6px 8px;
min-height: 44px;
gap: 4px;
}
.channel-info h3 { font-size: 13px; max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Update banner — compact on phone */
.update-banner { padding: 3px 8px; font-size: 11px; }
.update-pulse { width: 6px; height: 6px; }
/* Voice buttons — compact on phone */
.voice-controls { gap: 4px; flex-wrap: nowrap; flex-shrink: 1; overflow: visible; }
.btn-voice {
padding: 4px 8px;
font-size: 12px;
min-width: 0;
}
.voice-label-text { display: none; }
/* Voice panel — circular buttons, mobile friendly */
.voice-panel {
gap: 6px;
padding: 6px 8px;
}
.voice-panel-btn {
width: 36px;
height: 36px;
font-size: 16px;
}
@keyframes slideUpSheet {
from { transform: translateY(100%); }
to { transform: translateY(0); }
}
/* Messages */
.messages { padding: 8px; }
.message-row { gap: 8px; padding: 4px; }
.message-avatar { width: 30px; height: 30px; font-size: 12px; }
.message-avatar-img { width: 30px; height: 30px; }
.user-item-avatar, .user-item-avatar-img { width: 20px; height: 20px; font-size: 9px; }
.user-avatar-wrapper { width: 20px; height: 20px; }
.user-status-dot { width: 8px; height: 8px; bottom: -2px; right: -2px; }
.message-author { font-size: 13px; }
.message-content { font-size: 14px; line-height: 1.45; word-break: break-word; }
.message-time { font-size: 10px; }
.message-compact { padding-left: 46px; }
/* Chat images — full width on mobile */
.chat-image { max-width: 100%; max-height: 250px; }
/* Input area — touch-friendly, two-row layout */
.message-input-area {
padding: 6px 8px calc(6px + env(safe-area-inset-bottom, 0px));
gap: 4px;
flex-wrap: wrap;
}
/* Media buttons row — sits above the textarea row */
.input-actions-box {
order: -1;
border-radius: 16px;
padding: 2px 4px;
gap: 1px;
}
.input-actions-box .btn-upload,
.input-actions-box .btn-emoji,
.input-actions-box .btn-gif {
width: 30px;
height: 30px;
min-width: 30px;
min-height: 30px;
font-size: 14px;
border-radius: 50%;
flex-shrink: 0;
}
.input-actions-box .btn-gif {
width: auto;
padding: 0 6px;
border-radius: var(--radius-sm);
height: 22px;
min-height: 22px;
}
/* Textarea takes full remaining width on its row */
.message-input-area textarea {
padding: 8px 12px;
font-size: 16px; /* prevents iOS zoom on focus */
border-radius: 20px;
min-height: 36px;
flex: 1 0 calc(100% - 48px); /* large basis forces buttons to wrap to their own row */
min-width: 0;
order: 1;
}
.message-input-area .btn-send {
width: 36px;
height: 36px;
min-width: 36px;
min-height: 36px;
border-radius: 50%;
flex-shrink: 0;
order: 2;
}
/* GIF picker — full width on phone */
.gif-picker {
left: 4px;
right: 4px;
bottom: 56px;
max-width: none;
width: auto;
max-height: 50vh;
}
.gif-picker-grid { max-height: 40vh; }
/* Emoji picker — full width on phone */
.emoji-picker {
left: 4px;
right: 4px;
max-width: none;
width: auto;
}
.emoji-grid { max-height: 200px; }
.emoji-item { width: 40px; height: 40px; font-size: 22px; }
/* Mention dropdown — wider */
.mention-dropdown {
left: 8px;
right: 8px;
max-width: none;
min-width: 0;
}
.mention-item { padding: 12px 14px; font-size: 14px; }
/* Reply bar */
.reply-bar { padding: 6px 8px; font-size: 12px; }
.reply-banner { padding-left: 46px; }
/* Reaction badges — touch-friendly */
.reaction-badge { padding: 4px 10px; font-size: 14px; }
.reaction-picker { gap: 4px; padding: 6px 8px; }
.reaction-pick-btn { width: 38px; height: 38px; font-size: 20px; }
.reaction-full-picker { width: calc(100vw - 32px); max-width: 320px; right: 0; }
/* Message toolbar — hidden until message is tapped */
.msg-toolbar {
position: static;
display: none;
margin-top: 4px;
box-shadow: none;
border: none;
background: none;
padding: 0;
gap: 4px;
}
.msg-selected .msg-toolbar {
display: flex;
}
.msg-selected {
background: rgba(255,255,255,0.04);
border-radius: var(--radius);
}
.msg-toolbar button {
width: 34px;
height: 34px;
font-size: 16px;
background: var(--bg-tertiary);
border-radius: var(--radius);
}
/* Screen share — smaller on phone */
.screen-share-container { max-height: 35vh; min-height: 120px; }
/* Status bar — hidden on phones */
.status-bar { display: none; }
/* Welcome screen */
.welcome-icon { font-size: 48px; }
.welcome-content h2 { font-size: 18px; }
.welcome-content p { font-size: 13px; }
/* Modal — wider on phone */
.modal { padding: 20px; width: 95%; max-height: 85vh; overflow-y: auto; }
.modal h3 { font-size: 18px; }
/* Settings modal — scrollable on phone, hide nav */
.modal-settings { max-height: 80vh; }
.settings-nav { display: none; }
.settings-body { overflow-y: auto; }
/* Toasts — full width */
#toast-container { left: 50%; right: auto; top: calc(8px + env(safe-area-inset-top, 0px)); transform: translateX(-50%); }
.toast { max-width: none; }
/* Typing indicator */
.typing-indicator { padding: 0 8px; font-size: 11px; }
/* Search container */
.search-container { flex: 1; }
.search-input { font-size: 14px; }
/* Stream audio controls — always visible on touch */
.stream-audio-controls { opacity: 1; }
.stream-vol-slider { width: 50px; }
.music-panel-header { padding: 4px 8px; font-size: 11px; }
.music-embed-container { max-height: 180px; }
}
/* ═══════════════════════════════════════════════════════════
RESPONSIVE — Tiny Phone (≤ 360px)
═══════════════════════════════════════════════════════════ */
@media (max-width: 360px) {
.channel-info h3 { font-size: 12px; max-width: 90px; }
.btn-voice { font-size: 11px; padding: 5px 6px; }
.message-avatar { width: 26px; height: 26px; font-size: 11px; }
.message-avatar-img { width: 26px; height: 26px; }
.user-item-avatar, .user-item-avatar-img { width: 18px; height: 18px; font-size: 8px; }
.user-avatar-wrapper { width: 18px; height: 18px; }
.user-status-dot { width: 7px; height: 7px; bottom: -2px; right: -2px; }
.message-compact { padding-left: 40px; }
.message-row { gap: 6px; }
.message-content { font-size: 13px; }
/* Voice controls stack to two rows if needed */
.voice-controls { gap: 3px; }
/* Hide non-critical status items */
.status-bar .status-item:nth-child(n+3) { display: none; }
/* Sidebar slightly narrower */
.sidebar { width: 80vw; min-width: 80vw; }
.right-sidebar { width: 80vw; min-width: 80vw; }
}
/* ═══════════════════════════════════════════════════════════
TOUCH & ACCESSIBILITY
═══════════════════════════════════════════════════════════ */
@media (hover: none) and (pointer: coarse) {
/* Prevent pull-to-refresh on chat app */
html, body { overscroll-behavior-y: contain; }
/* Touch devices — larger tap targets */
.channel-item { padding: 12px 16px; min-height: 44px; }
.btn-sm { min-height: 44px; padding: 10px 14px; }
.icon-btn { min-width: 40px; min-height: 40px; font-size: 18px; }
.theme-btn { width: 36px; height: 36px; }
.toggle-row input[type="checkbox"] { width: 20px; height: 20px; }
.server-icon { width: 44px; height: 44px; }
.btn-voice { min-height: 36px; }
/* Disable hover-only interactions */
.message:hover, .message-compact:hover { background: transparent; }
.message-compact:hover .compact-time { display: none !important; }
/* Message toolbar — hidden until message is tapped */
.msg-toolbar {
display: none;
position: static;
box-shadow: none;
border: none;
background: none;
padding: 0;
margin-top: 4px;
}
.msg-selected .msg-toolbar {
display: flex;
}
.msg-selected {
background: rgba(255,255,255,0.04);
border-radius: var(--radius);
}
.msg-toolbar button {
background: var(--bg-tertiary);
border-radius: var(--radius);
min-width: 34px;
min-height: 34px;
}
/* Smoother scrolling on touch */
.messages, .sidebar, .right-sidebar, .modal {
-webkit-overflow-scrolling: touch;
}
}
/* ═══════════════════════════════════════════════════════════
LANDSCAPE PHONE
═══════════════════════════════════════════════════════════ */
@media (max-height: 500px) and (orientation: landscape) {
.status-bar { display: none; }
.channel-header { min-height: 40px; padding: 4px 8px; }
.messages { padding: 4px 8px; }
.message-input-area { padding: 4px 8px 6px; }
.welcome-icon { font-size: 36px; }
.welcome-content h2 { font-size: 16px; }
}
/* ═══════════════════════════════════════════════════════════
USER LIST: Group Labels & Score Badges
═══════════════════════════════════════════════════════════ */
.user-group-label {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.6px;
color: var(--text-muted);
padding: 8px 6px 4px;
user-select: none;
}
.user-group-label.offline-label {
margin-top: 8px;
border-top: 1px solid var(--border);
padding-top: 10px;
}
.user-score-badge {
font-size: 10px;
color: var(--accent);
background: var(--bg-tertiary);
padding: 1px 6px;
border-radius: 8px;
margin-left: auto;
flex-shrink: 0;
font-weight: 600;
opacity: 0.8;
}
/* ═══════════════════════════════════════════════════════════
EULA
═══════════════════════════════════════════════════════════ */
.eula-notice {
margin-top: 16px;
padding: 12px 14px;
background: var(--bg-primary);
border-radius: var(--radius-sm);
border: 1px solid var(--border);
}
.eula-check-row {
display: flex;
align-items: flex-start;
gap: 10px;
font-size: 13px;
color: var(--text-secondary);
cursor: pointer;
}
.eula-check-row + .eula-check-row { margin-top: 10px; }
.eula-check-row input[type="checkbox"] {
margin-top: 2px;
accent-color: var(--accent);
width: 16px;
height: 16px;
flex-shrink: 0;
}
.eula-check-row a {
color: var(--accent);
text-decoration: underline;
}
.eula-check-row a:hover {
color: var(--accent-hover);
}
.eula-modal {
max-width: 700px;
max-height: 80vh;
display: flex;
flex-direction: column;
}
.eula-content {
overflow-y: auto;
max-height: 55vh;
padding: 16px;
background: var(--bg-primary);
border-radius: var(--radius-sm);
border: 1px solid var(--border);
margin: 12px 0;
font-size: 13px;
line-height: 1.7;
color: var(--text-secondary);
}
.eula-content p { margin: 8px 0; }
.eula-content ol { padding-left: 20px; }
.eula-content ol li { margin: 10px 0; }
.eula-content ul { padding-left: 20px; margin: 6px 0; }
.eula-content ul li { margin: 4px 0; list-style: disc; }
.eula-content h4 {
margin: 18px 0 6px;
font-size: 14px;
font-weight: 700;
color: var(--text-primary);
letter-spacing: 0.3px;
}
.eula-content strong { color: var(--text-primary); }
.eula-content em { color: var(--text-muted); }
.eula-footer {
margin-top: 12px;
padding-top: 10px;
border-top: 1px solid var(--border);
text-align: center;
color: var(--danger);
}
/* ═══════════════════════════════════════════════════════════
GAME BUTTON
═══════════════════════════════════════════════════════════ */
.btn-game {
margin-top: 20px;
padding: 10px 24px;
background: var(--bg-hover);
color: var(--text-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all var(--transition);
}
.btn-game:hover {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
/* ═══════════════════════════════════════════════════════════
TTS MESSAGE INDICATOR
═══════════════════════════════════════════════════════════ */
.tts-tag {
font-size: 10px;
color: var(--accent);
margin-left: 6px;
opacity: 0.7;
}
/* ═══════════════════════════════════════════════════════════
SCREEN SHARE
═══════════════════════════════════════════════════════════ */
.screen-share-container {
display: none;
flex-direction: column;
background: #000;
border-bottom: 2px solid var(--accent);
max-height: 50vh;
min-height: 180px;
position: relative;
}
.screen-share-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 3px 10px;
font-size: 11px;
border-radius: 12px;
background: var(--accent);
color: #fff;
border: none;
cursor: pointer;
margin-left: 8px;
animation: pulse-glow 2s ease-in-out infinite;
white-space: nowrap;
}
.screen-share-indicator:hover { filter: brightness(1.2); }
@keyframes pulse-glow {
0%, 100% { opacity: 1; }
50% { opacity: 0.7; }
}
.screen-share-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 12px;
background: var(--bg-tertiary);
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
}
.screen-share-header .icon-btn {
color: var(--text-muted);
}
.screen-share-header-controls {
display: flex;
align-items: center;
gap: 8px;
}
.stream-size-slider {
width: 100px;
height: 18px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 2px;
cursor: pointer;
vertical-align: middle;
outline: none;
}
.stream-size-slider::-webkit-slider-runnable-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.2);
}
.stream-size-slider::-moz-range-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.2);
}
.stream-size-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
margin-top: -4px;
box-shadow: 0 0 6px var(--accent-glow, rgba(124,92,252,0.4));
}
.stream-size-slider::-moz-range-thumb {
width: 14px;
height: 14px;
border-radius: 50%;
background: var(--accent);
cursor: pointer;
border: none;
}
.stream-size-label {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--text-muted);
user-select: none;
white-space: nowrap;
}
.screen-share-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2px;
max-height: calc(50vh - 32px);
overflow-y: auto;
background: #000;
}
.screen-share-tile {
position: relative;
background: #111;
}
.screen-share-tile video {
width: 100%;
display: block;
object-fit: contain;
max-height: 45vh;
background: #000;
}
.screen-share-tile-label {
position: absolute;
bottom: 4px;
left: 6px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
font-size: 11px;
padding: 2px 8px;
border-radius: 4px;
pointer-events: none;
}
/* ── Stream Audio Controls (per-tile overlay) ──────────── */
.stream-audio-controls {
position: absolute;
bottom: 4px;
right: 6px;
display: flex;
align-items: center;
gap: 4px;
background: rgba(0, 0, 0, 0.75);
padding: 3px 8px;
border-radius: 6px;
opacity: 0;
transition: opacity 0.2s;
z-index: 2;
}
.screen-share-tile:hover .stream-audio-controls { opacity: 1; }
.stream-mute-btn {
background: none;
border: none;
color: #fff;
cursor: pointer;
font-size: 14px;
padding: 2px 4px;
border-radius: 4px;
line-height: 1;
}
.stream-mute-btn:hover { background: rgba(255,255,255,0.15); }
.stream-mute-btn.muted { color: var(--danger, #e74c3c); }
.stream-vol-slider {
--track-bg: rgba(255,255,255,0.2);
width: 60px;
height: 14px;
-webkit-appearance: none;
appearance: none;
background: transparent;
border-radius: 2px;
cursor: pointer;
outline: none;
vertical-align: middle;
}
.stream-vol-slider::-webkit-slider-runnable-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.15);
}
.stream-vol-slider::-moz-range-track {
background: rgba(255,255,255,0.3);
height: 6px;
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.15);
}
.stream-vol-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px; height: 14px;
border-radius: 50%;
background: var(--accent, #7c5cfc);
cursor: pointer;
margin-top: -5px;
box-shadow: 0 0 4px rgba(124,92,252,0.4);
}
.stream-vol-slider::-moz-range-thumb {
width: 14px; height: 14px;
border-radius: 50%;
background: var(--accent, #7c5cfc);
cursor: pointer;
border: none;
}
.stream-vol-pct {
color: rgba(255,255,255,0.7);
font-size: 10px;
min-width: 28px;
text-align: center;
user-select: none;
}
.stream-audio-badge {
position: absolute;
top: 4px;
right: 6px;
background: rgba(0,0,0,0.65);
color: var(--accent, #7c5cfc);
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
pointer-events: none;
display: flex;
align-items: center;
gap: 3px;
}
.stream-no-audio-badge {
position: absolute;
top: 4px;
right: 6px;
background: rgba(0,0,0,0.75);
color: var(--text-muted, #888);
font-size: 10px;
padding: 2px 8px;
border-radius: 4px;
pointer-events: none;
display: flex;
align-items: center;
gap: 3px;
opacity: 0.85;
}
/* ── Stream Viewer Badge (eye icon + count on tiles) ── */
.stream-viewer-badge {
position: absolute;
bottom: 30px;
right: 6px;
background: rgba(0,0,0,0.7);
color: #fff;
font-size: 11px;
padding: 2px 8px;
border-radius: 10px;
pointer-events: none;
display: flex;
align-items: center;
gap: 4px;
z-index: 5;
backdrop-filter: blur(4px);
}
.stream-viewer-badge .viewer-eye {
font-size: 12px;
}
/* ── Voice User Stream Badges ─────────────────────── */
.voice-stream-badge {
font-size: 10px;
padding: 1px 5px;
border-radius: 3px;
margin-left: 4px;
white-space: nowrap;
line-height: 1.2;
vertical-align: middle;
}
.voice-stream-badge.live {
background: rgba(255,0,0,0.18);
color: #ff4444;
font-weight: 600;
animation: live-pulse 2s ease-in-out infinite;
}
.voice-stream-badge.watching {
background: rgba(255,255,255,0.08);
color: var(--text-muted, #888);
font-size: 11px;
}
@keyframes live-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.6; }
}
/* ── Stream Focus Mode (double-click to expand) ──────── */
.stream-focus-mode {
max-height: none !important;
flex: 999 1 0;
min-height: 0;
overflow: hidden;
}
.stream-focus-mode .screen-share-grid {
max-height: none !important;
flex: 1 1 0;
min-height: 0;
overflow: hidden;
height: 100%;
}
.stream-focus-mode .screen-share-tile:not(.stream-focused) {
display: none;
}
.stream-focus-mode .screen-share-tile.stream-focused {
width: 100%;
height: 100%;
overflow: hidden;
}
.stream-focus-mode .screen-share-tile.stream-focused video {
max-height: 100%;
width: 100%;
height: 100%;
object-fit: contain;
}
/* ── Stream Pop-out Button ──────────────────────────── */
.stream-popout-btn {
position: absolute;
top: 4px;
left: 6px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border: none;
cursor: pointer;
font-size: 16px;
padding: 2px 6px;
border-radius: 4px;
opacity: 0;
transition: opacity 0.2s;
z-index: 3;
line-height: 1;
}
.screen-share-tile:hover .stream-popout-btn { opacity: 1; }
.stream-popout-btn:hover { background: rgba(255,255,255,0.2); }
/* ── Stream Minimize Button (top-right, keeps audio) ───── */
.stream-minimize-btn {
position: absolute;
top: 4px;
right: 30px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border: none;
cursor: pointer;
font-size: 14px;
padding: 2px 6px;
border-radius: 4px;
opacity: 0;
transition: opacity 0.2s;
z-index: 3;
line-height: 1;
}
.screen-share-tile:hover .stream-minimize-btn { opacity: 1; }
.stream-minimize-btn:hover { background: rgba(255,255,255,0.2); }
/* ── Stream Close Button (top-right corner, mutes audio) ─ */
.stream-close-btn {
position: absolute;
top: 4px;
right: 6px;
background: rgba(0, 0, 0, 0.7);
color: #fff;
border: none;
cursor: pointer;
font-size: 14px;
padding: 2px 6px;
border-radius: 4px;
opacity: 0;
transition: opacity 0.2s;
z-index: 3;
line-height: 1;
}
.screen-share-tile:hover .stream-close-btn { opacity: 1; }
.stream-close-btn:hover { background: rgba(220,53,69,0.7); }
/* ── Hidden Streams Bar (inside voice-controls) ──────── */
.hidden-streams-bar {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--text-muted);
flex-wrap: nowrap;
white-space: nowrap;
}
.hidden-stream-restore-btn {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 12px;
font-size: 11px;
font-weight: 500;
border-radius: var(--radius);
background: var(--danger);
color: #fff;
border: none;
cursor: pointer;
white-space: nowrap;
transition: filter 0.15s;
height: 30px;
box-sizing: border-box;
line-height: 1.3;
}
.hidden-stream-restore-btn:hover {
filter: brightness(1.2);
}
/* Collapse tile when popped out — free up Haven space */
.screen-share-tile.stream-popped-out {
height: 28px !important;
min-height: 0 !important;
overflow: hidden;
flex: none !important;
}
.screen-share-tile.stream-popped-out video { display: none; }
.screen-share-tile.stream-popped-out .stream-controls { display: none; }
.screen-share-tile.stream-popped-out::after {
content: '⧉ Popped out — click to restore';
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 28px;
color: var(--text-muted);
font-size: 11px;
font-weight: 500;
background: var(--bg-tertiary);
}
/* When ALL tiles are popped out, collapse the entire container */
.screen-share-container.all-streams-popped {
min-height: 0 !important;
max-height: none !important;
height: auto !important;
}
.screen-share-container.all-streams-popped .screen-share-grid {
max-height: none !important;
}
/* ═══════════════════════════════════════════════════════════
MUSIC PANEL
═══════════════════════════════════════════════════════════ */
.music-panel {
display: none;
flex-direction: column;
background: var(--bg-tertiary);
border-bottom: 2px solid var(--accent);
}
.music-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 12px;
background: var(--bg-tertiary);
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
}
.music-panel-header-left {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.music-panel-header-left #music-popout-btn {
flex-shrink: 0;
}
.music-panel-controls {
display: flex;
align-items: center;
gap: 6px;
}
.music-panel-controls .stream-vol-slider { width: 80px; }
/* Seek slider + time labels */
.music-seek-slider {
flex: 1; min-width: 60px; max-width: 200px;
accent-color: var(--accent, #5865f2);
}
.music-time {
font-size: 10px; color: var(--text-muted, #888);
font-variant-numeric: tabular-nums; min-width: 32px; text-align: center;
user-select: none;
}
.music-embed-container {
min-height: 80px;
max-height: 260px;
overflow: hidden;
background: #000;
}
.music-embed-container iframe {
width: 100%;
border: none;
display: block;
}
/* Overlay blocks direct clicks on the iframe — sync goes through Haven controls only */
.music-embed-wrapper {
position: relative;
width: 100%;
}
.music-embed-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
cursor: default;
/* Transparent but captures all clicks / pointer events */
}
/* ── Music Active Indicator (minimized panel) ──────────── */
.music-indicator {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 12px;
font-size: 11px;
font-weight: 500;
border-radius: var(--radius);
background: var(--accent);
color: #fff;
border: none;
cursor: pointer;
animation: pulse-glow 2s ease-in-out infinite;
white-space: nowrap;
height: 30px;
box-sizing: border-box;
line-height: 1.3;
}
.music-indicator:hover { filter: brightness(1.2); }
/* ── Music PiP Overlay ─────────────────────────────────── */
.music-pip-overlay {
position: fixed;
bottom: 24px;
right: 24px;
width: 340px;
z-index: 10000;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0,0,0,0.45);
overflow: hidden;
display: flex;
flex-direction: column;
resize: both;
min-width: 260px;
min-height: 140px;
}
.music-pip-header {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
background: var(--bg-tertiary);
border-bottom: 2px solid var(--accent);
cursor: grab;
user-select: none;
}
.music-pip-header:active { cursor: grabbing; }
.music-pip-label {
flex: 1;
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.music-pip-btn {
background: rgba(255,255,255,0.08);
border: none;
color: var(--text-primary);
cursor: pointer;
font-size: 14px;
padding: 4px 8px;
border-radius: 4px;
line-height: 1;
}
.music-pip-btn:hover { background: rgba(255,255,255,0.18); }
.music-pip-embed {
flex: 1;
overflow: hidden;
background: #000;
min-height: 80px;
}
.music-pip-embed .music-embed-wrapper {
width: 100%;
height: 100%;
}
.music-pip-embed iframe {
width: 100%;
height: 100%;
border: none;
display: block;
}
.music-pip-controls {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
background: var(--bg-tertiary);
}
.music-pip-vol-icon {
font-size: 14px;
cursor: pointer;
user-select: none;
}
.music-pip-vol {
-webkit-appearance: none;
appearance: none;
height: 6px;
background: rgba(255,255,255,0.25);
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.12);
outline: none;
flex: 1;
max-width: 120px;
}
.music-pip-vol::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px;
height: 14px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
margin-top: -4px;
}
.music-pip-vol::-moz-range-thumb {
width: 14px;
height: 14px;
background: var(--accent);
border-radius: 50%;
cursor: pointer;
border: none;
}
/* ── PiP Opacity Slider ───────────────────────────────── */
.pip-opacity-divider {
width: 1px;
height: 16px;
background: var(--border);
margin: 0 2px;
flex-shrink: 0;
}
.pip-opacity-slider {
max-width: 70px;
}
/* ── Stream PiP Overlay ─────────────────────────────────── */
.stream-pip-overlay {
width: 480px;
min-height: 320px;
}
.stream-pip-overlay .stream-pip-video {
flex: 1;
overflow: hidden;
background: #000;
min-height: 240px;
}
.stream-pip-overlay video {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
@media (max-width: 768px) {
.music-pip-overlay {
width: 280px;
bottom: 12px;
right: 12px;
}
.stream-pip-overlay {
width: 280px;
bottom: 12px;
right: 12px;
}
}
/* ── Music Modal extras ────────────────────────────────── */
.music-link-preview {
min-height: 0;
transition: all 0.2s;
}
.music-link-preview.active {
background: var(--bg-primary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 8px 12px;
margin: 8px 0;
font-size: 13px;
color: var(--text-secondary);
display: flex;
align-items: center;
gap: 8px;
}
.music-platforms-hint {
display: flex;
gap: 6px;
margin: 8px 0 4px;
flex-wrap: wrap;
}
.platform-badge {
font-size: 10px;
padding: 2px 8px;
border-radius: 10px;
font-weight: 600;
letter-spacing: 0.3px;
text-transform: uppercase;
}
.platform-badge.spotify { background: rgba(29,185,84,0.15); color: #1db954; }
.platform-badge.youtube { background: rgba(255,0,0,0.12); color: #ff4444; }
.platform-badge.soundcloud { background: rgba(255,85,0,0.12); color: #ff5500; }
.btn-voice.sharing {
background: var(--danger) !important;
color: #fff !important;
}
/* ═══════════════════════════════════════════════════════════
WHITELIST PANEL
═══════════════════════════════════════════════════════════ */
.whitelist-add-row {
display: flex;
gap: 6px;
margin-bottom: 8px;
}
.whitelist-add-row input {
flex: 1;
min-width: 0;
}
.settings-text-input {
padding: 6px 10px;
background: var(--bg-primary);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-primary);
font-size: 13px;
}
.settings-text-input:focus {
outline: none;
border-color: var(--accent);
}
.whitelist-list {
max-height: 200px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 4px;
}
.whitelist-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 10px;
background: var(--bg-primary);
border-radius: var(--radius-sm);
font-size: 13px;
}
.whitelist-username {
color: var(--text-primary);
font-weight: 500;
}
.btn-danger-sm {
padding: 2px 8px !important;
font-size: 11px;
background: var(--danger) !important;
color: #fff !important;
border-radius: var(--radius-sm);
cursor: pointer;
min-height: 0;
line-height: 1.4;
}
.btn-danger-sm:hover { opacity: 0.85; }
/* ═══════════════════════════════════════════════════════════
PINNED MESSAGES
═══════════════════════════════════════════════════════════ */
.message.pinned,
.message-compact.pinned {
border-left: 3px solid var(--accent);
background: rgba(124, 92, 252, 0.04);
}
.pinned-tag {
font-size: 11px;
margin-left: 4px;
opacity: 0.7;
cursor: default;
}
.pinned-panel {
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
max-height: 300px;
overflow-y: auto;
}
.pinned-panel-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
border-bottom: 1px solid var(--border-color);
position: sticky;
top: 0;
background: var(--bg-secondary);
}
.pinned-list { padding: 4px 0; }
.pinned-item {
padding: 8px 12px;
cursor: pointer;
border-bottom: 1px solid rgba(255,255,255,0.03);
transition: background var(--transition);
}
.pinned-item:hover { background: rgba(255,255,255,0.04); }
.pinned-item-header {
display: flex;
align-items: baseline;
gap: 8px;
margin-bottom: 2px;
}
.pinned-item-author { font-weight: 600; font-size: 13px; }
.pinned-item-time { font-size: 11px; color: var(--text-muted); }
.pinned-item-content {
font-size: 13px;
color: var(--text-primary);
line-height: 1.4;
max-height: 60px;
overflow: hidden;
text-overflow: ellipsis;
}
.pinned-item-footer {
font-size: 10px;
color: var(--text-muted);
margin-top: 4px;
}
/* ═══════════════════════════════════════════════════════════
CODE BLOCKS & BLOCKQUOTES
═══════════════════════════════════════════════════════════ */
.code-block {
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
margin: 6px 0;
position: relative;
overflow: hidden;
}
.code-block pre {
margin: 0;
padding: 10px 12px;
overflow-x: auto;
font-size: 13px;
line-height: 1.5;
}
.code-block code {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
color: var(--text-primary);
background: none;
padding: 0;
}
.code-block-lang {
position: absolute;
top: 4px;
right: 8px;
font-size: 10px;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.inline-code {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
background: var(--bg-tertiary);
padding: 1px 5px;
border-radius: 3px;
font-size: 0.9em;
color: var(--accent);
}
.chat-blockquote {
border-left: 3px solid var(--text-muted);
padding: 2px 0 2px 10px;
margin: 4px 0;
color: var(--text-secondary);
font-style: italic;
}
/* ═══════════════════════════════════════════════════════════
LINK PREVIEWS
═══════════════════════════════════════════════════════════ */
.link-preview {
display: flex;
gap: 10px;
margin-top: 6px;
padding: 10px;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-left: 3px solid var(--accent);
border-radius: var(--radius-sm);
text-decoration: none;
color: inherit;
max-width: 480px;
overflow: hidden;
transition: background var(--transition);
}
.link-preview:hover {
background: rgba(255,255,255,0.04);
}
.link-preview-image {
width: 80px;
height: 80px;
object-fit: cover;
border-radius: 4px;
flex-shrink: 0;
}
.link-preview-text {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
overflow: hidden;
}
.link-preview-site {
font-size: 11px;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.link-preview-title {
font-size: 13px;
font-weight: 600;
color: var(--text-link);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.link-preview-desc {
font-size: 12px;
color: var(--text-secondary);
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ═══════════════════════════════════════════════════════════
Channel Topic Bar
═══════════════════════════════════════════════════════════ */
.channel-topic-bar {
padding: 4px 16px;
font-size: 12px;
color: var(--text-secondary);
background: var(--bg-secondary);
border-bottom: 1px solid var(--border);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
min-height: 24px;
line-height: 24px;
}
.channel-topic-bar:hover {
color: var(--text-primary);
}
/* ═══════════════════════════════════════════════════════════
User Status Dots
═══════════════════════════════════════════════════════════ */
/* DND: square — distinct shape */
.user-dot.dnd {
background-color: var(--danger) !important;
box-shadow: 0 0 4px var(--danger);
border-radius: 2px;
}
/* Away: half-circle dome */
.user-dot.away {
background-color: #faa61a !important;
box-shadow: 0 0 4px rgba(250, 166, 26, 0.4);
border-radius: 2px 2px 50% 50%;
}
/* Invisible: hollow circle */
.user-dot.invisible {
background-color: transparent !important;
border: 2px solid var(--text-muted);
box-shadow: none;
box-sizing: border-box;
}
.user-status-text {
font-size: 11px;
color: var(--text-muted);
margin-left: 4px;
max-width: 100px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex-shrink: 1;
}
/* ═══════════════════════════════════════════════════════════
Status Picker
═══════════════════════════════════════════════════════════ */
.status-picker-dot {
cursor: pointer;
transition: transform 0.15s;
}
.status-picker-dot:hover {
transform: scale(1.4);
}
.status-picker {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: 8px;
padding: 6px 0;
min-width: 180px;
z-index: 500;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
margin-top: 4px;
}
.status-option {
padding: 6px 12px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: var(--text-primary);
}
.status-option:hover {
background: var(--bg-hover);
}
.status-option .user-dot {
position: static;
flex-shrink: 0;
}
.status-text-row {
padding: 6px 12px;
border-top: 1px solid var(--border);
margin-top: 4px;
padding-top: 8px;
}
.status-text-row input {
width: 100%;
background: var(--bg-input);
border: 1px solid var(--border);
border-radius: 4px;
padding: 4px 8px;
color: var(--text-primary);
font-size: 12px;
outline: none;
}
.status-text-row input:focus {
border-color: var(--accent);
}
/* ═══════════════════════════════════════════════════════════
DM Section in Sidebar
═══════════════════════════════════════════════════════════ */
.dm-section-label {
margin-top: 0 !important;
padding-top: 4px;
}
.dm-toggle {
display: flex;
align-items: center;
gap: 4px;
user-select: none;
transition: color 0.15s;
}
.dm-toggle:hover {
color: var(--text-secondary);
}
.dm-toggle-arrow {
display: inline-block;
transition: transform 0.2s ease;
font-size: 10px;
}
.dm-toggle-arrow.collapsed {
transform: rotate(-90deg);
}
.dm-unread-count {
font-size: 9px;
font-weight: 700;
background: var(--accent);
color: #fff;
padding: 1px 5px;
border-radius: 8px;
margin-left: auto;
}
.dm-item .channel-hash {
color: var(--accent);
}
/* ── DM Category Headers ──────────────────────────────── */
.dm-category-header {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 10px 2px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-muted, #888);
user-select: none;
cursor: pointer;
transition: color 0.15s;
}
.dm-category-header:hover {
color: var(--text-secondary);
}
.dm-category-arrow {
display: inline-block;
transition: transform 0.2s ease;
font-size: 9px;
}
.dm-category-arrow.collapsed {
transform: rotate(-90deg);
}
.user-dm-btn {
font-size: 12px !important;
opacity: 0;
transition: opacity 0.15s;
}
.user-item:hover .user-dm-btn {
opacity: 0.7;
}
.user-dm-btn:hover {
opacity: 1 !important;
}
/* ═══════════════════════════════════════════════════════════
File Attachments
═══════════════════════════════════════════════════════════ */
.file-attachment {
background: var(--bg-tertiary);
border: 1px solid var(--border);
border-radius: 8px;
padding: 10px 14px;
max-width: 400px;
margin: 4px 0;
}
.file-download-link {
display: flex;
align-items: center;
gap: 8px;
text-decoration: none;
color: var(--text-primary);
transition: color 0.15s;
}
.file-download-link:hover {
color: var(--accent);
}
.file-icon {
font-size: 24px;
flex-shrink: 0;
}
.file-name {
font-weight: 500;
word-break: break-all;
}
.file-size {
color: var(--text-muted);
font-size: 12px;
flex-shrink: 0;
}
.file-download-arrow {
margin-left: auto;
font-size: 16px;
opacity: 0.5;
}
.file-download-link:hover .file-download-arrow {
opacity: 1;
}
.file-info {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
font-size: 13px;
}
.file-attachment audio {
width: 100%;
height: 32px;
}
.file-video {
max-width: 100%;
max-height: 300px;
border-radius: 4px;
margin-top: 4px;
}
.user-bar {
position: relative;
}
/* ═══════════════════════════════════════════════════════════
VOICE USER ... MENU (per-user volume/mute/deafen)
═══════════════════════════════════════════════════════════ */
.voice-user-menu-btn {
background: none;
border: none;
color: var(--text-muted);
font-size: 16px;
cursor: pointer;
padding: 0 4px;
line-height: 1;
margin-left: auto;
opacity: 0;
transition: opacity 0.15s;
letter-spacing: 1px;
}
.voice-user-item:hover .voice-user-menu-btn { opacity: 1; }
.voice-user-menu-btn:hover { color: var(--text-primary); }
.voice-user-menu {
position: fixed;
z-index: 10002;
min-width: 200px;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 6px 24px rgba(0,0,0,0.5);
padding: 8px;
animation: gear-menu-in 0.12s ease-out;
}
.voice-user-menu-header {
font-size: 12px;
font-weight: 700;
color: var(--text-primary);
padding: 0 4px 6px;
border-bottom: 1px solid var(--border);
margin-bottom: 6px;
}
.voice-user-menu-row {
display: flex;
align-items: center;
gap: 8px;
padding: 4px;
}
.voice-user-menu-label {
font-size: 12px;
color: var(--text-muted);
white-space: nowrap;
flex-shrink: 0;
}
.voice-user-vol-slider {
flex: 1;
min-width: 60px;
}
.voice-user-vol-value {
font-size: 11px;
color: var(--text-muted);
min-width: 32px;
text-align: right;
}
.voice-user-menu-actions {
display: flex;
flex-direction: column;
gap: 2px;
margin-top: 4px;
}
.voice-user-menu-action {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 8px;
font-size: 12px;
color: var(--text-secondary);
background: none;
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
width: 100%;
text-align: left;
transition: background 0.1s;
}
.voice-user-menu-action:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
.voice-user-menu-action.active {
background: rgba(231, 76, 60, 0.15);
color: #e74c3c;
}
.voice-user-menu-hint {
padding: 4px 8px;
color: var(--text-muted);
font-size: 11px;
line-height: 1.5;
border-top: 1px solid var(--border-light);
}
/* ═══════════════════════════════════════════════════════════
VOICE CONTROLS PANEL (right sidebar, below voice users)
═══════════════════════════════════════════════════════════ */
.voice-panel {
display: none;
align-items: center;
justify-content: center;
gap: 6px;
padding: 8px 12px;
border-top: 1px solid var(--border);
background: var(--bg-tertiary);
flex-shrink: 0;
}
.voice-panel-btn {
width: 34px;
height: 34px;
border-radius: 50%;
font-size: 15px;
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--bg-secondary);
color: var(--text-secondary);
border: 1px solid var(--border);
cursor: pointer;
transition: all 0.15s ease;
padding: 0;
line-height: 1;
}
.voice-panel-btn:hover { background: var(--bg-hover); color: var(--text-primary); border-color: var(--accent); }
.voice-panel-btn.muted { background: var(--warning); color: #1a1a2e; border-color: var(--warning); position: relative; }
.voice-panel-btn.muted::after {
content: '';
position: absolute;
top: 50%; left: 18%;
width: 64%; height: 2px;
background: #c00;
transform: rotate(-45deg);
pointer-events: none;
}
.voice-panel-btn.sharing { background: var(--success); color: #fff; border-color: var(--success); }
.voice-panel-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.voice-panel-divider {
width: 1px;
height: 22px;
background: var(--border);
margin: 0 2px;
flex-shrink: 0;
}
.voice-panel-leave { width: 28px; height: 28px; font-size: 12px; background: var(--danger); color: #fff; border-color: var(--danger); }
.voice-panel-leave:hover { background: #d93636; color: #fff; border-color: #d93636; }
/* Voice settings slide-up panel (sits above controls at bottom) */
.voice-settings-panel {
padding: 8px 12px;
background: var(--bg-tertiary);
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.voice-settings-row {
display: flex;
align-items: center;
gap: 8px;
}
.voice-settings-label {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
white-space: nowrap;
flex-shrink: 0;
}
.voice-settings-panel .ns-slider {
flex: 1;
width: auto;
min-width: 60px;
}
/* ═══════════════════════════════════════════════════════════
PERSISTENT VOICE BAR (sidebar bottom)
═══════════════════════════════════════════════════════════ */
.voice-bar {
display: flex;
align-items: center;
gap: 8px;
margin-top: 0;
padding: 5px 10px;
background: var(--success);
color: #fff;
border-radius: var(--radius-sm);
font-size: 12px;
font-weight: 600;
animation: voice-bar-pulse 2s ease-in-out infinite;
flex-shrink: 1;
min-width: 0;
overflow: hidden;
}
.voice-bar-icon { font-size: 14px; }
.voice-bar-channel {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.voice-bar-leave {
background: none;
border: none;
color: rgba(255,255,255,0.7);
font-size: 14px;
cursor: pointer;
padding: 0 2px;
line-height: 1;
transition: color 0.15s;
}
.voice-bar-leave:hover { color: #fff; }
@keyframes voice-bar-pulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(46, 204, 113, 0.3); }
50% { box-shadow: 0 0 8px 2px rgba(46, 204, 113, 0.15); }
}
/* ═══════════════════════════════════════════════════════════
THEMED SLIDER EFFECTS
═══════════════════════════════════════════════════════════ */
/* Bloodborne / Dark Souls — health bar red glow */
[data-theme="bloodborne"] .slider-sm,
[data-theme="bloodborne"] .ns-slider {
--track-bg: #1a0c0c;
}
[data-theme="bloodborne"] .slider-sm::-webkit-slider-thumb,
[data-theme="bloodborne"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(204, 0, 32, 0.6);
}
[data-theme="darksouls"] .slider-sm,
[data-theme="darksouls"] .ns-slider {
--track-bg: #1a1510;
}
[data-theme="darksouls"] .slider-sm::-webkit-slider-thumb,
[data-theme="darksouls"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(200, 168, 78, 0.5);
}
/* Elden Ring — golden estus glow */
[data-theme="eldenring"] .slider-sm,
[data-theme="eldenring"] .ns-slider {
--track-bg: #14141e;
}
[data-theme="eldenring"] .slider-sm::-webkit-slider-thumb,
[data-theme="eldenring"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 10px rgba(212, 168, 50, 0.6);
}
/* Minecraft — blocky green bar */
[data-theme="minecraft"] .slider-sm,
[data-theme="minecraft"] .ns-slider {
--track-bg: #2e2e2e;
--track-h: 6px;
--track-r: 0;
--track-border: 1px solid #3a3a3a;
height: 6px;
border-radius: 0;
border: 1px solid #3a3a3a;
}
[data-theme="minecraft"] .slider-sm::-webkit-slider-thumb,
[data-theme="minecraft"] .ns-slider::-webkit-slider-thumb {
border-radius: 2px;
box-shadow: 2px 2px 0 #2a5a2a;
}
[data-theme="minecraft"] .slider-sm::-moz-range-thumb,
[data-theme="minecraft"] .ns-slider::-moz-range-thumb {
border-radius: 2px;
}
/* Final Fantasy X — blue mana bar */
[data-theme="ffx"] .slider-sm,
[data-theme="ffx"] .ns-slider {
--track-bg: #101a30;
--track-h: 5px;
height: 5px;
}
[data-theme="ffx"] .slider-sm::-webkit-slider-thumb,
[data-theme="ffx"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(64, 168, 224, 0.5);
}
/* Zelda — green heart / stamina bar */
[data-theme="zelda"] .slider-sm,
[data-theme="zelda"] .ns-slider {
--track-bg: #142014;
--track-h: 5px;
height: 5px;
}
[data-theme="zelda"] .slider-sm::-webkit-slider-thumb,
[data-theme="zelda"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(68, 187, 68, 0.5);
}
/* Matrix — green terminal glow */
[data-theme="matrix"] .slider-sm,
[data-theme="matrix"] .ns-slider {
--track-bg: #0a0a0a;
}
[data-theme="matrix"] .slider-sm::-webkit-slider-thumb,
[data-theme="matrix"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(0, 255, 65, 0.5);
}
/* Tron — neon blue trail */
[data-theme="tron"] .slider-sm,
[data-theme="tron"] .ns-slider {
--track-bg: #0c141f;
}
[data-theme="tron"] .slider-sm::-webkit-slider-thumb,
[data-theme="tron"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 10px rgba(111, 236, 255, 0.6);
}
/* Cyberpunk — neon pink */
[data-theme="cyberpunk"] .slider-sm,
[data-theme="cyberpunk"] .ns-slider {
--track-bg: #0a0a12;
}
[data-theme="cyberpunk"] .slider-sm::-webkit-slider-thumb,
[data-theme="cyberpunk"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(255, 45, 111, 0.5);
}
/* Halo — UNSC blue-green */
[data-theme="halo"] .slider-sm,
[data-theme="halo"] .ns-slider {
--track-bg: #0d1a0d;
}
[data-theme="halo"] .slider-sm::-webkit-slider-thumb,
[data-theme="halo"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(79, 195, 247, 0.5);
}
/* Ice — frozen blue */
[data-theme="ice"] .slider-sm,
[data-theme="ice"] .ns-slider {
--track-bg: #102030;
}
[data-theme="ice"] .slider-sm::-webkit-slider-thumb,
[data-theme="ice"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 10px rgba(0, 212, 255, 0.6);
}
/* LoTR — golden warmth */
[data-theme="lotr"] .slider-sm,
[data-theme="lotr"] .ns-slider {
--track-bg: #2a221a;
}
[data-theme="lotr"] .slider-sm::-webkit-slider-thumb,
[data-theme="lotr"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 6px rgba(212, 168, 68, 0.5);
}
/* Dracula — purple accent */
[data-theme="dracula"] .slider-sm,
[data-theme="dracula"] .ns-slider {
--track-bg: #22232e;
}
[data-theme="dracula"] .slider-sm::-webkit-slider-thumb,
[data-theme="dracula"] .ns-slider::-webkit-slider-thumb {
box-shadow: 0 0 8px rgba(189, 147, 249, 0.5);
}
/* ── Music Search Picker ─────────────────────────────── */
.music-search-picker {
position: absolute;
bottom: 60px;
left: 50%;
transform: translateX(-50%);
width: 440px;
max-width: calc(100% - 32px);
background: var(--bg-card, #1e2030);
border: 1px solid var(--border-light, #333);
border-radius: 12px;
z-index: 200;
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
overflow: hidden;
animation: pickerSlideIn 0.2s ease-out;
}
@keyframes pickerSlideIn {
from { opacity: 0; transform: translateX(-50%) translateY(12px); }
to { opacity: 1; transform: translateX(-50%) translateY(0); }
}
.music-search-picker-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
border-bottom: 1px solid var(--border-light, #333);
font-size: 13px;
color: var(--text-primary, #eee);
}
.music-search-picker-header strong {
color: var(--accent, #ffd700);
}
.music-search-picker-close {
background: none;
border: none;
color: var(--text-muted, #888);
font-size: 16px;
cursor: pointer;
padding: 2px 6px;
border-radius: 4px;
}
.music-search-picker-close:hover {
background: var(--bg-hover, #333);
color: var(--text-primary, #eee);
}
.music-search-picker-list {
max-height: 320px;
overflow-y: auto;
}
.music-search-picker-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 14px;
cursor: pointer;
transition: background 0.15s;
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.music-search-picker-item:hover {
background: var(--bg-hover, #2a2d40);
}
.music-search-picker-item:last-child {
border-bottom: none;
}
.music-search-picker-thumb {
width: 48px;
height: 36px;
border-radius: 4px;
overflow: hidden;
flex-shrink: 0;
background: rgba(255,255,255,0.05);
display: flex;
align-items: center;
justify-content: center;
}
.music-search-picker-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
}
.music-search-picker-thumb span {
font-size: 18px;
}
.music-search-picker-info {
flex: 1;
min-width: 0;
}
.music-search-picker-title {
font-size: 13px;
font-weight: 500;
color: var(--text-primary, #eee);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.music-search-picker-meta {
font-size: 11px;
color: var(--text-muted, #888);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.music-search-picker-play {
background: var(--accent, #ffd700);
color: #000;
border: none;
border-radius: 50%;
width: 28px;
height: 28px;
font-size: 12px;
cursor: pointer;
flex-shrink: 0;
transition: transform 0.15s, background 0.15s;
display: flex;
align-items: center;
justify-content: center;
}
.music-search-picker-play:hover {
transform: scale(1.15);
}
.music-search-picker-footer {
display: flex;
justify-content: space-between;
padding: 8px 14px;
border-top: 1px solid var(--border-light, #333);
gap: 8px;
}
.music-search-picker-more,
.music-search-picker-cancel {
padding: 6px 16px;
border-radius: 6px;
border: none;
font-size: 12px;
cursor: pointer;
font-weight: 500;
transition: background 0.15s;
}
.music-search-picker-more {
background: var(--accent, #ffd700);
color: #000;
}
.music-search-picker-more:hover {
filter: brightness(1.1);
}
.music-search-picker-cancel {
background: rgba(255,255,255,0.08);
color: var(--text-muted, #888);
}
.music-search-picker-cancel:hover {
background: rgba(255,255,255,0.15);
color: var(--text-primary, #eee);
}
/* ── Sub-channel styling ─────────────────────────────── */
.sub-channel-item {
padding: 3px 16px 3px 38px !important;
}
.sub-channel-item .channel-hash {
font-size: 12px;
opacity: 0.55;
}
.sub-channel-item .channel-name {
font-size: 12px;
opacity: 0.8;
}
/* ── Private sub-channel styling ─────────────────────── */
.private-channel .channel-name {
opacity: 0.65;
font-style: italic;
}
.private-channel .channel-hash {
font-size: 12px;
}
/* ── Role badge (user list & messages) ───────────────── */
.user-role-badge {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 1px 5px;
border-radius: 3px;
background: rgba(255,255,255,0.06);
margin-left: 4px;
white-space: nowrap;
flex-shrink: 0;
/* Hidden in sidebar user list — role shown via dot + tooltip instead */
display: none;
}
.msg-role-badge {
font-size: 9px;
vertical-align: middle;
margin-left: 4px;
/* Always show in messages */
display: inline;
}
/* ── BOT badge for webhook messages ───────────────── */
.bot-badge {
display: inline-block;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 1px 5px;
border-radius: 3px;
background: var(--accent-color, #5865f2);
color: #fff;
vertical-align: middle;
margin-left: 4px;
}
.webhook-message .message-avatar {
border: 2px solid var(--accent-color, #5865f2);
}
/* ── Webhook management items ──────────────────────────── */
.webhook-item {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 6px;
padding: 10px;
margin-bottom: 8px;
}
.webhook-item-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 6px;
}
.webhook-item-name {
font-weight: 600;
font-size: 13px;
color: var(--text-primary);
}
.webhook-item-channel {
font-size: 12px;
color: var(--text-muted);
background: var(--bg-tertiary);
padding: 1px 6px;
border-radius: 4px;
}
.webhook-item-status {
font-size: 11px;
font-weight: 600;
margin-left: auto;
}
.webhook-item-status.status-online { color: #2ecc71; }
.webhook-item-status.status-offline { color: #e74c3c; }
.webhook-item-url {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 6px;
}
.webhook-url-text {
font-size: 10px;
font-family: monospace;
color: var(--text-muted);
background: var(--bg-primary);
padding: 3px 6px;
border-radius: 4px;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
user-select: all;
}
.webhook-item-actions {
display: flex;
gap: 6px;
}
.btn-xs {
padding: 2px 8px;
font-size: 11px;
border-radius: 4px;
border: 1px solid var(--border);
background: var(--bg-tertiary);
color: var(--text-secondary);
cursor: pointer;
transition: all 0.15s ease;
}
.btn-xs:hover {
background: var(--bg-hover);
color: var(--text-primary);
}
/* Win95 overrides for webhook items */
[data-theme="win95"] .webhook-item { background: #bfbfbf; border: 2px inset #808080; border-radius: 0; }
[data-theme="win95"] .webhook-url-text { background: #fff; border: 2px inset #808080; border-radius: 0; color: #000; }
[data-theme="win95"] .btn-xs { background: #bfbfbf; border: 2px outset #fff; border-radius: 0; color: #000; }
[data-theme="win95"] .btn-xs:hover { background: #dfdfdf; }
[data-theme="win95"] .btn-xs:active { border: 2px inset #808080; }
/* ── Collapsible sub-channel toggle arrow ────────────── */
.channel-collapse-arrow {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
font-size: 10px;
color: var(--text-muted);
cursor: pointer;
user-select: none;
flex-shrink: 0;
transition: transform 0.15s ease, color 0.15s;
position: absolute;
left: 2px;
top: 50%;
transform: translateY(-50%);
}
.channel-collapse-arrow:hover {
color: var(--accent);
}
.channel-collapse-arrow.collapsed {
transform: translateY(-50%) rotate(-90deg);
}
/* ── Role management modal ───────────────────────────── */
.role-editor-layout {
display: flex;
gap: 16px;
min-height: 280px;
max-height: 60vh;
margin: 12px 0;
}
.role-sidebar {
width: 180px;
border-right: 1px solid var(--border, #333);
padding-right: 12px;
flex-shrink: 0;
overflow-y: auto;
}
.role-list-sidebar {
display: flex;
flex-direction: column;
gap: 4px;
max-height: 100%;
overflow-y: auto;
}
.role-sidebar-item {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 8px;
border-radius: 4px;
cursor: pointer;
font-size: 13px;
transition: background 0.15s;
}
.role-sidebar-item:hover {
background: rgba(255,255,255,0.06);
}
.role-sidebar-item.active {
background: var(--accent, #5865f2);
color: #fff;
}
.role-color-dot {
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.role-detail {
flex: 1;
min-width: 0;
overflow-y: auto;
padding-right: 14px;
}
.role-detail-form {
display: flex;
flex-direction: column;
gap: 4px;
}
.role-detail-form .settings-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
color: var(--text-muted, #888);
margin-top: 4px;
}
.role-detail-form .toggle-row {
font-size: 13px;
}
/* ── Role preview in admin settings ──────────────────── */
.role-preview-item {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 0;
font-size: 13px;
}
/* ═══════════════════════════════════════════════════════════
DONATE BUTTON
═══════════════════════════════════════════════════════════ */
.donate-btn {
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.donate-btn:hover {
filter: brightness(1.2);
}
/* ═══════════════════════════════════════════════════════════
LAYOUT DENSITY PICKER
═══════════════════════════════════════════════════════════ */
.density-picker {
display: flex;
gap: 8px;
padding: 8px 0;
}
.density-btn {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 10px 8px;
background: var(--bg-primary);
border: 2px solid var(--border);
border-radius: var(--radius);
color: var(--text-secondary);
cursor: pointer;
transition: all 0.2s;
font-size: 12px;
}
.density-btn:hover {
background: var(--bg-hover);
border-color: var(--text-muted);
}
.density-btn.active {
border-color: var(--accent);
color: var(--text-primary);
background: var(--bg-hover);
}
.density-icon { font-size: 18px; }
.density-label { font-weight: 600; }
/* ── Compact density ─────────────────────────────────── */
[data-density="compact"] .message-row {
padding: 2px 8px;
gap: 8px;
}
[data-density="compact"] .message-avatar,
[data-density="compact"] .message-avatar-img {
width: 28px;
height: 28px;
font-size: 11px;
}
[data-density="compact"] .message-compact {
padding-left: 44px;
}
[data-density="compact"] .message-compact .compact-time {
font-size: 9px;
}
[data-density="compact"] .msg-body {
font-size: 13px;
}
[data-density="compact"] .msg-username {
font-size: 12px;
}
[data-density="compact"] .msg-timestamp {
font-size: 10px;
}
/* ── Spacious density ────────────────────────────────── */
[data-density="spacious"] .message-row {
padding: 8px 12px;
gap: 14px;
}
[data-density="spacious"] .message-avatar,
[data-density="spacious"] .message-avatar-img {
width: 44px;
height: 44px;
font-size: 17px;
}
[data-density="spacious"] .msg-body {
font-size: 15px;
line-height: 1.5;
}
[data-density="spacious"] .msg-username {
font-size: 14px;
}
/* ═══════════════════════════════════════════════════════════
ONLINE OVERLAY
═══════════════════════════════════════════════════════════ */
.status-online-trigger {
cursor: pointer;
border-radius: 4px;
padding: 2px 6px;
margin: -2px -6px;
transition: background 0.15s;
}
.status-online-trigger:hover {
background: rgba(255,255,255,0.08);
}
.online-overlay {
position: fixed;
z-index: 9999;
width: 220px;
max-height: 350px;
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 -4px 24px rgba(0,0,0,0.4);
display: flex;
flex-direction: column;
overflow: hidden;
}
.online-overlay-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
border-bottom: 1px solid var(--border);
}
.online-overlay-title {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-muted);
}
.online-overlay-list {
overflow-y: auto;
padding: 6px 0;
max-height: 300px;
}
.online-overlay-group {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
padding: 6px 12px 4px;
}
.online-overlay-group.offline {
opacity: 0.6;
}
.online-overlay-user {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 12px;
font-size: 13px;
}
.online-overlay-user.offline {
opacity: 0.45;
}
.online-overlay-user:hover {
background: rgba(255,255,255,0.04);
}
.online-overlay-avatar,
.online-overlay-avatar-img {
width: 24px;
height: 24px;
border-radius: 50%;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 700;
color: #fff;
}
.online-overlay-avatar-img {
object-fit: cover;
}
.online-overlay-username {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 500;
color: var(--text-primary);
}
.online-overlay-status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.online-overlay-status-dot.online { background: #43b581; }
.online-overlay-status-dot.offline { background: #72767d; }
/* ═══════════════════════════════════════════════════════════
MOD MODE — Layout customisation drag & drop
═══════════════════════════════════════════════════════════ */
.sidebar-mod-container {
display: flex;
flex-direction: column;
min-height: 0;
flex: 1;
}
.mod-mode-active .mod-draggable {
cursor: move;
position: relative;
outline: 1px dashed transparent;
transition: outline-color 0.15s ease, background-color 0.15s ease;
}
.mod-mode-active .mod-draggable:hover {
outline-color: var(--accent);
background: color-mix(in srgb, var(--bg-secondary) 82%, var(--accent) 18%);
}
.mod-mode-active .mod-drag-over {
outline-color: var(--accent);
}
.mod-mode-active .mod-drop-above::before,
.mod-mode-active .mod-drop-below::after {
content: '';
position: absolute;
left: 10px;
right: 10px;
height: 2px;
background: var(--accent);
border-radius: 2px;
}
.mod-mode-active .mod-drop-above::before { top: 2px; }
.mod-mode-active .mod-drop-below::after { bottom: 2px; }
.mod-mode-active .mod-dragging {
opacity: 0.6;
}
.mod-panel-target {
position: relative;
}
.mod-panel-handle {
position: absolute;
top: 8px;
right: 8px;
width: 24px;
height: 24px;
border: 1px solid var(--border-light);
background: var(--bg-card);
color: var(--text-secondary);
border-radius: 6px;
cursor: grab;
z-index: 40;
font-size: 14px;
display: none;
}
.mod-mode-on .mod-panel-handle {
display: inline-flex;
align-items: center;
justify-content: center;
}
.mod-panel-handle.dragging {
cursor: grabbing;
opacity: 0.8;
}
.mod-snap-zone {
position: fixed;
z-index: 9999;
pointer-events: auto;
border: 2px dashed var(--accent);
color: var(--text-primary);
background: color-mix(in srgb, var(--bg-secondary) 76%, var(--accent) 24%);
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.mod-snap-zone.active {
background: color-mix(in srgb, var(--bg-secondary) 56%, var(--accent) 44%);
}
.mod-snap-zone.left { left: 0; top: 0; width: 80px; height: 100vh; }
.mod-snap-zone.right { right: 0; top: 0; width: 80px; height: 100vh; }
.mod-snap-zone.top { left: 0; top: 0; width: 100vw; height: 56px; }
.mod-snap-zone.bottom { left: 0; bottom: 0; width: 100vw; height: 56px; }
.mod-snap-zone.center {
left: 50%; top: 50%; width: 160px; height: 80px;
transform: translate(-50%, -50%);
border-radius: 12px;
}
.mod-snap-zone.right-sidebar {
right: 0; top: 30%; width: 80px; height: 40vh;
border-radius: 8px 0 0 8px;
}
.mod-snap-zone.left-sidebar {
left: 0; top: 30%; width: 80px; height: 40vh;
border-radius: 0 8px 8px 0;
}
#app[data-status-pos="top"] #status-bar {
order: -1;
border-top: none;
border-bottom: 1px solid var(--border);
}
#app[data-status-pos="bottom"] #status-bar {
order: 10;
border-top: 1px solid var(--border);
border-bottom: none;
}
#app-body .server-bar[data-panel-pos="right"] {
order: 5;
border-right: none;
border-left: 1px solid var(--border);
}
#app-body .sidebar[data-panel-pos="right"] {
order: 4;
border-right: none;
border-left: 1px solid var(--border);
}
#app-body .server-bar[data-panel-pos="left"] { order: 0; }
#app-body .sidebar[data-panel-pos="left"] { order: 1; }
#app-body .main { order: 2; }
#app-body .right-sidebar { order: 3; }
/* Right sidebar — snapped left */
#app-body .right-sidebar[data-panel-pos="left"] {
order: 1;
border-left: none;
border-right: 1px solid var(--border);
}
#app-body .right-sidebar[data-panel-pos="left"] .right-sidebar-resize-handle {
left: auto; right: -3px;
cursor: col-resize;
}
#app-body .right-sidebar[data-panel-pos="right"] { order: 3; }
/* Floating panel (center) — any panel */
.mod-float {
position: fixed !important;
z-index: 500;
border-radius: 10px;
border: 1px solid var(--border-light) !important;
box-shadow: 0 8px 32px rgba(0,0,0,0.45), 0 0 0 1px rgba(255,255,255,0.04);
resize: both;
overflow: auto;
}
.right-sidebar.mod-float {
top: 80px; right: 24px;
width: 280px; height: 420px;
max-width: 50vw; max-height: 70vh;
}
/* Voice panel — floating */
#voice-panel.mod-float {
position: fixed !important;
bottom: 80px; right: 24px;
width: 220px;
z-index: 600;
border-radius: 12px;
border: 1px solid var(--border-light);
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
background: var(--bg-secondary);
}
/* Voice panel — docked to bottom of screen */
#voice-panel.mod-voice-bottom {
position: fixed !important;
bottom: 0; left: 50%;
transform: translateX(-50%);
width: 400px; max-width: 90vw;
z-index: 600;
border-radius: 12px 12px 0 0;
border: 1px solid var(--border-light);
border-bottom: none;
box-shadow: 0 -4px 24px rgba(0,0,0,0.3);
background: var(--bg-secondary);
}
/* Voice panel — moved to left sidebar */
#voice-panel.mod-voice-left {
border-top: 1px solid var(--border);
}
.mod-toast {
position: fixed;
left: 50%;
bottom: 24px;
transform: translateX(-50%) translateY(12px);
opacity: 0;
z-index: 10000;
background: var(--bg-card);
color: var(--text-primary);
border: 1px solid var(--border-light);
border-radius: 8px;
padding: 8px 12px;
font-size: 12px;
transition: transform 0.2s ease, opacity 0.2s ease;
}
.mod-toast.show {
transform: translateX(-50%) translateY(0);
opacity: 1;
}
/* ═══════════════════════════════════════════════════════
SIDEBAR SPLIT — channels + DM panes with drag divider
═══════════════════════════════════════════════════════ */
.sidebar-split {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* Channels pane (top) */
.sidebar-split .channel-section {
flex: 1 1 60%;
min-height: 80px;
overflow: hidden;
display: flex;
flex-direction: column;
padding: 8px 16px 0;
border-bottom: none;
}
.sidebar-split .channel-section .channel-list {
flex: 1;
min-height: 0;
overflow-y: auto;
}
/* Collapsible channels header */
.channels-toggle {
display: flex;
align-items: center;
gap: 4px;
transition: color 0.15s;
}
.channels-toggle:hover { color: var(--text-secondary); }
.channels-toggle-arrow {
display: inline-block;
transition: transform 0.2s ease;
font-size: 10px;
}
.channels-toggle-arrow.collapsed {
transform: rotate(-90deg);
}
/* Drag handle between channels & DMs — blends with natural section border */
.sidebar-split-handle {
height: 0;
cursor: row-resize;
position: relative;
flex-shrink: 0;
z-index: 5;
border-top: 1px solid var(--border);
margin: 0 12px;
padding: 4px 0;
box-sizing: content-box;
transition: border-color 0.15s;
}
.sidebar-split-handle:hover,
.sidebar-split-handle.dragging {
border-color: var(--accent);
}
/* DM pane (bottom) */
.sidebar-split .dm-section-pane {
flex: 0 1 40%;
min-height: 60px;
overflow: hidden;
display: flex;
flex-direction: column;
padding: 0 16px;
border-bottom: none;
}
.dm-list-scroll {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 4px 0;
}
/* ─── Collapse arrow positioning override ─────────────── */
/* (moved to main .channel-collapse-arrow block above) */
/* ═══════════════════════════════════════════════════════
ORGANIZE MODAL — styled
═══════════════════════════════════════════════════════ */
.organize-toolbar {
display: flex;
align-items: center;
gap: 8px;
margin: 12px 0 8px;
}
.organize-toolbar-label {
font-size: 0.85rem;
font-weight: 600;
color: var(--text-muted);
flex-shrink: 0;
}
.organize-select {
padding: 5px 8px;
border-radius: var(--radius-sm, 6px);
border: 1px solid var(--border, rgba(255,255,255,0.12));
background: var(--bg-input, rgba(255,255,255,0.06));
color: var(--text-primary, #eee);
font-size: 0.82rem;
cursor: pointer;
outline: none;
min-width: 0;
}
.organize-select:focus { border-color: var(--accent); }
.organize-select option {
background: var(--bg-secondary, #1e1e2e);
color: var(--text-primary, #eee);
}
.organize-list {
border: 1px solid var(--border, rgba(255,255,255,0.1));
border-radius: 8px;
max-height: 280px;
overflow-y: auto;
margin: 6px 0;
}
.organize-tag-header {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.5;
background: rgba(255,255,255,0.02);
font-weight: 600;
user-select: none;
}
.organize-tag-header .tag-sort-select {
margin-left: auto;
padding: 1px 4px;
font-size: 0.65rem;
border-radius: 4px;
border: 1px solid var(--border, rgba(255,255,255,0.1));
background: var(--bg-input, rgba(255,255,255,0.04));
color: var(--text-muted);
cursor: pointer;
outline: none;
}
.organize-tag-header .tag-sort-select option {
background: var(--bg-secondary, #1e1e2e);
color: var(--text-primary, #eee);
}
.organize-item {
padding: 8px 12px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
border-bottom: 1px solid rgba(255,255,255,0.04);
transition: background 0.12s;
}
.organize-item:hover { background: rgba(255,255,255,0.04); }
.organize-item.selected { background: rgba(107,79,219,0.22); }
.organize-item .organize-tag-badge {
opacity: 0.45;
font-size: 0.72rem;
background: rgba(255,255,255,0.07);
padding: 1px 7px;
border-radius: 4px;
flex-shrink: 0;
white-space: nowrap;
}
.organize-controls {
display: flex;
gap: 6px;
align-items: center;
margin: 8px 0;
flex-wrap: wrap;
}
.organize-spacer { flex: 1; min-width: 8px; }
.organize-tag-group {
display: flex;
gap: 5px;
align-items: center;
}
.organize-tag-input {
width: 110px;
height: 30px;
font-size: 0.82rem;
padding: 4px 10px;
border-radius: var(--radius-sm, 6px);
border: 1px solid var(--border, rgba(255,255,255,0.12));
background: var(--bg-input, rgba(255,255,255,0.06));
color: var(--text-primary, #eee);
outline: none;
transition: border-color 0.15s;
}
.organize-tag-input:focus { border-color: var(--accent); }
.organize-tag-input::placeholder { color: var(--text-muted, #888); opacity: 0.5; }
.organize-tag-btn {
padding: 5px 8px !important;
font-size: 0.78rem !important;
}
.organize-tag-btn.danger { color: var(--danger, #ff4444) !important; }
/* ── Channel Roles Modal ─────────────────────── */
.channel-roles-layout {
display: flex;
gap: 16px;
max-height: 62vh;
min-height: 280px;
}
.channel-roles-left {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
overflow: hidden;
min-height: 0;
}
.channel-roles-right {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
overflow: hidden;
min-height: 0;
border-left: 1px solid var(--border, rgba(255,255,255,0.1));
padding-left: 16px;
}
.channel-roles-section-title {
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.6px;
color: var(--text-muted, #888);
margin: 0 0 6px;
font-weight: 600;
}
.channel-roles-member-list {
display: flex;
flex-direction: column;
gap: 2px;
overflow-y: auto;
flex: 1;
min-height: 0;
padding: 2px 0;
}
.channel-roles-member {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px 10px;
border-radius: var(--radius-sm, 6px);
cursor: pointer;
transition: background 0.12s;
user-select: none;
}
.channel-roles-member:hover { background: rgba(255,255,255,0.06); }
.channel-roles-member.selected { background: rgba(var(--accent-rgb, 88,101,242), 0.18); outline: 1px solid var(--accent); }
.channel-roles-member-avatar {
width: 28px;
height: 28px;
border-radius: 50%;
object-fit: cover;
background: var(--bg-floating, #333);
flex-shrink: 0;
margin-top: 2px;
}
.channel-roles-member-avatar.square { border-radius: 6px; }
.channel-roles-member-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.channel-roles-member-name {
font-size: 0.88rem;
font-weight: 500;
color: var(--text-primary, #eee);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.channel-roles-member-login {
font-size: 0.72rem;
color: var(--text-muted, #888);
}
.channel-roles-no-role {
font-size: 0.72rem;
color: var(--text-muted);
font-style: italic;
}
.channel-roles-member-badges {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 3px;
}
.channel-roles-badge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.7rem;
padding: 2px 8px;
border-radius: 9px;
background: rgba(255,255,255,0.08);
color: var(--text-primary, #eee);
white-space: nowrap;
position: relative;
}
.channel-roles-badge.badge-admin {
background: rgba(231,76,60,0.2);
color: #e74c3c;
}
.channel-roles-badge .badge-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex-shrink: 0;
}
.channel-roles-badge .badge-scope {
font-size: 0.6rem;
opacity: 0.6;
margin-left: 2px;
}
.channel-roles-badge .revoke-btn {
cursor: pointer;
opacity: 0;
margin-left: 4px;
font-size: 0.7rem;
transition: opacity 0.15s;
}
.channel-roles-badge:hover .revoke-btn { opacity: 0.6; }
.channel-roles-badge .revoke-btn:hover { opacity: 1; color: var(--danger, #ff4444); }
.channel-roles-actions {
border-top: 1px solid var(--border, rgba(255,255,255,0.1));
padding-top: 10px;
}
.channel-roles-selected-name {
font-size: 0.88rem;
margin: 0 0 6px;
color: var(--text-primary, #eee);
}
.channel-roles-current {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 8px;
min-height: 22px;
}
.channel-roles-assign-row {
display: flex;
gap: 6px;
align-items: center;
flex-wrap: wrap;
}
.channel-roles-assign-row .organize-select { flex: 1; min-width: 120px; }
.channel-roles-no-members {
text-align: center;
padding: 24px;
color: var(--text-muted, #888);
font-size: 0.88rem;
}
/* ── Channel Roles: Right panel (role config) ─── */
.channel-roles-role-list {
display: flex;
flex-direction: column;
gap: 2px;
overflow-y: auto;
max-height: 150px;
flex-shrink: 0;
padding: 2px 0;
}
.channel-roles-role-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 10px;
border-radius: var(--radius-sm, 6px);
cursor: pointer;
transition: background 0.12s;
user-select: none;
font-size: 0.84rem;
color: var(--text-primary, #eee);
}
.channel-roles-role-item:hover { background: rgba(255,255,255,0.06); }
.channel-roles-role-item.active {
background: rgba(var(--accent-rgb, 88,101,242), 0.18);
outline: 1px solid var(--accent);
}
.channel-roles-role-name { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.channel-roles-role-level {
font-size: 0.7rem;
color: var(--text-muted, #888);
flex-shrink: 0;
}
.channel-roles-role-detail {
margin-top: 8px;
border-top: 1px solid var(--border, rgba(255,255,255,0.1));
padding-top: 8px;
overflow-y: auto;
flex: 1;
min-height: 0;
}
.cr-role-form {
display: flex;
flex-direction: column;
gap: 4px;
}
.cr-role-label {
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted, #888);
font-weight: 600;
margin-bottom: 2px;
}
.cr-role-inline {
display: flex;
gap: 12px;
align-items: flex-end;
}
.cr-role-inline > div { display: flex; flex-direction: column; gap: 2px; }
.cr-role-perms {
display: flex;
flex-direction: column;
gap: 1px;
max-height: 180px;
overflow-y: auto;
padding: 2px 0;
}
.cr-perm-toggle {
display: flex;
align-items: center;
gap: 6px;
padding: 3px 4px;
font-size: 0.78rem;
color: var(--text-primary, #eee);
cursor: pointer;
border-radius: var(--radius-sm, 4px);
transition: background 0.1s;
}
.cr-perm-toggle:hover { background: rgba(255,255,255,0.05); }
.cr-perm-toggle input[type="checkbox"] {
accent-color: var(--accent);
width: 14px;
height: 14px;
cursor: pointer;
}
.cr-role-btns {
display: flex;
gap: 6px;
margin-top: 6px;
}
/* ── Channel Roles responsive ─────────────────── */
@media (max-width: 640px) {
.channel-roles-layout {
flex-direction: column;
max-height: 70vh;
}
.channel-roles-right {
border-left: none;
border-top: 1px solid var(--border, rgba(255,255,255,0.1));
padding-left: 0;
padding-top: 12px;
}
}
/* ── Assign Role Modal ───────────────────────────── */
.assign-role-field-label {
display: block;
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted, #888);
font-weight: 600;
margin-bottom: 4px;
}
.assign-role-hint {
font-size: 0.75rem;
color: var(--text-muted, #888);
margin: 0 0 6px;
opacity: 0.7;
line-height: 1.3;
}
.assign-role-select {
width: 100%;
padding: 8px 10px;
font-size: 0.88rem;
}
.assign-role-select option {
padding: 4px 8px;
}
/* ── Server Icon Upload (admin settings) ─────────── */
.server-icon-upload-area {
display: flex;
align-items: flex-start;
gap: 12px;
margin-top: 8px;
}
.server-icon-preview {
width: 52px;
height: 52px;
border-radius: 12px;
background: var(--bg-tertiary);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
border: 2px solid var(--border);
}
.server-icon-preview img {
width: 100%;
height: 100%;
object-fit: cover;
}
.server-icon-preview .server-icon-text {
font-size: 22px;
color: var(--accent);
}
.server-icon-upload-controls {
display: flex;
flex-direction: column;
gap: 2px;
}
.server-bar .server-icon.home img {
width: 100%;
height: 100%;
border-radius: inherit;
object-fit: cover;
}