/* ═══════════════════════════════════════════════════════════════════════
   LEGACY DESK STYLES — extracted from index.html at D11.
   Loaded BEFORE v2.css, which overrides it where surfaces are converted.
   Font sizes and radii are NORMALIZED TO TOKENS by scripts (see the deploy
   history) — this file is the remaining conversion debt, named and visible,
   not an invisible layer inside index.html.
   ═══════════════════════════════════════════════════════════════════════ */
/* ══════════════════════════════════════════════════════════════════════
   PURSUIT DESK — DESIGN SYSTEM
   Minimal, product-forward, undecorated. Every value below comes from a
   scale;nothing is eyeballed.

   TYPE     11 · 12 · 13 · 15 · 18 · 22 · 30      weights 400/500/600/700
   SPACE    4 · 8 · 12 · 16 · 20 · 24 · 32 · 40
   RADIUS   6 controls · 10 cards · 14 panels
   COLOUR   one accent. Greyscale everywhere else. Semantic colour is
            reserved for time and state — deadline,warning,disqualified.
            A board where six things are red teaches nothing.
   ══════════════════════════════════════════════════════════════════════ */
:root{
  /* ══ Design tokens, ported from the GovCon Hub system ═══════════════
     Their palette expressed as HSL, the way the source states it, so the
     mapping stays auditable rather than becoming a set of hex values
     nobody can trace back.

     Two deliberate departures, both about contrast:

     · The status colours there — success 45%, warning 50% — are tuned for
       DOTS and BADGES. In this app --pd-ok/warn/bad are text colours 116
       times over and backgrounds 10 times, and amber text at 50% lightness
       on white fails legibility. So the text tokens keep the source HUE at
       a darker lightness, and the source's own values live on separate
       -dot tokens for the places that are actually dots.

     · --pd-faint is ours; the source has no equivalent and it is load
       bearing here for timestamps and secondary meta. */
  /* The six steps, as the no-v2 fallback. Under body.v2 these are redefined
     from --v2-t-* and this is what they fall back to; they are stated at the
     SAME values on purpose, so a reader cannot be told two different things
     about what "body text" means. */
  --t-xs:11px; --t-sm:12px; --t-base:13px; --t-md:15px; --t-lg:18px; --t-say:22px;
  --t-display:28px;

  /* neutrals */
  --pd-ink:hsl(220 14% 10%);      /* foreground */
  --pd-sub:hsl(220 9% 46%);       /* muted-foreground */
  --pd-faint:hsl(220 9% 62%);
  --pd-line:hsl(220 13% 91%);     /* border */
  --pd-line2:hsl(220 13% 96%);    /* muted / secondary */
  --pd-bg:hsl(0 0% 99%);          /* background */
  --pd-panel:hsl(0 0% 100%);      /* card */

  /* the signature colour: soft teal, replacing the old indigo */
  --pd-accent:hsl(174 60% 45%);
  --pd-accent-soft:hsl(174 60% 95%);
  --pd-accent-line:hsl(174 60% 82%);

  /* status — text-legible, source hues */
  --pd-ok:hsl(142 71% 27%);   --pd-ok-bg:hsl(142 71% 95%);   --pd-ok-dot:hsl(142 71% 45%);
  --pd-warn:hsl(38 92% 30%);  --pd-warn-bg:hsl(38 92% 95%);  --pd-warn-dot:hsl(38 92% 50%);
  --pd-bad:hsl(0 72% 42%);    --pd-bad-bg:hsl(0 72% 96%);    --pd-bad-dot:hsl(0 72% 51%);
  --pd-info:hsl(217 91% 45%); --pd-info-bg:hsl(217 91% 96%); --pd-info-dot:hsl(217 91% 60%);

  --pd-s1:4px; --pd-s2:8px; --pd-s3:12px; --pd-s4:16px; --pd-s5:20px; --pd-s6:24px; --pd-s7:32px;
  /* radius 0.5rem is the source's base; r1 sits just under it for pills
     and small controls, r3 above it for panels */
  --pd-r1:6px; --pd-r2:8px; --pd-r3:12px;
  /* their shadows are almost nothing on purpose — depth comes from the
     border, not from a drop shadow */
  --pd-sh:0 1px 2px 0 rgb(0 0 0 / .03);
  --pd-sh2:0 4px 8px -2px rgb(0 0 0 / .06);
  --pd-sh-lift:0 2px 4px -1px rgb(0 0 0 / .04);
}/* ── layout: one content column, consistent gutters ── */.pd-body{max-width:1360px}
/* ── subtabs: text only. Icons in a nav this small are noise. ── */.pd-subtabs{display:flex;gap:var(--v2-s0);align-items:center;border-bottom:1px solid var(--pd-line);
  padding:0;margin:0 0 var(--pd-s5);background:none;border-radius:0;overflow-x:auto}.pd-subtabs button{border:0;background:none;font:inherit;font-size:var(--t-base);font-weight:500;
  color:var(--pd-sub);padding:var(--v2-s2) var(--v2-s3);border-radius:0;cursor:pointer;white-space:nowrap;
  border-bottom:2px solid transparent;margin-bottom:-var(--v2-s0);display:block}.pd-subtabs button:hover{color:var(--pd-ink)}.pd-subtabs button.on{color:var(--pd-ink);font-weight:600;border-bottom-color:var(--pd-ink);background:none;box-shadow:none}.pd-subtabs button i{display:none}.pd-subtabs-r{margin-left:auto;display:flex;gap:var(--pd-s2);padding-bottom:var(--pd-s2)}/* ── buttons: two weights, one accent ── */.pd-btn{border:0;background:var(--pd-ink);color:var(--v2-bg);font:inherit;font-size:var(--t-base);font-weight:500;
  padding:var(--v2-s2) var(--v2-s3);border-radius:var(--pd-r1);cursor:pointer;white-space:nowrap;transition:var(--v2-fast)}.pd-btn:hover{background:#000}.pd-btn:disabled{opacity:.4;cursor:default}.pd-btn.ghost{background:none;color:var(--pd-sub);border:1px solid var(--pd-line)}.pd-btn.ghost:hover{border-color:var(--pd-ink);color:var(--pd-ink);background:none}.pd-btn.sm{padding:var(--v2-s1h) var(--v2-s2);font-size:var(--t-sm)}.pd-btn.full{width:100%}/* ── alert strip: four numbers, no chrome ── */.pd-alerts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;margin-bottom:var(--pd-s5);
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);overflow:hidden;background:var(--pd-panel)}.pd-alert{background:none;border:0;border-right:1px solid var(--pd-line);padding:var(--pd-s4);
  cursor:pointer;text-align:left;font:inherit;transition:var(--v2-fast)}.pd-alert:last-child{border-right:0}.pd-alert:hover{background:var(--pd-line2)}.pd-alert b{display:block;font-size:var(--t-say);font-weight:600;letter-spacing:-.02em;line-height:1.1;
  font-variant-numeric:tabular-nums}.pd-alert span{display:block;font-size:var(--t-sm);color:var(--pd-sub);margin-top:var(--pd-s1);font-weight:400}.pd-alert.red b{color:var(--pd-bad)}.pd-alert.red span{color:var(--pd-bad)}@media(max-width:760px){.pd-alerts{grid-template-columns:repeat(2,minmax(0,1fr))}.pd-alert:nth-child(2){border-right:0}.pd-alert:nth-child(-n+2){border-bottom:1px solid var(--pd-line)}}/* ── board ── */.pd-board{display:flex;gap:var(--pd-s3);align-items:flex-start;overflow-x:auto;
  padding-bottom:var(--pd-s3);min-height:50vh}.pd-col{flex:0 0 264px;background:none;border-radius:0;padding:0}/* An empty stage collapses to a rail so the columns holding work get the
   width. The drop target is unchanged — dragging onto a rail still moves
   the pursuit, it just expands on the way. */.pd-col.rail{flex:0 0 38px;min-height:180px;display:flex;flex-direction:column;
  align-items:center;gap:var(--pd-s2);padding:var(--pd-s2) 0;cursor:pointer;
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-panel);
  transition:background var(--v2-fast),border-color var(--v2-fast)}.pd-col.rail:hover{background:var(--pd-panel);border-color:var(--pd-line)}.pd-railname{writing-mode:vertical-rl;transform:rotate(180deg);font-size:var(--t-xs);font-weight:500;
  color:var(--pd-sub);letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  max-height:150px}.pd-col.rail:hover .pd-railname{color:var(--pd-sub)}.pd-col.closedtoggle{flex:0 0 38px;min-height:180px;display:flex;align-items:center;
  justify-content:center;cursor:pointer;border:1px dashed var(--pd-line);
  border-radius:var(--pd-r2);background:none;font:inherit;transition:border-color var(--v2-fast)}.pd-col.closedtoggle:hover{border-color:var(--pd-line)}.pd-col.closedtoggle.on{border-style:solid;background:var(--pd-panel)}.pd-colh{display:flex;align-items:center;gap:var(--pd-s2);padding:0 var(--pd-s1) var(--pd-s3);
  font-size:var(--t-sm);position:sticky;top:0;background:var(--pd-bg);z-index:2}.pd-colh b{font-weight:600;color:var(--pd-ink);font-size:var(--t-sm);letter-spacing:.01em}.pd-colh .pd-n{margin-left:auto;font-size:var(--t-xs);font-weight:500;color:var(--pd-sub);
  background:none;border-radius:0;padding:0;font-variant-numeric:tabular-nums}.pd-dot{width:6px;height:6px;border-radius:50%;background:var(--pd-faint);flex:0 0 6px}/* One accent per stage — a muted ramp, not a rainbow. */.pd-dot.s0{background:var(--pd-line)}.pd-dot.s1{background:var(--pd-sub)}.pd-dot.s2{background:var(--pd-sub)}.pd-dot.s3{background:var(--pd-sub)}.pd-dot.s4{background:var(--pd-accent)}.pd-dot.s5{background:var(--pd-accent)}.pd-dot.s6{background:var(--pd-accent)}.pd-dot.s7{background:var(--pd-accent)}.pd-dot.s8{background:var(--pd-accent-line)}.pd-dot.s9{background:var(--pd-accent-line)}.pd-dot.s10{background:var(--pd-ok)}.pd-dot.s11{background:var(--pd-bad)}.pd-dot.s12{background:var(--pd-line)}.pd-dot.s13{background:var(--pd-sub)}.pd-cards{display:flex;flex-direction:column;gap:var(--pd-s2);min-height:20px}.pd-colempty{font-size:var(--t-sm);color:var(--pd-sub);text-align:left;padding:var(--pd-s3);
  border:1px dashed var(--pd-line);border-radius:var(--pd-r2)}/* ── card: seven elements, nothing else ── */.pd-card{background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  padding:var(--pd-s3);cursor:pointer;box-shadow:var(--pd-sh);transition:border-color var(--v2-fast),box-shadow var(--v2-fast)}.pd-card:hover{border-color:var(--pd-line);box-shadow:var(--pd-sh2);transform:none}.pd-card-top{display:flex;align-items:center;gap:var(--pd-s2);margin-bottom:var(--pd-s2)}.pd-card-t{font-size:var(--t-base);font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--pd-ink);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.pd-card-m{font-size:var(--t-sm);color:var(--pd-sub);margin-top:var(--pd-s1)}.pd-card-f{display:flex;align-items:center;gap:var(--pd-s3);margin-top:var(--pd-s3);
  padding-top:var(--pd-s2);border-top:1px solid var(--pd-line2);font-size:var(--t-xs);
  color:var(--pd-sub);font-weight:500;font-variant-numeric:tabular-nums}.pd-val{font-weight:600;color:var(--pd-ink)}.pd-ct.red{color:var(--pd-bad);font-weight:600}.pd-av{margin-left:auto;width:20px;height:20px;border-radius:50%;background:var(--pd-line2);
  color:var(--pd-sub);display:grid;place-items:center;font-size:var(--t-xs);font-weight:600}.pd-warn{margin-top:var(--pd-s2);font-size:var(--t-xs);font-weight:500;color:var(--pd-bad);
  background:none;border-radius:0;padding:0;display:flex;align-items:center;gap:var(--v2-s1)}.pd-warn::before{content:"";width:4px;height:4px;border-radius:50%;background:var(--pd-bad);flex:0 0 4px}/* deadline — the one place colour always earns its keep */.pd-dl{font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);
  font-variant-numeric:tabular-nums;letter-spacing:0}.pd-dl.green{background:var(--pd-ok-bg);color:var(--pd-ok)}.pd-dl.amber{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-dl.red{background:var(--pd-bad-bg);color:var(--pd-bad)}.pd-dl.past,.pd-dl.none{background:var(--pd-line2);color:var(--pd-sub)}.pd-sa{font-size:var(--t-xs);font-weight:500;padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);
  background:var(--pd-line2);color:var(--pd-sub)}.pd-sa.held{background:var(--pd-accent-soft);color:var(--pd-accent-ink);font-weight:600}.pd-sa.open{background:var(--pd-line2);color:var(--pd-sub)}/* ── list ── */.pd-views{display:flex;gap:var(--pd-s1);flex-wrap:wrap;margin-bottom:var(--pd-s4)}.pd-chip{border:0;background:none;font:inherit;font-size:var(--t-sm);font-weight:500;
  color:var(--pd-sub);padding:var(--v2-s1h) var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer}.pd-chip:hover{background:var(--pd-line2);color:var(--pd-sub)}.pd-chip.on{background:var(--pd-ink);color:var(--v2-bg);font-weight:500}.pd-tablewrap{overflow-x:auto;background:var(--pd-panel);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2)}.pd-table{width:100%;border-collapse:collapse;font-size:var(--t-base)}.pd-table th{text-align:left;font-size:var(--t-xs);letter-spacing:.02em;text-transform:none;
  color:var(--pd-sub);font-weight:500;padding:var(--v2-s2) var(--v2-s3);border-bottom:1px solid var(--pd-line)}.pd-table td{padding:var(--v2-s3) var(--v2-s3);border-bottom:1px solid var(--pd-line2);color:var(--pd-sub)}.pd-table tbody tr{cursor:pointer}.pd-table tbody tr:hover{background:var(--pd-line2)}.pd-td-t{font-weight:600;color:var(--pd-ink)}.pd-grouprow td{background:var(--pd-line2);font-size:var(--t-xs);font-weight:600;letter-spacing:.02em;
  text-transform:none;color:var(--pd-sub);padding:var(--v2-s1h) var(--v2-s3)}.pd-grouprow .pd-n{color:var(--pd-sub);margin-left:var(--v2-s1h);font-weight:400}.pd-red{color:var(--pd-bad);font-weight:600}.pd-table tr.expiring td{background:var(--pd-warn-bg)}.pd-table tr.expired td{background:var(--pd-bad-bg);text-decoration:line-through;color:var(--pd-sub)}/* ── detail ── */
/* ── The pursuit bar ──────────────────────────────────────────────────
   A two-column grid with the tabs spanning underneath, so the actions sit at
   a fixed right edge and a long solicitation title can never push them onto a
   second line.

   It is deliberately NOT sticky. Making it stick needs <main> and <body> to
   stop being overflow containers, and changing that scrolls the sidebar away
   with the content — a worse bug than the one it fixes. */.pd-dh{display:grid;grid-template-columns:minmax(0,1fr) auto;
  gap:var(--pd-s3) var(--pd-s4);align-items:start;
  background:var(--pd-bg);padding:var(--pd-s4) 0 0;margin-bottom:var(--pd-s4);
  border-bottom:1px solid var(--pd-line)}




@media(max-width:760px){/* minmax(0,1fr), not 1fr — a bare 1fr is minmax(AUTO,1fr) and the nowrap
     tab strip inside would not let the track shrink. Third time this exact
     line has been the bug. */.pd-dh{grid-template-columns:minmax(0,1fr)}

}.pd-back2{border:1px solid var(--pd-line);background:none;width:30px;height:30px;
  border-radius:var(--pd-r1);cursor:pointer;color:var(--pd-sub);font-size:var(--t-base)}.pd-back2:hover{border-color:var(--pd-ink);color:var(--pd-ink)}


.pd-dh .pd-dtabs{grid-column:1/-1;border-bottom:0;margin:0}.pd-tabn{font-style:normal;font-size:var(--t-xs);font-weight:700;margin-left:var(--v2-s1);padding:var(--v2-s0) var(--v2-s1);
  border-radius:var(--pd-r1);background:var(--pd-line2);color:var(--pd-sub);vertical-align:1px}.pd-dtabs button.on .pd-tabn{background:var(--pd-accent-soft);color:var(--pd-accent-ink)}.pd-tabn.red{background:var(--pd-bad-bg);color:var(--pd-bad)}.pd-dtabs{display:flex;gap:var(--v2-s0);border-bottom:1px solid var(--pd-line);margin-bottom:var(--pd-s5);
  overflow-x:auto}.pd-dtabs button{border:0;background:none;font:inherit;font-size:var(--t-base);font-weight:500;
  color:var(--pd-sub);padding:var(--v2-s2) var(--v2-s3);cursor:pointer;border-bottom:2px solid transparent;
  margin-bottom:-var(--v2-s0);white-space:nowrap}.pd-dtabs button:hover{color:var(--pd-ink)}.pd-dtabs button.on{color:var(--pd-ink);font-weight:600;border-bottom-color:var(--pd-ink)}

/* 12-col content grid;panels claim spans rather than guessing widths */
.pd-dbody{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--pd-s3);align-items:start}
/* A 12-column grid gives any child without an explicit `grid-column` a single
   column — 1/12th of the row. detailBody() returns bare elements (the file
   drop zone, the SOP checklist), and each one silently became a ~100px strip
   of one-word lines with its own scrollbar. Full width is the right default
   here;the panels opt back down to their spans. */
.pd-dbody > *{grid-column:1/-1;min-width:0}.pd-dbody > .pd-panel{grid-column:span 4}.pd-dbody > .pd-panel.half{grid-column:span 6}.pd-dbody > .pd-panel.wide{grid-column:1/-1}/* The SOP panel lists a procedure with warnings and citations on each step —
   at a third of the width every line wraps three times. It is a full-width
   read, like the plan and the packet above it. */.pd-dbody > .pd-sop{grid-column:1/-1}.pd-panel{grid-column:span 4;background:var(--pd-panel);border:1px solid var(--pd-line);
  border-radius:var(--pd-r3);padding:var(--pd-s4);min-width:0}.pd-panel.wide{grid-column:1/-1}.pd-panel.half{grid-column:span 6}.pd-panel h4{font-size:var(--t-sm);font-weight:600;margin:0 0 var(--pd-s3);color:var(--pd-sub);
  letter-spacing:.01em}@media(max-width:900px){.pd-dbody{grid-template-columns:minmax(0,1fr)}.pd-dbody > *,.pd-panel,.pd-panel.half,.pd-panel.wide,.pd-dbody > .pd-panel,.pd-dbody > .pd-panel.half,.pd-dbody > .pd-sop{grid-column:1/-1}}.pd-kv{display:flex;align-items:baseline;gap:var(--pd-s3);font-size:var(--t-base);padding:var(--v2-s1h) 0;
  border-bottom:1px solid var(--pd-line2)}.pd-kv:last-child{border-bottom:0}.pd-kv span{color:var(--pd-sub);font-size:var(--t-sm)}.pd-kv b{margin-left:auto;font-weight:500;text-align:right;color:var(--pd-ink)}.pd-kv b.ok{color:var(--pd-ok)}.pd-kv b.no{color:var(--pd-bad)}.pd-verdict{display:inline-block;font-size:var(--t-base);font-weight:600;padding:var(--v2-s1) var(--v2-s3);
  border-radius:var(--pd-r1);margin-bottom:var(--pd-s3);background:var(--pd-line2);color:var(--pd-sub)}.pd-verdict.eligible{background:var(--pd-ok-bg);color:var(--pd-ok)}
.pd-verdict.conditional{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-note{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6;margin:var(--pd-s2) 0 0}.pd-facts2{display:grid;grid-template-columns:repeat(auto-fit,minmax(165px,1fr));
  gap:var(--pd-s3) var(--pd-s5)}.pd-facts2 .pd-kv{display:flex;flex-direction:column;align-items:flex-start;gap:var(--v2-s0);
  padding:0;border-bottom:0}.pd-facts2 .pd-kv span{font-size:var(--t-xs);font-weight:600;letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub)}.pd-facts2 .pd-kv b{margin-left:0;text-align:left;font-size:var(--t-base);font-weight:500;
  line-height:1.4;overflow-wrap:anywhere}/* ── Facts, the plan, the incumbent, the sub packet ─────────────────────
   Every panel below sits on the Overview, in the order the work happens:
   the facts of the notice, then the schedule those facts imply, then the
   procedure, then what we tell a sub, then who holds it today. */
