/* theme.css */
/* Kahf — shared tokens and chrome. One copy, linked by every page.

   Two grounds, one magazine. Every colour in the site resolves through the
   tokens below, so the dark face is a second set of values rather than a
   second stylesheet. Three states: no attribute means follow the system,
   data-theme="light"/"dark" on <html> means the reader has decided. The
   inline script in the document head sets that attribute before first paint,
   so a chosen theme never flashes the other one first. */
:root{
  color-scheme:light;
  --paper:#FFFFFF; --ink:#0E0E0D; --mute:#6B6861; --rule:#E2DFD9; --soft:#4A4741;
  --crit:#7950B0; --ess:#C43D1A; --poe:#1B34D6; --int:#0F7A4A; --let:#EDAE10; --fic:#E0247A;

  /* Roles, not colours — the handful of places a value cannot simply be
     "ink on paper" and must know which way round the page is. */
  --on-photo:#F3EFE4;        /* type sitting on artwork: always light */
  --on-ink:#9C968B;          /* quiet type on a var(--ink) fill */
  --let-on:var(--ink);       /* type on the Letters yellow: always dark */
  --mk-src:url("/assets/mark-ink.webp");
  --grain:.028;              /* the paper tooth; barely there on white */
  --flood:.07;               /* a row's wash of its own section ink */
  --bg-wash:.7;              /* the veil over the Spine's screened plate: unlit titles must still read */
  --sh-soft:0 10px 30px rgba(0,0,0,.07);
  --sh-plate:0 18px 50px rgba(0,0,0,.28);

  --gut:clamp(14px,3.2vw,34px);

  /* ── the system ──────────────────────────────────────────────────────
     One set of curves, durations, sizes and spaces for every page. A value
     typed by hand in a page stylesheet should be the exception with a reason.

     Motion. Things arriving, answering a hover or settling use --ease, a
     strong ease-out that starts fast. Things travelling across the screen
     (the view morph, the switch thumb) use --ease-io. UI answers inside
     --t-base; only plates, reveals and the morph are allowed longer. */
  --ease:cubic-bezier(.23,1,.32,1);
  --ease-io:cubic-bezier(.77,0,.175,1);
  --t-fast:.16s;      /* press feedback, colour */
  --t-base:.26s;      /* hover, small state changes */
  --t-move:.42s;      /* something changing place */
  --t-slow:.7s;       /* plates, scroll reveals */
  --nudge:12px;       /* how far a lit row steps aside; 0 under reduced motion */

  /* Type. 11 mono numerals, 12 labels, 13.5 small copy, 15 UI body; the
     reading measure is set in article.css. Above that, four display steps. */
  --fs-lede:clamp(18px,2.1vw,26px);   /* the sentence under a page head */
  --fs-row:clamp(22px,3.6vw,46px);    /* a lit row's title, an address */
  --fs-cta:clamp(18px,2.3vw,30px);    /* the big call-to-action line */
  --fs-head:clamp(36px,6.8vw,104px);  /* a feature or room heading */

  /* Space. A band's padding and a row's padding, everywhere. */
  --pad-band:clamp(32px,5vw,80px);
  --pad-row:clamp(15px,2.1vw,27px);

  /* Bilingual stacks. Latin first on purpose — Amiri and Nastaliq both carry
     Latin glyphs, and letting them render the English made the English in a
     mixed title a different face from the English everywhere else. */
  --ar:"Archivo","Amiri",serif;
  /* Titles in a list — the archive's two views, lit rows, next/previous —
     set their Arabic in Readex Pro, a grotesque drawn in Archivo's spirit, so
     the two scripts in a bilingual row sit at one weight and one height.
     Headings and reading text keep Amiri. (Kawkab Mono was tried first: its
     monospaced letters opened uneven gaps inside words.) */
  --ar-mono:"Archivo","Readex Pro","Amiri",serif;
  --ur:"Archivo","Noto Nastaliq Urdu","Amiri",serif;
  /* For a run that is Arabic and nothing else — a single word set as display
     type, never a mixed title. The stacks above exist because Amiri also
     carries Latin glyphs; where there is no Latin to protect, Amiri leads. */
  --ar-only:"Amiri",serif;
}

/* ══════ the dark face ══════
   Not an inversion. The five section inks are re-mixed brighter and a little
   desaturated so they stay themselves against a near-black ground instead of
   going muddy, the rules lift off the floor rather than sitting on it, and the
   grain comes up a touch because a dark flat field shows its flatness more.

   The values appear twice on purpose: once for the system preference (skipped
   when the reader has explicitly asked for light) and once for the explicit
   choice, so the attribute always wins in both directions. */
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    color-scheme:dark;
    --paper:#0F0F0E; --ink:#F1EEE7; --mute:#8E897F; --rule:#2C2B28; --soft:#B3ADA2;
    --ess:#FF6F47; --poe:#8A97FF; --int:#3DBE85; --let:#EFB937; --fic:#FF62AB;
    --on-ink:#57544D; --let-on:var(--paper);
    --mk-src:url("/assets/mark-cream.webp");
    --grain:.05; --flood:.13; --bg-wash:.55;
    --sh-soft:0 10px 30px rgba(0,0,0,.55);
    --sh-plate:0 18px 50px rgba(0,0,0,.68);
  }
  :root:not([data-theme="light"]) .mk{content:url("/assets/mark-cream.webp")}
}
:root[data-theme="dark"]{
  color-scheme:dark;
  --paper:#0F0F0E; --ink:#F1EEE7; --mute:#8E897F; --rule:#2C2B28; --soft:#B3ADA2;
  --ess:#FF6F47; --poe:#8A97FF; --int:#3DBE85; --let:#EFB937; --fic:#FF62AB;
  --on-ink:#57544D; --let-on:var(--paper);
  --mk-src:url("/assets/mark-cream.webp");
  --grain:.05; --flood:.13; --bg-wash:.55;
  --sh-soft:0 10px 30px rgba(0,0,0,.55);
  --sh-plate:0 18px 50px rgba(0,0,0,.68);
}
:root[data-theme="dark"] .mk{content:url("/assets/mark-cream.webp")}

*{box-sizing:border-box}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:"Archivo",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.35;
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}
/* while the theme is being switched, paper and ink cross over on --t-base;
   the class is on for one transition only, so nothing else inherits it */
html.theming body,html.theming .mast,html.theming .foot{transition:background-color var(--t-base) ease,color var(--t-base) ease}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer;text-align:inherit}
:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
img{max-width:100%}
[hidden]{display:none!important}

.mi{font-size:12px;letter-spacing:.075em;text-transform:uppercase;font-weight:700;line-height:1.3}
/* a label that carries information (a byline, a price, a spec key, a status
   line) gets one more pixel; 12px stays for ornament and counts */
.mi.info,.dstatus,.pstatus,.sub-status,.buy-note,.ferr{font-size:13px}
.mono{font-family:"DM Mono",ui-monospace,Menlo,monospace;font-variant-numeric:tabular-nums}
.ink-Essays{color:var(--ess)} .ink-Poems{color:var(--poe)} .ink-Interviews{color:var(--int)}
.ink-Letters{color:var(--let)} .ink-Fictions{color:var(--fic)}

/* A bilingual title that wraps keeps its Arabic half on the right edge; with
   justify-content:space-between alone, a wrapped run falls to the start of
   its new line, which is the wrong side for Arabic. */
.bi > .ar,.bi h2 > .ar{margin-left:auto}

/* ══════ skip link ══════
   Invisible until keyboard focus lands on it — the emergency exit from the
   six masthead links plus kicker every page repeats before its own content. */
.skip{
  position:absolute;left:var(--gut);top:-100px;z-index:100;background:var(--ink);
  color:var(--paper);padding:10px 16px;transition:top .2s var(--ease);
}
.skip:focus{top:10px}

/* ══════ masthead ══════
   One bar, three zones: the mark, the nav, and the controls that belong to the
   reader rather than to the site (theme, and on a phone the menu itself). Its
   height is measured into --mast by site.js, because two sticky things below it
   (the archive's filter bar, the article's spine rail) and one viewport sum
   (the Reading Room's height) are all written against it — and it is not the
   same height on a phone as on a desktop. */
.mast{
  display:flex;align-items:center;gap:clamp(12px,2vw,22px);
  padding:10px var(--gut);border-bottom:1px solid var(--ink);
  position:sticky;top:0;background:var(--paper);z-index:60;
}
.mast .mkw{flex:0 0 auto}
.mast .mk{height:34px;width:auto;display:block;transition:transform .45s var(--ease),opacity .2s}
.mast .mkw:hover .mk{transform:rotate(-1.5deg) scale(1.04)}
.mast .mkw:active .mk{opacity:.6}

/* the reader's own controls, held together at the right end */
.mast-end{display:flex;align-items:center;gap:2px;flex:0 0 auto;margin-left:auto}

.mast nav{display:flex;gap:clamp(10px,1.6vw,22px);margin-left:auto}
.mast nav a{position:relative;color:var(--mute);transition:color var(--t-base) ease,opacity var(--t-base) ease;
  white-space:nowrap;padding-bottom:3px}
.mast nav a::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:currentColor;
  transform:scaleX(0);transform-origin:0 50%;transition:transform .34s var(--ease);
}
.mast nav a:hover{color:var(--ink)}
.mast nav a:hover::after,.mast nav a[aria-current="page"]::after{transform:scaleX(1)}
.mast nav a[aria-current="page"]{color:var(--ink)}
/* the Spine's dimming move, borrowed: pointing at one link quiets the rest,
   so the nav reads as a list you are moving through, not six equal shouts */
@media (hover:hover){
  .mast nav:hover a:not(:hover){opacity:.4}
}

/* ══════ the theme switch ══════
   A disc of ink that wanes to a crescent — the page's own light, turned down.
   It shows the state it is in, and says in words what pressing it will do. */
.tmode{
  display:flex;align-items:center;justify-content:center;width:42px;height:42px;
  color:var(--mute);transition:color .22s;
}
.tmode:hover{color:var(--ink)}
.tmode .gl{
  display:block;width:15px;height:15px;border-radius:50%;
  box-shadow:inset 0 0 0 9px currentColor;
  transition:box-shadow .45s var(--ease),transform .55s var(--ease);
}
.tmode:active .gl{transform:scale(.88)}
:root[data-theme="dark"] .tmode .gl{
  box-shadow:inset 0 0 0 1.5px currentColor,inset -5px -2px 0 0 currentColor;
  transform:rotate(-22deg);
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .tmode .gl{
    box-shadow:inset 0 0 0 1.5px currentColor,inset -5px -2px 0 0 currentColor;
    transform:rotate(-22deg);
  }
}

/* ══════ the menu button ══════ */
.mtoggle{display:none;width:42px;height:42px;align-items:center;justify-content:center}
.mtoggle .bars,.mtoggle .bars::before,.mtoggle .bars::after{
  display:block;width:20px;height:2px;background:var(--ink);position:relative;
  transition:transform .25s var(--ease),opacity .2s;
}
.mtoggle .bars::before,.mtoggle .bars::after{content:"";position:absolute;left:0}
.mtoggle .bars::before{top:-6px} .mtoggle .bars::after{top:6px}
.mtoggle[aria-expanded="true"] .bars{background:transparent}
.mtoggle[aria-expanded="true"] .bars::before{transform:translateY(6px) rotate(45deg)}
.mtoggle[aria-expanded="true"] .bars::after{transform:translateY(-6px) rotate(-45deg)}

/* the scrim under an open menu — the page is still there, just put back */
.navscrim{
  position:fixed;left:0;right:0;bottom:0;top:var(--mast,63px);z-index:55;
  background:var(--ink);opacity:0;visibility:hidden;
  transition:opacity .32s var(--ease),visibility .32s;
}

@media (max-width:760px){
  .mtoggle{display:flex}
  /* The sheet. Full width, hung off the bar, and it counts its own entries —
     the same numbered-row grammar the archive and the shop rows are set in. */
  .mast nav{
    display:none;position:absolute;left:0;right:0;top:100%;flex-direction:column;gap:0;
    background:var(--paper);border-bottom:1px solid var(--ink);
    padding:2px var(--gut) 14px;counter-reset:nv;
    max-height:calc(100svh - var(--mast,63px));overflow-y:auto;overscroll-behavior:contain;
    box-shadow:var(--sh-soft);
  }
  .mast nav.open{display:flex}
  .mast nav a{
    display:flex;align-items:center;gap:14px;min-height:52px;padding:0 0 0 10px;
    border-top:1px solid var(--rule);font-size:13px;color:var(--ink);opacity:1;
    transition:background-color .24s,color .22s;
  }
  .mast nav a:first-child{border-top:0}
  .mast nav a::before{
    counter-increment:nv;content:counter(nv,decimal-leading-zero);
    font-family:"DM Mono",ui-monospace,Menlo,monospace;font-weight:400;
    font-size:11px;color:var(--rule);letter-spacing:0;
    transition:color .24s;
  }
  /* the full-bleed underline is a desktop gesture; in a column it reads as a
     rule between rows, which the rows already have */
  .mast nav a::after{display:none}
  .mast nav a:active{background:color-mix(in srgb,var(--ink) 6%,transparent)}
  .mast nav a:active::before{color:var(--ink)}
  .mast nav a[aria-current="page"]{box-shadow:inset 3px 0 0 var(--ink)}
  .mast nav a[aria-current="page"]::before{transform:translateX(6px)}
  .mast nav a::before{transition:color .24s,transform var(--t-move) var(--ease)}
  .mast nav a[aria-current="page"]::before{color:var(--ink)}
  /* each row arrives just behind the one above it */
  .mast nav.open a{animation:navin .32s var(--ease) backwards}
  .mast nav.open a:nth-child(1){animation-delay:.02s}
  .mast nav.open a:nth-child(2){animation-delay:.06s}
  .mast nav.open a:nth-child(3){animation-delay:.10s}
  .mast nav.open a:nth-child(4){animation-delay:.14s}
  .mast nav.open a:nth-child(5){animation-delay:.18s}
  .mast nav.open a:nth-child(6){animation-delay:.22s}
  .mast nav.open a:nth-child(n+7){animation-delay:.26s}
  body.nav-open{overflow:hidden}
  body.nav-open .navscrim{opacity:.34;visibility:visible}
}
@keyframes navin{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}

