/* ─── TOKENS ────────────────────────────────────────── */
:root {
  --black:   #0D0D0D;
  --surface: #161616;
  --orange:  #FF6D29;
  --orange-soft: rgba(255,109,41,.075);
  --brown:   #453027;
  --grey:    #BABABA;
  --white:   #FFFFFF;

  --ease-out-expo:  cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-expo:   cubic-bezier(0.7, 0, 0.84, 0);
  --ease-in-out:    cubic-bezier(0.87, 0, 0.13, 1);
  --ease-spring:    cubic-bezier(0.34, 1.56, 0.64, 1);

  --dur-fast:   150ms;
  --dur-reveal: 400ms;
  --dur-page:   800ms;
  --dur-slow:   1200ms;
  --dur-spin:   1600ms;

  --g: 6vw;

  /* tweakable globals (mirrored from Tweaks panel via localStorage) */
  --display-weight: 300;
  --accent: var(--orange);
}

/* ─── RESET / BASE ─────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; scroll-behavior: auto; }
body {
  background: var(--black);
  color: var(--grey);
  font-family: 'Neue Montreal', 'PP Neue Montreal', 'Söhne', 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-weight: 400;
  overflow-x: hidden;
  text-rendering: optimizeLegibility;
}
a { color: inherit; text-decoration: none; }
button { background: none; border: none; cursor: pointer; font: inherit; color: inherit; }
ul, ol { list-style: none; }
em { font-style: normal; }
img, video { display: block; max-width: 100%; }

/* ─── BRAND MARK SIZE ──────────────────────────────── */
html[data-mark-size="sm"] .nav__logo { font-size: 11px; letter-spacing: .16em; }
html[data-mark-size="md"] .nav__logo { font-size: 14px; letter-spacing: .14em; }
html[data-mark-size="lg"] .nav__logo {
  font-size: 19px;
  letter-spacing: .08em;
  font-weight: 500;
}
html[data-label-font="serif"][data-mark-size="lg"] .nav__logo { font-size: 22px; }

/* ─── TYPE TWEAKS ──────────────────────────────────── */
/* Label/eyebrow font variants. Targets every small uppercase orange caption
   across the site. Applied via [data-label-font] on <html>. */
:root {
  --label-font:        'Neue Montreal', 'PP Neue Montreal', 'Söhne', 'Inter', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --label-tracking:    .18em;
  --label-transform:   uppercase;
  --label-weight:      600;
  --label-style:       normal;
  --label-feature:     normal;
}
html[data-label-font="mono"] {
  --label-font:        ui-monospace, 'JetBrains Mono', 'IBM Plex Mono', 'SF Mono', Consolas, monospace;
  --label-tracking:    .12em;
  --label-weight:      500;
}
html[data-label-font="serif"] {
  --label-font:        'Iowan Old Style', 'Charter', 'Cochin', 'Apple Garamond', Georgia, 'Times New Roman', serif;
  --label-tracking:    0;
  --label-transform:   none;
  --label-weight:      400;
  --label-style:       italic;
  --label-feature:     "ss01", "dlig";
}
/* Apply to every small uppercase orange caption */
.eye, .wi-eye, .ph-eye, .bio-eye, .ap-tag, .ap-block-head,
.cv-co, .sk-cat, .pn-label, .c-label, .pf-name, .pf-link, .pf-yr,
.aw-meta, .mock-label, .bb-eye, .entry__eye, .nav__logo, .nav__link,
.sf-link, .sf-year, .face-label, .pb-img-cap, .ap-photo-cap, .bio-photo-cap,
.scroll-hint, .cp-tag, .bb-count, .sk-cluster-sub, .cv-period, .cv-loc,
.aw-yr, .lang-lev, .ph-meta-tot, .ap-stat-lbl, .c-copy, .nudge-arr, .entry__nudge {
  font-family: var(--label-font);
  letter-spacing: var(--label-tracking);
  text-transform: var(--label-transform);
  font-weight: var(--label-weight);
  font-style: var(--label-style);
  font-feature-settings: var(--label-feature);
}
/* Serif labels look better slightly bigger / non-uppercase */
html[data-label-font="serif"] .eye,
html[data-label-font="serif"] .wi-eye,
html[data-label-font="serif"] .ph-eye,
html[data-label-font="serif"] .bio-eye,
html[data-label-font="serif"] .ap-tag,
html[data-label-font="serif"] .ap-block-head,
html[data-label-font="serif"] .cv-co,
html[data-label-font="serif"] .sk-cat,
html[data-label-font="serif"] .aw-meta,
html[data-label-font="serif"] .bb-eye,
html[data-label-font="serif"] .entry__eye,
html[data-label-font="serif"] .cp-tag,
html[data-label-font="serif"] .mock-label {
  font-size: 14px;
}
html[data-label-font="serif"] .nav__logo,
html[data-label-font="serif"] .nav__link,
html[data-label-font="serif"] .pf-link,
html[data-label-font="serif"] .pf-name,
html[data-label-font="serif"] .sf-link,
html[data-label-font="serif"] .pn-label {
  font-size: 14px;
}
/* Mono looks best a hair smaller and tighter tracking on big nav */
html[data-label-font="mono"] .nav__logo,
html[data-label-font="mono"] .nav__link {
  letter-spacing: .08em;
}