/* A panel heading that carries actions on the right without wrapping. */.pd-panel h4{display:flex;align-items:center;gap:var(--pd-s2)}.pd-facts-act{margin-left:auto;display:flex;gap:var(--pd-s2);align-items:center}.pd-facts-st{font-weight:400;color:var(--pd-sub);font-size:var(--t-xs);letter-spacing:0}/* Marks a value that came from SAM and is not yet saved onto the pursuit —
   the distinction between "we know this" and "we recorded this" is the whole
   reason the Save button exists. */.pd-src{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;vertical-align:2px;
  background:var(--pd-accent-soft);color:var(--pd-accent-ink);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1)}/* The fit verdict. The single most useful line on the page: whether the
   procedure fits in the days that are left. */.pd-fit{display:flex;flex-direction:column;gap:var(--v2-s1);padding:var(--pd-s3);border-radius:var(--pd-r2);
  background:var(--pd-ok-bg);margin-bottom:var(--pd-s3)}.pd-fit b{font-size:var(--t-base);color:var(--pd-ok)}.pd-fit span{font-size:var(--t-sm);line-height:1.6;color:var(--pd-sub)}.pd-fit.amber{background:var(--pd-warn-bg)}.pd-fit.amber b{color:var(--pd-warn)}.pd-fit.red{background:var(--pd-bad-bg)}.pd-fit.red b{color:var(--pd-bad)}.pd-milestones{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));
  gap:var(--pd-s1);margin:var(--pd-s3) 0 var(--pd-s2)}.pd-ms{display:flex;gap:var(--pd-s2);align-items:baseline;padding:var(--v2-s1h) var(--v2-s2);
  border-left:2px solid var(--pd-accent);background:var(--pd-line2);border-radius:0 var(--pd-r1) var(--pd-r1) 0}.pd-ms.passed{border-left-color:var(--pd-sub);opacity:.55}.pd-ms-d{font-size:var(--t-xs);font-weight:600;color:var(--pd-accent-ink);white-space:nowrap}.pd-ms.passed .pd-ms-d{color:var(--pd-sub)}.pd-ms-t{font-size:var(--t-sm);color:var(--pd-ink);line-height:1.4}.pd-phases{display:flex;flex-direction:column;gap:var(--pd-s2);margin-top:var(--pd-s3)}.pd-phase{border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--pd-s3)}.pd-phase.off{opacity:.45}.pd-phase-h{display:flex;align-items:center;gap:var(--pd-s3);flex-wrap:wrap}.pd-phase-pick{display:flex;align-items:center;gap:var(--pd-s2);cursor:pointer;font-size:var(--t-base)}.pd-phase-w{font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-phase-n{font-size:var(--t-xs);color:var(--pd-sub);margin-left:auto}.pd-phase-why{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6;margin-top:var(--v2-s1h)}.pd-phase-steps{margin-top:var(--pd-s2);border-top:1px solid var(--pd-line2);padding-top:var(--pd-s2)}.pd-planstep{display:flex;gap:var(--pd-s3);align-items:baseline;padding:var(--v2-s1) 0;font-size:var(--t-sm)}.pd-planstep.warn .pd-planstep-t{color:var(--pd-warn)}.pd-planstep-d{font-size:var(--t-xs);color:var(--pd-sub);white-space:nowrap;
  font-variant-numeric:tabular-nums;min-width:78px}.pd-planstep-t{flex:1;line-height:1.5;min-width:0}.pd-planstep-e{font-size:var(--t-xs);color:var(--pd-sub)}/* The incumbent shortlist. A row is a candidate, not a conclusion. */.pd-inclist{margin-top:var(--pd-s3)}.pd-incrow{display:flex;align-items:center;gap:var(--pd-s2);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);margin-bottom:var(--pd-s1);padding-right:var(--pd-s3)}.pd-incrow.on{border-color:var(--pd-accent);background:var(--pd-accent-soft)}.pd-incpick{flex:1;display:flex;flex-direction:column;gap:var(--v2-s0);align-items:flex-start;
  background:none;border:0;padding:var(--pd-s2) var(--pd-s3);text-align:left;cursor:pointer;
  font:inherit;color:inherit;min-width:0}.pd-incpick:hover{background:var(--pd-line2)}.pd-incn{font-size:var(--t-base);font-weight:600;color:var(--pd-ink);display:flex;gap:var(--pd-s2);
  align-items:center;flex-wrap:wrap}.pd-incm{font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-inclive{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;background:var(--pd-ok-bg);
  color:var(--pd-ok);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);text-transform:uppercase}.pd-inclive.past{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-inclink{font-size:var(--t-xs);color:var(--pd-accent-ink);text-decoration:none;white-space:nowrap}/* The sub packet — everything they need to return a real number. */.pd-pkgrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s5);margin-top:var(--pd-s3)}@media(max-width:820px){.pd-pkgrid{grid-template-columns:minmax(0,1fr)}}.pd-pkcol h5,.pd-pkgaps h5{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub);margin:var(--pd-s3) 0 var(--pd-s2)}.pd-pkcol h5:first-child{margin-top:0}.pd-pk{display:flex;flex-direction:column;gap:var(--v2-s0);padding:var(--v2-s1h) 0;
  border-bottom:1px solid var(--pd-line2)}.pd-pk:last-child{border-bottom:0}.pd-pk b{font-size:var(--t-sm);font-weight:600;color:var(--pd-ink)}.pd-pk span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.55}.pd-pkwants{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:0 var(--pd-s5)}.pd-pkgaps{margin-top:var(--pd-s4);padding:var(--pd-s3);border-radius:var(--pd-r2);
  background:var(--pd-warn-bg)}.pd-pkgaps h5{color:var(--pd-warn);margin-top:0}/* ── Sign-in and team access ────────────────────────────────────────── */#cc-auth,#cc-nomods{position:fixed;inset:0;z-index:9999;background:var(--pd-bg);
  display:flex;align-items:center;justify-content:center;padding:var(--pd-s5)}.cc-authbox{width:100%;max-width:380px;background:var(--pd-panel);border:1px solid var(--pd-line);
  border-radius:var(--pd-r3);padding:var(--pd-s6);box-shadow:var(--pd-sh2)}.cc-authbox h1{font-size:var(--t-lg);margin:0 0 var(--pd-s2);color:var(--pd-ink)}.cc-authbox p{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6;margin:0 0 var(--pd-s4)}.cc-authbox input{width:100%;padding:var(--v2-s3) var(--pd-s3);margin-bottom:var(--pd-s2);font-size:var(--t-base);
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);
  color:var(--pd-ink)}.cc-authbox input:focus{outline:none;border-color:var(--pd-accent)}.cc-authgo{width:100%;padding:var(--v2-s2);margin-top:var(--pd-s2);font-size:var(--t-base);font-weight:600;
  border:0;border-radius:var(--pd-r1);background:var(--pd-ink);color:var(--v2-bg);cursor:pointer}.cc-authgo[disabled]{opacity:.5;cursor:default}.cc-autherr{font-size:var(--t-sm);color:var(--pd-bad);background:var(--pd-bad-bg);
  padding:var(--pd-s2) var(--pd-s3);border-radius:var(--pd-r1);margin-bottom:var(--pd-s3)}.cc-authnote{margin-top:var(--pd-s4)!important;font-size:var(--t-xs);color:var(--pd-sub)!important}/* The sign-first screen: same box, wider, a numbered list of what is owed. */.cc-welcome{max-width:560px}.cc-agree{list-style:none;margin:0 0 var(--pd-s3);padding:0;display:grid;gap:var(--pd-s2)}.cc-agree li{display:grid;grid-template-columns:28px 1fr auto;gap:var(--pd-s3);align-items:center;
  padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-bg)}.cc-agree li.done{opacity:.7}.cc-agree .n{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-weight:700;
  font-size:var(--t-sm);background:var(--pd-ink);color:var(--v2-bg)}.cc-agree li.done .n{background:var(--pd-good,#1a7f37)}.cc-agree b{display:block;font-size:var(--t-sm);color:var(--pd-ink)}.cc-agree small{display:block;font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5;margin-top:var(--v2-s0)}.cc-agree .ok{font-size:var(--t-xs);font-weight:600;color:var(--pd-good,#1a7f37)}.cc-authgo.sm{width:auto;margin:0;padding:var(--v2-s2) var(--v2-s3);font-size:var(--t-sm);text-decoration:none;white-space:nowrap}@media (max-width:520px){.cc-agree li{grid-template-columns:28px 1fr}.cc-agree li>a,.cc-agree li>.ok{grid-column:2}}.cc-authnote code{font-size:var(--t-xs);background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);color:var(--pd-sub)}.cc-paste{margin-top:var(--pd-s4);padding-top:var(--pd-s3);border-top:1px solid var(--pd-line2)}.cc-paste label{display:block;font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--pd-sub);margin-bottom:var(--pd-s2)}.cc-paste input{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-sm)}

.cc-link{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin:var(--pd-s3) 0;
  padding:var(--pd-s3);background:var(--pd-accent-soft);border-radius:var(--pd-r2)}.cc-link b{font-size:var(--t-sm);color:var(--pd-accent-ink)}.cc-link code{flex:1;min-width:220px;font-size:var(--t-xs);word-break:break-all;color:var(--pd-ink)}.cc-team{margin-top:var(--pd-s3);display:flex;flex-direction:column;gap:var(--pd-s1)}.cc-teamrow{border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--pd-s3)}.cc-teamrow.off{opacity:.5}.cc-teamwho{display:flex;align-items:baseline;gap:var(--pd-s2);flex-wrap:wrap}.cc-teamwho b{font-size:var(--t-base)}.cc-teamwho span{font-size:var(--t-xs);color:var(--pd-sub)}.cc-role{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);background:var(--pd-line2);color:var(--pd-sub)!important}.cc-role.owner{background:var(--pd-accent-soft);color:var(--pd-accent-ink)!important}.cc-role.viewer{background:var(--pd-line2);color:var(--pd-sub)!important}.cc-pending{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);background:var(--pd-warn-bg);color:var(--pd-warn)!important}.cc-teamacts{display:flex;gap:var(--pd-s3);margin-top:var(--v2-s1h)}.cc-teamedit{margin-top:var(--pd-s3);padding-top:var(--pd-s3);border-top:1px solid var(--pd-line2)}/* Direct children only. Unscoped, this also hit every <label> inside the
   switchboard and flattened each switch into an uppercase caption. */.cc-teamedit > label{display:block;font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--pd-sub);margin:var(--pd-s3) 0 var(--pd-s2)}
/* ── the module switchboard ────────────────────────────────────────────
   Three states, and they have to stay tellable apart at a glance:
     on          — the accent track, the knob to the right
     off         — a grey track
     .byrole     — on, but dimmed and dashed: the role is deciding, nobody
                   has made a choice about this person yet
   The old picker rendered the third as the second, so the commonest setup
   there is looked exactly like "this person has been given nothing". */.cc-teamsees{margin-top:var(--v2-s1)}.cc-sees{font-size:var(--t-xs);color:var(--pd-sub)}.cc-sees.none{color:var(--pd-warn);font-weight:600}.cc-switches{display:flex;flex-direction:column;gap:var(--pd-s2)}.cc-swlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  gap:var(--pd-s1) var(--pd-s3)}.cc-swlist.tight{grid-template-columns:repeat(auto-fill,minmax(170px,1fr))}/* Stated rather than inherited: this label sits inside panels that style
   their own labels as uppercase captions, and a switch is not a caption. */.cc-switch{display:flex!important;align-items:flex-start;gap:var(--pd-s2);padding:var(--v2-s1h) 0;
  cursor:pointer;text-transform:none;letter-spacing:normal;margin:0}.cc-switch input{position:absolute;opacity:0;width:0;height:0}.cc-track{flex:none;position:relative;width:34px;height:20px;margin-top:var(--v2-s0);border-radius:var(--pd-rfull);
  background:var(--pd-line2);border:1px solid var(--pd-line);transition:background var(--v2-fast),border-color var(--v2-fast)}.cc-knob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;
  background:var(--pd-panel);box-shadow:0 1px 2px rgba(0,0,0,.18);transition:transform var(--v2-fast)}.cc-switch input:checked + .cc-track{background:var(--pd-accent);border-color:var(--pd-accent)}.cc-switch input:checked + .cc-track .cc-knob{transform:translateX(14px)}.cc-switch input:focus-visible + .cc-track{outline:2px solid var(--pd-accent);outline-offset:2px}.cc-swtext{display:flex;flex-direction:column;gap:var(--v2-s0);min-width:0}.cc-swtext b{font-size:var(--t-sm);font-weight:600;color:var(--pd-ink)}.cc-swtext em{font-style:normal;font-size:var(--t-xs);color:var(--pd-sub);line-height:1.45}/* Following the role: on, but nobody chose it — dashed and dimmed. */.cc-switch.byrole{opacity:.72}.cc-switch.byrole input:checked + .cc-track{background:var(--pd-line);border-style:dashed;
  border-color:var(--pd-sub)}.cc-switch.cc-follow{padding:var(--pd-s2) var(--pd-s3);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:var(--pd-bg)}

/* A read-only account should not be shown controls it cannot use. */body.cc-readonly .pd-card{cursor:default}.pd-eval{margin-top:var(--pd-s3);padding:var(--pd-s3);background:var(--pd-line2);
  border-radius:var(--pd-r2);font-size:var(--t-sm);line-height:1.6;color:var(--pd-sub)}.pd-eval b{color:var(--pd-ink)}.pd-chips{display:flex;gap:var(--pd-s1);flex-wrap:wrap}.pd-blocker{font-size:var(--t-xs);font-weight:500;background:var(--pd-bad-bg);color:var(--pd-bad);
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-r1)}.pd-incwarn{margin-top:var(--pd-s3);padding:var(--pd-s3);background:var(--pd-bad-bg);
  color:var(--pd-bad);border-radius:var(--pd-r2);font-size:var(--t-sm);line-height:1.6}






/* ── sub directory ── */





