/* site.css — generated by build.js. DO NOT EDIT BY HAND.
   Edit fonts.css, colors.css, sizes.css, styles.css, sections.css and re-run build.bat. */

/* ===== fonts.css ===== */
/* fonts.css — generated: Google Fonts @font-face rules, inlined so the
   browser starts downloading the fonts without first fetching a
   stylesheet from fonts.googleapis.com. The font files themselves still
   come from Google's CDN (fast). Regenerate with: build.bat --fonts */

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtGmSq17w.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtImSo.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtGmSq17w.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtImSo.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtGmSq17w.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: italic;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3ZmX5slCNuHLi8bLeY9MK7whWMhyjYrEtImSo.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKgS4.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtK.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKgS4.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtK.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYp3tKgS4.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Cormorant Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/cormorantgaramond/v21/co3bmX5slCNuHLi8bLeY9MK7whWMhyjYqXtK.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPx7cwhsk.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDbv2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKwBNntkaToggR7BYRbKPxDcwg.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJuktqQ4E.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJtEtq.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJuktqQ4E.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJtEtq.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJuktqQ4E.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJtEtq.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* latin-ext */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJuktqQ4E.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* latin */
@font-face {
  font-family: 'Outfit';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/outfit/v15/QGYvz_MVcBeNP4NJtEtq.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


/* ===== colors.css ===== */
/* ============================================================================
   COLORS — single source of truth for every visual color on the site
   ============================================================================
   Edit any value below and the entire site updates on save+refresh.
   Every other CSS file and React component reads from these CSS variables.

   Each color is a CSS custom property (a "variable"). To use a color in CSS:
       background: var(--lilac);
   To reference it in inline JSX styles:
       style={{ background: "var(--lilac)" }}

   Sections:
     1. Brand palette       — the headline colors (lilac, pink, peach, mint, sky)
     2. Day mode            — light, pastel surfaces & text
     3. Night mode          — deep lavender surfaces & soft glow text
     4. Deep-purple stops   — used in dark gradients (stream box, jam card, etc.)
     5. On-dark text        — text painted onto deep-purple backgrounds
     6. Polaroid pins       — colored pushpins on the gallery polaroids
     7. Special accents     — the twitch "LIVE" red dot, etc.
   ============================================================================ */

/* ─── 1. BRAND PALETTE (shared between day and night) ─────────────────────── */
:root {
  --lilac:        #b7a8ff;   /* main brand color */
  --lilac-deep:   #8a78e0;
  --lilac-pale:   #c9bcff;
  --pink:         #ffb6d2;
  --pink-hot:     #ff9ec7;
  --peach:        #ffd2a8;
  --peach-soft:   #ffeac0;
  --mint:         #b6ecd3;
  --sky:          #a8dcff;
  --cyan-glow:    #8be3ff;

  --sparkle-day-extra: #a08aff;  /* third sparkle color in day mode */
}


/* ─── 2. DAY MODE ─────────────────────────────────────────────────────────── */
:root, .theme-day {
  --bg:           #f5d2d2;   /* page background (very pale butter) */
  --bg-tint:      #fff2dc;
  --bg-warm:      #ffe8c8;
  --bg-mint:      #fff7d8;
  --bg-pink:      #ffeaf0;
  --surface:      #ffffff;   /* cards */
  --surface-2:    #fff6e6;   /* secondary cards / hover */
  --ink:          #292133;   /* main text */
  --ink-soft:     #6b4f5c;   /* softer text */
  --ink-mute:     #a08894;   /* muted text */
  --line:         #f7e3c6;   /* hairlines */
  --line-strong:  #ecb19a;   /* stronger hairlines */

  --accent:       var(--lilac);
  --accent-deep:  var(--lilac-deep);
  --accent-soft:  #fce8d2;

  /* sparkle-cursor colors (day) */
  --sparkle-a:    var(--lilac);
  --sparkle-b:    var(--pink);
  --sparkle-c:    var(--peach);

  /* sparkle-cursor inline palette (used at runtime by app.jsx) */
  --sparkle-cursor-1: var(--lilac-deep);
  --sparkle-cursor-2: var(--lilac);
  --sparkle-cursor-3: var(--sparkle-day-extra);

  color-scheme: light;
}


/* ─── 3. NIGHT MODE ───────────────────────────────────────────────────────── */
.theme-night {
  --bg:           #0f0a1f;
  --bg-tint:      #161033;
  --bg-warm:      #1a1138;
  --surface:      #18122e;
  --surface-2:    #221a40;
  --ink:          #efe8ff;
  --ink-soft:     #b9aee0;
  --ink-mute:     #786a9e;
  --line:         #2a2152;
  --line-strong:  #3d2f78;

  --accent:       var(--lilac-pale);
  --accent-deep:  var(--lilac);
  --accent-soft:  #2a205a;

  --sparkle-a:    var(--lilac-pale);
  --sparkle-b:    var(--pink-hot);
  --sparkle-c:    var(--cyan-glow);

  --sparkle-cursor-1: var(--lilac-pale);
  --sparkle-cursor-2: var(--pink-hot);
  --sparkle-cursor-3: var(--cyan-glow);

  --footer-bg:    #0a0716;   /* footer is deeper than the page bg at night */

  color-scheme: dark;
}
/* day footer matches page tint */
:root, .theme-day { --footer-bg: var(--bg-tint); }


/* ─── 4. DEEP-PURPLE STOPS (dark gradients used in both themes) ─────────── */
:root {
  --grad-purple-1:  #1d1638;
  --grad-purple-2:  #2a1f5a;
  --grad-purple-3:  #3d2f78;
  --grad-purple-4:  #2a205a;
  --grad-purple-5:  #221a40;
  --grad-purple-6:  #1c1538;
  --grad-pink-deep: #3a1f4a;
  --grad-blue-mid:  #5a3d7a;   /* mid-purple used inside SVG stream art */
}


/* ─── 5. ON-DARK TEXT ─────────────────────────────────────────────────────── */
:root {
  --on-dark:       #0f0a1f;   /* text on lilac buttons (night mode) */
  --on-pink-deep:  #4a1f3a;   /* text on the pink "stream community" chip */
}


/* ─── 6. POLAROID PIN COLORS ─────────────────────────────────────────────── */
:root {
  --pin-red-1:    #ff7a9a;
  --pin-red-2:    #c2335a;
  --pin-red-3:    #7a1b3b;
  --pin-lilac-1:  var(--lilac);
  --pin-lilac-2:  #6d57c4;
  --pin-lilac-3:  #2a2052;
  --pin-peach-1:  var(--peach);
  --pin-peach-2:  #c08240;
  --pin-peach-3:  #5a3a16;

  --polaroid-night-bg: #1a1432;
}


/* ─── 7. SPECIAL ACCENTS ─────────────────────────────────────────────────── */
:root {
  --live-red:     #ff5577;   /* twitch live indicator dot */

  /* project-card illustrations */
  --art-stroke:   #5a3d7a;   /* the dark purple outline on the project SVGs */
  --lilac-faint:  #e7daff;   /* the very pale lilac UI strip in the browser illustration */
}


/* ===== sizes.css ===== */
/* ============================================================================
   SIZES — single source of truth for every text size, spacing, and position
   ============================================================================
   Edit any value below and the entire site updates on save+refresh.
   styles.css and sections.css both reference these CSS variables.

   Most values use clamp(MIN, FLUID, MAX) so they scale smoothly with screen
   width — no media queries needed.
     MIN   = the smallest size (mobile)
     FLUID = how it grows with the viewport (vw = % of screen width)
     MAX   = the biggest size (desktop)
   Example: clamp(40px, 6vw, 84px) → never below 40px, never above 84px,
   in between it equals 6% of the screen width.

   Sections:
     1. Type scale           — every text size on the site
     2. Spacing              — page padding, section gaps, element margins
     3. Radii                — border-radius scale
     4. Nav                  — top bar
     5. Hero                 — title, portrait size & inset position
     6. About                — image, decorations, facts, paragraph
     7. Projects             — card, illustration, modal
     8. Streaming            — feature box, watch button, schedule, clips
     9. Press / Community    — dual cards, collab list, quotes
    10. Contact              — form, email line
    11. Gallery (polaroids)  — grid, photo, captions
    12. Footer               — mega wordmark, columns
    13. Floating widgets     — sound toggle, music toggle, keyboard hint
   ============================================================================ */


/* ─── 1. TYPE SCALE ────────────────────────────────────────────────────────── */
:root {
  /* base body text */
  --fs-body:           17px;
  --lh-body:           1.55;

  /* hero h1 (the giant top-of-page title) */
  --fs-hero:           clamp(44px, 7.2vw, 77px);
  --lh-hero:           1.02;

  /* section titles (the big italic h2 on each section) */
  --fs-section-title:  clamp(40px, 6vw, 100px);
  --lh-section-title:  1;

  /* lead paragraph (used under section titles) */
  --fs-lead:           clamp(18px, 1.5vw, 22px);

  /* about-section paragraphs */
  --fs-about-prose:    clamp(18px, 1.6vw, 22px);

  /* small/meta text */
  --fs-eyebrow:        13px;   /* small uppercase tags above titles */
  --fs-btn:            15px;   /* button label */
  --fs-chip:           13px;   /* pill-shaped chips */
  --fs-nav-link:       15px;   /* top nav links */
  --fs-kbd:            11px;   /* keyboard hint key */
  --fs-micro:          11px;   /* tiny mono labels, badges */
  --fs-mono-sm:        12px;   /* small mono text */
  --fs-mono-md:        13px;   /* medium mono text */
}


/* ─── 2. SPACING ──────────────────────────────────────────────────────────── */
:root {
  /* horizontal page padding (left/right gutter) */
  --pad-x:             clamp(20px, 5vw, 80px);

  /* vertical breathing room between sections */
  --section-y:         clamp(80px, 12vw, 160px);

  /* common gaps */
  --gap-xs:            8px;
  --gap-sm:            14px;
  --gap-md:            24px;
  --gap-lg:            32px;
  --gap-xl:            56px;
}


/* ─── 3. RADII ────────────────────────────────────────────────────────────── */
:root {
  --r-sm:              10px;
  --r-md:              18px;
  --r-lg:              28px;
  --r-xl:              44px;
}


/* ─── 4. NAV ──────────────────────────────────────────────────────────────── */
:root {
  --nav-pad-y:         18px;        /* top/bottom padding of the fixed nav bar */
  --nav-brand-fs:      24px;        /* "akynna" wordmark in the nav */
  --nav-brand-mark:    36px;        /* the round avatar mark next to it */
  --nav-brand-mark-fs: 18px;        /* letter inside the avatar mark (fallback) */
  --nav-gap:           28px;        /* gap between nav links */

  --toggle-w:          56px;        /* theme toggle pill width */
  --toggle-h:          30px;        /* theme toggle pill height */
  --toggle-knob:       22px;        /* the round knob inside the toggle */
}


/* ─── 5. HERO ─────────────────────────────────────────────────────────────── */
:root {
  --hero-pad-top:      140px;       /* space below nav before hero starts */
  --hero-pad-bot:      80px;
  --hero-grid-gap:     60px;        /* gap between text column and portrait */

  --hero-tag-fs:       14px;        /* "based in MTL" etc. pill text */
  --hero-tag-pad:      9px 16px;
  --hero-meta-gap:     14px;        /* gap between the hero pills */
  --hero-meta-mt:      28px;        /* space above the pills row */
  --hero-cta-gap:      14px;
  --hero-cta-mt:       36px;

  /* main portrait */
  --hero-portrait-max: 400px;       /* max width of the round portrait */

  /* the smaller "inset" portrait that floats in the corner */
  --hero-inset-w:      42%;         /* width relative to the main portrait */
  --hero-inset-bottom: -7%;         /* how far it pokes below */
  --hero-inset-right:  -7%;         /* how far it pokes to the right */
  --hero-inset-pad:    7px;         /* gradient ring thickness */
  --hero-inset-border: 4px;         /* outer page-colored ring */

  /* labels handwritten on/near the portrait */
  --portrait-label-fs: 27px;
  --portrait-label-pad:4px 14px;

  /* tiny orbit-style mono tags */
  --orbit-tag-fs:      17px;
  --orbit-tag-pad:     9px 15px;

  /* scroll cue at the bottom of the hero */
  --scroll-cue-bottom: 40px;
  --scroll-cue-fs:     12px;
  --scroll-cue-line-h: 40px;
}


/* ─── 6. ABOUT ────────────────────────────────────────────────────────────── */
:root {
  --about-grid-gap:    80px;        /* gap between photo and prose */
  --about-img-sticky:  100px;       /* how far below the viewport top the photo sticks */

  --about-stat-fs:     clamp(44px, 6vw, 92px);   /* the giant "8y" number on the photo */
  --about-sig-fs:      22px;        /* handwritten signature on the photo */
  --about-sig-offset:  22px;        /* its top/right distance */


  --about-badge-fs:    11px;        /* "studied 2y at..." ribbon */
  --about-badge-pad:   8px 18px;
  --about-badge-top:   -22px;

  --about-float-fs:    12px;        /* small floating mono tags around the photo */
  --about-float-pad:   7px 12px;

  --about-it-fs:       1.1em;       /* italic accent words inside paragraphs */

  /* facts grid below the prose */
  --facts-gap:         16px;
  --facts-mt:          40px;
  --fact-pad:          22px;
  --fact-num-fs:       48px;        /* the big italic number */
  --fact-lbl-fs:       14px;
}


/* ─── 7. PROJECTS ─────────────────────────────────────────────────────────── */
:root {
  --proj-head-mb:      8px;         /* space below the projects header */
  --proj-grid-gap:     28px;
  --proj-pad:          28px;        /* inner padding of each card */
  --proj-min-h:        420px;       /* min height of each card */
  --proj-art-h:        200px;       /* height of the illustration on each card */
  --proj-art-mb:       24px;
  --proj-title-fs:     32px;
  --proj-desc-fs:      15px;

  /* case-study modal that pops up when you click a card */
  --modal-max-w:       880px;
  --modal-pad:         40px;
  --modal-close-size:  36px;

  /* itch.io / game jams promo card */
  --jam-pad:           40px 44px;
  --jam-pad-sm:        32px;
  --jam-h3-fs:         clamp(28px, 3.4vw, 46px);
  --jam-link-fs:       14px;
  --jam-r-h:           220px;       /* right-side decorative stack height */
  --jam-r-h-sm:        200px;
  --jam-tile-w:        130px;
  --jam-tile-h:        160px;
}


/* ─── 8. STREAMING ────────────────────────────────────────────────────────── */
:root {
  --stream-grid-gap:   32px;

  --stream-title-fs:   28px;        /* h3 in the feature box */
  --stream-sub-fs:     14px;
  --stream-title-pad:  24px;        /* its bottom/left padding from feature edge */

  --watch-btn-size:    80px;        /* the round play button on the stream feature */

  /* schedule card on the right */
  --sched-pad:         24px;
  --sched-h4-fs:       22px;
  --sched-h4-mb:       16px;
  --sched-day-fs:      13px;
  --sched-time-fs:     15px;

  /* clip thumbnails row */
  --clips-gap:         20px;
  --clips-mt:          32px;
  --clip-title-fs:     15px;
  --clip-views-fs:     12px;
  --clip-play-size:    28px;
}


/* ─── 9. PRESS / COMMUNITY (dual cards) ──────────────────────────────────── */
:root {
  --dual-gap:          40px;
  --dual-gap-sm:       32px;
  --dual-pad:          36px;
  --dual-head-mb:      28px;
  --dual-tag-fs:       11px;
  --dual-tag-pad:      6px 12px;
  --dual-h-fs:         clamp(28px, 3.2vw, 40px);

  /* collaborators list */
  --collab-row-pad-y:  18px;
  --collab-row-gap:    18px;
  --collab-name-fs:    24px;
  --collab-role-fs:    11px;
  --collab-note-fs:    14px;

  /* stream community quotes */
  --quote-gap:         16px;
  --quote-pad:         18px 20px;
  --quote-fs:          17px;
  --quote-who-fs:      11px;
  --quote-mark-fs:     42px;
}


/* ─── 10. CONTACT ─────────────────────────────────────────────────────────── */
:root {
  --contact-gap:       60px;
  --contact-p-fs:      18px;
  --contact-email-fs:  28px;
  --contact-email-mt:  28px;

  /* form card */
  --form-pad:          32px;
  --form-gap:          16px;
  --field-label-fs:    12px;
  --field-input-pad:   14px 16px;
  --field-input-fs:    15px;
  --textarea-min-h:    120px;

  --topic-chip-fs:     14px;
  --topic-chip-pad:    9px 16px;

  --form-success-pad:  32px;
  --form-success-check:56px;
  --form-success-h-fs: 28px;
}


/* ─── 11. GALLERY (polaroids) ────────────────────────────────────────────── */
:root {
  --gallery-stage-pad: 56px 32px 40px;
  --gallery-stage-pad-sm: 56px 16px 32px;

  --gallery-ribbon-fs:  11px;
  --gallery-ribbon-pad: 9px 22px;

  --polaroid-gap:       32px 24px;
  --polaroid-gap-sm:    28px 18px;
  --polaroid-grid-pad:  28px 8px 12px;
  --polaroid-grid-pad-sm: 22px 4px 4px;
  --polaroid-pad:       12px 12px 0;

  --pin-size:           14px;       /* the round pushpin at the top */
  --polaroid-glyph-fs:  56px;       /* the big ✿ symbol on the placeholder */
  --polaroid-cap-fs:    15px;
  --polaroid-cap-r-fs:  11px;
  --polaroid-placeholder-fs: 10px;

  --gallery-foot-fs:    12px;
  --gallery-foot-mt:    18px;
}


/* ─── 12. FOOTER ──────────────────────────────────────────────────────────── */
:root {
  --footer-pad:         80px var(--pad-x) 32px;
  --footer-grid-gap:    40px;
  --footer-brand-fs:    64px;        /* the "akynna" wordmark at the top of the footer */
  --footer-col-h-fs:    12px;        /* column heading */
  --footer-col-a-fs:    15px;        /* column links */
  --footer-bottom-fs:   13px;
  --footer-bottom-mt:   60px;

  --footer-mega-fs:     clamp(120px, 22vw, 280px);   /* gigantic background "akynna" */
}


/* ─── 13. FLOATING WIDGETS ───────────────────────────────────────────────── */
:root {
  --sound-toggle-size:  44px;        /* round sound on/off button bottom-left */
  --music-toggle-h:     44px;
  --music-toggle-left:  80px;
  --music-wave-h:       14px;

  --kb-hint-pad:        12px 16px;
  --kb-hint-fs:         12px;

  --section-head-mb:    8px;
  --section-head-r-fs:  14px;
}


/* ===== styles.css ===== */
/* ===========================================================
   akynna — typography, motion, base styles
   (COLORS → colors.css · SIZES & SPACING → sizes.css)
   =========================================================== */

:root {
  /* type families */
  --font-display: "Cormorant Garamond", "Playfair Display", Georgia, serif;
  --font-sans: "Outfit", "Manrope", system-ui, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, monospace;

  /* motion */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
}

/* -------- DAY shadows + glow -------- */
:root, .theme-day {
  --glow: 0 0 0 rgba(0,0,0,0);
  --shadow-sm: 0 2px 6px rgba(94, 71, 165, 0.08);
  --shadow-md: 0 12px 32px -12px rgba(94, 71, 165, 0.22);
  --shadow-lg: 0 40px 80px -30px rgba(94, 71, 165, 0.35);
}

/* -------- NIGHT shadows + glow -------- */
.theme-night {
  --glow: 0 0 24px rgba(183, 168, 255, 0.45);
  --shadow-sm: 0 0 12px rgba(183, 168, 255, 0.12);
  --shadow-md: 0 0 32px rgba(183, 168, 255, 0.18);
  --shadow-lg: 0 0 80px rgba(183, 168, 255, 0.28);
}

/* -------- reset / base -------- */
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  font-feature-settings: "ss01", "cv11";
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  transition: background-color 600ms var(--ease-out), color 600ms var(--ease-out);
  position: relative;
}

