/* Checkpoint Development site. Layout: a beige computer case. Home = wordmark header, intro, project "monitors", latest devlog, privacy + contact. Game pages = big monitor hero, about + facts, terminal feature list, roadmap, devlog, other games. */
:root{
  --case:#E6DECA; --panel:#F2ECDD; --bevel:#C9BFA6; --ink:#23211D; --muted:#5E5647;
  --screen:#1B1B1A; --screen-ink:#E6DECA; --amber:#F2B544; --amber-ink:#8A5A0B;
  --s-red:#F0433A; --s-orange:#F7941D; --s-yellow:#F9C80E; --s-green:#3DBE55; --s-blue:#1E90E0;
  --display:'Space Grotesk',system-ui,sans-serif; --body:'IBM Plex Sans',system-ui,sans-serif; --mono:'IBM Plex Mono',ui-monospace,monospace;
  --ease:cubic-bezier(.2,.7,.2,1);
}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){
  --case:#1F1D1A; --panel:#2A2723; --bevel:#3D3830; --ink:#EDE6D6; --muted:#B5AC9A; --screen:#121211; --amber-ink:#F2B544; color-scheme:dark }}
:root[data-theme="dark"]{
  --case:#1F1D1A; --panel:#2A2723; --bevel:#3D3830; --ink:#EDE6D6; --muted:#B5AC9A; --screen:#121211; --amber-ink:#F2B544; color-scheme:dark }

*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(--case);color:var(--ink);font-family:var(--body);font-size:16px;line-height:1.6;margin:0}
img{max-width:100%}
html.boot body{overflow:hidden}
.wrap{max-width:1080px;margin:0 auto;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px))}
a{color:var(--amber-ink)}
a:focus-visible,button:focus-visible{outline:3px solid var(--s-blue);outline-offset:3px;border-radius:4px}

