/* ══ Windrose manufacturing — folded into the main design system ═══════
   Manufacturing used to be its own design series: five private palettes
   (694 station manuals on #1e5fbf/#f2f4f7, the taxonomy index on
   #0b5ed7/#f5f7fa, flow.css on #155f90, steps-3d.css on #175f96 and the
   .mfg-langs bar on dark navy #0d1f38), its own Microsoft-YaHei type
   stack, its own gradient masthead, and its own topbar injected by
   manual-chrome.js — which site-nav.js deliberately steps aside for, so
   the real windrose.ai header never appeared on these pages at all.

   There is now one stylesheet, and every value in it comes from
   /windrose.css. Link that first; this file only consumes --wr-* tokens
   and adds no colours of its own. Scope: .mfg-manual (a station manual),
   .mfg-index (a taxonomy/station index), and the shared chrome.
   ════════════════════════════════════════════════════════════════════ */

/* ── shared chrome ──────────────────────────────────────────────── */

/* Space for the fixed 44px topbar + 44px nav is already reserved by
   /site-nav.css (body{padding-top:88px}); do not add it a second time. */

/* The language bar. These are real navigation — each language is a
   separate file under /manufacturing/manual/<lang>/ — so the topbar's
   own in-place language switch cannot replace them. It is a light rail
   in the system palette now, not a dark navy band of its own. */
.mfg-langs{
  display:flex; flex-wrap:wrap; gap:var(--wr-2); align-items:center;
  background:var(--wr-rail); border-bottom:1px solid var(--wr-rule);
  padding:var(--wr-3) var(--wr-5);
  font-family:var(--wr-body); font-size:var(--wr-fs-sm);
}
.mfg-langs .mfg-langs-icon{color:var(--wr-ink-faint); margin-right:var(--wr-2)}
.mfg-langs a{
  color:var(--wr-ink-muted); text-decoration:none; white-space:nowrap;
  padding:var(--wr-1) var(--wr-4);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-pill);
}
.mfg-langs a:hover{border-color:var(--wr-accent); color:var(--wr-accent)}
.mfg-langs a[aria-current="page"]{
  background:var(--wr-accent); border-color:var(--wr-accent); color:#fff;
}

/* ── station manual pages (.mfg-manual) ─────────────────────────── */

/* Same house treatment as .mfg-index: the site's dark ground, the site's
   heading, and the document itself in a light sheet. One rule covers all ~700
   station pages and their 19 editions. */
body.mfg-manual{
  margin:0; background:var(--house-dark); color:var(--wr-ink);
  font-family:var(--wr-body); line-height:var(--wr-lh);
  -webkit-font-smoothing:antialiased;
}
/* was a three-stop blue gradient; the system has one masthead band */
.mfg-manual header.top{
  background:transparent; color:#fff;
  padding:var(--wr-8) var(--wr-7) var(--wr-7); text-align:left;
  max-width:1240px; margin:0 auto;
}
.mfg-manual header.top h1{
  margin:0 0 var(--wr-3); font-family:var(--wr-display); font-weight:700;
  font-size:clamp(20px,3.2vw,2.4rem); line-height:var(--wr-lh-tight); color:#fff;
}
.mfg-manual header.top p{
  margin:0; color:var(--house-muted); font-size:var(--wr-fs-cap);
  max-width:88ch; line-height:1.5;
}
/* The 3D viewer, opened inside the operation it belongs to rather than in
   another tab. Built on first click — 234 operations must not mean 234 frames. */
.op-3d-toggle{
  padding:var(--wr-2) var(--wr-4); border:1px solid var(--wr-rule-strong);
  border-radius:var(--wr-r); background:var(--wr-card); color:var(--wr-accent);
  font-family:var(--wr-display); font-size:var(--wr-fs-sm); cursor:pointer;
}
.op-3d-toggle:hover{border-color:var(--wr-accent)}
.op-3d-toggle.open{background:var(--wr-accent-tint); border-color:var(--wr-accent)}
.op-3d{margin:var(--wr-4) 0 var(--wr-2)}
.op-3d[hidden]{display:none}
.op-3d iframe{
  width:100%; height:min(62vh,520px); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r); background:var(--wr-card); display:block;
}
@media print{ .op-3d{display:none !important} }

/* Operation steps. They used to be one run-on paragraph — "Step 10 … Step 20 …"
   — which is how the process cards read but not how anyone works from them. The
   numbers are the card's own (10, 20, 30), so they are printed, not generated. */