/* ══════ page body ══════ */
.wrap{padding:clamp(30px,6vw,72px) var(--gut);max-width:1500px;margin:0 auto}
.wrap.narrow{max-width:min(720px,100%)}
h1.big{
  margin:0 0 .3em;font-size:clamp(34px,6.4vw,86px);font-weight:500;
  line-height:.98;letter-spacing:-.035em;text-wrap:balance;
}
.lede{font-size:clamp(17px,1.9vw,23px);line-height:1.45;max-width:56ch;color:var(--soft)}
.rule{border:0;border-top:1px solid var(--rule);margin:clamp(26px,4vw,52px) 0}

/* ══════ marquee ══════ */
.mq{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 6%,#000 94%,transparent)}
.mq .tr{display:flex;width:max-content;animation:sl 32s linear infinite}
.mq .tr span{padding-right:44px;white-space:nowrap}
/* WCAG 2.2.2 — moving content over five seconds needs a way to pause it. */
@media (hover:hover) and (pointer:fine){.mq:hover .tr{animation-play-state:paused}}
.mq:focus-within .tr{animation-play-state:paused}
.brand{font-style:italic}
@keyframes sl{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* ══════ footer ══════ */
.foot{border-top:1px solid var(--ink);padding:clamp(26px,4vw,46px) var(--gut) 20px;margin-top:60px}
.foot .cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:26px}
@media (min-width:600px) and (max-width:1000px){.foot .cols{grid-template-columns:repeat(2,1fr)}}
.foot h3{margin:0 0 10px;color:var(--mute)}
.foot a{
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .34s var(--ease),color .2s;padding-bottom:2px;
}
.foot a:hover{background-size:100% 1px}
.foot li{transition:transform .28s var(--ease)}
.foot li:hover{transform:translateX(3px)}
.foot ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}
.foot ul li a{display:inline-block;padding:6px 0}
/* form.sub, not .sub: the archive plate's byline line is also .sub, and
   inherited this form's 330px cap and underline */
form.sub{display:flex;flex-wrap:wrap;gap:0;margin-top:8px;max-width:330px;border-bottom:1px solid var(--ink)}
.sub-status{flex-basis:100%;margin:6px 0 0;font-weight:400;letter-spacing:0;text-transform:none;
  color:var(--mute);min-height:1.3em}
.sub-status.is-error{color:var(--ess)}
form.sub input{
  flex:1 1 auto;min-width:0;border:0;background:none;padding:6px 2px;font:inherit;color:inherit;
  font-size:16px; /* under 16px iOS Safari zooms the page on focus */
}
form.sub input::placeholder{color:var(--mute)}
form.sub input:focus{outline:none}
form.sub button{padding:12px 2px 12px 10px;min-height:44px;white-space:nowrap}
/* The three controls that take money or a manuscript — Buy, Give, Send — keep the
   arrow language but carry a heavier rule, so a squint finds them. */
.cta-pay{font-weight:700!important;border-bottom:2px solid var(--c,var(--ink))!important}
form.sub button:hover{color:var(--ess)}
form.sub:focus-within{border-bottom-color:var(--ess)}
.cave{margin:6px 0 0;color:var(--soft);font-size:13.5px;line-height:1.5;max-width:44ch}
.foot .base{
  display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;
  color:var(--mute);margin-top:32px;padding-top:12px;border-top:1px solid var(--rule);
}
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ══════ shared interaction primitives ══════
   One vocabulary of hover, so a link on Contact behaves like a link on the
   archive: rules draw themselves in, arrows step out, ink arrives on hover. */

/* an underline that draws left to right */
.ul{
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .34s var(--ease),color .2s;padding-bottom:2px;
}
.ul:hover{background-size:100% 1px}

/* (the big call-to-action line, .bigl, lives in statics.css) */

/* the page head every standing page opens with */
.phead{position:relative;padding-bottom:clamp(20px,3vw,32px);margin-bottom:clamp(22px,3.4vw,40px)}
.phead .lede{margin:0}
.phead h1.big{margin-bottom:.22em}
.phead-rule{
  position:absolute;left:0;bottom:0;height:1px;width:100%;background:var(--ink);
  transform:scaleX(0);transform-origin:0 50%;animation:drawrule .9s var(--ease) .1s forwards;
}
@keyframes drawrule{to{transform:scaleX(1)}}

/* The bar stays on one line at every width — --mast is a single number, and
   two sticky elements and a viewport calculation are written against it. */
@media (max-width:640px){
  .mast{gap:10px}
  .mast .mk{height:28px}
}
/* Reduced motion means fewer and gentler, not none. Nothing travels — rows
   stop stepping aside, entrances stop dealing in, the marquee stands still —
   but colour, fills and fades still answer, because they carry state. */
@media (prefers-reduced-motion:reduce){
  :root{--nudge:0px}
  .mq .tr{animation:none}
  .mast nav.open a{animation:none}
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    animation-delay:0s!important;scroll-behavior:auto!important}
}

/* article.css */
/* ══════════════════════════════════════════════════════════════════════════
   article.css — the reading instrument.

   Was: a 66ch column floating in the middle of an empty page. Now the piece
   owns the viewport the way the archive does — a full-bleed plate, a sticky
   spine rail carrying section, byline and progress, figures that break the
   measure into the margin, and a foot that hands you to the next piece the
   way the Spine hands you to a plate.
   ══════════════════════════════════════════════════════════════════════════ */

/* ══════ progress ══════ */
.progress{position:fixed;top:0;left:0;right:0;height:2px;z-index:70;pointer-events:none}
.progress i{
  display:block;height:100%;background:var(--c,var(--ink));
  transform:scaleX(0);transform-origin:0 50%;will-change:transform;
}

/* ══════ the opening ══════ */
.article{--c:var(--ink)}
.ahead{padding:var(--pad-band) var(--gut) clamp(20px,3vw,36px)}
.ahead .kick a{color:var(--c);position:relative;padding-bottom:2px;
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size var(--t-base) var(--ease)}
.ahead .kick a:hover{background-size:100% 1px}

/* view-transition-name: the landing spot for a title carried in from the
   archive or from the neighbouring piece (frame.css, index.js) */
.atitle{
  margin:0;font-weight:500;line-height:.92;letter-spacing:-.042em;
  font-size:clamp(38px,7.4vw,112px);max-width:16ch;text-wrap:balance;color:var(--c);
  view-transition-name:kahf-title;
}
.atitle[dir="rtl"]{font-family:var(--ar);font-weight:700;line-height:1.24;letter-spacing:0;
  max-width:18ch;margin-left:auto;text-align:right;font-size:clamp(34px,6.4vw,94px)}
/* A bilingual title — "<script A> / <script B>" — splits into two runs on
   one row instead of one dir flipping the whole string: Latin fixed left in
   the page's own face, Arabic/Urdu fixed right in its own, so neither script
   drags the other's shaping or reading order around. */
.atitle.bi{
  display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.1em 1em;
  max-width:none;font-size:clamp(24px,4.2vw,58px);
}
.atitle.bi .en{order:1;flex:0 1 auto;min-width:0;text-align:left;
  font-weight:500;letter-spacing:-.03em;line-height:1.05}
.atitle.bi .ar{order:2;flex:0 1 auto;min-width:0;text-align:right;
  font-family:var(--ar);font-weight:700;letter-spacing:0;line-height:1.35}
.abyline{
  display:flex;flex-wrap:wrap;gap:10px 18px;align-items:baseline;color:var(--mute);
  margin:clamp(18px,2.6vw,30px) 0 0;padding-top:14px;border-top:1px solid var(--rule);
}
.abyline .who{color:var(--ink)}
.abyline .adate{margin-left:auto}

/* ══════ the plate ══════
   Full bleed, and it drifts a little as you leave it. Never tinted — the
   artwork is the artwork (tests/test_image_colors). */
.aplate{margin:0;position:relative;overflow:hidden;background:var(--rule)}
.aplate img{
  display:block;width:100%;height:clamp(300px,68svh,760px);object-fit:cover;
  transform:scale(1.04);transition:transform 1.6s var(--ease);
}
.aplate.in img{transform:scale(1)}
.aplate figcaption{
  position:absolute;left:var(--gut);bottom:12px;color:var(--on-photo);
  text-shadow:0 1px 14px rgba(0,0,0,.6);
}

/* ══════ the reading grid ══════
   Three tracks: the spine rail, the measure, and a margin the figures and
   captions are allowed to spill into. */
.areading{
  display:grid;gap:0 clamp(24px,3.4vw,56px);align-items:start;
  grid-template-columns:minmax(160px,0.62fr) minmax(0,68ch) minmax(120px,0.5fr);
  padding:clamp(30px,4.6vw,64px) var(--gut) 0;
}

.aspine{position:sticky;top:calc(var(--mast,63px) + 26px);display:flex;flex-direction:column;
  gap:12px;color:var(--mute)}
.aspine .sec{color:var(--c);letter-spacing:.09em}
.aspine .rt{display:block;width:100%;height:1px;background:var(--rule);position:relative}
.aspine .rt i{position:absolute;inset:0;background:var(--c);transform:scaleX(0);
  transform-origin:0 50%}
.aspine .who{color:var(--ink);font-size:14px;line-height:1.35}
.aspine .back{
  margin-top:6px;display:inline-flex;align-items:center;gap:8px;color:var(--mute);
  transition:color var(--t-base) ease;
}
.aspine .back:hover{color:var(--c)}
.aspine .back .g{display:inline-block;transition:transform var(--t-base) var(--ease)}
.aspine .back:hover .g{transform:translateX(-4px)}

/* ══════ body copy ══════ */
/* The reading font is a serif (paired against Archivo everywhere else in the
   chrome) so a full-length essay reads as prose, not UI copy. Client asked to
   try ~12pt; a hairline-thin clamp keeps it from going smaller on narrow
   phones, where 12pt real type gets uncomfortable fast. */
.abody{
  grid-column:2;font-family:"EB Garamond",Georgia,"Times New Roman",serif;
  font-size:clamp(17px,calc(13.43px + .446vw),18px);line-height:1.6;color:var(--ink);
  max-width:68ch;
}
.abody p{margin:0 0 1.2em}
.abody p:last-child{margin-bottom:0}
.abody p[dir="rtl"]{font-family:var(--ar);font-size:1.12em;line-height:1.9;text-align:right}
.abody strong{font-weight:700}
.abody em{font-style:italic}
.abody u{text-decoration:underline;text-underline-offset:2px}
.abody a{
  background-image:linear-gradient(var(--c),var(--c));
  background-size:100% 1px;background-repeat:no-repeat;background-position:0 100%;
  padding-bottom:2px;transition:background-size .3s var(--ease),color .24s;
}
.abody a:hover{color:var(--c)}
.abody hr{border:0;border-top:1px solid var(--rule);margin:clamp(28px,4vw,48px) 0}

/* the drop cap — the section's ink, three lines deep */
.abody > p.opener::first-letter{
  float:left;font-size:4.15em;line-height:.78;font-weight:600;color:var(--c);
  padding:.06em .1em 0 0;margin-right:.02em;
}
.abody > p.opener[dir="rtl"]::first-letter{float:none;font-size:inherit;color:inherit;
  padding:0;margin:0;font-weight:inherit}

/* figures break the measure and spill into the right margin */
.abody figure{margin:clamp(30px,4.4vw,58px) 0;width:100%}
.abody figure img{display:block;width:100%;height:auto}
.abody figcaption{
  margin-top:10px;font-size:12px;letter-spacing:.05em;text-transform:uppercase;
  color:var(--mute);font-family:"DM Mono",ui-monospace,monospace;line-height:1.6;max-width:44ch;
}
/* Wide enough to break the measure into the margin track, narrow enough that
   it never reaches the page edge — the margin column absorbs the overhang. */
@media (min-width:1280px){
  .abody figure{width:122%;max-width:calc(100vw - 2 * var(--gut))}
}

/* ══════ footnotes ══════
   A marker is a small mono numeral in the section ink that fills like a lit
   row when pointed at; its note, at the foot, hangs its number in the margin
   and links back. site.js shows the note in place on hover or focus. */
.abody .fnref{font-size:.66em;line-height:0;vertical-align:super;margin-left:.08em}
.abody .fnref a{
  font-family:"DM Mono",ui-monospace,monospace;color:var(--c);background-image:none;
  padding:.05em .28em;border-radius:2px;scroll-margin-top:calc(var(--mast,63px) + 90px);
  transition:background-color var(--t-fast) ease,color var(--t-fast) ease;
}
.abody .fnref a:hover,.abody .fnref a:focus-visible{background-color:var(--c);color:var(--paper)}
.abody :not(.fn) + p.fn{margin-top:2.6em;padding-top:1.4em;border-top:1px solid var(--rule)}
.abody p.fn{
  position:relative;margin:0 0 .75em;padding-left:2.4em;font-size:.86em;line-height:1.55;
  color:var(--soft);scroll-margin-top:calc(var(--mast,63px) + 30px);word-break:break-word;
}
.abody p.fn .fn-n{
  position:absolute;left:0;top:.2em;font-size:.82em;color:var(--c);background-image:none;
  padding:0 .25em;border-radius:2px;transition:background-color var(--t-fast) ease,color var(--t-fast) ease;
}
.abody p.fn .fn-n:hover{background-color:var(--c);color:var(--paper)}
.abody p.fn:target{animation:fnlit 1.8s var(--ease)}
@keyframes fnlit{0%,35%{background:color-mix(in srgb,var(--c) 13%,transparent)}100%{background:transparent}}

.fntip{
  position:fixed;left:0;top:0;z-index:80;width:max-content;max-width:min(380px,calc(100vw - 32px));
  padding:12px 15px 13px;background:var(--paper);color:var(--soft);
  border:1px solid var(--ink);box-shadow:var(--sh-soft);
  font-family:"EB Garamond",Georgia,serif;font-size:15.5px;line-height:1.5;word-break:break-word;
  opacity:0;transform:scale(.96);pointer-events:none;
  transition:opacity var(--t-fast) ease,transform var(--t-fast) var(--ease);
}
.fntip.on{opacity:1;transform:none;pointer-events:auto}
.fntip-n{display:block;margin-bottom:5px;color:var(--mute);font-family:"Archivo",sans-serif}
.fntip a{text-decoration:underline;text-underline-offset:2px}

/* ══════ verse ══════ */
.abody.verse{max-width:64ch}
.abody.verse p.v{
  margin:0;padding:1px 0;font-size:1.03em;line-height:1.52;white-space:pre-wrap;
  text-align:left;
}
.abody.verse p.v[dir="rtl"]{text-align:right;font-family:var(--ar);font-size:1.28em;
  line-height:1.72}
.abody.verse.lang-ur p.v[dir="rtl"]{font-family:var(--ur);line-height:2.2;font-size:1.18em}
.abody.verse p.vb{margin:0;height:.85em}
.abody.verse > p.opener::first-letter{float:none;font-size:inherit;color:inherit;
  padding:0;margin:0;font-weight:inherit}

.aend{grid-column:2;margin:clamp(34px,5vw,64px) 0 0;display:flex;align-items:center;gap:14px;
  color:var(--mute)}
.aend .dot{flex:1 1 auto;height:1px;background:var(--rule)}
.aend .mk{width:26px;height:auto;opacity:.75}

/* ══════ more from the section ══════ */
.amore{margin-top:clamp(64px,9vw,128px);border-top:1px solid var(--ink)}
.amore .band-hd{padding:clamp(16px,2.4vw,26px) var(--gut) 0;margin-bottom:10px}

/* ══════ prev / next — two panels that flood ══════ */
.anext{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid var(--ink)}
.anext .nb{
  position:relative;overflow:hidden;display:flex;flex-direction:column;gap:10px;
  padding:clamp(26px,4vw,54px) var(--gut);min-height:clamp(150px,20vw,240px);
  justify-content:flex-end;isolation:isolate;
}
.anext .nb + .nb{border-left:1px solid var(--ink);align-items:flex-end;text-align:right}
.anext .nb .bgp{position:absolute;inset:0;z-index:-1;opacity:0;transition:opacity .5s ease}
.anext .nb .bgp img{width:100%;height:100%;object-fit:cover;display:block;
  transform:scale(1.08);transition:transform 1.1s var(--ease)}
/* a paper veil, not a tint: the plate reads through it and the type stays legible */
.anext .nb .bgp .wash{position:absolute;inset:0;background:var(--paper);opacity:.86}
.anext .nb:hover .bgp{opacity:1}
.anext .nb:hover .bgp img{transform:scale(1)}
.anext .nb .lbl{display:flex;align-items:center;gap:9px;color:var(--mute);
  transition:color .3s}
.anext .nb:hover .lbl{color:var(--c)}
.anext .nb .lbl .g{transition:transform .34s var(--ease)}
.anext .nb:hover .lbl .g{transform:translateX(4px)}
.anext .nb:first-child:hover .lbl .g{transform:translateX(-4px)}
.anext .nbt{
  font-size:clamp(19px,2.6vw,34px);font-weight:500;letter-spacing:-.028em;line-height:1.06;
  max-width:18ch;transition:color .3s;
}
.anext .nb:hover .nbt{color:var(--c)}
.anext .nbt[dir="rtl"]{font-family:var(--ar-mono);font-weight:400;letter-spacing:0;line-height:1.32}
.anext .nbt.bi{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.1em .6em;
  max-width:none}
.anext .nbt.bi .en{flex:0 1 auto;min-width:0;text-align:left;font-weight:500}
.anext .nbt.bi .ar{flex:0 1 auto;min-width:0;text-align:right;font-family:var(--ar-mono);
  font-weight:400;line-height:1.32}

@media (max-width:1080px){
  .areading{grid-template-columns:minmax(0,1fr);gap:0}
  .abody,.aend{grid-column:1}
  .abody figure{grid-column:1}
  /* Every field in .aspine — section, byline, date, back link — already
     appears once in .ahead; below 1080px it has nothing unique left to
     show (the progress rail hides too), so it just duplicated the header. */
  .aspine{display:none}
}
@media (max-width:640px){
  .anext{grid-template-columns:1fr}
  .anext .nb + .nb{border-left:0;border-top:1px solid var(--ink);align-items:flex-start;
    text-align:left}
  .aplate img{height:clamp(230px,46svh,420px)}
}
@media (prefers-reduced-motion:reduce){
  .aplate img{transform:none}
}

/* fonts.css */
/* generated by src/fetch_fonts.py — do not edit */
/* arabic */
@font-face {
  font-family: 'Amiri';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-7b437cf4.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Amiri';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-79d9d049.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Amiri';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-198010c7.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-4f1f7dad.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-aafd5670.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/amiri-441f50a6.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/amiri-887370a1.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/amiri-f1c0a977.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Amiri';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/amiri-7becc3f0.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: italic;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-934b8844.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: italic;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-ddd2f07d.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: italic;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-49c93f2c.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-fe4a1036.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-c628a829.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 400;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-0186fb75.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 500;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-fe4a1036.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 500;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-c628a829.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 500;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-0186fb75.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 600;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-fe4a1036.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 600;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-c628a829.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 600;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-0186fb75.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 700;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-fe4a1036.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 700;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-c628a829.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 700;
  font-stretch: 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-0186fb75.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
  font-family: 'DM Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/dm-mono-b746c46d.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'DM Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/dm-mono-61f4626a.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-8e1d7039.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-a20f7927.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-dc8efb77.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-dd76451e.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-3e1065c5.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-9e53e4fc.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'EB Garamond';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-ad919725.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-76472d6d.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-ab61e9c1.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-3cca06eb.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-6d852e7e.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-cf7b8129.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-5b9269f2.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-88e225a1.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-76472d6d.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-ab61e9c1.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-3cca06eb.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-6d852e7e.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-cf7b8129.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-5b9269f2.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-88e225a1.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-76472d6d.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-ab61e9c1.woff2) format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-3cca06eb.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-6d852e7e.woff2) format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-cf7b8129.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-5b9269f2.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'EB Garamond';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/eb-garamond-88e225a1.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-5850f74f.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-ac47e50f.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-1f9fca66.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-5850f74f.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* latin-ext */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-ac47e50f.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Noto Nastaliq Urdu';
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url(/assets/fonts/noto-nastaliq-urdu-1f9fca66.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-0136d09f.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* vietnamese */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-18d5b608.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-14d9abcc.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-bf33cab6.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* arabic */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-0136d09f.woff2) format('woff2');
  unicode-range: U+0600-06FF, U+0750-077F, U+0870-088E, U+0890-0891, U+0897-08E1, U+08E3-08FF, U+200C-200E, U+2010-2011, U+204F, U+2E41, U+FB50-FDFF, U+FE70-FE74, U+FE76-FEFC, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}
/* vietnamese */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-18d5b608.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-14d9abcc.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Readex Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url(/assets/fonts/readex-pro-bf33cab6.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* frame.css */
/* ══════════════════════════════════════════════════════════════════════════
   frame.css — the room-building layer.

   The archive works because it owns the viewport and holds live state. The
   standing pages used to be the same centred document five times over. These
   are the atoms they are now built from: full-bleed bands, a display scale,
   the big lit row (the Spine gesture, generalised), a plate that follows the
   cursor, scroll reveals, and the brush mark drawing itself on arrival.

   Nothing here touches the archive's own layout — index.css still owns that.
   ══════════════════════════════════════════════════════════════════════════ */

@view-transition{navigation:auto}
::view-transition-old(root),::view-transition-new(root){animation-duration:.3s;animation-timing-function:ease}
::view-transition-old(root){overflow:clip}
/* A title carried across a page change — from the archive into the piece, or
   from one piece to the next — travels rather than cross-fading. index.js
   names the clicked title; the article heading always carries the name. */
::view-transition-group(kahf-title){animation-duration:.5s;animation-timing-function:var(--ease-io)}
::view-transition-old(kahf-title),::view-transition-new(kahf-title){animation-duration:.5s}
@media (prefers-reduced-motion:reduce){
  ::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}
}

/* ══════ the kicker ══════
   Every room's head opens on the same line: mono-caps label, a hairline
   running out to a number. One rule, so all six rooms open at one height. */
.kick{display:flex;align-items:center;gap:12px;color:var(--mute);margin:0 0 clamp(14px,2.2vw,26px)}
.kick .dot{flex:1 1 auto;height:1px;background:var(--rule)}

/* ══════ paper grain ══════
   A single turbulence tile, fixed and very faint. It is what stops a flat
   cream fill from reading as a browser default. */
body::after{
  content:"";position:fixed;inset:0;z-index:9998;pointer-events:none;opacity:var(--grain);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
  /* Forces its own compositor layer so the SVG filter rasterizes once instead
     of recomputing feTurbulence on every paint (Safari renderer timeout). */
  transform:translateZ(0);will-change:opacity;
}

/* ══════ the ink intro ══════
   The mark is a brush drawing, so it arrives the way a brush arrives: a
   feathered wipe travelling along the stroke, then the mark flies to its
   place in the masthead. Once per session, and never under reduced motion. */
.inkintro{
  position:fixed;inset:0;z-index:9999;background:var(--paper);
  display:flex;align-items:center;justify-content:center;
  transition:opacity .5s ease,visibility .5s;
}
.inkintro[hidden]{display:flex!important;opacity:0;visibility:hidden;pointer-events:none}
.inkintro .im{
  width:min(46vw,460px);aspect-ratio:760/536;
  background:var(--mk-src) center/contain no-repeat;
  /* The mark is Arabic calligraphy, so the stroke lands right to left. The
     gradient's black end leads, and the feather behind it is the wet edge. */
  -webkit-mask-image:linear-gradient(76deg,transparent 42%,rgba(0,0,0,.45) 54%,#000 66%);
          mask-image:linear-gradient(76deg,transparent 42%,rgba(0,0,0,.45) 54%,#000 66%);
  -webkit-mask-size:280% 100%;mask-size:280% 100%;
  -webkit-mask-position:-32% 0;mask-position:-32% 0;
  animation:inkdraw .92s cubic-bezier(.4,.02,.2,1) .1s forwards;
  transform-origin:50% 50%;
}
@keyframes inkdraw{
  from{-webkit-mask-position:-32% 0;mask-position:-32% 0}
  to{-webkit-mask-position:118% 0;mask-position:118% 0}
}
/* the flight to the masthead — the offsets are measured and set by site.js */
.inkintro .im.fly{
  transition:transform .78s cubic-bezier(.62,.02,.2,1),opacity .3s ease .52s;
  animation:none;-webkit-mask-image:none;mask-image:none;
}
.mast .mk{transition:transform .45s var(--ease),opacity .3s ease}
body.introing .mast .mk{opacity:0}

/* ══════ display typography ══════ */
.disp{
  margin:0;font-weight:500;line-height:.84;letter-spacing:-.045em;
  font-size:clamp(52px,12.5vw,196px);text-wrap:balance;
}
.disp-md{
  margin:0;font-weight:500;line-height:.92;letter-spacing:-.038em;
  font-size:clamp(38px,7vw,104px);text-wrap:balance;
}

/* a line of mono metadata riding a hairline, the archive's stage-top gesture */
.metaline{
  display:flex;align-items:center;gap:14px;color:var(--mute);
  padding:11px var(--gut);border-bottom:1px solid var(--rule);
}
.metaline .dot{flex:1 1 auto;height:1px;background:var(--rule)}
.metaline a{color:var(--ink)}

/* ══════ bands ══════
   Full-bleed by default. Prose inside gets a measure; the rules do not. */
.band{position:relative;padding:var(--pad-band) var(--gut);border-top:1px solid var(--ink)}
.band:first-child{border-top:0}
.band.tight{padding-top:clamp(20px,3vw,38px);padding-bottom:clamp(20px,3vw,38px)}
.band.flush{padding-left:0;padding-right:0}
.band-hd{
  display:flex;align-items:baseline;gap:12px;color:var(--mute);
  margin:0 0 clamp(18px,2.6vw,32px);
}
.band-hd .dot{flex:1 1 auto;height:1px;background:var(--rule);transform:translateY(-3px)}
.measure{max-width:62ch}
.measure p{margin:0 0 1em;line-height:1.6}
.measure p:last-child{margin-bottom:0}

/* ══════ scroll reveal ══════ */
.rev{opacity:0;transform:translateY(16px);
  transition:opacity var(--t-slow) var(--ease),transform var(--t-slow) var(--ease)}
.rev.in{opacity:1;transform:none}
.rev-d1{transition-delay:.07s} .rev-d2{transition-delay:.14s} .rev-d3{transition-delay:.21s}

/* ══════ the big lit row ══════
   The Spine's gesture, made reusable: a numbered line that floods with its own
   ink, steps sideways, and flies a plate under the cursor. Shop, Submit,
   Contact and the issue contents are all built from it. */
/* Every flood-and-step row on the site — .xrow here, and About's masthead,
   Submit's categories, Contact's addresses and an issue's spec list — runs
   on these same four timings: the flood draws on --t-move, the type steps
   --nudge on --t-move, colour follows on --t-base. Hover motion is gated to
   devices that actually hover, so a tap on a phone does not leave a row
   half-stepped. */
.xlist{border-top:1px solid var(--ink)}
.xrow{
  position:relative;display:grid;align-items:center;gap:clamp(10px,2vw,28px);
  grid-template-columns:auto minmax(0,1fr) auto;
  padding:var(--pad-row) var(--gut);
  border-bottom:1px solid var(--rule);--c:var(--ink);
  transition:color var(--t-base) ease;
}
.xrow::before{
  content:"";position:absolute;inset:0;background:var(--c);opacity:var(--flood);
  transform:scaleX(0);transform-origin:0 50%;
  transition:transform var(--t-move) var(--ease);
}
.xrow .xn{
  font-family:"DM Mono",monospace;font-size:11px;color:var(--rule);
  font-variant-numeric:tabular-nums;position:relative;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease);
}
.xrow .xt{
  position:relative;margin:0;font-weight:500;letter-spacing:-.03em;line-height:1.02;
  font-size:var(--fs-row);transition:color var(--t-base) ease,transform var(--t-move) var(--ease);
}
.xrow .xt[dir="rtl"]{font-family:var(--ar-mono);font-weight:400;letter-spacing:0;line-height:1.3}
.xrow .xt.bi{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.08em .6em}
.xrow .xt.bi .en{flex:0 1 auto;min-width:0;text-align:left}
.xrow .xt.bi .ar{flex:0 1 auto;min-width:0;text-align:right;font-family:var(--ar-mono);
  font-weight:400;letter-spacing:0;line-height:1.3}
.xrow .xs{position:relative;display:flex;align-items:baseline;gap:12px;color:var(--mute);
  white-space:nowrap;transition:color var(--t-base) ease,transform var(--t-move) var(--ease)}
.xrow .xgo{display:inline-block;opacity:0;transform:translateX(-8px);
  transition:opacity var(--t-base) ease,transform var(--t-move) var(--ease)}
.xrow .xd{color:var(--soft);font-size:13.5px;line-height:1.5;max-width:52ch;margin:6px 0 0;
  position:relative;transition:transform var(--t-move) var(--ease)}
.xrow:focus-visible::before{transform:scaleX(1)}
@media (hover:hover){
  .xrow:hover::before{transform:scaleX(1)}
  .xrow:hover .xn,.xrow:hover .xt,.xrow:hover .xs{color:var(--c);transform:translateX(var(--nudge))}
  .xrow:hover .xgo{opacity:1;transform:translateX(var(--nudge))}
  .xrow:hover .xd{transform:translateX(var(--nudge))}
}

@media (max-width:700px){
  .xrow{grid-template-columns:auto minmax(0,1fr);row-gap:4px}
  .xrow .xs{grid-column:2;justify-content:flex-start}
  .xrow .xgo{display:none}
}

/* ══════ the plate that follows the cursor ══════
   Same idea as the Spine's trail, but driven by site.js and usable on any
   page that carries rows with a data-plate attribute. */
.pfollow{
  position:fixed;left:0;top:0;z-index:40;width:170px;height:214px;
  margin:-107px 0 0 -85px;pointer-events:none;will-change:transform;
  opacity:0;transition:opacity var(--t-base) ease;
}
.pfollow.on{opacity:1}
.pfollow img{
  width:100%;height:100%;object-fit:cover;display:block;
  box-shadow:var(--sh-plate);
  transform:scale(.92) rotate(-2.5deg);transition:transform var(--t-move) var(--ease);
}
.pfollow.on img{transform:scale(1) rotate(-2.5deg)}
@media (max-width:900px){.pfollow{display:none}}

/* ══════ a hairline that draws itself when scrolled to ══════ */
.drawn{transform:scaleX(0);transform-origin:0 50%;transition:transform .9s var(--ease)}
.drawn.in{transform:scaleX(1)}

@media (prefers-reduced-motion:reduce){
  .inkintro{display:none!important}
  .rev{opacity:1;transform:none}
  .drawn{transform:none}
  .pfollow{display:none}
  body::after{opacity:.03}
}

/* index.css */
/* ══════════ / — the archive, one index in two views ══════════ */
:root{--mast:63px;--chips:39px}
.idx{--c:var(--ink)}

/* ══════════ the section filter, shared by both views ══════════ */
/* One control bar: the section filter on the left, the view switch on the
   right. The switch used to float over the bottom of the page, where it sat on
   top of the marquee and the issue strip; docking it here keeps it permanently
   visible and covering nothing. The row is exactly --chips tall, because the
   Reading Room's height is 100svh minus the masthead minus this. */
.bar{
  display:flex;align-items:stretch;gap:10px;position:sticky;top:var(--mast);z-index:50;
  background:var(--paper);border-bottom:1px solid var(--ink);min-height:var(--chips);
}
.chips{display:flex;flex-wrap:wrap;flex:1 1 auto;min-width:0}
.chips .chip{
  position:relative;display:flex;align-items:center;padding:0 15px;
  border-right:1px solid var(--rule);color:var(--mute);
  white-space:nowrap;transition:color .22s,background-color .22s;--k:var(--ink);
}
/* a hairline of the section's own ink, drawn along the top on hover */
.chips .chip::before{
  content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--k);
  transform:scaleX(0);transform-origin:0 50%;transition:transform .3s var(--ease);
}
.chips .chip:hover{color:var(--ink);background:color-mix(in srgb,var(--k) 9%,transparent)}
.chips .chip:hover::before{transform:scaleX(1)}
.chips .chip[aria-pressed="true"]{color:var(--paper);background:var(--k)}
.chips .chip[aria-pressed="true"]::before{transform:scaleX(1);background:var(--ink);opacity:.25}
.chips .chip[data-c="Letters"][aria-pressed="true"]{color:var(--let-on)}
.chips .chip b{
  font-variant-numeric:tabular-nums;opacity:.55;font-weight:700;margin-left:6px;
  display:inline-block;transition:transform .3s var(--ease),opacity .22s;
}
.chips .chip:hover b{opacity:.9;transform:translateY(-1px)}

/* ══════════ swapping between the two views ══════════
   Both views live side by side inside .views, which slides left/right so the
   switch reads as turning a page. .idx clips the off-screen twin; the slide
   runs on transform for GPU compositing. */
/* clip, not hidden. overflow:hidden makes .idx a scroll container, and a
   sticky child sticks to its nearest scroll container — so .bar stopped
   sticking to the viewport and its top:var(--mast) became a permanent 63px
   push away from the masthead: the gap under the bar. overflow:clip crops the
   off-screen twin without creating a scrollport, so .bar sticks to the
   viewport again. The hidden above it is the fallback for browsers without
   clip, which would otherwise scroll sideways across the 200%-wide .views. */
.idx{overflow:hidden;overflow:clip}
.views{
  display:grid;grid-template-columns:1fr 1fr;width:200%;
  transition:transform .52s var(--ease-io);
}

/* ══════════ the morph between the views ══════════
   index.js gives every title on screen a shared view-transition-name for the
   length of a switch (class "ktitle"), then paints the other view; the
   browser tweens each pair from the old title's box to the new one's. While
   that runs the slide is off — the new frame has to be final, not mid-move —
   and the filter bar is lifted out of the page cross-fade so its thumb slides
   once, live, instead of showing in two places at once. */
html.morphing .views{transition:none}
html.morphing .v-room .list{scroll-behavior:auto}
html.morphing .bar{view-transition-name:kbar}
html.morphing::view-transition-old(kbar){display:none}
html.morphing::view-transition-new(kbar){animation:none}
html.morphing::view-transition-group(*.ktitle){
  animation-duration:.56s;animation-timing-function:var(--ease-io);
}
/* the text scales as an image: pin it to the leading edge so a title grows
   out of its own first word rather than from its middle */
html.morphing::view-transition-old(*.ktitle),
html.morphing::view-transition-new(*.ktitle){
  width:100%;height:auto;object-fit:contain;object-position:0 0;
  animation-duration:.56s;animation-timing-function:var(--ease-io);
}
/* the rest of the page trades places quickly, so it never competes with the
   titles in flight: the outgoing view is gone in the first third */
html.morphing::view-transition-old(root){animation:vt-out .2s ease both}
html.morphing::view-transition-new(root){animation:vt-in .36s ease .12s both}
@keyframes vt-out{to{opacity:0}}
@keyframes vt-in{from{opacity:0}}
body[data-view="room"]  .views{transform:translateX(0)}
body[data-view="spine"] .views{transform:translateX(-50%)}

.v-room,.v-spine{min-width:0;overflow:hidden}
/* The twin is off-screen, not absent — which means it was still setting the
   document's height. The Spine is 10,000px tall, so the Reading Room, one
   screen tall, sat on top of nine thousand pixels of nothing to scroll
   through. Cap whichever view is not showing at one screen.

   Only once the slide has landed, though: .settled is added by index.js on the
   wrapper's transitionend. Capping during the move would resize the grid
   mid-transform and the slide would judder. */
body.settled[data-view="room"]  .v-spine,
body.settled[data-view="spine"] .v-room{
  max-height:calc(100svh - var(--mast) - var(--chips));overflow:hidden;
}

@keyframes rowin{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}

/* ══════════ view: Reading Room ══════════ */
.v-room{display:grid;grid-template-columns:minmax(320px,34%) 1fr;
  height:calc(100svh - var(--mast) - var(--chips))}
.v-room .col{border-right:1px solid var(--ink);display:flex;flex-direction:column;
  min-height:0;min-width:0}
/* overscroll-behavior left at its default (auto/chained) on purpose: once the
   list runs out of its own scroll, the same scroll gesture continues onto
   the page below instead of dead-ending inside the column. */
/* No browser scrollbar: the column carries its own rail (below, and index.js). */
.v-room .col{position:relative}
.v-room .list{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;position:relative;
  padding:2px 20px 10px 0;scroll-behavior:smooth;scrollbar-width:none}
.v-room .list::-webkit-scrollbar{display:none}

/* ── the rail ── */
.rail{position:absolute;top:0;right:0;width:24px;z-index:4;pointer-events:none}
.rail.idle{display:none}
.rail .segs{position:absolute;inset:0}
.rail .rseg{position:absolute;right:0;width:24px;pointer-events:auto;cursor:pointer}
/* each section's stretch of rail: a 2px rule in its ink, set back until wanted */
.rail .rseg::before{
  content:"";position:absolute;right:10px;top:3px;bottom:3px;width:3px;background:var(--c);
  opacity:.6;transform-origin:50% 50%;
  transition:opacity var(--t-base) ease,transform var(--t-base) var(--ease);
}
.rail .rseg:hover::before{opacity:1;transform:scaleX(2)}
.rail .rseg-l{
  position:absolute;right:26px;top:0;padding:3px 7px;white-space:nowrap;
  background:var(--c);color:var(--paper);pointer-events:none;
  opacity:0;transform:translateX(6px);
  transition:opacity var(--t-fast) ease,transform var(--t-base) var(--ease);
}
.rail .rseg[style*="--let"] .rseg-l{color:var(--let-on)}
.rail .rseg:hover .rseg-l{opacity:1;transform:none}
/* the handle: a solid bar in the ink of the section under the top of the
   list, with the top piece's number riding beside it while it moves */
.rail .knob{position:absolute;top:0;right:7px;width:8px;pointer-events:auto;cursor:grab;
  will-change:transform;touch-action:none}
.rail .knob::before{content:"";position:absolute;inset:0;background:var(--c,var(--ink));
  transition:background-color var(--t-base) ease,transform var(--t-fast) var(--ease)}
.rail .knob:hover::before,.rail.dragging .knob::before{transform:scaleX(1.35)}
.rail.dragging .knob{cursor:grabbing}
.rail .knob-n{
  position:absolute;right:14px;top:0;padding:2px 6px;font-size:11px;line-height:1.3;
  background:var(--c,var(--ink));color:var(--paper);white-space:nowrap;
  opacity:0;transform:translateX(6px);
  transition:opacity var(--t-fast) ease,transform var(--t-base) var(--ease),background-color var(--t-base) ease;
}
.rail.moving .knob-n,.rail.dragging .knob-n,.rail .knob:hover .knob-n{opacity:1;transform:none}

.it{
  position:relative;display:flex;gap:8px;width:100%;padding:3px 14px 3px 22px;
  align-items:baseline;--c:var(--ink);
  transition:transform .26s var(--ease),background-color .26s;
}
.it[data-c="Essays"]{--c:var(--ess)} .it[data-c="Poems"]{--c:var(--poe)}
.it[data-c="Interviews"]{--c:var(--int)} .it[data-c="Letters"]{--c:var(--let)}
.it[data-c="Fictions"]{--c:var(--fic)}
.it{animation:rowin .38s var(--ease) backwards;animation-delay:calc(var(--i,0)*9ms)}

/* the caret that steps out of the gutter as a row lights */
.it::before{
  content:"";position:absolute;left:9px;top:.62em;width:5px;height:5px;border-radius:50%;
  background:var(--c);opacity:0;transform:scale(.4);
  transition:opacity .22s,transform .3s var(--ease);
}
.it.on::before,.it:hover::before{opacity:1;transform:none}
.it.on,.it:hover{transform:translateX(2px)}

.it .n{flex:0 0 auto;font-family:"DM Mono",monospace;font-size:11px;color:var(--mute);
  font-variant-numeric:tabular-nums;transition:color .22s}
.it .t{
  flex:1 1 auto;min-width:0;
  font-size:13.5px;font-weight:600;line-height:1.4;letter-spacing:-.008em;
  box-decoration-break:clone;-webkit-box-decoration-break:clone;
  background-image:linear-gradient(var(--c),var(--c));
  background-size:0% 100%;background-repeat:no-repeat;background-position:0 0;
  transition:background-size .26s var(--ease),color .22s;
  padding:1px 2px;margin:-1px -2px;
}
/* Arabic in the contents column is Readex Pro, bold to sit level with the
   English at 600, and a touch larger because Arabic's x-height reads small. */
.it[dir="rtl"] .t{font-family:var(--ar-mono);font-weight:700;font-size:14.5px;line-height:1.42;
  background-position:100% 0}
/* A bilingual row takes the same highlighter as every other row: the .t box
   is a flex item filling the line, so the sweep covers both scripts at once
   and both turn paper-coloured together. */
.it .t.bi{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.06em .5em}
.it .t.bi .en{flex:0 1 auto;min-width:0}
.it .t.bi .ar{flex:0 1 auto;min-width:0;text-align:right;font-family:var(--ar-mono);
  font-weight:700;font-size:14.5px;line-height:1.4}
.it.on .t,.it:hover .t{background-size:100% 100%;color:var(--paper)}
.it[data-c="Letters"].on .t,.it[data-c="Letters"]:hover .t{color:var(--let-on)}
.it.on .n{color:var(--c)}

.grouphd{
  position:sticky;top:0;z-index:2;background:var(--paper);
  padding:14px 14px 5px 22px;color:var(--mute);border-top:1px solid var(--rule);margin-top:8px;
  display:flex;justify-content:space-between;
}
.grouphd:first-child{border-top:0;margin-top:2px}
.v-room .colfoot{border-top:1px solid var(--ink);padding:9px 14px 9px 22px;display:flex;
  justify-content:space-between;gap:10px;color:var(--mute);white-space:nowrap;overflow:hidden}
.v-room .colfoot .hint{transition:opacity .3s}
.v-room .col:hover .colfoot .hint{opacity:.45}

/* ── the stage ── */
/* min-width:0 — without it the marquee's max-content track blows the 1fr
   column out past the viewport. */
.v-room .stage{position:relative;display:flex;flex-direction:column;min-height:0;min-width:0}
.stagetop{display:flex;justify-content:space-between;align-items:center;gap:14px;
  padding:12px 16px;border-bottom:1px solid var(--rule);color:var(--mute)}
.stagetop .dot{
  flex:1 1 auto;height:1px;background:var(--rule);
}
.stagetop a{color:var(--ink)}

/* The centring fix. Was: a grid with place-items:center around a fixed 620px box,
   so a portrait plate hugged the left edge and the pair rode high in the stage. */
.stage .plate{
  flex:1 1 auto;min-height:0;padding:26px;position:relative;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
}
.stage .plate .fade{display:flex;flex-direction:column;align-items:center;width:100%}
.stage .pic{position:relative;display:flex;justify-content:center;max-width:min(620px,100%);
  overflow:hidden}
.stage .pic img{display:block;max-width:100%;max-height:52vh;width:auto;height:auto;margin:0 auto;
  transition:transform .7s var(--ease)}
/* a hairline in the piece's own ink, drawn under the plate as it settles */
.stage .pic::after{
  content:"";position:absolute;left:0;bottom:0;height:3px;width:100%;background:var(--c);
  transform:scaleX(0);transform-origin:0 50%;animation:drawrule .5s var(--ease) .1s forwards;
}
.stage:hover .pic img{transform:scale(1.018)}

.stage .cap{padding:14px 0 0;width:min(620px,100%);margin:0 auto}
.stage .cap .ttl{margin:0;font-size:clamp(20px,2.4vw,30px);font-weight:600;line-height:1.12;
  letter-spacing:-.022em;text-wrap:balance}
.stage .cap .ttl[dir="rtl"]{font-family:var(--ar-mono);font-weight:400;line-height:1.45}
.stage .cap .ttl.bi{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.08em .6em}
.stage .cap .ttl.bi .en{flex:0 1 auto;min-width:0;text-align:left}
.stage .cap .ttl.bi .ar{flex:0 1 auto;min-width:0;text-align:right;font-family:var(--ar-mono);
  font-weight:400;line-height:1.45}
.stage .cap .sub{margin:7px 0 0;display:flex;gap:8px;flex-wrap:wrap;color:var(--mute)}
.stage .cap .sub .c{color:var(--c)}
.stage .cap .ex{margin:10px 0 0;font-size:14px;line-height:1.5;color:var(--soft);max-width:62ch;text-wrap:pretty}
.stage .cap .go{
  display:inline-flex;align-items:center;gap:8px;margin-top:12px;color:var(--c);
  border-bottom:1px solid currentColor;padding-bottom:2px;
}
.stage .cap .go::after{content:"\2192";transition:transform var(--t-base) var(--ease)}
.stage .cap .go:hover::after{transform:translateX(4px)}

/* each part of the caption deals in just behind the plate — 40ms apart,
   all of it done inside a third of a second */
.stage .fade{animation:fin .3s var(--ease) both}
.stage .fade .cap > *{animation:fin .32s var(--ease) both}
.stage .fade .cap > *:nth-child(1){animation-delay:.03s}
.stage .fade .cap > *:nth-child(2){animation-delay:.06s}
.stage .fade .cap > *:nth-child(3){animation-delay:.09s}
.stage .fade .cap > *:nth-child(4){animation-delay:.12s}
@keyframes fin{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* a plate painted hard on the heels of the last one (the cursor is sweeping
   the list) swaps nearly at once, with nothing dealt and no rule redrawn */
.stage .fade.quick,.stage .fade.quick .cap > *{animation:fin-q .12s ease both}
.stage .fade.quick .pic::after{animation:none;transform:scaleX(1)}
@keyframes fin-q{from{opacity:.4}to{opacity:1}}

/* ── the stage foot: marquee over the current issue ── */
.stagefoot{border-top:1px solid var(--rule)}
.stagefoot .mq{padding:9px 0;color:var(--mute)}
.issuebar{
  display:flex;align-items:center;gap:12px;padding:9px 16px;
  border-top:1px solid var(--rule);color:var(--mute);
  transition:background-color .3s,color .24s;
}
.issuebar .ib-plate{flex:0 0 auto;width:26px;height:34px;overflow:hidden;background:var(--rule)}
.issuebar .ib-plate img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .5s var(--ease)}
.issuebar .ib-n{color:var(--ink);letter-spacing:.02em}
.issuebar .ib-p{margin-left:auto;font-size:11px}
.issuebar .ib-go{transition:transform .3s var(--ease)}
.issuebar:hover{background:var(--ink);color:var(--on-ink)}
.issuebar:hover .ib-n{color:var(--paper)}
.issuebar:hover .ib-plate img{transform:scale(1.12)}
.issuebar:hover .ib-go{transform:translateX(4px);color:var(--paper)}

/* ══════════ view: Spine ══════════ */
.v-spine{position:relative;min-height:calc(100svh - var(--mast) - var(--chips))}

/* The two fixed layers sit outside the views. An element with a transform
   animation on it is a containing block for position:fixed children, so while
   they lived inside .v-spine they were pinned to the top of the spine — five
   thousand pixels above the reader. */
.bg{position:fixed;inset:0;z-index:0;pointer-events:none;opacity:0;overflow:hidden;
  transition:opacity .5s ease}
.bg.on{opacity:1}
.bg img{width:100%;height:100%;object-fit:cover;display:block;
  transform:scale(1.02);transition:transform 1.4s var(--ease)}
.bg.on img{transform:scale(1.07)}
/* The scraped plates are 520px wide, so at full bleed they are soft and
   blocky. They are printed through a dot screen instead: the eye reads the
   screen, not the pixels, and the page picks up a printed-matter texture.
   A mask, not a filter or blend, so the artwork keeps its own colour
   (tests/test_image_colors). The screen already lets half the paper through,
   which is why the veil on top can be this much lighter than the old .88. */
.bg .screen{position:absolute;inset:0;
  -webkit-mask-image:radial-gradient(circle,#000 34%,transparent 44%);
          mask-image:radial-gradient(circle,#000 34%,transparent 44%);
  -webkit-mask-size:5px 5px;mask-size:5px 5px}
.bg .screen img{filter:saturate(1.25) contrast(1.15)}
/* --bg-wash is per theme (theme.css): dark dots on white fight the type
   harder than light dots on near-black, so the light face veils more. */
.bg .wash{position:absolute;inset:0;background:var(--paper);opacity:var(--bg-wash)}
/* the lit title and its byline sit on a paper halo, so the screen behind
   them never breaks up the letterforms they are made of */
.stream.hot .ti.live h2,.stream.hot .ti.live .meta{
  text-shadow:0 0 10px var(--paper),0 0 22px var(--paper),0 0 2px var(--paper)}
body[data-view="room"] .bg,body[data-view="room"] .trail{display:none}

/* the plate that trails the cursor down the spine */
.trail{
  position:fixed;left:0;top:0;margin:-95px 0 0 -75px;z-index:20;
  width:150px;height:190px;pointer-events:none;will-change:transform;
}
.trail img{
  width:100%;height:100%;object-fit:cover;display:block;
  opacity:0;transform:scale(.86) rotate(-3deg);
  box-shadow:var(--sh-plate);
  transition:opacity .32s ease,transform .38s var(--ease);
}
.trail.on img{opacity:1;transform:scale(1) rotate(-3deg)}

.stream{position:relative;z-index:10;padding:26px var(--gut) 40px;max-width:1500px;margin:0 auto}
@media (min-width:900px){.stream{padding-right:calc(var(--gut) + 150px)}}
.ti{
  display:block;padding:6px 0;--c:var(--ink);
  transition:opacity .3s ease,transform .34s var(--ease);
  animation:rowin .44s var(--ease) backwards;animation-delay:calc(var(--i,0)*14ms);
}
.ti[data-c="Essays"]{--c:var(--ess)} .ti[data-c="Poems"]{--c:var(--poe)}
.ti[data-c="Interviews"]{--c:var(--int)} .ti[data-c="Letters"]{--c:var(--let)}
.ti[data-c="Fictions"]{--c:var(--fic)}
.stream.hot .ti{opacity:.55}
.stream.hot .ti.live{opacity:1}
.ti.live{transform:translateX(10px)}
.ti[dir="rtl"].live{transform:translateX(-10px)}
.ti h2{margin:0;font-size:clamp(26px,5.4vw,68px);font-weight:500;line-height:.99;
  letter-spacing:-.034em;text-wrap:balance;transition:color .25s ease}
.ti.live h2{color:var(--c)}
.ti[dir="rtl"]{text-align:right}
.ti[dir="rtl"] h2{font-family:var(--ar-mono);font-weight:400;letter-spacing:0;line-height:1.3;
  font-size:clamp(26px,5.2vw,66px)}
/* Bilingual title: two independently-directioned runs on one row instead of
   one dir flipping the whole heading (see article-page fix, same pattern). */
.ti.bi h2{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.08em .6em}
.ti.bi h2 .en{flex:0 1 auto;min-width:0;text-align:left}
.ti.bi h2 .ar{flex:0 1 auto;min-width:0;text-align:right;font-family:var(--ar-mono);
  font-weight:400;letter-spacing:0;line-height:1.3}
.ti .meta{display:flex;gap:9px;flex-wrap:wrap;align-items:baseline;margin-top:5px;line-height:1.4;
  color:var(--mute);opacity:1;transition:opacity .28s}
.ti.live .meta{opacity:1}
.ti .meta .n{font-family:"DM Mono",monospace;font-variant-numeric:tabular-nums}
.ti .meta .c{color:var(--c)}
.ti .meta .sl{opacity:.4;margin-right:9px}
.ti .meta .mseg{white-space:nowrap}
.ti + .ti{border-top:1px solid var(--rule)}

/* ── the spine's closing spread ── */
.spinetail{
  position:relative;z-index:10;max-width:1500px;margin:0 auto;
  padding:0 var(--gut) 70px;display:grid;gap:clamp(16px,2.4vw,28px);
  grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
}
.tcard{
  display:flex;gap:18px;padding:20px;border:1px solid var(--rule);background:var(--paper);
  transition:border-color .3s,transform .34s var(--ease),box-shadow .34s var(--ease);
}
.tcard:hover{border-color:var(--ink);transform:translateY(-3px);
  box-shadow:var(--sh-soft)}
.tc-plate{flex:0 0 92px;overflow:hidden;background:var(--rule);align-self:flex-start}
.tc-plate img{width:100%;display:block;transition:transform .6s var(--ease)}
.tcard:hover .tc-plate img{transform:scale(1.05)}
.tc-copy{display:flex;flex-direction:column;gap:7px;min-width:0}
.tc-kick{color:var(--mute)}
.tc-title{font-size:clamp(19px,2.2vw,26px);font-weight:500;letter-spacing:-.02em;line-height:1.1}
.tc-dek{color:var(--soft);font-size:13.5px;line-height:1.5}
.tc-go{color:var(--ink);margin-top:2px;transition:transform .3s var(--ease);display:inline-block}
.tcard:hover .tc-go{transform:translateX(4px)}
.tcard-call{border-style:dashed}

/* ══════════ the view switcher ══════════
   The pressed state used to jump between the two buttons. It is one thumb now,
   and it slides — which is the whole reason the control reads as a switch. */
/* Two icons in an ink pill. The words moved into the accessible name and a
   tooltip, which also teaches the R / S keys. */
.vswitch{
  position:relative;flex:0 0 auto;align-self:center;margin-right:var(--gut);
  display:flex;background:var(--ink);border-radius:999px;padding:3px;gap:2px;
  transition:box-shadow var(--t-base) ease;
}
.vswitch:hover{box-shadow:var(--sh-soft)}
/* The thumb is measured off the pressed button (index.js), and travels with
   the on-screen curve — it is the one thing in the bar that moves. */
.vswitch .thumb{
  position:absolute;top:3px;bottom:3px;left:3px;width:0;
  background:var(--paper);border-radius:999px;
  transform-origin:0 50%;transition:transform .36s var(--ease-io);
}
.vswitch button{
  position:relative;z-index:1;display:grid;place-items:center;
  width:38px;height:28px;border-radius:999px;
  color:var(--on-ink);transition:color var(--t-base) ease;
}
.vswitch svg{display:block;fill:none;stroke:currentColor;stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round;transition:transform var(--t-fast) var(--ease)}
.vswitch button:hover{color:var(--paper)}
.vswitch button[aria-pressed="true"],
.vswitch button[aria-pressed="true"]:hover{color:var(--ink)}
.vswitch button:active svg{transform:scale(.88)}
.vswitch button:focus-visible{outline:2px solid var(--paper);outline-offset:-2px}
/* the tooltip: the view's name and its key, hung under the pill from the
   right edge so it never runs off the page. It waits a beat before showing
   so a click on its way past does not flash it. */
.vswitch button::after{
  content:attr(data-tip) "  \00B7  " attr(data-key);white-space:pre;
  position:absolute;top:calc(100% + 9px);right:-3px;z-index:5;
  padding:6px 9px;border-radius:4px;background:var(--ink);color:var(--paper);
  font:700 11px/1 "Archivo",sans-serif;letter-spacing:.07em;text-transform:uppercase;
  opacity:0;transform:translateY(-3px) scale(.97);transform-origin:100% 0;pointer-events:none;
  transition:opacity var(--t-fast) ease,transform var(--t-fast) var(--ease);
}
@media (hover:hover){
  .vswitch button:hover::after{opacity:1;transform:none;transition-delay:.35s}
}
.vswitch button:focus-visible::after{opacity:1;transform:none}

/* ══════════ mobile: the Spine, and only the Spine ══════════
   The Reading Room is a two-column instrument — a list you sweep with a cursor
   and a stage that answers. Neither half survives a thumb: the list becomes a
   scroll inside a scroll, and the stage is a picture you cannot hover. So the
   Room is not laid out at all here, the switch that offers it is gone, and the
   wrapper stops being a 200% slide because there is nothing to slide to.
   index.js forces data-view="spine" below the same breakpoint. */
@media (max-width:760px){
  .vswitch{display:none}
  .v-room{display:none}
  .views{width:100%;grid-template-columns:1fr;transition:none}
  body[data-view="room"]  .views,
  body[data-view="spine"] .views{transform:none}
  /* No flood on a phone. A fixed full-screen plate under a 5px dot screen,
     swapped on every scroll tick, was both the jank and the reason two-thirds
     of the list could not be read; the lit title, its ink and the rising rows
     carry the Spine here. */
  .bg{display:none}
  .trail{display:none}
  /* the filter stays one row and scrolls sideways — wrapped onto two lines it
     stopped matching --chips, which the Spine's opening height is built from */
  .chips{flex-wrap:nowrap;overflow-x:auto;overscroll-behavior-x:contain;
    scrollbar-width:none;-webkit-overflow-scrolling:touch}
  .chips::-webkit-scrollbar{display:none}
  .chips .chip{flex:0 0 auto}
  /* the row runs past the edge; say so with a fade rather than a cut */
  .chips{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);
    mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);padding-right:36px}
  .stream{padding-right:var(--gut)}
  .issuebar .ib-p{font-size:11px}
}
@media (max-width:640px){
  .ti h2{line-height:1.02}
}
/* ══════════ scroll, as motion ══════════
   Driven by the scroll position itself (scroll-driven animations), so it runs
   on the compositor with no JS and simply does not exist in browsers without
   support or under reduced motion.

   The Spine: a title rises into place as it enters from the foot of the
   screen and settles back as it leaves past the top, so the column reads as
   pages being turned up to the reading line rather than a list sliding by. */
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion:no-preference){
    .ti h2,.ti .meta{
      /* the scrollport is inset by the sticky bar: a title under the bar is
         hidden, not leaving, so the top rows sit at full ink at rest */
      animation:ti-scroll linear both;animation-timeline:view(block calc(var(--mast) + var(--chips)) 0px);
      animation-range:entry 0% exit 100%;
    }
    .ti .meta{animation-name:ti-scroll-meta}
    @keyframes ti-scroll{
      /* a title enters at .4, not .08: the rise is the motion, the fade only
         seasons it — and axe, which sees the page as one tall viewport, no
         longer reads every row below the fold as invisible text */
      0%{opacity:.4;transform:translateY(34px) scale(.965)}
      22%{opacity:1;transform:none}
      80%{opacity:1;transform:none}
      /* .55, not .25: a title leaving past the top is still a title someone
         may be reading, and 26px/500 needs 3:1 against the paper */
      100%{opacity:.55;transform:translateY(-14px)}
    }
    @keyframes ti-scroll-meta{
      0%,12%{opacity:1;transform:translateY(12px)}
      28%{opacity:1;transform:none}
      84%{opacity:1}
      100%{opacity:1}
    }
    /* keep the old view-left transform origin so titles grow from their own
       start edge, RTL ones from the right */
    .ti h2{transform-origin:0 100%}
    .ti[dir="rtl"] h2{transform-origin:100% 100%}
  }
}
@media (prefers-reduced-motion:reduce){
  .views{transition:none}
  .trail{display:none}
  .it,.ti,.stage .fade,.stage .fade .cap > *{animation:none}
  .phead-rule,.stage .pic::after,.issue-layout .plate .wash{animation:none;transform:none}
}

/* shop.css */
/* ══════════════════════════════════════════════════════════════════════════
   shop.css — the store and the print issues.

   Shop was a four-up grid you could get from any starter. It is a window now:
   one product taken as a feature at display size, the rest as lit rows whose
   covers fly under the cursor.

   Issues was the same grid with three cards in it. Three is too few for a
   grid, so each issue gets a room of its own — a full-height band with its
   Roman numeral set as architecture behind the cover.

   Covers are artwork and are never tinted (tests/test_image_colors).
   ══════════════════════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════════════════════
   Shop — the feature and the rows
   ══════════════════════════════════════════════════════════════════════════ */
.shop-status{padding:14px var(--gut);border-bottom:1px solid var(--ink)}
.colophon .shop-status{padding:0;border:0;margin-top:18px}
.collection{scroll-margin-top:var(--mast,63px)}
.xrow.is-out .xt{color:var(--mute)}
@media (hover:hover){
  .xrow.is-out:hover .xn,.xrow.is-out:hover .xt,.xrow.is-out:hover .xs{transform:none;color:var(--mute)}
  .xrow.is-out:hover .thumb img{transform:none}
}
/* under Buy: where the checkout happens and that it ships — said plainly */
.buy-note{margin:10px 0 0;color:var(--mute);font-weight:400;letter-spacing:.04em;text-transform:none;font-size:13px}
.xrow.is-out .thumb img{opacity:.55}

.feature{
  display:grid;gap:clamp(24px,4vw,72px);align-items:center;
  grid-template-columns:minmax(0,1fr);
  padding:var(--pad-band) var(--gut);border-bottom:1px solid var(--ink);
  --c:var(--ess);
}
@media (min-width:860px){
  .feature{grid-template-columns:minmax(280px,.9fr) minmax(0,1.1fr)}
}
.feature .plate{position:relative;overflow:hidden;background:var(--rule);
  border:1px solid var(--rule);transition:border-color var(--t-base) ease}
.feature .plate img{display:block;width:100%;height:auto;
  transition:transform var(--t-slow) var(--ease)}
@media (hover:hover){
  .feature:hover .plate{border-color:var(--ink)}
  .feature:hover .plate img{transform:scale(1.03)}
}
/* a bar of the product's ink drawn across the foot of the cover — the same
   gesture the archive makes under a lit piece */
.feature .plate .wash{
  position:absolute;left:0;right:0;bottom:0;height:6px;background:var(--c);
  transform:scaleX(0);transform-origin:0 50%;transition:transform .6s var(--ease);
}
.feature.in .plate .wash{transform:scaleX(1)}
.feature .copy h2{
  margin:0;font-size:var(--fs-head);font-weight:500;letter-spacing:-.042em;
  line-height:.92;text-wrap:balance;
}
.feature .copy .dek{margin:16px 0 0;color:var(--soft);font-size:clamp(16px,1.7vw,20px);
  line-height:1.5;max-width:44ch;
  display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical;overflow:hidden}
/* buy, and a quiet second way in */
.feature .copy .actions{display:flex;flex-wrap:wrap;align-items:baseline;gap:14px 28px;
  margin-top:clamp(20px,3vw,34px)}
.feature .copy .buy{
  display:inline-flex;align-items:center;gap:12px;
  padding:8px 0;border-bottom:1px solid var(--ink);
  font-size:var(--fs-cta);font-weight:500;letter-spacing:-.022em;
  transition:color var(--t-base) ease,opacity var(--t-base) ease;
}
.feature .copy .buy:hover{color:var(--c)}
.feature .copy .buy .g{display:inline-block;transition:transform var(--t-base) var(--ease)}
.feature .copy .buy:hover .g{transform:translateX(5px)}
.feature .copy .buy:active .g{transform:translateX(8px)}
.feature .copy .buy[aria-busy="true"]{opacity:.45;pointer-events:none}
.feature .copy .buy.is-out{color:var(--mute);border-bottom-style:dashed;cursor:default}
.feature .copy .price{color:var(--mute);margin-left:6px;font-size:.7em}
.feature .copy .more{color:var(--mute)}
.feature .copy .more:hover{color:var(--ink)}

/* a row keeps a small still of the cover so the list still scans on touch,
   where there is no cursor for the flying plate */
.xrow .thumb{
  position:relative;width:38px;height:50px;overflow:hidden;background:var(--rule);
  flex:0 0 auto;
}
.xrow .thumb img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform var(--t-slow) var(--ease),opacity var(--t-base) ease}
@media (hover:hover){.xrow:hover .thumb img{transform:scale(1.09)}}
.shoprow{grid-template-columns:auto auto minmax(0,1fr) auto}
/* on a phone the price drops under the row; spanning it across both tracks
   keeps a wide label ("Sold out") from widening the thumb column and pushing
   that one title out of line with the others */
@media (max-width:700px){
  .shoprow{grid-template-columns:auto auto minmax(0,1fr)}
  .shoprow .xs{grid-column:2 / -1}
}

/* ══════════════════════════════════════════════════════════════════════════
   Issues — one room per issue
   ══════════════════════════════════════════════════════════════════════════ */
.issues-rooms{scroll-snap-type:y proximity}
.iroom{
  position:relative;overflow:hidden;scroll-snap-align:start;
  display:grid;gap:clamp(20px,3.4vw,56px);align-items:center;
  grid-template-columns:minmax(0,1fr);
  padding:var(--pad-band) var(--gut);border-bottom:1px solid var(--ink);
  --c:var(--ess);
}
@media (min-width:860px){
  .iroom{grid-template-columns:minmax(240px,.8fr) minmax(0,1.2fr);
    min-height:min(84svh,860px)}
}
/* The number as architecture, behind everything.

   Roman numerals were the obvious choice and the wrong one: I, II and III set
   in Archivo at 500px are one, two and three hairlines — invisible as a field.
   The Arabic figures have a body, and the magazine is named in Arabic, so the
   room is numbered ١ ٢ ٣ while the heading still reads "Issue III". */
.iroom .num{
  position:absolute;right:calc(-1 * clamp(6px,1.6vw,26px));top:50%;translate:0 -50%;
  margin:0;font-family:var(--ar-only);font-size:clamp(210px,38vw,560px);
  line-height:.72;font-weight:400;color:var(--c);opacity:.11;
  pointer-events:none;user-select:none;
  transition:opacity .6s ease,translate .9s var(--ease);
}
.iroom:hover .num{opacity:.2;translate:0 -53%}
.iroom .plate{position:relative;overflow:hidden;background:var(--rule);
  border:1px solid var(--rule);transition:border-color .35s}
.iroom:hover .plate{border-color:var(--ink)}
.iroom .plate img{display:block;width:100%;height:auto;transition:transform .9s var(--ease)}
.iroom:hover .plate img{transform:scale(1.035)}
.iroom .plate .wash{
  position:absolute;left:0;right:0;bottom:0;height:6px;background:var(--c);
  transform:scaleX(0);transform-origin:0 50%;transition:transform .7s var(--ease);
}
.iroom.in .plate .wash{transform:scaleX(1)}
.iroom .copy{position:relative}
.iroom .copy h2{
  margin:0;font-size:var(--fs-head);font-weight:500;letter-spacing:-.045em;
  line-height:.88;transition:color .35s;
}
.iroom:hover .copy h2{color:var(--c)}
.iroom .copy .theme{
  margin:14px 0 0;font-size:clamp(18px,2.2vw,28px);line-height:1.28;color:var(--ink);
  letter-spacing:-.018em;max-width:24ch;
}
.iroom .copy .dek{margin:12px 0 0;color:var(--soft);line-height:1.55;max-width:52ch;
  display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}
.iroom .facts{
  display:flex;flex-wrap:wrap;gap:8px 22px;margin:clamp(18px,2.6vw,28px) 0 0;
  padding-top:12px;border-top:1px solid var(--rule);color:var(--mute);
}
.iroom .go{
  display:inline-flex;align-items:center;gap:12px;margin-top:clamp(18px,2.6vw,30px);
  padding:8px 0;border-bottom:1px solid var(--ink);
  font-size:var(--fs-cta);font-weight:500;letter-spacing:-.022em;
  transition:color var(--t-base) ease;
}
.iroom .go:hover{color:var(--c)}
.iroom .go .g{display:inline-block;transition:transform var(--t-base) var(--ease)}
.iroom .go:hover .g{transform:translateX(5px)}

/* ══════ one issue — the colophon ══════ */
.ihead{
  position:relative;overflow:hidden;padding:var(--pad-band) var(--gut);
  border-bottom:1px solid var(--ink);--c:var(--ess);
}
.ihead .kick a{color:var(--ink)}
.ihead{padding:clamp(18px,2.6vw,30px) var(--gut)}
.ihead h1{margin:0;font-size:clamp(40px,6.4vw,96px);font-weight:500;letter-spacing:-.045em;
  line-height:.9}
.ihead .theme{margin:18px 0 0;font-size:clamp(19px,2.4vw,32px);line-height:1.24;
  letter-spacing:-.02em;max-width:26ch;color:var(--c)}

.issue-layout{
  display:grid;grid-template-columns:minmax(0,1fr);
  gap:clamp(26px,4vw,64px);align-items:start;
  padding:clamp(26px,4vw,64px) var(--gut);
}
@media (min-width:860px){
  .issue-layout{grid-template-columns:minmax(260px,38%) minmax(0,1fr)}
}
.issue-layout .plate{overflow:hidden;position:sticky;top:calc(var(--mast,63px) + 24px);
  border:1px solid var(--rule)}
.issue-layout .plate img{width:100%;display:block}
.issue-layout .plate .wash{
  position:absolute;left:0;right:0;bottom:0;height:6px;background:var(--c);
  transform:scaleX(0);transform-origin:0 50%;
  animation:drawrule 1s var(--ease) .25s forwards;pointer-events:none;
}
.issue-prose p{margin:0 0 1em;max-width:60ch;line-height:1.6;
  font-size:clamp(16px,1.7vw,19px)}
.issue-prose p:first-child{font-size:clamp(19px,2.2vw,27px);line-height:1.36;
  letter-spacing:-.016em;max-width:30ch;color:var(--ink)}
.issue-prose p:last-child{margin-bottom:0}

.spec{margin:clamp(22px,3.2vw,40px) 0 0;border-top:1px solid var(--ink);font-size:14px}
.spec .row{
  position:relative;display:grid;grid-template-columns:minmax(120px,190px) 1fr;gap:12px;
  padding:11px 0 11px 2px;border-bottom:1px solid var(--rule);
}
.spec .row::before{
  content:"";position:absolute;inset:0;background:var(--c);opacity:var(--flood);
  transform:scaleX(0);transform-origin:0 50%;transition:transform var(--t-move) var(--ease);
}
.spec dt{position:relative;color:var(--mute);transition:transform var(--t-move) var(--ease)}
.spec dd{position:relative;margin:0;transition:transform var(--t-move) var(--ease)}
@media (hover:hover){
  .spec .row:hover::before{transform:scaleX(1)}
  .spec .row:hover dt,.spec .row:hover dd{transform:translateX(var(--nudge))}
}

.contributors{margin-top:clamp(24px,3.4vw,44px)}
.contributors h2{margin:0 0 12px;color:var(--mute);font-weight:700}
.contributors .names{
  list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:0 24px;
}
.contributors .names li{
  padding:9px 0;border-top:1px solid var(--rule);font-size:clamp(15px,1.6vw,19px);
  font-weight:500;letter-spacing:-.012em;
  transition:transform var(--t-base) var(--ease),color var(--t-base) ease;
}
@media (hover:hover){.contributors .names li:hover{transform:translateX(6px);color:var(--c)}}

@media (max-width:860px){
  .issue-layout .plate{position:static;max-width:420px}
  .spec .row{grid-template-columns:1fr}
}
@media (prefers-reduced-motion:reduce){
  .issues-rooms{scroll-snap-type:none}
  .iroom .num{transition:none}
}

/* statics.css */
/* ══════════════════════════════════════════════════════════════════════════
   statics.css — About, Submit and Contact, each given its own room.

   They shared one centred document template and half of a 1440px screen was
   empty paper. Each is now a sequence of full-bleed bands built from the
   atoms in frame.css, with one idea of its own:

     About    the word itself — الكهف set as the page's graphic
     Submit   the open call — a ticker, and three categories at display size
     Contact  the addresses ARE the typography

   The archive is not touched; these borrow its vocabulary, not its layout.
   ══════════════════════════════════════════════════════════════════════════ */

.room{padding:0}
.room .phead{
  position:relative;padding:clamp(34px,6vw,96px) var(--gut) clamp(24px,3.4vw,44px);
  margin:0;border-bottom:1px solid var(--ink);
}
.room .phead .lede{
  margin:clamp(18px,2.6vw,32px) 0 0;font-size:var(--fs-lede);line-height:1.38;
  max-width:44ch;color:var(--soft);
}
.room .phead .lede + .lede{margin-top:.7em}
.room .phead-rule{display:none}
/* the compact head: kicker and title share a line, the lede sits right under,
   and the band is a third of the height — the page's idea is what you land on */
.room .phead.compact{
  display:grid;grid-template-columns:auto 1fr;column-gap:clamp(16px,3vw,40px);align-items:baseline;
  padding:clamp(18px,2.6vw,30px) var(--gut) clamp(18px,2.4vw,28px);
}
.room .phead.compact .kick{grid-column:1 / -1;margin-bottom:10px}
.room .phead.compact h1.disp{font-size:var(--fs-row);letter-spacing:-.03em;line-height:1}
.room .phead.compact .lede{margin:0;font-size:clamp(15px,1.5vw,19px);max-width:52ch;align-self:baseline}
.room .phead.compact .lede + .lede{grid-column:2;margin-top:.5em}
@media (max-width:640px){
  .room .phead.compact{grid-template-columns:1fr}
  .room .phead.compact .lede{margin-top:12px}
  .room .phead.compact .lede + .lede{grid-column:1}
}
/* a band that is only a heading needs no space under its rule */
.band.flush.tight .band-hd{margin-bottom:0}
.section-hd{color:var(--mute);margin:0 0 14px;display:flex;align-items:baseline}
.section-hd b{margin-left:8px;opacity:.5;font-weight:400}

/* The flood-and-step rows below (masthead, categories, addresses) share
   .xrow's timings and its hover gate — see frame.css. */

/* ══════════════════════════════════════════════════════════════════════════
   About — the word as the page's graphic
   ══════════════════════════════════════════════════════════════════════════ */

/* الكهف, set large enough to be architecture rather than an illustration, and
   allowed to run off the right edge the way a cover crops a photograph. */
.aboutword{
  position:relative;overflow:hidden;border-bottom:1px solid var(--ink);
  padding:clamp(18px,3vw,44px) 0 clamp(22px,3.6vw,52px);
}
.aboutword .ar{
  display:block;margin:0;font-family:var(--ar-only);font-weight:400;
  font-size:clamp(110px,26vw,420px);line-height:.9;letter-spacing:0;
  color:var(--ink);opacity:.1;white-space:nowrap;
  padding-left:var(--gut);transform:translateX(0);
}
.aboutword .gloss{
  position:absolute;left:var(--gut);bottom:clamp(20px,3vw,44px);
  display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 16px;color:var(--mute);
}
.aboutword .gloss .say{color:var(--ink);font-style:italic;font-size:16px}

/* the definition entry */
.defn{display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(20px,3vw,40px)}
@media (min-width:900px){
  .defn{grid-template-columns:minmax(0,1.35fr) minmax(240px,.65fr);
    gap:clamp(30px,4.4vw,72px)}
}
.defn .body p{
  margin:0 0 .8em;font-size:var(--fs-lede);line-height:1.34;
  letter-spacing:-.017em;max-width:26ch;
}
.defn .body p:nth-child(n+2){font-size:clamp(15.5px,1.5vw,17.5px);line-height:1.6;
  color:var(--soft);letter-spacing:0;max-width:56ch}
.defn .aside{border-top:1px solid var(--ink);padding-top:12px}
.defn .aside .row{
  display:grid;grid-template-columns:9ch 1fr;gap:12px;padding:9px 0;
  border-bottom:1px solid var(--rule);
}
.defn .aside dt{color:var(--mute)}
.defn .aside dd{margin:0}
.defn .aside dd.ar{font-family:var(--ar-only);font-size:22px;line-height:1}

/* ══════ the masthead, as a table that lights ══════ */
.mh{border-top:1px solid var(--ink)}
.mh-row{
  position:relative;display:grid;align-items:baseline;gap:6px clamp(14px,2.4vw,32px);
  grid-template-columns:auto minmax(0,1fr) auto;
  padding:var(--pad-row) var(--gut);
  border-bottom:1px solid var(--rule);--c:var(--ink);
}
.mh-row::before{
  content:"";position:absolute;inset:0;background:var(--c);opacity:var(--flood);
  transform:scaleX(0);transform-origin:0 50%;transition:transform var(--t-move) var(--ease);
}
.mh-n{position:relative;font-family:"DM Mono",monospace;font-size:11px;color:var(--rule);
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease)}
.mh-name{
  position:relative;margin:0;font-size:var(--fs-row);font-weight:500;
  letter-spacing:-.028em;line-height:1.04;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease);
}
.mh-role{position:relative;color:var(--mute);white-space:nowrap;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease)}
@media (hover:hover){
  .mh-row:hover::before{transform:scaleX(1)}
  .mh-row:hover .mh-n,.mh-row:hover .mh-name,.mh-row:hover .mh-role{
    color:var(--c);transform:translateX(var(--nudge))}
}
@media (max-width:700px){
  .mh-row{grid-template-columns:auto minmax(0,1fr)}
  .mh-role{grid-column:2;white-space:normal}
}

/* ══════ the closing band, shared by all three rooms ══════ */
.closer{
  display:grid;gap:clamp(22px,3.4vw,54px);align-items:center;
  grid-template-columns:minmax(0,1fr);
}
@media (min-width:840px){.closer{grid-template-columns:minmax(0,1fr) auto}}
.closer .say{
  margin:0;font-size:clamp(24px,3.6vw,50px);font-weight:500;letter-spacing:-.03em;
  line-height:1.06;max-width:20ch;text-wrap:balance;
}
.closer .mk{width:clamp(90px,13vw,180px);height:auto;opacity:.9;
  transition:transform var(--t-slow) var(--ease)}
@media (hover:hover){.closer:hover .mk{transform:rotate(-2deg) scale(1.04)}}
.closer .links{display:flex;flex-wrap:wrap;gap:10px 26px;margin-top:18px}
.closer .bigl:hover{color:var(--k)}

/* The big call-to-action line — one component for every "go" on the site
   (closers, buy buttons, the portal's send, the donation's give). The arrow
   steps out on transform; animating the gap reflowed the line every frame. */
.bigl{
  display:inline-flex;align-items:center;gap:12px;padding:8px 0;
  border-bottom:1px solid var(--ink);transition:color var(--t-base) ease,opacity var(--t-base) ease;
  font-size:var(--fs-cta);font-weight:500;letter-spacing:-.024em;line-height:1.15;
}
.bigl.mi{letter-spacing:.05em;font-size:clamp(15px,1.6vw,20px)}
.bigl .bigl-go,.bigl .g{display:inline-block;transition:transform var(--t-base) var(--ease)}
.bigl .price{color:var(--mute);font-size:.7em;letter-spacing:0}
.bigl:hover{color:var(--ess)}
.bigl:hover .bigl-go,.bigl:hover .g{transform:translateX(5px)}
.bigl:active .bigl-go,.bigl:active .g{transform:translateX(8px)}
.bigl[aria-busy="true"]{opacity:.45;pointer-events:none}
.bigl.is-out{color:var(--mute);border-bottom-style:dashed;cursor:default}

/* ══════════════════════════════════════════════════════════════════════════
   Submit — the open call
   ══════════════════════════════════════════════════════════════════════════ */
.callticker{
  border-bottom:1px solid var(--ink);padding:10px 0;color:var(--ess);
  background:color-mix(in srgb,var(--ess) 6%,transparent);
}
/* the run already ends in its own separator — extra padding opened a
   visible hole at the loop seam */
.callticker .tr span{padding-right:0}

.cats{border-top:1px solid var(--ink)}
.cat{
  position:relative;display:grid;align-items:start;gap:10px clamp(18px,3vw,48px);
  grid-template-columns:auto minmax(0,1fr);
  padding:clamp(20px,3vw,40px) var(--gut);border-bottom:1px solid var(--rule);
  --c:var(--ink);
}
@media (min-width:1000px){
  .cat{grid-template-columns:auto minmax(0,.9fr) minmax(0,1.1fr)}
  .cat .cat-body{grid-column:3;grid-row:1}
}
.cat::before{
  content:"";position:absolute;inset:0;background:var(--c);opacity:var(--flood);
  transform:scaleX(0);transform-origin:0 50%;transition:transform var(--t-move) var(--ease);
}
.cat .cat-n{position:relative;font-family:"DM Mono",monospace;font-size:11px;
  color:var(--rule);padding-top:.7em;transition:color var(--t-base) ease,transform var(--t-move) var(--ease)}
.cat h2{
  position:relative;margin:0;font-size:clamp(26px,4.6vw,62px);font-weight:500;
  letter-spacing:-.032em;line-height:.98;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease);
}
@media (hover:hover){
  .cat:hover::before{transform:scaleX(1)}
  .cat:hover .cat-n,.cat:hover h2{color:var(--c);transform:translateX(var(--nudge))}
}
/* Below the three-track breakpoint the prose drops under the heading, in the
   heading's column — auto-placing it into the narrow number track blew the
   row past the viewport. */
.cat .cat-body{position:relative;grid-column:2}
.cat .cat-body p{margin:0 0 .85em;color:var(--soft);line-height:1.6;max-width:56ch}
.cat .cat-body p:last-child{margin-bottom:0}
.submit-note{
  color:var(--mute);margin:0;padding:clamp(14px,2vw,22px) var(--gut);text-transform:none;letter-spacing:.02em;font-weight:500;
  border-bottom:1px solid var(--ink);
}

/* ══════════════════════════════════════════════════════════════════════════
   Contact — the addresses are the typography
   ══════════════════════════════════════════════════════════════════════════ */
.addr{border-top:1px solid var(--ink)}
.addr a{
  position:relative;display:grid;align-items:baseline;gap:4px clamp(16px,2.6vw,36px);
  grid-template-columns:auto minmax(0,1fr) auto;
  padding:var(--pad-row) var(--gut);border-bottom:1px solid var(--rule);
  --c:var(--ink);
}
.addr a::before{
  content:"";position:absolute;inset:0;background:var(--c);opacity:var(--flood);
  transform:scaleX(0);transform-origin:0 50%;transition:transform var(--t-move) var(--ease);
}
.addr .cl-l{position:relative;color:var(--mute);white-space:nowrap;width:12ch;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease)}
.addr .cl-v{
  position:relative;font-size:var(--fs-row);font-weight:500;letter-spacing:-.03em;
  line-height:1.04;word-break:break-word;
  transition:color var(--t-base) ease,transform var(--t-move) var(--ease);
}
.addr .cl-go{position:relative;color:var(--c);opacity:0;transform:translateX(-8px);
  transition:opacity var(--t-base) ease,transform var(--t-move) var(--ease)}
