/* ==========================================================================
   Laboratoire SoMA — stylesheet
   One file, no build step, no JavaScript.

   Design notes (Noguchi):
   - Mass and void. Whitespace is the primary material; content is placed
     asymmetrically against it rather than centred in boxes.
   - Materials, not decoration. Warm mulberry paper, sumi ink, stone grey,
     and a single Akari lantern glow. No shadows, no gradients on text,
     no rounded "cards".
   - Hairlines and ribbing. Structure is drawn with 1px rules, the way an
     Akari lamp is drawn with bamboo ribbing.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens
   -------------------------------------------------------------------------- */

:root {
  color-scheme: light dark;

  /* Both palettes, with every hex written exactly once.
     Light — mulberry paper. */
  --l-paper:      #f2eee5;
  --l-paper-sunk: #eae4d8;
  --l-ink:        #1b1a17;
  --l-ink-soft:   #3a3833;
  --l-stone:      #7c766c;
  --l-hair:       #d3cbbc;
  --l-glow:       #a85c2c;   /* Akari: warm light through paper */
  --l-form-a:     #ded6c6;
  --l-form-b:     #cdc3b1;

  /* Dark — basalt */
  --d-paper:      #161614;
  --d-paper-sunk: #1e1d1a;
  --d-ink:        #eae4d8;
  --d-ink-soft:   #cfc8ba;
  --d-stone:      #918a7e;
  --d-hair:       #38352f;
  --d-glow:       #d2913f;
  --d-form-a:     #2a2824;
  --d-form-b:     #35322c;

  /* Light is the default; the two blocks below switch the mapping. */
  --paper:      var(--l-paper);
  --paper-sunk: var(--l-paper-sunk);
  --ink:        var(--l-ink);
  --ink-soft:   var(--l-ink-soft);
  --stone:      var(--l-stone);
  --hair:       var(--l-hair);
  --glow:       var(--l-glow);
  --form-a:     var(--l-form-a);
  --form-b:     var(--l-form-b);

  /* Type — one neo-grotesque, used for everything. Swap the first name in
     --face to change the whole site; the <link> in each page's <head> has to
     match. --sans exists only so the old rules keep working; it points at the
     same face. */
  --face:  "Instrument Sans", "Helvetica Neue", "Helvetica", Arial, sans-serif;
  --sans:  var(--face);

  /* Rhythm */
  --measure: 33rem;          /* prose line length ≈ 62 characters at 19px */
  --label-col: 9.5rem;       /* left "wall label" column     */
  --gutter: clamp(1.25rem, 5vw, 4.5rem);
  --page-x: clamp(1.5rem, 6vw, 5.5rem);
  --band: clamp(3.5rem, 9vh, 6.5rem);  /* vertical space between bands */
  --aside: 13rem;            /* portraits and the plate under them */
}

/* The visitor's system setting, unless they have explicitly asked for light. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --paper:      var(--d-paper);
    --paper-sunk: var(--d-paper-sunk);
    --ink:        var(--d-ink);
    --ink-soft:   var(--d-ink-soft);
    --stone:      var(--d-stone);
    --hair:       var(--d-hair);
    --glow:       var(--d-glow);
    --form-a:     var(--d-form-a);
    --form-b:     var(--d-form-b);
  }
}

/* An explicit choice from the toggle always wins, either way. */
:root[data-theme="dark"] {
  color-scheme: dark;
  --paper:      var(--d-paper);
  --paper-sunk: var(--d-paper-sunk);
  --ink:        var(--d-ink);
  --ink-soft:   var(--d-ink-soft);
  --stone:      var(--d-stone);
  --hair:       var(--d-hair);
  --glow:       var(--d-glow);
  --form-a:     var(--d-form-a);
  --form-b:     var(--d-form-b);
}

:root[data-theme="light"] { color-scheme: light; }

/* --------------------------------------------------------------------------
   2. Reset / base
   -------------------------------------------------------------------------- */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  * { animation: none !important; transition: none !important; }
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--face);
  font-size: clamp(1.05rem, 1rem + 0.3vw, 1.19rem);
  font-weight: 400;
  line-height: 1.58;
  font-kerning: normal;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  transition: background-color 0.25s ease, color 0.25s ease;
}

img { max-width: 100%; height: auto; display: block; }

a { color: inherit; }

