/* =====================================================================
   anoushka — portfolio
   Reference: "website reference pdf" (7 pages).
   Voice: typewriter mono for everything structural, handwriting for the
   asides, book italic for captions. Paper background sitewide, colour
   only in the logo/nav stickers and in the photographs themselves.
   ===================================================================== */

/* ---------- tokens ---------- */
:root{
  color-scheme:light;
  --paper:#f2efe8;          /* the shade from p.2 — used on every page */
  --paper-deep:#e9e4d8;     /* inset panels, film-index rails */
  --ink:#151412;
  --ink-70:rgba(21,20,18,.70);   /* 6.9:1 on paper */
  --ink-dim:rgba(21,20,18,.62);  /* 4.7:1 — the quietest text allowed anywhere */
  --ink-25:rgba(21,20,18,.25);   /* rules and hairlines only, never text */
  --grey:#3b3a36;           /* p.5: "font colour would be a dark grey" */
  --rule:rgba(21,20,18,.16);

  /* p.7 (about + contact) is the one reference page set in a grotesque
     rather than the typewriter, and its whole column is printed red. */
  --sans:"Figtree","Helvetica Neue",Helvetica,Arial,sans-serif;
  --red:#9c3a33;        /* 6:1 on paper — picker option 01 */
  --red-deep:#6a2724;   /* hover / pressed */

  /* the only colour in the UI — logo + nav stickers */
  --pink:#ff8fb1;
  --cyan:#6cc8e6;
  --violet:#b09aff;
  --yellow:#ffd84d;
  --green:#8ad98f;

  /* Type scale. The small labels had drifted across fourteen values between
     .62 and .92rem — differences of a third of a pixel that read as noise
     rather than hierarchy. Four steps, used by role. */
  --fs-2xs:.66rem;   /* 10.6px — micro labels, counters, laurel captions */
  --fs-xs:.72rem;    /* 11.5px — mono labels, nav, credits, meta */
  --fs-sm:.8rem;     /* 12.8px — captions, index titles, table rows */
  --fs-md:.88rem;    /* 14.1px — body copy */

  --pad:clamp(18px,3.6vw,54px);
  --ease:cubic-bezier(.22,.61,.36,1);
  --fade:520ms;

  /* jagged sticker edge, shared by the logo and every nav chip */
  --burst:polygon(0% 38%,5% 24%,17% 30%,23% 12%,37% 23%,50% 4%,63% 23%,77% 12%,83% 30%,95% 24%,100% 38%,93% 50%,100% 62%,95% 76%,83% 70%,77% 88%,63% 77%,50% 96%,37% 77%,23% 88%,17% 70%,5% 76%,0% 62%,7% 50%);
}

/* =====================================================================
   PHONE TYPE SCALE
   The desktop scale was built for a screen two feet from your face. On a
   phone held at arm's length the same tokens render 10.6–14px, which is
   what made the whole site read as a laptop page shrunk down — every label,
   every caption, every nav item. The four tokens are redefined once here
   and the entire site lifts with them.
   ===================================================================== */