.pd-warm{display:inline-block;margin-top:var(--pd-s2);font-size:var(--t-xs);font-weight:600;
  background:var(--pd-warn-bg);color:var(--pd-warn);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1)}/* ══ CALL SCREEN — the one place density gives way to legibility ══ */.pd-call{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s4);align-items:start}.pd-call-l,.pd-call-r{background:var(--pd-panel);border:1px solid var(--pd-line);
  border-radius:var(--pd-r3);padding:var(--pd-s5)}.pd-sub-h{display:flex;align-items:flex-start;gap:var(--pd-s3);padding-bottom:var(--pd-s4);flex-wrap:wrap;min-width:0;
  border-bottom:1px solid var(--pd-line2)}.pd-sub-n{font-size:var(--t-say);font-weight:600;letter-spacing:-.02em;color:var(--pd-ink);line-height:1.2}.pd-sub-m{font-size:var(--t-base);color:var(--pd-sub);margin-top:var(--v2-s0)}.pd-refby{font-size:var(--t-sm);color:var(--pd-accent-ink);font-weight:500;margin-top:var(--v2-s0)}.pd-callbtn{margin-left:auto;background:var(--pd-ink);color:var(--v2-bg);font-weight:600;font-size:var(--t-base);
  padding:var(--v2-s2) var(--v2-s4);border-radius:var(--pd-r1);text-decoration:none;white-space:nowrap;
  font-variant-numeric:tabular-nums}.pd-callbtn:hover{background:#000}.pd-nophone{margin-left:auto;font-size:var(--t-sm);color:var(--pd-bad);font-weight:500}.pd-facts{margin-top:var(--pd-s4)}/* display:block because this class is now also worn by <label> elements, and
   an inline label ignores the margin-bottom this rule has always relied on. */.pd-facts-k{display:block;font-size:var(--t-xs);letter-spacing:.02em;text-transform:none;
  color:var(--pd-sub);font-weight:500;margin-bottom:var(--pd-s2)}.pd-fact{display:flex;align-items:baseline;gap:var(--pd-s3);padding:var(--pd-s2) 0;
  border-bottom:1px solid var(--pd-line2)}.pd-fact span{font-size:var(--t-xs);font-weight:600;color:var(--pd-sub);letter-spacing:.06em;flex:0 0 44px}.pd-fact b{font-size:var(--t-lg);font-weight:600;letter-spacing:-.015em;line-height:1.35;color:var(--pd-ink)}.pd-callmeta{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;margin:var(--pd-s4) 0}.pd-agency{font-size:var(--t-sm);color:var(--pd-sub)}.pd-emailbox{margin-top:var(--pd-s2)}.pd-emailbox textarea{width:100%;border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  padding:var(--pd-s3);font:inherit;font-size:var(--t-sm);line-height:1.6;background:var(--pd-bg);resize:vertical}.pd-emailrow{display:flex;gap:var(--pd-s2);align-items:center;margin-top:var(--pd-s2)}.pd-emailnote{font-size:var(--t-sm);color:var(--pd-accent-ink);font-weight:500}.pd-queue{margin-top:var(--pd-s4);padding-top:var(--pd-s3);border-top:1px solid var(--pd-line2);
  font-size:var(--t-sm);color:var(--pd-sub)}.pd-script{min-height:170px}.pd-line{font-size:var(--t-base);line-height:1.6;margin-bottom:var(--pd-s2);color:var(--pd-sub)}.pd-line.big{font-size:var(--t-lg);font-weight:600;letter-spacing:-.02em;line-height:1.4;
  margin:var(--pd-s4) 0;color:var(--pd-ink)}.pd-line-m{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6;margin-bottom:var(--pd-s2)}.pd-stop-note{font-size:var(--t-sm);color:var(--pd-bad);font-weight:500;background:var(--pd-bad-bg);
  padding:var(--v2-s2) var(--pd-s3);border-radius:var(--pd-r2);margin:var(--pd-s3) 0;line-height:1.5}.pd-branches{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s2);margin-top:var(--pd-s4)}.pd-branch{border:1px solid var(--pd-line);background:var(--pd-panel);font:inherit;font-size:var(--t-base);
  font-weight:600;letter-spacing:.01em;padding:var(--v2-s4) var(--v2-s3);border-radius:var(--pd-r2);cursor:pointer;
  color:var(--pd-ink);transition:var(--v2-fast)}.pd-branch:hover{border-color:var(--pd-ink)}.pd-branch.yes{border-color:var(--pd-ok);color:var(--pd-ok)}.pd-branch.yes:hover{background:var(--pd-ok);color:var(--pd-bg)}.pd-branch.no,.pd-branch.gk,.pd-branch.na{color:var(--pd-sub)}.pd-branch.no:hover,.pd-branch.gk:hover,.pd-branch.na:hover{background:var(--pd-ink);color:var(--v2-bg);border-color:var(--pd-ink)}.pd-back{border:0;background:none;color:var(--pd-sub);font:inherit;font-size:var(--t-sm);
  font-weight:500;cursor:pointer;padding:0 0 var(--pd-s3)}.pd-f,.pd-f2{margin:var(--pd-s3) 0}.pd-f2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s3)}.pd-f label,.pd-f2 label{display:block;font-size:var(--t-xs);font-weight:500;color:var(--pd-sub);
  margin-bottom:var(--v2-s1)}.pd-f input,.pd-f2 input,.pd-f select,.pd-f2 select,.pd-f textarea{width:100%;
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);padding:var(--v2-s2) var(--v2-s2);font:inherit;
  font-size:var(--t-base);background:var(--pd-panel);color:var(--pd-ink)}.pd-f input:focus,.pd-f2 input:focus,.pd-f select:focus,.pd-f textarea:focus{
  outline:2px solid var(--pd-accent);outline-offset:-1px;border-color:transparent}.pd-help{margin:var(--pd-s3) 0;font-size:var(--t-sm)}.pd-help summary{cursor:pointer;color:var(--pd-sub);font-weight:500}.pd-setaside-q{margin:var(--pd-s4) 0;padding:var(--pd-s3);border:1px solid var(--pd-line);
  border-left:3px solid var(--pd-bad);background:var(--pd-bg);border-radius:var(--pd-r2)}.pd-obj{margin-top:var(--pd-s5);padding-top:var(--pd-s4);border-top:1px solid var(--pd-line2)}.pd-objb{border:1px solid var(--pd-line);background:none;font:inherit;font-size:var(--t-sm);
  font-weight:500;color:var(--pd-sub);padding:var(--v2-s1h) var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer;
  margin:0 var(--pd-s1) var(--pd-s1) 0}.pd-objb:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.pd-objb.on{background:var(--pd-ink);color:var(--v2-bg);border-color:var(--pd-ink)}.pd-objline{margin-top:var(--pd-s2);font-size:var(--t-base);line-height:1.6;background:var(--pd-line2);
  padding:var(--pd-s3);border-radius:var(--pd-r2);color:var(--pd-sub)}.pd-always{margin-top:var(--pd-s5);padding-top:var(--pd-s4);border-top:1px solid var(--pd-line2)}/* ── annotating a live call ────────────────────────────────────────────
   Wide, quiet and always in the same place: the operator is looking at the
   person's answer, not at this. Tags are one row of buttons because picking
   one has to cost nothing while somebody is mid-sentence. */.pd-marks{margin-bottom:var(--pd-s4)}.pd-marks-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--pd-s2)}.pd-marks-h label{font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--pd-sub)}.pd-marks-el{font-size:var(--t-xs);color:var(--pd-sub)}.pd-marks textarea{width:100%;margin-top:var(--pd-s2);padding:var(--v2-s2) var(--pd-s3);font:inherit;
  font-size:var(--t-sm);border:1px solid var(--pd-line);border-radius:var(--pd-r1);
  background:var(--pd-panel);color:var(--pd-ink);resize:vertical}.pd-marks textarea:focus{outline:none;border-color:var(--pd-accent)}.pd-marklist{list-style:none;margin:var(--pd-s2) 0 0;padding:0;display:flex;
  flex-direction:column;gap:var(--v2-s0);max-height:190px;overflow-y:auto}.pd-mark{display:flex;align-items:baseline;gap:var(--pd-s2);padding:var(--v2-s1) var(--v2-s1h);
  border-radius:var(--pd-r1);background:var(--pd-bg);font-size:var(--t-sm);line-height:1.45}.pd-mark-t{flex:none;font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-mark-g{flex:none;font-size:var(--t-xs);font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;color:var(--pd-sub)}.pd-mark-x{flex:1;min-width:0;color:var(--pd-ink);word-break:break-word}.pd-mark-del{flex:none;border:none;background:none;cursor:pointer;color:var(--pd-sub);
  font-size:var(--t-base);line-height:1;padding:0 var(--v2-s0)}.pd-mark-del:hover{color:var(--pd-bad)}.pd-mark.t-note .pd-mark-g{display:none}.pd-mark.t-price .pd-mark-g{color:var(--pd-accent-ink)}.pd-mark.t-flag{background:var(--pd-bad-bg)}.pd-mark.t-flag .pd-mark-g{color:var(--pd-bad)}.pd-mark.t-commitment .pd-mark-g,.pd-mark.t-followup .pd-mark-g{color:var(--pd-warn)}.pd-marktags{display:flex;gap:var(--v2-s1);flex-wrap:wrap;margin-top:var(--v2-s1h)}.pd-marktag{border:1px solid var(--pd-line);background:none;font:inherit;font-size:var(--t-xs);
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-rfull);cursor:pointer;color:var(--pd-sub)}.pd-marktag:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.pd-marktag.price:hover{border-color:var(--pd-accent);color:var(--pd-accent-ink)}.pd-marktag.flag:hover{border-color:var(--pd-bad);color:var(--pd-bad)}.pd-marktag.plain{margin-left:auto;color:var(--pd-sub)}.pd-restored{margin-bottom:var(--pd-s2);padding:var(--v2-s1h) var(--pd-s3);border-radius:var(--pd-r1);
  background:var(--pd-accent-soft);color:var(--pd-accent-ink);font-size:var(--t-xs);line-height:1.5}.pd-restored b{color:var(--pd-accent-ink)}/* ── what they've quoted before ─────────────────────────────────────── */.pd-vprice{margin-top:var(--pd-s4);padding:var(--pd-s3);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:var(--pd-bg)}.pd-vprow{display:flex;gap:var(--pd-s4);flex-wrap:wrap;margin-top:var(--v2-s1);align-items:baseline}.pd-vplast,.pd-vpspan{font-size:var(--t-sm);color:var(--pd-sub)}.pd-vplast b{font-size:var(--t-base);color:var(--pd-ink)}.pd-vpspan{font-weight:600;color:var(--pd-ink)}.pd-vpspan.v{color:var(--pd-sub);font-weight:400}.pd-vplast i,.pd-vpspan i{font-style:normal;font-size:var(--t-xs);color:var(--pd-sub);
  margin-left:var(--v2-s1)}.pd-vpnote{margin-top:var(--v2-s1);font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5}.pd-emailtoggle{display:flex;align-items:center;gap:var(--pd-s2);margin-top:var(--pd-s3);
  font-size:var(--t-base);font-weight:500}.pd-emailtoggle b{color:var(--pd-bad)}.pd-emailtoggle button{border:1px solid var(--pd-line);background:none;font:inherit;font-size:var(--t-sm);
  font-weight:500;padding:var(--v2-s1h) var(--v2-s3);border-radius:var(--pd-r1);cursor:pointer;color:var(--pd-sub)}.pd-emailtoggle button.on{background:var(--pd-ink);border-color:var(--pd-ink);color:var(--v2-bg)}.pd-emailtoggle.unset{background:var(--pd-warn-bg);border-radius:var(--pd-r2);padding:var(--v2-s2) var(--pd-s3)}.pd-hardstops{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s2);margin-top:var(--pd-s4)}.pd-stop{border:1px solid var(--pd-line);background:none;color:var(--pd-sub);font:inherit;
  font-size:var(--t-sm);font-weight:500;letter-spacing:.01em;padding:var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer}.pd-stop:hover{background:var(--pd-bad);color:var(--pd-bg);border-color:var(--pd-bad)}/* The call screen's commit button. White on the 45% accent measures 2.46:1 —
   the same pairing already corrected on every other filled button in the app.
   This one survived because Calling was the screen no sweep could reach until
   the fixture learned to build a call session. */.pd-save{width:100%;margin-top:var(--pd-s3);border:0;background:var(--pd-accent-ink);color:var(--v2-bg);
  font:inherit;font-size:var(--t-md);font-weight:600;letter-spacing:.01em;padding:var(--v2-s4);
  border-radius:var(--pd-r2);cursor:pointer}.pd-save:hover{filter:brightness(1.08)}.pd-save:disabled{opacity:.5}.pd-callend{text-align:center;padding:var(--pd-s7) var(--pd-s5);background:var(--pd-panel);
  border:1px solid var(--pd-line);border-radius:var(--pd-r3)}.pd-callend-t{font-size:var(--t-lg);font-weight:600;margin-bottom:var(--pd-s2);color:var(--pd-ink)}.pd-callend p{font-size:var(--t-base);color:var(--pd-sub);max-width:440px;margin:0 auto var(--pd-s4);line-height:1.6}/* ── the feedback widget ───────────────────────────────────────────────
   Bottom-right and out of the way, on every screen and for every account.
   Above the modals' backdrop (70) but below the sign-in gate (9999) — it
   should never sit on top of the thing asking someone to sign in. */.fb-fab{position:fixed;right:18px;bottom:18px;z-index:75;width:44px;height:44px;border-radius:50%;
  border:1px solid var(--pd-line);background:var(--pd-panel);box-shadow:var(--pd-sh2);
  font-size:var(--t-lg);line-height:1;cursor:pointer;color:var(--pd-sub)}.fb-fab:hover{border-color:var(--pd-accent);color:var(--pd-accent-ink)}.fb-fab.on{background:var(--pd-ink);color:var(--v2-bg);border-color:var(--pd-ink);font-size:var(--t-say)}.fb-panel{position:fixed;right:18px;bottom:72px;z-index:75;width:min(400px,calc(100vw - 36px));
  max-height:min(640px,calc(100vh - 110px));display:flex;flex-direction:column;
  background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r3);
  box-shadow:var(--pd-sh2);overflow:hidden}.fb-h{display:flex;align-items:center;gap:var(--pd-s2);padding:var(--pd-s3) var(--pd-s4);
  border-bottom:1px solid var(--pd-line)}.fb-h b{font-size:var(--t-base);flex:1}.fb-x{border:0;background:none;font-size:var(--t-lg);line-height:1;color:var(--pd-sub);cursor:pointer}.fb-x:hover{color:var(--pd-ink)}.fb-b{padding:var(--pd-s4);overflow-y:auto}.fb-kinds{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--v2-s1);margin-bottom:var(--pd-s3)}.fb-kind{display:flex;align-items:center;gap:var(--v2-s1h);padding:var(--v2-s2) var(--v2-s2);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:none;font:inherit;font-size:var(--t-xs);cursor:pointer;
  color:var(--pd-sub);text-align:left}.fb-kind i{font-style:normal;font-size:var(--t-base)}.fb-kind:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.fb-kind.on{border-color:var(--pd-accent);background:var(--pd-accent-soft);color:var(--pd-accent-ink);font-weight:600}/* Stated, not inherited: index.html's reset already sets this globally, but a
   widget that renders itself into document.body on every screen should not
   break if it is ever dropped somewhere that reset does not reach. */.fb-panel,.fb-panel *{box-sizing:border-box}.fb-panel textarea{width:100%;padding:var(--v2-s2) var(--pd-s3);font:inherit;font-size:var(--t-sm);
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-bg);
  color:var(--pd-ink);resize:vertical}.fb-panel textarea:focus{outline:none;border-color:var(--pd-accent)}.fb-attach{display:block;margin-top:var(--pd-s2);padding:var(--v2-s2);border:1px dashed var(--pd-line);
  border-radius:var(--pd-r2);font-size:var(--t-xs);color:var(--pd-sub);text-align:center;cursor:pointer}.fb-attach:hover{border-color:var(--pd-accent);color:var(--pd-accent-ink)}.fb-shot{display:flex;align-items:center;gap:var(--pd-s2);margin-top:var(--pd-s2);padding:var(--v2-s1h);
  border:1px solid var(--pd-line);border-radius:var(--pd-r2)}.fb-shot img{width:48px;height:36px;object-fit:cover;border-radius:var(--pd-r1);flex:none}.fb-shot span{flex:1;font-size:var(--t-xs);color:var(--pd-sub);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}.fb-ctx{margin:var(--pd-s3) 0;font-size:var(--t-xs);line-height:1.5;color:var(--pd-sub)}.fb-ctx b{color:var(--pd-sub)}.fb-err{margin-top:var(--pd-s2);font-size:var(--t-xs);color:var(--pd-bad)}.fb-go{width:100%;padding:var(--v2-s2);border:0;border-radius:var(--pd-r2);background:var(--pd-ink);
  color:var(--v2-bg);font:inherit;font-size:var(--t-sm);font-weight:600;cursor:pointer}.fb-go:disabled{opacity:.5;cursor:default}.fb-sent{font-size:var(--t-sm);line-height:1.6;color:var(--pd-sub)}/* the owner's inbox */.fb-inbox{display:flex;flex-direction:column;gap:var(--pd-s2)}.fb-item{padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2)}.fb-item.done,.fb-item.wontfix{opacity:.5}.fb-item-h{display:flex;align-items:baseline;gap:var(--pd-s2);flex-wrap:wrap;margin-bottom:var(--v2-s1)}.fb-tag{font-size:var(--t-xs);font-weight:600;color:var(--pd-sub)}.fb-tag.broken{color:var(--pd-bad)}.fb-tag.idea{color:var(--pd-accent-ink)}.fb-who{font-size:var(--t-xs);color:var(--pd-sub)}.fb-when{margin-left:auto;font-size:var(--t-xs);color:var(--pd-sub)}.fb-item p{font-size:var(--t-sm);line-height:1.55;color:var(--pd-ink);margin:0 0 var(--v2-s1);
  white-space:pre-wrap;word-break:break-word}.fb-meta{font-size:var(--t-xs);color:var(--pd-sub)}.fb-acts{display:flex;gap:var(--v2-s1);margin-top:var(--v2-s1h)}.fb-acts button{border:1px solid var(--pd-line);background:none;font:inherit;font-size:var(--t-xs);
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-rfull);cursor:pointer;color:var(--pd-sub)}.fb-acts button.on{background:var(--pd-ink);border-color:var(--pd-ink);color:var(--v2-bg)}/* ── the Network: agencies and the government side ─────────────────────
   Distributions are bars because the SHAPE is the information — an agency
   that buys one NAICS eighty times is a different prospect from one that
   buys forty things twice, and two columns of numbers hide that. */.nw-head{display:flex;align-items:flex-start;gap:var(--pd-s3);flex-wrap:wrap;margin-bottom:var(--pd-s4)}.nw-head h3{font-size:var(--t-lg);margin:0 0 var(--v2-s0);color:var(--pd-ink)}.nw-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:var(--pd-s3) var(--pd-s5);margin-bottom:var(--pd-s4)}.nw-block{margin-bottom:var(--pd-s4)}.nw-block .pd-facts-k{margin-bottom:var(--v2-s1h)}.nw-bar{display:flex;align-items:center;gap:var(--pd-s2);margin-bottom:var(--v2-s0);font-size:var(--t-sm)}.nw-bar-k{flex:0 0 42%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--pd-sub)}.nw-bar-t{flex:1;height:7px;border-radius:var(--pd-rfull);background:var(--pd-line2);overflow:hidden}.nw-bar-t i{display:block;height:100%;background:var(--pd-accent);opacity:.75;border-radius:var(--pd-rfull)}.nw-bar-n{flex:none;min-width:34px;text-align:right;font-variant-numeric:tabular-nums;
  color:var(--pd-ink);font-weight:600}.nw-typed{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:var(--pd-s2) var(--pd-s3)}/* ── vendor onboarding, and the directory/leads line ───────────────────
   The stage is a path, so it reads as one: everything behind where they are
   is muted, the current step is solid, everything ahead is outline. */.itl-stage{display:flex;gap:var(--v2-s1);flex-wrap:wrap;margin-bottom:var(--pd-s2)}.itl-stg{border:1px solid var(--pd-line);background:none;font:inherit;font-size:var(--t-xs);
  padding:var(--v2-s1) var(--v2-s2);border-radius:var(--pd-rfull);cursor:pointer;color:var(--pd-sub)}.itl-stg:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.itl-stg.past{background:var(--pd-line2);color:var(--pd-sub);border-color:transparent}.itl-stg.on{background:var(--pd-accent-ink);border-color:var(--pd-accent-ink);color:var(--v2-bg);font-weight:600}.itl-member{font-size:var(--t-xs);line-height:1.6;padding:var(--v2-s1h) var(--pd-s3);border-radius:var(--pd-r1);
  margin-bottom:var(--pd-s2)}.itl-member.in{background:var(--pd-line2);color:var(--pd-sub)}.itl-member.out{background:var(--pd-warn-bg);color:var(--pd-warn)}.itl-member b{color:inherit}/* A resume is the vendor's own account of themselves. It is styled as a
   quotation, not as a record — and the warning under it is not decoration. */.itl-resume{border-left:2px solid var(--pd-line);padding-left:var(--pd-s3);margin-top:var(--pd-s2)}.itl-res-h{font-size:var(--t-sm);font-weight:600;color:var(--pd-ink);margin-bottom:var(--v2-s1)}.itl-claim{display:flex;gap:var(--pd-s2);align-items:baseline;margin-top:var(--v2-s1)}.itl-claim > span{flex:none;min-width:104px;font-size:var(--t-xs);color:var(--pd-sub)}.itl-claim > div{display:flex;gap:var(--v2-s1);flex-wrap:wrap}.itl-claim i{font-style:normal;font-size:var(--t-xs);background:var(--pd-line2);color:var(--pd-sub);
  padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-rfull)}.itl-res-warn{margin-top:var(--pd-s2);font-size:var(--t-xs);line-height:1.55;color:var(--pd-warn)}.itl-resume-none{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.6;display:flex;
  align-items:center;gap:var(--pd-s2);flex-wrap:wrap}.itl-resume-in textarea,.itl-resume-in input{width:100%;padding:var(--v2-s1h) var(--pd-s3);font:inherit;
  font-size:var(--t-sm);border:1px solid var(--pd-line);border-radius:var(--pd-r1);
  background:var(--pd-panel);color:var(--pd-ink);margin-bottom:var(--v2-s1h)}.itl-resume-a{display:flex;justify-content:flex-end;gap:var(--pd-s2)}/* ── the procurement portal registry ───────────────────────────────────
   The headline is COVERAGE, not count. The role names its own failure mode —
   "hundreds of random portals simply to increase a number" — so the levels of
   government reached are given the weight, and the audit split is a filter
   rather than a scoreboard. */













/* "Worth adding" is the most valuable row in the table, so it is the one that
   is allowed to look like an invitation rather than a statistic. */

.pt-renew{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin-bottom:var(--pd-s3);
  padding:var(--pd-s2) var(--pd-s3);border-radius:var(--pd-r2);background:var(--pd-warn-bg)}.pt-renew b{font-size:var(--t-sm);color:var(--pd-warn)}.pt-due{font-size:var(--t-xs);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-rfull);background:var(--pd-panel);
  color:var(--pd-sub)}.pt-due.soon{color:var(--pd-warn);font-weight:600}.pt-due.lapsed{color:var(--pd-bad);background:var(--pd-bad-bg);font-weight:600}/* Registered but silent. Quieter than the renewal strip on purpose — a lapsed
   registration is an emergency, an unconfigured alert is a chore. */.pt-quiet{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin-bottom:var(--pd-s3);
  padding:var(--pd-s2) var(--pd-s3);border-radius:var(--pd-r2);border:1px solid var(--pd-line);
  background:var(--pd-bg)}.pt-quiet b{font-size:var(--t-sm);color:var(--pd-sub)}.pt-bar{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin-bottom:var(--pd-s2)}.pt-q{flex:1;min-width:220px;max-width:420px;padding:var(--v2-s1h) var(--pd-s3);font:inherit;
  font-size:var(--t-sm);border:1px solid var(--pd-line);border-radius:var(--pd-r1);
  background:var(--pd-panel);color:var(--pd-ink)}.pt-q:focus{outline:none;border-color:var(--pd-accent)}
.pt-warn{color:var(--pd-warn);font-weight:600}






.pt-modal{width:min(720px,94vw)}.pt-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:var(--pd-s2) var(--pd-s3)}.pt-switches{display:flex;flex-direction:column;gap:var(--v2-s0);margin:var(--pd-s3) 0;
  padding:var(--pd-s2) var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2)}/* ── gates ── */.pd-modal-bk{position:fixed;inset:0;background:rgba(14,17,22,.35);z-index:70}.pd-modal{position:fixed;z-index:71;top:50%;left:50%;transform:translate(-50%,-50%);
  width:min(600px,94vw);max-height:88vh;background:var(--pd-panel);border-radius:var(--pd-r3);
  box-shadow:var(--pd-sh2);display:flex;flex-direction:column}.pd-modal-h{display:flex;align-items:center;gap:var(--pd-s2);padding:var(--pd-s4) var(--pd-s5);
  border-bottom:1px solid var(--pd-line)}.pd-modal-h b{font-size:var(--t-md);font-weight:600}.pd-lock{font-size:var(--t-xs);font-weight:500;color:var(--pd-bad);background:var(--pd-bad-bg);
  padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1)}.pd-x{margin-left:auto;border:0;background:none;font-size:var(--t-say);color:var(--pd-sub);cursor:pointer;
  line-height:1;padding:0 var(--v2-s0)}.pd-x:hover{color:var(--pd-ink)}.pd-modal-b{padding:var(--pd-s5);overflow-y:auto;flex:1}.pd-modal-b.ro{opacity:.55;pointer-events:none}.pd-modal-f{display:flex;justify-content:flex-end;gap:var(--pd-s2);padding:var(--pd-s3) var(--pd-s5);
  border-top:1px solid var(--pd-line)}.pd-gatemove{font-size:var(--t-sm);color:var(--pd-sub);margin-bottom:var(--pd-s4)}.pd-gform{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s4)}.pd-gf.full{grid-column:1/-1}.pd-gf label{display:block;font-size:var(--t-sm);font-weight:500;color:var(--pd-sub);margin-bottom:var(--v2-s1)}.pd-gf label .req{color:var(--pd-bad)}.pd-gf input,.pd-gf select,.pd-gf textarea{width:100%;border:1px solid var(--pd-line);
  border-radius:var(--pd-r1);padding:var(--v2-s2) var(--v2-s2);font:inherit;font-size:var(--t-base);background:var(--pd-panel)}.pd-gf input:focus,.pd-gf select:focus,.pd-gf textarea:focus{outline:2px solid var(--pd-accent);
  outline-offset:-1px;border-color:transparent}.pd-hint{font-size:var(--t-xs);color:var(--pd-sub);margin-top:var(--v2-s1);line-height:1.5}.pd-pick,.pd-multi{display:flex;gap:var(--pd-s1);flex-wrap:wrap}.pd-pick button,.pd-multi button{border:1px solid var(--pd-line);background:none;font:inherit;
  font-size:var(--t-sm);font-weight:500;color:var(--pd-sub);padding:var(--v2-s1h) var(--v2-s3);border-radius:var(--pd-r1);cursor:pointer}.pd-pick button:hover,.pd-multi button:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.pd-pick button.on,.pd-multi button.on{background:var(--pd-ink);border-color:var(--pd-ink);color:var(--v2-bg)}.pd-noquotes{font-size:var(--t-sm);color:var(--pd-bad);background:var(--pd-bad-bg);padding:var(--v2-s2) var(--pd-s3);
  border-radius:var(--pd-r2);line-height:1.6}.pd-gerr{margin-top:var(--pd-s4);font-size:var(--t-sm);font-weight:500;color:var(--pd-bad);
  background:var(--pd-bad-bg);padding:var(--v2-s2) var(--pd-s3);border-radius:var(--pd-r2);line-height:1.6}.pd-readonly{padding:var(--v2-s2) var(--pd-s5);background:var(--pd-warn-bg);font-size:var(--t-sm);
  font-weight:500;color:var(--pd-warn);display:flex;align-items:center;gap:var(--pd-s3)}/* ── states ── */.pd-setup{background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r3);
  padding:var(--pd-s6);max-width:620px}