::selection { background: var(--glow); color: var(--paper); }

:focus-visible {
  outline: 2px solid var(--glow);
  outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   3. Typography
   -------------------------------------------------------------------------- */

h1, h2, h3, h4 {
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: -0.021em;   /* grotesques need the tracking pulled in at size */
  margin: 0 0 0.6em;
  text-wrap: balance;
}

/* The opening statement on each page. */
.display {
  font-size: clamp(2.1rem, 1.25rem + 3.5vw, 3.9rem);
  line-height: 1.06;
  letter-spacing: -0.03em;
  max-width: 19ch;
  margin: 0;
}

.display--wide { max-width: 26ch; }

h2 { font-size: clamp(1.5rem, 1.2rem + 1.1vw, 2rem); }
h3 { font-size: clamp(1.15rem, 1.05rem + 0.45vw, 1.35rem); line-height: 1.3; }

p { margin: 0 0 1.15em; max-width: var(--measure); }
p:last-child { margin-bottom: 0; }

strong, b { font-weight: 600; }

.lede {
  font-size: clamp(1.15rem, 1.05rem + 0.45vw, 1.4rem);
  line-height: 1.5;
  letter-spacing: -0.012em;
  color: var(--ink-soft);
  max-width: 38rem;
}

/* Museum wall label: small, letterspaced, quiet. */
.label {
  font-family: var(--sans);
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--stone);
  line-height: 1.5;
  margin: 0;
}

.label--num { font-variant-numeric: tabular-nums; }

/* Lists inside prose. */
.prose ul,
.prose ol {
  max-width: var(--measure);
  margin: 0 0 1.15em;
  padding-left: 1.15em;
}

.prose li { margin-bottom: 0.4em; }

.prose ul { list-style: none; padding-left: 0; }

.prose ul > li {
  position: relative;
  padding-left: 1.15em;
}

/* A hairline dash instead of a bullet. */
.prose ul > li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.82em;
  width: 0.55em;
  height: 1px;
  background: var(--stone);
}

/* Links in prose: hairline underline that thickens on hover. */
.prose a,
a.link {
  text-decoration: none;
  background-image: linear-gradient(var(--glow), var(--glow));
  background-size: 100% 1px;
  background-repeat: no-repeat;
  background-position: 0 100%;
  padding-bottom: 0.08em;
  transition: background-size 0.18s ease, color 0.18s ease;
}

.prose a:hover,
a.link:hover { color: var(--glow); background-size: 100% 2px; }

/* --------------------------------------------------------------------------
   4. Page frame
   -------------------------------------------------------------------------- */

.skip {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--ink);
  color: var(--paper);
  padding: 0.6rem 1rem;
  font-family: var(--sans);
  font-size: 0.8rem;
  z-index: 10;
}
.skip:focus { left: 0.5rem; top: 0.5rem; }

.shell {
  max-width: 70rem;
  margin: 0 auto;
  padding: 0 var(--page-x);
}

/* Header ------------------------------------------------------------------ */

.site-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.75rem clamp(1rem, 4vw, 3rem);
  padding: clamp(1.4rem, 4vh, 2.4rem) 0 clamp(1rem, 2.5vh, 1.5rem);
  border-bottom: 1px solid var(--hair);
}

.wordmark {
  display: inline-flex;
  align-items: baseline;
  gap: 0.55rem;
  text-decoration: none;
  white-space: nowrap;
}

/* SoMA — mixed case, so the tracking stays modest; wide letterspacing only
   works on an all-caps setting and would pull the lowercase o adrift. */