.steps{list-style:none; margin:var(--wr-4) 0 var(--wr-6); padding:0}
.steps li{
  display:grid; grid-template-columns:2.6rem 1fr; gap:var(--wr-4);
  padding:var(--wr-3) 0; border-top:1px solid var(--wr-rule-soft); line-height:1.65;
}
.steps li:first-child{border-top:0}
.steps .n{
  font-family:var(--wr-mono,var(--wr-display)); font-size:var(--wr-fs-sm);
  color:var(--wr-accent); font-weight:600; text-align:right; padding-top:.15em;
}
@media(max-width:640px){
  .steps li{grid-template-columns:2.1rem 1fr; gap:var(--wr-3)}
}
/* the document sheet */
.mfg-manual .wrap{
  max-width:1000px; margin:0 auto 64px; padding:var(--wr-8) var(--wr-7) 56px;
  background:var(--wr-page); color:var(--wr-ink); border-radius:var(--wr-r-lg);
}
.mfg-manual .sec-title{
  font-family:var(--wr-display); font-weight:600; font-size:var(--wr-fs-h3);
  color:var(--wr-ink); margin:var(--wr-8) 0 var(--wr-5);
  padding-left:var(--wr-4); border-left:4px solid var(--wr-accent);
}
.mfg-manual .sub-head{
  font-size:var(--wr-fs-cap); font-weight:700; color:var(--wr-accent);
  margin:var(--wr-7) 0 var(--wr-4); letter-spacing:.3px;
}
.mfg-manual .block,
.mfg-manual .parts{
  background:var(--wr-card); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); padding:var(--wr-5) var(--wr-6); margin:var(--wr-4) 0;
}
.mfg-manual .parts{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr));
  gap:var(--wr-4) var(--wr-6);
}
.mfg-manual .zh{color:var(--wr-ink)}
.mfg-manual .en{color:var(--wr-ink-muted); margin-top:var(--wr-2)}
.mfg-manual .parts .en{margin-top:0}
.mfg-manual .step{display:flex; gap:var(--wr-4); margin:var(--wr-3) 0}
.mfg-manual .step .zh,.mfg-manual .step .en{flex:1}
.mfg-manual .tools{display:flex; flex-wrap:wrap; gap:var(--wr-4); margin:var(--wr-4) 0}
.mfg-manual .tool{
  background:var(--wr-card); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-pill); padding:var(--wr-3) var(--wr-6);
  font-size:var(--wr-fs-cap);
}
.mfg-manual .tool .en{color:var(--wr-ink-muted); margin-top:0}
/* the manuals' own warning colour is the system warn triple */
.mfg-manual .qc{
  background:var(--wr-warn); border:1px solid var(--wr-warn-line);
  color:var(--wr-warn-ink); border-radius:var(--wr-r-lg);
  padding:var(--wr-5) var(--wr-6); margin:var(--wr-4) 0;
}
.mfg-manual .gallery{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  gap:var(--wr-5); margin:var(--wr-5) 0;
}
.mfg-manual .gallery figure{
  margin:0; background:var(--wr-card); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); overflow:hidden; cursor:zoom-in;
}
.mfg-manual .gallery img{width:100%; height:auto; display:block}
.mfg-manual .gallery figcaption{
  padding:var(--wr-4) var(--wr-5); font-size:var(--wr-fs-sm); color:var(--wr-ink-muted);
}
.mfg-manual footer{
  color:var(--wr-ink-muted); font-size:var(--wr-fs-sm);
  text-align:center; padding:var(--wr-7);
}
.mfg-manual .toc{display:flex; flex-wrap:wrap; gap:var(--wr-3); margin:var(--wr-5) 0}
.mfg-manual .toc a{
  text-decoration:none; font-size:var(--wr-fs-sm); background:var(--wr-card);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-pill);
  padding:var(--wr-2) var(--wr-5); color:var(--wr-accent);
}
.mfg-manual .toc a:hover{border-color:var(--wr-accent)}

/* reference-illustration galleries appended by the photo pipeline */
.mfg-manual .zzgal{max-width:880px; margin:var(--wr-6) auto var(--wr-8); padding:0 var(--wr-6)}
.mfg-manual .zzop{margin:var(--wr-6) 0 var(--wr-3); font-weight:700; font-size:var(--wr-fs-body)}
.mfg-manual .zzop code{
  font-family:var(--wr-mono); font-size:.8em;
  color:var(--wr-ink-faint); margin-right:.6em;
}
.mfg-manual .zzgrid{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr)); gap:var(--wr-5);
}
.mfg-manual .zzgrid img{
  width:100%; height:auto; display:block;
  border:1px solid var(--wr-rule); border-radius:var(--wr-r); background:var(--wr-card);
}

/* lightbox */
#lb{
  position:fixed; inset:0; background:rgba(0,0,0,.88); display:none;
  align-items:center; justify-content:center; z-index:99; cursor:zoom-out;
}
#lb.show{display:flex}
#lb img{max-width:92vw; max-height:92vh; border-radius:var(--wr-r)}

/* ── taxonomy / station index pages (.mfg-index) ────────────────── */

/* HOUSE STYLE.
   This section used to be the only part of windrose.ai on a light page: a grey
   ground with white cards, a centred hero, pill buttons. Everything a visitor
   sees — technology, certification, about — is the dark navy ground of
   styles.css with a left-aligned condensed heading, a blue eyebrow and the
   content held in light sheets.
   The furniture matches that now. The document itself stays light, because it
   is 1,461 procedural steps that people read and print, and because the house
   style already does exactly this: technology.html is a dark page holding light
   content cards. So: dark ground, house heading, light sheets. */
:root{
  --house-dark:#060f1e;      /* styles.css --dark   */
  --house-dark2:#0a1a30;     /* styles.css --dark2  */
  --house-accent:#4a9eff;    /* styles.css --accent */
  --house-ink:#f0f4ff;       /* styles.css --off    */
  --house-muted:#7a9abf;     /* styles.css --muted  */
}
body.mfg-index{
  margin:0; background:var(--house-dark); color:var(--wr-ink);
  font-family:var(--wr-body); line-height:var(--wr-lh);
  -webkit-font-smoothing:antialiased;
}
.mfg-index main{max-width:1240px; margin:0 auto; padding:0 0 80px}
/* The hero is the site's, not a document's: left-aligned on the dark ground. */
.mfg-index .hero{
  text-align:left; padding:var(--wr-8) var(--wr-7) var(--wr-8);
  max-width:1240px; margin:0 auto;
}
.mfg-index .eyebrow{
  font-family:var(--wr-display); font-size:var(--wr-fs-cap);
  letter-spacing:var(--wr-track); text-transform:uppercase;
  color:var(--house-accent); margin:0 0 var(--wr-3);
}
.mfg-index h1{
  font-family:var(--wr-display); font-weight:700;
  font-size:clamp(1.9rem,4vw,2.6rem); line-height:var(--wr-lh-tight);
  margin:0 0 var(--wr-4); color:#fff;
}
.mfg-index .hero p{max-width:760px; margin:0; color:var(--house-muted); font-size:var(--wr-fs-lead)}
/* Every working section is a light sheet on that ground — the same move the
   house style makes for its media and spec cards. */
