/* ===========================================================================
   THE FINDER, as a market command centre.
   ---------------------------------------------------------------------------
   Josh's Federal Finder specification, sections 6, 7, 49 and 79-95. A scoped
   stylesheet on the pattern assets/workspace.css set for the Tracker: the
   Finder stopped being a document with filters on top and became an
   application, and an application wants its own sheet rather than four hundred
   more lines bolted to the end of the shared one.

   WHAT THE MOCKUP GAVE AND WHAT IT DID NOT. The three-column shell, the six
   interactive highlights, the fact-row card and the right intelligence rail
   are Josh's structure and are followed closely. The look is not: the drawing
   is a generic dark dashboard with pastel icon tiles and lozenge buttons, and
   section 4 is explicit that "Finder should not become a generic white
   government search portal" - the same argument applies to a generic dark one.
   So every surface here is the house language already in assets/style.css:
   Archivo display numerals, mono uppercase keys, the brand green, steel for
   the contract half, hairline borders, no icon tiles.

   NAMESPACE. `fx-` for everything new, so the existing `gf-` rules stay
   readable and a future reader can see at a glance which half of the board
   they are editing.
   =========================================================================== */

/* --------------------------------------------------------------- the shell */
/* Three columns on a wide screen, two when the intelligence rail has nowhere
   to go, one on a tablet. The right rail is the first to leave because it is
   the only column that is explicitly optional - section 21: it "should
   disappear when it has nothing useful to say". */
/* THE BREAKPOINTS ARE MEASURED, not guessed. NEXT-SESSION.md records the
   universal search shipping a result column starved to 37 pixels because it
   was checked at 1444 and used at 1344. Three columns need 250 + 260 of rail
   plus two 20px gaps, so the centre column keeps 730px at 1280 and 470px at
   1040 - both comfortably above the width at which a card title starts setting
   one character per line. Below 1280 the intelligence rail goes first, because
   section 21 makes it the one explicitly optional column. */
.fx-shell{
  display:grid;
  grid-template-columns:262px minmax(0,1fr) 272px;
  gap:20px;align-items:start;margin-top:22px;
}
@media (max-width:1440px){ .fx-shell{grid-template-columns:250px minmax(0,1fr) 260px} }
@media (max-width:1279px){ .fx-shell{grid-template-columns:250px minmax(0,1fr)} .fx-rail{display:none} }
@media (max-width:1040px){ .fx-shell{grid-template-columns:minmax(0,1fr)} }

.fx-col{min-width:0}

/* ------------------------------------------------------ the six highlights */
/* Section 8: "The top cards should be interactive views, not decorative KPIs.
   Clicking any card applies a visible filter and updates the results below."
   They are <button>s for that reason, and they carry aria-pressed so a screen
   reader gets the same fact the green edge gives a sighted reader. */
.fx-hi{
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr));
  gap:10px;margin:20px 0 0;
}
@media (max-width:1240px){ .fx-hi{grid-template-columns:repeat(3,minmax(0,1fr))} }
@media (max-width:660px){ .fx-hi{grid-template-columns:repeat(2,minmax(0,1fr))} }
/* Inside the centre column since 2026-09-07 (the cards sit under the search
   and filters now, not above the scope switch): six across is too tight for
   a column, so three across at every width above a phone, where the 660px
   rule above still takes it to two. */
.fx-col > .fx-hi{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:16px}
.fx-col > #gf-coverage{margin-top:10px}

.fx-hicard{
  position:relative;display:flex;flex-direction:column;gap:3px;
  text-align:left;font:inherit;cursor:pointer;
  background:var(--panel);border:1px solid var(--panel-line);
  border-radius:var(--r);padding:14px 14px 13px;
  transition:transform .16s var(--ease),border-color .16s var(--ease),box-shadow .16s var(--ease);
}
.fx-hicard:hover{transform:translateY(-2px);border-color:var(--panel-line-strong);box-shadow:var(--shadow-md)}
.fx-hicard:focus-visible{outline:2px solid var(--green-400);outline-offset:3px}
.fx-hicard .k{
  font-family:var(--f-mono);text-transform:uppercase;font-size:9.5px;font-weight:600;
  letter-spacing:.11em;color:var(--on-navy-mute);line-height:1.35;
}
.fx-hicard .v{
  font-family:var(--f-display);font-size:clamp(21px,2.1vw,29px);font-weight:800;
  font-stretch:104%;line-height:1;color:#fff;font-variant-numeric:tabular-nums;
  margin:3px 0 1px;
}
.fx-hicard .n{font-size:11px;color:var(--on-navy-mute);line-height:1.4}
/* The delta is the whole reason a return visit means anything, so it sits on
   the same line as the figure rather than under the caption. */
.fx-hicard .d{
  font-family:var(--f-mono);font-size:10.5px;font-weight:600;
  color:var(--green-400);margin-left:7px;letter-spacing:.02em;
}
.fx-hicard .d.down{color:var(--on-navy-mute)}

/* On = this card's filter is currently applied. A green edge AND the pressed
   state AND the word "on" in the caption: section 32 forbids colour as the
   only indicator. */
.fx-hicard[aria-pressed="true"]{
  border-color:var(--green-500);
  background:radial-gradient(120% 130% at 50% -20%, rgba(121,185,40,.15), transparent 70%),var(--panel);
}
.fx-hicard[aria-pressed="true"] .v{color:var(--green-400)}
.fx-hicard[aria-pressed="true"] .k{color:var(--green-400)}

