*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%;background:#2b1708;color:#4a2a12;font-family:-apple-system,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;user-select:none;-webkit-user-select:none;overscroll-behavior:none}
#app{max-width:860px;margin:0 auto;min-height:100%;display:flex;flex-direction:column;background:linear-gradient(#6b3d1b,#3a200c)}
.hud{display:flex;align-items:center;gap:8px;padding:calc(env(safe-area-inset-top) + 8px) 10px 8px}
.plaque{flex:1;font-weight:900;font-size:20px;color:#ffe08a;text-shadow:0 2px 0 #7a3d0d,0 0 8px #ffb84a88;letter-spacing:2px}
.chip{background:#fff3d6;border:2px solid #c98a3d;border-radius:20px;padding:4px 12px;font-size:15px;box-shadow:0 2px 0 #7a4a1c}
.chip b{font-size:17px}
.scene{position:relative;width:100%;aspect-ratio:1080/350;background:#3a200c center/cover no-repeat;overflow:hidden;border-top:3px solid #c98a3d;border-bottom:3px solid #c98a3d;flex:none}
.scene.stove{aspect-ratio:1296/520}
.panel{flex:1;padding:12px 12px calc(env(safe-area-inset-bottom) + 14px);background:#fbecd0;border-radius:18px 18px 0 0;margin-top:-6px;position:relative;z-index:2}
.hint{font-size:15px;margin:0 0 10px;line-height:1.5}
.hint b{color:#b5421b}
/* 客人与气泡 */
.cust{position:absolute;top:18%;height:82%;border:0;background:transparent;padding:0;cursor:pointer;border-radius:30px}
.cust.pick{animation:pulse 1.2s infinite}
.cust:disabled{cursor:default}
@keyframes pulse{0%,100%{box-shadow:inset 0 0 0 3px #ffe08a00}50%{box-shadow:inset 0 0 0 4px #ffe08acc,0 0 24px #ffd36a}}
.bubble{position:absolute;top:2%;transform:translateX(-50%);background:#fffaf0;border-radius:16px;padding:3px 8px 3px 4px;display:flex;align-items:center;gap:4px;box-shadow:0 3px 8px #0005;font-size:13px;font-weight:700;white-space:nowrap;pointer-events:none}
.bubble img{width:42px;height:36px;object-fit:contain}
.bubble .fl{color:#b5421b;font-size:12px}
.bubble.done{background:#e9ffe3}
.react{position:absolute;top:30%;transform:translateX(-50%);font-size:22px;font-weight:900;color:#fff;text-shadow:0 2px 4px #000a;animation:float 1.6s forwards;pointer-events:none;white-space:nowrap}
@keyframes float{from{opacity:0;margin-top:20px}20%{opacity:1}to{opacity:0;margin-top:-40px}}
/* 订单卡片 */
.cards{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.card{background:#fff8e8;border:3px solid #d9a35c;border-radius:16px;padding:6px;text-align:center;font-size:13px;box-shadow:0 3px 0 #a86d2c;cursor:pointer;color:inherit;font-family:inherit}
.card:active{transform:translateY(2px);box-shadow:0 1px 0 #a86d2c}
.card img.face{width:56px;height:46px;object-fit:cover;border-radius:12px}
.card img.dish{width:60px;height:46px;object-fit:contain;display:block;margin:2px auto}
.card .nm{font-weight:800;font-size:14px}
.card .fl{color:#b5421b;font-weight:700}
.card.done{opacity:.55;border-color:#8bc47a;box-shadow:0 3px 0 #5d8f4f;cursor:default}
/* 配菜 */
.pot{position:absolute;left:45.5%;top:58%;transform:translate(-50%,-50%);display:flex;gap:4px}
.pot .it{width:48px;height:48px;background:#fff8e8ee;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:28px;box-shadow:0 2px 8px #0006;animation:drop .35s}
.pot .it img{width:40px;height:34px;object-fit:contain}
@keyframes drop{from{transform:translateY(-60px) scale(.6);opacity:0}}
.predict{position:absolute;right:2%;top:6%;background:#fff8e8f2;border:3px solid #d9a35c;border-radius:14px;padding:6px 10px;font-size:13px;text-align:center;min-width:96px}
.predict img{width:64px;height:48px;object-fit:contain;display:block;margin:0 auto}
.predict .q{font-size:36px;line-height:48px}
.order-line{display:flex;align-items:center;gap:8px;background:#fff8e8;border-radius:12px;padding:6px 8px;margin-bottom:8px;font-size:14px}
.order-line img{width:42px;height:36px;object-fit:cover;border-radius:10px}
.order-line small{display:block;color:#8a5a2c}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.ing{background:#fff8e8;border:2px solid #d9a35c;border-radius:14px;padding:4px 2px;font-size:13px;font-weight:700;display:flex;flex-direction:column;align-items:center;cursor:pointer;color:inherit;font-family:inherit;box-shadow:0 3px 0 #a86d2c}
.ing:active{transform:translateY(2px);box-shadow:0 1px 0 #a86d2c}
.ing .ic{font-size:30px;height:38px;line-height:38px}
.ing img{width:48px;height:38px;object-fit:contain}
.ing.on{background:#ffe9a8;border-color:#e08a1e;box-shadow:0 0 0 3px #ffd36a,0 3px 0 #a86d2c}
.ing small{font-weight:400;color:#b5421b;font-size:11px}
.row{display:flex;gap:8px;margin-top:10px}
.btn{flex:1;border:0;border-radius:14px;padding:12px;font-size:17px;font-weight:900;color:#fff;background:linear-gradient(#f0a33a,#d0701a);box-shadow:0 4px 0 #8a4410;cursor:pointer;font-family:inherit}
.btn:active{transform:translateY(3px);box-shadow:0 1px 0 #8a4410}
.btn.sec{background:linear-gradient(#c9a77e,#9b7650);box-shadow:0 4px 0 #5e4128;flex:.5}
.btn.green{background:linear-gradient(#7bd06a,#3f9b35);box-shadow:0 4px 0 #276620}
.btn:disabled{opacity:.45}
/* 控火 */
.meter{position:relative;height:46px;border-radius:24px;border:4px solid #8a5a2c;background:linear-gradient(90deg,#3a8cff,#5fd0ff 30%,#ffd84a 60%,#ff7a2a 80%,#e8261b);margin:14px 4px 8px;overflow:hidden;touch-action:manipulation}
.zone{position:absolute;top:0;bottom:0;background:#5dff6acc;border-left:3px solid #fff;border-right:3px solid #fff;box-shadow:0 0 14px #9dff9d}
.needle{position:absolute;top:-4px;bottom:-4px;width:8px;margin-left:-4px;background:#fff;border-radius:4px;box-shadow:0 0 0 2px #4a2a12,0 0 10px #fff}
.mlabels{display:flex;justify-content:space-between;font-size:12px;color:#8a5a2c;padding:0 6px}
.flame{position:absolute;left:45.5%;top:86%;transform:translate(-50%,-50%);font-size:34px;animation:flick .25s infinite alternate;pointer-events:none}
@keyframes flick{to{transform:translate(-50%,-55%) scale(1.15)}}
.big{font-size:22px;font-weight:900;text-align:center;margin:6px 0}
/* 上菜 */
.tray{display:flex;align-items:center;gap:10px;background:#fff8e8;border:3px solid #d9a35c;border-radius:16px;padding:8px;margin-bottom:10px}
.tray img{width:84px;height:64px;object-fit:contain}
.tray .q{font-size:46px;width:84px;text-align:center}
/* 弹窗 */
.modal{position:fixed;inset:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:20;padding:16px}
.hidden{display:none!important}
.sheet{background:#fbecd0;border:4px solid #c98a3d;border-radius:20px;padding:16px;width:100%;max-width:420px;box-shadow:0 8px 30px #000a}
.sheet h2{margin:0 0 10px;text-align:center;color:#7a3d0d}
.res{display:flex;align-items:center;gap:8px;background:#fff8e8;border-radius:12px;padding:6px 8px;margin-bottom:6px;font-size:14px}
.res img{width:44px;height:38px;object-fit:cover;border-radius:10px}
.res .c{margin-left:auto;font-weight:900;color:#b5701a;white-space:nowrap}
.total{text-align:center;font-size:20px;font-weight:900;margin:10px 0}
.toast{position:fixed;left:50%;top:40%;transform:translate(-50%,-50%);background:#4a2a12ee;color:#ffe08a;padding:12px 20px;border-radius:16px;font-size:20px;font-weight:900;z-index:30;pointer-events:none;text-align:center}
.title-bg{background:url(assets/bg-title.webp) center/cover}
.link{background:none;border:0;color:#8a5a2c;text-decoration:underline;font-size:13px;margin-top:10px;font-family:inherit}
@media (orientation:landscape) and (max-height:520px){
  .hud{padding-top:4px;padding-bottom:4px}
  .scene{width:auto;height:42vh;margin:0 auto;aspect-ratio:1080/350}
  .scene.stove{aspect-ratio:1296/520}
  .card img.face{height:34px}.card img.dish{height:34px}
  .ing{flex-direction:row;justify-content:center;gap:4px}.ing .ic,.ing img{height:28px;line-height:28px;font-size:22px}
}
/* ===== 幸福版 ===== */
.soft{color:#8a5a2c;font-size:13px}
/* 开门 */
.scene.title{aspect-ratio:1080/520}
.sun{position:absolute;inset:0;background:radial-gradient(circle at 80% 10%,#fff6c288,transparent 55%);animation:sun 4s ease-in-out infinite alternate;pointer-events:none}
@keyframes sun{from{opacity:.4}to{opacity:1}}
.open-card{text-align:center}
.sign{width:150px;height:56px;margin:4px auto 10px;position:relative;perspective:400px}
.sign span{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;border-radius:12px;font-weight:900;font-size:20px;backface-visibility:hidden;transition:transform .6s;border:3px solid #8a5a2c;box-shadow:0 3px 0 #5e4128}
.sign .front{background:#c9a77e;color:#5e4128}
.sign .back{background:#ffe08a;color:#b5421b;transform:rotateY(180deg)}
.sign.flip .front{transform:rotateY(-180deg)}
.sign.flip .back{transform:rotateY(0)}
/* 客人进店 */
.bubble.arrive{animation:pop .5s backwards cubic-bezier(.3,1.6,.6,1)}
@keyframes pop{from{transform:translateX(-50%) scale(0);opacity:0}}
.cust.happy{animation:hop .5s 3}
@keyframes hop{50%{transform:translateY(-8%)}}
/* 食材弹动 */
.ing.boing{animation:boing .35s}
@keyframes boing{30%{transform:scale(1.15,.85)}60%{transform:scale(.92,1.1)}}
/* 锅里的汤 */
.soup{position:absolute;left:45.5%;top:60%;width:30%;aspect-ratio:3/1;transform:translate(-50%,-50%);border-radius:50%;background:radial-gradient(ellipse,var(--soup,#0000) 30%,transparent 70%);opacity:0;transition:opacity .4s,background .4s;pointer-events:none}
.soup.on{opacity:.9;animation:simmer 1.6s ease-in-out infinite}
@keyframes simmer{50%{transform:translate(-50%,-52%) scale(1.04)}}
.steam{position:absolute;top:40%;width:26px;height:46px;border-radius:50%;background:radial-gradient(#ffffffcc,#fff0 70%);animation:steam 2.4s ease-out infinite;pointer-events:none}
.steam.s1{left:40%}.steam.s2{left:46%;animation-delay:.8s}.steam.s3{left:51%;animation-delay:1.6s}
@keyframes steam{from{transform:translateY(20px) scale(.6);opacity:0}30%{opacity:.9}to{transform:translateY(-50px) scale(1.4);opacity:0}}
/* 上菜特效 */
.fx{position:absolute;top:45%;font-size:24px;pointer-events:none;animation:fx 1.8s ease-out both}
@keyframes fx{from{transform:translateY(0) scale(.4);opacity:0}20%{opacity:1;transform:translateY(-20px) scale(1.1)}to{transform:translate(var(--dx),-110px) scale(.9);opacity:0}}
/* 装修 */
.decor{position:absolute;font-size:34px;pointer-events:none;filter:drop-shadow(0 3px 3px #0006)}
.decor img{height:100%;width:auto}
.decor-flower{left:34%;bottom:2%}
.decor-cushion{left:64%;bottom:0;font-size:28px}
.decor-lamp{left:57%;top:0;animation:sway 3s ease-in-out infinite alternate;transform-origin:top center}
@keyframes sway{from{transform:rotate(-4deg)}to{transform:rotate(4deg)}}
.decor.new{animation:pop2 .8s cubic-bezier(.3,1.6,.6,1)}
@keyframes pop2{from{transform:scale(0)}}
.scene.warm::after{content:'';position:absolute;inset:0;background:radial-gradient(circle at 58% 10%,#ffcf6a55,transparent 60%);pointer-events:none}
.decor-box{background:#fff8e8;border-radius:12px;padding:8px;margin:8px 0;font-size:14px}
.goal{display:flex;align-items:center;gap:8px;margin-top:6px}
.goal .ge{font-size:32px}
.bar{height:10px;background:#ead6b0;border-radius:6px;overflow:hidden;margin:4px 0}
.bar i{display:block;height:100%;background:linear-gradient(90deg,#ffd36a,#f0a33a)}
.btn.mini{flex:none;padding:8px 12px;font-size:15px}
/* ===== ECHO 素材 v1 ===== */
.ing img{width:46px;height:40px}
.pot .it img{width:42px;height:38px}
.decor-flower{left:31%;bottom:0;height:42%}
.decor-cushion{left:auto;right:1%;bottom:-2%;height:26%}
.decor-lamp{left:46%;top:-4%;height:40%}
.decor{font-size:0}
.goal .ge{width:44px;height:44px;object-fit:contain}
.bubble.fade{opacity:.25;transition:opacity .3s}
/* 开心图盖住原来的客人：底下垫一圈暖光，避免重影 */
.happy-pop{position:absolute;bottom:-4%;height:108%;aspect-ratio:1;transform:translateX(-50%);pointer-events:none;z-index:3;
  background:radial-gradient(circle at 50% 58%,#ffe2a8 0 44%,#ffd28a99 54%,transparent 68%);animation:hpIn .45s cubic-bezier(.3,1.6,.6,1) both}
.happy-pop img{width:100%;height:100%;object-fit:contain;animation:hpBob 1s ease-in-out infinite alternate}
.happy-axo img{transform-origin:50% 80%;animation:gill .35s ease-in-out infinite alternate}
@keyframes hpIn{from{transform:translateX(-50%) scale(.3);opacity:0}}
@keyframes hpBob{to{transform:translateY(-4%)}}
@keyframes gill{from{transform:rotate(-4deg) scaleX(1.03)}to{transform:rotate(4deg) scaleX(.97)}}
.fx{z-index:4}
/* 台词放在场景底部、点单气泡之外 */
.react.say{top:auto;bottom:6%;z-index:5;font-size:15px;color:#7a3d0d;text-shadow:none;background:#fffaf0f2;border:2px solid #d9a35c;border-radius:14px;padding:4px 10px;text-align:center;box-shadow:0 3px 8px #0004;animation:sayIn 2.2s both}
@keyframes sayIn{from{opacity:0;transform:translate(-50%,10px)}12%{opacity:1;transform:translate(-50%,0)}85%{opacity:1}to{opacity:0}}
.panel>.react.say{top:-4px;bottom:auto;max-width:92%;white-space:normal;font-size:16px}
.decor-cushion{right:2%;bottom:1%;height:34%}
.decor-lamp{top:-6%;height:52%}
.panel>.react.say{width:max-content;max-width:94%;font-size:15px}
.feedback{display:flex;align-items:center;gap:10px;background:#fffaf0;border:3px solid #ffd36a;border-radius:16px;padding:10px 12px;box-shadow:0 3px 10px #c98a3d44;animation:fbIn .4s cubic-bezier(.3,1.5,.6,1)}
.feedback img{width:52px;height:52px;object-fit:cover;border-radius:14px;flex:none}
.feedback div{flex:1;min-width:0}
.feedback p{margin:2px 0 0;font-size:16px;line-height:1.45;color:#7a3d0d;word-break:break-word}
.feedback .c{flex:none;font-weight:900;color:#b5701a;font-size:17px}
@keyframes fbIn{from{transform:translateY(12px);opacity:0}}
/* ===== 采集 ===== */
.btn.trip{background:linear-gradient(#8fd17a,#4f9b3f);box-shadow:0 4px 0 #2f6a24;font-size:16px;display:flex;flex-direction:column;align-items:center}
.btn.trip.river{background:linear-gradient(#7cc8f0,#3a8cc8);box-shadow:0 4px 0 #22608e}
.btn.trip small{font-size:11px;font-weight:400}
.basket{background:#fff8e8;border:2px dashed #d9a35c;border-radius:14px;padding:6px 8px;margin:10px 0;font-size:13px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:center}
.bk{display:inline-flex;align-items:center;gap:2px;background:#fff;border-radius:10px;padding:2px 6px}
.bk img{width:26px;height:26px;object-fit:contain}
.goldy{filter:sepia(1) saturate(4) hue-rotate(5deg) brightness(1.15) drop-shadow(0 0 6px #ffd84a)}
.ing{position:relative}
.ing .fresh{position:absolute;top:-6px;right:-4px;background:#4f9b3f;color:#fff;font-style:normal;font-size:11px;font-weight:900;border-radius:10px;padding:1px 6px;box-shadow:0 2px 0 #2f6a24}
.scene.field{aspect-ratio:1080/520}
.scene.forest{background:radial-gradient(ellipse at 70% 0%,#fff6c2aa,transparent 50%),linear-gradient(#9fd88a,#5aa34a 55%,#3f7f34)}
.scene.forest::before{content:'🌲🌳🌲🌲🌳🌲🌳🌲';position:absolute;left:0;right:0;top:2%;font-size:44px;letter-spacing:-6px;white-space:nowrap;opacity:.85;text-align:center}
.rays{position:absolute;inset:0;background:repeating-linear-gradient(110deg,#fff8 0 18px,transparent 18px 70px);opacity:.25;animation:sun 5s ease-in-out infinite alternate;pointer-events:none}
.tuft{position:absolute;transform:translate(-50%,-50%);font-size:44px;background:none;border:0;padding:0;cursor:pointer;animation:rustle 2.4s ease-in-out infinite;filter:drop-shadow(0 3px 2px #0005)}
.tuft:nth-child(odd){animation-delay:-1.1s}
.tuft.open{animation:part .5s forwards;pointer-events:none}
@keyframes rustle{50%{transform:translate(-50%,-50%) rotate(4deg)}}
@keyframes part{to{transform:translate(-50%,-50%) scale(1.4,.5);opacity:.25}}
.find{position:absolute;transform:translate(-50%,-50%);pointer-events:none;animation:findUp 1.2s cubic-bezier(.3,1.5,.6,1) both;font-size:32px}
.find img{width:56px;height:56px;object-fit:contain}
.find.critter{animation:findUp 1.2s both,critter 2s 1.2s forwards}
@keyframes findUp{from{transform:translate(-50%,-10%) scale(.2);opacity:0}to{transform:translate(-50%,-90%) scale(1)}}
@keyframes critter{to{opacity:0}}
.scene.river{background:linear-gradient(#bfe6c0 0 22%,#7cc8f0 22%,#3a8cc8 100%)}
.scene.river::before{content:'🌾🌿🌾  🪨   🌿🌾🌿';position:absolute;left:0;right:0;top:4%;font-size:30px;text-align:center;white-space:nowrap}
.ripple{position:absolute;left:55%;top:58%;width:90px;height:26px;margin:-13px 0 0 -45px;border:2px solid #fff9;border-radius:50%;animation:ripple 2.4s ease-out infinite;pointer-events:none}
.ripple.r2{animation-delay:1.2s}
@keyframes ripple{from{transform:scale(.4);opacity:1}to{transform:scale(2);opacity:0}}
.line{position:absolute;left:55%;top:0;height:52%;border-left:2px solid #fff8;pointer-events:none}
.bobber{position:absolute;left:55%;top:55%;width:40px;height:40px;margin:-20px 0 0 -20px;border-radius:50%;border:3px solid #fff;background:linear-gradient(#ff5a4a 50%,#fff 50%);box-shadow:0 3px 6px #0005;padding:0;cursor:pointer;animation:bob 1.6s ease-in-out infinite}
.bobber .bang{position:absolute;left:50%;top:-38px;transform:translateX(-50%);font-size:30px;font-weight:900;color:#ffe08a;text-shadow:0 2px 0 #b5421b;opacity:0}
.bobber.bite{animation:dip .35s ease-in-out infinite}
.bobber.bite .bang{opacity:1;animation:pop .3s}
.bobber.rest{animation:none;opacity:.6}
@keyframes bob{50%{transform:translateY(-5px)}}
@keyframes dip{50%{transform:translateY(12px)}}
.find.jump img{width:72px;height:72px}
/* ===== ECHO 采集素材 ===== */
.scene.forest{background:url(assets/bg-forest.webp) center/cover}
.scene.river{background:url(assets/bg-creek.webp) center/cover}
.scene.forest::before,.scene.river::before{content:none}
.rays{opacity:.12}
.tuft{font-size:0;width:22%;max-width:130px}
.tuft img{width:100%;display:block}
.line{border-left-color:#fffc;height:56%}
.bobber{width:48px;height:56px;margin:-28px 0 0 -24px;border:0;border-radius:0;background:none;box-shadow:none}
.bobber img{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 3px 3px #0005)}
.bobber .bang{top:-34px}
.bobber .bang{left:105%;top:-30px;transform:none;width:36px;height:36px;line-height:36px;text-align:center;border-radius:50%;background:#fff;color:#e8261b;text-shadow:none;font-size:26px;box-shadow:0 3px 6px #0004}