.mfg-index > main > section:not(.hero),
.mfg-index .floorplan, .mfg-index .toolbar, .mfg-index .taxonomy,
.mfg-index .eol, .mfg-index .upstream{
  background:var(--wr-page); color:var(--wr-ink);
  border-radius:var(--wr-r-lg);
}
.mfg-index > main > section:not(.hero){
  max-width:1180px; margin:0 auto var(--wr-6); padding:var(--wr-7);
}

.mfg-index .grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:var(--wr-6)}
.mfg-index .card{
  display:block; background:var(--wr-card); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); padding:var(--wr-7); text-decoration:none;
  color:var(--wr-ink); transition:border-color .15s, box-shadow .15s, transform .15s;
}
.mfg-index .card:hover{
  border-color:var(--wr-accent); box-shadow:var(--wr-shadow); transform:translateY(-2px);
}
.mfg-index .code{
  font-family:var(--wr-display); font-weight:700; letter-spacing:.06em;
  color:var(--wr-accent); font-size:var(--wr-fs-lead);
}
.mfg-index .title{font-weight:500; margin:var(--wr-3) 0 0; font-size:var(--wr-fs-body)}
.mfg-index .sub{color:var(--wr-ink-muted); font-size:var(--wr-fs-cap); margin-top:var(--wr-2)}
.mfg-index .note{margin-top:var(--wr-8); font-size:var(--wr-fs-cap); color:var(--wr-ink-muted)}
.mfg-index .note a{color:var(--wr-accent); text-decoration:none}
.mfg-index .note a:hover{text-decoration:underline}
@media (max-width:640px){
  .mfg-index h1{font-size:2rem}
  .mfg-index main{padding:var(--wr-8) var(--wr-6) 60px}
}

/* ── end of line: the twelve release stages ──────────────────────
   These had names and nothing else until the controlled commissioning
   document was connected to them. Each card opens to its own clauses. */

.mfg-index .eol{margin-top:var(--wr-9)}
.mfg-index .eol h2{
  margin:0 0 var(--wr-4); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h2); line-height:var(--wr-lh-tight); color:var(--wr-ink);
}
.mfg-index .eol-lede{margin:0 0 var(--wr-4); color:var(--wr-ink-muted); font-size:var(--wr-fs-cap); line-height:1.6; max-width:88ch}
.mfg-index .eol-source{
  margin:0 0 var(--wr-6); padding:var(--wr-3) var(--wr-5);
  border-left:3px solid var(--wr-accent); background:var(--wr-rail);
  color:var(--wr-ink); font-size:var(--wr-fs-sm);
}
.mfg-index .eol-grid{display:grid; gap:var(--wr-4)}
.mfg-index .eol-card{background:var(--wr-card); border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg)}
.mfg-index .eol-card.calibration{border-left:3px solid var(--wr-accent)}
.mfg-index .eol-card.inspection{border-left:3px solid var(--wr-rule-strong)}
.mfg-index .eol-card>summary{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--wr-3) var(--wr-5);
  padding:var(--wr-5) var(--wr-6); cursor:pointer; list-style:none;
}
.mfg-index .eol-card>summary::-webkit-details-marker{display:none}
.mfg-index .eol-id{font-family:var(--wr-mono); font-size:var(--wr-fs-cap); color:var(--wr-accent); letter-spacing:.04em}
.mfg-index .eol-kind{
  font-family:var(--wr-display); font-size:var(--wr-fs-micro);
  letter-spacing:var(--wr-track); text-transform:uppercase; color:var(--wr-ink-faint);
}
.mfg-index .eol-card summary strong{font-size:var(--wr-fs-cap); font-weight:600}
.mfg-index .eol-zh{color:var(--wr-ink-muted); font-size:var(--wr-fs-sm)}
.mfg-index .eol-spec{
  padding:var(--wr-1) var(--wr-3); border-radius:var(--wr-r-sm);
  background:var(--wr-accent-tint); color:var(--wr-accent);
  font-family:var(--wr-mono); font-size:var(--wr-fs-sm);
}
.mfg-index .eol-clause{margin-left:auto; color:var(--wr-ink-faint); font-family:var(--wr-mono); font-size:var(--wr-fs-micro); white-space:nowrap}
.mfg-index .eol-body{padding:0 var(--wr-6) var(--wr-6); border-top:1px solid var(--wr-rule)}
.mfg-index .eol-seq{margin:var(--wr-5) 0 0; color:var(--wr-ink-muted); font-size:var(--wr-fs-cap); line-height:1.6}
.mfg-index .eol-group{margin-top:var(--wr-5)}
.mfg-index .eol-group h4{
  margin:0 0 var(--wr-3); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-cap); color:var(--wr-ink);
}
.mfg-index .eol-params{
  display:grid; grid-template-columns:minmax(160px,auto) 1fr;
  gap:var(--wr-2) var(--wr-6); margin:var(--wr-5) 0 0;
}
.mfg-index .eol-group .eol-params{margin-top:0}
.mfg-index .eol-params dt{font-size:var(--wr-fs-sm); color:var(--wr-ink-muted)}
.mfg-index .eol-params dd{margin:0; font-family:var(--wr-mono); font-size:var(--wr-fs-sm); color:var(--wr-ink)}
.mfg-index .eol-checks{margin:var(--wr-5) 0 0; padding-left:var(--wr-7); display:grid; gap:var(--wr-3)}
.mfg-index .eol-checks li{font-size:var(--wr-fs-cap); line-height:1.6; color:var(--wr-ink)}
.mfg-index .eol-warn{
  margin:var(--wr-5) 0 0; padding:var(--wr-4) var(--wr-5); border-radius:var(--wr-r);
  border:1px solid var(--wr-warn-line); background:var(--wr-warn); color:var(--wr-warn-ink);
  font-size:var(--wr-fs-sm); line-height:1.6;
}
.mfg-index .eol-also-title{
  margin:var(--wr-8) 0 var(--wr-4); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h3); color:var(--wr-ink);
}
.mfg-index .eol-also{display:grid; gap:var(--wr-4)}
.mfg-index .eol-also-item{
  padding:var(--wr-5) var(--wr-6); background:var(--wr-rail);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg);
}
.mfg-index .eol-also-item strong{display:block; font-size:var(--wr-fs-cap)}
.mfg-index .eol-also-item span{display:block; margin-top:var(--wr-2); color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); line-height:1.6}
.mfg-index .eol-glossary{margin-top:var(--wr-6); background:var(--wr-card); border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg)}
.mfg-index .eol-glossary>summary{padding:var(--wr-4) var(--wr-5); font-size:var(--wr-fs-cap); cursor:pointer}
.mfg-index .eol-glossary dl{display:grid; grid-template-columns:auto 1fr; gap:var(--wr-2) var(--wr-5); margin:0; padding:0 var(--wr-5) var(--wr-5)}
.mfg-index .eol-glossary dt{font-family:var(--wr-mono); font-size:var(--wr-fs-sm); color:var(--wr-accent)}
.mfg-index .eol-glossary dd{margin:0; font-size:var(--wr-fs-sm); color:var(--wr-ink-muted)}
.mfg-index .eol-note{margin:var(--wr-6) 0 0; color:var(--wr-ink-faint); font-size:var(--wr-fs-sm); line-height:1.6; max-width:88ch}