/* soft pastel washes behind everything (day) */
body::before {
  content: "";
  position: fixed; inset: 0;
  pointer-events: none;
  z-index: 0;
  background:
    radial-gradient(1100px 900px at 5% 0%, color-mix(in oklab, var(--bg-pink) 85%, transparent), transparent 60%),
    radial-gradient(1000px 900px at 100% 8%, color-mix(in oklab, var(--bg-tint) 90%, transparent), transparent 60%),
    radial-gradient(1200px 1000px at 8% 50%, color-mix(in oklab, var(--bg-mint) 70%, transparent), transparent 55%),
    radial-gradient(1100px 1000px at 100% 60%, color-mix(in oklab, var(--bg-warm) 75%, transparent), transparent 55%),
    radial-gradient(900px 800px at 40% 100%, color-mix(in oklab, var(--bg-pink) 75%, transparent), transparent 60%),
    radial-gradient(900px 800px at 90% 100%, color-mix(in oklab, var(--bg-tint) 80%, transparent), transparent 60%);
  opacity: var(--bg-wash-opacity, 0.95);
  transition: opacity 600ms var(--ease-out);
}
.theme-night body::before,
html.theme-night body::before { opacity: 0; }

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; cursor: pointer; }

/* selection */
::selection { background: var(--accent); color: var(--on-dark); }
.theme-night ::selection { background: var(--accent-deep); color: var(--on-dark); }

/* scrollbar */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 999px; }

/* Generic image helper — used wherever a content image replaces a placeholder
   (project cards, modal cover, stream feature, clip thumbnails, polaroids).
   Fills the parent box, crops cleanly, and inherits its rounded corners. */
.img-fill {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: inherit;
  display: block;
}

/* =========================================================
   layout primitives
   ========================================================= */
.wrap { max-width: 1320px; margin: 0 auto; padding: 0 var(--pad-x); }
.wrap-tight { max-width: 1080px; margin: 0 auto; padding: 0 var(--pad-x); }

section { position: relative; padding: var(--section-y) 0; z-index: 1; }

/* eyebrow */
.eyebrow {
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--font-mono);
  font-size: var(--fs-eyebrow); letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-soft);
}
.eyebrow::before {
  content: ""; width: 24px; height: 1px;
  background: currentColor; opacity: 0.6;
}

/* display heading */
.display {
  font-family: var(--font-display);
  font-weight: 500;
  font-style: italic;
  letter-spacing: -0.01em;
  line-height: 0.95;
  margin: 0;
  text-wrap: balance;
}
.display em { font-style: normal; }
.display .lil {
  font-style: italic;
  color: var(--accent-deep);
  font-size: 0.6em;
  position: relative;
  top: -0.2em;
  margin-right: 0.05em;
  letter-spacing: -0.02em;
}

h2.section-title {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--fs-section-title);
  line-height: var(--lh-section-title);
  margin: 16px 0 var(--gap-xl);
  letter-spacing: -0.015em;
}
h2.section-title .it { font-style: italic; color: var(--accent-deep); }

/* paragraph */
.lead {
  font-size: var(--fs-lead);
  color: var(--ink-soft);
  max-width: 56ch;
  text-wrap: pretty;
}

/* buttons */
.btn {
  display: inline-flex; align-items: center; gap: 10px;
  background: var(--ink);
  color: var(--bg);
  padding: 14px 22px;
  border: none;
  border-radius: 999px;
  font-weight: 500;
  font-size: var(--fs-btn);
  letter-spacing: 0.01em;
  transition: transform 220ms var(--ease-out), background 220ms, box-shadow 220ms, color 220ms;
  position: relative;
  overflow: hidden;
}
.theme-night .btn { background: var(--accent-deep); color: var(--on-dark); box-shadow: var(--glow); }
.btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
.btn-ghost {
  background: transparent;
  color: var(--ink);
  border: 1px solid var(--line-strong);
}
.theme-night .btn-ghost { color: var(--ink); border-color: var(--line-strong); box-shadow: none; }
.btn-ghost:hover { background: var(--surface-2); }

/* chips / tags */
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 13px;
  border-radius: 999px;
  background: var(--accent-soft);
  color: var(--ink);
  font-size: var(--fs-chip);
  font-family: var(--font-mono);
  letter-spacing: 0.03em;
}

/* card */
.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  transition: transform 320ms var(--ease-out), box-shadow 320ms, border-color 320ms;
}
.card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
  border-color: var(--line-strong);
}
.theme-night .card:hover { box-shadow: 0 0 40px rgba(183, 168, 255, 0.18); }

/* glow ring (night) */
.glow-ring {
  position: relative;
  isolation: isolate;
}
.theme-night .glow-ring::before {
  content: "";
  position: absolute; inset: -1px;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(135deg, rgba(183,168,255,0.6), rgba(255,158,199,0.4), rgba(139,227,255,0.4));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor; mask-composite: exclude;
  pointer-events: none;
  opacity: 0.7;
}

/* divider line */
.divider {
  height: 1px;
  background: var(--line);
  width: 100%;
}

/* underline link */
.ulink {
  position: relative;
  display: inline-block;
}
.ulink::after {
  content: "";
  position: absolute; left: 0; right: 0; bottom: -3px;
  height: 1px; background: currentColor;
  transform: scaleX(1); transform-origin: right;
  transition: transform 360ms var(--ease-out);
}
.ulink:hover::after { transform: scaleX(0); transform-origin: left; }

/* shimmer */
@keyframes shimmer { from { background-position: 0% 50%; } to { background-position: 200% 50%; } }
.shimmer {
  background: linear-gradient(90deg, var(--accent-deep), var(--pink), var(--peach), var(--accent-deep));
  background-size: 200% 100%;
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
  animation: shimmer 8s linear infinite;
}
.theme-night .shimmer {
  background: linear-gradient(90deg, var(--lilac), var(--pink-hot), var(--cyan-glow), var(--lilac));
  background-size: 200% 100%;
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
}

/* sparkles */
.sparkle {
  position: absolute;
  pointer-events: none;
  width: 14px; height: 14px;
  background: radial-gradient(circle, var(--sparkle-a) 0%, transparent 60%);
  filter: blur(0.3px);
}
.sparkle.s2 { background: radial-gradient(circle, var(--sparkle-b) 0%, transparent 60%); }
.sparkle.s3 { background: radial-gradient(circle, var(--sparkle-c) 0%, transparent 60%); }

@keyframes drift {
  0%, 100% { transform: translateY(0) rotate(0deg); opacity: 0.6; }
  50% { transform: translateY(-14px) rotate(180deg); opacity: 1; }
}
.float { animation: drift 7s ease-in-out infinite; }

/* blob backgrounds */
.blob {
  position: absolute;
  border-radius: 50%;
  filter: blur(80px);
  opacity: 0.55;
  pointer-events: none;
  z-index: 0;
}
.theme-night .blob { opacity: 0.35; filter: blur(100px); }

/* reveal — fade + rise + subtle scale as elements scroll into view */
.reveal {
  opacity: 0;
  transform: translateY(26px) scale(0.99);
  transition: opacity 760ms var(--ease-out), transform 760ms var(--ease-out);
  will-change: opacity, transform;
}
.reveal.in { opacity: 1; transform: none; }
/* directional variants for a richer, layered scroll feel */
.reveal-l { transform: translateX(-34px); }
.reveal-r { transform: translateX(34px); }
.reveal-l.in, .reveal-r.in { transform: none; }
/* respect users who prefer reduced motion — show everything immediately */
@media (prefers-reduced-motion: reduce) {
  .reveal, .reveal-l, .reveal-r { transition: none; opacity: 1; transform: none; }
}

/* keyboard hint key */
.kbd {
  display: inline-grid; place-items: center;
  min-width: 22px; height: 22px; padding: 0 6px;
  border-radius: 6px;
  border: 1px solid var(--line-strong);
  background: var(--surface-2);
  font-family: var(--font-mono);
  font-size: var(--fs-kbd);
  color: var(--ink-soft);
}

/* utility */
.col { display: flex; flex-direction: column; }
.row { display: flex; }
.grow { flex: 1; }
.center { display: grid; place-items: center; }
.muted { color: var(--ink-mute); }
.softc { color: var(--ink-soft); }


/* ===== sections.css ===== */
/* ===========================================================
   akynna — section styles
   =========================================================== */

/* =================== NAV =================== */
.nav {
  position: fixed; top: 0; left: 0; right: 0;
  z-index: 50;
  padding: var(--nav-pad-y) var(--pad-x);
  display: flex; align-items: center; justify-content: space-between;
  transition: backdrop-filter 300ms, background 300ms;
}
.nav.scrolled {
  background: color-mix(in oklab, var(--bg) 78%, transparent);
  backdrop-filter: blur(16px) saturate(140%);
  -webkit-backdrop-filter: blur(16px) saturate(140%);
  border-bottom: 1px solid var(--line);
}
.brand {
  display: flex; align-items: center; gap: 12px;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--nav-brand-fs);
  letter-spacing: -0.01em;
}
.brand-mark {
  width: var(--nav-brand-mark); height: var(--nav-brand-mark);
  border-radius: 50%;
  background: linear-gradient(135deg, var(--lilac), var(--pink));
  display: grid; place-items: center;
  color: white;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--nav-brand-mark-fs);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
}
.brand-mark img { width: 100%; height: 100%; object-fit: cover; }

.nav-links {
  display: flex; align-items: center; gap: var(--nav-gap);
  font-size: var(--fs-nav-link);
  font-weight: 500;
}
.nav-links a {
  color: var(--ink-soft);
  transition: color 200ms;
  position: relative;
}
.nav-links a:hover { color: var(--ink); }
.nav-links a.active { color: var(--ink); }
.nav-links a.active::before {
  content: "✦";
  position: absolute;
  left: -14px; top: 50%;
  transform: translateY(-50%);
  font-size: 10px;
  color: var(--accent-deep);
}

@media (max-width: 760px) {
  .nav-links a:not(.toggle-wrap) { display: none; }
}

/* theme toggle */
.theme-toggle {
  width: var(--toggle-w); height: var(--toggle-h);
  border-radius: 999px;
  background: var(--surface-2);
  border: 1px solid var(--line-strong);
  padding: 3px;
  display: flex; align-items: center;
  position: relative;
  cursor: pointer;
  transition: background 300ms;
}
.theme-toggle .knob {
  width: var(--toggle-knob); height: var(--toggle-knob);
  border-radius: 50%;
  background: var(--accent-deep);
  display: grid; place-items: center;
  color: var(--bg);
  font-size: 12px;
  transition: transform 380ms var(--ease-out), background 300ms;
  box-shadow: var(--shadow-sm);
}
.theme-night .theme-toggle .knob {
  transform: translateX(26px);
  box-shadow: var(--glow);
}

/* language pill (EN · FR) */
.lang-toggle {
  display: inline-flex;
  align-items: center;
  height: var(--toggle-h);
  padding: 3px;
  border-radius: 999px;
  background: var(--surface-2);
  border: 1px solid var(--line-strong);
  gap: 2px;
}
.lang-toggle .lang-opt {
  appearance: none;
  border: 0;
  background: transparent;
  color: var(--ink-soft);
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.1em;
  padding: 0 10px;
  height: calc(var(--toggle-h) - 8px);
  border-radius: 999px;
  cursor: pointer;
  transition: color 200ms, background 300ms;
}
.lang-toggle .lang-opt:hover { color: var(--ink); }
.lang-toggle .lang-opt.on {
  background: var(--accent-deep);
  color: var(--bg);
  box-shadow: var(--shadow-sm);
}
.theme-night .lang-toggle .lang-opt.on { box-shadow: var(--glow); }

@media (max-width: 760px) {
  .lang-toggle .lang-opt { padding: 0 8px; font-size: 10px; }
}

/* =================== HERO =================== */
.hero {
  min-height: 100vh;
  padding-top: var(--hero-pad-top);
  padding-bottom: var(--hero-pad-bot);
  display: flex; align-items: center;
  position: relative;
  overflow: hidden;
}
.hero-grid {
  display: grid;
  grid-template-columns: 1fr 0.95fr;
  gap: var(--hero-grid-gap);
  align-items: center;
  width: 100%;
  position: relative; z-index: 2;
}
@media (max-width: 920px) {
  .hero-grid { grid-template-columns: 1fr; gap: 40px; }
}
.hero h1 {
  font-size: var(--fs-hero);
  line-height: var(--lh-hero);
}
.hero h1 .line { display: block; }
.hero h1 .line + .line { margin-top: 0.05em; }
.hero h1 .amp {
  font-style: italic;
  color: var(--accent-deep);
  font-weight: 400;
}
.hero-meta {
  display: flex; flex-wrap: wrap; gap: var(--hero-meta-gap);
  margin-top: var(--hero-meta-mt);
}
.hero-tag {
  display: inline-flex; align-items: center; gap: 8px;
  padding: var(--hero-tag-pad);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 999px;
  font-size: var(--hero-tag-fs);
  color: var(--ink-soft);
}
.hero-tag .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent-deep); }
.hero-tag .dot.live { background: var(--live-red); box-shadow: 0 0 0 4px rgba(255,85,119,0.18); animation: pulse 1.6s infinite; }
@keyframes pulse { 0%, 100% { box-shadow: 0 0 0 4px rgba(255,85,119,0.18); } 50% { box-shadow: 0 0 0 8px rgba(255,85,119,0.04); } }

.hero-cta { display: flex; align-items: center; gap: 9px; margin-top: var(--hero-cta-mt); flex-wrap: wrap; }
/* keep the two secondary buttons together so they wrap as a pair if ever needed */
.hero-cta-group { display: flex; gap: 9px; flex-wrap: wrap; }
/* compact the hero buttons so all three fit side by side on one desktop line */
.hero-cta .btn { padding: 11px 15px; font-size: 13px; white-space: nowrap; }
.hero-cta .btn-ghost { gap: 7px; }
.hero-cta .btn svg { width: 15px; height: 15px; flex: 0 0 auto; }
@media (max-width: 380px) { .hero-cta-group { width: 100%; } }

.hero-portrait {
  position: relative;
  aspect-ratio: 1;
  max-width: var(--hero-portrait-max);
  margin-left: auto;
  border-radius: var(--r-xl);
  overflow: visible;
}
.hero-portrait .frame {
  position: relative;
  width: 100%; height: 100%;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--lilac) 0%, var(--pink) 50%, var(--peach) 100%);
  display: grid; place-items: center;
  box-shadow:
    0 0 0 1px rgba(255,255,255,0.6) inset,
    0 30px 80px -20px rgba(183,168,255,0.55),
    0 0 90px rgba(255,182,210,0.55),
    0 0 140px rgba(183,168,255,0.45);
  overflow: hidden;
  animation: heroHalo 7s ease-in-out infinite;
}
@keyframes heroHalo {
  0%, 100% {
    box-shadow:
      0 0 0 1px rgba(255,255,255,0.6) inset,
      0 30px 80px -20px rgba(183,168,255,0.55),
      0 0 90px rgba(255,182,210,0.55),
      0 0 140px rgba(183,168,255,0.45);
  }
  50% {
    box-shadow:
      0 0 0 1px rgba(255,255,255,0.7) inset,
      0 30px 80px -20px rgba(183,168,255,0.7),
      0 0 110px rgba(255,182,210,0.7),
      0 0 170px rgba(183,168,255,0.55);
  }
}
.theme-night .hero-portrait .frame {
  background: linear-gradient(135deg, var(--grad-purple-2) 0%, var(--grad-purple-3) 50%, var(--grad-purple-1) 100%);
  box-shadow: 0 0 100px rgba(183,168,255,0.45);
  animation: heroHaloNight 7s ease-in-out infinite;
}
@keyframes heroHaloNight {
  0%, 100% { box-shadow: 0 0 100px rgba(183,168,255,0.45); }
  50%      { box-shadow: 0 0 140px rgba(183,168,255,0.65), 0 0 60px rgba(255,158,199,0.35); }
}
.hero-portrait .frame img {
  width: 92%; height: 92%;
  object-fit: cover;
  border-radius: 50%;
  position: relative;
  z-index: 2;
}

