:root{--bg: #16213e;--surface: #1a1a2e;--primary: #0f3460;--accent: #e94560;--success: #99e6c0;--muted: #b8b8b8;--text: #eee;--text-secondary: #a0a0a0}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}input,button{font:inherit}.app{min-height:100%;display:flex;flex-direction:column;padding:1rem;padding-top:max(1rem,env(safe-area-inset-top));padding-bottom:max(1rem,env(safe-area-inset-bottom))}.page{flex:1;display:flex;flex-direction:column;max-width:28rem;margin:0 auto;width:100%}.form-group{margin-bottom:1rem}.form-group label{display:block;margin-bottom:.35rem;color:var(--text-secondary);font-size:.9rem}.form-group input{width:100%;padding:.75rem 1rem;border:1px solid var(--primary);border-radius:8px;background:var(--surface);color:var(--text)}.form-group input::placeholder{color:var(--text-secondary)}.btn{display:inline-flex;align-items:center;justify-content:center;padding:.75rem 1.5rem;border:none;border-radius:8px;font-weight:600;cursor:pointer;transition:opacity .2s}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--accent);color:#fff;width:100%}.btn-secondary{background:var(--primary);color:var(--text)}.card{background:var(--surface);border-radius:12px;padding:1rem;margin-bottom:.75rem}.gate-card{background:var(--surface);border-radius:12px;padding:1.25rem;margin-bottom:1rem}.gate-card.offline{opacity:.7}.gate-name{font-weight:600;margin-bottom:.5rem}.gate-status{font-size:.9rem;color:var(--text-secondary);margin-bottom:1rem}.gate-actions{display:flex;gap:.5rem;flex-wrap:wrap}.gate-actions .btn{flex:1;min-width:100px}.ws-status{display:flex;align-items:center;gap:.4rem;font-size:.8rem;color:var(--text-secondary)}.ws-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.error-msg{color:var(--accent);font-size:.9rem;margin-top:.5rem}.logo{text-align:center;font-size:1.5rem;font-weight:700;margin-bottom:2rem;color:var(--text)}