.pd-setup p,.pd-setup li{font-size:var(--t-base);line-height:1.7;color:var(--pd-sub)}.pd-setup ol{padding-left:var(--v2-s4);margin:var(--pd-s3) 0}.pd-setup li{margin-bottom:var(--pd-s2)}.pd-setup pre{background:var(--pd-ink);color:var(--pd-line2);padding:var(--v2-s2) var(--v2-s3);border-radius:var(--pd-r1);
  font-size:var(--t-sm);margin:var(--v2-s1h) 0;overflow-x:auto}.pd-setup code{background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);font-size:var(--t-sm)}.pd-setup-note{font-size:var(--t-sm);color:var(--pd-sub);margin-top:var(--pd-s4)}.pd-empty{text-align:left;padding:var(--pd-s6);background:none;border:1px dashed var(--pd-line);
  border-radius:var(--pd-r3)}.pd-empty-t{font-size:var(--t-base);font-weight:600;margin-bottom:var(--pd-s2);color:var(--pd-ink)}.pd-empty-a{font-size:var(--t-base);color:var(--pd-sub);line-height:1.7}.pd-loading,.pd-err{padding:var(--pd-s7);text-align:center;color:var(--pd-sub);font-size:var(--t-base)}.pd-errstrip{display:flex;align-items:center;gap:var(--pd-s3);background:var(--pd-bad-bg);
  color:var(--pd-bad);font-size:var(--t-sm);font-weight:500;padding:var(--v2-s2) var(--pd-s3);
  border-radius:var(--pd-r2);margin-bottom:var(--pd-s3)}.pd-errstrip .pd-x{margin-left:auto;color:var(--pd-bad)}/* --pd-sub inside the strip measured 4.25:1 on --pd-bad-bg. Everything in an
   error strip takes the error's own ink, which measures 5.7:1 and says what
   it is at the same time. */.pd-errstrip .pd-btn,.pd-errstrip .pd-btn.ghost{color:var(--pd-bad);border-color:var(--pd-bad)}.pd-funnel{display:flex;align-items:flex-end;gap:var(--pd-s2);height:120px}.pd-fbar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;
  gap:var(--pd-s1);height:100%}.pd-fbar i{width:100%;background:var(--pd-accent);opacity:.22;border-radius:var(--pd-r1) var(--pd-r1) 0 0;min-height:2px}.pd-fbar span{font-size:var(--t-xs);font-weight:600;font-variant-numeric:tabular-nums;color:var(--pd-ink)}.pd-fbar em{font-size:var(--t-xs);color:var(--pd-sub);font-style:normal;text-align:center;line-height:1.25}.pd-dash{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--pd-s3);align-items:start}@media(max-width:900px){.pd-dash{grid-template-columns:minmax(0,1fr)}}#pd-toasts{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);z-index:90;
  display:flex;flex-direction:column;gap:var(--pd-s2);align-items:center;pointer-events:none}.pd-toast{background:var(--pd-ink);color:var(--v2-bg);font-size:var(--t-base);font-weight:500;padding:var(--v2-s3) var(--v2-s4);
  border-radius:var(--pd-r2);box-shadow:var(--pd-sh2);max-width:92vw}.pd-toast.err{background:var(--pd-bad)}@media(max-width:900px){/* The Call Screen IS the mobile view — one-handed, in a truck, mid-call. */.pd-call{grid-template-columns:minmax(0,1fr);gap:var(--pd-s3)}.pd-call-l,.pd-call-r{padding:var(--pd-s4)}.pd-fact b{font-size:var(--t-md)}.pd-branches{position:sticky;bottom:0;background:var(--pd-panel);padding-top:var(--pd-s2)}.pd-branch{padding:var(--v2-s5) var(--v2-s2);font-size:var(--t-md)}.pd-save{padding:var(--v2-s4);font-size:var(--t-md);position:sticky;bottom:0}.pd-emailbox{display:none}.pd-gform{grid-template-columns:minmax(0,1fr)}.pd-col{flex-basis:84vw}
}/* ── documents ── */.pd-dochead{display:flex;align-items:center;gap:var(--pd-s3);margin-bottom:var(--pd-s4)}.pd-dochead b{font-size:var(--t-md);font-weight:600;color:var(--pd-ink)}.pd-dochead span{font-size:var(--t-sm);color:var(--pd-sub);margin-left:var(--pd-s2)}.pd-docsel{margin-left:auto;border:1px solid var(--pd-line);border-radius:var(--pd-r1);
  padding:var(--v2-s1h) var(--v2-s2);font:inherit;font-size:var(--t-sm);background:var(--pd-panel);max-width:320px}.pd-drop{border:1px dashed var(--pd-line);border-radius:var(--pd-r2);padding:var(--pd-s5);
  text-align:center;font-size:var(--t-base);color:var(--pd-sub);transition:var(--v2-fast)}.pd-drop.over{border-color:var(--pd-accent);background:var(--pd-accent-soft)}.pd-drop b{display:block;color:var(--pd-ink);font-weight:500;margin-bottom:var(--v2-s0)}.pd-linkbtn{border:0;background:none;color:var(--pd-accent-ink);font:inherit;font-size:var(--t-base);
  text-decoration:underline;cursor:pointer;padding:0}.pd-docgrid{display:grid;grid-template-columns:300px minmax(0,1fr);gap:var(--pd-s3);margin-top:var(--pd-s3);
  align-items:start}@media(max-width:900px){.pd-docgrid{grid-template-columns:minmax(0,1fr)}}.pd-doclist{display:flex;flex-direction:column;gap:var(--pd-s4)}.pd-docgroup{}.pd-docgh{display:flex;align-items:center;gap:var(--pd-s2);font-size:var(--t-xs);font-weight:600;
  color:var(--pd-sub);margin-bottom:var(--pd-s2)}.pd-docgh.first{color:var(--pd-ink)}.pd-firstmark{font-size:var(--t-xs);font-weight:500;background:var(--pd-accent-soft);color:var(--pd-accent-ink);
  padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1)}.pd-docgh .pd-n{margin-left:auto;color:var(--pd-sub);font-weight:400}.pd-docnote{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5;margin-bottom:var(--pd-s2)}.pd-doc{display:flex;align-items:center;gap:var(--pd-s2);width:100%;border:1px solid var(--pd-line);
  background:var(--pd-panel);border-radius:var(--pd-r1);padding:var(--v2-s2) var(--v2-s2);font:inherit;font-size:var(--t-sm);
  cursor:pointer;text-align:left;margin-bottom:var(--pd-s1)}.pd-doc:hover{border-color:var(--pd-ink)}.pd-doc.on{border-color:var(--pd-accent);background:var(--pd-accent-soft)}.pd-docname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--pd-ink)}.pd-docsize{font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-docview{background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  min-height:460px;overflow:hidden;display:flex}.pd-pdf{width:100%;height:620px;border:0}.pd-docimg{max-width:100%;object-fit:contain}.pd-docempty{margin:auto;text-align:center;color:var(--pd-sub);font-size:var(--t-base);
  display:flex;flex-direction:column;gap:var(--pd-s2);align-items:center;padding:var(--pd-s5)}.pd-docempty b{color:var(--pd-ink);font-weight:500}/* ── timeline ── */.pd-timeline{display:flex;flex-direction:column;gap:var(--pd-s1)}.pd-tl{display:flex;gap:var(--pd-s4);padding:var(--v2-s2) 0;border-bottom:1px solid var(--pd-line2);font-size:var(--t-base)}.pd-tl-d{flex:0 0 120px;font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-tl-b{color:var(--pd-sub);line-height:1.6;white-space:pre-wrap}.pd-tl-b b{color:var(--pd-ink);font-weight:600}.pd-lockdot{font-size:var(--t-xs);opacity:.75}/* ── When the Pursuit Desk owns the screen, the page chrome above it is
   noise: a second tab row competing with the first, plus three actions that
   don't apply to a pursuit. Hide them and let the Desk own its header. ── */body.pd-mode .top #tabs,body.pd-mode .top .acts,body.pd-mode .top .actions,body.pd-mode .fab{display:none!important}body.pd-mode .top{padding-bottom:0!important}body.pd-mode main{background:var(--pd-bg)}/* Subtab row: tabs on the left, actions pinned right.
   This was absolutely positioned with a gradient fade to stop the tabs
   sliding under the buttons. The fade rendered as a visible vertical seam
   against the page background, and the reserved padding already made the
   overlap impossible — so both are gone. Plain flex does the job: the tab
   group scrolls if it ever has to, and the actions never shrink. */.pd-subtabs{overflow-x:auto;scrollbar-width:none}.pd-subtabs::-webkit-scrollbar{display:none}.pd-subtabs button{flex:0 0 auto}.pd-subtabs-r{margin-left:auto;flex:0 0 auto;padding-left:var(--pd-s3)}/* the sticky column header must match the surface it scrolls over */.pd-colh{background:var(--pd-bg)}/* Header actions belong to the page, not the Pursuit Desk — hide them here.
   The Desk carries its own single action (+ Intake). */body.pd-mode .toprow .frictionbtn,body.pd-mode .toprow .capbtn,body.pd-mode .toprow .newbtn{display:none!important}/* Nav row: tabs scroll in their own track, actions stay put beside them.
   The previous overlay hid the last tab at narrow widths. */.pd-navrow{display:flex;align-items:flex-end;gap:var(--pd-s4);
  border-bottom:1px solid var(--pd-line);margin-bottom:var(--pd-s5)}.pd-navrow .pd-subtabs{flex:1;min-width:0;border-bottom:0;margin:0;padding-right:0;position:static}.pd-navrow .pd-subtabs-r{flex:0 0 auto;position:static;background:none;padding:0 0 var(--pd-s2)}@media(max-width:760px){.pd-navrow{gap:var(--pd-s2)}}/* Connection notice — a strip, not a wall. */.pd-conn{display:flex;align-items:center;gap:var(--pd-s3);background:var(--pd-warn-bg);
  border-radius:var(--pd-r2);padding:var(--v2-s3) var(--pd-s4);margin-bottom:var(--pd-s4)}.pd-conn-l{flex:1;min-width:0}.pd-conn-l b{display:block;font-size:var(--t-base);font-weight:600;color:var(--pd-warn)}.pd-conn-l span{display:block;font-size:var(--t-sm);color:var(--pd-warn);opacity:.85;margin-top:var(--v2-s0)}.pd-conn .pd-btn.ghost{border-color:rgba(163,92,0,.3);color:var(--pd-warn);background:none}.pd-conn .pd-btn.ghost:hover{border-color:var(--pd-warn)}.pd-conn + .pd-setup{margin-bottom:var(--pd-s4);max-width:none}@media(max-width:640px){.pd-conn{flex-wrap:wrap}.pd-conn-l{flex-basis:100%}}/* ── intake ── */.pd-modal-lg{width:min(760px,95vw)}.pd-inline{display:flex;gap:var(--pd-s2)}.pd-inline input{flex:1}.pd-ipreview{margin-top:var(--pd-s5);border-top:1px solid var(--pd-line);padding-top:var(--pd-s4)}.pd-ihead{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin-bottom:var(--pd-s4)}.pd-ihead b{font-size:var(--t-md);font-weight:600;color:var(--pd-ink);flex:1;min-width:200px}.pd-ihead span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-igrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 var(--pd-s5)}@media(max-width:640px){.pd-igrid{grid-template-columns:minmax(0,1fr)}}.pd-iwarn{margin-top:var(--pd-s3);padding:var(--v2-s2) var(--pd-s3);background:var(--pd-warn-bg);
  color:var(--pd-warn);border-radius:var(--pd-r2);font-size:var(--t-sm);line-height:1.6}.pd-isec{margin-top:var(--pd-s5)}.pd-isec h5{font-size:var(--t-sm);font-weight:600;color:var(--pd-sub);margin:0 0 var(--pd-s2)}.pd-say{font-size:var(--t-md);font-weight:600;line-height:1.5;color:var(--pd-ink);
  background:var(--pd-accent-soft);padding:var(--pd-s3) var(--pd-s4);border-radius:var(--pd-r2);
  margin:var(--pd-s2) 0 var(--pd-s3)}.pd-ifacts{display:grid;gap:var(--pd-s1)}.pd-ifacts div{display:flex;gap:var(--pd-s3);align-items:baseline;padding:var(--v2-s1) 0;
  border-bottom:1px solid var(--pd-line2)}.pd-ifacts span{font-size:var(--t-xs);font-weight:600;color:var(--pd-sub);letter-spacing:.06em;flex:0 0 44px}.pd-ifacts b{font-size:var(--t-base);font-weight:500;color:var(--pd-ink)}.pd-imeasures{display:flex;gap:var(--pd-s1);flex-wrap:wrap;margin-top:var(--pd-s2)}.pd-imeasures span{font-size:var(--t-xs);font-weight:500;background:var(--pd-line2);color:var(--pd-sub);
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-r1)}.pd-iwatch{margin:0;padding-left:var(--v2-s4);font-size:var(--t-sm);color:var(--pd-sub);line-height:1.7}.pd-scope{background:var(--pd-line2);padding:var(--pd-s3);border-radius:var(--pd-r2);
  font-size:var(--t-xs);line-height:1.6;max-height:260px;overflow:auto;white-space:pre-wrap;
  color:var(--pd-sub);margin-top:var(--pd-s2)}.pd-imodes{display:flex;gap:var(--pd-s1);margin-bottom:var(--pd-s4)}.pd-isearch{margin-bottom:var(--pd-s3)}.pd-isrc{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.6;margin-bottom:var(--pd-s3)}.pd-isrc b{font-weight:600;color:var(--pd-warn)}.pd-iresults{display:flex;flex-direction:column;gap:var(--v2-s0);
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--v2-s1)}.pd-ires{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--v2-s0) var(--pd-s3);align-items:center;
  width:100%;text-align:left;border:0;background:none;font:inherit;cursor:pointer;
  padding:var(--v2-s2) var(--v2-s2);border-radius:var(--pd-r1)}.pd-ires:hover{background:var(--pd-line2)}.pd-ires-t{font-size:var(--t-base);font-weight:500;color:var(--pd-ink);line-height:1.4}

.pd-ires-d{font-size:var(--t-xs);font-weight:600;color:var(--pd-sub);min-width:30px;text-align:right}.pd-ires-d.hot{color:var(--pd-bad)}.pd-idocs{display:flex;flex-direction:column;gap:var(--v2-s0)}.pd-idoc{font-size:var(--t-sm);color:var(--pd-accent-ink);text-decoration:none;padding:var(--v2-s1) 0;
  border-bottom:1px solid var(--pd-line2);
  display:grid;grid-template-columns:150px minmax(0,1fr) auto;gap:var(--v2-s2);align-items:baseline}.pd-idoc:hover{background:var(--pd-line2)}.pd-idoc:hover .pd-idoc-n{text-decoration:underline}/* The scope, the instructions and the pricing sheet decide the bid (SOP-030).
   They are marked so the eye lands on them before the boilerplate. */.pd-idoc-k{font-size:var(--t-xs);text-transform:uppercase;letter-spacing:.06em;
  color:var(--pd-sub);white-space:nowrap}.pd-idoc.first .pd-idoc-k{color:var(--pd-accent-ink);font-weight:600}.pd-idoc-n{color:var(--pd-ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pd-idoc.first .pd-idoc-n{font-weight:600}.pd-idoc-s{font-size:var(--t-xs);color:var(--pd-sub);white-space:nowrap;font-variant-numeric:tabular-nums}@media (max-width:640px){.pd-idoc{grid-template-columns:minmax(0,1fr) auto}.pd-idoc-k{grid-column:1/-1}}/* ── the governing SOP, on the card ──
   The procedure is the work, so it sits above the gates rather than in a
   library you have to remember to open. Warnings keep their weight: a ⚠ step
   is one that has already cost someone a bid. */.pd-sop{border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-panel);
  box-shadow:var(--pd-sh);margin-bottom:var(--pd-s4);overflow:hidden;
  container-type:inline-size;min-width:0}/* Title, then what it governs, then the actions — stacked. Laid out as one
   flex row the two buttons got squeezed until their labels clipped mid-word. */




.pd-sop-note{padding:var(--v2-s2) var(--pd-s4);font-size:var(--t-sm);color:var(--pd-warn);background:var(--pd-warn-bg)}.pd-sop-steps{max-height:340px;overflow-y:auto;overflow-x:hidden;padding:var(--pd-s2) 0}.pd-sop-sec{font-size:var(--t-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--pd-sub);
  padding:var(--v2-s2) var(--pd-s4) var(--v2-s1);font-weight:600}/* `1fr` is min-content-sized by default, so a long unbreakable step title
   pushed the row wider than the panel instead of wrapping — that is where the
   horizontal scrollbar came from. minmax(0,1fr) lets it wrap. The citation
   drops to its own line rather than stealing width from the text. */.pd-sop-step{display:grid;grid-template-columns:auto 22px minmax(0,1fr) auto;gap:var(--v2-s2);
  align-items:baseline;padding:var(--v2-s1) var(--pd-s4);font-size:var(--t-sm);cursor:pointer}.pd-sop-step:hover{background:var(--pd-line2)}.pd-sop-step.warn .pd-sop-t{color:var(--pd-warn)}.pd-sop-n{color:var(--pd-sub);font-variant-numeric:tabular-nums;font-size:var(--t-xs)}.pd-sop-t{color:var(--pd-ink);line-height:1.45;min-width:0;overflow-wrap:anywhere}.pd-sop-cite{font-size:var(--t-xs);color:var(--pd-sub);white-space:nowrap}@container (max-width:340px){.pd-sop-cite{display:none}}/* A cross-reference between SOPs was a dead string until now. */.pd-soplink{background:none;border:0;padding:0;font:inherit;color:var(--pd-accent-ink);
  cursor:pointer;text-decoration:underline;text-underline-offset:2px}/* ── board filters ── */.pd-filters{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;margin-bottom:var(--pd-s4)}/* max-width, because a <select> sizes itself to its LONGEST OPTION. The
   agency filter is populated from the pipeline, and a real agency name is
   "Department of Veterans Affairs, Rocky Mountain Acquisition Center" — the
   control wanted 552px inside a 345px column. It never showed up with
   fixture data because the fixture agencies were short, and it never showed
   up before the field map was wired because every option was empty. */.pd-filters select{border:1px solid var(--pd-line);border-radius:var(--pd-r1);padding:var(--v2-s1h) var(--v2-s2);
  font:inherit;font-size:var(--t-sm);background:var(--pd-panel);color:var(--pd-sub);
  max-width:100%;min-width:0;text-overflow:ellipsis}.pd-filters select:focus{outline:2px solid var(--pd-accent);outline-offset:-1px}.pd-filters .sep{width:1px;height:20px;background:var(--pd-line)}/* The filter row wraps on a phone, and a 1px vertical rule between two
   WRAPPED lines separates nothing — it just hangs off the end of a row.
   Seen on the pipeline, after "Quotes". */@media(max-width:760px){.pd-filters .sep{display:none}}.pd-clearf{border:0;background:none;color:var(--pd-accent-ink);font:inherit;font-size:var(--t-sm);
  cursor:pointer;padding:0 var(--v2-s1)}/* ── playbook citations ── */.pb-cite{border:0;background:var(--pd-line2);color:var(--pd-sub);font:inherit;font-size:var(--t-xs);
  font-weight:600;padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);cursor:pointer;margin-left:var(--v2-s1);
  vertical-align:1px;letter-spacing:.01em}.pb-cite:hover{background:var(--pd-ink);color:var(--v2-bg)}.pb-cite.far{background:var(--pd-bad-bg);color:var(--pd-bad)}.pb-cite.far:hover{background:var(--pd-bad);color:var(--pd-bg)}.pb-auth{font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);
  background:var(--pd-line2);color:var(--pd-sub);white-space:nowrap}.pb-auth.far{background:var(--pd-bad-bg);color:var(--pd-bad)}.pb-auth.buying_side{background:var(--pd-ok-bg);color:var(--pd-ok)}.pb-meta{font-size:var(--t-xs);color:var(--pd-sub);margin-bottom:var(--pd-s3)}.pb-meta code{background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1)}.pb-quote{margin:0;padding:var(--pd-s3) var(--pd-s4);background:var(--pd-line2);
  border-left:3px solid var(--pd-ink);border-radius:0 var(--pd-r2) var(--pd-r2) 0;
  font-size:var(--t-base);line-height:1.65;color:var(--pd-sub);font-style:italic}.pb-correction{margin-top:var(--pd-s3);padding:var(--pd-s3);background:var(--pd-bad-bg);
  border-radius:var(--pd-r2);font-size:var(--t-sm);line-height:1.6;color:var(--pd-bad)}.pb-correction b{display:block;margin-bottom:var(--v2-s1)}.pb-intro{background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  padding:var(--pd-s4);margin-bottom:var(--pd-s4)}.pb-intro b{display:block;font-size:var(--t-base);margin-bottom:var(--v2-s1)}.pb-intro span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6}.pb-list{display:flex;flex-direction:column;gap:var(--pd-s4)}.pb-sec h4{font-size:var(--t-sm);font-weight:600;color:var(--pd-sub);margin:0 0 var(--pd-s2)}.pb-rule{display:flex;align-items:center;gap:var(--pd-s3);width:100%;border:1px solid var(--pd-line);
  background:var(--pd-panel);border-radius:var(--pd-r2);padding:var(--v2-s3) var(--pd-s3);font:inherit;
  font-size:var(--t-base);cursor:pointer;text-align:left;margin-bottom:var(--pd-s1)}.pb-rule:hover{border-color:var(--pd-ink)}.pb-rule-t{flex:1;min-width:0;color:var(--pd-ink);font-weight:500}.pb-rule code{font-size:var(--t-xs);color:var(--pd-sub)}@media(max-width:640px){.pb-rule{flex-wrap:wrap;gap:var(--pd-s1)}.pb-rule-t{flex-basis:100%}}.pd-co{padding:var(--v2-s2) 0;border-bottom:1px solid var(--pd-line2)}.pd-co:last-of-type{border-bottom:0}