/* dual portrait: main + smaller inset */
.hero-portrait.dual .frame-main {
  position: relative;
  width: 100%; height: 100%;
}
.hero-portrait.dual .frame-main img {
  width: 100%; height: 100%;
  object-fit: cover;
  border-radius: 50%;
}
.hero-portrait.dual .frame-inset {
  position: absolute;
  bottom: var(--hero-inset-bottom);
  right: var(--hero-inset-right);
  width: var(--hero-inset-w);
  height: auto;
  aspect-ratio: 1 / 1;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--lilac), var(--pink));
  padding: var(--hero-inset-pad);
  display: grid; place-items: center;
  box-shadow: var(--shadow-md);
  z-index: 5;
  border: var(--hero-inset-border) solid var(--bg);
  animation: floatY 6s ease-in-out infinite;
  box-sizing: border-box;
}
.theme-night .hero-portrait.dual .frame-inset {
  background: linear-gradient(135deg, var(--grad-purple-3), var(--grad-purple-2));
  border-color: var(--surface);
  box-shadow: 0 0 32px rgba(183,168,255,0.5);
}
.hero-portrait.dual .frame-inset img {
  width: 100%; height: 100%;
  object-fit: cover;
  border-radius: 50%;
}
@keyframes floatY { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }

/* The two "tim" / "akynna" name tags. Styled to pop more than the decorative
   mono orbit tags: bolder display font, vivid gradient fill, white text and a
   soft glowing ring so they read as the hero's identity badges. */
.portrait-label {
  position: absolute;
  z-index: 6;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 600;
  font-size: var(--portrait-label-fs);
  color: #fff;
  border: 2px solid var(--surface);
  border-radius: 12px;          /* rounded-rectangle sticker — distinct from the round orbit tags */
  padding: 5px 16px;
  white-space: nowrap;
}
.portrait-label.main-label {
  top: 36%; left: -14%;
  transform: rotate(-10deg);
  background: linear-gradient(135deg, var(--lilac-deep), var(--pink-hot));
  box-shadow: var(--shadow-md), 0 0 0 4px color-mix(in oklab, var(--lilac) 35%, transparent);
}
.portrait-label.inset-label {
  bottom: -2%; right: -10%;
  transform: translate(40%, 40%) rotate(8deg);
  background: linear-gradient(135deg, var(--pink-hot), var(--peach));
  box-shadow: var(--shadow-md), 0 0 0 4px color-mix(in oklab, var(--pink-hot) 35%, transparent);
}
.theme-night .portrait-label {
  border-color: color-mix(in oklab, var(--surface) 70%, transparent);
  box-shadow: var(--glow), 0 0 22px rgba(255,158,199,0.4);
}

.orbit {
  position: absolute;
  inset: -8%;
  border-radius: 50%;
  border: 1px dashed var(--line-strong);
  animation: spin 60s linear infinite;
  opacity: 0.6;
}
.orbit.o2 { inset: -16%; animation-duration: 90s; animation-direction: reverse; opacity: 0.35; }
@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

.orbit-tag {
  position: absolute;
  z-index: 7;                  /* sit on top of the portrait + inset chibi */
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  padding: var(--orbit-tag-pad);
  font-size: var(--orbit-tag-fs);
  font-family: var(--font-mono);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
  white-space: nowrap;
}
.theme-night .orbit-tag {
  background: var(--surface-2);
  box-shadow: 0 0 18px rgba(183,168,255,0.25);
}

/* Interactive tags (those with a `funny` field in content.js) — wiggle and
   swap to a joke text on hover/focus/tap. */
.orbit-tag.is-interactive {
  cursor: pointer;
  user-select: none;
  transition:
    transform   260ms var(--ease-out),
    background  220ms var(--ease-out),
    border-color 220ms var(--ease-out),
    color       220ms var(--ease-out),
    box-shadow  220ms var(--ease-out);
}
.orbit-tag.is-interactive:focus { outline: none; }
.orbit-tag.is-interactive.is-open {
  background: var(--accent-soft);
  border-color: var(--accent-deep);
  color: var(--accent-deep);
  box-shadow: 0 10px 28px rgba(183,168,255,0.45);
  transform: translateX(var(--shift, 0px)) scale(1.10);
  animation: orbit-tag-wiggle 520ms var(--ease-out);
}
.theme-night .orbit-tag.is-interactive.is-open {
  box-shadow: 0 0 26px rgba(183,168,255,0.55);
}
@keyframes orbit-tag-wiggle {
  0%   { transform: translateX(var(--shift, 0px)) scale(1)    rotate(0deg); }
  18%  { transform: translateX(var(--shift, 0px)) scale(1.18) rotate(-8deg); }
  36%  { transform: translateX(var(--shift, 0px)) scale(1.10) rotate(6deg); }
  54%  { transform: translateX(var(--shift, 0px)) scale(1.14) rotate(-4deg); }
  72%  { transform: translateX(var(--shift, 0px)) scale(1.08) rotate(3deg); }
  100% { transform: translateX(var(--shift, 0px)) scale(1.10) rotate(0deg); }
}

.scroll-cue {
  position: absolute;
  bottom: var(--scroll-cue-bottom); left: 50%;
  transform: translateX(-50%);
  font-family: var(--font-mono);
  font-size: var(--scroll-cue-fs);
  letter-spacing: 0.2em;
  color: var(--ink-mute);
  display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.scroll-cue .line-down {
  width: 1px; height: var(--scroll-cue-line-h);
  background: linear-gradient(to bottom, var(--accent-deep), transparent);
  animation: drop 2s ease-in-out infinite;
}
@keyframes drop { 0%, 100% { transform: scaleY(0.3); transform-origin: top; opacity: 0.5; } 50% { transform: scaleY(1); opacity: 1; } }

/* =================== ABOUT =================== */
.about .section-head { gap: 8px; margin-bottom: 12px; }
.about .section-head h2.section-title { margin: 2px 0 8px; }

.about-grid {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: var(--about-grid-gap);
  align-items: start;
}
@media (max-width: 860px) {
  .about-grid { grid-template-columns: 1fr; gap: 40px; }
}
.about-img {
  position: sticky; top: var(--about-img-sticky);
  aspect-ratio: 3 / 4;
  border-radius: var(--r-lg);
  background: linear-gradient(160deg, var(--lilac) 0%, var(--pink) 100%);
  overflow: hidden;
  position: relative;
}
.theme-night .about-img {
  background: linear-gradient(160deg, var(--grad-purple-2), var(--grad-purple-1));
}
.about-img .av {
  position: absolute; bottom: 0; left: 50%;
  transform: translateX(-50%);
  width: 80%;
  z-index: 2;
}
.about-img .av-real {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 1;
}
.about-img .av-real + * { position: relative; z-index: 3; }
.about-img::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 50%, rgba(34, 26, 58, 0.4) 100%);
  z-index: 2;
  pointer-events: none;
}
.about-stat {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--about-stat-fs);
  line-height: 1;
  color: rgba(255,255,255,0.65);
  position: absolute;
  bottom: 14px;
  left: 0; right: 0;
  text-align: center;
  pointer-events: none;
  z-index: 4;
  letter-spacing: -0.02em;
  text-shadow: 0 4px 24px rgba(34, 26, 58, 0.35);
}
.theme-night .about-stat { color: rgba(255,255,255,0.5); }

/* fancy decorations around the about photo */
.about-img { isolation: isolate; }
.about-img::before {
  content: "";
  position: absolute;
  inset: -14px;
  border: 1px dashed var(--line-strong);
  border-radius: calc(var(--r-lg) + 14px);
  pointer-events: none;
  z-index: 5;
  opacity: 0.65;
}
.theme-night .about-img::before { opacity: 0.35; }

/* curved badge with ribbon copy around the photo (top) */
.about-badge {
  position: absolute;
  top: var(--about-badge-top); left: 50%;
  transform: translateX(-50%) rotate(-2deg);
  background: var(--ink);
  color: var(--bg);
  font-family: var(--font-mono);
  font-size: var(--about-badge-fs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: var(--about-badge-pad);
  border-radius: 999px;
  white-space: nowrap;
  z-index: 7;
  box-shadow: var(--shadow-md);
  overflow: hidden;
  max-width: 88%;
}
.theme-night .about-badge { background: var(--accent-deep); color: var(--on-dark); box-shadow: var(--glow); }
.about-badge-inner {
  display: inline-block;
  white-space: nowrap;
  animation: ribbonScroll 22s linear infinite;
}
@keyframes ribbonScroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

/* handwritten signature on the photo */
.about-sig {
  position: absolute;
  top: var(--about-sig-offset); right: var(--about-sig-offset);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--about-sig-fs);
  color: rgba(255,255,255,0.9);
  z-index: 5;
  transform: rotate(-6deg);
  text-shadow: 0 2px 12px rgba(0,0,0,0.35);
  letter-spacing: 0.01em;
}

/* small handwritten float tags around the photo */
.about-float {
  position: absolute;
  font-family: var(--font-mono);
  font-size: var(--about-float-fs);
  letter-spacing: 0.06em;
  padding: var(--about-float-pad);
  border-radius: 999px;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
  z-index: 6;
  animation: floatY 6s ease-in-out infinite;
  white-space: nowrap;
}
.theme-night .about-float { background: var(--surface-2); }
.about-float-1 { top: 38%; right: -22px; transform: rotate(6deg); animation-delay: 0s; }
.about-float-2 { bottom: 22%; left: -28px; transform: rotate(-6deg); animation-delay: 1.2s; }
.about-float-3 { top: 16%; left: -18px; transform: rotate(-10deg); animation-delay: 2.4s; color: var(--accent-deep); }

@media (max-width: 860px) {
  .about-float-1 { right: -10px; }
  .about-float-2 { left: -10px; }
  .about-float-3 { left: -10px; top: 8%; }
}

.about-prose p {
  font-size: var(--fs-about-prose);
  line-height: 1.55;
  color: var(--ink-soft);
  margin: 0 0 24px;
  text-wrap: pretty;
}
.about-prose p .hl { color: var(--ink); font-weight: 500; }
.about-prose p .it { font-family: var(--font-display); font-style: italic; color: var(--accent-deep); font-size: var(--about-it-fs); }

/* framed highlight around the "mon intention" statement */
.about-prose p .intent-frame {
  display: block;
  margin-top: 12px;
  padding: 14px 20px 14px 22px;
  border-left: 4px solid var(--accent-deep);
  border-radius: 4px 16px 16px 4px;
  background: linear-gradient(
    105deg,
    color-mix(in oklab, var(--accent) 24%, var(--surface)) 0%,
    color-mix(in oklab, var(--accent) 6%, var(--surface)) 60%,
    transparent 100%);
}

.facts {
  display: grid;
  grid-template-columns: repeat(4, 1fr);   /* unfolded full-width row below the grid */
  gap: var(--facts-gap);
  margin-top: var(--facts-mt);
}
@media (max-width: 640px) {
  .facts { grid-template-columns: repeat(2, 1fr); }   /* fall back on narrow screens */
}
.fact {
  padding: var(--fact-pad);
  border-radius: var(--r-md);
  background: var(--surface);
  border: 1px solid var(--line);
}
.fact .num {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fact-num-fs);
  line-height: 1;
  color: var(--accent-deep);
}
.fact .lbl {
  font-size: var(--fact-lbl-fs);
  color: var(--ink-soft);
  margin-top: 8px;
}

/* =================== ABOUT — JOURNEY TIMELINE =================== */
/* The About column is narrower (.wrap-tight) than the rest of the site, so the
   timeline breaks out to the full site width and re-centres in the viewport —
   using margins only, so the reveal transform stays intact. */
.timeline {
  margin-top: 40px;
  --tl-w: min(1140px, calc(100vw - 2 * var(--pad-x)));
  width: var(--tl-w);
  margin-left: calc((100% - var(--tl-w)) / 2);
  /* the two career colours: soft light purple (dev) vs Twitch purple (stream) */
  --tl-dev: #b3a1f2;
  --tl-dev-ink: var(--accent-deep);
  --tl-stream: #9146ff;
}
.timeline-top {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px 24px;
  margin-bottom: 10px;
}
.timeline-heading {
  font-family: var(--font-mono);
  text-transform: uppercase;
  font-weight: 500;
  font-size: 0.95rem;
  letter-spacing: 0.06em;
  color: var(--accent-deep);
}
/* legend: which coloured line is which career */
.tl-legend { display: flex; gap: 18px; }
.tl-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}
.tl-legend-dot { width: 11px; height: 11px; border-radius: 50%; }
.tl-legend-dev    .tl-legend-dot { background: var(--tl-dev); }
.tl-legend-stream .tl-legend-dot { background: var(--tl-stream); }
/* viewport holds the track + the two nav arrows; the side padding is the
   gutter the arrows live in, so they never overlap the timeline line. */
.timeline-viewport { position: relative; padding: 0 52px; }
@media (max-width: 560px) { .timeline-viewport { padding: 0 40px; } }

/* horizontal track — scrolls sideways via the arrows or by grabbing it; never
   vertically. touch-action keeps the browser's native horizontal swipe (with
   momentum) on mobile while still letting a vertical swipe scroll the page. */
.timeline-track {
  position: relative;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;            /* firefox */
  -ms-overflow-style: none;         /* old edge */
  touch-action: pan-x pan-y;
  cursor: grab;
  overscroll-behavior-x: contain;   /* no back-swipe navigation at the ends */
}
.timeline-track::-webkit-scrollbar { display: none; }   /* chrome / safari */
/* mid-drag: closed fist, no text selection, and bubbles stay down so they
   don't flash past under the cursor while the track slides. */
.timeline-track.is-dragging,
.timeline-track.is-dragging .tl2-card,
.timeline-track.is-dragging .tl2-dot { cursor: grabbing; user-select: none; }
.timeline-track.is-dragging .tl2-card:hover .tl2-bubble {
  opacity: 0;
  visibility: hidden;
}

/* fixed-size canvas everything is absolutely placed on */
.tl2 { position: relative; }

/* period spans — dev hugs just above the axis, stream just below, so two
   overlapping periods read as both colours straddling the line. */
.tl2-span {
  position: absolute;
  height: 6px;
  border-radius: 999px;
  z-index: 1;
}
.tl2-span-dev    { background: var(--tl-dev); }
.tl2-span-stream { background: var(--tl-stream); }
/* their labels sit just outside the dots (dev above, stream below) */
.tl2-span-lbl {
  position: absolute;
  transform: translateX(-50%);
  white-space: nowrap;
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.02em;
  z-index: 2;
}
.tl2-span-lbl-dev    { color: var(--tl-dev-ink); }
.tl2-span-lbl-stream { color: var(--tl-stream); }

/* short connector stem from a node out to its card — tinted to its career */
.tl2-stem {
  position: absolute;
  width: 2px;
  transform: translateX(-50%);
  z-index: 1;
}
.tl2-stem-dev    { background: var(--tl-dev); }
.tl2-stem-stream { background: var(--tl-stream); }

/* node — a small circle carrying the event's emoji, sitting on the axis */
.tl2-dot {
  position: absolute;
  width: 24px; height: 24px;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  display: grid; place-items: center;
  font-size: 12px; line-height: 1;
  background: var(--surface);
  border: 2px solid var(--tl-dev);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--tl-dev) 26%, transparent);
  cursor: pointer;
  z-index: 3;
}
.tl2-dot-stream {
  border-color: var(--tl-stream);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--tl-stream) 22%, transparent);
}