/* ── the floor plan, shared by the index pages and the flow page ── */

.floorplan{max-width:min(1680px, 100%); margin:var(--wr-7) auto var(--wr-4); padding:0 var(--wr-7)}
.fp-head h2{
  margin:0 0 var(--wr-3); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h2); line-height:var(--wr-lh-tight); color:var(--wr-ink);
}
.fp-head p{margin:0 0 var(--wr-5); color:var(--wr-ink-muted); font-size:var(--wr-fs-cap); line-height:1.55; max-width:82ch}
.fp-stage{
  position:relative; border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); overflow:hidden; background:#dbe8ef;
}
#floorPlanCanvas{display:block; width:100%; height:min(82vh, 960px); min-height:720px; cursor:grab}
#floorPlanCanvas:active{cursor:grabbing}
.fp-hint,.fp-status{
  position:absolute; padding:var(--wr-3) var(--wr-5); border-radius:var(--wr-r);
  background:rgba(26,35,50,.82); color:var(--wr-mast-ink);
  font-size:var(--wr-fs-micro); pointer-events:none;
}
.fp-hint{left:var(--wr-6); bottom:var(--wr-6)}
.fp-status{left:var(--wr-6); top:var(--wr-6)}
/* Three lines, as buttons. The 3D plates say the same thing; this row is the
   keyboard-reachable version. */
.fp-sections{display:flex; flex-wrap:wrap; align-items:center; gap:var(--wr-4); margin:0 0 var(--wr-5)}
.fp-arrow{color:var(--wr-ink-faint); font-size:var(--wr-fs-sm); white-space:nowrap}
.fp-sec{
  font:inherit; text-align:left; cursor:pointer; min-width:180px;
  padding:var(--wr-4) var(--wr-5);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg);
  background:var(--wr-card); color:var(--wr-ink);
}
.fp-sec:hover{border-color:var(--wr-accent)}
.fp-sec[aria-pressed="true"]{border-color:var(--wr-accent); background:var(--wr-accent-tint); color:var(--wr-accent)}
.fp-sec strong{display:block; font-size:var(--wr-fs-cap); font-weight:600}
.fp-sec span{display:block; margin-top:var(--wr-1); font-size:var(--wr-fs-sm); color:var(--wr-ink-muted)}
.fp-sec[aria-pressed="true"] span{color:inherit}
.fp-chess{
  order:1; margin-left:auto;
  font:inherit; text-align:left; cursor:pointer; min-width:132px;
  padding:var(--wr-4) var(--wr-5);
  border:1px dashed var(--wr-rule); border-radius:var(--wr-r-lg);
  background:transparent; color:var(--wr-ink);
}
.fp-chess:hover{border-color:var(--wr-accent)}
.fp-chess[aria-pressed="true"]{border-style:solid; border-color:var(--wr-accent); background:var(--wr-accent-tint); color:var(--wr-accent)}
.fp-chess strong{display:block; font-size:var(--wr-fs-cap); font-weight:600}
.fp-chess span{display:block; margin-top:var(--wr-1); font-size:var(--wr-fs-sm); color:var(--wr-ink-muted)}
.fp-square{
  position:absolute; right:var(--wr-6); bottom:var(--wr-6); z-index:2;
  min-width:3.2em; padding:var(--wr-3) var(--wr-4);
  background:rgba(255,255,255,.94); border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:1.35rem; font-weight:700;
  letter-spacing:.04em; color:var(--wr-ink); pointer-events:none;
}
.fp-square[hidden]{display:none}
.fp-legend{
  position:absolute; left:var(--wr-6); bottom:var(--wr-6); z-index:2;
  display:flex; flex-wrap:wrap; gap:var(--wr-3) var(--wr-5);
  max-width:min(640px, calc(100% - 2 * var(--wr-6)));
  padding:var(--wr-3) var(--wr-4);
  background:rgba(255,255,255,.94); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); pointer-events:none;
}
.fp-leg{display:flex; align-items:center; gap:var(--wr-2); font-size:var(--wr-fs-sm); color:var(--wr-ink)}
.fp-leg i{width:.7em; height:.7em; border-radius:2px; display:inline-block}

/* the breadcrumb, shown only while a section of the floor is open */
.fp-crumb{
  position:absolute; left:var(--wr-6); top:var(--wr-6); z-index:2;
  display:flex; align-items:flex-start; gap:var(--wr-5);
  max-width:min(760px, calc(100% - 2 * var(--wr-6)));
  padding:var(--wr-4) var(--wr-5);
  background:rgba(255,255,255,.94); border:1px solid var(--wr-rule);
  border-radius:var(--wr-r-lg); box-shadow:var(--wr-shadow);
}
.fp-crumb[hidden]{display:none}
.fp-crumb button{
  flex:0 0 auto; font:inherit; font-size:var(--wr-fs-sm);
  padding:var(--wr-2) var(--wr-4); cursor:pointer;
  border:1px solid var(--wr-rule-strong); border-radius:var(--wr-r);
  background:var(--wr-card); color:var(--wr-ink-muted);
}
.fp-crumb button:hover{border-color:var(--wr-accent); color:var(--wr-accent)}
.fp-crumb strong{display:block; font-size:var(--wr-fs-cap); color:var(--wr-ink)}
.fp-crumb span{display:block; margin-top:var(--wr-1); font-size:var(--wr-fs-sm); color:var(--wr-ink-muted); line-height:1.45}
/* the status pill would sit under the breadcrumb */
.fp-crumb:not([hidden]) ~ .fp-status{display:none}

/* ── the station panel, over the plan ────────────────────────────
   Clicking a marker used to scroll the page down to the taxonomy, which
   threw away the view you were reading the plan in. The station now opens
   here instead, as a scrollable sheet on top of the canvas. */
/* Walk the three lines one at a time, west to east. */
/* The building drawing's own contents, kept out of the 3D view. */
.fp-building{margin:var(--wr-5) 0 0; border:1px solid var(--wr-rule); border-radius:var(--wr-r); background:var(--wr-card)}
.fp-building>summary{padding:var(--wr-4) var(--wr-5); cursor:pointer; font-family:var(--wr-display); font-weight:600; color:var(--wr-ink)}
.fp-building[open]>summary{border-bottom:1px solid var(--wr-rule)}
.fp-building>div{padding:var(--wr-4) var(--wr-6) var(--wr-6)}
.fp-building h4{margin:var(--wr-5) 0 var(--wr-2); font-family:var(--wr-display); font-size:var(--wr-fs-sm); text-transform:uppercase; letter-spacing:.06em; color:var(--wr-accent)}
.fp-building-note{margin:0 0 var(--wr-3); color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); line-height:1.55; max-width:88ch}
.fp-building-list{margin:0; padding-left:var(--wr-5); columns:2; column-gap:var(--wr-7); color:var(--wr-ink); font-size:var(--wr-fs-sm); line-height:1.7}
@media(max-width:850px){ .fp-building-list{columns:1} }

/* Upstream: the China body shop. Deliberately quieter than the Antwerp lines —
   these stations are documented context, not work done on this floor. */
.upstream{margin:var(--wr-8) 0 0}
.upstream h2{
  margin:0 0 var(--wr-4); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h2); line-height:var(--wr-lh-tight); color:var(--wr-ink);
}
.upstream-lede{margin:0 0 var(--wr-5); max-width:88ch; color:var(--wr-ink-muted); line-height:1.6}
.upstream-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); gap:var(--wr-3)}
.upstream-card{
  display:flex; flex-direction:column; gap:var(--wr-2);
  padding:var(--wr-4) var(--wr-5); text-decoration:none;
  background:var(--wr-rail); border:1px solid var(--wr-rule); border-radius:var(--wr-r);
}
.upstream-card:hover{border-color:var(--wr-accent); background:var(--wr-card)}
.upstream-card strong{font-weight:600; color:var(--wr-ink); line-height:1.35}
/* .station-code is sized for the taxonomy header, where it sits on its own row;
   inside a card it rendered full width and read as an empty input. */
.upstream-card .station-code{align-self:flex-start; width:auto; padding:2px 8px; font-size:12px}
.upstream-note{margin:var(--wr-5) 0 0; max-width:88ch; color:var(--wr-ink-faint); font-size:var(--wr-fs-sm); line-height:1.6}

/* A published claim that turned out to be wrong: shown, not deleted. */
.eol-correction{
  margin:var(--wr-4) 0 0; padding:var(--wr-4) var(--wr-5);
  border-left:3px solid var(--wr-accent); background:var(--wr-rail);
  color:var(--wr-ink); font-size:var(--wr-fs-sm); line-height:1.6;
}

.fp-step{display:flex; align-items:center; gap:var(--wr-3); margin-left:auto; flex:0 0 auto}
.fp-step button{
  padding:var(--wr-2) var(--wr-4); border:1px solid var(--wr-rule-strong);
  border-radius:var(--wr-r); background:var(--wr-card); color:var(--wr-ink);
  font-family:var(--wr-display); font-size:var(--wr-fs-sm); cursor:pointer;
}
.fp-step button:hover:not(:disabled){border-color:var(--wr-accent); color:var(--wr-accent)}
.fp-step button:disabled{opacity:.4; cursor:default}
.fp-step span{color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); white-space:nowrap}
@media(max-width:850px){ .fp-step{display:none} }

.fp-panel{
  position:absolute; top:0; right:0; bottom:0;
  width:min(460px, 64%); display:flex; flex-direction:column;
  background:var(--wr-card); border-left:1px solid var(--wr-rule);
  box-shadow:-8px 0 24px rgba(26,35,50,.18); z-index:3;
}
/* display:flex above would otherwise beat the hidden attribute */
.fp-panel[hidden]{display:none}
.fp-panel-head{
  display:flex; align-items:flex-start; gap:var(--wr-5);
  padding:var(--wr-6); border-bottom:1px solid var(--wr-rule);
  background:var(--wr-rail);
}
.fp-panel-line{
  margin:0 0 var(--wr-2); font-family:var(--wr-display);
  font-size:var(--wr-fs-sm); letter-spacing:.06em; text-transform:uppercase;
  color:var(--wr-ink-muted);
}
.fp-panel-line strong{font-weight:600; color:var(--wr-accent)}
.fp-panel-line[hidden]{display:none}
.fp-panel-head h3{
  margin:0; font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h3); line-height:var(--wr-lh-tight); color:var(--wr-ink);
}
.fp-panel-head p{margin:var(--wr-3) 0 0; display:flex; flex-wrap:wrap; align-items:center; gap:var(--wr-4)}
.fp-panel-zh{color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); line-height:1.5}
#fpPanelClose{
  margin-left:auto; flex:0 0 auto; width:30px; height:30px; padding:0;
  border:1px solid var(--wr-rule-strong); border-radius:var(--wr-r);
  background:var(--wr-card); color:var(--wr-ink-muted);
  font-size:20px; line-height:1; cursor:pointer;
}
#fpPanelClose:hover{border-color:var(--wr-accent); color:var(--wr-accent)}
.fp-panel-body{flex:1; overflow-y:auto; padding:var(--wr-5) var(--wr-6) var(--wr-7)}
/* inside the panel the station is already named by the header above */
.fp-panel-body .station-group{background:none; border:0; border-radius:0}
.fp-panel-body .station-content{padding:0}
.fp-panel-body .gallery{flex-wrap:wrap}
@media(max-width:850px){
  .fp-panel{width:100%; border-left:0}
}
@media print{ .fp-panel{display:none !important} }

.fp-note{margin:var(--wr-4) 0 0; color:var(--wr-ink-faint); font-size:var(--wr-fs-sm); line-height:1.5; max-width:88ch}
@media(max-width:850px){
  #floorPlanCanvas{height:min(70vh, 640px); min-height:480px}
  .fp-head h2{font-size:var(--wr-fs-h3)}
  .floorplan{padding:0 var(--wr-6)}
}

/* ── the searchable taxonomy on /manufacturing/manual/ ──────────── */

.mfg-index .quick-links{display:flex; justify-content:flex-start; gap:var(--wr-4); flex-wrap:wrap; margin:var(--wr-6) 0 0}
.mfg-index .quick-links a{
  display:inline-flex; align-items:center; gap:var(--wr-2);
  padding:var(--wr-3) var(--wr-5); border-radius:var(--wr-r);
  border:1px solid rgba(74,158,255,.35); background:transparent;
  color:var(--house-accent); text-decoration:none;
  font-family:var(--wr-display); font-size:var(--wr-fs-sm); letter-spacing:.02em;
}
.mfg-index .quick-links a:hover{border-color:var(--house-accent); background:rgba(74,158,255,.10)}

.mfg-index .toolbar{
  position:sticky; top:0; z-index:5; background:var(--wr-rail);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg);
  padding:var(--wr-5); margin-bottom:var(--wr-6); box-shadow:var(--wr-shadow-sm);
}
.mfg-index .toolbar-row{display:flex; gap:var(--wr-4); align-items:center; flex-wrap:wrap}
.mfg-index .toolbar label{font-size:var(--wr-fs-sm); font-weight:600}
.mfg-index .toolbar input,
.mfg-index .toolbar select,
.mfg-index .toolbar button{
  font:inherit; font-size:var(--wr-fs-cap); border:1px solid var(--wr-rule-strong);
  border-radius:var(--wr-r); background:var(--wr-card);
  padding:var(--wr-4) var(--wr-5); color:var(--wr-ink);
}
.mfg-index .toolbar input{flex:1; min-width:220px}
.mfg-index .toolbar select{min-width:180px}
.mfg-index .toolbar button{cursor:pointer}
.mfg-index .toolbar button:hover{border-color:var(--wr-accent); background:var(--wr-accent-tint)}
.mfg-index .stats{display:flex; gap:var(--wr-5); flex-wrap:wrap; margin-top:var(--wr-4); color:var(--wr-ink-muted); font-size:var(--wr-fs-sm)}
.mfg-index #status{margin:var(--wr-5) var(--wr-1) 0; color:var(--wr-ink-muted); font-size:var(--wr-fs-sm)}

.mfg-index .taxonomy{display:grid; gap:var(--wr-5)}
.mfg-index details{background:var(--wr-card); border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg)}
.mfg-index details>summary{cursor:pointer; list-style:none}
.mfg-index details>summary::-webkit-details-marker{display:none}
.mfg-index details>summary:focus-visible{outline:3px solid var(--wr-accent); outline-offset:2px}
.mfg-index .line-group>summary{
  padding:var(--wr-6); font-family:var(--wr-display); font-weight:600;
  font-size:var(--wr-fs-h3); letter-spacing:.02em;
}
/* The + / − circle marks anything that opens. It used to be listed for four
   classes while the [open] rule below it matched EVERY details on the page, so
   a folded block outside those four showed nothing when shut and a bare "−"
   glued to its first word when open. One rule for both states now, and every
   folded block gets the same affordance. */
.mfg-index details>summary::before{
  content:'+'; display:inline-grid; place-items:center; width:20px; height:20px;
  margin-right:var(--wr-4); border:1px solid var(--wr-rule-strong); border-radius:50%;
  font-family:var(--wr-body); font-size:15px; line-height:1;
  color:var(--wr-accent); vertical-align:-2px; flex:none;
}
.mfg-index details[open]>summary::before{content:'−'}
.mfg-index .group-count{float:right; color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); font-weight:500; letter-spacing:0}
.mfg-index .line-content{display:grid; gap:var(--wr-4); padding:0 var(--wr-4) var(--wr-4)}
.mfg-index .station-group{border-radius:var(--wr-r); background:var(--wr-rail)}
.mfg-index .station-group>summary{padding:var(--wr-5); font-weight:600}
.mfg-index .station-title{font-weight:600}
/* The code is a position on the line, not the station's identity — it reads as
   a tag beside the name rather than as the heading it used to be. */
