:root{--paper: #FFF6E3;--ink: #4A3B32;--ink-soft: #8C7A6B;--yellow: #FFC93C;--sky: #7EC8E3;--leaf: #88C999;--pink: #FF8FA3;--card: #FFFDF6;--line-w: 3px;--font-hand: "ZCOOL KuaiLe", "Yuanti SC", "YouYuan", "幼圆", "Microsoft YaHei", sans-serif}*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{margin:0;padding:0}body{font-family:var(--font-hand);color:var(--ink);background-color:var(--paper);background-image:repeating-linear-gradient(0deg,rgba(74,59,50,.045) 0 1px,transparent 1px 28px),repeating-linear-gradient(90deg,rgba(74,59,50,.045) 0 1px,transparent 1px 28px);min-height:100vh}.topbar{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 6px}.logo{margin:0;font-size:24px;letter-spacing:1px;transform:rotate(-1.2deg);text-shadow:2px 2px 0 rgba(255,201,60,.55)}.user-chip{display:flex;align-items:center;gap:6px;padding:4px 10px;font-size:15px;background:var(--card);border:var(--line-w) solid var(--ink);border-radius:255px 15px 225px/15px 225px 15px 255px;box-shadow:3px 3px #4a3b32e6;transform:rotate(1deg)}.user-chip .sticker{font-size:18px}.card,.modal-card,.train-card{background:var(--card);border:var(--line-w) solid var(--ink);border-radius:255px 15px 225px/15px 225px 15px 255px;box-shadow:5px 6px #4a3b32d9;padding:18px 16px;margin:12px}.card:nth-child(2n){transform:rotate(.5deg)}.card:nth-child(odd){transform:rotate(-.4deg)}.card-title{margin:0 0 8px;font-size:20px;transform:rotate(-.6deg)}.muted{color:var(--ink-soft);font-size:14px;line-height:1.6}.error{color:#d9534f;font-size:14px;min-height:18px;margin:6px 0}.hidden{display:none!important}.btn{font-family:var(--font-hand);font-size:16px;color:var(--ink);background:#fff;border:var(--line-w) solid var(--ink);border-radius:15px 255px 15px 225px/225px 15px 255px;box-shadow:3px 3px #4a3b32e6;padding:8px 16px;cursor:pointer;transition:transform .06s ease,box-shadow .06s ease}.btn:active{transform:translate(2px,2px);box-shadow:1px 1px #4a3b32e6}.btn.primary{background:var(--yellow)}.btn.ghost{background:transparent;box-shadow:none;border-style:dashed}.btn.tiny{font-size:13px;padding:2px 10px}.btn.big{font-size:18px;padding:10px 22px}.btn:disabled{opacity:.5;cursor:wait}.login-card{max-width:420px;margin:24px auto;text-align:center}.qr-wrap{position:relative;width:230px;height:230px;margin:14px auto;padding:10px;background:#fff;border:var(--line-w) solid var(--ink);border-radius:15px 225px 15px 255px/255px 15px 225px;box-shadow:4px 4px #4a3b32d9}.qr-wrap img{width:100%;height:100%;object-fit:contain}.qr-placeholder{height:100%;display:flex;align-items:center;justify-content:center;color:var(--ink-soft);font-size:15px}.qr-mask{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;background:#fffdf6eb;border-radius:12px;font-size:17px;text-align:center;line-height:1.8}.remember{display:inline-flex;align-items:center;gap:8px;font-size:15px;margin:8px 0;cursor:pointer}.remember input{width:18px;height:18px;accent-color:var(--yellow)}.toolbar{display:flex;align-items:center;justify-content:space-between;padding:4px 14px 0}#refreshHint{font-size:12px}.empty{text-align:center;font-size:16px;line-height:2;max-width:420px;margin:30px auto}.train-card{padding:16px 14px 12px}.train-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.line-badge{background:var(--sky);border:2px solid var(--ink);border-radius:12px 4px 14px 5px/5px 14px 4px 12px;padding:2px 10px;font-size:14px;box-shadow:2px 2px #4a3b32cc;transform:rotate(-1deg)}.bus-name{font-size:17px}.dir-arrow{color:var(--ink-soft);font-size:14px}.remove-btn{margin-left:auto;border:none;background:none;font-size:16px;cursor:pointer;color:var(--ink-soft)}.countdown{display:flex;align-items:baseline;gap:10px;margin:10px 2px 2px}.countdown .num{font-size:40px;line-height:1;color:#e8590c;text-shadow:2px 2px 0 rgba(255,201,60,.6)}.countdown .num.as-text{font-size:26px;letter-spacing:2px;color:#e8590c}.countdown .label{color:var(--ink-soft);font-size:14px}.selected-eta{margin:6px 2px 0;font-size:16px;background:var(--leaf);border:2px solid var(--ink);border-radius:14px 5px 16px 6px/6px 16px 5px 14px;padding:4px 12px;display:inline-block;box-shadow:2px 2px #4a3b32cc;transform:rotate(.6deg)}.selected-eta.passed{background:#f1e4d3;color:var(--ink-soft)}.selected-eta.none{background:transparent;border-style:dashed;color:var(--ink-soft);box-shadow:none}.track{position:relative;height:34px;margin:10px 6px 2px}.track .rail{position:absolute;left:0;right:0;top:16px;border-top:3px dashed var(--ink-soft);border-radius:50%}.track .tram{position:absolute;top:2px;left:0;font-size:22px;transform:translate(-50%) rotate(-6deg);transition:left 1s ease;filter:drop-shadow(2px 2px 0 rgba(74,59,50,.4));animation:bob 1.6s ease-in-out infinite}@keyframes bob{0%,to{margin-top:0}50%{margin-top:-3px}}.track .stop{position:absolute;top:20px;width:10px;height:10px;border:2px solid var(--ink);border-radius:50% 46% 52% 48%;background:#fff;transform:translate(-50%)}.track .stop.terminal{background:var(--pink)}.status-line{display:flex;align-items:center;gap:8px;margin:8px 2px 0;font-size:16px}.pulse-dot{width:10px;height:10px;background:#4cc38a;border:2px solid var(--ink);border-radius:55% 45% 50% 50%;animation:pulse 1.4s ease-in-out infinite}@keyframes pulse{0%,to{transform:scale(1)}50%{transform:scale(1.35)}}.stations-toggle{width:100%;margin-top:8px;text-align:center;background:none;border:none;font-family:var(--font-hand);font-size:14px;color:var(--ink-soft);cursor:pointer}.station-list{margin:6px 4px 2px}.station-item{position:relative;display:flex;align-items:center;gap:10px;padding:7px 4px 7px 26px;cursor:pointer;border-radius:12px}.station-item:before{content:"";position:absolute;left:9px;top:0;bottom:0;border-left:3px dashed rgba(74,59,50,.35)}.station-item:first-child:before{top:50%}.station-item:last-child:before{bottom:50%}.station-item .dot{position:absolute;left:4px;width:12px;height:12px;background:#fff;border:3px solid var(--ink);border-radius:52% 48% 55% 45%}.station-item.passed .dot{background:#d8ccbe}.station-item.passed .st-name{color:var(--ink-soft);text-decoration:line-through}.station-item.next .dot{background:var(--yellow);animation:pulse 1.4s infinite}.station-item.selected{background:#88c99940}.st-name{font-size:15px}.st-eta{margin-left:auto;font-size:13px;color:#e8590c;background:#ffc93c59;border:2px solid var(--ink);border-radius:10px 3px 12px 4px/4px 12px 3px 10px;padding:1px 8px}.star{font-size:13px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#4a3b3273;display:flex;align-items:center;justify-content:center;z-index:50;padding:16px}.modal-card{width:100%;max-width:400px}.camera-box{border:var(--line-w) dashed var(--ink-soft);border-radius:15px;overflow:hidden;margin:10px 0}.camera-box video{width:100%;display:block;background:#222;min-height:180px}.text-input{width:100%;font-family:var(--font-hand);font-size:16px;padding:10px 12px;border:var(--line-w) solid var(--ink);border-radius:225px 15px 255px/15px 255px 15px 225px;background:#fff;margin:8px 0}.row{display:flex;gap:10px;margin-top:6px}.row .btn{flex:1}.footer{text-align:center;color:var(--ink-soft);font-size:12px;padding:18px 0 26px}body.has-tabbar{padding-bottom:86px}.tabbar{position:fixed;left:12px;right:12px;bottom:12px;display:flex;background:var(--card);border:var(--line-w) solid var(--ink);border-radius:255px 15px 225px/15px 225px 15px 255px;box-shadow:5px 6px #4a3b32d9;z-index:40;overflow:hidden}.tabbar button{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 0 7px;font-family:var(--font-hand);font-size:15px;color:var(--ink-soft);background:none;border:none;cursor:pointer}.tabbar button .tab-ico{font-size:21px;line-height:1}.tabbar button.active{color:var(--ink);background:#ffc93c66}.tabbar button.active .tab-ico{animation:bob 1.6s ease-in-out infinite}.map-scroll{margin:8px 12px 4px}#networkMap{display:block;width:100%;height:auto;background:var(--card);border-radius:20px}.map-title,.map-legend{font-family:var(--font-hand);fill:var(--ink)}.map-legend.note{fill:var(--ink-soft)}.map-lake path{stroke:#9ec3d2;stroke-linecap:round}.map-lake text{font-family:var(--font-hand);fill:#9ec3d2}.map-label{font-family:var(--font-hand);fill:var(--ink);paint-order:stroke;stroke:var(--card);stroke-width:3.5px;stroke-linejoin:round}.map-pop text{font-family:var(--font-hand);fill:var(--ink)}.map-pop text.soft{fill:var(--ink-soft)}.map-station:hover{filter:drop-shadow(1px 1px 0 rgba(255,201,60,.8))}.subpage-bar{display:flex;align-items:center;padding:14px 16px 4px}.back-btn{transform:rotate(-1deg)}.station-board-card{max-width:480px;margin:10px auto 14px;border-radius:18px;box-shadow:0 4px 14px #4a3b321f}.board-group{background:var(--card);border:var(--line-w) solid var(--ink);border-radius:16px;box-shadow:0 3px 10px #4a3b321a;margin:12px 2px;overflow:hidden}.board-group-head{display:flex;align-items:center;gap:8px;padding:10px 14px 8px;border-bottom:2px dashed rgba(74,59,50,.35);background:#ffc93c24}.board-group-head .line-badge{transform:rotate(-1deg)}.board-group-dir{font-size:16px}.fold-btn{margin-left:auto;white-space:nowrap}.tiny-badge{padding:1px 9px;font-size:13px;margin:0 2px}.board-row{display:flex;align-items:center;gap:8px;padding:9px 14px}.board-row+.board-row{border-top:2px dashed rgba(74,59,50,.16)}.board-row.nearest{background:#ffc93c29}.board-row.nearest .board-tram{font-size:17px}.board-tram{font-size:15.5px}.board-pos{font-size:12.5px;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.board-eta{margin-left:auto;font-size:14px;color:#e8590c;background:#ffc93c59;border:2px solid var(--ink);border-radius:10px 3px 12px 4px/4px 12px 3px 10px;padding:2px 10px;white-space:nowrap}.board-eta.soon{background:var(--yellow)}.board-eta.due{background:#f1e4d3;color:var(--ink-soft)}.board-empty{padding:10px 14px;margin:0}.board-group-foot{padding:6px 14px 8px;font-size:12px;border-top:2px dashed rgba(74,59,50,.16)}.transfer-chip{display:inline-block;padding:1px 8px;border:2px solid var(--ink);border-radius:10px 3px 12px 4px/4px 12px 3px 10px;font-size:13px}@media(max-width:420px){.logo{font-size:20px}.countdown .num{font-size:34px}.card,.train-card{margin:10px;padding:14px 12px}}