/* event card branching off the lane (up for dev, down for stream) */
.tl2-card {
  position: absolute;
  width: 108px;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  cursor: pointer;
  z-index: 2;
}
.tl2-card:hover, .tl2-card.is-pinned { z-index: 7; }   /* lift above neighbours when its bubble is up */
.tl2-card:focus-visible { outline: none; }
.tl2-card:focus-visible .tl2-title { text-decoration: underline; }
.tl2-card-up { flex-direction: column-reverse; }   /* year ends up nearest the line */
.tl2-year {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 0.72rem;
  white-space: nowrap;             /* keep "Décembre 2023" on one line */
  color: var(--tl-dev-ink);
}
.tl2-card-down .tl2-year { color: var(--tl-stream); }
.tl2-card-down .tl2-year { margin-bottom: 2px; }
.tl2-card-up   .tl2-year { margin-top: 2px; }
.tl2-title {
  font-family: var(--font-mono);
  font-weight: 500;
  text-transform: uppercase;
  font-size: 0.71rem;
  line-height: 1.2;
  letter-spacing: 0.03em;
  color: var(--ink);
  margin-top: 4px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* description speech bubble — hidden until the card is hovered or pinned */
.tl2-bubble {
  position: absolute;
  left: 50%;
  width: max-content;
  /* wider than the card so long descriptions wrap to 3 lines instead of 5 —
     the track clips vertically, so bubble height is the budget here. */
  min-width: 110px;
  max-width: 172px;
  padding: 9px 12px;
  border-radius: 16px;
  background: var(--surface);
  border: 2px solid var(--line-strong);
  box-shadow: var(--shadow-md);
  color: var(--ink-soft);
  font-size: 0.72rem;
  line-height: 1.45;
  text-align: center;
  text-wrap: balance;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  z-index: 8;
  transition: opacity 200ms var(--ease-out), transform 200ms var(--ease-out);
}
/* dev cards open upward, stream cards downward */
.tl2-card-up   .tl2-bubble { bottom: calc(100% + 11px); transform: translateX(-50%) translateY(6px) scale(0.96); }
.tl2-card-down .tl2-bubble { top: calc(100% + 11px);    transform: translateX(-50%) translateY(-6px) scale(0.96); }
.tl2-card:hover .tl2-bubble,
.tl2-card:focus-visible .tl2-bubble,
.tl2-card.is-pinned .tl2-bubble {
  opacity: 1;
  visibility: visible;
  transform: translateX(-50%) translateY(0) scale(1);
}
/* a little tail pointing back to the event */
.tl2-bubble::after {
  content: "";
  position: absolute;
  left: 50%;
  width: 12px; height: 12px;
  background: var(--surface);
  border: 2px solid var(--line-strong);
  transform: translateX(-50%) rotate(45deg);
}
.tl2-card-up   .tl2-bubble::after { bottom: -6px; border-top: none;    border-left: none;  }  /* points down */
.tl2-card-down .tl2-bubble::after { top: -6px;    border-bottom: none; border-right: none; }  /* points up */
/* pinned bubbles get an accent edge so it's clear they're "kept open" */
.tl2-card.is-pinned .tl2-bubble-dev    { border-color: var(--tl-dev); }
.tl2-card.is-pinned .tl2-bubble-dev::after    { border-color: var(--tl-dev); }
.tl2-card.is-pinned .tl2-bubble-stream { border-color: var(--tl-stream); }
.tl2-card.is-pinned .tl2-bubble-stream::after { border-color: var(--tl-stream); }

/* side navigation arrows — tall carousel-style pills in the gutters, centred
   on the lane stack, tinted in the brand accent. */
.tl-arrow {
  position: absolute;
  transform: translateY(-50%);
  z-index: 4;
  width: 34px; height: 76px;
  display: grid; place-items: center;
  border-radius: 14px;
  border: none;
  background: var(--accent-soft);
  color: var(--accent-deep);
  box-shadow: var(--shadow-md);
  cursor: pointer;
  transition: background 200ms, color 200ms, opacity 220ms, transform 200ms var(--ease-out);
}
.tl-arrow:hover {
  background: var(--accent-deep);
  color: var(--bg);
  transform: translateY(-50%) scale(1.06);
}
.theme-night .tl-arrow { background: var(--surface-2); }
.theme-night .tl-arrow:hover { background: var(--accent-deep); color: var(--on-dark); }
.tl-arrow svg { width: 20px; height: 20px; }
.tl-arrow-l { left: 0; }
.tl-arrow-r { right: 0; }
.tl-arrow-l svg { transform: scaleX(-1); }   /* flip the right-pointing arrow */
.tl-arrow.is-hidden { opacity: 0; pointer-events: none; }

/* =================== PROJECTS =================== */
.projects-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 4px 40px;            /* tiny vertical gap when title + subtitle stack */
  margin-bottom: var(--proj-head-mb);
  flex-wrap: wrap;
}
/* --- featured / upcoming project spotlight -------------------------------- */
/* One project pulled out of the grid and given the middle of the section to
   itself: screenshots on the left, the pitch + launch CTA on the right. */
.feat-project {
  position: relative;
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: 34px;
  align-items: center;
  margin-bottom: var(--proj-grid-gap, 28px);
  padding: 30px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line-strong);
  background:
    linear-gradient(135deg,
      color-mix(in oklab, var(--lilac) 34%, var(--surface)) 0%,
      color-mix(in oklab, var(--pink)  26%, var(--surface)) 52%,
      color-mix(in oklab, var(--peach) 24%, var(--surface)) 100%);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
@media (max-width: 900px) {
  .feat-project { grid-template-columns: 1fr; gap: 26px; padding: 22px; }
}

.feat-media {
  position: relative;
  display: block;              /* definite width for the frame's % sizing */
  padding: 6px 0;
}
.feat-media > svg { width: 60%; height: auto; margin: 0 auto; display: block; }

/* phone mockup — the screenshots are from a mobile game, so they're shown in
   a device frame with its own island + side buttons. */
.phone-showcase { width: 100%; display: flex; flex-direction: column; align-items: center; gap: 16px; }
/* the frame plus the gutters its prev/next arrows sit in */
.phone-stage {
  position: relative;
  width: 100%;
  display: flex;
  justify-content: center;
}
.phone-nav {
  width: 38px; height: 38px;
  z-index: 3;
}
.phone-nav svg { width: 16px; height: 16px; }
.phone-nav-prev { left: 0; }
.phone-nav-prev svg { transform: rotate(180deg); }
.phone-nav-next { right: 0; }
@media (max-width: 420px) {
  /* no room for outside gutters — tuck the arrows over the bezel */
  .phone-nav-prev { left: -6px; }
  .phone-nav-next { right: -6px; }
}
.phone-frame {
  position: relative;
  width: min(250px, 70%);
  max-width: 100%;
  flex: none;
  padding: 9px;
  border-radius: 42px;
  background: linear-gradient(155deg, #3a3155 0%, #1b1630 46%, #0f0c1c 100%);
  box-shadow:
    0 26px 60px rgba(34, 26, 58, 0.38),
    0 2px 0 rgba(255, 255, 255, 0.18) inset,
    0 0 0 1.5px rgba(255, 255, 255, 0.12) inset;
}
.phone-screen {
  position: relative;
  width: 100%;
  /* matches the screenshots' own ratio, so nothing gets cropped and the
     frame's height follows from the artwork instead of a guessed device size */
  aspect-ratio: 375 / 670;
  border-radius: 34px;
  overflow: hidden;
  background: #06050c;
}
.phone-shot {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 620ms var(--ease-out);
}
.phone-shot.on { opacity: 1; }
/* dynamic-island style pill */
.phone-island {
  position: absolute;
  top: 10px; left: 50%;
  transform: translateX(-50%);
  width: 32%; height: 16px;
  border-radius: 999px;
  background: #06050c;
  z-index: 2;
}
/* side buttons */
.phone-btn {
  position: absolute;
  width: 3px;
  border-radius: 3px;
  background: linear-gradient(180deg, rgba(255,255,255,0.28), rgba(255,255,255,0.08));
}
.phone-btn-power  { right: -2px; top: 27%; height: 11%; }
.phone-btn-vol-up { left: -2px;  top: 20%; height: 7%;  }
.phone-btn-vol-dn { left: -2px;  top: 29%; height: 7%;  }

.phone-dots { display: flex; justify-content: center; gap: 8px; }
.phone-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  border: 1px solid var(--line-strong);
  background: transparent;
  cursor: pointer;
  padding: 0;
  transition: background 220ms, transform 220ms var(--ease-out);
}
.phone-dot.on { background: var(--accent-deep); border-color: var(--accent-deep); transform: scale(1.15); }

.feat-body { position: relative; z-index: 2; }
.feat-top { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.feat-status {
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-size: 0.68rem;
  color: var(--bg);
  background: var(--ink);
  border-radius: 999px;
  padding: 5px 11px;
  white-space: nowrap;
}
.theme-night .feat-status { background: var(--accent-deep); color: var(--on-dark); }
.feat-title {
  font-family: var(--font-display);
  font-size: clamp(34px, 4.6vw, 58px);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin: 12px 0 8px;
}
.feat-tagline {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.15rem;
  color: var(--accent-deep);
  margin: 0 0 14px;
  text-wrap: pretty;
}
.feat-desc {
  margin: 0;
  color: var(--ink-soft);
  font-size: 1rem;
  line-height: 1.6;
  text-wrap: pretty;
  max-width: 54ch;
}
.feat-points {
  list-style: none;
  margin: 18px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 9px;
}
.feat-points li {
  display: grid;
  grid-template-columns: 22px 1fr;
  gap: 10px;
  align-items: start;
  color: var(--ink);
  font-size: 0.94rem;
  line-height: 1.45;
  text-wrap: pretty;
}
.feat-point-icon { font-size: 15px; line-height: 1.45; }
.feat-tags { margin-top: 18px; }
.feat-cta { margin-top: 24px; }
.feat-stores-label {
  display: block;
  margin-bottom: 10px;
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.72rem;
  color: var(--ink-soft);
}
/* official store badges — Apple's and Google's own artwork, so no restyling
   beyond size. Google's asset ships with built-in clear space, hence the
   larger height + negative margins that make both buttons read the same. */
.store-badges { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.store-badge { display: inline-flex; transition: transform 220ms var(--ease-out); }
.store-badge:hover { transform: translateY(-2px); }
.store-badge img { display: block; width: auto; }
.store-badge-apple  img { height: 44px; }
.store-badge-google img { height: 65px; margin: -10.5px -9px; }
.feat-meta {
  display: block;
  margin-top: 16px;
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.68rem;
  color: var(--ink-mute);
}

.proj-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--proj-grid-gap);
}
@media (max-width: 800px) { .proj-grid { grid-template-columns: 1fr; } }

/* The "VR / past work" career card spans the full grid width. On desktop it
   lays the art and meta side-by-side so the wide banner doesn't get a giant
   square of empty illustration. */
.proj.proj-wide {
  grid-column: 1 / -1;
  /* bolder gradient shade — lilac → pink → peach, blended with the surface so
     it's clearly visible while keeping text readable. */
  background:
    linear-gradient(135deg,
      color-mix(in oklab, var(--lilac) 42%, var(--surface)) 0%,
      color-mix(in oklab, var(--pink)  34%, var(--surface)) 48%,
      color-mix(in oklab, var(--peach) 44%, var(--surface)) 100%);
  border-color: var(--line-strong);
}
.theme-night .proj.proj-wide {
  background:
    linear-gradient(135deg,
      color-mix(in oklab, var(--lilac) 30%, var(--grad-purple-4)) 0%,
      var(--grad-purple-1) 50%,
      color-mix(in oklab, var(--pink-hot) 22%, var(--grad-purple-5)) 100%);
}
@media (min-width: 801px) {
  .proj.proj-wide {
    display: grid;
    grid-template-columns: minmax(320px, 0.85fr) 1.15fr;
    gap: 32px;
    align-items: center;
  }
  .proj.proj-wide .proj-art { height: 100%; min-height: var(--proj-art-h); margin-bottom: 0; }
  .proj.proj-wide .proj-meta { align-self: center; }
}

.proj {
  position: relative;
  padding: var(--proj-pad);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
  overflow: hidden;
  cursor: pointer;
  transition: transform 360ms var(--ease-out), box-shadow 360ms, border-color 360ms;
  min-height: var(--proj-min-h);
  display: flex; flex-direction: column; justify-content: space-between;
}
.proj:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-md);
  border-color: var(--line-strong);
}
.theme-night .proj:hover { box-shadow: 0 0 40px rgba(183,168,255,0.18); }

.proj-cover {
  position: absolute; inset: 0;
  background: linear-gradient(135deg, var(--accent-soft) 0%, transparent 60%);
  pointer-events: none;
  z-index: 0;
}
.proj.feat-pink .proj-cover { background: linear-gradient(135deg, var(--pink) 0%, var(--accent-soft) 50%, transparent 80%); opacity: 0.5; }
.proj.feat-peach .proj-cover { background: linear-gradient(135deg, var(--peach) 0%, var(--accent-soft) 50%, transparent 80%); opacity: 0.5; }
.proj.feat-mint .proj-cover { background: linear-gradient(135deg, var(--mint) 0%, var(--accent-soft) 50%, transparent 80%); opacity: 0.5; }
.proj.feat-sky .proj-cover { background: linear-gradient(135deg, var(--sky) 0%, var(--accent-soft) 50%, transparent 80%); opacity: 0.5; }
.theme-night .proj-cover { opacity: 0.18 !important; }

.proj-art {
  position: relative;
  height: var(--proj-art-h);
  border-radius: var(--r-md);
  margin-bottom: var(--proj-art-mb);
  overflow: hidden;
  background: var(--surface-2);
  display: grid; place-items: center;
  z-index: 1;
}
.proj-art svg { width: 70%; height: 70%; }

/* Collage preview for the career ("VR / past work") card — a tidy grid of each
   game's cover image instead of a single illustration. data-count sets the
   layout: 1 fills, 2 side-by-side, 3 = banner + two, 4 = 2x2. */
.proj-art-collage {
  position: absolute; inset: 0;
  display: grid;
  gap: 3px;
  width: 100%; height: 100%;
}
.proj-art-collage[data-count="1"] { grid-template-columns: 1fr; }
.proj-art-collage[data-count="2"] { grid-template-columns: 1fr 1fr; }
.proj-art-collage[data-count="3"],
.proj-art-collage[data-count="4"] { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; }
.proj-art-collage[data-count="3"] .collage-cell:first-child { grid-column: 1 / -1; }
.collage-cell { position: relative; overflow: hidden; }
.collage-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}

.proj-meta { position: relative; z-index: 1; }
.proj-title {
  font-family: var(--font-display);
  font-size: var(--proj-title-fs);
  font-weight: 500;
  line-height: 1.1;
  margin: 12px 0 8px;
}
.proj-title .it { font-style: italic; color: var(--accent-deep); }
.proj-desc { color: var(--ink-soft); font-size: var(--proj-desc-fs); margin: 0 0 16px; }
.proj-tags { display: flex; flex-wrap: wrap; gap: 6px; }

/* case study modal */
.modal-back {
  position: fixed; inset: 0;
  background: color-mix(in oklab, var(--bg) 60%, transparent);
  backdrop-filter: blur(8px);
  z-index: 100;
  display: grid; place-items: center;
  padding: 24px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 300ms;
}
.modal-back.open { opacity: 1; pointer-events: auto; }
.modal {
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-lg);
  max-width: var(--modal-max-w);
  width: 100%;
  max-height: 86vh;
  overflow-y: auto;
  padding: var(--modal-pad);
  box-shadow: var(--shadow-lg);
  transform: translateY(20px) scale(0.98);
  transition: transform 300ms var(--ease-out);
}
.modal-back.open .modal { transform: none; }

/* tiny floating lavender pill scrollbar — the track is kept well clear of
   the modal's rounded corners so all four corners read as round. the thumb
   itself is super thin (visible width = scrollbar width − 2 × transparent
   border) so it feels like a delicate floating pill rather than a rail. */
.modal {
  scrollbar-width: thin;
  scrollbar-color: var(--accent-deep) transparent;
}
.modal::-webkit-scrollbar {
  width: 14px;
}
.modal::-webkit-scrollbar-track {
  background: transparent;
  margin: calc(var(--r-lg) + 4px) 0;
}
.modal::-webkit-scrollbar-thumb {
  background-color: var(--accent-deep);
  border: 5px solid transparent;
  background-clip: padding-box;
  border-radius: 999px;
  min-height: 60px;
  transition: background-color 200ms;
}
.modal::-webkit-scrollbar-thumb:hover {
  background-color: var(--pink-hot);
  background-clip: padding-box;
}

.modal-close {
  position: absolute; top: 20px; right: 20px;
  width: var(--modal-close-size); height: var(--modal-close-size); border-radius: 50%;
  background: var(--surface-2); border: 1px solid var(--line);
  display: grid; place-items: center;
}
.modal-close:hover { background: var(--accent-soft); }
.modal-art {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--r-md);
  margin: 20px 0 32px;
  display: grid; place-items: center;
  overflow: hidden;
}

/* project image carousel (inside .modal-art) */
.carousel-backdrop {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  filter: blur(36px) saturate(1.4) brightness(0.95);
  transform: scale(1.12); /* hide the blurred edge bleed */
  z-index: 0;
  pointer-events: none;
  user-select: none;
}
.theme-night .carousel-backdrop { filter: blur(36px) saturate(1.2) brightness(0.7); }

.carousel-img {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: contain;          /* applies to <img>/<video> — iframes ignore it */
  z-index: 1;
  display: block;
  border: 0;
  background: transparent;
  animation: carousel-fade 320ms var(--ease-out);
}
/* video player chrome should sit above the blurred backdrop */
video.carousel-img { background: transparent; }
iframe.carousel-img { background: #000; }
@keyframes carousel-fade {
  from { opacity: 0; transform: scale(1.02); }
  to   { opacity: 1; transform: scale(1); }
}

.carousel-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 42px; height: 42px;
  border-radius: 50%;
  border: 1px solid var(--line-strong);
  background: color-mix(in oklab, var(--surface) 78%, transparent);
  backdrop-filter: blur(10px) saturate(140%);
  display: grid; place-items: center;
  cursor: pointer;
  color: var(--ink);
  z-index: 2;
  transition: background 200ms, color 200ms, transform 220ms var(--ease-out);
  box-shadow: var(--shadow-sm);
}
.carousel-btn svg { width: 18px; height: 18px; }
.carousel-btn:hover {
  background: var(--accent-deep);
  color: var(--bg);
  transform: translateY(-50%) scale(1.08);
}
.carousel-prev { left: 12px; }
.carousel-prev svg { transform: rotate(180deg); }
.carousel-next { right: 12px; }

.carousel-counter {
  position: absolute;
  top: 12px; right: 12px;
  background: color-mix(in oklab, var(--bg) 72%, transparent);
  backdrop-filter: blur(10px);
  border: 1px solid var(--line);
  padding: 5px 11px;
  border-radius: 999px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.1em;
  color: var(--ink-soft);
  z-index: 2;
}

.carousel-dots {
  position: absolute;
  bottom: 14px; left: 50%;
  transform: translateX(-50%);
  display: flex; gap: 8px;
  padding: 6px 10px;
  border-radius: 999px;
  background: color-mix(in oklab, var(--bg) 56%, transparent);
  backdrop-filter: blur(10px);
  z-index: 2;
}
.carousel-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  border: 0;
  background: color-mix(in oklab, var(--ink) 35%, transparent);
  cursor: pointer;
  padding: 0;
  transition: background 200ms, transform 220ms var(--ease-out);
}
.carousel-dot:hover { background: color-mix(in oklab, var(--accent-deep) 70%, transparent); }
.carousel-dot.on {
  background: var(--accent-deep);
  transform: scale(1.45);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--accent-deep) 25%, transparent);
}

@media (max-width: 560px) {
  .carousel-btn { width: 36px; height: 36px; }
  .carousel-btn svg { width: 14px; height: 14px; }
  .carousel-prev { left: 8px; } .carousel-next { right: 8px; }
}

