/* ============================================================
   TEXT SITE — a plain portfolio page.
   Header, sections, footer. Nothing clever.
   ============================================================ */

.site{
  --w:820px;
  color:var(--ink);font-family:var(--body);font-weight:var(--wt);
  padding-bottom:0;
}

/* ---------- header ---------- */
.site-head{
  position:sticky;top:0;z-index:5;
  display:flex;align-items:center;justify-content:space-between;gap:24px;
  padding:18px 40px;
  background:rgba(2,5,10,.92);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border-bottom:1px solid rgba(120,190,220,.12);
}
.site-head .brand{
  font-family:var(--disp);font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink);text-decoration:none;white-space:nowrap;
}
.site-head nav{display:flex;align-items:center;gap:22px;flex-wrap:wrap;justify-content:flex-end}
.site-head nav a,.site-head nav button{
  font-family:var(--disp);font-size:8px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--dim);text-decoration:none;background:none;border:0;cursor:pointer;
  padding:4px 0;transition:color .2s;white-space:nowrap;
}
.site-head nav a:hover,.site-head nav button:hover{color:var(--cyan)}
.site-head .home{color:var(--cyan)}

/* ---------- intro ---------- */
.intro{max-width:var(--w);margin:0 auto;padding:96px 40px 72px;scroll-margin-top:70px}
.intro h1{
  margin:0;font-family:var(--disp);font-weight:400;
  font-size:clamp(28px,5vw,46px);letter-spacing:.1em;line-height:1.3;text-transform:uppercase;
}
.intro .tag{margin:20px 0 0;font-size:17px;line-height:1.7;color:var(--dim);max-width:46ch}
.intro .reach{
  margin:28px 0 0;display:flex;flex-wrap:wrap;gap:8px 20px;align-items:center;
  font-size:13.5px;color:var(--faint);
}
.intro .reach a{color:var(--cyan);text-decoration:none;border-bottom:1px solid rgba(90,214,255,.28)}
.intro .reach a:hover{border-bottom-color:var(--cyan)}
.intro .dl{margin:26px 0 0;display:flex;flex-wrap:wrap;gap:9px}
.intro .dl a{
  font-family:var(--disp);font-size:8px;letter-spacing:.2em;text-transform:uppercase;
  text-decoration:none;padding:12px 16px;border:1px solid var(--hair);color:var(--dim);
  transition:border-color .2s,color .2s,background .2s;
}
.intro .dl a:hover{border-color:var(--cyan);color:#fff;background:rgba(90,214,255,.08)}
.intro .dl a.primary{border-color:var(--cyan);color:var(--cyan)}

/* ---------- overview cards ---------- */
.cards{
  max-width:var(--w);margin:0 auto;padding:0 40px 40px;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;
}
.card{
  display:flex;flex-direction:column;gap:8px;
  padding:22px 22px 20px;text-decoration:none;
  border:1px solid rgba(120,190,220,.14);
  border-left:2px solid var(--accent,var(--cyan));
  background:rgba(6,13,21,.5);
  transition:border-color .2s,background .2s,transform .2s;
}
.card:hover{background:rgba(10,20,31,.75);border-color:rgba(120,190,220,.3);transform:translateY(-2px)}
.card .c-h{
  font-family:var(--disp);font-size:10px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--accent,var(--cyan));
}
.card .c-n{
  font-family:var(--disp);font-size:7px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);
}
.card .c-list{font-size:12.5px;line-height:1.7;color:var(--dim);margin-top:2px}
.card .c-go{
  margin-top:auto;padding-top:14px;
  font-family:var(--disp);font-size:7.5px;letter-spacing:.22em;text-transform:uppercase;
  color:#5d7383;
}
.card:hover .c-go{color:var(--ink)}

/* ---------- a section page ---------- */
.page{max-width:var(--w);margin:0 auto;padding:56px 40px 72px}
.crumbs{
  margin:0 0 22px;font-family:var(--disp);font-size:7.5px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--faint);
}
.crumbs a{color:var(--dim);text-decoration:none}
.crumbs a:hover{color:var(--cyan)}
.crumbs i{font-style:normal;margin:0 8px;color:#2c3b47}
.page h1{
  margin:0;font-family:var(--disp);font-weight:400;font-size:clamp(20px,3.4vw,30px);
  letter-spacing:.12em;text-transform:uppercase;
}
.page .count{
  margin:12px 0 40px;padding-bottom:16px;
  font-family:var(--disp);font-size:7.5px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--faint);border-bottom:1px solid rgba(120,190,220,.14);
}
.items{display:flex;flex-direction:column;gap:44px}

