@font-face{font-family:Nunito;src:url(assets/nunito-800.woff2) format('woff2');font-weight:800;font-display:swap}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:#130f1e;color:#fff0d2}body{font:800 16px Nunito,system-ui,sans-serif;display:grid;place-items:center;min-height:100svh}button,a{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer}button:focus-visible,a:focus-visible{outline:3px solid #e2f993;outline-offset:4px}button:disabled{cursor:default}button{touch-action:manipulation}button:disabled:not(.patch){opacity:.45}.stage{position:relative;width:min(100vw,1600px);aspect-ratio:16/9;isolation:isolate;overflow:hidden;background:#282130;container-type:inline-size;border:1px solid #584039;box-shadow:0 0 100px #0009}.scenery,.vignette{position:absolute;inset:0;pointer-events:none}.scenery{background:url(assets/garden.webp) center/cover}.vignette{background:linear-gradient(0deg,#100c1be0,transparent 24%,transparent 72%,#160e294a),radial-gradient(ellipse at center,transparent 40%,#160e2933)}.hud{position:absolute;z-index:10;top:3%;left:3%;right:3%;display:flex;align-items:center;gap:1.1%;height:11%}.logo{font-family:Georgia,serif;font-weight:900;text-decoration:none;line-height:.87;font-size:4.7cqw;letter-spacing:-.15cqw;color:#ffedc3;text-shadow:3px 3px 0 #321c24,-2px -2px 0 #321c24,0 5px 12px #000;display:flex;flex-direction:column;transform:rotate(-4deg);margin-right:auto}.logo>span+span{color:#c9e686;font-size:.89em;margin-left:6px}.logo i{color:#ffc56d;font-size:.75em;font-style:normal}.logo-leaf{font-size:.45em;color:#bc95e3;vertical-align:top}.panel{border:2px solid #936747;border-radius:20px;background:linear-gradient(135deg,#40322cea,#291e29f5);box-shadow:inset 0 0 0 3px #19122288,inset 0 1px 0 5px #d7a96b22,0 6px 0 #1b1520aa,0 10px 22px #0004}.score-panel,.clock-panel,.hearts{display:flex;align-items:center;justify-content:center;padding:.9cqw 1.5cqw;gap:1cqw;height:78%;font-size:2.4cqw;white-space:nowrap}.score-panel small{font-size:1.2cqw;letter-spacing:1px}.score-panel strong{color:#ffd37d;min-width:3.2ch}.clock-panel span{font-size:3.2cqw;color:#e5d5ee;line-height:1}.hearts{color:#ff7d85;text-shadow:0 3px 0 #832e42;font-size:3cqw;letter-spacing:.15cqw}.hearts .lost{color:#5f414b;text-shadow:none}.round{width:4.5cqw;height:4.5cqw;border-radius:50%;font-size:2.4cqw;padding:0}.witch-wrap{position:absolute;z-index:3;left:1%;top:19%;width:39%;height:65%;pointer-events:none;transform-origin:40% 90%;animation:none}.witch{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 8px 5px #0f081c55);position:relative;z-index:2}.witch-shadow{position:absolute;width:62%;height:12%;bottom:-1%;left:8%;background:#24132390;filter:blur(6px);border-radius:50%}.witch-spark{position:absolute;right:1%;top:73%;color:#ffe5a4;font-size:4cqw;opacity:0}.garden{position:absolute;z-index:4;left:39%;right:6%;top:34%;bottom:20%;display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);gap:1% 4%;touch-action:none;user-select:none}.patch{position:relative;border:0;background:transparent;padding:0;min-width:0;min-height:0;touch-action:none;outline-offset:-2px!important;cursor:crosshair}.soil{position:absolute;bottom:1%;left:3%;width:94%;height:50%;border-radius:48% 47% 42% 46%;background:radial-gradient(ellipse at 50% 30%,#271c16 5%,#302119 43%,#60412b 46%,#6f4e31 57%,#42301e 75%,#34271c 85%);box-shadow:0 5px 2px #18120d66,inset 0 0 0 3px #a7834655;transform:rotate(-3deg)}.soil:before,.soil:after{content:'';position:absolute;background:#9d7750;border-radius:45%;box-shadow:14px 3px 0 #805d36,-12px 5px 0 #65492e;left:16%;bottom:8%;width:10%;height:16%}.soil:after{left:76%;bottom:53%;background:#765532;transform:rotate(35deg)}.plant-wrap{position:absolute;inset:-17% 4% 6%;transform-origin:50% 88%;pointer-events:none;visibility:hidden}.occupied .plant-wrap{visibility:visible;animation:emerge .22s cubic-bezier(.2,1.4,.4,1) both}.plant{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 5px 2px #20131577);animation:wiggle 1.8s ease-in-out infinite;transform-origin:50% 90%}.patch:nth-child(3n) .plant{animation-delay:-.7s}.root .plant{filter:hue-rotate(320deg) saturate(.72) drop-shadow(0 5px 2px #20131577);transform:scale(1.08)}.herb .plant{animation:sway 2.5s ease-in-out infinite}.hp{position:absolute;top:-6%;right:0;display:none;border-radius:50%;background:#60412b;color:#fff3d5;border:2px solid #d7b473;width:24px;height:24px;font:800 13px Nunito;place-items:center;box-shadow:0 2px 4px #0008}.root .hp{display:grid}.lifetime{position:absolute;bottom:0;left:26%;width:48%;height:3px;opacity:0;background:#c8e47e;border-radius:3px;transform-origin:left center;pointer-events:none}.occupied .lifetime{opacity:.85}.herb .lifetime{background:#ccabff}.patch.bonk .plant-wrap{animation:bonk .22s}.patch.charred:after{content:'✦';position:absolute;inset:0;color:#ffb145;font-size:5cqw;text-shadow:0 0 20px #ff591b;animation:spark .35s;pointer-events:none}.float{position:absolute;top:10%;left:50%;white-space:nowrap;pointer-events:none;z-index:7;font-size:2.2cqw;color:#ffdb89;text-shadow:0 3px 0 #38201b;animation:float-up .75s ease-out forwards;transform:translateX(-50%)}.float.bad{color:#ff9eaa}.combo{position:absolute;z-index:7;top:22%;left:46%;font-size:2.5cqw;color:#ffe391;text-shadow:0 3px 0 #4c2928;transform:rotate(-8deg);pointer-events:none}.combo.pop{animation:combo-pop .25s}.spellbar{position:absolute;z-index:10;bottom:7%;left:39%;right:10%;height:12%;display:flex;align-items:center;justify-content:center;gap:3%;padding:1% 2%}.magic-label{width:24%;text-align:left}.magic-label small{font-size:.85cqw;letter-spacing:.1cqw;color:#d8c0ab}.energy-track{height:.7cqw;background:#170e24;border:1px solid #735775;border-radius:10px;margin:.5cqw 0;overflow:hidden}#energy{height:100%;width:50%;background:linear-gradient(90deg,#9e69d5,#e5b1fa);border-radius:10px;transition:width .2s}.magic-label>span{font-size:.9cqw;color:#c5a7db}.spell{position:relative;display:flex;flex-direction:column;align-items:center;border:0;background:transparent;padding:0;flex:1;height:100%;justify-content:center;border-radius:10px;gap:2px}.spell-icon{display:grid;place-items:center;width:4.1cqw;height:4.1cqw;border-radius:50%;border:2px solid #bb8753;background:radial-gradient(circle,#58314b,#1c1325 80%);box-shadow:0 3px 0 #100e1b;font-size:2.6cqw;color:#b4e9ff;line-height:1}.spell>span:not(.spell-icon){font-size:.83cqw}.spell small{font-size:.62cqw;color:#c8a88e}.spell:not(:disabled):hover .spell-icon{filter:brightness(1.3);transform:translateY(-2px)}.spell.active .spell-icon{box-shadow:0 0 0 2px #ffcc68,0 0 25px #ff751b;background:#854427}.spell#frost.active .spell-icon{box-shadow:0 0 0 2px #9ceaff,0 0 25px #6abaff;background:#25587c}.duration{position:absolute;bottom:0;left:8%;width:84%;height:3px;background:#ffbf65;transform-origin:left center;transform:scaleX(0)}#frost-duration{background:#a1eaff}footer{position:absolute;z-index:10;bottom:1.8%;left:3%;right:3%;display:flex;align-items:center;justify-content:space-between;font-size:.95cqw;color:#e2d5be}footer button{border:0;background:#21182ba6;border-radius:20px;padding:6px 12px;font-size:.85cqw}.brand{font-size:1.8cqw;letter-spacing:-.08cqw;text-shadow:0 3px 0 #18111d;position:relative}.brand>span{color:#d7ed9a}.brand i{display:block;position:absolute;bottom:-.7cqw;left:35%;font-size:2.1cqw;color:#ffc86e;font-style:normal;line-height:.5}.overlay{position:absolute;z-index:15;inset:15% 5% 16% 40%;display:grid;place-items:center}.overlay[hidden]{display:none}.intro-card{padding:3cqw;text-align:center;width:100%;max-width:650px;border-radius:30px;background:linear-gradient(145deg,#302337f5,#251b2cf2);border-color:#b38b5e;box-shadow:inset 0 0 0 5px #c8a97510,0 12px 55px #120d20aa;backdrop-filter:blur(5px)}.eyebrow{font-size:.8cqw;letter-spacing:.12cqw;color:#d9c89e}h1{font:700 3.5cqw/1.1 Georgia,serif;letter-spacing:-.1cqw;margin:1.2cqw 0;color:#fff0d2}h1 em{font-style:normal;color:#c8e38d}.intro-card p{font-size:1.08cqw;line-height:1.7;color:#d7c6d5;margin:.8cqw 0}.instructions{display:flex;justify-content:center;gap:2cqw;margin:1cqw 0 1.5cqw}.instructions span{display:flex;flex-direction:column;align-items:center;font-size:.85cqw;color:#e6d8ca}.instructions img{width:4.8cqw;height:4.8cqw;object-fit:contain}.fire-instruction b{display:grid;place-items:center;width:4.8cqw;height:4.8cqw;font-size:3cqw}.primary{border:2px solid #f4d9a0;background:linear-gradient(#dfecaa,#b4d76c);box-shadow:0 5px 0 #557633,0 8px 15px #0004;border-radius:14px;color:#283421;font-size:1.1cqw;letter-spacing:.04cqw;padding:1.1cqw 2cqw;min-height:44px}.primary:hover{filter:brightness(1.08);transform:translateY(-1px)}.primary:active{transform:translateY(3px);box-shadow:0 2px 0 #557633}.primary span{margin-left:1cqw}.intro-card .fine{font-size:.78cqw;margin-top:1.3cqw;color:#ab97ac}.stage.paused .plant,.stage.paused .witch-wrap,.stage.paused .fireflies i,.stage.paused .broom-fire{animation-play-state:paused}.stage.frozen .garden{filter:drop-shadow(0 0 12px #83dafa88)}.stage.damage{animation:damage .3s}.broom-fire{position:absolute;z-index:3;left:83%;top:72%;width:65%;height:16%;opacity:0;transform-origin:left center;pointer-events:none;filter:drop-shadow(0 0 12px #ff692c)}.burning .broom-fire{opacity:1;animation:flame .16s infinite alternate}.broom-fire span{position:absolute;inset:0;background:linear-gradient(90deg,#ffed8c,#ff991e 60%,#ff471c 85%,transparent);clip-path:polygon(0 37%,25% 22%,45% 36%,67% 8%,60% 39%,100% 26%,82% 48%,100% 70%,66% 68%,74% 95%,47% 70%,18% 77%,0 63%)}.broom-fire span:nth-child(2){inset:25% 20% 24% 0;background:#fff3a0;transform:scaleX(.8);transform-origin:left}.broom-fire span:nth-child(3){inset:40% 50% 35% 0;background:#fffddd}.fireflies{position:absolute;inset:0;pointer-events:none}.fireflies i{position:absolute;width:4px;height:4px;border-radius:50%;background:#fff0a8;box-shadow:0 0 12px 4px #fdbf6080;animation:fly 5s ease-in-out infinite;left:20%;top:31%}.fireflies i:nth-child(2){left:76%;top:22%;animation-delay:-3s}.fireflies i:nth-child(3){left:13%;top:76%;animation-delay:-1s}.fireflies i:nth-child(4){left:86%;top:67%;animation-delay:-4s}.fireflies i:nth-child(5){left:56%;top:14%;animation-delay:-2s}.fireflies i:nth-child(6){left:43%;top:87%;animation-delay:-1.5s}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes emerge{from{transform:translateY(22%) scale(.25);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}@keyframes wiggle{0%,100%{transform:rotate(-4deg) translateY(0)}50%{transform:rotate(4deg) translateY(-4%)}}@keyframes sway{0%,100%{transform:rotate(-3deg)}50%{transform:rotate(3deg)}}@keyframes spark{0%{opacity:0;transform:scale(.2)}40%{opacity:1;transform:scale(1.2)}100%{opacity:0;transform:scale(1.5)}}@keyframes bonk{40%{transform:scale(1.2,.75) rotate(10deg)}}@keyframes float-up{0%{opacity:1;translate:0 0}100%{opacity:0;translate:0 -65px}}@keyframes combo-pop{50%{scale:1.25}}@keyframes damage{50%{box-shadow:inset 0 0 100px #eb516999;filter:brightness(1.2)}}@keyframes flame{from{transform:scale(1,.8) rotate(-3deg)}to{transform:scale(1.12,1.1) rotate(3deg)}}@keyframes fly{0%,100%{transform:translate(0,0);opacity:.4}50%{transform:translate(16px,-20px);opacity:1}}
@media(max-aspect-ratio:1/1){.stage{width:100vw;height:100svh;min-height:580px;aspect-ratio:auto;border:0}.scenery{background-position:68% center}.vignette{background:linear-gradient(0deg,#100c1bf2,transparent 28%,#170f2911 72%,#160e2955)}.hud{top:2%;height:8%;left:4%;right:4%;gap:2%}.logo{font-size:8cqw}.score-panel,.clock-panel{height:70%;border-radius:12px;padding:1.5cqw 2cqw;font-size:4.8cqw;gap:1.5cqw}.score-panel{margin-left:auto}.score-panel small{display:none}.clock-panel span{font-size:6cqw}.hearts{position:absolute;right:12%;top:115%;font-size:7cqw;padding:1cqw 3cqw;height:auto;border-radius:14px;letter-spacing:1cqw}.round{width:9cqw;height:9cqw;font-size:5cqw}.witch-wrap{left:0;top:10%;width:55%;height:31%;animation:none}.garden{left:5%;right:5%;top:40%;bottom:22%;gap:1% 4%}.plant-wrap{inset:-22% 0% 5%}.soil{height:44%}.spellbar{left:5%;right:5%;bottom:7.5%;height:12%;gap:2%;border-radius:18px;padding:3%}.magic-label{width:23%}.magic-label small{font-size:2cqw;letter-spacing:.1cqw}.magic-label>span{font-size:2.4cqw}.energy-track{height:1.8cqw;margin:1.4cqw 0}.spell-icon{width:12cqw;height:12cqw;font-size:7.7cqw}.spell>span:not(.spell-icon){font-size:2.1cqw}.spell small{font-size:1.65cqw}.combo{top:30%;left:53%;font-size:5cqw}.float{font-size:5cqw}.patch.charred:after{font-size:13cqw}footer{bottom:2.4%;left:5%;right:5%;font-size:2.7cqw;flex-wrap:wrap;gap:10px}.brand{font-size:4.5cqw}.brand i{font-size:6cqw;bottom:-2cqw}#hint{position:absolute;bottom:calc(100% + 8px);width:100%;text-align:center;font-size:2.5cqw}footer button{font-size:2.5cqw}.overlay{inset:30% 5% 17%}.intro-card{padding:6cqw 4cqw;border-radius:24px}.eyebrow{font-size:2cqw;letter-spacing:.2cqw}h1{font-size:8cqw;letter-spacing:-.3cqw;margin:3cqw 0}.intro-card p{font-size:3.1cqw;line-height:1.6;margin:2cqw 0}.instructions{gap:5cqw;margin:3cqw 0 4cqw}.instructions span{font-size:2.3cqw}.instructions img,.fire-instruction b{width:13cqw;height:13cqw}.fire-instruction b{font-size:8cqw}.primary{font-size:3cqw;padding:3cqw 5cqw}.intro-card .fine{font-size:2.1cqw;margin-top:4cqw}}
@media(max-width:350px) and (max-aspect-ratio:1/1){.stage{min-height:520px}.garden{top:41%;bottom:23%}.overlay{top:28%}.intro-card{padding:4cqw}.hearts{top:105%}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}
/* Keep spell icons circular rather than letting flex shrink their height. */
.spell-icon{flex-shrink:0;width:3.2cqw;height:3.2cqw;font-size:2.15cqw}.spellbar{padding:.65% 2%}.instructions[hidden]{display:none}
@media(max-aspect-ratio:1/1){.spell-icon{width:10cqw;height:10cqw;font-size:6.8cqw}.spellbar{padding:2.3% 3%}}
@media(max-aspect-ratio:1/1) and (max-height:650px){.spellbar{height:13.5%}.spell-icon{width:9cqw;height:9cqw;font-size:6cqw}.garden{bottom:24%}}
.broom-fire{left:91%;top:86%;width:55%;height:14%}
.broom-fire{rotate:-24deg}.spell.active:disabled{opacity:1}

/* Drawn, registered poses replace whole-character rocking and rotation. */
.witch-wrap{left:-7%;width:51%;animation:none;transform:none}
.witch-shadow{left:24%;width:45%}
.witch-spark{right:4%;top:39%}
.witch-wrap[data-frame="3"] .witch-spark{animation:spark .2s}
.broom-fire{left:94%;top:39%;width:43%;height:14%;rotate:-4deg}
@media(max-aspect-ratio:1/1){.witch-wrap{left:-15%;width:90%;animation:none}.witch-shadow{bottom:2%}}
/* At contact, the drawn broom tip lands on the selected patch. */
.witch-wrap{transition:left .085s ease-out,top .085s ease-out,width .12s ease-out,height .12s ease-out}
.witch-wrap.in-garden{z-index:6}.witch-wrap.facing-left .witch{transform:scaleX(-1)}
.witch-wrap.facing-left .witch-spark{right:auto;left:3%}
.witch-wrap.facing-left .broom-fire{left:auto;right:95%;scale:-1 1}
.witch-wrap.in-garden .witch-shadow{bottom:1%;opacity:.65}
.patch.contact:after{content:'✦';position:absolute;left:50%;top:30%;translate:-50% -50%;font-size:3cqw;color:#ffe3a1;text-shadow:0 0 12px #ffbc60;pointer-events:none;animation:spark .25s}
@media(max-aspect-ratio:1/1){.patch.contact:after{font-size:8cqw}}
.witch-wrap.in-garden{transition:left .07s ease-out,top .07s ease-out}
.stage.in-round .witch-wrap:not(.in-garden){left:8%;top:40%;width:28%;height:38%}
@media(max-aspect-ratio:1/1){.stage.in-round .witch-wrap:not(.in-garden){left:0;top:16%;width:55%;height:22%}}
/* Face the direction of travel, then face the plant when the broom makes contact. */
.witch-wrap.is-travelling .witch{transform:scaleX(var(--travel-facing,1))}
/* Drawn facial/leaf frames plus species-specific movement around fixed roots. */
.root .plant{filter:drop-shadow(0 5px 2px #20131577);transform:none}
.patch[data-motion] .plant{animation-duration:var(--plant-pace,1.6s);animation-delay:0s}
.patch[data-motion="wiggle"] .plant{animation-name:wiggle}
.patch[data-motion="sway"] .plant{animation-name:sway}
.patch[data-motion="bounce"] .plant{animation-name:plant-bounce}
.patch[data-motion="curl"] .plant{animation-name:plant-curl}
.patch[data-motion="grumble"] .plant{animation-name:plant-grumble}
.patch[data-motion="nod"] .plant{animation-name:plant-nod}
.patch[data-motion="bloom"] .plant{animation-name:plant-bloom}
.patch.reacting .plant-wrap{animation:plant-flinch .28s ease-out both}
.patch.departing .plant-wrap{animation:plant-depart .28s ease-in both}
.patch.reacting .plant{animation:none}
.stage.paused .plant-wrap{animation-play-state:paused}
@keyframes plant-bounce{0%,100%{transform:scale(1,1)}30%{transform:translateY(-5%) scale(.96,1.04)}70%{transform:scale(1.04,.96)}}
@keyframes plant-curl{0%,100%{transform:skewX(-3deg) rotate(-2deg)}50%{transform:skewX(3deg) rotate(2deg)}}
@keyframes plant-grumble{0%,80%,100%{transform:translateX(0)}86%{transform:translateX(-2%) rotate(-2deg)}92%{transform:translateX(2%) rotate(2deg)}}
@keyframes plant-nod{0%,100%{transform:rotate(-2deg) scaleY(1)}50%{transform:rotate(3deg) scaleY(.95)}}
@keyframes plant-bloom{0%,100%{transform:scale(1)}50%{transform:scale(1.04)}}
@keyframes plant-flinch{0%{transform:scale(1.1,.86)}40%{transform:scale(.93,1.06) rotate(-6deg)}100%{transform:scale(1)}}
@keyframes plant-depart{0%{transform:scale(1.1,.88);opacity:1}35%{transform:scale(.9,1.05);opacity:1}100%{transform:translateY(28%) scale(.25,.1);opacity:0}}
#spell-effects{position:absolute;inset:0;width:100%;height:100%;z-index:7;pointer-events:none}
.broom-fire{display:none}.witch-wrap[data-spell] .witch-spark{display:none}

/* A single dramatic burst, followed by time to read the exact penalty. */
.life-loss{position:absolute;inset:0;z-index:20;pointer-events:none;display:grid;place-items:center;background:radial-gradient(ellipse,#38122566,transparent 65%)}
.life-loss[hidden]{display:none}.loss-heart{position:absolute;top:26%;left:50%;width:110px;height:110px;transform:translateX(-50%);filter:drop-shadow(0 5px 0 #59162e) drop-shadow(0 0 28px #ff516d)}
.loss-heart span{position:absolute;inset:0;font-size:110px;line-height:1;color:#ff718e;text-align:center}.loss-heart span:first-child{clip-path:polygon(0 0,55% 0,43% 35%,57% 52%,43% 70%,50% 100%,0 100%)}.loss-heart span:nth-child(2){clip-path:polygon(55% 0,100% 0,100% 100%,50% 100%,43% 70%,57% 52%,43% 35%)}.loss-heart b{position:absolute;inset:0;color:#fff0b5;font-size:100px;line-height:1;text-align:center}
.loss-ring{position:absolute;left:50%;top:36%;width:160px;height:160px;border:5px solid #ff8d9b;border-radius:50%;opacity:0;box-shadow:0 0 28px #ff517e,inset 0 0 25px #ff517e;transform:translate(-50%,-50%)}
.loss-message{position:absolute;top:48%;left:50%;width:min(580px,85%);transform:translateX(-50%);text-align:center;background:linear-gradient(145deg,#411a35f5,#231526f5);border:2px solid #ff8a9d;border-radius:22px;padding:15px 24px;box-shadow:0 9px 0 #180d20,0 0 45px #e93b6955}
.loss-message strong{font-size:clamp(24px,4cqw,48px);color:#ff839b;text-shadow:0 3px 0 #631b39}.loss-message h2{font-size:clamp(17px,2.2cqw,30px);margin:4px 0;color:#fff0be}.loss-message p{font-size:clamp(12px,1.2cqw,17px);margin:4px 0;color:#edc9db}
.loss-shards{position:absolute;left:50%;top:36%}.loss-shards i{position:absolute;width:9px;height:17px;background:#ffc1c9;box-shadow:0 0 10px #ff6088;opacity:0;transform:rotate(var(--angle))}
.impact .loss-ring{animation:loss-wave .85s ease-out both}.impact .loss-ring.second{animation-delay:.12s}.impact .loss-heart span:first-child{animation:heart-left 1.7s both}.impact .loss-heart span:nth-child(2){animation:heart-right 1.7s both}.impact .loss-heart b{animation:heart-flash .45s both}.impact .loss-message{animation:loss-label 1.7s both}.impact .loss-shards i{animation:heart-shard .8s ease-out both}
.stage.life-impact:after{content:'';position:absolute;inset:0;z-index:19;pointer-events:none;box-shadow:inset 0 0 100px #ff456a99;animation:loss-edge 1.7s both}.life-impact .hearts{animation:heart-hud .5s}.patch.loss-source:before{content:'!';position:absolute;inset:5% 15%;z-index:8;border:3px solid #ff7c96;border-radius:50%;color:#fff1d1;background:#781a4566;font-size:clamp(22px,4cqw,50px);display:grid;place-items:center;box-shadow:0 0 22px #ff4267;pointer-events:none}
.stage.paused .life-loss *,.stage.paused.life-impact:after,.stage.paused .hearts{animation-play-state:paused}
@keyframes loss-wave{0%{opacity:.9;scale:.3}100%{opacity:0;scale:4}}
@keyframes heart-left{0%{translate:0 0;rotate:0deg;scale:.6}15%{translate:-5px 0;scale:1.2}40%,85%{translate:-24px 8px;rotate:-18deg;scale:1}100%{opacity:0;translate:-32px 24px}}
@keyframes heart-right{0%{translate:0 0;rotate:0deg;scale:.6}15%{translate:5px 0;scale:1.2}40%,85%{translate:24px 8px;rotate:18deg;scale:1}100%{opacity:0;translate:32px 24px}}
@keyframes heart-flash{0%{scale:.2;opacity:0}25%{scale:1.6;opacity:1}100%{scale:2;opacity:0}}
@keyframes heart-shard{0%{opacity:1;transform:rotate(var(--angle)) translateY(0)}100%{opacity:0;transform:rotate(var(--angle)) translateY(calc(-1 * var(--distance))) rotate(100deg)}}
@keyframes loss-label{0%{opacity:0;scale:.8}15%{opacity:1;scale:1.05}25%,90%{opacity:1;scale:1}100%{opacity:0;scale:1}}
@keyframes loss-edge{0%,20%{opacity:1}100%{opacity:0}}
@keyframes heart-hud{30%{scale:1.18;filter:brightness(1.7)}100%{scale:1}}
@media(max-aspect-ratio:1/1){.loss-heart{top:25%}.loss-ring,.loss-shards{top:33%}.loss-message{top:43%;padding:14px 12px}.loss-message h2{font-size:5cqw}.loss-message p{font-size:3.4cqw}.loss-message strong{font-size:8cqw}}
@media(prefers-reduced-motion:reduce){.impact .loss-ring,.impact .loss-shards,.impact .loss-heart b{display:none}.impact .loss-heart span,.impact .loss-message,.life-impact .hearts,.stage.life-impact:after{animation:none}.impact .loss-heart span:first-child{translate:-10px 0}.impact .loss-heart span:nth-child(2){translate:10px 0}}

/* Game over is an acted reaction followed by a warm invitation to retry. */
.end-flourish[hidden],.end-score[hidden]{display:none}.end-flourish{font-size:clamp(22px,3.8cqw,52px);color:#ffb4c0;text-shadow:0 4px 0 #6e314c;letter-spacing:.1em;rotate:-5deg;margin:-.5cqw 0 .6cqw}
.end-score{display:flex;flex-direction:column;margin:.7cqw 0;color:#ffda8c}.end-score span{font-size:clamp(26px,4cqw,52px);line-height:1.1}.end-score small{font-size:clamp(9px,.75cqw,12px);letter-spacing:.15em;color:#cdb6d8}
.game-ended .intro-card{animation:end-card .65s cubic-bezier(.2,.8,.2,1) both;border-color:#d591a5}.game-ended .end-flourish{animation:end-words 1.2s both}.game-ended .end-score{animation:end-score .8s .25s both}.game-ended .primary{animation:retry-in .55s .65s both}.game-ended .garden{filter:saturate(.65) brightness(.8)}.game-ended .witch-wrap{left:0;top:20%;width:39%;height:65%;z-index:16;transition:none}.game-ended .witch{transform:none}.game-ended .witch-shadow{left:32%;width:38%}.game-ended .witch-spark,.game-ended .broom-fire{display:none}.game-ended .overlay{inset:17% 5% 12% 39%}.game-ended .intro-card{padding:2cqw}.game-ended h1{font-size:3cqw}.game-ended .intro-card .fine{margin-top:.8cqw}
.witch-sigh{display:none;position:absolute;top:12%;right:8%;color:#ead4ec;font:italic 800 clamp(16px,2cqw,28px) Georgia;transform:rotate(8deg);text-shadow:0 2px 5px #241129}
.game-ended.ending-sad .witch-sigh{display:block;animation:witch-sigh 2s .45s both}.witch-sigh i{position:absolute;top:110%;left:20%;width:8px;height:15px;border-radius:80% 10% 80% 80%;background:#a3def9;rotate:-25deg;box-shadow:0 0 8px #c4edff}.witch-sigh i+i{left:40%;top:140%;width:5px;height:10px}
@keyframes end-card{0%{opacity:0;translate:0 -35px;rotate:4deg;scale:.85}65%{opacity:1;translate:0 5px;rotate:-2deg;scale:1.03}100%{translate:0 0;rotate:0deg;scale:1}}
@keyframes end-words{0%{opacity:0;scale:1.6;translate:0 -20px}35%{opacity:1;scale:.9;translate:0 3px}55%{scale:1.1;rotate:4deg}75%{scale:1;rotate:-2deg}100%{opacity:1;scale:1}}
@keyframes end-score{0%{opacity:0;scale:.6}70%{opacity:1;scale:1.12}100%{opacity:1;scale:1}}
@keyframes retry-in{0%{opacity:0;translate:0 15px}100%{opacity:1;translate:0 0}}
@keyframes witch-sigh{0%{opacity:0;translate:0 8px}20%,65%{opacity:1}100%{opacity:0;translate:10px -15px}}
@media(max-aspect-ratio:1/1){.game-ended .witch-wrap{left:23%;top:11%;width:54%;height:25%}.game-ended .witch-sigh{right:-8%;top:28%}.game-ended .overlay{inset:36% 5% 17%;z-index:17}.game-ended .intro-card{padding:4cqw}.game-ended h1{font-size:7cqw;margin:2cqw 0}.game-ended .end-flourish{font-size:7cqw;margin:0 0 2cqw}.game-ended .end-score{margin:2cqw 0}.game-ended .end-score span{font-size:9cqw}.game-ended .end-score small{font-size:2.2cqw}.game-ended .intro-card p{font-size:2.9cqw}.game-ended .intro-card .fine{font-size:2.3cqw;margin-top:3cqw}}
@media(prefers-reduced-motion:reduce){.game-ended .intro-card,.game-ended .end-flourish,.game-ended .end-score,.game-ended .primary,.game-ended.ending-sad .witch-sigh{animation:none}.game-ended .witch-sigh{display:none}}

/* Put the garden and its rewards at the centre of play. */
html,body,.stage,.stage *{-webkit-user-select:none;user-select:none}
#hit-effects{position:absolute;inset:0;width:100%;height:100%;z-index:8;pointer-events:none}
.stage.in-round .garden{left:32%;right:5%;top:29%;bottom:21%}
.patch.satisfying-hit .soil{animation:soil-impact .3s}.magic-collected{animation:magic-spark .4s}
.stage.magic-ready .magic-label:after{content:'MAGIC READY ✦';display:block;font-size:.75cqw;color:#f1d7ff;white-space:nowrap;animation:ready-glow 1.6s ease-in-out infinite}
.stage.magic-ready #sweep:not(:disabled) .spell-icon{border-color:#eac7ff;box-shadow:0 0 15px #c488ed88}
.stage.combat-frozen .plant,.stage.combat-frozen .plant-wrap{animation-play-state:paused}
@keyframes soil-impact{35%{scale:1.07 .88;filter:brightness(1.4)}100%{scale:1}}
@keyframes magic-spark{40%{color:#fff2b3;scale:1.12;text-shadow:0 0 14px #d9a7ff}}
@keyframes ready-glow{50%{opacity:.6}}
@media(max-aspect-ratio:1/1){.stage.in-round .garden{left:4%;right:4%;top:28%;bottom:22%;gap:3% 4%}.stage.in-round .witch-wrap:not(.in-garden){left:1%;top:18%;width:45%;height:18%}.stage.in-round .combo{top:22%;left:8%;font-size:5cqw}.stage.magic-ready .magic-label:after{font-size:2cqw}.stage.in-round .plant-wrap{inset:-8% 0 5%}}
@media(max-width:350px) and (max-aspect-ratio:1/1){.stage.in-round .garden{top:29%;bottom:24%}}
@media(prefers-reduced-motion:reduce){.patch.satisfying-hit .soil,.magic-collected,.stage.magic-ready .magic-label:after{animation:none}}
@media(max-aspect-ratio:1/1){.stage.in-round .plant-wrap{left:-12%;right:-12%;top:-18%;bottom:5%}}
.stage.magic-ready .spell:not(:disabled) .spell-icon{border-color:#eac7ff;box-shadow:0 0 12px #c488ed66}

/* Read the danger before a weed leaves; flowers never get a danger cue. */
.escape-risk{position:absolute;z-index:10;right:9%;top:16%;display:flex;align-items:center;gap:.65cqw;padding:.5cqw .8cqw;border:1px solid #9d8962;border-radius:12px;background:#251b2dec;color:#ecdfc1;pointer-events:none}.escape-risk[hidden]{display:none}.escape-risk span{font-size:1.4cqw}.escape-risk small{font-size:.65cqw;letter-spacing:.05em}.escape-risk>div{display:flex;gap:4px}.escape-risk i{width:7px;height:7px;background:#624654;border-radius:50%}.escape-risk i.filled{background:#ffb58d;box-shadow:0 0 6px #ff986b66}.escape-risk[data-risk="2"],.escape-risk[data-risk="3"]{border-color:#ff8da3;color:#ffbccb}.escape-risk[data-risk="2"] i.filled{background:#ff809e}
.escape-warning{display:none;position:absolute;right:5%;top:5%;z-index:7;color:#fff1cd;background:#80313b;border:2px solid #ffbe72;width:24px;height:24px;border-radius:50%;font-size:17px;line-height:20px;pointer-events:none;text-shadow:0 1px 0 #57232b}
.patch[data-urgency="1"] .escape-warning,.patch[data-urgency="2"] .escape-warning{display:block}.patch[data-urgency="1"] .lifetime{background:#ffbd70;height:5px;opacity:1}.patch[data-urgency="2"] .lifetime{background:#ff7b97;height:5px;opacity:1}.patch[data-urgency="1"] .plant-wrap{animation:weed-nervous .5s linear infinite}.patch[data-urgency="2"] .plant-wrap{animation:weed-hide .36s ease-in-out infinite}.patch[data-urgency="2"] .escape-warning{background:#aa294c;border-color:#ffc4ce}.patch[data-urgency="1"] .soil,.patch[data-urgency="2"] .soil{box-shadow:0 0 0 2px #ffc58a66,0 5px 2px #18120d66}
@keyframes weed-nervous{0%,100%{translate:-1px 0;rotate:-2deg}50%{translate:1px 0;rotate:2deg}}
@keyframes weed-hide{0%,100%{translate:0 5%;scale:1 .94}50%{translate:0 12%;scale:1 .88}}
.combo-bonus{position:absolute;z-index:11;left:45%;top:26%;color:#fff0b1;font-size:1.5cqw;text-shadow:0 2px 0 #512942,0 0 18px #b786ff;pointer-events:none}.combo-bonus[hidden]{display:none}.combo-bonus.pop{animation:combo-pop .3s}.stage[data-combo-tier="1"] .combo{color:#ecc7ff}.stage[data-combo-tier="2"] .combo{color:#fff1a2;text-shadow:0 2px 0 #5b324b,0 0 16px #ffd95e}
.broom-aura{display:none;position:absolute;left:83%;top:73%;z-index:4;color:#ffdba1;font-size:2.5cqw;text-shadow:0 0 20px #e9a3ff;pointer-events:none}.combo-charged.in-round .broom-aura{display:block;animation:broom-glimmer 1.1s ease-in-out infinite}.witch-wrap[data-frame="3"] .broom-aura{left:91%;top:40%}.witch-wrap.facing-left .broom-aura{left:auto;right:83%}.combo-charged .witch{filter:drop-shadow(0 8px 5px #0f081c55) drop-shadow(0 0 7px #c493ff88)}.stage[data-combo-tier="2"] .broom-aura{color:#fff5a9;text-shadow:0 0 18px #ffe884}.game-ended .broom-aura{display:none}
@keyframes broom-glimmer{50%{scale:1.25;rotate:20deg;opacity:.65}}
.stage.paused .broom-aura,.stage.combat-frozen .broom-aura{animation-play-state:paused}
@media(max-aspect-ratio:1/1){.escape-risk{right:4%;top:21%;left:4%;justify-content:flex-end;padding:1cqw 2cqw;gap:2cqw}.escape-risk span{font-size:3.8cqw}.escape-risk small{font-size:2.1cqw}.escape-risk i{width:6px;height:6px}.combo-bonus{left:8%;top:25%;font-size:3cqw}.stage.in-round .combo{top:18%;font-size:4cqw;max-width:52%}.broom-aura{font-size:6cqw}.escape-warning{width:21px;height:21px;font-size:15px;line-height:17px;right:0;top:0}}
@media(prefers-reduced-motion:reduce){.patch[data-urgency] .plant-wrap,.combo-charged.in-round .broom-aura,.combo-bonus.pop{animation:none}.patch[data-urgency="2"] .plant-wrap{translate:0 8%}}
.stage.paused .patch[data-urgency] .plant-wrap,.stage.combat-frozen .patch[data-urgency] .plant-wrap{animation-play-state:paused}
@media(max-aspect-ratio:1/1){.stage.in-round .combo{top:18.4%;left:4%;font-size:3cqw;max-width:none;white-space:nowrap;transform:none}.escape-risk small{font-size:clamp(9px,2.1cqw,13px)}}

/* Three chapters, one 75-second round. */
.round-phase{position:absolute;left:3%;top:17%;z-index:9;display:flex;flex-direction:column;gap:3px;max-width:29%;pointer-events:none;color:#e4dab9;text-shadow:0 2px 3px #190f27}.round-phase[hidden]{display:none}.round-phase small{font-size:.8cqw;color:#d4b9ef}.round-phase strong{font-size:1.25cqw}.round-phase span{font-size:.7cqw}.round-phase>div{display:flex;gap:6px;margin-top:3px}.round-phase i{width:22px;height:3px;background:#60476c;border-radius:3px}.round-phase i.reached{background:#d4ed9b}.phase-enter{animation:phase-in .4s}.stage[data-phase="1"] .round-phase strong{color:#f4c28c}.stage[data-phase="2"] .round-phase strong{color:#f7acdb}.scenery:after{content:'';position:absolute;inset:0;opacity:0;background:linear-gradient(120deg,#47176b44,#c3722022);transition:opacity 1.5s,background 1.5s}.stage[data-phase="1"] .scenery:after{opacity:.5}.stage[data-phase="2"] .scenery:after{opacity:1;background:linear-gradient(120deg,#21105b55,#79366444)}
@keyframes phase-in{from{opacity:.2;translate:-10px 0}to{opacity:1;translate:0 0}}
.victory-medal[hidden]{display:none}.victory-medal{display:flex;align-items:center;justify-content:center;gap:10px;margin:.5cqw 0;color:#e8ae79}.victory-medal b{display:grid;place-items:center;width:44px;height:44px;border:3px solid currentColor;border-radius:50%;font-size:30px;background:#291c35;box-shadow:0 3px 0 #140e20,0 0 18px #c8a37744}.victory-medal strong{font-size:1.1cqw;letter-spacing:.04em}.victory-medal[data-rank="silver"]{color:#dae7ff}.victory-medal[data-rank="gold"]{color:#ffe28c}
.ending-victory .scenery:after{opacity:1;background:linear-gradient(135deg,#ffd97a33,#d5eda521);transition:background 1s}.ending-victory .intro-card{border-color:#d5e99f}.ending-victory .end-flourish{color:#e0f4a5;letter-spacing:.025em;font-size:3.4cqw}.ending-victory .witch{animation:witch-cheer 1s ease-in-out 3;transform-origin:50% 90%}.ending-victory .garden{filter:brightness(1.1) saturate(1.2)}.ending-victory .victory-medal{animation:medal-reveal .7s .3s both}
.victory-flowers{display:none;position:absolute;left:4%;bottom:16%;width:30%;height:20%;z-index:17;pointer-events:none;align-items:flex-end;justify-content:center}.victory-flowers img{width:33%;height:100%;object-fit:contain;transform-origin:50% 90%;animation:flowers-cheer .65s ease-in-out 5}.victory-flowers img:nth-child(2){animation-delay:.12s;height:125%}.victory-flowers img:nth-child(3){animation-delay:.25s}.ending-victory .victory-flowers{display:flex}.victory-confetti{display:none;position:absolute;inset:0;z-index:18;pointer-events:none;overflow:hidden}.ending-victory .victory-confetti{display:block}.victory-confetti i{position:absolute;top:-5%;left:var(--x);width:8px;height:13px;background:#ddeda0;border-radius:2px;animation:victory-fall 2.7s var(--delay) ease-in both}.victory-confetti i:nth-child(3n){background:#dbb4ff}.victory-confetti i:nth-child(3n+1){background:#ffcf88}
@keyframes witch-cheer{0%,100%{translate:0 0;rotate:0deg}25%{translate:0 -9px;rotate:-4deg}55%{translate:0 0;rotate:3deg}75%{translate:0 -4px;rotate:0deg}}
@keyframes flowers-cheer{0%,100%{rotate:-5deg;translate:0 0}50%{rotate:5deg;translate:0 -8px}}
@keyframes medal-reveal{from{opacity:0;scale:.5;rotate:-12deg}70%{opacity:1;scale:1.12;rotate:5deg}to{scale:1;rotate:0deg}}
@keyframes victory-fall{to{translate:15px 950px;rotate:calc(var(--turn) + 360deg);opacity:0}}
@media(max-aspect-ratio:1/1){.round-phase{left:4%;top:13%;max-width:48%;gap:1px}.round-phase small{font-size:2cqw}.round-phase strong{font-size:2.65cqw}.round-phase span{display:none}.round-phase>div{gap:4px;margin-top:2px}.round-phase i{width:15px;height:2px}.ending-victory .end-flourish{font-size:6.5cqw}.victory-medal{margin:2cqw 0;gap:8px}.victory-medal b{width:30px;height:30px;font-size:22px;border-width:2px}.victory-medal strong{font-size:2.6cqw}.ending-victory .overlay{inset:34% 5% 17%}.ending-victory .intro-card{padding:3cqw}.ending-victory .intro-card p{font-size:2.6cqw}.ending-victory .intro-card .fine{font-size:2.2cqw;margin-top:2cqw}.victory-flowers{left:52%;bottom:66%;width:28%;height:12%;z-index:16}.ending-victory .witch-wrap{left:15%;top:11%;width:54%;height:23%}.ending-victory .end-score{margin:1cqw 0}}
@media(prefers-reduced-motion:reduce){.phase-enter,.ending-victory .witch,.ending-victory .victory-medal,.victory-flowers img{animation:none}.victory-confetti{display:none!important}.scenery:after{transition:none}}

/* One clearly telegraphed hop per dandelion, beginning in chapter two. */
.patch.hopper .hp{display:grid;background:#776324;border-color:#fff09c;font-size:0}.patch.hopper .hp:after{content:'↗';font-size:16px}.patch.hop-ready .plant-wrap{animation:hop-crouch .25s ease-in-out infinite}.patch.hop-ready .soil{box-shadow:0 0 0 2px #ffe49a,0 0 18px #eac96c88}.patch.hop-target:before{content:'↗';position:absolute;bottom:5%;left:12%;width:76%;height:49%;border:2px dashed #ffe49a;border-radius:50%;color:#fff3bd;background:#eac96c22;display:grid;place-items:center;font-size:clamp(20px,3cqw,36px);pointer-events:none;animation:hop-destination .6s ease-in-out infinite}.patch.jumping{z-index:9}.patch.jumping .plant-wrap{animation:hop-across .32s ease-in-out both}.patch.jumping .plant{animation:none}
@keyframes hop-crouch{50%{scale:1.06 .84;translate:0 8%}}
@keyframes hop-destination{50%{box-shadow:0 0 15px #ffe49a66;background:#eac96c44}}
@keyframes hop-across{0%{translate:var(--hop-x,0px) var(--hop-y,0px);scale:1.04 .86}50%{translate:calc(var(--hop-x,0px)*.5) calc(var(--hop-y,0px)*.5 - 35px);scale:.94 1.06}100%{translate:0 0;scale:1}}
.stage.paused .patch.hop-ready .plant-wrap,.stage.paused .patch.jumping .plant-wrap,.stage.paused .patch.hop-target:before,.stage.combat-frozen .patch.hop-ready .plant-wrap,.stage.combat-frozen .patch.jumping .plant-wrap,.stage.combat-frozen .patch.hop-target:before{animation-play-state:paused}
@media(prefers-reduced-motion:reduce){.patch.hop-ready .plant-wrap,.patch.hop-target:before,.patch.jumping .plant-wrap{animation:none}.patch.hop-ready .plant-wrap{scale:1.04 .92}.patch.jumping .plant-wrap{filter:drop-shadow(0 0 8px #ffdf8a)}}
.patch.hop-target:before{z-index:7}
