*{box-sizing:border-box}body{margin:0;background:#f6f8f4;color:#233e3a;font-family:'Microsoft YaHei','PingFang SC',sans-serif}button,a{-webkit-tap-highlight-color:transparent}button{font:inherit;cursor:pointer;border:0}button:focus-visible{outline:3px solid #eeaa30;outline-offset:3px}main{max-width:1320px;margin:auto;padding:25px 42px 0}header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #dce6df;padding-bottom:23px}.brand{display:flex;align-items:center;gap:12px;font-size:28px;text-decoration:none;color:#244e45;font-weight:900}.brand>span{font-size:23px}.brand small{display:block;font-size:8px;letter-spacing:2px;margin-top:5px;color:#82938c}.tools{display:flex;gap:9px}.tools button{background:#fff;border:1px solid #e1e8df;border-radius:10px;padding:10px 14px;color:#657d73;font-size:12px}.heading{display:flex;justify-content:space-between;align-items:center;padding:30px 0 26px}.eyebrow{font-size:11px;letter-spacing:3px;color:#728f69;font-weight:700}h1{font-size:34px;margin:10px 0;letter-spacing:1px}h1 em{font-style:normal;color:#e99c35}.heading p{font-size:12px;color:#819089;margin:0}.stats{display:flex;gap:0}.stats>div{font-size:11px;color:#8a9a92;padding:0 28px;border-right:1px solid #dde6dd}.stats>div:last-child{border:0;padding-right:3px}.stats strong{display:block;font-size:29px;color:#2c6355;margin-top:7px;font-family:monospace}.route{background:#fff;border:1px solid #e0e8dd;border-radius:15px;padding:17px 22px;display:flex;align-items:center;gap:30px;margin-bottom:18px}.linebadge{color:#fff;background:#d95849;border-radius:9px;padding:9px 12px;font-size:28px;display:flex;gap:9px;align-items:center}.linebadge span{font-size:10px;line-height:1.7;white-space:nowrap}#route{display:flex;flex:1;justify-content:space-around;position:relative}#route:before{content:'';position:absolute;top:7px;left:10%;right:10%;height:4px;background:#e0e8df}.stop{position:relative;text-align:center;font-size:12px;color:#91a196;flex:1}.stop i{display:block;width:16px;height:16px;border:4px solid #dbe5da;border-radius:50%;background:#fff;margin:0 auto 8px;position:relative}.stop.active{color:#2f715c;font-weight:bold}.stop.active i,.stop.done i{border-color:#4b9673;background:#e8f2b8}.routehint{font-size:10px;color:#95a18d;line-height:1.8}.scene{height:340px;border-radius:18px;overflow:hidden;background:linear-gradient(#c7e8e9,#e8f4e9 73%,#cbd7ca 73%);position:relative;border:1px solid #ccdfd5}.sun{position:absolute;right:15%;top:25px;width:60px;height:60px;background:#ffe7a0;border-radius:50%;box-shadow:0 0 0 12px #ffeeb83c}.cloud{background:#ffffffa8;width:115px;height:22px;position:absolute;border-radius:50px;top:45px}.cloud:before{content:'';position:absolute;bottom:0;left:20px;width:50px;height:40px;background:inherit;border-radius:50%}.c1{left:13%}.c2{left:65%;top:74px;transform:scale(.7)}.skyline{position:absolute;inset:70px -50px 90px;background:repeating-linear-gradient(90deg,transparent 0 22px,#a9cbd044 22px 78px,transparent 78px 98px,#9cc4cb55 98px 135px);clip-path:polygon(0 30%,8% 30%,8% 0,15% 0,15% 55%,21% 55%,21% 20%,28% 20%,28% 45%,38% 45%,38% 0,46% 0,46% 40%,60% 40%,60% 10%,70% 10%,70% 40%,80% 40%,80% 0,90% 0,90% 35%,100% 35%,100% 100%,0 100%)}.stationboard{position:absolute;top:24px;left:28px;z-index:2;background:#285b4e;color:white;border:4px solid #f7fcf2;border-radius:9px;box-shadow:0 3px 0 #bfd1bd;padding:10px 22px;min-width:175px}.stationboard span{font-size:8px;letter-spacing:2px;display:block;color:#b7d6bf}.stationboard strong{font-size:22px;display:block;margin:4px 0}.stationboard small{font-size:9px;color:#c9e0d1}.status{position:absolute;right:20px;top:20px;background:#fff9;border-radius:20px;font-size:11px;padding:9px 13px;color:#46725c}.train{position:absolute;left:7%;right:5%;bottom:60px;height:155px;display:flex;filter:drop-shadow(0 8px 3px #395f4a30)}.trainroof{position:absolute;left:12%;right:7%;top:-8px;height:12px;background:#9baaa4;border-radius:12px}.cab{width:12%;background:#f3f5ee;border-radius:55px 0 0 16px;position:relative;border-top:5px solid white;border-bottom:12px solid #74877c}.windshield{position:absolute;inset:15px 7px 35px 14px;border-radius:35px 3px 3px 4px;background:#315c59;color:#d9ede1;text-align:center;font-size:13px;padding-top:16px;border:4px solid #bdcfc6}.windshield small{font-size:5px}.light{position:absolute;bottom:10px;left:15px;width:24px;height:8px;border-radius:5px;background:#ffe697}.car{flex:1;background:#fcfcf5;border-radius:9px 10px 7px 0;border-bottom:12px solid #7b8982;position:relative;padding:30px 14px 15px}.carlabel{position:absolute;top:8px;left:20px;font-size:9px;color:#4b6e5d}.carlabel b{font-size:6px;margin-left:7px;font-weight:400}.carlabel span{margin-left:100px;color:#8d9b8c}.onboard{height:90px;display:flex;align-items:stretch;gap:8px}.passenger{flex:1;min-width:0;background:#dceae3;border:4px solid #749288;border-radius:10px;position:relative;overflow:hidden;padding:0;color:#294b3f}.passenger img{width:100%;height:64px;object-fit:contain;mix-blend-mode:multiply}.passenger label{display:block;background:#fff;font-size:9px;margin-top:-3px;white-space:nowrap}.passenger.due{border-color:#f2a548;box-shadow:0 0 0 2px #ffe7b3}.passenger .dest{position:absolute;right:0;top:0;font-size:8px;background:#fffbdc;padding:2px}.stripe{position:absolute;left:0;right:0;bottom:5px;height:8px;background:#db6558}.nose{width:4%;background:#e7ece2;border-radius:0 20px 12px 0;color:#b15244;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:bold;border-bottom:12px solid #7b8982}.wheel{position:absolute;bottom:-23px;width:40px;height:22px;background:#354b42;border:5px solid #708279;border-radius:50%}.w1{left:10%}.w2{right:10%}.track{position:absolute;bottom:48px;left:0;right:0;height:8px;background:#6a8070;border-top:3px solid #b6c3b4}.platformline{position:absolute;bottom:35px;left:0;right:0;height:5px;background:repeating-linear-gradient(90deg,#f5d47b 0 30px,#d2b65e 30px 32px)}.platformtext{position:absolute;bottom:12px;left:32px;font-size:10px;letter-spacing:3px;color:#7a8c77}.platformtext span{margin-left:25px}.moving .skyline{animation:travel 4s linear infinite}.moving .train{animation:rumble .25s infinite alternate}@keyframes travel{to{transform:translateX(-80px)}}@keyframes rumble{to{transform:translateY(2px)}}.control{display:flex;align-items:center;gap:25px;background:#fff;border:1px solid #e2e8dd;border-radius:14px;margin:16px 0 24px;padding:17px 20px}.mission{display:flex;gap:12px;align-items:center;flex:1}.icon{font-size:24px;color:#719a75;background:#eef5e7;padding:8px 12px;border-radius:10px}.mission small{display:block;font-size:10px;color:#91a08c;margin-bottom:5px}.mission strong{font-size:13px}.timer{display:flex;align-items:center;gap:5px;color:#ce8d35}.timer>span{font-size:27px;font-family:monospace;font-weight:700}.timer small{font-size:10px}.bar{width:80px;height:5px;background:#f2e8d3;border-radius:4px;margin-left:10px;overflow:hidden}.bar i{display:block;height:100%;width:100%;background:#edb452;transition:width .1s}.primary{background:#327259;color:#fff;border-radius:10px;padding:13px 23px;font-weight:700;font-size:13px;box-shadow:0 3px 0 #24543e}.primary:disabled{opacity:.45;cursor:default}.sectiontitle{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.sectiontitle h2{font-size:16px;margin:0}.sectiontitle h2 span{font-size:10px;font-weight:400;color:#8a9c87;margin-left:12px}.sectiontitle>span{font-size:10px;color:#8c9e88}.cards{display:grid;grid-template-columns:repeat(7,1fr);gap:12px}.card{background:#fff;border:1px solid #e0e8db;border-radius:13px;padding:9px 8px 12px;position:relative;transition:transform .2s,box-shadow .2s;color:#3f5548}.card:hover{transform:translateY(-5px);box-shadow:0 8px 20px #37634714}.portrait{height:108px;background:#f0f4e9;border-radius:9px;position:relative;overflow:hidden;margin-bottom:8px}.portrait img{height:100%;width:100%;object-fit:contain;mix-blend-mode:multiply}.card strong{display:block;font-size:12px}.card small{display:block;font-size:9px;color:#98a58d;margin-top:5px}.card.target small{color:#3c8861}.card .ticket{position:absolute;left:14px;top:14px;padding:3px 6px;background:#fff9;border-radius:4px;font-size:8px;color:#78916c}.human .portrait img{position:absolute;width:66px;height:70px;object-fit:cover;object-position:50% 25%;border-radius:48%;left:50%;transform:translateX(-50%);top:2px;z-index:2;border:3px solid #fff}.human .portrait:after{content:'★';position:absolute;left:50%;bottom:-3px;transform:translateX(-50%);width:48px;height:48px;background:#5b9d85;color:#ffe6a6;border-radius:18px 18px 4px 4px;font-size:24px;padding-top:3px}.human img[data-name="宣梁"]{object-position:50% 34%}.human img[data-name="宣宇泽"]{object-position:46% 25%}.human img[data-name="顾云华"]{object-position:44% 26%}.passenger.human img{width:58px;height:65px;object-fit:cover;object-position:50% 25%;border-radius:40%;border:2px solid white}.emoji{font-size:65px;display:block;padding-top:14px}.empty{flex:1;border:3px solid #b4c9bd;border-radius:10px;background:#dfece4;display:grid;place-items:center;color:#a4bbae;font-size:24px}footer{display:flex;justify-content:space-between;padding:24px 0;color:#9aa991;font-size:10px}#toast{position:absolute;left:50%;top:17px;transform:translateX(-50%);background:#fffde8;color:#4c7351;border-radius:20px;font-size:12px;padding:9px 18px;opacity:0;z-index:5;transition:opacity .15s}#toast.show{opacity:1}dialog{border:1px solid #d8e5d2;border-radius:24px;max-width:460px;width:90%;padding:36px;color:#345447;background:#fcfdf6;box-shadow:0 20px 100px #143e4244}dialog::backdrop{background:#193f4166;backdrop-filter:blur(4px)}dialog h2{font-size:25px}dialog p{font-size:13px;line-height:2;color:#72846c}dialog .primary{width:100%;margin-top:15px}.close{position:absolute;right:15px;top:12px;font-size:23px;background:transparent;color:#82947a}@media(max-width:800px){main{padding:18px 16px 0}.brand>span{font-size:17px}.brand small{font-size:6px}.tools{gap:4px}.tools button{font-size:10px;padding:7px}.heading{padding:22px 0}h1{font-size:25px}.stats>div{padding:0 10px}.stats strong{font-size:22px}.stats>div:last-child{display:none}.route{gap:10px;padding:14px 10px}.linebadge{font-size:20px;padding:7px}.routehint{display:none}.stop{font-size:10px}.scene{height:310px}.train{left:2%;right:2%;height:140px}.stationboard{left:16px;padding:6px 12px}.stationboard strong{font-size:18px}.car{padding:28px 6px 10px}.onboard{gap:4px;height:80px}.passenger{border-width:2px}.passenger img{height:58px}.passenger label{font-size:8px}.carlabel span{margin-left:20px}.windshield{font-size:9px;inset:16px 3px 30px 5px}.windshield small{display:none}.control{gap:12px;padding:12px}.bar{display:none}.mission strong{font-size:11px}.mission .icon{display:none}.primary{padding:12px}.cards{grid-template-columns:repeat(4,1fr);gap:8px}.portrait{height:95px}.sectiontitle>span{display:none}footer{font-size:8px}.status{font-size:9px} .heading p{font-size:10px}}@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

.riding-character{position:fixed;left:0;top:0;width:76px;height:100px;z-index:1000;pointer-events:none;filter:drop-shadow(0 5px 3px #233e3a40);will-change:transform,opacity;text-align:center}.walking-sprite{height:78px;animation:walking-step .16s infinite alternate;transform-origin:50% 100%}.walking-sprite img{width:100%;height:100%;object-fit:contain;border-radius:16px}.riding-character b{display:inline-block;font-size:10px;background:#fffdea;border:1px solid #ddce9d;border-radius:10px;padding:3px 8px;white-space:nowrap}.riding-character .emoji{font-size:52px;padding:0}.riding-character.human .walking-sprite img{width:57px;height:62px;object-fit:cover;object-position:50% 25%;border-radius:48%;position:relative;z-index:2;border:2px solid white}.riding-character.human .walking-sprite:after{content:'★';position:absolute;bottom:0;left:18px;width:40px;height:35px;background:#5b9d85;border-radius:14px 14px 4px 4px;color:#ffe6a6;padding-top:5px}.car:after{content:'';position:absolute;right:8px;top:27px;width:20px;height:83px;border:2px solid #b4c9bd;border-radius:4px;background:linear-gradient(90deg,#aec5b9 48%,#637f72 49% 52%,#aec5b9 53%);pointer-events:none;opacity:.5;transition:background .2s,box-shadow .2s}.doors-open .car:after{background:#345d50;box-shadow:0 0 0 4px #ffde86;opacity:1}.paused *{animation-play-state:paused!important}@keyframes walking-step{from{transform:translateY(0) rotate(-4deg)}to{transform:translateY(-6px) rotate(4deg)}}@media(max-width:500px){.tools button{min-height:36px}.heading{gap:8px}.heading h1{font-size:22px}.stats>div{padding:0 7px}.control{flex-wrap:wrap}.mission{flex-basis:100%;line-height:1.7}.timer{margin-right:auto}.card{min-height:140px}.passenger{min-width:0}.car:after{width:12px;right:3px}}

/* Dedicated passenger name display: six fixed slots aligned with windows. */
.scene{height:400px}.train{height:205px}.car{padding-top:30px}.passenger-names{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;height:38px;margin-bottom:7px;position:relative;z-index:3}.name-box{display:flex;align-items:center;justify-content:center;min-width:0;margin:0;padding:3px 4px;border:2px solid #5b8270;border-radius:7px;background:#fffef0;color:#1d4535;font-size:14px;font-weight:800;line-height:1.25;text-align:center;box-shadow:0 2px 0 #c7d8c8}.name-box span{overflow-wrap:anywhere}.name-box.vacant{background:#e5ede2;border-color:#bdcdbd;color:#8b9d87;font-size:11px;font-weight:400;box-shadow:none}.name-box.due{background:#ffe7a5;border-color:#d48a28;color:#704208}.passenger label{display:none}.passenger img{height:100%;max-height:80px}.passenger.human img{height:77px}.car:after{top:81px;height:78px;z-index:1;right:0;width:12px}.onboard{position:relative;z-index:2}.passenger .dest{font-size:9px;padding:3px}.passenger-names button:hover{background:#e9f6d7}.passenger-names .due:hover{background:#ffdb7d}@media(max-width:800px){.scene{height:405px}.train{height:210px}.passenger-names{gap:4px;height:44px;margin-bottom:6px}.name-box{font-size:12px;padding:2px;line-height:1.35;border-width:1px}.name-box span{max-width:100%}.car{padding:28px 6px 10px}.onboard{height:90px}.car:after{top:83px}.passenger img{height:100%;max-height:83px}.passenger.human img{width:100%;height:77px;object-fit:cover}.name-box.vacant{font-size:9px}}
