.fx-web { position: absolute; top: -1px; left: -1px; z-index: 1; overflow: visible; pointer-events: none; animation: fxFadeIn 0.9s ease backwards; }
.fx-web-tr { left: auto; right: -1px; transform: scaleX(-1); }
.fx-web.is-corner { position: fixed; top: var(--fx-web-top, 0px); left: 0; z-index: 84; width: clamp(140px, 15vw, 240px); height: clamp(140px, 15vw, 240px); }
.fx-web.is-corner.fx-web-tr { left: auto; right: 0; }
.fx-web-spokes, .fx-web-rings, .fx-web-frame { fill: none; stroke-linecap: round; stroke-linejoin: round; }
.fx-web-spokes { stroke: rgba(214, 224, 244, 0.42); stroke-width: 0.8; }
.fx-web-rings { stroke: rgba(214, 224, 244, 0.34); stroke-width: 0.7; }
.fx-web-frame { stroke: rgba(214, 224, 244, 0.38); stroke-width: 0.9; }
.fx-web.is-corner .fx-web-spokes, .fx-web.is-corner .fx-web-rings, .fx-web.is-corner .fx-web-frame { stroke-opacity: 0.75; }
.fx-spider-thread { stroke: rgba(214, 224, 244, 0.42); stroke-width: 0.6; }
.fx-spider-legs { fill: none; stroke: #858fac; stroke-width: 1.05; stroke-linecap: round; }
.fx-spider-abdomen, .fx-spider-head { fill: #1b2133; stroke: #6f7a98; stroke-width: 0.7; }
.fx-spider-eye { fill: #ff6a2e; }
.fx-spider-legs { transform-box: fill-box; transform-origin: 50% 50%; }
.fx-spider.is-running .fx-spider-legs { animation: fxSpiderRun 0.11s steps(2, jump-none) infinite alternate; }
@keyframes fxSpiderRun { from { transform: none; } to { transform: scaleY(0.8) skewX(9deg); } }
.fx-sky { z-index: 84; }
.fx-bat { position: absolute; left: -23px; top: -11px; width: 46px; height: 22px; opacity: var(--bat-o, 0); transform: var(--bat-move); will-change: transform; }
.fx-bat svg { display: block; width: 100%; height: 100%; overflow: visible; }
.fx-bat-wing { transform: scaleY(var(--bat-flap, 1)); }
.fx-bat-wing-l { transform-origin: 31px 13px; }
.fx-bat-wing-r { transform-origin: 33px 13px; }
.fx-bat-wing, .fx-bat-body { fill: #232a40; stroke: #58627f; stroke-width: 0.7; stroke-linejoin: round; }
html[data-season-decor] .site-footer::before { content: ""; position: absolute; left: 0; right: 0; bottom: 100%; height: 60px; pointer-events: none; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1200 60'%3E%3Cg fill='%2312244a' stroke='%232a4680' stroke-width='1'%3E%3Cpath d='M58 52V33a11 11 0 0 1 22 0v19Z'/%3E%3Cpath d='M138 52V29h-6v-5h6v-7h5v7h6v5h-6v23Z'/%3E%3Cpath d='M226 52V26l6-9 6 9v26Z'/%3E%3Cpath d='M318 52V37a9 9 0 0 1 18 0v15Z' transform='rotate(-9 327 52)'/%3E%3Cpath d='M468 52V31c0-5 3-8 9-9 6 1 9 4 9 9v21Z'/%3E%3Cpath d='M560 52V35h-5v-4h5v-6h4v6h5v4h-5v17Z'/%3E%3Cpath d='M676 52V30a12 12 0 0 1 24 0v22Z'/%3E%3Cpath d='M782 52V38a8 8 0 0 1 16 0v14Z' transform='rotate(7 790 52)'/%3E%3Cpath d='M880 52V27h-7v-5h7v-8h5v8h7v5h-7v25Z'/%3E%3Cpath d='M984 52V32a10 10 0 0 1 20 0v20Z'/%3E%3Cpath d='M1086 52V28l5-8 5 8v24Z'/%3E%3Cpath d='M1150 52V39a8 8 0 0 1 16 0v13Z' transform='rotate(-6 1158 52)'/%3E%3C/g%3E%3Cpath d='M396 52V26M396 36l-10-9m-2-6 2 6M396 31l9-11 5-2M396 42l7-5' fill='none' stroke='%231b3160' stroke-width='2.4' stroke-linecap='round'/%3E%3Cpath d='M0 54c60-5 130-3 200-2s150 3 230 0 170-4 250-1 160 3 250 1 150-3 270 2V60H0Z' fill='%230c1a36'/%3E%3Cpath d='M20 54l2-6 1 6 2-5 1 5m94 0 2-7 1 7 2-5 1 5m160 0 2-6 1 6 2-4 1 4m150 0 2-7 1 7m140 0 2-6 1 6 2-5 1 5m170 0 2-7 1 7 2-5 1 5m150 0 2-6 1 6m130 0 2-7 1 7 2-5 1 5' fill='none' stroke='%231c3464' stroke-width='1.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cg transform='translate(418 46)'%3E%3Cellipse rx='9.5' ry='7' fill='%23c85514'/%3E%3Cellipse cx='-4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse cx='4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse rx='3.6' ry='7' fill='%23ef7d25'/%3E%3Cpath d='M0-6.6q.5-3.6 3-4.4' fill='none' stroke='%233f6b2a' stroke-width='1.6' stroke-linecap='round'/%3E%3Cpath d='M-5-2.4l2.4-2.4 1 3Zm10 0-2.4-2.4-1 3ZM-4.8 1.4q4.8 4.6 9.6 0l-1.6.5-1.4-1.1-1.4 1.1-1.2-1.1-1.4 1.1Z' fill='%23ffd35c'/%3E%3C/g%3E%3Cg transform='translate(742 47) scale(.8)'%3E%3Cellipse rx='9.5' ry='7' fill='%23c85514'/%3E%3Cellipse cx='-4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse cx='4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse rx='3.6' ry='7' fill='%23ef7d25'/%3E%3Cpath d='M0-6.6q.5-3.6 3-4.4' fill='none' stroke='%233f6b2a' stroke-width='1.6' stroke-linecap='round'/%3E%3C/g%3E%3Cg transform='translate(1046 46) scale(.9)'%3E%3Cellipse rx='9.5' ry='7' fill='%23c85514'/%3E%3Cellipse cx='-4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse cx='4.6' rx='5' ry='6.8' fill='%23e06a1a'/%3E%3Cellipse rx='3.6' ry='7' fill='%23ef7d25'/%3E%3Cpath d='M0-6.6q.5-3.6 3-4.4' fill='none' stroke='%233f6b2a' stroke-width='1.6' stroke-linecap='round'/%3E%3Cpath d='M-5.2-3.4l2.6 1.6-2.6 1.4Zm10.4 0-2.6 1.6 2.6 1.4ZM-4.4 2q4.4 3.6 8.8 0Z' fill='%23ffd35c'/%3E%3C/g%3E%3C/svg%3E") center bottom / 1200px 60px repeat-x; animation: fxFadeIn 0.9s ease backwards; }
@media (max-width: 760px) { html[data-season-decor] .site-footer::before { height: 44px; background-size: 880px 44px; } }
.fx-zombie { position: absolute; left: var(--zx, 0px); bottom: var(--zy, 0px); width: 0; height: 0; }
.fx-zombie.is-hand { --zw: calc(18px * var(--gs)); --zh: calc(30px * var(--gs)); }
.fx-zombie.is-hands { --zw: calc(30px * var(--gs)); --zh: calc(30px * var(--gs)); }
.fx-zombie.is-body { --zw: calc(40px * var(--gs)); --zh: calc(37px * var(--gs)); }
.fx-zombie-pit { position: absolute; left: calc(var(--zw) / -2 - 12px); bottom: 0; width: calc(var(--zw) + 24px); height: calc(var(--zh) + 14px); overflow: hidden; }
.fx-zombie-rise { position: absolute; left: 12px; bottom: 0; width: var(--zw); height: var(--zh); transform: translateY(105%); transition: transform 0.7s cubic-bezier(0.55, 0, 0.9, 0.45); }
.fx-zombie.is-up .fx-zombie-rise { transform: none; transition: transform 0.6s cubic-bezier(0.2, 1.35, 0.45, 1); }
.fx-zombie-art { display: block; width: 100%; height: 100%; overflow: visible; transform-origin: 50% 100%; }
.fx-zombie.is-out .fx-zombie-art { animation: fxZombieStruggle 0.26s linear 2, fxZombieSway 2.4s ease-in-out 0.52s infinite; }
.fx-zombie.is-body.is-out .fx-zombie-art { animation-name: fxZombieStruggle, fxZombieLurch; animation-duration: 0.26s, 3.2s; }
.fx-zombie-fingers { transform-box: fill-box; transform-origin: 50% 100%; }
.fx-zombie.is-out .fx-zombie-fingers { animation: fxZombieGrab 0.75s ease-in-out 0.55s infinite alternate; }
.fx-zombie.is-out .fx-zombie-late .fx-zombie-fingers { animation-delay: 0.9s; }
.fx-zombie svg path { stroke-linecap: round; stroke-linejoin: round; }
.fx-zombie-skin { fill: #86ad70; stroke: #1a2b19; stroke-width: 1.4; paint-order: stroke; }
.fx-zombie-skin.is-shade { fill: #5e8450; }
.fx-zombie-rag { fill: #3d3354; stroke: #19142a; stroke-width: 1.1; paint-order: stroke; }
.fx-zombie-edge { fill: none; stroke: #1a2b19; stroke-width: 3.4; }
.fx-zombie-digit { fill: none; stroke: #86ad70; stroke-width: 2; }
.fx-zombie-seam { fill: none; stroke: #19142a; stroke-width: 0.9; }
.fx-zombie-hair { fill: none; stroke: #23202c; stroke-width: 1.3; }
.fx-zombie-wound { fill: none; stroke: #5a2f33; stroke-width: 1; }
.fx-zombie-stitch, .fx-zombie-teeth { fill: none; stroke: #ddd6b6; stroke-width: 0.6; }
.fx-zombie-teeth { stroke-width: 0.8; }
.fx-zombie-socket, .fx-zombie-mouth { fill: #16210f; }
.fx-zombie-eye { fill: #f1ff9e; }
.fx-zombie-glow { fill: #d8ff5c; opacity: 0.3; }
.fx-zombie.is-out .fx-zombie-glow { animation: fxZombieGlow 1.3s ease-in-out infinite alternate; }
.fx-zombie-mound { position: absolute; left: calc(var(--zw) * -0.55); bottom: -2px; width: calc(var(--zw) * 1.1); height: calc(7px * var(--gs)); border-radius: 50% 50% 0 0 / 100% 100% 0 0; background: #0c1a36; box-shadow: inset 0 1px 0 #1c3464; transform: scale(0.4, 0); transform-origin: 50% 100%; transition: transform 0.3s ease 0.45s; }
.fx-zombie.is-up .fx-zombie-mound { transform: none; transition-delay: 0s; }
.fx-zombie-clod { position: absolute; left: -1.5px; bottom: 1px; width: 3px; height: 2.5px; border-radius: 45% 55% 40% 60%; background: #1f3462; opacity: 0; }
.fx-zombie.is-up .fx-zombie-clod { animation: fxClod 0.8s linear both; }
.fx-zombie-clod:nth-of-type(1) { --cx: -12px; --cy: -16px; }
.fx-zombie-clod:nth-of-type(2) { --cx: 10px; --cy: -21px; animation-delay: 0.04s; }
.fx-zombie-clod:nth-of-type(3) { --cx: -4px; --cy: -25px; animation-delay: 0.08s; }
.fx-zombie-clod:nth-of-type(4) { --cx: 15px; --cy: -11px; animation-delay: 0.02s; }
.fx-zombie-clod:nth-of-type(5) { --cx: -17px; --cy: -8px; animation-delay: 0.1s; }
@keyframes fxZombieStruggle { 0%, 100% { transform: none; } 25% { transform: translateX(-1px) rotate(-5deg); } 75% { transform: translateX(1px) rotate(5deg); } }
@keyframes fxZombieSway { 0%, 100% { transform: none; } 30% { transform: rotate(-7deg); } 70% { transform: rotate(6deg); } }
@keyframes fxZombieLurch { 0%, 100% { transform: none; } 25% { transform: translateX(-1px) rotate(-5deg); } 50% { transform: rotate(1deg); } 75% { transform: translateX(1px) rotate(5deg); } }
@keyframes fxZombieGrab { from { transform: none; } to { transform: scaleY(0.5) skewX(-6deg); } }
@keyframes fxZombieGlow { from { opacity: 0.15; } to { opacity: 0.6; } }
