mirror of
https://github.com/ancsemi/Haven
synced 2026-04-21 13:37:41 +00:00
10316 lines
283 KiB
CSS
10316 lines
283 KiB
CSS
/* ═══════════════════════════════════════════════════════════
|
||
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;
|
||
}
|
||
|
||
|