/* SPDX-License-Identifier: LicenseRef-Proprietary-Internal
   第一桥 尖刀 v0 — shared embed styling.
   Direction: 典籍 / editorial. Warm paper ground, ink text, vermilion only where
   a refusal or a red line needs to be unmissable. Colour is semantic here, never
   decorative — a refusal must not look like a result. */

:root {
  --fb-paper: oklch(97.5% 0.012 85);
  --fb-surface: oklch(99% 0.006 85);
  --fb-ink: oklch(24% 0.012 60);
  --fb-ink-soft: oklch(46% 0.012 60);
  --fb-ink-faint: oklch(62% 0.01 60);
  --fb-rule: oklch(88% 0.012 75);
  --fb-seal: oklch(52% 0.19 27);      /* 朱砂 — refusal / red line */
  --fb-seal-wash: oklch(95% 0.035 30);
  --fb-jade: oklch(48% 0.09 165);     /* located evidence */
  --fb-jade-wash: oklch(95% 0.03 165);

  --fb-serif: "Songti SC", "Noto Serif CJK SC", "Source Han Serif SC", Georgia, serif;
  --fb-sans: "PingFang SC", "Noto Sans CJK SC", -apple-system, "Segoe UI", sans-serif;
  --fb-mono: "SFMono-Regular", "Cascadia Mono", Consolas, monospace;

  --fb-step: 0.75rem;
  --fb-radius: 3px;                   /* near-square: a document, not a widget */
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --fb-paper: oklch(19% 0.012 60);
    --fb-surface: oklch(23% 0.012 60);
    --fb-ink: oklch(92% 0.008 85);
    --fb-ink-soft: oklch(74% 0.01 85);
    --fb-ink-faint: oklch(58% 0.01 85);
    --fb-rule: oklch(32% 0.012 60);
    --fb-seal: oklch(70% 0.16 30);
    --fb-seal-wash: oklch(28% 0.05 30);
    --fb-jade: oklch(72% 0.1 165);
    --fb-jade-wash: oklch(26% 0.04 165);
  }
}

:root[data-theme="dark"] {
  --fb-paper: oklch(19% 0.012 60);
  --fb-surface: oklch(23% 0.012 60);
  --fb-ink: oklch(92% 0.008 85);
  --fb-ink-soft: oklch(74% 0.01 85);
  --fb-ink-faint: oklch(58% 0.01 85);
  --fb-rule: oklch(32% 0.012 60);
  --fb-seal: oklch(70% 0.16 30);
  --fb-seal-wash: oklch(28% 0.05 30);
  --fb-jade: oklch(72% 0.1 165);
  --fb-jade-wash: oklch(26% 0.04 165);
}

body.fb-page {
  margin: 0;
  background: var(--fb-paper);
  color: var(--fb-ink);
  font-family: var(--fb-sans);
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}

.fb-shell { max-width: 62rem; margin: 0 auto; padding: clamp(1.5rem, 1rem + 3vw, 4rem) 16px; }

.fb-masthead { border-bottom: 2px solid var(--fb-ink); padding-bottom: var(--fb-step); }
.fb-masthead h1 {
  font-family: var(--fb-display, var(--fb-serif));
  font-size: clamp(1.6rem, 1.1rem + 2.4vw, 2.9rem);
  letter-spacing: 0.02em;
  margin: 0 0 0.2em;
}
.fb-kicker {
  font-family: var(--fb-mono);
  font-size: 0.72rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--fb-ink-faint);
  margin: 0 0 0.6em;
}
.fb-standfirst { color: var(--fb-ink-soft); max-width: 46ch; margin: 0; }

/* --- query bar --- */
/* The bar stays with you. Answers are added below it, so without this every
   next question meant scrolling all the way back up past the one just read.
   --fb-sticky-top is the height of the host page's own fixed header, measured
   by page-init.js (0 where there is none); --fb-bar-h is this bar's height, so
   a new answer scrolls to just *under* the bar instead of behind it. */
.fb-bar {
  display: flex; gap: 0.5rem; margin: calc(var(--fb-step) * 2) 0; flex-wrap: wrap;
  position: sticky; top: var(--fb-sticky-top, 0px); z-index: 30;
  padding: .6rem 0; background: var(--fb-paper);
  box-shadow: 0 1px 0 var(--fb-rule), 0 8px 12px -12px rgba(0,0,0,.35);
}
.fb-shell .fb-turn { scroll-margin-top: calc(var(--fb-sticky-top, 0px) + var(--fb-bar-h, 5rem) + .75rem); }
.fb-bar input[type="text"] {
  flex: 1 1 18rem; min-width: 0;
  font: inherit; font-family: var(--fb-serif); font-size: 1.05rem;
  padding: 0.6rem 0.75rem;
  background: var(--fb-surface);
  border: 1px solid var(--fb-rule);
  border-radius: var(--fb-radius);
  color: var(--fb-ink);
}
.fb-bar input:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 1px; }
.fb-bar button {
  font: inherit; padding: 0.6rem 1.4rem; cursor: pointer;
  background: var(--fb-ink); color: var(--fb-paper);
  border: 1px solid var(--fb-ink); border-radius: var(--fb-radius);
  transition: transform 120ms cubic-bezier(0.16, 1, 0.3, 1), opacity 120ms;
}
.fb-bar button:hover { transform: translateY(-1px); }
.fb-bar button:active { transform: translateY(0); opacity: 0.85; }
.fb-bar button[disabled] { opacity: 0.45; cursor: progress; transform: none; }

.fb-presets { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-bottom: calc(var(--fb-step) * 2); }
.fb-preset {
  font: inherit; font-size: 0.85rem; cursor: pointer;
  padding: 0.3rem 0.7rem;
  background: transparent; color: var(--fb-ink-soft);
  border: 1px dashed var(--fb-rule); border-radius: 999px;
}
.fb-preset:hover { border-style: solid; color: var(--fb-ink); }
.fb-preset[data-kind="refuse"] { color: var(--fb-seal); border-color: var(--fb-seal); }

/* --- block 1: conclusion card --- */
.fb-card {
  border-left: 3px solid var(--fb-jade);
  background: var(--fb-jade-wash);
  padding: var(--fb-step) calc(var(--fb-step) * 1.3);
  border-radius: 0 var(--fb-radius) var(--fb-radius) 0;
}
.fb-card.fb-refuse { border-left-color: var(--fb-seal); background: var(--fb-seal-wash); }
.fb-verdict { font-family: var(--fb-serif); font-size: 1.25rem; display: flex; gap: 0.6rem; align-items: baseline; flex-wrap: wrap; }
.fb-code { font-family: var(--fb-mono); font-size: 0.7rem; letter-spacing: 0.08em; color: var(--fb-ink-faint); }
.fb-missing { margin: 0.5em 0 0; }
.fb-note { margin: 0.4em 0 0; color: var(--fb-ink-soft); font-size: 0.92rem; }
.fb-ask { margin-top: var(--fb-step); border-top: 1px solid var(--fb-rule); padding-top: 0.6rem; }
.fb-ask-label { font-family: var(--fb-mono); font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fb-seal); }
.fb-ask p { margin: 0.25em 0 0; font-family: var(--fb-serif); }

/* --- block 2: why this answer --- */
.fb-why { margin-top: calc(var(--fb-step) * 2.2); }
.fb-why h3, .fb-replay h3 {
  font-family: var(--fb-mono); font-size: 0.72rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--fb-ink-faint);
  border-bottom: 1px solid var(--fb-rule); padding-bottom: 0.4rem; margin: 0 0 var(--fb-step);
}
.fb-evlist { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.7rem; }
.fb-ev { background: var(--fb-surface); border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: 0.7rem 0.85rem; }
.fb-ev-head { display: flex; justify-content: space-between; gap: 0.75rem; flex-wrap: wrap; align-items: baseline; }
.fb-ev-head code { font-family: var(--fb-mono); font-size: 0.72rem; color: var(--fb-ink-faint); word-break: break-all; }
.fb-src { font-family: var(--fb-mono); font-size: 0.72rem; color: var(--fb-jade); white-space: nowrap; }
.fb-text { font-family: var(--fb-serif); font-size: 1.05rem; margin: 0.4em 0 0.5em; }
.fb-withheld { font-size: 0.88rem; color: var(--fb-ink-faint); font-style: italic; margin: 0.4em 0 0.5em; }
.fb-trunc { font-family: var(--fb-mono); font-size: 0.68rem; color: var(--fb-ink-faint); margin-left: 0.3em; }
.fb-ev-foot { display: flex; gap: 0.4rem; flex-wrap: wrap; }
.fb-lic, .fb-flag {
  font-family: var(--fb-mono); font-size: 0.66rem; letter-spacing: 0.04em;
  padding: 0.12rem 0.45rem; border-radius: 999px;
  border: 1px solid var(--fb-rule); color: var(--fb-ink-faint);
}
.fb-flag { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-excluded { font-size: 0.85rem; color: var(--fb-ink-faint); margin: 0.7em 0 0; }
.fb-gates { margin-top: 0.8em; font-family: var(--fb-mono); font-size: 0.72rem; color: var(--fb-ink-faint); display: flex; gap: 0.3rem; flex-wrap: wrap; align-items: center; }
.fb-gate { padding: 0.1rem 0.4rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); }
.fb-gate.fb-pass { color: var(--fb-jade); border-color: var(--fb-jade); }
.fb-gate.fb-fail { color: var(--fb-seal); border-color: var(--fb-seal); background: var(--fb-seal-wash); }
/* handed to the front desk at this gate: nothing was refused, so nothing is red */
.fb-gate.fb-turned { color: var(--fb-ink-soft); border-style: dashed; border-color: var(--fb-ink-faint, var(--fb-rule)); }
.fb-disc { margin: 0.9em 0 0; padding-left: 1.1em; font-size: 0.82rem; color: var(--fb-ink-faint); }
.fb-disc li { margin-bottom: 0.2em; }

/* --- block 3: replay --- */
.fb-replay { margin-top: calc(var(--fb-step) * 2.2); }
.fb-replay p { font-size: 0.85rem; color: var(--fb-ink-soft); margin: 0 0 0.6em; }
.fb-replay code { font-family: var(--fb-mono); font-size: 0.75rem; }
.fb-replay-link {
  display: inline-block; font-family: var(--fb-mono); font-size: 0.78rem;
  padding: 0.45rem 0.9rem; text-decoration: none;
  color: var(--fb-ink); border: 1px solid var(--fb-ink); border-radius: var(--fb-radius);
}
.fb-replay-link:hover { background: var(--fb-ink); color: var(--fb-paper); }

/* --- judgement grid (genmount) --- */
.fb-judge { display: grid; grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr)); gap: 0.6rem; margin-top: var(--fb-step); }
.fb-judge div { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: 0.6rem 0.75rem; background: var(--fb-surface); }
.fb-judge dt { font-family: var(--fb-mono); font-size: 0.66rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--fb-ink-faint); }
.fb-judge dd { margin: 0.25em 0 0; font-family: var(--fb-serif); font-size: 1.1rem; }
.fb-ok { color: var(--fb-jade); }
.fb-no { color: var(--fb-seal); }

.fb-foot { margin-top: calc(var(--fb-step) * 3); padding-top: var(--fb-step); border-top: 1px solid var(--fb-rule); font-size: 0.78rem; color: var(--fb-ink-faint); }
.fb-foot code { font-family: var(--fb-mono); }
.fb-err { color: var(--fb-seal); font-family: var(--fb-mono); font-size: 0.8rem; }

/* --- image upload: a document intake, deliberately not a "scan yourself" box --- */
.fb-upload {
  margin: calc(var(--fb-step) * 1.4) 0;
  padding: 0.85rem 1rem;
  border: 1px dashed var(--fb-rule);
  border-radius: var(--fb-radius);
  background: var(--fb-surface);
}
.fb-uplabel {
  display: block;
  font-family: var(--fb-mono);
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--fb-ink-faint);
  margin-bottom: 0.5rem;
  cursor: pointer;
}
.fb-upload input[type="file"] {
  font: inherit;
  font-size: 0.85rem;
  color: var(--fb-ink-soft);
  max-width: 100%;
}
.fb-upload input[type="file"]::file-selector-button {
  font: inherit;
  font-size: 0.82rem;
  margin-right: 0.6rem;
  padding: 0.35rem 0.8rem;
  cursor: pointer;
  color: var(--fb-ink);
  background: transparent;
  border: 1px solid var(--fb-ink);
  border-radius: var(--fb-radius);
}
.fb-upload input[type="file"]::file-selector-button:hover {
  background: var(--fb-ink);
  color: var(--fb-paper);
}
.fb-upnote {
  margin: 0.6rem 0 0;
  font-size: 0.8rem;
  line-height: 1.55;
  color: var(--fb-ink-faint);
}
.fb-upnote strong { color: var(--fb-seal); }

/* --- host-site chrome: a thin bar and a way back, so the page is not an island --- */
.fb-sitebar {
  display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap;
  padding: 0.7rem 16px;
  border-bottom: 1px solid var(--fb-rule);
  background: var(--fb-surface);
  font-family: var(--fb-sans); font-size: 0.82rem;
}
.fb-sitebar-home { text-decoration: none; color: var(--fb-ink); }
.fb-sitebar-mark { font-weight: 600; letter-spacing: 0.01em; }
.fb-sitebar-home:hover .fb-sitebar-mark { color: var(--fb-jade); }
.fb-sitebar-sep { color: var(--fb-ink-faint); }
.fb-sitebar-here { color: var(--fb-ink-faint); }
.fb-sitefoot {
  padding: 1.2rem 16px 2.2rem;
  border-top: 1px solid var(--fb-rule);
  font-family: var(--fb-sans); font-size: 0.85rem;
}
.fb-sitefoot a { color: var(--fb-ink-soft); text-decoration: none; }
.fb-sitefoot a:hover { color: var(--fb-jade); }

/* --- phone --- */
@media (max-width: 640px) {
  .fb-shell { padding-left: 16px; padding-right: 16px; }
  .fb-masthead h1 { font-size: clamp(1.45rem, 1.1rem + 3.2vw, 2rem); line-height: 1.25; }
  .fb-standfirst, .fb-claim { max-width: none; }
  /* stuck to the top of a phone it has to be short: the field on one row, the
     two buttons side by side on the next — three stacked rows ate a third of the screen */
  .fb-bar { align-items: stretch; }
  .fb-bar input[type="text"] { flex: 1 1 100%; font-size: 16px; } /* 16px stops iOS zoom */
  .fb-bar button { flex: 1 1 0; }
  .fb-presets { gap: 0.35rem; }
  .fb-preset { font-size: 0.8rem; padding: 0.3rem 0.6rem; }
  .fb-ev-head { flex-direction: column; gap: 0.15rem; }
  .fb-src { white-space: normal; }
  .fb-ev-head code { font-size: 0.66rem; }
  .fb-text { font-size: 1rem; }
  .fb-judge { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fb-upload input[type="file"] { display: block; margin-top: 0.4rem; }
  .fb-upload input[type="file"]::file-selector-button { margin-bottom: 0.3rem; }
  .fb-pillars { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 380px) {
  .fb-judge, .fb-pillars { grid-template-columns: 1fr; }
}

/* --- C-end additions (consent block + local history) --- */
.fb-consent {
  border: 1px solid var(--fb-rule); border-left: 3px solid var(--fb-jade);
  background: var(--fb-surface); padding: 1rem 1.1rem; margin: 1.6rem 0;
  border-radius: 0 var(--fb-radius) var(--fb-radius) 0;
}
.fb-consent h2 {
  font-family: var(--fb-mono); font-size: .7rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--fb-ink-faint); margin: 0 0 .6em;
}
.fb-consent p { margin: 0 0 .8em; font-size: .9rem; color: var(--fb-ink-soft); }
.fb-actions { display: flex; gap: .5rem; flex-wrap: wrap; }
.fb-actions button {
  font: inherit; font-size: .82rem; padding: .4rem .9rem; cursor: pointer;
  background: transparent; color: var(--fb-ink);
  border: 1px solid var(--fb-ink); border-radius: var(--fb-radius);
}
.fb-actions button:hover { background: var(--fb-ink); color: var(--fb-paper); }
.fb-actions button.fb-danger { color: var(--fb-seal); border-color: var(--fb-seal); }
.fb-actions button.fb-danger:hover { background: var(--fb-seal); color: var(--fb-paper); }
.fb-history { list-style: none; padding: 0; margin: 1rem 0 0; display: grid; gap: .4rem; }
.fb-history li {
  display: flex; justify-content: space-between; gap: .75rem; flex-wrap: wrap;
  border-bottom: 1px dotted var(--fb-rule); padding-bottom: .35rem; font-size: .86rem;
}
.fb-history .fb-h-q { font-family: var(--fb-serif); }
.fb-history .fb-h-meta { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); }

/* --- generated reading: visibly its own thing, never mistaken for a quotation --- */
/* A reply with no source. Deliberately not the jade of a located reading: a
   dashed edge and a muted head, so the eye can tell at a glance which
   sentences are anchored and which are only the model talking. */