.wordmark__name {
  font-size: 1.14rem;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.wordmark__sub {
  font-family: var(--sans);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.17em;
  text-transform: uppercase;
  color: var(--stone);
}

/* Right-hand group: navigation plus the light switch. */
.site-head__end {
  display: flex;
  align-items: baseline;
  gap: 0.75rem clamp(1rem, 2.5vw, 1.9rem);
  flex-wrap: wrap;
}

/* The light switch is the Akari lamp in miniature: a paper shade with a hairline
   edge, and a light inside it that comes on. Hidden until theme.js removes the
   `hidden` attribute, so it never appears as a dead control without JS. */
.theme-toggle {
  appearance: none;
  -webkit-appearance: none;
  background: none;
  border: 0;
  padding: 0.25rem;
  margin: 0;
  cursor: pointer;
  line-height: 0;
  align-self: center;
  color: inherit;
}

.theme-toggle[hidden] { display: none; }

.theme-toggle__lamp {
  display: block;
  width: 0.95rem;
  height: 0.95rem;
  border-radius: 50%;
  border: 1px solid var(--stone);
  background: transparent;
  position: relative;
  transition: border-color 0.2s ease;
}

/* The light: a dot that grows into the shade when the dark theme is on. */
.theme-toggle__lamp::after {
  content: "";
  position: absolute;
  inset: 50%;
  border-radius: 50%;
  background: var(--glow);
  transform: translate(-50%, -50%);
  width: 0;
  height: 0;
  transition: width 0.22s ease, height 0.22s ease;
}

.theme-toggle[aria-pressed="true"] .theme-toggle__lamp::after {
  width: 0.5rem;
  height: 0.5rem;
}

.theme-toggle:hover .theme-toggle__lamp { border-color: var(--ink); }

/* Drop a logo file in here later; delete the element if you never add one. */
.wordmark__mark {
  width: 1.5rem;
  height: 1.5rem;
  flex: none;
  object-fit: contain;
}

.site-nav ul {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem clamp(0.9rem, 2.4vw, 1.9rem);
  list-style: none;
  margin: 0;
  padding: 0;
}

.site-nav a {
  font-family: var(--sans);
  font-size: 0.74rem;
  font-weight: 500;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--stone);
  padding-bottom: 0.15rem;
  border-bottom: 1px solid transparent;
  transition: color 0.18s ease, border-color 0.18s ease;
}

.site-nav a:hover { color: var(--ink); }

.site-nav a[aria-current="page"] {
  color: var(--ink);
  border-bottom-color: var(--glow);
}

/* Footer ------------------------------------------------------------------ */

.site-foot {
  margin-top: var(--band);
  padding: clamp(2rem, 5vh, 3rem) 0 clamp(2.5rem, 6vh, 4rem);
  border-top: 1px solid var(--hair);
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 1.75rem clamp(1.5rem, 5vw, 4rem);
  align-items: start;
}

.site-foot p { margin-bottom: 0.4rem; font-size: 0.95rem; color: var(--ink-soft); }
.site-foot .label { margin-bottom: 0.55rem; }

.foot-links {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.foot-links li { font-size: 0.95rem; color: var(--ink-soft); }

.foot-links a {
  font-size: 0.95rem;
  text-decoration: none;
  color: var(--ink-soft);
  border-bottom: 1px solid transparent;
}
.foot-links a:hover { color: var(--glow); border-bottom-color: var(--glow); }

.colophon {
  grid-column: 1 / -1;
  font-family: var(--sans);
  font-size: 0.7rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--stone);
  margin: 0.5rem 0 0;
}

/* --------------------------------------------------------------------------
   5. Bands and the asymmetric label grid
   -------------------------------------------------------------------------- */

.band { padding: var(--band) 0 0; }
.band--tight { padding-top: clamp(2.5rem, 7vh, 4.5rem); }
.band--rule { border-top: 1px solid var(--hair); margin-top: var(--band); padding-top: clamp(2.5rem, 7vh, 4.5rem); }

/* Wall label on the left, content on the right. Collapses on narrow screens. */
.row {
  display: grid;
  grid-template-columns: var(--label-col) minmax(0, 1fr);
  gap: var(--gutter);
  align-items: start;
}

.row > .label { padding-top: 0.45rem; }

@media (max-width: 47rem) {
  .row { grid-template-columns: 1fr; gap: 0.75rem; }
  .row > .label { padding-top: 0; }
}

/* --------------------------------------------------------------------------
   6. Home: the opening
   -------------------------------------------------------------------------- */

.opening {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 18rem);
  gap: clamp(2rem, 6vw, 5rem);
  align-items: center;
  padding: clamp(2.75rem, 9vh, 5.5rem) 0 clamp(2rem, 6vh, 3.5rem);
}

.opening__text { max-width: 34rem; }
.opening__text > .label { margin-bottom: 1.1rem; }
.opening__text .display { margin-bottom: 1.6rem; }

.opening__form { justify-self: end; width: min(100%, 18rem); }

@media (max-width: 48rem) {
  .opening { grid-template-columns: 1fr; padding-top: clamp(2rem, 7vh, 4rem); }
  .opening__form { justify-self: start; width: min(62%, 15rem); opacity: 0.95; }
}

