/* Fatal — shared styles for the hub and every app page. */
@font-face{font-family:"Mr Dafoe";src:url(../fonts/MrDafoe-Regular.ttf?v=20261018175857) format("truetype");font-display:swap}
:root{--ink:#050506;--ink2:#0d0d10;--ink3:#16161b;--bone:#f2efe9;--ash:#a7a3a8;--mute:#6f6b72;
  --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=20261018175857);animation:drift 120s linear infinite;opacity:.22}
.fog .f2{background-image:url(../img/fog-2.webp?v=20261018175857);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=20261018175857);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=20261018175857) 0 0/1400px 700px repeat;opacity:.5;animation:drift 18s linear infinite}
.veil::after{background-image:url(../img/fog-1.webp?v=20261018175857);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) 260px;gap:2rem;align-items:center}
.with-spirit>.spirit{width:260px}
.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}.with-spirit>.spirit{width:200px;margin:0 auto;order:-1}
  .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%}
.holder[data-shot=contain] .spirit .ly .scr img{object-fit:contain;object-position:center;background:#000}
.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:1.3em}
.gallery figure{cursor:pointer}
/* 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}
.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:10rem;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}}
