*{margin:0;padding:0;box-sizing:border-box} :root{--bg:#0c0c0f;--surface:#16161a;--surface2:#1e1e24;--border:#2a2a32;--text:#e8e8ed;--dim:#8888a0;--accent:#3b82f6;--accent2:#2563eb;--green:#22c55e;--red:#ef4444;--orange:#f59e0b;--radius:12px;--radius-sm:8px} html,body{height:100%;overflow:hidden} body{font-family:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased} #map{position:fixed;top:0;left:0;right:0;bottom:0;z-index:0} /* --- Top bar --- */ .topbar{position:fixed;top:12px;left:12px;right:12px;z-index:1000;display:flex;gap:8px;align-items:center} .search-wrap{flex:1;position:relative} .search-wrap input{width:100%;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px 12px 40px;color:var(--text);font-size:14px;outline:none;transition:border-color .2s} .search-wrap input:focus{border-color:var(--accent)} .search-wrap input::placeholder{color:var(--dim)} .search-wrap .icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--dim);pointer-events:none} .search-results{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden;display:none;max-height:320px;overflow-y:auto;box-shadow:0 8px 32px rgba(0,0,0,.5);z-index:2000} .search-results.open{display:block} .search-results .sr-item{padding:10px 14px;cursor:pointer;font-size:13px;border-bottom:1px solid var(--border);transition:background .15s} .search-results .sr-item:last-child{border-bottom:none} .search-results .sr-item:hover{background:var(--surface2)} .search-results .sr-item .sr-type{font-size:11px;color:var(--dim)} .icon-btn{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--text);transition:all .2s;flex-shrink:0} .icon-btn:hover{background:var(--surface2);border-color:var(--accent)} .icon-btn.active{background:var(--accent);border-color:var(--accent);color:#fff} /* --- Side panel --- */ .panel{position:fixed;top:68px;left:12px;z-index:1000;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:0;width:340px;max-height:calc(100vh - 92px);overflow:hidden;display:none;box-shadow:0 8px 32px rgba(0,0,0,.4)} .panel.open{display:block} .panel-head{padding:16px 16px 0;display:flex;align-items:center;justify-content:space-between} .panel-head h2{font-size:16px;font-weight:700} .panel-close{background:none;border:none;color:var(--dim);cursor:pointer;padding:4px;font-size:20px} .panel-close:hover{color:var(--text)} .panel-body{padding:12px 16px 16px} .point-row{display:flex;align-items:center;gap:8px;margin-bottom:8px} .point-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0} .point-dot.from{background:var(--green)} .point-dot.to{background:var(--red)} .point-row input{flex:1;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 10px;color:var(--text);font-size:13px;outline:none} .point-row input:focus{border-color:var(--accent)} .actions{display:flex;gap:6px;margin-top:4px} .btn{background:var(--accent);color:#fff;border:none;border-radius:var(--radius-sm);padding:10px 16px;font-size:13px;font-weight:600;cursor:pointer;transition:background .2s} .btn:hover{background:var(--accent2)} .btn:disabled{opacity:.35;cursor:default} .btn-outline{background:transparent;border:1px solid var(--border);color:var(--text)} .btn-outline:hover{background:var(--surface2);border-color:var(--accent)} .btn-danger{background:var(--red)} .btn-danger:hover{background:#dc2626} /* Route info */ .route-info{background:var(--bg);border-radius:var(--radius-sm);padding:12px;margin-top:10px;font-size:13px;line-height:1.7} .route-info .ri-main{font-size:18px;font-weight:700;margin-bottom:2px} .route-info .ri-sub{color:var(--dim);font-size:12px} .route-info .ri-stat{display:inline-block;margin-right:12px} .route-info .ri-stat b{color:var(--accent)} /* Speed legend */ .speed-legend{display:flex;gap:4px;margin-top:10px;flex-wrap:wrap} .speed-legend span{padding:4px 8px;border-radius:4px;font-size:11px;font-weight:700;letter-spacing:.3px} .sl-20{background:#ef4444;color:#fff}.sl-40{background:#f59e0b;color:#000}.sl-60{background:#eab308;color:#000} .sl-80{background:#22c55e;color:#000}.sl-100{background:#06b6d4;color:#000}.sl-120{background:#3b82f6;color:#fff} .sl-max{background:#8b5cf6;color:#fff}.sl-unk{background:#555;color:#aaa} .speed-bar{display:flex;height:8px;border-radius:4px;overflow:hidden;margin-top:6px} .speed-bar div{height:100%;transition:width .3s} .speed-distrib{display:flex;gap:8px;margin-top:4px;flex-wrap:wrap;font-size:11px;color:var(--dim)} .speed-distrib span{display:flex;align-items:center;gap:3px} .speed-distrib .sd-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0} .hint{margin-top:12px;font-size:11px;color:var(--dim);text-align:center} /* --- GPS button --- */ .gps-active .gps-dot{animation:pulse 1.5s infinite} @keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(59,130,246,.5)}50%{box-shadow:0 0 0 8px rgba(59,130,246,0)}} /* --- Loading --- */ /* --- Leaflet overrides --- */ .leaflet-control-zoom{border:none!important} .leaflet-control-zoom a{background:var(--surface)!important;color:var(--text)!important;border:1px solid var(--border)!important;border-radius:var(--radius-sm)!important;width:36px!important;height:36px!important;line-height:36px!important;font-size:18px!important} .leaflet-control-zoom a:hover{background:var(--surface2)!important} .leaflet-control-zoom{gap:0;margin-right:54px!important} /* --- Marker popups --- */ .leaflet-popup-content-wrapper{background:var(--surface)!important;color:var(--text)!important;border-radius:var(--radius-sm)!important;border:1px solid var(--border)!important;box-shadow:0 4px 16px rgba(0,0,0,.4)!important} .leaflet-popup-tip{background:var(--surface)!important;border:1px solid var(--border)!important} .leaflet-popup-content{font-size:13px;margin:8px 12px!important} .gps-dot{width:14px;height:14px;background:var(--accent);border:3px solid #fff;border-radius:50%;box-shadow:0 0 8px rgba(59,130,246,.6)} .station-dot{width:10px;height:10px;background:var(--green);border:2px solid #fff;border-radius:50%} .loading{display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2000;background:var(--surface);padding:14px 22px;border-radius:var(--radius);font-size:13px;border:1px solid var(--border);box-shadow:0 8px 32px rgba(0,0,0,.5);align-items:center;gap:8px} .loading.show{display:flex} .spinner{width:16px;height:16px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite} @keyframes spin{to{transform:rotate(360deg)}} /* --- Responsive --- */ @media(max-width:600px){ .topbar{top:8px;left:8px;right:8px} .panel{left:8px;right:8px;width:auto;top:60px;max-height:55vh} .map-ctrls.top{top:8px} .map-ctrls.bottom{bottom:8px} }