/* The sculpture ----------------------------------------------------------- */

.sculpture {
  display: block;
  width: 100%;
  height: auto;
  overflow: visible;
  color: var(--glow);   /* the halo gradient picks this up as currentColor */
}
.sculpture .mass   { fill: var(--form-a); }
.sculpture .mass-2 { fill: var(--form-b); }
.sculpture .hair   { stroke: var(--hair); stroke-width: 1; fill: none; }
.sculpture .glow   { fill: var(--glow); }

/* The void is a hole cut through the mass, so it is page-coloured with a
   hairline edge — otherwise it disappears into the form around it. */
.sculpture .void   { fill: var(--paper); stroke: var(--hair); stroke-width: 1; }

/* Ribbing: the Akari reference, used as a divider. */
.ribbing {
  height: 1.75rem;
  border: 0;
  margin: clamp(2rem, 6vh, 3.5rem) 0 0;
  background-image: repeating-linear-gradient(
    to bottom,
    var(--hair) 0,
    var(--hair) 1px,
    transparent 1px,
    transparent 7px
  );
  -webkit-mask-image: linear-gradient(to right, #000 0%, #000 22%, transparent 78%);
          mask-image: linear-gradient(to right, #000 0%, #000 22%, transparent 78%);
}

/* --------------------------------------------------------------------------
   7. News
   -------------------------------------------------------------------------- */

.news { list-style: none; margin: 0; padding: 0; max-width: 46rem; }

.news li {
  display: grid;
  grid-template-columns: 6.5rem minmax(0, 1fr);
  gap: 0.35rem var(--gutter);
  padding: 0.95rem 0;
  border-top: 1px solid var(--hair);
}
.news li:last-child { border-bottom: 1px solid var(--hair); }

.news time {
  font-family: var(--sans);
  font-size: 0.72rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--stone);
  font-variant-numeric: tabular-nums;
  padding-top: 0.32rem;
}

.news p { margin: 0; max-width: none; }

@media (max-width: 40rem) {
  .news li { grid-template-columns: 1fr; }
  .news time { padding-top: 0; }
}

/* --------------------------------------------------------------------------
   8. Research
   -------------------------------------------------------------------------- */

.strand { padding: clamp(2.5rem, 7vh, 4.5rem) 0; border-top: 1px solid var(--hair); }
.strand:first-of-type { border-top: 0; padding-top: clamp(1.5rem, 4vh, 2.5rem); }

.strand__body { max-width: var(--measure); }

/* Figure slot. Drop a paper figure in and it sits on sunk paper with a hairline. */
.plate {
  margin: 1.75rem 0 0;
  max-width: 44rem;
}

.plate img {
  width: 100%;
  background: var(--paper-sunk);
  border: 1px solid var(--hair);
}

/* Empty slot placeholder — delete the class once a real image is in. */
.plate--empty {
  display: grid;
  place-items: center;
  min-height: 13rem;
  background: var(--paper-sunk);
  border: 1px solid var(--hair);
}

.plate figcaption {
  font-family: var(--sans);
  font-size: 0.74rem;
  line-height: 1.55;
  letter-spacing: 0.04em;
  color: var(--stone);
  margin-top: 0.7rem;
  max-width: 34rem;
}

/* Offset every other figure to break the column and keep the page asymmetric. */
@media (min-width: 62rem) {
  .plate--offset { margin-left: 4.5rem; }
}

/* --------------------------------------------------------------------------
   9. Publications
   -------------------------------------------------------------------------- */

.pubs { list-style: none; margin: 0; padding: 0; max-width: 46rem; }

.pub {
  padding: 1.35rem 0;
  border-top: 1px solid var(--hair);
}
.pub:first-child { border-top: 0; padding-top: 0.25rem; }

.pub h3 {
  font-size: 1.08rem;
  font-weight: 500;
  line-height: 1.36;
  letter-spacing: -0.012em;
  margin: 0 0 0.35rem;
  max-width: 42rem;
}

.pub h3 a,
.entry h3 a { text-decoration: none; border-bottom: 1px solid var(--hair); }
.pub h3 a:hover,
.entry h3 a:hover { color: var(--glow); border-bottom-color: var(--glow); }

.pub__authors {
  margin: 0 0 0.2rem;
  font-size: 0.95rem;
  color: var(--ink-soft);
  max-width: 44rem;
}

.pub__authors .me { font-weight: 600; color: var(--ink); }

.pub__venue {
  margin: 0;
  font-size: 0.95rem;
  color: var(--stone);
  font-style: italic;
}

.pub__links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.05rem;
  list-style: none;
  margin: 0.55rem 0 0;
  padding: 0;
}

