/* annotaid — design system lifted from visual_curator.html + visual_evaluator.html */
:root{
  --bg:#E8EAE5; --surface:#FFFFFF; --surface-2:#F1F3EE;
  --ink:#0B0A06; --ink-soft:#414B39; --ink-faint:#78846E;          /* pitch black text + green-grey */
  --line:#CCD4C6; --line-soft:#DEE4D8;
  --gold:#0F5821; --gold-soft:#D8E8D0; --gold-line:#8FBE7F;        /* dark spruce — brand / primary / chrome (used prominently) */
  --accent:#EA040C; --accent-soft:#FBE0DF; --accent-line:#F0A9A8;  /* racing red — attention accent (active / current / corrected) */
  --ok:#3F7D28; --ok-bg:#DAECCF;                                   /* forest green — success / located / confirmed / present */
  --bad:#EA040C; --bad-bg:#FBE0DF;                                 /* racing red — errors / unmatched / remove */
  --absent:#78846E; --absent-bg:#E6EAE2;
  --shadow:0 1px 2px rgba(4,4,2,.07), 0 8px 26px rgba(4,4,2,.10);
  --serif:'Fraunces',Georgia,'Times New Roman',serif;
  --mono:'IBM Plex Mono','SF Mono',Menlo,Consolas,monospace;
  --sans:'IBM Plex Sans',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
}
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;font-family:var(--sans);color:var(--ink);background:var(--bg);
  font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;
  display:flex;flex-direction:column;height:100vh;overflow:hidden;
}
button{font-family:inherit;cursor:pointer}
::selection{background:var(--gold-soft)}