/* CV timeline media — a single game screenshot (.tl-single-img) or, when a
   game has several, a compact slideshow box (.tl-carousel) reusing the
   .carousel-* chrome above but sized to the timeline thumbnail. */
.tl-single-img {
  display: block;
  max-width: min(680px, 100%);
  max-height: 400px;
  width: auto; height: auto;
  border-radius: 12px;
  margin: 14px 0 8px;
  border: 1px solid var(--line-strong);
}
.tl-carousel {
  position: relative;
  width: min(680px, 100%);
  aspect-ratio: 16 / 10;
  max-height: 440px;
  border-radius: 12px;
  margin: 14px 0 8px;
  border: 1px solid var(--line-strong);
  overflow: hidden;
  display: grid; place-items: center;
  background: var(--surface-2);
}
/* shrink the shared carousel chrome to fit the smaller timeline box */
.tl-carousel .carousel-btn { width: 40px; height: 40px; }
.tl-carousel .carousel-btn svg { width: 16px; height: 16px; }
.tl-carousel .carousel-prev { left: 10px; }
.tl-carousel .carousel-next { right: 10px; }
.tl-carousel .carousel-counter { top: 10px; right: 10px; padding: 4px 10px; font-size: 11px; }
.tl-carousel .carousel-dots { bottom: 10px; }

/* "+N" badge on project cards when the project has more than one image */
.proj-more {
  position: absolute;
  top: 10px; left: 10px;
  z-index: 1;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.05em;
  padding: 4px 9px;
  border-radius: 999px;
  background: color-mix(in oklab, var(--bg) 80%, transparent);
  backdrop-filter: blur(8px);
  border: 1px solid var(--line);
  color: var(--ink-soft);
  pointer-events: none;
}

/* =================== STREAMING =================== */
.stream-wrap {
  position: relative;
}
.stream-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: var(--stream-grid-gap);
  align-items: stretch;
}
@media (max-width: 880px) { .stream-grid { grid-template-columns: 1fr; } }

/* left column holds the big feature + the chat panel stacked vertically */
.stream-l {
  display: flex;
  flex-direction: column;
  gap: 16px;
  min-height: 100%;
}
.stream-l .stream-feature { flex: 0 0 auto; }

/* mini twitch-chat panel under the feature box */
.stream-chat {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px 18px 16px;
  border-radius: var(--r-md);
  background: var(--surface-2);
  border: 1px solid var(--line);
  font-family: var(--font-mono);
  font-size: 13px;
  line-height: 1.45;
  position: relative;
  overflow: hidden;
  min-height: 96px;
}
.stream-chat-head {
  display: flex; align-items: center; gap: 8px;
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.stream-chat-dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--live-red);
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--live-red) 22%, transparent);
  animation: pulse 1.6s infinite;
}
.stream-chat-msg {
  color: var(--ink);
  text-wrap: pretty;
  animation: chat-msg-fade 380ms var(--ease-out);
}
.stream-chat-user { font-weight: 600; }
.stream-chat-sep  { color: var(--ink-mute); margin: 0 6px 0 2px; }
.stream-chat-text { color: var(--ink-soft); }

/* twitch-style chat badges shown before the username */
.chat-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 17px; height: 17px;
  border-radius: 3px;
  font-size: 10px;
  line-height: 1;
  color: #fff;
  margin-right: 4px;
  vertical-align: -3px;
  font-family: var(--font-sans);
  font-style: normal;
}
.chat-badge-sub         { background: var(--lilac); }
.chat-badge-vip         { background: var(--pink-hot); }
.chat-badge-mod         { background: var(--mint); color: #1f2540; }
.chat-badge-founder     { background: var(--accent-deep); }
.chat-badge-prime       { background: var(--sky); }
.chat-badge-broadcaster { background: var(--live-red); }
.theme-night .chat-badge-mod { color: #1f2540; }

/* fallback-style emote chips appended at the end of a message */
.chat-emote {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 7px;
  border-radius: 4px;
  font-size: 11px;
  font-family: var(--font-mono);
  letter-spacing: 0;
  color: var(--accent-deep);
  background: color-mix(in oklab, var(--accent-deep) 12%, transparent);
  border: 1px solid color-mix(in oklab, var(--accent-deep) 30%, transparent);
  vertical-align: 1px;
}
.stream-chat-dots {
  position: absolute;
  bottom: 8px; right: 12px;
  display: flex; gap: 4px;
}
.stream-chat-tick {
  width: 5px; height: 5px;
  border-radius: 50%;
  background: color-mix(in oklab, var(--ink) 25%, transparent);
  transition: background 250ms, transform 250ms var(--ease-out);
}
.stream-chat-tick.on {
  background: var(--accent-deep);
  transform: scale(1.4);
}
@keyframes chat-msg-fade {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}

.stream-feature {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--r-lg);
  overflow: hidden;
  background: linear-gradient(135deg, var(--grad-purple-1), var(--grad-purple-2));
  border: 1px solid var(--line);
  box-shadow: var(--shadow-md);
}
.stream-feature .live-badge {
  position: absolute; top: 20px; left: 20px;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 15px;
  background: rgba(0,0,0,0.5);
  backdrop-filter: blur(8px);
  border-radius: 999px;
  color: white;
  font-size: var(--fs-mono-md);
  font-family: var(--font-mono);
  letter-spacing: 0.1em;
  z-index: 4;
}
.stream-feature .live-badge .live-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--live-red);
  box-shadow: 0 0 0 4px rgba(255,85,119,0.25);
  animation: pulse 1.6s infinite;
}
/* Offline VOD-preview variant of the corner pill — same chip shape as LIVE,
   minus the pulsing red dot since nothing is broadcasting. */
.stream-feature .live-badge.vod-badge {
  color: rgba(255,255,255,0.92);
}
.stream-feature .viewers {
  position: absolute; top: 20px; right: 20px;
  background: rgba(0,0,0,0.5); color: white;
  backdrop-filter: blur(8px);
  border-radius: 999px;
  padding: 9px 15px;
  font-size: var(--fs-mono-md);
  font-family: var(--font-mono);
  z-index: 4;
}
.stream-feature .stream-art {
  position: absolute; inset: 0;
  display: grid; place-items: center;
}
.stream-feature .stream-title {
  position: absolute; left: var(--stream-title-pad); bottom: var(--stream-title-pad); right: var(--stream-title-pad);
  color: white;
  z-index: 4;
}
.stream-feature .stream-title h3 {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--stream-title-fs);
  margin: 0 0 4px;
  font-weight: 500;
}
.stream-feature .stream-title p {
  margin: 0;
  font-size: var(--stream-sub-fs);
  color: rgba(255,255,255,0.7);
  font-family: var(--font-mono);
}
.stream-feature .watch-btn {
  position: absolute; left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  width: var(--watch-btn-size); height: var(--watch-btn-size);
  border-radius: 50%;
  background: rgba(255,255,255,0.16);
  backdrop-filter: blur(12px);
  border: 1px solid rgba(255,255,255,0.3);
  display: grid; place-items: center;
  color: white;
  z-index: 4;
  transition: transform 320ms var(--ease-out);
}
.stream-feature:hover .watch-btn { transform: translate(-50%, -50%) scale(1.08); background: rgba(255,255,255,0.24); }

/* Live mode — the static cover is replaced by the real twitch iframe. We
   drop the bottom title overlay (it would block the player's progress bar +
   chrome) and surface a small "open on twitch" pill bottom-right so viewers
   can pop the stream into a full tab. */
.stream-feature-live .stream-title { display: none; }
.stream-feature-live .watch-btn    { display: none; }
.stream-open-twitch {
  position: absolute; bottom: 20px; right: 20px;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 9px 15px;
  background: rgba(0,0,0,0.5);
  backdrop-filter: blur(8px);
  border-radius: 999px;
  color: white;
  text-decoration: none;
  font-size: var(--fs-mono-md);
  font-family: var(--font-mono);
  letter-spacing: 0.05em;
  z-index: 5;
  transition: background 220ms var(--ease-out), transform 220ms var(--ease-out);
}
.stream-open-twitch:hover { background: rgba(0,0,0,0.7); transform: translateY(-1px); }

/* schedule */
/* right column of the stream grid — stacks the optional banner above the
   weekly schedule. The reveal animation lives here so banner + schedule
   slide in together. */
.stream-r {
  display: flex;
  flex-direction: column;
  gap: 16px;
  min-height: 100%;
}
.schedule-banner {
  width: 100%;
  aspect-ratio: 5 / 2;        /* designed for 1200×480 art */
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-sm);
}
.schedule-banner img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}

.schedule {
  padding: var(--sched-pad);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
}
.schedule h4 {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--sched-h4-fs);
  margin: 0 0 var(--sched-h4-mb);
  font-weight: 500;
}
.schedule-row {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 0;
  border-bottom: 1px solid var(--line);
}
.schedule-row:last-child { border-bottom: none; }
.schedule-row.today { color: var(--accent-deep); font-weight: 500; }
.schedule-row .day {
  font-family: var(--font-mono);
  font-size: var(--sched-day-fs);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.schedule-row .time { font-size: var(--sched-time-fs); color: var(--ink-soft); }
.schedule-row.today .time { color: var(--accent-deep); }
.schedule-row.off .time { color: var(--ink-mute); font-style: italic; }

.clips-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  align-items: start;            /* let each card use its own aspect ratio */
  gap: var(--clips-gap);
  margin-top: var(--clips-mt);
}
@media (max-width: 920px) { .clips-row { grid-template-columns: 1fr 1fr; } }
@media (max-width: 440px) { .clips-row { grid-template-columns: 1fr; } }
.clip {
  position: relative;
  aspect-ratio: 9 / 13;
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--surface-2);
  cursor: pointer;
  border: 1px solid var(--line);
  transition: transform 320ms var(--ease-out);
}
.clip:hover { transform: translateY(-4px); }
.clip-art { position: absolute; inset: 0; }
.clip-art > video,
.clip-art > iframe {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  display: block;
  border: 0;
  object-fit: cover;          /* applies to <video>; iframes ignore it */
}
/* Fixed-size embeds (TikTok). The inner frame keeps the player's natural px
   size and is scaled down to the card width in JS — see ClipEmbedScaler. */
.clip-embed-scale { position: absolute; inset: 0; overflow: hidden; }
.clip-embed-frame {
  position: relative;
  transform-origin: top left;
}
.clip-embed-frame > iframe {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  display: block;
  border: 0;
}

/* Click-to-play poster for TikTok clips — the real iframe only mounts on click
   (see ClipCard). Loading several TikTok embeds at once makes the later ones
   render blank, so we show a thumbnail up front and load one player on demand. */
.clip-facade {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  margin: 0; padding: 0;
  border: 0;
  background: var(--surface-2);
  cursor: pointer;
  display: block;
}
.clip-facade > img { object-fit: cover; }
.clip-facade-blank { position: absolute; inset: 0; background: var(--surface-2); }
.clip-facade-play {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 56px; height: 56px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(0,0,0,0.5);
  color: #fff;
  backdrop-filter: blur(2px);
  transition: transform 220ms var(--ease-out), background 220ms var(--ease-out);
}
.clip-facade:hover .clip-facade-play,
.clip-facade:focus-visible .clip-facade-play {
  transform: translate(-50%, -50%) scale(1.08);
  background: var(--accent-deep);
}
.clip-facade-play svg { width: 20px; height: 20px; margin-left: 2px; }
.clip-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, transparent 35%, rgba(0,0,0,0.35) 65%, rgba(0,0,0,0.78) 100%);
  pointer-events: none;
}
.clip.clip-interactive { cursor: default; }

/* big circular play/pause overlay that sits in the middle of a video clip */
.clip-toggle {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%) scale(0.92);
  width: 60px; height: 60px;
  border-radius: 50%;
  border: 0;
  background: color-mix(in oklab, var(--bg) 68%, transparent);
  backdrop-filter: blur(10px) saturate(140%);
  display: grid; place-items: center;
  cursor: pointer;
  color: var(--ink);
  z-index: 3;
  opacity: 0;
  pointer-events: none;
  box-shadow: var(--shadow-md);
  transition: opacity 240ms var(--ease-out), transform 240ms var(--ease-out), background 200ms;
}
.clip-toggle.paused {
  opacity: 1;
  transform: translate(-50%, -50%) scale(1);
  pointer-events: auto;
}
.clip:hover .clip-toggle.playing {
  opacity: 0.85;
  transform: translate(-50%, -50%) scale(1);
  pointer-events: auto;
}
.clip-toggle:hover { background: var(--accent-deep); color: var(--bg); }
.clip-toggle svg { width: 22px; height: 22px; }

/* sound + volume pill — top-left of a video clip. Resting state is just a
   small circular icon; hovering the pill (or focusing inside it) expands it
   to reveal an inline volume slider. */
.clip-sound-wrap {
  position: absolute;
  top: 10px; left: 10px;
  z-index: 4;
  display: flex;
  align-items: center;
  gap: 0;
  height: 30px;
  padding: 0;
  border-radius: 999px;
  background: color-mix(in oklab, var(--bg) 70%, transparent);
  backdrop-filter: blur(10px) saturate(140%);
  border: 1px solid color-mix(in oklab, var(--line) 60%, transparent);
  overflow: hidden;
  transition: padding 240ms var(--ease-out), background 200ms;
}
.clip-sound-wrap:hover,
.clip-sound-wrap:focus-within { padding-right: 12px; }

.clip-sound {
  flex: 0 0 auto;
  width: 28px; height: 28px;
  border: 0; padding: 0;
  background: transparent;
  display: grid; place-items: center;
  cursor: pointer;
  color: var(--ink);
  transition: color 200ms;
}
.clip-sound:hover { color: var(--accent-deep); }
.clip-sound svg { width: 14px; height: 14px; }

.clip-volume {
  appearance: none;
  -webkit-appearance: none;
  flex: 0 0 0;
  width: 0;
  height: 4px;
  margin: 0;
  opacity: 0;
  background: transparent;
  cursor: pointer;
  transition: width 240ms var(--ease-out), opacity 200ms, margin 240ms var(--ease-out);
}
.clip-sound-wrap:hover .clip-volume,
.clip-sound-wrap:focus-within .clip-volume {
  width: 70px;
  margin-left: 6px;
  opacity: 1;
}
/* Slider track + thumb — lavender to match the rest of the site. */
.clip-volume::-webkit-slider-runnable-track {
  height: 4px;
  background: color-mix(in oklab, var(--ink) 22%, transparent);
  border-radius: 999px;
}
.clip-volume::-moz-range-track {
  height: 4px;
  background: color-mix(in oklab, var(--ink) 22%, transparent);
  border-radius: 999px;
}
.clip-volume::-webkit-slider-thumb {
  appearance: none; -webkit-appearance: none;
  width: 12px; height: 12px;
  margin-top: -4px;
  border-radius: 50%;
  background: var(--accent-deep);
  border: 2px solid var(--bg);
  box-shadow: 0 0 0 1px color-mix(in oklab, var(--accent-deep) 50%, transparent);
  cursor: pointer;
  transition: transform 180ms var(--ease-out);
}
.clip-volume::-webkit-slider-thumb:hover { transform: scale(1.15); }
.clip-volume::-moz-range-thumb {
  width: 12px; height: 12px;
  border-radius: 50%;
  background: var(--accent-deep);
  border: 2px solid var(--bg);
  cursor: pointer;
}

/* small "view original" link button — sits in the top-right of a clip card */
.clip-external {
  position: absolute;
  top: 10px; right: 10px;
  z-index: 4;
  width: 30px; height: 30px;
  border-radius: 50%;
  background: color-mix(in oklab, var(--bg) 70%, transparent);
  backdrop-filter: blur(10px) saturate(140%);
  border: 1px solid color-mix(in oklab, var(--line) 60%, transparent);
  display: grid; place-items: center;
  color: var(--ink);
  text-decoration: none;
  transition: background 200ms, color 200ms, transform 220ms var(--ease-out);
}
.clip-external:hover {
  background: var(--accent-deep);
  color: var(--bg);
  transform: scale(1.08);
}
.clip-external svg { width: 13px; height: 13px; }
/* TikTok/Instagram-style bottom-left text stack: @handle · caption · ♪ music.
   Becomes an <a> when `clip.link` is set, opening the original post. */