.fb-talk {
  margin-top: calc(var(--fb-step) * 1.6);
  padding: 0.95rem 1.1rem 0.8rem;
  background: transparent;
  border: 1px dashed var(--fb-rule);
  border-radius: var(--fb-radius);
}
.fb-talk-head {
  display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
  margin-bottom: 0.4rem;
}
.fb-talk-head h3 {
  margin: 0;
  font-family: var(--fb-mono); font-size: 0.72rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--fb-ink-faint, #888);
}
.fb-talk-text { margin: 0; line-height: 1.75; color: var(--fb-ink); }
/* a withdrawn answer: said before the replay's ticks, in the refusal colour */
.fb-retracted {
  margin: 0 0 .75rem; padding: .6rem .75rem; border-left: 3px solid var(--fb-seal);
  background: var(--fb-seal-wash);
  font-size: .85rem; line-height: 1.6; color: var(--fb-ink);
}
/* under the four ticks: which release said this, and what a visitor can check alone */
.fb-account { margin-top: calc(var(--fb-step) * 1.2); padding-top: .7rem; border-top: 1px solid var(--fb-rule); }
.fb-release { font-family: var(--fb-mono); font-size: .75rem; color: var(--fb-ink-soft); margin: 0 0 .6rem; overflow-wrap: anywhere; }
.fb-chain-row { margin: 0 0 .5rem; font-size: .82rem; line-height: 1.6; }
.fb-linkish {
  padding: 0; border: 0; background: none; font: inherit; color: var(--fb-ink); cursor: pointer;
  text-decoration: underline; text-underline-offset: .2em; text-decoration-thickness: 1px;
}
.fb-linkish:hover { text-decoration-thickness: 2px; }
.fb-linkish:focus-visible, .fb-account summary:focus-visible { outline: 2px solid var(--fb-ink); outline-offset: 2px; }
.fb-chain-out { display: block; margin-top: .25rem; color: var(--fb-ink-soft); }
.fb-account details { margin: 0 0 .5rem; font-size: .82rem; line-height: 1.7; }
.fb-account summary { cursor: pointer; color: var(--fb-ink); }
.fb-account details p { margin: .45rem 0 0; color: var(--fb-ink-soft); }
.fb-ledger-list { list-style: none; margin: .5rem 0 0; padding: 0; font-family: var(--fb-mono); font-size: .74rem; color: var(--fb-ink-soft); }
.fb-ledger-list li { padding: .18rem 0 .18rem .6rem; border-left: 2px solid var(--fb-rule); overflow-wrap: anywhere; }
.fb-ledger-list li.fb-ledger-back { border-left-color: var(--fb-seal); color: var(--fb-ink); }
.fb-ledger-note { font-size: .78rem; }
/* how the last recording was heard, when that is worth saying */
.fb-heard-engine { display: block; margin-top: .3rem; }
/* what the lookup found (nothing), said quietly under the reply it led to */
.fb-talk-searched {
  margin: .6rem 0 0; padding-top: .5rem; border-top: 1px dashed var(--fb-rule);
  font-size: .78rem; line-height: 1.6; color: var(--fb-ink-faint, var(--fb-ink-soft));
}
.fb-talk-note {
  margin: 0.6rem 0 0; font-size: 0.78rem; line-height: 1.6;
  color: var(--fb-ink-faint, #888);
}

.fb-reading {
  margin-top: calc(var(--fb-step) * 1.6);
  padding: 0.95rem 1.1rem 0.8rem;
  background: var(--fb-surface);
  border: 1px solid var(--fb-rule);
  border-radius: var(--fb-radius);
}
.fb-reading-head {
  display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
  margin-bottom: 0.4rem;
}
.fb-reading-head h3 {
  margin: 0;
  font-family: var(--fb-mono); font-size: 0.72rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--fb-jade);
}
.fb-reading-text { margin: 0; font-size: 1rem; line-height: 1.75; color: var(--fb-ink); }
.fb-reading-note { margin: 0.6rem 0 0; font-size: 0.78rem; color: var(--fb-ink-faint); }
/* --- three arguments, each in its own frame: they answer apart and must read apart.
   Written ones carry the jade of located evidence (they cite it); the counted one
   is ink — it is arithmetic; a withdrawn one is dashed and says why. --- */
.fb-lenses { margin-top: calc(var(--fb-step) * 1.6); }
.fb-lenses > h3 {
  margin: 0 0 0.5rem;
  font-family: var(--fb-mono); font-size: 0.72rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--fb-ink-soft);
}
.fb-lens {
  padding: 0.8rem 1rem 0.75rem;
  background: var(--fb-surface);
  border: 1px solid var(--fb-rule);
  border-inline-start: 3px solid var(--fb-jade);
  border-radius: var(--fb-radius);
}
.fb-lens + .fb-lens { margin-top: 0.5rem; }
.fb-lens-distribution { border-inline-start-color: var(--fb-ink-soft); }
.fb-lens-gone { border-style: dashed; border-inline-start: 1px dashed var(--fb-rule); background: none; }
.fb-lens-gone .fb-lens-text { font-size: 0.82rem; color: var(--fb-ink-faint); }
.fb-lens-head { display: flex; align-items: baseline; gap: 0.6rem; flex-wrap: wrap; margin-bottom: 0.35rem; }
.fb-lens-head h4 { margin: 0; font-family: var(--fb-serif); font-size: 1.02rem; font-weight: 600; color: var(--fb-ink); }
.fb-lens-kind { font-family: var(--fb-mono); font-size: 0.68rem; letter-spacing: 0.08em; color: var(--fb-ink-faint); }
.fb-lens-head .fb-speak { margin-inline-start: auto; }
.fb-lens-text { margin: 0; font-size: 0.96rem; line-height: 1.75; color: var(--fb-ink); }
.fb-lens-graph { margin: 0.2rem 0 0.6rem; }
.fb-lens-graph svg { display: block; width: 100%; max-width: 420px; height: auto; margin: 0 auto; }
.fb-lens-graph line { stroke: var(--fb-rule); stroke-width: 1; }
.fb-lens-graph circle { fill: var(--fb-jade); }
.fb-lens-graph .fb-lens-hub { fill: var(--fb-ink); }
.fb-lens-graph text { font-family: var(--fb-sans); font-size: 9px; fill: var(--fb-ink-soft); }
.fb-lens-graph .fb-lens-term { font-family: var(--fb-serif); font-size: 12px; fill: var(--fb-ink); }
.fb-lens-graph figcaption { font-size: 0.72rem; color: var(--fb-ink-faint); text-align: center; }
.fb-lens-row { margin: 0.35rem 0 0; font-size: 0.8rem; color: var(--fb-ink-soft); }
.fb-lens-row span { font-family: var(--fb-mono); font-size: 0.68rem; letter-spacing: 0.08em; color: var(--fb-ink-faint); margin-inline-end: 0.6em; }
.fb-lens-row a { font-family: var(--fb-mono); font-size: 0.85em; color: var(--fb-jade); text-decoration: none; }
.fb-lens-bars { margin: 0.1rem 0 0.6rem; }
.fb-lens-bar { display: grid; grid-template-columns: 7.5em 1fr 3.2em; align-items: center; gap: 0.5rem; font-size: 0.8rem; color: var(--fb-ink-soft); margin-top: 0.2rem; }
.fb-lens-bar i { display: block; height: 0.5rem; width: var(--w); background: var(--fb-ink-soft); border-radius: 1px; }
.fb-lens-bar b { font-family: var(--fb-mono); font-weight: 400; text-align: end; }

.fb-cite {
  font-family: var(--fb-mono); font-size: 0.72em; vertical-align: super;
  color: var(--fb-jade); text-decoration: none; padding: 0 0.1em;
}
.fb-cite:hover { text-decoration: underline; }
.fb-ev:target { outline: 2px solid var(--fb-jade); outline-offset: 2px; }

/* --- read aloud / ask by voice --- */
.fb-speak {
  font: inherit; font-family: var(--fb-sans); font-size: 0.78rem; letter-spacing: 0;
  text-transform: none; white-space: nowrap; cursor: pointer;
  padding: 0.28rem 0.7rem; margin-left: auto;
  color: var(--fb-ink); background: transparent;
  border: 1px solid var(--fb-rule); border-radius: 999px;
  transition: background 120ms, border-color 120ms, color 120ms;
}
.fb-speak:hover { border-color: var(--fb-ink); }
.fb-speak.fb-speaking { color: var(--fb-paper); background: var(--fb-jade); border-color: var(--fb-jade); }
.fb-verdict .fb-speak { align-self: center; }

.fb-bar .fb-mic {
  font: inherit; cursor: pointer; white-space: nowrap;
  padding: 0.6rem 1rem;
  color: var(--fb-ink); background: var(--fb-surface);
  border: 1px solid var(--fb-rule); border-radius: var(--fb-radius);
  transition: background 120ms, color 120ms, border-color 120ms;
}
.fb-bar .fb-mic:hover { border-color: var(--fb-ink); }
.fb-bar .fb-mic.fb-recording {
  color: var(--fb-paper); background: var(--fb-seal); border-color: var(--fb-seal);
  animation: fb-pulse 1.2s ease-in-out infinite;
}
.fb-bar .fb-mic[disabled] { opacity: 0.55; cursor: progress; }
.fb-bar .fb-mic[hidden] { display: none; }
@keyframes fb-pulse { 50% { opacity: 0.7; } }
@media (prefers-reduced-motion: reduce) { .fb-bar .fb-mic.fb-recording { animation: none; } }
@media (max-width: 640px) {
  .fb-bar .fb-mic { width: 100%; }
  .fb-reading-head { flex-wrap: wrap; }
}

/* icon and label live in separate spans; hosts may swap the icon for an <img> */
.fb-ico { display: inline-flex; margin-right: 0.35em; line-height: 1; }
.fb-ico img.emoji { width: 1em !important; height: 1em !important; margin: 0 !important; }
.fb-speak.fb-speaking .fb-ico, .fb-mic.fb-recording .fb-ico { filter: grayscale(1) brightness(3); }

