*,*:before,*:after{box-sizing:border-box}:root{--bg-primary: #ffffff;--bg-secondary: #fafafa;--bg-tertiary: #f0f0f0;--bg-hover: #f5f5f5;--bg-disabled: #eeeeee;--text-primary: #000000;--text-secondary: #333333;--text-muted: #666666;--text-hint: #999999;--border-primary: #000000;--border-secondary: #dddddd;--accent-primary: #000000;--accent-hover: #333333;--status-online-bg: #e6ffe6;--status-online-text: #006600;--status-offline-bg: #ffe6e6;--status-offline-text: #660000;--error-text: #cc0000;--danger-bg: #ff4444;--danger-hover: #cc0000;--danger-active: #990000;--overlay-bg: rgba(0, 0, 0, .5);--scrollbar-track: #f1f1f1;--scrollbar-thumb: #888888;--scrollbar-thumb-hover: #555555}[data-theme=dark]{--bg-primary: #1a1a1a;--bg-secondary: #2d2d2d;--bg-tertiary: #3d3d3d;--bg-hover: #404040;--bg-disabled: #333333;--text-primary: #e0e0e0;--text-secondary: #cccccc;--text-muted: #999999;--text-hint: #777777;--border-primary: #555555;--border-secondary: #444444;--accent-primary: #4a9eff;--accent-hover: #6ab0ff;--status-online-bg: #1a3d1a;--status-online-text: #66ff66;--status-offline-bg: #3d1a1a;--status-offline-text: #ff6666;--error-text: #ff6666;--danger-bg: #cc3333;--danger-hover: #aa2222;--danger-active: #881111;--overlay-bg: rgba(0, 0, 0, .7);--scrollbar-track: #2d2d2d;--scrollbar-thumb: #555555;--scrollbar-thumb-hover: #777777}html{line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;min-height:100vh;background:var(--bg-primary);color:var(--text-primary);transition:background .3s ease,color .3s ease}img,picture,video,canvas,svg{display:block;max-width:100%}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}button{background:none;border:none;cursor:pointer}input{border:none;outline:none}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}.user-table-container{padding:10px;height:100%;display:flex;flex-direction:column;min-height:0;overflow:hidden}.table-header{display:flex;justify-content:space-between;align-items:center;gap:10px;border-bottom:1px solid var(--border-primary);padding-bottom:8px;margin-bottom:8px;flex-shrink:0}.table-header h2{font-size:.9rem;font-weight:600;margin:0;white-space:nowrap;color:var(--text-primary)}.filter-input{padding:4px 8px;border:1px solid var(--border-primary);font-size:12px;width:140px;background:var(--bg-primary);color:var(--text-primary)}.filter-input:focus{outline:none;box-shadow:0 0 0 1px var(--accent-primary)}.table-wrapper{flex:1;overflow:auto;min-height:0}.user-table{width:100%;border-collapse:collapse;font-size:12px}.user-table th{padding:6px;text-align:left;border-bottom:2px solid var(--border-primary);font-weight:600;cursor:pointer;white-space:nowrap;position:sticky;top:0;background:var(--bg-primary);color:var(--text-primary)}.user-table th:hover{background:var(--bg-tertiary)}.user-table td{padding:6px;border-bottom:1px solid var(--border-secondary);color:var(--text-primary)}.user-table tbody tr:hover{background:var(--bg-hover)}.username-cell{display:flex;flex-direction:column;font-weight:500}.username-name{font-weight:600}.username-ip{font-size:10px;color:#00e5ff;margin-top:2px;font-weight:600;font-family:Consolas,Monaco,monospace;letter-spacing:.3px;background:#00e5ff1a;padding:1px 5px;border-radius:3px;border:1px solid rgba(0,229,255,.25);width:fit-content}.room-cell{font-family:monospace;color:var(--text-secondary)}.status-badge{display:inline-block;padding:2px 6px;border-radius:3px;font-size:11px}.status-badge.online{background:var(--status-online-bg);color:var(--status-online-text)}.status-badge.offline{background:var(--status-offline-bg);color:var(--status-offline-text)}.lastseen-cell{color:var(--text-muted);font-size:11px}.route-cell{color:var(--text-secondary);font-family:monospace;font-size:11px}.empty-row{text-align:center;padding:20px!important;color:var(--text-hint)}.avatar-cell{display:flex;align-items:center;justify-content:center;width:36px;height:36px}.user-avatar{width:32px;height:32px;border-radius:50%;object-fit:cover;border:2px solid var(--border-secondary);background:var(--bg-tertiary)}.logout-btn{padding:4px 8px;font-size:11px;background:var(--danger-bg);color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background .2s;white-space:nowrap}.logout-btn:hover{background:var(--danger-hover)}.logout-btn:active{background:var(--danger-active)}.chat-panel{display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden;font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Courier New,monospace}.chat-log{flex:1;overflow-y:auto;padding:10px;font-family:inherit;font-size:12px;white-space:pre-wrap;word-wrap:break-word;background:var(--bg-secondary);color:var(--text-primary);min-height:0}.message{margin-bottom:8px;line-height:1.3}.message-header{display:flex;flex-direction:column}.message-user{font-weight:700;color:var(--accent-primary, #4fc3f7)}.message-ip{font-size:10px;color:#00e5ff;font-weight:600;font-family:Consolas,Monaco,monospace;letter-spacing:.3px;background:#00e5ff1a;padding:1px 5px;border-radius:3px;border:1px solid rgba(0,229,255,.25);margin-top:2px;width:fit-content}.message-text{display:block;margin-top:2px}.message-system{color:var(--text-muted, #999);font-style:italic}.message-time{color:var(--text-hint);font-size:10px;margin-left:6px}.typing-indicator{color:var(--text-muted);font-style:italic;padding:4px 0}.chat-input-container{display:flex;gap:8px;padding:8px;border-top:1px solid var(--border-primary);background:var(--bg-primary);flex-shrink:0}.chat-input{flex:1;padding:6px 10px;border:1px solid var(--border-primary);font-size:13px;background:var(--bg-primary);color:var(--text-primary)}.chat-input:focus{outline:none;box-shadow:0 0 0 1px var(--accent-primary)}.chat-input:disabled{background:var(--bg-disabled);color:var(--text-muted)}.send-btn{padding:6px 16px;border:1px solid var(--accent-primary);background:var(--accent-primary);color:var(--bg-primary);cursor:pointer;font-size:13px;transition:background .2s ease}.send-btn:hover:not(:disabled){background:var(--accent-hover)}.send-btn:disabled{opacity:.5;cursor:not-allowed}.dialog-overlay{position:fixed;inset:0;background:var(--overlay-bg);display:flex;align-items:center;justify-content:center;z-index:1000}.dialog-content{background:var(--bg-primary);border:2px solid var(--border-primary);padding:24px;min-width:300px;max-width:400px}.dialog-content h3{margin:0 0 16px;text-align:center;font-size:1.1rem;color:var(--text-primary)}.dialog-content form{display:flex;flex-direction:column;gap:12px}.dialog-content input{padding:10px 12px;border:1px solid var(--border-primary);font-size:14px;width:100%;background:var(--bg-primary);color:var(--text-primary)}.dialog-content input:focus{outline:none;box-shadow:0 0 0 1px var(--accent-primary)}.dialog-content input:disabled{background:var(--bg-disabled);color:var(--text-muted)}.error-message{color:var(--error-text);font-size:13px;text-align:center}.dialog-buttons{display:flex;gap:10px;margin-top:8px}.dialog-buttons button{flex:1;padding:10px 16px;border:1px solid var(--border-primary);background:var(--bg-primary);color:var(--text-primary);cursor:pointer;font-size:14px;transition:background .2s ease}.dialog-buttons button:hover:not(:disabled){background:var(--bg-tertiary)}.dialog-buttons button.primary{background:var(--accent-primary);color:var(--bg-primary);border-color:var(--accent-primary)}.dialog-buttons button.primary:hover:not(:disabled){background:var(--accent-hover)}.dialog-buttons button:disabled{opacity:.5;cursor:not-allowed}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%;overflow:hidden}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--bg-primary);color:var(--text-primary)}.app{height:100vh;display:flex;flex-direction:column;padding:15px;gap:15px;overflow:hidden}.app-header{display:flex;align-items:center;justify-content:center;gap:15px;border-bottom:2px solid var(--border-primary);padding-bottom:8px;flex-shrink:0}h1{text-align:center;font-size:1.25rem;margin:0}.theme-toggle{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--border-primary);border-radius:8px;background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;font-size:18px;transition:all .2s ease}.theme-toggle:hover{background:var(--bg-tertiary);transform:scale(1.05)}.controls{border:1px solid var(--border-primary);padding:10px;flex-shrink:0;background:var(--bg-primary)}.control-row{display:flex;gap:10px;flex-wrap:wrap}.controls input{flex:1;min-width:100px;padding:6px 10px;border:1px solid var(--border-primary);font-size:13px;background:var(--bg-primary);color:var(--text-primary)}.controls input:disabled{background:var(--bg-disabled);color:var(--text-muted)}.controls button{padding:6px 14px;border:1px solid var(--border-primary);background:var(--bg-primary);color:var(--text-primary);cursor:pointer;font-size:13px;transition:background .2s ease}.controls button:hover:not(:disabled){background:var(--bg-tertiary)}.controls button:disabled{opacity:.5;cursor:not-allowed}.controls button.connect{background:var(--accent-primary);color:var(--bg-primary);border-color:var(--accent-primary)}.controls button.connect:hover:not(:disabled){background:var(--accent-hover)}.controls button.disconnect{background:var(--text-secondary);color:var(--bg-primary);border-color:var(--text-secondary)}.controls button.disconnect:hover:not(:disabled){background:var(--text-muted)}.main-content{display:grid;grid-template-columns:1fr 1fr;gap:15px;flex:1;min-height:0;overflow:hidden}.left-panel,.right-panel{border:1px solid var(--border-primary);background:var(--bg-primary);display:flex;flex-direction:column;min-height:0;overflow:hidden}.status-bar{display:flex;justify-content:space-between;padding:8px 12px;border:1px solid var(--border-primary);background:var(--bg-secondary);font-size:13px;flex-shrink:0;color:var(--text-secondary)}@media(max-width:768px){.main-content{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.control-row{flex-direction:column}.controls input,.controls button{width:100%}}