.mfg-index .station-code{
  margin-left:var(--wr-4); padding:var(--wr-1) var(--wr-3);
  border:1px solid var(--wr-rule-strong); border-radius:var(--wr-r-sm);
  background:var(--wr-card); color:var(--wr-ink-faint);
  font-family:var(--wr-mono); font-size:var(--wr-fs-micro); font-weight:400;
  letter-spacing:.04em; white-space:nowrap; vertical-align:1px;
}
.mfg-index .station-meta,
.mfg-index .operation-meta{color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); font-weight:400}
.mfg-index .station-meta{margin-left:var(--wr-3)}
/* The Chinese station name, on its own line under the English one. It is the
   process card's own wording, kept for checking the English against. */
.mfg-index .station-zh{
  display:block; margin-top:var(--wr-2);
  color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); font-weight:400;
  letter-spacing:normal;
}
.mfg-index .station-content{display:grid; gap:var(--wr-3); padding:0 var(--wr-4) var(--wr-4)}
/* the build-up render for this station: one fixed camera across the whole set */
.mfg-index .station-render{
  display:block; width:100%; max-width:520px; height:auto;
  border:1px solid var(--wr-rule); border-radius:var(--wr-r);
  background:var(--wr-card); justify-self:start;
}
.mfg-index .operation-group{border-radius:var(--wr-r); background:var(--wr-card)}
.mfg-index .operation-group>summary{padding:var(--wr-5); color:var(--wr-ink)}
.mfg-index .operation-code{
  font-family:var(--wr-display); letter-spacing:.06em;
  color:var(--wr-accent); font-size:var(--wr-fs-lead); margin-right:var(--wr-4);
}
.mfg-index .operation-title{font-weight:500}
.mfg-index .badges{float:right; display:inline-flex; gap:var(--wr-2); align-items:center; color:var(--wr-ink-muted); font-size:var(--wr-fs-micro); font-weight:400}
.mfg-index .badge{border:1px solid var(--wr-rule-strong); border-radius:var(--wr-r-pill); padding:var(--wr-1) var(--wr-3); white-space:nowrap}
.mfg-index .badge.hot{border-color:var(--wr-notice-line); color:var(--wr-notice-ink); background:var(--wr-notice)}
.mfg-index .operation-content{padding:0 var(--wr-6) var(--wr-6); border-top:1px solid var(--wr-rule)}
.mfg-index .operation-actions{display:flex; gap:var(--wr-5); flex-wrap:wrap; margin:var(--wr-5) 0; font-size:var(--wr-fs-cap)}
.mfg-index .step-list{margin:0; padding:0 0 0 var(--wr-8); display:grid; gap:var(--wr-3)}
.mfg-index .step-item{border-radius:var(--wr-r); background:var(--wr-rail)}
.mfg-index .step-item>summary{padding:var(--wr-4) var(--wr-5); font-size:var(--wr-fs-cap)}
.mfg-index .step-no{
  display:inline-grid; place-items:center; min-width:27px; height:21px;
  margin-right:var(--wr-3); border-radius:var(--wr-r-sm);
  background:var(--wr-accent-tint); color:var(--wr-accent);
  font-family:var(--wr-display); font-weight:700; font-size:var(--wr-fs-sm);
}
.mfg-index .step-body{padding:0 var(--wr-5) var(--wr-5) 47px; font-size:var(--wr-fs-cap); line-height:1.7; color:var(--wr-ink-muted)}
.mfg-index .source-copy,
.mfg-index .illustrations{margin-top:var(--wr-5); border-radius:var(--wr-r); background:var(--wr-rail)}
.mfg-index .source-copy>summary,
.mfg-index .illustrations>summary{padding:var(--wr-4) var(--wr-5); font-size:var(--wr-fs-sm)}
.mfg-index .source-copy pre{white-space:pre-wrap; margin:0; padding:0 var(--wr-5) var(--wr-5); font:inherit; font-size:var(--wr-fs-sm); line-height:1.65; color:var(--wr-ink-muted)}
.mfg-index .source-copy ul{margin:0; padding:0 var(--wr-5) var(--wr-5) var(--wr-8)}
.mfg-index .source-copy li{margin:var(--wr-2) 0; font-size:var(--wr-fs-sm)}
.mfg-index .source-copy li small{color:var(--wr-ink-muted)}
.mfg-index .gallery{display:flex; gap:var(--wr-4); overflow:auto; padding:0 var(--wr-5) var(--wr-5)}
.mfg-index .gallery a{display:block; flex:0 0 110px}
.mfg-index .gallery img{
  display:block; width:110px; height:76px; object-fit:cover;
  border:1px solid var(--wr-rule); border-radius:var(--wr-r); background:var(--wr-card);
}
.mfg-index .station-note{
  margin:var(--wr-4) var(--wr-4) var(--wr-5); padding:var(--wr-4) var(--wr-5);
  border-left:3px solid var(--wr-rule-strong); background:var(--wr-card);
  color:var(--wr-ink-faint); font-size:var(--wr-fs-sm); line-height:1.6;
}
.mfg-index .source-copy li{list-style:disc}
.mfg-index .empty{
  padding:var(--wr-8); text-align:center; background:var(--wr-card);
  border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg); color:var(--wr-ink-muted);
}
@media(max-width:700px){
  .mfg-index main{padding:var(--wr-7) var(--wr-6) 60px}
  .mfg-index .group-count,.mfg-index .badges{float:none; display:block; margin-top:var(--wr-2)}
  .mfg-index .toolbar{position:static}
  .mfg-index .step-list,.mfg-index .step-body{padding-left:var(--wr-5)}
}

