:root{--ae-green-dark:#0f4d2a;--ae-green:#1a6b3a;--ae-green-light:#2da366;--ae-green-muted:#e8f5ee;--ae-orange:#e85d04;--ae-blue:#07c;--ae-surface:#f7faf8;--ae-border:#e2ebe6;--ae-text:#1a2e22;--ae-text-muted:#5c6f64;--ae-shadow-sm:0 1px 3px #0f4d2a14;--ae-shadow-md:0 4px 16px #0f4d2a1f;--ae-radius:12px;--ae-radius-sm:8px;--sidebar-width:360px}*,:before,:after{box-sizing:border-box}.map-loading{width:100%;height:100%;min-height:300px;color:var(--ae-text-muted);background:var(--ae-surface);justify-content:center;align-items:center;display:flex}body{color:var(--ae-text);background:var(--ae-surface);-webkit-font-smoothing:antialiased;margin:0;font-family:Segoe UI,system-ui,-apple-system,sans-serif}.app-navbar{background:linear-gradient(135deg, var(--ae-green-dark) 0%, var(--ae-green) 55%, var(--ae-green-light) 100%);z-index:1000;min-height:56px;box-shadow:0 2px 12px #0000002e}.app-brand{align-items:center;gap:10px;text-decoration:none;display:flex}.app-logo{object-fit:cover;border:2px solid #ffffffd9;border-radius:50%;flex-shrink:0;width:38px;height:38px;box-shadow:0 2px 8px #0003}.app-brand-text{flex-direction:column;line-height:1.15;display:flex}.app-brand-title{color:#fff;letter-spacing:.01em;font-size:.95rem;font-weight:700}.app-brand-sub{color:#ffffffb8;letter-spacing:.04em;text-transform:uppercase;font-size:.68rem;font-weight:500}.live-badge{color:#fff;letter-spacing:.03em;background:#ffffff24;border:1px solid #ffffff40;border-radius:20px;align-items:center;gap:6px;padding:4px 10px;font-size:.72rem;font-weight:600;display:inline-flex}.live-dot{background:#4ade80;border-radius:50%;width:7px;height:7px;animation:2s ease-in-out infinite pulse-live;box-shadow:0 0 0 2px #4ade8059}@keyframes pulse-live{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(.85)}}.lang-toggle{background:#0003;border-radius:20px;gap:2px;padding:3px;display:flex}.lang-btn{color:#ffffffbf;cursor:pointer;background:0 0;border:none;border-radius:16px;padding:4px 10px;font-size:.72rem;font-weight:600;line-height:1.4;transition:background .2s,color .2s}.lang-btn:hover{color:#fff;background:#ffffff1a}.lang-btn.active{color:var(--ae-green-dark);background:#fff;box-shadow:0 1px 4px #00000026}.sidebar-panel{border-right:1px solid var(--ae-border);background:#fff;flex-shrink:0;height:100%;transition:width .3s cubic-bezier(.4,0,.2,1),min-width .3s cubic-bezier(.4,0,.2,1);overflow:hidden;box-shadow:2px 0 12px #0f4d2a0f}.sidebar-panel.closed{box-shadow:none;border-right:none;width:0!important;min-width:0!important}.sidebar-panel.open{width:var(--sidebar-width);min-width:280px}.sidebar-toggle-btn{z-index:999;border:1px solid var(--ae-border);color:var(--ae-green-dark);box-shadow:var(--ae-shadow-md);cursor:pointer;background:#fff;border-radius:24px;align-items:center;gap:6px;padding:7px 14px;font-size:.78rem;font-weight:600;transition:transform .15s,box-shadow .15s;display:inline-flex;position:absolute;top:14px;left:14px}.sidebar-toggle-btn:hover{transform:translateY(-1px);box-shadow:0 6px 20px #0f4d2a29}.sidebar-toggle-btn i{font-size:.85rem}.sidebar-header{background:linear-gradient(145deg, var(--ae-green-dark), var(--ae-green-light));color:#fff;padding:18px 16px 16px}.sidebar-header-title{margin:0 0 4px;font-size:.92rem;font-weight:700;line-height:1.3}.sidebar-header-sub{opacity:.8;margin:0 0 14px;font-size:.75rem}.stat-grid{grid-template-columns:1fr 1fr;gap:8px;display:grid}.stat-card{border-radius:var(--ae-radius-sm);text-align:center;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#ffffff1f;border:1px solid #ffffff2e;padding:10px 8px}.stat-value{font-size:1.1rem;font-weight:700;line-height:1.2}.stat-label{opacity:.8;margin-top:2px;font-size:.68rem}.route-legend{opacity:.9;flex-wrap:wrap;gap:10px 14px;margin-top:12px;font-size:.68rem;display:flex}.legend-line{vertical-align:middle;border-radius:2px;width:22px;height:3px;display:inline-block}.legend-line.dashed{border-top:3px dashed var(--ae-blue);opacity:.75;background:0 0;height:0}.itinerary-scroll{background:var(--ae-surface);flex:1;padding:16px;overflow-y:auto}.itinerary-heading{letter-spacing:.1em;text-transform:uppercase;color:var(--ae-text-muted);align-items:center;gap:6px;margin-bottom:14px;font-size:.68rem;font-weight:700;display:flex}.itinerary-scroll::-webkit-scrollbar{width:5px}.itinerary-scroll::-webkit-scrollbar-track{background:0 0}.itinerary-scroll::-webkit-scrollbar-thumb{background:#c5d5cc;border-radius:4px}.timeline-item{margin-bottom:4px;padding-left:28px;position:relative}.timeline-line{background:var(--ae-border);width:2px;height:calc(100% - 8px);position:absolute;top:36px;left:9px}.timeline-dot{width:16px;height:16px;box-shadow:var(--ae-shadow-sm);z-index:1;border:2px solid #fff;border-radius:50%;position:absolute;top:18px;left:2px}.total-summary{border:1px solid var(--ae-border);border-radius:var(--ae-radius-sm);color:var(--ae-text-muted);background:#fff;margin-top:8px;padding:10px 12px;font-size:.78rem}.total-summary strong{color:var(--ae-text)}.stop-card{cursor:pointer;background:#fff;transition:transform .18s,box-shadow .18s,border-color .18s;overflow:hidden;border-radius:var(--ae-radius-sm)!important;border:1px solid var(--ae-border)!important}.stop-card:hover{transform:translateY(-2px);box-shadow:var(--ae-shadow-md)!important}.stop-card.selected{transform:translateY(-1px);border-color:var(--ae-green)!important;box-shadow:0 0 0 3px #1a6b3a26, var(--ae-shadow-md)!important}.stop-card .card-body{padding:12px 14px!important}.stop-card-img{object-fit:cover;border-radius:6px;width:100%;max-height:120px;margin-bottom:8px}.stop-type-badge{letter-spacing:.02em;font-weight:600;font-size:.65rem!important}.stop-meta{border-top:1px solid var(--ae-border);gap:12px;margin-top:4px;padding-top:8px;display:flex}.stop-meta span{color:var(--ae-text-muted);align-items:center;gap:4px;font-size:.74rem;display:flex}.stop-meta i{color:var(--ae-green);font-size:.8rem}.leaflet-container{z-index:0!important}@media (width<=767px){:root{--sidebar-width:100vw}.sidebar-panel.open{z-index:500;width:min(100vw,360px);position:absolute;top:0;bottom:0;left:0}.app-brand-sub,.live-badge span.label-text{display:none}}