@media (max-width:640px){
  :root{
    --fs-2xs:.78rem;   /* 12.5px — tracked caps, counters, laurel captions */
    --fs-xs:.84rem;    /* 13.4px — mono labels, nav, credits, meta */
    --fs-sm:.94rem;    /* 15px   — captions, index titles, table rows */
    --fs-md:1.05rem;   /* 16.8px — body copy */
    --pad:clamp(20px,5.4vw,30px);
  }
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  min-height:100svh;display:flex;flex-direction:column;
  font-family:"Courier Prime",ui-monospace,"Courier New",monospace;
  font-size:15px;line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
img,video{display:block;max-width:100%}
picture{display:block}
a{color:inherit;text-decoration:none}
:focus-visible{outline:1.5px solid var(--ink);outline-offset:3px}
::selection{background:var(--ink);color:var(--paper)}

/* keyboard: jump past the sticker nav straight to the work */
.skip{
  position:absolute;left:-9999px;top:0;z-index:99;
  padding:12px 18px;background:var(--ink);color:var(--paper);
  font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;
}
.skip:focus{left:var(--pad);top:var(--pad)}
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* ---------- type helpers ---------- */
.mono-label{                       /* the Teller index voice — p.4 */
  font-size:var(--fs-xs);letter-spacing:.14em;text-transform:uppercase;
}
.hand{                             /* the felt-pen asides — p.2 */
  font-family:"Caveat",cursive;font-weight:700;
  font-size:clamp(1.4rem,2.5vw,2.1rem);line-height:1.1;letter-spacing:.01em;
}
/* EB Garamond runs small optically, so the location/date line sits just above
   the scale's --fs-md on purpose. The only deliberate exception. */
.cap-italic{                       /* location + date — p.4 */
  font-family:"EB Garamond",Georgia,serif;font-style:italic;
  font-size:.92rem;letter-spacing:.01em;color:var(--ink-70);
}

/* =====================================================================
   HEADER  —  sticker logo left, live date, sticker nav right
   ===================================================================== */
.hdr{
  position:relative;z-index:20;
  display:flex;align-items:flex-start;justify-content:space-between;gap:24px;
  padding:calc(var(--pad) + env(safe-area-inset-top,0px))
          calc(var(--pad) + env(safe-area-inset-right,0px)) 0
          calc(var(--pad) + env(safe-area-inset-left,0px));
}
.hdr-left{display:flex;flex-direction:column;gap:10px}

.logo{
  display:inline-flex;flex-direction:column;align-items:flex-start;gap:1px;
  align-self:flex-start;               /* .hdr-left is a column flex: the hit
                                          area must not stretch to its width */
  justify-content:center;min-height:44px;   /* thumb target; the mark keeps its size */
  rotate:-2deg;                        /* `rotate:`, never `transform:` — see .rise */
  line-height:1;text-decoration:none;color:var(--ink);
  transition:opacity 300ms var(--ease);
}
.logo:hover{opacity:.72}
.logo-word{
  font-family:"Caveat",cursive;font-weight:700;
  font-size:1.62rem;letter-spacing:.005em;
}
/* .319em of the mark's size — the same 8px dash the option sheet drew. The box
   is almost nothing; `non-scaling-stroke` keeps the 2px line at full weight
   however far the path is squashed, and that stroke IS the mark. */
.logo-rule{
  display:block;width:.319em;height:auto;overflow:visible;
  font-size:1.62rem;
}

.chips{display:flex;flex-wrap:wrap;gap:10px;justify-content:flex-end;padding-top:4px}
.chip{
  position:relative;display:inline-flex;align-items:center;justify-content:center;
  min-height:44px;padding:8px 16px;                 /* 44px tap target, small visible badge */
  font-size:var(--fs-2xs);letter-spacing:.1em;text-transform:uppercase;
  transition:transform 300ms var(--ease);
}
.chip:active{transform:scale(.97)}
.chip::before,.chip::after{content:"";position:absolute;inset:0;clip-path:var(--burst);z-index:-1}
.chip::before{background:var(--ink);inset:-2px}
.chip::after{background:var(--c)}
.chip:nth-child(1){--c:var(--pink);transform:rotate(-2deg)}
.chip:nth-child(2){--c:var(--cyan);transform:rotate(1.5deg)}
.chip:nth-child(3){--c:var(--violet);transform:rotate(-1deg)}
.chip:nth-child(4){--c:var(--yellow);transform:rotate(2deg)}
.chip:nth-child(5){--c:var(--green);transform:rotate(-1.5deg)}
.chip:hover,.chip:focus-visible{transform:rotate(0deg) scale(1.06)}
.chip[aria-current="page"]{text-decoration:underline;text-underline-offset:3px}

/* =====================================================================
   HOME  —  two panels stacked in one fixed frame (p.2 then p.3).
   A 200svh rail behind them supplies the scroll travel and the snap
   points; scrolling scrubs the crossfade. Reduced motion drops the rail
   and the two panels simply stack as an ordinary page.
   ===================================================================== */
.home-stack{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.panels{position:relative;flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
.panel{display:flex;flex-direction:column;min-height:0;flex:1 1 auto}
.home-rail{display:none}

@media (prefers-reduced-motion:no-preference){
  .home-stack{position:fixed;inset:0;z-index:2}
  .panel{position:absolute;inset:0;will-change:opacity}
  .panel-feat{opacity:0}
  .panel.is-off{visibility:hidden;pointer-events:none}
  .home-rail{display:block;height:200svh}
  .home-rail i{display:block;height:100svh;scroll-snap-align:start;scroll-snap-stop:always}
  html.snap{scroll-snap-type:y mandatory}
}
@media (prefers-reduced-motion:reduce){
  .panel{min-height:100svh}
}

.panel-hero{position:relative;overflow:hidden;padding:0 var(--pad)}
/* the row takes every pixel the header leaves; the photo is bottom-anchored
   inside it, so her cut-off edge meets the bottom of the page at any size */
.hero-row{
  flex:1 1 auto;min-height:0;
  display:flex;align-items:stretch;justify-content:center;
  gap:clamp(10px,3vw,58px);
}
/* The figure takes its width from the photograph's own shape (1080x1380) times
   the height the row gives it, and the picture fills it absolutely. Letting the
   <img> size the figure instead works in Chrome but not Safari: Safari sizes the
   figure from the file's intrinsic 1080px width, pins the photo to its left edge
   and hangs the role words off a box twice her width. This is a ratio on the
   wrapper, not on the image, and the image is eager, so the lazy-load trap in
   CLAUDE.md does not apply. Re-measure if the portrait is replaced. */
.portrait{
  margin:0;position:relative;z-index:2;min-height:0;flex:0 1 auto;
  aspect-ratio:1080/1380;max-width:100%;
  height:100%;     /* Safari only derives the width from the ratio off a stated
                      height — the row's stretch alone leaves it 0px wide */
}
.portrait picture{position:absolute;inset:0;display:block}
.portrait img{
  width:100%;height:100%;
  object-fit:contain;object-position:bottom center;
}
.role{                              /* positioned against the photo, not the page */
  position:absolute;z-index:3;
  left:var(--x);top:var(--y);transform:translate(-50%,-50%);
  text-align:center;font-size:var(--fs-xs);letter-spacing:.1em;color:var(--ink);
  white-space:nowrap;pointer-events:none;
}
.role b{display:block;font-weight:400}
.role i{display:block;font-style:normal;font-size:var(--fs-2xs);margin-top:3px}
.hand-note{flex:1 1 0;align-self:center;z-index:4;max-width:26ch}
/* the same top margin on both, so with align-self:center their middles sit on
   one line: "hi! i'm a…" level with the middle of the two-line location note,
   as on the phone (her ask, 2026-10-05; the left one was 9vh) */
.hand-note.left{margin-left:auto;text-align:right;transform:rotate(-2deg);margin-top:3vh}
.hand-note.right{margin-right:auto;text-align:center;transform:rotate(1.5deg);margin-top:3vh}
.roles-line{display:none}

/* the written scroll cue */
.cue{
  position:absolute;z-index:5;
  right:calc(var(--pad) + env(safe-area-inset-right,0px));
  bottom:calc(clamp(12px,2.4vh,26px) + env(safe-area-inset-bottom,0px));
  display:flex;flex-direction:column;align-items:center;gap:1px;
  color:var(--ink);text-align:center;
  text-shadow:0 0 9px var(--paper),0 0 18px var(--paper);
}
.cue-arrow{filter:drop-shadow(0 0 6px var(--paper)) drop-shadow(0 0 12px var(--paper))}
.cue .hand{font-size:clamp(1.05rem,1.5vw,1.4rem);transform:rotate(-2deg);line-height:1.1}
.cue-arrow{width:clamp(15px,1.5vw,21px);height:auto}
@media (prefers-reduced-motion:no-preference){
  .cue-arrow{animation:cue-bob 2.6s var(--ease) infinite}
  @keyframes cue-bob{0%,100%{translate:0 0}50%{translate:0 5px}}
}
.cue:hover .hand{text-decoration:underline;text-underline-offset:4px}
.cue-back{margin:0 0 10px}

/* =====================================================================
   PAGE FURNITURE  —  shared by every inner page
   ===================================================================== */
.wrap{padding:0 var(--pad);flex:1 1 auto}
.page-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:24px;
  flex-wrap:wrap;
  padding:clamp(34px,7vh,72px) 0 clamp(20px,4vh,36px);
}
.page-title{
  margin:0;font-weight:400;font-size:clamp(1rem,1.5vw,1.15rem);
  letter-spacing:.2em;text-transform:uppercase;
}
.back{font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-70)}
.back:hover{color:var(--ink)}
.rule{height:1px;background:var(--rule);border:0;margin:0}

.foot{
  display:flex;flex-wrap:wrap;gap:8px 28px;justify-content:space-between;
  align-items:baseline;
  padding:clamp(48px,9vh,96px) calc(var(--pad) + env(safe-area-inset-right,0px))
          calc(var(--pad) + 6px + env(safe-area-inset-bottom,0px))
          calc(var(--pad) + env(safe-area-inset-left,0px));
  font-size:var(--fs-2xs);letter-spacing:.11em;text-transform:uppercase;color:var(--ink-dim);
}
.foot a:hover{color:var(--ink)}
.foot nav{display:flex;gap:20px;flex-wrap:wrap}

/* =====================================================================
   PHOTOGRAPHY  —  p.4: magazine index, title card = name + one photo,
   italic location/date set vertically along the plate, like the book.
   ===================================================================== */
.index-block{
  display:grid;grid-template-columns:auto 1fr auto;gap:4px 18px;
  align-items:baseline;max-width:52ch;margin-bottom:clamp(40px,8vh,86px);
}
.index-block .ix-h{grid-column:1/-1;margin-bottom:14px}
.index-row{display:contents}
.index-row > *{padding:5px 0;border-bottom:1px solid var(--rule)}
.index-row .num{font-size:var(--fs-xs);letter-spacing:.1em;color:var(--ink-dim)}
.index-row .nm{font-size:var(--fs-sm);letter-spacing:.13em;text-transform:uppercase}
.index-row .pl{font-size:var(--fs-xs);color:var(--ink-dim);font-variant-numeric:tabular-nums}
.index-row:hover .nm{text-decoration:underline;text-underline-offset:4px}

.plates{
  display:grid;grid-template-columns:repeat(12,1fr);
  gap:clamp(28px,5vw,72px) clamp(20px,3vw,48px);
  padding-bottom:clamp(40px,8vh,90px);
}
.plate{margin:0;position:relative;display:flex;gap:14px;align-items:flex-start}
.plate-media{flex:1 1 auto;min-width:0}
.plate img{width:100%;height:auto;background:var(--paper-deep)}
.plate figcaption{
  flex:0 0 auto;writing-mode:vertical-rl;
  font-family:"EB Garamond",Georgia,serif;font-style:italic;font-size:var(--fs-sm);
  color:var(--ink-70);letter-spacing:.02em;max-height:100%;
}
.plate-title{
  display:block;margin-bottom:10px;
  font-size:var(--fs-sm);letter-spacing:.14em;text-transform:uppercase;
}
.plate-title .rn{color:var(--ink-dim);margin-right:12px}
.plate a:hover .plate-title{text-decoration:underline;text-underline-offset:4px}
.plate img{transition:opacity 520ms var(--ease)}
.plate a:hover img{opacity:.86}
/* asymmetric magazine placement */
.plate:nth-child(1){grid-column:1/6}
.plate:nth-child(2){grid-column:7/12;margin-top:clamp(30px,7vw,120px)}
.plate:nth-child(3){grid-column:2/7}
.plate:nth-child(4){grid-column:8/13;margin-top:clamp(-40px,-3vw,0px)}
.plate:nth-child(5){grid-column:4/10}

/* series page — "aligned in different sizes, not all the same size" */
.series-head{max-width:60ch;padding-bottom:clamp(24px,5vh,48px)}
.series-head h1{
  margin:0 0 10px;font-weight:400;font-size:clamp(1.3rem,3vw,2.2rem);
  letter-spacing:.06em;text-transform:uppercase;
}
.spread{
  display:grid;grid-template-columns:repeat(12,1fr);
  gap:clamp(26px,4vw,64px) clamp(18px,2.6vw,44px);
  padding-bottom:clamp(50px,10vh,110px);
}
.spread figure{margin:0}
.spread img{width:100%;height:auto;background:var(--paper-deep)}
.spread figcaption{
  margin-top:8px;font-family:"EB Garamond",Georgia,serif;font-style:italic;
  font-size:var(--fs-sm);color:var(--ink-dim);
}
.spread figure:nth-child(6n+1){grid-column:1/7}
.spread figure:nth-child(6n+2){grid-column:8/13;align-self:end}
.spread figure:nth-child(6n+3){grid-column:3/8;margin-top:clamp(10px,3vw,50px)}
.spread figure:nth-child(6n+4){grid-column:9/13}
.spread figure:nth-child(6n+5){grid-column:2/6}
.spread figure:nth-child(6n+6){grid-column:6/12}
.series-nav{
  display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;
  padding-bottom:clamp(20px,4vh,40px);
  font-size:var(--fs-xs);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-70);
}
.series-nav a{min-height:44px;display:inline-flex;align-items:center}
.series-nav a:hover{color:var(--ink)}

/* =====================================================================
   FILMS  —  p.5: index right (No / Title / Duration), clips left,
   the clicked one enlarges. Paper ground, dark-grey type.
   ===================================================================== */
.films{flex:1 1 auto;color:var(--grey);display:grid;grid-template-columns:minmax(210px,27%) 1fr;
  gap:clamp(24px,4vw,64px);padding:0 var(--pad);align-items:start}
.reel{
  position:sticky;top:var(--pad);max-height:calc(100svh - var(--pad) * 2);
  overflow-y:auto;overscroll-behavior:contain;
  display:flex;flex-direction:column;gap:10px;padding-right:4px;
  scrollbar-width:thin;
}
.reel-item{
  position:relative;display:block;width:74%;margin-left:auto;border:0;padding:0;background:none;
  cursor:pointer;opacity:.45;filter:saturate(.5);
  transition:opacity 480ms var(--ease),filter 480ms var(--ease),width 480ms var(--ease);
}
.reel-item[data-active="true"]{width:100%}
.reel-item img,.reel-item video{width:100%;height:auto;aspect-ratio:auto 16/9;object-fit:cover}
.reel-item[data-active="true"]{opacity:1;filter:none}
.reel-item:hover{opacity:.85}
.reel-item .rl{
  display:flex;justify-content:space-between;gap:12px;
  padding:7px 1px 0;font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;
  color:var(--grey);opacity:0;transition:opacity 340ms var(--ease);
}
.reel-item[data-active="true"] .rl{opacity:1}

/* The index sits in the vertical middle of its column, beside the reel. It
   once started level with the first clip instead; centred is her call
   (2026-10-04). Phones stack it under the reel, where this does not apply. */
.filmography{
  min-height:0;
  display:flex;flex-direction:column;justify-content:center;
}
.fx-head,.fx-row{
  display:grid;grid-template-columns:3.2rem 1fr 9rem;gap:16px;align-items:baseline;
}
.fx-head{
  font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-dim);
  padding-bottom:10px;border-bottom:1px solid var(--rule);margin-bottom:14px;
}
.fx-row{
  width:100%;text-align:left;border:0;background:none;cursor:pointer;color:var(--grey);
  font:inherit;padding:7px 0;font-size:var(--fs-sm);letter-spacing:.06em;text-transform:uppercase;
  transition:color 300ms var(--ease),opacity 300ms var(--ease);opacity:.78;
}
.fx-row .kind{font-size:var(--fs-xs);letter-spacing:.08em;color:var(--ink-dim)}
.fx-row[data-active="true"] .kind{color:var(--grey)}
.fx-row:hover{opacity:.94}
.fx-row[data-active="true"]{opacity:1;color:var(--ink)}
.fx-list{border-bottom:1px solid var(--rule);padding-bottom:12px}
.open-film{
  display:inline-block;margin-top:18px;font-family:"Caveat",cursive;font-weight:700;
  font-size:1.35rem;color:var(--ink);
}
.open-film:hover{text-decoration:underline;text-underline-offset:4px}

/* =====================================================================
   FILMS  —  cinema index: a stack of poster cards into the sheets
   ===================================================================== */
.posters{
  display:flex;flex-direction:column;gap:clamp(44px,8vh,104px);
  padding:clamp(26px,5vh,58px) 0 clamp(50px,9vh,110px);
}
.poster{margin:0;width:min(100%,760px)}
.poster:nth-child(even){margin-left:auto}
.poster a{display:block}
.poster-media{
  position:relative;display:block;background:var(--paper-deep);overflow:hidden;
}
.poster-media img{
  width:100%;height:auto;aspect-ratio:auto 16/9;object-fit:cover;display:block;
  transition:opacity 520ms var(--ease),scale 720ms var(--ease);
}
.poster-media::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(120% 100% at 50% 45%,rgba(0,0,0,.10),rgba(0,0,0,.48));
}
.poster-title{
  position:absolute;inset:0;z-index:2;display:grid;place-items:center;
  padding:0 7%;text-align:center;text-wrap:balance;
  font-family:"Caveat Brush",cursive;line-height:.92;color:#f7f3ea;
  font-size:clamp(1.9rem,4.6vw,3.6rem);
}
.poster a:hover .poster-media img{opacity:.92;scale:1.015}
.poster-foot{
  display:flex;flex-wrap:wrap;gap:6px 20px;justify-content:space-between;
  padding-top:11px;font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;
  color:var(--ink-70);
}
.poster-no{color:var(--ink-dim)}
.poster-line{margin:9px 0 0;max-width:48ch;font-size:var(--fs-sm);color:var(--ink-dim);line-height:1.7}

/* =====================================================================
   FILM PAGE  —  p.6: the still is the ground, the title is the subject,
   "a film by anoushka" always in the same place, laurels below.
   ===================================================================== */
.film-sheet{
  position:relative;flex:1 1 auto;min-height:100svh;
  overflow:hidden;background:#0d0c0b;
}
/* one film. Two of these overlap while the fade runs. */
.film-layer{
  position:absolute;inset:0;
  display:flex;flex-direction:column;                /* nav / body / laurels */
  padding:calc(var(--pad) + env(safe-area-inset-top,0px))
          calc(var(--pad) + env(safe-area-inset-right,0px))
          calc(var(--pad) + env(safe-area-inset-bottom,0px))
          calc(var(--pad) + env(safe-area-inset-left,0px));
  color:#f6f2e9;
}
@media (prefers-reduced-motion:no-preference){
  /* the same cross-fade the photography viewer uses between plates */
  .film-layer{transition:opacity var(--fade) var(--ease);will-change:opacity}
  .film-layer.is-in,.film-layer.is-out{opacity:0}
}
/* The wrapper is the box that covers the sheet, and the still fills it. With
   the wrapper as display:contents Safari resolved the still's height:100%
   against nothing, drew it at its natural 16:9-ish height and left the laurel
   band sitting on the bare dark sheet underneath. */
.still-wrap{position:absolute;inset:0;display:block}
.film-layer .still{
  display:block;width:100%;height:100%;object-fit:cover;
  filter:saturate(.92) contrast(1.03);
}
.film-layer::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(120% 90% at 50% 40%,rgba(0,0,0,.12),rgba(0,0,0,.55));
}
.film-body{
  position:relative;z-index:2;text-align:center;
  width:min(1100px,100%);margin:auto;               /* centres in what is left */
}
/* The title is her own artwork. It is never scaled past its encoded width, so
   it stays crisp; small marks simply sit smaller on the sheet. */
.film-title{
  margin:0;line-height:0;
  height:clamp(160px,31vh,310px);          /* one slot, every film */
  display:flex;align-items:center;justify-content:center;
}
.film-title a{display:flex;align-items:center;justify-content:center;height:100%}
.film-art{
  display:block;max-width:86vw;max-height:100%;
  object-fit:contain;margin:0 auto;
}
.film-title a:hover .film-art{opacity:.88}
.film-watch{
  margin-top:clamp(14px,2.2vh,22px);min-height:44px;
  font-size:var(--fs-2xs);letter-spacing:.2em;text-transform:uppercase;
}
/* "Watch" and "Coming soon" are the same line in two states, so they are
   styled together — no rule under either of them. */