.clip-meta {
  position: absolute;
  left: 14px; right: 60px;   /* leave room for the right-side action stack */
  bottom: 14px;
  z-index: 2;
  color: #fff;
  text-shadow: 0 1px 6px rgba(0,0,0,0.55);
  display: flex; flex-direction: column;
  gap: 3px;
  text-decoration: none;
  transition: transform 220ms var(--ease-out), filter 200ms;
}
a.clip-meta { cursor: pointer; }
a.clip-meta:hover {
  filter: brightness(1.08);
  transform: translateY(-1px);
}
a.clip-meta:hover .clip-handle { text-decoration: underline; }
.clip-handle {
  font-family: var(--font-sans);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.01em;
}
.clip-caption {
  font-family: var(--font-sans);
  font-size: 12px;
  line-height: 1.35;
  color: rgba(255,255,255,0.95);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.clip-music {
  display: flex; align-items: center; gap: 6px;
  font-family: var(--font-sans);
  font-size: 11px;
  color: rgba(255,255,255,0.85);
  margin-top: 2px;
  max-width: 100%;
}
.clip-music-note {
  display: inline-block;
  animation: clip-music-spin 4.2s linear infinite;
  font-size: 13px;
  line-height: 1;
}
.clip-music-text {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
@keyframes clip-music-spin {
  0%, 100% { transform: rotate(-8deg); }
  50%      { transform: rotate(12deg); }
}
.clip-views {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.06em;
  color: rgba(255,255,255,0.7);
  margin-top: 2px;
}

/* Right-edge action stack (heart · comment · share) — same vibe as the
   floating buttons on the right of a TikTok feed. Heart toggles a local
   "liked" state; the other two open the clip's external link. */
.clip-actions {
  position: absolute;
  right: 10px; bottom: 16px;
  z-index: 3;
  display: flex; flex-direction: column;
  align-items: center;
  gap: 14px;
  color: #fff;
  text-shadow: 0 1px 4px rgba(0,0,0,0.55);
}
.clip-action {
  appearance: none;
  background: 0;
  border: 0;
  padding: 0;
  margin: 0;
  font: inherit;
  color: inherit;
  text-decoration: none;
  cursor: pointer;
  display: flex; flex-direction: column;
  align-items: center;
  gap: 2px;
  transition: transform 220ms var(--ease-out), filter 200ms;
}
.clip-action:hover { transform: scale(1.1); filter: brightness(1.1); }
.clip-action:active { transform: scale(0.96); }
.clip-action-static { cursor: default; }
.clip-action-static:hover { transform: none; filter: none; }
.clip-action-icon {
  width: 36px; height: 36px;
  display: grid; place-items: center;
  filter: drop-shadow(0 2px 6px rgba(0,0,0,0.4));
  transition: color 200ms;
}
.clip-action-icon svg { width: 22px; height: 22px; }
.clip-action-count {
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.02em;
}
/* "liked" heart — fills with TikTok-style hot pink and pulses once. */
.clip-action.is-liked .clip-action-icon {
  color: var(--pink-hot);
  animation: heart-pop 360ms var(--ease-out);
}
@keyframes heart-pop {
  0%   { transform: scale(1);   }
  40%  { transform: scale(1.45); }
  70%  { transform: scale(0.92); }
  100% { transform: scale(1);   }
}
.clip-play {
  position: absolute; top: 12px; right: 12px;
  width: var(--clip-play-size); height: var(--clip-play-size);
  border-radius: 50%;
  background: rgba(0,0,0,0.5);
  backdrop-filter: blur(6px);
  display: grid; place-items: center;
  color: white;
  z-index: 2;
}

/* =================== COLLABORATIONS & COMMUNITY (dual) =================== */
.dual-collab {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--dual-gap);
  align-items: start;
}
@media (max-width: 880px) { .dual-collab { grid-template-columns: 1fr; gap: var(--dual-gap-sm); } }

.dual-col {
  padding: var(--dual-pad);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
  position: relative;
  overflow: hidden;
}
.dual-col:first-child {
  background: linear-gradient(160deg, var(--surface) 0%, color-mix(in oklab, var(--accent-soft) 60%, var(--surface)) 100%);
}
.dual-col:last-child {
  background: linear-gradient(160deg, var(--surface) 0%, color-mix(in oklab, var(--bg-pink) 70%, var(--surface)) 100%);
}
.theme-night .dual-col:first-child {
  background: linear-gradient(160deg, var(--surface) 0%, var(--grad-purple-4) 100%);
}
.theme-night .dual-col:last-child {
  background: linear-gradient(160deg, var(--surface) 0%, var(--grad-pink-deep) 100%);
}

.dual-head { margin-bottom: var(--dual-head-mb); }
.dual-tag {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: var(--dual-tag-fs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: var(--dual-tag-pad);
  border-radius: 999px;
  background: var(--accent-deep);
  color: var(--bg);
  margin-bottom: 14px;
}
.theme-night .dual-tag { color: var(--on-dark); box-shadow: var(--glow); }
.dual-tag.pink { background: var(--pink); color: var(--on-pink-deep); }
.theme-night .dual-tag.pink { background: var(--pink-hot); box-shadow: 0 0 18px rgba(255, 158, 199, 0.5); }

.dual-h {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--dual-h-fs);
  line-height: 1.05;
  margin: 0;
  letter-spacing: -0.01em;
}
.dual-h .it { font-style: italic; color: var(--accent-deep); }

/* dev clients list */
.collab-list { display: flex; flex-direction: column; gap: 0; }
.collab-row {
  display: grid;
  grid-template-columns: 1.1fr 1.4fr;
  gap: var(--collab-row-gap);
  padding: var(--collab-row-pad-y) 0;
  border-bottom: 1px solid var(--line);
  align-items: start;
}
.collab-row:last-child { border-bottom: none; padding-bottom: 4px; }
.collab-row-name {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--collab-name-fs);
  font-weight: 500;
  line-height: 1.1;
  color: var(--ink);
}
.collab-row-role {
  font-family: var(--font-mono);
  font-size: var(--collab-role-fs);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--accent-deep);
  margin-top: 4px;
}
.collab-row-note {
  font-size: var(--collab-note-fs);
  color: var(--ink-soft);
  text-wrap: pretty;
  line-height: 1.45;
}

@media (max-width: 540px) {
  .collab-row { grid-template-columns: 1fr; gap: 6px; }
}

/* stream community quotes */
.stream-quotes { display: flex; flex-direction: column; gap: var(--quote-gap); }
.stream-quote {
  margin: 0;
  padding: var(--quote-pad);
  border-radius: var(--r-md);
  background: rgba(255,255,255,0.55);
  border: 1px solid var(--line);
  position: relative;
}
.theme-night .stream-quote { background: rgba(255,255,255,0.04); }
.stream-quote p {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--quote-fs);
  line-height: 1.4;
  margin: 0 0 10px;
  color: var(--ink);
  text-wrap: pretty;
}
.stream-quote::before {
  content: "“";
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--quote-mark-fs);
  line-height: 1;
  position: absolute;
  top: 6px; right: 14px;
  color: var(--pink);
  opacity: 0.7;
}
.theme-night .stream-quote::before { color: var(--pink-hot); }
.stream-quote-who {
  font-family: var(--font-mono);
  font-size: var(--quote-who-fs);
  letter-spacing: 0.08em;
  color: var(--ink-soft);
}

.causes {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px dashed var(--line-strong);
}
.causes-label {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin-bottom: 10px;
}
.causes-chips { display: flex; flex-wrap: wrap; gap: 8px; }

/* =================== CONTACT =================== */
.contact-wrap {
  display: grid;
  grid-template-columns: 0.9fr 1.1fr;
  gap: var(--contact-gap);
  align-items: start;
}
@media (max-width: 820px) { .contact-wrap { grid-template-columns: 1fr; } }

.contact-l h2 { margin-bottom: 24px; }
.contact-l p { color: var(--ink-soft); font-size: var(--contact-p-fs); max-width: 36ch; }
.contact-l .email-line {
  display: inline-flex; align-items: center; gap: 12px;
  margin-top: var(--contact-email-mt);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--contact-email-fs);
  border-bottom: 1px dashed var(--line-strong);
  padding-bottom: 4px;
}

.form {
  display: flex; flex-direction: column; gap: var(--form-gap);
  padding: var(--form-pad);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
}
.field { display: flex; flex-direction: column; gap: 6px; }
.field label {
  font-family: var(--font-mono);
  font-size: var(--field-label-fs);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.field input, .field textarea, .field select {
  background: var(--bg);
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  padding: var(--field-input-pad);
  color: var(--ink);
  font: inherit;
  font-size: var(--field-input-fs);
  transition: border-color 200ms, background 200ms;
}
.field input:focus, .field textarea:focus, .field select:focus {
  outline: none;
  border-color: var(--accent-deep);
  background: var(--surface-2);
}
.field textarea { min-height: var(--textarea-min-h); resize: vertical; }

.topic-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.topic-chip {
  padding: var(--topic-chip-pad);
  border-radius: 999px;
  border: 1px solid var(--line);
  background: var(--bg);
  font-size: var(--topic-chip-fs);
  cursor: pointer;
  color: var(--ink-soft);
  transition: all 200ms;
}
.topic-chip.on {
  background: var(--accent-deep);
  color: var(--bg);
  border-color: var(--accent-deep);
}
.theme-night .topic-chip.on { color: var(--on-dark); box-shadow: var(--glow); }

.form-success {
  padding: var(--form-success-pad);
  text-align: center;
  border-radius: var(--r-lg);
  background: linear-gradient(135deg, var(--accent-soft), var(--surface));
  border: 1px solid var(--line-strong);
}
.form-success .check {
  width: var(--form-success-check); height: var(--form-success-check);
  border-radius: 50%;
  background: var(--accent-deep);
  margin: 0 auto 16px;
  display: grid; place-items: center;
  color: var(--bg);
  font-size: 26px;
}
.form-success h4 { font-family: var(--font-display); font-style: italic; font-size: var(--form-success-h-fs); margin: 0 0 8px; font-weight: 500; }
.form-success p { color: var(--ink-soft); margin: 0; }

/* Error banner shown above the send button when FormSubmit returns an error
   (or the network fails). Sits inline so it doesn't push the layout too much. */
.form-error {
  padding: 12px 14px;
  border-radius: var(--r-md);
  background: color-mix(in oklab, var(--pink-hot) 18%, var(--surface));
  border: 1px solid color-mix(in oklab, var(--pink-hot) 60%, var(--line-strong));
  color: var(--ink);
  font-size: 14px;
  line-height: 1.45;
}
.theme-night .form-error {
  background: color-mix(in oklab, var(--pink-hot) 22%, var(--surface-2));
}

/* =================== FOOTER =================== */
footer {
  padding: var(--footer-pad);
  background: var(--footer-bg);
  border-top: 1px solid var(--line);
  position: relative;
  overflow: hidden;
}
.footer-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: var(--footer-grid-gap);
  align-items: start;
}
@media (max-width: 760px) { .footer-grid { grid-template-columns: 1fr 1fr; } }
.footer-brand h3 {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--footer-brand-fs);
  margin: 0 0 8px;
  font-weight: 500;
  line-height: 1;
}
.footer-brand p { color: var(--ink-soft); max-width: 30ch; margin: 0 0 20px; }
.footer-col h6 {
  font-family: var(--font-mono);
  font-size: var(--footer-col-h-fs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-mute);
  margin: 0 0 16px;
}
.footer-col a {
  display: block;
  padding: 4px 0;
  color: var(--ink-soft);
  font-size: var(--footer-col-a-fs);
  transition: color 200ms, transform 200ms;
}
.footer-col a:hover {
  color: var(--accent-deep);
  transform: translateX(4px);
}
.footer-bottom {
  display: flex; justify-content: space-between; align-items: center;
  margin-top: var(--footer-bottom-mt); padding-top: 24px;
  border-top: 1px solid var(--line);
  font-size: var(--footer-bottom-fs); color: var(--ink-mute);
  font-family: var(--font-mono);
  letter-spacing: 0.04em;
}
.footer-mega {
  position: absolute;
  bottom: -40px; right: -20px;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--footer-mega-fs);
  line-height: 0.85;
  color: var(--accent-soft);
  opacity: 0.6;
  pointer-events: none;
  white-space: nowrap;
}
.theme-night .footer-mega { color: var(--surface-2); opacity: 0.5; }

/* =================== CURSOR / SPARKLES =================== */
.cursor-sparkle {
  position: fixed;
  width: 8px; height: 8px;
  border-radius: 50%;
  pointer-events: none;
  z-index: 9999;
  background: radial-gradient(circle, var(--sparkle-a), transparent 70%);
  animation: csp 800ms ease-out forwards;
}
.theme-night .cursor-sparkle {
  mix-blend-mode: screen;
}
@keyframes csp {
  0% { transform: translate(-50%, -50%) scale(1); opacity: 1; }
  100% { transform: translate(-50%, -50%) scale(0.2) translateY(-30px); opacity: 0; }
}

/* confetti container */
.confetti-piece {
  position: fixed;
  top: -20px;
  width: 10px; height: 14px;
  z-index: 9998;
  pointer-events: none;
  border-radius: 2px;
}

/* keyboard hint */
.kb-hint {
  position: fixed;
  bottom: 24px; right: 24px;
  z-index: 40;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  padding: var(--kb-hint-pad);
  font-size: var(--kb-hint-fs);
  color: var(--ink-soft);
  display: flex; align-items: center; gap: 10px;
  box-shadow: var(--shadow-sm);
  transition: opacity 400ms, transform 400ms;
}
.kb-hint.hide { opacity: 0; transform: translateY(20px); pointer-events: none; }

/* sound toggle floating */
.sound-toggle {
  position: fixed;
  bottom: 24px; left: 24px;
  z-index: 40;
  width: var(--sound-toggle-size); height: var(--sound-toggle-size);
  border-radius: 50%;
  background: var(--surface);
  border: 1px solid var(--line);
  display: grid; place-items: center;
  color: var(--ink-soft);
  box-shadow: var(--shadow-sm);
  transition: all 220ms;
}
.sound-toggle:hover { color: var(--accent-deep); border-color: var(--line-strong); }
.sound-toggle.on { background: var(--accent-deep); color: var(--bg); }
.theme-night .sound-toggle.on { box-shadow: var(--glow); }

/* music toggle */
.music-toggle {
  position: fixed;
  bottom: 24px; left: var(--music-toggle-left);
  z-index: 40;
  height: var(--music-toggle-h);
  padding: 0 14px 0 12px;
  border-radius: 999px;
  background: var(--surface);
  border: 1px solid var(--line);
  display: inline-flex; align-items: center; gap: 8px;
  color: var(--ink-soft);
  box-shadow: var(--shadow-sm);
  transition: all 220ms;
}
.music-toggle:hover { color: var(--accent-deep); border-color: var(--line-strong); }
.music-toggle.on { background: var(--accent-deep); color: var(--bg); }
.theme-night .music-toggle.on { box-shadow: var(--glow); }

.music-wave {
  display: inline-flex; align-items: flex-end; gap: 2px;
  height: var(--music-wave-h);
}
.music-wave > span {
  display: inline-block;
  width: 2.5px;
  border-radius: 2px;
  background: currentColor;
  opacity: 0.55;
  height: 4px;
  transform-origin: bottom;
}
.music-toggle.on .music-wave > span {
  opacity: 1;
  animation: music-bar 1.2s ease-in-out infinite;
}
.music-toggle.on .music-wave > span:nth-child(1) { animation-delay: 0s; }
.music-toggle.on .music-wave > span:nth-child(2) { animation-delay: 0.2s; }
.music-toggle.on .music-wave > span:nth-child(3) { animation-delay: 0.4s; }

@keyframes music-bar {
  0%, 100% { height: 3px; }
  50% { height: 12px; }
}

/* mini section labels */
.section-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 4px 32px;            /* tiny vertical gap when title + subtitle stack */
  margin-bottom: var(--section-head-mb);
  flex-wrap: wrap;
}
.section-head .right { color: var(--ink-soft); font-size: var(--section-head-r-fs); max-width: 36ch; text-wrap: pretty; }

/* =================== SERVICES / WORK WITH ME =================== */
.services { overflow: hidden; }

/* service cards — each box presents a skill and carries its own rate */
.svc-cards {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 20px;
  align-items: stretch;
}
@media (max-width: 900px) { .svc-cards { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 460px) { .svc-cards { grid-template-columns: 1fr; } }

.svc-card {
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  padding: 26px 24px;
  transition: transform 320ms var(--ease-out), box-shadow 320ms, border-color 320ms;
}
.svc-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
  border-color: var(--line-strong);
}
.svc-card-icon { font-size: 30px; line-height: 1; display: block; }
.svc-card-title {
  font-family: var(--font-mono);
  font-weight: 500;
  text-transform: uppercase;
  font-size: 1.02rem;
  line-height: 1.25;
  letter-spacing: 0.04em;
  color: var(--ink);
  margin: 16px 0 9px;
}
.svc-card-desc { color: var(--ink-soft); font-size: 0.96rem; line-height: 1.5; text-wrap: pretty; }

/* price + note pinned to the bottom of each card so they line up across the row */
.svc-card-foot {
  margin-top: auto;
  padding-top: 18px;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.svc-card-desc + .svc-card-foot { margin-top: 18px; }
.svc-card-price {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 1.65rem;
  line-height: 1.1;
  color: var(--accent-deep);
  letter-spacing: -0.01em;
}
.svc-card-note { color: var(--ink-soft); font-size: 0.86rem; margin-top: 3px; }

/* cards that have a `detail` block open a popup, so they read as clickable */
.svc-card.is-openable { cursor: pointer; }
.svc-card.is-openable:focus-visible {
  outline: 2px solid var(--accent-deep);
  outline-offset: 3px;
}
.svc-card-more {
  margin-top: 14px;
  display: inline-flex; align-items: center; gap: 7px;
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  color: var(--accent-deep);
}
.svc-card-more svg { width: 14px; height: 14px; transition: transform 260ms var(--ease-out); }
.svc-card.is-openable:hover .svc-card-more svg { transform: translateX(4px); }

.svc-cta { margin-top: 44px; display: flex; justify-content: center; }

/* --- service detail popup ------------------------------------------------- */
.svc-modal { position: relative; }
.svc-modal-icon { font-size: 34px; line-height: 1; display: block; }
.svc-modal-title {
  margin: 14px 0 8px;
  font-size: clamp(32px, 4.4vw, 54px);
}
.svc-modal-lead { margin: 0; }
.svc-modal-body {
  margin: 24px 0 0;
  font-size: 17px;
  line-height: 1.6;
  color: var(--ink-soft);
  text-wrap: pretty;
  max-width: 62ch;
}
.svc-modal-block { margin-top: 32px; }
.svc-modal-head {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin: 0 0 14px;
}
.svc-modal-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 11px; }
.svc-modal-list li {
  display: grid;
  grid-template-columns: 18px 1fr;
  gap: 10px;
  color: var(--ink);
  font-size: 16px;
  line-height: 1.5;
  text-wrap: pretty;
}
.svc-modal-mark { color: var(--pink-hot); font-size: 0.9rem; line-height: 1.5; }
.svc-modal-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 16px; }
.svc-modal-step { display: grid; grid-template-columns: 30px 1fr; gap: 14px; align-items: start; }
.svc-modal-step-n {
  display: grid; place-items: center;
  width: 30px; height: 30px;
  border-radius: 50%;
  background: color-mix(in oklab, var(--lilac) 22%, var(--surface-2));
  border: 1px solid var(--line);
  font-family: var(--font-mono);
  font-size: 0.8rem;
  color: var(--accent-deep);
}
.svc-modal-step-h {
  font-family: var(--font-mono);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: 0.84rem;
  color: var(--ink);
  margin: 5px 0 4px;
}
.svc-modal-step-p { margin: 0; color: var(--ink-soft); font-size: 15px; line-height: 1.5; text-wrap: pretty; }

