#admin-app .card{border-radius:.5rem}.admin-login-card{max-width:400px;width:100%}.admin-nav{background:#1f2937}.admin-logout-button{background:#f9fafb;border-color:#e5e7eb;color:#111827;font-weight:700}.admin-logout-button:focus,.admin-logout-button:hover{background:#fff;border-color:#fff;color:#111827}.admin-form-card,.admin-result-list{border-radius:.75rem}.admin-page-header{align-items:center;display:flex;gap:1rem;justify-content:space-between;margin-bottom:1rem}.admin-sidebar{overflow:hidden}.admin-page-list{flex-direction:row;overflow-x:auto;scrollbar-width:thin}.admin-page-list .list-group-item{border-bottom-width:0;white-space:nowrap}@media (min-width:992px){.admin-sidebar{position:sticky;top:1rem}.admin-page-list{flex-direction:column;overflow-x:visible}.admin-page-list .list-group-item{border-bottom-width:1px}}#admin-app section .table-responsive,#admin-app section>.card{border-radius:.5rem}#admin-app .table-responsive{max-height:min(68vh,720px)}#admin-app thead th{background:#f8f9fa;box-shadow:0 1px 0 #dee2e6;position:sticky;top:0;z-index:1}#admin-app pre{overflow-wrap:anywhere;white-space:pre-wrap}.redis-value-cell{min-width:320px}.redis-value-preview{max-height:160px;overflow:auto}.notification-progress{height:.35rem;width:120px}.admin-confirm-backdrop{align-items:center;background:rgba(33,37,41,.46);display:flex;inset:0;justify-content:center;padding:1rem;position:fixed;z-index:1100}.admin-confirm-dialog{background:#fff;border:1px solid #dee2e6;border-radius:.5rem;box-shadow:0 20px 50px rgba(33,37,41,.22);overflow:hidden;width:min(420px,100%)}.admin-confirm-header{align-items:center;border-bottom:1px solid #dee2e6;display:flex;gap:1rem;justify-content:space-between;padding:1rem}.admin-confirm-title{font-weight:800}.admin-confirm-close{background:#fff;border:1px solid #dee2e6;border-radius:50%;color:#6c757d;height:34px;width:34px}.admin-confirm-body{color:#495057;overflow-wrap:anywhere;padding:1rem}.admin-confirm-actions{border-top:1px solid #dee2e6;display:flex;gap:.75rem;justify-content:flex-end;padding:1rem}.redis-key-cell,.redis-ttl-cell,.redis-type-cell{background:#fff;position:sticky;z-index:2}.redis-key-cell{box-shadow:8px 0 12px rgba(15,23,42,.06);left:0;max-width:280px;min-width:220px;overflow-wrap:anywhere}.redis-type-cell{left:220px;min-width:88px}.redis-ttl-cell{left:308px;min-width:92px}thead .redis-key-cell,thead .redis-ttl-cell,thead .redis-type-cell{background:#f8f9fa;z-index:3}.redis-action-cell{background:#fff;box-shadow:-8px 0 12px rgba(15,23,42,.08);min-width:96px;position:sticky;right:0;z-index:2}thead .redis-action-cell{background:#f8f9fa;z-index:3}@media (max-width:768px){#admin-app .navbar .container,.admin-page-header{align-items:flex-start!important}.admin-page-header{flex-direction:column}#admin-app .table-responsive{max-height:none}}:root{--bg-primary:#f5f7f9;--surface-primary:#fff;--surface-muted:#f8fafc;--line-muted:#dde3ea;--text-primary:#212529;--text-secondary:#6c757d}body{background-color:var(--bg-primary);color:var(--text-primary);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.6;min-height:100vh}#app .card,#app .shadow-sm{border:1px solid var(--line-muted)!important;border-radius:.75rem;box-shadow:none!important}#app .card-body{background:var(--surface-primary);border-radius:inherit}#app .btn{border-radius:.5rem;box-shadow:none!important}#app .btn-primary,#app .btn-secondary,#app .text-bg-primary,#app .text-bg-success{box-shadow:none}.desktop-sticky{position:static}.btn-icon{align-items:center;display:inline-flex;height:34px;justify-content:center;padding:0;width:34px}.min-w-0{min-width:0}@media (min-width:992px){.desktop-sticky{position:sticky;top:1rem}}.update-meta{gap:.35rem;position:relative}.app-header-card{background:var(--surface-primary);position:relative}.app-header-title{min-width:0}.app-header-actions{flex:0 0 auto;margin-left:auto;white-space:nowrap}.app-build-info{position:absolute;right:.75rem;top:.75rem}.build-info-popover{background:#fff;border:1px solid #dee2e6;border-radius:.5rem;box-shadow:0 10px 24px rgba(15,23,42,.08);color:var(--text-primary);padding:.85rem;position:absolute;right:0;top:calc(100% + .5rem);width:min(280px,calc(100vw - 2rem));z-index:20}.build-info-title{font-weight:700;margin-bottom:.65rem}.build-info-row{display:grid;gap:.2rem;margin-top:.55rem}.build-info-muted,.build-info-row span{color:var(--text-secondary)}.build-info-row strong{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.82rem;word-break:break-word}.build-info-error{color:#dc3545}.route-selector{margin-bottom:2rem}.route-buttons{display:flex;flex:1;gap:1rem;min-width:0;overflow-x:auto;padding-bottom:.5rem;scrollbar-width:thin;white-space:nowrap}.route-buttons::-webkit-scrollbar{height:6px}.route-buttons::-webkit-scrollbar-thumb{background-color:#c8d0d8;border-radius:3px}.route-btn{align-items:center;background:var(--surface-primary);border-color:var(--line-muted);display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;min-height:64px;min-width:110px;padding:.65rem .9rem}.route-btn.btn-primary{background:#eaf3ff;border-color:#9ec5fe;color:#0b5ed7}.stop-item-bootstrap{background:var(--surface-primary);border-left:0}.stops-list-card{overflow:hidden}.stops-scroll-container{max-height:min(68vh,720px);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;-webkit-overflow-scrolling:touch}.stops-scroll-container::-webkit-scrollbar{width:8px}.stops-scroll-container::-webkit-scrollbar-thumb{background-color:#c8d0d8;border-radius:999px}.stop-item-bootstrap+.list-group-item{border-top-color:var(--line-muted)}.arrival-badge{border-radius:.45rem;min-width:3.8rem;text-align:center}.arrival-badge.text-bg-success{background-color:#d7f2e2!important;color:#146c43!important}.moving-bus-row,.stop-arrival-actions{display:flex;flex-wrap:wrap;gap:.5rem}.stop-arrival-actions{align-items:center;flex:0 0 auto;justify-content:flex-end;max-width:58%}.moving-bus-row{background:#f7fbff;border-color:#e8f2ff;justify-content:center}.control-mode-row{align-items:center;background:var(--surface-muted);border:1px solid var(--line-muted);border-radius:.75rem;display:grid;gap:.35rem;grid-template-columns:minmax(5.5rem,.72fr) auto minmax(9rem,1.28fr);padding:.25rem}.control-direction-btn,.control-mode-toggle{background:transparent;border:0;border-radius:.5rem;color:#495057;font-weight:700;min-height:36px;transition:color .18s ease,background-color .18s ease}.control-mode-toggle{align-items:center;display:inline-flex;gap:.35rem;justify-content:center;padding:0 .75rem}.control-direction-btn:hover,.control-mode-toggle:hover{background:#e9ecef;color:#0d6efd}.control-direction-btn.active,.control-mode-toggle.active{background:#0d6efd;color:#fff}.control-divider{background:var(--line-muted);height:24px;width:1px}.control-direction-group{display:grid;gap:.25rem;grid-auto-columns:1fr;grid-auto-flow:column}.control-direction-btn{padding:0 .75rem}.route-number{font-size:1.35rem;font-weight:700}.route-btn.active .route-label,.route-btn.active .route-number{color:inherit}.error,.loading{background:#fff;border:1px solid var(--line-muted);border-radius:.75rem;padding:3rem}@media (min-width:992px){.btn-lg-normal{--bs-btn-padding-y:0.375rem;--bs-btn-padding-x:0.75rem;--bs-btn-font-size:1rem;--bs-btn-border-radius:var(--bs-border-radius)}.app-build-info{position:relative;right:auto;top:auto}}@media (max-width:991.98px){#app.container{padding-left:.75rem;padding-right:.75rem}.app-header-card .card-body{min-height:0}.app-header-card h1{font-size:1.05rem}.app-header-card .card-body{gap:.5rem!important}.app-header-title{flex:1 1 auto}.app-header-title .small{line-height:1.25}.app-header-actions{align-self:flex-start;min-width:max-content}.app-header-actions .btn{--bs-btn-padding-x:0.55rem;--bs-btn-font-size:0.82rem}.route-buttons{gap:.5rem;padding-bottom:.25rem}.route-btn{border-radius:.5rem;flex-direction:row;gap:.35rem;min-height:42px;min-width:auto;padding:.35rem .75rem}.route-number{font-size:1rem}.route-label{font-size:.78rem;opacity:.85}.control-panel .card-body{align-items:center;display:flex!important;flex-wrap:wrap}.control-mode-row{grid-template-columns:minmax(5rem,.75fr) minmax(9rem,1.25fr);width:100%}.control-divider{display:none}.control-direction-btn,.control-mode-toggle{font-size:.88rem;min-height:34px;padding-left:.55rem;padding-right:.55rem}.control-subroutes{flex:1 0 100%;padding-bottom:0!important}.control-subroutes .btn{--bs-btn-padding-y:0.2rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.78rem}.control-alert{flex:1 0 100%;font-size:.86rem;padding:.35rem .5rem!important}.control-alert.alert-light{line-height:1.25;white-space:normal}.card-header{padding-bottom:.5rem;padding-top:.5rem}.list-group-item{padding-bottom:.65rem;padding-top:.65rem}.stops-scroll-container{max-height:var(--stops-scroll-max-height,58dvh)}}.loading-spinner{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;color:#0d6efd;height:3rem;margin:0 auto 1rem;width:3rem}.loading-title{font-size:1.1rem;font-weight:700;margin-bottom:.35rem}.loading p{color:var(--text-secondary);margin-bottom:0}.loading-waiting-refresh{background:#f8fbff;border-color:#b6d4fe}.loading-waiting-refresh .loading-spinner{animation-duration:1.1s;color:#0d6efd}.tracking-dialog-backdrop{align-items:center;background:rgba(33,37,41,.46);display:flex;inset:0;justify-content:center;padding:1rem;position:fixed;z-index:1000}.tracking-dialog{background:#fff;border:1px solid #dee2e6;border-radius:.5rem;box-shadow:0 18px 42px rgba(15,23,42,.14);display:flex;flex-direction:column;max-height:min(620px,calc(100vh - 1rem));overflow:hidden;width:min(440px,100%)}.tracking-dialog-header{align-items:flex-start;border-bottom:1px solid #dee2e6;display:flex;gap:1rem;justify-content:space-between;padding:.9rem 1rem}.tracking-dialog-title{font-size:1rem;font-weight:700}.tracking-dialog-subtitle{color:var(--text-secondary);font-size:.85rem}.tracking-dialog-close{background:#fff;border:0;border-radius:.375rem;color:var(--text-secondary);height:34px;width:34px}.tracking-stop-options{overflow-y:auto}.tracking-stop-option{align-items:center;border-bottom:1px solid #eef0f2;cursor:pointer;display:grid;gap:.65rem;grid-template-columns:auto 1fr auto;padding:.75rem 1rem}.tracking-stop-option.active{background:#f4f9ff}.tracking-stop-name{font-weight:700}.tracking-stop-distance{color:var(--text-secondary);font-size:.8rem}.tracking-dialog-actions{border-top:1px solid #dee2e6;display:flex;gap:.5rem;justify-content:flex-end;padding:.75rem 1rem}.tracking-dialog-close:disabled{cursor:not-allowed;opacity:.65}.live-map-section{border:1px solid var(--line-muted);border-radius:.75rem;box-shadow:none;overflow:hidden;position:relative}.map-container{position:relative}#bus-map{background:#1a1a2e;height:420px;width:100%}@media (max-width:768px){#bus-map{height:320px}}.map-legend{backdrop-filter:blur(8px);background:rgba(26,26,46,.88);border-radius:.6rem;bottom:16px;display:flex;flex-direction:column;gap:.35rem;padding:.5rem .75rem;position:absolute;right:12px;z-index:1000}.legend-item{align-items:center;color:#d0d0e0;display:flex;font-size:.78rem;font-weight:500;gap:.4rem}.legend-dot{border-radius:50%;display:inline-block;flex-shrink:0;height:10px;width:10px}.legend-stop{background:#fff;border:2px solid #00d4ff}.legend-bus{background:#ff6b35;box-shadow:0 0 6px rgba(255,107,53,.8)}.legend-tracked-bus{background:#24d17e;box-shadow:0 0 0 3px rgba(36,209,126,.25),0 0 8px rgba(36,209,126,.8)}.legend-line{background:linear-gradient(90deg,#00d4ff 50%,transparent 0);background-repeat:repeat-x;background-size:6px 2px;display:inline-block;flex-shrink:0;height:2px;width:18px}.stop-dot{background:#fff;border:2.5px solid #00d4ff;border-radius:50%;box-shadow:0 0 8px rgba(0,212,255,.5);height:12px;transition:transform .15s ease;width:12px}.stop-marker-icon{background:none!important;border:none!important}.bus-pulse-marker{align-items:center;animation:busPulse 2s ease-in-out infinite;background:linear-gradient(135deg,#ff6b35,#f7c59f);border-radius:50%;box-shadow:0 0 0 4px rgba(255,107,53,.25),0 2px 10px rgba(255,107,53,.5);display:flex;font-size:1.1rem;height:34px;justify-content:center;line-height:1;position:relative;width:34px}@keyframes busPulse{0%,to{box-shadow:0 0 0 4px rgba(255,107,53,.25),0 2px 10px rgba(255,107,53,.5)}50%{box-shadow:0 0 0 8px rgba(255,107,53,.1),0 2px 14px rgba(255,107,53,.7)}}.bus-marker-icon{background:none!important;border:none!important}.bus-moving-marker{align-items:center;animation:movingPulse 1.5s ease-in-out infinite;background:linear-gradient(135deg,gold,#fa0);border-radius:50%;box-shadow:0 0 0 3px rgba(255,215,0,.3),0 2px 8px rgba(255,170,0,.6);display:flex;font-size:1rem;height:30px;justify-content:center;line-height:1;position:relative;width:30px}.tracked-bus-marker{box-shadow:0 0 0 5px rgba(36,209,126,.25),0 2px 12px rgba(36,209,126,.65);outline:3px solid #24d17e;outline-offset:2px;z-index:1}.tracked-bus-badge{align-items:center;background:#24d17e;border:2px solid #f7fff9;border-radius:50%;box-shadow:0 2px 8px rgba(36,209,126,.7);color:#062b1a;display:flex;font-size:.62rem;font-weight:900;height:18px;justify-content:center;line-height:1;position:absolute;right:-7px;top:-8px;width:18px;z-index:2}.tracked-bus-label{background:rgba(16,52,39,.96);border:1px solid rgba(36,209,126,.65);border-radius:4px;color:#d7ffe8;font-size:.68rem;font-weight:800;left:28px;line-height:1.1;max-width:66px;overflow:hidden;padding:2px 5px;position:absolute;text-overflow:ellipsis;top:50%;transform:translateY(-50%);white-space:nowrap}@keyframes movingPulse{0%,to{transform:scale(1)}50%{transform:scale(1.1)}}.stop-label-icon{background:none!important;border:none!important}.stop-label{backdrop-filter:blur(4px);background:rgba(26,26,46,.85);border:1px solid rgba(0,212,255,.3);border-radius:4px;color:#00d4ff;font-family:Inter,sans-serif;font-size:.72rem;font-weight:600;padding:2px 7px;white-space:nowrap}.user-marker-icon{background:none!important;border:none!important}.user-location-dot{align-items:center;display:flex;height:18px;justify-content:center;position:relative;width:18px}.user-location-dot:after{background:#4285f4;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 6px rgba(66,133,244,.6);content:"";height:12px;position:absolute;width:12px;z-index:2}.user-pulse{animation:userPulse 2s ease-out infinite;background:rgba(66,133,244,.2);border-radius:50%;height:32px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:32px}@keyframes userPulse{0%{opacity:1;transform:translate(-50%,-50%) scale(.5)}to{opacity:0;transform:translate(-50%,-50%) scale(2)}}.custom-popup .leaflet-popup-content-wrapper{backdrop-filter:blur(8px);background:rgba(26,26,46,.95)!important;border:1px solid rgba(0,212,255,.3)!important;border-radius:.6rem!important;box-shadow:0 4px 20px rgba(0,0,0,.4)!important;padding:0!important}.custom-popup .leaflet-popup-content{margin:0!important;padding:0!important}.custom-popup .leaflet-popup-tip{background:rgba(26,26,46,.95)!important}.map-popup{min-width:90px;padding:.5rem .8rem}.popup-stop-name{color:#f0f0ff;font-family:Inter,sans-serif;font-size:.88rem;font-weight:700;margin-bottom:2px}.popup-estimate{color:#00d4ff;font-family:Inter,sans-serif;font-size:.82rem;font-weight:600}.popup-plates{color:#ff6b35;font-weight:500}.popup-plates,.popup-tracked{font-family:Inter,sans-serif;font-size:.78rem;margin-top:2px}.popup-tracked{color:#24d17e;font-weight:700}.leaflet-control-zoom a{background:rgba(26,26,46,.9)!important;border-color:rgba(0,212,255,.3)!important;color:#00d4ff!important}.leaflet-control-zoom a:hover{background:rgba(0,212,255,.2)!important;color:#fff!important}.leaflet-control-attribution{background:rgba(26,26,46,.7)!important;color:#888!important;font-size:.65rem!important}.leaflet-control-attribution a{color:#aaa!important}