@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500;600;700&display=swap'); :root { --vh: 1vh; --bg: #0a0a0a; --bg-panel: #111111; --bg-input: #0d0d0d; --border: #333; --border-light: #444; --text: #d0d0d0; --text-dim: #888; --text-muted: #555; --green: #55b87a; --amber: #ccaa44; --red: #cc5555; --cyan: #5fbfbf; --blue: #5599ff; --accent: #5599ff; --nick-self: #eeeeee; --nick-other: #ccaa44; --mono: 'IBM Plex Mono', 'Fira Code', 'SF Mono', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace; } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--mono); font-size: 13px; background: var(--bg); overflow: hidden; height: 100vh; height: calc(var(--vh, 1vh) * 100); font-weight: 400; color: var(--text); } /* === MAIN LAYOUT === */ .main-window { width: 100vw; height: 100vh; height: calc(var(--vh, 1vh) * 100); background: var(--bg); border: 1px solid var(--border); display: flex; flex-direction: column; } .titlebar { height: 32px; background: #151515; border-bottom: 1px solid var(--border); color: var(--accent); display: flex; align-items: center; padding: 0 12px; font-weight: 500; font-size: 12px; flex-shrink: 0; } .toolbar { height: 36px; background: #111; border-bottom: 1px solid var(--border); display: flex; align-items: center; padding: 0 8px; gap: 4px; flex-shrink: 0; } .toolbar-spacer { flex: 1; } .toolbar-btn { width: 28px; height: 28px; background: transparent; border: 1px solid var(--border); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.1s; } .toolbar-btn:hover { background: #222; border-color: var(--border-light); } .toolbar-btn:active { background: #333; } .toolbar-btn.active { background: #1a2a1a; border-color: var(--accent); } .toolbar-btn svg { width: 16px; height: 16px; fill: var(--text-dim); } .toolbar-btn:hover svg { fill: var(--text); } .toolbar-btn.active svg { fill: var(--accent); } /* === SIDEBAR === */ .sidebar { width: 240px; background: var(--bg-panel); border-right: 1px solid var(--border); display: flex; flex-direction: column; transition: transform 0.2s ease; z-index: 2000; } .sidebar.auto-hide { position: absolute; left: 0; top: 0; bottom: 0; transform: translateX(-232px); } .sidebar.auto-hide:hover { transform: translateX(0); } .sidebar.hidden { transform: translateX(-100%); } .sidebar-header { height: 32px; background: #151515; border-bottom: 1px solid var(--border); display: flex; align-items: center; padding: 0 12px; font-weight: 600; color: var(--accent); font-size: 11px; text-transform: uppercase; letter-spacing: 1px; flex-shrink: 0; } .sidebar-content { flex: 1; overflow-y: auto; padding: 4px 0; scrollbar-width: thin; scrollbar-color: #333 transparent; min-height: 0; } .sidebar-section { margin-bottom: 8px; } .sidebar-section-title { font-size: 10px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 1px; margin-bottom: 2px; padding: 4px 12px; } .sidebar-item { display: flex; align-items: center; padding: 4px 12px; margin: 0; cursor: pointer; transition: background 0.1s; font-size: 12px; color: var(--text-dim); position: relative; } .sidebar-item:hover { background: #1a1a1a; color: var(--text); } .sidebar-item.active { background: #1a2a1a; color: var(--accent); border-left: 2px solid var(--accent); } .sidebar-item.minimized { opacity: 0.5; border-left: 2px solid var(--amber); } .sidebar-item-icon { width: 16px; height: 16px; margin-right: 8px; display: flex; align-items: center; justify-content: center; } .sidebar-item-icon svg { width: 12px; height: 12px; fill: currentColor; } .sidebar-item-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sidebar-item-badge { background: var(--accent); color: #000; font-size: 10px; font-weight: 700; padding: 1px 5px; min-width: 14px; text-align: center; margin-left: auto; } .sidebar-item-badge.mention { background: var(--red); color: #fff; animation: blink-badge 1s infinite; } .sidebar-item-badge.activity { background: var(--blue); color: #fff; } @keyframes blink-badge { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } @keyframes pulse-badge { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } @keyframes pulse-mention { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .sidebar-item.has-activity { color: var(--cyan); border-left: 2px solid var(--cyan); } .sidebar-item.has-mentions { color: var(--red); border-left: 2px solid var(--red); animation: blink-badge 2s infinite; } @keyframes glow-mention { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } } .sidebar-item:hover .sidebar-item-badge { opacity: 1; } .sidebar-item.minimized .sidebar-item-badge { background: var(--amber); color: #000; } .sidebar-item.has-activity .sidebar-item-icon svg, .sidebar-item.has-mentions .sidebar-item-icon svg { fill: currentColor; } .sidebar-item.has-mentions .sidebar-item-text { color: var(--red); font-weight: 600; } .sidebar-item.has-activity .sidebar-item-text { color: var(--cyan); font-weight: 500; } .sidebar-controls { padding: 8px; border-top: 1px solid var(--border); display: flex; gap: 4px; flex-shrink: 0; } .sidebar-control-btn { flex: 1; padding: 4px 8px; background: transparent; border: 1px solid var(--border); color: var(--text-dim); font-size: 10px; font-family: var(--mono); cursor: pointer; transition: all 0.1s; } .sidebar-control-btn:hover { background: #1a1a1a; border-color: var(--border-light); color: var(--text); } .sidebar-control-btn.active { background: #1a2a1a; border-color: var(--accent); color: var(--accent); } /* === MAIN CONTENT / MDI === */ .main-content { flex: 1; position: relative; display: flex; overflow: hidden; min-height: 0; } .mdi-container { flex: 1; position: relative; background: #0d0d0d; overflow: hidden; min-height: 0; } /* === CHAT WINDOWS === */ .chat-window { position: absolute; min-width: 400px; min-height: 300px; background: var(--bg); border: 1px solid var(--border); display: flex; flex-direction: column; resize: none; overflow: hidden; transition: border-color 0.1s; animation: fadeIn 0.1s ease; } .chat-window.dragging { transition: none; will-change: transform; cursor: grabbing; } .chat-window.active { z-index: 1000; border-color: var(--accent); } .chat-window.minimizing { transition: transform 0.2s ease, opacity 0.2s ease; pointer-events: none; } .chat-window.minimized { height: 32px !important; min-height: 32px; resize: none; } .window-titlebar { height: 28px; background: #151515; border-bottom: 1px solid var(--border); display: flex; align-items: center; padding: 0 8px; cursor: move; user-select: none; font-size: 12px; font-weight: 500; color: var(--text-dim); flex-shrink: 0; } .chat-window.active .window-titlebar { background: #1a1a1a; color: var(--accent); } .chat-window.minimized .window-titlebar { border-bottom: none; } .window-title { flex: 1; font-size: 12px; font-weight: 500; } .window-controls { display: flex; gap: 2px; } .window-control { width: 22px; height: 22px; background: transparent; border: 1px solid transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.1s; } .window-control:hover { background: #222; border-color: var(--border); } .window-control.close:hover { background: #441111; border-color: var(--red); } .window-control.minimize:hover { background: #2a2200; border-color: var(--amber); } .window-control.maximize:hover { background: #112211; border-color: var(--accent); } .window-control svg { width: 10px; height: 10px; fill: var(--text-muted); } .window-control.close:hover svg { fill: var(--red); } .window-control.minimize:hover svg { fill: var(--amber); } .window-control.maximize:hover svg { fill: var(--accent); } .window-content { flex: 1; display: flex; min-height: 0; } .chat-window.minimized .window-content { display: none; } /* === CHAT MAIN === */ .chat-main { flex: 1; display: flex; flex-direction: column; border-right: 1px solid var(--border); min-height: 0; } .messages-area { flex: 1; background: var(--bg); border: none; margin: 0; padding: 4px 8px; overflow-y: auto; font-family: var(--mono); font-size: 13px; line-height: 1.3; contain: content; content-visibility: auto; contain-intrinsic-size: auto 500px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; position: relative; min-height: 0; } .input-area { height: 36px; margin: 0; padding: 0 4px 4px 4px; display: flex; gap: 4px; align-items: center; flex-shrink: 0; } .message-input { flex: 1; border: none; border-bottom: 1px solid var(--border); padding: 6px 8px; font-family: var(--mono); font-size: 13px; background: transparent; transition: border-color 0.1s; color: var(--text); } .message-input:focus { outline: none; border-bottom-color: var(--accent); } .message-input::placeholder { color: var(--text-muted); } .send-btn { width: 28px; height: 28px; margin-right: 4px; border: 1px solid var(--border); background: transparent; color: var(--accent); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all 0.1s; flex-shrink: 0; } .send-btn:hover { background: #1a2a1a; border-color: var(--accent); } .send-btn:active { background: #0a1a0a; } .send-btn svg { width: 14px; height: 14px; fill: var(--accent); } /* === NICK LIST === */ .nicklist { width: 140px; background: var(--bg-panel); margin: 0; padding: 4px 0; overflow-y: auto; overflow-x: hidden; font-family: var(--mono); font-size: 12px; scrollbar-width: thin; scrollbar-color: #333 transparent; min-height: 0; } .nick-item { padding: 2px 8px; cursor: pointer; white-space: nowrap; transition: background 0.1s; color: var(--text-dim); } .nick-item:hover { background: #1a1a1a; color: var(--text); } .nick-op { color: var(--green); font-weight: 600; } .nick-voice { color: var(--blue); font-weight: 500; } .nick-halfop { color: var(--amber); font-weight: 500; } .nick-owner { color: #ff55ff; font-weight: 700; } .nick-admin { color: var(--red); font-weight: 600; } .nick-away { opacity: 0.5; font-style: italic; } /* === CHANNEL LIST === */ .list-content { flex-direction: column; } .list-header { display: flex; padding: 4px 8px; background: #151515; border-bottom: 1px solid var(--border); font-family: var(--mono); font-size: 11px; flex-shrink: 0; } .list-header-item { padding: 4px 8px; color: var(--accent); } .list-header-item.sortable { cursor: pointer; user-select: none; transition: color 0.1s; position: relative; display: flex; align-items: center; } .list-header-item.sortable:hover { color: var(--cyan); } .list-header-item.sortable::after { content: ''; margin-left: 6px; border: 4px solid transparent; border-top: 4px solid var(--text-muted); } .list-header-item.sort-asc::after { border-top: 4px solid var(--accent); border-bottom: none; } .list-header-item.sort-desc::after { border-bottom: 4px solid var(--accent); border-top: none; } .list-area { flex: 1; background: var(--bg); margin: 0; overflow-y: auto; overflow-x: hidden; font-family: var(--mono); font-size: 12px; scrollbar-width: thin; scrollbar-color: #333 transparent; min-height: 0; } .list-entry { display: flex; padding: 2px 8px; border-bottom: 1px solid #1a1a1a; cursor: pointer; transition: background 0.1s; } .list-entry:hover { background: #1a1a1a; } .list-entry-item { padding: 2px 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); } .list-entry-channel { font-weight: bold; color: var(--cyan); } .list-entry-users { text-align: center; color: var(--text-dim); font-weight: 600; } .list-entry-topic { color: var(--text-dim); } .list-status { height: 24px; background: #151515; margin: 0; border-top: 1px solid var(--border); display: flex; align-items: center; padding: 0 8px; font-size: 11px; color: var(--text-dim); flex-shrink: 0; } /* === MESSAGES === */ .message { margin: 0; padding: 1px 4px; transition: background 0.1s; color: var(--text); white-space: pre-wrap; word-wrap: break-word; font-family: inherit; animation: fadeIn 0.05s ease; } .message:hover { background: #111; } .message .timestamp { color: var(--text-muted); font-size: 11px; font-weight: 400; white-space: nowrap; } .message .nick { font-weight: 600; color: var(--cyan); white-space: nowrap; } .message.action { color: #cc88ff; font-style: italic; } .message.system { color: var(--accent); font-weight: 400; white-space: pre-wrap; font-family: var(--mono); } .message.error { color: var(--red); font-weight: 500; } .message.warning { color: var(--amber); font-weight: 500; } .message.join { color: var(--accent); } .message.part { color: var(--amber); } .message.quit { color: var(--red); } .message.server-time { position: relative; } .message.server-time::before { content: "*"; position: absolute; left: -10px; color: #555; font-size: 10px; } /* === CONNECT DIALOG === */ .connect-dialog { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 420px; background: var(--bg); border: 1px solid var(--border); z-index: 2000; } .dialog-titlebar { height: 32px; background: #151515; border-bottom: 1px solid var(--border); color: var(--accent); display: flex; align-items: center; padding: 0 12px; font-size: 13px; font-weight: 600; flex-shrink: 0; } .dialog-content { padding: 16px; } .form-group { margin-bottom: 12px; } .form-label { display: block; margin-bottom: 4px; font-size: 11px; font-weight: 500; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px; } .form-input, .form-select { width: 100%; border: none; border-bottom: 1px solid var(--border); padding: 8px 4px; font-size: 13px; font-family: var(--mono); background: transparent; transition: border-color 0.1s; color: var(--text); } .form-input:focus, .form-select:focus { outline: none; border-bottom-color: var(--accent); } .form-input::placeholder { color: var(--text-muted); } .form-select { background: var(--bg); } .form-select option { background: var(--bg-panel); color: var(--text); } .form-textarea { width: 100%; height: 80px; border: 1px solid var(--border); padding: 8px; font-size: 11px; background: var(--bg); transition: border-color 0.1s; color: var(--text); font-family: var(--mono); resize: vertical; } .form-textarea:focus { outline: none; border-color: var(--accent); } .dialog-buttons { display: flex; gap: 8px; justify-content: flex-end; margin-top: 16px; } .dialog-btn { padding: 8px 16px; border: 1px solid var(--border); cursor: pointer; font-size: 12px; font-weight: 500; font-family: var(--mono); transition: all 0.1s; background: transparent; color: var(--text); } .dialog-btn.primary { background: #1a2a1a; border-color: var(--accent); color: var(--accent); } .dialog-btn.primary:hover { background: #224422; } .dialog-btn.secondary { background: transparent; color: var(--text-dim); } .dialog-btn.secondary:hover { background: #1a1a1a; color: var(--text); } /* === STATUS BAR === */ .status-bar { height: 22px; background: #111; border-top: 1px solid var(--border); display: flex; align-items: center; padding: 0 8px; font-size: 11px; color: var(--text-dim); font-weight: 400; flex-shrink: 0; } .status-indicator { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--red); margin-right: 6px; animation: pulse 2s infinite; } .status-indicator.connecting { background: var(--amber); } .status-indicator.connected { background: var(--green); animation: none; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } .status-bar-spacer { flex: 1; } .status-bar-links { display: flex; align-items: center; gap: 4px; font-size: 10px; } .status-bar-link { color: var(--text-muted); text-decoration: none; padding: 1px 4px; transition: color 0.1s; font-weight: 400; font-size: 10px; } .status-bar-link:hover { color: var(--cyan); text-decoration: underline; } .status-bar-separator { color: var(--border); font-size: 10px; margin: 0 2px; } /* === SCRIPT EDITOR === */ .script-editor { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 900px; height: 600px; background: var(--bg); border: 1px solid var(--border); z-index: 2500; display: flex; flex-direction: column; } .script-tabs { display: flex; background: #111; border-bottom: 1px solid var(--border); flex-shrink: 0; } .script-tab { padding: 8px 16px; cursor: pointer; color: var(--text-dim); font-size: 12px; font-weight: 500; font-family: var(--mono); transition: all 0.1s; border-bottom: 2px solid transparent; } .script-tab:first-child { } .script-tab.active { color: var(--accent); border-bottom-color: var(--accent); background: #0a1a0a; } .script-tab:hover { background: #1a1a1a; color: var(--text); } .script-content { flex: 1; display: flex; flex-direction: column; padding: 12px; overflow: hidden; min-height: 0; } .script-toolbar { display: flex; gap: 4px; margin-bottom: 8px; flex-shrink: 0; } .script-btn { padding: 6px 12px; border: 1px solid var(--border); background: transparent; color: var(--text-dim); cursor: pointer; font-size: 11px; font-weight: 500; font-family: var(--mono); transition: all 0.1s; } .script-btn:hover { background: #1a1a1a; border-color: var(--border-light); color: var(--text); } .script-btn.primary { background: #1a2a1a; border-color: var(--accent); color: var(--accent); } .script-btn.danger { background: #2a1111; border-color: var(--red); color: var(--red); } .script-editor-area { flex: 1; width: 100%; background: var(--bg); border: 1px solid var(--border); padding: 8px; font-family: var(--mono); font-size: 13px; color: var(--text); resize: vertical; outline: none; line-height: 1.5; min-height: 400px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: #333 transparent; } .script-editor-area:focus { border-color: var(--accent); } .script-tab-content { display: flex; flex-direction: column; height: 100%; min-height: 0; } .script-tab-content.hidden { display: none !important; } .variables-grid { display: grid; grid-template-columns: 1fr 2fr auto; gap: 4px; align-items: center; margin-bottom: 4px; padding: 4px 8px; background: #111; flex-shrink: 0; } .var-input { background: var(--bg); border: 1px solid var(--border); padding: 4px 6px; color: var(--text); font-size: 12px; font-family: var(--mono); } .var-input:focus { outline: none; border-color: var(--accent); } #variablesTab .script-toolbar { margin-bottom: 8px; } #variablesTab .variables-grid { margin-bottom: 8px; } #variablesTab #variablesEditor { min-height: 300px; } /* === CONTEXT MENU === */ .context-menu { position: fixed; background: var(--bg); border: 1px solid var(--border); padding: 4px 0; z-index: 3000; min-width: 150px; } .context-menu-item { padding: 6px 12px; color: var(--text); cursor: pointer; font-size: 12px; font-family: var(--mono); transition: background 0.1s; } .context-menu-item:hover { background: #1a2a1a; color: var(--accent); } .context-menu-separator { height: 1px; background: var(--border); margin: 4px 0; } /* === UTILITY === */ .hidden { display: none !important; } /* === SCROLLBARS === */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: #333; } ::-webkit-scrollbar-thumb:hover { background: #444; } * { scrollbar-width: thin; scrollbar-color: #333 transparent; } /* === NOTIFICATIONS / INDICATORS === */ .reconnect-indicator { position: fixed; top: 8px; right: 8px; background: var(--amber); color: #000; padding: 6px 12px; font-size: 12px; font-weight: 600; font-family: var(--mono); z-index: 3000; animation: fadeIn 0.2s ease; } @keyframes slideInRight { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .ircv3-indicator { position: fixed; top: 8px; left: 8px; background: #1a1a2a; border: 1px solid #5555aa; color: #aaaaff; padding: 4px 10px; font-size: 10px; font-weight: 600; font-family: var(--mono); z-index: 3000; cursor: pointer; transition: all 0.1s; } .ircv3-indicator:hover { background: #2a2a3a; color: #ccccff; } .ircv3-indicator.hidden { opacity: 0; transform: translateY(-10px); } .away-notification { position: fixed; bottom: 8px; right: 8px; background: var(--amber); color: #000; padding: 6px 12px; font-size: 12px; font-weight: 600; font-family: var(--mono); z-index: 3000; animation: fadeIn 0.2s ease; } .account-notification { position: fixed; bottom: 40px; right: 8px; background: #112211; border: 1px solid var(--accent); color: var(--accent); padding: 6px 12px; font-size: 12px; font-weight: 600; font-family: var(--mono); z-index: 3000; animation: fadeIn 0.2s ease; } /* === IRCv3 / NICK FEATURES === */ .message[data-account] .nick::after { content: " +"; color: var(--accent); font-size: 10px; } .message.authenticated .nick { color: var(--accent); } .message.away .nick { opacity: 0.5; font-style: italic; } .message.server-time .timestamp { position: relative; cursor: help; } .message.server-time .timestamp:hover::after { content: "server time"; position: absolute; bottom: 16px; left: 0; background: #222; color: var(--text); padding: 2px 6px; border: 1px solid var(--border); font-size: 10px; white-space: nowrap; z-index: 1000; } .nick-multi-prefix { font-weight: 700; color: var(--amber); } .nick-item[data-account]::after { content: " +"; color: var(--accent); font-size: 10px; font-weight: bold; } .nick-item.has-account { border-left: 2px solid var(--accent); padding-left: 6px; } .capability-badge { display: inline-block; background: #1a1a2a; color: #aaaaff; padding: 1px 4px; font-size: 9px; font-weight: 600; font-family: var(--mono); margin-left: 4px; border: 1px solid #444466; } .message.has-tags::before { content: "#"; position: absolute; right: 4px; top: 50%; transform: translateY(-50%); font-size: 10px; color: var(--text-muted); opacity: 0.5; cursor: pointer; } .message.has-tags:hover::before { opacity: 1; } .join-info { font-size: 10px; color: var(--text-muted); margin-left: 8px; } .nick-item.multi-prefix .prefix { color: var(--amber); font-weight: 900; } .timestamp.server-time { color: #8888cc; font-style: italic; } .timestamp.local-time { color: var(--text-muted); } .ircv3-features { display: flex; gap: 4px; margin-left: 8px; } .ircv3-feature { background: #1a1a2a; color: #aaaaff; padding: 1px 4px; font-size: 9px; font-weight: 600; font-family: var(--mono); text-transform: uppercase; border: 1px solid #444466; } /* === MOBILE === */ .mobile-only { display: none; } .mobile-hide { display: flex; } .mobile-menu-btn { display: none; background: none; border: none; color: var(--text); padding: 4px; cursor: pointer; transition: color 0.1s; } .mobile-menu-btn:hover { color: var(--accent); } .mobile-menu-btn svg { width: 20px; height: 20px; } .titlebar-text { flex: 1; display: flex; align-items: center; gap: 8px; } .titlebar-logo { width: 18px; height: auto; } .sidebar-title { flex: 1; } .sidebar-close { display: none; background: none; border: none; color: var(--text-dim); font-size: 18px; cursor: pointer; width: 24px; height: 24px; transition: color 0.1s; } .sidebar-close:hover { color: var(--text); } .sidebar-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 1999; pointer-events: none; } .mobile-nicklist-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.9); z-index: 5000; display: flex; align-items: center; justify-content: center; animation: fadeIn 0.2s ease; } .mobile-nicklist-content { width: 90%; max-width: 400px; max-height: 80%; background: var(--bg); border: 1px solid var(--border); overflow: hidden; animation: fadeIn 0.2s ease; display: flex; flex-direction: column; } .mobile-nicklist-header { padding: 12px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; } .mobile-nicklist-title { font-size: 14px; font-weight: 600; color: var(--accent); } .mobile-nicklist-close { background: none; border: none; color: var(--text-dim); font-size: 18px; cursor: pointer; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: color 0.1s; } .mobile-nicklist-close:hover { color: var(--text); } .mobile-nicklist-body { padding: 8px; overflow-y: auto; -webkit-overflow-scrolling: touch; flex: 1; min-height: 0; } .mobile-nicklist-body .nick-item { padding: 10px 12px; margin: 2px 0; cursor: pointer; transition: background 0.1s; font-size: 13px; min-height: 44px; display: flex; align-items: center; border-bottom: 1px solid #1a1a1a; } .mobile-nicklist-body .nick-item:hover { background: #1a1a1a; } .mobile-users-btn { background: transparent; border: 1px solid var(--border); color: var(--text-dim); padding: 4px 8px; font-size: 11px; font-family: var(--mono); cursor: pointer; margin-right: 8px; transition: all 0.1s; display: flex; align-items: center; gap: 4px; } .mobile-users-btn:hover { background: #1a1a1a; border-color: var(--border-light); color: var(--text); } .mobile-users-btn svg { width: 12px; height: 12px; } .touch-tooltip { position: fixed; background: #222; border: 1px solid var(--border); color: var(--text); padding: 4px 8px; font-size: 12px; font-family: var(--mono); z-index: 6000; pointer-events: none; opacity: 0; transition: opacity 0.1s; max-width: 250px; word-wrap: break-word; text-align: center; } .touch-tooltip.visible { opacity: 1; } /* === CLICKABLE ELEMENTS === */ .clickable-url { color: var(--cyan) !important; text-decoration: underline; cursor: pointer; transition: color 0.1s; } .clickable-url:hover { color: #44eeff !important; } .clickable-channel { color: var(--accent) !important; cursor: pointer; font-weight: 600; transition: color 0.1s; } .clickable-channel:hover { color: #44ff66 !important; text-decoration: underline; } .clickable-channel:active { color: #88ff88 !important; } .message.system .clickable-url, .message.action .clickable-url { color: var(--cyan) !important; } .message.system .clickable-channel, .message.action .clickable-channel { color: var(--accent) !important; } /* === SETTINGS DIALOG === */ .settings-dialog { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 480px; background: var(--bg); border: 1px solid var(--border); z-index: 2000; } .settings-section { margin-bottom: 20px; } .settings-section h3 { color: var(--accent); font-size: 13px; font-weight: 600; margin-bottom: 12px; padding-bottom: 4px; border-bottom: 1px solid var(--border); text-transform: uppercase; letter-spacing: 0.5px; } .setting-item { margin-bottom: 16px; } .setting-label { display: flex; align-items: center; cursor: pointer; user-select: none; margin-bottom: 4px; } .setting-checkbox { width: 16px; height: 16px; margin-right: 10px; accent-color: var(--accent); cursor: pointer; } .setting-text { color: var(--text); font-size: 13px; font-weight: 500; } .setting-description { color: var(--text-muted); font-size: 11px; margin: 0; padding-left: 26px; line-height: 1.4; } .setting-btn { padding: 6px 12px; border: 1px solid var(--border); background: transparent; color: var(--text-dim); cursor: pointer; font-size: 11px; font-weight: 500; font-family: var(--mono); transition: all 0.1s; margin-right: 8px; } .setting-btn:hover { background: #1a1a1a; border-color: var(--border-light); color: var(--text); } .setting-slider { width: 100%; height: 4px; background: #222; outline: none; -webkit-appearance: none; appearance: none; } .setting-slider::-webkit-slider-thumb { appearance: none; width: 14px; height: 14px; background: var(--accent); cursor: pointer; } .setting-slider::-moz-range-thumb { width: 14px; height: 14px; background: var(--accent); cursor: pointer; border: none; } /* === NOTIFICATION BANNER === */ .notification-banner { position: fixed; top: 0; left: 0; right: 0; background: #1a2a1a; border-bottom: 1px solid var(--accent); color: var(--accent); padding: 8px 16px; z-index: 3000; display: flex; align-items: center; justify-content: space-between; animation: slideDown 0.2s ease; } .notification-banner-text { flex: 1; font-size: 13px; font-weight: 500; } .notification-banner-buttons { display: flex; gap: 8px; } .notification-banner-btn { padding: 4px 10px; border: 1px solid var(--accent); background: transparent; color: var(--accent); cursor: pointer; font-size: 11px; font-weight: 600; font-family: var(--mono); transition: all 0.1s; } .notification-banner-btn:hover { background: #224422; } .notification-banner-btn.primary { background: var(--accent); color: #000; } .notification-banner-btn.primary:hover { background: #33ff55; } /* === IRC COLORS === */ .irc-color-0 { color: #ffffff; } .irc-color-1 { color: #000000; } .irc-color-2 { color: #000080; } .irc-color-3 { color: #008000; } .irc-color-4 { color: #ff0000; } .irc-color-5 { color: #800040; } .irc-color-6 { color: #800080; } .irc-color-7 { color: #ff8000; } .irc-color-8 { color: #ffff00; } .irc-color-9 { color: #80ff00; } .irc-color-10 { color: #008080; } .irc-color-11 { color: #00ffff; } .irc-color-12 { color: #0080ff; } .irc-color-13 { color: #ff00ff; } .irc-color-14 { color: #808080; } .irc-color-15 { color: #c0c0c0; } .irc-bg-color-0 { background-color: #ffffff; } .irc-bg-color-1 { background-color: #000000; } .irc-bg-color-2 { background-color: #000080; } .irc-bg-color-3 { background-color: #008000; } .irc-bg-color-4 { background-color: #ff0000; } .irc-bg-color-5 { background-color: #800040; } .irc-bg-color-6 { background-color: #800080; } .irc-bg-color-7 { background-color: #ff8000; } .irc-bg-color-8 { background-color: #ffff00; } .irc-bg-color-9 { background-color: #80ff00; } .irc-bg-color-10 { background-color: #008080; } .irc-bg-color-11 { background-color: #00ffff; } .irc-bg-color-12 { background-color: #0080ff; } .irc-bg-color-13 { background-color: #ff00ff; } .irc-bg-color-14 { background-color: #808080; } .irc-bg-color-15 { background-color: #c0c0c0; } .irc-bold { font-weight: bold; } .irc-italic { font-style: italic; } .irc-underline { text-decoration: underline; } .irc-reverse { filter: invert(1); padding: 0 2px; } .irc-bg-color-1 { color: #ffffff; } .irc-bg-color-2 { color: #ffffff; } .irc-bg-color-3 { color: #ffffff; } .irc-bg-color-4 { color: #ffffff; } .irc-bg-color-5 { color: #ffffff; } .irc-bg-color-6 { color: #ffffff; } /* === KEYFRAMES === */ @keyframes slideDown { from { transform: translateY(-100%); } to { transform: translateY(0); } } /* === COLOR CODE HELPER === */ .color-code-helper { background: var(--bg); border: 1px solid var(--border); padding: 12px; max-width: 400px; font-size: 12px; } .color-helper-title { color: var(--accent); font-weight: 600; margin-bottom: 8px; text-align: center; } .color-helper-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; margin-bottom: 8px; } .color-item { padding: 4px 6px; cursor: pointer; font-size: 10px; font-weight: 500; text-align: center; border: 1px solid var(--border); transition: border-color 0.1s; } .color-item:hover { border-color: var(--text); } .color-helper-instructions { color: var(--text-dim); font-size: 10px; text-align: center; line-height: 1.4; } .color-helper-instructions code { background: #1a1a1a; color: var(--accent); padding: 1px 3px; font-family: var(--mono); } /* === MOBILE RESPONSIVE: 768px === */ @media screen and (max-width: 768px) { body { height: calc(var(--vh, 1vh) * 100); overflow: hidden; } .main-window { height: calc(var(--vh, 1vh) * 100); } .mobile-only { display: block; } .mobile-hide { display: none !important; } .mobile-menu-btn { display: flex; } .mobile-users-btn { display: flex; } .titlebar { padding: 0 12px; height: 40px; font-size: 14px; } .toolbar { height: 44px; padding: 0 8px; gap: 4px; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none; } .toolbar::-webkit-scrollbar { display: none; } .toolbar-btn { min-width: 44px; height: 44px; flex-shrink: 0; } .main-content { flex: 1; min-height: 0; } .sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: 280px; transform: translateX(-100%); z-index: 2001; transition: transform 0.2s ease; pointer-events: auto; height: calc(var(--vh, 1vh) * 100); } .sidebar.mobile-open { transform: translateX(0); pointer-events: auto; } .sidebar-overlay { display: none; pointer-events: none; } .sidebar-overlay.mobile-open { display: none; pointer-events: none; z-index: 2000; } .sidebar * { pointer-events: auto; position: relative; z-index: 2002; } .sidebar-header { height: 48px; padding: 0 16px; font-size: 14px; } .sidebar-close { display: flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; } .sidebar-item { padding: 10px 16px; min-height: 44px; font-size: 13px; } .sidebar-control-btn { min-height: 44px; font-size: 12px; } .mdi-container { flex: 1; min-height: 0; overflow: hidden; } .chat-window { position: relative !important; width: 100% !important; height: 100% !important; min-width: auto !important; min-height: auto !important; top: 0 !important; left: 0 !important; resize: none !important; display: flex; flex-direction: column; overflow: hidden; border: none; } .chat-window .window-titlebar { height: 44px; padding: 0 12px; font-size: 14px; } .window-control { width: 44px; height: 44px; } .window-control svg { width: 14px; height: 14px; } .nicklist { display: none; } .window-content { flex: 1; flex-direction: column; min-height: 0; overflow: hidden; } .chat-main { border-right: none; flex: 1; min-height: 0; } .messages-area { margin: 0; padding: 8px; font-size: 13px; line-height: 1.4; -webkit-overflow-scrolling: touch; flex: 1; min-height: 0; } .input-area { height: 52px; margin: 0; padding: 4px 8px; } .message-input { font-size: 16px; padding: 10px 8px; min-height: 44px; border-bottom: 1px solid var(--border); } .send-btn { width: 44px; height: 44px; } .send-btn svg { width: 18px; height: 18px; } .message { padding: 4px 8px; margin: 2px 0; font-size: 13px; line-height: 1.4; } .message .timestamp { font-size: 11px; } .connect-dialog, .script-editor { width: 95vw !important; height: 80vh !important; height: calc(var(--vh, 1vh) * 80) !important; margin-top: 2vh auto !important; max-height: calc(var(--vh, 1vh) * 80); overflow-y: auto; } .dialog-content { padding: 12px; } .script-content { padding: 8px; } .form-input, .form-select { font-size: 16px; padding: 12px 4px; min-height: 44px; } .dialog-btn { min-height: 44px; font-size: 13px; flex: 1; min-width: 100px; } .dialog-buttons { flex-direction: column; gap: 8px; } .script-tab { padding: 12px 16px; font-size: 13px; min-height: 44px; } .script-btn { min-height: 44px; padding: 10px 14px; font-size: 12px; } .script-toolbar { gap: 4px; flex-wrap: wrap; } .script-editor-area { font-size: 13px; padding: 8px; min-height: 250px; } .variables-grid { grid-template-columns: 1fr; gap: 8px; } .var-input { min-height: 44px; padding: 10px 8px; font-size: 13px; } .status-bar { height: 24px; font-size: 11px; padding: 0 8px; } .context-menu-item { padding: 12px 16px; font-size: 13px; min-height: 44px; } .list-header { font-size: 11px; padding: 4px 8px; } .list-entry { padding: 6px 4px; font-size: 12px; } .list-entry-item { padding: 4px 6px; } .settings-dialog { width: 95vw !important; height: auto; max-height: calc(var(--vh, 1vh) * 95); overflow-y: auto; } .setting-item { margin-bottom: 20px; } .setting-checkbox { width: 20px; height: 20px; } .setting-btn { min-height: 44px; padding: 10px 14px; font-size: 13px; } .status-bar-links { font-size: 10px; gap: 4px; } .status-bar-link { padding: 2px 4px; font-size: 10px; } .status-bar-separator { margin: 0 1px; } button, input, select, textarea, .toolbar-btn, .window-control, .sidebar-item, .nick-item, .script-btn, .dialog-btn, .context-menu-item { min-height: 44px; min-width: 44px; } input[type="text"], input[type="password"], textarea, select { min-width: auto; } } /* === MOBILE RESPONSIVE: 480px === */ @media screen and (max-width: 480px) { body { font-size: 13px; height: calc(var(--vh, 1vh) * 100); } .main-window { height: calc(var(--vh, 1vh) * 100); } .titlebar { font-size: 13px; } .sidebar { width: 260px; height: calc(var(--vh, 1vh) * 100); } .toolbar { gap: 4px; } .dialog-content { padding: 8px; } .script-content { padding: 8px; } .connect-dialog, .script-editor { height: calc(var(--vh, 1vh) * 98) !important; max-height: calc(var(--vh, 1vh) * 98); } } /* === TOUCH DEVICES === */ @media (hover: none) and (pointer: coarse) { .toolbar-btn:hover, .window-control:hover, .sidebar-item:hover, .nick-item:hover, .message:hover, .script-btn:hover, .dialog-btn:hover, .context-menu-item:hover { transform: none; background: transparent; } .toolbar-btn:active, .window-control:active, .sidebar-item:active, .nick-item:active, .script-btn:active, .dialog-btn:active { background: #222; } } /* === REDUCED MOTION === */ @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }