/* Prediligence UI. Tokens are the house deck's (reports/deck/design/deck.css)
   plus UI-only additions from the 2026-10-04 design pass
   (reports/analyze/design_return/); the design-pass section at the end of
   this file carries that pass's components. */
:root{
  /* THE DECK'S TOKENS — reports/deck/design/deck.css. Do not change these: the deck, the PDF and the PPTX are built on them. */
  --c-paper:#FBFAF7; --c-paper2:#F3F1EC; --c-ink:#1B2430; --c-ink2:#3A4452; --c-muted:#6B7280;
  --c-line:#DCD8CF; --c-line2:#E9E6DF;
  --c-accent:#1F3B5C; --c-accent-soft:#DCE5EF; --c-navy:#14263B;
  --c-low:#B3472D; --c-med:#B37D1E; --c-high:#2E7D63;
  --c-gap-bg:#F6EFE1; --c-gap-rule:#C99A3E; --c-gap-ink:#7A5212;
  --f-sans:"Inter",-apple-system,"Segoe UI",Arial,sans-serif;
  --f-serif:"Lora",Georgia,"Times New Roman",serif;
}

/* UI-ONLY ADDITIONS — everything below is new or changed in the design pass. Change freely. */
:root{
  /* chrome (top bar). The one surface darker than the deck. */
  --c-chrome:#14263B;
  --c-chrome-2:#1C3350;      /* hover / pressed on the bar */
  --c-chrome-line:#3E5673;   /* outlined buttons on the bar */
  --c-chrome-ink:#B9C6D6;    /* secondary text on the bar, 8.8:1 */
  --c-chrome-mute:#8FA3BA;   /* tertiary text on the bar, 5.9:1 */

  /* surfaces */
  --c-card:#FFFFFF;
  --c-sel:#EEF3F8;           /* a selected row / slide */
  --c-hover:#F7F5F0;         /* row hover on paper */
  --c-scrim:rgba(20,38,59,.38);

  /* verdict tints: the deck trio at chip strength. Text on these uses the full token. */
  --c-low-soft:#F6E1DB; --c-med-soft:#F6EFE1; --c-high-soft:#DFF0E8;
  --c-med-ink:#8A5F12;       /* --c-med is 3.6:1 on white; use this for med TEXT, keep --c-med for rules */

  /* gap block, inner */
  --c-gap-text:#4A3A1C;

  /* focus */
  --focus:0 0 0 2px var(--c-paper),0 0 0 4px #5B86B5;
  --focus-dark:0 0 0 2px var(--c-chrome),0 0 0 4px #9DB9D8;

  /* type */
  --f-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;   /* run ids, times, claim ids */
  --t-xs:10.5px; --t-sm:11.5px; --t-md:13px; --t-lg:15px; --t-xl:20px; --t-kpi:24px;
  --ls-cap:.08em;            /* letter-spacing for every caps label */

  /* shape and space: a 4px grid */
  --r-xs:3px; --r-sm:5px; --r-md:8px; --r-pill:999px;
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:20px; --s-6:24px;
  --sh-1:0 1px 2px rgba(20,38,59,.06);
  --sh-2:0 1px 6px rgba(20,38,59,.08);
  --sh-pop:0 8px 30px rgba(20,38,59,.16);
  --sh-modal:0 24px 60px rgba(20,38,59,.28);

  /* controls */
  --h-ctl:30px;              /* buttons and inputs; dense desktop UI */
  --h-bar:48px;
}

/* The app's older token names, aliased onto the deck's so every rule below
   that still says --ink or --rule flips with the palette. The rem type scale
   stays: the review pane is set on it and is frozen. */
:root{
  --ink:var(--c-ink); --ink-2:var(--c-ink2); --ink-3:var(--c-muted);
  --rule:var(--c-line); --rule-2:var(--c-line2); --paper:var(--c-paper); --card:var(--c-card); --stage:var(--c-paper2);
  --hi:var(--c-low); --med:var(--c-med-ink); --low:var(--c-high); --src:var(--c-muted); --link:var(--c-accent);
  --add:var(--c-high); --del:var(--c-low); --sel:var(--c-sel);
  --ui:var(--f-sans); --serif:var(--f-serif); --mono:var(--f-mono);
  --top:var(--h-bar);
  --t-xs:.7rem; --t-sm:.78rem; --t-md:.86rem; --t-lg:.95rem; --t-xl:1.1rem; --t-2xl:1.3rem;
  /* --t-s and --t-m were used by the deck-pane rules but never defined, so every
     `font:var(--t-s)/1.5 …` shorthand was invalid and dropped whole; the pane
     prose inherited the body size. Aliased, not renamed, so the rules read. */
  --t-s:var(--t-sm); --t-m:var(--t-md);
  --w-reg:400; --w-bold:600;
}
*{box-sizing:border-box}
[hidden]{display:none !important}
html,body{height:100%}
body{
  margin:0; background:var(--paper); color:var(--ink);
  font:var(--w-reg) var(--t-lg)/1.45 var(--ui); overflow:hidden;
}
a{color:var(--link)}
button{font:inherit; color:inherit; background:none; border:0; cursor:pointer}

/* ---- top bar ---- */
.top{
  height:var(--top); display:flex; align-items:center; gap:1.2rem; padding:0 1rem;
  background:var(--card); border-bottom:1px solid var(--rule);
}
.brand{font:var(--w-bold) var(--t-sm)/1 var(--ui); letter-spacing:.12em; text-transform:uppercase; color:var(--ink-3)}
.deal{flex:1; font:var(--w-reg) var(--t-md)/1.2 var(--ui); color:var(--ink-3); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.topnav a{font:var(--w-reg) var(--t-sm)/1 var(--ui); text-decoration:none; border:1px solid var(--rule); padding:.4rem .7rem; border-radius:3px; color:var(--ink-2)}
.topnav a:hover{border-color:var(--ink-3)}
.status{font:var(--w-reg) var(--t-sm)/1.5 var(--ui); color:var(--ink-3); white-space:nowrap}
.status.reviewed{color:var(--add)}

/* ---- project switcher ---- */
.proj{position:relative}
.proj-btn{
  display:flex; align-items:center; gap:.4rem; font:var(--w-bold) var(--t-md)/1.2 var(--ui); color:var(--ink);
  padding:.3rem .6rem; border:1px solid transparent; border-radius:3px; max-width:22rem;
}
.proj-btn span:first-child{white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.proj-btn:hover,.proj-btn.open{border-color:var(--rule); background:var(--paper)}
.proj-btn .caret{color:var(--ink-3); font-size:.8rem}
.proj-menu{
  position:absolute; top:calc(100% + 4px); left:0; z-index:30; min-width:22rem; max-width:30rem;
  background:var(--card); border:1px solid var(--rule); border-radius:4px; box-shadow:0 10px 30px rgba(0,0,0,.18);
  padding:.35rem; font:var(--w-reg) var(--t-md)/1.45 var(--ui);
}
.proj-item{
  display:flex; align-items:center; gap:.6rem; padding:.5rem .6rem; border-radius:3px; cursor:pointer;
  text-decoration:none; color:inherit;
}
.proj-item:hover{background:var(--paper)}
.proj-item.cur{background:var(--sel)}
.proj-item .pn{flex:1; min-width:0}
.proj-item .pn b{display:block; font:var(--w-bold) var(--t-lg)/1.25 var(--serif); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.proj-item .pn small{color:var(--ink-3); font-size:.74rem}
.proj-item .del{font:var(--w-bold) var(--t-xs)/1 var(--ui); color:var(--ink-3); padding:.3rem .4rem; border-radius:3px; visibility:hidden}
.proj-item:hover .del{visibility:visible}
.proj-item .del:hover{color:var(--hi); background:#fdf3ef}
.proj-item .del.arch:hover{color:var(--link); background:var(--sel)}
.proj-foot{display:flex; border-top:1px solid var(--rule-2); margin-top:.3rem}
.proj-foot .proj-new{border-top:0; margin-top:0; flex:1}
.proj-foot .proj-arch{font:var(--w-reg) var(--t-sm)/1.45 var(--ui); color:var(--ink-3); padding:.55rem .6rem; white-space:nowrap; background:none; border:0; cursor:pointer}
.proj-foot .proj-arch:hover{color:var(--link)}
.archive-box td.acts .danger{color:var(--hi)}
.archive-box .empty{color:var(--ink-3); padding:.6rem 0 1rem}
.proj-new{
  display:block; width:100%; text-align:left; margin-top:.3rem; padding:.55rem .6rem; border-top:1px solid var(--rule-2);
  font:var(--w-bold) var(--t-sm)/1.45 var(--ui); color:var(--link); border-radius:0 0 3px 3px;
}
.proj-new:hover{background:var(--paper)}

/* ---- modal ---- */
.modal{position:fixed; inset:0; z-index:40; background:rgba(28,26,23,.45); display:flex; align-items:center; justify-content:center; padding:1rem}
.modal-box{
  width:min(34rem, 100%); background:var(--card); border:1px solid var(--rule); border-radius:5px;
  box-shadow:0 20px 50px rgba(0,0,0,.3); padding:1.3rem 1.4rem 1.1rem; font:var(--w-reg) var(--t-md)/1.45 var(--ui);
  /* A modal is never taller than the window it is centred in. Without this a
     long one grows past the viewport and its own contents render outside the
     card — the run dialog's buttons sat below the white box, over the page. */
  max-height:calc(100vh - 2rem); overflow:auto;
}
.modal-box h2{font:var(--w-bold) var(--t-2xl)/1.2 var(--serif); margin:0 0 1rem}
.modal-box label{display:block; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); margin:0 0 .8rem}
.modal-box input{
  display:block; width:100%; margin-top:.3rem; font:var(--w-reg) var(--t-lg)/1.45 var(--ui); color:var(--ink); letter-spacing:0; text-transform:none;
  border:1px solid var(--rule); border-radius:3px; padding:.45rem .55rem; background:var(--paper);
}
/* The file picker (see .filepick below) inside the dialog: a row of its own,
   spaced like the fields above it. `.modal-box label` is display:block and
   beats `.filepick` on specificity, so the layout has to be restated here. */
.modal-box .filepick{display:flex; margin:.3rem 0 .8rem}
.modal-box .filepick .chosen{flex:1; min-width:0}
.modal-box .hint{color:var(--ink-3); font-size:.8rem; margin:.2rem 0 .9rem}
/* The new-project kind toggle. Two choices, both worth seeing without a click,
   so a segmented control rather than a dropdown. The label matches the other
   fields' and the blurb sits under the toggle rather than beside it. */
.kind{margin:0 0 .8rem}
.kind-label{display:block; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3)}
.seg{display:inline-flex; margin-top:.35rem; border:1px solid var(--rule); border-radius:4px; overflow:hidden; background:var(--paper)}
.seg-opt{
  font:var(--w-reg) var(--t-md)/1 var(--ui); color:var(--ink-2);
  padding:.5rem .95rem; border:0; border-right:1px solid var(--rule); background:transparent;
}
.seg-opt:last-child{border-right:0}
.seg-opt:hover{background:var(--rule-2)}
.seg-opt.on{background:var(--ink); color:#fff; font-weight:var(--w-bold)}
.kind .hint{margin:.35rem 0 0}
.modal-box .err{background:#fdf3ef; border:1px solid #e8cfc6; color:var(--hi); border-radius:3px; padding:.45rem .65rem; margin:0 0 .8rem; font-size:.84rem}
.modal-box .bar{position:relative; height:1.5rem; background:var(--rule-2); border-radius:3px; margin:0 0 .8rem; overflow:hidden}
.modal-box .bar .fill{position:absolute; left:0; top:0; bottom:0; width:0; background:var(--add); opacity:.35; transition:width .2s}
.modal-box .bar span{position:relative; display:block; line-height:1.5rem; padding:0 .6rem; font:.74rem/1.5rem var(--ui); color:var(--ink-2); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.modal-box .actions{display:flex; justify-content:flex-end; gap:.5rem}
.modal-box .actions button{
  font:var(--w-bold) var(--t-sm)/1 var(--ui); padding:.55rem .9rem; border:1px solid var(--rule); border-radius:3px; background:var(--card); color:var(--ink-2);
}
.modal-box .actions button.primary{background:var(--ink); border-color:var(--ink); color:#fff}
.modal-box .actions button:disabled{opacity:.5; cursor:default}

/* ---- empty review ---- */
.noreview{padding:1.2rem .4rem; font:var(--w-reg) var(--t-lg)/1.5 var(--serif); color:var(--ink-2)}
.noreview h3{font:var(--w-bold) var(--t-xl)/1.3 var(--serif); margin:0 0 .5rem}
.noreview .docs{list-style:none; padding:0; margin:.9rem 0 0; font:var(--w-reg) var(--t-md)/1.45 var(--ui)}
.noreview .docs li{display:flex; gap:.6rem; align-items:baseline; padding:.4rem 0; border-top:1px solid var(--rule-2)}
.noreview .docs li a{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.noreview .docs small{color:var(--ink-3); white-space:nowrap}

/* ---- split ---- */
.split{display:flex; height:calc(100% - var(--top)); min-height:0}
.pane{min-width:0; min-height:0; display:flex; flex-direction:column}
.slide-pane{flex:0 0 var(--left,58%); background:var(--paper)}
.issues-pane{flex:1 1 auto; background:var(--card); border-left:1px solid var(--rule)}
/* A panel page that wants the whole window — the report — hides the
   materials pane while it is open (app.js splitWide); Back restores it. */
.split.wide > .slide-pane,.split.wide > .divider{display:none}
.split.wide > .issues-pane{border-left:0}
.divider{flex:0 0 6px; cursor:col-resize; background:transparent; margin:0 -3px; z-index:2}
.divider:hover,.divider.drag{background:rgba(47,93,138,.25)}

/* ---- slide pane ---- */
.slide-head{display:flex; align-items:center; gap:.6rem; padding:.55rem .9rem; border-bottom:1px solid var(--rule)}
.slide-title{flex:1; display:flex; align-items:center; gap:.7rem; min-width:0}
.slide-num{font:var(--w-bold) var(--t-md)/1 var(--ui); white-space:nowrap}
.slide-dots{display:flex; gap:.35rem; align-items:center; flex-wrap:wrap}
.cnt{font:var(--w-reg) var(--t-xs)/1.5 var(--ui); padding:.05rem .45rem; border-radius:2px; color:#fff}
.cnt.high{background:var(--hi)} .cnt.medium{background:var(--med)} .cnt.low{background:var(--low)} .cnt.source{background:var(--src)}
.cnt.none{background:var(--rule-2); color:var(--ink-3)}
.nav{
  font:var(--w-reg) var(--t-sm)/1 var(--ui); padding:.4rem .65rem; border:1px solid var(--rule); border-radius:3px;
  background:var(--card); color:var(--ink-2);
}
.nav:hover{border-color:var(--ink-3)}
.nav:disabled{opacity:.35; cursor:default}

.stage{
  flex:1 1 auto; min-height:0; display:flex; align-items:center; justify-content:center;
  background:var(--stage); padding:1rem; position:relative;
}
.stage img{max-width:100%; max-height:100%; object-fit:contain; box-shadow:0 8px 30px rgba(0,0,0,.45); background:#fff}
.stage img.loading{opacity:.5}
.overlay{position:absolute; pointer-events:none}
/* A claim on the page is a highlighter stroke over its text, not a box: a
   translucent tint by severity, multiplied into the render so the glyphs
   stay dark and read as coloured. Boxes with borders stacked and crossed
   where three claims share two lines; tints overlap and simply deepen. */
.box{
  position:absolute; border:0; border-radius:2px; pointer-events:auto; cursor:pointer;
  mix-blend-mode:multiply; transition:background .15s, opacity .15s;
  --tint:214,208,196;
}
.box.high{--tint:222,120,100} .box.medium{--tint:232,186,96} .box.low{--tint:150,200,160} .box.source{--tint:200,196,188}
.box.faint{background:rgba(var(--tint),.28)}
.box.faint:hover{background:rgba(var(--tint),.55)}
.box.hot{background:rgba(var(--tint),.62)}
.box.flash{animation:flash 1.2s ease-out 2}
@keyframes flash{0%{background:rgba(var(--tint),.95)} 100%{background:rgba(var(--tint),.62)}}
.stage-foot{
  position:absolute; left:0; right:0; bottom:0; padding:.3rem 1rem; font:var(--w-reg) var(--t-xs)/1.4 var(--ui);
  color:var(--rule); background:rgba(0,0,0,.35);
}
.stage-note{
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  color:var(--rule); font:var(--w-reg) var(--t-xl)/1.5 var(--serif); padding:3rem; text-align:center;
}

/* reads a deck page carries because they name it: set apart from the page's
   own issues above them, and introduced by what a read is */
.reads-here{margin-top:1.2rem; border-top:1px solid var(--rule); padding-top:.8rem}
.reads-lede{font:var(--w-reg) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); margin:0 0 .6rem}
.reads-lede .lbl{display:block; margin-bottom:.15rem}

/* ---- one cold read, in its own box ---- */
.read{
  background:var(--card); border:1px solid var(--rule); border-left:4px solid var(--rule-2);
  border-radius:3px; padding:.7rem .9rem; margin:0 0 .55rem;
}
.read-head{display:flex; gap:.4rem; align-items:baseline; flex-wrap:wrap; margin-bottom:.4rem; font-family:var(--ui)}
.read-head .spacer{flex:1}
.read-title{font:var(--w-bold) var(--t-sm)/1.4 var(--ui); color:var(--ink)}
.read-run{font:var(--w-reg) var(--t-xs)/1.4 var(--mono); color:var(--ink-3)}
.read-item{font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3); border-left:1px solid var(--rule); padding-left:.4rem}
.read-named{display:flex; gap:.3rem; align-items:baseline; flex-wrap:wrap; margin:0 0 .4rem}
.read-named .read-goto{font:var(--w-reg) var(--t-xs)/1.5 var(--ui)}
.read-text{font:var(--w-reg) var(--t-sm)/1.55 var(--serif); color:var(--ink-2)}
.read-text > :first-child{margin-top:0}
.read-text h5,.read-text h6{font:var(--w-bold) var(--t-sm)/1.4 var(--ui); color:var(--ink); margin:.6rem 0 .3rem}
.read-text p{margin:0 0 .5rem}
.read-text ul,.read-text ol{margin:0 0 .5rem; padding-left:1.1rem}
.read-text li{margin:.15rem 0}
.read-text table{border-collapse:collapse; font-size:var(--t-xs); margin:0 0 .5rem}
.read-text td,.read-text th{border:1px solid var(--rule); padding:.15rem .4rem; text-align:left}
/* a read no page names, under its question on the document-wide slide */
.reads-under{margin:-.2rem 0 .9rem 1.1rem; padding-left:.9rem; border-left:2px solid var(--rule-2)}
/* The passages a question does not lead with (review_data.mark_leads): the
   proof stays, one click down, and the summary says how much of it there is. */
.reads-more>summary{
  list-style:none; cursor:pointer; padding:.3rem 0 .5rem;
  font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--link);
}
.reads-more>summary::-webkit-details-marker{display:none}
.reads-more>summary::before{content:"\25B8  "}
.reads-more[open]>summary::before{content:"\25BE  "}
.reads-more>summary:hover{text-decoration:underline}
/* a page carrying no issue but a read that names it */
.tc-read{font:var(--w-reg) var(--t-xs)/1 var(--ui); color:var(--ink-3)}

.slide-text{
  flex:0 0 auto; max-height:38%; overflow:auto; border-top:1px solid var(--rule);
  padding:.8rem 1rem; font:var(--w-reg) var(--t-md)/1.45 var(--serif); color:var(--ink-2); background:var(--card);
}
.slide-text h5,.slide-text h6{
  font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); margin:.9em 0 .3em;
}
.slide-text :first-child{margin-top:0}
.slide-text p{margin:0 0 .4em}

.filmstrip{
  flex:0 0 auto; display:flex; gap:.5rem; overflow-x:auto; padding:.6rem .9rem;
  border-top:1px solid var(--rule); background:var(--paper); scrollbar-width:thin;
}
.thumb{
  flex:0 0 auto; width:104px; border:2px solid transparent; border-radius:3px; padding:2px;
  position:relative; text-align:left;
}
.thumb img{display:block; width:100%; aspect-ratio:16/9; object-fit:cover; background:#fff; border:1px solid var(--rule)}
.thumb .tn{font:var(--w-bold) var(--t-xs)/1 var(--ui); color:var(--ink-3); margin-top:.25rem; display:flex; gap:.3rem; align-items:center; min-height:.7rem}
.thumb .tc{display:flex; gap:.2rem; align-items:center}
.thumb.sel{border-color:var(--ink)}
.thumb:hover{border-color:var(--ink-3)}
.thumb .dwbox{display:flex; aspect-ratio:16/9; align-items:center; justify-content:center; border:1px solid var(--rule); background:#fff; font:var(--w-bold) var(--t-xs)/1.2 var(--ui); color:var(--ink-3); text-align:center; padding:.4rem}
.dot{width:7px; height:7px; border-radius:50%; display:inline-block}
.dot.high{background:var(--hi)} .dot.medium{background:var(--med)} .dot.low{background:var(--low)} .dot.source{background:var(--src)}
.thumb.dim{opacity:.45}

/* ---- issues pane ---- */
.issues-head{border-bottom:1px solid var(--rule); padding:.5rem .9rem .55rem}
.head-row{display:flex; align-items:center; gap:.6rem; margin-bottom:.5rem}
/* the scope: what the list is showing, and the switch to the other scope */
.scope{display:flex; align-items:baseline; gap:.5rem; min-width:0}
.scope-now{font:var(--w-bold) var(--t-sm)/1.4 var(--ui); color:var(--ink); white-space:nowrap}
.scope-tog{
  font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--link); background:none; border:0;
  padding:0; cursor:pointer; white-space:nowrap;
}
.scope-tog:hover{text-decoration:underline}
.filters{display:flex; align-items:center; gap:.6rem; flex-wrap:wrap}
.chips{display:flex; gap:.3rem}
.chip{
  font:var(--w-reg) var(--t-xs)/1.5 var(--ui); text-transform:uppercase; letter-spacing:.06em;
  padding:.3rem .6rem; border-radius:3px; border:1px solid var(--rule); color:var(--ink-3); background:var(--card); cursor:pointer;
}
.chip.on.high{background:var(--hi); border-color:var(--hi); color:#fff}
.chip.on.medium{background:var(--med); border-color:var(--med); color:#fff}
.chip.on.low{background:var(--low); border-color:var(--low); color:#fff}
.chip.on.source{background:var(--src); border-color:var(--src); color:#fff}
/* How many issues the level holds, on the chip itself: a filter that offers a
   level says the review has one, and the count is what makes that true or
   visibly false. Only levels the review contains are offered at all. */
.chip-n{margin-left:.4rem; opacity:.75; font-variant-numeric:tabular-nums}
#fix-select,#type-select,#tg-select{font:var(--w-reg) var(--t-sm)/1.2 var(--ui); height:2rem; border:1px solid var(--rule); border-radius:3px; padding:0 .4rem; background:var(--card); color:var(--ink-2); width:100%}
/* one Filter button; the four groups live in its panel */
.filter{position:relative}
.filter-btn{display:inline-flex; align-items:center; gap:.4rem; font:var(--w-reg) var(--t-sm)/1 var(--ui); color:var(--ink-2); background:var(--card); border:1px solid var(--rule); border-radius:3px; padding:.4rem .7rem; cursor:pointer}
.filter-btn:hover,.filter-btn.open{border-color:var(--ink-3); background:var(--paper)}
.filter-btn.on{border-color:var(--ink-2); color:var(--ink)}
.filter-btn .n{font:var(--w-bold) var(--t-xs)/1.4 var(--ui); background:var(--ink); color:#fff; border-radius:9px; padding:0 .4rem}
.filter-btn .caret{color:var(--ink-3); font-size:.8rem}
.filter-panel{position:absolute; top:calc(100% + 4px); left:0; z-index:30; width:19rem; background:var(--card); border:1px solid var(--rule); border-radius:4px; box-shadow:0 10px 30px rgba(0,0,0,.18); padding:.7rem .8rem .5rem; font:var(--w-reg) var(--t-sm)/1.4 var(--ui)}
.filter-group{display:block; margin:0 0 .7rem}
.filter-group .lbl{display:block; margin-bottom:.3rem}
.filter-group .chips{display:flex; flex-wrap:wrap; gap:.3rem}
.filter-foot{display:flex; justify-content:flex-end; border-top:1px solid var(--rule-2); padding-top:.5rem}
.filter-foot button{font:var(--w-reg) var(--t-sm)/1 var(--ui); color:var(--link); background:none; border:0; padding:.2rem 0; cursor:pointer}
.filter-foot button:hover{text-decoration:underline}
.filter-sum{font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--ink-3); min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}

.issues-list{flex:1 1 auto; min-height:0; overflow-y:auto; padding:.6rem .9rem 2rem; scroll-behavior:smooth}
.empty{color:var(--ink-3); font:var(--w-reg) var(--t-md)/1.45 var(--serif); padding:1.5rem .4rem}

.walk{
  display:flex; align-items:center; gap:.6rem; padding:.5rem .9rem; border-top:1px solid var(--rule);
  background:var(--paper);
}
.walk button{
  font:var(--w-bold) var(--t-xs)/1 var(--ui); padding:.45rem .7rem; border:1px solid var(--rule); border-radius:3px;
  background:var(--card); color:var(--ink-2);
}
.walk button:hover{border-color:var(--ink-3)}
.walk button:disabled{opacity:.35; cursor:default}
.walk-pos{flex:1; text-align:center; font:var(--w-reg) var(--t-sm)/1.45 var(--ui); color:var(--ink-3); font-variant-numeric:tabular-nums}

/* ---- issue card ---- */
.obj{
  background:var(--card); border:1px solid var(--rule); border-left:4px solid var(--rule);
  border-radius:3px; padding:.7rem .9rem; margin:0 0 .55rem; cursor:pointer;
  font-family:var(--serif); font-size:.95rem; line-height:1.5;
}
.obj:hover{border-color:var(--ink-3)}
.obj.o-high:hover{border-left-color:var(--hi)} .obj.o-medium:hover{border-left-color:var(--med)} .obj.o-low:hover{border-left-color:var(--low)} .obj.o-source:hover{border-left-color:var(--src)}
.obj.o-high{border-left-color:var(--hi)}
.obj.o-medium{border-left-color:var(--med)}
.obj.o-low{border-left-color:var(--low)}
.obj.o-source{border-left-color:var(--src)}
.obj.sel{background:var(--sel); border-color:var(--ink-3); cursor:default}
.obj.sel .obj-head{cursor:pointer}          /* clicking the header collapses the card */
.obj-head{display:flex; gap:.4rem; align-items:center; flex-wrap:wrap; margin-bottom:.45rem; font-family:var(--ui)}
.obj-ord{font:var(--w-reg) var(--t-xs)/1 var(--mono); color:var(--ink-3); min-width:1.6em}
.obj-id{font:var(--w-reg) var(--t-xs)/1 var(--mono); color:var(--ink-2)}
.obj-head .spacer{flex:1}
.on-slide{font:var(--w-reg) var(--t-xs)/1 var(--ui); color:var(--ink-3); white-space:nowrap}
.on-slide a{color:var(--link); text-decoration:none; margin-left:.25rem}
.on-slide a:hover{text-decoration:underline}
/* A document-wide question's own reads named these pages; the question was
   not placed on them (review_data.placements), so the link is offered and
   nothing is asserted — lighter than .on-slide, and after it. */
.named-on{font:var(--w-reg) var(--t-xs)/1 var(--ui); color:var(--ink-3); white-space:nowrap; margin-left:.4rem; opacity:.8}
.named-on a{color:var(--link); text-decoration:none; margin-left:.25rem}
.named-on a:hover{text-decoration:underline}
.sev,.pill{
  display:inline-block; font:var(--w-reg) var(--t-xs)/1.5 var(--ui);
  padding:.08rem .45rem; border-radius:2px; white-space:nowrap;
}
.sev{text-transform:uppercase; letter-spacing:.06em}
.sev{color:#fff}
.s-high{background:var(--hi)} .s-medium{background:var(--med)} .s-low{background:var(--low)} .s-source{background:var(--src)}
.pill{background:var(--rule-2); color:var(--ink-2); border:1px solid var(--rule)}
.pill.q{background:#fdf3ef; border-color:#e8cfc6; color:var(--hi)}
.pill.ft{background:transparent}
/* why a read is on this page: it said the page, or it named a line here */
.pill.named{background:transparent; border-style:dashed; color:var(--ink-3)}
.named-fig{font:var(--w-reg) var(--t-xs)/1.5 var(--mono); color:var(--ink-2)}
.claims{display:flex; gap:.3rem; flex-wrap:wrap; align-items:center; margin:0 0 .5rem; font-family:var(--ui)}
.claims .lbl{margin-right:.2rem}

/* ---- identifier chips and their popover ---- */
.ref{
  font:var(--w-bold) 0.72em/1 var(--mono); color:var(--link); text-decoration:none; border-bottom:1px dotted var(--link);
  padding:0 .05em; cursor:pointer; white-space:nowrap;
}
.ref.ref-C{color:var(--ink-2); border-bottom-color:var(--ink-3)}
.ref.ref-E{color:var(--add); border-bottom-color:var(--add)}
.ref:hover{background:var(--sel)}
.ref .off{font-weight:400; color:var(--ink-3)}
.pop{
  position:fixed; z-index:50;   /* above a modal (40): chips inside the artifact viewer have popovers too */ max-width:26rem; background:var(--card); color:var(--ink);
  border:1px solid var(--rule); border-radius:4px; box-shadow:0 10px 30px rgba(0,0,0,.18);
  padding:.65rem .8rem; font:var(--w-reg) var(--t-sm)/1.45 var(--ui);
}
.pop-head{display:flex; gap:.4rem; align-items:center; flex-wrap:wrap; margin-bottom:.35rem}
.pop-title{font:var(--w-bold) var(--t-md)/1.3 var(--serif); margin:0 0 .3rem}
.pop-text{font:var(--w-reg) var(--t-md)/1.45 var(--serif); margin:0 0 .3rem; color:var(--ink-2)}
.pop-text.clamp{display:-webkit-box; -webkit-line-clamp:5; -webkit-box-orient:vertical; overflow:hidden}
.pop .dl{font-size:.76rem}
.pop .hint{font-size:.7rem; color:var(--ink-3); margin:.4rem 0 0}
.pop a.url{font-size:.76rem; word-break:break-all}
.range{position:relative; height:26px; margin:.45rem 0 .1rem}
.range .bar{position:absolute; left:0; right:0; top:11px; height:4px; background:var(--rule)}
.range .span{position:absolute; top:9px; height:8px; background:var(--add); opacity:.55; border-radius:2px}
.range .tick{position:absolute; top:4px; width:2px; height:18px; background:var(--hi)}
.range .lab{position:absolute; top:-12px; font:var(--w-bold) var(--t-xs)/1 var(--mono); color:var(--ink-2); transform:translateX(-50%)}
.range .lab.s{color:var(--hi)}
.range .end{position:absolute; top:16px; font:var(--w-reg) var(--t-xs)/1 var(--mono); color:var(--ink-3)}
.says{margin:0}
.obj:not(.sel) .says{
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden; color:var(--ink-2);
}
.meta{font-size:.86rem; color:var(--ink-2); margin:.6rem 0 0; padding-top:.5rem; border-top:1px solid var(--rule-2)}
.meta p{margin:0 0 .3em}
.lbl{font:var(--w-reg) var(--t-xs)/1.5 var(--ui); text-transform:uppercase; letter-spacing:.06em; color:var(--ink-3)}

/* ---- artifact fragments (from report.html) ---- */
details{margin:.5rem 0 0; font-size:.88rem}
details > summary{cursor:pointer; color:var(--link); list-style:none; padding:.3rem 0; border-top:1px solid var(--rule-2)}
details > summary::-webkit-details-marker{display:none}
details > summary::before{content:"\25B8 "; color:var(--ink-3)}
details[open] > summary::before{content:"\25BE "}
details > summary .lbl{color:inherit}
.dd{padding:.4rem 0 .2rem}
code{font:var(--w-reg) 0.86em/1.5 var(--mono); background:var(--rule-2); padding:.06em .3em; border-radius:3px; word-break:break-word}
pre{font:var(--w-reg) 0.8em/1.45 var(--mono); white-space:pre-wrap; background:var(--rule-2); padding:.5rem .7rem; border-radius:3px}
blockquote{margin:.6em 0; padding:.1em 0 .1em 1rem; border-left:3px solid var(--rule); color:var(--ink-2)}
ul,ol{margin:0 0 .8em; padding-left:1.3rem}
.tw{overflow-x:auto; margin:.6rem 0}
table{border-collapse:collapse; width:100%; font-size:.84rem; font-variant-numeric:tabular-nums lining-nums}
th,td{text-align:left; padding:.35rem .5rem; border-bottom:1px solid var(--rule-2); vertical-align:top}
thead th{border-bottom:1.5px solid var(--rule); font:var(--w-bold) var(--t-xs)/1.4 var(--ui); color:var(--ink-3)}
tbody tr:last-child td{border-bottom:0}
.ev{border-top:1px solid var(--rule-2); padding:.7rem 0}
.ev-head{display:flex; gap:.5rem; align-items:baseline; flex-wrap:wrap; margin-bottom:.3rem}
.ev-id{font:var(--w-bold) var(--t-sm)/1 var(--mono); color:var(--ink-2)}
.ev .src{font-size:.92rem; margin:0 0 .3rem}
.ev .exc{margin:.4rem 0; padding-left:.8rem; border-left:2px solid var(--rule); font-size:.9rem; color:var(--ink-2)}
.ev .url{font-size:.78rem; word-break:break-all}
.dl{display:grid; grid-template-columns:max-content 1fr; gap:.15rem .8rem; font-size:.8rem; margin:.4rem 0 0}
.dl dt{margin:0} .dl dd{margin:0; color:var(--ink-2)}
.flag{background:#fdf3ef; border:1px solid #e8cfc6; border-radius:2px; padding:.45rem .65rem; margin:.45rem 0 0; font-size:.84rem; color:var(--ink-2)}
.fig{font-variant-numeric:tabular-nums lining-nums}
.edit{border-top:1px solid var(--rule-2); padding:.8rem 0 .2rem}
.edit-head{display:flex; gap:.4rem; align-items:center; flex-wrap:wrap; margin-bottom:.5rem}
.ba-grid{display:grid; grid-template-columns:1fr 1fr; gap:1px; background:var(--rule); border:1px solid var(--rule); margin:.5rem 0}
.ba-cell{background:var(--card); padding:.6rem .75rem; font-size:.86rem}
.ba-cell.old{color:var(--ink-3)}
.ba-cell.old .line{text-decoration:line-through; text-decoration-color:var(--del)}
.ctx{margin:0 0 .35em; color:var(--ink-3)}
.ba-cell.new .line{color:var(--add)}
.ba-cell.new .line blockquote{border-left-color:var(--add); color:var(--ink-2)}
.ba-cell .lbl{display:block; margin-bottom:.35rem}
.line{margin:0 0 .35em}
.line p{margin:0}
.reason{font-size:.84rem; color:var(--ink-2); margin:.45rem 0 0}
a.trace{color:inherit; text-decoration:underline; text-decoration-style:dotted; text-decoration-color:var(--link); text-underline-offset:3px}
a.trace:hover{color:var(--link)}
tr.hit{background:var(--sel)}

@media (max-width:900px){
  body{overflow:auto}
  .split{flex-direction:column; height:auto}
  .slide-pane{flex:0 0 auto}
  .stage{height:52vw}
  .divider{display:none}
  .issues-pane{border-left:0; border-top:1px solid var(--rule)}
  .issues-list{max-height:70vh}
  .ba-grid{grid-template-columns:1fr}
}

/* ---- pipeline runs -------------------------------------------------------
   The run panel reuses the modal's shell; what is added here is the stage
   list, its progress meters and the log. Status colour is the same vocabulary
   the rest of the UI uses: --add done, --hi failed, --link working. */
.run-btn{
  font:var(--w-reg) var(--t-sm)/1 var(--ui); background:var(--card);
  border:1px solid var(--rule); color:var(--ink-2); padding:.4rem .7rem;
  border-radius:3px; cursor:pointer; white-space:nowrap
}
.run-btn:hover{border-color:var(--ink-3)}
.run-btn.live{border-color:var(--link); color:var(--link)}
.run-btn.live::before{
  content:''; display:inline-block; width:.45rem; height:.45rem; margin-right:.4rem;
  border-radius:50%; background:var(--link); vertical-align:baseline;
  animation:run-pulse 1.4s ease-in-out infinite
}
@keyframes run-pulse{0%,100%{opacity:1}50%{opacity:.25}}

/* The run box scrolls its middle, not itself: the title says which run this is
   and the buttons stop it, and both have to stay put while the stage list and
   the log grow. `min-height:0` because a flex item's default floor is its
   content, which is what let the column overflow the card in the first place. */
.run-box{width:min(46rem,96vw); max-height:88vh; display:flex; flex-direction:column; overflow:hidden}
.run-scroll{flex:1 1 auto; min-height:0; overflow-y:auto; margin:0 -.35rem; padding:0 .35rem}
.run-box .actions{flex:0 0 auto; padding-top:.7rem; border-top:1px solid var(--rule-2); margin-top:.3rem}
.run-box h2{flex:0 0 auto}
.run-intro{font-size:.82rem; color:var(--ink-3); margin:-.5rem 0 .9rem}
.run-intro b{color:var(--ink-2); font-weight:600}

.run-stages{display:flex; flex-direction:column; gap:.55rem; margin:0 0 .9rem}
.run-stage{border:1px solid var(--rule); border-radius:3px; padding:.5rem .65rem; background:var(--card)}
.run-stage-head{display:flex; align-items:baseline; gap:.5rem}
.run-stage-name{font:var(--w-bold) var(--t-md)/1.4 var(--ui); color:var(--ink)}
.run-stage-state{
  font:var(--w-bold) var(--t-xs)/1.5 var(--ui); 
  color:var(--ink-3); margin-left:auto; white-space:nowrap
}
.run-stage.running .run-stage-state{color:var(--link)}
.run-stage.done    .run-stage-state{color:var(--add)}
.run-stage.failed  .run-stage-state,
.run-stage.crashed .run-stage-state{color:var(--hi)}
.run-stage.running{border-color:var(--link)}
.run-stage.failed,.run-stage.crashed{border-color:#e8cfc6}

.run-meter{position:relative; height:.5rem; background:var(--rule-2); border-radius:3px; margin:.45rem 0 .3rem; overflow:hidden}
.run-meter .fill{position:absolute; inset:0 auto 0 0; width:0; background:var(--link); opacity:.45; transition:width .3s}
.run-stage.done .run-meter .fill{background:var(--add)}
.run-stage.failed .run-meter .fill,.run-stage.crashed .run-meter .fill{background:var(--hi)}
/* Unknown total: a stage that is working but cannot say how far along. */
.run-meter.indeterminate .fill{width:35%; animation:run-slide 1.6s ease-in-out infinite}
@keyframes run-slide{0%{left:-35%}100%{left:100%}}
.run-stage-note{font-size:.76rem; color:var(--ink-3); min-height:1.1em}
.run-stage-note code{font:var(--w-reg) var(--t-xs)/1.45 var(--mono)}

.run-log-wrap{border:1px solid var(--rule); border-radius:3px; margin:0 0 .9rem}
.run-log-wrap summary{
  font:var(--w-bold) var(--t-xs)/1.5 var(--ui); 
  color:var(--ink-3); padding:.4rem .65rem; cursor:pointer
}
.run-log{
  margin:0; padding:.5rem .65rem; border-top:1px solid var(--rule-2);
  max-height:16rem; overflow:auto; font:var(--w-reg) var(--t-xs)/1.5 var(--mono);
  color:var(--ink-2); white-space:pre-wrap; word-break:break-word; background:var(--paper)
}
.run-past{font-size:.78rem; color:var(--ink-3); margin:0 0 .9rem}
.run-past table{border-collapse:collapse; width:100%}
.run-past td{padding:.22rem .4rem .22rem 0; border-bottom:1px solid var(--rule-2); white-space:nowrap}
.run-past td.w{width:100%; white-space:normal; color:var(--ink-2)}
.run-past .s-done{color:var(--add)} .run-past .s-failed,.run-past .s-crashed{color:var(--hi)}

.run-actions{align-items:center}
.run-actions .spacer{flex:1}
.run-pages{display:flex !important; align-items:center; gap:.4rem; margin:0 !important}
.run-pages input{width:6rem; margin:0}
.run-stage-count{font:var(--w-reg) var(--t-xs)/1.4 var(--mono); color:var(--ink-3); white-space:nowrap}
.run-stage-time{font:var(--w-reg) var(--t-xs)/1.4 var(--mono); color:var(--ink-3); white-space:nowrap; margin-left:.6rem}
.run-done-note{background:#f2f6f2; border:1px solid #d7e3d9; border-radius:3px; padding:.45rem .65rem; margin:-.4rem 0 .9rem !important}
.run-done-note code{font:var(--w-reg) var(--t-xs)/1.45 var(--mono); color:var(--ink-2)}

/* ---- triage --------------------------------------------------------------
   The marks sit at the foot of every objection card so the list can be worked
   down without opening each one. A dismissed card is dimmed rather than
   hidden: the filter is what hides things, and a mark should never make an
   objection disappear out from under the person who just made it. */
.triage{display:flex; align-items:center; gap:.3rem; margin:.55rem 0 0; padding-top:.5rem; border-top:1px solid var(--rule-2)}
.tg{
  font:var(--w-bold) var(--t-xs)/1 var(--ui); letter-spacing:.03em; background:var(--card);
  border:1px solid var(--rule); color:var(--ink-3); padding:.3rem .55rem;
  border-radius:3px; cursor:pointer
}
.tg:hover{border-color:var(--ink-3); color:var(--ink-2)}
.tg.on{color:#fff}
.tg-accepted.on{background:var(--add); border-color:var(--add)}
.tg-dismissed.on{background:var(--ink-3); border-color:var(--ink-3)}
.tg-hold.on{background:var(--med); border-color:var(--med)}
.tg-clear{margin-left:auto; border-color:transparent; font-weight:400; text-transform:lowercase}
.tg-has-note{margin-left:auto; font:var(--w-bold) var(--t-xs)/1 var(--ui); color:var(--med); cursor:help}

.tg-note{
  display:block; width:100%; box-sizing:border-box; margin:.4rem 0 0; padding:.4rem .5rem;
  font:var(--w-reg) var(--t-sm)/1.45 var(--ui); color:var(--ink); background:var(--paper);
  border:1px solid var(--rule); border-radius:3px; resize:vertical
}
.tg-note:focus{outline:none; border-color:var(--ink-3); background:var(--card)}

/* A marked card keeps its severity stripe but reads as settled. */
.obj.t-dismissed{opacity:.55}
.obj.t-dismissed:hover,.obj.t-dismissed.sel{opacity:1}
.obj.t-accepted{box-shadow:inset 3px 0 0 var(--add)}
.obj.t-hold{box-shadow:inset 3px 0 0 var(--med)}

.tg-count{display:flex; align-items:center; gap:.4rem; margin-left:auto; font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3); white-space:nowrap}
.tg-count small{color:var(--ink-3); opacity:.75}
.tg-bar{display:inline-block; width:3.2rem; height:.35rem; background:var(--rule-2); border-radius:3px; overflow:hidden}
.tg-bar i{display:block; height:100%; width:0; background:var(--add); transition:width .25s}
.run-quiet{color:var(--ink-3); opacity:.8; font-style:italic}

/* ---- glossary: term chips and the definition panel ----
   The chip is deliberately quieter than an identifier chip (.ref): a term is
   part of the sentence it sits in, and the prose has to stay readable when a
   card carries four of them. */
.term{
  color:inherit; text-decoration:none; border-bottom:1px dotted var(--ink-3);
  cursor:help; padding:0 .02em;
}
.term:hover{background:var(--sel); border-bottom-color:var(--ink-2)}

.term-box{max-width:46rem; width:100%; max-height:86vh; overflow:auto; padding:1.1rem 1.3rem}
.term-head{display:flex; align-items:baseline; gap:.5rem; flex-wrap:wrap; margin:0 0 .5rem}
.term-head h2{font:var(--w-bold) var(--t-2xl)/1.2 var(--serif); margin:0}
.term-exp{font:var(--w-reg) var(--t-md)/1.3 var(--serif); color:var(--ink-2)}
.term-head .spacer{flex:1}
.term-head .x{align-self:flex-start; color:var(--ink-3); font-size:1rem; line-height:1; padding:.2rem .3rem}
.term-head .x:hover{color:var(--ink)}
.term-aka{margin:-.25rem 0 .9rem; font:var(--w-reg) var(--t-sm)/1.5 var(--ui); color:var(--ink-3)}
.term-aka .lbl{margin-right:.25rem}

.term-def h3,.term-ask h3,.term-occs h3{
  font:var(--w-bold) var(--t-xs)/1.5 var(--ui); 
  color:var(--ink-3); margin:0 0 .25rem; display:flex; align-items:baseline; gap:.5rem;
}
.term-def p{font:var(--w-reg) var(--t-lg)/1.55 var(--serif); margin:0 0 1rem; color:var(--ink)}
.term-def.warn p{color:var(--ink-2); border-left:3px solid var(--med); padding-left:.7rem}
.term-ask blockquote{
  margin:0 0 1.1rem; padding:.55rem .75rem; background:var(--paper);
  border:1px solid var(--rule); border-left:3px solid var(--link); border-radius:3px;
  font:var(--w-reg) var(--t-lg)/1.5 var(--serif); color:var(--ink);
}

.term-occs h3 .n{font:var(--w-reg) var(--t-xs)/1.5 var(--ui); letter-spacing:0; text-transform:none; color:var(--ink-3)}
.term-occs ul{list-style:none; margin:.35rem 0 0; padding:0; border-top:1px solid var(--rule-2)}
.term-occs li{
  display:flex; gap:.4rem; align-items:baseline; flex-wrap:wrap;
  padding:.45rem .3rem; border-bottom:1px solid var(--rule-2); cursor:pointer;
}
.term-occs li:hover{background:var(--rule-2)}
.term-occs .occ-text{flex:1 1 100%; font:var(--w-reg) var(--t-md)/1.45 var(--serif); color:var(--ink-2)}
.term-occs mark{background:var(--sel); color:var(--ink); padding:0 .1em}
.term-occs .empty{font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink-3); margin:.3rem 0 0}
.term-occs .more{
  margin:.5rem 0 0; font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--link);
  border-bottom:1px dotted var(--link);
}
.term-also{margin:1rem 0 0; padding-top:.7rem; border-top:1px solid var(--rule-2); font:var(--w-reg) var(--t-sm)/1.6 var(--ui)}
.term-also .lbl{margin-right:.3rem}
.term-also .term{margin-right:.5rem; border-bottom-color:var(--link); color:var(--link)}

/* ---- artifact references: the files the review's text names, followable ---- */
.arefs{display:flex; gap:.3rem .45rem; flex-wrap:wrap; align-items:center; margin:0 0 .5rem; font-family:var(--ui)}
.arefs .lbl{margin-right:.2rem}
.aref{
  font:var(--w-bold) 0.72em/1.2 var(--mono); color:var(--link); text-decoration:none; border-bottom:1px dashed var(--link);
  padding:0 .05em; cursor:pointer; word-break:break-all;
}
.aref:hover{background:var(--sel)}
.aref .k{font-weight:400; color:var(--ink-3); margin-left:.25em}
code .aref, .aref code{font:inherit; background:none; padding:0}
.art-box{max-width:52rem; width:100%; max-height:88vh; overflow:auto; padding:1rem 1.3rem 1.1rem}
.art-head{display:flex; align-items:baseline; gap:.6rem; flex-wrap:wrap; margin:0 0 .3rem}
.art-head h2{font:var(--w-bold) var(--t-xl)/1.2 var(--serif); margin:0}
.art-head .spacer{flex:1}
.art-head .x{align-self:flex-start; color:var(--ink-3); font-size:1rem; line-height:1; padding:.2rem .3rem; background:none; border:0; cursor:pointer}
.art-head .x:hover{color:var(--ink)}
.art-path{font:var(--w-reg) var(--t-xs)/1.5 var(--mono); color:var(--ink-3); margin:0 0 .8rem; word-break:break-all}
.art-path a{color:var(--link); margin-left:.5rem; white-space:nowrap}
.art-rec{border-top:1px solid var(--rule-2); padding:.6rem 0 .4rem}
/* No text-transform here: an identifier is case-sensitive (S1-S-52478b56)
   and a heading that uppercases it prints an id the artifact does not carry. */
.art-rec h3{font:var(--w-bold) var(--t-xs)/1.5 var(--mono); color:var(--ink-2); margin:0 0 .35rem}
.art-rec h3 .where{font:var(--w-reg) var(--t-xs)/1.5 var(--mono); color:var(--ink-3); margin-left:.5rem}
.art-kv{display:grid; grid-template-columns:max-content 1fr; gap:.15rem .8rem; margin:0; font:var(--w-reg) var(--t-md)/1.45 var(--ui)}
.art-kv dt{font:var(--w-bold) var(--t-xs)/1.6 var(--mono); color:var(--ink-3); margin:0}
.art-kv dd{margin:0; color:var(--ink); word-break:break-word; min-width:0}
.art-kv dd.long{font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink-2)}
.art-kv dd a{color:var(--link); word-break:break-all}
.art-kv dd ul{margin:0; padding-left:1.1rem}
.art-kv dd pre, .art-file pre{
  font:var(--w-reg) var(--t-xs)/1.45 var(--mono); background:var(--paper); border:1px solid var(--rule-2); border-radius:3px;
  padding:.5rem .6rem; margin:.1rem 0 0; white-space:pre-wrap; word-break:break-word; max-height:22rem; overflow:auto;
}
.art-empty{font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink-3); margin:.5rem 0}
.art-file{margin:.8rem 0 0; border-top:1px solid var(--rule-2); padding-top:.5rem}
.art-file summary{cursor:pointer; font:var(--w-bold) var(--t-xs)/1.6 var(--ui); color:var(--ink-3)}
.art-file pre{max-height:40vh; margin-top:.4rem}
.art-hint{font:var(--w-reg) var(--t-sm)/1.5 var(--ui); color:var(--ink-3); margin:.8rem 0 0}
.art-err{font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--hi); margin:.5rem 0}
.aref.ext{border-bottom-style:solid; font-family:var(--ui); font-weight:600}
.aref.document{color:var(--ink-2); border-bottom-color:var(--ink-3)}
.ev .doc-open, .ev .doc-line a{font:var(--w-bold) var(--t-xs)/1.4 var(--ui); color:var(--link); white-space:nowrap; margin-left:.35rem}
.ev .doc-line{margin:.3rem 0 0}
/* a source named in a sentence, linked to it: reads as prose with a dotted underline */
.src-link{color:inherit; text-decoration:none; border-bottom:1px dotted var(--link); cursor:pointer}
.src-link:hover{background:var(--sel); color:var(--link)}
.src-link::after{content:"\2197"; font-size:.7em; color:var(--link); margin-left:.15em}

/* the open card, brought back into view by a chip that names it */
@keyframes card-flash{0%{box-shadow:0 0 0 3px var(--sel)}100%{box-shadow:0 0 0 0 transparent}}
article.obj.flash{animation:card-flash 1.2s ease-out}

/* ---- sign in ---- */
.login-body{min-height:100vh; display:flex; align-items:center; justify-content:center; background:var(--paper); margin:0}
.login-box{
  width:min(22rem, calc(100% - 2rem)); background:var(--card); border:1px solid var(--rule); border-radius:5px;
  box-shadow:0 20px 50px rgba(0,0,0,.12); padding:1.4rem 1.5rem 1.2rem; font:var(--w-reg) var(--t-md)/1.45 var(--ui);
}
.login-box h1{font:var(--w-bold) var(--t-2xl)/1.2 var(--serif); margin:.5rem 0 1.1rem}
.login-box label{display:block; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); margin:0 0 .8rem}
.login-box input{
  display:block; width:100%; margin-top:.3rem; font:var(--w-reg) var(--t-lg)/1.45 var(--ui); color:var(--ink); letter-spacing:0; text-transform:none;
  border:1px solid var(--rule); border-radius:3px; padding:.5rem .6rem; background:var(--paper); box-sizing:border-box;
}
.login-box .err{background:#fdf3ef; border:1px solid #e8cfc6; color:var(--hi); border-radius:3px; padding:.45rem .65rem; margin:0 0 .8rem; font-size:.84rem}
.login-box .actions{display:flex; justify-content:flex-end; margin-top:.4rem}
.login-box .actions button{font:var(--w-reg) var(--t-md)/1.45 var(--ui); padding:.45rem 1rem; border:1px solid var(--ink); background:var(--ink); color:#fff; border-radius:3px; cursor:pointer}
.login-box .actions button:disabled{opacity:.5; cursor:default}
/* who is signed in, top right */
.who{display:flex; align-items:center; gap:.5rem; font:var(--w-reg) var(--t-sm)/1 var(--ui); color:var(--ink-3); white-space:nowrap}
.who b{color:var(--ink-2); font-weight:600}
.who .role{font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3); background:var(--rule-2); border-radius:3px; padding:0 .35rem}
/* the other side of a comparison: each input the check read, with a chip to its slide */
.cmp{display:flex; gap:.35rem .6rem; flex-wrap:wrap; align-items:center; margin:0 0 .5rem; font-family:var(--ui)}
.cmp .lbl{margin-right:.2rem}
.cmp-i{display:inline-flex; gap:.3rem; align-items:baseline; font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--ink-3); border:1px solid var(--rule-2); border-radius:3px; padding:.05rem .4rem}
.cmp-i.away{border-color:var(--rule); color:var(--ink-2)}
.cmp-i b{color:var(--ink); font-weight:600}
.cmp-l{max-width:16rem; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
a.trace{cursor:pointer}
.edit .also{font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--ink-3); margin:.4rem 0 0}

/* ---- account menu and user management ---- */
.who{position:relative}
.who-btn{display:flex; align-items:center; gap:.45rem; font:var(--w-reg) var(--t-sm)/1 var(--ui); color:var(--ink-2); background:none; border:1px solid var(--rule); border-radius:3px; padding:.4rem .6rem; cursor:pointer; text-decoration:none}
.who-btn b{font-weight:var(--w-reg)}
.who-btn:hover,.who-btn.open{border-color:var(--rule); background:var(--paper)}
.who-btn .caret{font-size:.8rem}
.who-menu{position:absolute; top:calc(100% + 4px); right:0; z-index:30; min-width:13rem; background:var(--card); border:1px solid var(--rule); border-radius:4px; box-shadow:0 10px 30px rgba(0,0,0,.18); padding:.3rem; font:var(--w-reg) var(--t-md)/1.45 var(--ui)}
.who-item{display:block; width:100%; text-align:left; background:none; border:0; padding:.45rem .6rem; border-radius:3px; cursor:pointer; color:var(--ink); font:var(--w-reg) var(--t-sm)/1.4 var(--ui)}
.who-item:hover{background:var(--paper)}
.users-box{max-width:46rem; width:100%; max-height:86vh; overflow:auto}
.users-box h2{display:flex; align-items:center; gap:.6rem}
.users-box h2 .spacer{flex:1}
.users-box h2 .x{color:var(--ink-3); font-size:1rem; line-height:1; padding:.2rem .3rem; background:none; border:0; cursor:pointer}
.users-box table{width:100%; border-collapse:collapse; font:var(--w-reg) var(--t-md)/1.4 var(--ui); margin:0 0 1rem}
.users-box th{text-align:left; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); border-bottom:1px solid var(--rule); padding:.3rem .4rem}
.users-box td{padding:.45rem .4rem; border-bottom:1px solid var(--rule-2); vertical-align:middle}
.users-box td.acts{white-space:nowrap; text-align:right}
.users-box td.acts button{font:var(--w-reg) var(--t-sm)/1.45 var(--ui); color:var(--link); background:none; border:0; padding:0 .3rem; cursor:pointer}
.users-box td.acts button:hover{text-decoration:underline}
.users-box td.acts button.danger{color:var(--hi)}
.users-box .projs{font:var(--w-reg) var(--t-sm)/1.4 var(--mono); color:var(--ink-2)}
.users-box form{border-top:1px solid var(--rule); padding-top:.9rem; margin-top:.4rem}
.users-box form h3{font:var(--w-bold) var(--t-lg)/1.2 var(--serif); margin:0 0 .7rem}
.users-box .row{display:grid; grid-template-columns:1fr 1fr; gap:.6rem .9rem}
.users-box label{margin:0 0 .5rem}
.users-box select{display:block; width:100%; margin-top:.3rem; font:var(--w-reg) var(--t-lg)/1.45 var(--ui); border:1px solid var(--rule); border-radius:3px; padding:.4rem .5rem; background:var(--paper); color:var(--ink); text-transform:none; letter-spacing:0}
.users-box .chk{display:flex; flex-wrap:wrap; gap:.4rem .9rem; margin-top:.3rem; text-transform:none; letter-spacing:0; font:var(--w-reg) var(--t-md)/1.45 var(--ui); color:var(--ink)}
.users-box .chk label{display:inline-flex; align-items:center; gap:.3rem; margin:0; font:inherit; color:inherit; text-transform:none; letter-spacing:0}
.users-box .chk input{width:auto; margin:0; display:inline}
.users-box .ok{color:var(--add); font-size:.84rem; margin:.4rem 0}
.users-box .actions button{font:var(--w-reg) var(--t-md)/1.45 var(--ui); padding:.4rem .9rem; border:1px solid var(--rule); background:var(--card); border-radius:3px; cursor:pointer}
.users-box .actions button.primary{background:var(--ink); border-color:var(--ink); color:#fff}
.obj-title{font:var(--w-bold) var(--t-sm)/1.3 var(--ui); color:var(--ink); flex:1 1 auto; min-width:8rem}
.obj-head .obj-id{font-size:var(--t-xs)}
/* one addition on several lines */
.edit.grp .grp-add{margin:.5rem 0 .3rem; font:var(--w-reg) var(--t-md)/1.45 var(--serif)}
.edit.grp .grp-add .lbl{display:inline; margin-right:.4rem}
.edit.grp .grp-add .line{color:var(--add)}
.grp-lines{list-style:none; margin:0 0 .4rem; padding:0; border:1px solid var(--rule); border-radius:3px}
.grp-lines li{display:flex; gap:.6rem; align-items:baseline; padding:.35rem .6rem; border-top:1px solid var(--rule-2); font:var(--w-reg) var(--t-md)/1.4 var(--serif); color:var(--ink-2)}
.grp-lines li:first-child{border-top:0}
.grp-lines .grp-line{flex:1; min-width:0}
.grp-lines .grp-page{font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3); white-space:nowrap}
/* how a recomputed figure was reached */
.how{margin:0 0 .6rem; padding:.5rem .7rem; border:1px solid var(--rule-2); border-radius:3px; background:var(--paper)}
.how .lbl{display:block; margin-bottom:.2rem}
.how p{margin:0; font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink)}
.how ul{list-style:none; margin:.35rem 0 0; padding:0}
.how li{display:flex; gap:.5rem; align-items:baseline; font:var(--w-reg) var(--t-sm)/1.5 var(--ui); color:var(--ink-2)}
.how .how-l{flex:1; min-width:0}
.how li b{color:var(--ink); font-weight:var(--w-bold)}
.how .how-p{font-size:var(--t-xs); color:var(--ink-3); white-space:nowrap}
/* an open question, or an annotation: the line, then what goes with it */
.edit.q .q-line,.edit.ann .q-line{margin:.4rem 0 .5rem; font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink-2)}
.edit.q .q-line .lbl,.edit.ann .q-line .lbl{display:inline; margin-right:.4rem}
.edit.q .q-ask{border-left:3px solid var(--med); padding:.1rem 0 .1rem .7rem; margin:.3rem 0 .2rem}
.edit.q .q-ask .lbl{display:block; margin-bottom:.25rem}
.edit.q .q-ask .line{font:var(--w-reg) var(--t-md)/1.5 var(--serif); color:var(--ink)}
.edit.q .q-ask .line blockquote{border:0; margin:0; padding:0}
.edit.q .q-ask .line p{margin:0 0 .3rem}
.edit.ann .line blockquote{border-left-color:var(--add); color:var(--ink-2)}
/* a card whose issue is on the page being shown */
.obj.here{background:var(--paper)}
.obj.here.sel{background:var(--sel)}

/* Citations owed: under the objections, collapsed, never counted among them. */
details.cites{margin-top:1.2rem; border-top:1px solid var(--rule); padding-top:.8rem}
details.cites>summary{cursor:pointer; font:var(--w-reg) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); margin-bottom:.6rem; list-style:none}
details.cites>summary::-webkit-details-marker{display:none}
details.cites>summary .lbl{display:block; margin-bottom:.15rem}
details.cites>summary::before{content:'\25B8'; float:left; margin-right:.4rem}
details.cites[open]>summary::before{content:'\25BE'}

/* ── the deck pane (analyze workflow) ─────────────────────────────────── */
.deck-head{padding:.6rem .9rem .2rem; font:var(--t-s)/1.5 var(--ui)}
.deck-stages{padding:0 .9rem .4rem}
.deck-stage{display:inline-block; font:var(--t-xs)/1.6 var(--ui); padding:0 .45rem; border-radius:3px; background:var(--rule-2); color:var(--ink-3); margin:0 .15rem .15rem 0}
.deck-stage.done{background:#dcefe3; color:#1e7b4f}
.deck-stage.running{background:#dce8f5; color:#1d4e89}
.deck-stage.failed{background:#f6dede; color:#a32d2d}
.deck-note{padding:.2rem .9rem; margin:0; font:var(--t-s)/1.5 var(--ui); color:var(--ink-2)}
.deck-note.warn{color:#7a4e00}
.deck-slides{padding:.3rem 0}
.deck-slide{border-top:1px solid var(--rule); padding:.35rem .9rem}
.deck-slide summary{cursor:pointer; font:var(--t-s)/1.5 var(--ui)}
.deck-slide summary .n{display:inline-block; min-width:1.6rem; color:var(--ink-3)}
.deck-slide summary .hdr{color:var(--ink-3); font-size:var(--t-xs)}
.deck-slide.failed summary{color:#a32d2d}
.gapn{font:var(--t-xs)/1.4 var(--ui); background:#fdf3dc; color:#7a4e00; padding:0 .4rem; border-radius:3px}
.deck-body{padding:.3rem 0 .4rem 1.6rem; font:var(--t-s)/1.55 var(--ui)}
.deck-body p{margin:.25rem 0}
.deck-gap{background:#fdf3dc; color:#7a4e00; padding:.3rem .5rem; border-radius:4px}
.deck-src{color:var(--ink-3); font-size:var(--t-xs)}
.deck-table{border-collapse:collapse; font-size:var(--t-xs); margin:.3rem 0; max-width:100%}
.deck-table th,.deck-table td{border:1px solid var(--rule); padding:.15rem .45rem; text-align:right}
.deck-table th{background:var(--rule-2); text-align:left}
.deck-table td:first-child{text-align:left}
.deck-table input.assump{width:6rem; font:inherit; text-align:right}
.rating{font:var(--t-xs)/1.4 var(--ui); padding:0 .4rem; border-radius:3px; color:#fff; background:var(--ink-3)}
.rating.high{background:#1e7b4f}.rating.medium{background:#b07a00}.rating.low{background:#a32d2d}
.deck-assump{border-top:1px solid var(--rule); padding:.4rem .9rem}
.deck-assump summary{cursor:pointer; font:var(--t-s)/1.5 var(--ui)}
/* A panel page's controls. button{} up at the top of this file strips the
   border and background off every button so the chrome ones can be plain
   text; anything that should read as a button has to put them back, and a
   panel action is the clearest case — "Add and re-evaluate" rendered as a
   bare word next to the browser's own file control. */
.deck-actions{display:flex; flex-wrap:wrap; align-items:center; gap:.5rem; margin:.6rem 0 .4rem}
.deck-actions button,button.deck-btn{
  font:var(--w-bold) var(--t-sm)/1 var(--ui); padding:.5rem .8rem; border-radius:3px; cursor:pointer;
  border:1px solid var(--rule); background:var(--card); color:var(--ink-2);
}
.deck-actions button:hover:not(:disabled),button.deck-btn:hover:not(:disabled){border-color:var(--ink-3); background:var(--paper)}
.deck-actions button.primary{background:var(--ink); border-color:var(--ink); color:#fff}
.deck-actions button.primary:hover:not(:disabled){background:var(--ink-2); border-color:var(--ink-2)}
.deck-actions button:disabled,button.deck-btn:disabled{opacity:.45; cursor:default}
.deck-actions .opt{display:inline-flex; align-items:center; gap:.35rem; font:var(--t-s)/1.4 var(--ui); color:var(--ink-2)}
.deck-actions .opt input{margin:0}

/* ── the file picker ──────────────────────────────────────────────────────
   One component, used by the Documents panel and the New project dialog.
   The native <input type=file> renders its own "Choose Files" button, which
   no stylesheet can reach; the input is therefore taken out of the layout
   and a <label> styled like the rest drives it. Visually hidden, NOT
   display:none — a hidden input is skipped by the tab order and by the
   label's own click forwarding, so the control would stop working for the
   keyboard. The chosen names go in the readout beside it, from JS. */
.filepick{display:inline-flex; align-items:center; gap:.5rem; min-width:0}
.filepick input[type=file]{position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0}
.filepick .pick{
  font:var(--w-bold) var(--t-sm)/1 var(--ui); padding:.5rem .8rem; border-radius:3px; cursor:pointer;
  border:1px solid var(--rule); background:var(--card); color:var(--ink-2); white-space:nowrap;
}
.filepick:hover .pick{border-color:var(--ink-3); background:var(--paper)}
.filepick input[type=file]:focus-visible + .pick{outline:2px solid var(--link); outline-offset:1px}
.filepick .chosen{font:var(--t-s)/1.4 var(--ui); color:var(--ink-3); overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.filepick .chosen.some{color:var(--ink-2)}

/* ── the documents page ───────────────────────────────────────────────────
   One row per document: what it is, how far the build got with it, and the
   way to take it out. The state chip reuses the stage colours. */
.docs{list-style:none; padding:0; margin:.5rem 0 0; font:var(--t-s)/1.5 var(--ui)}
.docs li{display:flex; gap:.5rem; align-items:baseline; padding:.4rem 0; border-top:1px solid var(--rule-2)}
.docs li a.fn,.docs li span.fn{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.run-intro .run-docs{margin-top:.35rem; color:var(--ink-2)}
.docs .doc-why{color:var(--ink-3); font-size:var(--t-xs); flex:1.2; min-width:0}
.docs .doc-rm{font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3); padding:.15rem .4rem; border-radius:3px; cursor:pointer; visibility:hidden}
.docs li:hover .doc-rm{visibility:visible}
.docs .doc-rm:hover{color:var(--hi); background:#fdf3ef}
.docs .doc-rm:disabled{opacity:.5; cursor:default}
.doc-state{font:var(--t-xs)/1.6 var(--ui); padding:0 .45rem; border-radius:3px; background:var(--rule-2); color:var(--ink-3); white-space:nowrap}
.doc-state.read{background:#dcefe3; color:#1e7b4f}
.doc-state.deck{background:#dce8f5; color:#1d4e89}
.doc-state.waiting{background:#fbe3dc; color:#8a2e12}
.doc-state.partial{background:#fdf3dc; color:#7a4e00}
.doc-state.reading{background:#dce8f5; color:#1d4e89}
.run-activity{color:var(--ink-2)}
.docs-cap{border:1px solid var(--rule-2); border-radius:4px; padding:.5rem .7rem; margin-top:.6rem; flex-wrap:wrap}
.doc-state.pending{background:#fdf3dc; color:#7a4e00}
.doc-state.duplicate{background:var(--rule-2); color:var(--ink-3)}
.doc-state.failed{background:#f6dede; color:#a32d2d}
/* The deck is behind what is on file — something was added or removed and
   nothing has been rebuilt against it yet. */
.docs-stale{margin:.5rem 0 0; padding:.4rem .6rem; border-radius:4px; background:#fdf3dc; color:#7a4e00; font:var(--t-s)/1.5 var(--ui)}

/* ── the deck's top-nav links (analyze workflow) ─────────────────────────── */
.topnav .dl{position:relative; display:inline-block}
.dl-btn{font:var(--w-reg) var(--t-sm)/1 var(--ui); border:1px solid var(--rule); background:var(--paper); padding:.4rem .7rem; border-radius:3px; color:var(--ink-2); cursor:pointer}
.dl-btn:hover{border-color:var(--ink-3)}
.dl-menu{position:absolute; right:0; top:110%; background:var(--paper); border:1px solid var(--rule); border-radius:4px; min-width:9rem; z-index:20; box-shadow:0 4px 14px rgba(0,0,0,.08)}
.dl-menu a{display:block; padding:.45rem .8rem; border:0; border-radius:0; text-decoration:none; color:var(--ink); font:var(--w-reg) var(--t-sm)/1.3 var(--ui)}
.dl-menu a:hover{background:var(--rule-2)}
/* The menu holds two kinds of thing: files to download, and the committee's
   own pages, which open in the panel. A heading and a rule say which. */
.dl-group{padding:.35rem .8rem .2rem; color:var(--ink-3); font:var(--w-bold) var(--t-xs)/1.2 var(--ui); text-transform:uppercase; letter-spacing:.05em}
.dl-sep{height:1px; background:var(--rule); margin:.25rem 0}
.dl-item{display:block; width:100%; text-align:left; background:none; border:0; padding:.45rem .8rem; cursor:pointer; color:var(--ink); font:var(--w-reg) var(--t-sm)/1.3 var(--ui)}
.dl-item:hover{background:var(--rule-2)}
.dl-item[aria-current=true]{background:var(--rule-2); font-weight:var(--w-bold)}
/* A panel page opened from the menu: its own heading, and the way back. */
.deck-page-head{display:flex; align-items:baseline; justify-content:space-between; gap:.6rem; margin:0 0 .6rem}
.deck-page-head h3{margin:0; font:var(--w-bold) var(--t-lg)/1.3 var(--ui)}
.deck-legend{padding:.5rem .9rem; margin:0; font:var(--t-s)/1.5 var(--ui); color:var(--ink-2); background:var(--rule-2)}
.deck-gaps summary{cursor:pointer}
.deck-gaps li{margin:.15rem 0}
.deck-body a.cid,.deck-gap a.cid,.deck-src a.cid{color:var(--link); text-decoration:none; border-bottom:1px dotted var(--link)}
.deck-row{display:block; padding:.3rem .9rem; border-top:1px solid var(--rule); text-decoration:none; color:var(--ink); font:var(--t-s)/1.5 var(--ui)}
.deck-row:hover{background:var(--rule-2)}
.deck-row .n{display:inline-block; min-width:1.6rem; color:var(--ink-3)}
.deck-row .hdr{color:var(--ink-3); font-size:var(--t-xs)}
.deck-row.failed{color:#a32d2d}
.deck-card{padding:.4rem .9rem}
.deck-title{margin:.3rem 0 .5rem; font:var(--t-s)/1.4 var(--ui)}
.deck-title .hdr{color:var(--ink-3); font-size:var(--t-xs)}
.deck-card .deck-body{padding-left:0}
.deck-from{margin:.2rem 0 .3rem 1.6rem; padding:.3rem .5rem; background:#eef4fb; border-radius:4px; font:var(--t-xs)/1.5 var(--ui); color:var(--ink-2)}
.deck-from .lbl{font-weight:var(--w-bold); color:#1d4e89}
.deck-from .fig b{color:var(--ink)}
.deck-score{padding:.2rem .9rem; margin:.2rem 0; font:var(--t-m)/1.5 var(--ui); color:var(--ink)}
.deck-score b{color:#1d4e89; font-size:1.15em}
.deck-table input.sc-w{width:4rem; font:inherit; text-align:right}
.deck-table select.sc-r{font:inherit}
.deck-table input.sc-s{width:3.5rem; font:inherit; text-align:right}
.sc-p{white-space:nowrap; margin-right:.6rem}
/* The issues under a section's reason: what holds its score down. */
.sc-iss{margin:.35rem 0 0; padding-left:1.1rem}
.sc-iss li{margin:.15rem 0}

/* ============================================================================
   DESIGN PASS (2026-10-04, reports/analyze/design_return/CHANGES.md).
   The returned ui.css, namespaced where its names met the app's: .stage is the
   slide stage here, so the pipeline card is .pstage; .pop is the chip popover,
   so the menu is .pmenu; .modal is the overlay, so the dialog box is .dlg;
   .head → .rhead; .chip is the severity chip, so the document badge is .dchip.
   The bar's buttons keep their ids and gain the .tb look.
   ============================================================================ */

a{color:var(--c-accent);text-decoration:none}
a:hover{text-decoration:underline;text-underline-offset:2px}
:focus-visible{outline:none;box-shadow:var(--focus);border-radius:var(--r-xs)}
.mono{font-family:var(--f-mono);font-size:.92em}

/* ── caps label: one rule for every kicker, section label, state word ── */

/* ── buttons ── */
.btn{display:inline-flex;align-items:center;gap:6px;height:var(--h-ctl);font:500 var(--t-sm)/1 var(--f-sans);padding:0 12px;border-radius:var(--r-sm);border:1px solid var(--c-line);background:var(--c-card);color:var(--c-ink2);cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s}
.btn:hover{background:var(--c-hover);border-color:#CFCAC0}
.btn.pri{background:var(--c-accent);border-color:var(--c-accent);color:#fff}
.btn.pri:hover{background:var(--c-navy);border-color:var(--c-navy)}
.btn.danger{color:var(--c-low)}                                   /* NEW */
.btn.danger:hover{background:var(--c-low-soft);border-color:#E5B9AC}
.btn.ghost{border-color:transparent;background:transparent}        /* NEW */
.btn.ghost:hover{background:var(--c-paper2)}
.btn.off,.btn:disabled{color:var(--c-muted);background:var(--c-paper2);border-color:var(--c-line2);cursor:not-allowed}
.btn.sm{height:24px;padding:0 9px;font-size:var(--t-xs)}           /* NEW */
.btn svg{width:13px;height:13px;stroke:currentColor;fill:none;stroke-width:1.8}
.act{display:flex;gap:var(--s-2);align-items:center;flex-wrap:wrap}
.act .sp{flex:1}

/* ── top bar ── */
.top{height:var(--h-bar);display:flex;align-items:center;gap:var(--s-5);padding:0 var(--s-5);background:var(--c-chrome);color:#fff}
.top :focus-visible{box-shadow:var(--focus-dark)}
.brand{font:600 10.5px/1 var(--f-sans);letter-spacing:.14em;color:var(--c-chrome-ink);padding-right:var(--s-5);border-right:1px solid var(--c-chrome-line);height:22px;display:flex;align-items:center}
.proj-btn{font:500 15px/1 var(--f-serif);display:flex;align-items:center;gap:8px;background:none;border:0;color:#fff;cursor:pointer;padding:6px 8px;margin-left:-8px;border-radius:var(--r-sm)}
.proj-btn:hover,.proj-btn.open{background:var(--c-chrome-2)}
.proj-btn small{font:600 9.5px/1 var(--f-sans);color:var(--c-chrome-mute)}
.proj-btn svg{width:12px;height:12px;stroke:var(--c-chrome-mute);fill:none;stroke-width:2}
.deal{flex:1;min-width:0;font-size:12px;color:var(--c-chrome-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tb,.run-btn,.dl-btn{display:inline-flex;align-items:center;gap:6px;height:30px;font:500 12px/1 var(--f-sans);color:#fff;background:transparent;border:1px solid var(--c-chrome-line);padding:0 12px;border-radius:var(--r-sm);cursor:pointer;white-space:nowrap}
.tb:hover,.run-btn:hover,.dl-btn:hover{background:var(--c-chrome-2)}
.tb.pri,.run-btn{background:#fff;color:var(--c-navy);border-color:#fff;font-weight:600}
.tb.pri:hover,.run-btn:hover{background:#E8EEF5}
.tb.running,.run-btn.live{background:var(--c-chrome-2);color:#fff;border-color:#5B86B5}            /* NEW running state */
.tb.running .dot,.run-btn.live::before{width:7px;height:7px;border-radius:50%;background:#9DB9D8;animation:pulse 1.4s ease-in-out infinite}
.tb svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}
.who-btn{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--c-chrome-ink);background:none;border:0;cursor:pointer;padding:4px 6px;border-radius:var(--r-sm)}
.who-btn:hover,.who-btn.open{background:var(--c-chrome-2)}
.who-btn .av{width:24px;height:24px;border-radius:50%;background:var(--c-chrome-2);border:1px solid var(--c-chrome-line);display:grid;place-items:center;font:600 10px/1 var(--f-sans);color:#fff}
.role{font:600 9.5px/1 var(--f-sans);letter-spacing:var(--ls-cap);text-transform:uppercase;color:var(--c-chrome-mute);border:1px solid var(--c-chrome-line);border-radius:var(--r-pill);padding:4px 8px} /* NEW client-role tag */
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}

/* ── popover / menu (project switcher) ── NEW names, the proposal had inline styles */
.pmenu{background:var(--c-card);border:1px solid var(--c-line);border-radius:var(--r-md);box-shadow:var(--sh-pop);overflow:hidden}
.pmenu-search{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:1px solid var(--c-line2)}
.pmenu-search input{flex:1;border:0;background:none;font-size:12px;outline:none}
.pmenu-search svg{width:13px;height:13px;stroke:var(--c-muted);fill:none;stroke-width:2}
.mi{display:flex;align-items:center;gap:var(--s-3);width:100%;text-align:left;padding:9px 14px;border:0;background:none;cursor:pointer;border-top:1px solid var(--c-line2)}
.mi:first-of-type{border-top:0}
.mi:hover{background:var(--c-hover)}
.mi.cur{background:var(--c-sel);box-shadow:inset 3px 0 0 var(--c-accent)}
.mi .nm{font:500 var(--t-lg)/1.2 var(--f-serif);color:var(--c-ink)}
.mi .meta{font-size:var(--t-xs);color:var(--c-muted)}
.mi .tag{margin-left:auto}
.pmenu-foot{display:flex;border-top:1px solid var(--c-line);background:var(--c-paper2)}
.pmenu-foot button{flex:1;text-align:left;padding:9px 14px;border:0;background:none;font-size:12px;cursor:pointer;color:var(--c-muted)}
.pmenu-foot button:first-child{font-weight:600;color:var(--c-accent)}
.pmenu-foot button + button{flex:none;border-left:1px solid var(--c-line)}
.pmenu-foot button:hover{background:var(--c-line2)}

/* ── modal ── NEW names */
.dlg{width:100%;background:var(--c-card);border:1px solid var(--c-line);border-radius:10px;box-shadow:var(--sh-modal);overflow:hidden}
.dlg-h{display:flex;align-items:flex-start;gap:var(--s-3);padding:16px 20px 12px;border-bottom:1px solid var(--c-line2)}
.dlg-h h2{font:500 var(--t-xl)/1.2 var(--f-serif);color:var(--c-ink)}
.dlg-h .sub{font-size:var(--t-sm);color:var(--c-ink2);margin-top:3px}
.dlg-h .x{margin-left:auto}
.dlg-b{padding:14px 20px;display:flex;flex-direction:column;gap:var(--s-3)}
.dlg-f{display:flex;gap:var(--s-2);align-items:center;padding:12px 20px;border-top:1px solid var(--c-line2);background:var(--c-paper)}
.dlg-f .sp{flex:1}
.prov{background:var(--c-paper);border:1px solid var(--c-line2);border-radius:var(--r-sm);padding:8px 12px;font-size:var(--t-sm);color:var(--c-ink2);display:grid;grid-template-columns:auto 1fr;gap:3px 12px} /* NEW provenance lines */
.prov dt{font-size:9.5px;font-weight:700;letter-spacing:var(--ls-cap);text-transform:uppercase;color:var(--c-muted);padding-top:2px}
.prov b{font-family:var(--f-mono);font-weight:500;font-size:10.5px;color:var(--c-ink)}
.log{border:1px solid var(--c-line);border-radius:var(--r-sm);background:var(--c-card)}
.log summary{padding:7px 12px;font-size:var(--t-sm);font-weight:600;color:var(--c-ink2);cursor:pointer;list-style:none;display:flex;gap:8px;align-items:center}
.log summary::before{content:"";width:0;height:0;border:4px solid transparent;border-left:5px solid var(--c-muted);transition:transform .12s}
.log[open] summary::before{transform:rotate(90deg) translateX(2px)}
.log summary .mono{margin-left:auto;font-weight:400;color:var(--c-muted)}
.log pre{font:10.5px/1.6 var(--f-mono);color:var(--c-ink2);background:var(--c-paper);border-top:1px solid var(--c-line2);padding:8px 12px;white-space:pre-wrap;max-height:140px;overflow:auto}
.log pre .hl{color:var(--c-accent);font-weight:600}
.field{display:inline-flex;align-items:center;gap:6px;font-size:var(--t-sm);color:var(--c-muted)}
.field select{height:var(--h-ctl);border:1px solid var(--c-line);border-radius:var(--r-sm);background:var(--c-card);padding:0 8px;color:var(--c-ink2)}

/* ── tables: the deck's table rule ── NEW .tbl (the proposal inlined it) */
.tbl{width:100%;border-collapse:collapse;font-size:var(--t-sm)}
.tbl th{text-align:left;font-size:9.5px;font-weight:700;color:var(--c-muted);padding:6px 6px;border-bottom:1.5px solid var(--c-ink)}
.tbl td{padding:7px 6px;border-bottom:1px solid var(--c-line2);color:var(--c-ink2);vertical-align:middle}
.tbl td b{color:var(--c-ink);font-weight:600}
.tbl td small{display:block;color:var(--c-muted);font-size:var(--t-xs)}
.tbl tr:hover td{background:var(--c-hover)}
.tbl .r{text-align:right}
.tbl .num{font-family:var(--f-mono);font-size:10.5px}



/* ── right pane ── */
.rhead{display:flex;align-items:center;gap:10px;padding-bottom:10px;border-bottom:1px solid var(--c-line);min-width:0}
.rhead .run{font:500 11px/1 var(--f-mono);color:var(--c-ink2);white-space:nowrap}
.rhead .st{white-space:nowrap;font-size:10px;font-weight:700;color:var(--c-high);display:inline-flex;align-items:center;gap:5px}
.rhead .st::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}
.rhead .st.running{color:var(--c-accent)}.rhead .st.running::before{animation:pulse 1.4s ease-in-out infinite}
.rhead .st.failed{color:var(--c-low)}
.rhead .when{font-size:11px;color:var(--c-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.rhead .links{flex:none}
.rhead .links{margin-left:auto;display:flex;gap:2px;font-size:var(--t-sm)}
.rhead .links a{padding:3px 7px;border-radius:var(--r-xs)}
.rhead .links a:hover{background:var(--c-accent-soft);text-decoration:none}

/* KPI tiles: the deck's own, band on the top rule */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.kpi{border:1px solid var(--c-line);border-radius:var(--r-md);padding:9px 13px 10px;background:#fff;border-top:3px solid var(--c-accent);display:flex;flex-direction:column;gap:2px;min-width:0}
.kpi.k-low{border-top-color:var(--c-low)}
.kpi.k-med{border-top-color:var(--c-med)}
.kpi.k-high,.kpi.k-bull{border-top-color:var(--c-high)}
.kl{font-size:9.5px;font-weight:700;color:var(--c-muted)}
.kv{font:500 var(--t-kpi)/1.1 var(--f-serif);color:var(--c-ink)}
.kv small{font:400 12px/1 var(--f-sans);color:var(--c-muted);margin-left:2px}
.ks{font-size:10.5px;color:var(--c-ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.k-low .ks b{color:var(--c-low)}.k-med .ks b{color:var(--c-med-ink)}.k-high .ks b,.k-bull .ks b{color:var(--c-high)}
.meter{height:4px;background:var(--c-paper2);border-radius:2px;margin-top:5px;overflow:hidden}   /* NEW coverage meter */
.meter i{display:block;height:100%;background:var(--c-accent)}

h3.sec{display:flex;align-items:baseline;gap:8px;font-size:11px;color:var(--c-accent);font-weight:700;margin-top:6px}
h3.sec .c{font-weight:500;letter-spacing:0;text-transform:none;color:var(--c-muted);font-size:var(--t-sm)}
h3.sec .r{margin-left:auto}

/* stage cards: the deck's milestone card, four states */
.stages{display:flex;flex-direction:column;gap:6px}
.pstage{display:grid;grid-template-columns:18px 1fr auto 72px;align-items:center;gap:10px;padding:8px 13px 8px 11px;border:1px solid var(--c-line);border-radius:var(--r-md);background:#fff}
.pstage .ic{width:16px;height:16px;border-radius:50%;display:grid;place-items:center}
.pstage .ic svg{width:10px;height:10px;fill:none;stroke:#fff;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}
.pstage.done .ic,.pstage:not(.run):not(.pend):not(.fail) .ic{background:var(--c-high)}
.pstage.run{border-color:var(--c-accent);box-shadow:inset 3px 0 0 var(--c-accent)}
.pstage.run .ic{border:2px solid var(--c-accent-soft);border-top-color:var(--c-accent);animation:spin .9s linear infinite}
.pstage.pend{background:var(--c-paper);border-style:dashed}
.pstage.pend .ic{border:1.5px solid #B9B4AA}
.pstage.pend .n{color:var(--c-ink2)}
.pstage.fail{border-color:#E1B3A6;box-shadow:inset 3px 0 0 var(--c-low)}            /* NEW (was inline) */
.pstage.fail .ic{background:var(--c-low)}
.pstage .n{font-size:12px;color:var(--c-ink);min-width:0}.pstage .n small{display:block;font-size:10.5px;color:var(--c-muted);margin-top:1px}
.pstage.fail .n small{color:var(--c-low)}
.pstage .n small .q{color:#8B919A;font-style:italic}
.pstage .tm{font:500 10.5px/1.3 var(--f-mono);color:var(--c-muted);text-align:right}
.pstage .tm b{display:block;font-weight:500;color:var(--c-accent)}
.pstage .w{font-size:9.5px;font-weight:700;text-align:right}
.pstage .w.done{color:var(--c-high)}.pstage .w.running{color:var(--c-accent)}.pstage .w.pend{color:var(--c-muted)}.pstage .w.fail{color:var(--c-low)}
.pstage .bar{grid-column:2/-1;height:4px;background:var(--c-paper2);border-radius:2px;overflow:hidden}.pstage .bar i{display:block;height:100%;background:var(--c-accent);border-radius:2px}
@keyframes spin{to{transform:rotate(360deg)}}

/* documents: the deck's table rule */
.docs{border-top:1.5px solid var(--c-ink)}
.doc{display:grid;grid-template-columns:16px minmax(0,1.4fr) 92px minmax(0,1fr) auto;gap:10px;align-items:center;padding:6px 4px;border-bottom:1px solid var(--c-line2);font-size:var(--t-sm)}
.doc:hover{background:var(--c-hover)}
.doc .ft{width:14px;height:16px;stroke:var(--c-muted);fill:none;stroke-width:1.5}
.doc .fn{color:var(--c-ink);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.doc .why{color:var(--c-muted);font-size:10.5px;line-height:1.4}
.doc .why b{font-weight:500;color:var(--c-low)}
.doc.new{background:linear-gradient(var(--c-sel),var(--c-sel))}                 /* NEW added since the build */
.dchip{display:inline-flex;align-items:center;gap:4px;justify-self:start;font-size:9px;font-weight:700;padding:2px 7px;border-radius:var(--r-pill);white-space:nowrap;line-height:1.3}
.dchip.read{background:var(--c-high-soft);color:var(--c-high)}
.dchip.part{background:var(--c-gap-bg);color:var(--c-gap-ink)}
.dchip.no{background:var(--c-low-soft);color:var(--c-low)}
.dchip.deck{background:var(--c-accent-soft);color:var(--c-accent)}
.dchip.now{background:var(--c-accent);color:#fff}                                 /* NEW reading now */
.dchip.now::before{content:"";width:5px;height:5px;border-radius:50%;background:#fff;animation:pulse 1.4s ease-in-out infinite}
.dchip.arch{background:var(--c-paper2);color:var(--c-muted)}                       /* NEW archive tag */

/* drop / upload row  NEW */
.drop{display:flex;align-items:center;gap:var(--s-3);border:1.5px dashed var(--c-line);border-radius:var(--r-md);padding:10px 12px;background:#fff}
.drop .lbl{flex:1;font-size:var(--t-sm);color:var(--c-muted)}
.drop .lbl b{color:var(--c-ink2);font-weight:600}
.opt{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--c-line);border-radius:var(--r-md);padding:9px 12px;background:#fff;font-size:var(--t-sm);cursor:pointer}
.opt input{margin-top:2px;accent-color:var(--c-accent);width:14px;height:14px}
.opt b{font-weight:600;color:var(--c-ink)}
.opt small{display:block;font-size:var(--t-xs);color:var(--c-muted);margin-top:2px}

/* gaps: the deck's own block. The SENTENCE stays plain; the OWNER SUFFIX is styled by kind. */
.gapbox{background:var(--c-gap-bg);border-left:3px solid var(--c-gap-rule);border-radius:2px 6px 6px 2px;padding:9px 13px 10px}
.gh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.gh span{font-size:10px;font-weight:700;color:var(--c-gap-ink)}
.gh em{/* count of OPEN lines */font-style:normal;font-size:9.5px;font-weight:700;color:#fff;background:var(--c-gap-ink);border-radius:var(--r-pill);padding:1px 7px}
.gl{list-style:none;display:flex;flex-direction:column;gap:5px}
.gl li{font-size:10.6px;line-height:1.45;color:var(--c-gap-text);padding-left:13px;position:relative}
.gl li::before{content:"";position:absolute;left:0;top:.62em;width:6px;height:1.5px;background:var(--c-gap-rule)}
.gh b{display:flex;gap:4px;align-items:center}
.gh em.imp-n{background:#B5473A}
/* the grade before a gap line: its weight on the decision (research.impact).
   The same chip, meaning the same thing, on the deck pane's Gaps block
   (app.js::gapImpChip) — one rule, so the three colours cannot drift. */
.gl li .imp,.gaps-pan .imp{display:inline-block;font:700 8.5px/1.3 var(--f-sans);letter-spacing:.06em;text-transform:uppercase;padding:0 5px;border-radius:3px;margin-right:2px;vertical-align:1px;color:#fff;background:#8B7355}
.gl li .imp-high,.gaps-pan .imp-high{background:#B5473A}
.gl li .imp-med,.gaps-pan .imp-med{background:#B8822B}
.gl li .imp-low,.gaps-pan .imp-low{background:#9CA3AF}
.gl li i{font-style:normal;color:var(--c-gap-ink);font-weight:600}                    /* default suffix */
.gl li i.o-vendor{color:var(--c-gap-ink);font-weight:600}                            /* to ask the vendor */
.gl li i.o-rule{color:var(--c-gap-ink);font-weight:600}                              /* rule public; to ask the vendor: … */
.gl li i.o-found{color:var(--c-high);font-weight:600}                                /* found: F### */
.gl li i.o-miss{color:#7D6A4A;font-weight:500;font-style:italic}                     /* searched, not found (…) */
.gl li i.o-house{color:var(--c-accent);font-weight:600}                              /* the house holds this */
.gl li i.o-na{color:#8E846F;font-weight:500}                                         /* not a question for this vehicle */
.gl li.closed{color:#8E846F}                                                        /* found / house / n.a.: the line is answered */
.gl li.closed::before{background:#D9C9A4}
.gl .fid{font-family:var(--f-mono);font-size:10px;padding:0 4px;border-radius:3px;background:rgba(46,125,99,.12)}

/* ---- the design pass applied to the app's own shells ---- */
.top{height:var(--h-bar); gap:var(--s-5); padding:0 var(--s-5); background:var(--c-chrome); color:#fff; border-bottom:0}
.top .status{color:var(--c-chrome-mute); font-size:9.5px; font-weight:600}
.top .status.reviewed{color:#8FD3B4}
.topnav{display:flex; align-items:center; gap:var(--s-2)}
.topnav a{color:#fff; border-color:var(--c-chrome-line); border-radius:var(--r-sm); height:30px; display:inline-flex; align-items:center; font:500 12px/1 var(--f-sans)}
.proj{display:flex; align-items:center; position:relative; min-width:0}
.proj-btn{border:0; max-width:34vw}
.proj-btn .caret{color:var(--c-chrome-mute); font-size:.75rem}
.proj-menu{position:absolute; top:calc(100% + 6px); left:0; z-index:30; width:min(26rem,90vw); padding:0}
.proj-item{display:flex; align-items:center; gap:var(--s-3); padding:9px 14px; border-top:1px solid var(--c-line2); text-decoration:none; color:inherit}
.proj-item:first-child{border-top:0}
.proj-item:hover{background:var(--c-hover)}
.proj-item.cur{background:var(--c-sel); box-shadow:inset 3px 0 0 var(--c-accent)}
.proj-item .pn b{font:500 var(--t-lg)/1.2 var(--f-serif); color:var(--c-ink)}
.proj-item .pn small{font-size:10.5px; color:var(--c-muted)}
.proj-item .del{visibility:visible; font:700 9px/1.3 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; padding:2px 7px; border-radius:var(--r-pill); background:var(--c-paper2); color:var(--c-muted); opacity:0}
.proj-item:hover .del{opacity:1}
.proj-item .del:hover{background:var(--c-accent-soft); color:var(--c-accent)}
.proj-foot{border-top:1px solid var(--c-line); background:var(--c-paper2); margin:0}
.proj-foot .proj-new{font:600 12px/1.45 var(--f-sans); color:var(--c-accent); padding:9px 14px; border-radius:0}
.proj-foot .proj-arch{border-left:1px solid var(--c-line); font-size:12px}
.proj-foot button:hover{background:var(--c-line2)}
.who-btn{border:0; color:var(--c-chrome-ink)}
.who-btn b{color:#fff; font-weight:500}
.who-btn .role{font:600 9.5px/1 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-chrome-mute); background:none; border:1px solid var(--c-chrome-line); border-radius:var(--r-pill); padding:4px 8px}
.who-menu,.dl-menu{background:var(--c-card); border:1px solid var(--c-line); border-radius:var(--r-md); box-shadow:var(--sh-pop); padding:4px}
.who-item,.dl-item,.dl-menu a{border-radius:var(--r-sm); font:400 12px/1.4 var(--f-sans); color:var(--c-ink)}
.who-item:hover,.dl-item:hover,.dl-menu a:hover{background:var(--c-hover)}
.dl-group{color:var(--c-muted); font:700 9.5px/1.2 var(--f-sans); letter-spacing:var(--ls-cap)}
.dl-btn{background:transparent; color:#fff; border-color:var(--c-chrome-line)}
.run-btn{font-weight:600}
.run-btn.live{font-weight:500}
.run-btn.live::before{width:7px; height:7px; margin-right:6px; background:#9DB9D8}

/* slide pane */
.slide-head{background:var(--c-paper2); padding:10px 24px; gap:var(--s-3)}
.slide-num{font:500 var(--t-xl)/1.15 var(--f-serif); color:var(--c-ink)}
.nav{height:28px; min-width:28px; border-radius:var(--r-sm); padding:0 9px; font:400 12px/1 var(--f-sans); background:var(--c-card); color:var(--c-ink2)}
.nav:hover{border-color:#B5C7DB; background:var(--c-hover)}
.stage{background:var(--c-paper2); padding:16px 24px}
.stage img{box-shadow:var(--sh-2); border:1px solid var(--c-line); border-radius:var(--r-sm)}
.stage-note{color:var(--c-muted)}
.stage-foot{color:var(--c-ink2); background:rgba(251,250,247,.85)}
.filmstrip{background:var(--c-paper2); border-top:1px solid var(--c-line); padding:10px 24px 12px}
.thumb{border-radius:var(--r-xs)}
.thumb img,.thumb .dwbox{border-radius:var(--r-xs); border-color:var(--c-line)}
.thumb.sel{border-color:var(--c-accent)}
.thumb:hover{border-color:#B5C7DB}
.thumb .tn{font:500 8.5px/1 var(--f-mono); color:var(--c-muted)}
.cnt.none{background:var(--c-line2); color:var(--c-muted)}

/* modals: the app's overlay + box take the dialog's look */
.modal{background:var(--c-scrim)}
.modal-box{border-radius:10px; box-shadow:var(--sh-modal); padding:16px 20px 14px; font:400 var(--t-md)/1.45 var(--f-sans)}
.modal-box h2,.users-box h2{font:500 var(--t-xl)/1.2 var(--f-serif); margin:0 0 .8rem}
.modal-box .actions button,.users-box td.acts button{display:inline-flex; align-items:center; height:var(--h-ctl); font:500 var(--t-sm)/1 var(--f-sans); padding:0 12px; border-radius:var(--r-sm); border:1px solid var(--c-line); background:var(--c-card); color:var(--c-ink2)}
.modal-box .actions button:hover{background:var(--c-hover)}
.modal-box .actions button.primary{background:var(--c-accent); border-color:var(--c-accent); color:#fff}
.modal-box .actions button.primary:hover{background:var(--c-navy)}
.modal-box .actions button.danger{color:var(--c-low)}
.seg-opt.on{background:var(--c-accent); color:#fff}
.users-box table,.archive-box table{font:400 var(--t-sm)/1.4 var(--f-sans)}
.users-box th{font:700 9.5px/1.5 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); border-bottom:1.5px solid var(--c-ink)}
.archive-box td.acts .danger{color:var(--c-low)}
.run-box{width:min(50rem,96vw)}
.run-intro{margin:0 0 .8rem; font-size:.82rem}
.run-stages{gap:6px}
.run-log-wrap{border-radius:var(--r-sm)}
.run-log-wrap summary{font:600 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2)}
.run-log{font:10.5px/1.6 var(--f-mono); background:var(--c-paper)}
/* The raw run log is the operator's: the route answers 403 to a client
   (main.py::run_log) and app.js does not poll it, so the pane goes with it. */
body.client .run-log-wrap{display:none}
.run-past td{font-size:var(--t-sm)}
.run-past .s-done{color:var(--c-high)} .run-past .s-failed,.run-past .s-crashed{color:var(--c-low)} .run-past .s-cancelled{color:var(--c-muted)}
.run-pages input{height:var(--h-ctl); border:1px solid var(--c-line); border-radius:var(--r-sm); padding:0 8px; background:var(--c-card); font:400 12px/1 var(--f-sans)}

/* deck pane */
.deck-head{padding:12px 22px 4px; display:flex; flex-direction:column; gap:12px}
.deck-note{padding:0 22px}
.deck-legend{padding:8px 22px; background:var(--c-paper2); color:var(--c-ink2)}
.deck-slide{padding:.35rem 22px}
.deck-slide summary .n{font:500 10.5px/1 var(--f-mono); color:var(--c-muted)}
.deck-slide summary .hdr{font-size:10px; letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-accent); font-weight:700}
.deck-slide summary b{font:500 var(--t-lg)/1.3 var(--f-serif)}
.gapn{font:700 9px/1.3 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; background:var(--c-gap-bg); color:var(--c-gap-ink); padding:2px 7px; border-radius:var(--r-pill)}
.deck-body .gapbox{margin:.3rem 0 .5rem}
.deck-table th{font:700 9.5px/1.5 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); border-bottom:1.5px solid var(--c-ink)}
.deck-from{background:var(--c-sel); border-radius:var(--r-sm)}
.deck-from .lbl{color:var(--c-accent)}
.deck-btn{display:inline-flex; align-items:center; height:24px; padding:0 9px; font:500 var(--t-xs)/1 var(--f-sans); border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); color:var(--c-ink2); cursor:pointer}
.deck-btn:hover{background:var(--c-hover)}
.docs-stale{background:var(--c-gap-bg); color:var(--c-gap-ink); border-left:3px solid var(--c-gap-rule); border-radius:2px 6px 6px 2px; padding:8px 12px}

/* Market evidence (compsHtml): one row per comparable, deal, filing or series,
   each ending in the pages its own figures were read from. The sources line is
   the point of the block, so it is a row of its own rather than a suffix.

   Each topic is its own <details>, so opening the peers does not also unroll
   the sixteen filings. */
.comps .comps-sec{border-top:1px solid var(--c-line2); padding:.35rem 0}
/* Wrapping, so a long topic name and its count go to two lines rather than
   one line clipped by the pane (.issues-list scrolls on Y, which makes X
   `auto`, which clips). */
.comps .comps-sec>summary{cursor:pointer; list-style:none;
  font:700 9.5px/1.8 var(--f-sans); letter-spacing:var(--ls-cap);
  text-transform:uppercase; color:var(--c-ink2);
  display:flex; flex-wrap:wrap; gap:.5rem; align-items:baseline; min-width:0}
.comps .comps-sec>summary::-webkit-details-marker{display:none}
.comps .comps-sec>summary::before{content:"▸"; font-size:9px; color:var(--c-muted); letter-spacing:0}
.comps .comps-sec[open]>summary::before{content:"▾"}
.comps .comps-sec>summary:hover{color:var(--c-accent)}
.comps .comps-sec>summary .c{font:400 var(--t-xs)/1.8 var(--f-sans); letter-spacing:0;
  text-transform:none; color:var(--c-muted)}
/* `mev-` (market evidence), and the prefix is load-bearing. These rows were
   class="cmp"/"cmp-l", which this file has used since the review pane's
   Compared row for something else — and `.cmp-l{max-width:16rem;
   overflow:hidden; text-overflow:ellipsis; white-space:nowrap}` quietly capped
   the row at 256px and cut 46px off "Viking area assets, West-central
   Saskatchewan". A short class name in a 1,600-line sheet is a collision
   waiting for a reader to report it. */
.comps ul.mev{list-style:none; margin:0; padding:0}
.comps ul.mev>li{padding:.45rem 0; border-top:1px solid var(--c-line2); min-width:0}
/* The title is its own line and the meta is the next one — never two flex
   items that wrap into each other when the title is long. */
.comps .mev-title{display:flex; flex-wrap:wrap; align-items:baseline; gap:.4rem; min-width:0}
.comps .mev-title b{font:500 var(--t-md)/1.35 var(--f-serif); color:var(--c-ink);
  overflow-wrap:anywhere}
.comps .mev-tk{font:500 var(--t-xs)/1.4 var(--f-mono); color:var(--c-accent);
  background:var(--c-accent-soft); border-radius:var(--r-xs); padding:1px 5px; white-space:nowrap}
.comps .mev-meta{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-ink2)}
/* A deal's figures: two up where the pane is wide enough, one where it is not,
   so sixteen of them fit without anything being cut. */
.comps ul.mev-figs{list-style:none; margin:.2rem 0 0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fit,minmax(15rem,1fr)); column-gap:1.2rem}
.comps ul.mev-figs>li{display:flex; gap:.4rem; align-items:baseline;
  font:400 var(--t-sm)/1.7 var(--f-sans); color:var(--c-ink2); min-width:0}
.comps .mev-m{flex:1 1 auto; min-width:0; color:var(--c-muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.comps .mev-v{font:500 var(--t-sm)/1.7 var(--f-mono); color:var(--c-ink); white-space:nowrap}
.comps .mev-u{color:var(--c-muted); font-size:var(--t-xs); white-space:nowrap}
.comps .mev-agree{font:500 9px/1.5 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase;
  color:var(--c-high); background:var(--c-high-soft); border-radius:var(--r-pill); padding:0 6px; white-space:nowrap}
.comps .mev-why{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-muted); margin:.1rem 0 0}
.comps .mev-why i{color:var(--c-med-ink); font-style:italic}
.comps .mev-src{display:block; margin:.15rem 0 0; font:400 var(--t-xs)/1.6 var(--f-sans)}
.comps .mev-src a{color:var(--c-accent); text-decoration:none; border-bottom:1px dotted var(--c-line)}
.comps .mev-src a:hover{border-bottom-style:solid}

/* The Gaps block (app.js::gapsHtml): six sections, one row per gap. It wears
   `comps` as well as `gaps-pan` on purpose — a gap row IS the market-evidence
   row (a sentence, its context line, then the pages it was read from), so the
   rules above are shared rather than restated, and only what is this block's
   own is here. */
.gaps-pan .gp-note{margin:.1rem 0 .2rem; color:var(--c-muted); font-style:italic}
/* What the engines found for one gap, indented under it so a row with seven
   findings still reads as one gap. */
.gaps-pan ul.gp-finds{list-style:none; margin:.3rem 0 0; padding:0 0 0 .7rem; border-left:2px solid var(--c-line2)}
.gaps-pan ul.gp-finds>li{padding:.25rem 0; min-width:0}
.gaps-pan .gp-fid{font:500 var(--t-xs)/1.6 var(--f-mono); color:var(--c-accent); margin-right:.35rem}
.gaps-pan .gp-fl{font:400 var(--t-sm)/1.6 var(--f-sans); color:var(--c-ink); overflow-wrap:anywhere}
/* The vendor half of a gap that is half public: on the row, never a second row
   in the request section. */
.gaps-pan .gp-ask{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-ink2); margin:.2rem 0 0; overflow-wrap:anywhere}
.gaps-pan .gp-ask>span{font:700 9px/1.6 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); margin-right:.3rem}
/* The questions this deck no longer asks: under the sections, and quieter. */
.gaps-pan .gp-hist{border-top:1px solid var(--c-line2); margin:.5rem 0 0; padding-top:.4rem; color:var(--c-muted)}
.deck-actions{display:flex; gap:var(--s-2); align-items:center; flex-wrap:wrap; margin-top:10px}
.deck-actions > button{display:inline-flex; align-items:center; height:var(--h-ctl); font:500 var(--t-sm)/1 var(--f-sans); padding:0 12px; border-radius:var(--r-sm); border:1px solid var(--c-line); background:var(--c-card); color:var(--c-ink2); cursor:pointer}
.deck-actions > button:hover{background:var(--c-hover)}
.deck-actions > button.primary{background:var(--c-accent); border-color:var(--c-accent); color:#fff}
.deck-actions > button:disabled{color:var(--c-muted); background:var(--c-paper2); border-color:var(--c-line2); cursor:not-allowed}
.filepick .pick{height:var(--h-ctl); display:inline-flex; align-items:center; font:500 var(--t-sm)/1 var(--f-sans); padding:0 12px; border-radius:var(--r-sm); border:1px solid var(--c-line); background:var(--c-card); color:var(--c-ink2)}
.drop .filepick{flex:none}
.docs .doc a.fn{color:var(--c-ink); text-decoration:none}
.docs .doc a.fn:hover{text-decoration:underline}
.doc .rm{opacity:0; font:500 var(--t-xs)/1 var(--f-sans); color:var(--c-muted); border:0; background:none; cursor:pointer; padding:2px 6px; border-radius:var(--r-xs); justify-self:end}
.doc:hover .rm{opacity:1}
.doc .rm:hover{color:var(--c-low); background:var(--c-low-soft)}
/* The assumptions table is text with one numeric column, not a numeric
   table: left-aligned, the note given the width, the value its input. */
.assump-table{width:100%; table-layout:fixed}
.assump-table th,.assump-table td{text-align:left; vertical-align:top; padding:6px 8px}
.assump-table th:nth-child(1),.assump-table td:nth-child(1){width:22%; color:var(--c-ink); font-weight:500}
.assump-table th:nth-child(2),.assump-table td:nth-child(2){width:7rem}
.assump-table th:nth-child(3),.assump-table td:nth-child(3){width:7rem}
.assump-table td.deck-src{font-size:var(--t-sm); color:var(--c-ink2)}
.assump-table input.assump{width:100%; height:28px; border:1px solid var(--c-line); border-radius:var(--r-sm); padding:0 8px; background:var(--c-card); font:400 12px/1 var(--f-mono); text-align:right}
/* The report inside the pane. Its pages are drawn at a fixed 1280px, so the
   page that shows it takes the whole window (.split.wide) and app.js scales
   the frame when even that is narrower; .report-fit is the clipping box the
   layout sees, since a transform does not change one. */
.report-fit{overflow:hidden; margin:0 var(--gut) 12px; background:#E7E5E0; border:1px solid var(--c-line); border-radius:var(--r-sm)}
.report-frame{display:block; border:0; background:#E7E5E0; transform-origin:top left}
.deck-page-acts{display:inline-flex; align-items:center; gap:8px; flex:none}
/* the claims ledger inside the pane: the page's own document, framed */
.claims-frame{display:block; width:100%; height:calc(100vh - var(--h-bar) - 170px); border:1px solid var(--c-line); border-radius:var(--r-sm); background:#fff; margin:0 22px 12px; width:calc(100% - 44px)}
.cid{color:var(--c-accent); text-decoration:none; font-family:var(--f-mono); font-size:.92em}
.cid:hover{text-decoration:underline}
/* The score table: the numbers in their narrow columns stay right-aligned
   under their inputs; the reasons column is prose and reads left. */
.score-table{width:100%; table-layout:fixed}
.score-table th{text-align:left; vertical-align:bottom}
.score-table td{vertical-align:top; padding:8px}
.score-table th:nth-child(1),.score-table td:nth-child(1){width:9rem; text-align:left; font-weight:500; color:var(--c-ink)}
.score-table th:nth-child(2),.score-table td:nth-child(2){width:5.5rem}
.score-table th:nth-child(3),.score-table td:nth-child(3){width:6.5rem}
.score-table th:nth-child(4),.score-table td:nth-child(4){width:6rem}
.score-table th:nth-child(5),.score-table td:nth-child(5){width:7rem}
.score-table td:nth-child(6){text-align:left; font-size:var(--t-sm); color:var(--c-ink2)}
.score-table td:nth-child(n+2):nth-child(-n+5){text-align:right; font-family:var(--f-mono); font-size:11px}
.score-table td:nth-child(n+2):nth-child(-n+5) .deck-src{font-family:var(--f-sans)}
.score-table input.sc-w,.score-table input.sc-s{width:100%; height:28px; border:1px solid var(--c-line); border-radius:var(--r-sm); padding:0 8px; background:var(--c-card); font:400 12px/1 var(--f-mono); text-align:right}
.score-table .sc-iss{margin:6px 0 0; padding-left:1.1rem; text-align:left}
.score-table .sc-iss li{margin:3px 0}

/* the second read (What changed): a move up or down, the current read's row */
.chg-up{color:#2E7D4F;font-weight:600}
.chg-down{color:#B5473A;font-weight:600}
.deck-table tr.chg-now td{background:var(--rule-2)}
.chg-gaps li{margin:.15rem 0}

/* ============================================================================
   PREMIUM PASS (2026-10-09). The right pane gets one gutter, one table rule,
   one section-heading recipe and one control height; the modals the same
   control recipe. Everything here is an override of a rule above it — the
   deck's tokens are untouched.
   ============================================================================ */
:root{--gut:22px; --h-in:34px}

/* ── the right pane: one left edge ──
   The scope row, the run head, the pages and the empty message all start at
   the same x. The old rules gave them four. */
.issues-pane{container-type:inline-size}
.issues-head{padding:10px var(--gut); background:var(--c-card); border-bottom:1px solid var(--c-line)}
.issues-head .head-row{margin-bottom:0; min-height:24px}
.issues-head .filters:not([hidden]){margin-top:8px}
.scope-now{font:600 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink)}
.scope-tog{font:400 var(--t-sm)/1.4 var(--f-sans)}
.issues-list:has(> .deck-head){padding:0 0 32px}
.issues-list > .empty{padding:14px var(--gut); margin:0; font:400 var(--t-md)/1.55 var(--f-serif); color:var(--c-muted)}
.deck-head{padding:14px var(--gut) 4px; gap:12px}
.deck-head > .deck-note,.deck-head > .deck-page-head{padding:0; margin:0}
.deck-note{padding:0 var(--gut); margin:0; font:400 var(--t-md)/1.55 var(--f-sans); color:var(--c-ink2)}
.deck-note.warn{color:var(--c-gap-ink)}
.deck-note.research{color:var(--c-muted)}
.deck-legend{margin:0; padding:10px 14px; background:var(--c-paper2); border-radius:var(--r-md); font:400 var(--t-md)/1.55 var(--f-sans); color:var(--c-ink2)}

/* the run head: id, state, time, the files as one row of quiet links */
.rhead{padding-bottom:12px; gap:12px}
.rhead .links{gap:4px}
.rhead .links a,.rhead .links a.cid{font:500 var(--t-sm)/1 var(--f-sans); padding:6px 8px; border-radius:var(--r-sm); color:var(--c-accent)}
.rhead .links a:hover{background:var(--c-accent-soft); text-decoration:none}

/* KPI tiles: a caps kicker, the figure, then up to two lines of context.
   Six tiles in a pane this wide were 120px each and every subline was cut
   off; past five tiles they now take two rows of three. */
.kpis{gap:10px}
.kpi{padding:11px 14px 12px; gap:3px; min-height:84px}
.kl{font:700 9.5px/1.3 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.kv{margin-top:1px; font-variant-numeric:tabular-nums lining-nums; letter-spacing:-.01em}
.kv small{margin-left:3px}
.ks{white-space:normal; line-height:1.4; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}
.kpi .meter{margin-top:auto}
@container (max-width:1100px){.kpis:has(> .kpi:nth-child(5)){grid-template-columns:repeat(3,1fr) !important}}
@container (max-width:620px){.kpis{grid-template-columns:repeat(2,1fr) !important}}

/* ── a panel page: title, lede, sections ── */
.deck-page-head{align-items:center; margin:0}
.deck-page-head h3{font:500 var(--t-xl)/1.2 var(--f-serif); color:var(--c-ink)}
.deck-btn.back{height:28px; color:var(--c-ink2)}
.deck-page{display:block}
/* a section: a rule, a summary line in the pane's prose size, the body */
.deck-page .deck-assump,.deck-page details.deck-assump{margin:0; padding:12px var(--gut) 14px; border:0; border-top:1px solid var(--c-line); font-size:inherit}
.deck-page > .deck-assump:first-child,.deck-page > details:first-child{border-top:0; padding-top:4px}
.deck-assump > summary{list-style:none; position:relative; cursor:pointer; padding:2px 0 2px 14px; margin:0 0 6px; border:0; font:400 var(--t-md)/1.5 var(--f-sans); color:var(--c-ink2)}
.deck-assump > summary::-webkit-details-marker{display:none}
.deck-assump > summary::before{content:""; position:absolute; left:0; top:.55em; width:0; height:0; border:4px solid transparent; border-left:5px solid var(--c-muted); transition:transform .12s; color:inherit; float:none; margin:0}
.deck-assump[open] > summary::before{transform:rotate(90deg) translateX(-1px)}
.deck-assump > summary:hover{color:var(--c-ink)}
.deck-assump > summary b{color:var(--c-ink); font-weight:600}
.deck-assump > summary h3.sec{display:inline; margin:0; font:600 var(--t-md)/1.5 var(--f-sans); color:var(--c-ink); letter-spacing:0; text-transform:none}
.deck-assump > summary h3.sec .c{font:400 var(--t-md)/1.5 var(--f-sans); color:var(--c-ink2); margin-left:4px}
.deck-page p{margin:6px 0}
.deck-page p.deck-src{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-muted); margin:8px 0 0}
.deck-page p.deck-src b{color:var(--c-ink2)}
.deck-page .deck-note{padding:12px var(--gut) 0}
.deck-page .deck-note.warn{color:var(--c-gap-ink)}

/* ── the pane's tables: the deck's rule — a heavy rule under the header,
   hairlines between rows, no cell borders, numbers right in mono ── */
.deck-page .deck-table{width:100%; border-collapse:collapse; margin:4px 0 2px; font-size:var(--t-sm); font-variant-numeric:tabular-nums lining-nums; table-layout:auto}
.deck-page .deck-table th,.deck-page .deck-table td{border:0; text-align:left; vertical-align:top}
.deck-page .deck-table th{padding:6px 10px 6px 0; background:none; font:700 9.5px/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); border-bottom:1.5px solid var(--c-ink); white-space:nowrap}
.deck-page .deck-table td{padding:8px 10px 8px 0; border-bottom:1px solid var(--c-line2); color:var(--c-ink2); line-height:1.45}
.deck-page .deck-table td:first-child{color:var(--c-ink); font-weight:500}
.deck-page .deck-table th:last-child,.deck-page .deck-table td:last-child{padding-right:0}
.deck-page .deck-table tr:last-child td{border-bottom:0}
.deck-page .deck-table th.num,.deck-page .deck-table td.num{text-align:right; white-space:nowrap}
.deck-page .deck-table td.num{font:500 11px/1.5 var(--f-mono); color:var(--c-ink)}
.deck-page .deck-table td.num .deck-src{display:block; font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted); white-space:normal}
.deck-page .deck-table td .deck-src{color:var(--c-muted)}
.deck-page .deck-table td.deck-src{color:var(--c-muted); font-size:var(--t-sm)}
.deck-page .deck-table .run{font:500 11px/1.3 var(--f-mono); color:var(--c-ink)}
.deck-page .deck-table tr.chg-now td{background:var(--c-sel)}
.deck-page .deck-table .chg-up{color:#2E7D4F} .deck-page .deck-table .chg-down{color:#B5473A}
.deck-page .deck-table .dchip{font-size:9px}
.deck-page .deck-table input.assump,.deck-page .deck-table input.sc-w,.deck-page .deck-table input.sc-s{height:28px; font:500 12px/1 var(--f-mono)}
.deck-page .deck-table input:focus{outline:none; border-color:#5B86B5; box-shadow:0 0 0 3px rgba(91,134,181,.18)}

/* The score table and the second read's section table carry a column of
   prose beside five columns of numbers. In a pane this wide the prose column
   was 10rem and wrapped every two words into a row 40 lines tall. Each row is
   now a grid: the numbers on one line, the reason under them at full width. */
.deck-page .score-table,.deck-page .chg-sections,.deck-page .score-table tbody,.deck-page .chg-sections tbody{display:block; width:100%}
.deck-page .score-table tr,.deck-page .chg-sections tr{display:grid; column-gap:12px; align-items:start; padding:10px 0; border-bottom:1px solid var(--c-line2)}
.deck-page .score-table tr{grid-template-columns:minmax(6rem,1.2fr) 4.5rem 7.5rem 7rem 7rem}
.deck-page .chg-sections tr{grid-template-columns:minmax(6rem,1.2fr) 5rem 5rem 5rem 6rem}
.deck-page .score-table tr:first-child,.deck-page .chg-sections tr:first-child{padding:0 0 6px; border-bottom:1.5px solid var(--c-ink)}
.deck-page .score-table tr:last-child,.deck-page .chg-sections tr:last-child{border-bottom:0}
.deck-page .score-table th,.deck-page .score-table td,.deck-page .chg-sections th,.deck-page .chg-sections td{padding:0; border:0; width:auto; min-width:0}
.deck-page .score-table th:nth-child(n+2):nth-child(-n+5),.deck-page .chg-sections th:nth-child(n+2):nth-child(-n+5){text-align:right}
.deck-page .score-table td:nth-child(n+2):nth-child(-n+5),.deck-page .chg-sections td:nth-child(n+2):nth-child(-n+5){text-align:right; font:500 11px/1.5 var(--f-mono); color:var(--c-ink)}
.deck-page .score-table td:nth-child(n+2):nth-child(-n+5) .deck-src,.deck-page .chg-sections td:nth-child(n+2):nth-child(-n+5) .deck-src{display:block; font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted); white-space:normal; margin-top:3px}
.deck-page .score-table th:nth-child(6),.deck-page .chg-sections th:nth-child(6){display:none}
.deck-page .score-table td.why,.deck-page .chg-sections td.why{grid-column:1/-1; padding-top:8px; font:400 var(--t-sm)/1.55 var(--f-sans); color:var(--c-ink2); text-align:left}
.deck-page .score-table td.why::before,.deck-page .chg-sections td.why::before{content:"Why, and what limits it"; display:block; font:700 9px/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); margin-bottom:3px}
.deck-page .chg-sections td.why::before{content:"Why it moved"}
.deck-page .score-table td.why .deck-src,.deck-page .chg-sections td.why .deck-src{color:var(--c-muted)}
.sc-iss{text-align:left; margin:6px 0 0; padding-left:1.1rem}
.sc-iss li{margin:3px 0}
.sc-iss li b{color:var(--c-ink)}
.deck-page .chg-sections td.why .sc-iss li b{font-weight:600}
.deck-page .score-table input.sc-w,.deck-page .score-table input.sc-s{width:100%; max-width:6rem}
@container (max-width:640px){
  .deck-page .score-table tr{grid-template-columns:1fr 4.5rem 7.5rem}
  .deck-page .chg-sections tr{grid-template-columns:1fr 5rem 5rem}
  .deck-page .score-table td:nth-child(4),.deck-page .score-table td:nth-child(5),.deck-page .score-table th:nth-child(4),.deck-page .score-table th:nth-child(5),
  .deck-page .chg-sections td:nth-child(4),.deck-page .chg-sections td:nth-child(5),.deck-page .chg-sections th:nth-child(4),.deck-page .chg-sections th:nth-child(5){display:none}
}
/* the scorecard ratings row: label, select, label, select — one line that wraps */
.deck-page .sc-p{display:inline-flex; align-items:center; gap:6px; margin:4px 12px 4px 0; white-space:nowrap}
.deck-page select.sc-r{height:28px; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:0 6px; font:400 12px/1 var(--f-sans); color:var(--c-ink2)}

/* ── the lists the pages carry (the gap list reused): the pane's size, not
   the slide's 10.6px, and the plain variant for lists that are not gaps ── */
.deck-page .gl{margin:4px 0 0; gap:6px}
.deck-page .gl li{font-size:var(--t-sm); line-height:1.5; color:var(--c-ink2); padding-left:14px}
.deck-page .gl li::before{top:.68em}
.deck-page .gl li b{color:var(--c-ink); font-weight:600}
.gl.plain li{color:var(--c-ink2)} .gl.plain li::before{background:var(--c-line)}
.gl.plain .deck-src{color:var(--c-muted); margin-left:4px}
.deck-page .gl .imp{vertical-align:2px}

/* ── the documents page ── */
.deck-page .docs{margin-top:8px}
.doc{grid-template-columns:16px minmax(0,1.6fr) 78px minmax(0,1.1fr) auto; padding:9px 4px; font-size:var(--t-sm)}
.doc .fn{font-weight:500}
.doc .why{font-size:var(--t-xs); line-height:1.45}
.doc .rm{height:22px; display:inline-flex; align-items:center}
.docs-stale{margin:0 0 10px}
.drop{margin-top:14px; padding:10px 12px}
.drop .lbl{display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-muted); text-transform:none; letter-spacing:0}
.drop .lbl b{font-weight:600; color:var(--c-ink2)}
.drop .lbl small{font:500 var(--t-xs)/1.4 var(--f-sans); letter-spacing:.04em; color:var(--c-muted)}
.drop .filepick{gap:10px}
.drop .filepick .chosen{font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-muted); max-width:16rem}
.drop .filepick .chosen.some{color:var(--c-ink2)}
.deck-page .deck-actions{margin:12px 0 0; gap:8px}
.deck-page .deck-actions .deck-src{font-size:var(--t-sm)}
.deck-page .opt{margin-top:12px}
.deck-page .deck-assump > p.deck-src:last-child{margin-top:12px}

/* ── the deck's slide list in the pane ── */
.deck-slides{padding:0}
.deck-hit:first-child .deck-slide{border-top:1px solid var(--c-line)}
.deck-slide{padding:8px var(--gut); margin:0; border-top:1px solid var(--c-line2); font-size:inherit}
.deck-slide > summary{list-style:none; border:0; margin:0; padding:3px 0; color:inherit; display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; font:400 var(--t-md)/1.4 var(--f-sans)}
.deck-slide > summary::before,.deck-slide[open] > summary::before{content:none}
.deck-slide > summary::-webkit-details-marker{display:none}
.deck-slide > summary:hover b{color:var(--c-accent)}
.deck-slide > summary .n{min-width:1.4rem}
.deck-slide > summary b{font:500 var(--t-lg)/1.3 var(--f-serif); color:var(--c-ink)}
.deck-slide[open] > summary b{color:var(--c-accent)}
.deck-body{padding:4px 0 6px 1.6rem; font:400 var(--t-md)/1.55 var(--f-sans); color:var(--c-ink2)}
.deck-body p{margin:4px 0}
.deck-body p b{color:var(--c-ink)}
.deck-body ul{margin:4px 0 6px; padding-left:1.2rem}
.deck-body li{margin:2px 0}
.deck-body .deck-src{font-size:var(--t-sm); color:var(--c-muted)}
.deck-body .deck-table{width:auto; max-width:100%; margin:6px 0; font-size:var(--t-xs); font-variant-numeric:tabular-nums lining-nums}
.deck-body .deck-table th,.deck-body .deck-table td{border:0; border-bottom:1px solid var(--c-line2); padding:4px 10px 4px 0}
.deck-body .deck-table th{background:none; border-bottom:1.5px solid var(--c-ink); font:700 9px/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); text-align:right}
.deck-body .deck-table th:first-child{text-align:left}
.deck-body .deck-table tr:last-child td{border-bottom:0}
.deck-body .empty{padding:0; margin:4px 0; font:400 var(--t-md)/1.5 var(--f-serif); color:var(--c-muted)}
.deck-from{margin:4px 0 4px 1.6rem; font:400 var(--t-sm)/1.5 var(--f-sans)}
.deck-from .lbl{font:600 var(--t-xs)/1.5 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-accent); margin-right:4px}
.gapbox{border-radius:var(--r-sm)}
.gh span{letter-spacing:var(--ls-cap); text-transform:uppercase; font-size:9px}

/* ── modals: one control recipe (34px inputs and selects, white, a blue ring
   on focus), labels in the pane's small weight, the users table on the deck's
   table rule with text actions in fixed slots ── */
.modal-box{padding:18px 22px 18px}
.modal-box h2,.users-box h2{margin:0 0 14px}
.users-box h2 .x,.term-head .x,.art-head .x{width:28px; height:28px; display:inline-flex; align-items:center; justify-content:center; border-radius:var(--r-sm); color:var(--c-muted); font-size:13px; padding:0}
.users-box h2 .x:hover,.term-head .x:hover,.art-head .x:hover{background:var(--c-paper2); color:var(--c-ink)}
.modal-box label,.kind-label,.login-box label{font:600 var(--t-sm)/1.5 var(--f-sans); color:var(--c-ink2); letter-spacing:0; text-transform:none; margin:0 0 12px}
.modal-box input:not([type=checkbox]):not([type=radio]):not([type=file]),.users-box select,.login-box input{
  height:var(--h-in); margin-top:4px; padding:0 10px; font:400 var(--t-md)/1 var(--f-sans); color:var(--c-ink);
  border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); box-shadow:none; transition:border-color .12s, box-shadow .12s;
}
.modal-box input::placeholder{color:#A6ADB8}
.modal-box input:focus,.users-box select:focus,.login-box input:focus,.tg-note:focus{outline:none; border-color:#5B86B5; box-shadow:0 0 0 3px rgba(91,134,181,.18)}
.modal-box .hint{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-muted)}
.modal-box .err{border-radius:var(--r-sm); font-size:var(--t-sm)}
.modal-box .actions{gap:8px; margin-top:4px}
.seg{border-radius:var(--r-sm)}
.seg-opt{height:var(--h-ctl); display:inline-flex; align-items:center; padding:0 14px; font:500 var(--t-sm)/1 var(--f-sans)}
.modal-box .filepick{align-items:center; gap:10px}
.modal-box .filepick .chosen{font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-muted)}

.users-box{width:min(46rem,100%)}
.users-box table{margin:0 0 6px; font:400 var(--t-md)/1.4 var(--f-sans)}
.users-box th{padding:6px 10px 6px 0}
.users-box td{padding:10px 10px 10px 0; vertical-align:middle}
.users-box tbody tr:last-child td{border-bottom:1px solid var(--c-line2)}
.users-box td:first-child b{color:var(--c-ink); font-weight:600}
.users-box td .hint{font-size:var(--t-sm); color:var(--c-muted); margin:0 0 0 2px}
.users-box td .role{font:600 9.5px/1 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-ink2); background:var(--c-paper2); border:1px solid var(--c-line2); border-radius:var(--r-pill); padding:4px 8px}
.users-box .projs{font:400 var(--t-sm)/1.4 var(--f-mono); color:var(--c-ink2)}
.users-box td.acts{padding-right:0; white-space:nowrap}
.users-box td.acts button,.users-box td.acts .acts-gap{
  display:inline-flex; align-items:center; justify-content:center; height:26px; padding:0 8px; margin-left:2px;
  font:500 var(--t-sm)/1 var(--f-sans); color:var(--c-accent); background:transparent; border:1px solid transparent; border-radius:var(--r-sm);
}
.users-box td.acts [data-edit]{min-width:48px}
.users-box td.acts .danger,.users-box td.acts .acts-gap{min-width:60px}
.users-box td.acts button:hover{background:var(--c-accent-soft); text-decoration:none}
.users-box td.acts button.danger{color:var(--c-low)}
.users-box td.acts button.danger:hover{background:var(--c-low-soft)}
.users-box form{border-top:1px solid var(--c-line); margin-top:10px; padding-top:16px}
.users-box form h3{font:500 var(--t-lg)/1.2 var(--f-serif); color:var(--c-ink); margin:0 0 12px}
.users-box .row{gap:12px 16px; align-items:start}
.users-box .row > label{margin:0}
.users-box .chk{min-height:var(--h-in); margin-top:4px; align-items:center; gap:6px 14px; font:400 var(--t-md)/1.4 var(--f-sans)}
.users-box .chk input{accent-color:var(--c-accent); width:14px; height:14px; margin:0}
.users-box .ok{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-high); margin:6px 0 0}
.users-box .actions{margin-top:14px}
.users-box .actions button{height:var(--h-ctl); font:500 var(--t-sm)/1 var(--f-sans); padding:0 12px; border-radius:var(--r-sm)}
.archive-box .tbl th{border-bottom:1.5px solid var(--c-ink)}

/* ── the login card ── */
.login-box{border-radius:10px; box-shadow:var(--sh-modal); padding:22px 24px 20px}
.login-box h1{font:500 var(--t-2xl)/1.2 var(--f-serif); margin:4px 0 16px}
.login-box .actions button{height:var(--h-ctl); font:500 var(--t-sm)/1 var(--f-sans); padding:0 14px; border-radius:var(--r-sm); background:var(--c-accent); border-color:var(--c-accent)}

/* ── the slide pane: the head's controls on one height ── */
.slide-head{padding:10px var(--s-6)}
.nav{height:28px; width:28px; padding:0; justify-content:center; display:inline-flex; align-items:center}

/* the users form's project field: a block label, not a <label> round the
   checkboxes (clicking the word toggled the first box) */
.users-box .fld{margin:0}
.users-box .fld-l{display:block; font:600 var(--t-sm)/1.5 var(--f-sans); color:var(--c-ink2)}
/* the optional email: an address on the row, an em dash where there is none,
   and the word "optional" beside the field's label rather than in a tooltip */
.users-box td.mail{font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2)}
.users-box td.mail a{color:var(--c-accent); text-decoration:none}
.users-box td.mail a:hover{text-decoration:underline}
.users-box label .hint{font:400 var(--t-xs)/1 var(--f-sans); color:var(--c-muted); text-transform:none; letter-spacing:0}
/* ── the billing panel: a month, four tables wide ── */
.billing-box{max-width:62rem}
.billing-box .bill-head{display:flex; align-items:center; gap:.4rem; margin:0 0 .9rem}
.billing-box .bill-head .spacer{flex:1}
.billing-box select#bill-month{width:auto; min-width:16rem; margin:0}
.bill-step{height:var(--h-ctl); min-width:2rem; padding:0 .5rem; border:1px solid var(--rule); border-radius:var(--r-sm); background:var(--card); cursor:pointer; color:var(--ink)}
.bill-step:disabled{opacity:.4; cursor:default}
.bill-csv{font:var(--w-reg) var(--t-sm)/1.4 var(--ui); color:var(--link)}
.bill-h{font:var(--w-bold) var(--t-lg)/1.2 var(--serif); margin:1.1rem 0 .4rem}
.bill-h .hint{font:var(--w-reg) var(--t-xs)/1 var(--ui)}
.billing-box .kpis{margin:0 0 .3rem}
.bill-tbl{width:100%; border-collapse:collapse; font:var(--w-reg) var(--t-md)/1.45 var(--ui); margin:0 0 .3rem}
.bill-tbl th{text-align:left; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3); border-bottom:1px solid var(--rule); padding:.3rem .45rem}
.bill-tbl td{padding:.34rem .45rem; border-bottom:1px solid var(--rule-2); vertical-align:top}
.bill-tbl th.num,.bill-tbl td.num{text-align:right; font-variant-numeric:tabular-nums}
.bill-tbl tr.bill-off td{color:var(--ink-3)}
.bill-tbl tr.bill-none td{background:var(--paper)}
.bill-reads{margin:1.1rem 0 .2rem}
.bill-reads>summary{font:var(--w-bold) var(--t-md)/1.4 var(--ui); cursor:pointer; padding:.2rem 0}
.bill-rule{border:0; border-top:1px solid var(--rule); margin:1.2rem 0 .7rem}
/* the pricing form: the estimated-reads field is a sentence, so it takes the
   row rather than half of it, and the preview under the row is prose */
.users-box .row .fld.wide{grid-column:1 / -1}
#pricing-preview{margin:.2rem 0 .9rem}
#pricing-preview .run{font-family:var(--mono)}
/* the login card's brand line is the wordmark, not the bar's divider */
.login-box .brand{border:0; padding:0; height:auto; color:var(--c-muted); margin:0 0 6px}
.issues-list:has(> p.empty:first-child){padding:0 0 32px}
/* the run dialog's page box sits in the button row: the row's height, no field margin */
.modal-box .run-pages input:not([type=checkbox]):not([type=radio]):not([type=file]){height:var(--h-ctl); margin:0; width:6rem}

/* the admin's model / effort / rewrite picker in the run dialog: a row of its own above the buttons.
   Each field is label-over-control like the rest of the modal (.modal-box label is display:block,
   which is what broke the first attempt when it was left in the button row). */
.run-box .run-model{flex:0 0 auto; display:grid; grid-template-columns:minmax(0,11rem) minmax(0,7rem) minmax(0,1fr); gap:.6rem .8rem; align-items:end; padding:.7rem 0 .1rem; border-top:1px solid var(--rule-2); margin-top:.3rem}
.run-box .run-model[hidden]{display:none}
/* the modal's own input rule is more specific than the one above; match it so the text box is the selects' height */
.modal-box.run-box .run-model input:not([type=checkbox]):not([type=radio]):not([type=file]){height:var(--h-ctl); margin:.2rem 0 0; width:100%}
.run-box .run-model label{display:block; margin:0; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3)}
.run-box .run-model .run-hint{display:block; margin:.15rem 0 0; font:var(--w-reg) var(--t-xs)/1.4 var(--ui); color:var(--ink-3)}
.run-box .run-model select,.run-box .run-model input{display:block; width:100%; height:var(--h-ctl); margin:.2rem 0 0; box-sizing:border-box; padding:0 8px; font:var(--w-reg) var(--t-md)/1 var(--ui); color:var(--ink); background:var(--card); border:1px solid var(--rule); border-radius:var(--r-sm)}
/* the buttons row under it needs no second rule */
.run-box .run-model:not([hidden]) + .actions{border-top:0; margin-top:0}

.run-box .run-asof{flex:0 0 auto; display:flex; gap:.8rem 1.2rem; align-items:end; flex-wrap:wrap; padding:.6rem 0 .1rem; border-top:1px solid var(--rule-2); margin-top:.3rem}
.run-box .run-asof[hidden]{display:none}
.run-box .run-asof label{display:block; margin:0; font:var(--w-bold) var(--t-xs)/1.5 var(--ui); color:var(--ink-3)}
.run-box .run-asof-date input{height:var(--h-ctl); margin:.2rem 0 0; padding:0 8px; box-sizing:border-box; font:var(--w-reg) var(--t-md)/1 var(--ui); color:var(--ink); background:var(--card); border:1px solid var(--rule); border-radius:var(--r-sm)}

/* ── the conversation dock (analyze workflow only; app/conversation.py,
   reports/analyze/CONVERSATION_PANEL_DESIGN.md §1,§8, task 0). Fixed over
   the split; z-index 35 — above nothing on the page (the header menus sit
   at 30), below every modal (40) and the chip popover (50), so an open run
   dialog or artifact viewer still wins. The pill is the same corner so
   opening/closing never jumps the eye to a different spot on screen. ── */
.conv-pill{position:fixed; right:16px; bottom:16px; z-index:35; display:inline-flex; align-items:center; gap:8px;
  background:var(--c-accent); color:#fff; border:0; border-radius:var(--r-pill); padding:9px 16px;
  font:500 var(--t-sm)/1 var(--f-sans); box-shadow:var(--sh-pop); cursor:pointer}
.conv-pill:hover{background:var(--c-navy)}
.conv-dot{width:7px; height:7px; border-radius:50%; background:#f3c969; animation:conv-pulse 1.1s ease-in-out infinite}
@keyframes conv-pulse{0%,100%{opacity:1} 50%{opacity:.35}}

.conv-dock{position:fixed; right:16px; bottom:16px; z-index:35; width:440px; height:min(720px,calc(100vh - 72px));
  background:var(--c-card); border:1px solid var(--c-line); border-radius:var(--r-md); box-shadow:var(--sh-pop);
  display:flex; flex-direction:column; overflow:hidden}
.conv-head{padding:12px 16px 10px; border-bottom:1px solid var(--c-line2); display:flex; flex-wrap:wrap; align-items:baseline; gap:6px 10px; flex:0 0 auto}
.conv-head .conv-k{font:600 var(--t-xs)/1 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted)}
.conv-head .conv-t{font:500 var(--t-lg)/1 var(--f-serif); color:var(--c-ink)}
.conv-asof{background:var(--c-gap-bg); color:var(--c-gap-ink); border-radius:var(--r-xs); padding:1px 6px; font:500 var(--t-xs)/1.4 var(--f-sans)}
.conv-x{margin-left:auto; display:flex; gap:2px}
.conv-x button{width:24px; height:24px; display:inline-flex; align-items:center; justify-content:center; border:0; background:transparent; color:var(--c-muted); border-radius:var(--r-sm); font-size:13px; padding:0}
.conv-x button:hover{background:var(--c-paper2); color:var(--c-ink)}
.conv-head .conv-sub{flex-basis:100%; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2)}
.conv-head .conv-sub .run{font:500 var(--t-xs)/1 var(--f-mono); color:var(--c-ink2)}

.conv-thread{flex:1 1 0; overflow:auto; padding:12px 16px; display:flex; flex-direction:column; gap:14px; min-height:0}
.conv-thread .conv-empty{margin:0; font:400 var(--t-md)/1.5 var(--f-sans); color:var(--c-muted)}
.conv-msg .conv-who{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted); margin-bottom:3px}
.conv-msg .conv-who b{color:var(--c-ink2); font-weight:600}
.conv-msg p{margin:0; font:400 var(--t-md)/1.5 var(--f-sans); color:var(--c-ink)}
.conv-msg.house p{font-family:var(--f-serif); font-size:var(--t-lg)}
.conv-card{margin-top:7px; border:1px solid var(--c-line); border-radius:var(--r-sm); padding:8px 10px; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2); background:var(--c-paper)}
.conv-card-row{display:flex; gap:8px; align-items:baseline; flex-wrap:wrap}
.conv-st{font:600 var(--t-xs)/1 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase}
.conv-st.pending{color:var(--c-gap-ink)}
.conv-st.applied{color:var(--c-high)}
.conv-thread .ref{font:500 11px/1 var(--f-mono); color:var(--c-accent); background:var(--c-accent-soft); border-radius:var(--r-xs); padding:1px 4px; white-space:nowrap}
.conv-thread .ref.conv-claim{cursor:pointer}
.conv-thread .ref.conv-claim:hover{text-decoration:underline}

.conv-running p{display:flex; align-items:center; gap:8px; color:var(--c-ink2); font-family:var(--f-sans); font-size:var(--t-md)}
.conv-running .conv-dot{display:inline-block}
.conv-running .conv-open-run,.conv-apply-msg{border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); color:var(--c-ink); padding:3px 10px; font:500 var(--t-xs)/1.4 var(--f-sans); cursor:pointer}
.conv-apply-msg{background:var(--c-accent); color:#fff; border-color:var(--c-accent)}
.conv-apply-msg:disabled{opacity:.5; cursor:default}
.conv-table{border-collapse:collapse; width:100%; margin-top:6px; font:400 var(--t-sm)/1.4 var(--f-sans)}
.conv-table th{text-align:left; font:600 var(--t-xs)/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); border-bottom:1.5px solid var(--c-ink); padding:3px 4px}
.conv-table td{padding:3px 4px; border-bottom:1px solid var(--c-line2); color:var(--c-ink2)}
.conv-table td.n{font-family:var(--f-mono); font-size:var(--t-sm); text-align:right; white-space:nowrap}
.conv-unverified,.conv-struck,.conv-cannot{margin-top:6px; background:var(--c-gap-bg); border-left:3px solid var(--c-gap-rule); color:var(--c-gap-ink); padding:5px 8px; font:400 var(--t-sm)/1.4 var(--f-sans)}
.conv-rests,.conv-meta{margin-top:5px; font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted)}
.conv-proposal{flex:0 0 auto; margin:0 16px 10px; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:10px 12px; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2)}
.conv-prop-head{font:600 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink)}
.conv-prop-slides,.conv-prop-cost{margin-top:4px; color:var(--c-muted)}
.conv-prop-ex{margin-top:6px; background:var(--c-gap-bg); border:1px solid var(--c-gap-rule); color:var(--c-gap-ink); border-radius:var(--r-xs); padding:5px 8px; font:400 var(--t-xs)/1.4 var(--f-sans)}
.conv-prop-limits{margin:6px 0 0; padding-left:18px; color:var(--c-muted); font:400 var(--t-xs)/1.5 var(--f-sans)}
.conv-prop-err{color:var(--c-high); font:400 var(--t-xs)/1.4 var(--f-sans)}
.conv-prop-actions{display:flex; align-items:center; gap:8px; margin-top:8px}
.conv-prop-actions button{border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-ink); color:#fff; padding:5px 14px; font:500 var(--t-sm)/1 var(--f-sans); cursor:pointer}
.conv-prop-actions button:disabled{opacity:.5; cursor:default; background:var(--c-card); color:var(--c-ink2)}
.conv-prop-blocked{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted)}

/* The composer scrolls on its own and never takes more than two thirds of the
   dock: the items list and the reading card both grow, and before this the
   card's Record button was pushed under the dock's clipped edge. */
.conv-composer{border-top:1px solid var(--c-line2); padding:10px 12px 12px; background:var(--c-paper); flex:0 0 auto; max-height:60%; overflow:auto}
.conv-seg{display:inline-flex; border:1px solid var(--c-line); border-radius:var(--r-sm); overflow:hidden; background:var(--c-card); font:400 var(--t-sm)/1 var(--f-sans)}
.conv-seg span{padding:5px 10px; color:var(--c-ink2); cursor:pointer}
.conv-seg span.on{background:var(--c-accent); color:#fff}
.conv-items{margin-top:8px; max-height:30px; overflow:hidden; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card)}
.conv-items.open{max-height:200px; overflow:auto}
.conv-items-h{cursor:pointer; user-select:none; padding:6px 10px 4px; font:600 var(--t-xs)/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted)}
.conv-item{display:flex; width:100%; align-items:baseline; gap:8px; padding:6px 10px; border:0; border-top:1px solid var(--c-line2); background:transparent; text-align:left; cursor:pointer; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2)}
.conv-item:hover{background:var(--c-accent-soft)}
.conv-item-text{flex:1; color:var(--c-ink)}
.conv-item-impact{font:600 9px/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted)}
.conv-item-impact.high{color:var(--c-low)}
.conv-item-impact.med{color:var(--c-med-ink)}
.conv-box{margin-top:8px; width:100%; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:8px 10px;
  font:400 var(--t-md)/1.45 var(--f-sans); color:var(--c-ink); resize:vertical}
.conv-box:focus{outline:none; border-color:#5B86B5; box-shadow:0 0 0 3px rgba(91,134,181,.18)}
.conv-row{display:flex; align-items:center; gap:10px; margin-top:8px}
.conv-err{font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-low)}
.conv-send{background:var(--c-ink); color:#fff; border:0; border-radius:var(--r-sm); padding:6px 14px; font:500 var(--t-sm)/1 var(--f-sans); cursor:pointer}
.conv-send:disabled{opacity:.5; cursor:default}
.conv-attach-btn{cursor:pointer; font-size:15px; color:var(--c-muted); padding:2px 4px; border-radius:var(--r-sm)}
.conv-attach-btn:hover{background:var(--c-paper2)}
.conv-attach-names{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted); max-width:160px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}

/* ── the reading card (task 2): what the reading call made of the text,
   editable before Record — design section 3, "nothing is recorded until
   the reader presses Record." Amber for an error, same rule as a gap. ── */
.conv-card-edit{margin-top:10px; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:10px}
.conv-card-head{font:600 var(--t-xs)/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-muted); margin-bottom:6px}
.conv-card-errs{background:var(--c-gap-bg); border:1px solid var(--c-gap-rule); color:var(--c-gap-ink); border-radius:var(--r-xs); padding:6px 8px; font:400 var(--t-sm)/1.4 var(--f-sans); margin-bottom:8px}
.conv-card-errs div{margin:2px 0}
.cc-row{display:flex; align-items:center; gap:8px; margin:6px 0; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2); flex-wrap:wrap}
.cc-row label{color:var(--c-muted); font:600 11px/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; min-width:64px}
.cc-row select, .cc-row input[type=date]{border:1px solid var(--c-line); border-radius:var(--r-xs); background:var(--c-paper); padding:3px 6px; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink)}
.cc-summary{width:100%; border:1px solid var(--c-line); border-radius:var(--r-xs); background:var(--c-paper); padding:6px 8px; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink); resize:vertical}
.cc-chips{display:flex; flex-wrap:wrap; gap:5px}
.cc-chip{display:inline-flex; align-items:center; gap:5px; background:var(--c-accent-soft); color:var(--c-accent); border-radius:var(--r-xs); padding:1px 4px 1px 7px; font:500 11px/1.6 var(--f-mono)}
.cc-chip button{border:0; background:transparent; color:inherit; cursor:pointer; font-size:11px; padding:0 2px}
.cc-item-pick{font:400 var(--t-xs)/1.4 var(--f-sans); border:1px solid var(--c-line); border-radius:var(--r-xs); background:var(--c-paper); padding:2px 5px; color:var(--c-ink2)}
.cc-kv{display:flex; align-items:center; gap:6px; margin:3px 0}
.cc-kv .cc-key{font:500 var(--t-sm)/1.4 var(--f-mono); color:var(--c-ink2); min-width:170px}
.cc-kv input{width:110px; border:1px solid var(--c-line); border-radius:var(--r-xs); background:var(--c-paper); padding:3px 6px; font:400 var(--t-sm)/1.4 var(--f-sans)}
.cc-note{color:var(--c-gap-ink)}
.cc-ruling button{border:0; background:transparent; color:var(--c-muted); cursor:pointer; font-size:12px; padding:0 3px}
.cc-ruling{font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink2); background:var(--c-paper); border-radius:var(--r-xs); padding:4px 7px; margin:4px 0}
.conv-card-cost{margin-top:6px; font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted)}
.conv-card-actions{display:flex; align-items:center; gap:8px; margin-top:8px}
.conv-card-msg{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-high)}
.conv-card-actions button{border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:5px 12px; font:500 var(--t-sm)/1 var(--f-sans); cursor:pointer; color:var(--c-ink2)}
.conv-card-actions button.primary{background:var(--c-ink); color:#fff; border-color:var(--c-ink)}
.conv-card-actions button:disabled{opacity:.5; cursor:default}

/* A note on the Documents page is ADDED INFORMATION, shown as what was said and
   by whom — the PDF it was filed as is one small link, not the row. */
/* Its own columns: the document row's first column is a 16px file icon, which
   is where the tag landed and printed over the author line. */
.doc.note{grid-template-columns:84px minmax(0,1fr) auto auto auto; align-items:start; padding:10px 4px}
.doc.note .dchip{margin-top:2px}
.doc.note .why{max-width:16rem}
.doc.note .note-mark{font:600 var(--t-xs)/1.4 var(--f-sans); letter-spacing:var(--ls-cap); text-transform:uppercase; color:var(--c-gap-ink); background:var(--c-gap-bg); border-radius:var(--r-xs); padding:1px 6px; margin-top:2px}
.doc.note .note-body{display:flex; flex-direction:column; gap:3px; min-width:0; flex:1}
.doc.note .note-who{font:600 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink)}
.doc.note .note-text{font:400 var(--t-md)/1.5 var(--f-serif); color:var(--c-ink); white-space:pre-wrap}
.doc.note .note-facts{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-ink2)}
.doc.note .note-file{font:400 var(--t-xs)/1.4 var(--f-sans); color:var(--c-muted)}

/* The Documents page's text box: information that is not a file. */
.doc-text{border:1px dashed var(--c-line); border-radius:var(--r-md); padding:10px 12px; margin:10px 0 8px; display:flex; flex-direction:column; gap:8px}
.doc-text .lbl{display:flex; gap:10px; align-items:baseline}
.doc-text .lbl small{color:var(--c-muted); font-size:var(--t-xs)}
.doc-text select{border:1px solid var(--c-line); border-radius:var(--r-xs); background:var(--c-paper); padding:4px 6px; font:400 var(--t-sm)/1.4 var(--f-sans); color:var(--c-ink); max-width:100%}
.doc-text textarea{width:100%; border:1px solid var(--c-line); border-radius:var(--r-sm); background:var(--c-card); padding:8px 10px; font:400 var(--t-md)/1.5 var(--f-sans); color:var(--c-ink); resize:vertical}

/* The house's own reports (an outcome, a computed answer) are reference text,
   not conversation: small sans, the long slide list folded away. */
.conv-msg.outcome p{font:400 var(--t-sm)/1.5 var(--f-sans); color:var(--c-ink2); white-space:pre-line}
.conv-msg.outcome details{margin-top:4px; font:400 var(--t-xs)/1.5 var(--f-sans); color:var(--c-muted)}
.conv-msg.outcome summary{cursor:pointer}
.conv-proposal{max-height:30%; overflow:auto}
.conv-box{min-height:44px; max-height:140px}

/* Advanced: the model/effort/rewrite row and the assess-as-of date, opened like the log and closed by default.
   A client has no log, but keeps this when it holds the date; empty (both rows hidden) it is not shown. */
body.client #run-adv-wrap{display:block}
#run-adv-wrap:not(:has(.run-model:not([hidden]), .run-asof:not([hidden]))){display:none}
#run-adv-wrap .run-model:first-of-type{border-top:0}

/* ---------- the plain-model test (app.js::plainHtml) ----------
   Two columns, one gutter: ours left, the plain model's right, a matched pair
   on one row. The verdict words are the ones the engine established and no
   stronger — "checks out" is as far as a reading can go, and a row that only
   a reader can judge says so rather than being coloured as a win. */
.plain-run{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:12px}
.plain-job{font-size:12px;color:var(--muted,#6B7280)}
.plain-job.warn{color:#B5473A}
.plain-arm{margin:14px 0 22px}
.plain-head{display:flex;align-items:baseline;gap:10px;margin-bottom:8px}
.plain-head h4{font-size:14px;text-transform:capitalize}
.plain-vd{font-size:10.5px;font-weight:700;letter-spacing:.08em;padding:2px 7px;border-radius:3px;border:1px solid;margin-left:auto}
.plain-vd.v-PASS{color:#2E7D63;border-color:#2E7D63;background:#EAF4EF}
.plain-vd.v-WEAK{color:#8A6218;border-color:#C99A3E;background:#F6EFE1}
.plain-vd.v-KILL{color:#B5473A;border-color:#B5473A;background:#F7ECE8}
table.plain-cols{table-layout:fixed;margin-top:10px}
table.plain-cols th,table.plain-cols td{width:50%;vertical-align:top}
table.plain-cols tr.plain-pair>td{background:rgba(31,59,92,.04)}
.plain-id{font-size:10px;font-weight:600;letter-spacing:.04em;opacity:.65}
.plain-imp{font-size:9.5px;font-weight:700;letter-spacing:.05em;color:#fff;border-radius:2px;padding:1px 5px;margin-left:6px}
.plain-tag{font-size:10.5px;font-weight:600;margin-top:4px}
.plain-tag.t-stands_up{color:#2E7D63}
.plain-tag.t-not_where_cited{color:#B5473A}
.plain-tag.t-in_the_materials,.plain-tag.t-unverified,.plain-tag.t-vague{color:#6B7280}
.plain-prompt{font-style:italic;border-left:2px solid rgba(31,59,92,.25);padding-left:10px;margin:8px 0}