.pub__links a {
  font-family: var(--sans);
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--stone);
  border-bottom: 1px solid var(--hair);
  padding-bottom: 0.1rem;
}
.pub__links a:hover { color: var(--glow); border-bottom-color: var(--glow); }

.year-group { padding-top: clamp(2rem, 5vh, 3rem); }
.year-group:first-of-type { padding-top: clamp(1rem, 3vh, 1.75rem); }

.year-group > .label--num {
  font-size: 0.85rem;
  letter-spacing: 0.12em;
  color: var(--ink);
}

.footnote {
  font-size: 0.85rem;
  color: var(--stone);
  max-width: 44rem;
  margin-top: 2rem;
}

/* --------------------------------------------------------------------------
   10. People
   -------------------------------------------------------------------------- */

/* One list, one treatment. The PI is first in it and that is the only
   distinction — no separate block, no larger portrait. */
.roster {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 52rem;
}

.person {
  display: grid;
  grid-template-columns: var(--aside) minmax(0, 1fr);
  gap: clamp(1.25rem, 3vw, 2.25rem);
  align-items: start;
  padding: clamp(1.5rem, 4vh, 2.25rem) 0;
  border-top: 1px solid var(--hair);
}

.person:first-child { border-top: 0; padding-top: 0.5rem; }

@media (max-width: 40rem) {
  .person { grid-template-columns: 1fr; gap: 0.9rem; }
}

/* The left column of a person row. Usually just a portrait; it can also carry
   a plate underneath, which is why it is a stack rather than a bare <img>.

   --aside is the single width both images obey. It is also a max-width here, so
   that when the grid collapses to one column on a phone the stack keeps the same
   size instead of stretching to the full screen. */
.person__aside {
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
  width: 100%;
  max-width: var(--aside);
}

/* A picture that belongs to a person rather than to the lab: same width as the
   portrait, its own caption, no desaturation — the work keeps its own tone. */
.person__plate { margin: 0; }

.person__plate img {
  width: 100%;
  border: 1px solid var(--hair);
  background: var(--paper-sunk);
}

.person__plate figcaption {
  font-family: var(--sans);
  font-size: 0.66rem;
  line-height: 1.45;
  color: var(--stone);
  margin-top: 0.45rem;
}

/* Portraits stay small on purpose — a roster of faces, not a wall of them. */
.person__portrait {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--paper-sunk);
  border: 1px solid var(--hair);
  filter: grayscale(0.25) sepia(0.06);
}

/* An empty slot is a plain sunk panel: quiet enough to leave in place while
   you collect photos. */
.person__portrait--empty {
  display: block;
  background: var(--paper-sunk);
}

.person h3 { font-size: 1.05rem; font-weight: 500; margin: 0 0 0.1rem; letter-spacing: 0; }
/* The role line under a name carries a title, an institution and a place, which
   is too much text for the letterspaced caps of a wall label. Sentence case,
   near-normal tracking — still quiet, but it reads as a line rather than shouts. */
.person .label {
  margin-bottom: 0.45rem;
  text-transform: none;
  letter-spacing: 0.02em;
  font-size: 0.78rem;
}
/* Capped so a person's blurb wraps at the same measure as the rest of the site. */
.person p { font-size: 0.93rem; margin: 0 0 0.5rem; color: var(--ink-soft); max-width: 32rem; }

/* Name line — the name, plus optional flags sitting on the same baseline.
   Both parts are optional company for each other: a name alone is fine. */
.person__name {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.4rem;
}

/* Flags are the one place colour enters the page, so they stay small and are
   never the thing you notice first. The emoji stack matters: without it,
   Linux and some Windows machines fall back to letter pairs (IT, FR). */
.person__flags {
  font-size: 0.82em;
  line-height: 1;
  letter-spacing: 0.02em;
  /* Two flags typed with an ordinary space sit too far apart, so the space is
     pulled in here — that way nobody has to type an invisible thin space. */
  word-spacing: -0.22em;
  font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji",
               "Twemoji Mozilla", sans-serif;
}