.pd-co-t{font-size:var(--t-xs);font-weight:500;background:var(--pd-line2);color:var(--pd-sub);
  padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);text-transform:lowercase}

.pd-say.sm{font-size:var(--t-base);padding:var(--v2-s2) var(--pd-s3);margin:0 0 var(--pd-s3)}/* ── sub search + candidate list ── */.pd-srhead{display:flex;align-items:baseline;gap:var(--pd-s3);flex-wrap:wrap;margin:var(--pd-s4) 0 var(--pd-s2)}.pd-srhead b{font-size:var(--t-base)}.pd-srhead span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-srhead em{flex-basis:100%;font-style:normal;font-size:var(--t-sm);color:var(--pd-warn)}.pd-srlist{display:flex;flex-direction:column;gap:var(--v2-s0);max-height:340px;overflow-y:auto}.pd-sr{display:flex;align-items:center;gap:var(--pd-s3);padding:var(--v2-s2) var(--v2-s2);border:1px solid var(--pd-line);
  border-radius:var(--pd-r1);cursor:pointer;font-size:var(--t-base);background:var(--pd-panel)}.pd-sr:hover{border-color:var(--pd-ink)}.pd-sr.out{opacity:.6;background:var(--pd-line2);border-style:dashed;cursor:default}.pd-sr-x{color:var(--pd-bad);font-weight:700;flex:0 0 14px}.pd-sr-m{flex:1;min-width:0}.pd-sr-m b{display:block;color:var(--pd-ink);font-weight:500}.pd-sr-m span{display:block;font-size:var(--t-xs);color:var(--pd-sub);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}.pd-sr-m em{display:block;font-style:normal;font-size:var(--t-xs);color:var(--pd-bad);margin-top:var(--v2-s0)}.pd-sr-r{flex:0 0 auto;text-align:right}.pd-sr-p{display:block;font-size:var(--t-sm);color:var(--pd-ink);font-variant-numeric:tabular-nums}.pd-sr-g{display:block;font-size:var(--t-xs);color:var(--pd-sub)}



.pd-cands{display:flex;flex-direction:column;gap:var(--pd-s2)}.pd-cand{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) auto auto;gap:var(--pd-s3);align-items:center;
  background:var(--pd-panel);border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--v2-s3) var(--pd-s3)}.pd-cand.dq{background:var(--pd-line2);border-style:dashed}.pd-cand.dq .pd-cand-m b{text-decoration:line-through;color:var(--pd-sub)}.pd-cand-m b{display:block;font-size:var(--t-base);font-weight:600;color:var(--pd-ink)}.pd-cand-m span{display:block;font-size:var(--t-xs);color:var(--pd-sub)}.pd-cand-c{display:flex;flex-direction:column;gap:var(--v2-s0);font-size:var(--t-sm)}.pd-cand-c a{color:var(--pd-accent-ink);text-decoration:none;font-variant-numeric:tabular-nums}.pd-cand-c a:hover{text-decoration:underline}.pd-cand-s{display:flex;flex-direction:column;gap:var(--v2-s0);align-items:flex-start}.pd-cand-n{font-size:var(--t-xs);color:var(--pd-sub);font-variant-numeric:tabular-nums}.pd-cand-a{display:flex;gap:var(--pd-s1)}.pd-status-sel{border:1px solid var(--pd-line);border-radius:var(--pd-r1);padding:var(--v2-s1) var(--v2-s2);
  font:inherit;font-size:var(--t-xs);font-weight:500;background:var(--pd-panel);color:var(--pd-sub)}.pd-status-sel.ok{border-color:var(--pd-ok);color:var(--pd-ok)}.pd-status-sel.warn{border-color:var(--pd-warn);color:var(--pd-warn)}.pd-status{font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-r1)}.pd-status.bad{background:var(--pd-bad-bg);color:var(--pd-bad)}.pd-faint{color:var(--pd-sub);font-size:var(--t-sm)}@media(max-width:820px){.pd-cand{grid-template-columns:minmax(0,1fr);gap:var(--pd-s2)}.pd-cand-a{justify-content:flex-start}
}

/* ══════════════════════════════════════════════════════════════════════
   DASHBOARD — bento. One 12-column grid;every box claims a span.
   Sizes carry meaning: the widest box is the one you act on.
   ══════════════════════════════════════════════════════════════════════ */
.bento{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--v2-s3);align-items:start;margin-bottom:var(--v2-s3)}.bx{background:var(--panel);border:1px solid var(--line);border-radius:var(--pd-r3);padding:var(--v2-s4);
  box-shadow:var(--shadow);min-width:0}.bx.k3{grid-column:span 3}.bx.k4{grid-column:span 4}.bx.k5{grid-column:span 5}.bx.k6{grid-column:span 6}.bx.k7{grid-column:span 7}.bx.k8{grid-column:span 8}.bx.k12{grid-column:1/-1}.bx-h{display:flex;align-items:baseline;gap:var(--v2-s2);margin-bottom:var(--v2-s3)}.bx-h h4{font-size:var(--t-sm);font-weight:650;margin:0;letter-spacing:-.01em}/* --pd-accent on white measures 2.46:1 at this size. accent-ink is the same
   hue at 29% lightness and measures 5.43:1 — these are the only way into
   "All tasks" and "Open board", so they have to be readable. */.bx-h a,.bx-h button{margin-left:auto;border:0;background:none;font:inherit;font-size:var(--t-xs);
  color:var(--pd-accent-ink);cursor:pointer;font-weight:600;text-decoration:none}.bx-sub{font-size:var(--t-xs);color:var(--pd-sub);margin:-var(--v2-s2) 0 var(--v2-s3)}@media(max-width:1100px){.bx.k3{grid-column:span 6}.bx.k4,.bx.k5{grid-column:span 6}}@media(max-width:720px){.bento{gap:var(--v2-s2)}.bx,.bx.k3,.bx.k4,.bx.k5,.bx.k6,.bx.k7,.bx.k8{grid-column:1/-1}}/* KPI tile inside the bento */.bx.kpi{padding:var(--v2-s4)}.bx.kpi .ic{width:32px;height:32px;border-radius:var(--pd-r2);display:grid;place-items:center;
  font-size:var(--t-base);background:var(--ink);color:var(--bg);margin-bottom:var(--v2-s2)}.bx.kpi b{display:block;font-size:var(--t-display);font-weight:750;letter-spacing:-.03em;line-height:1;
  font-variant-numeric:tabular-nums}.bx.kpi span{display:block;color:var(--sub);font-size:var(--t-sm);margin-top:var(--v2-s1)}.bx.kpi .trend{position:absolute;top:16px;right:16px;font-size:var(--t-xs);font-weight:700;
  padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r2);background:var(--pd-ok-bg);color:var(--pd-ok)}.bx.kpi{position:relative}/* the govcon tile — the one that ties the two halves together */.gcx{display:flex;flex-direction:column;gap:var(--v2-s1h)}.gcx-row{display:flex;align-items:center;gap:var(--v2-s2);padding:var(--v2-s1h) 0;border-bottom:1px solid var(--line2);
  font-size:var(--t-sm);cursor:pointer}.gcx-row:last-child{border-bottom:0}.gcx-row:hover .gcx-t{color:var(--accent)}.gcx-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.gcx-s{font-size:var(--t-xs);color:var(--faint);white-space:nowrap}.gcx-empty{font-size:var(--t-sm);color:var(--sub);line-height:1.6}.miniday{display:flex;flex-direction:column;gap:var(--v2-s1h)}.miniday-r{display:flex;gap:var(--v2-s2);align-items:baseline;font-size:var(--t-sm);padding:var(--v2-s1) 0;
  border-bottom:1px solid var(--line2)}.miniday-r:last-child{border-bottom:0}.miniday-t{flex:0 0 42px;font-size:var(--t-xs);color:var(--faint);font-variant-numeric:tabular-nums}.miniday-n{flex:1;min-width:0}.miniday-n.done{text-decoration:line-through;color:var(--faint)}.pd-throttle{background:var(--pd-warn-bg);border-radius:var(--pd-r2);padding:var(--pd-s3) var(--pd-s4);
  margin-bottom:var(--pd-s3)}.pd-throttle b{display:block;font-size:var(--t-base);font-weight:600;color:var(--pd-warn);margin-bottom:var(--v2-s1)}.pd-throttle span{display:block;font-size:var(--t-sm);color:var(--pd-warn);opacity:.9;line-height:1.6;margin-top:var(--v2-s0)}/* ── Who: the CO and the incumbent, at the top with the facts ────────── */.pd-who{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s3);margin-bottom:var(--pd-s4)}@media(max-width:820px){.pd-who{grid-template-columns:minmax(0,1fr)}}.pd-whocard{padding:var(--pd-s3);border-radius:var(--pd-r2);background:var(--pd-line2);
  display:flex;flex-direction:column;gap:var(--v2-s1);align-items:flex-start}.pd-wholabel{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-whocard > b{font-size:var(--t-md);color:var(--pd-ink);line-height:1.3}.pd-whonone{color:var(--pd-sub)!important;font-weight:500!important}.pd-whotag{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--pd-accent-soft);color:var(--pd-accent-ink);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1)}.pd-whotag.warn{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-wholinks{display:flex;gap:var(--pd-s3);flex-wrap:wrap}.pd-wholinks a{font-size:var(--t-sm);color:var(--pd-accent-ink);text-decoration:none}.pd-whomore{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.55}.pd-inline{display:flex;gap:var(--pd-s2);flex-wrap:wrap}/* ── Guides, hung off the steps that need them ───────────────────────── */.pd-guides{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;
  padding:var(--pd-s2) 0 var(--pd-s3);border-bottom:1px solid var(--pd-line2);margin-bottom:var(--pd-s2)}.pd-guides-l{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-guide{font-size:var(--t-xs);font-weight:500;background:var(--pd-accent-soft);color:var(--pd-accent-ink);
  border:0;padding:var(--v2-s1) var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer;font-family:inherit}.pd-guide:hover{background:var(--pd-accent-ink);color:var(--v2-bg)}.pd-guide-sec{font-size:var(--t-xs);color:var(--pd-sub);font-weight:400}/* A slide-over: you open a guide WHILE working a step and have to land back
   where you were when you shut it. */.pd-slide{position:fixed;top:0;right:0;bottom:0;width:min(680px,100%);z-index:1200;
  background:var(--pd-panel);box-shadow:var(--pd-sh2);display:flex;flex-direction:column}.pd-slide-b{flex:1;overflow-y:auto;padding:var(--pd-s5)}.pd-guidebody{font-size:var(--t-base);line-height:1.65;color:var(--pd-ink)}.pd-guidebody h4{font-size:var(--t-lg);margin:var(--pd-s5) 0 var(--pd-s3)}.pd-guidebody h5{font-size:var(--t-md);margin:var(--pd-s5) 0 var(--pd-s2)}.pd-guidebody h6{font-size:var(--t-base);margin:var(--pd-s4) 0 var(--pd-s2);color:var(--pd-sub);
  text-transform:none;letter-spacing:0}.pd-guidebody p{margin:0 0 var(--pd-s2)}.pd-guidebody blockquote{margin:var(--pd-s2) 0;padding:var(--pd-s2) var(--pd-s3);
  border-left:3px solid var(--pd-accent);background:var(--pd-line2);border-radius:0 var(--pd-r1) var(--pd-r1) 0}.pd-guidebody code{font-size:var(--t-sm);background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1)}.pd-guidebody hr{border:0;border-top:1px solid var(--pd-line);margin:var(--pd-s4) 0}.pd-gli{margin:var(--v2-s0) 0 var(--v2-s0) var(--v2-s1)}.pd-gtable{width:100%;border-collapse:collapse;margin:var(--pd-s2) 0;font-size:var(--t-sm);display:table}.pd-gtable td,.pd-gtable th{border:1px solid var(--pd-line);padding:var(--v2-s1h) var(--v2-s2);
  text-align:left;vertical-align:top}.pd-gtable th{background:var(--pd-line2);font-weight:600;font-size:var(--t-xs);
  text-transform:uppercase;letter-spacing:.04em;color:var(--pd-sub)}.pd-gtable tr:first-child td{background:var(--pd-line2);font-weight:600}/* The question sheet. A row we cannot answer is the interesting one. */.pd-qtable td:first-child{width:38%;color:var(--pd-sub)}.pd-qtable tr.missing td{background:var(--pd-warn-bg)}.pd-qtable tr.missing td:last-child{color:var(--pd-warn);font-weight:500}.pd-qtable tr:first-child td{background:var(--pd-line2);font-weight:600;color:var(--pd-sub)}.pd-qnote{display:block;font-size:var(--t-xs);color:var(--pd-sub);margin-top:var(--v2-s0);font-weight:400}.pd-scopetable td:last-child{white-space:nowrap;font-variant-numeric:tabular-nums}/* ── Document generators ─────────────────────────────────────────────── */.pd-docgen-bar{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;
  padding:var(--pd-s3);margin-bottom:var(--pd-s3);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:var(--pd-panel)}.pd-docgen-l{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-docgen-bar .pd-hint{flex-basis:100%;margin:0}.pd-docgen{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-sm);
  line-height:1.6;padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  background:var(--pd-panel);color:var(--pd-ink);resize:vertical}/* ── The call script, on the card ────────────────────────────────────── */.pd-script{border:1px solid var(--pd-line);border-radius:var(--pd-r2);overflow:hidden;
  margin:var(--pd-s2) 0}.pd-script > div{display:flex;gap:var(--pd-s3);padding:var(--v2-s2) var(--pd-s3);font-size:var(--t-base);
  line-height:1.6;border-bottom:1px solid var(--pd-line2)}.pd-script > div:last-child{border-bottom:0}.pd-script > div.them{background:var(--pd-line2);color:var(--pd-sub)}.pd-script span{flex:0 0 42px;font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;
  color:var(--pd-sub);padding-top:var(--v2-s0)}


/* ── What changes their price, and what they still can't price ───────── */.pd-scopefacts{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  gap:var(--pd-s2)}.pd-sf{display:flex;flex-direction:column;gap:var(--v2-s0);padding:var(--v2-s2) var(--pd-s3);
  background:var(--pd-line2);border-radius:var(--pd-r1)}.pd-sf b{font-size:var(--t-sm);color:var(--pd-ink)}.pd-sf-v{font-size:var(--t-sm);color:var(--pd-ink);line-height:1.5}.pd-sf-w{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5}.pd-pkgaps .pd-sf{background:color-mix(in srgb,var(--v2-panel) 60%,transparent)}.pd-gapwho{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);margin-left:var(--v2-s1);vertical-align:1px}.pd-gapwho.CO{background:var(--pd-bad-bg);color:var(--pd-bad)}.pd-gapwho.read{background:var(--pd-accent-soft);color:var(--pd-accent-ink)}

/* ── The call script ──────────────────────────────────────────────────
   The old version made every child of a line a flex item, so a <b> inside a
   sentence became its own column and the script rendered as a lopsided table.
   One child per line;





.pd-callwrap{padding:0 var(--pd-s4) var(--pd-s4);border-top:1px solid var(--pd-line2)}.pd-callhead{display:flex;align-items:flex-start;gap:var(--pd-s3);padding:var(--pd-s3) 0}.pd-callhead b{display:block;font-size:var(--t-base)}.pd-callhead span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.5}.pd-callhead button{margin-left:auto;flex:0 0 auto}.pd-prep{background:var(--pd-accent-soft);border-radius:var(--pd-r2);padding:var(--pd-s3);
  margin-bottom:var(--pd-s3)}.pd-prep > b{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-accent-ink)}.pd-prepgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:var(--pd-s3);margin-top:var(--pd-s2)}.pd-prepgrid > div{display:flex;flex-direction:column;gap:var(--v2-s0);min-width:0}.pd-prepgrid span{font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-accent-ink)}.pd-prepgrid b{font-size:var(--t-sm);font-weight:500;color:var(--pd-ink);overflow-wrap:anywhere}.pd-lines{border:1px solid var(--pd-line);border-radius:var(--pd-r2);overflow:hidden}.pd-l{display:flex;gap:var(--pd-s3);padding:var(--v2-s2) var(--pd-s3);border-bottom:1px solid var(--pd-line2)}.pd-l:last-child{border-bottom:0}.pd-l.them{background:var(--pd-line2)}.pd-l-w{flex:0 0 40px;font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;color:var(--pd-sub);
  padding-top:var(--v2-s0)}/* One flex child. Everything inside it is ordinary inline flow. */.pd-l-t{flex:1;min-width:0;font-size:var(--t-base);line-height:1.6;color:var(--pd-ink)}.pd-l-t em{display:block;font-style:normal;font-size:var(--t-xs);color:var(--pd-sub);
  margin-top:var(--v2-s1);line-height:1.5}.pd-l.them .pd-l-t{color:var(--pd-sub)}.pd-branch{margin-top:var(--pd-s3);padding:var(--pd-s3);border-radius:var(--pd-r2);
  border-left:3px solid var(--pd-line);background:var(--pd-line2)}.pd-branch.yes{border-left-color:var(--pd-ok);background:var(--pd-ok-bg)}.pd-branch.no{border-left-color:var(--pd-warn);background:var(--pd-warn-bg)}.pd-branch.gate{border-left-color:var(--pd-accent);background:var(--pd-accent-soft)}.pd-branch-h{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-sub);margin-bottom:var(--pd-s2)}.pd-branch .pd-lines{background:var(--pd-panel)}.pd-why{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.6;margin:var(--pd-s2) 0 0}.pd-why b{color:var(--pd-ink)}.pd-objs{margin-top:var(--pd-s4)}.pd-objs-h,.pd-closeblk-h,.pd-fivethings-h{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub);margin-bottom:var(--pd-s2)}.pd-obj{padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  margin-bottom:var(--pd-s2)}.pd-obj.stop{border-color:var(--pd-bad);background:var(--pd-bad-bg)}.pd-obj-q{font-size:var(--t-sm);color:var(--pd-sub);font-style:italic;margin-bottom:var(--v2-s1)}.pd-obj-a{font-size:var(--t-base);line-height:1.55;color:var(--pd-ink)}.pd-obj-w{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.55;margin-top:var(--v2-s1h)}.pd-closeblk{margin-top:var(--pd-s4)}.pd-step{margin-bottom:var(--pd-s3)}.pd-step > b{display:block;font-size:var(--t-sm);margin-bottom:var(--v2-s1h);color:var(--pd-ink)}.pd-fivethings{margin-top:var(--pd-s4);padding:var(--pd-s3);background:var(--pd-line2);
  border-radius:var(--pd-r2)}.pd-fivethings ol{margin:0;padding-left:var(--v2-s4);font-size:var(--t-sm);line-height:1.8;color:var(--pd-sub)}.pd-fivethings b{color:var(--pd-ink)}/* ── Two sourcing channels ────────────────────────────────────────── */.pd-channels{display:flex;gap:var(--pd-s2);margin:var(--pd-s3) 0}.pd-channels button{flex:1;display:flex;flex-direction:column;gap:var(--v2-s0);align-items:flex-start;
  padding:var(--v2-s2) var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  background:none;font:inherit;font-size:var(--t-base);font-weight:600;color:var(--pd-sub);cursor:pointer}.pd-channels button.on{border-color:var(--pd-sub);color:var(--pd-sub);background:var(--pd-line2)}.pd-channels i{font-style:normal;font-size:var(--t-xs);font-weight:400;color:var(--pd-sub)}.pd-cats{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;margin-top:var(--pd-s3)}.pd-cats-l{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-cat{font-size:var(--t-xs);background:var(--pd-accent-soft);color:var(--pd-accent-ink);
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-r1)}.pd-conf{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);background:var(--pd-line2);color:var(--pd-sub)}.pd-conf.ok{background:var(--pd-ok-bg);color:var(--pd-ok)}.pd-conf.warn{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-sr-w{font-size:var(--t-xs);color:var(--pd-accent-ink);text-decoration:none}/* ── The SOP, as a card that opens ────────────────────────────────── */.pd-sopcard{display:flex;flex-direction:column;gap:var(--v2-s0);align-items:flex-start;width:100%;
  padding:var(--pd-s4);border:1px solid var(--pd-line);border-radius:var(--pd-r3);
  background:var(--pd-panel);font:inherit;text-align:left;cursor:pointer;position:relative}.pd-sopcard:hover{border-color:var(--pd-ink)}.pd-sopcard-l{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-sopcard > b{font-size:var(--t-base);color:var(--pd-ink)}.pd-sopcard-s{font-size:var(--t-sm);color:var(--pd-sub)}.pd-sopcard-go{position:absolute;top:var(--pd-s4);right:var(--pd-s4);font-size:var(--t-xs);
  color:var(--pd-accent-ink)}/* ── Boolean strings ─────────────────────────────────────────────────── */.pd-bool-h{margin-bottom:var(--pd-s3)}.pd-bool-h b{display:block;font-size:var(--t-base)}.pd-bool-h span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.5}.pd-boolrow{border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--pd-s3);
  margin-bottom:var(--pd-s2)}.pd-boolrow-h{display:flex;align-items:center;gap:var(--pd-s3)}.pd-boolrow-h b{font-size:var(--t-base)}.pd-boolacts{margin-left:auto;display:flex;gap:var(--pd-s2);align-items:center}.pd-boolwhy{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.55;margin:var(--v2-s1) 0 var(--v2-s2)}.pd-boolq{display:block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-xs);
  line-height:1.6;background:var(--pd-line2);border-radius:var(--pd-r1);padding:var(--v2-s2) var(--pd-s3);
  color:var(--pd-sub);overflow-wrap:anywhere;white-space:pre-wrap}.pd-hint code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-xs);
  background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1)}/* Which model answered — and which ones agreed. */.pd-aiwho{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin-top:var(--pd-s3)}.pd-aibtn{font-size:var(--t-xs);font-weight:500;border:1px solid var(--pd-line);background:none;
  padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer;font-family:inherit;color:var(--pd-sub)}.pd-aibtn.on{border-color:var(--pd-sub);color:var(--pd-sub);font-weight:600;background:var(--pd-line2)}.pd-namedby{font-size:var(--t-xs);color:var(--pd-sub);text-transform:uppercase;letter-spacing:.04em}/* The signature opt-in. */