/* ---------- prev / next ---------- */
.pager{
  display:flex;justify-content:space-between;gap:20px;
  margin-top:64px;padding-top:26px;border-top:1px solid rgba(120,190,220,.12);
}
.pager a{
  display:flex;flex-direction:column;gap:6px;text-decoration:none;
  font-family:var(--body);font-size:14px;color:var(--ink);
}
.pager a.nx{text-align:right}
.pager a span{
  font-family:var(--disp);font-size:7px;letter-spacing:.2em;text-transform:uppercase;color:var(--faint);
}
.pager a:hover{color:var(--cyan)}
.site-head nav a.on{color:var(--ink)}

.item{display:grid;grid-template-columns:1fr;gap:18px}
.item:has(.item-media){grid-template-columns:210px minmax(0,1fr);gap:26px;align-items:start}
.item-media .mem{width:100%;aspect-ratio:4/3}
.item h3{margin:0;font-family:var(--body);font-weight:400;font-size:19px;line-height:1.35;color:#dbe7ee}
.item .meta{
  margin:6px 0 0;font-family:var(--disp);font-size:7.5px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--accent,var(--cyan));opacity:.9;
}
.item p{margin:12px 0 0;font-size:14px;line-height:1.85;color:var(--dim);max-width:60ch}
.item ul{margin:14px 0 0;padding:0;list-style:none;max-width:60ch}
.item li{
  position:relative;padding-left:18px;margin-bottom:6px;
  font-size:13.4px;line-height:1.75;color:var(--dim);
}
.item li::before{
  content:"";position:absolute;left:0;top:10px;width:7px;height:1px;
  background:var(--accent,var(--cyan));opacity:.75;
}
.item .parts{font-size:12.6px;color:#5f7686}
.item .parts span{
  font-family:var(--disp);font-size:7px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--faint);margin-right:8px;
}
.item .tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:16px}
.item .tags span{
  font-family:var(--disp);font-size:7px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--dim);border:1px solid rgba(120,190,220,.16);padding:6px 9px;
}
.item .links{display:flex;flex-wrap:wrap;gap:18px;margin-top:16px}
.item .links a{
  font-size:12.5px;color:var(--accent,var(--cyan));text-decoration:none;
  border-bottom:1px solid currentColor;padding-bottom:2px;opacity:.85;
}
.item .links a:hover{opacity:1}

