/* Fatal — shared styles for the hub and every app page. */
@font-face{font-family:"Mr Dafoe";src:url(../fonts/MrDafoe-Regular.woff2?v=20261025132832) format("woff2"),url(../fonts/MrDafoe-Regular.ttf?v=20261025132832) format("truetype");font-display:swap}
:root{--ink:#050506;--ink2:#0d0d10;--ink3:#16161b;--bone:#f2efe9;--ash:#a7a3a8;--mute:#8e8991;
  --blood:#c3001c;--neon:#ff1a3c;--glow:rgba(255,26,60,.55);--line:rgba(255,255,255,.08);
  --serif:"Cormorant Garamond","Playfair Display",Georgia,"Times New Roman",serif;
  --sans:Inter,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;--script:"Mr Dafoe","Brush Script MT",cursive}
*{box-sizing:border-box}html{scroll-behavior:smooth}
body{margin:0;background:var(--ink);color:var(--bone);font:16px/1.6 var(--sans);-webkit-font-smoothing:antialiased;overflow-x:hidden}
img{max-width:100%;height:auto;display:block}a{color:inherit}
.wrap{width:min(1160px,92vw);margin:0 auto}
.wordmark{font-family:var(--script);color:var(--neon);font-weight:400;line-height:.9;letter-spacing:.01em;
  text-shadow:0 0 18px rgba(255,26,60,.45),0 0 2px rgba(255,26,60,.9)}
.eyebrow{font:600 .72rem/1 var(--sans);letter-spacing:.32em;text-transform:uppercase;color:var(--ash)}
h1,h2,h3{font-family:var(--serif);font-weight:600;letter-spacing:.01em;line-height:1.1;margin:0 0 .5em}
h2{font-size:clamp(1.8rem,3.4vw,2.6rem)}h2 .red{color:var(--neon)}
.btn{display:inline-flex;align-items:center;gap:.5em;padding:.8em 1.3em;border-radius:999px;text-decoration:none;font-weight:600;font-size:.95rem;
  border:1px solid var(--line);background:var(--ink3);transition:transform .2s,box-shadow .3s,background .3s}