.fx-hicard.grant[aria-pressed="true"]{border-color:var(--green-500)}
.fx-hicard.contract[aria-pressed="true"]{
  border-color:var(--steel-500);
  background:radial-gradient(120% 130% at 50% -20%, rgba(143,182,224,.15), transparent 70%),var(--panel);
}
.fx-hicard.contract[aria-pressed="true"] .v,
.fx-hicard.contract[aria-pressed="true"] .k{color:var(--steel-400)}
.fx-hicard.urgent[aria-pressed="true"]{
  border-color:var(--danger-300);
  background:radial-gradient(120% 130% at 50% -20%, rgba(214,69,58,.16), transparent 70%),var(--panel);
}
.fx-hicard.urgent[aria-pressed="true"] .v,
.fx-hicard.urgent[aria-pressed="true"] .k{color:var(--danger-300)}

/* A highlight we cannot compute yet still occupies its slot and says why.
   Section 31 and the house rule for a declared skeleton: the mechanism is
   real, renders, and states what it is missing. */
.fx-hicard.pending{cursor:default;opacity:.72}
.fx-hicard.pending:hover{transform:none;box-shadow:none;border-color:var(--panel-line)}
.fx-hicard.pending .v{font-size:18px;color:var(--on-navy-soft);font-stretch:100%}
.fx-hicard .await{
  font-family:var(--f-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--gold-500);margin-top:5px;
}

/* --------------------------------------------------------- the result card */
.fx-card{
  position:relative;background:var(--panel);border:1px solid var(--panel-line);
  border-radius:var(--r);padding:16px 18px 14px;margin:0 0 12px;
  border-left:3px solid var(--steel-500);
}
.fx-card.s-g{border-left-color:var(--green-500)}
.fx-card.s-f{border-left-color:var(--gold-500)}
.fx-card.is-closed{opacity:.62}
.fx-card:hover{border-color:var(--panel-line-strong)}

.fx-top{display:flex;gap:14px;align-items:flex-start;justify-content:space-between}
.fx-id{min-width:0;flex:1 1 auto}
.fx-id h3{
  font-family:var(--f-display);font-size:17px;font-weight:700;font-stretch:102%;
  line-height:1.3;margin:0 0 4px;color:#fff;
}
.fx-id h3 a{color:inherit;text-decoration:none}
.fx-id h3 a:hover{color:var(--green-400);text-decoration:underline;text-underline-offset:3px}
.fx-buyer{
  margin:0;font-size:12.5px;color:var(--on-navy-soft);line-height:1.45;
  display:flex;flex-wrap:wrap;gap:6px;align-items:center;
}
.fx-buyer .off{color:var(--on-navy-mute)}

/* The deadline block. Two lines: the date, and how long that leaves. A
   countdown alone makes a reader do arithmetic to diary it; a date alone makes
   them do arithmetic to feel it. */
.fx-due{
  flex:none;text-align:right;border:1px solid var(--panel-line-strong);
  border-radius:var(--r-sm);padding:7px 11px;min-width:118px;
}
.fx-due .dt{font-family:var(--f-mono);font-size:11.5px;font-weight:600;color:#fff;white-space:nowrap}
.fx-due .lf{font-family:var(--f-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--on-navy-mute);margin-top:3px}
.fx-due.crit{border-color:rgba(242,148,140,.5);background:rgba(214,69,58,.12)}
.fx-due.crit .dt,.fx-due.crit .lf{color:var(--danger-300)}
.fx-due.warn{border-color:rgba(232,163,61,.45);background:rgba(232,163,61,.10)}
.fx-due.warn .dt,.fx-due.warn .lf{color:var(--gold-300)}
.fx-due.rolling .dt{color:var(--on-navy-soft)}

/* ------------------------------------------------------------- fact rows */
/* Section 80's primary and secondary fact rows. Mono uppercase key over the
   value is the board's existing idiom and it happens to be exactly what the
   mockup draws, so this is one place the two agree. */
.fx-facts{
  display:flex;flex-wrap:wrap;gap:5px 24px;margin:12px 0 0;
  padding-top:11px;border-top:1px solid rgba(255,255,255,.07);
}
.fx-fact{min-width:0}
.fx-fact .k{
  font-family:var(--f-mono);text-transform:uppercase;font-size:9px;font-weight:600;
  letter-spacing:.11em;color:var(--on-navy-mute);display:block;line-height:1.5;
}
.fx-fact .v{font-size:12.5px;color:var(--on-navy);line-height:1.45}
.fx-fact .v .code{font-family:var(--f-mono);font-weight:600;color:#fff;margin-right:5px}
.fx-fact .v .gloss{color:var(--on-navy-soft)}
/* Section 82: missing data must never carry the weight of a confirmed fact. */
.fx-fact .v.none{color:var(--on-navy-mute);font-style:italic}
.fx-fact.money .v{font-family:var(--f-mono);font-weight:600;color:#fff;font-variant-numeric:tabular-nums}
.fx-fact.grow{margin-left:auto;text-align:right}

/* The lifecycle strip and the New chip, from Josh's short-view mockup. */
.fx-stage{display:inline-flex;gap:3px;margin-left:8px;vertical-align:middle;cursor:help}
.fx-stage i{display:block;width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.14)}
.fx-stage i.done{background:rgba(255,255,255,.5)}
.fx-stage i.now{background:var(--green-400);box-shadow:0 0 0 2px rgba(121,185,40,.3)}
.fx-new{display:inline-block;font-family:var(--f-mono);font-size:9px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--green-400);border:1px solid rgba(148,213,60,.55);border-radius:3px;
  padding:1px 5px;margin-right:2px;vertical-align:1px}

/* ------------------------------------------------ the triage table view */
/* Josh's short view: eleven columns, one row per notice, scanned top to
   bottom. Wider than the results column on most desks, so it scrolls inside
   its own frame with the header and the title column pinned. */
.gf-view{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--panel-line);border-radius:999px;background:rgba(255,255,255,.03)}
.gf-view button{font:600 11px var(--f-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--on-navy-mute);
  background:none;border:0;border-radius:999px;padding:6px 12px;cursor:pointer;transition:color .15s,background .15s}
