/* ==========================================================================
   NEGUSTOLONOW — ARCHIVE 001 — THE LAST HUMAN UNIFORM
   site/css/negusto.css — the shared design system. Every page loads this first.
   Museum catalogue x obscure European fashion house x internet subculture x beautiful mistake.

   Law, stated once:
   - Tide colours and one interior colour. Nothing else. No neon, no glow, no gradient used as ornament,
     no glass, no rounded card, no shadow that implies elevation. border-radius is 0 except the door-lamp.
   - Typography is aggressive; everything else holds still. One display face, set too large, hard against an edge.
   - Negative space is a material. Default to more.
   Fonts (Google): Sofia Sans Extra Condensed (stands in for Mole Grotesque), Spectral (the Keepers' text),
   Courier Prime (accession numbers, the machine's typed hand). All three have system fallbacks; the site
   must survive offline over file://.

   Contents: 1 tokens · 2 reset/base · 3 type · 4 layout · 5 shell · 6 plate/caption · 7 labels, stamps, status ·
   8 spec, index, timeline, vocab · 9 ledger thread, lineage · 10 marginalia, hands · 11 slip, acquisition, buttons ·
   12 notice, intertitle, film beats · 13 furniture (km rule, lamp, ruled-empty) · 13b the surface and the fold ·
   13c the word, the card, the pocket · 13d the step · 14 utilities · 15 the colours · 16 motion · 17 print
   ========================================================================== */

/* 1. TOKENS ---------------------------------------------------------------- */
:root {
  /* colour law, Interior Colour Ordinance YR 14 */
  --salt: #E9E5DA;
  --slack: #B8B2A3;
  --mole: #7C7B76;
  --former: #4A4F52;
  --lampblack: #1B1B1A;
  --iodine: #9A4B1C;
  /* stock: not colours, papers */
  --buff: #D5C29A;
  --tissue: #DDD3BD;
  --board: #C9C3B4;
  --salt-deep: #DFDACD;
  --mimeo: #6A6080;
  --iodine-deep: #7E3C14;
  /* the four registered by the plan, and the only values added since the ordinance:
     iodine lit (the same ink on lampblack, where iodine does not carry: the accent
     inside the colours), gentian (Mercy Room's one colour, rationed as iodine is),
     and the aubergine of what is printed on the cloth, with its darker ink. */
  --iodine-lit: #E2A46F;
  --gentian: #3E2A66;
  --aubergine: #513848;
  --aubergine-ink: #41212F;

  /* roles. Rooms re-assign these; primitives only ever read roles. */
  --paper: var(--salt);
  --paper-2: var(--salt-deep);
  --ink: var(--lampblack);
  --ink-soft: #4A4945;
  --ink-faint: #605F5A;   /* faint, but still 4.5:1 on salt and salt-deep: it carries field labels at micro size */
  --accent: var(--iodine);
  --hair: rgba(27, 27, 26, 0.26);
  --line: rgba(27, 27, 26, 0.9);
  --grain: none;

  --f-display: "Sofia Sans Extra Condensed", "Haettenschweiler", "Impact", "Arial Narrow", "Helvetica Neue", sans-serif;
  --f-serif: "Spectral", "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
  --f-mono: "Courier Prime", "Courier New", Courier, ui-monospace, monospace;

  /* type scale. The top three are meant to be too large.
     THE TYPE RULE (comment only; no value here changed). Display scale carries a
     NAME or a NUMBER out of the world: a world's title, a person, a kilometre, a
     year, an accession number, a class, or a line a real poster in Ossel carried.
     It never carries a slogan, a claim about the house, or an abstract noun.
     Test any large line by reading it at body size; if it only works large, it was
     decoration. Pages enforce this in their own files (house.css states it in full). */
  --t-mega: clamp(5rem, 23vw, 24rem);
  --t-giant: clamp(3.6rem, 13vw, 13rem);
  --t-huge: clamp(2.8rem, 8vw, 7.5rem);
  --t-large: clamp(2rem, 4.4vw, 3.8rem);
  --t-title: clamp(1.45rem, 2.3vw, 2.1rem);
  --t-lede: clamp(1.2rem, 1.65vw, 1.55rem);
  --t-body: 1.0625rem;
  --t-small: 0.875rem;
  --t-micro: 0.72rem;

  --s-1: 0.25rem; --s-2: 0.5rem; --s-3: 0.75rem; --s-4: 1rem; --s-5: 1.5rem; --s-6: 2.5rem; --s-7: 4rem; --s-8: 6.5rem;
  --s-9: clamp(7rem, 15vw, 13rem);
  --s-10: clamp(10rem, 30vw, 26rem);

  --gutter: clamp(1rem, 3.4vw, 3.25rem);
  --wrap: 100rem;
  --measure: 33rem;
  --rule-hair: 1px;
  --rule: 2px;
  --rule-heavy: 7px;
  --header-h: 3.25rem;
  --ease: cubic-bezier(0.2, 0.7, 0.1, 1);
}

/* 2. RESET / BASE ---------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: calc(var(--header-h) + 1rem); }
body {
  margin: 0; min-height: 100vh; overflow-x: hidden;
  background: var(--paper); color: var(--ink);
  font-family: var(--f-serif); font-size: var(--t-body); font-weight: 400; line-height: 1.55;
  font-feature-settings: "kern", "liga", "onum"; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased;
}
/* the page is paper: a generated grain tile, set by NegustoArt.pageGrain(). Absent without JS; nothing depends on it. */
body::after { content: ""; position: fixed; inset: 0; z-index: 900; pointer-events: none; background-image: var(--grain); background-size: 220px 220px; mix-blend-mode: multiply; opacity: 0.32; }
img, svg, canvas, video { display: block; max-width: 100%; }
canvas { image-rendering: auto; }
h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd, ol, ul { margin: 0; padding: 0; }
ol, ul { list-style: none; }
table { border-collapse: collapse; width: 100%; }
button, input, select, textarea { font: inherit; color: inherit; border-radius: 0; }
a { color: inherit; text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em; text-decoration-color: var(--ink-faint); transition: text-decoration-color 0.2s, color 0.2s; }
a:hover { text-decoration-color: var(--accent); color: var(--accent); }
hr { border: 0; border-top: var(--rule-hair) solid var(--line); margin: var(--s-6) 0; }
hr.heavy { border-top-width: var(--rule-heavy); }
::selection { background: var(--iodine); color: var(--salt); }
em { font-style: italic; }
strong { font-weight: 500; }
code { font-family: var(--f-mono); font-size: 0.92em; letter-spacing: -0.01em; }
[hidden] { display: none !important; }

/* focus: a ruled box in iodine. Never removed. */
:focus:not(:focus-visible) { outline: none; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.room--lampblack :focus-visible, .room--former :focus-visible { outline-color: var(--buff); }
.skip-link { position: absolute; left: var(--gutter); top: -6rem; z-index: 1000; background: var(--ink); color: var(--paper); padding: var(--s-3) var(--s-4); font-family: var(--f-mono); font-size: var(--t-small); text-decoration: none; }
.skip-link:focus { top: var(--s-3); color: var(--paper); }

/* 3. TYPE ------------------------------------------------------------------ */
/* display: Mole Grotesque. Condensed capitals, too large. */
/* set by js/shell.js while the display face is absent: the one-weight fallbacks are not given a synthetic bold */
html.no-webfont { font-synthesis-weight: none; }
.display, .mega, .giant, .huge, .headline {
  font-family: var(--f-display); font-weight: 800; text-transform: uppercase; line-height: 0.82; letter-spacing: -0.012em;
  font-feature-settings: "kern", "lnum"; margin: 0; text-wrap: balance; overflow-wrap: anywhere;
}
.mega { font-size: var(--t-mega); line-height: 0.78; letter-spacing: -0.02em; }
.giant { font-size: var(--t-giant); line-height: 0.8; }
.huge { font-size: var(--t-huge); }
.headline { font-size: var(--t-large); line-height: 0.9; }
.display--light { font-weight: 400; }
.display--iodine { color: var(--accent); }
/* hard against the top edge: pulls the cap-height to the container's top. Use on the first child of a .room--flush-top. */
.to-top-edge { margin-top: -0.04em; }
/* Under the sticky header the pull had nothing to pull against: the band painted
   over the cap tops (OBJECTS, PROCESS, at both widths). In the first room of a
   page the heading gives up the pull and keeps its glyph overflow clear of the
   band; the band itself is held to exactly var(--header-h) (§5), the offset the
   root already reserves in scroll-padding-top, so nothing sits under it. */
main > .room:first-child .to-top-edge { margin-top: 0; padding-top: 0.08em; }
/* bleeds off the right edge and is cut by it. The parent must be .clip. */
.bleed-right { white-space: nowrap; overflow-wrap: normal; text-wrap: nowrap; }
.clip { overflow: hidden; }

.title { font-family: var(--f-display); font-weight: 700; font-size: var(--t-title); line-height: 1; text-transform: uppercase; letter-spacing: 0.005em; }
.lede { font-family: var(--f-serif); font-weight: 300; font-size: var(--t-lede); line-height: 1.38; max-width: 36rem; }
.prose { max-width: var(--measure); }
.prose > * + * { margin-top: 1em; }
.prose p { hyphens: auto; }
.prose--wide { max-width: 44rem; }
.small { font-size: var(--t-small); line-height: 1.5; }
.micro { font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; line-height: 1.35; }
.caps { font-family: var(--f-display); font-weight: 700; text-transform: uppercase; letter-spacing: 0.09em; font-size: 0.95rem; line-height: 1.2; }
.mono, .typed { font-family: var(--f-mono); font-size: 0.9375rem; line-height: 1.5; letter-spacing: -0.005em; font-feature-settings: normal; }
.typed--small { font-size: var(--t-small); }
.soft { color: var(--ink-soft); }
.faint { color: var(--ink-faint); }
.iodine { color: var(--accent); }
.num { font-family: var(--f-display); font-weight: 800; font-feature-settings: "lnum", "tnum"; }
.yr { font-family: var(--f-mono); white-space: nowrap; }
.nowrap { white-space: nowrap; }

/* 4. LAYOUT ---------------------------------------------------------------- */
.wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: var(--gutter); }
.wrap--narrow { max-width: 62rem; }
.wrap--text { max-width: 46rem; }
.wrap--flush { padding-inline: 0; max-width: none; }

/* a room: one full-bleed section of the world. Rooms re-assign the role tokens. */
.room { position: relative; width: 100%; padding-block: var(--s-9); background: var(--paper); color: var(--ink); }
.room--tight { padding-block: var(--s-7); }
.room--tall { min-height: 100vh; min-height: 100svh; }
.room--flush-top { padding-top: 0; }
.room--flush-bottom { padding-bottom: 0; }
.room--ruled { border-top: var(--rule-hair) solid var(--line); }
.room--heavy { border-top: var(--rule-heavy) solid var(--line); }
.room--salt { --paper: var(--salt); --paper-2: var(--salt-deep); }
.room--deep { --paper: var(--salt-deep); --paper-2: #D5CFC1; }
.room--slack { --paper: var(--slack); --paper-2: #ADA798; --ink-soft: #3A3936; --ink-faint: #464440; --hair: rgba(27, 27, 26, 0.34); }
.room--buff { --paper: var(--buff); --paper-2: #CBB78C; --ink-soft: #40392A; --ink-faint: #564E3A; --hair: rgba(40, 30, 10, 0.34); }
.room--mole { --paper: var(--mole); --paper-2: #71706B; --ink: #141413; --ink-soft: #242422; --ink-faint: #3A3A37; --hair: rgba(20, 20, 19, 0.4); --accent: #5E2C0E; }
.room--former { --paper: var(--former); --paper-2: #42474A; --ink: var(--salt); --ink-soft: #CFCBC0; --ink-faint: #C2C1B8; --hair: rgba(233, 229, 218, 0.28); --line: rgba(233, 229, 218, 0.9); --accent: #D08A5A; }
.room--lampblack { --paper: var(--lampblack); --paper-2: #262625; --ink: var(--salt); --ink-soft: #C9C5BA; --ink-faint: #918F88; --hair: rgba(233, 229, 218, 0.24); --line: rgba(233, 229, 218, 0.9); --accent: #C97A45; }
/* the one room with colour: where someone sits */
.room--iodine { --paper: var(--iodine); --paper-2: var(--iodine-deep); --ink: var(--salt); --ink-soft: #F0DCCB; --ink-faint: #EFDAC8; --hair: rgba(233, 229, 218, 0.35); --line: rgba(233, 229, 218, 0.92); --accent: var(--salt); }
/* the room where the grey breaks: lampblack, the accent iodine lit, made to hold .colours (§15) */
.room--colours { --paper: var(--lampblack); --paper-2: color-mix(in srgb, var(--lampblack) 92%, var(--salt)); --ink: var(--salt); --ink-soft: color-mix(in srgb, var(--salt) 84%, var(--lampblack)); --ink-faint: color-mix(in srgb, var(--salt) 58%, var(--lampblack)); --hair: rgba(233, 229, 218, 0.24); --line: rgba(233, 229, 218, 0.9); --accent: var(--iodine-lit); position: relative; isolation: isolate; overflow: clip; }
.room__head { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: var(--s-4) var(--s-6); padding-bottom: var(--s-4); margin-bottom: var(--s-7); border-bottom: var(--rule) solid var(--line); }
.room__no { font-family: var(--f-mono); font-size: var(--t-small); color: var(--ink-soft); white-space: nowrap; }
/* at phone width the number goes under the heading and may wrap; beside it, a long number squeezed the heading to one letter per line */
@media (max-width: 47.99rem) { .room__head { grid-template-columns: minmax(0, 1fr); } .room__head > * { min-width: 0; overflow-wrap: break-word; } .room__no { white-space: normal; } }

/* deliberate emptiness. Specify it as you would specify cloth. */
.void { display: block; height: var(--s-9); }
.void--s { height: var(--s-7); }
.void--l { height: var(--s-10); }
.void--xl { height: 70vh; }

/* the catalogue grid: twelve columns; children place themselves. Below 48rem everything is one column. */
.cat-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); column-gap: var(--gutter); row-gap: var(--s-8); align-items: start; }
.cat-grid--tight { row-gap: var(--s-6); }
.cat-grid--end { align-items: end; }
.cat-grid > * { grid-column: 1 / -1; min-width: 0; }
@media (min-width: 48rem) {
  .span-2 { grid-column-end: span 2; } .span-3 { grid-column-end: span 3; } .span-4 { grid-column-end: span 4; } .span-5 { grid-column-end: span 5; }
  .span-6 { grid-column-end: span 6; } .span-7 { grid-column-end: span 7; } .span-8 { grid-column-end: span 8; } .span-9 { grid-column-end: span 9; }
  .span-10 { grid-column-end: span 10; } .span-12 { grid-column: 1 / -1; }
  .start-2 { grid-column-start: 2; } .start-3 { grid-column-start: 3; } .start-4 { grid-column-start: 4; } .start-5 { grid-column-start: 5; }
  .start-6 { grid-column-start: 6; } .start-7 { grid-column-start: 7; } .start-8 { grid-column-start: 8; } .start-9 { grid-column-start: 9; } .start-10 { grid-column-start: 10; }
  .drop-1 { margin-top: var(--s-7); } .drop-2 { margin-top: var(--s-9); } .drop-3 { margin-top: var(--s-10); }
}
@media (min-width: 30rem) and (max-width: 47.99rem) { .cat-grid--pairs > * { grid-column: span 6; } }

/* two unequal columns: text and plate. */
.split { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-6) var(--gutter); align-items: start; }
@media (min-width: 56rem) {
  .split { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
  .split--even { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .split--wide-left { grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); }
  .split--narrow-left { grid-template-columns: minmax(0, 3fr) minmax(0, 9fr); }
  .split--reverse > :first-child { order: 2; }
  .split__sticky { position: sticky; top: calc(var(--header-h) + var(--s-5)); }
}
.stack > * + * { margin-top: var(--gap, var(--s-5)); }
.stack--s { --gap: var(--s-3); } .stack--l { --gap: var(--s-7); } .stack--xl { --gap: var(--s-9); }
.cluster { display: flex; flex-wrap: wrap; gap: var(--s-3) var(--s-5); align-items: baseline; }
.between { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: var(--s-3) var(--s-5); }
/* a strip that is longer than the page: scrolls inside itself, never the page. */
.strip { overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; scrollbar-width: thin; scrollbar-color: var(--ink) transparent; padding-bottom: var(--s-3); }
.strip > * { min-width: max(100%, var(--strip-w, 220rem)); }
.strip:focus-visible { outline-offset: -2px; }

/* 5. SHELL: header, nav, footer (injected by js/shell.js) ---------------- */
/* The band is exactly var(--header-h) tall, the offset the root reserves in
   scroll-padding-top; the rule at its foot is at its foot and never above it. */
[data-shell="header"] { position: sticky; top: 0; z-index: 800; min-height: var(--header-h); background: var(--salt); }
.shell-header { background: var(--salt); color: var(--lampblack); border-bottom: var(--rule-hair) solid rgba(27, 27, 26, 0.9); min-height: var(--header-h); }
/* The first row is a grid of three: the mark, where you are, and the word Pocket
   at the far right, in the fixed part of the header and never inside the nav.
   The nav sits between them on a wide screen and is the row below at 52rem.
   Pocket is set the same whether the pocket is empty or full: nothing here is a mark. */
.shell-header__inner { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; grid-template-areas: "mark where nav pocket"; align-items: center; column-gap: var(--s-5); row-gap: 0; min-height: var(--header-h); padding-inline: var(--gutter); }
.shell-mark { grid-area: mark; font-family: var(--f-display); font-weight: 800; font-size: 1.5rem; line-height: 1; letter-spacing: 0.01em; text-transform: uppercase; text-decoration: none; white-space: nowrap; }
.shell-mark span { font-weight: 400; color: var(--mole); padding-inline: 0.12em; }
.shell-mark:hover { color: var(--lampblack); }
/* Which world you are in, then where in it. The world half never truncates on a
   wide screen: it is the one thing the header must always be able to answer. */
.shell-where { grid-area: where; display: flex; align-items: baseline; gap: 0.7em; min-width: 0; overflow: hidden; margin: 0; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.02em; color: #4A4945; white-space: nowrap; text-transform: uppercase; }
.shell-where__world { flex: 0 0 auto; color: var(--lampblack); }
.shell-where__line { min-width: 0; overflow: hidden; text-overflow: ellipsis; color: #6B6A65; }
.shell-where__line:not(:empty)::before { content: "— "; }
/* The world label opens the worlds. The strip hangs from the sticky header (its
   containing block), so .shell-where's overflow never clips it. */
.shell-worlds { flex: 0 0 auto; min-width: 0; }
.shell-worlds > summary { display: inline-flex; align-items: baseline; gap: 0.45em; list-style: none; cursor: pointer; border-bottom: var(--rule-hair) solid rgba(27, 27, 26, 0.26); padding-bottom: 0.18em; }
.shell-worlds > summary::-webkit-details-marker { display: none; }
.shell-worlds > summary:hover, .shell-worlds > summary:focus-visible, .shell-worlds[open] > summary { color: var(--iodine); border-bottom-color: var(--iodine); }
.shell-worlds__caret { width: 0.42em; height: 0.42em; border-right: 1px solid currentColor; border-bottom: 1px solid currentColor; transform: translateY(-0.18em) rotate(45deg); flex: 0 0 auto; }
.shell-worlds[open] .shell-worlds__caret { transform: translateY(0.05em) rotate(-135deg); }
.shell-worlds__panel { position: absolute; left: 0; right: 0; top: 100%; background: var(--salt); border-bottom: var(--rule-hair) solid rgba(27, 27, 26, 0.9); padding: var(--s-4) var(--gutter) var(--s-5); white-space: normal; text-transform: none; letter-spacing: 0; }
.shell-worlds__panel ul { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-5); max-width: var(--wrap); margin: 0 auto; padding: 0; list-style: none; }
.shell-worlds__panel a { display: grid; gap: 0.3rem; padding-top: var(--s-3); border-top: 2px solid transparent; text-decoration: none; color: var(--lampblack); }
.shell-worlds__panel a:hover, .shell-worlds__panel a:focus-visible { border-top-color: var(--lampblack); }
.shell-worlds__panel a[aria-current] { border-top-color: var(--iodine); }
.shell-worlds__panel i { font-family: var(--f-mono); font-style: normal; font-size: 0.68rem; color: #605F5A; }
.shell-worlds__panel a[aria-current] i { color: var(--iodine); }
.shell-worlds__panel b { font-family: var(--f-display); font-weight: 700; font-size: 1.25rem; letter-spacing: 0.06em; text-transform: uppercase; line-height: 1; }
.shell-worlds__panel span { font-family: var(--f-serif); font-size: var(--t-small); color: #4A4945; line-height: 1.35; }
/* the pocket: one mono word, ruled, at the edge. It has no state and no count. */
.shell-pocket { grid-area: pocket; margin: 0; padding: 0.3rem 0 0.3rem var(--s-5); border-left: var(--rule-hair) solid rgba(27, 27, 26, 0.26); font-family: var(--f-mono); font-size: var(--t-small); letter-spacing: 0.1em; line-height: 1; text-transform: uppercase; white-space: nowrap; }
.shell-pocket a { color: var(--lampblack); text-decoration: none; border-bottom: var(--rule-hair) solid rgba(27, 27, 26, 0.26); padding-bottom: 0.22em; }
.shell-pocket a:hover, .shell-pocket a:focus-visible { color: var(--iodine); border-bottom-color: var(--iodine); }
.shell-nav { grid-area: nav; min-width: 0; }
.shell-nav ul { display: flex; gap: clamp(0.9rem, 2vw, 2rem); align-items: center; }
.shell-nav a { display: inline-flex; align-items: baseline; gap: 0.4em; padding-block: 0.35rem; font-family: var(--f-display); font-weight: 700; font-size: 1.0625rem; letter-spacing: 0.08em; text-transform: uppercase; text-decoration: none; border-bottom: 2px solid transparent; }
.shell-nav a i { font-family: var(--f-mono); font-style: normal; font-weight: 400; font-size: 0.68rem; letter-spacing: 0; color: #605F5A; }
.shell-nav a:hover { color: var(--lampblack); border-bottom-color: var(--lampblack); }
.shell-nav a[aria-current="page"] { border-bottom-color: var(--iodine); }
.shell-nav a[aria-current="page"] i { color: var(--iodine); }
@media (max-width: 52rem) {
  /* mark · world · Pocket on one row, all three in view at 360; the walk is the row under it */
  .shell-header__inner { grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "mark where pocket" "nav nav nav"; column-gap: var(--s-3); row-gap: 0; padding-block: 0.45rem 0; align-content: space-between; }
  .shell-where { justify-content: flex-end; min-width: 0; }
  .shell-where__line { display: none; }   /* on a phone the header answers the world; the nav answers the stop */
  /* only here, and only as a last resort with the fallback face, may the world word shorten: nothing scrolls sideways */
  .shell-where__world { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .shell-worlds { flex: 0 1 auto; overflow: hidden; }
  .shell-worlds__panel ul { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .shell-worlds__panel a { grid-template-columns: 2.6rem minmax(0, 1fr); align-items: baseline; column-gap: 0; padding-block: 0.7rem; border-top: var(--rule-hair) solid rgba(27, 27, 26, 0.18); }
  .shell-worlds__panel a[aria-current] { border-top-color: rgba(27, 27, 26, 0.18); }
  .shell-worlds__panel span { grid-column: 2; }
  .shell-pocket { padding: 0.2rem 0; border-left: 0; font-size: var(--t-micro); }
  .shell-nav { align-self: end; margin-inline: calc(var(--gutter) * -1); padding-inline: var(--gutter); border-top: var(--rule-hair) solid rgba(27, 27, 26, 0.26); margin-top: 0.4rem; overflow-x: auto; scrollbar-width: none; }
  .shell-nav::-webkit-scrollbar { display: none; }
  .shell-nav ul { justify-content: space-between; gap: 1rem; }
  /* a scrolling flex row drops its right padding; this keeps the last stop off the edge */
  .shell-nav ul::after { content: ""; flex: 0 0 var(--gutter); }
  .shell-nav a { font-size: 0.95rem; padding-block: 0.5rem; white-space: nowrap; }
  :root { --header-h: 5.2rem; }
}
/* at 360 the longest world word (Mercy Room) must still stand whole beside the mark and Pocket */
@media (max-width: 30rem) { .shell-mark { font-size: 1.2rem; } .shell-header__inner { column-gap: var(--s-2); } .shell-where { font-size: 0.68rem; } }

.shell-footer { position: relative; background: var(--lampblack); color: var(--salt); overflow: hidden; --ink: var(--salt); --ink-soft: #C9C5BA; --ink-faint: #918F88; --hair: rgba(233, 229, 218, 0.24); --line: rgba(233, 229, 218, 0.9); --accent: #C97A45; --paper: var(--lampblack); }
.shell-footer__inner { padding: var(--s-8) var(--gutter) 0; max-width: var(--wrap); margin-inline: auto; }
.shell-footer__grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--s-6) var(--gutter); padding-bottom: var(--s-8); }
.shell-footer__grid > * { grid-column: 1 / -1; }
/* four columns: the colophon, this world's walk, the other worlds, the house */
@media (min-width: 48rem) { .shell-footer__col--a { grid-column: 1 / -1; } .shell-footer__col--b { grid-column: 1 / span 4; } .shell-footer__col--c { grid-column: 5 / span 4; } .shell-footer__col--d { grid-column: 9 / span 4; } }
@media (min-width: 64rem) { .shell-footer__col--a { grid-column: 1 / span 5; } .shell-footer__col--b { grid-column: 6 / span 2; } .shell-footer__col--c { grid-column: 8 / span 3; } .shell-footer__col--d { grid-column: 11 / span 2; } }
.shell-footer h2 { font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: var(--s-3); }
.shell-footer p, .shell-footer li { font-size: var(--t-small); line-height: 1.55; color: var(--ink-soft); }
.shell-footer li + li { margin-top: 0.3rem; }
.shell-footer a { color: var(--salt); }
.shell-footer__walk i { font-family: var(--f-mono); font-style: normal; color: var(--ink-faint); padding-right: 0.3em; }
.shell-footer__walk a[aria-current="page"], .shell-footer__house a[aria-current="page"] { color: var(--accent); }
.shell-footer__imprint { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--s-2) var(--s-6); padding-block: var(--s-4); border-top: var(--rule-hair) solid var(--hair); font-family: var(--f-mono); font-size: var(--t-micro); color: var(--ink-faint); text-transform: uppercase; }
/* the house name, once, too large, cut by the bottom edge */
.shell-footer p.shell-footer__name { font-family: var(--f-display); font-weight: 800; text-transform: uppercase; font-size: clamp(4.5rem, 24.5vw, 30rem); line-height: 0.74; letter-spacing: -0.02em; white-space: nowrap; margin: 0 0 -0.16em -0.03em; padding-inline: var(--gutter); color: var(--salt); user-select: none; }

/* 5b. THE HAND-OFF (injected by js/shell.js into [data-shell="walk"]) --------
   The last thing in <main> on every World 001 page: where you are in the walk,
   what is behind you, and one door out with a reason written on it. The word on
   the door is the name of a place or a thing in the world, so it may be large;
   nothing else here is. */
.walk { background: var(--salt-deep); color: var(--lampblack); border-top: var(--rule-hair) solid rgba(27, 27, 26, 0.9); --paper: var(--salt-deep); --ink: var(--lampblack); }
.walk__inner { padding-block: var(--s-7) var(--s-8); display: grid; gap: var(--s-4); }
.walk__pos { font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; color: #6B6A65; }
.walk__pos-no { color: var(--iodine); }
.walk__back { font-size: var(--t-small); color: #4A4945; max-width: var(--measure); }
.walk__next { display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: var(--s-5); row-gap: var(--s-2); align-items: baseline; text-decoration: none; padding-top: var(--s-4); border-top: var(--rule-hair) solid rgba(27, 27, 26, 0.35); }
.walk__next-key { font-family: var(--f-mono); font-size: var(--t-small); color: #6B6A65; }
.walk__next-word { font-family: var(--f-display); font-weight: 800; text-transform: uppercase; letter-spacing: 0.005em; line-height: 0.92; font-size: clamp(2rem, 6vw, 3.6rem); }
.walk__next-why { grid-column: 2; max-width: var(--measure); font-size: var(--t-body); line-height: 1.5; color: #35342F; }
.walk__next:hover .walk__next-word, .walk__next:focus-visible .walk__next-word { color: var(--iodine); }
.walk__side { font-size: var(--t-small); color: #4A4945; max-width: var(--measure); }
@media (max-width: 48rem) {
  .walk__next { grid-template-columns: minmax(0, 1fr); }
  .walk__next-why { grid-column: 1; }
}

/* 6. PLATE + CAPTION ------------------------------------------------------- */
/* <figure class="plate"><div class="plate__frame" data-art="plate" data-accession="A001-PH-014"></div><figcaption class="caption">…</figcaption></figure> */
.plate { position: relative; margin: 0; }
/* figure.plate.drop-N: the reset above must not cancel the stagger */
@media (min-width: 48rem) { .plate.drop-1 { margin-top: var(--s-7); } .plate.drop-2 { margin-top: var(--s-9); } .plate.drop-3 { margin-top: var(--s-10); } }
.plate__frame { position: relative; display: block; width: 100%; background: var(--board); overflow: hidden; }
.plate__frame > canvas, canvas.art-canvas { display: block; width: 100%; height: auto; }
.plate__frame[data-fill] { height: 100%; }
.plate__frame[data-fill] > canvas { height: 100%; }
.plate__frame:not([data-art-state]) { min-height: 8rem; }
.plate--bare .plate__frame { background: transparent; }
.plate--narrow { max-width: 22rem; } .plate--mid { max-width: 34rem; }
.plate--right { margin-left: auto; }
.plate--askew .plate__frame { transform: rotate(-0.6deg); }
.plate--askew-r .plate__frame { transform: rotate(0.8deg); }
.plate--bleed { margin-inline: calc(var(--gutter) * -1); }
a.plate__link { display: block; text-decoration: none; color: inherit; }
a.plate__link:hover .caption__title { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.18em; }
/* a wall of a room given to one plate */
.plate--wall .plate__frame { height: min(86vh, 60rem); }

/* the museum label. Order is law: accession, title, medium/date/condition, damage, content. */
.caption { margin-top: var(--s-3); padding-top: var(--s-3); border-top: var(--rule-hair) solid var(--line); display: grid; gap: 0.35rem; max-width: 30rem; font-size: var(--t-small); line-height: 1.45; color: var(--ink); }
.caption--wide { max-width: 40rem; }
.caption--plain { border-top: 0; padding-top: 0; }
.caption__acc { font-family: var(--f-mono); font-size: 0.8125rem; letter-spacing: 0; color: var(--ink); }
.caption__title { font-family: var(--f-display); font-weight: 700; font-size: 1.3rem; line-height: 1; text-transform: uppercase; letter-spacing: 0.01em; }
.caption__medium { font-family: var(--f-serif); font-style: italic; color: var(--ink-soft); }
.caption__damage, .caption__text { color: var(--ink-soft); }
.caption__damage::before { content: "Damage. "; font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); font-style: normal; }
.caption__meta { display: flex; flex-wrap: wrap; gap: 0.2rem 1rem; align-items: baseline; font-family: var(--f-mono); font-size: 0.78rem; color: var(--ink-soft); }

/* a label card, as fixed to a wall beside a holding */
.label-card { background: var(--paper-2); padding: var(--s-4) var(--s-5) var(--s-5); max-width: 24rem; border-left: var(--rule-heavy) solid var(--ink); display: grid; gap: 0.4rem; font-size: var(--t-small); }

/* 7. ACCESSION LABELS, STAMPS, EDITIONS, STATUS ---------------------------- */
.accession { font-family: var(--f-mono); font-size: 0.8125rem; line-height: 1; white-space: nowrap; letter-spacing: 0; font-feature-settings: normal; }
.accession--tag { display: inline-block; padding: 0.38em 0.6em 0.3em; background: var(--paper-2); border: var(--rule-hair) solid var(--hair); transform: rotate(-0.4deg); }
.accession--boxed { display: inline-block; padding: 0.35em 0.55em 0.28em; border: var(--rule-hair) solid var(--line); }
.accession--large { font-size: 1.05rem; }
a.accession { text-decoration: none; border-bottom: 1px dotted var(--ink-faint); }
a.accession:hover { border-bottom-color: var(--accent); }
.accession--withdrawn { text-decoration: line-through; color: var(--ink-faint); }

/* condition C1–C5. <span class="condition" data-grade="4">C4</span> draws five ticks, grade filled. */
.condition { display: inline-flex; align-items: center; gap: 0.5em; font-family: var(--f-mono); font-size: 0.78rem; white-space: nowrap; }
.condition::after { content: ""; width: 3.1rem; height: 0.55rem; background:
  linear-gradient(90deg, var(--ink) 0 var(--fill, 0%), transparent 0) 0 0 / 100% 100% no-repeat,
  repeating-linear-gradient(90deg, var(--ink-faint) 0 1px, transparent 1px 20%) 0 0 / 100% 100%; border-right: 1px solid var(--ink-faint); opacity: 0.85; }
.condition[data-grade="1"] { --fill: 20%; } .condition[data-grade="2"] { --fill: 40%; } .condition[data-grade="3"] { --fill: 60%; } .condition[data-grade="4"] { --fill: 80%; } .condition[data-grade="5"] { --fill: 100%; }

/* edition lockup: OBJECT 004 / EDITION 37 OF 100 */
.edition { display: inline-grid; gap: 0.1rem; font-family: var(--f-display); text-transform: uppercase; line-height: 0.9; }
.edition__object { font-weight: 800; font-size: var(--t-large); letter-spacing: -0.005em; }
.edition__no { font-weight: 400; font-size: var(--t-title); letter-spacing: 0.02em; color: var(--ink-soft); }
.edition__no b { font-weight: 800; color: var(--ink); }
.edition--inline { display: inline-flex; gap: 0.5em; align-items: baseline; }
.edition--inline .edition__object, .edition--inline .edition__no { font-size: var(--t-title); }

/* the rubber stamp. Slightly off square; never animated. */
.stamp { display: inline-block; padding: 0.42em 0.7em 0.34em; border: 3px double currentColor; font-family: var(--f-display); font-weight: 800; font-size: 1.15rem; line-height: 1; letter-spacing: 0.1em; text-transform: uppercase; color: var(--accent); transform: rotate(-3deg); mix-blend-mode: multiply; opacity: 0.88; white-space: nowrap; }
.stamp--ink { color: var(--ink); } .stamp--former { color: var(--former); } .stamp--mimeo { color: var(--mimeo); transform: rotate(4deg); }
.stamp--large { font-size: clamp(1.6rem, 3.4vw, 2.8rem); border-width: 5px; }
.stamp--small { font-size: 0.8rem; border-width: 2px; border-style: solid; }
.stamp--straight { transform: none; }
.room--lampblack .stamp, .room--former .stamp, .room--iodine .stamp, .shell-footer .stamp { mix-blend-mode: normal; }

/* STATUS: the first commercial sentence in the building, in nine-point type. */
.status { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0 1em; align-items: baseline; padding-block: var(--s-3); border-block: var(--rule-hair) solid var(--line); font-family: var(--f-mono); font-size: 0.8125rem; line-height: 1.45; }
.status__key { font-family: var(--f-display); font-weight: 700; letter-spacing: 0.14em; font-size: var(--t-micro); text-transform: uppercase; }
.status--released .status__value, .status--withdrawn .status__value { color: var(--ink-faint); }
.status--unresolved .status__value { color: var(--accent); }

/* 8. SPEC LISTS, INDEX TABLES, TIMELINE, VOCABULARY, DOSSIERS --------------- */
/* <dl class="spec"><div><dt>Medium</dt><dd>…</dd></div>…</dl> */
.spec { display: grid; border-top: var(--rule) solid var(--line); }
.spec > div { display: grid; grid-template-columns: minmax(6.5rem, 1fr) minmax(0, 3fr); gap: var(--s-2) var(--s-5); padding-block: 0.7rem 0.75rem; border-bottom: var(--rule-hair) solid var(--hair); align-items: baseline; }
.spec dt { font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-soft); padding-top: 0.2em; }
.spec dd { font-size: 0.98rem; line-height: 1.5; }
.spec dd ul li { padding-block: 0.25rem; } .spec dd ul li + li { border-top: 1px dotted var(--hair); }
.spec--typed dd { font-family: var(--f-mono); font-size: 0.875rem; }
@media (max-width: 30rem) { .spec > div { grid-template-columns: minmax(0, 1fr); gap: 0.15rem; } }

/* the finding aid: rows of holdings. Rows may be <a>. */
.index { border-top: var(--rule) solid var(--line); }
.index__row { display: grid; grid-template-columns: 8.5rem minmax(0, 1fr) 6.5rem 5.5rem; gap: var(--s-2) var(--s-5); align-items: baseline; padding-block: 0.8rem; border-bottom: var(--rule-hair) solid var(--hair); text-decoration: none; color: inherit; }
a.index__row:hover, a.index__row:focus-visible { background: var(--ink); color: var(--paper); text-decoration: none; }
a.index__row:hover .accession, a.index__row:hover .index__meta, a.index__row:hover .condition { color: var(--paper); }
a.index__row:hover .condition::after { filter: invert(1); }
.index__title { font-family: var(--f-display); font-weight: 700; font-size: 1.35rem; line-height: 1; text-transform: uppercase; }
.index__meta { font-family: var(--f-mono); font-size: 0.78rem; color: var(--ink-soft); }
.index__head { font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); }
@media (max-width: 40rem) { .index__row { grid-template-columns: minmax(0, 1fr) auto; } .index__row > :nth-child(2) { grid-column: 1 / -1; grid-row: 2; } .index__row > :nth-child(3) { display: none; } }
/* class GA. Reserved. */
.reserved { color: var(--ink-faint); }
.reserved .index__title::after { content: " — Reserved"; font-weight: 400; }

.timeline { border-top: var(--rule) solid var(--line); counter-reset: tl; }
.timeline > li, .timeline__item { display: grid; grid-template-columns: minmax(5.5rem, 2fr) minmax(0, 10fr); gap: var(--s-2) var(--gutter); padding-block: var(--s-4); border-bottom: var(--rule-hair) solid var(--hair); align-items: baseline; }
.timeline__date { font-family: var(--f-display); font-weight: 800; font-size: var(--t-title); line-height: 1; white-space: nowrap; }
.timeline__event { max-width: 40rem; }
.timeline__event b, .timeline__title { font-family: var(--f-serif); font-weight: 500; }
.timeline--large .timeline__date { font-size: var(--t-large); }

.vocab { columns: 22rem 2; column-gap: var(--gutter); }
.vocab > div { break-inside: avoid; padding-block: var(--s-3); border-top: var(--rule-hair) solid var(--hair); display: grid; gap: 0.2rem; }
.vocab dt { font-family: var(--f-display); font-weight: 800; font-size: 1.5rem; line-height: 1; text-transform: uppercase; }
.vocab dd { font-size: 0.98rem; color: var(--ink-soft); max-width: 32rem; }

.dossier { display: grid; gap: var(--s-3); padding-top: var(--s-4); border-top: var(--rule) solid var(--line); }
.dossier__name { font-family: var(--f-display); font-weight: 800; font-size: var(--t-large); line-height: 0.9; text-transform: uppercase; text-wrap: balance; }
.dossier__dates { font-family: var(--f-mono); font-size: var(--t-small); color: var(--ink-soft); }
.dossier__text { max-width: var(--measure); }

/* colour law swatches: flat, square, labelled like paint chips in a ministry drawer */
.swatches { display: grid; grid-template-columns: repeat(auto-fit, minmax(7rem, 1fr)); gap: var(--s-4); }
.swatch { display: grid; gap: 0.4rem; font-family: var(--f-mono); font-size: 0.78rem; }
.swatch::before { content: ""; display: block; aspect-ratio: 1 / 1.25; background: var(--c, var(--mole)); border: var(--rule-hair) solid var(--hair); }
.swatch b { font-family: var(--f-display); font-weight: 800; font-size: 1.2rem; text-transform: uppercase; letter-spacing: 0.02em; }
.swatch--interior::before { aspect-ratio: 1 / 0.4; margin-top: auto; }

/* 9. THE LEDGER THREAD, LINEAGE, ANCESTORS ---------------------------------- */
/* HUMAN PROPOSAL 07 (pencil on tissue) / MACHINE COUNTERPROPOSAL 07B (typed on buff) / FINAL OBJECT 07C (ruled, objection clipped) */
.thread { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-5) var(--gutter); padding-block: var(--s-7); border-top: var(--rule-heavy) solid var(--line); }
.thread__head { display: grid; gap: var(--s-3); align-content: start; }
.thread__no { font-family: var(--f-display); font-weight: 800; font-size: var(--t-giant); line-height: 0.76; letter-spacing: -0.02em; margin-top: -0.04em; }
.thread__subject { font-family: var(--f-display); font-weight: 700; font-size: var(--t-title); line-height: 1; text-transform: uppercase; max-width: 22rem; text-wrap: balance; }
.thread__date { font-family: var(--f-mono); font-size: 0.78rem; color: var(--ink-soft); }
.thread__parts { display: grid; gap: var(--s-5); }
@media (min-width: 60rem) { .thread { grid-template-columns: minmax(0, 3fr) minmax(0, 9fr); } .thread__parts { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s-4); align-items: start; } .thread__part--machine { margin-top: var(--s-6); } .thread__part--final { margin-top: var(--s-8); } }
.thread__part { position: relative; padding: var(--s-5) var(--s-5) var(--s-6); color: var(--lampblack); }
.thread__code { display: block; font-family: var(--f-display); font-weight: 800; font-size: 1.2rem; letter-spacing: 0.06em; line-height: 1; text-transform: uppercase; margin-bottom: var(--s-2); }
.thread__author { display: block; font-family: var(--f-mono); font-size: 0.75rem; margin-bottom: var(--s-4); opacity: 0.75; }
.thread__text { font-size: 1rem; line-height: 1.5; }
.thread__part--human { background: var(--tissue); transform: rotate(-0.5deg); }
.thread__part--human .thread__text { font-family: var(--f-serif); font-style: italic; font-weight: 300; font-size: 1.08rem; color: #3D3C3A; }
.thread__part--human::before { content: ""; position: absolute; left: 50%; top: -0.55rem; width: 4.2rem; height: 1.15rem; margin-left: -2.1rem; background: rgba(196, 172, 110, 0.6); transform: rotate(1.5deg); mix-blend-mode: multiply; }
.thread__part--machine { background: var(--buff); }
.thread__part--machine .thread__text { font-family: var(--f-mono); font-size: 0.875rem; line-height: 1.55; }
.thread__part--machine .thread__author { opacity: 1; }
.thread__part--final { background: var(--salt); border: var(--rule-hair) solid var(--lampblack); border-top: var(--rule-heavy) solid var(--lampblack); transform: rotate(0.35deg); }
.room--salt .thread__part--final, body > main > .thread__part--final { background: #F1EEE5; }
.thread__verdict { display: flex; flex-wrap: wrap; gap: 0.4rem 0.9rem; align-items: center; margin-top: var(--s-4); padding-top: var(--s-3); border-top: 1px dotted rgba(27, 27, 26, 0.5); font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; }
.thread__verdict b { font-weight: 800; font-size: 1.05rem; letter-spacing: 0.08em; }
.thread[data-winner="machine"] .thread__part--machine, .thread[data-winner="both"] .thread__part--machine { border-bottom: 6px solid var(--iodine); }
.thread[data-winner="human"] .thread__part--human, .thread[data-winner="both"] .thread__part--human { border-bottom: 6px solid var(--iodine); }
.thread--unresolved .thread__part--final { border-style: dashed; border-top-style: dashed; background: transparent; color: inherit; }
.thread--rejected .thread__part--final .thread__code { color: var(--iodine); }
/* a sheet pinned up blank: the machine declined */
.thread__part--blank { min-height: 12rem; background: var(--buff); }

/* lineage: what it was made from, in order. <ol class="lineage"><li><span class="lineage__stage">…</span><p class="lineage__note">…</p></li></ol> */
.lineage { position: relative; display: grid; gap: 0; border-left: var(--rule) solid var(--line); margin-left: 0.3rem; }
.lineage > li { position: relative; padding: 0 0 var(--s-5) var(--s-5); }
.lineage > li::before { content: ""; position: absolute; left: -0.42rem; top: 0.3rem; width: 0.7rem; height: var(--rule); background: var(--line); }
.lineage > li:last-child { padding-bottom: 0; }
.lineage__stage { display: block; font-family: var(--f-display); font-weight: 800; font-size: 1.1rem; letter-spacing: 0.07em; line-height: 1.1; text-transform: uppercase; }
.lineage__note { font-size: 0.98rem; color: var(--ink-soft); max-width: 34rem; margin-top: 0.2rem; }
.lineage > li[data-kind="machine"] .lineage__note { font-family: var(--f-mono); font-size: 0.85rem; }
.lineage > li[data-kind="final"] .lineage__stage { color: var(--accent); }

/* what this object declined to be */
.ancestors { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 13rem), 1fr)); gap: var(--s-6) var(--gutter); }
.ancestor { display: grid; gap: var(--s-3); align-content: start; }
.ancestor__code { font-family: var(--f-mono); font-size: 0.8125rem; text-decoration: line-through; text-decoration-color: var(--accent); text-decoration-thickness: 2px; }
.ancestor__note { font-size: var(--t-small); color: var(--ink-soft); }

/* Concepts are pencilled lines on a sheet, numbered in the margin by a typewriter. Never boxed: a cluster of
   boxed phrases reads as a tag cloud, and nothing here is a tag. */
.concepts { display: grid; max-width: 30rem; counter-reset: concept; border-top: var(--rule-hair) solid var(--line); }
.concepts li { counter-increment: concept; display: grid; grid-template-columns: 2.2rem minmax(0, 1fr); align-items: baseline; padding: 0.55em 0 0.5em; border-bottom: 1px dotted var(--ink-faint); font-family: var(--f-serif); font-style: italic; font-weight: 300; font-size: 1.08rem; line-height: 1.3; }
.concepts li::before { content: counter(concept, decimal-leading-zero); font-family: var(--f-mono); font-style: normal; font-weight: 400; font-size: 0.72rem; color: var(--ink-faint); }
/* 10. MARGINALIA AND HANDS -------------------------------------------------- */
/* .has-margin gives its content a right-hand margin column on wide screens; <aside class="marginalia"> sits in it. */
.has-margin { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-4) var(--gutter); }
@media (min-width: 64rem) { .has-margin { grid-template-columns: minmax(0, var(--measure)) minmax(10rem, 16rem); } .has-margin > .marginalia { grid-column: 2; } .has-margin > :not(.marginalia) { grid-column: 1; } }
.marginalia { font-family: var(--f-serif); font-style: italic; font-weight: 300; font-size: 0.98rem; line-height: 1.35; color: var(--accent); transform: rotate(-1.2deg); transform-origin: left top; max-width: 16rem; }
.marginalia--pencil { color: #66645F; }
.marginalia--typed { font-family: var(--f-mono); font-style: normal; font-size: 0.78rem; color: var(--ink-soft); transform: none; }
.marginalia::before { content: "↳ "; font-style: normal; opacity: 0.6; }
.marginalia--bare::before { content: none; }
.pencil { font-family: var(--f-serif); font-style: italic; font-weight: 300; color: #66645F; }
.hand-iodine { font-family: var(--f-serif); font-style: italic; color: var(--accent); }
.redact { background: var(--ink); color: transparent; user-select: none; padding-inline: 0.2em; box-decoration-break: clone; -webkit-box-decoration-break: clone; }
.strike { text-decoration: line-through; text-decoration-thickness: 2px; text-decoration-color: var(--accent); }
.overprint { position: relative; display: inline-block; }
.overprint > .overprint__over { position: absolute; left: 0.04em; top: 0.06em; color: var(--mimeo); transform: rotate(4deg); transform-origin: left center; mix-blend-mode: multiply; white-space: nowrap; pointer-events: none; }
/* misregistration for display type: a second impression in iodine, 0.035em out. Use sparingly; once per page. */
.misregister { text-shadow: 0.014em -0.009em 0 rgba(154, 75, 28, 0.8); }

/* 11. THE SLIP, ACQUISITION, BUTTONS ---------------------------------------- */
/* 74 × 105 mm, perforated head. Also the receipt. */
.slip { position: relative; width: min(100%, 21rem); aspect-ratio: 74 / 105; background: var(--buff); color: var(--lampblack); padding: 0 1.3rem 1.3rem; display: grid; grid-template-rows: auto 1fr; font-family: var(--f-mono); font-size: 0.8125rem; border-right: 1px solid rgba(27, 27, 26, 0.25); border-bottom: 2px solid rgba(27, 27, 26, 0.25); }
.slip--auto { aspect-ratio: auto; }
.slip--tilt { transform: rotate(-1.1deg); }
.slip__head { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; margin-inline: -1.3rem; padding: 0.8rem 1.3rem 0.95rem; margin-bottom: 1.1rem; background-image: radial-gradient(circle, rgba(27, 27, 26, 0.7) 0 1.6px, transparent 2px); background-size: 11px 5px; background-position: 3px 100%; background-repeat: repeat-x; font-family: var(--f-display); font-weight: 800; font-size: 1.35rem; letter-spacing: 0.06em; text-transform: uppercase; }
.slip__head small { font-family: var(--f-mono); font-weight: 400; font-size: 0.75rem; letter-spacing: 0; }
.slip__fields { display: grid; gap: 1rem; align-content: start; }
.slip__field { display: grid; gap: 0.15rem; }
.slip__label { font-family: var(--f-display); font-weight: 700; font-size: 0.82rem; letter-spacing: 0.12em; text-transform: uppercase; }
.slip__value { min-height: 1.75rem; border-bottom: 1.5px solid var(--lampblack); font-family: var(--f-mono); font-size: 1rem; padding-bottom: 0.1rem; width: 58%; }
.slip__field--name .slip__value { width: 100%; min-height: 3.2rem; background-image: linear-gradient(transparent calc(50% - 0.75px), var(--lampblack) calc(50% - 0.75px) calc(50% + 0.75px), transparent calc(50% + 0.75px)); }
.slip__foot { margin-top: auto; padding-top: 0.9rem; font-size: 0.72rem; line-height: 1.4; }
input.slip__value { display: block; background-color: transparent; border-width: 0 0 1.5px; border-style: solid; border-color: var(--lampblack); border-radius: 0; }
input.slip__value:focus-visible { outline: 2px solid var(--iodine); outline-offset: 2px; }

.btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.6em; min-height: 2.9rem; padding: 0.55rem 1.3rem 0.5rem; border: var(--rule) solid var(--ink); background: transparent; color: var(--ink); font-family: var(--f-display); font-weight: 800; font-size: 1.15rem; letter-spacing: 0.1em; line-height: 1; text-transform: uppercase; text-decoration: none; cursor: pointer; border-radius: 0; transition: background-color 0.15s, color 0.15s; }
.btn:hover, .btn:focus-visible { background: var(--ink); color: var(--paper); text-decoration: none; }
.btn--solid { background: var(--ink); color: var(--paper); }
.btn--solid:hover, .btn--solid:focus-visible { background: var(--accent); border-color: var(--accent); color: var(--salt); }
.btn--quiet { border-width: 0 0 var(--rule); padding-inline: 0; min-height: 0; padding-block: 0.3rem; font-size: 1rem; }
.btn--quiet:hover, .btn--quiet:focus-visible { background: transparent; color: var(--accent); border-color: var(--accent); }
.btn[disabled], .btn[aria-disabled="true"] { opacity: 0.45; cursor: not-allowed; pointer-events: none; }

/* acquisition request. Nothing is sold here: a status, one control, and a mailto that appears when asked for. */
.acquire { display: grid; gap: var(--s-4); max-width: 30rem; }
.acquire > .btn { justify-self: start; }
.acquire__release { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: baseline; gap: 0.3rem 1rem; }
.acquire__release dt, .acquire__key { font-family: var(--f-display); font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-soft); }
.acquire__price { font-family: var(--f-mono); font-size: 1rem; }
.acquire__reveal { display: grid; gap: var(--s-3); padding: var(--s-4) var(--s-5); background: var(--buff); color: var(--lampblack); font-family: var(--f-mono); font-size: 0.8125rem; line-height: 1.5; }
.acquire__reveal > * { min-width: 0; }
.acquire__reveal a { color: var(--lampblack); font-size: 0.95rem; overflow-wrap: anywhere; }
.acquire__note { font-size: var(--t-small); color: var(--ink-soft); }

/* 12. NOTICES, INTERTITLES, FILM BEATS -------------------------------------- */
/* an HTML poster: headline too large, hard against the top edge; small print; one disc. */
.notice { position: relative; aspect-ratio: 594 / 841; container-type: inline-size; background: #ECE8DC; color: var(--lampblack); padding: 0 5% 5%; display: grid; grid-template-rows: auto 1fr auto; overflow: hidden; border: var(--rule-hair) solid rgba(27, 27, 26, 0.2); }
.notice--buff { background: var(--buff); }
.notice--landscape { aspect-ratio: 841 / 594; }
.notice__headline { font-family: var(--f-display); font-weight: 800; text-transform: uppercase; font-size: 19vw; font-size: 31cqw; line-height: 0.79; letter-spacing: -0.015em; margin: -0.1em -0.02em 0; overflow-wrap: normal; }
.notice--centre .notice__headline { text-align: center; margin-top: 18%; font-size: 24cqw; }
.notice__small { align-self: end; max-width: 66%; font-family: var(--f-display); font-weight: 600; font-size: clamp(0.62rem, 2.2cqw, 0.95rem); line-height: 1.3; letter-spacing: 0.04em; text-transform: uppercase; }
.notice__disc { position: absolute; right: 8%; bottom: 7%; width: 21%; aspect-ratio: 1; border-radius: 50%; background: var(--iodine); mix-blend-mode: multiply; opacity: 0.9; }
.notice__over { position: absolute; left: 8%; top: 22%; font-family: var(--f-display); font-weight: 800; font-size: 30cqw; line-height: 0.8; text-transform: uppercase; color: var(--mimeo); transform: rotate(4deg); transform-origin: left top; mix-blend-mode: multiply; opacity: 0.9; }
.notice__pencil { position: absolute; right: 7%; bottom: 2.2%; font-family: var(--f-serif); font-style: italic; color: #66645F; font-size: clamp(0.7rem, 3cqw, 1.1rem); transform: rotate(-2deg); }

.intertitle { background: #0E0E0D; color: #E9E6DC; aspect-ratio: 1.37 / 1; container-type: inline-size; padding: 0 5% 5%; overflow: hidden; }
.intertitle__text { font-family: var(--f-display); font-weight: 800; text-transform: uppercase; font-size: 12vw; font-size: 21cqw; line-height: 0.8; margin-top: -0.08em; }

/* film beats: time / picture / sound */
.beats { border-top: var(--rule) solid var(--line); }
.beat { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-2) var(--gutter); padding-block: var(--s-5); border-bottom: var(--rule-hair) solid var(--hair); }
@media (min-width: 52rem) { .beat { grid-template-columns: 7rem minmax(0, 6fr) minmax(0, 4fr); } }
.beat__time { font-family: var(--f-mono); font-size: 0.875rem; white-space: nowrap; }
.beat__picture { max-width: 38rem; }
.beat__sound { font-family: var(--f-serif); font-style: italic; font-weight: 300; color: var(--ink-soft); }
.beat__sound::before { content: "Sound. "; font-family: var(--f-display); font-style: normal; font-weight: 600; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); }

/* microcopy: small grotesque with a great deal of space around it */
.microcopy { display: grid; gap: 0.5rem; max-width: 27rem; padding-block: var(--s-7); font-family: var(--f-display); font-weight: 600; font-size: 1.05rem; letter-spacing: 0.06em; line-height: 1.3; text-transform: uppercase; }
.microcopy > :first-child { font-weight: 800; font-size: 1.5rem; letter-spacing: 0.04em; }
.microcopy--sentence { text-transform: none; font-family: var(--f-mono); font-weight: 400; font-size: 0.8125rem; letter-spacing: 0; line-height: 1.55; }
.microcopy--sentence > :first-child { font-family: var(--f-display); font-weight: 800; font-size: 1.3rem; letter-spacing: 0.06em; text-transform: uppercase; }

/* 13. FURNITURE -------------------------------------------------------------- */
/* the kilometre rule: one black line with ticks. A section divider. */
.km-rule { position: relative; height: 1.5rem; border: 0; margin: 0; background:
  linear-gradient(var(--line), var(--line)) 0 50% / 100% 2px no-repeat,
  repeating-linear-gradient(90deg, var(--line) 0 1px, transparent 1px 10px) 0 50% / 100% 0.45rem no-repeat,
  repeating-linear-gradient(90deg, var(--line) 0 1px, transparent 1px 100px) 0 50% / 100% 1.5rem no-repeat; }
.km-rule--dotted { background:
  repeating-linear-gradient(90deg, var(--line) 0 6px, transparent 6px 14px) 0 50% / 100% 2px no-repeat; }
.km-mark { font-family: var(--f-display); font-weight: 800; font-size: 1.05rem; letter-spacing: 0.12em; text-transform: uppercase; white-space: nowrap; }
.km-mark--large { font-size: var(--t-large); letter-spacing: 0.04em; line-height: 0.9; }
/* the door-lamp: the only circle. Flat. It does not glow. */
.lamp { display: inline-block; width: var(--lamp, 2.2rem); aspect-ratio: 1; border-radius: 50%; background: var(--iodine); vertical-align: middle; }
.lamp--unlit { background: transparent; border: 1.5px solid var(--ink-faint); }
.lamp--large { --lamp: clamp(5rem, 14vw, 13rem); }
/* empty ruled leaves: the larger part of the document */
.ruled-empty { min-height: var(--leaves, 18rem); background-image: repeating-linear-gradient(180deg, transparent 0 calc(1.9rem - 1px), var(--hair) calc(1.9rem - 1px) 1.9rem), linear-gradient(90deg, transparent 0 11%, var(--hair) 11% calc(11% + 1px), transparent calc(11% + 1px) 24%, var(--hair) 24% calc(24% + 1px), transparent calc(24% + 1px) 37%, var(--hair) 37% calc(37% + 1px), transparent calc(37% + 1px) 72%, var(--hair) 72% calc(72% + 1px), transparent calc(72% + 1px)); border-block: var(--rule-hair) solid var(--hair); }
.ledger-line { display: grid; grid-template-columns: 11% 13% 13% 35% 1fr; min-height: 1.9rem; align-items: center; border-bottom: var(--rule-hair) solid var(--hair); font-family: var(--f-mono); font-size: 0.78rem; }
.ledger-line > * { padding-inline: 0.5rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* the empty response box, slightly cleaner than the paper around it */
.response-box { min-height: 9rem; border: var(--rule) solid var(--line); background: rgba(255, 252, 240, 0.35); padding: var(--s-3) var(--s-4); }
.response-box__label { font-family: var(--f-display); font-weight: 700; font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; }
/* tape, for things fixed to the page by hand */
.taped { position: relative; }
.taped::before { content: ""; position: absolute; z-index: 2; left: 12%; top: -0.6rem; width: 4.4rem; height: 1.2rem; background: rgba(196, 172, 110, 0.62); transform: rotate(-2.5deg); mix-blend-mode: multiply; }
.taped--right::before { left: auto; right: 12%; transform: rotate(3deg); }

/* 13b. THE SURFACE, AND THE FOLD -------------------------------------------
   Added when the site was made accessible on sight. The law of the house is
   now: every page opens as a surface — a figure, a name, at most one sentence,
   and a door — and everything else is folded. Words are not cut, they are put
   behind something a visitor chooses to open. Two primitives do all of it,
   and they are shared so that opening a thing feels the same in every room.

   THE SURFACE. What is above the first plate or the first door on any page.
   At most forty words, at any width, and one of them is the name.

     <section class="room room--flush-bottom surface">
       <div class="wrap">
         <p class="surface__no">03 · Across the Run</p>
         <h1 class="nd-open__title">Next door</h1>           page keeps its own display class
         <p class="surface__line">One sentence.</p>
         <p class="door"><a href="#first">Two knocks <span aria-hidden="true">&rarr;</span></a></p>
       </div>
     </section>

   THE FOLD. A closed thing with an in-world label: a Keeper's card, the
   letter, what she said. Never "Read more". The label names the object, and
   the number on the left is the archive's, not a step count.

     <details class="fold">
       <summary class="fold__summary">
         <span class="fold__no">Card 04</span>
         <span class="fold__label">What Marit has not told anybody</span>
         <span class="fold__act" aria-hidden="true"></span>
       </summary>
       <div class="fold__body">…</div>
     </details>

   Everything reads role tokens, so a fold in the buff room, the lampblack
   room and the colours room is the same fold. --------------------------- */

.surface__line { max-width: 34rem; margin-top: var(--s-4); font-size: var(--t-lede); font-weight: 300; line-height: 1.32; text-wrap: balance; }
.surface__no { font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); }

/* the door: one ruled line of type that leaves. Never a filled button. */
.door { margin-top: var(--s-5); font-family: var(--f-mono); font-size: var(--t-small); letter-spacing: 0.12em; text-transform: uppercase; }
.door a { display: inline-flex; align-items: baseline; gap: 0.6em; color: inherit; text-decoration: none; border-bottom: var(--rule-hair) solid var(--hair); padding-bottom: 0.25em; }
.door a:hover, .door a:focus-visible { border-bottom-color: currentColor; }
.door a span { display: inline-block; transition: transform 0.35s var(--ease); }
.door a:hover span, .door a:focus-visible span { transform: translateX(6px); }
.door--iodine a { color: var(--accent); }

.fold { margin-top: var(--s-5); border-top: var(--rule-hair) solid var(--hair); }
.fold + .fold { margin-top: 0; }
.fold:last-of-type { border-bottom: var(--rule-hair) solid var(--hair); }
.fold__summary { display: grid; grid-template-columns: minmax(0, auto) 1fr auto; align-items: baseline; gap: var(--s-3) var(--s-4); padding-block: var(--s-4); cursor: pointer; list-style: none; }
.fold__summary::-webkit-details-marker { display: none; }
.fold__summary::marker { content: ""; }
.fold__no { font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-faint); white-space: nowrap; }
.fold__label { font-family: var(--f-display); font-weight: 700; font-size: clamp(1.05rem, 1.7vw, 1.4rem); line-height: 1.05; letter-spacing: 0.06em; text-transform: uppercase; }
.fold__summary:hover .fold__label, .fold__summary:focus-visible .fold__label { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.22em; }
.fold__summary:focus-visible { outline: var(--rule) solid var(--ink); outline-offset: 4px; }
/* the state word. It is the only thing on the site that tells you what a control does. */
.fold__act { font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent); white-space: nowrap; }
.fold__act::after { content: "Open"; }
.fold[open] > .fold__summary .fold__act::after { content: "Close"; }
.fold[open] > .fold__summary { border-bottom: var(--rule-hair) solid var(--hair); }
.fold__body { padding-block: var(--s-5) var(--s-6); }
.fold__body > * + * { margin-top: 1.1em; }
.fold--tight .fold__body { padding-block: var(--s-4) var(--s-5); }

/* THE LEDE. The body's own first sentence, at most eighteen words, on a row of its
   own under the label, so a closed page reads as a page of first sentences.
     <summary class="fold__summary"><span class="fold__no">Km 596</span><span class="fold__label">What Marit wants</span>
       <span class="fold__lede">She serves his dinner from that side of the table so as to stand in the heat.</span>
       <span class="fold__act"></span></summary>
   It is placed on the grid by both axes, so the number, the label and the state
   word keep their row whatever order the page writes them in. */
.fold__lede { grid-column: 2; grid-row: 2; max-width: 38rem; margin-top: -0.2rem; font-family: var(--f-serif); font-weight: 300; font-size: 1rem; line-height: 1.42; letter-spacing: 0; text-transform: none; color: var(--ink-soft); text-wrap: pretty; }
.fold__summary:hover .fold__lede, .fold__summary:focus-visible .fold__lede { text-decoration: none; }

/* THE ROOMS ROW. Under the surface of a long page: a mono row of its sections,
   the archive's own numbers before the words. It wraps; it never scrolls.
     <nav class="rooms-row" aria-label="The rooms"><ul><li><a href="#hanna"><i>07</i>Hanna</a></li>…</ul></nav> */
.rooms-row { margin-top: var(--s-5); font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; line-height: 1.6; text-transform: uppercase; }
.rooms-row, .rooms-row ul, .rooms-row ol { display: flex; flex-wrap: wrap; gap: 0.4rem 1.4rem; align-items: baseline; }
.rooms-row a { display: inline-flex; align-items: baseline; gap: 0.45em; color: inherit; text-decoration: none; border-bottom: var(--rule-hair) solid var(--hair); padding-bottom: 0.15em; white-space: nowrap; }
.rooms-row a:hover, .rooms-row a:focus-visible { color: var(--accent); border-bottom-color: currentColor; }
.rooms-row i { font-style: normal; letter-spacing: 0; color: var(--ink-faint); }

/* WHAT THE HOUSE HOLDS AT A KILOMETRE. A static mono line under the map's entry,
   each thing a link that lands open and under the header. Small, and never a count. */
.km__held { margin-top: var(--s-3); max-width: 44rem; font-family: var(--f-mono); font-size: var(--t-small); line-height: 1.65; letter-spacing: 0; color: var(--ink-soft); }
.km__held a { color: inherit; text-decoration: none; border-bottom: var(--rule-hair) solid var(--hair); }
.km__held a:hover, .km__held a:focus-visible { color: var(--accent); border-bottom-color: currentColor; }

/* AN OPENING FOLD. The four folds next door where somebody stood in carry the
   colours (§15) behind their summary: masked so the light has a middle, low, and
   printed into the paper rather than screened over it. No label, no count.
     <details class="fold fold--opening"><summary class="fold__summary">…<span class="colours" aria-hidden="true"><i></i><i></i><i></i></span></summary>… */
.fold--opening > .fold__summary { position: relative; isolation: isolate; overflow: clip; }
.fold--opening > .fold__summary .colours { --colours-blend: multiply; --colours-opacity: 0.32; --colours-mask: linear-gradient(to right, transparent 0, var(--lampblack) 14%, var(--lampblack) 66%, transparent 100%); }
.fold--opening[open] > .fold__summary .colours { --colours-opacity: 0.18; }
.room--lampblack .fold--opening > .fold__summary .colours, .room--former .fold--opening > .fold__summary .colours, .room--colours .fold--opening > .fold__summary .colours { --colours-blend: screen; --colours-opacity: 0.5; }

/* A DOCUMENT, LIFTED OUT. Each hand gets its own paper and its own setting, so
   a docket never looks like a letter and a letter never looks like a return. */
.doc { padding: var(--s-5) var(--s-5); border: var(--rule-hair) solid var(--hair); background: var(--paper-2); color: var(--ink); max-width: 44rem; }
.doc > * + * { margin-top: 0.75em; }
.doc__head { display: block; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: var(--s-3); }
.doc__src { font-family: var(--f-mono); font-size: var(--t-small); line-height: 1.5; color: var(--ink-faint); }
/* the even hand: dockets, returns, anything next door wrote */
.doc--typed { background: var(--buff); font-family: var(--f-mono); font-size: 0.9rem; line-height: 1.55; }
.doc--typed > p + p { margin-top: 0.55em; padding-top: 0.55em; border-top: var(--rule-hair) dotted rgba(27, 27, 26, 0.34); }
.doc__last { margin-top: 1.6em !important; letter-spacing: 0.42em; font-weight: 700; }
/* pencil on tissue: letters, notebooks, anything written to one person */
.doc--pencil { background: var(--tissue); font-family: var(--f-serif); font-size: 1.02rem; font-style: italic; font-weight: 300; line-height: 1.62; transform: rotate(-0.35deg); }
.doc--pencil > p + p { margin-top: 1em; }
/* a form, a return, an official sheet: ruled and cold */
.doc--form { background: var(--salt); font-family: var(--f-mono); font-size: 0.86rem; }
.doc--form > * + * { border-top: var(--rule-hair) solid var(--hair); padding-top: 0.6em; }
/* an account taken down and read back: the Keepers' running text, set to be read */
.doc--account { border: 0; background: none; padding: 0; max-width: var(--measure); font-size: 1.06rem; line-height: 1.66; }
.doc--account > p + p { margin-top: 1.25em; }

@media (max-width: 47.99rem) {
  .fold__summary { grid-template-columns: 1fr auto; }
  .fold__no { grid-column: 1 / -1; }
  .fold__lede { grid-column: 1 / -1; grid-row: 3; margin-top: 0; }   /* stacks: number, label and state, then the sentence */
  .doc { padding: var(--s-4); }
}
@media (prefers-reduced-motion: reduce) { .door a span { transition: none; } .doc--pencil { transform: none; } }

/* 13c. PICKING A THING UP: THE WORD, THE CARD, THE POCKET -------------------
   The second thing a visitor can do, after opening a fold. A word in the text,
   or a garment on its stage, is a thing that can be picked up, read on a card
   and kept. The mechanic is js/pocket.js and it is the same in every world, so
   this is furniture, not a page's own styling: Ossel and Mercy Room open the
   same card, and one pocket holds what was picked up in either.

     <button type="button" class="obj" data-pick="docket">docket</button>
     <dialog class="card" id="card">…</dialog>
     <ul class="pocket__list" id="pocket-list"></ul>

   The card reads the role tokens, so it is the same card over a lampblack beat
   as over salt. Nothing here is rounded and nothing floats: it is a thing held
   up in front of the page, on the page's own paper. ------------------------ */

/* the word, marked like a seam. The rule under it is the accent of the room it is in. */
.obj { font: inherit; color: inherit; background: none; border: 0; padding: 0 0.08em; margin: 0; cursor: pointer; border-bottom: 1.5px solid var(--accent); text-decoration: none; }
.obj:hover, .obj:focus-visible { background: var(--accent); color: var(--paper); outline: none; }
.obj.is-kept::after { content: " ·"; color: var(--accent); }
/* not yet: a private mark in this browser. The rule goes dotted; the docket gets nothing. */
.obj.is-notyet { border-bottom-style: dotted; }
.obj.is-notyet::after { content: none; }

.card, dialog#pocket { width: min(92vw, 40rem); max-height: 88vh; overflow: auto; padding: clamp(1.4rem, 3vw, 2.5rem); border: var(--rule-hair) solid var(--ink); border-radius: 0; background: var(--paper); color: var(--ink); font-size: var(--t-body); }
.card::backdrop, dialog#pocket::backdrop { background: rgba(27, 27, 26, 0.55); }
.card__close { position: sticky; top: 0; float: right; margin: -0.4rem -0.4rem 0 0; width: 2rem; height: 2rem; border: 0; background: var(--paper); color: var(--ink); font-size: 1.4rem; line-height: 1; cursor: pointer; }
.card__kicker { font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.card h2, dialog#pocket h2 { font-family: var(--f-display); font-weight: 800; text-transform: uppercase; font-size: clamp(1.8rem, 4.4vw, 2.7rem); line-height: 0.94; letter-spacing: -0.005em; margin: 0.3em 0 0.8em; }
.card .doc { max-width: none; }
.card__note { margin-top: var(--s-4); color: var(--ink-soft); font-size: var(--t-small); }
.card__shop { margin-top: var(--s-4); display: flex; flex-wrap: wrap; gap: 0.4rem 1.6rem; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; }
/* where it came from: the page and the fold, as a ruled mono line that lands open */
.card__where { margin-top: var(--s-4); font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); }
.card__where a { color: inherit; text-decoration: none; border-bottom: var(--rule-hair) solid var(--hair); padding-bottom: 0.15em; }
.card__where a:hover, .card__where a:focus-visible { color: var(--accent); border-bottom-color: currentColor; }
/* the foot: three answers as ruled mono words, in .btn--quiet manners. There is
   no filled button anywhere on the site. Keep it · Not yet (Not tonight for an
   opening) · Leave it; then the state, and Put it down once it is kept. */
.card__foot { margin-top: var(--s-5); display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.7rem 1.4rem; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; }
.card__keep, .card__notyet, .card__leave, .card__put, .pocket__put, .step__controls a, .step__controls button, .step__burn a, .step__burn button {
  display: inline-block; font: inherit; letter-spacing: inherit; text-transform: inherit; line-height: 1.2; margin: 0; padding: 0.3em 0 0.22em;
  border: 0; border-bottom: var(--rule) solid var(--ink); border-radius: 0; background: none; color: var(--ink); text-decoration: none; cursor: pointer; }
.card__keep:hover, .card__keep:focus-visible, .card__notyet:hover, .card__notyet:focus-visible, .card__leave:hover, .card__leave:focus-visible,
.card__put:hover, .card__put:focus-visible, .pocket__put:hover, .pocket__put:focus-visible,
.step__controls a:hover, .step__controls a:focus-visible, .step__controls button:hover, .step__controls button:focus-visible,
.step__burn a:hover, .step__burn a:focus-visible, .step__burn button:hover, .step__burn button:focus-visible { background: none; color: var(--accent); border-bottom-color: var(--accent); }
.card__leave, .card__put, .pocket__put { border-bottom-width: var(--rule-hair); color: var(--ink-soft); }
/* the answer already given, when the card is opened again */
.card__notyet[aria-pressed="true"], .card__notyet.is-chosen { border-bottom-style: dotted; color: var(--ink-soft); }
.card__state { color: var(--ink-soft); }
.card__kept { color: var(--accent); text-decoration: none; border-bottom: var(--rule-hair) solid currentColor; padding-bottom: 0.22em; }
.card__kept:hover, .card__kept:focus-visible { color: var(--ink); }

/* the pocket: what you picked up, in this browser and nowhere else. A section at
   the foot of a page, or a second card opened from the header. Same rows. */
.pocket__list { display: grid; gap: 0; border-top: var(--rule-hair) solid var(--hair); }
.pocket__list:empty { border-top: 0; }
.pocket__item { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0.2rem 1rem; width: 100%; text-align: left; align-items: baseline; padding: 0.85rem 0; border: 0; border-bottom: var(--rule-hair) solid var(--hair); background: none; font: inherit; color: inherit; text-decoration: none; cursor: pointer; }
.pocket__item:hover, .pocket__item:focus-visible { color: var(--accent); }
.pocket__kicker { grid-column: 1; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); }
.pocket__title { grid-column: 1; font-family: var(--f-display); font-weight: 700; font-size: 1.2rem; letter-spacing: 0.04em; text-transform: uppercase; line-height: 1.05; }
.pocket__where { grid-column: 2; grid-row: 1 / span 2; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-faint); white-space: nowrap; }
.pocket__item.is-kept::after { content: none; }
/* the docket line the thing carries, under its title */
.pocket__line { grid-column: 1; margin-top: 0.15rem; font-family: var(--f-mono); font-size: var(--t-micro); line-height: 1.45; letter-spacing: 0; text-transform: none; color: var(--ink-soft); }
.pocket__empty { font-size: var(--t-small); color: var(--ink-soft); }
/* the rows grouped by world: Ossel / Mercy Room / The house, each row with Put it down */
.pocket__group { display: block; padding: var(--s-5) 0 var(--s-2); }
.pocket__group:first-child { padding-top: var(--s-3); }
.pocket__group-h { margin: 0; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-faint); }
.pocket__row { display: flex; align-items: baseline; gap: var(--s-4); border-bottom: var(--rule-hair) solid var(--hair); }
.pocket__row > .pocket__item { flex: 1 1 auto; min-width: 0; width: auto; border-bottom: 0; }
.pocket__put { flex: 0 0 auto; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; white-space: nowrap; }
.pocket__row.is-taken .pocket__title { color: var(--ink-soft); }
/* one mono line, and the door */
.pocket__state { margin-top: var(--s-5); font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-faint); }
.pocket__door { margin-top: var(--s-5); }
dialog#pocket .card__close { margin-bottom: 0; }
/* the count in the header, where a page carries one (nothing on the site counts any more; kept for the two pages as built) */
.pocket-count { display: inline-block; min-width: 1.6em; padding: 0.1em 0.3em 0; border: var(--rule-hair) solid currentColor; border-radius: 0; font-weight: 400; text-align: center; }

/* 13d. THE STEP (site/step.html, World 003; the slip's print layout, @page and
   all, is in css/step.css) ---------------------------------------------------
   A short band of sill and doorway while nothing is kept; a figure from the
   first keep. The docket is a .doc--typed with the code at its perforated head.
   The controls are ruled mono words, phone-first, and are not there at all in
   the nothing state. data-state is read from the figure or from any ancestor. */
.step__figure { margin: 0; }
.step__figure .plate__frame { max-height: 76vh; max-height: 76svh; width: min(100%, calc(76vh * 0.8)); width: min(100%, calc(76svh * 0.8)); margin-inline: auto; }
[data-state="nothing"] .step__figure .plate__frame, .step__figure[data-state="nothing"] .plate__frame { width: 100%; height: 28vh; height: 28svh; max-height: 28vh; max-height: 28svh; }
.step__docket { margin-top: var(--s-7); }
.step__docket .doc { max-width: 40rem; }
/* the code, at the slip's printed head: outside the ruled docket, above RECEIVED */
.step__code { display: block; margin: 0 0 var(--s-4); padding-bottom: 0.8rem; font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink-faint);
  background-image: radial-gradient(circle, color-mix(in srgb, var(--lampblack) 70%, transparent) 0 1.6px, transparent 2px); background-size: 11px 5px; background-position: 3px 100%; background-repeat: repeat-x; }
.step__controls { display: flex; flex-wrap: wrap; gap: var(--s-3) var(--s-5); margin-top: var(--s-5); font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; }
[data-state="nothing"] .step__controls { display: none; }
/* the address, when the clipboard is refused: a selectable field, ruled like a slip's */
.step__controls input { display: block; width: 100%; margin-top: var(--s-3); padding: 0.3em 0; border: 0; border-bottom: var(--rule-hair) solid var(--hair); border-radius: 0; background: transparent; font-family: var(--f-mono); font-size: var(--t-small); letter-spacing: 0; text-transform: none; color: var(--ink); }
/* burning, in two taps, at the foot of the pocket fold: the word, then Burn them beside Leave them */
.step__burn { display: flex; flex-wrap: wrap; gap: var(--s-3) var(--s-5); margin-top: var(--s-5); padding-top: var(--s-4); border-top: var(--rule-hair) solid var(--hair); font-family: var(--f-mono); font-size: var(--t-micro); letter-spacing: 0.1em; text-transform: uppercase; }
.step__burn .is-armed, .step__burn [aria-pressed="true"] { color: var(--accent); border-bottom-color: var(--accent); }

/* 14. UTILITIES -------------------------------------------------------------- */
.visually-hidden { position: absolute !important; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.text-right { text-align: right; } .text-centre { text-align: center; }
.push-right { margin-left: auto; } .centre { margin-inline: auto; }
.measure { max-width: var(--measure); } .measure--narrow { max-width: 22rem; }
.mt-0 { margin-top: 0 !important; } .mt-s { margin-top: var(--s-4); } .mt-m { margin-top: var(--s-6); } .mt-l { margin-top: var(--s-8); } .mt-xl { margin-top: var(--s-9); }
.mb-s { margin-bottom: var(--s-4); } .mb-m { margin-bottom: var(--s-6); } .mb-l { margin-bottom: var(--s-8); }
.rule-top { border-top: var(--rule-hair) solid var(--line); padding-top: var(--s-3); } .rule-top--heavy { border-top: var(--rule-heavy) solid var(--line); padding-top: var(--s-4); }
.upper { text-transform: uppercase; }
.sticky-top { position: sticky; top: calc(var(--header-h) + var(--s-4)); }
@media (max-width: 47.99rem) { .hide-narrow { display: none !important; } }
@media (min-width: 48rem) { .hide-wide { display: none !important; } }

/* 15. THE COLOURS — the one place on this site where the grey breaks ---------
   The law above holds everywhere else: tide colours plus iodine, and no gradient
   used as ornament. This is not ornament. In Ossel an elver opens, and patterned
   light comes off its back and shoulders and unfolds round a person until they
   are standing inside it. A page has to do that once or it is only telling you.

   ONE PRIMITIVE, and the only animated gradient the house permits (CONTRACT A5).
   The story's beat, the openings next door and the house's plate all call it;
   house.css keeps a scoped copy, since the door does not load this file.

     <div class="colours" aria-hidden="true"><i></i><i></i><i></i></div>

   inside a host that is position: relative and isolation: isolate (.room--colours,
   the story's beat, an opening fold's summary). It fills the host and sits under
   its content. Three layers: the weave, warp and weft many times enlarged; the
   long streaks and rings of a horn plate held up to a lamp; the distance in it.

   NO NEW COLOUR VALUES. Every layer is built from the site's own inks (iodine and
   its deep, buff, tissue, the Handist mimeo) put through saturate() and a slow
   full turn of hue-rotate(), so nothing on screen is a value the palette does not
   hold and nothing on screen is a colour the palette can name. The copy never
   names one. The page sets three things and nothing else:
     --colours-blend    screen (default; on lampblack) or multiply (on paper)
     --colours-mask     where the light is: it has a middle, and it is gone at the edges
     --colours-opacity  how much of it there is
   The edges settle into the host's own paper, so the corners stay what they were.
   All motion stops under prefers-reduced-motion; the pattern stays, because the
   pattern is not the motion. Nothing here prints. ------------------------------ */
.colours { position: absolute; inset: 0; z-index: -1; overflow: hidden; pointer-events: none; opacity: var(--colours-opacity, 1);
  -webkit-mask-image: var(--colours-mask, linear-gradient(to bottom, transparent 0%, var(--lampblack) 16%, var(--lampblack) 82%, transparent 100%));
  mask-image: var(--colours-mask, linear-gradient(to bottom, transparent 0%, var(--lampblack) 16%, var(--lampblack) 82%, transparent 100%)); }
/* the edges settle, so the room has a middle and the corners keep the host's paper */
.colours::after { content: ""; position: absolute; inset: 0; background: radial-gradient(130% 78% at 58% 40%, transparent 0 30%, color-mix(in srgb, var(--colours-edge, var(--paper)) 82%, transparent) 100%); }
.colours > i { position: absolute; inset: -35%; display: block; mix-blend-mode: var(--colours-blend, screen); }
/* 1. the weave: a shed's worth of cloth across the width of a road, the two runs out of square as a hand loom is */
.colours > i:nth-child(1) {
  background-image:
    repeating-linear-gradient(84deg, transparent 0 16px, color-mix(in srgb, var(--iodine) 88%, transparent) 34px 52px, transparent 70px 88px),
    repeating-linear-gradient(19deg, transparent 0 40px, color-mix(in srgb, var(--mimeo) 92%, transparent) 96px 150px, transparent 206px 262px),
    repeating-linear-gradient(11deg, transparent 0 6px, color-mix(in srgb, var(--buff) 40%, transparent) 11px 15px, transparent 20px 27px);
  opacity: 0.5; filter: saturate(2.6) hue-rotate(0deg) blur(3px); animation: colours-weave 112s linear infinite; }
/* 2. the long smoke-streaks and the rings of a horn plate held up to a lamp */
.colours > i:nth-child(2) {
  background-image:
    repeating-linear-gradient(7deg, transparent 0 90px, color-mix(in srgb, var(--buff) 80%, transparent) 150px 250px, transparent 320px 430px),
    repeating-radial-gradient(150% 110% at 56% 44%, color-mix(in srgb, var(--iodine) 90%, transparent) 0 130px, transparent 210px 430px);
  opacity: 0.55; filter: saturate(2.2) hue-rotate(40deg) blur(34px); animation: colours-horn 137s ease-in-out infinite alternate; }
/* 3. the distance in it: the layer that is not a surface */
.colours > i:nth-child(3) {
  background-image: radial-gradient(78% 60% at 60% 40%,
    color-mix(in srgb, var(--tissue) 96%, transparent) 0%,
    color-mix(in srgb, var(--iodine) 78%, transparent) 30%,
    color-mix(in srgb, var(--iodine-deep) 42%, transparent) 52%,
    transparent 76%);
  opacity: 0.62; filter: saturate(2.8) hue-rotate(205deg) blur(26px); animation: colours-deep 119s ease-in-out infinite alternate; }
@keyframes colours-weave {
  0%   { filter: saturate(2.6) hue-rotate(0deg) blur(3px);   background-position: 0 0, 0 0, 0 0; }
  50%  { filter: saturate(3) hue-rotate(180deg) blur(5px);   background-position: 210px -150px, -180px 210px, 90px 60px; }
  100% { filter: saturate(2.6) hue-rotate(360deg) blur(3px); background-position: 420px -300px, -360px 420px, 180px 120px; }
}
@keyframes colours-horn {
  from { filter: saturate(2.2) hue-rotate(40deg) blur(34px);  transform: translate3d(0, 0, 0) scale(1); }
  to   { filter: saturate(2.6) hue-rotate(260deg) blur(48px); transform: translate3d(4%, -3%, 0) scale(1.16); }
}
@keyframes colours-deep {
  from { filter: saturate(2.8) hue-rotate(205deg) blur(26px); transform: scale(1); opacity: 0.52; }
  to   { filter: saturate(2.3) hue-rotate(475deg) blur(38px); transform: scale(1.3); opacity: 0.7; }
}
/* a narrow screen holds less of it, so it is turned up a little */
@media (max-width: 48rem) { .colours > i:nth-child(1) { opacity: 0.58; } }
@media (prefers-reduced-motion: reduce) { .colours > i { animation: none; } }
@media print { .colours { display: none !important; } }

/* 16. MOTION ---------------------------------------------------------------- */
/* one movement only: things arrive, 12px, once. html.js is set by shell.js; without JS nothing is hidden. */
html.js .reveal { opacity: 0; transform: translateY(12px); transition: opacity 0.9s var(--ease), transform 0.9s var(--ease); }
html.js .reveal.is-seen { opacity: 1; transform: none; }
html.js .reveal.plate--askew.is-seen .plate__frame { transform: rotate(-0.6deg); }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
  html.js .reveal { opacity: 1; transform: none; }
}

/* 17. PRINT: the site prints as a finding aid ------------------------------- */
@media print {
  :root { --paper: #fff; --ink: #000; --ink-soft: #222; --ink-faint: #555; --hair: #999; --line: #000; }
  body { background: #fff; color: #000; font-size: 10.5pt; } body::after { display: none; }
  .shell-header, .shell-footer__name, .skip-link, .btn, .strip { display: none !important; }
  .shell-footer { background: #fff; color: #000; }
  .room { padding-block: 1.5rem; background: #fff !important; color: #000 !important; min-height: 0 !important; }
  .void { display: none; }
  .plate, .thread, .spec > div, .timeline > li, .vocab > div, .beat { break-inside: avoid; }
  html.js .reveal { opacity: 1 !important; transform: none !important; }
  a[href^="http"]::after, a[href^="mailto"]::after { content: " (" attr(href) ")"; font-family: var(--f-mono); font-size: 0.8em; }
}