/* ── API keys in Settings ─────────────────────────────────────────────── */.cc-keys{display:flex;flex-direction:column;gap:var(--pd-s2);margin-top:var(--pd-s3)}.cc-keyrow{border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--pd-s3)}.cc-keyrow.set{border-left:3px solid var(--pd-ok)}.cc-keywho{display:flex;align-items:baseline;gap:var(--pd-s2);flex-wrap:wrap}.cc-keywho b{font-size:var(--t-base)}.cc-keyok{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-xs);
  color:var(--pd-sub)}.cc-keymissing{font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-sub)}.cc-keysrc{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);background:var(--pd-line2);color:var(--pd-sub)}.cc-keysrc.env{background:var(--pd-accent-soft);color:var(--pd-accent-ink)}.cc-keysrc.good{background:var(--pd-ok-bg);color:var(--pd-ok)}.cc-keysrc.bad{background:var(--pd-bad-bg);color:var(--pd-bad)}.cc-keywhat{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.55;margin:var(--v2-s0) 0 var(--v2-s2)}.cc-keyacts{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap}.cc-keyedit{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap}.cc-keyedit input{flex:1;min-width:220px;padding:var(--v2-s2) var(--pd-s3);font-size:var(--t-base);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);
  color:var(--pd-ink)}.cc-keyedit input:focus{outline:none;border-color:var(--pd-accent)}/* ── The Subs tab, top to bottom ─────────────────────────────────────── */.pd-srcbar{display:flex;align-items:center;gap:var(--pd-s4);flex-wrap:wrap;
  padding:var(--pd-s3) var(--pd-s4);margin-bottom:var(--pd-s3);
  border:1px solid var(--pd-line);border-radius:var(--pd-r3);background:var(--pd-panel)}.pd-srcbar-l b{font-size:var(--t-base);display:block}.pd-srcbar-l span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-srcbar-r{margin-left:auto;display:flex;gap:var(--pd-s2);flex-wrap:wrap}
.pd-fold{border:1px solid var(--pd-line);border-radius:var(--pd-r3);background:var(--pd-panel);
  margin-top:var(--pd-s3);overflow:hidden}.pd-foldtoggle{display:flex;align-items:baseline;gap:var(--pd-s3);width:100%;
  padding:var(--pd-s3) var(--pd-s4);border:0;background:none;font:inherit;text-align:left;cursor:pointer}.pd-foldtoggle:hover{background:var(--pd-line2)}.pd-foldtoggle b{font-size:var(--t-base);color:var(--pd-ink)}.pd-foldtoggle span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-foldtoggle i{margin-left:auto;font-style:normal;font-size:var(--t-xs);color:var(--pd-accent-ink)}.pd-fold .pd-panel{border:0;border-top:1px solid var(--pd-line2);border-radius:0;margin:0}/* ── The funnel ──────────────────────────────────────────────────────── */
/* NOT .pd-funnel — that name is already the Metrics pipeline bar chart, whose
   display:flex turned these five stacked sections into five squeezed columns. */.pd-callfn{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
  width:min(720px,calc(100% - 32px));max-height:calc(100vh - 48px);overflow-y:auto;
  z-index:1300;background:var(--pd-panel);border-radius:var(--pd-r3);box-shadow:var(--pd-sh2)}@media(max-width:820px){.pd-callfn{inset:0;transform:none;width:100%;max-height:100vh;
  border-radius:0}}.pd-fn-who{display:flex;align-items:center;gap:var(--pd-s3);padding:var(--pd-s3) var(--pd-s4);
  border-bottom:1px solid var(--pd-line)}.pd-fn-who > div{flex:1;min-width:0}.pd-fn-who b{display:block;font-size:var(--t-md)}.pd-fn-who a{font-size:var(--t-sm);color:var(--pd-accent-ink);text-decoration:none}.pd-fn-prep{display:flex;gap:var(--pd-s4);flex-wrap:wrap;padding:var(--v2-s2) var(--pd-s4);
  background:var(--pd-accent-soft);font-size:var(--t-sm);color:var(--pd-accent-ink);font-weight:500}.pd-fn-body{padding:var(--pd-s5) var(--pd-s4)}.pd-fn-body.bad{background:var(--pd-bad-bg)}/* Readable at arm's length, standing up, on the phone. */.pd-fn-say{font-size:var(--t-lg);line-height:1.5;font-weight:500;color:var(--pd-ink)}.pd-fn-why{font-size:var(--t-sm);line-height:1.6;color:var(--pd-sub);margin-top:var(--pd-s2)}.pd-fn-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:var(--pd-s3);margin-top:var(--pd-s4)}.pd-fnf{display:flex;flex-direction:column;gap:var(--v2-s1)}.pd-fnf label{font-size:var(--t-xs);font-weight:600;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-fnf input{padding:var(--v2-s2) var(--pd-s3);font-size:var(--t-md);border:1px solid var(--pd-line);
  border-radius:var(--pd-r1);background:var(--pd-panel);color:var(--pd-ink)}.pd-fnf input:focus{outline:none;border-color:var(--pd-accent)}.pd-fn-answers{display:flex;gap:var(--pd-s2);flex-wrap:wrap;margin-top:var(--pd-s5)}/* 44px minimum — this is tapped in a hurry. */.pd-fn-a{min-height:44px;padding:0 var(--pd-s5);font:inherit;font-size:var(--t-md);font-weight:600;
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-panel);
  color:var(--pd-ink);cursor:pointer}.pd-fn-a:hover{border-color:var(--pd-ink)}.pd-fn-a.ok{background:var(--pd-ink);color:var(--v2-bg);border-color:var(--pd-ink)}.pd-fn-a.warn{background:var(--pd-warn-bg);color:var(--pd-warn);border-color:var(--pd-warn-bg)}.pd-fn-a.bad{background:var(--pd-bad);color:var(--pd-bg);border-color:var(--pd-bad)}.pd-fn-objs{display:flex;gap:var(--pd-s2);align-items:center;flex-wrap:wrap;
  padding:var(--pd-s3) var(--pd-s4);border-top:1px solid var(--pd-line);background:var(--pd-line2)}.pd-fn-objl{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-fn-obj{font-size:var(--t-sm);border:1px solid var(--pd-line);background:var(--pd-panel);
  padding:var(--v2-s1) var(--v2-s2);border-radius:var(--pd-r1);cursor:pointer;font-family:inherit;color:var(--pd-sub)}.pd-fn-obj.on{border-color:var(--pd-accent);color:var(--pd-accent-ink);background:var(--pd-accent-soft)}.pd-fn-obja{padding:var(--pd-s3) var(--pd-s4);background:var(--pd-accent-soft)}.pd-fn-obja b{display:block;font-size:var(--t-md);line-height:1.5;color:var(--pd-ink)}.pd-fn-obja span{display:block;font-size:var(--t-sm);color:var(--pd-sub);margin-top:var(--v2-s1);line-height:1.5}.pd-fn-five{display:flex;gap:var(--pd-s3);flex-wrap:wrap;padding:var(--pd-s3) var(--pd-s4);
  border-top:1px solid var(--pd-line)}.pd-fn-t{font-size:var(--t-xs);color:var(--pd-sub)}.pd-fn-t.done{color:var(--pd-ok);font-weight:600}/* ══════════════════════════════════════════════════════════════════════
   REFRESH LAYER — the design system in DESIGN.md, applied by cascade.
   Appended last on purpose: it overrides the organic styles above without
   editing them, so every rule that changes the look is in one place.
   ══════════════════════════════════════════════════════════════════════ */
/* The second :root that stood here is merged into the one at the top of this
   file. It declared a COMPETING six-size scale — 10 · 11.5 · 13 · 14.5 · 17 ·
   19 — that was dead whenever v2 was on, because v2.css redefines all six on
   body.v2 and a definition on body beats an inherited one from :root. Editing
   a number here and reloading did nothing, which is the same trap index.html
   had with two :root blocks. One file, one place. */
/* ── 1 · Panels: white card, ink title, hairline under the header ────── */.pd-panel{padding:var(--pd-s4);border-radius:var(--pd-r2);box-shadow:var(--pd-sh)}.pd-panel h4{font-size:var(--t-md);font-weight:600;color:var(--pd-ink);
  letter-spacing:0;text-transform:none;
  padding-bottom:var(--pd-s2);border-bottom:1px solid var(--pd-line2);
  margin:0 0 var(--pd-s3)}.pd-panel h5,.pd-pkcol h5,.pd-pkgaps h5{font-size:var(--t-xs);font-weight:700;
  letter-spacing:.06em;color:var(--pd-sub)}.pd-dbody{gap:var(--pd-s3)}/* ── 2 · Prose is quiet and short ────────────────────────────────────── */.pd-hint,.pd-note{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.55}.pd-panel > .pd-hint:first-of-type{margin-top:-var(--v2-s1)}/* ── 3 · Micro-labels everywhere data is grouped ─────────────────────── */.pd-gtable th{font-size:var(--t-xs);letter-spacing:.06em;color:var(--pd-sub);
  background:none;border:0;border-bottom:1px solid var(--pd-line);padding:var(--v2-s1h) var(--v2-s2)}.pd-gtable td{border:0;border-bottom:1px solid var(--pd-line2);padding:var(--v2-s2) var(--v2-s2);
  font-size:var(--t-base)}.pd-gtable tr:first-child td{background:none;font-weight:inherit}.pd-gtable tbody tr:hover td{background:var(--pd-line2)}/* The Q&A sheet: a gap is information, not an alarm. The amber flood was the
   loudest thing on the page and it was background, not meaning. */.pd-qtable tr.missing td{background:none}.pd-qtable tr.missing td:first-child{box-shadow:inset 3px 0 0 var(--pd-warn)}.pd-qtable tr.missing td:last-child{color:var(--pd-sub);font-weight:400}.pd-askco{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  background:var(--pd-warn-bg);color:var(--pd-warn);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);
  margin-right:var(--v2-s1h);vertical-align:1px}/* Same rule for the gaps panel: hairline, not flood. */.pd-pkgaps{background:none;border:1px solid var(--pd-line);border-left:3px solid var(--pd-warn);
  border-radius:var(--pd-r1);padding:var(--pd-s3) var(--pd-s4)}.pd-pkgaps h5{color:var(--pd-warn)}.pd-pkgaps .pd-sf{background:var(--pd-line2)}.pd-iwarn{border-radius:var(--pd-r1)}/* ── 4 · The sourcing bar is a toolbar, not a card ───────────────────── */.pd-srcbar{border:0;background:none;border-radius:0;padding:0 0 var(--pd-s3);
  border-bottom:1px solid var(--pd-line);margin-bottom:var(--pd-s4)}.pd-srcbar-l b{font-size:var(--t-lg);font-weight:600}.pd-srcbar-l span{font-size:var(--t-sm);color:var(--pd-sub)}/* ── 5 · Rows: avatar · identity · data · state · actions ────────────── */.pd-cands{gap:0;border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  overflow:hidden;background:var(--pd-panel)}.pd-cand{grid-template-columns:auto minmax(0,1.5fr) minmax(0,1fr) auto auto;align-items:center;
  border:0;border-bottom:1px solid var(--pd-line2);border-radius:0;
  padding:var(--v2-s2) var(--pd-s4);background:var(--pd-panel)}.pd-cand:last-child{border-bottom:0}.pd-cand:hover{background:var(--pd-line2)}.pd-cand.dq{background:var(--pd-line2);border-style:solid;opacity:.65}.pd-cand-av{width:30px;height:30px;border-radius:50%;background:var(--pd-accent-soft);
  color:var(--pd-accent-ink);font-size:var(--t-sm);font-weight:700;
  display:flex;align-items:center;justify-content:center;flex:0 0 auto}.pd-cand.dq .pd-cand-av{background:var(--pd-line);color:var(--pd-ink)}.pd-cand-m b{font-size:var(--t-md);font-weight:600}.pd-cand-m span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-cand-c a,.pd-cand-c span{font-size:var(--t-base)}.pd-cand-n{font-size:var(--t-sm);color:var(--pd-sub)}.pd-status-sel{font-size:var(--t-sm);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1)}
/* ── 6 · Folds are section headers that open, not cards in cards ─────── */.pd-fold{border:0;background:none;border-radius:0;margin-top:var(--pd-s5);overflow:visible}.pd-foldtoggle{padding:var(--pd-s2) 0;border-bottom:1px solid var(--pd-line)}.pd-foldtoggle:hover{background:none}.pd-foldtoggle:hover b{color:var(--pd-accent-ink)}.pd-foldtoggle b{font-size:var(--t-md)}.pd-foldtoggle span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-fold.open > :not(.pd-foldtoggle){margin-top:var(--pd-s3)}.pd-fold .pd-panel{border:1px solid var(--pd-line);border-radius:var(--pd-r2)}/* The slim replacement for a duplicated panel title inside a fold. */.pd-panelbar{display:flex;align-items:center;gap:var(--pd-s2);
  padding-bottom:var(--pd-s2);border-bottom:1px solid var(--pd-line2);
  margin-bottom:var(--pd-s3)}.pd-panelbar .pd-facts-act{margin-left:auto}/* ── 7 · Controls: one size story ────────────────────────────────────── */.pd-btn.sm{height:30px;line-height:28px;padding:0 var(--v2-s3);font-size:var(--t-sm);border-radius:var(--pd-r2)}.pd-chip{font-size:var(--t-sm)}

/* ── 8 · Reading tabs hold a column;boards stay wide ────────────────── */
.pd-detail .pd-dbody{max-width:1160px}/* ── inventar-pattern rows: labeled columns ──────────────────────────── */.pd-cand{grid-template-columns:auto minmax(0,1.1fr) minmax(0,2fr) auto auto}
/* Four fixed columns assumed this block got a quarter of the row. It gets
   188px of a 972px card — 38px a column — and "LOCATION" is 62px, so every
   label was clipped mid-word. Before the tracks were given a 0 floor the
   block pushed the card wider instead;the overflow moved,it did not go.
   auto-fit with a floor wide enough for the longest label reflows 4 × 1 into
   2 × 2,which is what there is room for. */
.pd-cand-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(72px,1fr));
  gap:var(--pd-s3);min-width:0}.pd-col2{display:flex;flex-direction:column;gap:var(--v2-s0);min-width:0}.pd-col2-l{font-size:var(--t-xs);font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--pd-sub)}.pd-col2 b{font-size:var(--t-base);font-weight:500;color:var(--pd-ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pd-col2 a{font-size:var(--t-base);color:var(--pd-accent-ink);text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pd-col2 i{color:var(--pd-sub);font-style:normal}.pd-ailead{font-style:normal;font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;background:var(--pd-warn-bg);color:var(--pd-warn);
  padding:var(--v2-s0) var(--v2-s1);border-radius:var(--pd-r1);margin-left:var(--v2-s1)}@media(max-width:1100px){.pd-cand{grid-template-columns:auto minmax(0,1fr) auto}.pd-cand-cols{grid-column:1/-1;grid-template-columns:repeat(2,minmax(0,1fr))}.pd-cand-a{grid-column:1/-1}
}.pd-replied{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--pd-ok-bg);color:var(--pd-ok);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-r1);white-space:nowrap}.pd-src.doc{background:var(--pd-ok-bg);color:var(--pd-ok)}/* ── Removing a pursuit: No-Bid offered first, Delete styled as the
     exception it is ─────────────────────────────────────────────────── */.pd-rm{display:flex;flex-direction:column;gap:var(--pd-s2)}.pd-rmopt{display:flex;flex-direction:column;gap:var(--v2-s1);align-items:flex-start;text-align:left;
  padding:var(--pd-s3) var(--pd-s4);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  background:var(--pd-panel);font:inherit;cursor:pointer}.pd-rmopt:hover{border-color:var(--pd-ink)}.pd-rmopt b{font-size:var(--t-md);color:var(--pd-ink)}.pd-rmopt span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.55}.pd-rmopt.danger{border-color:var(--pd-bad-bg)}.pd-rmopt.danger b{color:var(--pd-bad)}.pd-rmopt.danger:hover{border-color:var(--pd-bad);background:var(--pd-bad-bg)}.pd-btn.pd-danger{color:var(--pd-bad)}.pd-btn.pd-danger:hover{border-color:var(--pd-bad);background:var(--pd-bad-bg)}

/* ── Cross-references inside SOPs and guides ───────────────────────────
     A live reference is an accent-underlined control;one this library does
     not carry is plain text with a dotted rule,never a dead link. */
.pd-xref{color:var(--pd-accent-ink);cursor:pointer;text-decoration:none;
  border-bottom:1px solid color-mix(in srgb,var(--pd-accent) 35%,transparent)}.pd-xref:hover{border-bottom-color:var(--pd-accent)}.pd-xref.ext{white-space:nowrap}.pd-xref.dead{color:var(--pd-sub);cursor:help;border-bottom:1px dotted var(--pd-line2)}/* ── The trail ─────────────────────────────────────────────────────────
     Chrome, so it is transparent and hairlined rather than carded. The last
     crumb is where you are and is not a control. */.pd-trail{display:flex;align-items:center;gap:var(--pd-s2);padding:var(--pd-s2) 0 var(--pd-s2);
  border-bottom:1px solid var(--pd-line);margin-bottom:var(--pd-s3);min-height:30px}.pd-trail-back{flex:none;width:24px;height:24px;display:grid;place-items:center;
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);
  color:var(--pd-sub);font-size:var(--t-base);cursor:pointer;line-height:1}.pd-trail-back:hover{border-color:var(--pd-ink);color:var(--pd-ink)}.pd-crumbs{display:flex;align-items:center;gap:var(--v2-s1h);flex-wrap:wrap;min-width:0}.pd-crumb{font-size:var(--t-sm);color:var(--pd-sub);background:none;border:0;padding:0;
  cursor:pointer;font-family:inherit;white-space:nowrap}.pd-crumb:hover{color:var(--pd-accent-ink);text-decoration:underline}.pd-crumb.here{color:var(--pd-ink);font-weight:600;cursor:default}.pd-crumb-sep{color:var(--pd-sub);font-size:var(--t-sm)}/* Inside an overlay the trail sits in its header, where it must not add a
   second rule under an existing one. */.pd-modal-h .pd-trail,.pd-slide .pd-trail{border-bottom:0;margin:0;padding:0}/* ── Paging the mirror search ─────────────────────────────────────── */.pd-imore{display:flex;align-items:center;gap:var(--pd-s2);padding:var(--pd-s3) 0 0;
  margin-top:var(--pd-s2);border-top:1px solid var(--pd-line)}/* ── Sourcing list: ONE scroll area, not two ──────────────────────────
     The results box had its own max-height and overflow while sitting
     inside the dialog body, which also scrolls. Two nested scrollbars is
     why a fully-loaded 36-row search still felt capped: the outer scroll
     moved the form, the inner one moved six rows at a time, and neither
     took you through the list.

     The inner scroller is removed. The list flows at its natural height
     and the dialog body is the only thing that scrolls — one gesture
     from the first result to the last. The intake dialog is also wider
     and taller than the generic modal, because it is a working surface
     rather than a confirm box. */.pd-iresults{max-height:none;overflow:visible}.pd-isec h5{font-size:var(--t-base);color:var(--pd-ink);
  position:sticky;top:0;z-index:2;background:var(--pd-panel);
  padding:var(--pd-s2) 0;margin:0 0 var(--pd-s2)}.pd-modal.pd-intake{width:min(860px,96vw);max-height:92vh}/* The filters scroll away deliberately. Pinned, they cost ~200px of every
   screen forever — three results' worth — and you set them once per search.
   The count stays pinned instead, because that is the thing you keep
   checking as you scroll. */.pd-intake .pd-isearch{position:static}/* ── Sourcing: the mirror as rows ─────────────────────────────────────
     A grid, per DESIGN.md §4 — entities are rows, and the columns carry
     micro-labels in the header rather than repeating a label per cell. */.pd-srcwrap{display:flex;flex-direction:column;gap:var(--pd-s3)}.pd-srcbar{display:flex;flex-wrap:wrap;gap:var(--pd-s3);align-items:flex-end;
  padding-bottom:var(--pd-s3);border-bottom:1px solid var(--pd-line)}.pd-srcf{display:flex;flex-direction:column;gap:var(--v2-s1);min-width:120px}.pd-srcf.grow{flex:1;min-width:200px}.pd-srcf label{font:700 var(--t-xs)/1 var(--pd-font);letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub)}.pd-srcf select,.pd-srcf input{font-size:var(--t-base);padding:var(--v2-s1h) var(--v2-s2);
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);
  color:var(--pd-ink);font-family:inherit;width:100%}.pd-seg{display:flex;border:1px solid var(--pd-line);border-radius:var(--pd-r1);overflow:hidden}.pd-seg button{font-size:var(--t-sm);padding:var(--v2-s1h) var(--v2-s2);border:0;background:var(--pd-panel);
  color:var(--pd-sub);cursor:pointer;font-family:inherit}.pd-seg button.on{background:var(--pd-ink);color:var(--pd-panel)}.pd-srchead{display:flex;align-items:baseline;gap:var(--pd-s2)}.pd-srchead b{font-size:var(--t-md)}.pd-srchead span{font-size:var(--t-sm);color:var(--pd-sub)}.pd-srclist{display:flex;flex-direction:column}






.pd-srcm{font-size:var(--t-sm);color:var(--pd-sub);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}


/* ── Notes and activity ────────────────────────────────────────────────
     One feed, avatars so a team's entries are scannable, day headings, and
     the composer above it. Per DESIGN.md §4: entities are rows. */.pd-actnew{border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  background:var(--pd-panel);padding:var(--pd-s3);margin-bottom:var(--pd-s4)}.pd-actta{width:100%;border:0;outline:0;resize:vertical;font:inherit;
  font-size:var(--t-base);line-height:1.5;color:var(--pd-ink);background:transparent}.pd-actnew-f{display:flex;align-items:center;justify-content:space-between;
  gap:var(--pd-s3);margin-top:var(--pd-s2);padding-top:var(--pd-s2);
  border-top:1px solid var(--pd-line)}.pd-actfilt{display:flex;flex-wrap:wrap;gap:var(--v2-s1h);margin-bottom:var(--pd-s3)}.pd-actfilt button{font-size:var(--t-sm);padding:var(--v2-s1) var(--v2-s2);border:1px solid var(--pd-line);
  border-radius:var(--pd-rfull);background:var(--pd-panel);color:var(--pd-sub);cursor:pointer;font-family:inherit}.pd-actfilt button.on{background:var(--pd-ink);color:var(--pd-panel);border-color:var(--pd-ink)}.pd-actday{font:700 var(--t-xs)/1 var(--pd-font);letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub);padding:var(--pd-s3) 0 var(--v2-s1h)}.pd-actlist{display:flex;flex-direction:column}.pd-actrow{display:grid;grid-template-columns:28px minmax(0,1fr) 52px;gap:var(--pd-s3);
  align-items:start;padding:var(--v2-s2) 0;border-bottom:1px solid var(--pd-line)}.pd-actrow.pinned{background:var(--pd-bg)}.pd-actav{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;
  background:var(--pd-line2);color:var(--pd-sub);font:700 var(--t-xs)/1 var(--pd-font)}.pd-actbody{display:flex;flex-direction:column;gap:var(--v2-s0);min-width:0}.pd-actmeta{display:flex;align-items:center;gap:var(--v2-s2);flex-wrap:wrap;
  font-size:var(--t-sm);color:var(--pd-sub)}.pd-actmeta b{color:var(--pd-ink);font-weight:600}.pd-actk{font:700 var(--t-xs)/1 var(--pd-font);letter-spacing:.04em;text-transform:uppercase;
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);padding:var(--v2-s0) var(--v2-s1h);color:var(--pd-sub)}.pd-actk.ok{border-color:var(--pd-ok);color:var(--pd-ok)}.pd-acttext{font-size:var(--t-base);line-height:1.55;color:var(--pd-ink);white-space:pre-wrap;
  overflow-wrap:anywhere}.pd-actextra{font-size:var(--t-sm);color:var(--pd-sub)}.pd-actextra i{font-style:normal;font-weight:700;font-size:var(--t-xs);
  text-transform:uppercase;letter-spacing:.04em}.pd-actacts{display:flex;gap:var(--v2-s0);justify-content:flex-end}

/* ── Market pricing ────────────────────────────────────────────────────
     The band as four figures plus one bar. Green is reserved for the
     vendor bars;the band itself is ink,because a price is a fact and not
     a state. Per DESIGN.md §3,semantic colour is never a flood. */
.pd-pxgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--pd-s3);margin:var(--pd-s2) 0}.pd-pxcell{display:flex;flex-direction:column;gap:var(--v2-s0)}.pd-pxcell label{font:700 var(--t-xs)/1 var(--pd-font);letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub)}.pd-pxcell b{font-size:var(--t-lg);color:var(--pd-ink);font-weight:600}.pd-pxcell.mid b{color:var(--pd-accent-ink)}.pd-pxbar{margin:var(--pd-s2) 0 var(--pd-s1)}.pd-pxtrack{position:relative;height:8px;border-radius:var(--pd-r1);background:var(--pd-line2)}.pd-pxiqr{position:absolute;top:0;height:8px;border-radius:var(--pd-r1);background:var(--pd-ink);opacity:.22}.pd-pxmed{position:absolute;top:-3px;width:2px;height:14px;background:var(--pd-accent)}.pd-pxaxis{display:flex;justify-content:space-between;font-size:var(--t-xs);
  color:var(--pd-sub);margin-top:var(--v2-s1)}.pd-pxvhead{display:flex;align-items:baseline;gap:var(--pd-s2);margin-top:var(--pd-s4);
  padding-top:var(--pd-s3);border-top:1px solid var(--pd-line);
  font:600 var(--t-md)/1.2 var(--pd-font);color:var(--pd-ink)}.pd-pxvhead span{font:400 var(--t-sm)/1.4 var(--pd-font);color:var(--pd-sub)}.pd-pxvlist{display:flex;flex-direction:column;gap:var(--v2-s1h);margin-top:var(--pd-s2)}.pd-pxv{display:grid;grid-template-columns:minmax(0,1fr) 120px 64px;gap:var(--pd-s3);align-items:center}.pd-pxvn{display:flex;flex-direction:column;min-width:0}.pd-pxvn b{font-size:var(--t-base);font-weight:600;color:var(--pd-ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pd-pxvn i{font-style:normal;font-size:var(--t-sm);color:var(--pd-sub)}.pd-pxvbarw{height:6px;border-radius:var(--pd-r1);background:var(--pd-line2);overflow:hidden}.pd-pxvbar{display:block;height:6px;border-radius:var(--pd-r1);background:var(--pd-ok)}.pd-pxvt{text-align:right;font-size:var(--t-base);font-weight:600;color:var(--pd-ok)}.pd-pxwarn{margin-top:var(--pd-s3)}.pd-pxacts{display:flex;gap:var(--pd-s2);margin-top:var(--pd-s3)}.pd-seg.sm{margin-left:auto}.pd-seg.sm button{font-size:var(--t-xs);padding:var(--v2-s0) var(--v2-s2)}@media (max-width:760px){.pd-pxgrid{grid-template-columns:repeat(2,minmax(0,1fr))}.pd-pxv{grid-template-columns:minmax(0,1fr) 64px}.pd-pxvbarw{display:none} }/* ── The response builder ──────────────────────────────────────────────
     Sections are rows that open. Per DESIGN.md §4 there is no card inside a
     card — the section is a hairlined block, not a panel. */.pd-cmpkinds{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));
  gap:var(--pd-s3);margin-top:var(--pd-s3)}.pd-cmpkind{display:flex;flex-direction:column;gap:var(--v2-s1);align-items:flex-start;text-align:left;
  padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  background:var(--pd-panel);cursor:pointer;font:inherit}.pd-cmpkind:hover{border-color:var(--pd-ink)}.pd-cmpkind b{font-size:var(--t-md);color:var(--pd-ink)}.pd-cmpkind span{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.5}.pd-cmpkind i{font-style:normal;font:700 var(--t-xs)/1 var(--pd-font);letter-spacing:.05em;
  text-transform:uppercase;color:var(--pd-sub);margin-top:var(--v2-s0)}.pd-cmpacts{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;
  margin:var(--pd-s3) 0;padding-bottom:var(--pd-s3);border-bottom:1px solid var(--pd-line)}.pd-cmplist{display:flex;flex-direction:column}.pd-cmps{padding:var(--pd-s3) 0;border-bottom:1px solid var(--pd-line)}.pd-cmps-h{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap}.pd-cmps-h b{font-size:var(--t-md);color:var(--pd-ink)}.pd-cmps-a{margin-left:auto;display:flex;gap:var(--v2-s1)}.pd-cmps-f{display:flex;gap:var(--pd-s2);margin-top:var(--pd-s2)}.pd-cmpempty{font-size:var(--t-sm);color:var(--pd-sub);margin:var(--v2-s1h) 0 0;line-height:1.5}.pd-cmpbody{font-size:var(--t-base);line-height:1.65;color:var(--pd-ink);white-space:pre-wrap;
  margin-top:var(--pd-s2);padding-left:var(--pd-s3);border-left:2px solid var(--pd-line2);
  overflow-wrap:anywhere}.pd-cmpgate{font-size:var(--t-sm);color:var(--pd-sub);font-style:italic;margin:var(--v2-s1h) 0 0;
  padding-left:var(--pd-s3)}.pd-cmpwarn{font-size:var(--t-sm);color:var(--pd-bad);margin:var(--v2-s1h) 0 0;line-height:1.5}.pd-cmpta{width:100%;margin-top:var(--pd-s2);border:1px solid var(--pd-line);
  border-radius:var(--pd-r1);padding:var(--pd-s3);font:inherit;font-size:var(--t-base);
  line-height:1.6;color:var(--pd-ink);background:var(--pd-panel);resize:vertical}/* ── The library: readable documents, grouped ─────────────────────── */.pb-libgrp{margin-top:var(--pd-s3);padding-top:var(--pd-s3);border-top:1px solid var(--pd-line)}.pb-libgrp:first-of-type{border-top:0;padding-top:0}.pb-libh{display:flex;align-items:baseline;gap:var(--pd-s2);margin-bottom:var(--pd-s2)}.pb-libh b{font-size:var(--t-md);color:var(--pd-ink)}.pb-libh span{font-size:var(--t-sm);color:var(--pd-sub)}
.pb-librow{display:flex;align-items:center;gap:var(--v2-s1h);text-align:left;padding:var(--v2-s1h) var(--v2-s2);
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);
  cursor:pointer;font:inherit;min-width:0}.pb-librow:hover{border-color:var(--pd-accent)}.pb-libt{font-size:var(--t-base);color:var(--pd-ink);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;flex:1}/* Past performance records in Settings */


/* Pricing panel: stop the header toggle clipping and the labels wrapping —
   the two defects visible in the operator's own screenshot. */.pd-panel h4{display:flex;align-items:center;gap:var(--v2-s1h);flex-wrap:wrap}.pd-seg.sm{flex:none}.pd-pxcell label,.pd-pxcell em{white-space:nowrap}.pd-pxcell em{font-style:normal;font-size:var(--t-xs);color:var(--pd-sub)}.pd-pxvhead{flex-wrap:wrap}/* ── forecasts ─────────────────────────────────────────────────────────
   The derived candidates sit in a bordered well, visually apart from the
   forecasts table below them, because they are not forecasts yet — they are
   an inference waiting for somebody to agree with it. */.fc-find{display:flex;align-items:center;gap:var(--pd-s2);flex-wrap:wrap;margin:var(--pd-s2) 0}.fc-naics{width:150px;padding:var(--v2-s1h) var(--pd-s3);font:inherit;font-size:var(--t-sm);
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);color:var(--pd-ink)}.fc-find select{padding:var(--v2-s1h) var(--pd-s2);font:inherit;font-size:var(--t-sm);
  border:1px solid var(--pd-line);border-radius:var(--pd-r1);background:var(--pd-panel);color:var(--pd-ink)}.fc-cand{margin:var(--pd-s3) 0;padding:var(--pd-s3);border:1px solid var(--pd-accent);
  border-radius:var(--pd-r2);background:var(--pd-accent-soft)}.fc-cand .sope-score{background:var(--pd-panel)}.sope-score tr.dim td{opacity:.55}/* ── the gate, redesigned ──────────────────────────────────────────────
   Two panes when there is an SOP behind the move: the procedure on the left,
   what to record on the right. The operator dragging a card to the next
   column is the person who most needs the step's rules, and until now that
   was the one moment they were invisible. One pane still, for the gates with
   no SOP behind them — a second would be furniture. */.pd-modal.pd-gate2{width:min(940px,96vw)}.pd-gatebody{display:flex;flex:1;min-height:0;overflow:hidden}.pd-gatebody.ro{opacity:.55;pointer-events:none}.pd-gatepane{flex:1;min-width:0}.pd-gatesop{flex:0 0 42%;max-width:390px;overflow-y:auto;padding:var(--pd-s4) var(--pd-s5);
  border-right:1px solid var(--pd-line);background:var(--pd-bg)}@media (max-width:820px){.pd-gatebody{flex-direction:column;overflow-y:auto}.pd-gatesop{flex:none;max-width:none;border-right:0;border-bottom:1px solid var(--pd-line)}
}.pd-movechip{display:inline-flex;align-items:center;gap:var(--v2-s1h);font-size:var(--t-xs);
  color:var(--pd-sub);background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-rfull)}.pd-movechip i{font-style:normal;color:var(--pd-sub)}.pd-movechip b{color:var(--pd-ink)}.pd-panehead{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub);margin-bottom:var(--pd-s3);display:flex;align-items:baseline;gap:var(--pd-s2)}.pd-gsec{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-sub);margin:var(--pd-s4) 0 var(--pd-s2);display:flex;align-items:center;gap:var(--pd-s2)}.pd-gsec:first-of-type{margin-top:0}.pd-gsec.bad{color:var(--pd-bad)}.pd-gsec.warn{color:var(--pd-warn)}.pd-gcount{font-size:var(--t-xs);font-weight:600;color:var(--pd-sub);
  background:var(--pd-line2);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-rfull)}.pd-gcount.ok{color:var(--pd-ok,var(--pd-ok))}.pd-gchks{display:flex;flex-direction:column;gap:var(--v2-s0)}.pd-gchk{display:flex;align-items:flex-start;gap:var(--v2-s2);padding:var(--v2-s1) var(--v2-s1h);border:0;border-radius:var(--pd-r1);
  background:none;font:inherit;font-size:var(--t-sm);text-align:left;cursor:pointer;color:var(--pd-sub);
  line-height:1.45}.pd-gchk:hover{background:var(--pd-line2)}.pd-gchk i{flex:none;width:16px;height:16px;margin-top:var(--v2-s0);border:1px solid var(--pd-line);
  border-radius:var(--pd-r1);font-style:normal;font-size:var(--t-xs);line-height:14px;text-align:center;
  background:var(--pd-panel);color:transparent}.pd-gchk.on i{background:var(--pd-accent-ink);border-color:var(--pd-accent-ink);color:var(--v2-bg)}.pd-gchk.on span{color:var(--pd-ink)}.pd-gchk.locked{opacity:.65}.pd-gchk em{font-style:normal;font-size:var(--t-xs)}.pd-ghint{margin-top:var(--v2-s1h);font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5}.pd-gnever,.pd-gesc{margin:0;padding-left:var(--v2-s4);font-size:var(--t-xs);line-height:1.55}.pd-gnever li{color:var(--pd-bad);margin-bottom:var(--v2-s0)}.pd-gesc li{color:var(--pd-sub);margin-bottom:var(--v2-s0)}.pd-gesc b{color:var(--pd-ink)}/* ── the onboarding walkthrough ────────────────────────────────────────
   An accordion, not a wall: nine steps that each say what you do and what you
   must not, with the SOP that governs them one click away. Collapsed by
   default so the shape of the job is visible before any of the detail. */.tr-list{display:flex;flex-direction:column;gap:var(--v2-s1h)}.tr-step{border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-panel);
  overflow:hidden}.tr-step.on{border-color:var(--pd-accent)}.tr-head{display:flex;align-items:center;gap:var(--pd-s3);width:100%;padding:var(--v2-s3) var(--pd-s4);
  border:0;background:none;font:inherit;text-align:left;cursor:pointer}.tr-head:hover{background:var(--pd-line2)}.tr-n{flex:none;width:22px;height:22px;border-radius:50%;background:var(--pd-line2);
  color:var(--pd-sub);font-size:var(--t-xs);font-weight:700;display:grid;place-items:center}.tr-step.on .tr-n{background:var(--pd-accent-ink);color:var(--v2-bg)}.tr-t{flex:1;font-size:var(--t-base);font-weight:600;color:var(--pd-ink)}.tr-sop{flex:none;font-size:var(--t-xs);font-weight:600;color:var(--pd-accent-ink);
  background:var(--pd-accent-soft);padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-rfull)}.tr-mins{flex:none;font-size:var(--t-xs);color:var(--pd-sub)}.tr-caret{flex:none;width:16px;text-align:center;color:var(--pd-sub);font-size:var(--t-md)}.tr-body{padding:0 var(--pd-s5) var(--pd-s4) 52px;border-top:1px solid var(--pd-line2)}.tr-lead{font-size:var(--t-sm);line-height:1.65;color:var(--pd-sub);margin:var(--pd-s3) 0}.tr-lead b{color:var(--pd-ink)}.tr-sec{font-size:var(--t-xs);font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--pd-sub);margin:var(--pd-s3) 0 var(--v2-s1)}.tr-sec.bad{color:var(--pd-bad)}.tr-does{margin:0;padding-left:var(--v2-s4);font-size:var(--t-sm);line-height:1.6;color:var(--pd-sub)}.tr-does li{margin-bottom:var(--v2-s1)}.tr-never{font-size:var(--t-sm);line-height:1.6;color:var(--pd-bad);margin:0}.tr-gate{margin-top:var(--pd-s3);padding:var(--v2-s2) var(--pd-s3);border-radius:var(--pd-r1);
  background:var(--pd-line2);font-size:var(--t-xs);line-height:1.55;color:var(--pd-sub)}.tr-acts{display:flex;align-items:center;gap:var(--pd-s3);margin-top:var(--pd-s3)}/* ── the script's honesty about what it does not know ──────────────────
   A generic opener reads as though the app worked the trade out. It did not,
   and the operator cannot tell the difference between a thin solicitation and
   an unread one unless the screen says which. */.pd-callgaps{display:flex;flex-direction:column;gap:var(--v2-s0);margin-bottom:var(--pd-s3);
  padding:var(--pd-s3);border:1px solid var(--pd-warn);border-radius:var(--pd-r2);
  background:var(--pd-warn-bg)}.pd-callgaps > b{font-size:var(--t-sm);color:var(--pd-warn)}.pd-callgap{font-size:var(--t-xs);color:var(--pd-sub);line-height:1.5}.pd-callgap i{font-style:normal;font-weight:600;color:var(--pd-ink)}.pd-gap{color:var(--pd-warn)!important;font-weight:600}/* ── the hire details on the invite ─────────────────────────────────── */.cc-hire{margin:var(--pd-s2) 0 var(--pd-s3);padding:var(--pd-s3);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:var(--pd-bg)}.cc-hire .pd-f label i{font-style:normal;color:var(--pd-sub);font-weight:400}/* ── the hire page ─────────────────────────────────────────────────────
   Leads with what is OUTSTANDING, not with what is complete. A new hire
   generates paperwork that arrives over days from several directions, and the
   failure is never dramatic — a tax form nobody chased, an agreement signed
   and not filed, an ID that expired in a drawer. */.ppl-head{display:flex;align-items:flex-start;gap:var(--pd-s3);flex-wrap:wrap;margin-bottom:var(--pd-s3)}.ppl-head h4{margin:0 0 var(--v2-s0)}.ppl-owing{padding:var(--v2-s2) var(--pd-s3);border-radius:var(--pd-r2);background:var(--pd-warn-bg);
  color:var(--pd-warn);font-size:var(--t-sm);line-height:1.55;margin-bottom:var(--pd-s3)}.ppl-clear{padding:var(--v2-s2) var(--pd-s3);border-radius:var(--pd-r2);background:var(--pd-line2);
  color:var(--pd-sub);font-size:var(--t-sm);margin-bottom:var(--pd-s3)}.ppl-sec{font-size:var(--t-xs);font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--pd-sub);margin:var(--pd-s4) 0 var(--pd-s2);padding-top:var(--pd-s3);
  border-top:1px solid var(--pd-line2)}.ppl-sec:first-of-type{border-top:0;padding-top:0}.ppl-st{font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-rfull);
  background:var(--pd-line2);color:var(--pd-sub)}.ppl-st.active{background:var(--pd-accent-soft);color:var(--pd-accent-ink)}.ppl-st.ended{opacity:.6}.ppl-docs{display:flex;flex-direction:column;gap:var(--v2-s1h)}.ppl-doc{padding:var(--pd-s3);border:1px solid var(--pd-line);border-radius:var(--pd-r2)}.ppl-doc.signed,.ppl-doc.received{border-color:var(--pd-line2);background:var(--pd-bg)}.ppl-doc.waived{opacity:.55}.ppl-doc-h{display:flex;align-items:baseline;gap:var(--pd-s2);flex-wrap:wrap}.ppl-doc-h b{font-size:var(--t-sm)}.ppl-dst{font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s1h);border-radius:var(--pd-rfull);
  background:var(--pd-line2);color:var(--pd-sub)}.ppl-dst.ok{background:var(--pd-ok-bg);color:var(--pd-ok,var(--pd-ok))}.ppl-dst.warn{background:var(--pd-warn-bg);color:var(--pd-warn)}.ppl-dst.bad{background:var(--pd-bad-bg);color:var(--pd-bad)}.ppl-doc-f{margin-top:var(--v2-s1);font-size:var(--t-xs);display:flex;gap:var(--pd-s2);align-items:baseline}.ppl-doc-a{display:flex;gap:var(--v2-s1);flex-wrap:wrap;align-items:center;margin-top:var(--v2-s1h)}.ppl-doc-a button,.ppl-up{border:1px solid var(--pd-line);background:none;font:inherit;
  font-size:var(--t-xs);padding:var(--v2-s0) var(--v2-s2);border-radius:var(--pd-rfull);cursor:pointer;color:var(--pd-sub)}.ppl-doc-a button.on{background:var(--pd-ink);border-color:var(--pd-ink);color:var(--v2-bg)}.ppl-up:hover{border-color:var(--pd-accent);color:var(--pd-accent-ink)}.ppl-exp{border:1px solid var(--pd-line);border-radius:var(--pd-rfull);padding:var(--v2-s0) var(--v2-s2);font:inherit;
  font-size:var(--t-xs);background:var(--pd-panel);color:var(--pd-sub)}/* The one warning that is worth repeating on every form it applies to. */.ppl-irs{margin-top:var(--v2-s1h);font-size:var(--t-xs);line-height:1.5;color:var(--pd-warn)}/* ── the agreement ──────────────────────────────────────────────────
   The signature evidence is set in a monospace block rather than reduced to
   a tick, because a tick is a claim and this is the record behind it. */.ppl-sig{margin-top:var(--v2-s2);padding:var(--v2-s2) var(--v2-s2);border-radius:var(--pd-r2);
  background:var(--pd-soft);font-size:var(--t-xs);line-height:1.7;color:var(--pd-sub)}.ppl-sig b{color:var(--pd-ink)}.ppl-sig.unsigned{background:transparent;border:1px dashed var(--pd-line)}.ppl-sha{font-family:ui-monospace,Menlo,monospace;font-size:var(--t-xs);word-break:break-all;
  color:var(--pd-sub);opacity:.75}.ppl-terms{margin:0 0 var(--pd-s3)}.ppl-terms.done{display:flex;gap:var(--pd-s2);align-items:center;font-size:var(--t-xs)}/* An unfilled blank is outlined, not merely empty — the whole point of this
   block is that nobody notices it is empty until a contractor cannot sign. */.ppl-blank{border-color:var(--pd-warn) !important}.ppl-acct{font-size:var(--t-sm);color:var(--pd-sub);line-height:1.7;display:flex;
  gap:var(--pd-s2);flex-wrap:wrap;align-items:baseline}/* The unsigned-agreement bar. Fixed to the bottom and deliberately not
   dismissible: a nudge you can close is a nudge nobody sees twice, and this
   one has to still be there on the day somebody asks why it was never signed. */.cc-nda-bar{position:fixed;left:0;right:0;bottom:0;z-index:60;
  padding:var(--v2-s2) var(--pd-s3);background:var(--pd-warn-bg);color:var(--pd-warn);
  border-top:1px solid var(--pd-warn);font-size:var(--t-xs);line-height:1.5;text-align:center}.cc-nda-bar a{color:inherit;font-weight:700;text-decoration:underline}/* Pulling the registration. The candidate list is buttons rather than a
   dropdown because picking the wrong registration renames the party to a
   legal agreement — each option shows its UEI, CAGE and expiry so the choice
   is made on evidence rather than on a name that two entities may share. */.ppl-sam{margin:0 0 var(--pd-s3);display:flex;gap:var(--pd-s2);align-items:baseline;flex-wrap:wrap}.ppl-sam .pd-hint{flex:1 1 18rem}.ppl-samhits{flex:1 1 100%;display:flex;flex-direction:column;gap:var(--v2-s1);margin-top:var(--v2-s1h)}.ppl-samhits button{text-align:left;background:var(--pd-panel);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);padding:var(--v2-s1h) var(--v2-s2);font:inherit;font-size:var(--t-xs);cursor:pointer;
  display:flex;flex-direction:column;gap:var(--v2-s0);color:var(--pd-ink)}.ppl-samhits button:hover{border-color:var(--pd-accent)}.ppl-samhits i{font-style:italic;color:var(--pd-sub)}