/* A flag inside a facts line marks where that institution is. Bumped back up
   because the facts list is already small type. */
.person__facts .person__flags { font-size: 0.95em; }

/* Optional facts under the name: degrees, previous posts, one line each.
   Hairline dashes rather than bullets, to match the prose lists. */
.person__facts {
  list-style: none;
  margin: 0.5rem 0 0.6rem;
  padding: 0;
}

/* Dates sit in their own column on the left, so the years line up down the
   list and the eye can read them as a spine — the same move as the news list
   and the year labels on the publications page. A fact with no date simply
   leaves that cell empty and still aligns. */
.person__facts li {
  display: grid;
  grid-template-columns: 5rem minmax(0, 1fr);
  gap: 0 0.85rem;
  margin-bottom: 0.25rem;
  font-size: 0.86rem;
  line-height: 1.45;
  color: var(--ink-soft);
}

.person__facts .when {
  color: var(--stone);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

@media (max-width: 30rem) {
  .person__facts li { grid-template-columns: 4.5rem minmax(0, 1fr); gap: 0 0.6rem; }
}

.person__links {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem 0.85rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.person__links a {
  font-family: var(--sans);
  font-size: 0.68rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--stone);
  border-bottom: 1px solid var(--hair);
}
.person__links a:hover { color: var(--glow); border-bottom-color: var(--glow); }

/* Written-out address: sits with the links but stays lower case, since an
   email set in caps is unreadable. */
.person__email {
  font-family: var(--sans);
  font-size: 0.8rem;
  color: var(--stone);
  margin: 0.5rem 0 0;
  max-width: none;
}

/* Alumni: a plain list, not a grid of faces. */
.alumni { list-style: none; margin: 0; padding: 0; max-width: 44rem; }
.alumni li {
  padding: 0.7rem 0;
  border-top: 1px solid var(--hair);
  font-size: 0.97rem;
}
.alumni li:last-child { border-bottom: 1px solid var(--hair); }
.alumni span { color: var(--stone); font-size: 0.88rem; }

/* --------------------------------------------------------------------------
   11. Teaching / generic entry lists
   -------------------------------------------------------------------------- */

.entries { list-style: none; margin: 0; padding: 0; max-width: 46rem; }

.entry { padding: 1.3rem 0; border-top: 1px solid var(--hair); }
.entry:first-child { border-top: 0; padding-top: 0.25rem; }
.entry h3 { margin: 0.15rem 0 0.35rem; font-weight: 400; }
.entry p { font-size: 0.97rem; color: var(--ink-soft); }

/* --------------------------------------------------------------------------
   12. Join / contact
   -------------------------------------------------------------------------- */

.tracks {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  gap: clamp(1.5rem, 4vw, 3rem);
  max-width: 56rem;
}

.track { border-top: 1px solid var(--hair); padding-top: 1rem; }
.track h3 { font-size: 1.05rem; font-weight: 500; margin-bottom: 0.4rem; }
.track p { font-size: 0.95rem; max-width: none; color: var(--ink-soft); }

/* Three columns at desktop width: post, visiting, online. The minimum is set
   so all three fit the content column rather than wrapping to two and leaving
   the third stranded under the address. */
.contact-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11.5rem, 1fr));
  gap: clamp(1.5rem, 3.5vw, 2.5rem);
  max-width: 56rem;
}

/* The address is written out rather than linked, so this is a span: no
   underline, nothing that looks clickable when it is not. */
.mailto {
  font-size: clamp(1.1rem, 1rem + 0.7vw, 1.5rem);
  letter-spacing: -0.012em;
}

/* Anything still to be filled in. Search the source for "todo" to find them. */
.todo {
  background: var(--paper-sunk);
  border-bottom: 1px dashed var(--glow);
  padding: 0 0.22em;
  color: var(--glow);
  font-style: normal;
}

/* --------------------------------------------------------------------------
   13. Print
   -------------------------------------------------------------------------- */

@media print {
  .site-nav, .sculpture, .ribbing, .skip { display: none; }
  body { background: #fff; color: #000; font-size: 11pt; }
  .band, .strand, .pub { break-inside: avoid; }
  a { text-decoration: underline; }
}
