*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;height:100dvh}body{background:#0a0a1a;color:#dde;font-family:Noto Sans KR,Apple SD Gothic Neo,-apple-system,BlinkMacSystemFont,sans-serif;overflow:hidden;-webkit-font-smoothing:antialiased}.app{display:flex;flex-direction:column;height:100dvh}.header{display:flex;align-items:center;justify-content:space-between;padding:0 14px;height:48px;min-height:48px;background:#08081a;border-bottom:1px solid #1e1e3a;flex-shrink:0;gap:10px}.header h1{font-size:.92rem;font-weight:700;color:#e8eaff;white-space:nowrap;flex-shrink:0}.header-right{display:flex;align-items:center;gap:6px;overflow:hidden;min-width:0}.badge{font-size:.65rem;padding:2px 7px;border-radius:10px;white-space:nowrap;flex-shrink:0}.badge.loading{background:#1a3060;color:#7aadff}.badge.error{background:#3a1010;color:#ff8080}.badge.updated{background:#0e2a18;color:#60c878}.badge.mock{background:#2e2a08;color:#c8c040}@media(max-width:400px){.badge.updated{display:none}}.refresh-btn{background:#181838;color:#89e;border:1px solid #2e2e5a;border-radius:8px;padding:0 12px;height:32px;cursor:pointer;font-size:.8rem;flex-shrink:0;transition:background .15s;white-space:nowrap}.refresh-btn:hover:not(:disabled){background:#222248}.refresh-btn:disabled{opacity:.4;cursor:default}.main{flex:1;overflow:hidden;position:relative;min-height:0}.map-container{width:100%;height:100%;position:relative;background:#0a0a1a}.zoom-controls{position:absolute;right:12px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:6px;z-index:20}.zoom-btn{width:40px;height:40px;background:#0e0e24eb;border:1px solid #2e2e5a;border-radius:10px;color:#aac;font-size:1.2rem;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1;transition:background .12s,color .12s;touch-action:manipulation;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.zoom-btn:hover{background:#1e1e46f5;color:#dde}.zoom-btn:active{background:#323264fc}.line-panel{position:absolute;bottom:0;left:0;right:0;background:#080816f5;border-top:1px solid #1e1e3a;z-index:20;padding:6px 10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.panel-toggle-btn{background:none;border:none;color:#78c;font-size:.75rem;cursor:pointer;padding:2px 2px 4px;display:block;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.line-toggles{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:6px;padding-bottom:2px;-webkit-overflow-scrolling:touch;scrollbar-width:none}.line-toggles::-webkit-scrollbar{display:none}.line-btn{padding:5px 11px;border-radius:16px;border:2px solid var(--c);background:transparent;color:#9ab;font-size:.72rem;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background .12s,color .12s;min-height:32px;touch-action:manipulation;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;user-select:none}.line-btn.active{background:var(--c);color:#fff;font-weight:700}.line-btn:hover{opacity:.85}@media(min-width:640px){.line-panel{position:absolute;bottom:auto;top:12px;left:12px;right:auto;width:230px;border:1px solid #1e1e3a;border-radius:12px;padding:8px 10px 10px}.line-toggles{flex-wrap:wrap;overflow-x:visible}}.tooltip{position:fixed;background:#0a0a1cf7;border:1px solid #2a2a50;border-radius:10px;padding:8px 12px;pointer-events:none;z-index:200;min-width:130px;max-width:230px;font-size:.78rem;box-shadow:0 6px 24px #000000b3;max-width:min(230px,90vw)}.tooltip strong{display:block;font-size:.88rem;color:#fff;margin-bottom:5px}.tooltip-lines{display:flex;gap:4px;flex-wrap:wrap;margin-bottom:5px}.line-badge{font-size:.62rem;padding:2px 7px;border-radius:8px;color:#fff;font-weight:700}.tooltip-trains{border-top:1px solid #1e1e3a;padding-top:5px;display:flex;flex-direction:column;gap:4px}.train-info{font-size:.72rem;color:#bbc;display:flex;align-items:center;gap:5px}.train-status{background:#14143a;border-radius:4px;padding:1px 5px;font-size:.62rem;color:#79f}@keyframes trainPulse{0%{opacity:1;transform:scale(.7)}60%{opacity:.4;transform:scale(1.8)}to{opacity:0;transform:scale(2.2)}}.train-pulse{animation:trainPulse 2s ease-out infinite;transform-box:fill-box;transform-origin:center}