/* ─── EMPHASIS TWEAKS (em handling) ────────────────── */
/* Default: orange color (kept inline by base em rule above; reset color here so accent applies) */
em { color: var(--accent); }

html[data-emphasis="bold"] em {
  color: inherit; font-weight: 600;
}
html[data-emphasis="color-bold"] em {
  color: var(--accent); font-weight: 600;
}
html[data-emphasis="underline"] em {
  color: inherit;
  background-image: linear-gradient(var(--accent), var(--accent));
  background-repeat: no-repeat;
  background-size: 100% 2px;
  background-position: 0 100%;
  padding-bottom: 2px;
}
html[data-emphasis="stroke"] em {
  color: inherit;
  border: .5px solid var(--accent);
  padding: .04em .42em .1em;
  margin: 0 .08em;
  line-height: 1;
}
html[data-emphasis="highlight"] em {
  color: var(--white);
  background: rgba(255,109,41,.14);
  padding: .02em .3em;
  margin: 0 .06em;
}
/* On huge display text, stroke + highlight look heavy. Use a clean baseline underline. */
html[data-emphasis="stroke"] .ph-title em,
html[data-emphasis="stroke"] .ap-name em,
html[data-emphasis="stroke"] .cp-name em,
html[data-emphasis="stroke"] .wi-title em,
html[data-emphasis="highlight"] .ph-title em,
html[data-emphasis="highlight"] .ap-name em,
html[data-emphasis="highlight"] .cp-name em,
html[data-emphasis="highlight"] .wi-title em {
  border: none;
  padding: 0;
  background: none;
  background-image: linear-gradient(var(--accent), var(--accent));
  background-repeat: no-repeat;
  background-size: 100% 4px;
  background-position: 0 96%;
  color: var(--white);
}

/* dot-cursor variant (applied to <html> when tweak active) */
html.cur-dot, html.cur-dot * { cursor: none !important; }
.cursor-dot {
  position: fixed; top: 0; left: 0; z-index: 9999; pointer-events: none;
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--accent);
  /* mix-blend-mode REMOVED — was the main source of compositor lag (forced
     repaint against viewport pixels every frame). White dot is fine on
     this dark-only design. */
  transform: translate3d(-50px, -50px, 0);
  transition: width .25s var(--ease-out-expo), height .25s var(--ease-out-expo), background .2s ease;
  will-change: transform;
}
.cursor-ring {
  position: fixed; top: 0; left: 0; z-index: 9998; pointer-events: none;
  width: 28px; height: 28px; border-radius: 50%;
  border: .5px solid rgba(255,255,255,.5);
  transform: translate3d(-50px, -50px, 0);
  transition: width .25s var(--ease-out-expo), height .25s var(--ease-out-expo), border-color .2s, opacity .2s;
  will-change: transform;
}
html:not(.cur-dot) .cursor-dot, html:not(.cur-dot) .cursor-ring { display: none; }
html.cur-dot .cursor-dot.hover { width: 3px; height: 3px; }
html.cur-dot .cursor-ring.hover { width: 48px; height: 48px; border-color: var(--accent); }

/* Cursor glow — soft orange halo following the cursor. Smaller + softer
   than before so it reads as a subtle warm light, not a flashlight. */
.cursor-glow {
  position: fixed; top: 0; left: 0; z-index: 9990;
  width: 230px; height: 230px;
  pointer-events: none;
  background: radial-gradient(circle, rgba(255,109,41,.11) 0%, rgba(255,109,41,.045) 34%, rgba(255,109,41,0) 68%);
  mix-blend-mode: screen;
  transform: translate3d(-1000px, -1000px, 0);
  opacity: 0;
  transition: opacity .8s ease;
  will-change: transform;
}
html[data-glow="on"] .cursor-glow { opacity: 1; }

