@import url('/farm-pet-link.css?v=farm-pet-link-20261004');
/* 小组空间：班级场所 + 小组农田（答题浇水） */
.space-grid{display:grid;grid-template-columns:1.6fr 1fr;gap:16px;margin-bottom:16px}
@media(max-width:900px){.space-grid{grid-template-columns:1fr}}
.farm-card{position:relative;overflow:hidden}
.farm-main{display:flex;gap:20px;align-items:center;flex-wrap:wrap}
.farm-plot{flex:0 0 170px;text-align:center;padding:18px 12px;border-radius:18px;background:linear-gradient(180deg,rgba(109,156,255,.08),rgba(70,217,160,.06));border:1px dashed rgba(255,255,255,.14)}
.farm-emoji{display:block;font-size:64px;line-height:1.1;filter:drop-shadow(0 6px 14px rgba(0,0,0,.35));transition:transform .3s}
.farm-emoji.stage-3,.farm-emoji.stage-4{transform:scale(1.12)}
.farm-plot strong{display:block;margin-top:6px;font-size:17px}
.farm-water{display:inline-block;margin:6px 0;font-size:14px;color:#8fd3ff}
.farm-progress{height:8px;border-radius:99px;background:rgba(255,255,255,.1);overflow:hidden;margin:6px 4px 4px}
.farm-progress>div{height:100%;border-radius:99px;background:linear-gradient(90deg,#6d9cff,#46d9a0);transition:width .5s}
.farm-side{flex:1;min-width:220px;display:flex;flex-direction:column;gap:12px}
.farm-members{display:flex;flex-wrap:wrap;gap:6px}
.farm-side .btn.big{font-size:17px;padding:14px 18px;border-radius:14px}
.farm-board{display:flex;flex-direction:column;gap:8px}
.farm-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.03)}
.farm-row.mine{background:rgba(109,156,255,.1);border:1px solid rgba(109,156,255,.35)}
.farm-rank{width:28px;text-align:center}
.farm-art{font-size:22px}
.farm-row b{flex:0 0 auto}
.farm-row small{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.farm-num{font-weight:700;color:#8fd3ff}
.water-card{margin-top:14px;padding:16px;border-radius:14px;background:rgba(109,156,255,.06);border:1px solid rgba(109,156,255,.2)}
.water-card.win{border-color:rgba(70,217,160,.45);background:rgba(70,217,160,.08)}
.water-card.lose{border-color:rgba(255,176,97,.4);background:rgba(255,176,97,.07)}
.water-card h3{margin:0 0 6px}
.water-card .paper-options{display:flex;flex-direction:column;gap:8px;margin:10px 0}
.water-card .chip.active{background:rgba(109,156,255,.25);border-color:#6d9cff}
.space-empty{padding:18px;text-align:left}
.space-hw-list{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
.space-hw-row{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.03);flex-wrap:wrap}
.space-hw-row b{flex:1;min-width:140px}
.space-hw-row.holiday{border:1px solid rgba(255,176,97,.25)}
.space-quick{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
@media(max-width:700px){.space-quick{grid-template-columns:1fr}}
.space-quick-card{display:flex;flex-direction:column;align-items:flex-start;gap:6px;text-align:left;cursor:pointer;border:1px solid rgba(255,255,255,.09);transition:transform .15s,border-color .15s;color:inherit;font:inherit}
.space-quick-card:hover{transform:translateY(-2px);border-color:rgba(109,156,255,.45)}
.space-quick-card span{font-size:30px}
.space-quick-card b{font-size:17px}

/* ── 个人宠物空间 ── */
.pet-card{position:relative;display:flex;gap:22px;align-items:flex-start;flex-wrap:wrap;margin-bottom:16px}
.pet-stage-wrap{flex:0 0 220px;text-align:center}
/* 2026-09-30「活起来」：宠物（透明底小图）站在一小块草坪上——呼吸、歪头、隔一会儿蹦一下，点它会跳、冒爱心 */
.pet-bubble-slot{display:flex;align-items:flex-end;justify-content:center;min-height:60px;margin-bottom:9px}
.pet-bubble{margin-top:10px;display:inline-block;padding:8px 14px;border-radius:16px;background:rgba(255,255,255,.07);font-size:13px}
.pet-card .pet-bubble{margin-top:0;max-width:220px;line-height:1.55;transform-origin:50% 100%} /* 宠物页（app.js）也用 .pet-bubble，只改空间页这张卡 */
.student-theme .pet-card #pet-bubble{color:var(--campus-ink,#243d33);background:var(--campus-paper,#fffdf4)}
.pet-card .pet-bubble.pop{animation:pet-bubble-pop .34s ease-out}
.pet-yard{position:relative;width:220px;height:212px;margin:0 auto;border-radius:26px;overflow:hidden;box-shadow:inset 0 0 0 1px rgba(214,178,120,.35);background:
  radial-gradient(circle at 15% 86%,#fff 0 3px,transparent 3.6px),radial-gradient(circle at 86% 80%,#ffc9d6 0 3px,transparent 3.6px),radial-gradient(circle at 73% 93%,#ffe98a 0 2.6px,transparent 3.2px),radial-gradient(circle at 28% 95%,#d9f2c2 0 2.4px,transparent 3px),
  radial-gradient(130% 42% at 50% 100%,#b5da8c 0 70%,transparent 71%),radial-gradient(160% 56% at 50% 100%,#d4ecb4 0 70%,transparent 71%),linear-gradient(180deg,#fff9ef,#ffecd6)}
.pet-poke{position:absolute;left:50%;bottom:20px;width:176px;height:176px;margin:0 0 0 -88px;padding:0;border:0;border-radius:24px;background:none;color:inherit;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}
.pet-poke:focus-visible{outline:3px solid var(--accent,#e0714f);outline-offset:2px}
.pet-shadow{position:absolute;left:50%;bottom:-7px;width:118px;height:20px;margin-left:-59px;border-radius:50%;background:radial-gradient(closest-side,rgba(74,52,24,.34),rgba(74,52,24,0))}
.pet-hop,.pet-sway{position:absolute;inset:0;display:block;transform-origin:50% 100%}
.pet-sway{animation:pet-tilt 6.5s ease-in-out infinite}
.pet-img{display:block;width:176px;height:176px;object-fit:contain;object-position:50% 100%;transform-origin:50% 100%;animation:pet-breathe 2.8s ease-in-out infinite;user-select:none;-webkit-user-drag:none}
.pet-img.pet-img-fb{object-fit:cover;border-radius:24px;box-shadow:0 8px 20px rgba(120,80,40,.18)} /* 小图还没生成时的原图（带底色的方图） */
.pet-card.hungry .pet-sway{animation:pet-droop 8s ease-in-out infinite} /* 饿了：耷拉着、动作变慢 */
.pet-card.hungry .pet-img{animation-duration:4.6s}
.pet-card.dead .pet-img{filter:grayscale(.9);opacity:.55}
.pet-card.dead .pet-img,.pet-card.dead .pet-sway{animation:none} /* 走丢了：照旧灰着不动 */
.pet-poke.hop .pet-hop{animation:pet-hop .72s cubic-bezier(.3,.6,.4,1)}
.pet-poke.hop .pet-shadow{animation:pet-shadow-hop .72s cubic-bezier(.3,.6,.4,1)}
.pet-poke.hop-weak .pet-hop{animation:pet-hop-weak .62s ease-out}
.pet-poke.hop-weak .pet-shadow{animation:pet-shadow-weak .62s ease-out}
.pet-poke.chew .pet-hop{animation:pet-chew .95s ease-in-out}
/* 卡片上的一次性粒子：爱心、飞过去的 🍖、+饱食度（裁在卡片里，手机上不会撑出横向滚动） */
.pet-fx{position:absolute;inset:0;z-index:3;overflow:hidden;border-radius:inherit;pointer-events:none}
.pet-fx>i{position:absolute;font-style:normal;line-height:1;white-space:nowrap}
.pet-heart{font-size:20px;margin:-10px 0 0 -10px;animation:pet-heart 1.25s ease-out both}
.pet-food-fly{font-size:26px;margin:-13px 0 0 -13px;animation:pet-food .78s linear both}
.pet-plus{font-size:14px;font-weight:800;color:#b73e22;text-shadow:0 1px 0 #fff,0 0 6px #fff;animation:pet-plus 1.5s ease-out both}
@keyframes pet-breathe{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.03)}}
@keyframes pet-tilt{0%,100%{transform:rotate(-2.5deg)}50%{transform:rotate(2.5deg)}}
@keyframes pet-droop{0%,100%{transform:translateY(4px) rotate(-4deg) scaleY(.95)}50%{transform:translateY(5px) rotate(-1.5deg) scaleY(.94)}}
@keyframes pet-hop{0%{transform:translateY(0) scale(1)}12%{transform:translateY(0) scale(1.08,.9)}40%{transform:translateY(-30px) scale(.95,1.06)}62%{transform:translateY(0) scale(1.06,.93)}78%{transform:translateY(-6px) scale(.99,1.01)}100%{transform:translateY(0) scale(1)}}
@keyframes pet-shadow-hop{0%,12%,62%,100%{transform:scale(1);opacity:1}40%{transform:scale(.6);opacity:.4}78%{transform:scale(.9);opacity:.85}}
@keyframes pet-hop-weak{0%,100%{transform:translateY(0) scale(1)}35%{transform:translateY(-8px) scale(.98,1.02)}65%{transform:translateY(0) scale(1.03,.96)}}
@keyframes pet-shadow-weak{0%,65%,100%{transform:scale(1);opacity:1}35%{transform:scale(.85);opacity:.7}}
@keyframes pet-chew{0%,100%{transform:scale(1)}15%,45%,75%{transform:scale(1.07,.92)}30%,60%{transform:scale(.96,1.05)}}
@keyframes pet-bubble-pop{0%{transform:scale(.86);opacity:.35}100%{transform:scale(1);opacity:1}}
@keyframes pet-heart{0%{transform:translate(0,6px) scale(.3);opacity:0}18%{transform:translate(calc(var(--dx,0px)*.25),-10px) scale(1.1);opacity:1}100%{transform:translate(var(--dx,0px),-80px) scale(.85);opacity:0}}
@keyframes pet-food{0%{transform:translate(0,0) rotate(0)}25%{transform:translate(calc(var(--dx)*.25),calc(var(--dy)*.25 - var(--lift)*.75)) rotate(-90deg)}50%{transform:translate(calc(var(--dx)*.5),calc(var(--dy)*.5 - var(--lift))) rotate(-180deg) scale(1.12)}75%{transform:translate(calc(var(--dx)*.75),calc(var(--dy)*.75 - var(--lift)*.75)) rotate(-270deg)}100%{transform:translate(var(--dx),var(--dy)) rotate(-340deg) scale(.55);opacity:.85}}
@keyframes pet-plus{0%{transform:translate(-50%,8px) scale(.7);opacity:0}20%{transform:translate(-50%,-6px) scale(1.1);opacity:1}100%{transform:translate(-50%,-46px) scale(1);opacity:0}}
@media(max-width:560px){.pet-stage-wrap{flex-basis:100%}}
.pet-info{flex:1;min-width:240px;display:flex;flex-direction:column;gap:12px}
.pet-name-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.pet-name-row h2{margin:0}
.pet-stat span{font-size:13px;color:#8fd3ff}
.pet-bar{height:12px;border-radius:99px;background:rgba(255,255,255,.1);overflow:hidden;margin-top:6px}
.pet-bar>div{height:100%;border-radius:99px;background:linear-gradient(90deg,#46d9a0,#8fd3ff);transition:width .5s}
.pet-bar>div.low{background:linear-gradient(90deg,#ff9c6b,#ffc069)}
.pet-stat-row{display:flex;gap:16px}
.pet-coin{font-weight:700}
.pet-actions{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.pet-actions .btn.big{font-size:16px;padding:12px 18px}
.muted.small{font-size:12px}
/* 宠物图鉴 */
.pet-shop{margin-bottom:16px}
.shop-tier{margin:14px 0 8px;font-size:14px;color:#8fd3ff}
.shop-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}
.shop-card{display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 8px;border-radius:16px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.09);cursor:pointer;color:inherit;font:inherit;transition:transform .15s,border-color .15s}
.shop-card:hover:not(:disabled){transform:translateY(-2px);border-color:rgba(109,156,255,.5)}
.shop-card:disabled{opacity:.45;cursor:not-allowed}
.shop-card.current{border-color:#46d9a0;background:rgba(70,217,160,.1)}
.shop-card.owned{border-color:rgba(109,156,255,.4)}
.shop-card img{width:88px;height:88px;border-radius:14px;object-fit:contain;object-position:50% 100%}
.shop-card img.pet-img-fb{object-fit:cover}
.shop-card b{font-size:14px}
.shop-card span{font-size:12px;color:#9db2d0}
/* ── 小组城堡 ── */
.castle-card{margin-bottom:16px}
.castle-main{display:flex;gap:20px;align-items:center;flex-wrap:wrap}
.castle-keep{flex:0 0 180px;text-align:center;padding:18px 12px;border-radius:18px;background:linear-gradient(180deg,rgba(255,200,120,.08),rgba(109,156,255,.06));border:1px dashed rgba(255,255,255,.14)}
.castle-emoji{display:block;font-size:60px;line-height:1.15;filter:drop-shadow(0 6px 14px rgba(0,0,0,.35));transition:transform .3s}
.castle-emoji.stage-3,.castle-emoji.stage-4{transform:scale(1.12)}
.castle-keep strong{display:block;margin-top:6px;font-size:16px}
.castle-bricks{display:inline-block;margin:6px 0;font-size:14px;color:#ffc069}
.castle-side{flex:1;min-width:230px;display:flex;flex-direction:column;gap:12px}
.castle-members{display:flex;flex-wrap:wrap;gap:8px}
.castle-member{display:inline-flex;align-items:center;gap:6px;padding:4px 10px 4px 4px;border-radius:99px;background:rgba(255,255,255,.06)}
.castle-member.me{background:rgba(109,156,255,.18);border:1px solid rgba(109,156,255,.4)}
.castle-member img,.castle-member i{width:34px;height:34px;border-radius:50%;object-fit:cover;font-style:normal;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.08)}
.castle-member em{font-style:normal;font-size:13px}
.castle-mini-pets{display:inline-flex;align-items:center}
.castle-mini-pets img{width:26px;height:26px;border-radius:50%;object-fit:cover;margin-left:-8px;border:2px solid #232936;background:#fff}
.castle-mini-pets img:first-child{margin-left:0}
.castle-side .btn.big{font-size:16px;padding:14px 18px;border-radius:14px}

/* ── 小组农场地块 ── */
.farm-field{flex:1;min-width:280px;display:flex;flex-direction:column;gap:12px}
.farm-field-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.plot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
@media(max-width:520px){.plot-grid{grid-template-columns:repeat(2,1fr)}}
.plot{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;padding:14px 6px 10px;border-radius:16px;border:2px solid #d9b98c;background:linear-gradient(180deg,#f7e8d0,#eed9b8);cursor:default;color:inherit;font:inherit;transition:transform .15s,box-shadow .15s}
.plot.growing{border-color:#a8c98a;background:linear-gradient(180deg,#eef5df,#dcecc4)}
.plot.mature{border-color:#e8a23d;background:linear-gradient(180deg,#fdf0d5,#f9dfa8);cursor:pointer;box-shadow:0 0 14px rgba(232,162,61,.45)}
.plot.mature:hover{transform:scale(1.05)}
.plot.locked{opacity:.55;border-style:dashed}
.plot-art{font-size:34px;line-height:1.2;min-height:42px}
.plot-name{font-size:12px;font-weight:650}
.plot.mature .plot-name{color:#b06a00;animation:none}
.plot-water{font-size:10px;letter-spacing:1px}
.mini-plot{font-style:normal;font-size:14px}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.55}}

/* 农场贡献水滴 */
.member-waters{display:inline-block;margin-left:6px;font-size:10px;color:#7ba05b;font-weight:700}

/* ══ 小组农场 v3（2026-09-27 学习强化版）：场景化田地 · 宠物干活 · 牧场 · 知识收集册 · 任务成就 ══
   颜色一律走学生可爱主题的 token（带兜底值），老师端打开也不至于失色。 */
.farm-v3{--soil:#ecd3aa;--soil-2:#dcbb8b;--grass:#e4f2d0;--grass-2:#cfe5b2;--gold:#f0b429;--farm-ink:var(--ink,#4a3d31);--farm-muted:var(--muted,#8d7a66);--farm-card:var(--surface-1,#fff);--farm-soft:var(--surface-2,#fff1e0);--farm-line:var(--line,#ecd4b2)}
.btn.tiny{min-height:28px;padding:3px 9px;font-size:11px;border-radius:9px;margin:0;gap:4px}

/* 顶栏：天气 / 季节 / 等级 / 今日水量 / 连对 / 肥料 */
.farm-topbar{display:flex;flex-wrap:wrap;gap:8px;margin:4px 0 10px}
.farm-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:99px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2);color:var(--farm-ink,#4a3d31);font-size:13px;font-weight:650;line-height:1.4}
.farm-chip small{font-weight:500;color:#6f5d4b;font-size:11px}
.farm-chip.warn{background:var(--warn-soft,#fceccb);border-color:rgba(221,154,46,.45)}
.farm-chip.weather-sunny{background:#fff6d8;border-color:#f1d68a}
.farm-chip.weather-cloudy{background:#f2f4f7;border-color:#dde3ea}
.farm-chip.weather-rain{background:linear-gradient(135deg,#e6f1ff,#d6e9ff);border-color:#a9cdf5}
.farm-chip.weather-rainbow{background:linear-gradient(90deg,#ffe4e4,#fff3cf,#e3f7db,#ddefff,#efe4ff);border-color:#e3c8ef}
.farm-alert{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 10px;padding:10px 14px;border-radius:14px;background:var(--warn-soft,#fceccb);border:1px solid rgba(221,154,46,.4);color:var(--farm-ink,#4a3d31);font-size:13px;line-height:1.7}
.farm-v3 .farm-alert .btn.ghost{color:var(--farm-ink,#4a3d31);background:rgba(255,255,255,.75);border:1px solid rgba(221,154,46,.5)}
/* 主题徽章/弱化字在奶油底上偏浅（2.3~4.1:1），空间页里统一加深到 4.5:1 以上（选择器要压过 .student-theme 的同名规则） */
.student-theme .farm-v3 .muted,.student-theme .water-card .muted,.student-theme .pet-card .muted{color:#6f5d4b}
.student-theme .farm-v3 .badge.green,.student-theme .pet-card .badge.green{color:#1d6f47}
.student-theme .farm-v3 .badge.orange,.student-theme .water-card .badge.orange{color:#983826}
.student-theme .water-card .badge.blue,.student-theme .pet-card .badge.blue{color:#9f4125}
.student-theme .water-card .badge,.student-theme .author-item .badge{color:#963e25}
.student-theme .farm-v3 .btn.ghost,.student-theme .pet-card .btn.ghost{color:var(--farm-ink,#4a3d31)}
.student-theme .water-card.lose .badge.green{color:#17603c}
.student-theme .farm-board-card .muted{color:#6f5d4b}
.student-theme .pet-card .pet-stat span{color:#a8472b}

/* 组员宠物条：正在干活的宠物会蹦跶，闲着的在田边打盹 */
.farm-pets{display:flex;gap:10px;overflow-x:auto;padding:4px 2px 10px;margin:6px 0 2px;scroll-snap-type:x proximity}
.farm-pet{flex:0 0 auto;display:flex;align-items:center;gap:8px;min-width:150px;max-width:220px;padding:8px 12px 8px 8px;border-radius:16px;background:var(--farm-card,#fff);border:1px solid var(--farm-line,#ecd4b2);scroll-snap-align:start}
.farm-pet.me{border-color:var(--accent,#e0714f);box-shadow:0 0 0 2px var(--accent-soft,#ffe2d4)}
/* 头像底下垫一个圆，透明底的小图站在圆上；闲着的轻轻浮（不再变灰），今天还没来过的冒 💤，走丢的灰着不动 */
.farm-pet-av{position:relative;flex:none;display:inline-flex;width:44px;height:44px;border-radius:50%;background:var(--farm-soft,#fff1e0)}
.farm-pet-img{display:block;width:44px;height:44px;flex:none;object-fit:contain;object-position:50% 100%}
.farm-pet-img.pet-img-fb{border-radius:50%;object-fit:cover}
.farm-pet.idle .farm-pet-img{animation:farm-float 3.4s ease-in-out infinite}
.farm-pet.busy .farm-pet-img{animation:farm-hop 1.4s ease-in-out infinite}
.farm-pet.lost .farm-pet-img{filter:grayscale(.9);opacity:.6;animation:none}
.farm-pet-zzz{position:absolute;right:-7px;top:-9px;font-size:13px;font-style:normal;line-height:1;pointer-events:none;animation:fs-zzz 2.8s ease-in-out infinite}
.pet-none{display:inline-flex;align-items:center;justify-content:center;font-style:normal;font-size:22px}
.farm-pet-text{display:flex;flex-direction:column;min-width:0;line-height:1.4}
.farm-pet-text b{font-size:13px;color:var(--farm-ink,#4a3d31);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.farm-pet-text small{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 页签 */
.farm-tabs{display:flex;gap:6px;overflow-x:auto;padding:4px;margin:8px 0 12px;border-radius:16px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2)}
.farm-tab{flex:1 0 auto;min-height:40px;padding:8px 14px;border:0;border-radius:12px;background:transparent;color:#6f5d4b;font:inherit;font-size:14px;font-weight:650;cursor:pointer;white-space:nowrap}
.farm-tab:hover{color:var(--farm-ink,#4a3d31);background:rgba(255,255,255,.6)}
.farm-tab.active{background:var(--farm-card,#fff);color:var(--on-accent-soft,#b04a2f);box-shadow:var(--shadow-1,0 2px 10px rgba(186,128,80,.12))}
.farm-tab:focus-visible,.sticker:focus-visible,.seed-card:focus-visible{outline:2px solid var(--accent,#e0714f);outline-offset:2px}

/* 田地场景：草地上的一块块垄沟地 */
.farm-v3 .plot-grid{grid-template-columns:repeat(auto-fill,minmax(150px,200px));justify-content:center;gap:12px;padding:14px;border-radius:20px;border:1px solid #bcd99a;background:radial-gradient(circle at 10% 16%,rgba(255,255,255,.6) 0 5px,transparent 6px),radial-gradient(circle at 82% 78%,rgba(255,255,255,.5) 0 4px,transparent 5px),radial-gradient(circle at 55% 40%,rgba(255,255,255,.35) 0 3px,transparent 4px),linear-gradient(180deg,var(--grass),var(--grass-2))}
.farm-v3 .plot{min-height:180px;justify-content:flex-start;gap:5px;padding:12px 8px 10px;border:2px solid #c99a62;background:repeating-linear-gradient(0deg,var(--soil) 0 14px,var(--soil-2) 14px 16px);box-shadow:inset 0 -6px 0 rgba(120,80,40,.12);color:#5b4020}
.farm-v3 .plot.growing{border-color:#8fbf6a;background:repeating-linear-gradient(0deg,#e9d6b1 0 14px,#d8bd8f 14px 16px)}
.farm-v3 .plot.mature{cursor:default;border-color:#e8a23d;background:repeating-linear-gradient(0deg,#f7e2b6 0 14px,#edcb8c 14px 16px);animation:farm-glow 2.2s ease-in-out infinite}
.farm-v3 .plot.mature:hover{transform:none}
.farm-v3 .plot.mature.q-gold{border-color:var(--gold);animation-name:farm-glow-gold}
.farm-v3 .plot.special{outline:2px dashed #c38ae6;outline-offset:2px}
.farm-v3 .plot.bugged{border-color:#c47f4c}
.farm-v3 .plot.locked{justify-content:center;border:2px dashed #b3c79a;background:repeating-linear-gradient(45deg,rgba(255,255,255,.6) 0 10px,rgba(255,255,255,.3) 10px 20px);color:var(--farm-muted,#8d7a66);opacity:1}
.farm-v3 .plot-art{font-size:40px;line-height:1.1;min-height:46px;filter:drop-shadow(0 3px 4px rgba(90,60,20,.25))}
.farm-v3 .plot.empty .plot-art{filter:grayscale(.85) drop-shadow(0 2px 2px rgba(90,60,20,.2));opacity:.38;transform:scale(.82)}
/* 生长中：以根部为原点左右晃 ±6°（每块的相位由 space.js 按时钟错开）；熟了：弹跳 + 旁边一闪一闪；空地不动 */
.farm-v3 .plot.growing .plot-art{animation:farm-sway 3.2s ease-in-out infinite;transform-origin:50% 100%}
.farm-v3 .plot .plot-art.ripening{font-size:30px;filter:saturate(.7) drop-shadow(0 3px 4px rgba(90,60,20,.25))}
.farm-v3 .plot.mature .plot-art{position:relative;transform-origin:50% 100%;animation:farm-ripe 1.8s ease-in-out infinite}
.farm-v3 .plot.mature .plot-art::after{content:'✨';position:absolute;right:-15px;top:-4px;font-size:15px;line-height:1;animation:farm-twinkle 1.8s ease-in-out infinite;animation-delay:inherit}
.farm-v3 .plot-name{font-size:13px;color:#5b4020;background:rgba(255,255,255,.72);padding:1px 9px;border-radius:99px}
.farm-v3 .plot.mature .plot-name{color:#9a5200}
.farm-v3 .plot.locked .plot-name{background:none;color:#5f4e3d;text-align:center}
.farm-v3 .plot-water{display:flex;flex-wrap:wrap;justify-content:center;gap:2px;font-size:11px;letter-spacing:0;line-height:1;padding:3px 6px;border-radius:99px;background:rgba(255,255,255,.55)}
.plot-water .drop{font-style:normal;color:#3d8fd8}
.plot-water .drop.gold{color:#d99a00;text-shadow:0 0 4px rgba(240,180,41,.7)}
.plot-water .drop.empty{color:rgba(90,60,20,.4)}
.plot-pest{position:absolute;top:6px;left:6px;padding:1px 7px;border-radius:99px;background:#fff3e0;border:1px solid #e0a468;font-size:11px;font-weight:700;color:#8f4610;animation:farm-wiggle 1.2s ease-in-out infinite}
.plot-quality{position:absolute;top:4px;right:6px;font-size:20px;animation:farm-shine 2s ease-in-out infinite}
.plot-owner{font-size:11px;color:#6b4d28;background:rgba(255,255,255,.78);padding:0 8px;border-radius:99px}
.plot-workers{display:flex;flex-wrap:wrap;justify-content:center;gap:6px}
.plot-workers:empty{display:none}
.worker{position:relative;display:inline-flex;flex-direction:column;align-items:center;gap:1px;animation:farm-walk 2.6s ease-in-out infinite}
.worker-img{width:36px;height:36px;border-radius:50%;object-fit:contain;object-position:50% 100%;border:2px solid #fff;background:#fff;box-shadow:0 2px 6px rgba(90,60,20,.25)}
.worker-img.pet-img-fb{object-fit:cover}
.worker .pet-none{width:36px;height:36px;border-radius:50%;background:#fff}
.worker.me .worker-img{border-color:var(--accent,#e0714f)}
.worker-act{position:absolute;top:-8px;right:-10px;font-style:normal;font-size:16px}
.worker.water .worker-act{animation:farm-drip 1.2s ease-in infinite}
.worker.plant .worker-act,.worker.fertilize .worker-act{animation:farm-pop 1.4s ease-in-out infinite}
.worker.harvest .worker-act,.worker.collect .worker-act{animation:farm-bounce 1.2s ease-in-out infinite}
.worker.feed .worker-act,.worker.sell .worker-act{animation:farm-wiggle 1.2s ease-in-out infinite}
.worker em{font-style:normal;font-size:10px;font-weight:700;color:#5b4020;background:rgba(255,255,255,.88);padding:0 6px;border-radius:99px;max-width:70px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.plot-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:4px;margin-top:auto}
.farm-v3 .plot .btn.ghost.tiny{background:rgba(255,255,255,.85);border:1px solid rgba(141,98,52,.3);color:#6b4d28}
.farm-v3 .plot .btn.ghost.tiny:hover{background:#fff;color:#4a3219}

/* 选种子 / 买动物 */
.seed-picker{margin-top:12px;padding:14px;border-radius:18px;background:var(--farm-card,#fff);border:1px solid var(--farm-line,#ecd4b2);box-shadow:var(--shadow-2,0 10px 28px rgba(186,128,80,.16))}
.seed-picker .section-heading{margin-bottom:4px}
.seed-grid,.ranch-shop{display:grid;grid-template-columns:repeat(auto-fill,minmax(128px,1fr));gap:10px;margin-top:8px}
.seed-card{display:flex;flex-direction:column;align-items:center;gap:3px;padding:10px 8px;border-radius:16px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2);color:var(--farm-ink,#4a3d31);font:inherit;cursor:pointer;transition:transform .15s,border-color .15s}
.seed-card:hover:not(:disabled){transform:translateY(-2px);border-color:var(--accent,#e0714f)}
.seed-card:disabled{opacity:1;cursor:not-allowed}
.seed-card:disabled>.seed-art{opacity:.5;filter:grayscale(.65)}
.seed-card.special{background:linear-gradient(160deg,#f6ecff,#fff4e0);border-color:#d6b3ef}
.seed-art{font-size:30px;line-height:1.2}
.seed-card b{font-size:13px}
.seed-card small{font-size:11px;text-align:center;line-height:1.45}
.farm-do{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0 6px}
.farm-do .btn{margin:0}
.farm-do .btn.big{font-size:16px;padding:13px 20px;border-radius:16px;min-height:50px}

/* 牧场：木栅栏围起来的草场 */
.ranch-head,.book-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:6px}
.ranch-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;padding:14px;border-radius:20px;border:1px solid #c8dca6;background:repeating-linear-gradient(90deg,transparent 0 46px,rgba(150,105,60,.16) 46px 50px),linear-gradient(180deg,#eff7de,#dbeac0)}
.ranch-grid>p{grid-column:1/-1;margin:6px 0}
.animal{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 8px;border-radius:16px;background:rgba(255,255,255,.88);border:1px solid var(--farm-line,#ecd4b2);text-align:center;color:var(--farm-ink,#4a3d31)}
.animal-art{font-size:40px;line-height:1.15}
.animal.hungry .animal-art{filter:saturate(.5);animation:farm-wiggle 2.4s ease-in-out infinite}
.animal.growing .animal-art{animation:farm-hop 2.2s ease-in-out infinite}
.animal.ready{border-color:var(--gold,#f0b429);box-shadow:0 0 14px rgba(240,180,41,.45)}
.animal.ready .animal-art{animation:farm-bounce 1.4s ease-in-out infinite}
.animal small{font-size:11px;line-height:1.45}
.animal-bar{display:block;width:100%;max-width:150px;height:8px;border-radius:99px;background:var(--surface-inset,#ffeedd);overflow:hidden}
.animal-bar i{display:block;height:100%;border-radius:99px;background:linear-gradient(90deg,#8fd18a,#3fb574);transition:width .5s}
.farm-sub{margin:18px 0 8px;font-size:15px}
.warehouse{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:10px}
.ware{display:flex;flex-direction:column;align-items:flex-start;gap:4px;padding:10px 12px;border-radius:14px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2)}
.ware>span{font-size:26px;line-height:1.2}

/* 知识收集册：作业本横线纸 + 贴纸（没集齐是灰的） */
.book-unit{margin-top:12px;padding:12px 14px;border-radius:18px;border:1px solid var(--farm-line,#ecd4b2);background:repeating-linear-gradient(180deg,var(--farm-card,#fff) 0 27px,#f4e8d6 27px 28px)}
.book-unit.done{border-color:rgba(56,181,124,.45);background:repeating-linear-gradient(180deg,#f5fbf7 0 27px,#dff0e4 27px 28px)}
.book-unit-head{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.sticker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}
.sticker{display:flex;flex-direction:column;align-items:center;gap:4px;padding:10px 8px;border-radius:16px;border:2px dashed var(--line-strong,#e3bd8d);background:rgba(255,255,255,.92);color:var(--farm-ink,#4a3d31);font:inherit;cursor:pointer;transition:transform .15s,border-color .15s}
.sticker:hover{transform:translateY(-2px) rotate(-1deg);border-color:var(--accent,#e0714f)}
.sticker-art{font-size:30px;line-height:1.2;filter:grayscale(1);opacity:.45}
.sticker.done{border-style:solid;border-color:rgba(56,181,124,.55);background:#f2fbf5}
.sticker.done .sticker-art{filter:none;opacity:1;animation:farm-shine 3s ease-in-out infinite}
.sticker b{font-size:13px;text-align:center;line-height:1.4}
.sticker small{font-size:11px;color:#6f5d4b}

/* 任务 / 薄弱点 / 成就 / 动态 */
.quest-list{display:flex;flex-direction:column;gap:8px}
.quest{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:2px 12px;padding:10px 14px;border-radius:14px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2)}
.quest>span:first-child{grid-row:1/span 2;font-size:24px}
.quest>b{grid-column:2;font-size:14px}
.quest>small{grid-column:2;font-size:12px}
.quest>.animal-bar,.quest>.btn,.quest>.badge{grid-column:3;grid-row:1/span 2;min-width:96px}
.quest.done{border-color:rgba(56,181,124,.45);background:var(--success-soft,#d9f4e5)}
.weak-list{display:flex;flex-wrap:wrap;gap:6px}
.weak-list .badge{font-size:12px;white-space:normal;text-align:left}
.ach-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px}
.ach{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:10px 12px;border-radius:14px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2);color:var(--farm-ink,#4a3d31)}
.ach:not(.on)>span{opacity:.6;filter:grayscale(.85)}
.ach>span{font-size:22px}
.ach.on{opacity:1;filter:none;background:linear-gradient(160deg,#fff8e1,var(--farm-card,#fff));border-color:#efcd78}
.ach b{font-size:13px}
.ach small{font-size:11px;line-height:1.5}
.farm-feed{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;max-height:300px;overflow:auto}
.farm-feed li{padding:8px 12px;border-radius:12px;background:var(--farm-soft,#fff1e0);font-size:13px;line-height:1.6;overflow-wrap:anywhere}

/* 浇水答题卡 */
.water-card .section-heading{flex-wrap:wrap;gap:8px}
.water-card .paper-options .chip{justify-content:flex-start;text-align:left;white-space:normal;overflow-wrap:anywhere;min-height:44px;font-size:14px;line-height:1.6}
.water-card .field input{width:100%;min-height:44px;font-size:15px}
.water-card .field{color:var(--ink,#4a3d31)}
.water-card .muted{color:#6f5d4b}
.water-card .btn.ghost{color:var(--ink,#4a3d31)}
.water-card #water-text-ok,.water-card #water-multi-ok{margin-top:10px}
.water-retry-note{margin:8px 0 12px;padding:10px 14px;border-radius:12px;background:rgba(255,255,255,.78);border:1px dashed rgba(221,154,46,.6)}
.water-retry-note p{margin:4px 0;line-height:1.7}
.water-retry-note .btn{margin:6px 8px 0 0}
.water-badges{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0}
/* 基础 .badge 是 flex:none + nowrap：长来源名（整份卷子标题）会顶出卡片，允许收缩换行 */
.water-badges .badge{white-space:normal;text-align:left;line-height:1.5;flex:0 1 auto;min-width:0;max-width:100%;overflow-wrap:anywhere}
.win-lines{margin:6px 0 10px;padding-left:20px;line-height:1.9}
.farm-board-card .farm-row{flex-wrap:wrap}

@keyframes farm-hop{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
@keyframes farm-walk{0%,100%{transform:translateX(-3px)}50%{transform:translateX(3px)}}
@keyframes farm-sway{0%,100%{transform:rotate(-6deg)}50%{transform:rotate(6deg)}}
@keyframes farm-ripe{0%,100%{transform:translateY(0) scale(1)}35%{transform:translateY(-7px) scale(1.06,1.08)}58%{transform:translateY(0) scale(1.07,.93)}75%{transform:translateY(-2px) scale(1)}}
@keyframes farm-twinkle{0%,100%{transform:scale(.3) rotate(0);opacity:0}45%{transform:scale(1.15) rotate(25deg);opacity:1}70%{opacity:.6}}
@keyframes farm-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
@keyframes farm-bounce{0%,100%{transform:translateY(0) scale(1)}40%{transform:translateY(-5px) scale(1.06)}}
@keyframes farm-glow{0%,100%{box-shadow:0 0 6px rgba(232,162,61,.35)}50%{box-shadow:0 0 18px rgba(232,162,61,.7)}}
@keyframes farm-glow-gold{0%,100%{box-shadow:0 0 0 2px rgba(240,180,41,.35),0 0 8px rgba(240,180,41,.45)}50%{box-shadow:0 0 0 3px rgba(240,180,41,.55),0 0 22px rgba(240,180,41,.8)}}
@keyframes farm-wiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-8deg)}75%{transform:rotate(8deg)}}
@keyframes farm-drip{0%{transform:translateY(-4px);opacity:0}30%{opacity:1}100%{transform:translateY(8px);opacity:0}}
@keyframes farm-pop{0%,100%{transform:scale(.85)}50%{transform:scale(1.15)}}
@keyframes farm-shine{0%,100%{filter:drop-shadow(0 0 0 rgba(240,180,41,0))}50%{filter:drop-shadow(0 0 6px rgba(240,180,41,.9))}}

@media(max-width:560px){
  .farm-v3 .plot-grid{grid-template-columns:repeat(2,minmax(0,1fr));padding:10px;gap:8px}
  .farm-v3 .plot{min-height:164px;padding:10px 4px 8px}
  .farm-v3 .plot-art{font-size:34px;min-height:40px}
  .farm-pet{min-width:132px}
  /* 5 个页签在 390px 宽的手机上要一屏放下（放不下时仍可横向滑动，当前页签会自动滑进视野） */
  .farm-tabs{gap:2px;padding:3px}
  .farm-tab{flex:1 1 auto;padding:8px 4px;font-size:12px}
  .farm-do .btn{width:100%}
  .quest{grid-template-columns:auto minmax(0,1fr)}
  .quest>.animal-bar,.quest>.btn,.quest>.badge{grid-column:1/-1;grid-row:auto;justify-self:start}
  .quest>.animal-bar{max-width:none}
  .ranch-grid,.sticker-grid,.seed-grid,.ranch-shop{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(prefers-reduced-motion:reduce){
  .farm-v3 *,.farm-v3 *::before,.farm-v3 *::after,.pet-card *,.pet-card *::before,.pet-card *::after{animation:none!important;transition:none!important}
  .pet-fx,.fs-fx{display:none} /* 不飘粒子；田里的小人由 space.js 静止地摆在地块旁边 */
}

/* ── 知识点订单（田地页签顶部）── */
.order-strip{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;margin:0 0 12px}
.order-card{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border-radius:16px;background:var(--farm-card,#fff);border:1px solid var(--farm-line,#ecd4b2);border-left:5px solid #e8a23d;color:var(--farm-ink,#4a3d31)}
.order-card.from-auto{border-left-color:#8f7bd6}
.order-card.done{background:#fff8e1;border-color:#efcd78}
.order-card.claimed{background:var(--success-soft,#d9f4e5);border-color:rgba(56,181,124,.45);border-left-color:#38b57c}
.order-top{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px}
.order-top b{font-size:14px}
.order-from{font-size:12px;font-weight:700;color:#8a4b12}
.order-card.from-auto .order-from{color:#5a4aa6}
.order-card small{font-size:12px;line-height:1.55}
.order-progress{display:flex;align-items:center;gap:8px}
.order-progress .animal-bar{flex:1;max-width:none}
.order-progress>small{font-weight:700;min-width:30px}
.order-progress .btn,.order-progress .badge{flex:none}
.water-focus{margin:0 0 8px;padding:8px 12px;border-radius:12px;background:#fff3dc;border:1px dashed #e8a23d;color:#6b4417;font-size:13px;font-weight:600;line-height:1.6}

/* ── 小组出题互考（✍️ 出题页签）── */
.author-intro{padding:12px 14px;border-radius:16px;background:linear-gradient(160deg,#f6f0ff,var(--farm-card,#fff));border:1px solid #dccdf3;margin-bottom:12px;color:var(--farm-ink,#4a3d31)}
.author-intro p{margin:4px 0 0}
.author-form{display:flex;flex-direction:column;gap:12px;padding:14px;border-radius:18px;background:var(--farm-card,#fff);border:1px solid var(--farm-line,#ecd4b2)}
.author-form .field{color:var(--farm-ink,#4a3d31);font-size:13px}
.author-form textarea,.author-form input:not([type=radio]){width:100%;margin-top:6px;font-size:15px;min-height:42px;padding:9px 12px}
.author-type{display:flex;flex-wrap:wrap;gap:8px}
.author-type .chip{display:inline-flex;align-items:center;gap:6px;cursor:pointer;min-height:40px;font-size:14px}
.author-options{border:1px dashed var(--line-strong,#e3bd8d);border-radius:14px;padding:10px 12px;margin:0;display:flex;flex-direction:column;gap:8px}
.author-options legend{padding:0 6px;font-size:13px;font-weight:650;color:var(--farm-ink,#4a3d31)}
.author-option{display:flex;align-items:center;gap:8px;color:var(--farm-ink,#4a3d31)}
.author-option input[type=radio]{width:20px;height:20px;flex:none;accent-color:#e0714f;cursor:pointer}
.author-option input:not([type=radio]){margin-top:0}
.author-option b{flex:none;width:18px}
.author-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.student-theme .author-form .school-form-status{color:var(--farm-ink,#4a3d31);font-weight:600;margin:0}
.author-actions .btn{margin:0}
.author-list{display:flex;flex-direction:column;gap:8px}
.author-item{display:flex;flex-direction:column;gap:4px;padding:10px 12px;border-radius:14px;background:var(--farm-soft,#fff1e0);border:1px solid var(--farm-line,#ecd4b2);color:var(--farm-ink,#4a3d31)}
.author-item.approved{background:#f2fbf5;border-color:rgba(56,181,124,.45)}
.author-item.rejected{background:#fdf1ee;border-color:#f0c6bb}
.author-item-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.author-item-head .btn{margin-left:auto}
.author-stem{margin:0;font-size:14px;line-height:1.7;overflow-wrap:anywhere}
.author-item small{font-size:12px;line-height:1.6}
.author-note{color:#8f3a24;font-weight:600}
@media(max-width:560px){
  .order-strip{grid-template-columns:1fr}
  .author-form{padding:12px}
}

/* ══ 田地「活起来」（2026-09-30）：草地下沿留一条小路，组员的宠物（128 小图）在上面散步，干活的走到那块地的工位上比划 ══
   场景两层都在 .plot-grid 里：fs-back 在地块后面（小路、傍晚/夜晚的色调），fs-front 在地块前面（小人、天气季节粒子、一层很淡的色调）。
   两层都是装饰：aria-hidden、pointer-events:none，点击穿过去落在地块的按钮上；位置由 space.js 的一个 rAF 循环只写 transform。 */
.farm-v3 .plot-grid.has-scene{position:relative;isolation:isolate;padding-bottom:calc(86px + var(--fs-quiet-height,0px))}
.fs-back,.fs-front{position:absolute;inset:0;border-radius:inherit;overflow:hidden;pointer-events:none}
.fs-back{z-index:-1}
.fs-front{z-index:4}
.fs-back>i,.fs-front>i{position:absolute;inset:0;font-style:normal}
.fs-back>.fs-path{inset:auto 14px calc(12px + var(--fs-quiet-height,0px));height:44px;border-radius:99px;box-shadow:inset 0 2px 0 rgba(255,255,255,.35);background:
  radial-gradient(circle at 9% 42%,rgba(255,255,255,.6) 0 2px,transparent 2.6px),radial-gradient(circle at 31% 70%,rgba(150,108,60,.35) 0 2px,transparent 2.6px),
  radial-gradient(circle at 57% 34%,rgba(255,255,255,.55) 0 2px,transparent 2.6px),radial-gradient(circle at 83% 64%,rgba(150,108,60,.3) 0 2px,transparent 2.6px),
  linear-gradient(180deg,rgba(224,192,140,.55),rgba(206,166,110,.6))}
.fs-tint{opacity:0;transition:opacity 1.5s}
.tod-evening .fs-back>.fs-tint{opacity:1;background:linear-gradient(180deg,rgba(255,172,92,.34),rgba(255,128,72,.22))}
.tod-evening .fs-front>.fs-tint{opacity:1;background:rgba(255,150,70,.08)}
.tod-night .fs-back>.fs-tint{opacity:1;background:linear-gradient(180deg,rgba(28,44,118,.42),rgba(36,40,104,.34))}
.tod-night .fs-front>.fs-tint{opacity:1;background:rgba(22,34,100,.13)}
/* 场景生效时，地块里重复的小头像藏起来（位置照留，小人就站在那儿；title 提示和读屏照旧） */
.plot-grid.has-scene .worker[data-walk]{opacity:0;animation:none}
.plot-grid.has-scene .worker[data-walk] *{animation:none}

/* 小人：外层 fs-walker 只做位移（JS 写 transform），fs-bob 做一蹦一蹦 / 呼吸 / 坐下 / 干活，fs-flip 往左走时水平翻转 */
.fs-walker{--pw:52px;position:absolute;left:0;top:0;width:var(--pw);height:calc(var(--pw) + 16px);will-change:transform}
.fs-shadow{position:absolute;left:16%;right:16%;top:calc(var(--pw) - 5px);height:9px;border-radius:50%;background:radial-gradient(closest-side,rgba(70,48,18,.34),rgba(70,48,18,0))}
.fs-bob{position:absolute;left:0;top:0;width:var(--pw);height:var(--pw);transform-origin:50% 100%}
.fs-flip{display:block;width:100%;height:100%;transition:transform .18s}
.fs-walker.left .fs-flip{transform:scaleX(-1)}
.fs-img{display:block;width:100%;height:100%;object-fit:contain;object-position:50% 100%;user-select:none;-webkit-user-drag:none}
.fs-img.pet-img-fb{border-radius:50%;object-fit:cover;border:2px solid #fff;background:#fff;box-shadow:0 2px 6px rgba(90,60,20,.25)} /* 小图还没生成：原图裁成圆头像在走 */
.fs-walker.me .fs-img{filter:drop-shadow(0 0 1.2px var(--accent,#e0714f)) drop-shadow(0 0 1.2px var(--accent,#e0714f))}
.fs-name{position:absolute;left:50%;top:calc(var(--pw) + 1px);transform:translateX(-50%);max-width:76px;padding:0 6px;border-radius:99px;background:rgba(255,255,255,.92);color:#5b4020;font-size:10px;font-style:normal;font-weight:700;line-height:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:0 1px 2px rgba(90,60,20,.18)}
.fs-walker.me .fs-name{color:#983826;box-shadow:0 0 0 1.5px var(--accent,#e0714f)}
.fs-act,.fs-zzz{position:absolute;font-style:normal;line-height:1;opacity:0}
.fs-act{right:-6px;top:-4px;font-size:18px}
.fs-walker.left .fs-act{right:auto;left:-6px}
.fs-zzz{right:-6px;top:-10px;font-size:14px}
.fs-walker.walking .fs-bob{animation:fs-hop .46s ease-in-out infinite}
.fs-walker.walking .fs-shadow{animation:fs-shadow .46s ease-in-out infinite}
.fs-walker.rest .fs-bob{animation:fs-breathe 2.6s ease-in-out infinite}
.fs-walker.sit .fs-bob{transform:translateY(3px) scale(1.05,.9)}
.fs-walker.sit .fs-zzz{animation:fs-zzz 2.6s ease-in-out infinite}
.fs-walker.work .fs-bob{animation:fs-work 1.2s ease-in-out infinite}
.fs-walker.work .fs-act{opacity:1}
.fs-walker.work.act-water .fs-act{animation:fs-drip 1.1s ease-in infinite}
.fs-walker.work.act-plant .fs-act,.fs-walker.work.act-fertilize .fs-act{animation:farm-pop 1.3s ease-in-out infinite}
.fs-walker.work.act-harvest .fs-act,.fs-walker.work.act-collect .fs-act{animation:farm-bounce 1s ease-in-out infinite}
.fs-walker.work.act-harvest .fs-bob,.fs-walker.work.act-collect .fs-bob{animation:fs-hop .6s ease-in-out infinite}
.fs-walker.work.act-feed .fs-act,.fs-walker.work.act-sell .fs-act{animation:farm-wiggle 1.2s ease-in-out infinite}
.fs-walker .fs-bob{animation:none!important} /* 位移仍由场景循环维护，步态交给宠物头部和双足，避免两层整体蹦动。 */
.fs-walker .fs-flip pet-companion{width:100%;height:100%;aspect-ratio:auto}
.fs-walker.me pet-companion .pc-actor{filter:drop-shadow(0 0 1.2px #c56936)}
.pet-poke pet-companion{width:176px;height:176px;aspect-ratio:auto}
.farm-v3 .farm-tabs button,.farm-v3 .farm-do button,.farm-v3 .plot .btn,.pet-card .pet-actions .btn{min-height:44px}
.student-theme .student-app .farm-v3 button.btn,.student-theme .student-app .farm-v3 .author-type>.chip{min-width:44px;min-height:44px}
.farm-v3 #water-slot{scroll-margin-top:76px}
.farm-v3,.farm-v3 .farm-topbar,.farm-v3 .farm-pets,.farm-v3 .order-strip,.farm-v3 .quest-list{min-width:0;max-width:100%;box-sizing:border-box}
.space-motion-paused .farm-v3 *,.space-motion-paused .farm-v3 *::before,.space-motion-paused .farm-v3 *::after,.space-motion-paused .pet-card *{animation-play-state:paused!important}
.fs-walker.motion-static,.fs-walker.motion-static *,.fs-walker.motion-static *::before,.fs-walker.motion-static *::after{animation:none!important;transition:none!important}
.fs-walker.motion-static{will-change:auto}
@keyframes fs-hop{0%,100%{transform:translateY(0) scale(1)}20%{transform:translateY(0) scale(1.06,.93)}55%{transform:translateY(-6px) scale(.97,1.04)}}
@keyframes fs-shadow{0%,20%,100%{transform:scale(1);opacity:1}55%{transform:scale(.72);opacity:.55}}
@keyframes fs-breathe{0%,100%{transform:scaleY(1)}50%{transform:scaleY(1.035)}}
@keyframes fs-work{0%,100%{transform:rotate(0)}30%{transform:rotate(-6deg) translateY(1px)}60%{transform:rotate(4deg)}}
@keyframes fs-zzz{0%{transform:translate(0,4px) scale(.7);opacity:0}25%{opacity:1}100%{transform:translate(8px,-14px) scale(1.1);opacity:0}}
@keyframes fs-drip{0%{transform:translateY(-2px);opacity:0}25%{opacity:1}100%{transform:translateY(24px);opacity:0}}

/* 天气季节粒子：外层 <i> 铺满田地当「轨道」（按自身宽高的百分比移动 = 按田地大小移动），里面的 <b> 是看得见的那一点 */
.fs-fx{position:absolute;inset:0;z-index:1}
.fs-fx>i{position:absolute;inset:0;font-style:normal}
.fs-fx b{position:absolute;left:0;top:0;font-weight:400;line-height:1}
.fx-fly{animation:fx-path-a 26s linear infinite}
.fx-fly.b{animation-name:fx-path-b}
.fx-fly>b{font-size:18px;animation:fx-flap .3s ease-in-out infinite alternate}
.fx-bug{animation:fx-path-b 23s linear infinite}
.fx-bug.a{animation-name:fx-path-a}
.fx-bug.c{animation-name:fx-path-c}
.fx-bug>b{width:9px;height:9px;border-radius:50%;background:radial-gradient(circle,#fffbd6 0 28%,rgba(222,255,128,.95) 42%,rgba(222,255,128,0) 72%);animation:fx-blink 2.3s ease-in-out infinite}
.fx-fall{animation:fx-fall 12s linear infinite}
.fx-fall>b{font-size:17px;animation:fx-sway 3.2s ease-in-out infinite alternate}
.fx-fall.snow>b{font-size:14px;animation-duration:4.4s}
.fx-cloud{animation:fx-drift 50s linear infinite}
.fx-cloud>b{width:300px;height:130px;border-radius:50%;background:radial-gradient(closest-side,rgba(48,62,80,.17),rgba(48,62,80,0))}
.fs-fx>.fx-rain{top:-64px;opacity:.55;animation:fx-rain .6s linear infinite;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='46' height='64'%3E%3Cg stroke='%236a9fd8' stroke-width='1.3' stroke-linecap='round'%3E%3Cpath d='M9 3l-2 13'/%3E%3Cpath d='M31 22l-2 13'/%3E%3Cpath d='M20 43l-2 13'/%3E%3Cpath d='M43 50l-1.5 10'/%3E%3C/g%3E%3C/svg%3E") repeat}
.fs-fx>.fx-bow{--r:170px;inset:6px 4% auto auto;width:calc(var(--r)*2);height:var(--r);background:radial-gradient(circle var(--r) at 50% 100%,transparent 0 58%,rgba(255,105,105,.5) 58% 63%,rgba(255,172,70,.5) 63% 68%,rgba(255,228,96,.5) 68% 73%,rgba(124,206,112,.48) 73% 78%,rgba(98,168,238,.48) 78% 83%,rgba(160,116,228,.42) 83% 88%,transparent 88%);animation:fx-shimmer 5s ease-in-out infinite}
.fx-spark{font-size:15px;animation:fx-twinkle 2.6s ease-in-out infinite}
@keyframes fx-path-a{0%,100%{transform:translate(5%,54%)}17%{transform:translate(24%,14%)}34%{transform:translate(46%,46%)}51%{transform:translate(70%,12%)}68%{transform:translate(86%,44%)}84%{transform:translate(52%,64%)}}
@keyframes fx-path-b{0%,100%{transform:translate(88%,22%)}20%{transform:translate(62%,58%)}40%{transform:translate(34%,20%)}60%{transform:translate(10%,50%)}80%{transform:translate(40%,70%)}}
@keyframes fx-path-c{0%,100%{transform:translate(40%,30%)}25%{transform:translate(72%,60%)}50%{transform:translate(90%,18%)}75%{transform:translate(20%,66%)}}
@keyframes fx-flap{from{transform:scaleX(1)}to{transform:scaleX(.3)}}
@keyframes fx-blink{0%,100%{opacity:.1;transform:scale(.6)}50%{opacity:1;transform:scale(1.25)}}
@keyframes fx-fall{from{transform:translateY(-14%)}to{transform:translateY(104%)}}
@keyframes fx-sway{from{transform:translateX(-16px) rotate(-20deg)}to{transform:translateX(16px) rotate(24deg)}}
@keyframes fx-drift{from{transform:translateX(-320px)}to{transform:translateX(100%)}}
@keyframes fx-rain{from{transform:translateY(0)}to{transform:translateY(64px)}}
@keyframes fx-shimmer{0%,100%{opacity:.55}50%{opacity:.85}}
@keyframes fx-twinkle{0%,100%{opacity:0;transform:scale(.4) rotate(0)}50%{opacity:1;transform:scale(1.15) rotate(25deg)}}
@media(max-width:560px){
  .farm-v3 .plot-grid.has-scene{padding-bottom:calc(72px + var(--fs-quiet-height,0px))}
  .fs-walker{--pw:44px}
  .fs-back>.fs-path{inset:auto 10px calc(10px + var(--fs-quiet-height,0px));height:38px}
  .fs-fx>.fx-bow{--r:110px}
}
