@font-face{font-family:Hammersmith One;src:url(../fonts/hammersmithone.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}:root{--font-display: "Hammersmith One", system-ui, sans-serif;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--bg: #e9edf3;--surface: #ffffff;--surface-2: #f4f7fb;--surface-3: #e6ebf2;--text: #161b23;--text-dim: #566072;--text-faint: #8b94a4;--border: #dbe1ea;--border-strong: #c7cfdb;--accent: #2c4fce;--accent-soft: #e5eafb;--accent-ink: #ffffff;--map-bg: #e7ecf3;--marker-ring: #2b323d;--marker-bg: #ffffff;--label: #1a212b;--label-halo: #eef2f7;--danger: #c8321f;--good: #1f9d55;--shadow-1: 0 1px 2px rgba(30, 41, 59, .06), 0 2px 8px rgba(30, 41, 59, .06);--shadow-2: 0 6px 20px rgba(23, 33, 54, .12), 0 2px 6px rgba(23, 33, 54, .08);--sheet-shadow: 0 -8px 30px rgba(20, 28, 46, .14);--radius: 16px;--radius-sm: 11px;--safe-b: env(safe-area-inset-bottom, 0px);--safe-t: env(safe-area-inset-top, 0px)}:root[data-theme=dark]{--bg: #0c0f14;--surface: #161b22;--surface-2: #1b212a;--surface-3: #232b36;--text: #e7ebf1;--text-dim: #9aa4b3;--text-faint: #69727f;--border: #262e39;--border-strong: #333d4a;--accent: #7591ff;--accent-soft: #1c2740;--accent-ink: #0c0f14;--map-bg: #0a0d12;--marker-ring: #cbd4e0;--marker-bg: #12171f;--label: #e7ebf1;--label-halo: #0a0d12;--danger: #ff6a52;--good: #43c07a;--shadow-1: 0 1px 2px rgba(0, 0, 0, .4);--shadow-2: 0 8px 26px rgba(0, 0, 0, .5);--sheet-shadow: 0 -10px 34px rgba(0, 0, 0, .55)}*{box-sizing:border-box}html,body{margin:0;height:100%}body{font-family:var(--font-body);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overscroll-behavior:none}button{font-family:inherit;cursor:pointer}.tnum{font-variant-numeric:tabular-nums}.boot,.fatal{position:fixed;inset:0;display:grid;place-items:center;color:var(--text-dim);font-family:var(--font-display)}#app{position:fixed;inset:0;display:flex;flex-direction:column;overflow:hidden}.topbar{position:absolute;top:0;left:0;right:0;z-index:30;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:calc(var(--safe-t) + 10px) 12px 10px;pointer-events:none}.topbar>*{pointer-events:auto}.brand{display:flex;align-items:center;gap:9px;background:color-mix(in srgb,var(--surface) 84%,transparent);backdrop-filter:blur(14px) saturate(1.2);border:1px solid var(--border);border-radius:999px;padding:7px 14px 7px 9px;box-shadow:var(--shadow-1)}.brand-mark{width:18px;height:18px;border-radius:50%;border:3.5px solid var(--accent);position:relative}.brand-mark:after{content:"";position:absolute;left:-4px;right:-4px;top:50%;height:3.5px;background:var(--accent);transform:translateY(-50%);border-radius:2px}.brand-name{font-family:var(--font-display);font-size:16px;letter-spacing:.2px;white-space:nowrap}.brand{flex:none}.topbar-controls{display:flex;align-items:center;gap:8px}.seg-toggle{display:inline-flex;background:color-mix(in srgb,var(--surface) 84%,transparent);backdrop-filter:blur(14px) saturate(1.2);border:1px solid var(--border);border-radius:999px;padding:3px;box-shadow:var(--shadow-1)}.seg{border:0;background:transparent;color:var(--text-dim);font-size:13px;font-weight:600;padding:7px 13px;border-radius:999px;min-height:34px;transition:color .15s,background .15s}.seg.on{background:var(--accent);color:var(--accent-ink);box-shadow:var(--shadow-1)}.icon-btn{width:42px;height:42px;border-radius:50%;background:color-mix(in srgb,var(--surface) 84%,transparent);backdrop-filter:blur(14px) saturate(1.2);border:1px solid var(--border);color:var(--text-dim);font-size:18px;display:grid;place-items:center;box-shadow:var(--shadow-1);transition:color .15s,border-color .15s}.icon-btn.on{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 40%,var(--border))}.map-wrap{position:absolute;inset:0;z-index:1;background:radial-gradient(120% 90% at 50% 0%,color-mix(in srgb,var(--surface-2) 60%,transparent),transparent 70%),var(--map-bg);touch-action:none;overflow:hidden}.map-svg{width:100%;height:100%;display:block;touch-action:none}.map-svg .camera{will-change:transform}.map-svg.morphing .layer-labels{visibility:hidden}.seg{stroke-linejoin:round;vector-effect:non-scaling-stroke;stroke-width:var(--seg-w, 5.4)}.seg.mode-dlr,.seg.mode-elizabeth-line{stroke-width:calc(var(--seg-w, 5.4) * .82)}.map-svg .seg,.map-svg .layer-lines{transition:opacity .35s}.map-svg.has-route .layer-lines{opacity:.24}.map-svg.has-route .layer-landmarks{opacity:.28}.map-svg.has-route .station:not(.on-route){opacity:.26}.map-svg.has-route .station:not(.on-route) .st-label,.map-svg.has-route .station:not(.on-route) .st-label-halo{display:none!important}:root[data-theme=dark] .line-northern{filter:drop-shadow(0 0 .6px #7d828b)}:root[data-theme=dark] .line-jubilee{filter:drop-shadow(0 0 .5px #4a4e55)}:root:not([data-theme=dark]) .line-jubilee{filter:drop-shadow(0 0 .5px rgba(20,26,40,.28))}.roundel-ring{fill:var(--marker-bg);stroke:var(--marker-ring);stroke-width:2.6;vector-effect:non-scaling-stroke}.roundel-bar{stroke:var(--marker-ring);stroke-width:2.4;stroke-linecap:round;vector-effect:non-scaling-stroke}.st-dot{stroke:var(--map-bg);stroke-width:1.3;vector-effect:non-scaling-stroke}.station{cursor:pointer}.station.selected .roundel-ring{stroke:var(--accent);stroke-width:3.4}.station.selected .st-dot{stroke:var(--accent);stroke-width:2.2}.station.on-route .roundel-ring{stroke:var(--marker-ring);stroke-width:3}.st-label,.st-label-halo{display:none;font-family:var(--font-body);font-weight:600;paint-order:stroke;pointer-events:none;user-select:none}.st-label{fill:var(--label)}.st-label-halo{fill:var(--label-halo);stroke:var(--label-halo);stroke-width:3.6}.station.lbl-on .st-label,.station.lbl-on .st-label-halo{display:block}.station.interchange .st-label{font-weight:700}.landmark{cursor:pointer}.lm-dot{fill:var(--accent);stroke:var(--marker-bg);stroke-width:1.6;vector-effect:non-scaling-stroke;opacity:.92}.lm-core{fill:var(--marker-bg)}.route-casing{stroke:var(--map-bg);stroke-width:11;stroke-linecap:round;stroke-linejoin:round}.route-line{stroke-width:6.4;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 1px 2px rgba(0,0,0,.18))}.route-line.dashed{stroke-dasharray:1.6 7;stroke-width:5.4;opacity:.9}.status-strip{position:absolute;left:12px;right:12px;z-index:25;top:calc(var(--safe-t) + 62px);display:none}.status-strip.open{display:block}.status-head{width:100%;display:flex;align-items:center;gap:8px;background:color-mix(in srgb,var(--surface) 90%,transparent);backdrop-filter:blur(14px);border:1px solid var(--border);border-radius:12px;padding:9px 12px;color:var(--text);font-size:13px;font-weight:600;box-shadow:var(--shadow-1)}.status-live{width:8px;height:8px;border-radius:50%;background:var(--danger);box-shadow:0 0 color-mix(in srgb,var(--danger) 60%,transparent);animation:pulse 2s infinite}@keyframes pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--danger) 55%,transparent)}70%{box-shadow:0 0 0 7px transparent}to{box-shadow:0 0 0 0 transparent}}.status-caret{margin-left:auto;color:var(--text-faint);transition:transform .2s}.status-strip.expanded .status-caret{transform:rotate(180deg)}.status-body{display:none;margin-top:6px;background:var(--surface);border:1px solid var(--border);border-radius:12px;overflow:hidden;box-shadow:var(--shadow-1)}.status-strip.expanded .status-body{display:block}.status-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-top:1px solid var(--border);font-size:13px}.status-item:first-child{border-top:0}.status-dot{width:10px;height:10px;border-radius:3px;flex:none}.status-line-name{font-weight:600}.status-sev{margin-left:auto;color:var(--text-dim);font-size:12px}.dock{position:absolute;left:0;right:0;bottom:0;z-index:20;background:var(--surface);border-top:1px solid var(--border);border-radius:22px 22px 0 0;box-shadow:var(--sheet-shadow);padding:6px 14px calc(12px + var(--safe-b));max-height:62vh;display:flex;flex-direction:column;transition:max-height .3s ease}.dock-grip{display:grid;place-items:center;padding:6px 0 8px}.dock-grip span{width:38px;height:4px;border-radius:3px;background:var(--border-strong)}.planner{display:flex;flex-direction:column;min-height:0}.planner-fields{position:relative;display:grid;gap:8px}.field{position:relative;display:flex;align-items:center;gap:10px;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 12px}.field:focus-within{border-color:color-mix(in srgb,var(--accent) 55%,var(--border));background:var(--surface)}.field-dot{width:11px;height:11px;border-radius:50%;flex:none}.field-dot.from{background:var(--good)}.field-dot.to{background:var(--danger)}.ac{flex:1;min-width:0;position:relative}.ac-input{width:100%;border:0;background:transparent;color:var(--text);font-size:16px;padding:13px 0;outline:none;min-height:44px}.ac-input::placeholder{color:var(--text-faint)}.swap-btn{position:absolute;right:10px;top:50%;transform:translateY(-50%);width:38px;height:38px;border-radius:50%;background:var(--surface);border:1px solid var(--border-strong);color:var(--accent);font-size:17px;box-shadow:var(--shadow-1);display:grid;place-items:center;z-index:3}.ac-list{display:none;position:absolute;left:-12px;right:-48px;top:calc(100% + 6px);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow-2);max-height:46vh;overflow-y:auto;z-index:40;padding:5px}.ac-list.open{display:block}.ac-item{display:flex;align-items:center;gap:11px;padding:10px;border-radius:9px;min-height:44px}.ac-item.active,.ac-item:hover{background:var(--surface-3)}.ac-icon{width:18px;text-align:center;color:var(--text-faint);font-size:14px;flex:none}.ac-favorite .ac-icon{color:#e0a72e}.ac-landmark .ac-icon{color:var(--accent)}.ac-text{display:flex;flex-direction:column;min-width:0}.ac-primary{font-size:15px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ac-secondary{font-size:12px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.planner-results{overflow-y:auto;margin-top:10px;min-height:0}.planner-hint{color:var(--text-dim);font-size:14px;padding:14px 4px 6px;text-align:center}.results-head{display:flex;align-items:center;justify-content:space-between;margin:2px 2px 10px}.results-title{font-family:var(--font-display);font-size:16px}.fare-switch{display:inline-flex;background:var(--surface-3);border-radius:999px;padding:3px}.fare-opt{border:0;background:transparent;color:var(--text-dim);font-size:12px;font-weight:600;padding:6px 11px;border-radius:999px;min-height:32px}.fare-opt.on{background:var(--surface);color:var(--text);box-shadow:var(--shadow-1)}.route-card{background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius);padding:14px;margin-bottom:10px;transition:border-color .18s,box-shadow .18s}.route-card.active{border-color:color-mix(in srgb,var(--accent) 50%,var(--border));box-shadow:var(--shadow-1);background:var(--surface)}.rc-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.rc-label{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--accent)}.rc-meta{font-size:12px;color:var(--text-dim)}.rc-headline{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px}.rc-time{display:flex;align-items:baseline;gap:5px;font-family:var(--font-display)}.rc-time-big{font-size:40px;line-height:1;letter-spacing:-.5px}.rc-time-unit{font-size:15px;color:var(--text-dim)}.rc-fare{display:flex;align-items:baseline;gap:7px}.rc-fare-amt{font-family:var(--font-display);font-size:22px}.rc-fare-peak{font-size:11px;font-weight:700;padding:3px 7px;border-radius:999px;text-transform:uppercase;letter-spacing:.4px}.rc-fare-peak.peak{background:color-mix(in srgb,var(--danger) 16%,transparent);color:var(--danger)}.rc-fare-peak.offpeak{background:color-mix(in srgb,var(--good) 16%,transparent);color:var(--good)}.rc-fare-na{color:var(--text-faint);font-size:14px}.rc-warns{display:grid;gap:5px;margin-bottom:10px}.rc-warn{display:flex;align-items:center;gap:8px;font-size:12.5px;background:color-mix(in srgb,var(--danger) 12%,transparent);color:var(--danger);border-radius:9px;padding:8px 10px;font-weight:500}.rc-warn-dot{width:8px;height:8px;border-radius:2px;flex:none}.rc-strip{display:flex;flex-direction:column}.rc-seg{display:flex;gap:11px;align-items:stretch}.rc-seg-bar{width:6px;border-radius:4px;flex:none}.rc-seg-body{flex:1;padding:3px 0;min-width:0}.rc-seg-line{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.rc-seg-name{font-weight:700;font-size:14px}.rc-seg-time{font-size:13px;color:var(--text-dim)}.rc-seg-detail{font-size:12.5px;color:var(--text-dim);margin-top:1px;overflow:hidden;text-overflow:ellipsis}.rc-seg-stops{color:var(--text-faint)}.rc-transfer{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-dim);padding:5px 0 5px 4px;margin-left:2px}.rc-transfer-ico{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:50%;background:var(--surface-3);font-size:11px;color:var(--text)}.rc-notes{margin-top:10px;display:grid;gap:4px}.rc-note{font-size:11.5px;color:var(--text-faint);line-height:1.4;padding-left:14px;position:relative}.rc-note:before{content:"ⓘ";position:absolute;left:0;top:0}.sheet{position:absolute;left:0;right:0;bottom:0;z-index:50;background:var(--surface);border-radius:22px 22px 0 0;box-shadow:var(--sheet-shadow);border-top:1px solid var(--border);transform:translateY(105%);transition:transform .32s cubic-bezier(.22,1,.36,1);max-height:78vh;display:flex;flex-direction:column;padding-bottom:var(--safe-b)}.sheet.open{transform:translateY(0)}.sheet-handle{display:grid;place-items:center;padding:10px 0 4px;touch-action:none;cursor:grab}.sheet-handle span{width:40px;height:4px;border-radius:3px;background:var(--border-strong)}.sheet-body{overflow-y:auto;padding:6px 18px 20px}.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.card-title{font-family:var(--font-display);font-size:25px;margin:2px 0 6px;line-height:1.1}.card-sub{display:flex;align-items:center;gap:8px}.card-sub-en{color:var(--text-dim);font-size:13px}.zone-badge{font-size:12px;font-weight:600;color:var(--text-dim);background:var(--surface-3);border-radius:999px;padding:3px 10px}.lm-kicker{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:var(--accent)}.star-btn{width:44px;height:44px;border-radius:50%;flex:none;border:1px solid var(--border);background:var(--surface-2);color:var(--text-faint);font-size:20px;transition:color .15s,transform .15s}.star-btn.on{color:#e6a72a;border-color:color-mix(in srgb,#e6a72a 45%,var(--border))}.star-btn:active{transform:scale(.9)}.chips{display:flex;flex-wrap:wrap;gap:7px;margin:12px 0 4px}.chip{font-size:12.5px;font-weight:600;padding:5px 11px;border-radius:999px}.card-block{margin-top:18px}.card-block-title{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:var(--text-faint);margin-bottom:8px}.near-list{display:grid;gap:6px}.near-item{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;text-align:left;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--radius-sm);padding:12px 14px;min-height:44px;color:var(--text)}.near-item:active{background:var(--surface-3)}.near-name{font-size:14.5px;font-weight:500}.near-walk{font-size:12.5px;color:var(--text-dim);flex:none}.lm-desc{font-size:14.5px;line-height:1.55;color:var(--text-dim);margin:12px 0 4px}.card-actions{display:flex;gap:10px;margin-top:20px}.btn{flex:1;border:0;border-radius:12px;padding:14px;min-height:50px;font-size:15px;font-weight:700;transition:transform .12s,filter .15s}.btn:active{transform:scale(.97)}.btn-from{background:var(--surface-3);color:var(--text);border:1px solid var(--border)}.btn-to{background:var(--accent);color:var(--accent-ink)}.btn-wide{flex:1}@media (min-width: 860px){.dock,.sheet{left:auto;right:18px;bottom:18px;top:calc(var(--safe-t) + 74px);width:380px;border-radius:var(--radius);border:1px solid var(--border);max-height:none}.sheet{transform:translate(115%)}.sheet.open{transform:translate(0)}.sheet{right:18px}.status-strip{left:auto;right:18px;width:380px}.dock-grip,.sheet-handle{display:none}.dock,.sheet-body{padding-top:18px}}