.svc-modal-facts {
  margin-top: 32px;
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
}
.svc-modal-fact {
  flex: 1 1 200px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  padding: 16px 18px;
}
.svc-modal-fact-l {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-mute);
}
.svc-modal-fact-v {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 1.15rem;
  color: var(--accent-deep);
  text-wrap: pretty;
}
.svc-modal-fact-n { color: var(--ink-soft); font-size: 0.84rem; }

.svc-modal-cta { display: flex; gap: 12px; margin-top: 36px; flex-wrap: wrap; }

/* =================== GAME JAMS CARD =================== */
.jam-card {
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 32px;
  align-items: center;
  padding: var(--jam-pad);
  border-radius: var(--r-lg);
  background:
    linear-gradient(135deg, var(--accent-soft) 0%, var(--bg-pink) 50%, var(--bg-warm) 100%);
  border: 1px solid var(--line-strong);
  position: relative;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  transition: transform 320ms var(--ease-out), box-shadow 320ms;
}
.theme-night .jam-card {
  background:
    linear-gradient(135deg, var(--grad-purple-4) 0%, var(--grad-purple-1) 50%, var(--grad-purple-5) 100%);
}
.jam-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
}
.jam-card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--jam-h3-fs);
  line-height: 1.1;
  margin: 14px 0 20px;
  letter-spacing: -0.01em;
  text-wrap: balance;
}
.jam-card h3 .it { font-style: italic; color: var(--accent-deep); }
.jam-link {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-mono);
  font-size: var(--jam-link-fs);
  color: var(--ink);
  padding-bottom: 2px;
  border-bottom: 1px solid var(--ink);
}
.jam-card:hover .jam-link { color: var(--accent-deep); border-color: var(--accent-deep); }

.jam-r {
  position: relative;
  height: var(--jam-r-h);
}
.jam-stack {
  position: absolute; inset: 0;
}
.jam-tile {
  position: absolute;
  width: var(--jam-tile-w); height: var(--jam-tile-h);
  border-radius: var(--r-md);
  box-shadow: var(--shadow-md);
  border: 1px solid rgba(255,255,255,0.4);
  overflow: hidden;
}
.jam-tile.t1 { background: linear-gradient(160deg, var(--pink-hot), var(--lilac)); left: 8%; top: 8%; transform: rotate(-8deg); }
.jam-tile.t2 { background: linear-gradient(160deg, var(--lilac), var(--sky)); left: 32%; top: 14%; transform: rotate(4deg); }
.jam-tile.t3 { background: linear-gradient(160deg, var(--peach), var(--pink-hot)); left: 54%; top: 6%; transform: rotate(-3deg); }
.jam-tile.t4 { background: linear-gradient(160deg, var(--mint), var(--lilac)); left: 70%; top: 22%; transform: rotate(10deg); }

/* Optional screenshot inside each tile — sits over the gradient. The same
   gradient is then layered on top at low opacity with `soft-light` so the
   tile keeps its lilac/peach/sky tint while still showing the image. */
.jam-tile-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.jam-tile.has-img::after {
  content: "";
  position: absolute; inset: 0;
  pointer-events: none;
  opacity: 0.55;
  mix-blend-mode: soft-light;
}
.jam-tile.has-img.t1::after { background: linear-gradient(160deg, var(--pink-hot), var(--lilac)); }
.jam-tile.has-img.t2::after { background: linear-gradient(160deg, var(--lilac), var(--sky)); }
.jam-tile.has-img.t3::after { background: linear-gradient(160deg, var(--peach), var(--pink-hot)); }
.jam-tile.has-img.t4::after { background: linear-gradient(160deg, var(--mint), var(--lilac)); }

@media (max-width: 760px) {
  .jam-card { grid-template-columns: 1fr; padding: var(--jam-pad-sm); }
  .jam-r { height: var(--jam-r-h-sm); }
}

/* =================== MINI PANELS (under projects) =================== */
/* Layout under the projects grid:
     +-----------+ +-----------+
     |  webtoon  | |           |
     +-----------+ | drawings  |
     | game jams | | (spans 2) |
     +-----------+ +-----------+
   Drawings spans both rows of the right column and dictates the total
   height — webtoon + jams + gap stretch to match. Game jams is the
   short one; webtoon takes whatever's left in the top-left cell. */
.proj-mini-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  /* Row 1 = webtoon, stretches to fill leftover space.
     Row 2 = game jams, sized to its (small) content.
     Drawings spans both rows on the right and pins the total height. */
  grid-template-rows: 1fr auto;
  gap: var(--proj-grid-gap);
  align-items: stretch;
}
.proj-mini-grid .webtoon-card { grid-column: 1; grid-row: 1; }
.proj-mini-grid .jam-card     { grid-column: 1; grid-row: 2; }
.proj-mini-grid .draw-card    { grid-column: 2; grid-row: 1 / span 2; }
.proj-mini-grid .webtoon-card.mini-panel { min-height: 0; }
@media (max-width: 800px) {
  .proj-mini-grid { grid-template-columns: 1fr; grid-template-rows: none; }
  .proj-mini-grid .webtoon-card,
  .proj-mini-grid .jam-card,
  .proj-mini-grid .draw-card { grid-column: auto; grid-row: auto; }
}

.mini-panel {
  min-height: 360px;
  padding: 28px;
  display: flex;
  flex-direction: column;
  gap: 18px;
}

/* Compact variant of the existing jam-card when it sits inside the mini-grid:
   keep the original side-by-side layout (text left, decorative tiles right)
   but shrink everything down. The four tiles sit fanned like a hand of
   playing cards in the default state, then spread out on hover to "unveil". */
.jam-card.mini-panel {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  padding: 22px 24px;
  min-height: 0;
  gap: 16px;
  align-items: center;
}
.jam-card.mini-panel .jam-l { display: flex; flex-direction: column; gap: 4px; }
.jam-card.mini-panel h3 {
  font-size: clamp(18px, 2vw, 24px);
  margin: 4px 0 6px;
}

/* Right column — fanned card hand. Default state: cards stacked close to the
   center with overlapping tilt. On panel hover, each card spreads outward
   along an arc, like dealing a hand. */
.jam-card.mini-panel .jam-r {
  height: 130px;
  margin-top: 0;
  align-self: center;
}
.jam-card.mini-panel .jam-tile {
  width: 84px;
  height: 84px;
  border-radius: 12px;
  top: 50%;
  left: 50%;
  /* --tx, --ty: offset from center; --rot: angle. JS not needed — these
     are set per tile below and animated via the card's hover state. */
  transform: translate(-50%, -50%) translate(var(--tx, 0px), var(--ty, 0px)) rotate(var(--rot, 0deg));
  transition: transform 360ms var(--ease-out), box-shadow 360ms;
  transform-origin: 50% 60%;
}
/* Idle state — cards lightly fanned, just enough to read as a hand of cards
   rather than a stack. */
.jam-card.mini-panel .jam-tile.t1 { --tx: -42px; --ty: 6px;  --rot: -14deg; z-index: 1; }
.jam-card.mini-panel .jam-tile.t2 { --tx: -14px; --ty: -3px; --rot: -6deg;  z-index: 2; }
.jam-card.mini-panel .jam-tile.t3 { --tx: 12px;  --ty: -3px; --rot: 6deg;   z-index: 3; }
.jam-card.mini-panel .jam-tile.t4 { --tx: 38px;  --ty: 6px;  --rot: 14deg;  z-index: 4; }

/* Hover state — full fan animation: cards spread out along an arc and lift,
   like dealing them across the table. */
.jam-card.mini-panel:hover .jam-tile.t1 { --tx: -96px; --ty: 10px; --rot: -26deg; }
.jam-card.mini-panel:hover .jam-tile.t2 { --tx: -34px; --ty: -6px; --rot: -10deg; }
.jam-card.mini-panel:hover .jam-tile.t3 { --tx: 32px;  --ty: -6px; --rot: 10deg;  }
.jam-card.mini-panel:hover .jam-tile.t4 { --tx: 92px;  --ty: 10px; --rot: 26deg;  }
.jam-card.mini-panel:hover .jam-tile { box-shadow: var(--shadow-md); }

/* DRAWINGS + COMMISSIONS panel ----------------------------------------- */
.draw-card {
  position: relative;
  border-radius: var(--r-lg);
  background:
    linear-gradient(135deg, var(--peach) 0%, var(--accent-soft) 55%, var(--bg-pink) 100%);
  border: 1px solid var(--line-strong);
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  transition: transform 320ms var(--ease-out), box-shadow 320ms;
}
.theme-night .draw-card {
  background:
    linear-gradient(135deg, var(--grad-purple-3) 0%, var(--grad-purple-1) 55%, var(--grad-purple-5) 100%);
}
.draw-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.draw-card .draw-head { display: flex; flex-direction: column; gap: 6px; }
.draw-card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(22px, 2.4vw, 30px);
  line-height: 1.1;
  margin: 6px 0 4px;
  letter-spacing: -0.01em;
  text-wrap: balance;
}
.draw-card h3 .it { font-style: italic; color: var(--accent-deep); }
.draw-gallery {
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 1fr;
  gap: 8px;
  flex: 1;
  min-height: 180px;
  margin-top: auto;
}
.draw-tile {
  position: relative;
  border-radius: var(--r-md);
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.4);
  box-shadow: var(--shadow-sm);
  aspect-ratio: 1 / 1;
  /* button reset — element is now <button> so the lightbox can open. */
  padding: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  --rot: 0deg;
  transform: rotate(var(--rot));
  transition: transform 240ms var(--ease-out), box-shadow 240ms;
}
.draw-tile.has-img:hover {
  transform: rotate(0deg) scale(1.06) translateY(-2px);
  box-shadow: var(--shadow-md);
  z-index: 2;
}
.draw-tile.has-img:focus-visible { outline: 2px solid var(--accent-deep); outline-offset: 3px; }
.draw-tile:disabled { cursor: default; opacity: 1; }
.draw-tile.dt1 { --rot: -2deg;   background: linear-gradient(160deg, var(--pink-hot), var(--lilac));  }
.draw-tile.dt2 { --rot: 1.5deg;  background: linear-gradient(160deg, var(--peach),   var(--pink-hot)); }
.draw-tile.dt3 { --rot: -1deg;   background: linear-gradient(160deg, var(--mint),    var(--sky));      }
.draw-tile.dt4 { --rot: 2deg;    background: linear-gradient(160deg, var(--lilac),   var(--sky));      }
.draw-tile.dt5 { --rot: -1.5deg; background: linear-gradient(160deg, var(--sky),     var(--mint));     }
.draw-tile.dt6 { --rot: 1deg;    background: linear-gradient(160deg, var(--pink),    var(--peach));    }
.draw-tile-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.draw-card .jam-link { align-self: flex-start; }
.draw-card:hover .jam-link { color: var(--accent-deep); border-color: var(--accent-deep); }

/* Footer row of the drawings card: shop link on the left, "order a commission"
   on the right. Wraps to two stacked rows on narrow widths. */
.draw-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}
.draw-footer .jam-link { align-self: auto; }
.draw-commission-link { color: var(--accent-deep); border-color: var(--accent-deep); }
.draw-commission-link:hover { color: var(--ink); border-color: var(--ink); }

/* WEBTOON panel -------------------------------------------------------- */
.webtoon-card {
  position: relative;
  border-radius: var(--r-lg);
  background:
    linear-gradient(135deg, var(--lilac) 0%, var(--accent-soft) 50%, var(--sky) 100%);
  border: 1px solid var(--line-strong);
  text-decoration: none;
  color: inherit;
  /* No overflow:hidden — let the rotated/scaled cover breathe past the
     padding on hover instead of getting its corners clipped. The card's own
     gradient is already kept inside the rounded corners by border-radius. */
  display: grid !important;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 20px;
  align-items: center;
  transition: transform 320ms var(--ease-out), box-shadow 320ms;
}
.theme-night .webtoon-card {
  background:
    linear-gradient(135deg, var(--grad-purple-2) 0%, var(--grad-purple-1) 50%, var(--grad-purple-4) 100%);
}
.webtoon-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.webtoon-l { display: flex; flex-direction: column; gap: 8px; }
.webtoon-card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(22px, 2.4vw, 30px);
  line-height: 1.1;
  margin: 6px 0 6px;
  letter-spacing: -0.01em;
}
.webtoon-card h3 .it { font-style: italic; color: var(--accent-deep); }
.webtoon-title-img {
  display: block;
  width: 100%;
  height: auto;
  max-height: 180px;
  object-fit: contain;
  object-position: center;
  margin: 4px 0 8px;
  border-radius: var(--r-md);
}
.webtoon-desc {
  color: var(--ink-soft);
  font-size: 14px;
  line-height: 1.5;
  margin: 0 0 8px;
  text-wrap: pretty;
}
.webtoon-card .jam-link { align-self: flex-start; }
.webtoon-card:hover .jam-link { color: var(--accent-deep); border-color: var(--accent-deep); }
.webtoon-r {
  position: relative;
  border-radius: var(--r-md);
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.5);
  box-shadow: var(--shadow-md);
  transform: rotate(1.5deg);
  transform-origin: center;
  transition: transform 420ms var(--ease-out), box-shadow 420ms var(--ease-out);
  /* Aspect ratio tuned for portrait webtoon covers (5/7 ≈ A4 portrait) so
     `object-fit: cover` doesn't crop large chunks off the top + bottom. The
     container grows in height to fit the image instead of squishing it. */
  aspect-ratio: 5 / 7;
  width: 100%;
  max-height: 360px;
  margin-block: auto;
  align-self: center;
}
/* Hover: tilt the other way + scale up with a deeper shadow so the cover
   lifts off the panel. Lives on the cover, not the whole card. */
.webtoon-card:hover .webtoon-r {
  transform: rotate(-2.5deg) scale(1.06);
  box-shadow: 0 24px 48px -12px rgba(34, 26, 58, 0.45);
}
.webtoon-cover {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  background: linear-gradient(160deg, var(--lilac), var(--pink));
}
.webtoon-cover img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center;
}
.webtoon-glyph {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 64px;
  color: rgba(255,255,255,0.7);
  text-shadow: 0 4px 24px rgba(34, 26, 58, 0.35);
}

/* KOFI big panel + supporter wall -------------------------------------- */
.kofi-card {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: 36px;
  align-items: stretch;
  padding: var(--jam-pad);
  border-radius: var(--r-lg);
  background:
    linear-gradient(135deg, var(--bg-pink) 0%, var(--accent-soft) 45%, var(--peach) 100%);
  border: 1px solid var(--line-strong);
  position: relative;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  cursor: pointer;
  transition: transform 320ms var(--ease-out), box-shadow 320ms;
}

/* The card is now the ko-fi trigger, so hide the overlay widget's own floating
   button — but keep it laid out (opacity/pointer-events, not display:none) so the
   widget can still measure its position and slide the donation panel open. */
.floatingchat-container-wrap,
.floatingchat-container-wrap-mobi {
  opacity: 0 !important;
  pointer-events: none !important;
}
.theme-night .kofi-card {
  background:
    linear-gradient(135deg, var(--grad-purple-5) 0%, var(--grad-purple-2) 45%, var(--grad-purple-4) 100%);
}
.kofi-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.kofi-l { display: flex; flex-direction: column; gap: 10px; }
.kofi-card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: var(--jam-h3-fs);
  line-height: 1.1;
  margin: 14px 0 12px;
  letter-spacing: -0.01em;
  text-wrap: balance;
}
.kofi-card h3 .it { font-style: italic; color: var(--accent-deep); }
.kofi-desc {
  color: var(--ink-soft);
  font-size: 16px;
  line-height: 1.55;
  margin: 0 0 18px;
  max-width: 38ch;
}
.kofi-cta {
  align-self: flex-start;
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--font-mono);
  font-size: 14px;
  letter-spacing: 0.04em;
  color: var(--on-dark);
  background: var(--accent-deep);
  padding: 12px 22px;
  border-radius: 999px;
  border: 1px solid var(--accent-deep);
  box-shadow: var(--shadow-sm);
  transition: transform 220ms var(--ease-out), box-shadow 220ms;
  margin-top: auto;
}
.kofi-card:hover .kofi-cta {
  transform: translateY(-2px);
  box-shadow: var(--shadow-md);
}
.theme-night .kofi-cta { box-shadow: var(--glow); }

.kofi-r {
  position: relative;
  min-height: 280px;
  display: flex;
  flex-direction: column;
}
.kofi-wall-label {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-soft);
  margin-bottom: 14px;
  align-self: flex-end;
}
.kofi-wall {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 8px;
  align-content: center;
  justify-content: center;
  flex: 1;
  padding: 6px;
}
.kofi-name {
  --rot: 0deg;
  --delay: 0s;
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 13px;
  padding: 6px 12px;
  border-radius: 999px;
  border: 1px solid var(--line-strong);
  background: var(--surface);
  color: var(--ink);
  box-shadow: var(--shadow-sm);
  transform: rotate(var(--rot));
  transition: transform 260ms var(--ease-out), box-shadow 260ms;
  animation: kofi-name-float 5.5s ease-in-out infinite;
  animation-delay: var(--delay);
  white-space: nowrap;
}
.kofi-card:hover .kofi-name { transform: rotate(calc(var(--rot) * 0.4)); }
.kofi-name:hover { transform: rotate(0deg) scale(1.08) !important; box-shadow: var(--shadow-md); z-index: 2; }
.kofi-name.k1 { background: var(--surface);                                                 color: var(--accent-deep); }
.kofi-name.k2 { background: color-mix(in oklab, var(--pink)  60%, var(--surface));          color: var(--ink); }
.kofi-name.k3 { background: color-mix(in oklab, var(--lilac) 55%, var(--surface));          color: var(--ink); }
.kofi-name.k4 { background: color-mix(in oklab, var(--peach) 65%, var(--surface));          color: var(--ink); }
.kofi-name.k5 { background: color-mix(in oklab, var(--mint)  55%, var(--surface));          color: var(--ink); }
.theme-night .kofi-name { background: var(--surface-2); box-shadow: 0 0 14px rgba(183,168,255,0.18); }
.theme-night .kofi-name.k2 { background: color-mix(in oklab, var(--grad-purple-3) 70%, var(--surface-2)); }
.theme-night .kofi-name.k3 { background: color-mix(in oklab, var(--grad-purple-2) 70%, var(--surface-2)); }
.theme-night .kofi-name.k4 { background: color-mix(in oklab, var(--grad-purple-4) 70%, var(--surface-2)); }
.theme-night .kofi-name.k5 { background: color-mix(in oklab, var(--grad-purple-5) 70%, var(--surface-2)); }