/* ---------- footer ---------- */
.site-foot{
  border-top:1px solid rgba(120,190,220,.12);
  padding:44px 40px 60px;margin-top:20px;
}
.site-foot>*{max-width:var(--w);margin-left:auto;margin-right:auto}
.f-name{
  margin:0;font-family:var(--disp);font-size:10px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--ink);
}
.f-links{margin:14px 0 0;display:flex;flex-wrap:wrap;gap:8px 20px;font-size:13px}
.f-links a{color:var(--cyan);text-decoration:none;border-bottom:1px solid rgba(90,214,255,.25)}
.f-note{margin:20px 0 0;font-size:11.5px;line-height:1.8;color:#33454f;max-width:52ch}

/* ---------- responsive ---------- */
@media (max-width:720px){
  .site-head{padding:14px 20px;gap:14px}
  .site-head nav{gap:14px}
  .site-head nav a,.site-head nav button{font-size:7.5px;letter-spacing:.14em}
  .intro{padding:60px 20px 48px}
  .page{padding:36px 20px 52px}
  .cards{padding:0 20px 32px;gap:10px}
  .items{gap:36px}
  .item:has(.item-media){grid-template-columns:1fr;gap:16px}
  .item-media{max-width:280px}
  .site-foot{padding:34px 20px 48px}
}

/* ---------- print ---------- */
@media print{
  .site{--w:none;color:#000}
  .site-head,.intro .dl,.f-note,.item-media,.cards,.pager,.crumbs{display:none}
  .intro{padding:0 0 14pt;max-width:none}
  .intro h1{font-size:20pt;letter-spacing:.05em}
  .intro .tag{font-size:11pt;color:#222;margin-top:6pt}
  .intro .reach{font-size:9.5pt;color:#333;margin-top:8pt}
  .intro .reach a{color:#000;border:0}
  .page{max-width:none;padding:0 0 14pt}
  .page h1{font-size:13pt;color:#000;letter-spacing:.05em}
  .page .count{display:none}
  .items{gap:12pt}
  .item{break-inside:avoid;grid-template-columns:1fr !important}
  .item h3{font-size:11.5pt;color:#000}
  .item .meta{color:#555}
  .item p,.item li{color:#222;font-size:9.5pt;line-height:1.5;max-width:none}
  .item .tags span{border-color:#ccc;color:#333;font-size:7pt}
  .item .links a{color:#000;font-size:9pt}
  .site-foot{border-color:#bbb;padding:10pt 0 0;margin-top:10pt}
  .f-name{font-size:9pt}
  .f-links{font-size:9pt}
  .f-links a{color:#000;border:0}
}

/* ============================================================
   WEIGHT PASS — same reasoning as app.css.

   Body copy moves from Space Grotesk 300 to Manrope 500, which sets
   no wider, so every ch-based measure above holds. The small tracked
   Syncopate labels go to 700 because 400 at 7–8px is not a label
   anyone can read. Paragraph colour comes up off --dim, which was
   picked for labels rather than for prose.
   ============================================================ */
.site-head .brand,
.site-head nav a,
.site-head nav button,
.intro .dl a,
.card .c-h,
.card .c-n,
.card .c-go,
.crumbs,
.page .count,
.item .meta,
.item .parts span,
.item .tags span,
.item .links a,
.f-name{font-weight:var(--wt-label)}

/* The entry title leads its block, so it carries a little more than
   the copy under it. */
.item h3{font-weight:var(--wt-strong);color:#e3eef4}

/* Reading copy: --dim is a label colour and reads grey at 14px over a
   full paragraph. */
.intro .tag,
.item p,
.item li,
.card .c-list{color:var(--prose)}
.item .parts{color:#8ba1b0}

/* 7px of tracked bold needs slightly less air than 7px of tracked
   light did. */
.site-head nav a,
.site-head nav button{letter-spacing:.16em}
.item .meta{letter-spacing:.16em}

/* Print already sets its own dark-on-white weights; keep it light
   there, where thin strokes are not the problem. */
@media print{
  .site{font-weight:400}
  .item h3{font-weight:600;color:#111}
}

/* ============================================================
   MICRO LABELS — see the note in app.css.
   Syncopate above ~10px, Manrope below it.
   ============================================================ */
.site-head nav a,
.site-head nav button,
.intro .dl a,
.card .c-n,
.card .c-go,
.crumbs,
.page .count,
.item .meta,
.item .parts span,
.item .tags span,
.item .links a,
.pager a span{font-family:var(--micro);font-weight:700}

.site-head nav a,
.site-head nav button{font-size:9px;letter-spacing:.12em}
.intro .dl a{font-size:9px;letter-spacing:.14em}
.card .c-n{font-size:8px;letter-spacing:.14em}
.card .c-go{font-size:8.5px;letter-spacing:.16em}
.crumbs,.page .count{font-size:8.5px;letter-spacing:.14em}
.item .meta{font-size:8.5px;letter-spacing:.13em}
.item .parts span,
.item .tags span{font-size:8px;letter-spacing:.12em}

/* ============================================================
   PHONE PASS

   The header is a flex row with the brand at one end and eight
   links at the other. Below about 700px those links wrap, and a
   sticky header that is seven rows tall eats a third of the
   screen on every scroll. On a phone it becomes two rows: the
   name, then the sections as one horizontal scroller — the same
   shape the 3D site's bottom bar already uses.
   ============================================================ */
@media (max-width:720px){
  .site-head{
    flex-direction:column;align-items:stretch;gap:9px;
    padding:11px 20px 7px;
  }
  .site-head nav{
    flex-wrap:nowrap;overflow-x:auto;justify-content:flex-start;gap:15px;
    /* bleed to the edges so the first and last item can reach them */
    margin:0 -20px;padding:1px 20px 3px;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    /* fades at the cut, so it reads as scrollable rather than clipped */
    -webkit-mask-image:linear-gradient(90deg,#000 90%,transparent);
    mask-image:linear-gradient(90deg,#000 90%,transparent);
  }
  .site-head nav::-webkit-scrollbar{display:none}
  .site-head nav a,.site-head nav button{flex:0 0 auto;padding:2px 0}
  .site-head nav a,.site-head nav button{font-size:9px;letter-spacing:.1em}

  /* the intro was clearing a header three times this tall */
  .intro{padding:44px 20px 40px}

  /* a 210px media column and a 1fr text column do not both fit; the
     stacked photo then wants to be the width of the column it is in,
     not a 280px stamp beside nothing */
  .item-media{max-width:none}
  .item-media .mem{aspect-ratio:16/10}
  .item-media .mem.tall{aspect-ratio:4/3}

  .pager{gap:16px}
}

/* Very narrow: the résumé buttons stop being three-across long before
   the rest of the page runs out of room. */
@media (max-width:420px){
  .intro .dl{display:grid;grid-template-columns:1fr}
  .intro .dl a{text-align:center}
}