/* ---- top bar (solid dark spruce) ---- */
header{
  display:flex;align-items:center;gap:16px;
  padding:12px 20px;background:var(--gold);border-bottom:1px solid #0A3D17;flex:0 0 auto;
}
header .mark{font-family:var(--serif);font-weight:600;font-size:20px;letter-spacing:-.01em;color:var(--bad)}       /* "Annot" — racing red */
header .mark em{font-style:italic;color:var(--ink)}                                                              /* "Aid" — pitch black */
header .sub{font-size:11px;color:#B9D6AD;font-family:var(--mono);text-transform:uppercase;letter-spacing:.06em}
/* DOIs and filenames are case-sensitive — never uppercase them */
header .sub.exact{text-transform:none;letter-spacing:.02em}
header .spacer{flex:1}
header .gstat{display:flex;flex-direction:column;align-items:flex-end;line-height:1.15;margin-right:6px}
header .gstat #globalstat{font-family:var(--mono);font-size:14px;font-weight:500;color:#EAF3E5}
header .gstat .l{font-size:10px;color:#9FC38F;text-transform:uppercase;letter-spacing:.06em}
.btn{
  font-size:12.5px;font-weight:500;font-family:var(--sans);color:var(--ink);background:var(--surface);
  border:1px solid var(--line);padding:8px 13px;border-radius:7px;cursor:pointer;transition:.15s;
  display:inline-flex;align-items:center;gap:6px;
}
/* the explicit display above beats the UA [hidden] rule, so restore it */
.btn[hidden]{display:none}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn:disabled:hover{border-color:var(--line);background:var(--surface)}
.btn.primary:disabled:hover{background:var(--gold)}
.btn:hover{border-color:var(--ink-soft);background:var(--surface-2)}
.btn.primary{background:var(--gold);color:#fff;border-color:var(--gold)}
.btn.primary:hover{background:#0A3D17}
.btn.load{color:#fff;background:var(--gold);border-color:var(--gold)}
.btn.load:hover{background:#0A3D17}
header input[type=file]{display:none}
.icon-btn{border:1px solid var(--line);background:var(--surface);color:var(--ink-soft);border-radius:7px;
  width:34px;height:34px;font-size:15px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:.15s}
.icon-btn:hover{border-color:var(--ink-soft);background:var(--surface-2)}
.icon-btn.on{background:var(--gold);color:#fff;border-color:var(--gold)}

/* header-scoped button treatments for the dark spruce bar */
header .btn{color:#fff;background:transparent;border-color:rgba(255,255,255,.4)}
header .btn:hover{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.7)}
header .btn.load{background:#fff;color:var(--gold);border-color:#fff}
header .btn.load:hover{background:#EAF3E5}
header .btn.primary{background:var(--bad);color:#fff;border-color:var(--bad)}  /* red CTA accent */
header .btn.primary:hover{background:#C2030A}
header .icon-btn{color:#fff;background:transparent;border-color:rgba(255,255,255,.4)}
header .icon-btn:hover{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.7)}
header .icon-btn.on{background:#fff;color:var(--gold);border-color:#fff}
.menu-wrap{position:relative}
.menu{position:absolute;right:0;top:calc(100% + 6px);background:var(--surface);border:1px solid var(--line);
  border-radius:9px;box-shadow:var(--shadow);z-index:30;min-width:220px;overflow:hidden}
.menu button{display:flex;justify-content:space-between;align-items:center;gap:12px;width:100%;text-align:left;
  border:none;background:none;padding:10px 13px;font-size:12.5px;color:var(--ink)}
.menu button:hover{background:var(--accent-soft)}
.menu button:disabled{opacity:.4;cursor:not-allowed}
.menu button:disabled:hover{background:none}
.menu .mhint{font-family:var(--mono);font-size:10px;color:var(--ink-faint)}

/* ---- three-pane layout ---- */
main{flex:1;display:grid;grid-template-columns:var(--docs-w,250px) 1fr var(--feat-w,380px);min-height:0}
/* collapse to a 0-width track (NOT display:none — that would drop the grid item
   and shift the viewer/features into the wrong columns). overflow:hidden clips it. */
main.docs-collapsed{--docs-w:0px}
main.docs-collapsed .col.docs{border-right:none}
.col{min-height:0;display:flex;flex-direction:column;overflow:hidden}
.col.docs{background:var(--surface-2);border-right:1px solid var(--line)}
.col.viewer{background:var(--bg);position:relative}
.col.features{background:var(--surface-2);border-left:1px solid var(--line);position:relative;
  /* a bit of pitch black in the outlines + labels for readability across the extraction sidebar */
  --line:rgba(11,10,6,.34); --line-soft:rgba(11,10,6,.16); --ink-faint:#54604C}
.col-resizer{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:col-resize;z-index:6}
.col-resizer:hover,.col-resizer.dragging{background:linear-gradient(90deg,var(--accent-line),transparent)}
body.col-resizing{cursor:col-resize;user-select:none}
body.col-resizing .textLayer{pointer-events:none}
.col-head{
  font-family:var(--sans);font-size:11px;letter-spacing:.07em;text-transform:uppercase;font-weight:600;
  color:var(--ink-faint);padding:14px 16px 10px;border-bottom:1px solid var(--line-soft);flex:0 0 auto;
  display:flex;justify-content:space-between;align-items:center;
}
.col-head span[id]{font-family:var(--mono);font-weight:500}
.col-body{overflow:auto;flex:1;min-height:0}
.col.docs .col-body{padding:8px}
.col.features .col-body{padding:0}

/* ---- document queue ---- */
.doc{
  padding:10px 11px;margin-bottom:4px;border:1px solid transparent;border-radius:8px;cursor:pointer;
  display:flex;flex-direction:column;gap:4px;transition:.12s;
}
.doc:hover{background:var(--surface)}
.doc.active{background:var(--surface);border-color:var(--gold-line);box-shadow:var(--shadow)}
.doc .name{font-family:var(--mono);font-size:13px;font-weight:500;word-break:break-all;line-height:1.35}
.doc .fn{font-size:10.5px;color:var(--ink-faint);word-break:break-all}
.doc .meta{font-size:10.5px;color:var(--ink-faint);display:flex;gap:8px;align-items:center}
.doc .prog{font-family:var(--mono);font-size:10px}
.doc.needspmid .name{color:var(--bad)}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex:0 0 auto;border:1.5px solid var(--line)}
.dot.ok{background:var(--ok);border-color:var(--ok)}
.dot.bad{background:var(--bad);border-color:var(--bad)}
.dot.part{background:var(--gold);border-color:var(--gold)}
.dot.none{background:transparent}

/* ---- viewer ---- */
.viewer-toolbar{
  flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:9px 14px;
  background:var(--surface);border-bottom:1px solid var(--line);font-family:var(--mono);font-size:11.5px;
}
.viewer-toolbar button{
  font-family:var(--sans);font-size:12.5px;font-weight:500;
  border:1px solid var(--line);background:var(--surface);color:var(--ink);
  padding:6px 11px;border-radius:7px;cursor:pointer;transition:.15s;
}
.viewer-toolbar button:hover{border-color:var(--ink-soft);background:var(--surface-2)}
.viewer-toolbar .navlabel{color:var(--ink-soft);margin:0 4px;font-family:var(--mono)}
.viewer-toolbar .spacer{flex:1}
#pages{overflow:auto;flex:1;min-height:0;padding:22px;display:flex;flex-direction:column;align-items:center;gap:16px}
.page-wrap{position:relative;box-shadow:var(--shadow);background:#fff;border-radius:4px;flex:0 0 auto}
.page-wrap canvas{display:block;border-radius:4px}
.textLayer{position:absolute;inset:0;overflow:hidden;line-height:1;z-index:2}
.textLayer span{position:absolute;white-space:pre;color:transparent;transform-origin:0 0;cursor:text}
/* The text layer sits above the rendered page, and its own text is transparent
   (pdf.js overlay technique), so the app-wide opaque ::selection would paint a
   solid box over the real (canvas-rendered) text below it, hiding it entirely.
   Needs real alpha transparency here so the selected text stays readable. */
.textLayer ::selection{background:rgba(15,88,33,.28)}
.textLayer ::-moz-selection{background:rgba(15,88,33,.28)}
.hlLayer{position:absolute;inset:0;z-index:1;pointer-events:none}
.hl{position:absolute;background:rgba(83,139,55,.32);border-radius:2px;
    box-shadow:0 0 0 1px rgba(15,88,33,.55);mix-blend-mode:multiply;transition:background .15s}
.hl.pulse{background:rgba(83,139,55,.5)}
.page-wrap.abstract-page{width:min(760px,100%);min-height:360px;padding:42px 48px}
.abstract-text-layer{position:relative;z-index:2;white-space:pre-wrap;font-family:var(--serif);
  font-size:16px;line-height:1.75;color:var(--ink);cursor:text}
.abstract-text-layer ::selection{background:rgba(15,88,33,.28)}
@media (max-width:700px){.page-wrap.abstract-page{padding:26px 24px}}

.placeholder{
  position:absolute;inset:44px 0 0 0;display:flex;flex-direction:column;gap:10px;
  align-items:center;justify-content:center;color:var(--ink-faint);text-align:center;padding:30px;
}
.placeholder .big{font-family:var(--serif);font-size:19px;color:var(--ink)}
.placeholder .hint{font-size:13px;max-width:360px;line-height:1.6}
.placeholder.abstract-only .hint{max-width:520px;max-height:60vh;overflow-y:auto;text-align:left;white-space:pre-wrap}
.placeholder code{font-family:var(--mono);font-size:12px;background:var(--surface);border:1px solid var(--line);padding:1px 5px;border-radius:5px}

/* ---- right pane: pmid box ---- */
.pmid-box{padding:14px 15px;border-bottom:1px solid var(--line-soft);background:var(--gold-soft)}
.pmid-box .lab{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--gold);font-weight:600;margin-bottom:7px}
.pmid-box .row{display:flex;gap:7px}
.pmid-box input{flex:1;border:1px solid var(--gold-line);border-radius:7px;padding:7px 10px;font-family:var(--mono);font-size:13px;background:#fff;color:var(--ink)}
.pmid-box input:focus{outline:none;box-shadow:0 0 0 3px rgba(217,200,154,.5)}
.pmid-box .note{font-size:11px;color:var(--ink-soft);margin-top:7px;line-height:1.45}

/* ---- extraction controls ---- */
#extractpanel{flex:0 0 auto}   /* fixed slot above the Extraction column header */
.extract-row{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
.extract-row select{border:1px solid var(--line);border-radius:7px;padding:6px 8px;font-family:var(--mono);font-size:11.5px;background:var(--surface-2)}
.engine-warn{font-size:10.5px;color:var(--gold);margin-top:6px}

/* extracting state: the toast fades in ~2.6s but a run can take a minute+, so
   the button itself must carry the "still working" signal. */
.btn.extracting{background:var(--accent)!important;border-color:var(--accent)!important;color:#fff;
  animation:pulseGlow 1.1s ease-in-out infinite}
@keyframes pulseGlow{0%,100%{box-shadow:0 0 0 0 rgba(234,4,12,.45)}50%{box-shadow:0 0 0 7px rgba(234,4,12,0)}}
.btn-spinner{width:13px;height:13px;border-radius:50%;flex:none;display:inline-block;margin-right:1px;
  border:2px solid rgba(255,255,255,.45);border-top-color:#fff;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---- feature cards ---- */
.feat-group{border-bottom:1px solid var(--line-soft);padding:11px 15px}
.feat-group.active-feat{background:var(--accent-soft);box-shadow:inset 3px 0 0 var(--accent)}
.feat-head{display:flex;align-items:center;gap:8px;margin-bottom:7px;flex-wrap:wrap}
.feat-name{font-family:var(--sans);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;color:var(--ink-faint)}
.feat-type{font-size:9.5px;font-family:var(--mono);color:var(--ink-faint);border:1px solid var(--line);border-radius:4px;padding:1px 5px}
/* "?" affordance carrying the schema description (both list and card view) */
.help-icon{
  flex:none;margin-left:-4px;width:14px;height:14px;border-radius:50%;
  border:1px solid var(--line);background:var(--surface-2);color:var(--ink-faint);
  font-family:var(--sans);font-size:9.5px;font-weight:700;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;cursor:help;transition:.12s;
}
.help-icon:hover{border-color:var(--gold);background:var(--gold-soft);color:var(--gold)}
.help-icon:focus-visible{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px var(--gold-soft)}
.feat-group.card .help-icon{width:17px;height:17px;font-size:11px}

/* ---- tooltip (body-level: the extraction pane clips its own overflow) ---- */
.tooltip{
  position:fixed;z-index:90;max-width:290px;
  background:var(--ink);color:#fff;border-radius:8px;padding:8px 11px;
  font-family:var(--sans);font-size:11.5px;line-height:1.5;font-weight:400;
  letter-spacing:normal;text-transform:none;box-shadow:var(--shadow);
  pointer-events:none;opacity:0;transform:translateY(2px);transition:opacity .12s,transform .12s;
}
.tooltip.on{opacity:1;transform:none}
.tooltip[hidden]{display:none}
.tooltip::after{
  content:"";position:absolute;left:var(--tip-arrow,50%);bottom:-4px;
  width:8px;height:8px;margin-left:-4px;background:var(--ink);transform:rotate(45deg);
}
.tooltip.below::after{bottom:auto;top:-4px}
.pit{font-size:9.5px;font-family:var(--mono);padding:1px 6px;border-radius:4px;letter-spacing:.04em;text-transform:uppercase;margin-left:auto}
.pit.t{color:var(--ok);background:var(--ok-bg)}
.pit.f{color:var(--absent);background:var(--absent-bg)}

/* type-adaptive editors */
.list-edit{display:flex;flex-direction:column;gap:6px}
.val-row{display:flex;gap:6px;align-items:stretch}
.val-input{
  flex:1;border:1px solid var(--line);border-radius:7px;padding:6px 9px;
  font-family:var(--mono);font-size:12.5px;color:var(--ink);background:var(--surface-2);transition:.12s;
}
.val-input:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}
.val-rm{flex:none;width:30px;border:1px solid var(--line);border-radius:7px;background:var(--surface);
  color:var(--ink-faint);font-size:16px;line-height:1;transition:.12s}
.val-rm:hover{border-color:var(--bad);color:var(--bad);background:var(--bad-bg)}
.add-val{align-self:flex-start;border:1px dashed var(--gold-line);background:none;color:var(--gold);
  border-radius:7px;padding:5px 11px;font-size:11.5px;font-weight:500;transition:.12s}
.add-val:hover{background:var(--gold-soft);border-style:solid}
.empty-hint{font-size:11.5px;color:var(--ink-faint);font-style:italic;padding:2px 0}
.bool-toggle{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden}
.bool-toggle button{border:none;background:var(--surface-2);padding:5px 14px;font-size:12px;font-family:var(--mono);color:var(--ink-soft)}
.bool-toggle button.on{background:var(--ink);color:#fff}
.scalar-input,select.enum-input{width:100%;border:1px solid var(--line);border-radius:7px;padding:6px 9px;
  font-family:var(--mono);font-size:12.5px;color:var(--ink);background:var(--surface-2)}
.scalar-input:focus,select.enum-input:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}

.was{font-size:10.5px;color:var(--ink-faint);margin-top:6px}
.was b{font-style:normal;font-weight:500;color:var(--ink-soft)}
.ai-line{font-size:10.5px;color:var(--ink-faint);margin-top:6px;font-family:var(--mono)}

/* evidence + status */
.vev{font-size:11.5px;color:var(--ink-soft);margin-top:8px;line-height:1.45;font-style:italic;cursor:pointer;
  border-left:2px solid var(--line);padding-left:8px}
.vev:hover{border-left-color:var(--accent);color:var(--ink)}
.vloc{font-family:var(--mono);font-size:10px;color:var(--ink-faint);margin-top:3px}
.vstatus{display:flex;align-items:center;gap:6px;margin-top:9px;font-family:var(--mono);font-size:10px}
.vstatus .tag{padding:2px 6px;border-radius:4px;letter-spacing:.03em}
.tag.matched{color:var(--ok);background:var(--ok-bg)}
.tag.unmatched{color:var(--bad);background:var(--bad-bg)}
.tag.none{color:var(--absent);background:var(--absent-bg)}
.vstatus .confirm{margin-left:auto;display:flex;align-items:center;gap:5px;cursor:pointer;color:var(--ink-faint);
  border:1px solid var(--line);border-radius:6px;padding:3px 9px}
.vstatus .confirm input{accent-color:var(--ok);cursor:pointer}
.vstatus .confirm.on{color:var(--ok);border-color:var(--ok);background:var(--ok-bg)}
.vstatus .confirm.on.corrected{color:var(--accent);border-color:var(--accent-line);background:var(--accent-soft)}

.empty-feat{padding:26px 16px;color:var(--ink-faint);font-size:12.5px;text-align:center;line-height:1.6}
.empty-feat code{font-family:var(--mono);font-size:11px;background:var(--surface);border:1px solid var(--line);padding:1px 5px;border-radius:5px}
.no-runs{padding:22px 16px;color:var(--ink-soft);font-size:12.5px;text-align:center;line-height:1.55}

/* ---- list / card view toggle ---- */
.view-toggle{display:flex;margin:12px auto 0;border:1px solid var(--line);border-radius:8px;overflow:hidden;width:max-content}
.vt-btn{border:none;background:var(--surface);padding:6px 18px;font-size:12px;font-family:var(--mono);color:var(--ink-soft);transition:.12s}
.vt-btn+.vt-btn{border-left:1px solid var(--line)}
.vt-btn:not(.on):hover{background:var(--surface-2)}
.vt-btn.on{background:var(--gold);color:#fff}
/* compact variant when the toggle sits in the Extraction column header */
#viewtoggle{display:flex;align-items:center}
.col-head .view-toggle{margin:0}
.col-head .vt-btn{padding:3px 12px;font-size:10.5px;letter-spacing:.05em}

/* ---- card mode: one feature at a time ---- */
.card-nav{display:flex;align-items:center;gap:10px;padding:12px 15px;border-bottom:1px solid var(--line-soft);background:var(--surface)}
.card-arrow{border:1px solid var(--line);background:var(--surface);border-radius:8px;padding:8px 15px;font-size:13px;font-weight:500;color:var(--ink);transition:.12s}
.card-arrow:hover:not(:disabled){border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.card-arrow:disabled{opacity:.38;cursor:default}
.card-pos{margin:0 auto;font-family:var(--mono);font-size:12.5px;color:var(--accent);font-weight:600;letter-spacing:.03em}
.feat-group.card{padding:22px 20px}
.feat-group.card .feat-name{font-size:12.5px}
.feat-group.card .feat-type{font-size:10px}
.feat-group.card .pit{font-size:10px;padding:2px 8px}
.feat-group.card .val-input,.feat-group.card .scalar-input,.feat-group.card select.enum-input{font-size:14.5px;padding:10px 12px}
.feat-group.card .add-val{font-size:13px;padding:8px 15px}
.feat-group.card .bool-toggle button{padding:9px 22px;font-size:13.5px}
.feat-group.card .vev{font-size:14px;padding:12px 14px;border-left-width:3px;-webkit-line-clamp:unset}
.feat-group.card .ai-line{font-size:12px;margin-top:12px}
.feat-group.card .vstatus{font-size:11px;margin-top:16px}
.feat-group.card .vstatus .tag{padding:4px 9px}
.feat-group.card .confirm{padding:7px 15px;font-size:12.5px}

/* ---- add-pdf modal ---- */
.modal-overlay{
  position:fixed;inset:0;background:rgba(11,10,6,.55);z-index:80;
  display:flex;align-items:center;justify-content:center;padding:20px;
}
.modal-overlay[hidden]{display:none}
.modal{
  background:var(--surface);border-radius:12px;box-shadow:var(--shadow);
  width:100%;max-width:460px;max-height:90vh;overflow:auto;
}
.modal-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:16px 18px;border-bottom:1px solid var(--line-soft);
  font-family:var(--serif);font-size:17px;color:var(--ink);
}
.modal-close{border:none;background:none;font-size:20px;line-height:1;color:var(--ink-faint);
  cursor:pointer;padding:2px 8px;border-radius:6px}
.modal-close:hover{background:var(--surface-2);color:var(--ink)}
.modal-tabs{display:flex;border-bottom:1px solid var(--line-soft)}
.modal-tab{flex:1;border:none;background:none;padding:12px 10px;font-size:12.5px;font-weight:600;
  color:var(--ink-faint);cursor:pointer;border-bottom:2px solid transparent;transition:.12s}
.modal-tab:hover{color:var(--ink)}
.modal-tab.on{color:var(--gold);border-bottom-color:var(--gold)}
.modal-body{padding:18px}
.modal-pane[hidden]{display:none}
.modal-lab{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);
  font-weight:600;margin-bottom:8px}
.modal-row{display:flex;gap:8px}
.modal-row input{flex:1;border:1px solid var(--line);border-radius:7px;padding:9px 11px;
  font-family:var(--mono);font-size:13.5px;background:var(--surface-2);color:var(--ink)}
.modal-row input:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}
.modal-hint{font-size:11.5px;color:var(--ink-faint);margin-top:12px;line-height:1.55}

.modal-loader{display:none;align-items:center;gap:10px;margin-top:14px;padding:10px 12px;
  background:var(--gold-soft);border-radius:8px;font-size:12px;color:var(--ink-soft)}
.modal-loader.on{display:flex}
.spinner-ring{width:16px;height:16px;border-radius:50%;flex:none;
  border:2.5px solid var(--gold-line);border-top-color:var(--gold);animation:spin .7s linear infinite}

.modal-status[hidden]{display:none}
.modal-status{margin-top:14px;padding:11px 13px;border-radius:8px;font-size:12.5px;line-height:1.5}
.modal-status.err{background:var(--bad-bg);color:var(--bad)}
.modal-status .advice{margin-top:6px;color:var(--ink-soft)}
.modal-status .advice a{color:var(--gold);font-weight:600;text-decoration:underline;cursor:pointer}

.dropzone{border:2px dashed var(--line);border-radius:10px;padding:30px 16px;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:10px;transition:.15s}
.dropzone.drag{border-color:var(--gold);background:var(--gold-soft)}
.dz-big{font-family:var(--serif);font-size:15px;color:var(--ink)}
.dz-or{font-size:11px;color:var(--ink-faint);text-transform:uppercase;letter-spacing:.06em}

/* ---- stepper chrome ----
   Steps are NOT numbered: the chain branches on the first step (3 steps for the
   PDF path, 4 for the PubMed path) and a number would change under the curator
   mid-flow. Progress is carried by the connectors going green behind you. */
.stepper-modal{max-width:640px}
.stepper{padding:18px 18px 6px}
.stepper-steps{display:flex;align-items:flex-start}

/* One column per step: a neutral node with the connector drawn either side of it
   as pseudo-elements, and the label underneath. No filled discs — state is
   carried by the border alone. */
.st-step{flex:1;min-width:0;position:relative;display:flex;flex-direction:column;
  align-items:center;gap:7px}
.st-step::before,.st-step::after{
  content:"";position:absolute;top:10px;height:2px;background:var(--line-soft);
  border-radius:2px;transition:background .2s ease;
}
.st-step::before{left:0;right:50%;margin-right:16px}
.st-step::after{left:50%;right:0;margin-left:16px}
.st-step:first-child::before,.st-step:last-child::after{display:none}

.st-node{width:22px;height:22px;border-radius:50%;flex:none;background:var(--surface);
  border:1.5px solid var(--line);display:flex;align-items:center;justify-content:center;
  position:relative;z-index:1;transition:border-color .2s ease,box-shadow .2s ease}
.st-label{font-size:11px;font-weight:500;color:var(--ink-faint);text-align:center;
  line-height:1.3;max-width:100%;transition:color .2s ease}

/* completed: green border + tick, and the connectors either side go green */
.st-step.done .st-node{border-color:var(--ok)}
.st-step.done .st-label{color:var(--ink-soft)}
.st-step.done::before,.st-step.done::after{background:var(--ok)}
.st-tick{font-size:11px;line-height:1;color:var(--ok);font-weight:700}

/* active: same neutral fill, just a heavier border + ring */
.st-step.on .st-node{border-width:3px;border-color:var(--gold);box-shadow:0 0 0 4px var(--gold-soft)}
.st-step.on .st-label{color:var(--gold);font-weight:600}
.st-step.on::before{background:var(--ok)}   /* the run in to here is complete */

/* placeholder for steps that don't exist until a path is chosen */
.st-step.ghost .st-node{border-style:dashed;background:transparent}
.st-step.ghost .st-label{color:var(--line)}

/* ---- step: source ---- */
.source-choices{display:flex;flex-direction:column;gap:10px}
.source-card{display:flex;flex-direction:column;align-items:flex-start;gap:5px;text-align:left;
  border:1px solid var(--line);border-radius:10px;padding:14px 16px;background:var(--surface);
  cursor:pointer;font-family:var(--sans);transition:.15s;width:100%}
.source-card:hover{border-color:var(--gold);background:var(--gold-soft)}
.sc-title{font-family:var(--serif);font-size:15px;color:var(--ink)}
.sc-sub{font-size:11.5px;color:var(--ink-faint);line-height:1.5}

/* ---- sub-tabs (paste vs file) ---- */
.sub-tabs{display:inline-flex;gap:2px;padding:3px;border-radius:8px;background:var(--surface-2);margin-bottom:11px}
.sub-tab{border:none;background:none;padding:6px 13px;border-radius:6px;font-size:11.5px;font-weight:600;
  font-family:var(--sans);color:var(--ink-faint);cursor:pointer;transition:.12s}
.sub-tab:hover{color:var(--ink)}
.sub-tab.on{background:var(--surface);color:var(--gold);box-shadow:0 1px 2px rgba(11,10,6,.09)}
.sub-pane[hidden]{display:none}

.step-actions{display:flex;gap:8px;margin-top:14px;align-items:center}
.step-actions .btn.primary{margin-left:auto}
.step-actions[hidden]{display:none}

.pmid-file-ok{margin-top:8px;font-size:11.5px;color:var(--ok)}
.pmid-file-ok[hidden]{display:none}

/* per-row manual-upload detour inside the fetching step */
.detour{margin-top:4px}
.detour[hidden]{display:none}
.detour-lab{font-size:12px;color:var(--ink-soft);margin-bottom:10px;line-height:1.5}
.detour-cancel{margin-top:10px}

.confirm-list{display:flex;flex-direction:column;gap:7px;margin:10px 0 16px}
.confirm-row{display:flex;align-items:center;gap:8px;font-size:12px}
.confirm-row .bp-id{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.confirm-pmid{width:120px;flex:none;border:1px solid var(--line);border-radius:7px;padding:6px 9px;
  font-family:var(--mono);font-size:12.5px;background:var(--surface-2);color:var(--ink)}
.confirm-pmid:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}

/* ---- batch PMID intake (Add Paper(s) -> Fetch by PubMed ID(s)) ----
*/
.pmid-ta{width:100%;min-height:104px;resize:vertical;border:1px solid var(--line);border-radius:7px;
  padding:9px 11px;font-family:var(--mono);font-size:13px;line-height:1.55;background:var(--surface-2);
  color:var(--ink);box-sizing:border-box}
.pmid-ta:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}
.pmid-ta:disabled{opacity:.6;cursor:not-allowed}

.pmid-drop{margin-top:8px;border:1.5px dashed var(--line);border-radius:8px;padding:8px 11px;
  display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ink-faint);transition:.15s}
.pmid-drop.drag{border-color:var(--gold);background:var(--gold-soft);color:var(--ink)}
.pmid-drop button{border:none;background:none;color:var(--gold);font-weight:600;font-size:11.5px;
  font-family:var(--sans);text-decoration:underline;cursor:pointer;padding:0}

.pmid-count{margin-top:8px;font-family:var(--mono);font-size:11px;color:var(--ink-faint);line-height:1.5}
.pmid-warn{margin-top:8px;padding:8px 10px;border-radius:7px;background:var(--gold-soft);
  color:var(--gold);font-size:11.5px;line-height:1.5}
.pmid-warn[hidden],.pmid-file-err[hidden]{display:none}
.pmid-file-err{margin-top:6px;font-size:11.5px;color:var(--bad)}

.batch-progress{display:none;margin-top:14px}
.batch-progress.on{display:block}
.batch-progress-track{height:6px;border-radius:3px;background:var(--line-soft);overflow:hidden}
/* determinate: width is set from JS. A transition, not an animation, so the
   prefers-reduced-motion `*{transition:none}` rule below already handles it. */
.batch-progress-fill{height:100%;width:0;background:var(--gold);border-radius:3px;transition:width .2s ease}
.batch-progress-label{margin-top:6px;font-family:var(--mono);font-size:11px;color:var(--ink-soft)}

.batch-summary{margin-top:10px;font-size:11.5px;color:var(--ink-soft)}
.batch-summary[hidden]{display:none}
.batch-list{margin-top:10px;max-height:38vh;overflow:auto;border:1px solid var(--line-soft);border-radius:8px}
.batch-list[hidden]{display:none}
.batch-row{display:flex;align-items:center;gap:8px;padding:7px 10px;font-size:12px;
  border-bottom:1px solid var(--line-soft)}
.batch-row:last-child{border-bottom:none}
.batch-more{padding:7px 10px;font-size:11px;color:var(--ink-faint);font-style:italic}
.bp-id{font-family:var(--mono);font-size:12px;color:var(--ink);flex:none;min-width:76px}
.bp-state{font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;
  padding:2px 6px;border-radius:4px;flex:none;display:inline-flex;align-items:center;gap:5px;min-width:62px;
  justify-content:center}
.bp-state.pending{color:var(--ink-faint);background:var(--surface-2)}
.bp-state.running{color:var(--gold);background:var(--gold-soft)}
.bp-state.ok,.bp-state.uploaded{color:var(--ok);background:var(--ok-bg)}
.bp-state.dup{color:var(--absent);background:var(--absent-bg)}   /* neutral — NOT a failure */
.bp-state.failed{color:var(--bad);background:var(--bad-bg)}
.bp-state .spinner-ring{width:10px;height:10px;border-width:2px}
.bp-msg{color:var(--ink-faint);font-size:11px;line-height:1.4;flex:1;min-width:0}
.bp-alt{flex:none;color:var(--gold);font-size:11px;font-weight:600;text-decoration:underline;
  cursor:pointer;background:none;border:none;font-family:var(--sans);padding:0}
.bp-alt[hidden]{display:none}

.batch-actions{display:flex;gap:8px;margin-top:12px}
.batch-actions[hidden]{display:none}
.modal.wide{max-width:580px}
.upload-for{margin-bottom:10px;padding:9px 11px;border-radius:8px;background:var(--gold-soft);
  color:var(--ink-soft);font-size:12px;line-height:1.5}
.upload-for[hidden]{display:none}

/* ---- PDF selection -> "add to current feature" (card view) ---- */
.sel-add-btn{position:fixed;z-index:60;background:var(--accent);color:#fff;border:none;
  border-radius:7px;padding:8px 13px;font-size:12px;font-weight:600;box-shadow:var(--shadow);
  font-family:var(--sans);cursor:pointer;transition:.12s;white-space:nowrap}
.sel-add-btn:hover{background:#C2030A}
.sel-add-btn[hidden]{display:none}

/* toast */
#toast{
  position:fixed;bottom:20px;left:50%;transform:translateX(-50%) translateY(20px);
  background:var(--ink);color:#fff;font-family:var(--sans);font-size:13px;
  padding:10px 18px;border-radius:9px;opacity:0;pointer-events:none;transition:.25s;z-index:50;max-width:80vw;
}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

@media (prefers-reduced-motion: reduce){
  *{transition:none!important}
  .btn.extracting,.btn-spinner,.spinner-ring{
    animation:none!important;
  }
}

/* =========================================================================
   Home screen — the project picker (home.html / home.js)
   A separate document from the curation app, so it gets a centred card grid
   rather than a pane in the three-column layout. Same tokens throughout.
   ========================================================================= */
.home-body{overflow:auto}
header .mark{text-decoration:none}
/* the project a curator is inside, and the way back out */
.proj-chip{
  font-family:var(--mono);font-size:12px;color:#fff;text-decoration:none;
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.3);
  padding:4px 10px;border-radius:999px;max-width:260px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:.15s;
}
.proj-chip::before{content:"← ";opacity:.7}
.proj-chip:hover{background:rgba(255,255,255,.26);border-color:rgba(255,255,255,.6)}

/* display:block is load-bearing — the base `main` rule is the three-column
   curation grid, and without this the whole home page renders inside its
   250px documents track. */
main.home{display:block;flex:1;min-height:0;overflow:auto;padding:34px 24px 60px}
.home-inner{max-width:1080px;margin:0 auto}
/* p removed (no more "what is a project" blurb) — the heading alone needs its
   own bottom margin so the grid doesn't sit right under it. */
.home-head h1{font-family:var(--serif);font-weight:600;font-size:27px;letter-spacing:-.01em;
  margin:0 0 22px;color:var(--ink)}
.home-notice{margin:0 0 18px;padding:11px 14px;border-radius:9px;font-size:12.5px;
  background:var(--accent-soft);border:1px solid var(--accent-line);color:var(--ink)}
.home-notice[hidden]{display:none}

.proj-grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(290px,1fr))}

/* the whole card is the link — no small target to aim at */
.proj-card{
  position:relative;
  display:flex;flex-direction:column;gap:9px;text-decoration:none;color:inherit;
  background:var(--surface);border:1px solid var(--line);border-radius:12px;
  padding:17px 18px 14px;transition:.15s;
}
.proj-card:hover{border-color:var(--gold-line);box-shadow:var(--shadow);transform:translateY(-1px)}
.pc-menu-wrap{position:absolute;top:10px;right:10px}
.pc-menu-btn{border:1px solid transparent;background:none;color:var(--ink-faint);
  width:26px;height:26px;border-radius:7px;font-size:16px;line-height:1;cursor:pointer;
  display:flex;align-items:center;justify-content:center}
.pc-menu-btn:hover{background:var(--surface-2);color:var(--ink);border-color:var(--line)}
/* room for the ellipsis so a long name never runs under it */
.pc-name{font-family:var(--serif);font-weight:600;font-size:18px;line-height:1.25;color:var(--ink);
  padding-right:30px}
.pc-desc{font-size:12.5px;color:var(--ink-soft);line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:3em}
.pc-chips{display:flex;gap:6px;flex-wrap:wrap}
.chip{font-family:var(--mono);font-size:10.5px;color:var(--gold);background:var(--gold-soft);
  border:1px solid var(--gold-line);padding:2px 8px;border-radius:999px}
.pc-stats{display:flex;gap:16px;flex-wrap:wrap;padding-top:10px;border-top:1px solid var(--line-soft)}
.pc-stat{display:flex;flex-direction:column;line-height:1.2}
.pc-stat .v{font-family:var(--mono);font-size:15px;font-weight:500;color:var(--ink)}
.pc-stat .l{font-size:9.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint)}
/* papers still waiting on an identity are the only actionable number here */
.pc-stat.warn .v{color:var(--accent)}
.pc-stat.warn .l{color:var(--accent)}
.pc-foot{font-size:10.5px;color:var(--ink-faint);font-family:var(--mono)}

.proj-empty{
  grid-column:1/-1;display:flex;flex-direction:column;align-items:center;gap:12px;
  padding:56px 24px;text-align:center;background:var(--surface);
  border:1px dashed var(--line);border-radius:12px;color:var(--ink-faint);
}
.proj-empty .big{font-family:var(--serif);font-size:19px;color:var(--ink)}
.proj-empty .hint{font-size:13px;max-width:44ch;line-height:1.6}

/* the new-project dialog reuses .modal-*; it just needs a textarea */
.modal-row textarea{
  flex:1;border:1px solid var(--line);border-radius:7px;padding:9px 11px;
  font-family:var(--sans);font-size:13px;line-height:1.55;background:var(--surface-2);
  color:var(--ink);resize:vertical;box-sizing:border-box;
}
.modal-row textarea:focus{outline:none;border-color:var(--gold);background:#fff;
  box-shadow:0 0 0 3px var(--gold-soft)}
.modal-hint.seed-note{border-top:1px dashed var(--line-soft);padding-top:11px}

/* =========================================================================
   Identity box — the PMID box plus its second, legitimate answer
   ========================================================================= */
.pmid-box .pmid-err{margin-top:8px;font-size:11.5px;color:var(--bad);font-weight:500}
.pmid-box .pmid-err[hidden]{display:none}
.pmid-alt{margin-top:11px;padding-top:10px;border-top:1px dashed var(--gold-line)}
.pmid-alt-body{margin-top:9px}
.pmid-alt-body[hidden]{display:none}
.linkish{
  border:none;background:none;padding:0;font-family:var(--sans);font-size:11.5px;
  color:var(--gold);font-weight:600;text-decoration:underline;cursor:pointer;
}
.linkish:hover{color:var(--ink)}
/* the stepper's "No PMID" — a real second route, but the quieter of the two */
.btn.ghost-btn{background:transparent;border-style:dashed;color:var(--ink-soft)}
.btn.ghost-btn:hover{background:var(--surface-2);border-style:solid}

/* =========================================================================
   Feature schema editor (featureSchemaEditor.js / projectCreate.js)
   ========================================================================= */
.fe-modal{max-width:760px}
.fe-modal .modal-body{max-height:66vh;overflow:auto}

.fe-list{display:flex;flex-direction:column;gap:10px;margin:12px 0}
.fe-empty{padding:22px;text-align:center;font-size:12.5px;color:var(--ink-faint);
  border:1px dashed var(--line);border-radius:10px;background:var(--surface-2)}

.fe-card{border:1px solid var(--line);border-radius:10px;padding:11px 12px;
  background:var(--surface);display:flex;flex-direction:column;gap:8px}
/* a repeating group reads as a container, not another field */
.fe-card.fe-group{background:var(--surface-2);border-color:var(--gold-line)}
.fe-card.nested{background:var(--surface);border-color:var(--line-soft);padding:9px 10px}

.fe-head{display:flex;gap:7px;align-items:center}
.fe-input{border:1px solid var(--line);border-radius:6px;padding:6px 9px;
  font-size:12.5px;background:var(--surface);color:var(--ink);min-width:0}
.fe-input:focus{outline:none;border-color:var(--gold);box-shadow:0 0 0 3px var(--gold-soft)}
.fe-name{flex:0 0 205px;font-family:var(--mono);font-weight:500}
.fe-label{flex:1}
.fe-type{flex:0 0 148px;border:1px solid var(--line);border-radius:6px;padding:6px 8px;
  font-size:12px;font-family:var(--sans);background:var(--surface);color:var(--ink)}
.fe-type-fixed{flex:0 0 148px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--gold);font-weight:600;text-align:center}

.fe-move{display:flex;gap:3px;flex:none}
.fe-icon{width:26px;height:26px;border:1px solid var(--line);border-radius:6px;
  background:var(--surface);color:var(--ink-soft);font-size:13px;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;transition:.12s}
.fe-icon:hover:not(:disabled){border-color:var(--ink-soft);background:var(--surface-2)}
.fe-icon:disabled{opacity:.3;cursor:not-allowed}
.fe-icon.fe-del:hover{border-color:var(--bad);color:var(--bad);background:var(--bad-bg)}

/* the description is the field that actually reaches the model, so it gets room */
.fe-desc{width:100%;border:1px solid var(--line);border-radius:6px;padding:7px 9px;
  font-family:var(--sans);font-size:12.5px;line-height:1.5;background:var(--surface-2);
  color:var(--ink);resize:vertical;box-sizing:border-box}
.fe-desc:focus{outline:none;border-color:var(--gold);background:#fff;
  box-shadow:0 0 0 3px var(--gold-soft)}

.fe-opts{display:flex;gap:16px;flex-wrap:wrap;align-items:center}
.fe-check{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;
  color:var(--ink-soft);cursor:pointer}
.fe-check input[type=checkbox]{accent-color:var(--gold);cursor:pointer}
.fe-num{width:62px;border:1px solid var(--line);border-radius:6px;padding:4px 7px;
  font-family:var(--mono);font-size:12px;background:var(--surface);color:var(--ink)}
.fe-row{display:flex;gap:8px;align-items:center}
.fe-row .fe-input{flex:1}
.fe-lab{font-size:11px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--ink-faint);flex:0 0 110px}

.fe-sub-lab{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--gold);font-weight:600;margin-top:2px}
.fe-sub{display:flex;flex-direction:column;gap:7px;padding-left:12px;
  border-left:2px solid var(--gold-line)}
.fe-add-field{align-self:flex-start;font-size:11.5px;padding:5px 10px}

.fe-actions{display:flex;gap:8px;margin-top:2px}

/* live verdict from the server — the only validator there is */
.fe-live{margin:10px 0;padding:9px 12px;border-radius:8px;font-size:12px;line-height:1.5}
.fe-live.ok{background:var(--ok-bg);color:var(--ok)}
.fe-live.bad{background:var(--bad-bg);color:var(--bad);font-weight:500}

.fe-seed{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}
.fe-seed .btn input[type=file]{display:none}

.fe-review-desc{font-size:12.5px;color:var(--ink-soft);line-height:1.55;margin-bottom:12px}
.fe-facts{display:flex;gap:22px;flex-wrap:wrap;padding:12px 0;
  border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);
  margin-bottom:14px}
/* the prompt is what the project actually does — show it before any money is spent */
.fe-prompt{max-height:230px;overflow:auto;background:var(--surface-2);
  border:1px solid var(--line);border-radius:8px;padding:11px 13px;margin:6px 0 0;
  font-family:var(--mono);font-size:11px;line-height:1.55;color:var(--ink-soft);
  white-space:pre-wrap;word-break:break-word}

/* =========================================================================
   Repeat-group discovery review (groupItemsList.js). Pass 1 proposes the
   identifiers; the curator corrects and approves them before pass 2.
   ========================================================================= */
.gi-panel{border:1px solid var(--gold-line);border-radius:10px;margin:10px 12px;
  padding:12px;background:var(--gold-soft)}
.gi-head{font-size:11px;text-transform:uppercase;letter-spacing:.07em;
  font-weight:600;color:var(--gold)}
.gi-desc{font-size:11.5px;color:var(--ink-soft);margin-top:5px;line-height:1.5}
.gi-hint{font-size:11px;color:var(--ink-faint);margin-top:7px;line-height:1.5}
.gi-list{display:flex;flex-direction:column;gap:6px;margin-top:10px}
.gi-review{margin-top:12px}
.gi-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px}
.gi-row input{flex:1;border:1px solid var(--gold-line);border-radius:7px;padding:7px 10px;
  font-family:var(--mono);font-size:13px;background:#fff;color:var(--ink)}
.gi-row input:focus{outline:none;box-shadow:0 0 0 3px rgba(217,200,154,.5)}
.gi-evidence{grid-column:1/-1;font-size:10.5px;line-height:1.45;color:var(--ink-faint);
  padding:0 4px 4px}
.gi-add{margin-top:9px;font-size:12px}

/* =========================================================================
   Repeating groups in the curation pane (groupEditor.js)
   ========================================================================= */
.grp{border:1px solid var(--gold-line);border-radius:10px;margin:10px 12px;
  background:var(--surface);overflow:hidden}
.grp-head{display:flex;align-items:center;gap:9px;padding:10px 12px;
  background:var(--gold-soft);border-bottom:1px solid var(--gold-line)}
.grp-head .spacer,.grp-row-head .spacer,.grp-foot .spacer{flex:1}
.grp-name{font-size:11px;text-transform:uppercase;letter-spacing:.07em;
  font-weight:600;color:var(--gold)}
.grp-count{font-family:var(--mono);font-size:11px;color:var(--ink-soft)}
.btn.grp-add{font-size:11.5px;padding:5px 10px}
.grp-desc{padding:9px 12px 0;font-size:11.5px;color:var(--ink-faint);line-height:1.5}
.grp-none{padding:14px 12px;font-size:12px;color:var(--ink-faint);text-align:center}

/* one entry, collapsed to its identifier until opened */
.grp-row{border-bottom:1px solid var(--line-soft)}
.grp-row:last-of-type{border-bottom:none}
.grp-row-head{display:flex;align-items:center;gap:8px;padding:9px 12px;cursor:pointer;
  transition:background .12s}
.grp-row-head:hover{background:var(--surface-2)}
.grp-row.open .grp-row-head{background:var(--surface-2);
  border-bottom:1px solid var(--line-soft)}
.rl-caret{color:var(--ink-faint);font-size:10px;width:10px}
.rl-name{font-family:var(--mono);font-size:12.5px;font-weight:500;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* an entry the AI never proposed — i.e. something it missed */
.rl-origin{font-size:9.5px;text-transform:uppercase;letter-spacing:.05em;
  padding:1px 6px;border-radius:999px;background:var(--accent-soft);
  color:var(--accent);border:1px solid var(--accent-line);flex:none}
.rl-prog{font-family:var(--mono);font-size:10.5px;color:var(--ink-faint)}
.grp-row-body{padding:2px 0 6px}
.grp-row-body .feat-group{border-bottom:1px dashed var(--line-soft)}
.grp-row-body .feat-group:last-child{border-bottom:none}

/* rejected AI entries: out of the curated set, still on the record */
.grp-removed{border-top:1px solid var(--line-soft);background:var(--surface-2)}
.grp-removed summary{padding:8px 12px;font-size:11.5px;color:var(--ink-faint);
  cursor:pointer}
.grp-removed summary:hover{color:var(--ink)}
.grp-removed-row{display:flex;align-items:center;gap:9px;padding:6px 12px 6px 26px;
  font-size:12px;opacity:.75}
.grp-removed-row .rl-name{flex:1;text-decoration:line-through}
.btn.grp-undo{font-size:10.5px;padding:3px 8px}

.grp-foot{display:flex;align-items:center;gap:12px;padding:9px 12px;
  border-top:1px solid var(--line-soft);background:var(--surface-2)}
/* the AI claimed entries and the curator says there are none — that IS a finding */
.grp-diverge{font-size:10.5px;color:var(--accent);font-weight:500}

/* Features step — spreadsheet import toolbar (projectCreate.js) */
.fe-sheet-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;
  padding:10px 12px;margin:2px 0 12px;border:1px solid var(--gold-line);
  border-radius:9px;background:var(--gold-soft)}
.fe-sheet-bar .btn{background:var(--surface)}
.fe-sheet-bar a.btn{text-decoration:none}
.fe-sheet-hint{flex-basis:100%;font-size:11.5px;color:var(--ink-soft);line-height:1.5}
.fe-sheet-err{flex-basis:100%;margin:0}

/* =========================================================================
   v2: signed-in, multi-user curation — user menu, work queue, workflow bar,
   read-only papers, attribution, jobs and team panels.
   ========================================================================= */
/* the app header now carries more controls; wrap rather than overflow
   (scoped: home.html shares this stylesheet and has its own header) */
body:not(.home-body) > header{flex-wrap:wrap;row-gap:8px}
header a.btn{text-decoration:none}
.user-menu{display:inline-flex;align-items:center;gap:8px}
header .user-menu .who{color:#EAF3E5;font-size:12.5px;font-weight:500;max-width:180px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---- status badges (paper list + workflow bar) ---- */
.st-badge{font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;
  padding:1px 6px;border-radius:4px;flex:none;white-space:nowrap}
.st-badge.st-unassigned{color:var(--ink-soft);background:var(--surface-2);border:1px dashed var(--line)}
.st-badge.st-in_progress{color:var(--gold);background:var(--gold-soft)}
.st-badge.st-submitted{color:var(--ok);background:var(--ok-bg)}
.st-badge.st-excluded,.st-badge.st-unextractable{color:var(--absent);background:var(--absent-bg)}

/* ---- work queue (left pane) ---- */
.doc-filter{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--line-soft);flex:0 0 auto}
.doc-filter label{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-weight:600}
.doc-filter select{flex:1;min-width:0;border:1px solid var(--line);border-radius:7px;padding:4px 7px;
  font-family:var(--sans);font-size:12px;color:var(--ink);background:var(--surface)}
.doc-sec{margin-bottom:10px}
.doc-sec-head{display:flex;justify-content:space-between;align-items:center;padding:6px 6px 4px;
  font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;font-weight:600;color:var(--ink-faint)}
.doc-sec-n{font-family:var(--mono);font-weight:500}
summary.doc-sec-head{cursor:pointer;list-style:none;border-radius:6px}
summary.doc-sec-head::-webkit-details-marker{display:none}
summary.doc-sec-head::before{content:"▸";margin-right:6px}
details[open] > summary.doc-sec-head::before{content:"▾"}
summary.doc-sec-head:hover{color:var(--ink);background:var(--surface)}
summary.doc-sec-head span:first-child{margin-right:auto}
.doc-sec-empty,.doc-empty{font-size:11.5px;color:var(--ink-faint);padding:4px 8px 6px;line-height:1.45}
.doc-empty{padding:14px 8px;text-align:center}
.doc .meta.wf{gap:6px}
.doc-who{font-size:10.5px;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---- workflow bar above the PDF ---- */
/* relative + z-index: the viewer placeholder is absolutely positioned under the
   toolbar and would otherwise sit on top of (and swallow clicks on) both */
.paper-bar{flex:0 0 auto;position:relative;z-index:3;background:var(--surface);
  border-bottom:1px solid var(--line)}
.paper-bar[hidden]{display:none}
.viewer-toolbar{position:relative;z-index:3}
.pb-row{display:flex;align-items:center;gap:10px;padding:8px 14px;flex-wrap:wrap}
.pb-row .spacer{flex:1}
.pb-who{font-size:12.5px;color:var(--ink-soft)}
.pb-when{font-family:var(--mono);font-size:10.5px;color:var(--ink-faint)}
.pb-actions{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.btn.pb-btn{padding:5px 11px;font-size:12px}
.pb-assign{display:inline-flex;align-items:center;gap:6px}
.pb-assign-lab{font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-weight:600}
.pb-select{border:1px solid var(--line);border-radius:7px;padding:5px 8px;font-family:var(--sans);
  font-size:12px;color:var(--ink);background:var(--surface-2);max-width:220px}
.pb-select:disabled{opacity:.5}
.pb-hist{margin-left:4px}
.pb-reason{padding:0 14px 8px;font-size:12px;color:var(--ink-soft);line-height:1.45;white-space:pre-wrap}
.pb-reason-lab{font-weight:600;color:var(--ink-faint)}
/* why the open paper can't be edited — impossible to miss, not alarming */
.ro-banner{padding:7px 14px;font-size:12.5px;font-weight:500;color:var(--ink);
  background:var(--absent-bg);border-top:1px solid var(--line-soft);box-shadow:inset 3px 0 0 var(--ink-faint)}

/* ---- read-only editors ---- */
.readonly .confirm,.readonly .bool-toggle button,.readonly .val-rm,.readonly .add-val{cursor:not-allowed}
.readonly .bool-toggle button:not(.on){opacity:.6}
.readonly .add-val,.readonly .val-rm,.readonly .grp-add,.readonly .fe-del,.readonly .grp-undo,.readonly .gi-add{opacity:.4}
.readonly input:disabled,.readonly select:disabled,.readonly textarea:disabled{color:var(--ink);opacity:.85;cursor:not-allowed}
.no-runs .no-runs-btn{margin-top:10px}

/* ---- attribution: who edited / confirmed (quiet) ---- */
.who-line{font-family:var(--mono);font-size:10px;color:var(--ink-faint);margin-top:5px;letter-spacing:.01em}
.who-line.grp-who{padding:0 12px 8px;margin-top:0}
.feat-group.card .who-line{font-size:11px}

/* ---- dialogs (history, reason, jobs, team) ---- */
.dlg-overlay{z-index:85}
.modal.dlg-wide{max-width:680px}
.dlg-text{font-size:12.5px;color:var(--ink-soft);line-height:1.5;margin-bottom:10px}
.dlg-muted{font-size:12px;color:var(--ink-faint);line-height:1.5;padding:4px 0}
.dlg-err{margin:8px 0;padding:8px 11px;border-radius:7px;background:var(--bad-bg);color:var(--bad);font-size:12px;line-height:1.45}
.dlg-err[hidden]{display:none}
.dlg-reason{width:100%;resize:vertical;border:1px solid var(--line);border-radius:7px;padding:8px 10px;
  font-family:var(--sans);font-size:13px;background:var(--surface-2);color:var(--ink)}
.dlg-reason:focus{outline:none;border-color:var(--gold);background:#fff;box-shadow:0 0 0 3px var(--gold-soft)}

.hist-list{display:flex;flex-direction:column;border:1px solid var(--line-soft);border-radius:8px;max-height:56vh;overflow:auto}
.hist-row{display:grid;grid-template-columns:110px 1fr;gap:4px 12px;padding:8px 11px;border-bottom:1px solid var(--line-soft);font-size:12.5px}
.hist-row:last-child{border-bottom:none}
.hist-when{font-family:var(--mono);font-size:11px;color:var(--ink-faint)}
.hist-what b{font-weight:600}
.hist-reason{grid-column:2;font-size:12px;color:var(--ink-soft);font-style:italic;white-space:pre-wrap}

/* ---- jobs panel ---- */
.jobs-list{display:flex;flex-direction:column;gap:8px;max-height:60vh;overflow:auto}
.job{border:1px solid var(--line-soft);border-radius:8px;padding:8px 10px}
.job-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:12px}
.job-row .spacer{flex:1}
.job-kind{font-weight:600;color:var(--ink)}
.job-counts{font-family:var(--mono);font-size:11px;color:var(--ink-soft)}
.job-when{font-size:11px;color:var(--ink-faint)}
.btn.job-btn{padding:4px 10px;font-size:11.5px}
.job-err{margin-top:6px;font-size:11.5px;color:var(--bad)}
.job-note{margin-top:4px;font-size:10.5px;color:var(--ink-faint)}
.job-items{max-height:30vh}

/* ---- team panel ---- */
.team-sec{margin-bottom:18px}
.team-sec .modal-lab{margin-bottom:6px}
.team-list{display:flex;flex-direction:column;border:1px solid var(--line-soft);border-radius:8px;margin-top:8px}
.team-list .dlg-muted{padding:8px 11px}
.team-row{display:flex;align-items:center;gap:9px;padding:7px 11px;border-bottom:1px solid var(--line-soft);font-size:12.5px;flex-wrap:wrap}
.team-row:last-child{border-bottom:none}
.team-row .spacer{flex:1}
.team-name{font-weight:500;color:var(--ink)}
.team-email{font-size:11.5px;color:var(--ink-faint)}
.team-role{font-family:var(--mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:4px;
  color:var(--ink-soft);background:var(--surface-2)}
.team-role.manager{color:var(--gold);background:var(--gold-soft)}
.team-inactive{font-size:10.5px;color:var(--bad)}
.team-count{font-family:var(--mono);font-size:11px;color:var(--ink-soft)}
.team-add{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap;margin-top:8px}
.team-who{flex:1;min-width:200px;max-width:none}
.team-field{display:flex;flex-direction:column;gap:3px;font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint)}
.team-num{width:120px;border:1px solid var(--line);border-radius:7px;padding:6px 8px;font-family:var(--mono);font-size:12px;background:var(--surface-2)}
.link-fresh{margin-top:10px;padding:10px 11px;border:1px solid var(--gold-line);border-radius:8px;background:var(--gold-soft)}
.link-fresh[hidden]{display:none}
.link-fresh-row{display:flex;gap:8px}
.link-url{flex:1;min-width:0;border:1px solid var(--gold-line);border-radius:7px;padding:7px 9px;font-family:var(--mono);font-size:11.5px;background:#fff;color:var(--ink)}
.link-fresh-note{margin-top:6px;font-size:11.5px;font-weight:600;color:var(--gold)}

/* ---- bulk extraction scope ---- */
.ex-scope{display:flex;flex-direction:column;gap:5px;margin:4px 0 10px;padding:8px 10px;border:1px solid var(--line-soft);border-radius:8px}
.ex-scope label{display:flex;align-items:center;gap:8px;font-size:12.5px}