/* ── the taxonomy is the whole manual, so it has to print like one ──────
   Every station page's content now lives inside these <details>, and a
   collapsed <details> prints as its summary alone. Force the document open
   for print and drop the controls that only make sense on screen. */
@media print{
  /* the house ground is screen furniture; paper is white */
  body.mfg-manual, body.mfg-index{background:#fff !important}
  .mfg-manual .wrap{max-width:none; margin:0; padding:0; background:#fff; border-radius:0}
  .mfg-manual header.top{color:#000; padding:0 0 12px}
  .mfg-manual header.top h1{color:#000}
  .mfg-manual header.top p{color:#444}
  #topbar, nav:not(.mfg-langs), .mfg-langs, .toolbar, .quick-links,
  .fp-hint, .fp-status, .operation-actions{display:none !important}
  body.mfg-index{padding-top:0 !important; background:#fff}
  .mfg-index main{max-width:none; padding:0}
  .mfg-index details{break-inside:avoid; border-color:#bbb}
  .mfg-index details>summary::before{content:'' !important; margin:0 !important; border:0 !important; width:0 !important}
  .mfg-index details:not([open])>*:not(summary){display:revert}
  .mfg-index .gallery{overflow:visible; flex-wrap:wrap}
  .mfg-index .step-body,.mfg-index .source-copy pre{color:#000}
  .mfg-index .line-group{break-before:page}
  .mfg-index .line-group:first-of-type{break-before:auto}
}

/* The open layout questions, rendered from floor-layout.json's conflicts array.
   Folded by default: the plan is the point, these are what is unsettled about it.
   No card styling of its own — .mfg-index details already gives every folded
   block on this page the same surface, and an accent rule here only fought it. */
.fp-open { margin: .5rem 0; padding: .6rem .85rem; }
.fp-open > summary { cursor: pointer; font-weight: 600; }
.fp-open > p { margin: .55rem 0 0; font-size: .9rem; line-height: 1.55; }
.fp-open > p strong { color: var(--house-accent); }

/* ---- the page as a closed list ------------------------------------------
   Sections shut until asked for. End of line is nested inside the instructions;
   the China body shop is a sibling, not part of them. The summary has to carry
   what is inside it, not just a heading, because that is all most readers see. */
.mfg-sec { border: 1px solid var(--wr-rule); border-radius: var(--wr-r-lg);
  background: var(--wr-card); margin: 0 0 .75rem; overflow: hidden; }
.mfg-sec .mfg-sec { margin: 0 0 1.15rem; }
.mfg-sec > summary { cursor: pointer; padding: 1rem 1.15rem; list-style: none;
  display: grid; grid-template-columns: 1.25rem 1fr; gap: .25rem .6rem; align-items: baseline; }
.mfg-sec > summary::-webkit-details-marker { display: none; }
.mfg-sec > summary::before { content: "+"; grid-row: 1 / span 2;
  display: inline-grid; place-items: center; width: 22px; height: 22px;
  margin: 0; border: 1px solid var(--wr-rule-strong); border-radius: 50%;
  font: 500 15px/1 var(--wr-body, inherit); vertical-align: 0;
  color: var(--house-accent); }
.mfg-sec[open] > summary::before { content: "\2212"; }
.mfg-sec > summary strong { font-family: var(--wr-font-display, inherit);
  font-size: 1.15rem; font-weight: 600; letter-spacing: .01em; }
.mfg-sec > summary span { grid-column: 2; color: var(--wr-ink-2, #55606d);
  font-size: .92rem; line-height: 1.5; }
.mfg-sec > summary:hover strong { color: var(--house-accent); }
.mfg-sec > *:not(summary) { padding: 0 1.15rem 1.15rem; }
.mfg-sec > section { padding: 0 1.15rem 1.15rem; }
/* The section title is repeated in the summary above it; keep it for screen
   readers and for print, hide it on screen so it is not said twice. */
.sr-head { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; }
.sec-tools { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-top: 1rem; }
.sec-tools button { font: inherit; font-size: .9rem; padding: .4rem .8rem; cursor: pointer;
  border: 1px solid var(--wr-rule); border-radius: var(--wr-r-sm, 6px); background: var(--wr-card); }
.sec-tools button:hover { border-color: var(--house-accent); color: var(--house-accent); }
.sec-tools-note { font-size: .85rem; color: var(--wr-ink-2, #55606d); }
.hall-lede{margin:var(--wr-4) 0 0; max-width:72ch; color:var(--wr-ink-muted); line-height:1.6}
.hall-render{margin:0 0 var(--wr-8)}
.hall-render figure{
  margin:0; border:1px solid var(--wr-rule); border-radius:var(--wr-r-lg);
  background:var(--wr-card); overflow:hidden;
}
.hall-render img{display:block; width:100%; background:#222831; aspect-ratio:8/5; object-fit:contain}
.hall-render figcaption{
  display:flex; justify-content:space-between; gap:var(--wr-6); align-items:flex-start;
  padding:var(--wr-5) var(--wr-6);
}
.hall-render figcaption p{margin:0; font-family:var(--wr-display); font-weight:600; color:var(--wr-ink)}
.hall-render figcaption span{display:block; margin-top:var(--wr-1); color:var(--wr-ink-muted); font-size:var(--wr-fs-sm); line-height:1.5; max-width:72ch}
.hall-map{flex:0 0 auto; font-size:var(--wr-fs-sm); color:var(--wr-accent); text-underline-offset:4px; white-space:nowrap}

@media(max-width:760px){
  .hall-render figcaption{flex-direction:column; gap:var(--wr-3)}
}
@media print {
  .mfg-sec > summary::before, .sec-tools { display: none; }
  .mfg-sec { border: 0; page-break-inside: auto; }
  .sr-head { position: static; width: auto; height: auto; clip: auto; }
}