/* ── which tax form they owe ────────────────────────────────────────
   Styled as an open question, not a result. The app has read a country
   field;the question is about citizenship and tax residence,which it has
   not seen. A green tick here would be read as a determination. */
.ppl-tax{margin:0 0 var(--pd-s3);padding:var(--v2-s2) var(--v2-s3);border:1px solid var(--pd-line);
  border-radius:var(--pd-r2);background:var(--pd-soft)}.ppl-tax.done{display:flex;gap:var(--pd-s2);align-items:baseline;flex-wrap:wrap;
  background:transparent;border-style:dashed}.ppl-tax-q{font-weight:700;font-size:var(--t-sm);margin-bottom:var(--v2-s1)}/* The suggestion is outlined, never filled — filled is what "chosen" means. */.ppl-tax-sug{border-style:dashed !important;border-color:var(--pd-accent) !important}.ppl-tax-ask{margin-top:var(--v2-s2);font-size:var(--t-xs);display:flex;gap:var(--v2-s1h);
  align-items:baseline;flex-wrap:wrap}.ppl-taxtext{width:100%;margin-top:var(--v2-s2);font:var(--v2-t-small)/1.6 ui-monospace,Menlo,monospace;
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);padding:var(--v2-s2);background:var(--pd-panel);
  color:var(--pd-ink)}/* The signed date sits BEFORE the expiry and is labelled, because the whole
   trap is people typing the day it arrived into a field that means neither. */.ppl-signed{display:inline-flex;gap:var(--v2-s1);align-items:center;font-size:var(--t-xs);color:var(--pd-sub)}.ppl-signed input{border:1px solid var(--pd-line);border-radius:var(--pd-rfull);padding:var(--v2-s0) var(--v2-s2);
  font:inherit;font-size:var(--t-xs);background:var(--pd-panel);color:var(--pd-sub)}/* ── what a person did themselves ──────────────────────────────────
   Actions, not attendance. A change of circumstances is the only entry that
   asks the reader to do something, so it is the only one with colour. */.ppl-events{display:flex;flex-direction:column;gap:var(--v2-s1);margin-bottom:var(--pd-s3)}.ppl-ev{padding:var(--v2-s1h) var(--v2-s2);border-radius:var(--pd-r2);background:var(--pd-soft);font-size:var(--t-xs)}.ppl-ev-h{display:flex;gap:var(--pd-s2);align-items:baseline;justify-content:space-between;flex-wrap:wrap}.ppl-ev-d{margin-top:var(--v2-s1);color:var(--pd-sub);line-height:1.6}.ppl-ev-d s{opacity:.6}.ppl-ev.circumstances{background:var(--pd-warn-bg);color:var(--pd-warn)}.ppl-ev.circumstances .pd-hint{color:inherit;opacity:.75}

/* ── the team feed ──────────────────────────────────────────────────
   At the bottom of the Action Center by intent. The screen above it is what
   needs a decision today;this is context,and a live feed at the top of a
   decision screen turns the decision screen into a timeline. */
.sope-sec.tf .sope-sec-h{display:flex;align-items:center;gap:var(--pd-s2)}.tf-ctl{margin-left:auto;display:flex;gap:var(--v2-s1);align-items:center;font-weight:400}.tf-ctl button{background:transparent;border:1px solid var(--pd-line);border-radius:var(--pd-rfull);
  padding:var(--v2-s0) var(--v2-s2);font:inherit;font-size:var(--t-xs);cursor:pointer;color:var(--pd-sub)}.tf-ctl button.on{background:var(--pd-ink);border-color:var(--pd-ink);color:var(--v2-bg)}.tf-ctl select{font:inherit;font-size:var(--t-xs);border:1px solid var(--pd-line);
  border-radius:var(--pd-rfull);padding:var(--v2-s0) var(--v2-s2);background:var(--pd-panel);color:var(--pd-sub)}.tf-now{padding:var(--v2-s1h) var(--v2-s2);border-radius:var(--pd-r2);background:var(--pd-soft);
  font-size:var(--t-xs);margin-bottom:var(--v2-s1h)}/* Hours are a strip, not a leaderboard column — the point is the shape of the
   week, not a ranking somebody reads as a score. */.tf-hours{display:flex;gap:var(--pd-s3);flex-wrap:wrap;align-items:baseline;
  font-size:var(--t-xs);color:var(--pd-sub);margin-bottom:var(--v2-s2)}.tf-hours b{color:var(--pd-ink);font-family:ui-monospace,Menlo,monospace}.tf-hours i{opacity:.7}.tf-flag{font-size:var(--t-xs);color:var(--pd-warn);margin-bottom:var(--v2-s1h)}.tf-list{display:flex;flex-direction:column}.tf-row{display:flex;gap:var(--pd-s2);align-items:baseline;padding:var(--v2-s1) 0;
  border-top:1px solid var(--pd-line);font-size:var(--t-xs)}.tf-row.flag{background:var(--pd-warn-bg);margin:0 -var(--v2-s2);padding:var(--v2-s1) var(--v2-s2);border-radius:var(--pd-r2)}.tf-ico{flex:0 0 auto;opacity:.8}.tf-who{flex:0 0 auto;font-weight:700;min-width:6rem}.tf-what{flex:1 1 auto;min-width:0;color:var(--pd-sub);overflow-wrap:anywhere}.tf-what i{opacity:.75}.tf-when{flex:0 0 auto;color:var(--pd-sub);opacity:.8;white-space:nowrap}.tf-more{align-self:flex-start;margin-top:var(--v2-s1h)}/* ── the two unsanctioned public sources ────────────────────────────
   The result count carries the search term back, because a table of
   forecasts with no keyword visible reads like "the forecast" rather than
   like "what matched the word you typed". */.pd-srcmeta{font-size:var(--t-xs);color:var(--pd-sub);margin:var(--pd-s2) 0}
/* ── the registration queue ─────────────────────────────────────────
   A backlog of portals nobody has an account on is the registry's real
   work. It sits above the table because the table answers "what do we
   have" and this answers "what is still to do". */.pt-queue{border:1px solid var(--pd-line);border-radius:var(--pd-r2);
  padding:var(--v2-s2) var(--v2-s3);margin:0 0 var(--pd-s3);background:var(--pd-soft)}.pt-queue-h{display:flex;gap:var(--pd-s2);align-items:baseline;flex-wrap:wrap;font-size:var(--t-sm)}.pt-queue-l{display:flex;flex-direction:column;margin-top:var(--v2-s2)}.pt-queue-r{display:flex;gap:var(--pd-s2);align-items:baseline;flex-wrap:wrap;
  padding:var(--v2-s1h) 0;border-top:1px solid var(--pd-line);font-size:var(--t-xs)}/* Priority is a word, not a colour alone — the queue is read by somebody
   deciding what to do next, and a dot means nothing out of context. */.pt-queue-p{flex:0 0 4.2rem;font-size:var(--t-xs);font-weight:700;text-transform:uppercase;
  letter-spacing:.04em;color:var(--pd-sub)}.pt-queue-r.high .pt-queue-p{color:var(--pd-accent-ink)}.pt-regmodal .pd-modal-b{max-width:34rem}/* ── filling a form ─────────────────────────────────────────────────
   Presented in the same pd-slide panel the solicitation documents use, so
   our own paperwork is shown the way the work is shown. */.cf-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--pd-s2) var(--pd-s3);margin-top:var(--pd-s3)}.cf-f{display:flex;flex-direction:column;gap:var(--v2-s0);min-width:0}.cf-f.full{grid-column:1 / -1}.cf-f label{font-size:var(--t-xs);font-weight:700;color:var(--pd-sub)}.cf-f input,.cf-f select{font:inherit;font-size:var(--t-sm);padding:var(--v2-s1h) var(--v2-s2);
  border:1px solid var(--pd-line);border-radius:var(--pd-r2);background:var(--pd-panel);color:var(--pd-ink);min-width:0}.cf-f input:disabled,.cf-f select:disabled{opacity:.65;cursor:not-allowed}/* A held field is outlined differently because it behaves differently — it
   never leaves the browser, and the screen should not pretend otherwise. */.cf-f.hold input{border-style:dashed;border-color:var(--pd-warn)}.cf-f.hold label i{font-style:normal;font-weight:400;color:var(--pd-warn)}.cf-hint{font-style:normal;font-size:var(--t-xs);line-height:1.45;color:var(--pd-sub);opacity:.85}.cf-open{background:var(--pd-ink);border:1px solid var(--pd-ink);color:var(--v2-bg);border-radius:var(--pd-rfull);
  padding:var(--v2-s0) var(--v2-s2);font:inherit;font-size:var(--t-xs);font-weight:700;cursor:pointer}@media (max-width:640px){.cf-grid{grid-template-columns:minmax(0,1fr)}}/* ══════════════════════════════════════════════════════════════════════
   THE GOVCON HUB LOOK
   Ported from the design system in the GovCon Hub build. The tokens above
   do most of the work — everything in this app already draws from them —
   and what follows is the handful of component treatments that palette
   alone cannot express.
   ══════════════════════════════════════════════════════════════════════ */
/* ── cards lift, they do not glow ────────────────────────────────────
   The source's card-hover is three things together and none of them is a
   shadow you would notice on its own: a one-pixel rise, a slightly
   stronger shadow, and the border picking up the accent. Applied to the
   surfaces that are actually interactive, not to every box. */.pd-panel,.pd-card,.sope-sec,.ppl-doc{
  border-radius:var(--pd-r2);
  box-shadow:var(--pd-sh);
  transition:box-shadow var(--v2-mid),border-color var(--v2-mid),transform var(--v2-mid)}.pd-card:hover{
  box-shadow:var(--pd-sh-lift);
  border-color:var(--pd-accent-line);
  transform:translateY(-1px)}/* Figures are the thing a dashboard is read for, so they get the display
   face and tabular figures — numbers that do not jitter as they update. */.pd-alert b,.sope-stats b,.tf-hours b,.clk-run,.pd-stat b{
  font-family:Poppins,Inter,system-ui,sans-serif;
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}/* ── the accent, now teal ────────────────────────────────────────────
   The primary button stays near-black — that is the source's `primary`,
   and a teal button everywhere would spend the accent on nothing. Teal
   marks state and selection instead, which is where it earns attention. */.pd-btn.accent{background:var(--pd-accent)}.pd-btn.accent:hover{background:hsl(174 60% 39%)}.pd-subtabs button.on{border-bottom-color:var(--pd-accent);color:var(--pd-ink)}.pd-seg button.on,.tf-ctl button.on{background:var(--pd-ink);border-color:var(--pd-ink)}input:focus-visible,select:focus-visible,textarea:focus-visible,button:focus-visible{
  outline:2px solid var(--pd-accent);outline-offset:1px}

/* ── status dots ─────────────────────────────────────────────────────
   Where a dot is genuinely a dot it takes the source's own brighter
   values;the text tokens stay darker for legibility. */
.pd-dot{width:8px;height:8px;border-radius:var(--pd-rfull);display:inline-block;flex:0 0 auto}.pd-dot.ok{background:var(--pd-ok-dot)}.pd-dot.warn{background:var(--pd-warn-dot)}.pd-dot.bad{background:var(--pd-bad-dot)}.pd-dot.info{background:var(--pd-info-dot)}

/* ── the pipeline, in the source's stage language ────────────────────
   Their system names seven stage tints — monitoring, review, go/no-go,
   pursuing, submitted, awarded, not-awarded. Our board has twelve stages,
   so they are mapped onto the same PROGRESSION rather than invented
   afresh: neutral while it is only being looked at, teal once it is being
   worked, blue at submission, green won, red lost. A board where every
   column is a different colour tells you nothing;






/* ── match / fit scores ──────────────────────────────────────────────
   The source scores high/medium/low on the same three hues as status,
   which is right: a score is a judgement and should read like one. */



/* ── page headings ───────────────────────────────────────────────────
   Display face, tight tracking. This is most of what separates the two
   apps visually and it costs one rule. */.v2-pagehead h2,.pd-panel>h4{font-family:Poppins,Inter,system-ui,sans-serif;
  font-weight:700;letter-spacing:-.02em}.v2-pagehead .meta{color:var(--pd-sub);font-weight:400}/* ── SAM exclusions ──────────────────────────────────────────────────
   Four states, and the neutral one is deliberately NOT quiet: "not checked"
   sitting silently next to a green score is how a debarred sub gets onto a
   bid. It reads as an absence, because that is what it is. */.xcl{font-size:var(--t-xs);font-weight:700;border-radius:var(--pd-rfull);padding:var(--v2-s0) var(--v2-s1h);margin-left:var(--v2-s1);
  white-space:nowrap;letter-spacing:.02em;display:inline-block;vertical-align:middle}.xcl.ok{background:var(--pd-ok-bg);color:var(--pd-ok)}.xcl.warn{background:var(--pd-warn-bg);color:var(--pd-warn)}.xcl.bad{background:var(--pd-bad-dot);color:var(--pd-bg)}.xcl.none{background:transparent;border:1px dashed var(--pd-line);color:var(--pd-sub);font-weight:600}/* ── SAM scope test ──────────────────────────────────────────────────
   A scope refusal and an empty result look identical unless the status code
   is shown, so the status code is shown. */








/* ── feed health ─────────────────────────────────────────────────────
   Only unhealthy sources appear. A strip that lists every feed as "ok" is a
   strip people stop reading, and the whole point is to be noticed on the day
   one of them stops. */.pd-feedhealth{display:flex;gap:var(--pd-s2);flex-wrap:wrap;margin:0 0 var(--pd-s3)}.pd-feed{font-size:var(--t-xs);padding:var(--v2-s1) var(--v2-s2);border-radius:var(--pd-r2);
  background:var(--pd-line2);color:var(--pd-sub)}.pd-feed.warn{background:var(--pd-warn-bg);color:var(--pd-warn)}.pd-feed.bad{background:var(--pd-bad-bg);color:var(--pd-bad)}/* ── mailboxes ───────────────────────────────────────────────────────
   Two grants, shown as two rows, because the whole point is that they are
   separable — one can be revoked without costing the other. */


/* ── state solicitation boards ───────────────────────────────────────
   Own layout rather than borrowing BidMatch's, which is scoped to its own
   container and collapsed the moment these rows were rendered anywhere else.
   Closed and awarded notices stay visible but recede — knowing a thing closed
   last week is how you learn a buyer's cadence. */.st-row{display:flex;gap:var(--pd-s3);align-items:baseline;flex-wrap:wrap;
  padding:var(--v2-s2) var(--v2-s3);border-bottom:1px solid var(--pd-line);font-size:var(--t-sm)}.st-row:hover{background:var(--pd-line2)}.st-row.done{opacity:.55}.st-main{flex:1 1 22rem;min-width:0;display:flex;flex-direction:column;gap:var(--v2-s0)}.st-main b{font-weight:600;line-height:1.35}.st-meta{font-size:var(--t-xs);color:var(--pd-sub)}.st-status{flex:0 0 auto;font-size:var(--t-xs);font-weight:600;padding:var(--v2-s0) var(--v2-s2);
  border-radius:var(--pd-rfull);background:var(--pd-line2);color:var(--pd-sub);white-space:nowrap}.st-status.live{background:var(--pd-accent-soft);color:var(--pd-accent-ink)}/* The deadline is the number people scan for, so it is monospaced and fixed
   width — a column of dates that jitters is a column nobody scans. */.st-due{flex:0 0 8.5rem;font-family:"JetBrains Mono",ui-monospace,monospace;
  font-size:var(--t-xs);font-variant-numeric:tabular-nums;text-align:right}.st-due i{display:block;font-style:normal;opacity:.7}