.addr a:focus-visible::before{transform:scaleX(1)}
@media (hover:hover){
  .addr a:hover::before{transform:scaleX(1)}
  .addr a:hover .cl-l,.addr a:hover .cl-v{color:var(--c);transform:translateX(var(--nudge))}
  .addr a:hover .cl-go{opacity:1;transform:translateX(var(--nudge))}
}
@media (max-width:700px){
  .addr a{grid-template-columns:minmax(0,1fr)}
  .addr .cl-go{display:none}
}

.friend{scroll-margin-top:var(--mast,63px)}
.friend .cave{max-width:46ch;color:var(--soft);margin:0 0 .7em;
  font-size:var(--fs-lede);line-height:1.38;letter-spacing:-.012em}
.friend .cave:last-child{margin-bottom:0}
.friend-grid{display:grid;gap:clamp(28px,4vw,64px);grid-template-columns:minmax(0,1fr)}
@media (min-width:980px){
  .friend-grid{grid-template-columns:minmax(0,1.15fr) minmax(320px,.85fr);align-items:start}
}

/* ══════════════════════════════════════════════════════════════════════════
   Forms — the portal and the donation, in the site's own grammar: a label in
   the mono-caps voice, a field that is a hairline until you use it, choices
   as bordered chips that fill with ink, and the .bigl line as the button.
   ══════════════════════════════════════════════════════════════════════════ */
.pform fieldset,.dform fieldset{margin:0;padding:0;border:0;min-width:0}
.pform legend,.dform legend{padding:0;margin:0 0 10px;color:var(--mute)}
.pform button.bigl,.dform button.bigl{justify-self:start;align-self:flex-start;cursor:pointer}

/* chips: a category, an amount */
.pchips,.amts{display:flex;flex-wrap:wrap;gap:8px}
.pchip,.amt{position:relative;cursor:pointer}
.pchip input,.amt input[type="radio"],.seg input{position:absolute;opacity:0;width:1px;height:1px;margin:0}
.pchip span,.amt > span,.amt-other{
  display:inline-flex;align-items:center;height:44px;padding:0 16px;
  border:1px solid var(--rule);font-size:14px;color:var(--ink);
  transition:border-color var(--t-base) ease,background-color var(--t-base) ease,
    color var(--t-base) ease,transform var(--t-fast) var(--ease);
}
.amt-other > span{height:auto;padding:0;border:0;color:var(--mute)}
@media (hover:hover){.pchip:hover span,.amt:hover > span,.amt-other:hover{border-color:var(--ink)}}
.pchip input:checked + span,.amt input:checked + span{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.pchip input:focus-visible + span,.amt input:focus-visible + span{outline:2px solid var(--ink);outline-offset:2px}
.pchip:active span,.amt:active > span{transform:scale(.97)}
.amt-other{gap:4px;padding:0 12px;cursor:text}
.amt-other:focus-within{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.amt-other input{width:6ch;border:0;background:none;padding:0;font:inherit;font-size:16px;font-family:"DM Mono",monospace;
  color:var(--ink);-moz-appearance:textfield}
.amt-other input:focus{outline:none}
.amt-other input::-webkit-inner-spin-button,.amt-other input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}

.pstatus,.dstatus,.shop-status{margin:0;font-weight:500;letter-spacing:.02em;text-transform:none;
  font-size:14px;color:var(--int);line-height:1.45}
.pstatus.is-error,.dstatus.is-error,.shop-status.is-error{color:var(--ess)}
.pstatus:empty,.dstatus:empty{display:none}

/* ── the portal ── */
.portal{display:grid;gap:clamp(26px,4vw,64px);grid-template-columns:minmax(0,1fr);
  scroll-margin-top:var(--mast,63px)}
@media (min-width:980px){.portal{grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr)}}
.portal-say{margin:0;font-size:var(--fs-lede);line-height:1.38;letter-spacing:-.012em;
  max-width:24ch;color:var(--soft)}
.portal-alt{margin:18px 0 0;color:var(--mute)}
.portal-alt a{color:var(--ink);text-transform:none;letter-spacing:0;font-weight:500;font-size:14px}

.pform{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;
  gap:clamp(20px,2.6vw,30px) clamp(16px,2.4vw,32px)}
.pform .f-wide{grid-column:1/-1}
@media (max-width:640px){.pform{grid-template-columns:minmax(0,1fr)}}
.f{display:flex;flex-direction:column;gap:8px;min-width:0}
.f > label.mi{color:var(--mute);transition:color var(--t-base) ease}
.f:focus-within > label.mi{color:var(--ink)}
.pform input:not([type="radio"]):not([type="checkbox"]):not([type="file"]),.pform textarea{
  width:100%;font:inherit;font-size:17px;color:var(--ink);background:transparent;border-radius:0;
  border:0;border-bottom:1px solid var(--rule);padding:8px 0 9px;
  transition:border-color var(--t-base) ease,box-shadow var(--t-base) ease;
}
.pform textarea{border:1px solid var(--rule);padding:12px 14px;min-height:10em;line-height:1.5;resize:vertical}
@media (hover:hover){.pform input:hover,.pform textarea:hover{border-color:var(--mute)}}
.pform input:focus,.pform textarea:focus{outline:none;border-color:var(--ink);box-shadow:0 1px 0 var(--ink)}
.pform textarea:focus{box-shadow:inset 0 0 0 1px var(--ink)}
.pform [aria-invalid="true"]{border-color:var(--ess)!important;box-shadow:0 1px 0 var(--ess)}
.pform textarea[aria-invalid="true"]{box-shadow:inset 0 0 0 1px var(--ess)}
.phint{display:flex;justify-content:space-between;gap:12px;margin:0;color:var(--mute);
  font-weight:400;letter-spacing:.04em}

.drop{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:6px;
  padding:clamp(18px,2.4vw,26px) 20px;border:1px solid var(--rule);cursor:pointer;
  transition:border-color var(--t-base) ease,background-color var(--t-base) ease}
.drop input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.drop-t{font-size:18px;font-weight:500;letter-spacing:-.012em;word-break:break-word}
.drop-s{color:var(--mute)}
.drop:hover,.drop.over{border-color:var(--ink);background:color-mix(in srgb,var(--ink) 4%,transparent)}
.drop:focus-within{border-color:var(--ink);outline:2px solid var(--ink);outline-offset:2px}
.drop.has{border-style:solid;border-color:var(--int)}
.drop.has .drop-t{color:var(--int)}

.check{display:flex;gap:12px;align-items:flex-start;cursor:pointer;color:var(--soft);font-size:15px;line-height:1.4}
.check input{accent-color:var(--ink);width:18px;height:18px;margin:1px 0 0;flex:0 0 auto}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.pfoot{display:flex;flex-wrap:wrap;align-items:center;gap:12px 26px;margin-top:4px}

/* ── the donation ── */
.dform{display:flex;flex-direction:column;gap:22px;border-top:1px solid var(--ink);padding-top:20px}
/* once or monthly: the view switch's ink pill, so a two-way choice looks the
   same wherever the site offers one */
.seg{display:inline-flex;align-self:flex-start;gap:2px;background:var(--ink);border-radius:999px;padding:3px}
.seg label{position:relative;cursor:pointer}
.seg span{display:flex;align-items:center;min-height:44px;padding:0 18px;border-radius:999px;color:var(--on-ink);
  font-size:12px;letter-spacing:.075em;text-transform:uppercase;font-weight:700;line-height:1.3;
  transition:color var(--t-base) ease,background-color var(--t-base) ease}
.seg label:hover span{color:var(--paper)}
.seg input:checked + span{background:var(--paper);color:var(--ink)}
.seg input:focus-visible + span{outline:2px solid var(--paper);outline-offset:-5px}
.dnote{margin:-8px 0 0;color:var(--mute);font-weight:400;letter-spacing:.02em;text-transform:none;font-size:13px}

/* the per-field error line: the section ink for essays is the site's red */
.ferr{display:block;margin-top:6px;color:var(--ess);font-weight:400;letter-spacing:.04em;text-transform:none}
.pform [aria-invalid="true"]{border-color:var(--ess)}
.pform .pchips:has(input[aria-invalid="true"]) .pchip span{border-color:var(--ess)}

/* updates.css */
/* September client additions, using the existing magazine typography and rules. */
.membership{display:grid;grid-template-columns:1fr 1.2fr;gap:40px;padding:var(--pad-band) var(--gut);border-top:1px solid var(--ink)}
.membership h2{font-size:var(--fs-row);font-weight:500;letter-spacing:-.03em;margin:0 0 18px}
.membership-price{font-size:clamp(44px,6vw,80px);letter-spacing:-.04em;margin:0}
.membership-price span{letter-spacing:0;color:var(--mute)}
.membership-copy{max-width:65ch;font-size:18px;line-height:1.6}
.membership-copy p:first-child{margin-top:0}
.membership-copy .membership-terms{font-size:14px;color:var(--soft);line-height:1.5;margin-top:24px}
.membership-management{padding:0 var(--gut);margin:28px 0}
.membership-copy .bigl{margin-top:24px;justify-content:space-between}
.membership-invitation{font-size:var(--fs-lede);max-width:42ch;padding:0 var(--gut);margin:20px 0 60px}
.enter .lede{max-width:65ch}
.search-form{padding:0 var(--gut);max-width:900px}
.search-form label{display:block;margin-bottom:14px}
.search-form>div{display:flex;border-bottom:1px solid var(--ink)}
.search-form input{min-width:0;flex:1;padding:16px 0;font-size:clamp(18px,3vw,28px);border:0;background:none;color:var(--ink)}
.search-form button{padding:12px 18px;background:var(--ink);color:var(--paper)}
.search-status{padding:20px var(--gut);color:var(--mute)}
.search-results{list-style:none;padding:0 var(--gut) var(--pad-band);margin:0;max-width:1100px}
.search-results li{padding:22px 0;border-top:1px solid var(--rule)}
.search-results a{display:inline-block;font-size:var(--fs-lede);line-height:1.25}
.search-results a:hover{text-decoration:underline}
.search-results p{color:var(--mute);margin:8px 0 0}
.discovery{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(280px,1fr);border-bottom:1px solid var(--ink)}
.latest{padding:18px var(--gut);min-width:0}
.latest h2{margin:0 0 10px;color:var(--mute)}
.latest>div{display:grid;gap:7px}
.latest a{display:flex;gap:12px;align-items:baseline;font-size:14px;line-height:1.35}
.latest a .mono{flex:0 0 3ch;font-size:11px;color:var(--mute)}
.latest a:hover>span:last-child{text-decoration:underline}
.gallery-window{display:flex;align-items:center;gap:8px;padding:18px;border-left:1px solid var(--rule);min-width:0}
.gallery-link{display:flex;gap:16px;align-items:center;flex:1;min-width:0}
.gallery-link>img{width:100px;height:100px;object-fit:cover;flex-shrink:0}
.gallery-link>span{display:grid;gap:7px;min-width:0}
.gallery-link .mi{color:var(--mute)}
#gallery-title{font-size:18px;line-height:1.2}
#gallery-artist{font-size:12px;color:var(--mute)}
#gallery-next{flex:0 0 44px;min-height:44px;border:1px solid var(--rule)}
#gallery-next:hover{background:var(--ink);color:var(--paper)}
.archive-empty{padding:30px var(--gut);line-height:1.6;color:var(--mute)}
.offline-archive{padding:28px var(--gut);max-width:1000px}
.offline-archive li{padding:12px 0;border-bottom:1px solid var(--rule);line-height:1.5}
/* A scrollable filter row always has the same height used by the room. */
.chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chips .chip{flex-shrink:0;min-height:var(--chips)}
.it{direction:ltr;align-items:start}
.it .n{flex:0 0 3ch;text-align:right;line-height:1.72}
.it .t[dir="rtl"]{text-align:right;font-family:var(--ar-mono);line-height:1.42}
.it[data-c="Criticism"],.ti[data-c="Criticism"]{--c:var(--crit)}
/* The image takes the remaining space after the caption, without shrinking the caption. */
.stage .plate{padding:20px 26px;overflow:auto;justify-content:flex-start}
.stage .plate .fade{height:100%;min-height:0;max-width:620px;display:flex;gap:16px}
.stage .pic{width:100%;flex:1 1 0;min-height:70px;align-items:center}
.stage .pic img{width:100%;height:100%;max-height:100%;object-fit:contain}
.stage .cap{flex:0 0 auto;padding:0;width:100%}
.stage .cap .ex{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.stagetop,.stagefoot{flex-shrink:0}
.aplate img{height:clamp(48px,8vw,110px);transform:none}
.aplate.in img{transform:none}
@media(max-width:760px){
  .membership{grid-template-columns:1fr;gap:24px}
  .membership-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;flex-wrap:wrap}
  .membership h2{margin:0}
  .membership-price{font-size:40px}
  .discovery{grid-template-columns:1fr}
  .gallery-window{border-left:0;border-top:1px solid var(--rule);padding:12px var(--gut)}
  .gallery-link>img{width:64px;height:64px}
  .gallery-link>span{gap:4px}
  #gallery-title{font-size:16px}
  .aplate img{height:56px}
}
/* Keep entries readable while loading and prevent independent title/metadata
   motion from crossing neighbouring rows on small screens. */
.it,.stage .fade,.stage .fade .cap>*{animation:none;opacity:1}
.v-room{height:calc(100svh - var(--mast) - var(--chips) - var(--discovery,137px));min-height:440px}
@media(max-width:760px){
  .ti{padding:18px 0}
  .ti h2,.ti .meta{animation:none;transform:none;opacity:1}
  .ti .meta{direction:ltr;text-align:left;margin-top:12px}
  .ti .meta .n:first-child{min-width:3ch}
}
