@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}.overlay~.sr-only{display:none}}
@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}