/* --- language switch (standalone page only; in-site routes use the site's own) --- */
.fb-kicker-row { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.fb-kicker-row .fb-kicker { margin-bottom: 0.6em; }
.fb-langswitch { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.82rem; color: var(--fb-ink-faint); }
.fb-langswitch button {
  font: inherit; cursor: pointer; padding: 0.15rem 0.5rem;
  color: var(--fb-ink-soft); background: transparent;
  border: 1px solid transparent; border-radius: 999px;
}
.fb-langswitch button:hover { color: var(--fb-ink); border-color: var(--fb-rule); }
.fb-langswitch button.fb-lang-on { color: var(--fb-paper); background: var(--fb-ink); border-color: var(--fb-ink); }
.fb-trace-of { font-size: 0.85rem; color: var(--fb-ink-soft); margin: 0 0 0.6rem; overflow-wrap: anywhere; }

/* ADR-043: the egress trail on the replay page */
.fb-shell .fb-egress { margin: .25rem 0 1rem; font-size: .85rem; opacity: .85; }
.fb-shell .fb-egress ul { margin: .25rem 0 0; padding-left: 1.2rem; }
.fb-shell .fb-egress li { margin: .1rem 0; }

/* ---- what the transcriber heard, editable --------------------------------
   Accented Mandarin comes back wrong often enough that the transcript has to be
   visible and correctable rather than silently searched. Styled as a margin
   note: it sits above the answer and must not compete with it. */
.fb-heard {
  display: flex; flex-wrap: wrap; align-items: center; gap: .4rem .5rem;
  margin: .5rem 0 .9rem; padding: .5rem .7rem;
  border-left: 2px solid var(--fb-rule, #ddd);
  background: var(--fb-surface, #fff);
  border-radius: 0 var(--fb-radius, 3px) var(--fb-radius, 3px) 0;
}
.fb-heard[hidden] { display: none; }
.fb-heard-label {
  flex: 0 0 auto; white-space: nowrap;
  font-size: .78rem; letter-spacing: .04em; color: var(--fb-ink-faint, #888);
}
.fb-heard-text {
  flex: 1 1 8rem; min-width: 0; padding: .3rem .45rem;
  font-family: var(--fb-serif, Georgia, serif); font-size: .95rem;
  color: var(--fb-ink, #111); background: transparent;
  border: 0; border-bottom: 1px dashed var(--fb-rule, #ccc); border-radius: 0;
}
.fb-heard-text:focus {
  outline: none;
  border-bottom-style: solid; border-bottom-color: var(--fb-jade, #2a6);
}
.fb-heard-go {
  flex: 0 0 auto; white-space: nowrap; cursor: pointer;
  padding: .25rem .6rem; font-size: .78rem;
  border: 1px solid var(--fb-rule, #ccc); border-radius: var(--fb-radius, 3px);
  background: var(--fb-surface, #fff); color: var(--fb-ink, #111);
  transition: border-color 150ms ease;
}
.fb-heard-go:hover { border-color: var(--fb-ink-soft, #555); }
.fb-heard-hint { flex: 1 0 100%; font-size: .72rem; color: var(--fb-ink-faint, #888); }

/* ---- stop reading ---------------------------------------------------------
   Fixed to the viewport while anything is being read aloud. The button that
   started it is up in the toolbar and scrolls away as you read the answer, so
   stopping used to mean scrolling back up to find it. Sits above the drawer. */
.fb-stopbar {
  position: fixed; left: 50%; bottom: max(1rem, env(safe-area-inset-bottom));
  transform: translateX(-50%); z-index: 2147483002;
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .5rem 1rem; cursor: pointer;
  font-size: .85rem; font-family: inherit;
  /* Deliberately NOT the theme tokens. This is the one element mounted on the
     host page rather than inside .fb-shell, so it sits on a background we do
     not control. Following --fb-ink/--fb-paper made it light-on-light on
     doorm.ai whenever the visitor's device was in dark mode: the tokens
     flipped, the WordPress page around it did not. A floating control has to
     carry its own contrast. */
  color: #fff; background: #17120e;
  border: 1px solid oklch(100% 0 0 / 22%); border-radius: 999px;
  box-shadow: 0 2px 14px oklch(0% 0 0 / 35%);
}
.fb-stopbar:hover { background: oklch(52% 0.19 27); }   /* 朱砂, literal for the same reason */
.fb-stopbar:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
.fb-stopbar .fb-ico { font-size: .7em; line-height: 1; }
@media (prefers-reduced-motion: no-preference) {
  .fb-stopbar { animation: fb-stopbar-in 150ms cubic-bezier(0.16, 1, 0.3, 1); }
}
@keyframes fb-stopbar-in {
  from { opacity: 0; transform: translateX(-50%) translateY(.5rem); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0); }
}

/* ---- voice conversation bar -----------------------------------------------
   Fixed for the whole conversation: says what it is doing and ends it from
   anywhere. Ending used to mean scrolling back to the toolbar, and when
   speaking over the answer cut it off nothing on screen said why — so working
   barge-in read as a fault. Literal colours for the same reason as .fb-stopbar:
   this sits on the host page, not inside .fb-shell. */
.fb-voicebar {
  position: fixed; left: 50%; bottom: max(1rem, env(safe-area-inset-bottom));
  transform: translateX(-50%); z-index: 2147483002;
  display: flex; align-items: center; gap: .75rem;
  max-width: min(92vw, 30rem);
  padding: .5rem .6rem .5rem 1rem;
  font-size: .85rem; line-height: 1.3;
  color: #fff; background: #17120e;
  border: 1px solid oklch(100% 0 0 / 22%); border-radius: 999px;
  box-shadow: 0 2px 14px oklch(0% 0 0 / 35%);
}
.fb-voicebar-say {
  flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fb-voicebar-end {
  flex: 0 0 auto; cursor: pointer; white-space: nowrap;
  padding: .3rem .8rem; font-size: .8rem; font-family: inherit;
  color: #17120e; background: #fff;
  border: 0; border-radius: 999px;
}
.fb-voicebar-end:hover { background: oklch(88% 0.06 30); }
.fb-voicebar-end:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
@media (pointer: coarse) {
  .fb-voicebar { min-height: 48px; }
  .fb-voicebar-end { min-height: 36px; padding-inline: 1rem; }
}

/* ---- attached page --------------------------------------------------------
   A photographed page attaches to the question instead of replacing it, so the
   composer has to show that something is riding along and let it be taken off
   again. Reads as a chip on the input, not as a second control. */
.fb-attach {
  display: flex; flex-wrap: wrap; align-items: center; gap: .3rem .5rem;
  margin: .4rem 0 0;
}
.fb-attach[hidden] { display: none; }
.fb-attach-chip {
  display: inline-flex; align-items: center; gap: .3rem;
  max-width: 14rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  padding: .2rem .55rem; font-size: .78rem;
  border: 1px solid var(--fb-jade, #2a6); border-radius: 999px;
  color: var(--fb-jade, #2a6); background: var(--fb-jade-wash, transparent);
}
.fb-attach-drop {
  border: 0; background: none; cursor: pointer; padding: 0 .2rem;
  font-size: 1rem; line-height: 1; color: var(--fb-ink-faint, #888);
}
.fb-attach-drop:hover { color: var(--fb-seal, #b33); }
.fb-attach-hint { font-size: .75rem; color: var(--fb-ink-faint, #888); }

/* ---- runtime view (ADR-042 D11) ------------------------------------------
   The steps this answer actually went through. Styled as a receipt, not a
   diagram: a numbered rail, monospace values, nothing decorative. It reports
   the OS layer — isolation, retrieval, gates, egress, seal — and must never
   grow a kernel visualisation (F8). */
.fb-runtime { margin: 1rem 0 0; }
.fb-runtime[hidden] { display: none; }
.fb-rt > summary {
  cursor: pointer; list-style: none;
  padding: .4rem 0; font-size: .82rem; letter-spacing: .03em;
  color: var(--fb-ink-soft, #555); border-top: 1px solid var(--fb-rule, #ddd);
}
.fb-rt > summary::-webkit-details-marker { display: none; }
.fb-rt > summary::before {
  content: "▸"; display: inline-block; width: 1em;
  color: var(--fb-ink-faint, #888); transition: transform 150ms ease;
}
.fb-rt[open] > summary::before { transform: rotate(90deg); }
.fb-rt-list {
  list-style: none; counter-reset: fb-rt;
  margin: .3rem 0 0; padding: 0 0 0 1.1rem;
  border-left: 1px solid var(--fb-rule, #ddd);
}
.fb-rt-list li {
  counter-increment: fb-rt; position: relative;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .15rem .6rem;
  padding: .3rem 0;
}
/* The rail tick sits on the border, so the sequence reads as one pass. */
.fb-rt-list li::before {
  content: ""; position: absolute; left: -1.1rem; top: .75rem;
  width: .55rem; height: 1px; background: var(--fb-rule, #ddd);
}
.fb-rt-step {
  flex: 0 0 5.5rem; font-size: .78rem; color: var(--fb-ink-soft, #555);
}
.fb-rt-val {
  flex: 1 1 10rem; min-width: 0;
  font-family: var(--fb-mono, monospace); font-size: .78rem;
  color: var(--fb-ink, #111); word-break: break-word;
}
/* A step that can be replayed on its own says so by being a link. */
.fb-rt-val a {
  color: inherit; text-decoration: underline;
  text-decoration-color: var(--fb-rule, #ccc); text-underline-offset: .18em;
}
.fb-rt-val a:hover { text-decoration-color: currentColor; }
.fb-rt-note {
  margin: .5rem 0 0; padding-left: 1.1rem;
  font-size: .72rem; line-height: 1.5; color: var(--fb-ink-faint, #888);
}
@media (max-width: 520px) {
  .fb-rt-step { flex: 1 0 100%; }
  .fb-rt-val { flex: 1 0 100%; }
}

/* ---- phones ---------------------------------------------------------------
   The drawer is full-screen on a phone and the standalone page is narrow, so
   everything added above has to stack rather than sit side by side, and none of
   it may push the page sideways. */
@media (max-width: 480px) {
  .fb-heard { gap: .35rem .4rem; padding: .5rem .55rem; }
  .fb-heard-text { flex: 1 0 100%; font-size: 1rem; }  /* 1rem: iOS zooms below 16px */
  .fb-heard-go { flex: 0 0 auto; }
  .fb-attach-chip { max-width: calc(100% - 2.5rem); }
  .fb-attach-hint { flex: 1 0 100%; }
  .fb-rt-note { padding-left: .8rem; }
  .fb-rt-list { padding-left: .8rem; }
  .fb-rt-list li::before { left: -.8rem; width: .4rem; }
}

/* A thumb needs a real target even where a cursor does not. */
@media (pointer: coarse) {
  .fb-heard-go, .fb-attach-drop {
    min-height: 44px; min-width: 44px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  .fb-stopbar { min-height: 48px; padding-inline: 1.25rem; }
  .fb-rt > summary { padding: .6rem 0; }
}

/* Long values (hashes, term lists) must scroll inside their own row, never
   widen the page. */
.fb-rt-val, .fb-heard, .fb-attach { max-width: 100%; }
.fb-rt-val { overflow-wrap: anywhere; }

/* ---------------------------------------------------------------------------
   Side drawer (all pages of the three sites). The host page shifts left instead
   of being covered; on a phone the drawer takes the whole screen.
   --------------------------------------------------------------------------- */
:root { --fb-drawer-w: 33vw; }
/* Pushing the page aside only when what is left is still a desktop width: host sites
   pick their layout from the viewport, not from the space they actually get, so a
   squeezed page keeps its desktop navigation and breaks. Narrower screens: overlay. */
html.fb-drawer-open.fb-drawer-push { margin-right: var(--fb-drawer-w); transition: margin-right .22s ease; }
html.fb-drawer-dragging, html.fb-drawer-dragging * { transition: none !important; user-select: none; }

.fb-drawer-handle {
  position: fixed; right: 0; top: 50%; z-index: 2147483000;
  transform: translateY(-50%);
  writing-mode: vertical-rl; text-orientation: mixed;
  padding: 14px 7px; border: 0; border-radius: 6px 0 0 6px; cursor: pointer;
  font: 600 13px/1.2 "Inter", "PingFang SC", "Noto Sans CJK SC", -apple-system, sans-serif;
  letter-spacing: .12em; color: #fff; background: #1f2a30;
  box-shadow: -2px 2px 10px rgba(0,0,0,.18);
  transition: right .22s ease, background .15s;
}
.fb-drawer-handle:hover, .fb-drawer-handle:focus-visible { background: #b8452a; outline: none; }
.fb-drawer-handle[hidden] { display: none; }
html.fb-drawer-open .fb-drawer-handle { right: var(--fb-drawer-w); }

.fb-drawer {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 2147483001;
  width: var(--fb-drawer-w); max-width: 100vw;
  display: flex; flex-direction: column;
  background: var(--fb-paper, #fff); color: var(--fb-ink, #111);
  border-left: 1px solid var(--fb-rule, #ddd);
  box-shadow: -8px 0 24px rgba(0,0,0,.12);
  transform: translateX(100%); transition: transform .22s ease;
  font-family: var(--fb-sans, -apple-system, sans-serif);
}
html.fb-drawer-open .fb-drawer { transform: translateX(0); }
.fb-drawer[hidden] { display: none; }
/* the full panel's page layout (.fb-shell) must not leak into the drawer */
.fb-drawer.fb-shell { max-width: 100vw; margin: 0; padding: 0; }
.fb-drawer-grip {
  position: absolute; left: -4px; top: 0; bottom: 0; width: 8px; cursor: ew-resize;
}
.fb-drawer-grip:hover, .fb-drawer-grip:focus-visible { background: var(--fb-rule, #ddd); outline: none; }
.fb-drawer-head {
  display: flex; align-items: center; gap: .75rem;
  padding: .85rem 1rem; border-bottom: 1px solid var(--fb-rule, #ddd);
}
.fb-drawer-title { flex: 1; font-size: .95rem; color: var(--fb-ink, #111); }
.fb-drawer-full { font-size: .8rem; color: var(--fb-ink-soft, #555); white-space: nowrap; }
.fb-drawer-close {
  border: 0; background: none; font-size: 1.5rem; line-height: 1; cursor: pointer;
  color: var(--fb-ink-soft, #555); padding: 0 .25rem;
}
/* Two faces: the question and its record, or what this OS is for. They are
   deliberately not one scroll — a description must never read as evidence of
   what ran (ADR-042 D11.4.1). */
.fb-drawer-tabs {
  display: flex; gap: .25rem; padding: 0 1rem;
  border-bottom: 1px solid var(--fb-rule, #ddd);
}
.fb-drawer-tab {
  border: 0; background: none; cursor: pointer;
  padding: .55rem .7rem; margin-bottom: -1px;
  font: inherit; font-size: .85rem; color: var(--fb-ink-soft, #555);
  border-bottom: 2px solid transparent;
}
.fb-drawer-tab:hover { color: var(--fb-ink, #111); }
.fb-drawer-tab[aria-selected="true"] {
  color: var(--fb-ink, #111); border-bottom-color: var(--fb-jade, #2f6f5e);
}
.fb-drawer-body { flex: 1; overflow-y: auto; padding: 1rem; overscroll-behavior: contain; }
.fb-os-line {
  margin: 0 0 1.25rem; font-size: .88rem; line-height: 1.7;
  color: var(--fb-ink, #111);
}
.fb-os-where {
  margin: 0 0 .5rem; font-size: .72rem; font-weight: 400; letter-spacing: .08em;
  text-transform: uppercase; color: var(--fb-ink-faint, #888);
}
.fb-os-forms { margin: 0; padding: 0; list-style: none; }
.fb-os-forms li {
  padding: .55rem 0; border-bottom: 1px solid var(--fb-rule, #eee);
  font-size: .88rem; line-height: 1.5;
}
.fb-os-forms li:last-child { border-bottom: 0; }
.fb-os-forms a { color: var(--fb-ink, #111); text-decoration: none; }
.fb-os-forms a:hover { text-decoration: underline; }
.fb-os-forms span { color: var(--fb-ink-soft, #555); }
.fb-os-foot { margin: 1.1rem 0 0; font-size: .78rem; color: var(--fb-ink-faint, #888); }
.fb-os-note {
  margin: 1.5rem 0 0; padding-top: .75rem;
  border-top: 1px solid var(--fb-rule, #eee);
  font-size: .75rem; line-height: 1.6; color: var(--fb-ink-faint, #888);
}
.fb-drawer-lede { margin: 0 0 .75rem; font-size: .85rem; color: var(--fb-ink-soft, #555); }
/* Same in the drawer: its body is what scrolls, so the field sticks to the top
   of that, bleeding into the body's side padding so nothing shows beside it. */
.fb-drawer-form {
  display: flex; gap: .5rem;
  /* -1rem: the body's own top padding is inside the sticky box, so top:0 left a
     1rem slit above the field with the answers scrolling through it */
  position: sticky; top: -1rem; z-index: 5;
  margin: 0 -1rem; padding: 1.1rem 1rem .6rem;
  background: var(--fb-paper, #fff);
  box-shadow: 0 1px 0 var(--fb-rule, #ddd), 0 8px 12px -12px rgba(0,0,0,.35);
}
.fb-drawer .fb-turn { scroll-margin-top: 6.5rem; }
.fb-drawer-q {
  flex: 1; min-width: 0; padding: .55rem .7rem; font-size: 1rem;
  border: 1px solid var(--fb-rule, #ccc); border-radius: var(--fb-radius, 4px);
  background: var(--fb-surface, #fff); color: var(--fb-ink, #111);
}
.fb-drawer-go {
  padding: .55rem 1rem; border: 0; border-radius: var(--fb-radius, 4px); cursor: pointer;
  background: var(--fb-ink, #111); color: var(--fb-paper, #fff); font-weight: 600;
}
.fb-drawer-go:disabled { opacity: .5; cursor: wait; }
.fb-drawer-tools { display: flex; flex-wrap: wrap; gap: .5rem; margin: .6rem 0 .3rem; }
.fb-drawer-tools > button, .fb-drawer-photo {
  display: inline-flex; align-items: center; gap: .35rem; cursor: pointer;
  padding: .35rem .7rem; font-size: .85rem; border-radius: var(--fb-radius, 4px);
  border: 1px solid var(--fb-rule, #ccc); background: var(--fb-surface, #fff); color: var(--fb-ink, #111);
}
.fb-drawer-tools > button[hidden] { display: none; }
.fb-drawer-note { margin: .2rem 0 .6rem; font-size: .75rem; color: var(--fb-ink-faint, #888); }
.fb-drawer-status { margin: .3rem 0; font-size: .85rem; color: var(--fb-ink-soft, #555); }
.fb-drawer-status:empty, .fb-drawer-err:empty { display: none; }
.fb-drawer-err { margin: .3rem 0; font-size: .85rem; color: var(--fb-seal, #b33); }
.fb-drawer-out { margin-top: .5rem; }
.fb-drawer-sites { margin-top: 1.2rem; border-top: 1px solid var(--fb-rule, #ddd); padding-top: .8rem; }
.fb-drawer-sites h3 { margin: 0 0 .5rem; font-size: .9rem; color: var(--fb-ink, #111); }
.fb-drawer-sites ul { list-style: none; margin: 0; padding: 0; }
.fb-drawer-sites li { padding: .55rem 0; border-bottom: 1px dashed var(--fb-rule, #ddd); }
.fb-drawer-sites li:last-child { border-bottom: 0; }
.fb-drawer-sites a { display: block; font-weight: 600; color: var(--fb-ink, #111); text-decoration: none; }
.fb-drawer-sites a:hover { text-decoration: underline; }
.fb-drawer-sites small { display: block; margin-top: .15rem; font-size: .78rem; color: var(--fb-ink-soft, #555); }
.fb-drawer-site {
  display: inline-block; margin-bottom: .2rem; padding: 0 .4rem; font-size: .7rem;
  border-radius: 999px; border: 1px solid var(--fb-rule, #ccc); color: var(--fb-ink-soft, #555);
}
.fb-here .fb-drawer-site { border-color: var(--fb-jade, #2a6); color: var(--fb-jade, #2a6); }
/* Who this site is written for: three sites are three audiences (D11 P4). */
.fb-drawer-who {
  display: inline-block; margin: 0 0 .2rem .35rem;
  font-size: .7rem; color: var(--fb-ink-faint, #888);
}
.fb-drawer-cta { display: inline-block; margin-top: .2rem; font-size: .75rem; color: var(--fb-seal, #b33); }
.fb-drawer-none { color: var(--fb-ink-faint, #888); font-size: .85rem; }

@media (max-width: 767px) {
  html.fb-drawer-open { margin-right: 0; overflow: hidden; }
  .fb-drawer { width: 100vw; }
  html.fb-drawer-open .fb-drawer-handle { display: none; }
  .fb-drawer-handle { padding: 12px 6px; font-size: 12px; }
}
@media (prefers-reduced-motion: reduce) {
  .fb-drawer, .fb-drawer-handle, html.fb-drawer-open { transition: none; }
}

/* ---------------------------------------------------------------------------
   Conversation thread + voice conversation (panel and drawer)
   --------------------------------------------------------------------------- */
.fb-shell .fb-thread { display: flex; flex-direction: column; gap: 1.25rem; }
.fb-shell .fb-turn + .fb-turn { border-top: 1px solid var(--fb-rule); padding-top: 1.25rem; }
.fb-shell .fb-q {
  align-self: flex-end; max-width: 85%; margin: 0 0 .6rem auto;
  padding: .45rem .8rem; border-radius: 12px 12px 2px 12px;
  background: var(--fb-surface); border: 1px solid var(--fb-rule); color: var(--fb-ink);
  width: fit-content; word-break: break-word;
}
.fb-shell .fb-q-label {
  margin-right: .4rem; font-size: .72rem; letter-spacing: .06em; color: var(--fb-ink-faint);
}
.fb-shell .fb-conv-tools { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .75rem 0; }
.fb-shell .fb-conv-tools button, .fb-shell .fb-drawer-new, .fb-shell .fb-drawer-voice {
  display: inline-flex; align-items: center; gap: .35rem; cursor: pointer;
  padding: .35rem .75rem; font-size: .85rem; border-radius: var(--fb-radius, 4px);
  border: 1px solid var(--fb-rule); background: var(--fb-surface); color: var(--fb-ink);
}
.fb-shell .fb-conv-tools button[hidden], .fb-shell .fb-drawer-new[hidden] { display: none; }
.fb-shell .fb-voice.fb-voice-on {
  background: var(--fb-seal); border-color: var(--fb-seal); color: #fff;
  animation: fb-voice-pulse 1.6s ease-in-out infinite;
}
@keyframes fb-voice-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(200, 70, 40, .35); } 50% { box-shadow: 0 0 0 6px rgba(200, 70, 40, 0); } }
.fb-shell .fb-conv-status { font-size: .85rem; color: var(--fb-ink-soft); }
.fb-drawer-hint { margin: .8rem 0 0; font-size: .78rem; color: var(--fb-ink-faint, #888); }
.fb-drawer-hint[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) { .fb-shell .fb-voice.fb-voice-on { animation: none; } }
.fb-drawer-photo.fb-disabled, .fb-shell button:disabled { opacity: .5; cursor: not-allowed; }
.fb-drawer-photo.fb-disabled { pointer-events: none; }

/* --- where the sources sit: lit = cited in this record, dim = held but not cited.
   Jade is the colour of located evidence everywhere else, so it is here too. */
.fb-where { margin: 0 0 calc(var(--fb-step) * 1.5); }
.fb-where h4 { margin: 0 0 calc(var(--fb-step) * 0.5); font: 600 0.8rem/1.4 var(--fb-sans); color: var(--fb-ink-soft); letter-spacing: 0.04em; }
.fb-where-map { --fb-sea: oklch(94% 0.018 225); --fb-land: oklch(96.5% 0.02 88); --fb-coast: oklch(74% 0.03 80);
  display: block; width: 100%; height: auto; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-sea); }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .fb-where-map { --fb-sea: oklch(21% 0.02 235); --fb-land: oklch(29% 0.015 70); --fb-coast: oklch(45% 0.02 70); } }
:root[data-theme="dark"] .fb-where-map, .dark .fb-where-map { --fb-sea: oklch(21% 0.02 235); --fb-land: oklch(29% 0.015 70); --fb-coast: oklch(45% 0.02 70); }
.fb-land { fill: var(--fb-land); stroke: var(--fb-coast); stroke-width: 0.5; stroke-linejoin: round; }
.fb-grat line { stroke: var(--fb-ink-faint); stroke-opacity: 0.25; stroke-width: 0.4; }
.fb-grat text { font: 5.5px var(--fb-mono); fill: var(--fb-ink-faint); }
.fb-tr ellipse { fill: none; stroke: var(--fb-ink-faint); stroke-width: 0.7; stroke-dasharray: 2 2; }
.fb-tr text { font: 8px var(--fb-sans); fill: var(--fb-ink-faint); }
.fb-tr-on ellipse { fill: var(--fb-jade-wash); fill-opacity: 0.82; stroke: var(--fb-jade); stroke-width: 1.2; stroke-dasharray: none; transition: fill-opacity 150ms; }
.fb-tr-on text { font-weight: 700; fill: var(--fb-jade); }
.fb-tr-on:hover ellipse, .fb-tr-on:focus-visible ellipse { fill-opacity: 0.55; }
.fb-tr-on:focus-visible { outline: none; }
.fb-tr-on:focus-visible ellipse { stroke-width: 2; }
.fb-where-list { margin: calc(var(--fb-step) * 0.5) 0 0; font: 600 0.85rem/1.5 var(--fb-sans); color: var(--fb-jade); }
.fb-where-note { margin: 2px 0 0; font: 0.72rem/1.5 var(--fb-sans); color: var(--fb-ink-faint); }

.fb-place { margin-top: calc(var(--fb-step) * 0.75); border-left: 2px solid var(--fb-jade); padding-left: var(--fb-step); }
.fb-place summary { cursor: pointer; font: 600 0.85rem/1.6 var(--fb-sans); color: var(--fb-ink); }
.fb-place summary:hover { color: var(--fb-jade); }
.fb-place dl { margin: calc(var(--fb-step) * 0.5) 0 0; }
.fb-place dt { margin-top: var(--fb-step); font: 600 0.72rem/1.4 var(--fb-sans); letter-spacing: 0.06em; color: var(--fb-ink-soft); }
.fb-place dd { margin: 2px 0 0; font: 0.85rem/1.65 var(--fb-sans); color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-place-why { margin-left: 0.5em; color: var(--fb-ink-soft); }
.fb-place-src { display: block; margin-top: 2px; font-size: 0.72rem; line-height: 1.5; color: var(--fb-ink-faint); }
.fb-place-book { margin: 0; font-size: 0.78rem; color: var(--fb-ink-soft); }
.fb-place blockquote { margin: 4px 0; padding: 0 0 0 var(--fb-step); border-left: 1px solid var(--fb-rule); font: 0.9rem/1.9 var(--fb-serif); }
.fb-place blockquote p { margin: 0 0 4px; }
.fb-place blockquote ul { margin: 0; padding: 0; list-style: none; }
.fb-place blockquote li { margin: 0 0 4px; }
.fb-place blockquote b { margin-right: 0.5em; font: 600 0.72rem var(--fb-sans); color: var(--fb-jade); }
.fb-place-apart { margin: var(--fb-step) 0 0; padding-top: calc(var(--fb-step) * 0.5); border-top: 1px dashed var(--fb-rule); font: 0.72rem/1.6 var(--fb-sans); color: var(--fb-ink-faint); }
.fb-place a { color: var(--fb-jade); text-underline-offset: 3px; }
.fb-place a:hover { color: var(--fb-ink); }
.fb-pin { fill: var(--fb-jade); stroke: var(--fb-surface); stroke-width: 0.6; }

/* --- the page's own answer: the fragment explained in its context ----------
   The looked-up fragment is the headline, set large in the serif; the four
   parts hang from one rule down the side so they read as one explanation in
   four steps, not four cards. Quoted lines sit on the paper tone with the
   fragment marked, so what was written and what was quoted never look alike. */
.fb-ctx { margin-top: 1.1rem; }
.fb-ctx-head { padding-bottom: 0.7rem; border-bottom: 2px solid var(--fb-ink); }
.fb-ctx-kicker { margin: 0; font-family: var(--fb-mono); font-size: 0.7rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fb-jade); }
.fb-ctx-kicker span { margin-inline-start: 0.7rem; padding: 0.05rem 0.45rem; border: 1px solid var(--fb-rule); border-radius: 999px; letter-spacing: 0.06em; color: var(--fb-ink-soft); }
.fb-ctx-frag { margin: 0.3rem 0 0; font-family: var(--fb-serif); font-size: clamp(1.5rem, 1.1rem + 2vw, 2.3rem); font-weight: 600; line-height: 1.3; color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-ctx-part { position: relative; padding: 0.95rem 0 0.95rem 1.15rem; border-inline-start: 1px solid var(--fb-rule); margin-inline-start: 0.3rem; }
.fb-ctx-part::before { content: ''; position: absolute; inset-inline-start: -4px; top: 1.35rem; width: 7px; height: 7px; border-radius: 50%; background: var(--fb-jade); }
.fb-ctx-part + .fb-ctx-part { border-top: 0; }
.fb-ctx-sense .fb-lens-text { font-size: 1.04rem; }
.fb-ctx-gone::before { background: none; border: 1px dashed var(--fb-ink-faint); }
.fb-ctx-why { margin: 0; font-size: 0.82rem; color: var(--fb-ink-faint); }
.fb-ctx-sub { font-size: 0.78rem; color: var(--fb-ink-faint); }
.fb-ctx-quoted { margin-top: 0.7rem; padding: 0.6rem 0.8rem; background: var(--fb-surface); border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); }
.fb-ctx-quoted h5 { display: flex; align-items: baseline; gap: 0.6rem; flex-wrap: wrap; margin: 0 0 0.4rem; font-size: 0.8rem; font-weight: 600; color: var(--fb-ink-soft); }
.fb-ctx-kwic, .fb-ctx-larger { margin: 0; padding: 0; list-style: none; }
.fb-ctx-kwic li { padding: 0.28rem 0; font-size: 0.9rem; line-height: 1.7; color: var(--fb-ink-soft); overflow-wrap: anywhere; }
.fb-ctx-kwic li + li { border-top: 1px dotted var(--fb-rule); }
.fb-ctx-kwic mark { padding: 0 0.15em; background: none; color: var(--fb-ink); font-weight: 700; box-shadow: inset 0 -0.5em 0 var(--fb-jade-wash); box-shadow: inset 0 -0.5em 0 color-mix(in oklab, var(--fb-jade) 22%, transparent); }
.fb-ctx-larger { display: flex; flex-wrap: wrap; gap: 0.4rem 0.5rem; }
.fb-ctx-larger li { display: inline-flex; align-items: baseline; gap: 0.45rem; padding: 0.2rem 0.55rem; border: 1px solid var(--fb-rule); border-radius: 999px; }
.fb-ctx-term { font-family: var(--fb-serif); font-size: 0.95rem; color: var(--fb-ink); }
.fb-ctx-from { font-size: 0.7rem; color: var(--fb-ink-faint); }
.fb-ctx-setting { margin: 0.7rem 0 0; display: grid; gap: 0.3rem; font-size: 0.86rem; }
.fb-ctx-setting div { display: grid; grid-template-columns: 6.5em 1fr; gap: 0.6rem; }
.fb-ctx-setting dt { color: var(--fb-ink-faint); }
.fb-ctx-setting dd { margin: 0; color: var(--fb-ink-soft); overflow-wrap: anywhere; }
.fb-ctx .fb-where { margin-top: 0.8rem; }
/* what was cut is said, in the tone of a note, not of an error */
.fb-ctx-trimmed { margin: 0.6rem 0 0 0.3rem; padding-inline-start: 1.15rem; border-inline-start: 1px dashed var(--fb-rule); font-size: 0.82rem; color: var(--fb-ink-faint); }
/* --- EthnoMed Copilot: the ten-page workbench in the drawer (ADR-044) ---------
   A ledger, not a dashboard: a numbered contents list, a mode band that never
   scrolls away, and pages that say what is missing in the same type as what is
   there. The mode has a colour of its own on every page head (doctor is ink,
   student is jade, public is a dashed grey, being the downgraded one), and red
   stays reserved for what was actually blocked. */
.fb-copilot { padding-top: 0; }
.fb-cp-head { display: flex; align-items: baseline; gap: .6rem; flex-wrap: wrap; padding: 1rem 0 .6rem; }
.fb-cp-head strong { font-family: var(--fb-display, var(--fb-serif)); font-size: 1.15rem; letter-spacing: .01em; }
.fb-cp-head span { font-size: .75rem; color: var(--fb-ink-faint); }
.fb-cp-modebar {
  position: sticky; top: 0; z-index: 5; margin: 0 -1rem; padding: .7rem 1rem .75rem;
  background: var(--fb-paper); border-top: 2px solid var(--fb-ink); border-bottom: 1px solid var(--fb-rule);
  box-shadow: 0 8px 12px -12px rgba(0,0,0,.35);
}
.fb-cp-modes { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); overflow: hidden; }
.fb-cp-mode {
  border: 0; border-inline-start: 1px solid var(--fb-ink); background: none; color: var(--fb-ink-soft);
  font: inherit; font-size: .82rem; padding: .45rem .3rem; cursor: pointer;
  transition: background-color 150ms, color 150ms;
}
.fb-cp-mode:first-child { border-inline-start: 0; }
.fb-cp-mode:hover { background: var(--fb-surface); color: var(--fb-ink); }
.fb-cp-mode:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: -2px; }
.fb-cp-mode[aria-pressed="true"] { background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-now { margin: .6rem 0 0; display: flex; gap: .5rem; align-items: baseline; font-size: .8rem; }
.fb-cp-now span { color: var(--fb-ink-faint); font-family: var(--fb-mono); font-size: .68rem; letter-spacing: .06em; text-transform: uppercase; }
.fb-cp-now strong { font-family: var(--fb-serif); font-size: .98rem; }
.fb-cp-down {
  margin: .5rem 0 0; padding: .45rem .6rem; font-size: .8rem; line-height: 1.55;
  color: var(--fb-seal); background: var(--fb-seal-wash); border-inline-start: 3px solid var(--fb-seal);
}
.fb-cp-gate, .fb-cp-gate-note { margin: .5rem 0 0; font-size: .8rem; line-height: 1.55; color: var(--fb-ink-soft); }
.fb-cp-gate { display: flex; flex-wrap: wrap; gap: .4rem; align-items: end; }
.fb-cp-gate .fb-cp-gate-note { flex-basis: 100%; margin: 0; }
.fb-cp-gate label { display: grid; gap: .2rem; flex: 1 1 12rem; font-size: .72rem; color: var(--fb-ink-faint); }
.fb-cp-gate input { font: inherit; font-size: .85rem; padding: .35rem .5rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); color: var(--fb-ink); }
.fb-cp-gate button, .fb-cp-retry, .fb-cp-back {
  font: inherit; font-size: .8rem; padding: .35rem .7rem; cursor: pointer;
  border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: none; color: var(--fb-ink);
}
.fb-cp-gate button[type="submit"] { background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-limits { margin: .55rem 0 0; padding: 0 0 0 .6rem; list-style: none; font-size: .78rem; line-height: 1.6; color: var(--fb-ink-soft); }
.fb-cp-modebar[data-mode="public"] .fb-cp-limits { border-inline-start: 1px dashed var(--fb-ink-faint); }
.fb-cp-modebar[data-mode="student"] .fb-cp-limits { border-inline-start: 2px solid var(--fb-jade); }
.fb-cp-modebar[data-mode="doctor"] .fb-cp-limits { border-inline-start: 2px solid var(--fb-ink); }
.fb-cp-always { margin: .5rem 0 0; font-size: .7rem; color: var(--fb-ink-faint); letter-spacing: .02em; }
.fb-cp-view[aria-busy="true"] { opacity: .55; transition: opacity 150ms; }
.fb-cp-h { margin: 1.2rem 0 .3rem; font-family: var(--fb-mono); font-size: .68rem; font-weight: 400; letter-spacing: .08em; text-transform: uppercase; color: var(--fb-ink-faint); }
.fb-cp-index { margin: 0; padding: 0; list-style: none; border-top: 1px solid var(--fb-ink); }
.fb-cp-row {
  width: 100%; display: grid; grid-template-columns: 2.2rem 1fr auto; gap: .5rem; align-items: baseline;
  padding: .7rem 0; border: 0; border-bottom: 1px solid var(--fb-rule); background: none;
  font: inherit; text-align: start; color: var(--fb-ink); cursor: pointer;
}
.fb-cp-row:hover .fb-cp-t, .fb-cp-row:focus-visible .fb-cp-t { text-decoration: underline; text-underline-offset: .2em; }
.fb-cp-row:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
.fb-cp-n { font-family: var(--fb-mono); font-size: .75rem; color: var(--fb-ink-faint); }
.fb-cp-t { font-family: var(--fb-serif); font-size: 1.02rem; }
.fb-cp-row[data-page="case"] .fb-cp-t { font-size: 1.3rem; font-weight: 700; }
.fb-cp-s { font-size: .7rem; color: var(--fb-ink-faint); }
.fb-cp-row[data-status="live"] .fb-cp-s, .fb-cp-chip[data-status="live"] { color: var(--fb-jade); }
.fb-cp-row[data-status="partial"] .fb-cp-s { color: var(--fb-ink-soft); }
.fb-cp-row[data-access="unavailable"] .fb-cp-t { color: var(--fb-ink-faint); }
.fb-cp-back { margin: 1rem 0 0; border-color: var(--fb-rule); color: var(--fb-ink-soft); }
.fb-cp-back:hover { border-color: var(--fb-ink); color: var(--fb-ink); }
.fb-cp-pagehead { margin: .9rem 0 0; padding-bottom: .7rem; border-bottom: 2px solid var(--fb-ink); }
.fb-cp-pagehead h3 { margin: .1rem 0 .5rem; font-family: var(--fb-display, var(--fb-serif)); font-size: 1.45rem; line-height: 1.25; }
.fb-cp-chips { margin: 0; display: flex; flex-wrap: wrap; gap: .35rem; }
.fb-cp-chip { font-size: .7rem; padding: .15rem .5rem; border: 1px solid var(--fb-rule); border-radius: 999px; color: var(--fb-ink-soft); }
.fb-cp-chip[data-mode="doctor"] { background: var(--fb-ink); border-color: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-chip[data-mode="student"] { background: var(--fb-jade-wash); border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-cp-chip[data-mode="public"] { border-style: dashed; border-color: var(--fb-ink-faint); }
.fb-cp-chip[data-access="unavailable"] { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-cp-block { margin: 1.1rem 0 0; font-size: .86rem; line-height: 1.65; color: var(--fb-ink-soft); }
.fb-cp-block h4 { margin: 0 0 .3rem; font-family: var(--fb-mono); font-size: .68rem; font-weight: 400; letter-spacing: .08em; text-transform: uppercase; color: var(--fb-ink-faint); }
.fb-cp-block p { margin: 0; }
.fb-cp-block ul { margin: 0; padding-inline-start: 1.1rem; }
.fb-cp-block .fb-cp-fields { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .4rem; }
.fb-cp-fields code { font-family: var(--fb-mono); font-size: .72rem; padding: .1rem .4rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); color: var(--fb-ink); }
.fb-cp-moderow { padding: .55rem 0 .55rem .7rem; border-inline-start: 1px solid var(--fb-rule); margin-top: .5rem; }
.fb-cp-moderow[data-current="true"] { border-inline-start: 3px solid var(--fb-ink); }
.fb-cp-moderow strong { font-family: var(--fb-serif); color: var(--fb-ink); }
.fb-cp-missing { padding: .7rem .8rem; border: 1px dashed var(--fb-ink-faint); border-radius: var(--fb-radius); }
.fb-cp-block .fb-cp-note { margin-top: .5rem; font-size: .74rem; color: var(--fb-ink-faint); }
.fb-cp-refuse { padding-inline-start: .8rem; border-inline-start: 3px solid var(--fb-seal); }
.fb-cp-refuse h4 { color: var(--fb-seal); }
.fb-cp-err { margin: 1rem 0 .5rem; color: var(--fb-seal); font-size: .85rem; }
.fb-cp-loading { margin: 1rem 0; font-size: .85rem; color: var(--fb-ink-faint); }
.fb-cp-disclaimer { margin: 1.6rem 0 0; padding-top: .7rem; border-top: 1px solid var(--fb-rule); font-size: .72rem; line-height: 1.6; color: var(--fb-ink-faint); }
@media (prefers-reduced-motion: reduce) { .fb-cp-mode, .fb-cp-view { transition: none; } }
/* page 9, the corpus register: figures set like a ledger total, tables in mono */
.fb-cp-figure { font-size: .82rem; color: var(--fb-ink-faint); }
.fb-cp-figure strong { font-family: var(--fb-display, var(--fb-serif)); font-size: 1.7rem; font-weight: 700; color: var(--fb-ink); margin-inline: .6rem .15rem; }
.fb-cp-figure strong:first-child { margin-inline-start: 0; }
.fb-cp-table { width: 100%; margin-top: .6rem; border-collapse: collapse; font-size: .78rem; }
.fb-cp-table th, .fb-cp-table td { padding: .4rem .3rem; border-bottom: 1px solid var(--fb-rule); text-align: start; vertical-align: top; }
.fb-cp-table thead th { font-family: var(--fb-mono); font-size: .64rem; font-weight: 400; letter-spacing: .06em; text-transform: uppercase; color: var(--fb-ink-faint); border-bottom-color: var(--fb-ink); }
.fb-cp-table tbody th { font-weight: 400; color: var(--fb-ink); }
.fb-cp-table td { font-family: var(--fb-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
.fb-cp-table small { display: block; font-family: var(--fb-mono); font-size: .64rem; color: var(--fb-ink-faint); white-space: normal; }
.fb-cp-use { font-family: var(--fb-sans); }
.fb-cp-use[data-use="non_commercial"], .fb-cp-use[data-use="internal_only"] { color: var(--fb-seal); }
.fb-cp-use[data-use="open"] { color: var(--fb-jade); }
.fb-cp-block .fb-cp-there { display: flex; flex-wrap: wrap; gap: .35rem; margin: .2rem 0 0; padding: 0; list-style: none; }
.fb-cp-there li { font-size: .76rem; padding: .15rem .55rem; border-radius: 999px; }
.fb-cp-there li[data-there="yes"] { border: 1px solid var(--fb-jade); color: var(--fb-jade); background: var(--fb-jade-wash); }
.fb-cp-there li[data-there="no"] { border: 1px dashed var(--fb-ink-faint); color: var(--fb-ink-faint); }
.fb-cp-sources summary { cursor: pointer; font-size: .82rem; color: var(--fb-ink); padding: .4rem 0; border-top: 1px solid var(--fb-ink); border-bottom: 1px solid var(--fb-rule); }
.fb-cp-sources summary:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
.fb-cp-scroll { overflow-x: auto; }
/* pages 1 and 8: the release answering now, replay, and what is not connected */
.fb-cp-running p { display: flex; gap: .6rem; align-items: baseline; margin: .15rem 0; font-size: .8rem; }
.fb-cp-running span { min-width: 5.5em; color: var(--fb-ink-faint); }
.fb-cp-running code { font-family: var(--fb-mono); font-size: .78rem; color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-cp-replay { display: flex; flex-wrap: wrap; gap: .4rem; align-items: end; margin-top: .5rem; }
.fb-cp-replay label { display: grid; gap: .2rem; flex: 1 1 12rem; font-family: var(--fb-mono); font-size: .68rem; color: var(--fb-ink-faint); }
.fb-cp-replay input { font-family: var(--fb-mono); font-size: .82rem; padding: .35rem .5rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); color: var(--fb-ink); }
.fb-cp-replay button { font: inherit; font-size: .8rem; padding: .35rem .8rem; cursor: pointer; border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-replay-status { margin: .4rem 0 0; font-size: .78rem; color: var(--fb-ink-soft); min-height: 1.2em; }
.fb-cp-off { font-family: var(--fb-sans); font-size: .74rem; padding: .1rem .5rem; border: 1px dashed var(--fb-ink-faint); border-radius: 999px; color: var(--fb-ink-faint); }

/* The gap register (page 1). Ten pages all reading 「部分接通」 say nothing about
   whether anything is moving; these rows say who each missing thing waits for.
   「该我们做」 is the only group we can close by working, so it is the only one
   marked — the rest are asks to other people and read as plain rows. The prose
   column wraps: it carries a reason, not a number. */
.fb-cp-tally { display: flex; flex-wrap: wrap; gap: .35rem 1.1rem; margin: .6rem 0 0; padding: 0; list-style: none; font-size: .74rem; color: var(--fb-ink-faint); }
.fb-cp-tally b { font-family: var(--fb-mono); font-size: .88rem; font-weight: 400; color: var(--fb-ink); margin-inline-end: .2rem; }
.fb-cp-gaps td { white-space: normal; font-family: var(--fb-sans); font-variant-numeric: normal; }
.fb-cp-gaps td:last-child { white-space: nowrap; }
.fb-cp-gaps tbody th[scope="row"] { white-space: nowrap; }
.fb-cp-gaps tr.fb-cp-gap-ours { background: var(--fb-jade-wash); }
.fb-cp-gaps tr.fb-cp-gap-ours th[scope="row"] { box-shadow: inset 2px 0 0 var(--fb-jade); }
.fb-cp-gaps tr.fb-cp-gap-by_design td, .fb-cp-gaps tr.fb-cp-gap-by_design th { color: var(--fb-ink-faint); }
/* page 5: the rules that refuse today, set as a numbered statute rather than cards */
.fb-cp-block .fb-cp-rules { margin: .5rem 0 0; padding: 0; list-style: none; border-top: 1px solid var(--fb-ink); }
.fb-cp-rules li { display: grid; grid-template-columns: 1fr; gap: .15rem; padding: .55rem 0 .55rem .8rem; border-bottom: 1px solid var(--fb-rule); border-inline-start: 3px solid var(--fb-seal); }
.fb-cp-rules code { font-family: var(--fb-mono); font-size: .68rem; color: var(--fb-seal); letter-spacing: .04em; }
.fb-cp-rules strong { font-family: var(--fb-serif); font-size: .95rem; color: var(--fb-ink); }
.fb-cp-rules span { font-size: .8rem; line-height: 1.6; color: var(--fb-ink-soft); }
/* on a page the band keeps the switch and the mode's name; what the mode limits
   is on the page head's own chips, and in full on the index */
.fb-cp-modebar[data-compact="true"] .fb-cp-limits, .fb-cp-modebar[data-compact="true"] .fb-cp-always { display: none; }
/* page 4: the lookup, its cited rows, and paths set as a ledger of edges */
.fb-cp-ask { display: grid; gap: .5rem; }
.fb-cp-ask label { display: grid; gap: .2rem; font-size: .72rem; color: var(--fb-ink-faint); }
.fb-cp-ask input { font: inherit; font-size: .92rem; padding: .45rem .55rem; border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: var(--fb-surface); color: var(--fb-ink); }
.fb-cp-ask .fb-cp-to { border-color: var(--fb-rule); font-size: .85rem; }
.fb-cp-ask button { justify-self: start; font: inherit; font-size: .85rem; padding: .4rem 1.1rem; cursor: pointer; border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-block .fb-cp-evidence { margin: .3rem 0 0; padding: 0; list-style: none; }
.fb-cp-evidence li { display: grid; grid-template-columns: 2rem 1fr; padding: .6rem 0; border-bottom: 1px solid var(--fb-rule); }
.fb-cp-evidence strong { font-family: var(--fb-serif); font-size: 1rem; color: var(--fb-ink); }
.fb-cp-evidence p { margin: .15rem 0 .25rem; color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-cp-evidence small, .fb-cp-cite { font-size: .68rem; color: var(--fb-ink-faint); overflow-wrap: anywhere; }
.fb-cp-cite code, .fb-cp-evidence code { font-family: var(--fb-mono); }
.fb-cp-cite a { color: var(--fb-jade); }
.fb-cp-node { display: flex; gap: .6rem; align-items: baseline; padding: .5rem .7rem; border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); }
.fb-cp-node > span { font-family: var(--fb-mono); font-size: .64rem; letter-spacing: .08em; color: var(--fb-ink-faint); }
.fb-cp-node strong, .fb-cp-end strong { font-family: var(--fb-serif); font-size: 1.05rem; color: var(--fb-ink); }
.fb-cp-node small, .fb-cp-end small { margin-inline-start: .4rem; font-size: .7rem; color: var(--fb-ink-faint); }
.fb-cp-end em { margin-inline-start: .4rem; font-size: .68rem; font-style: normal; color: var(--fb-seal); }
.fb-cp-block .fb-cp-edges, .fb-cp-block .fb-cp-path { margin: .2rem 0 0 .9rem; padding: 0 0 0 .9rem; list-style: none; border-inline-start: 1px solid var(--fb-ink); }
.fb-cp-edges li, .fb-cp-path li { display: grid; grid-template-columns: 3.4rem 1fr; gap: 0 .4rem; padding: .4rem 0; border-bottom: 1px dotted var(--fb-rule); }
.fb-cp-path li { grid-template-columns: 1.2rem 1fr; }
.fb-cp-path li > .fb-cp-end:first-child { grid-column: 1 / -1; }
.fb-cp-rel, .fb-cp-hop { font-family: var(--fb-mono); font-size: .66rem; color: var(--fb-jade); align-self: center; }
.fb-cp-cite { grid-column: 2; }
.fb-cp-block h5 { margin: 1rem 0 .3rem; font-family: var(--fb-serif); font-size: .95rem; color: var(--fb-ink); }
.fb-cp-seven div { display: grid; grid-template-columns: 7.5em 1fr; gap: .5rem; padding: .25rem 0; border-bottom: 1px dotted var(--fb-rule); font-size: .76rem; }
.fb-cp-seven dt { font-family: var(--fb-mono); color: var(--fb-ink-faint); }
.fb-cp-seven dd { margin: 0; font-family: var(--fb-mono); color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-cp-block .fb-cp-nc { margin-top: .6rem; padding: .5rem .7rem; font-size: .78rem; line-height: 1.6; color: var(--fb-ink); border-inline-start: 3px solid var(--fb-seal); background: var(--fb-seal-wash); }
/* --- copilot pages 02 / 03 / 06 / 07: a case file, not a chat --------------------
   A refusal is a vermilion card with its passage; a withheld candidate is
   struck; a clause that says the opposite is marked in vermilion inside an
   otherwise jade row; "not connected" is dashed and never a number. */
.fb-cp-case { display: grid; gap: .6rem; }
.fb-cp-case label { display: grid; gap: .2rem; font-size: .72rem; color: var(--fb-ink-faint); }
.fb-cp-case textarea, .fb-cp-case input, .fb-cp-case select {
  font: inherit; font-size: .88rem; padding: .45rem .55rem; color: var(--fb-ink);
  border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface);
}
.fb-cp-case textarea { border-color: var(--fb-ink); font-family: var(--fb-serif); font-size: 1rem; line-height: 1.6; resize: vertical; }
.fb-cp-case textarea:focus-visible, .fb-cp-case input:focus-visible, .fb-cp-case select:focus-visible, .fb-cp-ask input:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 1px; }
.fb-cp-case summary { cursor: pointer; font-size: .78rem; color: var(--fb-ink-soft); padding: .3rem 0; }
.fb-cp-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(9.5rem, 1fr)); gap: .5rem; margin-top: .4rem; }
.fb-cp-case > button, .fb-cp-toplan, .fb-cp-export button {
  justify-self: start; font: inherit; font-size: .85rem; padding: .45rem 1.2rem; cursor: pointer;
  border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: var(--fb-ink); color: var(--fb-paper);
}
.fb-cp-toplan, .fb-cp-export button { background: none; color: var(--fb-ink); margin-top: .6rem; }
.fb-cp-toplan:hover, .fb-cp-export button:hover { background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-studylabel { margin: 1rem 0 0; padding: .3rem .7rem; display: inline-block; font-size: .74rem; border: 1px solid var(--fb-jade); color: var(--fb-jade); background: var(--fb-jade-wash); }
.fb-cp-hard { padding-inline-start: .8rem; border-inline-start: 3px solid var(--fb-ink); }
.fb-cp-refusal { margin: .5rem 0 0; padding: .7rem .8rem; background: var(--fb-seal-wash); border-inline-start: 3px solid var(--fb-seal); }
.fb-cp-refusal header { display: flex; flex-wrap: wrap; gap: .5rem; align-items: baseline; }
.fb-cp-refusal header code { font-family: var(--fb-mono); font-size: .68rem; color: var(--fb-seal); }
.fb-cp-refusal header strong { font-family: var(--fb-serif); font-size: 1rem; color: var(--fb-ink); }
.fb-cp-refusal p { margin: .4rem 0 0; color: var(--fb-ink); }
.fb-cp-refusal p > span:first-child, .fb-cp-falsified > span { font-family: var(--fb-mono); font-size: .64rem; letter-spacing: .06em; color: var(--fb-ink-faint); margin-inline-end: .3rem; }
.fb-cp-instead { font-weight: 600; }
.fb-cp-block blockquote { margin: .45rem 0 .2rem; padding: .1rem 0 .1rem .8rem; border-inline-start: 2px solid var(--fb-rule); font-family: var(--fb-serif); font-size: .95rem; line-height: 1.75; color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-cp-refusal blockquote { margin: .45rem 0 .2rem; padding-inline-start: .8rem; border-inline-start: 2px solid var(--fb-seal); font-family: var(--fb-serif); font-size: .9rem; line-height: 1.7; color: var(--fb-ink); }
.fb-cp-tags { display: flex; flex-wrap: wrap; gap: .3rem; align-items: baseline; margin: .3rem 0 0; }
.fb-cp-tags > span { font-family: var(--fb-mono); font-size: .64rem; color: var(--fb-ink-faint); margin-inline-end: .2rem; }
.fb-cp-block mark { padding: .05rem .4rem; border-radius: 2px; font-size: .78rem; background: var(--fb-jade-wash); color: var(--fb-jade); }
.fb-cp-block mark.fb-cp-anti, .fb-cp-refusal mark { background: var(--fb-seal-wash); color: var(--fb-seal); box-shadow: inset 0 0 0 1px var(--fb-seal); }
.fb-cp-tags span.fb-cp-anti { color: var(--fb-seal); margin-inline-start: .5rem; }
.fb-cp-cand, .fb-cp-counter { margin: .7rem 0 0; padding: .8rem 0 .2rem; border-top: 1px solid var(--fb-ink); }
.fb-cp-counter { border-top-color: var(--fb-rule); }
.fb-cp-cand header { display: grid; grid-template-columns: 2rem 1fr auto; gap: .2rem .5rem; align-items: baseline; }
.fb-cp-rank { font-family: var(--fb-display, var(--fb-serif)); font-size: 1.7rem; font-weight: 700; line-height: 1; color: var(--fb-ink); grid-row: span 2; }
.fb-cp-cand h5, .fb-cp-counter h5 { margin: 0; font-family: var(--fb-serif); font-size: 1.2rem; color: var(--fb-ink); display: inline; }
.fb-cp-cand small, .fb-cp-counter small { font-size: .7rem; color: var(--fb-ink-faint); margin-inline-start: .4rem; }
.fb-cp-cand header small { grid-column: 2; margin: 0; }
.fb-cp-score { font-family: var(--fb-mono); font-size: .72rem; color: var(--fb-ink-soft); }
.fb-cp-cand[data-withheld="true"] h5 { text-decoration: line-through; text-decoration-color: var(--fb-seal); color: var(--fb-ink-faint); }
.fb-cp-struck { margin: 0; color: var(--fb-seal); font-size: .8rem; }
.fb-cp-herbs { display: flex; flex-wrap: wrap; gap: .3rem; margin: 0; }
.fb-cp-herbs span { font-family: var(--fb-serif); font-size: .92rem; padding: .05rem .5rem; border: 1px solid var(--fb-rule); border-radius: 999px; color: var(--fb-ink); }
.fb-cp-block h6 { margin: .8rem 0 .2rem; font-size: .74rem; font-weight: 600; color: var(--fb-ink-soft); }
.fb-cp-level { margin-inline-start: .6rem; padding: .05rem .5rem; border-radius: 999px; font-family: var(--fb-sans); letter-spacing: 0; border: 1px solid var(--fb-ink-faint); color: var(--fb-ink-soft); }
.fb-cp-level[data-level="high"] { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-cp-level[data-level="low"] { border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-cp-advice { margin: 1.2rem 0 0; padding: .7rem .8rem; font-size: .86rem; line-height: 1.7; color: var(--fb-ink); border: 1px solid var(--fb-ink); }
.fb-cp-draft { margin-top: 1rem; padding: 1rem; border: 1px solid var(--fb-ink); background: var(--fb-surface); }
.fb-cp-draft h5 { margin: 1rem 0 .3rem; font-family: var(--fb-mono); font-size: .68rem; font-weight: 400; letter-spacing: .08em; text-transform: uppercase; color: var(--fb-ink-faint); }
.fb-cp-draftnote { margin: 0; padding: .4rem .6rem; font-size: .82rem; font-weight: 600; color: var(--fb-seal); border: 1px dashed var(--fb-seal); }
.fb-cp-draft ol, .fb-cp-draft ul, .fb-cp-questions { margin: 0; padding-inline-start: 1.2rem; font-size: .84rem; line-height: 1.7; color: var(--fb-ink-soft); }
.fb-cp-blank { margin: .3rem 0 0; font-size: .8rem; color: var(--fb-ink-faint); border-bottom: 1px dashed var(--fb-ink-faint); }
.fb-cp-export { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin: 0; }
.fb-cp-questions li { margin-top: .6rem; }
.fb-cp-questions p { margin: 0; color: var(--fb-ink); }
.fb-cp-falsified { font-size: .8rem; color: var(--fb-ink-soft); }
.fb-cp-columns { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: .6rem; margin-top: .7rem; }
.fb-cp-col { padding: .6rem; border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); font-size: .8rem; }
.fb-cp-col[data-filled="false"] { border: 1px dashed var(--fb-ink-faint); }
.fb-cp-col h5 { margin: 0 0 .4rem; font-family: var(--fb-serif); font-size: .98rem; color: var(--fb-ink); }
.fb-cp-col[data-filled="false"] h5 { color: var(--fb-ink-faint); }
.fb-cp-col article { padding: .4rem 0; border-top: 1px dotted var(--fb-rule); }
.fb-cp-col article p { margin: .15rem 0; color: var(--fb-ink-soft); line-height: 1.55; overflow-wrap: anywhere; }
.fb-cp-col small { font-size: .64rem; color: var(--fb-ink-faint); overflow-wrap: anywhere; }
/* the ticked case form: the screen first and in vermilion, because it is the gate */
.fb-cp-tick fieldset { margin: 0; padding: .8rem 0 0; border: 0; border-top: 1px solid var(--fb-ink); min-width: 0; }
.fb-cp-tick legend { padding: 0 .5rem 0 0; font-family: var(--fb-serif); font-size: 1rem; color: var(--fb-ink); }
.fb-cp-tick fieldset > p { margin: .2rem 0 .5rem; font-size: .8rem; line-height: 1.6; color: var(--fb-ink-soft); }
.fb-cp-screen { border-top: 3px solid var(--fb-seal) !important; }
.fb-cp-screen legend { color: var(--fb-seal); }
.fb-cp-case label.fb-cp-check { display: grid; grid-template-columns: 1.3rem 1fr; gap: .3rem; align-items: start; padding: .35rem 0; font-size: .84rem; line-height: 1.55; color: var(--fb-ink); border-bottom: 1px dotted var(--fb-rule); cursor: pointer; }
.fb-cp-case label.fb-cp-check input { margin-top: .25rem; accent-color: var(--fb-seal); }
.fb-cp-case label.fb-cp-none { border-bottom: 0; margin-top: .3rem; font-weight: 600; }
.fb-cp-case label.fb-cp-none input { accent-color: var(--fb-jade); }
.fb-cp-group h6 { margin: .6rem 0 .3rem; font-family: var(--fb-mono); font-size: .64rem; font-weight: 400; letter-spacing: .08em; color: var(--fb-ink-faint); }
.fb-cp-chips { display: flex; flex-wrap: wrap; gap: .35rem; }
.fb-cp-case label.fb-cp-chipbox { display: inline-flex; cursor: pointer; }
.fb-cp-chipbox input { position: absolute; opacity: 0; pointer-events: none; }
.fb-cp-chipbox span { font-family: var(--fb-serif); font-size: .92rem; padding: .2rem .7rem; border: 1px solid var(--fb-rule); border-radius: 999px; color: var(--fb-ink); transition: background-color 150ms, color 150ms; }
.fb-cp-chipbox:hover span { border-color: var(--fb-ink); }
.fb-cp-chipbox input:checked + span { background: var(--fb-ink); border-color: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-chipbox input:focus-visible + span { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
.fb-cp-assumed { padding: .5rem .7rem; border-inline-start: 3px solid var(--fb-seal); background: var(--fb-seal-wash); color: var(--fb-ink) !important; }
.fb-cp-draftmeta { margin: .4rem 0 0; font-size: .68rem; color: var(--fb-ink-faint); }

/* --- copilot additions 2026-09-23: doses quoted, similar records, layers, stored
   cases, pages 11 and 12. A dose is the classic's own words in a quiet frame, not
   a prescription; a caution in the text is ink, not vermilion (vermilion is ours,
   for a real refusal); a step taken back stays on screen, struck. */
.fb-cp-lbl { font-family: var(--fb-mono); font-size: .64rem; letter-spacing: .06em; color: var(--fb-ink-faint); margin-inline-end: .3rem; }
.fb-cp-quiet { font-size: .76rem; color: var(--fb-ink-faint); font-family: var(--fb-sans); }
.fb-cp-dose { margin: .6rem 0 0; padding: .6rem .7rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); }
.fb-cp-dose h6 { margin-top: 0; }
.fb-cp-dose p { margin: .25rem 0 0; color: var(--fb-ink); font-family: var(--fb-serif); overflow-wrap: anywhere; }
.fb-cp-block .fb-cp-dosechips { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .45rem; }
.fb-cp-dosechips span { font-size: .78rem; padding: .1rem .5rem; border: 1px solid var(--fb-rule); border-radius: 999px; color: var(--fb-ink); font-family: var(--fb-serif); }
.fb-cp-dosechips b { font-family: var(--fb-mono); font-weight: 400; font-size: .62rem; color: var(--fb-ink-faint); margin-inline-end: .35rem; }
.fb-cp-stance { font-size: .7rem; padding: .1rem .5rem; border: 1px solid var(--fb-ink-faint); border-radius: 999px; color: var(--fb-ink-soft); }
.fb-cp-stance[data-stance="warns"] { border-color: var(--fb-ink); color: var(--fb-ink); font-weight: 600; }
.fb-cp-caution { margin: .5rem 0 0; padding: .45rem .65rem; font-size: .8rem; line-height: 1.6; color: var(--fb-ink); border-inline-start: 3px solid var(--fb-ink); background: var(--fb-surface); }
.fb-cp-countflags { display: grid; grid-template-columns: auto 1fr; gap: .4rem 1rem; align-items: start; }
.fb-cp-block .fb-cp-flags { margin: 0; padding: 0; list-style: none; }
.fb-cp-flags li { padding: .35rem .6rem; margin-bottom: .3rem; font-size: .8rem; line-height: 1.55; color: var(--fb-ink); border: 1px solid var(--fb-ink); border-inline-start-width: 3px; border-radius: var(--fb-radius); }
.fb-cp-plain > div { min-width: 0; }
.fb-cp-block .fb-cp-pubmed { margin: .2rem 0 0; padding-inline-start: 1.2rem; }
.fb-cp-pubmed li { margin: .3rem 0; color: var(--fb-ink); overflow-wrap: anywhere; }
.fb-cp-pubmed a { color: var(--fb-jade); }
.fb-cp-pubmed small { display: block; font-size: .68rem; color: var(--fb-ink-faint); }
.fb-cp-caveats { font-size: .76rem; }
.fb-cp-block .fb-cp-diff { margin: .3rem 0 0; padding: 0; list-style: none; font-size: .8rem; color: var(--fb-ink); }
.fb-cp-collation { font-size: .72em; color: var(--fb-ink-faint); font-family: var(--fb-sans); }
.fb-cp-pre { white-space: pre-wrap; }
.fb-cp-acts { white-space: normal !important; }
.fb-cp-acts button, .fb-cp-mmreload, .fb-cp-mmdl, .fb-cp-mmsay, .fb-cp-mmmic, .fb-cp-mmact, .fb-cp-rb, .fb-cp-abvote {
  font: inherit; font-size: .76rem; padding: .25rem .6rem; margin: 0 .3rem .3rem 0; cursor: pointer;
  border: 1px solid var(--fb-ink); border-radius: var(--fb-radius); background: none; color: var(--fb-ink);
}
.fb-cp-acts button:hover, .fb-cp-mmact:hover, .fb-cp-rb:hover:not([disabled]), .fb-cp-abvote:hover, .fb-cp-mmmic:hover { background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-rb[disabled] { opacity: .45; cursor: not-allowed; }
.fb-cp-mmmic { font-size: .85rem; padding: .45rem 1.1rem; }
.fb-cp-mmmic.fb-recording { background: var(--fb-seal); border-color: var(--fb-seal); color: var(--fb-paper); }
.fb-cp-mmact[data-act="confirm"], .fb-cp-mmact[data-act="undo_ok"] { background: var(--fb-ink); color: var(--fb-paper); }
.fb-cp-block .fb-cp-parts { margin: .3rem 0 0; padding: 0; list-style: none; }
.fb-cp-parts li { display: flex; flex-wrap: wrap; gap: .2rem .5rem; align-items: baseline; padding: .4rem 0; border-bottom: 1px dotted var(--fb-rule); }
.fb-cp-parts strong { font-family: var(--fb-serif); color: var(--fb-ink); }
.fb-cp-parts small { flex-basis: 100%; font-size: .74rem; color: var(--fb-ink-faint); }
.fb-cp-parts .fb-cp-chip[data-status="live"] { color: var(--fb-jade); border-color: var(--fb-jade); }
.fb-cp-parts .fb-cp-chip[data-status="live_unvalidated"] { color: var(--fb-ink); border-color: var(--fb-ink); border-style: dotted; }
.fb-cp-block .fb-cp-mmsteps { margin: .3rem 0 0; padding: 0; list-style: none; }
.fb-cp-mmstep { padding: .7rem 0; border-top: 1px solid var(--fb-ink); }
.fb-cp-mmstep header { display: flex; flex-wrap: wrap; gap: .3rem .6rem; align-items: baseline; }
.fb-cp-mmstep header code { font-family: var(--fb-mono); font-size: .66rem; color: var(--fb-ink-faint); }
.fb-cp-mmstep header small { font-size: .68rem; color: var(--fb-ink-faint); }
.fb-cp-chip[data-step="confirmed"] { color: var(--fb-jade); border-color: var(--fb-jade); }
.fb-cp-chip[data-step="failed"], .fb-cp-chip[data-step="rolled_back"] { border-style: dashed; color: var(--fb-ink-faint); }
.fb-cp-mmstep[data-state="rolled_back"] { opacity: .6; }
.fb-cp-mmstep[data-state="rolled_back"] s { text-decoration-color: var(--fb-ink); }
.fb-cp-mmstep .fb-cp-case { margin-top: .4rem; }
.fb-cp-block .fb-cp-lines { margin: .2rem 0 0; padding-inline-start: 1rem; color: var(--fb-ink); font-family: var(--fb-serif); }
.fb-cp-lines code { font-family: var(--fb-mono); font-size: .64rem; color: var(--fb-ink-faint); margin-inline-end: .3rem; }
.fb-cp-col article[data-withheld="true"] strong { text-decoration: line-through; text-decoration-color: var(--fb-seal); color: var(--fb-ink-faint); }
@media (max-width: 480px) { .fb-cp-countflags { grid-template-columns: 1fr; } }
/* named variants (加减谱系), cockpit face and copilot page 07: one column, no red —
   nothing here is a refusal. The note saying what it is stays on screen. */
.fb-lin { margin-top: calc(var(--fb-step) * 2.2); }
.fb-lin h3 {
  font-family: var(--fb-mono); font-size: 0.72rem; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--fb-ink-faint);
  border-bottom: 1px solid var(--fb-rule); padding-bottom: 0.4rem; margin: 0 0 var(--fb-step);
}
.fb-lin h4 { margin: 0.9rem 0 0.2rem; font-size: 0.74rem; font-weight: 600; color: var(--fb-ink-soft); }
.fb-lin ul { list-style: none; margin: 0; padding: 0; }
.fb-lin-root { margin: 0; font-family: var(--fb-serif); font-size: 1.05rem; color: var(--fb-ink); }
.fb-lin-root small { font-size: 0.72rem; color: var(--fb-ink-faint); }
.fb-lin-what { margin: 0.35rem 0 0; font-size: 0.76rem; line-height: 1.6; color: var(--fb-ink-faint); }
.fb-lin-edge { padding: 0.4rem 0; border-bottom: 1px dotted var(--fb-rule); font-size: 0.86rem; line-height: 1.6; color: var(--fb-ink-soft); overflow-wrap: anywhere; }
.fb-lin-edge a, .fb-lin-edge strong, .fb-lin-root a, .fb-lin-root strong { font-family: var(--fb-serif); font-weight: 600; color: var(--fb-ink); }
.fb-lin a { text-decoration: underline; text-decoration-color: var(--fb-rule); text-underline-offset: 0.2em; }
.fb-lin a:hover, .fb-lin a:focus-visible { text-decoration-color: var(--fb-jade); }
.fb-lin-says { margin: 0 0.3rem; font-family: var(--fb-mono); font-size: 0.78rem; color: var(--fb-jade); }
.fb-lin-chip { display: inline-block; font-size: 0.7rem; line-height: 1.4; padding: 0.05rem 0.45rem; border: 1px solid var(--fb-rule); border-radius: 999px; color: var(--fb-ink-soft); }
.fb-lin-chip[data-status="agrees"] { border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-lin-chip[data-status="dose_only"] { border-style: dashed; border-color: var(--fb-ink-faint); color: var(--fb-ink-faint); }
.fb-lin-chip[data-status="more_than_named"], .fb-lin-chip[data-status="less_than_named"] { border-color: var(--fb-ink); color: var(--fb-ink); }
.fb-lin-note { display: block; font-size: 0.72rem; color: var(--fb-ink-faint); }
.fb-lin-unres { padding: 0.3rem 0; font-size: 0.8rem; color: var(--fb-ink-faint); }
.fb-lin summary { cursor: pointer; padding: 0.4rem 0; font-size: 0.8rem; color: var(--fb-ink-soft); }
.fb-lin summary:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
/* page 02: a cited population passage folds after 200 characters; cautions that did not withhold are neutral */
.fb-cp-long summary { cursor: pointer; list-style: none; }
.fb-cp-long summary::-webkit-details-marker { display: none; }
.fb-cp-preview { display: block; margin: .45rem 0 .1rem; padding-inline-start: .8rem; border-inline-start: 2px solid var(--fb-rule); font-size: .85rem; line-height: 1.6; color: var(--fb-ink); }
.fb-cp-long[open] .fb-cp-preview { display: none; }
.fb-cp-pop { margin: .6rem 0 0; padding: .5rem .7rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); }
.fb-cp-pop h6 { margin-top: 0; }
.fb-cp-popitem + .fb-cp-popitem { margin-top: .5rem; padding-top: .5rem; border-top: 1px dotted var(--fb-rule); }
.fb-cp-popitem p { margin: .2rem 0 0; color: var(--fb-ink); }
.fb-cp-popitem code { font-family: var(--fb-mono); font-size: .64rem; color: var(--fb-ink-faint); }

/* ---- EthnoMed Copilot · Voice Agent avatar shell (ADR-031 D4.2; F4 E3 2026-10-12) ----
   Photoreal local portrait + jaw band. Not a character; same tokens, both themes. */
.fb-av { --fb-av-size: 8.5rem; display: grid; grid-template-columns: var(--fb-av-size) 1fr; gap: .55rem 1.15rem; align-items: center; margin: .35rem 0 .95rem; }
.fb-av-stage { position: relative; width: var(--fb-av-size); height: var(--fb-av-size); }
.fb-av-ringbox { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; z-index: 2; }
.fb-av-ring { fill: none; transform-origin: 60px 60px; transition: stroke 320ms cubic-bezier(.16, 1, .3, 1), stroke-dasharray 320ms, opacity 320ms; }
.fb-av-ring-outer { stroke: var(--fb-rule); stroke-width: 1.1; }
.fb-av-ring-inner { stroke: var(--fb-ink-faint); stroke-width: 0.7; opacity: .4; }
.fb-av-disc { position: absolute; inset: 7%; border-radius: 50%; overflow: hidden; background: #d8d4ce url(firstbridge-avatar-face.webp) center 28%/cover no-repeat; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--fb-ink) 8%, transparent); transform-origin: 50% 50%; will-change: transform; transition: transform 80ms linear; z-index: 1; }
.fb-av-img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center 28%; user-select: none; -webkit-user-drag: none; background: transparent; }
/* Mouth frames: a crop of the portrait laid back over it (box set in JS),
   two layers crossfading. Six frames side by side in one sprite. */
.fb-av-mouth { position: absolute; pointer-events: none; }
.fb-av-mouth[hidden] { display: none; }
.fb-av-mf { position: absolute; inset: 0; background-repeat: no-repeat; background-size: 600% 100%; opacity: 0; transition: opacity 60ms linear; }
.fb-av-eyes { position: absolute; pointer-events: none; background-repeat: no-repeat; background-size: 200% 100%; }
.fb-av-eyes[hidden] { display: none; }
.fb-av-cap { display: flex; flex-wrap: wrap; align-items: baseline; gap: .35rem .7rem; margin: 0; font-size: .8rem; color: var(--fb-ink-soft); }
.fb-av-status { min-width: 4em; font-family: var(--fb-mono); font-size: .68rem; letter-spacing: .08em; text-transform: uppercase; color: var(--fb-jade); }
.fb-av-label { flex-basis: 100%; color: var(--fb-ink-faint); font-size: .72rem; line-height: 1.5; }
.fb-av-mute { font: inherit; font-size: .74rem; padding: .15rem .6rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: transparent; color: var(--fb-ink-soft); cursor: pointer; }
.fb-av-mute:hover { color: var(--fb-ink); border-color: var(--fb-ink-faint); }
.fb-av-mute:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
.fb-av-mute[aria-pressed="true"] { border-style: dashed; color: var(--fb-ink-faint); }
.fb-av[data-state="speaking"] .fb-av-ring-outer { stroke: var(--fb-jade); stroke-width: 1.45; }
.fb-av[data-state="speaking"] .fb-av-ring-inner { stroke: var(--fb-jade); opacity: .35; }
.fb-av[data-state="listening"] .fb-av-ring-outer { stroke: var(--fb-jade); stroke-dasharray: 2 6; }
.fb-av[data-state="thinking"] .fb-av-ring-outer { stroke: var(--fb-ink-faint); stroke-dasharray: 9 7; }
.fb-av[data-tone="escalate"] .fb-av-ring-outer { stroke: var(--fb-seal); stroke-width: 2.3; }
.fb-av[data-tone="escalate"] .fb-av-ring-inner { stroke: var(--fb-seal); opacity: .45; }
.fb-av[data-tone="escalate"] .fb-av-status { color: var(--fb-seal); }
@media (prefers-reduced-motion: no-preference) {
  .fb-av[data-state="thinking"] .fb-av-ring-outer { animation: fb-av-turn 2.8s linear infinite; }
  .fb-av[data-state="listening"] .fb-av-ring-outer { animation: fb-av-breathe 1.7s ease-in-out infinite; }
  .fb-av.fb-av-rhythm .fb-av-disc { animation: fb-av-talk 280ms ease-in-out infinite alternate; }
}
@keyframes fb-av-turn { to { transform: rotate(360deg); } }
@keyframes fb-av-breathe { 50% { opacity: .5; } }
@keyframes fb-av-talk { from { transform: scale(1); } to { transform: scale(1.008); } }
@media (max-width: 30rem) { .fb-av { --fb-av-size: 6.5rem; } }

/* --- 工单 + 八岗 workbench (doorm.ai page body only, firstbridge-workorder.js) --- */
.fb-wo { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); padding: .7rem .85rem; margin: .6rem 0 .9rem; }
.fb-wo-row { display: flex; gap: .9rem; align-items: flex-start; }
.fb-wo-avslot { flex: 0 0 auto; }
.fb-wo-avslot[hidden] { display: none; }
.fb-wo .fb-av { grid-template-columns: var(--fb-av-size); --fb-av-size: 7.5rem; margin: 0; }
.fb-wo .fb-av-cap { max-width: 9.5rem; }
.fb-wo-main { flex: 1 1 auto; min-width: 0; display: grid; gap: .45rem; }
.fb-wo-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .7rem; }
.fb-wo-title { font-family: var(--fb-serif); font-size: 1rem; }
.fb-wo-ids { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); overflow-wrap: anywhere; }
.fb-wo-edit, .fb-wo-pick, .fb-wb-actions button, .fb-wb-seg button, .fb-wb-tabs button {
  font: inherit; font-size: .8rem; min-height: 2.25rem; padding: .3rem .7rem; border: 1px solid var(--fb-rule);
  border-radius: var(--fb-radius); background: var(--fb-paper); color: var(--fb-ink); cursor: pointer; touch-action: manipulation; }
.fb-wo-edit { margin-left: auto; }
.fb-wo-edit:focus-visible, .fb-wo-pick:focus-visible, .fb-wb button:focus-visible, .fb-wo-form select:focus-visible { outline: 2px solid var(--fb-jade); outline-offset: 2px; }
.fb-wo-chips { display: flex; flex-wrap: wrap; gap: .3rem; }
.fb-wo-chip { font-size: .78rem; padding: .15rem .5rem; border: 1px solid var(--fb-rule); border-radius: 999px; background: var(--fb-paper); }
.fb-wo-chip small { color: var(--fb-ink-faint); margin-right: .2rem; }
.fb-wo-miss { border-style: dashed; color: var(--fb-ink-soft); }
.fb-wo-say { border-left: 3px solid var(--fb-jade); background: var(--fb-jade-wash); padding: .45rem .6rem; font-size: .9rem; line-height: 1.6; white-space: pre-line; }
.fb-wo-say[hidden], .fb-wo-picks[hidden], .fb-wo-progress[hidden], .fb-wo-note[hidden], .fb-wo-form[hidden], .fb-wb[hidden] { display: none; }
.fb-wo-picks { display: flex; flex-wrap: wrap; gap: .35rem; }
.fb-wo-default { border-style: dashed; }
.fb-wo-progress { font-size: .82rem; color: var(--fb-ink-soft); display: flex; align-items: center; gap: .4rem; }
.fb-wo-spin { width: .8rem; height: .8rem; border: 2px solid var(--fb-rule); border-top-color: var(--fb-jade); border-radius: 50%; }
@media (prefers-reduced-motion: no-preference) { .fb-wo-spin { animation: fb-av-turn .9s linear infinite; } }
.fb-wo-note { font-size: .8rem; color: var(--fb-ink-soft); border: 1px dashed var(--fb-rule); padding: .3rem .5rem; }
.fb-wo-form { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: .5rem .8rem; margin-top: .6rem; padding-top: .6rem; border-top: 1px solid var(--fb-rule); }
.fb-wo-form label { display: grid; gap: .2rem; font-size: .78rem; color: var(--fb-ink-soft); }
.fb-wo-form select { font: inherit; font-size: 16px; min-height: 2.4rem; padding: .2rem .4rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-paper); color: var(--fb-ink); }
.fb-wo-form .fb-wo-check { display: flex; align-items: center; gap: .4rem; }
.fb-wo-form input[type="checkbox"] { width: 1.1rem; height: 1.1rem; accent-color: var(--fb-jade); }

.fb-wb { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); padding: .7rem .85rem; margin: .9rem 0; }
.fb-wb-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .8rem; }
.fb-wb-head strong { font-family: var(--fb-mono); font-size: .85rem; }
.fb-wb-head > span { font-family: var(--fb-mono); font-size: .72rem; color: var(--fb-ink-faint); }
.fb-wb-actions { margin-left: auto; display: flex; flex-wrap: wrap; gap: .35rem; }
.fb-wb-stages { list-style: none; padding: 0; margin: .6rem 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr)); gap: .3rem; font-size: .76rem; }
.fb-wb-stages li { border: 1px solid var(--fb-rule); border-left-width: 3px; padding: .25rem .45rem; border-radius: var(--fb-radius); background: var(--fb-paper); }
.fb-wb-stages b { font-family: var(--fb-mono); margin-right: .2rem; }
.fb-wb-stages em { font-style: normal; color: var(--fb-ink-faint); float: right; }
.fb-st-done, .fb-st-pass { border-left-color: var(--fb-jade) !important; }
.fb-st-warn, .fb-st-downgraded, .fb-st-skipped, .fb-st-flagged, .fb-st-rewritten { border-left-color: var(--fb-ink-faint) !important; border-left-style: dashed !important; }
.fb-st-needs_human, .fb-st-fail, .fb-st-blocked { border-left-color: var(--fb-seal) !important; }
.fb-wb-tabs { display: flex; gap: .25rem; overflow-x: auto; border-bottom: 1px solid var(--fb-rule); -webkit-overflow-scrolling: touch; scrollbar-width: thin; }
.fb-wb-tabs button { border-bottom: none; border-radius: var(--fb-radius) var(--fb-radius) 0 0; white-space: nowrap; background: transparent; color: var(--fb-ink-soft); }
.fb-wb-tabs button[aria-selected="true"] { background: var(--fb-paper); color: var(--fb-ink); border-color: var(--fb-ink-faint); font-weight: 600; }
.fb-wb-pane { padding: .7rem 0 .2rem; font-size: .88rem; line-height: 1.65; min-width: 0; }
.fb-wb-pane h4 { margin: .6rem 0 .3rem; font-size: .85rem; font-family: var(--fb-serif); }
.fb-wb-seg { display: inline-flex; gap: .25rem; margin-bottom: .3rem; }
.fb-wb-seg button[aria-pressed="true"] { border-color: var(--fb-jade); color: var(--fb-jade); font-weight: 600; }
.fb-wb-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.fb-wb-cols > div { min-width: 0; }
.fb-wb-list { padding-left: 1.1rem; margin: .2rem 0; }
.fb-wb-list li { margin: .3rem 0; overflow-wrap: anywhere; }
.fb-wb-list small, .fb-wb-trace { color: var(--fb-ink-faint); font-size: .74rem; }
.fb-wb-quote { border-left: 2px solid var(--fb-jade); padding-left: .5rem; margin: .15rem 0; }
.fb-wb-withheld { border-left-style: dashed; border-left-color: var(--fb-ink-faint); color: var(--fb-ink-soft); }
.fb-wb-ref { font-family: var(--fb-mono); font-size: .74rem; color: var(--fb-jade); }
.fb-wb-tag { display: inline-block; font-size: .72rem; padding: .05rem .4rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); }
.fb-wb-tag.fb-st-pass, .fb-wb-tag.fb-st-done { border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-wb-tag.fb-st-needs_human, .fb-wb-tag.fb-st-fail, .fb-wb-tag.fb-st-blocked { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-wb-tag.fb-st-warn, .fb-wb-tag.fb-st-rewritten, .fb-wb-tag.fb-st-flagged { border-style: dashed; }
.fb-wb-empty, .fb-wb-notes { color: var(--fb-ink-soft); font-size: .8rem; }
.fb-wb-refusal { border: 1px solid var(--fb-seal); background: var(--fb-seal-wash); padding: .45rem .6rem; color: var(--fb-ink); }
.fb-wb-disclaimer { font-size: .76rem; color: var(--fb-ink-faint); border-top: 1px solid var(--fb-rule); padding-top: .4rem; }
.fb-wb .fb-ok { list-style: none; color: var(--fb-ink); }
.fb-wb .fb-bad { list-style: none; color: var(--fb-seal); }
.fb-wb-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.fb-wb-table { border-collapse: collapse; width: 100%; font-size: .8rem; }
.fb-wb-table th, .fb-wb-table td { border: 1px solid var(--fb-rule); padding: .25rem .4rem; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
@media (max-width: 40rem) {
  .fb-wo-row { flex-direction: column; align-items: stretch; }
  .fb-wo .fb-av { grid-template-columns: var(--fb-av-size) 1fr; --fb-av-size: 6rem; }
  .fb-wo .fb-av-cap { max-width: none; }
  .fb-wb-cols { grid-template-columns: 1fr; }
  .fb-wb-actions { margin-left: 0; }
}
#fb-wo-print { display: none; }
@media print {
  body.fb-wo-printing > *:not(#fb-wo-print) { display: none !important; }
  body.fb-wo-printing #fb-wo-print { display: block; color: #000; background: #fff; font: 11pt/1.5 var(--fb-sans); }
  #fb-wo-print h1 { font-size: 15pt; } #fb-wo-print h2 { font-size: 12pt; margin-top: 1rem; break-after: avoid; }
  #fb-wo-print .fb-wb-seg { display: none; }
  #fb-wo-print .fb-wb-cols { display: block; }
}
.fb-wo-avslot.fb-wo-docked { position: fixed; left: max(.75rem, env(safe-area-inset-left)); bottom: max(.75rem, env(safe-area-inset-bottom)); z-index: 60; background: var(--fb-surface); border: 1px solid var(--fb-rule); border-radius: 1rem; padding: .35rem .5rem; box-shadow: 0 6px 24px color-mix(in srgb, var(--fb-ink) 18%, transparent); }
.fb-wo-docked .fb-av { --fb-av-size: 4.5rem; grid-template-columns: var(--fb-av-size) auto; }
.fb-wo-docked .fb-av-label { display: none; }
@media print { .fb-wo-avslot.fb-wo-docked { display: none; } }

/* ── FirstBridge BodyNet (fb-bodynet / fb-bn-*) ────────────────────────────
   Compact, jade accents, mono for ids.  Consistent with drawer chrome.      */

.fb-bodynet { font-family: var(--fb-sans); font-size: .88rem; line-height: 1.6; color: var(--fb-ink); }
.fb-bn-header { padding: .6rem 0 .5rem; border-bottom: 1px solid var(--fb-rule); margin-bottom: .6rem; }
.fb-bn-header-top { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .25rem; }
.fb-bn-badge { font-family: var(--fb-mono); font-size: .7rem; letter-spacing: .1em; text-transform: uppercase; background: var(--fb-jade-wash); color: var(--fb-jade); border: 1px solid var(--fb-jade); border-radius: var(--fb-radius); padding: .1rem .45rem; }
.fb-bn-title { margin: 0 0 .25rem; font-family: var(--fb-sans); font-size: .95rem; font-weight: 600; color: var(--fb-ink); letter-spacing: .01em; }
.fb-bn-note { margin: .35rem 0 0; padding-top: .55rem; border-top: 1px solid var(--fb-rule); font-size: .75rem; line-height: 1.6; color: var(--fb-ink-faint); }
.fb-bn-open-full { margin-left: auto; font-size: .78rem; color: var(--fb-jade); text-decoration: none; white-space: nowrap; }
.fb-bn-open-full:hover { text-decoration: underline; }
.fb-bn-scenarios { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .35rem; margin-bottom: .7rem; }
.fb-bn-chip { font-size: .78rem; padding: .35rem .45rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-paper); color: var(--fb-ink); cursor: pointer; touch-action: manipulation; transition: border-color .12s, background .12s; width: 100%; text-align: center; line-height: 1.35; min-height: 2.25rem; display: flex; align-items: center; justify-content: center; height: 100%; }
.fb-bn-chip:hover { border-color: var(--fb-jade); }
.fb-bn-chip[aria-pressed="true"] { border-color: var(--fb-jade); background: var(--fb-jade-wash); color: var(--fb-jade); font-weight: 600; }
.fb-bn-chip-short { display: none; }
.fb-bn-chip-full { display: inline; }
.fb-bn-summary { margin-bottom: .6rem; padding: .5rem .6rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); }
.fb-bn-summary-text { margin: 0 0 .4rem; }
.fb-bn-meta { display: grid; grid-template-columns: auto 1fr; gap: .1rem .6rem; margin: 0; font-size: .78rem; }
.fb-bn-meta dt { color: var(--fb-ink-soft); font-weight: 400; white-space: nowrap; }
.fb-bn-meta dd { margin: 0; font-family: var(--fb-mono); font-size: .76rem; overflow-wrap: anywhere; }
.fb-bn-meta-k { font-size: .78rem; color: var(--fb-ink-soft); margin-left: .4rem; }
.fb-bn-eng-debug { margin-top: .45rem; font-size: .76rem; color: var(--fb-ink-soft); }
.fb-bn-eng-debug summary { cursor: pointer; color: var(--fb-ink-faint); }
.fb-bn-eng-debug[open] summary { margin-bottom: .3rem; }
.fb-bn-eng-debug .fb-bn-meta { margin-top: .2rem; }
.fb-bn-avatar-card { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: .45rem .75rem; align-items: center; margin-bottom: .45rem; padding: .55rem .65rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); }
.fb-bn-avatar-side { display: flex; flex-direction: column; gap: .35rem; min-width: 0; }
.fb-bn-av-status { display: flex; flex-wrap: wrap; align-items: baseline; gap: .2rem .45rem; min-width: 0; }
.fb-bn-av-title { font-size: .82rem; font-weight: 600; color: var(--fb-ink); }
.fb-bn-av-tip { flex-basis: 100%; font-size: .72rem; color: var(--fb-ink-faint); line-height: 1.4; }
.fb-bn-avatar-card .fb-av,
.fb-bn-avatar-card .fb-av.fb-bn-av-portrait { --fb-av-size: 6rem; margin: 0; display: block; grid-template-columns: none; width: 6rem; }
.fb-bn-avatar-card .fb-av-stage { width: 6rem; height: 6rem; }
.fb-bn-avatar-card .fb-av-cap { display: none !important; }
.fb-bn-avatar-slot { min-height: 0; width: 6rem; }
.fb-bn-avatar-err, .fb-bn-loading { font-size: .78rem; color: var(--fb-ink-faint); }
.fb-bn-controls { display: flex; flex-direction: row; flex-wrap: wrap; gap: .3rem; width: auto; max-width: 16rem; margin: 0; }
.fb-bn-speak-btn, .fb-bn-barge-btn, .fb-bn-play-btn, .fb-bn-export-btn, .fb-bn-mute-btn.fb-av-mute { font: inherit; font-size: .8rem; cursor: pointer; padding: .3rem .7rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-paper); color: var(--fb-ink); touch-action: manipulation; white-space: nowrap; width: auto; text-align: center; }
.fb-bn-speak-btn:hover, .fb-bn-play-btn:hover { border-color: var(--fb-jade); }
.fb-bn-speak-btn[aria-pressed="true"] { border-color: var(--fb-jade); background: var(--fb-jade-wash); color: var(--fb-jade); }
.fb-bn-barge-btn { border-color: var(--fb-ink-faint); color: var(--fb-ink-soft); }
.fb-bn-barge-btn:not([disabled]):hover { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-bn-barge-btn[disabled] { opacity: .4; cursor: default; }
.fb-bn-mute-btn.fb-av-mute { margin: 0; }
.fb-bn-export-btn { border-style: dashed; font-size: .78rem; margin-top: .4rem; width: auto; }
.fb-bn-export-btn:hover { border-color: var(--fb-jade); }
.is-barge { background: var(--fb-seal-wash); border-left: 2px solid var(--fb-seal) !important; }
.fb-bn-barge-mark { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-seal); margin-left: .35rem; }
.fb-bn-playback { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; flex-wrap: wrap; }
.fb-bn-scrubber { flex: 1 1 120px; width: 100%; accent-color: var(--fb-jade); cursor: pointer; }
.fb-bn-play-pos { font-family: var(--fb-mono); font-size: .72rem; color: var(--fb-ink-faint); white-space: nowrap; }
.fb-bn-play-btn { width: auto; }
.fb-bn-play-btn[aria-pressed="true"] { border-color: var(--fb-jade); background: var(--fb-jade-wash); }
.fb-bn-tabs { display: flex; gap: .2rem; overflow-x: auto; border-bottom: 1px solid var(--fb-rule); margin-bottom: .5rem; -webkit-overflow-scrolling: touch; scrollbar-width: thin; }
.fb-bn-tab { border-bottom: none; border-radius: var(--fb-radius) var(--fb-radius) 0 0; font-size: .78rem; white-space: nowrap; background: transparent; color: var(--fb-ink-soft); padding: .25rem .55rem; cursor: pointer; border: 1px solid transparent; }
.fb-bn-tab:hover { color: var(--fb-ink); }
.fb-bn-tab[aria-selected="true"] { background: var(--fb-surface); color: var(--fb-ink); border-color: var(--fb-rule); font-weight: 600; }
.fb-bn-pane { padding: .3rem 0 .5rem; min-width: 0; }
.fb-bn-risk-badge { display: inline-block; font-family: var(--fb-mono); font-size: .72rem; padding: .05rem .4rem; border-radius: var(--fb-radius); font-weight: 600; }
.fb-bn-risk-l0 .fb-bn-risk-badge, .fb-bn-risk-badge.fb-bn-risk-l0 { background: oklch(94% 0.006 85); color: var(--fb-ink-soft); border: 1px solid var(--fb-rule); }
.fb-bn-risk-l1 .fb-bn-risk-badge, .fb-bn-risk-badge.fb-bn-risk-l1 { background: oklch(96% 0.04 85);  color: oklch(42% 0.08 85);  border: 1px solid oklch(82% 0.05 85); }
.fb-bn-risk-l2 .fb-bn-risk-badge, .fb-bn-risk-badge.fb-bn-risk-l2 { background: oklch(96% 0.04 60);  color: oklch(40% 0.12 60);  border: 1px solid oklch(80% 0.07 60); }
.fb-bn-risk-l3 .fb-bn-risk-badge, .fb-bn-risk-badge.fb-bn-risk-l3 { background: var(--fb-seal-wash); color: var(--fb-seal);       border: 1px solid var(--fb-seal); }
.fb-bn-risk-row-l3 td, .fb-bn-risk-row-l3 th { background: var(--fb-seal-wash); }
.fb-bn-risk-row-l2 td, .fb-bn-risk-row-l2 th { background: oklch(96% 0.025 60); }
.fb-bn-risk-row-l1 td, .fb-bn-risk-row-l1 th { background: oklch(97% 0.015 85); }
.fb-bn-risk-summary { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.fb-bn-timeline { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .2rem; }
.fb-bn-event { display: flex; flex-wrap: wrap; align-items: center; gap: .2rem .5rem; padding: .25rem .4rem; border-left: 3px solid var(--fb-rule); border-radius: 0 var(--fb-radius) var(--fb-radius) 0; background: var(--fb-surface); font-size: .78rem; opacity: .45; transition: opacity .15s; }
.fb-bn-event[data-active="1"], .fb-bn-event.fb-bn-event--active { opacity: 1; }
.fb-bn-event-t { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); min-width: 2.8rem; }
.fb-bn-event-k { font-family: var(--fb-mono); font-size: .68rem; padding: .05rem .3rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); color: var(--fb-ink-soft); }
.fb-bn-event-l { flex: 1 1 0; }
.fb-bn-event-d { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); }
.fb-bn-kind-risk, .fb-bn-kind-barge_in { border-color: var(--fb-seal) !important; color: var(--fb-seal) !important; }
.fb-bn-kind-audit, .fb-bn-kind-dialogue { border-color: var(--fb-jade) !important; color: var(--fb-jade) !important; }
.fb-bn-kind-capability { border-color: oklch(55% 0.1 260) !important; color: oklch(55% 0.1 260) !important; }
.fb-bn-task { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); margin-bottom: .5rem; overflow: hidden; }
.fb-bn-task-head { display: flex; flex-wrap: wrap; align-items: center; gap: .3rem .6rem; padding: .3rem .5rem; background: var(--fb-surface); border-bottom: 1px solid var(--fb-rule); }
.fb-bn-task-id { font-size: .72rem; color: var(--fb-ink-soft); }
.fb-bn-task-badge { font-family: var(--fb-mono); font-size: .7rem; padding: .05rem .4rem; border-radius: var(--fb-radius); border: 1px solid var(--fb-rule); background: var(--fb-paper); }
.fb-bn-task-badge-done { border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-bn-task-badge-failed { border-color: var(--fb-seal); color: var(--fb-seal); }
.fb-bn-task-badge-rolled_back { border-style: dashed; color: var(--fb-ink-soft); }
.fb-bn-task-hist { list-style: none; padding: .3rem .5rem; margin: 0; font-size: .76rem; display: flex; flex-direction: column; gap: .15rem; }
.fb-bn-task-hst { font-family: var(--fb-mono); font-size: .72rem; color: var(--fb-jade); margin-right: .35rem; }
.fb-bn-hist-t { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); margin-right: .3rem; }
.fb-bn-hist-r { color: var(--fb-ink-soft); font-size: .74rem; }
.fb-bn-rollback { font-size: .76rem; color: var(--fb-ink-soft); padding: .2rem .5rem .35rem; margin: 0; border-top: 1px dashed var(--fb-rule); }
.fb-bn-rollback code { color: var(--fb-jade); font-family: var(--fb-mono); font-size: .72rem; }
.fb-bn-caps-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); gap: .6rem; }
.fb-bn-cap-card { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: .45rem .55rem; background: var(--fb-surface); transition: border-color .1s; }
.fb-bn-cap-head { display: flex; flex-wrap: wrap; align-items: center; gap: .2rem .4rem; margin-bottom: .2rem; }
.fb-bn-cap-kind { font-family: var(--fb-mono); font-size: .68rem; padding: .05rem .3rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); color: var(--fb-ink-soft); }
.fb-bn-cap-domain { font-family: var(--fb-mono); font-size: .68rem; color: var(--fb-ink-faint); margin-left: auto; }
.fb-bn-cap-name { margin: 0 0 .3rem; font-size: .85rem; }
.fb-bn-cap-meta { display: grid; grid-template-columns: auto 1fr; gap: .1rem .5rem; margin: 0 0 .35rem; font-size: .74rem; }
.fb-bn-cap-meta dt { color: var(--fb-ink-soft); }
.fb-bn-cap-meta dd { margin: 0; font-family: var(--fb-mono); font-size: .72rem; overflow-wrap: anywhere; }
.fb-bn-cap-result { min-height: 1.3rem; font-size: .76rem; margin: 0 0 .3rem; font-weight: 600; }
.fb-bn-cap-res-success { color: var(--fb-jade); }
.fb-bn-cap-res-fail, .fb-bn-cap-res-denied { color: var(--fb-seal); }
.fb-bn-cap-res-offline { color: var(--fb-ink-soft); }
.fb-bn-cap-success { border-color: var(--fb-jade); }
.fb-bn-cap-fail, .fb-bn-cap-denied { border-color: var(--fb-seal); border-style: dashed; }
.fb-bn-cap-offline { border-style: dashed; }
.fb-bn-sandbox { display: flex; flex-wrap: wrap; gap: .25rem; }
.fb-bn-sandbox-btn { font: inherit; font-size: .74rem; padding: .15rem .45rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-paper); color: var(--fb-ink); cursor: pointer; touch-action: manipulation; }
.fb-bn-sandbox-btn:hover { border-color: var(--fb-jade); }
.fb-bn-sandbox-btn[aria-pressed="true"] { border-color: var(--fb-jade); background: var(--fb-jade-wash); color: var(--fb-jade); font-weight: 600; }
.fb-bn-sandbox-fail[aria-pressed="true"], .fb-bn-sandbox-denied[aria-pressed="true"] { border-color: var(--fb-seal); background: var(--fb-seal-wash); color: var(--fb-seal); }
.fb-bn-sandbox-reset { border-style: dashed; color: var(--fb-ink-faint); }
.fb-bn-dialogue { display: flex; flex-direction: column; gap: .35rem; }
.fb-bn-turn { padding: .3rem .5rem; border-radius: var(--fb-radius); border-left: 3px solid var(--fb-rule); font-size: .82rem; }
.fb-bn-turn-agent { border-left-color: var(--fb-jade); background: var(--fb-jade-wash); }
.fb-bn-turn-user  { border-left-color: var(--fb-rule); background: var(--fb-surface); }
.fb-bn-turn.is-barge { border-left-color: var(--fb-seal); }
.fb-bn-turn-meta { display: flex; align-items: center; gap: .3rem; margin-bottom: .15rem; }
.fb-bn-turn-role { font-family: var(--fb-mono); font-size: .7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; }
.fb-bn-turn-t { font-family: var(--fb-mono); font-size: .7rem; color: var(--fb-ink-faint); }
.fb-bn-turn-text { margin: 0; line-height: 1.5; }
.fb-bn-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin-bottom: .4rem; }
.fb-bn-table { border-collapse: collapse; width: 100%; font-size: .76rem; }
.fb-bn-table th, .fb-bn-table td { border: 1px solid var(--fb-rule); padding: .2rem .4rem; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
.fb-bn-table thead th { background: var(--fb-surface); font-family: var(--fb-mono); font-size: .72rem; font-weight: 600; white-space: nowrap; }
.fb-bn-audit-note { font-size: .76rem; color: var(--fb-ink-soft); margin: 0 0 .35rem; }
.fb-bn-export-out { font-family: var(--fb-mono); font-size: .72rem; background: var(--fb-surface); border: 1px solid var(--fb-rule); padding: .5rem; border-radius: var(--fb-radius); overflow-x: auto; white-space: pre; margin-top: .4rem; max-height: 18rem; }
.fb-bn-export-out[hidden] { display: none; }
.fb-bn-mono { font-family: var(--fb-mono); font-size: .76rem; }
.fb-bn-empty { color: var(--fb-ink-faint); font-size: .82rem; margin: .4rem 0; }
.fb-bn-no-scenario { text-align: center; padding: 1rem 0; }
@media (max-width: 24.375rem) { /* 390px */
  .fb-bn-scenarios { grid-template-columns: 1fr; }
  .fb-bn-chip-full { display: none; }
  .fb-bn-chip-short { display: inline; }
  .fb-bn-av-tip { display: none; }
  .fb-bn-controls { flex-direction: column; max-width: 9.5rem; }
  .fb-bn-speak-btn, .fb-bn-barge-btn, .fb-bn-mute-btn.fb-av-mute { width: 100%; padding: .2rem .45rem; font-size: .74rem; }
  .fb-bn-avatar-card { max-height: 7.25rem; overflow: hidden; }
}
@media (max-width: 24rem) {
  .fb-bn-scenarios { grid-template-columns: 1fr; }
}
@media (max-width: 32rem) {
  .fb-bn-caps-grid { grid-template-columns: 1fr; }
}

/* >>> bodynet-env-css */
.fb-bn-env, .fb-bn-devices { margin: .75rem 0 1rem; padding: .55rem .6rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-surface); }
.fb-bn-env-title { margin: 0 0 .35rem; font-size: .9rem; font-weight: 600; display: flex; flex-wrap: wrap; align-items: center; gap: .35rem; }
.fb-bn-env-lead { margin: 0 0 .4rem; font-size: .78rem; color: var(--fb-ink-soft); }
.fb-bn-env-hint { margin: 0 0 .4rem; font-size: .78rem; color: oklch(45% 0.12 60); }
.fb-bn-env-toolbar { display: flex; flex-wrap: wrap; gap: .35rem; align-items: center; margin-bottom: .5rem; }
.fb-bn-env-city { font: inherit; font-size: .8rem; padding: .2rem .35rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); background: var(--fb-paper); }
.fb-bn-env-refresh, .fb-bn-env-speak, .fb-bn-dev-speak, .fb-bn-dev-login {
  font: inherit; font-size: .78rem; padding: .25rem .65rem; border: 1px solid var(--fb-rule); border-radius: var(--fb-radius);
  background: var(--fb-paper); color: var(--fb-ink); cursor: pointer; text-decoration: none; display: inline-block;
}
.fb-bn-env-speak, .fb-bn-dev-speak { border-color: var(--fb-jade); color: var(--fb-jade); }
.fb-bn-dev-login { border-color: var(--fb-jade); background: var(--fb-jade-wash); color: var(--fb-jade); font-weight: 600; }
.fb-bn-env-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .35rem; margin-bottom: .45rem; }
@media (min-width: 28rem) { .fb-bn-env-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .fb-bn-env-air { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.fb-bn-env-card { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: .35rem .45rem; background: var(--fb-paper); }
.fb-bn-env-card span { display: block; font-size: .7rem; color: var(--fb-ink-faint); }
.fb-bn-env-card em { font-style: normal; font-family: var(--fb-mono); font-size: .65rem; color: var(--fb-jade); margin-left: .2rem; }
.fb-bn-env-card strong { font-size: .88rem; }
.fb-bn-env-sub { margin: .35rem 0 .25rem; font-size: .82rem; }
.fb-bn-dev-grid { display: grid; grid-template-columns: 1fr; gap: .5rem; }
@media (min-width: 36rem) { .fb-bn-dev-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.fb-bn-dev-card { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: .45rem .5rem; background: var(--fb-paper); min-width: 0; }
.fb-bn-dev-card h5 { margin: 0 0 .25rem; font-size: .85rem; }
.fb-bn-dev-badge { font-style: normal; font-family: var(--fb-mono); font-size: .65rem; color: var(--fb-jade); margin-left: .25rem; }
.fb-bn-dev-lead { margin: 0 0 .4rem; font-size: .76rem; color: var(--fb-ink-soft); }
.fb-bn-dev-gate { border: 1px dashed var(--fb-rule); border-radius: var(--fb-radius); padding: .55rem; background: var(--fb-surface); }
.fb-bn-dev-gate p { margin: 0 0 .35rem; font-size: .78rem; }
.fb-bn-dev-metrics { list-style: none; margin: 0 0 .4rem; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: .3rem; }
.fb-bn-dev-metrics li { border: 1px solid var(--fb-rule); border-radius: var(--fb-radius); padding: .25rem .35rem; font-size: .76rem; }
.fb-bn-dev-metrics span { display: block; color: var(--fb-ink-faint); font-size: .7rem; }


/* --- personalinformationtower.com · src/app/globals.css --- */
.fb-shell, body.fb-page {
  --fb-paper: hsl(38 34% 97%);
  --fb-surface: hsl(38 30% 99%);
  --fb-ink: hsl(200 18% 13%);
  --fb-ink-soft: hsl(200 12% 36%);
  --fb-ink-faint: hsl(200 10% 50%);
  --fb-rule: hsl(38 16% 84%);
  --fb-seal: hsl(12 74% 44%);
  --fb-seal-wash: hsl(28 78% 95%);
  --fb-jade: hsl(168 52% 28%);
  --fb-jade-wash: hsl(168 40% 94%);
  --fb-display: var(--fb-sans);
  --fb-radius: 6px;
  color: var(--fb-ink);
}
.dark .fb-shell {
  --fb-paper: hsl(200 20% 8%);
  --fb-surface: hsl(200 17% 11%);
  --fb-ink: hsl(38 28% 92%);
  --fb-ink-soft: hsl(38 16% 76%);
  --fb-ink-faint: hsl(38 12% 62%);
  --fb-rule: hsl(200 13% 21%);
  --fb-seal: hsl(12 70% 64%);
  --fb-seal-wash: hsl(12 40% 15%);
  --fb-jade: hsl(168 48% 50%);
  --fb-jade-wash: hsl(168 30% 14%);
}
.fb-shell h1, .fb-shell h2, .fb-shell .fb-verdict { color: var(--fb-ink); }