.film-watch a,.film-soon{
  color:rgba(246,242,233,.9);
  display:inline-flex;min-height:44px;align-items:center;
}
.film-watch a{transition:color 300ms var(--ease)}
.film-watch a:hover{color:#fff}
.film-soon{color:rgba(246,242,233,.66)}   /* nothing to click yet, so quieter */
.film-by{
  margin:clamp(18px,3vh,34px) 0 0;
  font-size:var(--fs-xs);letter-spacing:.24em;text-transform:uppercase;color:rgba(246,242,233,.86);
}
.film-meta{
  margin-top:8px;font-size:var(--fs-2xs);letter-spacing:.16em;text-transform:uppercase;
  color:rgba(246,242,233,.78);
}
/* Always rendered, even for a film with no laurels, and with one row's height
   reserved — that is what keeps the title block sitting at the same height on
   all seven sheets instead of drifting with the festival count. */
.laurels{
  position:relative;z-index:2;flex:none;width:100%;
  display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:clamp(13px,1.9vh,24px) clamp(18px,3.2vw,52px);
  padding-top:clamp(16px,3vh,32px);
  /* the reserve has to include the band's own padding, or an empty band comes
     out shorter than a filled one and the title block drifts between films */
  min-height:calc(clamp(44px,6.4vh,74px) + clamp(16px,3vh,32px));
}
/* The festival artwork itself, normalised to one ink. Height is set and width
   left auto so each mark keeps its own proportions. */
.laurel{
  display:block;width:auto;height:clamp(44px,6.4vh,74px);
  opacity:.88;flex:none;
  pointer-events:none;        /* belt and braces: a mark never eats a click */
}
.film-sheet :focus-visible{outline-color:#f6f2e9}
.film-nav{
  position:relative;z-index:3;width:100%;flex:none;
  /* `space-between` only centres the counter when the two outer items happen to
     be the same width, and they never are — "Home" is a third of "Prev / Next",
     which pushed the count 42px left. Equal fr columns centre it by construction. */
  display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:16px;
  font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;color:rgba(246,242,233,.75);
}
.film-nav a:hover{color:#fff}
.film-nav > :first-child{justify-self:start}
.film-nav > :last-child{justify-self:end}
.film-nav > *{white-space:nowrap}
.film-step{display:inline-flex;align-items:center;gap:clamp(8px,1.4vw,16px)}
.film-sep{font-style:normal;opacity:.45}
.film-count{
  justify-self:center;text-align:center;
  color:rgba(246,242,233,.6);font-variant-numeric:tabular-nums;
}

/* =====================================================================
   FEATURED  —  p.3: left information + plates, right a portrait
   ===================================================================== */
/* The photograph holds the right of the panel and its left edge dissolves into
   the paper the words stand on — a soft seam instead of the hard half-and-half
   split, without stretching the picture.
   It occupies 58% rather than the full width on purpose: spanning the whole
   panel forced a 1108px-wide portrait to cover 1440px, magnifying it 1.30x —
   soft, and cropped down to a face. At 58% it renders at about 0.75x, under
   its native size, so it stays sharp and the framing survives.
   Below 900px the same idea runs vertically (see the phone block). */
.split{position:relative;flex:1 1 auto;min-height:0;display:block}
.panel-feat{overflow:hidden}
.split-r{
  position:absolute;top:0;right:0;bottom:0;width:58%;z-index:0;
  background:var(--paper-deep);
}
.split-r img{
  position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:50% 30%;filter:grayscale(1);
}
.split-r::after{                   /* the seam: paper dissolving into picture */
  content:"";position:absolute;inset:0;pointer-events:none;
  /* Two layers. The top one is a short, much lighter fade that softens the
     photograph's hard top edge; the second is the main left-to-right seam. */
  background:
    linear-gradient(to bottom,
      var(--paper) 0%, rgba(242,239,232,.74) 2%,
      rgba(242,239,232,.32) 6%, rgba(242,239,232,0) 12%),
    linear-gradient(to right,
      var(--paper) 0%, var(--paper) 10%,
      rgba(242,239,232,.88) 28%, rgba(242,239,232,.42) 46%,
      rgba(242,239,232,.10) 64%, rgba(242,239,232,0) 78%);
}
.split-l{
  position:relative;z-index:1;height:100%;width:min(56%,780px);
  display:flex;flex-direction:column;justify-content:space-between;gap:clamp(20px,3vh,40px);
  padding:clamp(24px,4vh,56px) clamp(24px,3vw,56px) clamp(24px,4vh,48px) var(--pad);
  min-height:0;overflow:hidden;
}
.exhibit-title{
  margin:0 0 14px;font-weight:400;font-size:clamp(1.1rem,2vw,1.5rem);
  letter-spacing:.14em;text-transform:uppercase;
}
.exhibit-copy{max-width:40ch;font-size:var(--fs-md);color:var(--ink-70);line-height:1.8}
/* With no description, no date and no footnote, these two are the only thing
   in the column besides the title and the contact row — so they take its full
   width rather than sitting in it as thumbnails. */
.exhibit-plates{
  display:flex;gap:clamp(16px,2.2vw,30px);align-items:flex-start;
  width:100%;margin:0;
}
.exhibit-plates figure{margin:0;flex:1 1 0;min-width:0}
.exhibit-plates img{width:100%;height:auto;display:block;background:var(--paper-deep)}
.exhibit-plates figcaption{
  margin-top:7px;font-family:"EB Garamond",Georgia,serif;font-style:italic;
  font-size:var(--fs-sm);color:var(--ink-dim);
}
.exhibit-links{
  display:flex;flex-wrap:wrap;gap:6px 20px;margin:18px 0 0;padding:0;list-style:none;
  font-size:var(--fs-2xs);letter-spacing:.12em;text-transform:uppercase;color:var(--ink-dim);
}
.exhibit-links a:hover{color:var(--ink)}

/* =====================================================================
   ABOUT + CONTACT  —  p.7: justified block, portrait, contact
   ===================================================================== */
.about{
  flex:1 1 auto;display:flex;flex-direction:column;align-items:center;
  padding:clamp(20px,4vh,44px) var(--pad) clamp(40px,8vh,90px);
}
.about-col{
  width:100%;max-width:46ch;
  font-family:var(--sans);color:var(--red);
}
.justif{                            /* the stretched alignment from p.7 */
  text-align:justify;text-align-last:justify;-webkit-hyphens:none;hyphens:none;
}
/* Each .ln is one line that site.js broke early, so it is both the first and the
   last line of its own block — text-align-last is what actually stretches it. */
.about-col .ln{display:block;text-align:justify;text-align-last:justify}
/* p.7's scatter comes from fitting FEWER words on a line, not from any spacing
   trick: justification then has to open each gap much wider. The column stays
   put (46ch of the inherited 15px) and the type grows into it — the name until
   its second line breaks, the copy until a line holds ~45 characters, which is
   what the reference measures. */
.about-name{
  /* left block and right block, each stacked, pushed to the outer edges */
  display:flex;justify-content:space-between;align-items:flex-start;gap:20px;
  margin:0 0 clamp(10px,1.8vh,18px);font-weight:500;
  font-size:1.6rem;letter-spacing:0;line-height:1.24;
}
.about-name .hl{display:flex;flex-direction:column;min-width:0}
.about-name .hl-line{display:block}
.about-name .hl-r{text-align:right}
.about-photo{margin:0 0 clamp(10px,1.8vh,18px)}
.about-photo img{width:100%;height:auto}
.about-copy{font-size:1.05rem;line-height:1.52;letter-spacing:.005em}
.about-copy p{margin:0 0 1.1em}
.contact-list{
  margin:clamp(28px,6vh,60px) 0 0;padding:0;list-style:none;
  display:flex;flex-wrap:wrap;justify-content:center;gap:6px 22px;
  font-size:var(--fs-sm);letter-spacing:.12em;text-transform:uppercase;
}
.contact-list a{color:var(--red)}
.contact-list a:hover{color:var(--red-deep);text-decoration:underline;text-underline-offset:4px}
/* =====================================================================
   MOTION  —  soft, slow, once. Nothing slides.
   ===================================================================== */
/* The reveal uses the standalone `translate` property, NOT `transform` — .role
   carries its own transform:translate(-50%,-50%) for centring, and a `.rise.in`
   rule setting transform:none would silently win and knock every label
   off-centre (equal-specificity classes: the later rule takes it). */
.rise{opacity:0;translate:0 10px;
  transition:opacity var(--fade) var(--ease),translate var(--fade) var(--ease)}
.rise.in{opacity:1;translate:none}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;transition-duration:.001ms !important}
  .rise{opacity:1;translate:none}
}

/* =====================================================================
   RESPONSIVE  —  phone layouts are their own layout, not a squeeze
   ===================================================================== */
@media (max-width:900px){
  /* the flanking hero needs real width for the notes AND the photo's natural
     width — below this it becomes a column: roles, notes, then the photo taking
     whatever height is left and standing on the bottom edge of the screen */
  .hero-row{flex-direction:column;align-items:stretch;gap:4px}
  .hand-note,.hand-note.left,.hand-note.right{
    max-width:none;margin:0;align-self:auto;flex:0 0 auto;
  }
  .hand-note.left{align-self:flex-start;text-align:left;transform:rotate(-2deg)}
  .hand-note.right{align-self:flex-end;text-align:right;transform:rotate(1.5deg);order:2}
  .portrait{order:3;flex:1 1 auto;width:100%;height:auto;min-height:0;aspect-ratio:auto}
  /* she fills the width here, so the cue lands on the coat — give it a soft pool
     of paper to sit on (invisible where the paper already shows) */
  .cue{
    align-items:center;padding:4px 8px 2px;
    background:radial-gradient(closest-side at 50% 52%,
      var(--paper) 40%, rgba(242,239,232,.82) 70%, rgba(242,239,232,0) 100%);
  }
  .role{display:none}
  .roles-line{
    display:flex;flex-wrap:wrap;justify-content:center;gap:3px 14px;
    margin:0;padding:4px 0 2px;font-size:var(--fs-2xs);letter-spacing:.09em;color:var(--ink-70);
  }
  .roles-line span{display:inline-flex;gap:6px;align-items:center}

  .plates,.spread{grid-template-columns:repeat(6,1fr)}
  .plate:nth-child(1),.plate:nth-child(3){grid-column:1/5}
  .plate:nth-child(2),.plate:nth-child(4){grid-column:3/7;margin-top:0}
  .plate:nth-child(5){grid-column:1/6}
  .spread figure:nth-child(6n+1),.spread figure:nth-child(6n+3),
  .spread figure:nth-child(6n+5){grid-column:1/5}
  .spread figure:nth-child(6n+2),.spread figure:nth-child(6n+4),
  .spread figure:nth-child(6n+6){grid-column:3/7;margin-top:0}
  .films{grid-template-columns:1fr}
  .reel{position:static;max-height:none;flex-direction:row;overflow-x:auto;
    scroll-snap-type:x proximity;padding-bottom:6px}
  .reel-item{flex:0 0 74%;scroll-snap-align:center}
  /* phone featured: the photograph is the ground, the words sit on a paper fade
     over its lower half — nothing has to be trimmed to make one screen */
  .split{display:block;position:relative;flex:1 1 auto;min-height:0;height:100%}
  /* width:auto is required — the base rule's width:58% otherwise wins over
     inset's left/right pair and the photograph stops dead mid-screen */
  .split-r{position:absolute;inset:0;width:auto;z-index:0;aspect-ratio:auto}
  .split-r img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  .split-r::after{                  /* the paper fade the words sit on */
    content:"";position:absolute;pointer-events:none;
    left:0;right:0;top:0;bottom:0;height:auto;
    background:
      /* same short top fade as desktop, so the photograph has no hard edge
         under the stickers */
      linear-gradient(to bottom,
        var(--paper) 0%, rgba(242,239,232,.6) 2%, rgba(242,239,232,0) 8%),
      linear-gradient(to bottom,
        rgba(242,239,232,.06) 0%, rgba(242,239,232,.55) 34%,
        rgba(242,239,232,.93) 52%, var(--paper) 66%);
  }
  .split-l{
    position:relative;z-index:1;height:100%;overflow:hidden;
    justify-content:flex-end;gap:clamp(10px,2vh,18px);
    padding:clamp(14px,2.6vh,26px) var(--pad)
            calc(clamp(16px,3vh,28px) + env(safe-area-inset-bottom,0px));
  }
  .exhibit-plates{display:none}
  .split-r img{position:relative;height:100%}
  .about{grid-template-columns:1fr}
}
@media (max-width:640px){
  /* phones read prose at 16px — only the labels stay small */
  .exhibit-copy,.about-copy{font-size:1rem;line-height:1.75}
  .about-name{font-size:1.45rem}
  .foot,.exhibit-links{font-size:var(--fs-sm)}
  .fx-row{font-size:var(--fs-md)}
  .laurel span{font-size:var(--fs-2xs)}
  /* phone header: the sticker must not stretch to the full column width */
  .hdr{flex-direction:column;align-items:flex-start;gap:15px}
  .logo{align-self:flex-start}
  .chips{justify-content:flex-start;padding-top:0}
  .chip{padding:9px 15px 10px}
  .plates,.spread{grid-template-columns:1fr;gap:34px}
  .plate,.plate:nth-child(n),.spread figure,.spread figure:nth-child(n){
    grid-column:1/-1;margin-top:0}
  .plate figcaption{writing-mode:horizontal-tb;margin-top:8px}
  .plate{flex-direction:column;gap:0;align-items:stretch}
  .exhibit-plates{flex-direction:column;align-items:stretch}
  /* ---- phone film sheet ----
     No laurels: at this width they are four to seven marks a few millimetres
     tall, unreadable, and they crowd the only two controls on the page. The
     title takes the middle of the screen and the three lines under it keep
     their order and their size, moved to the foot where a thumb reaches them.
     The sheet's own safe-area padding keeps them clear of the home indicator
     on iPhone and the gesture bar on Samsung. */
  .laurels{display:none}
  /* the nav leaves the flow so .film-body spans the whole content box — the
     title is centred against that, and it has to be the screen's centre, not
     the centre of whatever is left under the nav */
  .film-nav{
    position:absolute;width:auto;
    top:calc(var(--pad) + env(safe-area-inset-top,0px));
    left:calc(var(--pad) + env(safe-area-inset-left,0px));
    right:calc(var(--pad) + env(safe-area-inset-right,0px));
  }
  .film-body{
    flex:1 1 auto;min-height:0;width:100%;margin:0;
    display:flex;flex-direction:column;
  }
  /* Centred on the screen itself, not on the space between the nav and the
     lines — those two bands are different heights, so flowing it would sit the
     title ~48px high. The <h1> box spans the width but only the <a> around the
     artwork is clickable, so this cannot cover the controls below it. */
  .film-title{
    position:absolute;left:var(--pad);right:var(--pad);
    top:50%;translate:0 -50%;
    height:auto;min-height:0;margin:0;
    display:flex;align-items:center;justify-content:center;
  }
  .film-lines{margin-top:auto}
  .film-lines{flex:none;padding-bottom:max(4px,env(safe-area-inset-bottom,0px))}
  /* At 360px the fr columns are ~119px and "Prev / Next" wants 129, so it wrapped
     into a staircase. Dropping the separator and the tracking buys back the
     difference and keeps the whole row on one line. */
  .film-nav{gap:10px;letter-spacing:.06em}
  .film-sep{display:none}
  .film-step{gap:14px}
  .film-title{font-size:clamp(2.6rem,15vw,5rem)}
  .justif{text-align:left;text-align-last:left}
}
/* small screens: bigger tap targets without inflating the visible type */
@media (max-width:900px){
  /* every link a thumb can reach gets a 44px box, the type stays editorial */
  .contact-list a,.exhibit-links a,.foot a,.film-nav a,.film-watch a,.skip{
    min-height:44px;display:inline-flex;align-items:center;
  }
  /* the nav row keeps its own height so the 44px boxes do not push the sheet */
  .film-nav{align-items:center}
  .chip{font-size:var(--fs-xs);letter-spacing:.08em}
  /* keep the four stickers compact and on one row at 375px */
  @media (max-width:480px){
    .chips{gap:8px}
    .chip{flex:0 0 auto;padding:8px 12px;font-size:var(--fs-xs);letter-spacing:.03em}
  }
  .reel-item .rl{font-size:var(--fs-xs)}
  /* small type stays small; the hit area grows around it */
  .back,.plate-title,.index-row .nm{position:relative;display:inline-block}
  .back::before,.plate-title::before,.index-row .nm::before{
    content:"";position:absolute;top:50%;left:0;right:0;height:44px;
    transform:translateY(-50%);
  }
  .fx-row{min-height:44px;padding:11px 0}
  .fx-head,.fx-row{grid-template-columns:2.2rem 1fr 5.2rem;gap:8px}
  /* At phone width the third column is too narrow to hold "Fashion Film"
     without wrapping, and it steals the room the titles need. The format
     drops under the title instead of fighting for a column. */
  @media (max-width:480px){
    .fx-head,.fx-row{grid-template-columns:2.2rem 1fr}
    .fx-head .kind{display:none}
    .fx-row .kind{grid-column:2;text-align:left;margin-top:2px;opacity:.7}
  }
  .filmography{min-height:0;display:block;padding-top:clamp(20px,4vh,40px)}
}
.dim{color:var(--ink-dim)}

/* ---------- fullscreen viewer ---------- */
/* The plate is a button so the keyboard reaches the viewer; it must carry no
   button chrome of its own and must not change the image's box. */
.zoom{
  display:block;width:100%;padding:0;border:0;background:none;
  font:inherit;color:inherit;cursor:zoom-in;
}
.zoom img,.zoom picture{display:block}
/* no CSS aspect-ratio anywhere near these — the width/height attributes own it */
html.lb-on{overflow:hidden}
.lb{
  position:fixed;inset:0;z-index:60;cursor:zoom-out;
  background:rgba(21,20,18,.95);
  display:flex;align-items:stretch;justify-content:center;
  padding:clamp(30px,6vh,64px) clamp(46px,8vw,104px);
}
.lb[hidden]{display:none}
/* The stage is a fixed box and the plates are stacked inside it, so a cross-fade
   swaps two different shapes without the surrounding layout moving at all. */
.lb-fig{
  margin:0;cursor:default;min-width:0;min-height:0;flex:1 1 auto;width:100%;
  display:flex;flex-direction:column;align-items:center;gap:13px;
}
.lb-media{position:relative;flex:1 1 auto;width:100%;min-height:0}
.lb-layer{
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
}
.lb-layer img{display:block;width:auto;height:auto;max-width:100%;max-height:100%}
@media (prefers-reduced-motion:no-preference){
  /* the same cross-fade the two home panels use */
  .lb-layer{transition:opacity var(--fade) var(--ease);will-change:opacity}
  .lb-layer.is-in,.lb-layer.is-out{opacity:0}
}
.lb-cap{
  font-size:var(--fs-2xs);letter-spacing:.14em;text-transform:uppercase;
  color:rgba(246,242,233,.72);text-align:center;
}
.lb-x,.lb-arrow{
  position:absolute;z-index:2;border:0;background:none;cursor:pointer;
  font-family:inherit;color:rgba(246,242,233,.78);
  display:flex;align-items:center;justify-content:center;
  min-width:44px;min-height:44px;
}
.lb-x{top:clamp(6px,1.8vh,18px);right:clamp(6px,1.8vw,20px);font-size:1.7rem;line-height:1}
.lb-arrow{top:50%;translate:0 -50%;font-size:1.25rem}
.lb-prev{left:clamp(2px,1.4vw,16px)}
.lb-next{right:clamp(2px,1.4vw,16px)}
.lb-x:hover,.lb-arrow:hover{color:#f6f2e9}
.lb :focus-visible{outline:1.5px solid #f6f2e9;outline-offset:3px}
@media (max-width:640px){
  .lb{padding:58px 10px 46px}
  .lb-arrow{top:auto;bottom:6px;translate:none}
  .lb-prev{left:18px}
  .lb-next{right:18px}
}
/* nothing drags off the page, and iOS skips its long-press save sheet */
img{-webkit-user-drag:none;-webkit-touch-callout:none;user-select:none}

/* ---------- about: the laurel band ---------- */
/* The marks are one light ink, so About gives them a dark band to sit on
   rather than showing them invisibly on the paper. */
.laurel-band{
  margin-top:clamp(30px,6vh,64px);padding:clamp(26px,4.5vh,50px) var(--pad);
  background:#171614;
}
.laurel-band .laurel-head{
  text-align:center;margin:0 0 clamp(18px,3vh,30px);
  color:rgba(246,242,233,.6);
}
/* Every mark gets an identical box and sits centred inside it. Sized to its
   own artwork, each laurel is a slightly different width, so every row
   re-centred on its own total and the rows drifted against each other —
   measured 8px between the first row and the three under it. Equal cells
   make the columns line up by construction, and a part-filled last row
   still centres, which is the right way to end. */
.laurels-band{
  position:static;display:flex;flex-wrap:wrap;justify-content:center;
  gap:clamp(14px,2.2vh,26px) clamp(10px,1.8vw,26px);padding:0;
  max-width:1100px;margin:0 auto;
}
/* display:contents is cleared here on purpose: the wrapper IS the cell */
.laurels-band picture{
  display:flex;align-items:center;justify-content:center;
  flex:0 0 clamp(96px,11vw,132px);
}
.laurels-band .laurel{
  height:auto;width:auto;max-width:100%;
  max-height:clamp(40px,5.4vh,62px);
}

/* the role a video folder stated, beside its title */
.fx-role{font-style:italic;opacity:.66;font-size:.92em}

/* <picture> is a wrapper only — display:contents keeps every existing rule for
   these images working, including the narrow-width overrides further down. */
.about-photo picture,.laurels picture{display:contents}
/* Not these two. Their images size against the box around them (height:100%,
   max-height:100%), and Safari resolves those percentages against a
   display:contents <picture> as if it had no height. So here the picture is a
   real box that fills its parent, and the percentages have something to read. */
.split-r picture{position:absolute;inset:0;display:block}
.lb-layer picture{display:flex;align-items:center;justify-content:center;width:100%;height:100%}
/* and the laurel band's wrappers are the equal-width cells the marks sit in */
.laurels-band picture{display:flex}


/* =====================================================================
   VIDEO PAGE  —  fits the viewport: with four pieces there is nothing
   below the fold worth scrolling to, so header, reel, index and footer
   all sit on one screen. Remove the containment once the page grows.
   ===================================================================== */
body[data-page="video"]{height:100svh;overflow:hidden}
body[data-page="video"] .films{min-height:0;align-items:stretch}
body[data-page="video"] .reel{
  position:static;height:100%;max-height:100%;
}
body[data-page="video"] .filmography{overflow:hidden}
body[data-page="video"] .foot{padding-top:clamp(14px,2.4vh,26px)}
@media (max-width:900px){
  /* stacked: the reel keeps its own scroll so the page itself still does not */
  body[data-page="video"] .reel{height:auto;max-height:34svh}
  body[data-page="video"] .films{gap:clamp(14px,2.4vh,24px)}
}

/* ---------- full screen video ---------- */
.vb{
  position:fixed;inset:0;z-index:70;background:#0b0a09;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:14px;padding:clamp(30px,6vh,60px) clamp(16px,4vw,60px);
}
.vb[hidden]{display:none}
.vb-stage{
  display:flex;align-items:center;justify-content:center;
  width:100%;flex:1 1 auto;min-height:0;background:#0b0a09;
}
.vb-v{max-width:100%;max-height:100%;width:auto;height:auto;display:block}
.vb-cap{
  margin:0;font-size:var(--fs-2xs);letter-spacing:.14em;text-transform:uppercase;
  color:rgba(246,242,233,.72);text-align:center;
}
.vb-x{
  position:absolute;z-index:2;top:clamp(6px,1.8vh,18px);right:clamp(6px,1.8vw,20px);
  min-width:44px;min-height:44px;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:1.7rem;line-height:1;color:rgba(246,242,233,.8);
  display:flex;align-items:center;justify-content:center;
}
.vb-x:hover{color:#f6f2e9}
.vb :focus-visible{outline:1.5px solid #f6f2e9;outline-offset:3px}


/* =====================================================================
   THE PHONE SITE
   Everything below 640px. Not a narrowed desktop — the pages are allowed
   to be different where the desktop idea does not survive the width.
   Rules here come last on purpose: this is the layer that wins.
   ===================================================================== */
@media (max-width:640px){

  /* ---------- header ----------
     The wordmark and four stickers were eating 150px of a 844px screen on
     every page before any work showed. Tightened, and the stickers sit on
     one row with the name. */
  .hdr{
    flex-direction:row;align-items:center;justify-content:space-between;
    gap:12px;padding-bottom:clamp(10px,1.6vh,16px);
  }
  .hdr-left{flex:0 0 auto}
  .logo{align-self:flex-start}
  .logo-word{font-size:1.32rem}
  .chips{justify-content:flex-end;gap:6px;padding-top:0;flex-wrap:nowrap}
  .chip{padding:9px 9px 10px;font-size:.7rem;letter-spacing:.02em}

  /* (the phone home hero lives in its own block at the end of this file —
     her design of 2026-10-05, which replaced the hero built here) */
}

@media (max-width:640px){
  /* ---------- home: featured ----------
     Photo-as-ground is a desktop idea: the paper fade that lets the words
     read on a wide screen has to cover most of a tall narrow one, and the
     photograph was arriving as a ghost with the two exhibited prints hidden
     entirely. On a phone it stacks instead — the photograph is a band that
     dissolves into the paper, and the work it is about sits under it. */
  .split{display:flex;flex-direction:column;height:100%}
  .split-r{
    /* order:-1 — the photograph comes first in the eye, last in the markup */
    order:-1;position:relative;inset:auto;width:auto;flex:0 0 auto;
    /* svh, not vh: the panel is one screen and the band has to leave room
       for the title, the two prints and the contact row on a 740px
       Android as well as a 932px Pro Max */
    height:clamp(160px,30svh,300px);z-index:0;
  }
  .split-r img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:50% 34%}
  .split-r::after{
    background:
      linear-gradient(to bottom,
        var(--paper) 0%, rgba(242,239,232,.55) 3%, rgba(242,239,232,0) 11%),
      linear-gradient(to bottom,
        rgba(242,239,232,0) 58%, rgba(242,239,232,.6) 82%, var(--paper) 100%);
  }
  .split-l{
    flex:1 1 auto;min-height:0;width:auto;overflow:hidden;
    justify-content:flex-start;gap:clamp(10px,1.8vh,18px);
    padding:clamp(10px,2vh,20px) var(--pad)
            calc(clamp(14px,2.6vh,24px) + env(safe-area-inset-bottom,0px));
  }
  .exhibit-title{font-size:1.18rem;letter-spacing:.1em;margin-bottom:9px}
  /* the prints are the point of the panel — they come back, as a pair */
  .exhibit-plates{
    display:flex;flex-direction:row;align-items:flex-start;
    gap:10px;width:100%;margin:0;
  }
  .exhibit-plates figure{flex:1 1 0;min-width:0}
  /* the contact row is nested one level down, so the pin goes on its wrapper */
  .split-l > :last-child{margin-top:auto}
  .exhibit-links{
    gap:4px 18px;padding-top:clamp(8px,1.6vh,16px);font-size:var(--fs-2xs);
  }
}

/* on a laptop the index beside the reel already names each piece */
.rl-title,.rl-kind{display:none}

@media (max-width:640px){
  /* ---------- video ----------
     The desktop page is a sticky reel of clips beside an index that names
     them — two columns reading across. Squeezed into 390px that became a
     horizontal strip with the clips cut off at the edge, a table under it,
     and the whole page locked to one screen so nothing could breathe.
     On a phone it is a stack of cards instead: every piece full width,
     introducing itself, one tap to watch. The index is cut — with the
     titles on the cards it was saying everything twice. */
  body[data-page="video"]{height:auto;overflow:visible}
  body[data-page="video"] .reel{height:auto;max-height:none}
  .films{display:block;padding:0 var(--pad)}
  .filmography{display:none}
  .reel{
    position:static;max-height:none;overflow:visible;
    display:flex;flex-direction:column;gap:clamp(26px,4.4vh,42px);
    padding:clamp(6px,1.4vh,16px) 0 0;scroll-snap-type:none;
  }
  .reel-item{
    width:100%;margin:0;opacity:1;filter:none;scroll-snap-align:none;
    flex:0 0 auto;text-align:left;
  }
  .reel-item img,.reel-item video{width:100%;height:auto;display:block}
  /* number and title on one line, format and the cue under it */
  .reel-item .rl{
    display:grid;grid-template-columns:2.4rem 1fr auto;
    align-items:baseline;gap:2px 10px;opacity:1;padding:11px 0 0;
    font-size:var(--fs-xs);letter-spacing:.08em;color:var(--ink);
  }
  .rl-no{grid-column:1;grid-row:1;color:var(--ink-dim)}
  .rl-title{display:block;grid-column:2;grid-row:1;text-transform:none;letter-spacing:.04em}
  .rl-cta{grid-column:3;grid-row:1;white-space:nowrap;color:var(--ink-dim)}
  .rl-kind{
    display:block;grid-column:2/4;grid-row:2;
    font-size:var(--fs-2xs);letter-spacing:.1em;color:var(--ink-dim);
  }
}

@media (max-width:640px){
  /* ---------- photography ----------
     The index is a printed-book device: roman numerals against plate ranges
     like "01–09", set against a rule. It reads beautifully across a spread
     and means nothing on a phone, where it cost a whole screen of table
     before a single photograph. Cut. The covers are the index. */
  .index-block{display:none}
  .page-head{padding-top:clamp(4px,1.4vh,14px)}
  .page-title{font-size:clamp(1.5rem,6.6vw,2rem);letter-spacing:.1em}
  .wrap > .rule{margin-bottom:clamp(16px,3vh,28px)}

  /* each series is one full-bleed cover with its name over the foot of it */
  .plates{gap:clamp(30px,5vh,46px)}
  .plate{margin:0 calc(var(--pad) * -1)}
  .plate-media{position:relative}
  .plate img{width:100%;height:auto}
  .plate-title{
    position:absolute;left:var(--pad);right:var(--pad);bottom:12px;
    z-index:2;margin:0;color:var(--paper);
    font-size:var(--fs-sm);letter-spacing:.14em;text-transform:uppercase;
    text-shadow:0 1px 14px rgba(21,20,18,.85),0 1px 3px rgba(21,20,18,.7);
  }
  .plate-title .rn{margin-right:10px;color:rgba(246,242,233,.72)}
  /* a scrim so the name holds on a pale photograph */
  .plate-media a::after{
    content:"";position:absolute;left:0;right:0;bottom:0;height:42%;z-index:1;
    pointer-events:none;
    background:linear-gradient(to top,rgba(21,20,18,.6),rgba(21,20,18,0));
  }
  .plate figcaption{
    margin:9px var(--pad) 0;writing-mode:horizontal-tb;
    font-size:var(--fs-sm);
  }
}

@media (max-width:640px){
  /* ---------- a series ----------
     The photographs are the entire reason for the page, so they run edge to
     edge. The back link had a 108x18 hit area — smaller than a fingertip. */
  .back{
    min-height:44px;display:inline-flex;align-items:center;
    font-size:var(--fs-xs);
  }
  .series-head{padding-bottom:clamp(16px,3.4vh,30px)}
  .series-head h1{font-size:clamp(1.5rem,6.6vw,2rem);letter-spacing:.1em}
  .spread{gap:clamp(26px,4.6vh,40px);padding-bottom:clamp(34px,6vh,60px)}
  .spread figure{margin:0 calc(var(--pad) * -1)}
  .spread figcaption{margin-left:var(--pad);margin-right:var(--pad)}
  .zoom{cursor:default}
  .series-nav{padding-top:clamp(18px,3.4vh,32px)}

  /* ---------- the fullscreen viewer ----------
     On a phone the arrows sat at the bottom corners where a thumb covers the
     photograph it is trying to walk. They go to the thumb's own band under
     the picture, 56px, with the close well clear at the top. */
  .lb{padding:52px 0 76px}
  .lb-fig{gap:10px}
  .lb-layer img{max-width:100%;max-height:100%}
  .lb-cap{padding:0 18px}
  .lb-arrow{
    top:auto;bottom:10px;translate:none;
    min-width:56px;min-height:56px;font-size:1.5rem;
  }
  .lb-prev{left:14px}
  .lb-next{right:14px}
  .lb-x{top:6px;right:6px;min-width:52px;min-height:52px}
}

@media (max-width:640px){
  /* ---------- the film sheet ----------
     The strongest page already: one film, full bleed, nothing else. It only
     needed thumb-sized controls and type you can read at arm's length.
     Walking the filmography is a swipe now (see site.js) — the arrows stay
     for anyone who does not try it. */
  .film-nav{font-size:var(--fs-xs);letter-spacing:.07em;gap:6px}
  .film-nav a{
    min-height:44px;min-width:56px;display:inline-flex;align-items:center;
    justify-content:center;
  }
  .film-nav > :first-child a{justify-content:flex-start}
  .film-nav > :last-child a{justify-content:flex-end}
  .film-step{gap:4px}
  .film-count{font-size:var(--fs-xs);letter-spacing:.14em}
  .film-credit{font-size:var(--fs-xs);letter-spacing:.14em}
  .film-meta{font-size:var(--fs-2xs);letter-spacing:.12em}
  .film-watch a{
    min-height:48px;font-size:var(--fs-xs);letter-spacing:.18em;
  }
  .film-lines{gap:clamp(6px,1.2vh,12px)}
}

@media (max-width:640px){
  /* every contact link gets a thumb-sized box; IMDB is only four characters
     wide and was measuring 36px across */
  .exhibit-links a,.contact-list a,.foot a{
    min-width:44px;min-height:44px;
    display:inline-flex;align-items:center;justify-content:center;
  }
  /* The stickers share the line with the name where there is room for it —
     that keeps the header at 79px instead of 150px, which is most of a
     screen back on every page. Below 400px they will not fit beside it, and
     wrapping left one sticker orphaned on a second row, so they take a full
     row of their own and get bigger rather than smaller. */
  .chips{flex-wrap:nowrap;gap:7px}
  .chip{font-size:.74rem;padding:9px 10px 10px}

  /* ---------- about: laurels ---------- */
  .laurel-band{padding:clamp(22px,4vh,38px) var(--pad)}
  .laurels-band{gap:16px 10px}
  .laurels-band picture{flex:0 0 clamp(84px,27vw,108px)}
  .laurels-band .laurel{max-height:clamp(38px,9vw,50px)}

  /* ---------- footer ----------
     Two items on one line: the line and the way out. The link carries a 44px
     tap box and the copyright line does not, so without an explicit baseline
     their text sat 10px apart inside boxes that measured identical. */
  .foot{
    flex-direction:row;align-items:baseline;flex-wrap:nowrap;
    gap:16px;font-size:var(--fs-2xs);letter-spacing:.1em;
    padding-top:clamp(30px,6vh,60px);
    padding-bottom:calc(clamp(12px,2.2vh,22px) + env(safe-area-inset-bottom,0px));
  }
  .foot nav{align-items:baseline}
}
@media (max-width:400px){
  .hdr{flex-direction:column;align-items:flex-start;gap:11px}
  .chips{justify-content:flex-start;width:100%}
  .chip{font-size:.8rem;padding:9px 13px 10px}
}

/* =====================================================================
   PHONE HOME SCREEN (≤640px)  —  her own design, worked out on her iPhone
   on 2026-10-05, replacing the phone hero above. Every other page keeps
   the phone layer above unchanged. Two things here reach outside the hero
   and are site-wide or home-only:
   - the header keeps the stickers on the name's row, small, at every phone
     width, on every page (she asked for all pages to match, 2026-10-05; the
     phone layer above dropped them to their own row under 400px). Only the
     home page also uses the 18px margin her layout was set on — elsewhere the
     header keeps the phone layer's margin so it lines up with the page;
   - the desktop type tokens are used for the roles, because the phone layer
     enlarges --fs-2xs and she sized these at the smaller value.
   ===================================================================== */
@media (max-width:640px){
  /* her layout was set on the 18px page margin; the phone layer's wider one
     stays on every other page and on the featured panel */
  body[data-page="home"] .hdr,.panel-hero{--pad:clamp(18px,3.6vw,54px)}
  .hdr{flex-direction:row;align-items:center;justify-content:space-between;gap:10px;padding-bottom:0}
  .logo{align-self:center}
  .logo-word{font-size:1.62rem}
  .chips{flex-wrap:nowrap;gap:5px;padding-top:0;justify-content:flex-end;width:auto}
  /* the sticker stays a 44px-tall target; only the painted burst shrinks */
  .chip{flex:0 0 auto;min-height:44px;padding:0 8px;font-size:.66rem;letter-spacing:.03em}
  .chip::before{inset:7px -2px}
  .chip::after{inset:9px 0}

  .roles-line{font-size:.66rem;letter-spacing:.09em;color:var(--ink-70);line-height:1.55;text-shadow:none}
  .hand-note,.hand-note.left,.hand-note.right{text-shadow:none;transform:none}
  .hand-note.left{rotate:-2deg}
  .hand-note.right{rotate:1.5deg}

  /* ---- home hero (her layout, 2026-10-05): spare paper under the header,
     the roles centred just above her head, her photo standing on the bottom
     edge of the screen, and the two notes as a pair either side of her head —
     same size, tops level, each on the page margin ----
     --pw is the photo's width: the full column, or less on a short screen so
     her whole figure still fits under the header and the roles. */
  .panel-hero{
    --pw:min(calc(100vw - 2 * var(--pad)), calc((100svh - 190px) * .7826));
    display:grid;grid-template-columns:1fr var(--pw) 1fr;
    /* spare paper split 3:1 above and below the roles, so they rise towards
       the header on tall screens; on a short one there is no spare and they
       keep their place over the notes (her ask, 2026-10-05) */
    grid-template-rows:minmax(0,3fr) auto minmax(0,1fr) auto;
    padding-top:0;padding-bottom:0;
  }
  .hero-row{display:contents}
  /* ends 16px above the tops of the two notes: their two-line height, less
     the part that overlaps the photo (see the notes below), plus 16px */
  .roles-line{grid-column:1/-1;grid-row:2;padding:0;gap:2px 12px;
    margin-bottom:calc(2.53rem - .083 * var(--pw) + 16px - 12px)}
  .portrait{
    grid-column:2;grid-row:4;align-self:end;
    width:var(--pw);height:auto;min-height:0;max-width:none;
    aspect-ratio:1080/1380;
  }
  /* Both notes are placed in the photo's grid area, widened to the page
     margins (both ends stated: for an absolutely positioned grid item an
     `auto` end line means the padding edge, not the next track). The bottom
     of "based in Paris and Dubai" sits 6.5% of the photo's height below its
     top — measured off the cut-out, her hair spans ~38%–66% across there, so
     both notes are on paper at every phone width. "hi! i'm a…" is one line
     to its two and is centred on it. */
  .hand-note,.hand-note.left,.hand-note.right{
    position:absolute;grid-row:4/5;z-index:4;margin:0;max-width:none;
    font-size:1.15rem;line-height:1.1;
    /* both notes nudged down together (her ask); not on the narrowest
       phones, where her hair would reach "Paris and Dubai" */
    --drop:12px;
  }
  .hand-note.left{
    grid-column:1/3;left:0;right:auto;text-align:left;
    /* centred on the two-line note beside it: half a line above its bottom,
       so "hi! i'm a…" sits between "based in" and "Paris and Dubai" */
    bottom:calc(100% - .083 * var(--pw) + .6325rem - var(--drop));
  }
  .hand-note.right{
    grid-column:2/4;right:0;left:auto;text-align:right;
    bottom:calc(100% - .083 * var(--pw) - var(--drop));
  }
  @media (max-width:380px){
    .hand-note,.hand-note.left,.hand-note.right{--drop:0px}
    .roles-line{margin-bottom:calc(2.53rem - .083 * var(--pw) + 16px)}
  }
  /* the written cue, centred at the foot of her photo, exactly as the live
     phone layer had it (2026-10-05): no paper pool behind it, the paper glow
     on the words and arrow kept from the base rule, gently bobbing */
  .cue{
    position:absolute;left:0;right:0;z-index:5;
    bottom:calc(clamp(8px,1.6vh,18px) + env(safe-area-inset-bottom,0px));
    display:flex;flex-direction:column;align-items:center;
    background:none;padding:0;
  }
  .cue .hand{font-size:1.1rem}
}

/* photo series, phones: the previous / next series links were set larger than
   the footer under them and read as a second, louder footer. Smaller and a
   little tighter, so the foot of the page is one quiet band (her ask,
   2026-10-05). The 44px tap boxes are unchanged. */
@media (max-width:640px){
  /* full ink, so they read as links to more work and stay distinct from the
     grey footer line under them */
  .series-nav{font-size:.7rem;letter-spacing:.1em;color:var(--ink)}
}

/* about, phones: the headline a little smaller and a step heavier (600 is
   loaded for it in about.html), her ask 2026-10-05 */
@media (max-width:640px){
  .about-name{font-size:1.3rem;font-weight:600}
}

/* about: the headline a step heavier on every screen, matching the phone
   (her ask, 2026-10-05; Figtree 600 is loaded in about.html) */
.about-name{font-weight:600}

/* about, phones: 12 of the 13 laurels fill four full rows of three; the
   thirteenth (Serbest, a semi-final) sat alone on a fifth row. Dropped on
   phones only, so the band ends on a full row — her call, 2026-10-05. It is
   matched by its caption, not its position, so adding laurels does not hide
   the wrong one. Laptops still show all thirteen. */
@media (max-width:640px){
  .laurels-band picture:has(img[alt*="Serbest"]){display:none}
}