.btn:hover{transform:translateY(-2px);box-shadow:0 0 24px var(--glow)}
.btn.red{background:linear-gradient(180deg,var(--neon),var(--blood));border-color:transparent;color:#fff}

/* top bar */
.topbar{position:sticky;top:0;z-index:40;backdrop-filter:blur(10px);background:rgba(5,5,6,.6);border-bottom:1px solid var(--line)}
.topbar .wrap{display:flex;align-items:center;justify-content:space-between;height:60px}
.topbar .brand{display:flex;align-items:center;gap:.6rem;text-decoration:none}
.topbar .brand img{width:34px;height:34px;border-radius:50%;border:1px solid rgba(255,26,60,.5)}
.topbar .brand .wordmark{font-size:2rem}
.topbar nav a{color:var(--ash);text-decoration:none;margin-left:1.2rem;font-size:.9rem}.topbar nav a:hover{color:var(--bone)}

/* ---------- fog (hub + page transitions only; NEVER on app pages) ---------- */
.fog{position:fixed;inset:-10% 0 -90vh 0;pointer-events:none;z-index:2;will-change:transform}
.fog i{position:absolute;inset:0;background-repeat:repeat;background-size:1600px 800px;opacity:.5;will-change:background-position}
.fog .f1{background-image:url(../img/fog-1.webp?v=20261025132832);animation:drift 120s linear infinite;opacity:.22}
.fog .f2{background-image:url(../img/fog-2.webp?v=20261025132832);animation:drift 80s linear infinite reverse;opacity:.16;background-size:2000px 1000px;background-position:300px 400px}
.fog .f3{background-image:url(../img/fog-1.webp?v=20261025132832);animation:drift 55s linear infinite;opacity:.12;background-size:1200px 600px;filter:blur(2px)}
@keyframes drift{from{background-position:0 0}to{background-position:-1600px 0}}
.fog.low{z-index:6;inset:auto 0 -35vh 0;height:90vh;-webkit-mask:linear-gradient(transparent,#000 50%);mask:linear-gradient(transparent,#000 50%)}

/* page-transition veil: a fog curtain that rolls in on leave and lifts on arrive */
.veil{position:fixed;inset:0;z-index:100;pointer-events:none;background:var(--ink);opacity:1;transition:opacity .7s ease}
.veil::before,.veil::after{content:"";position:absolute;inset:-20%;background:url(../img/fog-2.webp?v=20261025132832) 0 0/1400px 700px repeat;opacity:.5;animation:drift 18s linear infinite}
.veil::after{background-image:url(../img/fog-1.webp?v=20261025132832);animation-direction:reverse;opacity:.35}
body.ready .veil{opacity:0}
body.leaving .veil{opacity:1;transition-duration:.45s}

/* ---------- eye / fang glow (shared) ---------- */
.glowfig{position:relative;display:block}
.glowfig .eye{position:absolute;width:var(--s,4%);aspect-ratio:1;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;
  background:radial-gradient(circle,rgba(255,60,80,.95) 0,rgba(255,20,50,.5) 35%,transparent 70%);mix-blend-mode:screen;opacity:.35;filter:blur(1px)}
.glowfig:hover .eye,.glowfig:focus-within .eye{animation:pulse 1.6s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:.35;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.6)}}

/* ---------- HUB ---------- */
.hero{position:relative;min-height:calc(100vh - 60px);display:grid;grid-template-columns:1.05fr .95fr;align-items:center;gap:2rem;z-index:3}
.hero .copy{position:relative;z-index:5}
.hero .wordmark{font-size:clamp(6rem,15vw,12rem);display:block;margin:.1em 0 .05em -.05em}
.hero p.lede{font:italic 400 clamp(1.15rem,2vw,1.45rem)/1.5 var(--serif);color:var(--ash);max-width:32ch}
.hero .actions{display:flex;gap:.8rem;margin-top:1.6rem;flex-wrap:wrap}
.hero .art{position:relative;justify-self:center;width:min(460px,100%,62vh)}
.moon{position:relative;-webkit-mask:radial-gradient(closest-side,#000 62%,transparent 100%);mask:radial-gradient(closest-side,#000 62%,transparent 100%);
  animation:apparate 9s ease-in-out infinite}
.moon img{filter:contrast(1.05)}
@keyframes apparate{0%,100%{opacity:.82;transform:translateY(0)}50%{opacity:1;transform:translateY(-12px)}}

/* apparitions: poses that drift in and out of the fog behind the content */
.haunt{position:absolute;inset:0;z-index:1;pointer-events:none;overflow:hidden}
.ghost{position:absolute;width:var(--w,38vw);opacity:0;-webkit-mask:radial-gradient(closest-side,#000 35%,transparent 100%);mask:radial-gradient(closest-side,#000 35%,transparent 100%);
  filter:grayscale(.2) brightness(.85);animation:ghost var(--d,26s) ease-in-out infinite;animation-delay:var(--delay,0s)}
@keyframes ghost{0%{opacity:0;transform:translate(-30px,10px) scale(.98)}20%{opacity:.28}50%{opacity:.4;transform:translate(20px,-10px) scale(1.02)}80%{opacity:.2}100%{opacity:0;transform:translate(50px,0) scale(1)}}

.apps{position:relative;z-index:5;padding:4rem 0 6rem}
.apps .head{display:flex;justify-content:space-between;align-items:end;gap:1rem;margin-bottom:2rem}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.4rem}
.card{position:relative;display:flex;flex-direction:column;text-decoration:none;border-radius:20px;overflow:hidden;background:linear-gradient(180deg,var(--ink3),var(--ink2));
  border:1px solid var(--line);transition:transform .35s,border-color .35s,box-shadow .35s}
.card:hover{transform:translateY(-6px);border-color:rgba(255,26,60,.55);box-shadow:0 18px 50px rgba(0,0,0,.6),0 0 40px rgba(255,26,60,.18)}
.card .shot{aspect-ratio:16/10;overflow:hidden;background:#000}
.card .shot img{width:100%;height:100%;object-fit:cover;object-position:top;transition:transform .8s}
.card:hover .shot img{transform:scale(1.05)}
.card .body{padding:1.2rem 1.3rem 1.4rem}
.card h3{font-size:1.6rem;margin:.1em 0 .25em}
.card p{color:var(--ash);margin:0 0 .9rem;font-size:.95rem}
.tag{display:inline-block;font:600 .7rem/1 var(--sans);letter-spacing:.14em;text-transform:uppercase;padding:.45em .7em;border-radius:999px;border:1px solid var(--line);color:var(--ash);margin-right:.35rem}
.tag.live{color:#fff;border-color:rgba(255,26,60,.6);background:rgba(255,26,60,.15)}
.tag.live::before{content:"";display:inline-block;width:.5em;height:.5em;border-radius:50%;background:var(--neon);margin-right:.45em;box-shadow:0 0 8px var(--neon);vertical-align:.05em}

/* ---------- APP PAGE (clear air: no fog) ---------- */
.app-hero{position:relative;display:grid;grid-template-columns:1fr 1fr;gap:2rem;align-items:center;padding:4rem 0 3rem;min-height:72vh}
.app-hero h1{font-size:clamp(2.6rem,6vw,4.6rem)}
.app-hero .icon{width:72px;height:72px;border-radius:18px;margin-bottom:1rem;box-shadow:0 0 30px rgba(255,26,60,.25)}
.app-hero p{color:var(--ash);font-size:1.08rem;max-width:46ch}
.stage{position:relative;justify-self:center;width:100%}
/* "stepping into the light": dark at first, then a spotlight opens and she leans forward */
.stage .presenter{-webkit-mask:radial-gradient(closest-side,#000 55%,transparent 100%);mask:radial-gradient(closest-side,#000 55%,transparent 100%);
  filter:brightness(.05) contrast(1.2);transform:translateX(40px) scale(.96);transition:filter 2.2s ease,transform 2.2s cubic-bezier(.2,.7,.2,1)}
.stage::after{content:"";position:absolute;inset:-10% -5%;pointer-events:none;background:radial-gradient(ellipse 30% 60% at 55% 40%,rgba(255,255,255,.18),transparent 70%);opacity:0;transition:opacity 2.4s ease .3s}
.lit .stage .presenter{filter:brightness(1) contrast(1.05);transform:none}
.lit .stage::after{opacity:1}
section.block{padding:3.5rem 0;border-top:1px solid var(--line)}
.gallery{display:grid;grid-auto-flow:column;grid-auto-columns:min(260px,70vw);gap:1rem;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:1rem}
.gallery figure{margin:0;scroll-snap-align:start}
.gallery img{border-radius:14px;border:1px solid var(--line);width:100%;height:auto;background:#111}
.gallery figcaption,.note{font-size:.8rem;color:var(--mute);margin-top:.4rem}
.list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.9rem;padding:0;margin:0;list-style:none}
.list li{background:var(--ink2);border:1px solid var(--line);border-radius:14px;padding:1rem 1.1rem}
.list li b{display:block;color:var(--bone);margin-bottom:.15rem}
.list li span{color:var(--ash);font-size:.93rem}
.soon li{border-style:dashed}
.install{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem}
.install .col{background:var(--ink2);border:1px solid var(--line);border-radius:18px;padding:1.3rem}
.install ol{padding-left:1.2rem;color:var(--ash)}.install ol li{margin:.35rem 0}.install ol b{color:var(--bone)}
.install img{border-radius:12px;margin-top:1rem;border:1px solid var(--line)}
details{background:var(--ink2);border:1px solid var(--line);border-radius:14px;padding:1rem 1.2rem;margin:.6rem 0}
details summary{cursor:pointer;font-weight:600;list-style:none}details summary::after{content:"+";float:right;color:var(--neon)}
details[open] summary::after{content:"–"}details p{color:var(--ash);margin:.6rem 0 0}
.placeholder{outline:1px dashed rgba(255,200,0,.5);outline-offset:4px;position:relative}
.ph{display:inline-block;font:700 .66rem/1 var(--sans);letter-spacing:.12em;text-transform:uppercase;background:#3a2c00;color:#ffd24a;padding:.35em .55em;border-radius:6px;vertical-align:middle}
.cameo{display:grid;grid-template-columns:260px 1fr;gap:2rem;align-items:center}
.cameo .glowfig{-webkit-mask:radial-gradient(closest-side,#000 60%,transparent 100%);mask:radial-gradient(closest-side,#000 60%,transparent 100%);opacity:0;transform:translateY(20px);transition:opacity 1.4s,transform 1.4s}
.cameo.in .glowfig{opacity:1;transform:none}
footer{position:relative;z-index:5;border-top:1px solid var(--line);padding:2rem 0 3rem;color:var(--mute);font-size:.85rem}
footer .wrap{display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap;align-items:center}
footer .wordmark{font-size:1.8rem}

@media (max-width:820px){
  .hero{grid-template-columns:1fr;text-align:center;padding:2rem 0 1rem;min-height:auto}
  .hero .art{order:-1;width:min(360px,86vw)}.hero p.lede{margin-inline:auto}.hero .actions{justify-content:center}
  .app-hero{grid-template-columns:1fr;min-height:auto;padding-top:2rem}.stage{order:-1}
  .install{grid-template-columns:1fr}.cameo{grid-template-columns:1fr}.cameo .glowfig{width:220px;margin:auto}
  .topbar nav a:not(.keep){display:none}.ghost{--w:80vw!important}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}
  .ghost{opacity:.25}.stage .presenter{filter:none;transform:none}.stage::after{opacity:1}.cameo .glowfig{opacity:1;transform:none}
  .glowfig .eye{opacity:.6}.veil{display:none}
}

/* contact */
.contact{position:relative;z-index:5;padding:4rem 0 5rem;text-align:center}
.contact .panel{max-width:640px;margin:0 auto;padding:2.6rem 1.6rem;border-radius:24px;border:1px solid rgba(255,26,60,.35);
  background:radial-gradient(ellipse at 50% 0,rgba(255,26,60,.16),transparent 65%),linear-gradient(180deg,var(--ink3),var(--ink2));box-shadow:0 0 60px rgba(255,26,60,.12)}
.contact p{color:var(--ash);margin:0 auto 1.4rem;max-width:44ch}
.contact .btn.red{font-size:1.05rem;padding:.95em 1.6em}
.contact .addr,.foot-mail{color:var(--mute);font-size:.85rem}
.foot-mail a{color:var(--ash);text-decoration:none;border-bottom:1px solid rgba(255,26,60,.5)}.foot-mail a:hover{color:var(--neon)}

/* donate */
.btn.donate{background:transparent;border:1px solid var(--neon);color:#fff;box-shadow:inset 0 0 18px rgba(255,26,60,.18)}
.btn.donate:hover{background:rgba(255,26,60,.14);box-shadow:0 0 26px var(--glow),inset 0 0 18px rgba(255,26,60,.3)}
.btn.donate.big{font-size:1.25rem;padding:1.05em 2.2em;background:linear-gradient(180deg,var(--neon),var(--blood));border-color:transparent;animation:heartbeat 2.4s ease-in-out infinite}
@keyframes heartbeat{0%,100%{box-shadow:0 0 18px rgba(255,26,60,.35)}50%{box-shadow:0 0 44px rgba(255,26,60,.75)}}
.topbar nav a.nav-donate{color:var(--neon)}
.foot-links{display:flex;gap:1.1rem;flex-wrap:wrap;align-items:center}
.foot-links a{color:var(--ash);text-decoration:none;border-bottom:1px solid rgba(255,26,60,.5)}.foot-links a:hover{color:var(--neon)}
.support{max-width:60ch}.support p{color:var(--ash);font-size:1.08rem}.support .sig{font-family:var(--script);color:var(--neon);font-size:2.2rem}
.supports{display:flex;gap:1rem;flex-wrap:wrap;margin:1.4rem 0}
.supports a{display:flex;align-items:center;gap:.7rem;padding:.7rem 1rem;border:1px solid var(--line);border-radius:14px;background:var(--ink2);text-decoration:none}
.supports a:hover{border-color:rgba(255,26,60,.5)}.supports img{width:40px;height:40px;border-radius:10px}

/* ---------- SPIRITS: cut-out mascot poses (transparent webp) that drift in, breathe, cycle ---------- */
.spirit{position:relative;margin:0;pointer-events:none;opacity:0;transform:translateX(var(--from,-18vw)) scale(.94);
  transition:opacity 1.6s ease,transform 1.9s cubic-bezier(.2,.7,.2,1)}
.spirit[data-from=right]{--from:18vw}.spirit[data-from=below]{--from:0;transform:translateY(60px) scale(.94)}
.spirit.in{opacity:var(--op,.95);transform:none}
.spirit .spirit-in{position:relative;filter:drop-shadow(0 0 26px rgba(255,26,60,.28));animation:breathe 6.5s ease-in-out infinite;transform-origin:50% 90%;
  transition:opacity .9s ease,transform .9s ease,filter .9s ease}
.spirit .spirit-in{aspect-ratio:900/1116}
.spirit .layer{position:absolute;inset:0;opacity:0;transition:opacity 1.1s ease,transform 1.1s ease,filter 1.1s ease;transform:translateY(10px) scale(.985);filter:blur(3px)}
.spirit .layer.on{opacity:1;transform:none;filter:none}
.spirit .ly{position:absolute;left:50%;top:0;height:100%;transform:translateX(-50%)}
.spirit .ly img{width:100%;height:100%;max-width:none}
.spirit img{width:100%;height:auto;filter:brightness(1.12) contrast(1.06);
  -webkit-mask:linear-gradient(to right,transparent 0,#000 9%,#000 91%,transparent 100%),linear-gradient(to bottom,#000 78%,transparent 99%);-webkit-mask-composite:source-in;
  mask:linear-gradient(to right,transparent 0,#000 9%,#000 91%,transparent 100%),linear-gradient(to bottom,#000 78%,transparent 99%);mask-composite:intersect}
.spirit .eye{opacity:.75;animation:pulse 2.2s ease-in-out infinite}
@keyframes breathe{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-10px) scale(1.022)}}
/* hub placements */
.fog.front{z-index:4}
.fog.front .f1{opacity:.18;background-size:1300px 650px}.fog.front .f2{opacity:.14}
.interlude{position:relative;z-index:3;display:grid;grid-template-columns:1fr 1fr;align-items:center;min-height:62vh;padding:1rem 0;gap:4vw}
.interlude .spirit{width:min(440px,36vw)}
.interlude .spirit[data-from=right]{justify-self:end;margin-top:14vh}
.apps .spirit.side{position:absolute;right:-3vw;top:5.5rem;width:min(360px,28vw);z-index:3}
.apps .grid.two{grid-template-columns:repeat(2,minmax(0,1fr));max-width:calc(100% - min(360px,28vw) + 1vw)}
.hub .cameo .spirit{width:300px}
/* app-page presenter spots */
.with-spirit{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:1.5rem;align-items:end;position:relative}
/* install / FAQ: she sits at the bottom of the section, right beside the last steps / questions, on a soft floor glow */
.with-spirit>.spirit{width:280px;margin-bottom:-1rem}
.with-spirit>.spirit::after{content:"";position:absolute;left:12%;right:12%;bottom:4%;height:9%;border-radius:50%;background:radial-gradient(closest-side,rgba(255,26,60,.28),transparent);z-index:-1}
.with-spirit>div{position:relative;z-index:1}
.stage .spirit{width:min(420px,90%);margin:auto}
.donate-page .stage::before{content:"";position:absolute;inset:0;background:radial-gradient(ellipse 45% 55% at 50% 50%,rgba(255,255,255,.12),rgba(255,26,60,.06) 45%,transparent 70%)}
.moon img{animation:breathe 7s ease-in-out infinite}
.lit .stage .presenter{animation:breathe 7s ease-in-out 2.4s infinite}
@media (max-width:820px){
  .interlude{grid-template-columns:1fr 1fr;min-height:auto;gap:2vw}.interlude .spirit{width:44vw}.interlude .spirit[data-from=right]{margin-top:12vh}
  .apps .spirit.side{position:relative;right:auto;top:auto;width:62vw;margin:-1rem auto 1rem}
  .apps .grid.two{grid-template-columns:1fr;max-width:none}
  .with-spirit{grid-template-columns:1fr}
  /* phone: she leans in at the top-right, beside the heading, with the first card in front of her */
  .with-spirit>.spirit{position:absolute;right:-4vw;top:-2.4rem;width:146px;margin:0;z-index:0}.with-spirit h2{padding-right:112px}
  .hub .cameo .spirit{width:230px;margin:auto}
}
@media (prefers-reduced-motion:reduce){.spirit{opacity:var(--op,.95);transform:none}.spirit .eye{opacity:.7}}

/* ---------- Fatal holding the screenshots (.holder): pose "phone2", gallery image mapped onto her phone ---------- */
.with-holder{display:grid;grid-template-columns:minmax(0,1fr) min(680px,54%);gap:1.5rem;align-items:center}
.holder{position:relative;padding:2% 0 0}
/* pose "phone2" is shown 1.4x and faded out on the left (hair) so the phone and the mapped screenshot are big */
.holder .spirit{width:140%;margin-left:-38%;--op:1}
.holder .spirit .spirit-in{animation-duration:8s}
.holder .spirit .ly>img{-webkit-mask:linear-gradient(to right,transparent 27%,#000 34%),linear-gradient(to bottom,transparent 0,#000 4%,#000 90%,transparent 100%);-webkit-mask-composite:source-in;
  mask:linear-gradient(to right,transparent 27%,#000 34%),linear-gradient(to bottom,transparent 0,#000 4%,#000 90%,transparent 100%);mask-composite:intersect}
.holder .ly .scr{border-radius:7%/3.3%}
.spirit[data-fit] img{-webkit-mask:linear-gradient(to bottom,#000 80%,transparent 99%);mask:linear-gradient(to bottom,#000 80%,transparent 99%)}
.spirit .peek img,.spirit.peek img{-webkit-mask:none;mask:none}
.ly .scr{position:absolute;left:0;top:0;transform-origin:0 0;overflow:hidden;background:#0b0b10;
  box-shadow:0 0 34px 6px rgba(255,255,255,.18),0 0 70px 14px rgba(255,26,60,.2)}
.spirit .ly .scr img{-webkit-mask:none;mask:none;filter:none;max-width:none;width:100%;height:100%;object-fit:cover;object-position:center top;display:block;transition:opacity .28s ease,filter .28s ease}
.spirit .ly .scr.flip img{opacity:0;filter:brightness(2.4) blur(2px)}
.ly .scr.face{background:radial-gradient(circle at 50% 45%,#2a0b12,#07070a 75%);display:grid;place-items:center}
.spirit .ly .scr.face img{width:64%;height:auto;aspect-ratio:1;object-fit:contain;border-radius:22%;filter:drop-shadow(0 0 12px rgba(255,26,60,.55))}
.holder-cap{text-align:center;color:var(--ash);font-size:.85rem;margin-top:.3rem;min-height:3.3em}
/* hub cards: she peeks over the top edge of each card holding a tarot card with the app's icon */
.apps .grid.two{margin-top:11rem}
.card-wrap{position:relative}
.card-wrap .card{position:relative;z-index:2}

/* equal-height hub app cards */
.apps .grid.two{align-items:stretch}
.apps .grid.two .card-wrap{display:flex;flex-direction:column;height:100%}
.apps .grid.two .card-wrap .card{flex:1;height:100%}
.apps .grid.two .card .body{flex:1;display:flex;flex-direction:column}
.apps .grid.two .card .body .btn{margin-top:auto;align-self:flex-start}

.card-wrap .spirit.peek{position:absolute;z-index:1;width:200px;right:5%;top:calc(-200px * 1116 / 547 * .37)}
@media (max-width:820px){
  .with-holder{grid-template-columns:minmax(0,1fr)}.holder{order:-1;width:100%;margin:0 auto 1rem}.holder .spirit{width:155%;margin-left:-50%}.holder .spirit .ly>img{-webkit-mask:linear-gradient(to right,transparent 32.5%,#000 36%),linear-gradient(to bottom,transparent 0,#000 4%,#000 90%,transparent 100%);-webkit-mask-composite:source-in;mask:linear-gradient(to right,transparent 32.5%,#000 36%),linear-gradient(to bottom,transparent 0,#000 4%,#000 90%,transparent 100%);mask-composite:intersect}
  .apps .grid.two{margin-top:1.5rem;row-gap:10rem}.card-wrap .spirit.peek{width:180px;top:calc(-180px * 1116 / 547 * .37)}
}
@media (prefers-reduced-motion:reduce){.ly .scr img{transition:none}}

/* hub About: she sits on the panel's top edge (pose "knees" v3: seat line at 90.7% of its height, heels over the edge).
   The seat line is set 3px INTO the panel so her feathered bottom (fix_knees_seat.py) covers the top border: seated, not sliced. */
.about-panel{--w:270px;position:relative;max-width:920px;margin:calc(var(--w) * 1116 / 950 * .907 + 1rem) auto 0;padding:2.2rem 2rem;border-radius:24px;border:1px solid rgba(255,26,60,.35);
  background:radial-gradient(ellipse at 20% 0,rgba(255,26,60,.16),transparent 60%),linear-gradient(180deg,var(--ink3),var(--ink2));box-shadow:0 0 60px rgba(255,26,60,.12)}
.about-panel h2{margin-top:.3rem}
.about-panel>.spirit{position:absolute;left:3rem;top:calc(var(--w) * 1116 / 950 * -.907 + 3px);width:var(--w);z-index:2}
.about-panel>.spirit img{-webkit-mask:none;mask:none}
.about-panel>.spirit .spirit-in{animation:none}   /* she's sitting on the edge: no floating/breathing drift */
.about-panel>.spirit::after{content:"";position:absolute;left:6%;right:10%;top:calc(90.7% - 5px);height:18px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.7),rgba(0,0,0,.35) 60%,transparent);z-index:-1}   /* contact shadow on the panel top, under the seat */
@media (max-width:820px){
  .about-panel{--w:220px;padding:1.6rem 1.4rem}
  .about-panel>.spirit{left:calc(50% - var(--w) / 2)}
  .apps .grid.two{margin-top:10rem}   /* stacked: room above the first card for the Fatal FM peek; row-gap leaves room for the Gameday peek */
}
/* nothing decorative may widen the page (poses drift in from the sides) */
main{overflow-x:clip}

/* ---------- gallery lightbox ---------- */
.lb{position:fixed;inset:0;z-index:100;background:rgba(4,3,6,0);backdrop-filter:blur(0);-webkit-backdrop-filter:blur(0);transition:background .38s ease,backdrop-filter .38s ease;cursor:zoom-out;touch-action:none;overscroll-behavior:contain}
.lb.on{background:rgba(4,3,6,.92);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.lb img{position:absolute;transform-origin:0 0;border-radius:14px;box-shadow:0 0 0 1px rgba(255,26,60,.35),0 0 60px rgba(255,26,60,.25),0 30px 80px rgba(0,0,0,.8);
  transition:transform .38s cubic-bezier(.2,.7,.2,1),opacity .18s ease;max-width:none;background:#111}
.lb img.swap{opacity:0;transition:opacity .18s ease}
.lb-cap,.lb-n{position:absolute;left:0;right:0;text-align:center;color:var(--ash);font-size:.85rem;margin:0;opacity:0;transition:opacity .3s ease .15s;pointer-events:none}
.lb-cap{bottom:max(1.2rem,env(safe-area-inset-bottom))}.lb-n{top:max(1rem,env(safe-area-inset-top));color:var(--mute);font-size:.75rem;letter-spacing:.2em}
.lb.on .lb-cap,.lb.on .lb-n{opacity:1}
html.lb-open,html.lb-open body{overflow:hidden}
.gallery figure{cursor:zoom-in}
.gallery figure:focus-visible{outline:2px solid var(--neon);outline-offset:4px;border-radius:14px}
@media (prefers-reduced-motion:reduce){.lb,.lb img{transition:none}}

/* Fatal FM page: no mascot (Oct 19, 2026). App icon in the top bar, app art in the hero, icon in the closing panel. */
.topbar .brand-app img{border-radius:9px;border-color:rgba(255,45,149,.55)}
.hero-shot{max-width:420px;margin:0 auto!important}
.hero-shot img{width:100%;height:auto;border-radius:22px;border:1px solid var(--line);box-shadow:0 20px 60px rgba(0,0,0,.6),0 0 60px rgba(255,26,60,.14)}
.cameo-icon{width:180px;height:180px;border-radius:40px;justify-self:center;box-shadow:0 0 50px rgba(255,45,149,.22),0 0 40px rgba(255,26,60,.15)}
@media (max-width:820px){.hero-shot{max-width:300px}.cameo-icon{width:120px;height:120px;border-radius:28px;margin:auto}}
.card h3.with-icon{display:flex;align-items:center;gap:.55rem}.card h3.with-icon img{width:40px;height:40px;border-radius:10px;flex:none}

/* ---------- polish pass (Oct 19, 2026): mobile, touch, a11y ---------- */
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{-webkit-tap-highlight-color:rgba(255,26,60,.18)}
/* anchors land below the sticky bar */
[id]{scroll-margin-top:76px}
/* notch / home-indicator safe areas (viewport-fit=cover is set) */
.topbar{padding-top:env(safe-area-inset-top)}
.topbar .wrap,footer .wrap{padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}
footer{padding-bottom:calc(3rem + env(safe-area-inset-bottom))}
/* keyboard focus: one clear ring everywhere */
a:focus-visible,button:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--neon);outline-offset:3px;border-radius:8px}
.btn:focus-visible,.card:focus-visible{border-radius:999px}.card:focus-visible{border-radius:20px}
/* tap targets: 44px minimum */
.btn{min-height:44px;justify-content:center}
.topbar .brand{min-height:44px}
.topbar nav{display:flex;align-items:center}
.topbar nav a{display:inline-flex;align-items:center;min-height:44px;padding:0 .2rem}
.foot-links a{display:inline-flex;align-items:center;min-height:44px}
details{padding:0 1.2rem}details summary{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:52px;padding:.6rem 0}
details summary::-webkit-details-marker{display:none}details summary::after{float:none;flex:none;font-size:1.3rem;line-height:1}
details p{margin:0 0 1rem}details[open] summary{color:var(--bone)}
.supports a{min-height:56px}
/* gallery: snap swipe, no page bounce, edge bleed so the next photo peeks */
.gallery{overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;scroll-padding-inline:0;scrollbar-width:thin;scrollbar-color:rgba(255,26,60,.45) transparent}
.gallery::-webkit-scrollbar{height:6px}.gallery::-webkit-scrollbar-thumb{background:rgba(255,26,60,.45);border-radius:6px}
.gallery figure{position:relative}
.gallery .zoom{position:absolute;inset:0;border:0;padding:0;margin:0;background:none;cursor:zoom-in;border-radius:14px}
.gallery figure:focus-visible{outline:none}
.gallery figcaption{line-height:1.35}
/* section headings: same rhythm on every page */
section.block>.eyebrow,.apps .eyebrow,.about .eyebrow{display:block;margin-bottom:.7rem}
.list li b{font-size:1.02rem}
@media (max-width:820px){
  body{font-size:16px}
  section.block{padding:2.75rem 0}
  .topbar .wrap{height:56px}.topbar .brand .wordmark{font-size:1.8rem}
  .topbar nav a{margin-left:.9rem;font-size:.95rem;padding:0 .35rem}
  .eyebrow{font-size:.75rem;letter-spacing:.26em}
  .gallery figcaption,.note,.holder-cap{font-size:.875rem}
  .list li span,.card p,.support p,.install ol,details p{font-size:1rem}
  .tag{font-size:.72rem}
  .btn{font-size:1rem;padding:.8em 1.3em}
  .app-hero .actions,.hero .actions{gap:.7rem}
  .gallery{margin-inline:calc(-1 * (100vw - min(1160px,92vw)) / 2);padding-inline:calc((100vw - min(1160px,92vw)) / 2);scroll-padding-inline:calc((100vw - min(1160px,92vw)) / 2)}
  footer{font-size:.9rem}footer .wrap{justify-content:center;text-align:center}
  .contact .panel{padding:2.2rem 1.25rem}
  /* phones: lighter fog (2 layers, no blur filter, no will-change on the third) */
  .fog .f3{display:none}.fog{will-change:auto}
}
@media (max-width:380px){.topbar nav a{margin-left:.55rem}.topbar .brand .wordmark{font-size:1.65rem}}
@media (prefers-reduced-motion:reduce){.fog i{animation:none!important}.btn.donate.big{animation:none}html{scroll-behavior:auto}}
.topbar nav a{min-width:44px;justify-content:center}
@media (max-width:820px){.topbar nav a{font-size:1rem}footer,.foot-mail,.contact .addr{font-size:.95rem}}
/* footer links: underline hugs the text now that the link box is 44px tall */
.foot-links a,.foot-mail a{border-bottom:0;text-decoration:underline;text-decoration-color:rgba(255,26,60,.5);text-decoration-thickness:1px;text-underline-offset:5px}
.install ol b{overflow-wrap:anywhere}
/* card face filled with a screenshot (data-face-fit=cover): edge to edge, top of the app showing, slight glass corners */
.ly .scr.shot{border-radius:4%/2.5%}
.spirit .ly .scr.shot img{object-fit:cover;object-position:center top}
