/* =====================================================================
   Project cards (16:9, 3 per row, 2 on smaller screens) + the project pop-up.
   Pop-up content is plain HTML from each project folder (popup.php). The .pp-* classes
   at the end are ready-made building blocks that work in light and dark.
   ===================================================================== */

/* ---------- the section + grid ---------- */
.projects{padding:15vh clamp(16px,5vw,80px) 17vh}
.pj-wrap{max-width:1240px;margin:0 auto}
.pj-head{margin:0 0 clamp(22px,3.5vw,40px)}
.pj-kick{margin:0 0 10px;font:600 12px/1 var(--f-head);letter-spacing:.2em;text-transform:uppercase;opacity:.6}
.pj-head h2{margin:0;font:700 clamp(34px,4.6vw,62px)/1 var(--f-head);letter-spacing:-.035em}
.pj-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(18px,2.4vw,32px) clamp(14px,2vw,26px)}
@media (max-width:900px){.pj-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:480px){.pj-grid{gap:16px 10px}}

/* ---------- a card: picture + name ---------- */
.pj-card{all:unset;box-sizing:border-box;display:flex;flex-direction:column;gap:10px;cursor:pointer;color:inherit;min-width:0;-webkit-tap-highlight-color:transparent}
.pj-art{position:relative;display:block;aspect-ratio:16/9;border-radius:10px;overflow:hidden;background:#0d0f16;
  box-shadow:0 14px 30px -18px rgba(0,0,0,.55),0 0 0 1px color-mix(in srgb,var(--ink,#000) 10%,transparent);
  transition:transform .4s cubic-bezier(.2,.9,.25,1),box-shadow .4s}
.pj-art img{display:block;width:100%;height:100%;object-fit:cover;transition:transform 1.2s cubic-bezier(.2,.7,.2,1)}
.pj-card:hover .pj-art,.pj-card:focus-visible .pj-art{transform:translateY(-4px) scale(1.025);box-shadow:0 26px 44px -20px rgba(0,0,0,.6),0 0 0 1px color-mix(in srgb,var(--ink,#000) 14%,transparent)}
.pj-card:hover .pj-art img{transform:scale(1.06)}
.pj-card:focus-visible .pj-art{outline:3px solid var(--a);outline-offset:3px}
.pj-card.ghost .pj-art{visibility:hidden}
.pj-name{font:600 clamp(15px,1.45vw,19px)/1.2 var(--f-head);letter-spacing:-.01em;padding:0 2px}
.pj-badges{position:absolute;left:10px;top:10px;display:flex;gap:6px;flex-wrap:wrap;z-index:2}
.pj-badge{display:inline-block;font:700 10.5px/1 var(--f-body);letter-spacing:.07em;text-transform:uppercase;padding:5px 8px;border-radius:99px;color:#fff;
  background:rgba(12,14,22,.62);box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.pj-badge.live{background:rgba(16,150,98,.92);box-shadow:none}
.pj-badge.live::before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:#bff5dc;margin-right:6px;vertical-align:1px;animation:pjPulse 2s ease-in-out infinite}
.pj-badge.beta{background:rgba(222,130,30,.95);box-shadow:none}
@keyframes pjPulse{50%{opacity:.35}}
@media (max-width:480px){.pj-badges{left:7px;top:7px;gap:4px}.pj-badge{font-size:9px;padding:4px 6px}}

/* generated cover (until the folder has a picture) */
.pj-gen{position:absolute;inset:0;display:block;overflow:hidden;color:#fff;
  background:radial-gradient(120% 130% at 85% 0%,color-mix(in srgb,var(--a) 65%,#fff) 0%,var(--a) 42%,color-mix(in srgb,var(--a) 45%,#000) 100%)}
.pj-gen::before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(135deg,rgba(255,255,255,.08) 0 1px,transparent 1px 14px)}
.pj-mono{position:absolute;right:-.06em;bottom:-.24em;font:800 clamp(80px,13vw,190px)/1 var(--f-head);letter-spacing:-.06em;opacity:.2}
.pj-wm{position:absolute;left:7%;bottom:12%;right:30%;font:700 clamp(17px,2.2vw,32px)/1.02 var(--f-head);letter-spacing:-.03em;text-shadow:0 2px 12px rgba(0,0,0,.25)}
.pp-art .pj-wm{display:none}
.pp-art .pj-mono{font-size:clamp(160px,30vw,380px)}

/* ---------- the pop-up ---------- */
.pp{position:fixed;inset:0;z-index:200;overflow-y:auto;overscroll-behavior:contain;display:none;
  --pp-bg:#fbfaf7;--pp-ink:#15161d;--pp-mut:#5b5f6e;--pp-line:rgba(20,22,32,.12);--pp-chip:rgba(20,22,32,.06)}
[data-theme=dark] .pp{--pp-bg:#13151c;--pp-ink:#ececf3;--pp-mut:#a2a6b7;--pp-line:rgba(255,255,255,.11);--pp-chip:rgba(255,255,255,.07)}
.pp.on{display:block}
.pp-bk{position:fixed;inset:0;background:rgba(5,7,13,.62);backdrop-filter:blur(8px) saturate(1.1);-webkit-backdrop-filter:blur(8px) saturate(1.1)}
.pp-dl{position:relative;width:min(980px,calc(100vw - 40px));margin:40px auto 60px;background:var(--pp-bg);color:var(--pp-ink);border-radius:16px;overflow:hidden;
  box-shadow:0 40px 100px -24px rgba(0,0,0,.7);font-family:var(--f-body);--pp-card:color-mix(in srgb,var(--a) 8%,var(--pp-bg));--pp-acc:color-mix(in srgb,var(--a) 78%,var(--pp-ink))}
.pp-x{position:fixed;top:54px;right:max(16px,calc(50% - 490px + 14px));z-index:5;width:40px;height:40px;border-radius:50%;border:0;cursor:pointer;
  background:rgba(10,11,16,.72);color:#fff;font-size:17px;line-height:1;backdrop-filter:blur(6px);transition:transform .25s,background .2s}
.pp-x:hover{transform:rotate(90deg);background:rgba(10,11,16,.9)}
.pp-nav{position:fixed;top:50%;z-index:5;width:46px;height:46px;margin-top:-23px;border-radius:50%;border:0;cursor:pointer;font-size:22px;color:#fff;
  background:rgba(255,255,255,.14);backdrop-filter:blur(6px);transition:background .2s,transform .2s}
.pp-nav:hover{background:rgba(255,255,255,.28);transform:scale(1.08)}
.pp-nav.l{left:max(12px,calc(50% - 490px - 66px))}.pp-nav.r{right:max(12px,calc(50% - 490px - 66px))}
@media (max-width:1140px){.pp-nav{display:none}}

.pp-hero{position:relative;aspect-ratio:16/9;overflow:hidden;transform-origin:0 0}
.pp-art{position:absolute;inset:0}
.pp-art img{width:100%;height:100%;object-fit:cover;display:block}
.pp-hero::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(0deg,var(--pp-bg) 0%,var(--pp-bg) 14%,color-mix(in srgb,var(--pp-bg) 82%,transparent) 34%,color-mix(in srgb,var(--pp-bg) 35%,transparent) 56%,transparent 78%)}
.pp-cap{position:absolute;left:40px;right:40px;bottom:26px;z-index:2}
.pp-kick{margin:0 0 8px;font:600 11.5px/1 var(--f-head);letter-spacing:.18em;text-transform:uppercase;color:var(--pp-mut)}
.pp-cap h2{margin:0 0 12px;font:700 clamp(30px,4.8vw,56px)/1 var(--f-head);letter-spacing:-.035em}
.pp-meta{display:flex;gap:6px;flex-wrap:wrap}
.pp-meta .pj-badge{backdrop-filter:none}
.pp-meta .pj-badge.tag{background:var(--pp-chip);color:var(--pp-ink);box-shadow:inset 0 0 0 1px var(--pp-line)}
.pp-acts{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}
.pp-btn{display:inline-flex;align-items:center;gap:8px;padding:11px 18px;border-radius:8px;font:700 14.5px/1 var(--f-body);text-decoration:none;transition:filter .2s,transform .2s}
.pp-btn.pri{background:var(--pp-ink);color:var(--pp-bg)}
.pp-btn.sec{background:var(--pp-chip);color:var(--pp-ink);box-shadow:inset 0 0 0 1px var(--pp-line)}
.pp-btn:hover{transform:translateY(-1px);filter:brightness(1.08)}
.pp-body{padding:10px 40px 44px;font-size:16px;line-height:1.6}

/* phones: the pop-up takes the whole screen */
@media (max-width:700px){
  .pp-dl{width:100%;margin:0;min-height:100vh;min-height:100dvh;border-radius:0}
  .pp-x{top:12px;right:12px}
  .pp-hero{aspect-ratio:4/3}
  .pp-cap{left:18px;right:18px;bottom:16px}
  .pp-body{padding:6px 18px 36px;font-size:15.5px}
}

/* ---------- building blocks for pop-up content (popup.php) ---------- */
.pp-body > *:first-child{margin-top:0}
.pp-body h3{font:700 clamp(20px,2.2vw,26px)/1.15 var(--f-head);letter-spacing:-.02em;margin:34px 0 12px}
.pp-body h4{font:700 16px/1.25 var(--f-head);margin:0 0 6px}
.pp-body p{margin:0 0 14px}
.pp-body a{color:var(--pp-acc)}
.pp-body img,.pp-body video{max-width:100%;height:auto;border-radius:10px}
.pp-mut{color:var(--pp-mut)}
.pp-lead{font:500 clamp(18px,1.9vw,22px)/1.45 var(--f-head);letter-spacing:-.01em;margin:0 0 20px}
.pp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px;margin:0 0 18px}
.pp-card{background:var(--pp-card);border:1px solid color-mix(in srgb,var(--a) 22%,transparent);border-radius:12px;padding:15px 16px}
.pp-card p{margin:0;font-size:14px;line-height:1.5;color:var(--pp-mut)}
.pp-k{display:block;margin:0 0 6px;font:700 10.5px/1 var(--f-head);letter-spacing:.15em;text-transform:uppercase;color:var(--pp-acc)}
.pp-cols{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:32px;margin:0 0 18px}
.pp-cols.even{grid-template-columns:1fr 1fr}
@media (max-width:700px){.pp-cols,.pp-cols.even{grid-template-columns:1fr;gap:14px}}
.pp-side{font-size:14px;color:var(--pp-mut)}
.pp-side dt{font:700 10.5px/1 var(--f-head);letter-spacing:.14em;text-transform:uppercase;color:var(--pp-ink);margin:12px 0 4px}
.pp-side dt:first-child{margin-top:0}
.pp-side dd{margin:0}
.pp-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin:0 0 20px}
.pp-stat{border-top:2px solid var(--a);padding-top:10px}
.pp-stat b{display:block;font:700 clamp(26px,3.4vw,40px)/1 var(--f-head);letter-spacing:-.03em}
.pp-stat span{display:block;margin-top:6px;font-size:13px;color:var(--pp-mut);line-height:1.35}
.pp-steps{list-style:none;counter-reset:s;padding:0;margin:0 0 18px;display:grid;gap:10px}
.pp-steps li{counter-increment:s;position:relative;padding:2px 0 2px 44px}
.pp-steps li::before{content:counter(s);position:absolute;left:0;top:0;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;
  font:700 13px/1 var(--f-head);background:var(--a);color:#fff}
.pp-tags{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 16px;padding:0;list-style:none}
.pp-tags li,.pp-tags span{font:500 12.5px/1 var(--f-body);padding:6px 10px;border-radius:99px;background:var(--pp-chip);box-shadow:inset 0 0 0 1px var(--pp-line)}
.pp-shot{margin:0 0 20px}
.pp-shot img,.pp-shot video{display:block;width:100%;border-radius:12px;box-shadow:0 0 0 1px var(--pp-line)}
.pp-shot figcaption{margin-top:8px;font-size:13px;color:var(--pp-mut)}
.pp-quote{margin:0 0 20px;padding:4px 0 4px 18px;border-left:3px solid var(--a);font:500 18px/1.45 var(--f-head);font-style:italic}
.pp-note{padding:12px 14px;border-radius:10px;background:var(--pp-chip);font-size:14px;color:var(--pp-mut);margin:0 0 16px}
.pp-hr{border:0;border-top:1px solid var(--pp-line);margin:26px 0}

/* comic mode */
[data-site-mode=comic] .pj-art{border:3px solid #1b1a22;box-shadow:6px 6px 0 #1b1a22;border-radius:12px}
[data-site-mode=comic] .pj-card:hover .pj-art{box-shadow:9px 9px 0 #1b1a22}
[data-site-mode=comic] .pj-name{font-weight:400;font-size:clamp(18px,1.7vw,23px);letter-spacing:.02em}
[data-site-mode=comic] .pp-dl{border:3px solid #1b1a22;box-shadow:12px 12px 0 rgba(0,0,0,.6)}
[data-site-mode=comic] .pp-cap h2,[data-site-mode=comic] .pj-head h2{font-weight:400;letter-spacing:.02em}
@media (max-width:700px){[data-site-mode=comic] .pp-dl{border:0;box-shadow:none}}

/* Topic badges next to Live/Beta in the pop-up (section.json "topics"; colour per topic from site.json projects.topics) */
.pp-meta .pj-badge.topic,.pj-badges .pj-badge.topic{background:color-mix(in srgb,var(--t) 86%,#000);color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.18)}

/* project icon before the title (section.json "icon"): height follows the title font size */
.pj-ico{display:inline-block;height:.78em;width:auto;margin-right:.32em;vertical-align:-.04em;border-radius:0;flex:none}
.pp-cap h2 .pj-ico{height:.72em;margin-right:.28em;vertical-align:.02em}

/* ---------- the pop-up's scrollbar = the prism's white beam (2026-10-04) ---------- */
.pp::-webkit-scrollbar{width:14px}
.pp::-webkit-scrollbar-track{background:transparent}
.pp::-webkit-scrollbar-thumb{border-radius:99px;border:4px solid transparent;background-clip:padding-box;
  background-image:linear-gradient(90deg,rgba(150,195,255,.35),#fff 38%,#fff 62%,rgba(150,195,255,.35));
  box-shadow:inset 0 0 6px rgba(120,175,255,.9)}
.pp::-webkit-scrollbar-thumb:hover{border-width:3px;box-shadow:inset 0 0 8px rgba(120,175,255,1)}
@supports not selector(::-webkit-scrollbar){.pp{scrollbar-width:thin;scrollbar-color:#fff transparent}}


/* ---------- the card opens: ⤢ in the corner of the picture (2026-10-06) ---------- */
.pj-expand{display:grid;place-items:center;position:absolute;right:10px;top:10px;z-index:3;width:30px;height:30px;border-radius:50%;pointer-events:none;
  background:rgba(12,14,22,.5);color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.25);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  opacity:.75;transition:opacity .25s,transform .3s,background .25s}
.pj-expand svg{width:13px;height:13px}
.pj-card:hover .pj-expand,.pj-card:focus-visible .pj-expand,.pj-card.lit .pj-expand{opacity:1;transform:scale(1.1);background:var(--a)}
@media (max-width:480px){.pj-expand{width:26px;height:26px;right:7px;top:7px}.pj-expand svg{width:11px;height:11px}}

/* ---------- the app's address under the name (section.json app_url), a link of its own (2026-10-06) ---------- */
.pj-url{display:inline-flex;align-items:center;gap:5px;align-self:flex-start;position:relative;font:500 13px/1 var(--f-body);color:var(--a);letter-spacing:.01em;padding:3px 0;text-decoration:none;cursor:pointer}
.pj-url::after{content:"";position:absolute;left:0;right:0;bottom:1px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left;transition:transform .3s}
.pj-url:hover::after{transform:scaleX(1)}
.pj-url svg{width:11px;height:11px;transition:transform .3s}
.pj-url:hover svg{transform:translate(2px,-2px)}
.pj-url:focus-visible{outline:2px solid var(--a);outline-offset:3px;border-radius:3px}
[data-theme=dark] .pj-url{color:color-mix(in srgb,var(--a) 70%,#fff)}
.pj-card > .pj-url{margin:-4px 2px 0}   /* comic layout (no plate) */

/* ---------- the pop-up's "Open www.…" button: polychrome skin always on (soft), saturated + spinning on hover; static glow in the project colour (2026-10-06) ---------- */
@property --pp-ang{syntax:"<angle>";inherits:false;initial-value:0deg}
.pp-btn.pri,html.sx-ppglass .pp-btn.pri{position:relative;isolation:isolate;overflow:hidden;color:#1b1d2a;transition:transform .2s,box-shadow .35s;
  box-shadow:0 0 0 1.5px color-mix(in srgb,var(--a) 70%,transparent),0 0 12px 1px color-mix(in srgb,var(--a) 65%,transparent)}
/* the polychrome skin: pastel iridescent surface + conic rainbow rim */
.pp-btn.pri::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;border:1.5px solid transparent;
  background:
    linear-gradient(115deg,#ffd1ec,#d3e4ff 22%,#cff7e6 42%,#fff1c2 62%,#e6d4ff 82%,#ffd1ec) padding-box,
    conic-gradient(from var(--pp-ang),#ff5fc8,#ffcf4d,#57e39a,#4cc3ff,#9b7bff,#ff5fc8) border-box;
  background-size:260% 100%,100% 100%;background-position:0 0,0 0;
  filter:saturate(.55);transition:filter .4s}
/* holographic foil lines on top of the surface */
.pp-btn.pri::after{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;opacity:.45;transition:opacity .4s;mix-blend-mode:soft-light;
  background:repeating-linear-gradient(-55deg,rgba(255,0,170,.35) 0 5px,rgba(255,220,0,.3) 5px 10px,rgba(0,230,140,.3) 10px 15px,rgba(0,170,255,.35) 15px 20px,rgba(150,90,255,.3) 20px 25px)}
.pp-btn.pri:hover,.pp-btn.pri:focus-visible{filter:none;box-shadow:0 0 0 1.5px color-mix(in srgb,var(--a) 85%,transparent),0 0 18px 2px color-mix(in srgb,var(--a) 75%,transparent)}
.pp-btn.pri:hover::before,.pp-btn.pri:focus-visible::before{filter:saturate(1.5);animation:ppSpin 3s linear infinite,ppDrift 4s ease-in-out infinite alternate}
.pp-btn.pri:hover::after,.pp-btn.pri:focus-visible::after{opacity:.95}
@keyframes ppSpin{to{--pp-ang:360deg}}
@keyframes ppDrift{to{background-position:100% 0,0 0}}
