*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#1a1a2e;color:#eee;overflow:hidden;width:100vw;height:100vh}#login-container{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1a2e,#16213e)}.login-box{background:#16213e;padding:40px;border-radius:16px;box-shadow:0 8px 32px #0006;width:100%;max-width:400px}.login-box h1{color:#4fc3f7;font-size:2em;margin-bottom:8px;text-align:center}.login-box .subtitle{color:#888;text-align:center;margin-bottom:30px}.tabs{display:flex;gap:10px;margin-bottom:20px}.tab{flex:1;padding:10px;border:none;background:#0f3460;color:#888;cursor:pointer;border-radius:8px;transition:all .2s}.tab:hover{background:#1a4a7a}.tab.active{background:#4fc3f7;color:#1a1a2e}#auth-form,#token-form{display:flex;flex-direction:column;gap:15px}#auth-form input,#token-form input{padding:14px;border:2px solid #333;border-radius:8px;background:#0f3460;color:#fff;font-size:1em;transition:border-color .2s}#auth-form input:focus,#token-form input:focus{outline:none;border-color:#4fc3f7}#auth-form button,#token-form button{padding:14px;border:none;border-radius:8px;background:#4fc3f7;color:#1a1a2e;font-size:1em;font-weight:700;cursor:pointer;transition:background .2s}#auth-form button:hover:not(:disabled),#token-form button:hover:not(:disabled){background:#81d4fa}#auth-form button:disabled,#token-form button:disabled{opacity:.6;cursor:not-allowed}.error{color:#f44336;text-align:center;font-size:.9em}#scene-container{position:fixed;top:0;right:0;bottom:0;left:0}#overlay{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none}#overlay>*{pointer-events:auto}#overlay .header{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;gap:20px;padding:15px 20px;background:linear-gradient(to bottom,rgba(22,33,62,.9),transparent)}#overlay .header h1{color:#4fc3f7;font-size:1.3em}#overlay .status{display:flex;align-items:center;gap:8px}#overlay .indicator{width:10px;height:10px;border-radius:50%;background:#888}#overlay .indicator.connected{background:#4caf50;box-shadow:0 0 8px #4caf50}#overlay .indicator.connecting{background:#ff9800;animation:pulse 1s infinite}#overlay .indicator.disconnected{background:#f44336}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}#fullscreen-btn{margin-left:auto;width:36px;height:36px;padding:6px;border:1px solid #4fc3f7;border-radius:6px;background:transparent;color:#4fc3f7;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center}#fullscreen-btn:hover{background:#4fc3f7;color:#1a1a2e}#fullscreen-btn svg{width:20px;height:20px;stroke:currentColor}#logout-btn{padding:8px 16px;border:1px solid #4fc3f7;border-radius:6px;background:transparent;color:#4fc3f7;cursor:pointer;transition:all .2s}#logout-btn:hover{background:#4fc3f7;color:#1a1a2e}.panel-toggle{position:absolute;top:70px;left:20px;width:36px;height:36px;padding:8px;background:#16213ee6;border:1px solid #333;border-radius:8px;cursor:pointer;transition:all .3s ease;z-index:10}.panel-toggle:hover{background:#16213e;border-color:#4fc3f7}.panel-toggle .toggle-icon{width:100%;height:100%;stroke:#4fc3f7;transition:transform .3s ease}.panel-toggle.collapsed .toggle-icon{transform:rotate(90deg)}.left-panel{position:absolute;top:70px;left:64px;display:flex;flex-direction:column;gap:10px;transition:transform .3s ease,opacity .3s ease}.left-panel.collapsed{transform:translate(-320px);opacity:0;pointer-events:none}.layout-selector{display:flex;align-items:center;gap:10px;padding:10px 15px;background:#16213ee6;border-radius:8px}.layout-selector label{color:#888;font-size:.9em}.layout-selector select{padding:8px 12px;border:1px solid #333;border-radius:6px;background:#0f3460;color:#fff;font-size:.9em;cursor:pointer}.info-panel{width:250px;max-height:calc(100vh - 180px);overflow-y:auto;padding:15px;background:#16213ee6;border-radius:8px}.info-panel h3{color:#4fc3f7;font-size:.9em;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #333}.building-item{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid #222}.building-name{font-size:.85em;color:#ccc}.building-status{font-size:.75em;padding:3px 8px;border-radius:4px;text-transform:uppercase}.building-status.online{background:#4caf504d;color:#81c784}.building-status.offline{background:#9e9e9e4d;color:#bdbdbd}.building-status.warning{background:#ffaa004d;color:#fc6}.building-status.critical{background:#f443364d;color:#e57373}.building-status.unknown{background:#9e9e9e33;color:#888}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#16213e}::-webkit-scrollbar-thumb{background:#4fc3f7;border-radius:3px}.tooltip-hover{position:absolute;pointer-events:none;background:#16213ef2;border:1px solid #4fc3f7;border-radius:6px;padding:8px 12px;font-size:.85em;box-shadow:0 0 20px #4fc3f74d;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transform:translate(-50%) translateY(-100%);margin-top:-10px;z-index:1000;transition:opacity .15s ease;white-space:nowrap}.tooltip-hover .tooltip-name{color:#4fc3f7;font-weight:700;margin-bottom:4px}.tooltip-hover .tooltip-status{display:flex;align-items:center;gap:6px;color:#aaa;font-size:.9em}.tooltip-hover .tooltip-status-dot,.tooltip-detail .tooltip-status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.tooltip-detail{position:absolute;background:#16213efa;border:1px solid #4fc3f7;border-radius:8px;padding:16px;min-width:250px;max-width:350px;box-shadow:0 0 30px #4fc3f766;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transform:translateY(-100%);margin-top:-15px;z-index:1001;transition:opacity .15s ease}.tooltip-detail .tooltip-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid #333}.tooltip-detail .tooltip-header-left{display:flex;flex-direction:column;gap:2px}.tooltip-detail .tooltip-header-right{display:flex;align-items:center;gap:8px}.tooltip-detail .tooltip-name{color:#4fc3f7;font-weight:700;font-size:1.1em}.tooltip-detail .tooltip-type{color:#666;font-size:.8em;font-family:monospace}.tooltip-detail .tooltip-close{background:transparent;border:none;color:#666;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.tooltip-detail .tooltip-close:hover{color:#fff;background:#ffffff1a}.tooltip-detail .tooltip-section{margin-bottom:12px}.tooltip-detail .tooltip-section:last-child{margin-bottom:0}.tooltip-detail .tooltip-label{color:#666;font-size:.75em;text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.tooltip-detail .tooltip-text{color:#ccc;font-size:.9em;line-height:1.4}.tooltip-detail .tooltip-notes{font-style:italic;color:#999}.tooltip-detail .tooltip-tags{display:flex;flex-wrap:wrap;gap:4px}.tooltip-detail .tooltip-tag{background:#4fc3f726;border:1px solid rgba(79,195,247,.4);border-radius:12px;padding:2px 8px;font-size:.75em;color:#4fc3f7}.tooltip-detail .tooltip-empty{color:#555;font-size:.85em;font-style:italic;text-align:center;padding:10px 0}.labels-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden}.floating-label{position:absolute;pointer-events:none;background:#16213ed9;border:1px solid rgba(79,195,247,.5);border-radius:4px;padding:3px 8px;font-size:.75em;color:#4fc3f7;white-space:nowrap;will-change:transform,opacity;transition:opacity .2s}.floating-label:after{content:"";position:absolute;bottom:-6px;left:50%;transform:translate(-50%);border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid rgba(79,195,247,.5)}.floating-label .label-name{font-weight:500}#labels-toggle-btn{width:36px;height:36px;padding:6px;border:1px solid #4fc3f7;border-radius:6px;background:transparent;color:#4fc3f7;cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center}#labels-toggle-btn:hover{background:#4fc3f71a}#labels-toggle-btn.active{background:#4fc3f7;color:#1a1a2e}#labels-toggle-btn svg{width:20px;height:20px;stroke:currentColor}