/* ---------- boot screen ---------- */
#boot{position:fixed;inset:0;z-index:100;background:var(--case);display:flex;align-items:center;justify-content:center;padding:24px;animation:bootFade .4s ease 3.8s forwards}
#boot.out{animation:bootFade .3s ease .3s forwards}
@keyframes bootFade{to{opacity:0;visibility:hidden}}
.boot-skip{position:absolute;top:calc(16px + env(safe-area-inset-top,0px));right:max(16px,env(safe-area-inset-right,0px));font-family:var(--mono);font-size:13px;letter-spacing:1px;text-transform:uppercase;background:transparent;color:var(--muted);border:2px solid var(--bevel);border-radius:8px;padding:10px 14px;min-height:44px;cursor:pointer}
.boot-skip:hover{color:var(--ink)}
.boot-case{background:var(--panel);border:8px solid var(--bevel);border-radius:28px;padding:16px;box-shadow:0 30px 60px -30px rgba(0,0,0,.35)}
.boot-screen{position:relative;overflow:hidden;background:var(--screen);border-radius:14px;width:min(500px,calc(100vw - 96px));padding:22px 22px 18px;font-family:var(--mono);font-size:clamp(10px,2.7vw,14px);line-height:1.75;color:var(--screen-ink);animation:crtOn .5s var(--ease) both}
.boot-screen::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(255,255,255,.04) 0 2px,transparent 2px 4px);pointer-events:none}
#boot.out .boot-screen{animation:crtOff .42s ease-in forwards}
@keyframes crtOn{0%{transform:scale(.5,.006);filter:brightness(4)}45%{transform:scale(1,.006);filter:brightness(3)}100%{transform:none;filter:none}}
@keyframes crtOff{0%{transform:none}55%{transform:scale(1,.006);filter:brightness(4)}100%{transform:scale(0,.006);filter:brightness(6)}}
.bl{white-space:nowrap;overflow:hidden;animation:type .28s steps(22) var(--t) both}
.bl b{font-weight:500;color:var(--c,var(--amber))}
@keyframes type{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
.boot-logo{display:flex;align-items:center;gap:16px;margin-top:16px;padding-top:16px;border-top:1px dashed rgba(230,222,202,.18)}
.boot-logo .stripes i{width:42px;animation:slideIn .4s var(--ease) both;animation-delay:calc(var(--t) + var(--n) * 70ms)}
@keyframes slideIn{from{transform:translateX(-60px);opacity:0}}
.boot-word{display:flex;flex-direction:column;gap:5px}
.boot-word b{font-family:var(--display);font-size:clamp(22px,6vw,32px);line-height:.85;color:var(--amber);display:flex;align-items:flex-end;gap:5px;text-shadow:0 0 16px rgba(242,181,68,.45);animation:pop .45s var(--ease) calc(var(--t) + 300ms) both}
.boot-word b::after{content:"";width:.4em;height:.15em;background:var(--amber);margin-bottom:.03em;animation:blink 1s steps(1) infinite}
.boot-word span{font-size:.8em;letter-spacing:.55em;color:var(--screen-ink);opacity:.8;animation:spread .6s var(--ease) calc(var(--t) + 450ms) both}
@keyframes pop{from{transform:scale(.6);opacity:0;filter:blur(4px)}}
@keyframes spread{from{letter-spacing:0;opacity:0}}
.boot-bar{margin-top:16px;height:8px;border:1px solid rgba(230,222,202,.3);border-radius:2px;padding:1px}
.boot-bar i{display:block;height:100%;background:var(--amber);animation:fill 2.1s steps(18) .4s both}
@keyframes fill{from{width:0}to{width:100%}}

/* ---------- logo ---------- */
.stripes{display:flex;flex-direction:column;gap:3px;transform:skewX(-18deg)}
.stripes i{display:block;height:7px;width:46px}
.stripes i:nth-child(1){background:var(--s-red);margin-left:8px;--n:0}
.stripes i:nth-child(2){background:var(--s-orange);margin-left:6px;--n:1}
.stripes i:nth-child(3){background:var(--s-yellow);margin-left:4px;--n:2}
.stripes i:nth-child(4){background:var(--s-green);margin-left:2px;--n:3}
.stripes i:nth-child(5){background:var(--s-blue);--n:4}
.word{display:flex;flex-direction:column;gap:4px}
.word b{font-family:var(--display);font-size:30px;line-height:.85;letter-spacing:.5px;display:flex;align-items:flex-end;gap:5px}
.word b::after{content:"";width:13px;height:5px;background:var(--amber);margin-bottom:2px;animation:blink 1.1s steps(1) infinite}
.word span{font-family:var(--mono);font-size:11px;letter-spacing:7px;color:var(--muted)}
.brand:hover .stripes i{animation:wave .5s var(--ease) both;animation-delay:calc(var(--n) * 45ms)}
@keyframes wave{40%{transform:translateX(12px)}}

header{padding-block:28px}
header .wrap{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:18px;text-decoration:none;color:inherit}
nav{display:flex;gap:4px;flex-wrap:wrap}
nav a{position:relative;font-family:var(--mono);font-size:13px;letter-spacing:1px;text-transform:uppercase;color:var(--ink);text-decoration:none;padding:10px 12px;border-radius:6px}
nav a::after{content:"";position:absolute;left:12px;right:12px;bottom:6px;height:2px;background:var(--amber);transform:scaleX(0);transform-origin:left;transition:transform .25s var(--ease)}
nav a:hover::after,nav a[aria-current="page"]::after{transform:scaleX(1)}

/* ---------- home intro ---------- */
.intro{padding-block:40px 56px}
.intro h1{font-family:var(--display);font-size:clamp(34px,6vw,58px);line-height:1.02;margin:0 0 18px;max-width:16ch;text-wrap:balance}
.intro p{font-size:19px;color:var(--muted);max-width:56ch;margin:0}
.typeline{display:inline-block;margin-top:22px;font-family:var(--mono);font-size:14px;color:var(--amber);background:var(--screen);border-radius:8px;padding:10px 14px;max-width:100%}
.typeline span{display:inline-block;vertical-align:bottom;white-space:nowrap;overflow:hidden}
.typeline::after{content:"";display:inline-block;width:.6em;height:1.1em;vertical-align:-3px;margin-left:2px;background:var(--amber);animation:blink 1s steps(1) infinite}
@keyframes typew{from{width:0}}
@media (max-width:600px){.typeline span{white-space:normal;width:auto !important;animation:none !important}}

section{padding-block:24px 56px}
h2{font-family:var(--mono);font-size:13px;font-weight:500;letter-spacing:3px;text-transform:uppercase;color:var(--muted);margin:0 0 20px;display:flex;align-items:center;gap:12px}
h2::after{content:"";flex:1;height:2px;background:var(--bevel);transform-origin:left;animation:rule .8s var(--ease) .2s both}
@keyframes rule{from{transform:scaleX(0)}}

/* ---------- monitors ---------- */
.monitor{background:var(--screen);border-radius:12px;height:150px;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;container-type:inline-size}
.monitor::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(255,255,255,.035) 0 2px,transparent 2px 4px);pointer-events:none;z-index:1}
.monitor::after{content:"";position:absolute;left:0;right:0;top:-40%;height:40%;background:linear-gradient(transparent,color-mix(in srgb,var(--c) 9%,transparent),transparent);animation:sweep 7s linear infinite;animation-delay:calc(var(--i,0) * -1.7s);pointer-events:none}
@keyframes sweep{to{top:110%}}
.glyph{display:flex;align-items:center;gap:clamp(10px,3.5cqi,18px);color:var(--c);position:relative}
.ico{width:clamp(30px,10cqi,46px);height:auto;flex:none;filter:drop-shadow(0 0 8px color-mix(in srgb,var(--c) 50%,transparent))}
.w{font-family:var(--display);font-size:40px;font-size:clamp(28px,10.5cqi,54px);line-height:.8;letter-spacing:.5px;display:flex;align-items:flex-end;gap:.02em;text-shadow:0 0 18px color-mix(in srgb,var(--c) 45%,transparent);animation:flicker 9s infinite;animation-delay:calc(var(--i,0) * -2.3s)}
.w::after{content:"";width:.25em;height:.1em;margin-left:.08em;background:var(--c);margin-bottom:.03em;animation:blink 1.1s steps(1) infinite}
@keyframes blink{50%{opacity:0}}
@keyframes flicker{0%,91%,93.5%,96%,100%{opacity:1}92%{opacity:.55}95%{opacity:.8}}
.led{position:absolute;right:14px;bottom:12px;font-family:var(--mono);font-size:11px;letter-spacing:2px;color:#B5AC9A;z-index:2}
.led::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--c);margin-right:7px;vertical-align:1px;box-shadow:0 0 6px var(--c);animation:pulse 2.4s ease-in-out infinite}
@keyframes pulse{50%{opacity:.35}}
.ico *{stroke-dasharray:none}
@keyframes draw{from{stroke-dasharray:1;stroke-dashoffset:1}to{stroke-dasharray:1;stroke-dashoffset:0}}
@keyframes glitch{0%{transform:translate(0);text-shadow:2px 0 #F0433A,-2px 0 #1E90E0}25%{transform:translate(-2px,1px);text-shadow:-3px 0 #F0433A,3px 0 #1E90E0}50%{transform:translate(2px,-1px);text-shadow:3px 0 #F0433A,-3px 0 #1E90E0}75%{transform:translate(-1px,0);text-shadow:-1px 0 #F0433A,1px 0 #1E90E0}100%{transform:none}}

/* ---------- project cards ---------- */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,460px),1fr));gap:24px}
.proj{position:relative;background:var(--panel);border:6px solid var(--bevel);border-radius:22px;padding:18px;display:flex;flex-direction:column;gap:18px;min-width:0;transition:transform .25s var(--ease),border-color .25s ease,box-shadow .25s ease}
.proj:hover{transform:translateY(-5px);border-color:color-mix(in srgb,var(--amber) 55%,var(--bevel));box-shadow:0 22px 40px -26px rgba(0,0,0,.4)}
.proj:hover .w{animation:glitch .35s steps(2) 1}
.proj:hover .ico *{animation:draw .8s var(--ease) both}
.proj:hover .monitor{filter:brightness(1.12)}
.monitor{transition:filter .25s ease}
.proj h3{font-family:var(--display);font-size:26px;line-height:1.1;margin:0}
.proj h3 a{color:inherit;text-decoration:none}
.proj h3 a::after{content:"";position:absolute;inset:0;border-radius:16px;z-index:1}
.proj h3 a:focus-visible{outline:none}
.proj h3 a:focus-visible::after{outline:3px solid var(--s-blue);outline-offset:4px}
.proj p{margin:0;color:var(--muted)}
.proj ul{margin:0;padding-left:20px;color:var(--muted)}
.proj .cta{position:relative;z-index:2;margin-top:auto;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.more{font-family:var(--mono);font-size:13px;letter-spacing:1px;text-transform:uppercase;color:var(--amber-ink);padding:12px 4px;display:inline-flex;gap:6px}
.more::after{content:"▸";transition:transform .25s var(--ease)}
.proj:hover .more::after{transform:translateX(6px)}

.meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.chip{font-family:var(--mono);font-size:12px;letter-spacing:1px;text-transform:uppercase;padding:4px 10px;border-radius:999px;border:2px solid var(--bevel);color:var(--ink);display:inline-flex;align-items:center;gap:7px;white-space:nowrap}
.chip.live::before,.chip.soon::before,.chip.dev::before,.chip.test::before,.chip.plan::before,.chip.done::before{content:"";width:8px;height:8px;border-radius:50%}
.chip.live::before{background:var(--s-green);animation:pulse 2s ease-in-out infinite}
.chip.soon::before{background:var(--s-yellow)}
.chip.dev::before{background:var(--s-blue)}
.chip.test::before{background:var(--s-orange)}
.chip.done::before{background:var(--s-green)}
.road .done .node{border-color:var(--s-green);background:var(--s-green)}
.chip.plan::before{background:transparent;border:2px solid var(--muted);width:6px;height:6px}
.btn{position:relative;overflow:hidden;font-family:var(--mono);font-size:13px;letter-spacing:1px;text-transform:uppercase;text-decoration:none;padding:12px 16px;border-radius:8px;background:var(--screen);color:var(--amber);border:0;cursor:pointer;min-height:44px;display:inline-flex;align-items:center;transition:transform .2s var(--ease)}
.btn::after{content:"";position:absolute;inset:0;background:linear-gradient(100deg,transparent 30%,rgba(242,181,68,.25) 50%,transparent 70%);transform:translateX(-100%)}
.btn:hover{transform:translateY(-2px)}
.btn:hover::after{animation:shine .7s ease}
@keyframes shine{to{transform:translateX(100%)}}

/* ---------- devlog ---------- */
.posts{display:flex;flex-direction:column;gap:18px}
.post{background:var(--panel);border:2px solid var(--bevel);border-radius:14px;padding:20px 22px;display:flex;flex-direction:column;gap:10px;min-width:0}
.post-meta{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.post time{font-family:var(--mono);font-size:13px;letter-spacing:1px;color:var(--muted);font-variant-numeric:tabular-nums}
.post h3{font-family:var(--display);font-size:22px;line-height:1.15;margin:0;text-wrap:balance}
.post p{margin:0;max-width:66ch}
.post ul{margin:0;padding-left:20px;max-width:66ch}
.latest{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:18px}
a.post{text-decoration:none;color:inherit;transition:border-color .2s ease,transform .25s var(--ease)}
a.post:hover{border-color:var(--amber);transform:translateY(-3px)}
a.post p{color:var(--muted);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.gdot{display:inline-block;width:9px;height:9px;border-radius:2px;background:var(--c)}
.note{font-family:var(--mono);font-size:13px;color:var(--muted);margin:0}
.posts .post{border-left-width:2px}
.post.fresh{animation:rise .5s var(--ease) both;animation-delay:calc(var(--d,0) * 70ms)}

/* ---------- game pages ---------- */
.back{font-family:var(--mono);font-size:13px;letter-spacing:1px;text-transform:uppercase;text-decoration:none;color:var(--ink);display:inline-flex;align-items:center;gap:6px;min-height:44px;padding-right:8px}
.back::before{content:"◂";transition:transform .25s var(--ease)}
.back:hover{color:var(--amber-ink)}
.back:hover::before{transform:translateX(-5px)}
.gtop{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:40px;align-items:center;padding-block:8px 56px}
.case{background:var(--panel);border:6px solid var(--bevel);border-radius:22px;padding:18px;min-width:0;position:relative}
.case::after{content:"";position:absolute;right:26px;bottom:-26px;width:46%;height:20px;background:var(--bevel);border-radius:0 0 10px 10px;opacity:.7}
.monitor.big{height:clamp(190px,32vw,280px)}
.monitor.big .ico{width:clamp(36px,11cqi,66px)}
.monitor.big .w{font-size:clamp(30px,11cqi,80px)}
.monitor.big .glyph{animation:crtOn .6s var(--ease) .15s both}
.ch{animation:chIn .01s linear both;animation-delay:calc(.45s + var(--k) * 75ms)}
@keyframes chIn{from{opacity:0}}
.gtop h1{font-family:var(--display);font-size:clamp(34px,5.4vw,56px);line-height:1.02;margin:14px 0 12px;text-wrap:balance}
.tagline{font-size:20px;color:var(--muted);margin:0 0 24px}
.gbody{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:44px;padding-block:0 40px}
.prose p{margin:0 0 16px;max-width:64ch;font-size:17px}
.facts{background:var(--panel);border:6px solid var(--bevel);border-radius:22px;padding:22px;align-self:start}
.facts dl{margin:0;display:flex;flex-direction:column;gap:14px}
.facts dt{font-family:var(--mono);font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--muted)}
.facts dd{margin:2px 0 0;font-weight:500}
.term{background:var(--screen);color:var(--screen-ink);border-radius:16px;padding:22px 24px;font-family:var(--mono);font-size:15px;position:relative;overflow:hidden}
.term::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,rgba(255,255,255,.03) 0 2px,transparent 2px 4px);pointer-events:none}
.term-head{display:flex;justify-content:space-between;gap:12px;color:#B5AC9A;font-size:12px;letter-spacing:2px;text-transform:uppercase;padding-bottom:12px;margin-bottom:12px;border-bottom:1px dashed rgba(230,222,202,.2)}
.term ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.term li{display:grid;grid-template-columns:1.5em minmax(0,1fr);gap:4px}
.term li::before{content:">";color:var(--g)}
.term li:last-child::after{content:"";grid-column:2;width:.6em;height:1.1em;background:var(--g);animation:blink 1s steps(1) infinite}
.road{list-style:none;margin:0;padding:0;position:relative;display:flex;flex-direction:column}
.road::before{content:"";position:absolute;left:11px;top:14px;bottom:14px;width:2px;background:var(--bevel)}
.road li{display:grid;grid-template-columns:24px 4.2em minmax(0,1fr);gap:14px;align-items:start;padding-block:12px;position:relative}
.road .node{width:24px;height:24px;border-radius:50%;background:var(--case);border:3px solid var(--bevel);position:relative;z-index:1}
.road .test .node{border-color:var(--s-orange)}
.road .prog .node{border-color:var(--s-blue);background:var(--s-blue);box-shadow:0 0 0 0 color-mix(in srgb,var(--s-blue) 50%,transparent);animation:ring 2s ease-out infinite}
@keyframes ring{to{box-shadow:0 0 0 10px transparent}}
.road b{font-family:var(--mono);font-weight:500;font-size:15px;color:var(--amber-ink);font-variant-numeric:tabular-nums;padding-top:1px}
.road h4{font-family:var(--display);font-size:19px;margin:0 0 2px;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.road p{margin:0;color:var(--muted)}
.road .chip{font-size:11px;padding:2px 8px}
.others{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:18px}
.mini{position:relative;background:var(--panel);border:4px solid var(--bevel);border-radius:18px;padding:12px;display:flex;flex-direction:column;gap:10px;text-decoration:none;color:inherit;transition:transform .25s var(--ease),border-color .25s ease}
.mini .monitor{height:96px}
.mini .w{font-size:clamp(20px,9cqi,32px)}
.mini .ico{width:clamp(22px,8cqi,30px)}
.mini strong{font-family:var(--display);font-size:18px;line-height:1.1}
.mini:hover{transform:translateY(-4px);border-color:color-mix(in srgb,var(--amber) 55%,var(--bevel))}
.mini:hover .w{animation:glitch .35s steps(2) 1}
.mini:hover .ico *{animation:draw .8s var(--ease) both}
@media (max-width:820px){.gtop,.gbody{grid-template-columns:minmax(0,1fr)}.gtop{gap:44px}}

/* ---------- panels, footer ---------- */
.panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,320px),1fr));gap:24px}
.panel{background:var(--panel);border:6px solid var(--bevel);border-radius:22px;padding:24px;display:flex;flex-direction:column;gap:14px;min-width:0}
.panel h3{font-family:var(--display);font-size:22px;margin:0}
.panel p{margin:0;color:var(--muted)}
.links{display:flex;flex-direction:column;gap:8px}
.mail{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.mail code{font-family:var(--mono);font-size:15px;background:var(--screen);color:var(--amber);padding:10px 12px;border-radius:8px;user-select:all;word-break:break-all}
#copied{font-family:var(--mono);font-size:12px;color:var(--muted)}
footer{padding-block:28px 40px;border-top:2px solid var(--bevel)}
footer .wrap{display:flex;justify-content:space-between;gap:16px 28px;flex-wrap:wrap;align-items:center;font-family:var(--mono);font-size:12px;color:var(--muted)}
.flinks{display:flex;gap:4px 14px;flex-wrap:wrap}
.flinks a{color:var(--muted);text-decoration:none;padding-block:6px}
.flinks a:hover{color:var(--amber-ink)}

/* ---------- entrance + scroll ---------- */
.enter{animation:rise .7s var(--ease) both;animation-delay:calc(.05s + var(--d,0) * 90ms)}
@keyframes rise{from{opacity:0;transform:translateY(22px)}}
html.boot .enter,html.boot .ch,html.boot .monitor.big .glyph,html.boot .typeline span,html.boot h2::after{animation-play-state:paused !important}
@supports (animation-timeline: view()){
  .reveal{animation:revealIn linear both;animation-timeline:view();animation-range:entry 0% entry 45%}
  @keyframes revealIn{from{opacity:.55;transform:translateY(30px) scale(.985)}}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
  html{scroll-behavior:auto}
  #boot{display:none}
}

/* ---------- game art: screens, slideshow, gallery, lightbox ---------- */
.monitor .scr{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.3;filter:saturate(.75) contrast(1.05);transition:opacity .4s ease,transform .8s var(--ease)}
.monitor.has-scr .w{text-shadow:0 0 18px color-mix(in srgb,var(--c) 45%,transparent),0 2px 12px rgba(0,0,0,.85)}
.monitor.has-scr .ico{filter:drop-shadow(0 0 8px color-mix(in srgb,var(--c) 50%,transparent)) drop-shadow(0 2px 6px rgba(0,0,0,.8))}
.proj:hover .monitor .scr,.mini:hover .monitor .scr{opacity:.55;transform:scale(1.05)}
.slides{position:absolute;inset:0}
.slides img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;animation:slide calc(var(--n) * 6s) linear infinite;animation-delay:calc(var(--s) * 6s)}
.slides::after{content:"";position:absolute;inset:0;background:radial-gradient(120% 90% at 50% 50%,rgba(0,0,0,.1) 30%,rgba(0,0,0,.6))}
@keyframes slide{0%{opacity:0;transform:scale(1.08)}6%{opacity:.9}30%{opacity:.9}36%{opacity:0;transform:scale(1)}100%{opacity:0}}
.glogo{position:relative;z-index:2;width:min(76%,480px);height:auto;filter:drop-shadow(0 4px 14px rgba(0,0,0,.75));animation:crtOn .6s var(--ease) .15s both}
html.boot .glogo,html.boot .slides img{animation-play-state:paused !important}
.shots{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,250px),1fr));gap:16px}
.shot{position:relative;display:block;border-radius:14px;overflow:hidden;background:var(--screen);border:4px solid var(--bevel);text-decoration:none;aspect-ratio:16/9;transition:transform .25s var(--ease),border-color .25s ease}
.shot img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .6s var(--ease),filter .3s ease}
.shot span{position:absolute;left:0;right:0;bottom:0;padding:24px 12px 10px;font-size:13px;line-height:1.35;color:#F2ECDD;background:linear-gradient(transparent,rgba(0,0,0,.82));transform:translateY(100%);transition:transform .3s var(--ease)}
.shot:hover,.shot:focus-visible{transform:translateY(-3px);border-color:color-mix(in srgb,var(--amber) 55%,var(--bevel))}
.shot:hover img,.shot:focus-visible img{transform:scale(1.06)}
.shot:hover span,.shot:focus-visible span{transform:none}
@media (min-width:760px){.shot:first-child{grid-column:span 2;grid-row:span 2}}
@media (hover:none){.shot span{transform:none}}
.lightbox{padding:0;border:0;background:transparent;max-width:min(1400px,94vw);max-height:94vh;overflow:visible}
.lightbox::backdrop{background:rgba(12,11,9,.9)}
.lightbox[open]{animation:lbIn .3s var(--ease)}
@keyframes lbIn{from{opacity:0;transform:scale(.96)}}
.lightbox figure{margin:0;display:flex;flex-direction:column;gap:12px;align-items:center}
.lightbox img{display:block;max-width:100%;max-height:80vh;border-radius:12px;border:4px solid #3D3830;background:#121211}
.lightbox img.in{animation:lbImg .35s var(--ease)}
@keyframes lbImg{from{opacity:.2;transform:scale(.985)}}
.lightbox figcaption{font-family:var(--mono);font-size:14px;color:#E6DECA;text-align:center;max-width:70ch}
.lb-btn{position:fixed;width:48px;height:48px;border-radius:50%;border:2px solid #5E5647;background:#1B1B1A;color:#F2B544;font-size:28px;line-height:1;cursor:pointer;display:grid;place-items:center}
.lb-btn:hover{border-color:#F2B544}
.lb-prev{left:max(16px,env(safe-area-inset-left,0px));top:50%;transform:translateY(-50%)}
.lb-next{right:max(16px,env(safe-area-inset-right,0px));top:50%;transform:translateY(-50%)}
.lb-close{right:max(16px,env(safe-area-inset-right,0px));top:calc(16px + env(safe-area-inset-top,0px))}
@media (prefers-reduced-motion:reduce){.slides img:first-child{opacity:.9}}
.shots.phone{grid-template-columns:repeat(auto-fill,minmax(min(100%,180px),1fr))}
.shots.phone .shot{aspect-ratio:360/770;border-radius:22px;border-width:5px}
.shots.phone .shot:first-child{grid-column:auto;grid-row:auto}
.shots.phone .shot img{object-position:top}

/* ---------- terminal scenes ---------- */
.scene{position:absolute;inset:0;width:100%;height:100%;color:var(--c);filter:drop-shadow(0 0 6px color-mix(in srgb,var(--c) 40%,transparent))}
.scene *{transform-box:fill-box;transform-origin:center}
.monitor .cap{position:absolute;left:14px;bottom:10px;z-index:2;display:flex;color:var(--c)}
.monitor .cap .w{font-family:var(--mono);font-size:12px;font-weight:500;letter-spacing:2px;line-height:1;text-shadow:0 0 8px color-mix(in srgb,var(--c) 60%,transparent);animation:none}
.monitor .cap .w::before{content:"> ";white-space:pre}
.monitor .cap .w::after{width:.6em;height:1em;margin-left:2px;margin-bottom:0}
.monitor.big .cap{left:18px;bottom:14px}
.monitor.big .cap .w{font-size:15px}
.monitor.big .scene{animation:crtOn .6s var(--ease) .15s both}
html.boot .monitor.big .scene,html.boot .scene *{animation-play-state:paused !important}
.proj:hover .scene,.mini:hover .scene{filter:drop-shadow(0 0 10px color-mix(in srgb,var(--c) 70%,transparent)) brightness(1.15)}
.proj:hover .cap .w,.mini:hover .cap .w{animation:glitch .35s steps(2) 1}

/* Megacity: papers slide under the lamp, the stamp comes down */
.sc-megacity .win{animation:winb 3s steps(1) infinite;animation-delay:calc(var(--k) * -.37s)}
@keyframes winb{50%{opacity:.15}}
.sc-megacity .doc{animation:docMove 8s var(--ease) infinite both}
.sc-megacity .doc.b{animation-delay:4s}
@keyframes docMove{0%{transform:translateX(-240px);opacity:1}8%{transform:none}42%{transform:none;opacity:1}50%{transform:translateX(240px);opacity:1}51%,100%{transform:translateX(240px);opacity:0}}
.sc-megacity .stamp{transform:rotate(-8deg);animation:stampDown 8s ease-out infinite both}
.sc-megacity .doc.b .stamp{animation-delay:4s}
@keyframes stampDown{0%,17%{opacity:0;transform:scale(2) rotate(-16deg)}21%{opacity:1;transform:scale(.94) rotate(-8deg)}24%,100%{opacity:1;transform:rotate(-8deg)}}

/* Rush: documents swiped left and right against the clock */
.sc-rush .timer{transform-origin:left center;animation:timer 9s linear infinite}
@keyframes timer{from{transform:scaleX(1)}to{transform:scaleX(0)}}
.sc-rush .card{animation:swipeR 3s var(--ease) infinite both;animation-delay:calc(var(--k) * 1s)}
.sc-rush .card.l{animation-name:swipeL}
.sc-rush .card+.card{opacity:0}
@keyframes swipeR{0%{transform:translateY(46px) scale(.8);opacity:0}10%{transform:none;opacity:1}24%{transform:none;opacity:1}34%{transform:translateX(190px) rotate(18deg);opacity:0}100%{transform:translateX(190px);opacity:0}}
@keyframes swipeL{0%{transform:translateY(46px) scale(.8);opacity:0}10%{transform:none;opacity:1}24%{transform:none;opacity:1}34%{transform:translateX(-190px) rotate(-18deg);opacity:0}100%{transform:translateX(-190px);opacity:0}}
.sc-rush .lab{animation:lab 3s infinite both;animation-delay:inherit}
.sc-rush .card .lab{animation-delay:calc(var(--k) * 1s)}
@keyframes lab{0%,16%{opacity:0}22%,34%{opacity:1}35%,100%{opacity:0}}
.sc-rush .arrow{opacity:.35;animation:nudge 1s ease-in-out infinite}
.sc-rush .arrow.l{animation-delay:.5s}
@keyframes nudge{50%{opacity:.9}}
.sc-rush .combo{animation:combo 3s var(--ease) infinite}
@keyframes combo{0%,60%{opacity:0;transform:scale(.6)}68%{opacity:1;transform:scale(1.15)}75%,92%{opacity:1;transform:none}100%{opacity:0}}

/* Saecula: a thousand years of towns, roads and borders on the map */
@property --yr{syntax:'<integer>';inherits:false;initial-value:1000}
.sc-saecula .land{fill:currentColor;fill-opacity:.1;stroke:currentColor;stroke-opacity:.5;stroke-width:1.5}
.sc-saecula .border{fill:none;stroke:currentColor;stroke-width:1.5;stroke-dasharray:1;opacity:.6;animation:drawLine 12s ease-in-out infinite both}
.sc-saecula .border.b2{animation-delay:5s}
.sc-saecula .road{fill:none;stroke:currentColor;stroke-width:1.2;stroke-dasharray:1;opacity:.75;animation:drawLine 12s ease-in-out infinite both;animation-delay:calc(1s + var(--k) * .6s)}
@keyframes drawLine{0%{stroke-dashoffset:1}12%{stroke-dashoffset:0}80%{stroke-dashoffset:0;opacity:.75}92%,100%{stroke-dashoffset:0;opacity:0}}
.sc-saecula .town{animation:townRise 12s var(--ease) infinite both;animation-delay:calc(var(--k) * .7s)}
@keyframes townRise{0%{transform:scale(0);opacity:0}6%{transform:scale(1.6);opacity:1}10%{transform:none}70%{transform:scale(1.35)}84%{transform:scale(1.35);opacity:1}92%,100%{transform:scale(.4);opacity:.25}}
.monitor .yr{position:absolute;right:16px;top:12px;z-index:2;font-family:var(--mono);font-size:12px;letter-spacing:2px;color:var(--c);counter-reset:yr var(--yr);animation:years 12s linear infinite}
.monitor .yr::after{content:" " counter(yr)}
.monitor.big .yr{font-size:15px;right:20px;top:16px}
@keyframes years{from{--yr:1000}to{--yr:2000}}

/* Genesis: ruined columns rebuilt course by course, then the pediment */
.sc-genesis .blk{opacity:1;animation:build 10s var(--ease) infinite both;animation-delay:calc(var(--k) * .22s)}
.sc-genesis .blk.ruin{animation:none;opacity:.9}
@keyframes build{0%{opacity:.12;transform:translateY(-16px)}5%{opacity:1;transform:none}72%{opacity:1}84%,100%{opacity:.12;transform:none}}
.sc-genesis .ped{stroke-dasharray:1;animation:ped 10s ease-in-out infinite both}
@keyframes ped{0%,58%{stroke-dashoffset:1;opacity:1}68%{stroke-dashoffset:0}76%{opacity:1}86%,100%{stroke-dashoffset:0;opacity:0}}
.sc-genesis .moon{fill:currentColor;opacity:.5;animation:moon 5s ease-in-out infinite}
@keyframes moon{50%{opacity:.85}}
.sc-genesis .walker{animation:walk 14s linear infinite;animation-delay:calc(var(--k) * -4.6s)}
@keyframes walk{from{transform:translateX(24px)}to{transform:translateX(292px)}}

.keyart{position:relative;overflow:hidden;border-radius:16px;border:6px solid var(--bevel);background:var(--screen);aspect-ratio:16/6;margin-bottom:18px;display:grid;place-items:center}
.keyart .kbg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.7;animation:kb 30s ease-in-out infinite alternate}
.keyart::after{content:"";position:absolute;inset:0;background:radial-gradient(90% 90% at 50% 50%,rgba(0,0,0,.15),rgba(0,0,0,.65))}
.keyart .klogo{position:relative;z-index:1;width:min(64%,560px);height:auto;filter:drop-shadow(0 4px 14px rgba(0,0,0,.8))}
@keyframes kb{from{transform:scale(1.04) translate(-1%,0)}to{transform:scale(1.14) translate(1%,-2%)}}
@media (max-width:560px){.keyart{aspect-ratio:16/9}}
@media (prefers-reduced-motion:reduce){.sc-rush .card+.card,.sc-megacity .doc.b{opacity:0 !important}}