.gf-view button[aria-pressed="true"]{background:var(--green-500);color:#08111e}
.gf-view button:not([aria-pressed="true"]):hover{color:#fff}
.gf-view button:focus-visible{outline:none;box-shadow:var(--ring)}
.fx-tablewrap{overflow:auto;border:1px solid var(--panel-line);border-radius:var(--r);background:var(--panel-solid);
  max-height:calc(100vh - 120px);scrollbar-width:thin}
.fx-table{border-collapse:separate;border-spacing:0;width:100%;min-width:1240px;font-size:12.5px;line-height:1.4}
.fx-table th{position:sticky;top:0;z-index:3;background:#122540;text-align:left;font:600 9.5px var(--f-mono);letter-spacing:.11em;
  text-transform:uppercase;color:var(--on-navy-mute);padding:10px 12px;border-bottom:1px solid var(--panel-line-strong);white-space:nowrap}
.fx-table td{padding:9px 12px;border-bottom:1px solid rgba(255,255,255,.07);vertical-align:top;color:var(--on-navy);min-width:0}
.fx-table tr:last-child td{border-bottom:0}
.fx-table tbody tr{transition:background .15s}
.fx-table tbody tr:hover td{background:rgba(255,255,255,.035)}
.fx-table tr.is-picked td{background:rgba(121,185,40,.07)}
.fx-table th.c-opp,.fx-table td.c-opp{position:sticky;left:0;z-index:2;background:var(--panel-solid);min-width:300px;max-width:360px;
  box-shadow:1px 0 0 var(--panel-line)}
.fx-table th.c-opp{z-index:4;background:#122540}
.fx-table tbody tr:hover td.c-opp{background:#13273f}
.fx-table td .opp{display:flex;gap:8px;align-items:flex-start}
.fx-table td .opp .gf-pick{margin-top:2px}
.fx-table td .opp .gf-star{flex:none;margin-top:-2px}
.fx-table td .opp b{display:block;font-weight:600;color:#fff;line-height:1.35;overflow-wrap:anywhere}
.fx-table td .opp b a{color:inherit;text-decoration:none}
.fx-table td .opp b a:hover{color:var(--green-400);text-decoration:underline;text-underline-offset:3px}
.fx-table td .sub{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;margin-top:4px;font-size:11px;color:var(--on-navy-mute)}
.fx-table td .sub .num{font-family:var(--f-mono);font-size:10.5px;letter-spacing:.03em}
.fx-table td .sub .fx-chip{padding:2px 7px;font-size:9px}
.fx-table td.c-ag b{display:block;font-weight:600;color:var(--on-navy)}
.fx-table td.c-ag .sub{display:block;margin-top:2px}
.fx-table td.c-type b{display:block;font-weight:600;color:var(--on-navy)}
.fx-table td.c-type .fx-stage{margin:6px 0 0}
.fx-table td.c-type .sub{display:block;margin-top:2px}
.fx-table td.c-dates .p{display:block;font-size:11px;color:var(--on-navy-mute);white-space:nowrap}
.fx-table td.c-dates .d{display:block;font-family:var(--f-mono);font-weight:600;color:#fff;white-space:nowrap;margin-top:2px}
.fx-table td.c-dates .l{display:block;font:600 10px var(--f-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--on-navy-mute);margin-top:2px;white-space:nowrap}
.fx-table td.c-dates .l.crit{color:var(--danger-300)}
.fx-table td.c-dates .l.warn{color:var(--gold-300)}
.fx-table td.c-val{font-family:var(--f-mono);font-weight:600;color:#fff;white-space:nowrap;font-variant-numeric:tabular-nums}
.fx-table td .none{color:var(--on-navy-mute);font-style:italic;font-weight:400;font-family:var(--f-body)}
.fx-tfit{display:inline-block;padding:3px 8px;border-radius:999px;font:600 10px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;
  border:1px solid var(--panel-line-strong);color:var(--on-navy-soft);white-space:nowrap;cursor:help}
.fx-tfit.is-strong{border-color:rgba(148,213,60,.55);color:var(--green-400);background:rgba(121,185,40,.12)}
.fx-tfit.is-some{border-color:rgba(232,163,61,.5);color:var(--gold-300)}
.fx-tfit.is-out{opacity:.6}
.fx-table td.c-inc a{color:var(--green-400);text-decoration:none;white-space:nowrap;border-bottom:1px dotted rgba(148,213,60,.5)}
.fx-table td.c-inc a:hover{color:#fff}
.fx-table td.c-codes{max-width:230px}
.fx-table td.c-codes .pair{display:flex;gap:7px;align-items:baseline;white-space:nowrap;overflow:hidden;max-width:210px;cursor:help}
.fx-table td.c-codes .pair + .pair{margin-top:3px}
.fx-table td.c-codes .code{flex:none;font-family:var(--f-mono);font-weight:600;color:#fff}
.fx-table td.c-codes .gl{font-size:11px;color:var(--on-navy-mute);overflow:hidden;text-overflow:ellipsis;min-width:0}
.fx-table td.c-set,.fx-table td.c-loc{white-space:nowrap}
.fx-table td.c-new{white-space:nowrap;color:var(--on-navy-soft)}
.fx-legend{display:flex;flex-wrap:wrap;gap:8px 22px;margin:10px 2px 0;font-size:11.5px;color:var(--on-navy-mute);align-items:center}
.fx-legend span{display:inline-flex;align-items:center;gap:7px}
.fx-legend .fx-stage{margin:0}
.fx-legend .lg-star{color:var(--gold-500);font-size:13px}
.fx-legend .lg-note{margin-left:auto;font-style:italic}
@media (max-width:1040px){.fx-tablewrap{max-height:none}}
/* Table mode gives the results the rail's width. */
.is-table .fx-shell{grid-template-columns:262px minmax(0,1fr)}
.is-table .fx-rail{display:none}
@media (max-width:1440px){.is-table .fx-shell{grid-template-columns:250px minmax(0,1fr)}}
@media (max-width:1040px){.is-table .fx-shell{grid-template-columns:minmax(0,1fr)}}

/* A location whose own source fields disagree. Section 76: show the conflict,
   never a corrected place we invented. */
.fx-conflict{
  color:var(--gold-300);border-bottom:1px dotted var(--gold-500);cursor:help;
}

/* ------------------------------------------------------------ the chips */
.fx-chips{display:flex;flex-wrap:wrap;gap:6px;margin:11px 0 0;align-items:center}
.fx-chip{
  font-family:var(--f-mono);font-size:10px;font-weight:600;letter-spacing:.05em;
  text-transform:uppercase;padding:3.5px 8px;border-radius:999px;
  border:1px solid var(--panel-line-strong);color:var(--on-navy-soft);
  background:rgba(255,255,255,.045);white-space:nowrap;
}
.fx-chip.cat{border-color:rgba(148,213,60,.42);color:var(--green-400);background:rgba(121,185,40,.10);cursor:help}
.fx-chip.cat.secondary{border-style:dashed;opacity:.85}
.fx-chip.set{border-color:rgba(148,213,60,.42);color:var(--green-400)}
.fx-chip.set.open{border-color:var(--panel-line-strong);color:var(--on-navy-soft)}
.fx-chip.src{border-color:rgba(143,182,224,.45);color:var(--steel-400)}
.fx-chip.src.s-g{border-color:rgba(148,213,60,.45);color:var(--green-400)}
.fx-chip.src.s-f{border-color:rgba(232,163,61,.45);color:var(--gold-300)}
/* Section 82, verbatim: "UNCATEGORIZED should not appear as a normal
   category." It is a gap in our classification, not a class of work, and it
   now looks like one. */
.fx-chip.gap{
  border-style:dashed;border-color:rgba(255,255,255,.20);
  color:var(--on-navy-mute);background:none;text-transform:none;
  font-family:var(--f-body);letter-spacing:0;font-weight:400;font-size:10.5px;
}
.fx-chip.risk{border-color:rgba(232,163,61,.5);color:var(--gold-300)}
.fx-chip.grade{border-color:var(--panel-line-strong);color:var(--on-navy-soft)}
.fx-chip.pending{border-style:dashed;color:var(--on-navy-mute);text-transform:none;
  font-family:var(--f-body);letter-spacing:0;font-weight:400}

/* ------------------------------------------------------- the two verdicts */
/* "Why this matches you" and "Who already wins this work" are the two lines
   that make this a CounterPivot card rather than a reprint of a notice, so
   they share a treatment and sit together above the footer. */
.fx-say{
  display:flex;gap:9px;align-items:baseline;margin:10px 0 0;
  font-size:12.5px;line-height:1.5;color:var(--on-navy-soft);
}
.fx-say .lbl{
  flex:none;font-family:var(--f-mono);text-transform:uppercase;font-size:9px;
  font-weight:600;letter-spacing:.11em;color:var(--on-navy-mute);padding-top:2px;
}
.fx-say .body{min-width:0;flex:1 1 auto;display:block}
/* Once the contract-record answer arrives the row stops being a label and a
   sentence and becomes a label and a panel, so it stacks. Left as a flex row it
   rendered a block inside an inline span and floated over the description. */
.fx-say.has-panel{flex-direction:column;gap:6px}
.fx-card .cp-empty{padding:13px 14px;margin:2px 0 0;font-size:12.5px}
.fx-card .cp-empty-h{font-size:13.5px;margin-bottom:7px}
.fx-card .mk-stats{display:flex;flex-wrap:wrap;gap:10px 18px;margin:4px 0 8px}
.fx-card .mk-top{margin:6px 0 0}
.fx-say.match .lbl{color:var(--green-400)}
.fx-win .name{
  display:inline-block;font-family:var(--f-mono);font-size:11px;font-weight:600;
  color:#fff;background:rgba(255,255,255,.07);border:1px solid var(--panel-line);
  border-radius:var(--r-sm);padding:2px 7px;margin:0 5px 4px 0;
}
.fx-win .none{color:var(--on-navy-mute);font-style:italic}
/* Section 88: "The UI must state which level produced the result." */
.fx-win .level{
  display:block;font-family:var(--f-mono);font-size:9.5px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--on-navy-mute);margin-top:3px;
}
.fx-winbtn{
  font:inherit;font-size:12px;cursor:pointer;background:none;padding:0;
  border:0;border-bottom:1px dashed var(--panel-line-strong);color:var(--on-navy-soft);
}
.fx-winbtn:hover{color:var(--green-400);border-bottom-color:var(--green-400)}

/* ---------------------------------------------------------- the footer */
.fx-foot{
  display:flex;flex-wrap:wrap;gap:8px;align-items:center;
  margin:13px 0 0;padding-top:11px;border-top:1px solid rgba(255,255,255,.07);
}
.fx-meta{
  font-family:var(--f-mono);font-size:10.5px;color:var(--on-navy-mute);
  margin-right:auto;display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;min-width:0;
}
.fx-meta a{color:var(--on-navy-soft)}
.fx-act{
  font-family:inherit;font-size:11.5px;font-weight:600;cursor:pointer;
  padding:6px 11px;border-radius:var(--r-sm);white-space:nowrap;
  border:1px solid var(--panel-line-strong);background:rgba(255,255,255,.05);
  color:var(--on-navy);text-decoration:none;display:inline-flex;align-items:center;gap:6px;
}
.fx-act:hover{border-color:var(--green-400);color:#fff}
.fx-act.primary{background:var(--green-500);border-color:var(--green-500);color:#08172A}
.fx-act.primary:hover{background:var(--green-400);border-color:var(--green-400)}
.fx-act.on{background:var(--green-400);border-color:var(--green-400);color:#08172A}
.fx-act[disabled]{opacity:.45;cursor:default}

/* ------------------------------------------------- the intelligence rail */
/* Section 21. Every block here disappears when it has nothing true to say;
   none of them is allowed to render a zero as though it were an answer. */
.fx-rail{position:sticky;top:calc(var(--nav-h) + 14px);display:grid;gap:12px;
  max-height:calc(100dvh - var(--nav-h) - 28px);overflow-y:auto;padding-right:2px}
.fx-block{
  background:var(--panel);border:1px solid var(--panel-line);
  border-radius:var(--r);padding:13px 14px;
}
.fx-block h3{
  font-family:var(--f-mono);text-transform:uppercase;font-size:9.5px;font-weight:600;
  letter-spacing:.12em;color:var(--on-navy-mute);margin:0 0 10px;
}
.fx-block ul{list-style:none;margin:0;padding:0;display:grid;gap:9px}
.fx-block li{font-size:12px;line-height:1.45;color:var(--on-navy-soft)}
.fx-block li b{color:#fff;font-weight:600}
.fx-block .num{
  font-family:var(--f-mono);font-weight:600;color:var(--green-400);
  font-variant-numeric:tabular-nums;
}
.fx-block .sub{display:block;color:var(--on-navy-mute);font-size:11px;margin-top:2px}
.fx-block a.go{
  display:inline-flex;align-items:center;gap:5px;margin-top:11px;
  font-family:var(--f-mono);text-transform:uppercase;font-size:9.5px;font-weight:600;
  letter-spacing:.1em;color:var(--green-400);text-decoration:none;
}
.fx-block a.go:hover{text-decoration:underline;text-underline-offset:3px}
.fx-block .item{display:block;color:var(--on-navy);text-decoration:none}
.fx-block .item:hover{color:var(--green-400)}
.fx-block.await{border-style:dashed}
.fx-block.await p{margin:0;font-size:11.5px;line-height:1.5;color:var(--on-navy-mute)}
.fx-block .tag{
  font-family:var(--f-mono);font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--gold-500);display:block;margin-top:8px;
}

/* --------------------------------------------------------- detail drawer */
/* Section 92: "Clicking the card should preserve the Finder list and open a
   right side panel." Preserving the list is the point - a subscriber
   triaging forty notices must not lose their place to read one. */
.fx-drawer{
  position:fixed;top:0;right:0;bottom:0;width:min(560px,100vw);z-index:120;
  background:var(--panel-solid);border-left:1px solid var(--panel-line-strong);
  box-shadow:-24px 0 60px rgba(0,0,0,.5);
  display:flex;flex-direction:column;
  transform:translateX(100%);transition:transform .22s var(--ease);
}
.fx-drawer.open{transform:none}
.fx-drawer[hidden]{display:none}
.fx-dhead{
  display:flex;gap:12px;align-items:flex-start;justify-content:space-between;
  padding:16px 18px 13px;border-bottom:1px solid var(--panel-line);
}
.fx-dhead h2{font-family:var(--f-display);font-size:17px;font-weight:700;margin:0 0 4px;color:#fff;line-height:1.3}
.fx-dhead p{margin:0;font-size:12px;color:var(--on-navy-soft)}
.fx-dclose{
  flex:none;font:inherit;font-size:20px;line-height:1;cursor:pointer;
  background:none;border:1px solid var(--panel-line);border-radius:var(--r-sm);
  color:var(--on-navy-soft);width:30px;height:30px;
}
.fx-dclose:hover{border-color:var(--green-400);color:#fff}
.fx-dbody{overflow-y:auto;padding:16px 18px 30px;display:grid;gap:18px}
.fx-sec h4{
  font-family:var(--f-mono);text-transform:uppercase;font-size:9.5px;font-weight:600;
  letter-spacing:.12em;color:var(--on-navy-mute);margin:0 0 9px;
}
.fx-sec p{margin:0;font-size:12.5px;line-height:1.6;color:var(--on-navy-soft)}
.fx-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 18px}
/* Above the sticky nav (z-index 100), or the drawer's own title and close
   button render underneath the site header. */
.fx-scrim{position:fixed;inset:0;background:rgba(4,10,20,.55);z-index:119;border:0;padding:0}
.fx-scrim[hidden]{display:none}

/* --------------------------------------------------------- category rail */
/* Section 47: the rail keeps its job as the friendly entry point and gains the
   counts that make it a market summary rather than a list of words. */
.fx-catnote{
  margin:9px 0 0;font-size:10.5px;line-height:1.5;color:var(--on-navy-mute);
  padding-top:9px;border-top:1px solid rgba(255,255,255,.07);
}
.gf-arow .mix{
  font-family:var(--f-mono);font-size:9px;letter-spacing:.05em;
  color:var(--on-navy-mute);margin-left:6px;
}

/* ------------------------------------------------------------ zero state */
/* Section 31: say what was checked and offer a deterministic way out. Never
   "no results" full stop, and never let a shut door read as an empty market. */
.fx-zero{
  border:1px dashed var(--panel-line-strong);border-radius:var(--r);
  padding:22px 20px;text-align:left;
}
.fx-zero h3{font-family:var(--f-display);font-size:17px;margin:0 0 8px;color:#fff}
.fx-zero p{margin:0 0 14px;font-size:13px;line-height:1.6;color:var(--on-navy-soft);max-width:64ch}
.fx-zero .outs{display:flex;flex-wrap:wrap;gap:8px}

/* ------------------------------------------------------- coverage strip */
/* The corpus statistics, demoted from six hero tiles to one line. Section 49
   keeps them - they are honest evidence of scale - and stops them outranking
   the six things a subscriber can actually act on. */
.gf-coverstrip{
  margin:12px 0 0;font-family:var(--f-mono);font-size:11px;letter-spacing:.02em;
  color:var(--on-navy-mute);display:flex;flex-wrap:wrap;gap:5px 9px;align-items:center;
}
.gf-coverstrip b{color:var(--on-navy);font-weight:600;font-variant-numeric:tabular-nums}
.gf-coverstrip .sep{opacity:.4}
.gf-coverstrip a{color:var(--green-400);text-decoration:none;margin-left:4px}
.gf-coverstrip a:hover{text-decoration:underline;text-underline-offset:3px}

/* --------------------------------------------------- certification input */
/* Section 84 needs something to compare a set-aside against, and the profile
   had no field for one. Stated by the member, never verified by us. */
.gf-certs{display:flex;flex-wrap:wrap;gap:7px;margin-top:7px}
.gf-certbox{
  display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  font-size:12px;color:var(--on-navy-soft);
  border:1px solid var(--panel-line);border-radius:999px;padding:5px 10px;
}
.gf-certbox:hover{border-color:var(--green-400);color:#fff}
.gf-certbox input{accent-color:var(--green-500);width:14px;height:14px;cursor:pointer}
.gf-certbox input:checked + span{color:var(--green-400);font-weight:600}

/* ------------------------------------------------------- evidence level */
.fx-win-level{
  margin:10px 0 0;font-size:11.5px;line-height:1.55;color:var(--on-navy-mute);
  border-left:2px solid var(--panel-line-strong);padding-left:10px;
}

/* The star and the select box sit in the card head now rather than a row of
   their own, so they need to stop stretching to the head's full height. */
.fx-top .gf-star{align-self:flex-start}
.fx-foot .gf-pick{margin-right:2px}
.fx-card .gf-size,.fx-card .gf-fit{margin-top:11px}
.fx-card .gf-desc{font-size:12.5px;margin-top:11px}

/* -------------------------------------------------- broader category matches */
/* Section 63's Supporting band, 0.25 to 0.39: real relationships that are not
   strong enough to put a record in a category by default. Kept in `arb` so this
   control can exist without the default silently meaning something looser. */
.fx-broadcat{margin:10px 0 0;font-size:11.5px;color:var(--on-navy-soft);
  display:flex;align-items:center;gap:7px;cursor:pointer}
.fx-broadcat[hidden]{display:none}
.fx-broadcat input{accent-color:var(--green-500);width:14px;height:14px;cursor:pointer;flex:none}
.fx-broadcat .n{font-family:var(--f-mono);color:var(--green-400);font-weight:600}
.fx-broadcat.is-empty{opacity:.5;cursor:default}
.fx-broadcat.is-empty .n{color:var(--on-navy-mute)}
.gf-wide{font-family:var(--f-mono);font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--on-navy-mute)}

/* ===========================================================================
   THE DOCKED RAIL TAKES 236 PIXELS, AND THIS BOARD'S BREAKPOINTS WERE
   MEASURED AGAINST THE WHOLE VIEWPORT.  2026-08-28.
   ---------------------------------------------------------------------------
   assets/ws-shell.js now docks the site rail onto every document page and pads
   <body> out of its way. Every breakpoint above is a media query, and a media
   query measures the VIEWPORT - it has no idea 236px of it is gone. Left
   alone, a 1300px window would keep all three columns on 1064px of actual
   room and the centre column would come out around 530px instead of the 730px
   the note above says it needs.

   That is precisely the failure NEXT-SESSION.md already records once: the
   universal search shipping a result column starved to 37 pixels because it
   was checked at 1444 and used at 1344. The rail is the same mistake wearing
   a different hat, so the breakpoints are re-stated here with the rail's width
   added to each one.

   THE OFFSET IS NOT CONSTANT, because the rail is not. It is 236px down to a
   1180px viewport and 66px below that (style.css collapses it to icons), and
   under 900px it is removed entirely and the original breakpoints are correct
   again untouched. So: +236 on the queries above 1180, +66 on the one that
   lands between 900 and 1180, and nothing at all below 900.

       original   rail    shifted
       1440       236     1676
       1279       236     1515
       1240       236     1476
       1040        66     1106
        660         0      660     <- below 900, no rail, left alone
   =========================================================================== */
@media (max-width:1676px){
  body.has-rail .fx-shell{grid-template-columns:250px minmax(0,1fr) 260px}
}
@media (max-width:1515px){
  body.has-rail .fx-shell{grid-template-columns:250px minmax(0,1fr)}
  body.has-rail .fx-rail{display:none}
}
@media (max-width:1106px){
  body.has-rail .fx-shell{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:1476px){
  body.has-rail .fx-hi{grid-template-columns:repeat(3,minmax(0,1fr))}
}
/* Below 900 the rail is gone and body.has-rail carries no padding, so the
   original queries are already right and nothing is restated here. */

/* ==========================================================================
   THE BOARD INSIDE A WORKSPACE, 2026-09-01.

   opportunities.html left the document shell today. .ws-main is a bare flex
   column with no padding of its own - the Ledger's .lg-* blocks each carry
   their own gutter - so the Finder's top-level blocks need the same 26px the
   workspace header uses, or the board runs into the rail.

   The four trailing sections (the rooms off the board, the courses bridge, the
   coverage notices and the source credit) are still written the document way,
   as <section class="sec"><div class="wrap">, which is a centred column with
   its own max-width. Inside .ws-main that draws them narrower than the board
   above them and indented from nothing, so both wrappers are neutralised here.
   One rule beats rewriting four blocks of copy and losing a sentence to it.
   ========================================================================== */
.ws-main > .gf-source,
.ws-main > .gf-switch,
.ws-main > .gf-filters,
.ws-main > .gf-quick,
.ws-main > .gf-chips,
.ws-main > #gf-match,
.ws-main > .fx-shell{margin-left:26px;margin-right:26px}
/* The search is the top of the page (2026-09-07): the panel is the first
   block under the workspace header. */
.ws-main > .gf-filters{margin-top:18px}
.ws-main > #gf-match{margin-top:12px}
.ws-main > .gf-source{margin-top:18px}
.ws-main > .fx-shell{padding-bottom:40px}
.ws-main > .sec{padding:26px 26px 0}
.ws-main > .sec > .wrap{max-width:none;width:auto;padding-left:0;padding-right:0;margin:0}
/* The intelligence rail sticks under the workspace header, not under the top
   nav that this page no longer has. */
.ws-main .fx-rail{top:14px}
@media (max-width:900px){
  .ws-main > .gf-source,
  .ws-main > .gf-switch,
  .ws-main > .gf-filters,
  .ws-main > .gf-quick,
  .ws-main > .gf-chips,
  .ws-main > #gf-match,
  .ws-main > .fx-shell{margin-left:16px;margin-right:16px}
  .ws-main > .sec{padding-left:16px;padding-right:16px}
}

/* ---- who has received this funding (drawer) and the card's history fact,
   2026-09-02. The programme's own past from the assistance archive. */
.fx-hist{font-family:var(--f-mono);font-size:11.5px;color:var(--green-400)}
.fx-prog-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0 0 12px}
.fx-prog-stats > div{padding:9px 11px;border:1px solid var(--panel-line);border-radius:var(--r-sm);
  background:var(--panel-solid);display:grid;gap:2px}
.fx-prog-stats b{font-family:var(--f-mono);font-size:16px;font-weight:600;color:#fff;line-height:1.1}
.fx-prog-stats span{font-size:11px;color:var(--on-navy-mute);line-height:1.35}
.fx-prog{list-style:none;margin:0 0 10px;padding:0;display:grid;gap:1px;background:var(--hairline);
  border:1px solid var(--panel-line);border-radius:var(--r-sm);overflow:hidden;counter-reset:prog}
.fx-prog li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1px 12px;padding:8px 11px;
  background:var(--panel-solid);align-items:baseline}
.fx-prog .n{font-size:12.5px;color:var(--on-navy);min-width:0;overflow-wrap:anywhere;line-height:1.4}
.fx-prog .n a{color:inherit;text-decoration:none}
.fx-prog .n a:hover{color:var(--green-400)}
.fx-prog .n em{font-style:normal;font-family:var(--f-mono);font-size:10px;color:var(--on-navy-mute);margin-left:4px}
.fx-prog .m{font-family:var(--f-mono);font-size:12px;color:#fff;white-space:nowrap;text-align:right}
.fx-prog .s{grid-column:1 / -1;font-size:11px;color:var(--on-navy-mute)}
.fx-prog-wait,.fx-prog-note{margin:0;font-size:12px;line-height:1.55;color:var(--on-navy-mute)}
.fx-prog-note a{color:var(--green-400)}

/* ============================================ WHY IT MATCHED, AND THE AWARDS
   2026-09-06. The search core's reasons under a card and beside a table row;
   an award's date and winner where a deadline would stand; the ways out of
   an empty result. */
.fx-say.why-q .lbl{color:var(--green-400)}
.fx-whyq{font-size:11px;color:var(--on-navy-mute);font-style:italic;overflow-wrap:anywhere}
.fx-due.awarded .dt{color:var(--gold-300)}
.fx-zero-h{font-family:var(--f-mono);font-size:10px;letter-spacing:.11em;text-transform:uppercase;color:var(--on-navy-mute);margin:16px 0 8px}
.fx-zero .fx-act b{color:var(--green-400);margin-left:5px;font-variant-numeric:tabular-nums}
.fx-zero .fx-act i{font-style:normal;font-size:9.5px;color:var(--on-navy-mute);margin-left:5px;text-transform:uppercase;letter-spacing:.06em}
.fx-zero a.fx-act{text-decoration:none}

/* ====================================================================
   THE GRANTS FINDER'S OWN PIECES, 2026-09-06 (Josh's grants spec):
   the timeline strip on a card, the pursuit control, the search mode,
   the discovery view, and the small "+N more" and "changed" marks.
   ==================================================================== */
.fx-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:10px 0 2px;padding:8px 10px;
  border:1px solid var(--panel-line);border-radius:10px;background:rgba(255,255,255,.025)}
.fx-stop{min-width:0;position:relative;padding-left:12px}
.fx-stop::before{content:"";position:absolute;left:0;top:6px;width:7px;height:7px;border-radius:50%;background:var(--on-navy-mute);opacity:.5}
.fx-stop.has::before{background:var(--green-400);opacity:1}
.fx-stop .k{display:block;font:600 9.5px var(--f-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--on-navy-mute)}
.fx-stop .v{display:block;font-family:var(--f-mono);font-size:11.5px;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fx-stop.none .v{color:var(--on-navy-mute);font-style:italic}
.fx-more{font:600 10px var(--f-mono);color:var(--green-400);cursor:help;white-space:nowrap}
.fx-changed{color:var(--gold-300);cursor:help}
.fx-fdates{display:block;font-size:10.5px;color:var(--on-navy-mute)}
.fx-pattern{color:var(--gold-300);font-weight:600}
.fx-prog{color:inherit;text-decoration:none}
.fx-prog:hover .gloss{color:#fff}
.gf-desc-more{margin-left:6px;font:600 10.5px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--green-400);text-decoration:none}
.gf-pursuit{display:inline-flex;align-items:center;margin-left:8px}
.gf-pursuit-sel{font:600 10.5px var(--f-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--on-navy-soft);
  background:rgba(255,255,255,.04);border:1px solid var(--panel-line);border-radius:999px;padding:5px 24px 5px 10px;cursor:pointer;
  -webkit-appearance:none;appearance:none;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='9' height='6' viewBox='0 0 9 6'><path d='M1 1l3.5 3.5L8 1' fill='none' stroke='%239fb3c8' stroke-width='1.5' stroke-linecap='round'/></svg>");
  background-repeat:no-repeat;background-position:right 9px center}
.gf-pursuit-sel.is-p{color:#08111e;background-color:var(--green-400);border-color:var(--green-400)}
.gf-pursuit-sel.is-w{color:var(--gold-300);border-color:rgba(232,163,61,.5)}
.gf-pursuit-sel.is-n{color:var(--on-navy-mute);text-decoration:line-through}
.gf-pursuit-sel:focus-visible{outline:none;box-shadow:var(--ring)}
.gf-mode{font:600 11px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--on-navy);
  background:rgba(255,255,255,.04);border:1px solid var(--panel-line);border-radius:10px;padding:10px 12px;min-width:0;width:100%}
.gf-mode:focus{outline:none;border-color:var(--green-400);box-shadow:var(--ring)}
.gf-disc{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--panel-line);border-radius:999px;background:rgba(255,255,255,.03);margin:0 0 10px;flex-wrap:wrap}
.gf-disc[hidden]{display:none}
.gf-disc button{font:600 11px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--on-navy-mute);
  background:none;border:0;border-radius:999px;padding:6px 12px;cursor:pointer}
.gf-disc button b{color:var(--green-400);font-weight:600;margin-left:4px;font-variant-numeric:tabular-nums}
.gf-disc button[aria-pressed="true"]{background:var(--green-500);color:#08111e}
.gf-disc button[aria-pressed="true"] b{color:#08111e}
.gf-disc button:not([aria-pressed="true"]):hover{color:#fff}
.gf-disc button:focus-visible{outline:none;box-shadow:var(--ring)}
.gf-range{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.gf-range input{min-width:0}
.gf-advgroup .gf-advgh .sub{margin-left:8px;font-weight:400;text-transform:none;letter-spacing:0;color:var(--on-navy-mute)}
@media (max-width:700px){
  .fx-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ---------------------------------------------------------------- LOCATION
   2026-09-07, the facility layer. The location field carries its mode under
   the facet; the card's location fact carries the evidence badge: the
   official place as filed, then the facility the notice names, its basis
   and confidence, each labelled so a reader can see why the row is here. */
.gf-locfield .gf-locmode { display: flex; align-items: center; gap: .55rem; margin-top: .35rem; flex-wrap: wrap; }
.gf-locfield .gf-locmode select { font-size: .78rem; padding: .18rem .35rem; max-width: 11.5rem; }
.gf-locfield .gf-nw { font-size: .74rem; margin: 0; white-space: nowrap; }
.gf-locfield .gf-nw input { margin-right: .3rem; }
.fx-loc { display: flex; flex-wrap: wrap; gap: .25rem .55rem; align-items: baseline; }
.fx-loc .fx-loc-pop { }
.fx-loc-b { display: inline-flex; align-items: baseline; gap: .3rem; font-size: .78rem; padding: .08rem .45rem;
            border-radius: 999px; border: 1px solid rgba(148, 213, 60, .45); background: rgba(148, 213, 60, .10); }
.fx-loc-b.is-vh { border-color: rgba(148, 213, 60, .75); }
.fx-loc-b.is-m { border-style: dashed; opacity: .85; }
.fx-loc-b.is-buyer { border-color: rgba(69, 183, 216, .5); background: rgba(69, 183, 216, .10); }
.fx-loc-b.is-nw { border-color: rgba(232, 163, 61, .5); background: rgba(232, 163, 61, .10); }
.fx-loc-b .k { opacity: .7; font-size: .72rem; text-transform: uppercase; letter-spacing: .04em; }
.fx-loc-b a { text-decoration: none; }
.fx-loc-b a:hover { text-decoration: underline; }
.fx-loc-why { font-size: .74rem; opacity: .75; }
.fx-table td .fx-loc-b { padding: 0 .35rem; font-size: .72rem; }