@keyframes kofi-name-float {
  0%, 100% { transform: rotate(var(--rot)) translateY(0); }
  50%      { transform: rotate(calc(var(--rot) + 1.5deg)) translateY(-3px); }
}

@media (max-width: 760px) {
  .kofi-card { grid-template-columns: 1fr; padding: var(--jam-pad-sm); }
  .kofi-r { min-height: 220px; }
  .webtoon-card { grid-template-columns: 1fr; }
  .webtoon-r { aspect-ratio: 16 / 10; transform: none; max-height: 220px; }
}

/* =================== GALLERY · SOUVENIRS =================== */
.gallery-section { overflow: hidden; }

.gallery-stage {
  position: relative;
  padding: var(--gallery-stage-pad);
  border-radius: var(--r-lg);
  background:
    linear-gradient(160deg,
      color-mix(in oklab, var(--bg-pink) 70%, var(--surface)) 0%,
      color-mix(in oklab, var(--accent-soft) 60%, var(--surface)) 60%,
      color-mix(in oklab, var(--bg-warm) 60%, var(--surface)) 100%);
  border: 1px solid var(--line-strong);
  box-shadow: var(--shadow-md);
}
.theme-night .gallery-stage {
  background: linear-gradient(160deg, var(--grad-purple-6) 0%, var(--grad-purple-4) 55%, var(--grad-purple-1) 100%);
}
.gallery-stage::before {
  content: "";
  position: absolute;
  inset: 12px;
  border: 1px dashed var(--line-strong);
  border-radius: calc(var(--r-lg) - 6px);
  pointer-events: none;
  opacity: 0.55;
}

.gallery-ribbon {
  position: absolute;
  top: -16px; left: 50%;
  transform: translateX(-50%) rotate(-1deg);
  background: var(--ink);
  color: var(--bg);
  font-family: var(--font-mono);
  font-size: var(--gallery-ribbon-fs);
  letter-spacing: 0.2em;
  text-transform: uppercase;
  padding: var(--gallery-ribbon-pad);
  border-radius: 999px;
  white-space: nowrap;
  z-index: 4;
  box-shadow: var(--shadow-md);
  overflow: hidden;
  max-width: 80%;
}
.theme-night .gallery-ribbon { background: var(--accent-deep); color: var(--on-dark); box-shadow: var(--glow); }
.gallery-ribbon-inner {
  display: inline-block;
  white-space: nowrap;
  animation: ribbonScroll 28s linear infinite;
}

.polaroid-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--polaroid-gap);
  padding: var(--polaroid-grid-pad);
  position: relative;
  z-index: 2;
}
@media (max-width: 980px) { .polaroid-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 720px) { .polaroid-grid { grid-template-columns: repeat(2, 1fr); gap: var(--polaroid-gap-sm); } }
@media (max-width: 440px) { .polaroid-grid { grid-template-columns: 1fr; } }

.polaroid {
  position: relative;
  margin: 0;
  padding: var(--polaroid-pad);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
  box-shadow: 0 18px 30px -18px rgba(34, 26, 58, 0.35), 0 2px 6px rgba(34,26,58,0.08);
  transform: rotate(var(--tilt, 0deg));
  transition: transform 380ms var(--ease-out), box-shadow 380ms;
  animation: polaroidIn 700ms var(--ease-out) both;
}
@keyframes polaroidIn {
  from { opacity: 0; transform: rotate(var(--tilt, 0deg)) translateY(14px) scale(0.96); }
  to   { opacity: 1; transform: rotate(var(--tilt, 0deg)); }
}
.polaroid:hover {
  transform: rotate(0deg) translateY(-6px) scale(1.04);
  box-shadow: 0 30px 50px -22px rgba(34, 26, 58, 0.45), 0 4px 12px rgba(34,26,58,0.12);
  z-index: 3;
}
.polaroid.clickable { cursor: pointer; }
.polaroid.clickable:hover {
  transform: rotate(0deg) translateY(-8px) scale(1.06);
}
.polaroid.clickable:focus-visible {
  outline: 2px solid var(--accent-deep);
  outline-offset: 4px;
}
.theme-night .polaroid {
  background: var(--polaroid-night-bg);
  border-color: var(--line-strong);
  box-shadow: 0 0 30px rgba(183,168,255,0.18);
}
.theme-night .polaroid:hover { box-shadow: 0 0 60px rgba(183,168,255,0.32); }

/* Polaroid pin — flat brand-colored disc that matches the polaroid's own
   tone (lilac / pink / peach / mint / sky). Soft inner highlight + a small
   drop shadow keep just enough dimensionality to read as a pin without
   fighting the lavender aesthetic. */
.polaroid-pin {
  position: absolute;
  top: -8px; left: 50%;
  transform: translateX(-50%);
  width: var(--pin-size); height: var(--pin-size);
  border-radius: 50%;
  background: var(--accent-deep);
  box-shadow:
    0 2px 5px rgba(34, 26, 58, 0.28),
    inset 0 1px 1.5px rgba(255, 255, 255, 0.55),
    inset 0 -1px 2px rgba(34, 26, 58, 0.18);
  z-index: 5;
}
.polaroid.tone-lilac .polaroid-pin { background: var(--lilac); }
.polaroid.tone-pink  .polaroid-pin { background: var(--pink-hot); }
.polaroid.tone-peach .polaroid-pin { background: var(--peach); }
.polaroid.tone-mint  .polaroid-pin { background: var(--mint); }
.polaroid.tone-sky   .polaroid-pin { background: var(--sky); }
.theme-night .polaroid-pin {
  box-shadow:
    0 0 10px color-mix(in oklab, currentColor 40%, transparent),
    inset 0 1px 1.5px rgba(255, 255, 255, 0.4);
}

.polaroid-photo {
  aspect-ratio: 4 / 5;
  border-radius: 2px;
  display: grid; place-items: center;
  position: relative;
  overflow: hidden;
  background:
    linear-gradient(135deg, var(--lilac) 0%, var(--pink) 100%);
}
.polaroid.tone-lilac .polaroid-photo { background: linear-gradient(140deg, var(--lilac-pale), var(--pink-hot)); }
.polaroid.tone-pink  .polaroid-photo { background: linear-gradient(140deg, var(--pink), var(--peach)); }
.polaroid.tone-peach .polaroid-photo { background: linear-gradient(140deg, var(--peach), var(--peach-soft)); }
.polaroid.tone-mint  .polaroid-photo { background: linear-gradient(140deg, var(--mint), var(--sky)); }
.polaroid.tone-sky   .polaroid-photo { background: linear-gradient(140deg, var(--sky), var(--lilac-pale)); }
.theme-night .polaroid-photo { filter: brightness(0.78) saturate(0.85); }

.polaroid-photo::before {
  content: "";
  position: absolute; inset: 0;
  background:
    repeating-linear-gradient(45deg,
      rgba(255,255,255,0.0) 0 18px,
      rgba(255,255,255,0.18) 18px 19px);
  pointer-events: none;
  mix-blend-mode: overlay;
}
.polaroid-photo::after {
  content: "";
  position: absolute; inset: 0;
  background: radial-gradient(80% 60% at 50% 35%, rgba(255,255,255,0.25), transparent 70%);
  pointer-events: none;
}
.polaroid-glyph {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--polaroid-glyph-fs);
  color: rgba(255,255,255,0.85);
  text-shadow: 0 4px 18px rgba(0,0,0,0.18);
  z-index: 2;
  line-height: 1;
}
.polaroid-placeholder {
  position: absolute;
  bottom: 10px; left: 50%;
  transform: translateX(-50%);
  font-family: var(--font-mono);
  font-size: var(--polaroid-placeholder-fs);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.75);
  background: rgba(0,0,0,0.18);
  padding: 3px 9px;
  border-radius: 999px;
  z-index: 2;
}

.polaroid-cap {
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
  padding: 12px 4px 14px;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--polaroid-cap-fs);
  color: var(--ink);
  line-height: 1.2;
}
.polaroid-cap-l { letter-spacing: 0.005em; }
.polaroid-cap-r {
  font-family: var(--font-mono);
  font-style: normal;
  font-size: var(--polaroid-cap-r-fs);
  letter-spacing: 0.1em;
  color: var(--accent-deep);
}

.gallery-foot {
  position: relative;
  z-index: 2;
  margin-top: var(--gallery-foot-mt);
  padding: 14px 8px 0;
  border-top: 1px dashed var(--line-strong);
  display: flex; justify-content: space-between; align-items: center;
  flex-wrap: wrap; gap: 12px;
  font-family: var(--font-mono);
  font-size: var(--gallery-foot-fs);
  letter-spacing: 0.08em;
  color: var(--ink-soft);
}
.gallery-foot .dot {
  display: inline-block;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--accent-deep);
  margin-right: 8px;
  vertical-align: middle;
}
.gallery-foot-r { color: var(--ink); }

@media (max-width: 760px) {
  .gallery-stage { padding: var(--gallery-stage-pad-sm); }
  .polaroid-grid { padding: var(--polaroid-grid-pad-sm); }
}

/* lightbox modal opened when a polaroid (with a real image) is clicked.
   The photo container hugs the image so any aspect ratio shows at its
   natural shape — portrait, square, landscape, ultrawide. */
.polaroid-modal {
  position: relative;
  display: inline-flex;
  flex-direction: column;
  align-items: stretch;
  gap: 14px;
  max-width: min(1100px, 96vw);
  max-height: 96vh;
  animation: polaroid-modal-in 360ms var(--ease-out);
}
@keyframes polaroid-modal-in {
  from { opacity: 0; transform: translateY(16px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.polaroid-modal-photo {
  position: relative;
  display: inline-block;
  line-height: 0;             /* removes the inline whitespace under img */
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line-strong);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
}
.polaroid-modal-img {
  display: block;
  width: auto;
  height: auto;
  max-width: min(1000px, 92vw);
  max-height: 80vh;
  animation: carousel-fade 320ms var(--ease-out);
}
.polaroid-modal-cap {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px;
  padding: 0 6px;
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(20px, 2.2vw, 28px);
  color: var(--ink);
}
.polaroid-modal-cap-r {
  font-family: var(--font-mono);
  font-style: normal;
  font-size: 13px;
  letter-spacing: 0.12em;
  color: var(--accent-deep);
}
.polaroid-modal-desc {
  margin: 0 6px;
  padding-top: 4px;
  font-family: var(--font-sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--ink-soft);
  text-wrap: pretty;
  max-width: 60ch;
}
.polaroid-modal .modal-close {
  position: absolute;
  top: 14px; right: 14px;
  z-index: 3;
  background: color-mix(in oklab, var(--surface) 80%, transparent);
  backdrop-filter: blur(10px);
}
/* the close button sits top-right, so the "x / y" counter moves to the
   opposite corner instead of hiding underneath it. */
.polaroid-modal .carousel-counter {
  top: 12px; left: 12px;
  right: auto;
}

/* =================== DRAWING LIGHTBOX =================== */
/* Opens when a drawing tile in the commissions panel is clicked. Two-column
   layout: artwork on the left at natural aspect, caption + "buy on redbubble"
   CTA on the right. Falls back to a stacked single-column layout on narrow
   screens. */
.draw-modal {
  position: relative;
  display: grid;
  grid-template-columns: minmax(280px, 1fr) minmax(220px, 320px);
  gap: 24px;
  align-items: stretch;
  max-width: min(1100px, 96vw);
  max-height: 96vh;
  padding: 20px;
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg);
  animation: polaroid-modal-in 360ms var(--ease-out);
}
.theme-night .draw-modal { background: var(--surface-2); }
.draw-modal-photo {
  position: relative;
  display: grid;
  place-items: center;
  border-radius: var(--r-md);
  background: var(--surface-2);
  border: 1px solid var(--line);
  overflow: hidden;
  min-height: 280px;
}
.draw-modal-img {
  display: block;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 78vh;
  object-fit: contain;
  animation: carousel-fade 320ms var(--ease-out);
}
.draw-modal-meta {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 16px;
  padding: 8px 6px;
}
.draw-modal-title {
  margin: 0;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(22px, 2.4vw, 32px);
  line-height: 1.15;
  color: var(--ink);
  text-wrap: pretty;
}
.draw-modal-client {
  margin: -4px 0 0;
  font-family: var(--font-mono);
  font-size: 13px;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}
.draw-modal-client a {
  color: var(--accent-deep);
  border-bottom: 1px solid currentColor;
  padding-bottom: 1px;
  transition: color 200ms;
}
.draw-modal-client a:hover { color: var(--ink); }
.draw-modal .btn { align-self: flex-start; }
.draw-modal .modal-close {
  position: absolute;
  top: 14px; right: 14px;
  z-index: 3;
  background: color-mix(in oklab, var(--surface) 80%, transparent);
  backdrop-filter: blur(10px);
}
@media (max-width: 720px) {
  .draw-modal {
    grid-template-columns: 1fr;
    max-height: 94vh;
    overflow: auto;
  }
  .draw-modal-photo { min-height: 220px; }
  .draw-modal-img { max-height: 60vh; }
  .draw-modal-meta { padding-top: 0; }
}



/* ============================================================================
   MEDIA KIT / BRAND PARTNERSHIPS
   Sponsor-facing section. Mirrors the services look (surface cards, lilac
   accents) but tuned for reach numbers, audience, impact and collab formats.
   ============================================================================ */
.mediakit { overflow: hidden; }

.mk-block { margin-top: 40px; }
.mk-block-head {
  font-family: var(--font-mono);
  font-weight: 500;
  text-transform: uppercase;
  font-size: 0.82rem;
  letter-spacing: 0.12em;
  color: var(--ink-soft);
  margin: 0 0 18px;
}

/* --- headline metric row -------------------------------------------------- */
.mk-stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  margin-top: 28px;
}
@media (max-width: 780px) { .mk-stats { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 420px) { .mk-stats { grid-template-columns: 1fr; } }

.mk-stat {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 24px 22px;
  border-radius: var(--r-md);
  background: linear-gradient(150deg,
    color-mix(in oklab, var(--lilac) 22%, var(--surface)),
    color-mix(in oklab, var(--pink) 12%, var(--surface)));
  border: 1px solid var(--line-strong);
  transition: transform 320ms var(--ease-out), box-shadow 320ms;
}
.mk-stat:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.mk-stat-num {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 2.1rem;
  line-height: 1;
  letter-spacing: -0.01em;
  color: var(--accent-deep);
}
.mk-stat-lbl {
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.74rem;
  color: var(--ink-soft);
}

/* --- audience + why two-column ------------------------------------------- */
.mk-two-col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 24px;
  align-items: start;
}
@media (max-width: 820px) { .mk-two-col { grid-template-columns: 1fr; } }

.mk-audience, .mk-why {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  padding: 24px 24px;
}

.mk-loc-label {
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.72rem;
  color: var(--ink-mute);
  margin-bottom: 2px;
}

/* content-pillar chips */
.mk-pillars { margin-top: 22px; }
/* pillars are the only thing left in the audience card, so they sit right
   under its heading rather than after a bar chart. */
.mk-audience .mk-block-head + .mk-pillars { margin-top: 0; }
.mk-pillar-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.mk-pillar {
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 0.74rem;
  color: var(--accent-deep);
  background: color-mix(in oklab, var(--lilac) 16%, var(--surface));
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 6px 12px;
}

/* why-collaborate checked list */
.mk-why-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.mk-why-list li {
  display: grid;
  grid-template-columns: 18px 1fr;
  gap: 10px;
  color: var(--ink-soft);
  font-size: 0.94rem;
  line-height: 1.5;
}
.mk-why-mark { color: var(--pink-hot); font-size: 0.9rem; line-height: 1.6; }

/* --- downloadable PDF media kit ------------------------------------------ */
/* lives at the bottom of the "who's watching" card, under a dashed rule: the
   icon + blurb sit on one row, the button spans the full width beneath. */
.mk-download {
  margin-top: 24px;
  padding-top: 20px;
  border-top: 1px dashed var(--line-strong);
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: 14px;
}
.mk-download-icon {
  display: grid; place-items: center;
  width: 44px; height: 44px;
  border-radius: var(--r-sm, 10px);
  background: color-mix(in oklab, var(--lilac) 18%, var(--surface-2));
  border: 1px solid var(--line);
  color: var(--accent-deep);
}
.mk-download-title {
  font-family: var(--font-mono);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 0.82rem;
  color: var(--ink);
  margin: 0 0 4px;
}
.mk-download-desc {
  margin: 0;
  color: var(--ink-soft);
  font-size: 0.86rem;
  line-height: 1.45;
  text-wrap: pretty;
}
.mk-download-meta {
  display: inline-block;
  margin-top: 6px;
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.68rem;
  color: var(--ink-mute);
}
.mk-download-btn {
  grid-column: 1 / -1;
  justify-content: center;
  margin-top: 4px;
  padding: 12px 20px;
}

/* --- CTA row -------------------------------------------------------------- */
.mk-cta {
  margin-top: 44px;
  display: flex;
  justify-content: center;
  gap: 14px;
  flex-wrap: wrap;
}
