:root{--bg:#080a0d;--panel:#111318;--panel2:#191c22;--ink:#f6f7f8;--muted:#9197a0;--line:#2a2e35;--red:#e5322d;--cyan:#42c6f5;--green:#43d58a;--yellow:#ffd34f;--nav:calc(66px + env(safe-area-inset-bottom));--shadow:0 14px 40px rgba(0,0,0,.42);--ease:cubic-bezier(.2,.8,.2,1)}
*{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;overflow:hidden;background:var(--bg);color:var(--ink);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;-webkit-tap-highlight-color:transparent}button,input{font:inherit;color:inherit}button{border:0;cursor:pointer}svg{fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}#map{position:absolute;inset:0;z-index:1;background:#101318}.leaflet-container{background:#101318}.leaflet-control-attribution{font-size:7px!important;background:rgba(7,9,12,.65)!important;color:#727780!important}.leaflet-control-attribution a{color:#a1a6ae!important}
.topbar{position:absolute;z-index:700;left:12px;right:12px;top:calc(env(safe-area-inset-top) + 10px);height:46px;display:grid;grid-template-columns:46px 1fr 46px;align-items:center;pointer-events:none}.glass-btn,.brand-pill{pointer-events:auto}.glass-btn{width:44px;height:44px;border-radius:15px;background:rgba(16,18,23,.94);border:1px solid rgba(255,255,255,.11);box-shadow:0 7px 20px rgba(0,0,0,.3);display:grid;place-items:center;backdrop-filter:blur(16px)}.glass-btn svg{width:21px;height:21px}.brand-pill{justify-self:center;height:44px;max-width:138px;border-radius:15px;padding:6px 12px;background:#fff;border:1px solid rgba(255,255,255,.9);box-shadow:0 7px 20px rgba(0,0,0,.26);display:flex;align-items:center;justify-content:center}.brand-pill img{display:block;width:auto;height:28px;max-width:112px;object-fit:contain}.account-btn{position:relative}.account-btn i{position:absolute;right:4px;bottom:4px;width:9px;height:9px;border-radius:50%;background:#555b64;border:2px solid #101217}.account-btn i.on{background:var(--green)}
.map-controls{position:absolute;z-index:650;left:12px;right:12px;top:calc(env(safe-area-inset-top) + 66px);pointer-events:none}.search-box{height:44px;border-radius:14px;background:rgba(16,18,23,.94);border:1px solid rgba(255,255,255,.11);box-shadow:0 7px 20px rgba(0,0,0,.28);display:flex;align-items:center;gap:9px;padding:0 9px 0 12px;backdrop-filter:blur(16px);pointer-events:auto}.search-box>svg{width:18px;height:18px;color:#cbd0d6;flex:none}.search-box input{width:100%;min-width:0;border:0;outline:0;background:transparent;font-size:13px}.search-box input::placeholder{color:#858b95}.search-box button{width:28px;height:28px;border-radius:50%;background:transparent;color:#969ca6;font-size:20px;display:none}.search-box.has-value button{display:grid;place-items:center}.filter-bar{display:grid;grid-template-columns:.78fr 1.2fr 1.2fr .88fr;gap:5px;margin-top:7px;pointer-events:auto}.filter-btn{height:36px;min-width:0;border-radius:12px;padding:0 6px;background:rgba(16,18,23,.94);border:1px solid rgba(255,255,255,.1);display:flex;align-items:center;justify-content:center;gap:4px;box-shadow:0 5px 14px rgba(0,0,0,.23);backdrop-filter:blur(14px);font-size:9px;font-weight:850;white-space:nowrap}.filter-btn.active{background:#f4f5f6;color:#111318;border-color:#f4f5f6}.fi{width:23px;height:23px;border-radius:8px;display:grid;place-items:center;color:white;flex:none}.fi svg{width:13px;height:13px}.fi.all{background:#3b414a;font-size:11px}.fi.mech{background:var(--red)}.fi.elec{background:#087da7}.fi.dock{background:#138554}.filter-btn.active .fi{box-shadow:0 0 0 1px rgba(0,0,0,.1)}
.map-actions{position:absolute;z-index:640;right:12px;top:calc(env(safe-area-inset-top) + 163px);display:grid;gap:7px}.round-action{width:42px;height:42px;border-radius:50%;background:rgba(16,18,23,.94);border:1px solid rgba(255,255,255,.11);box-shadow:0 6px 18px rgba(0,0,0,.28);display:grid;place-items:center;color:#e9ebee;backdrop-filter:blur(14px)}.round-action svg{width:19px;height:19px}.round-action.active{color:var(--yellow);border-color:rgba(255,211,79,.42)}.round-action:active{transform:scale(.95)}
.sheet{position:absolute;z-index:620;left:10px;right:10px;bottom:calc(var(--nav) + 10px);height:84px;border-radius:20px;background:rgba(15,17,21,.97);border:1px solid rgba(255,255,255,.1);box-shadow:var(--shadow);backdrop-filter:blur(20px);overflow:hidden;transition:height .26s var(--ease)}.sheet.list{height:min(50vh,470px)}.sheet.detail{height:250px}.sheet-handle{width:100%;height:15px;background:transparent;display:grid;place-items:center}.sheet-handle span{width:36px;height:4px;border-radius:99px;background:#4f545d}.peek-view{height:68px;padding:0 11px 9px;display:flex;align-items:center;gap:8px}.sheet:not(.peek) .peek-view{display:none}.peek-main{min-width:0;flex:1;background:transparent;display:flex;align-items:center;gap:9px;text-align:left}.station-glyph{width:37px;height:37px;border-radius:12px;background:rgba(229,50,45,.14);color:#ff7169;display:grid;place-items:center;flex:none}.station-glyph svg{width:20px;height:20px}.peek-copy{min-width:0}.peek-copy small{display:block;font-size:7px;color:#858b94;font-weight:900;letter-spacing:.12em}.peek-copy strong{display:block;font-size:11px;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.peek-copy em{display:block;font-style:normal;font-size:8px;color:#747a84;margin-top:2px}.peek-stats{display:flex;gap:4px}.ps{height:31px;min-width:35px;border-radius:9px;padding:0 6px;display:flex;align-items:center;gap:3px;background:#22252c;font-size:9px}.ps.mech{color:#ff776e}.ps.elec{color:#6bd6ff}.ps.dock{color:#68e2a0}.ps b{color:#fff}.list-view,.detail-view{display:none}.sheet.list .list-view,.sheet.detail .detail-view{display:block}.list-view{height:calc(100% - 15px);padding:0 11px 10px}.sheet-title{height:52px;display:flex;align-items:center;justify-content:space-between}.sheet-title small{font-size:7px;color:var(--red);font-weight:900;letter-spacing:.13em}.sheet-title h1{font-size:20px;margin:2px 0 0;letter-spacing:-.035em}.sheet-title>span{font-size:8px;color:#7e848d}.station-list{height:calc(100% - 52px);overflow:auto;scrollbar-width:none}.station-list::-webkit-scrollbar{display:none}.station-row{min-height:62px;margin-bottom:7px;padding:8px 9px;border:1px solid #2b2e35;border-radius:13px;background:#191c22;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.station-name{font-size:11px;font-weight:820;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.station-sub{font-size:8px;color:#7f858f;margin-top:4px}.station-values{display:flex;gap:4px;margin-top:6px}.value-pill{height:23px;min-width:41px;border-radius:7px;padding:0 6px;display:inline-flex;align-items:center;justify-content:center;gap:3px;background:#22252c;font-size:9px}.value-pill svg{width:11px;height:11px}.value-pill.mech{color:#ff776e}.value-pill.elec{color:#6bd6ff}.value-pill.dock{color:#68e2a0}.station-side{text-align:right}.station-side strong{display:block;font-size:13px}.station-side small{display:block;font-size:8px;color:#7f858f;margin-top:4px}.empty{padding:26px 14px;border:1px dashed #333740;border-radius:13px;text-align:center;font-size:10px;color:#858b95}.detail-view{height:calc(100% - 15px);padding:0 13px 12px}.detail-head{height:60px;display:grid;grid-template-columns:minmax(0,1fr) 38px;gap:8px}.detail-head small{font-size:7px;color:var(--red);font-weight:900;letter-spacing:.12em}.detail-head h1{font-size:17px;margin:3px 0 2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.detail-head p{font-size:8px;color:#858b94;margin:0}.detail-fav{width:36px;height:36px;border-radius:50%;background:#22252c;display:grid;place-items:center;color:#7d838d}.detail-fav svg{width:19px;height:19px}.detail-fav.on{color:var(--yellow)}.detail-stats{height:86px;display:grid;grid-template-columns:repeat(3,1fr);gap:6px}.stat{border-radius:13px;background:#1c1f25;border:1px solid #2b2e35;display:grid;grid-template-columns:24px 1fr;grid-template-rows:1fr 1fr;align-items:center;padding:8px}.stat-icon{grid-row:1/3;width:23px;height:23px;border-radius:7px;display:grid;place-items:center}.stat-icon svg{width:13px;height:13px}.stat.mech .stat-icon{background:rgba(229,50,45,.14);color:#ff776e}.stat.elec .stat-icon{background:rgba(66,198,245,.12);color:#6bd6ff}.stat.dock .stat-icon{background:rgba(67,213,138,.12);color:#68e2a0}.stat strong{font-size:18px}.stat small{font-size:7px;color:#89909a;white-space:nowrap}.detail-actions{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-top:8px}.primary-btn,.secondary-btn{height:41px;border-radius:11px;font-size:10px;font-weight:850}.primary-btn{background:var(--red);color:#fff}.secondary-btn{background:#23262d;color:#f0f2f4;border:1px solid #353941;display:flex;align-items:center;justify-content:center;gap:5px}.secondary-btn svg{width:14px;height:14px}.full{width:100%}
.bottom-nav{position:absolute;z-index:700;left:0;right:0;bottom:0;height:var(--nav);padding:4px 5px env(safe-area-inset-bottom);background:rgba(9,11,14,.985);border-top:1px solid rgba(255,255,255,.08);display:grid;grid-template-columns:repeat(5,1fr);backdrop-filter:blur(18px)}.nav-item{position:relative;background:transparent;color:#777d86;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px}.nav-item svg{width:20px;height:20px}.nav-item small{font-size:8px;font-weight:750}.nav-item.active{color:#f3f4f5}.nav-item.active:not(.scan-nav):after{content:"";position:absolute;top:1px;width:21px;height:2px;border-radius:3px;background:var(--red)}.scan-nav{overflow:visible}.scan-orb{width:44px;height:44px;margin-top:-7px;border-radius:50%;background:var(--red);display:grid;place-items:center;color:#fff;box-shadow:0 7px 18px rgba(229,50,45,.35),0 0 0 4px #0a0c0f}.scan-orb svg{width:20px;height:20px}.scan-nav small{margin-top:-1px;color:#dde0e4}
/* density-safe map markers */.leaflet-div-icon{border:0;background:transparent}.cluster-marker{width:38px;height:38px;border-radius:50%;background:#121419;border:2px solid #fff;box-shadow:0 4px 14px rgba(0,0,0,.42);display:grid;place-items:center;color:#fff;font-size:10px;font-weight:900;position:relative}.cluster-marker:after{content:"";position:absolute;inset:4px;border-radius:50%;border:2px solid var(--red);opacity:.9}.cluster-marker b{position:relative;z-index:1}.station-marker{height:31px;min-width:38px;border-radius:16px;background:#111318;border:2px solid #fff;box-shadow:0 4px 12px rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;gap:4px;padding:0 7px;color:#fff;font-size:9px;font-weight:900}.station-marker .dot{width:9px;height:9px;border-radius:50%;background:var(--red)}.station-marker.electric .dot{background:var(--cyan)}.station-marker.docks .dot{background:var(--green)}.station-marker.selected{outline:3px solid rgba(255,255,255,.18);transform:scale(1.06)}.selected-marker{height:36px;border-radius:18px;background:#111318;border:2px solid white;box-shadow:0 6px 18px rgba(0,0,0,.48);display:flex;align-items:center;gap:4px;padding:0 6px}.selected-marker .sel-icon{width:25px;height:25px;border-radius:50%;background:var(--red);display:grid;place-items:center;color:#fff}.selected-marker .sel-icon svg{width:14px;height:14px}.selected-marker .sv{height:23px;min-width:30px;border-radius:8px;padding:0 5px;display:flex;align-items:center;justify-content:center;gap:2px;font-size:8px;font-weight:900}.selected-marker .sv svg{width:10px;height:10px}.selected-marker .sv.mech{background:rgba(229,50,45,.16);color:#ff776e}.selected-marker .sv.elec{background:rgba(66,198,245,.13);color:#6bd6ff}.selected-marker .sv.dock{background:rgba(67,213,138,.13);color:#68e2a0}
.overlay{position:fixed;z-index:3000;inset:0;background:rgba(0,0,0,.58);backdrop-filter:blur(7px);opacity:0;pointer-events:none;transition:.2s var(--ease);display:grid;place-items:end center}.overlay.show{opacity:1;pointer-events:auto}.drawer-overlay{place-items:stretch start}.drawer{width:min(350px,86vw);height:100%;background:#121419;border-right:1px solid #2b2f36;padding:calc(env(safe-area-inset-top) + 18px) 18px 20px;transform:translateX(-100%);transition:.24s var(--ease);box-shadow:25px 0 60px rgba(0,0,0,.4)}.drawer-overlay.show .drawer{transform:none}.drawer-head{height:50px;display:flex;align-items:center;justify-content:space-between}.drawer-head img{height:33px;width:auto;background:#fff;border-radius:9px;padding:4px 7px}.drawer-head>button,.modal-head>button{width:37px;height:37px;border-radius:50%;background:#22252c;color:#fff;font-size:22px}.drawer>p{font-size:10px;color:#858b95;margin:12px 0 23px}.drawer>button[data-go]{width:100%;height:54px;background:transparent;border-top:1px solid #292d34;display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:800}.drawer>button[data-go] span{font-size:20px;color:#686e78}.drawer-foot{position:absolute;bottom:24px;font-size:8px;color:#606670}.modal-card{width:min(460px,calc(100% - 22px));max-height:88vh;overflow:auto;background:#14171c;border:1px solid #2e3239;border-radius:23px;padding:19px;box-shadow:var(--shadow);transform:translateY(15px);transition:.22s var(--ease);margin-bottom:calc(env(safe-area-inset-bottom) + 8px)}.overlay.show .modal-card{transform:none}.modal-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:17px}.modal-head small{font-size:8px;color:var(--red);font-weight:900;letter-spacing:.13em}.modal-head h2{font-size:22px;margin:3px 0 0}.modal-logo{height:28px;width:auto;background:#fff;border-radius:8px;padding:3px 6px;margin-bottom:8px}.empty-screen{text-align:center;padding:10px 5px 4px}.big-icon{width:62px;height:62px;border-radius:20px;background:#1e2127;display:grid;place-items:center;color:#adb2bb;margin:0 auto 14px}.big-icon svg{width:29px;height:29px}.empty-screen h3{font-size:16px;margin:0 0 6px}.empty-screen p{font-size:10px;line-height:1.5;color:#8c929c;margin:0 auto 17px;max-width:290px}.auth-lead{font-size:10px;color:#959ba5;line-height:1.55}.auth-card form{display:grid;gap:10px}.auth-card label{font-size:9px;font-weight:800;color:#b8bdc5}.auth-card input{width:100%;height:45px;border:1px solid #31353d;border-radius:10px;background:#1c1f25;margin-top:5px;padding:0 11px;outline:0}.auth-card input:focus{border-color:var(--red)}.auth-error{min-height:18px;color:#ff8277;font-size:9px;margin-top:8px}.account-hero{display:flex;align-items:center;gap:11px}.account-hero>img{width:88px;height:auto;background:#fff;border-radius:9px;padding:5px 7px}.account-hero h3{margin:0 0 3px}.account-hero p{margin:0;font-size:9px;color:#858b95}.account-grid{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin:14px 0}.account-grid>div,.account-detail{border:1px solid #2d3138;background:#1b1e24;border-radius:11px;padding:10px}.account-grid small{font-size:7px;color:#7e848d}.account-grid strong{display:block;margin-top:4px;font-size:11px}.account-detail{font-size:9px;line-height:1.5;color:#aaafb7;margin-bottom:11px}.fullscreen-panel{width:100%;height:100%;background:#090b0e;display:flex;flex-direction:column}.fullscreen-panel>header{height:calc(62px + env(safe-area-inset-top));padding:env(safe-area-inset-top) 14px 0;display:grid;grid-template-columns:42px 1fr 42px;align-items:center;text-align:center;border-bottom:1px solid #252930}.fullscreen-panel>header img{height:28px;width:auto;justify-self:center;background:#fff;border-radius:8px;padding:4px 6px}.back-btn{background:transparent;font-size:23px}.panel-copy{text-align:center;padding:23px 18px 15px}.panel-icon{width:50px;height:50px;border-radius:17px;background:rgba(229,50,45,.14);color:#ff7168;display:grid;place-items:center;margin:0 auto 12px}.panel-icon svg{width:24px;height:24px}.panel-copy h2{font-size:18px;margin:0 0 6px}.panel-copy p{font-size:10px;color:#858b95;margin:0}.camera-box{position:relative;flex:1;min-height:280px;margin:0 14px;border-radius:19px;overflow:hidden;background:#15181d;display:grid;place-items:center}.camera-box video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.camera-box>div:last-child{font-size:10px;color:#858b95}.scan-frame{position:absolute;width:min(245px,70vw);aspect-ratio:1;z-index:2}.scan-frame i{position:absolute;width:45px;height:45px;border-style:solid;border-color:#fff}.scan-frame i:nth-child(1){left:0;top:0;border-width:3px 0 0 3px;border-radius:12px 0 0 0}.scan-frame i:nth-child(2){right:0;top:0;border-width:3px 3px 0 0;border-radius:0 12px 0 0}.scan-frame i:nth-child(3){left:0;bottom:0;border-width:0 0 3px 3px;border-radius:0 0 0 12px}.scan-frame i:nth-child(4){right:0;bottom:0;border-width:0 3px 3px 0;border-radius:0 0 12px 0}.panel-note{font-size:8px;line-height:1.45;color:#777d86;text-align:center;padding:13px 24px calc(18px + env(safe-area-inset-bottom));margin:0}.toast{position:absolute;z-index:4000;left:50%;bottom:calc(var(--nav) + 18px);transform:translate(-50%,10px);opacity:0;background:#f5f6f7;color:#111318;border-radius:999px;padding:9px 13px;font-size:9px;font-weight:850;white-space:nowrap;box-shadow:var(--shadow);transition:.2s var(--ease);pointer-events:none}.toast.show{opacity:1;transform:translate(-50%,0)}
@media(max-width:370px){.filter-btn{font-size:8px;padding:0 4px}.fi{width:21px;height:21px}.peek-stats{gap:3px}.ps{min-width:32px;padding:0 4px}.stat{padding:6px}.stat small{font-size:6px}}
@media(min-width:760px){.topbar{left:20px;right:auto;width:410px;top:20px}.map-controls{left:20px;right:auto;width:410px;top:76px}.map-actions{left:385px;right:auto;top:166px}.bottom-nav{left:auto;right:20px;bottom:20px;width:430px;height:66px;padding-bottom:4px;border:1px solid #2a2e35;border-radius:17px;overflow:visible}.sheet{left:auto;right:20px;bottom:96px;width:430px}.sheet.list{height:min(60vh,570px)}.overlay{place-items:center}.drawer-overlay{place-items:stretch start}.modal-card{margin:0}.fullscreen-panel{width:min(430px,100%);height:min(850px,95vh);border-radius:24px;overflow:hidden}}
@media(max-height:650px){.filter-btn{height:33px}.map-actions{top:calc(env(safe-area-inset-top) + 154px)}.sheet.list{height:46vh}.sheet.detail{height:225px}.detail-stats{height:73px}.detail-head{height:55px}.stat{padding:6px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{transition:none!important;animation:none!important}}
/* v12 electric assistant + internal pedestrian navigation */
.sheet.smart{height:222px}.sheet.route{height:238px}.smart-view,.route-view{display:none}.sheet.smart .smart-view,.sheet.route .route-view{display:block;height:calc(100% - 15px);padding:0 12px 11px}.sheet.smart .peek-view,.sheet.smart .list-view,.sheet.smart .detail-view,.sheet.route .peek-view,.sheet.route .list-view,.sheet.route .detail-view{display:none}.smart-head{height:61px;display:grid;grid-template-columns:minmax(0,1fr) 35px;gap:8px}.smart-head small,.route-head small{font-size:7px;font-weight:900;letter-spacing:.13em;color:var(--cyan)}.smart-head h1,.route-head h1{font-size:17px;margin:2px 0 1px;letter-spacing:-.03em}.smart-head p,.route-head p{font-size:8px;color:#858b94;margin:0}.smart-head>button,.route-head>button{width:34px;height:34px;border-radius:50%;background:#22252c;color:#fff;font-size:20px}.smart-grid{display:grid;grid-template-columns:1fr 1fr;gap:7px}.smart-card{height:92px;border-radius:14px;background:#1b1e24;border:1px solid #2d3139;text-align:left;padding:9px;display:grid;grid-template-columns:30px minmax(0,1fr);gap:7px;align-items:start}.smart-card:active{transform:scale(.985)}.smart-card.reliable{border-color:rgba(67,213,138,.28)}.smart-icon{width:28px;height:28px;border-radius:9px;background:rgba(66,198,245,.13);color:#70d7ff;display:grid;place-items:center;font-weight:900}.reliable .smart-icon{background:rgba(67,213,138,.13);color:#6ee4a3}.smart-card small{font-size:6px;font-weight:900;letter-spacing:.09em;color:#858b94}.smart-card strong{display:block;font-size:10px;line-height:1.15;margin:4px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.smart-card em{display:block;font-style:normal;font-size:8px;color:#a2a7af;line-height:1.3}.confidence-note{font-size:7px;color:#717680;margin:6px 2px 0;line-height:1.35}.route-head{height:59px;display:grid;grid-template-columns:minmax(0,1fr) 35px;gap:8px}.route-head p b{color:#fff;font-size:10px}.next-turn{height:57px;border-radius:13px;background:#1b1e24;border:1px solid #2c3038;padding:8px 10px;display:grid;grid-template-columns:34px 1fr;gap:8px;align-items:center}.turn-icon{width:32px;height:32px;border-radius:10px;background:rgba(66,198,245,.13);color:#73d9ff;display:grid;place-items:center;font-size:20px;font-weight:900}.next-turn small{display:block;font-size:6px;color:#777d86;font-weight:900;letter-spacing:.1em}.next-turn strong{display:block;font-size:10px;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.steps-toggle{width:100%;height:34px;margin-top:6px;border-radius:10px;background:#20232a;color:#c6cad0;font-size:9px;font-weight:800}.route-steps{display:none;max-height:110px;overflow:auto;margin-top:5px;border-top:1px solid #292d34}.route-steps.open{display:block}.route-step{display:grid;grid-template-columns:24px 1fr auto;gap:7px;align-items:center;min-height:40px;border-bottom:1px solid #272b32;font-size:9px}.route-step>span:first-child{width:22px;height:22px;border-radius:7px;background:#20242b;display:grid;place-items:center;color:#71d8ff}.route-step small{color:#777d86;font-size:7px}.routing .map-controls,.routing .map-actions{opacity:0;pointer-events:none}.routing .topbar .glass-btn:first-child{opacity:.4;pointer-events:none}.route-line-halo{stroke-linecap:round;stroke-linejoin:round}.smart-loading{opacity:.6;pointer-events:none}
/* Fix icon optical alignment across all cards/buttons */
.fi svg,.value-pill svg,.stat-icon svg,.selected-marker svg,.round-action svg,.glass-btn svg,.nav-item>svg,.scan-orb svg{display:block;margin:auto}.stat-icon,.fi,.round-action,.glass-btn,.scan-orb{line-height:0}.detail-stats .stat strong{align-self:end;line-height:1}.detail-stats .stat small{align-self:start;margin-top:3px}.brand-pill img{object-position:center}
@media(max-width:370px){.sheet.smart{height:230px}.smart-card{padding:8px 7px;grid-template-columns:26px 1fr}.smart-icon{width:25px;height:25px}.smart-card strong{font-size:9px}}


/* v13: prevent floating controls from overlapping expanded panels */
#app.sheet-peek .map-actions{opacity:1;pointer-events:auto;transform:translateX(0)}
#app.sheet-list .map-actions,#app.sheet-detail .map-actions,#app.sheet-smart .map-actions,#app.sheet-route .map-actions{opacity:0;pointer-events:none;transform:translateX(14px)}
.map-actions{transition:opacity .18s ease,transform .18s ease}
#app.sheet-list .map-controls{z-index:640}
#app.sheet-detail .map-controls,#app.sheet-smart .map-controls,#app.sheet-route .map-controls{opacity:.96}
/* CARTO tiles should render naturally; remove any inherited filter surprises */
.leaflet-tile{filter:none!important}


/* v14: dual availability marker — orange mechanical + blue electric */
.station-marker.dual{height:32px;min-width:74px;padding:0 6px;gap:5px;border-radius:16px}
.station-marker.dual .bike-count{height:23px;min-width:28px;padding:0 4px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;gap:3px;font-size:9px;font-weight:900}
.station-marker.dual .bike-count .bike-dot{width:8px;height:8px;border-radius:50%;flex:none}
.station-marker.dual .bike-count.mech{background:rgba(255,122,61,.13);color:#ffb08a}
.station-marker.dual .bike-count.mech .bike-dot{background:#ff7a3d;box-shadow:0 0 0 2px rgba(255,122,61,.12)}
.station-marker.dual .bike-count.elec{background:rgba(69,183,255,.13);color:#8ed4ff}
.station-marker.dual .bike-count.elec .bike-dot{background:#45b7ff;box-shadow:0 0 0 2px rgba(69,183,255,.12)}
.station-marker.dual .bike-count b{color:#fff;line-height:1}
/* filtered modes keep one strong semantic dot */
.station-marker.mechanical .dot{background:#ff7a3d}
.station-marker.electric .dot{background:#45b7ff}

/* v15 — spacing & optical-alignment audit */
:root{--u1:4px;--u2:8px;--u3:12px;--u4:16px}
button, .value-pill, .ps, .filter-btn, .nav-item, .smart-card, .next-turn, .route-step{line-height:1.15}
button svg,.value-pill svg,.ps svg,.filter-btn svg,.nav-item svg,.smart-card svg,.next-turn svg,.route-step svg{flex:0 0 auto}

/* top filters: icons and labels breathe consistently */
.filter-btn{gap:7px;padding:0 8px;line-height:1;align-items:center}
.filter-btn b{display:block;line-height:1.1;transform:translateY(.2px)}
.fi{margin:0;flex:none}

/* compact station peek: replace font glyphs with aligned vector icons */
.peek-main{gap:11px}
.peek-copy small{line-height:1.15;margin-bottom:1px}
.peek-copy strong{line-height:1.18}
.peek-copy em{line-height:1.2}
.peek-stats{gap:6px;align-items:center;flex:none}
.ps{gap:5px;min-width:40px;height:32px;padding:0 7px;align-items:center;justify-content:center}
.ps svg{width:13px;height:13px;display:block}
.ps b{font-size:10px;line-height:1}

/* station rows: consistent baseline and clear separation from counts */
.station-row{padding:10px 11px;column-gap:11px}
.station-name{line-height:1.22}
.station-sub{line-height:1.25;margin-top:5px}
.station-values{gap:6px;margin-top:8px;align-items:center}
.value-pill{gap:5px;height:25px;min-width:44px;padding:0 7px;line-height:1}
.value-pill svg{width:12px;height:12px;display:block}
.value-pill b{line-height:1;font-size:9px}
.station-side{padding-left:6px;min-width:42px}
.station-side strong{line-height:1}
.station-side small{line-height:1.15;margin-top:6px}

/* station detail: make icon / number / label read as one unit */
.detail-head h1{line-height:1.16}
.detail-head p{line-height:1.2;margin-top:2px}
.detail-stats{gap:8px}
.stat{grid-template-columns:27px 1fr;column-gap:7px;padding:9px 8px}
.stat-icon{width:25px;height:25px}
.stat-icon svg{width:14px;height:14px}
.stat strong{font-size:18px;line-height:1;align-self:end}
.stat small{line-height:1.1;margin-top:4px;align-self:start}
.detail-actions{gap:9px;margin-top:10px}
.primary-btn,.secondary-btn{padding:0 13px;line-height:1.1}
.secondary-btn{gap:8px}
.secondary-btn svg{width:15px;height:15px}

/* bottom navigation: normalize icon-to-label distance */
.bottom-nav{padding-top:5px}
.nav-item{gap:6px;line-height:1}
.nav-item>svg{width:21px;height:21px;display:block}
.nav-item small{display:block;line-height:1;font-size:8px}
.scan-nav{gap:4px}
.scan-orb{margin-bottom:1px}

/* smart electric assistant */
.smart-card{grid-template-columns:31px minmax(0,1fr);gap:9px;padding:10px}
.smart-card small{line-height:1.15}
.smart-card strong{line-height:1.2;margin:5px 0}
.smart-card em{line-height:1.35}
.smart-icon{margin-top:1px}
.confidence-note{line-height:1.45;margin-top:8px}

/* routing */
.route-head h1{line-height:1.18}
.route-head p{line-height:1.2;margin-top:2px}
.next-turn{grid-template-columns:35px minmax(0,1fr);gap:10px;padding:9px 11px}
.next-turn small{line-height:1.1}
.next-turn strong{line-height:1.22;margin-top:5px}
.steps-toggle{display:flex;align-items:center;justify-content:center;gap:7px;line-height:1}
.steps-toggle span{display:inline-block;line-height:1;transform:translateY(-1px)}
.route-step{grid-template-columns:25px minmax(0,1fr) auto;gap:9px;padding:5px 2px;line-height:1.25}
.route-step>span:first-child{margin-right:1px}
.route-step small{line-height:1.15}

/* account, drawer and modal rhythm */
.modal-head{gap:12px}
.modal-head h2{line-height:1.12}
.auth-lead{line-height:1.6;margin-bottom:14px}
.auth-card form{gap:13px}
.auth-card label{line-height:1.2}
.auth-card input{margin-top:7px}
.account-hero{gap:14px}
.account-hero h3{line-height:1.15;margin-bottom:5px}
.account-hero p{line-height:1.3}
.account-grid{gap:9px;margin:16px 0}
.account-grid strong{line-height:1.15;margin-top:6px}
.drawer>button[data-go]{padding:0 2px;line-height:1.15}
.drawer>button[data-go] span{margin-left:12px;line-height:1}
.empty-screen h3{line-height:1.2}
.empty-screen p{line-height:1.55}

/* QR screen */
.panel-copy h2{line-height:1.18;margin-bottom:8px}
.panel-copy p{line-height:1.4}
.panel-note{line-height:1.55}

/* map compact markers */
.station-marker.dual{gap:6px;padding:0 7px}
.station-marker.dual .bike-count{gap:4px;padding:0 5px}
.selected-marker{gap:5px;padding:0 7px}
.selected-marker .sv{gap:3px;padding:0 5px}

@media(max-width:370px){
  .filter-btn{gap:5px;padding:0 5px}
  .peek-stats{gap:4px}.ps{min-width:35px;padding:0 5px;gap:4px}
  .station-values{gap:4px}.value-pill{min-width:40px;padding:0 5px;gap:4px}
  .stat{grid-template-columns:24px 1fr;column-gap:5px;padding:7px 6px}
  .stat small{font-size:6px}
  .nav-item{gap:5px}
}


/* v16 — filter-semantic marker colors */
.cluster-marker.electric:after{border-color:#45b7ff}
.cluster-marker.mechanical:after{border-color:#ff7a3d}
.cluster-marker.docks:after{border-color:#43d58a}
.cluster-marker.all:after{border-color:var(--red)}
.station-marker.electric .dot{background:#45b7ff!important}
.station-marker.mechanical .dot{background:#ff7a3d!important}
.station-marker.docks .dot{background:#43d58a!important}
.selected-marker .sel-icon.elec{background:#0f7fae;color:#8edcff}
.selected-marker .sel-icon.mech{background:#a83a1e;color:#ffb08a}
.selected-marker .sel-icon.dock{background:#137e50;color:#7be7aa}
.selected-marker.electric-mode{border-color:#8edcff;box-shadow:0 6px 18px rgba(69,183,255,.24)}
.selected-marker.mechanical-mode{border-color:#ffb08a;box-shadow:0 6px 18px rgba(255,122,61,.22)}
.selected-marker.dock-mode{border-color:#7be7aa;box-shadow:0 6px 18px rgba(67,213,138,.22)}

/* v17 location marker */
.leaflet-tooltip{font-weight:700}


/* v18 — lock the whole application to one fixed viewport */
html,body{
  width:100%;height:100%;margin:0;padding:0;
  overflow:hidden!important;
  overscroll-behavior:none!important;
  position:fixed;
  inset:0;
  touch-action:none;
}
body{min-height:100dvh;max-height:100dvh}
#app{
  position:fixed!important;
  inset:0!important;
  width:100vw!important;
  height:100dvh!important;
  min-height:100dvh!important;
  max-height:100dvh!important;
  overflow:hidden!important;
  overscroll-behavior:none!important;
  contain:layout paint size;
}

/* The map remains pannable/zoomable; chrome does not move with it */
#map,.leaflet-container{
  position:absolute!important;
  inset:0!important;
  width:100%!important;
  height:100%!important;
  touch-action:none;
  overscroll-behavior:none;
}

/* Fixed chrome: no accidental scroll/bounce on menus, header or navigation */
.topbar,.map-controls,.map-actions,.bottom-nav,.sheet,.drawer,.modal-card,.fullscreen-panel{
  overscroll-behavior:none;
}
.topbar,.map-controls,.map-actions,.bottom-nav{touch-action:none}
.bottom-nav{position:absolute!important}
.sheet{position:absolute!important;touch-action:none}
.drawer{overflow:hidden!important;touch-action:none}
.drawer-overlay,.overlay{overflow:hidden!important;overscroll-behavior:none!important;touch-action:none}
.fullscreen-panel{overflow:hidden!important;touch-action:none}

/* Only explicit content regions may scroll, and they cannot propagate bounce to the app */
.station-list,.route-steps,.modal-card{
  overscroll-behavior:contain!important;
  -webkit-overflow-scrolling:touch;
  touch-action:pan-y!important;
  scrollbar-width:none;
}
.station-list::-webkit-scrollbar,.route-steps::-webkit-scrollbar,.modal-card::-webkit-scrollbar{display:none}

/* Drawer/menu itself stays fixed; long drawer content is fitted rather than page-scrolled */
.drawer>button[data-go]{flex:0 0 auto}

/* Prevent layout jumps caused by mobile browser address-bar resizing */
@supports(height:100svh){
  #app{height:100svh!important;min-height:100svh!important;max-height:100svh!important}
  body{min-height:100svh!important;max-height:100svh!important}
}


/* v21 — compact navigation panel: keep the route visible */
.sheet.route{height:156px!important}
.sheet.route .route-view{padding:0 12px 10px!important}
.route-head{height:52px!important;position:relative!important;display:block!important;text-align:center!important;padding:0 44px!important}
.route-head>div{width:100%;min-width:0}
.route-head small{display:block;line-height:1.1;margin-bottom:3px}
.route-head h1{font-size:14px!important;line-height:1.15!important;margin:0!important;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;text-align:center!important}
.route-head p{font-size:8px!important;line-height:1.15!important;margin:4px 0 0!important;text-align:center!important}
.route-head>button{position:absolute!important;right:0!important;top:1px!important;width:32px!important;height:32px!important}
.next-turn{height:48px!important;grid-template-columns:31px minmax(0,1fr)!important;gap:9px!important;padding:7px 9px!important}
.turn-icon{width:30px!important;height:30px!important;font-size:18px!important}
.next-turn small{font-size:6px!important;margin-bottom:3px!important}
.next-turn strong{font-size:9px!important;line-height:1.22!important;margin:0!important;display:-webkit-box!important;-webkit-line-clamp:2!important;-webkit-box-orient:vertical!important;white-space:normal!important;overflow:hidden!important}
.steps-toggle{height:27px!important;margin-top:5px!important;border-radius:9px!important;font-size:8px!important}
.route-steps{display:none!important}
/* full directions live in their own modal, never inside the map sheet */
.route-steps-modal{max-height:min(70vh,560px)!important}
.route-steps-full{max-height:calc(70vh - 88px);overflow:auto;overscroll-behavior:contain;scrollbar-width:none}
.route-steps-full::-webkit-scrollbar{display:none}
.route-steps-full .route-step{min-height:44px;padding:6px 2px}
@media(max-height:700px){.sheet.route{height:150px!important}.route-head{height:49px!important}.next-turn{height:46px!important}}


/* v25 — explicit geolocation permission flow for Safari/iOS */
.location-overlay{z-index:3600!important}
.location-card{width:min(370px,calc(100% - 28px))!important;text-align:center;padding:24px 20px 18px!important;overflow:hidden!important;touch-action:none!important}
.location-icon{width:58px;height:58px;border-radius:18px;margin:0 auto 14px;background:rgba(69,183,255,.13);color:#64c7ff;display:grid;place-items:center}
.location-icon svg{width:28px;height:28px}
.location-card h2{font-size:20px;line-height:1.15;margin:0 0 8px}
.location-card p{font-size:10px;line-height:1.55;color:#9298a1;margin:0 auto 18px;max-width:290px}
.location-card .primary-btn{height:46px;font-size:11px}
.location-later{width:100%;height:39px;margin-top:7px;background:transparent;color:#898f98;font-size:9px;font-weight:750}
.location-card.blocked .location-icon{background:rgba(229,50,45,.12);color:#ff7169}
.location-card.loading .primary-btn{opacity:.65;pointer-events:none}


/* v26 — blocked geolocation should guide, not trap */
.location-help{margin:12px 0 2px;padding:12px 13px;border-radius:12px;background:#1a1d23;border:1px solid #2c3139;text-align:left}
.location-help strong{display:block;font-size:9px;line-height:1.2;margin-bottom:8px;color:#f0f2f4}
.location-help span{display:block;font-size:8px;line-height:1.45;color:#9ba1aa;margin-top:4px}
.location-card.blocked .location-help{display:block!important}
.location-card.blocked .primary-btn{background:#252931;border:1px solid #3a4049;color:#f4f5f6}
.location-card.blocked .location-later{color:#a3a9b2}
.location-status-chip{position:absolute;left:50%;bottom:calc(var(--nav) + 18px);transform:translateX(-50%);z-index:790;background:#171a20;border:1px solid #2d323a;border-radius:999px;padding:8px 11px;font-size:8px;color:#c6cbd2;box-shadow:0 8px 24px rgba(0,0,0,.32)}


/* v28 — local QR scan + safe handoff to official SMOU */
.qr-result{width:min(340px,calc(100% - 36px));margin:12px auto 0;padding:11px 12px;border-radius:13px;background:#15191f;border:1px solid #303640;text-align:center}
.qr-result small{display:block;font-size:7px;letter-spacing:.12em;color:#7f8791;margin-bottom:5px}
.qr-result strong{display:block;font-size:11px;line-height:1.3;word-break:break-all;color:#eef2f5;margin-bottom:9px}
.qr-official-actions{width:min(340px,calc(100% - 36px));margin:12px auto 0;text-align:center}
.qr-official-actions small{display:block;font-size:7px;line-height:1.4;color:#858c96;margin-top:7px}
.smou-official{height:46px!important}
.smou-reserve-btn{width:100%;height:34px;border-radius:10px;margin-top:7px;background:#171b21;border:1px solid #313740;color:#eef1f4;font-size:8px;font-weight:800}
.smou-reserve-btn span{margin-left:5px;color:#66c8ff}