@media (pointer: coarse), (hover: none), (max-width: 720px) {
  html.cur-dot,
  html.cur-dot * {
    cursor: revert !important;
  }
  .cursor-dot,
  .cursor-ring,
  .cursor-glow {
    display: none !important;
  }
}

a:focus-visible,
button:focus-visible,
[role="button"]:focus-visible {
  outline: .5px solid var(--accent);
  outline-offset: 4px;
}

/* ─── NAV ──────────────────────────────────────────── */
.nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 300;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 var(--g);
  height: 76px;
  pointer-events: none;
  mix-blend-mode: difference;
}
.nav > * { pointer-events: all; }
.nav__logo {
  font-size: 11px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: #fff;
  line-height: 1;
}
.nav__links { display: flex; gap: 32px; }
.nav__link {
  font-size: 11px; font-weight: 500; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(255,255,255,.7);
  position: relative;
  transition: color var(--dur-fast) ease;
}
.nav__link::after {
  content: ''; position: absolute; bottom: -3px; left: 0; width: 0; height: .5px;
  background: currentColor;
  transition: width 350ms var(--ease-out-expo);
}
.nav__link:hover { color: #fff; }
.nav__link:hover::after { width: 100%; }
.nav__link.is-active { color: #fff; }
.nav__link.is-active::after { width: 100%; }

/* ─── EYEBROW ──────────────────────────────────────── */
.eye {
  display: inline-flex; align-items: center; gap: 14px;
  font-size: 9px; font-weight: 600; letter-spacing: .18em; text-transform: uppercase;
  color: var(--accent);
}
.eye::before {
  content: ''; display: block; width: 26px; height: .5px; background: var(--accent);
}

/* ─── REVEALS ──────────────────────────────────────── */
.will-reveal { opacity: 0; transform: translateY(28px); transition: opacity 900ms var(--ease-out-expo), transform 900ms var(--ease-out-expo); }
.will-reveal.is-in { opacity: 1; transform: none; }

/* ─── GRAIN HELPER ─────────────────────────────────── */
.grain { position: relative; isolation: isolate; }
.grain::before {
  content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 1;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.048'/%3E%3C/svg%3E");
  background-size: 320px;
}

/* ─── SITE FOOTER ──────────────────────────────────── */
.sf {
  display: grid; grid-template-columns: 1fr 1fr 1fr; align-items: start; gap: 3rem;
  padding: 7vh var(--g) 8vh;
  border-top: .5px solid rgba(186,186,186,.06);
  position: relative;
  background: linear-gradient(to bottom, rgba(13,13,13,.72), var(--black) 34%);
}
.sf-name {
  font-size: clamp(1.6rem, 2.8vw, 2.8rem);
  font-weight: var(--display-weight);
  color: rgba(255,255,255,.8);
  letter-spacing: -.022em;
  margin-bottom: 10px;
}
.sf-year { font-size: 10px; color: rgba(186,186,186,.22); }
.sf-nav { display: flex; flex-direction: column; gap: 10px; }
.sf-link {
  font-size: 11px; color: rgba(186,186,186,.38);
  transition: color var(--dur-fast) ease;
}
.sf-link:hover { color: var(--white); }
.sf-right { display: flex; flex-direction: column; align-items: flex-end; gap: 9px; }
.sf-contact {
  font-size: 11px; color: rgba(186,186,186,.45);
  transition: color var(--dur-fast) ease;
  position: relative;
}
.sf-contact:hover { color: var(--accent); }

/* compact footer used on project/about/contact */
.pf {
  padding: 4vh var(--g);
  border-top: .5px solid rgba(186,186,186,.08);
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px;
}
.pf-name { font-size: 11px; color: rgba(186,186,186,.32); letter-spacing: .04em; }
.pf-links { display: flex; gap: 24px; }
.pf-link {
  font-size: 11px; color: rgba(186,186,186,.32);
  transition: color var(--dur-fast) ease;
}
.pf-link:hover { color: var(--white); }
.pf-yr { font-size: 11px; color: rgba(186,186,186,.2); }

/* ─── MOBILE ───────────────────────────────────────── */
@media (max-width: 720px) {
  :root { --g: 7vw; }
  .nav { padding: 20px var(--g); }
  .nav__links { gap: 22px; }
  .sf { grid-template-columns: 1fr; gap: 2.5rem; }
  .sf-right { align-items: flex-start; }
}
