/* widgets/mission-feed — the fleet's live channel: running missions + narration +
   lower deck (COMPLETED TODAY / COMING UP). Extracted verbatim from the inline
   <style> block. .mf-avw .sf-badge composes the shared .sf-badge glyph (stays with
   the fleet strip); jbRipple keyframes stay inline (jobs-board legacy, not ours). */
.mfp{background:#fff;border:1px solid #e7e2d4;border-radius:12px;overflow:hidden}
.mfp .ph{display:flex;align-items:center;gap:8px;padding:14px 16px 11px;border-bottom:1px solid #f0ece0;flex-wrap:wrap}
.mfp .ph .t{font:700 17px Fraunces,Georgia,serif;color:var(--brand-deep,#1f4a2d)}
.mf-seg{display:flex;gap:4px;margin-left:2px}
.mf-seg button{font:700 11px Inter,system-ui,sans-serif;padding:4px 10px;border-radius:999px;color:#6b736c;background:none;border:none;cursor:pointer;white-space:nowrap}
.mf-seg button:hover{background:#f3f0e6}
.mf-seg button.on{background:var(--brand-deep,#1f4a2d);color:#fff}
.mf-fresh{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font:700 11px Inter,system-ui,sans-serif;color:var(--brand-ok,#15803d);white-space:nowrap}
.mf-fresh .d{width:7px;height:7px;border-radius:99px;background:var(--brand-ok,#15803d);flex:none}
.mf-fresh.live .d{animation:mfBlink 1.6s infinite}
.mf-fresh.stale{color:#9aa39b}.mf-fresh.stale .d{background:#c9c2b2}
@keyframes mfBlink{0%,100%{opacity:1}50%{opacity:.35}}
.mf-sec{font:700 10.5px Inter,system-ui,sans-serif;letter-spacing:.14em;text-transform:uppercase;color:#9aa39b;padding:12px 16px 6px}
/* queued count beside RUNNING NOW (Craig 7/26) — fleet.queued, work already ordered and waiting
   for a lane to claim it. Steel, not amber: a queue is normal operating state, not an alarm. */
/* The queued count is a BUTTON now (it jumps to the queue, which is rendered once, in the deck).
   Same pill it always was — only the affordance changed, so the header's rhythm is untouched. */
.mf-secq{margin-left:8px;letter-spacing:.02em;text-transform:none;font:700 10px Inter,system-ui,sans-serif;color:var(--motm-grey-700,#55636f);background:var(--motm-grey-100,#eceff2);border:0;border-radius:999px;padding:2px 7px;cursor:pointer}
.mf-secq:hover{background:var(--signal-tint,#eaf3ec);color:var(--canopy,#1e3b2f)}
.mf-secq:focus-visible{outline:2px solid var(--canopy,#1e3b2f);outline-offset:2px}
/* ── THE PIPELINE RAIL IS RETIRED (Craig 8/7 5:09p) ─────────────────────────────────────────
   Queued → Running → Owed rode here as a rail of three count-chips that JUMPED to bands stacked
   below them. Those bands are tabs now (see .mf-cu-tabs), so the rail's own markup is gone and
   its rules go with it rather than lingering as dead selectors nobody can grep an origin for.
   Only the landing flash survives, because the jump still exists — it opens a tab first. */
/* The landing flash — a jump you cannot see is a jump you cannot trust. Amber-free and brief. */
.mf-pipe-lit{background:var(--signal-tint,#eaf3ec);border-radius:7px;
  box-shadow:0 0 0 3px var(--signal-tint,#eaf3ec);transition:background .4s ease,box-shadow .4s ease}
.mfrow{display:flex;gap:10px;align-items:flex-start;padding:9px 13px;border-left:3px solid transparent;cursor:pointer;min-width:0}
.mfrow:hover,.mfrow.hl{background:#f5f9f4;border-left-color:var(--brand-ok,#15803d)}
.mf-avw{position:relative;flex:none;width:36px;height:36px}
.mf-avw img{width:32px;height:32px;border-radius:50%;object-fit:cover;display:block;margin:2px}
.mf-avw .sf-badge{position:absolute;bottom:-2px;right:-2px;width:16px;height:16px;border-radius:3px;pointer-events:none;cursor:default;line-height:0}
/* 2px accent ring on running avatar (SPEC C: accent ring per bot color) */
.mf-avw.mf-ring img{box-shadow:0 0 0 2px var(--pc,#15803d)}
.lv-pulse::after{content:"";position:absolute;inset:-4px;border-radius:99px;border:2.5px solid var(--pc,#15803d);animation:lvRing 1.9s infinite;pointer-events:none}
@keyframes lvRing{0%{transform:scale(.92);opacity:.9}70%{transform:scale(1.14);opacity:0}100%{opacity:0}}
/* ═══ NESTED SUB-AGENT ROWS (Craig 7/26) ═══ An exec seat's sub-agents nest UNDER their parent
   row rather than competing as siblings, so 'Running now · N' keeps counting MISSIONS, not
   threads — three sub-agents must never read as three missions. The left hairline is what
   carries the nesting, in the deck's existing line color, so this adds no new vocabulary.
   Absence renders nothing: a row with no sub-agents is byte-identical to today. */
.mf-sub{display:flex;align-items:center;gap:8px;margin-top:5px;padding-left:11px;border-left:2px solid #e7e2d4;min-width:0}
.mf-sub .mf-sub-dot{flex:none;width:6px;height:6px;border-radius:50%;background:var(--pc,#15803d);opacity:.8;animation:fsSubDot 2.4s ease infinite}
/* staggered — two threads breathing in unison read as a strobe, not as two threads */
.mf-sub:nth-of-type(2) .mf-sub-dot{animation-delay:.8s}
.mf-sub .mf-sub-lbl{flex:none;font:700 10px Inter,system-ui,sans-serif;letter-spacing:.04em;text-transform:uppercase;color:#8a918d}
.mf-sub .mf-sub-txt{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:400 12.5px Inter,system-ui,sans-serif;color:#525854}
.mf-sub .mf-sub-el{flex:none;font:400 10.5px Inter,system-ui,sans-serif;color:#c3bcae}
.mfrow .top{display:flex;align-items:center;gap:7px;min-width:0;flex-wrap:nowrap}
/* SPEC C line 1: <Bot> · <verb> — <Client>, --fs-body w600 charcoal */
.mfrow .title{font:600 var(--fs-body) Inter,system-ui,sans-serif;color:var(--motm-charcoal);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mfrow .cl{font:600 10.5px Inter,system-ui,sans-serif;color:#9aa39b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:40%}
.mfrow .el{margin-left:auto;font:700 var(--fs-micro) Inter,system-ui,sans-serif;background:var(--motm-grey-100);color:var(--motm-grey-700);border-radius:999px;padding:2px 8px;flex:none;white-space:nowrap}
.mfrow .el.long{background:#fef3c7;color:#92400e}
/* SPEC C line 2: current stage, --fs-body Inter grey-700, NOT monospace, NO green bg */
.mf-step{margin-top:3px;font:400 var(--fs-body)/1.45 Inter,system-ui,sans-serif;color:var(--motm-grey-700);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
/* the running job's own id (Craig 7/26) — mono, micro, muted: it is the handle Craig matches
   against the order he placed, not a headline. */
.mf-jid{margin-top:3px;font:500 var(--fs-micro,10px)/1.3 ui-monospace,SFMono-Regular,Menlo,monospace;color:#b7b0a0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
/* TITLE LEADS, METADATA DEMOTES (Craig 7/28 5:22p: "I didn't see it because the jobs are not
   labeled well"). When a row has a real job title it takes the .title slot above; the old
   bot·verb·client line moves here, same muted register as the job id right below it. */
.mf-meta{margin-top:3px;font:500 var(--fs-micro,10px)/1.3 Inter,system-ui,sans-serif;color:#9aa39b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
/* SPEC C chevron + mono log expand block */
.mf-chev{flex:none;background:none;border:none;font:600 15px Inter;color:var(--motm-grey-500);cursor:pointer;padding:2px 4px;border-radius:4px;line-height:1;transition:transform .15s}
.mf-chev.open{transform:rotate(90deg)}
/* legacy log box — overflow:auto removed under the one-page law (7/24); it is not currently
   emitted by the renderer, but a stray scrollbar here would violate the rule if it ever were. */
.mf-log{display:none;margin-top:6px;background:#f9fafb;border-radius:6px;padding:8px 10px;font:400 11px/1.55 ui-monospace,Menlo,monospace;color:#374151;max-height:96px;overflow:hidden;white-space:pre-wrap;word-break:break-all}
.mf-log.open{display:block}
.mfrow .mf-row-right{display:flex;align-items:center;gap:5px;flex:none;margin-left:auto}
.mf-chip{display:inline-flex;align-items:center;gap:4px;font:700 10px Inter,system-ui,sans-serif;color:var(--motm-warning,#b87a14);background:#faf3e3;border:1px solid #eddfb9;border-radius:999px;padding:2px 8px;margin-left:6px;cursor:pointer;flex:none;vertical-align:bottom}
.mf-fin{display:flex;gap:8px;align-items:center;padding:7px 16px;font:400 12.5px Inter,system-ui,sans-serif;color:#374151;min-width:0}
.mf-fin .b{font:800 10px Inter,system-ui,sans-serif;border-radius:6px;padding:2px 7px;flex:none;white-space:nowrap}
.mf-fin .b.ok{background:#eef5ef;color:var(--brand-ok,#15803d)}.mf-fin .b.wn{background:#faf3e3;color:#d97706}.mf-fin .b.bl{background:#fbece8;color:#c0492f}
.mf-fin .s{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-fin .who{color:#9aa39b;font:600 11px Inter,system-ui,sans-serif;flex:none}
.mf-fin .tm{color:#c3bcae;font:400 10.5px Inter,system-ui,sans-serif;flex:none}
.mf-q{display:flex;gap:9px;align-items:center;padding:7px 16px;font:400 12.5px Inter,system-ui,sans-serif;color:#5b6570;min-width:0}
.mf-q .n{width:20px;height:20px;border-radius:6px;background:#f0ece1;color:#8a8272;font:800 10px Inter,system-ui,sans-serif;display:flex;align-items:center;justify-content:center;flex:none}
.mf-q .s{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-q .gate{margin-left:auto;font:700 10px Inter,system-ui,sans-serif;color:var(--motm-warning,#b87a14);flex:none;white-space:nowrap}
.mf-q .gate.sched{color:#9aa39b}
/* PARKED/QUIET HEADLINE (Craig 7/24): this line is the honest explanation for why nothing is
   running — it must catch the eye. Brand DARK GREEN (--canopy), medium weight, no italic-muted
   treatment. Calm-alerts law stands: amber/red stay reserved for alarms; this is a confident
   status statement, not a warning. */
.mf-none{padding:7px 16px 10px;font:600 var(--fs-body)/1.45 Inter,system-ui,sans-serif;color:var(--canopy,#1e3b2f);letter-spacing:.005em}
/* STALE ≠ QUIET (Craig 7/26): a payload too old to know is not a calm floor. Amber — this one IS
   a warning: the surface is telling you it cannot see, which is the 'quiet with four jobs
   running' defect stated honestly instead of hidden. */
.mf-none.stale{color:var(--motm-warning,#b87a14)}
/* HONEST IDLE LINE (Craig 7/22 dispatch-floor fold): name the field lanes standing by — calm,
   never an alarm; idle is idle. */
.mf-idle{padding:2px 16px 10px;font:400 11.5px/1.5 Inter,system-ui,sans-serif;color:#9aa39b}
.mf-idle .k{font:700 9.5px Inter,system-ui,sans-serif;letter-spacing:.08em;text-transform:uppercase;color:#b7b0a0;margin-right:7px}
/* LIVE NARRATION (Fresh Take 7/15): timestamp next to stage line + mini-log panel */
.mf-ts{color:#c3bcae;font:600 10px Inter,system-ui,sans-serif;margin-left:4px}
.mf-log-mini{display:none;margin-top:6px}
.mf-log-mini.open{display:block}
.mf-log-list{background:#f9fafb;border-radius:6px;overflow:hidden}
.mf-log-line{display:flex;gap:8px;padding:6px 10px;border-bottom:1px solid #e7e2d4;font:400 11px Inter,system-ui,sans-serif;align-items:flex-start}
.mf-log-line:last-child{border-bottom:none}
.mf-log-ts{color:#9aa39b;font:600 10px Inter,system-ui,sans-serif;flex:none;white-space:nowrap}
.mf-log-msg{color:#374151;flex:1;min-width:0}
/* OVERFLOW (Craig 7/16): min-width:0 kills the grid-item min-content blowout that clipped
   COMING UP at the right edge; auto-fit stacks the columns instead of clipping when narrow.
   align-items:start (Craig 7/26 4:25p, fixed row counts): the two boxes now carry PERMANENTLY
   DIFFERENT row caps (10 left, 20 right — see _MF_LEFT_PER/_MF_RIGHT_PER), so their natural
   content heights differ on purpose. Default grid stretch would force the shorter box to match
   the taller one, reintroducing the "half-empty stretch" dead space Craig ruled against — each
   column now sizes to its OWN content instead. */
.mf-lower-deck{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,290px),1fr));gap:12px;padding:0 16px;margin-top:8px;align-items:start}
.mf-ld-col{background:#fbf9f5;border:1px solid #e7e2d4;border-radius:8px;padding:12px 14px;min-width:0;overflow:hidden}
.mf-ld-h{font:700 11px Inter;letter-spacing:.05em;text-transform:uppercase;color:#9aa39b;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid #e7e2d4}
/* ── COMING UP TABS (Craig 8/7 5:09p, "Too much scrolling") ─────────────────────────────────
   Five chips, one panel. Close-board ct-tab idiom, kept — only the OPEN tab's rows are in the
   DOM, so the panel's height IS the open tab and the box stops running past COMPLETED JOBS.
   The count badge rides every chip so the shape of the funnel reads without opening anything,
   which is the whole bargain a tab strip makes.
   NO ELLIPSIS ON THE LABELS. The retired rail flexed its three cells to equal widths and clipped
   them to "Q…", "Ru…", "O…" on Craig's own screen — a chip whose label you cannot read is not a
   label. These size to their text and WRAP to a second line instead; a two-line strip costs ~24px
   once, where the clipped rail cost him the words every time he looked. */
.mf-cu-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.mf-cu-tab{display:inline-flex;align-items:center;gap:3px;font:600 12px Inter;color:#5b6b5e;background:#f4f6f2;border:1px solid #e2e6dd;border-radius:999px;padding:4px 8px;cursor:pointer;transition:background .12s,color .12s,border-color .12s;white-space:nowrap}
.mf-cu-tab:hover{background:#eaf0e9}
.mf-cu-tab:focus-visible{outline:2px solid var(--canopy,#1e3b2f);outline-offset:2px}
.mf-cu-tab.on{background:var(--brand-deep,#1f4a2d);border-color:var(--brand-deep,#1f4a2d);color:#fff}
/* 12px stays (Craig's reading-type floor) — the strip was packed by dropping the redundant icon
   and tightening the box, never by shrinking the words. */
.mf-cu-tab .n{font-weight:700;opacity:.55;font-variant-numeric:tabular-nums}
.mf-cu-tab.on .n{opacity:.85}
/* COURT-HONEST COLOR: only OWED — work genuinely sitting in Craig's court — earns a warm accent,
   and only while it is CLOSED (open, it wears the same deep-green selected state as its siblings,
   because an open tab is a place you are standing, not an alarm). A busy floor is never amber. */
.mf-cu-tab.tb-ow:not(.on){color:#8a5a0f;background:#fdf8ea;border-color:#f0e2c4}
.mf-cu-tab.tb-ow:not(.on):hover{background:#fbf0da}
/* THE PANEL. One tab's body, and nothing else — no second copy parked under display:none, which
   is the difference between "absorbed" and "hidden" and is asserted by the probe. */
.mf-cu-panel{min-width:0}
.mf-cu-panel .mf-band-h:first-child{margin-top:2px}
/* THE CAPTION GETS ITS OWN LINE. Beside the name and the count badge a caption has ~150px, and
   .mf-band-h .cap ellipsises — which painted the Owed tab's funnel line as "with Craig — HQ is
   holdi…". A textContent probe reads that as a pass, so this was caught by LOOKING at the render.
   In a panel the header owns the full width, so the caption wraps under it instead of clipping:
   ~14px of height for a sentence that is the whole point of the band. */
.mf-cu-panel .mf-band-h .cap{flex:1 0 100%;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.35}
/* MACHINE SUB-CHIPS — Scheduled · System · Wakes, one level down inside the Machine tab. Quiet by
   design: they are the machine's own clockwork, not something coming to Craig. */
/* .mf-cu-sub retired with the Machine tab (8/8) — no renderer emits it. */
/* ── COMING UP · THREE BANDS (Craig 7/30 "I'm still not getting a visual of what is coming") ──
   RUNNING · QUEUED · OWED TO YOU stand permanently, one under the other. Band headers are the
   --fs-label idiom the rest of the glass uses; the count is the only number that carries weight.
   COURT-HONEST COLOR: only OWED — work genuinely sitting in Craig's court — is allowed a warm
   accent. RUNNING and QUEUED are calm, because a busy floor is not an alarm. */
.mf-band-h{display:flex;align-items:baseline;gap:7px;flex-wrap:wrap;margin:14px 0 4px;
  font:700 var(--fs-label,11px) Inter,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:#5b6b5e}
.mf-band-h:first-of-type{margin-top:2px}
.mf-band-h .i{font-size:11px;line-height:1;opacity:.8;letter-spacing:0}
.mf-band-h .n{font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;font-variant-numeric:tabular-nums;
  letter-spacing:0;background:#eceff2;color:#55636f;border-radius:999px;padding:1px 8px}
.mf-band-h .cap{font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;letter-spacing:0;
  text-transform:none;color:#9aa39b;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-band-h.bd-run{color:var(--canopy,#1e3b2f)}
.mf-band-h.bd-run .n{background:var(--signal-tint,#eaf3ec);color:var(--canopy,#1e3b2f)}
.mf-band-h.bd-ow{color:#8a5a0f}
.mf-band-h.bd-ow .n{background:#fbf0da;color:#8a5a0f}
/* AN EMPTY BAND IS A SENTENCE, NEVER A ZERO (the QC lesson). `.stale` = we cannot see, which must
   never wear the same calm grey as "we looked and it is clear". */
.mf-band-none{padding:5px 0 3px;color:#9aa39b;font:400 12px Inter,system-ui,sans-serif}
.mf-band-none.stale{color:#8a5a0f;background:#fdf8ea;border-radius:6px;padding:6px 9px;margin:2px 0}
/* RUNNING / OWED cards reuse the queued job-card shell (.jobcard) — one row idiom for the deck. */
.mf-ld-row.cu-run.jobcard,.mf-ld-row.cu-owed.jobcard{align-items:flex-start;gap:8px;cursor:default;
  border-left:3px solid var(--lc,#c9c2b2);background:#fbfaf6;border-radius:7px;padding:8px 8px 8px 9px;margin:5px 0;white-space:normal}
.mf-ld-row.cu-run.jobcard.go,.mf-ld-row.cu-owed.jobcard.go{cursor:pointer}
.mf-ld-row.cu-run.jobcard.go:hover,.mf-ld-row.cu-owed.jobcard.go:hover{background:#f3efe5}
.mf-ld-row.cu-owed.jobcard{background:#fffdf9;border:1px solid #f0e2c4;border-left:3px solid var(--lc,#c9c2b2)}
/* LIVENESS — the whole point of the RUNNING band. 'writing' is the only state that gets the live
   dot and the action green; 'quiet' is MUTED on purpose, so a stalled claim can never read as busy. */
.mf-cu-live{display:inline-flex;align-items:center;gap:4px;flex:none;white-space:nowrap;
  font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;border-radius:999px;padding:2px 8px}
.mf-cu-live.writing{background:var(--action-tint,#e4f9e8);color:var(--action-deep,#0c7a38)}
.mf-cu-live.writing .dot{width:5px;height:5px;border-radius:50%;background:var(--action,#15a850);
  display:inline-block;animation:mfCuPulse 1.6s ease-in-out infinite}
.mf-cu-live.working{background:var(--signal-tint,#eaf3ec);color:var(--signal,#3e7d5c)}
.mf-cu-live.quiet{background:#f1f0ec;color:#9aa39b;font-weight:600}
.mf-cu-live.unknown{background:#f1f0ec;color:#9aa39b;font-weight:600;font-style:italic}
@keyframes mfCuPulse{0%,100%{opacity:1}50%{opacity:.35}}
@media (prefers-reduced-motion:reduce){.mf-cu-live.writing .dot{animation:none}}
.mf-cu-since{flex:none;white-space:nowrap;font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;color:#9aa39b}
.mf-cu-since.na{font-style:italic}
/* OWED kind chips — 'wrap owed' (a promise in flight) vs 'your word' (a card staged for Craig). */
.mf-cu-owk{flex:none;white-space:nowrap;font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;
  border-radius:999px;padding:2px 8px;background:#eceff2;color:#55636f}
.mf-cu-owk.wrap{background:var(--signal-tint,#eaf3ec);color:var(--signal,#3e7d5c)}
.mf-cu-owk.card{background:#fbf0da;color:#8a5a0f}
.mf-cu-owk.bad{background:#fef3c7;color:#92400e}
.mf-cu-ch,.mf-cu-risk{flex:none;white-space:nowrap;font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;
  border-radius:999px;padding:2px 8px;background:#eef2f6;color:#55636f}
.mf-cu-risk.medium{background:#fbf0da;color:#8a5a0f}
.mf-cu-risk.high{background:#f6dedd;color:#8a2822}
/* MACHINE — was a footer (7/30), then a TAB (8/7), and on 8/8 it left this deck entirely for THE
   MACHINE (index.html openMachineModal). Its chrome goes with it: .mf-mach-lb, .mf-cu-tab.mach and
   the .mf-cu-sub sub-chip rules styled markup no renderer emits any more, and orphan CSS is what a
   later lane re-mounts a retired surface against by accident. The wake-row chips below stay — the
   Machine's SYSTEM section draws wakes now, and .mf-wk-go is still the door those rows carry. */
/* ── flash + wake-row chrome ── */
.mf-cu-flash{border-radius:12px;animation:mfCuFlash 1.4s ease-out}
@keyframes mfCuFlash{0%,100%{box-shadow:none}25%,60%{box-shadow:0 0 0 3px rgba(224,169,46,.5)}}
.mf-ld-row.wk{cursor:default;border-radius:6px;padding-left:4px;padding-right:4px}
/* THE CONDITION CHIP HAS TO SHRINK, NOT SPILL (found 8/7 while verifying the Machine tab).
   It was `display:inline-flex` + `flex:none`: the emoji and the condition text are ONE text node,
   so they became a single anonymous flex item — and text-overflow does not apply to a flex item.
   `flex:none` then refused to shrink below its content, so a long condition ("raise at the next
   Firmglass review") ran straight out of its own pill, collided with the title beside it and got
   sheared off by .mf-ld-col{overflow:hidden} with no ellipsis to say it had been cut. Pre-dates
   this job; it only became load-bearing when Wakes stopped being a footer nobody opened.
   inline-block makes text-overflow work as written; `flex:0 1 auto` + min-width:0 lets it give way
   to the title on a narrow column instead of pushing it off the edge. */
.mf-wk-chip{display:inline-block;flex:0 1 auto;min-width:0;max-width:46%;font:600 11px Inter,system-ui,sans-serif;border-radius:999px;padding:2px 9px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
.mf-wk-chip.date{background:#e8eef6;color:#2c4a70;border:1px solid #d2ddec}
.mf-wk-chip.event{background:#fbf3df;color:#8a5a0f;border:1px solid #ecd9a8}
.mf-wk-go{flex:none;border:0;background:transparent;color:#5b6b5e;font:600 13px Inter;cursor:pointer;border-radius:7px;padding:2px 7px;line-height:1}
.mf-wk-go:hover{background:#eaf0e9;color:var(--brand-deep,#1f4a2d)}
.mf-ld-row{display:flex;gap:8px;align-items:center;padding:7px 0;font:400 12.5px Inter,system-ui,sans-serif;color:#374151;min-width:0;white-space:nowrap;overflow:hidden}
.mf-ld-row .dur{color:#9aa39b;font:600 10px Inter;flex:none}
.mf-ld-row .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-ld-row .meta,.mf-ld-row .tm{color:#9aa39b;font:600 10px Inter;flex:none}
.mf-ld-row .meta{max-width:110px;overflow:hidden;text-overflow:ellipsis}
/* attribution chip (Craig 7/16 'who did what'): lane icon + NAME LABEL — never portrait alone */
.mf-attr{display:inline-flex;align-items:center;gap:5px;flex:none;max-width:132px;min-width:0}
.mf-attr .mf-rx-av{width:16px;height:16px}
.mf-attr-n{font:600 10px Inter,system-ui,sans-serif;color:#6b736c;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* PER-WRAP COST (Craig 7/22 dispatch-floor fold): the Done Tray's $ chip on Completed Today rows —
   neutral green-grey, tabular figures, never a court color; cost is information, not an alarm. */
.mf-cost{font:700 10px Inter,system-ui,sans-serif;color:#4a5a4a;background:#eef2ec;border:1px solid #dde5da;border-radius:999px;padding:2px 7px;flex:none;font-variant-numeric:tabular-nums}
.mf-rx-noimg{font:italic 400 11px Inter,system-ui,sans-serif;color:#9aa39b;margin-bottom:6px}
/* ── LOWER DECK v2 (7/16): receipts + decisions ── */
.mf-ld-row.rx,.mf-ld-row.dc,.mf-ld-row.eg,.mf-ld-row.rt{cursor:pointer;border-radius:6px;padding-left:4px;padding-right:4px}
.mf-ld-row.rx:hover,.mf-ld-row.dc:hover,.mf-ld-row.eg:hover,.mf-ld-row.rt:hover{background:#f3efe5}
/* TITLE CARDS (Craig 7/22 dispatch-floor fold): Fleet-tab queued jobs read as cards — full job
   title as a headline + a colored lane BADGE — folded from the retired Orders Tray, its best
   feature. Two-class specificity (.dc.jobcard) beats the flat .dc row rule above. */
.mf-ld-row.dc.jobcard{align-items:flex-start;gap:8px;border-left:3px solid var(--lc,#c9c2b2);background:#fbfaf6;border-radius:7px;padding:8px 8px 8px 9px;margin:5px 0;white-space:normal}
.mf-ld-row.dc.jobcard:hover{background:#f3efe5}
/* PARKED GROUP (Craig 7/24 "jobs that will go live added to the Fleet queue"): upcoming work
   penned in _held. Reads as a calm holding pen — the same warm amber the Dispatch Floor's pen
   wore since 7/17, NEVER red, and visibly distinct from the queued cards above so parked can
   never be misread as running. Rows are inert (no bump/hold/kill — the pen releases itself). */
.mf-pk-hd{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin:12px 0 2px;font:700 10px Inter,system-ui,sans-serif;letter-spacing:.06em;text-transform:uppercase;color:#92600d}
.mf-pk-hd .rel{font:700 10px Inter;letter-spacing:.04em;text-transform:none;color:#92600d;background:#fbf0da;border:1px solid #f0e2c4;border-radius:999px;padding:2px 8px}
.mf-pk-hd .why{font:600 10px Inter;letter-spacing:0;text-transform:none;color:#9a8f77}
.mf-ld-row.pk.jobcard{align-items:flex-start;gap:8px;cursor:default;border:1px solid #f0e2c4;border-left:3px solid var(--lc,#c9c2b2);background:#fffdf9;border-radius:7px;padding:8px 8px 8px 9px;margin:5px 0;white-space:normal}
.mf-ld-row.pk .mf-jc-t{color:#5f4a1c}
.mf-pk-until{font:600 9.5px Inter,system-ui,sans-serif;color:#92600d;background:#fbf0da;border:1px solid #f0e2c4;border-radius:999px;padding:2px 8px;white-space:nowrap;flex:none}
.mf-pk-cyc,.mf-pk-why{font:600 9.5px Inter,system-ui,sans-serif;color:#9a8f77;white-space:nowrap;flex:none}
/* WHICH PEN it sits in — the raw directory name, styled as a filesystem fact, not a label. */
.mf-pk-pen{font:500 9.5px ui-monospace,Menlo,monospace;color:#8a7f66;background:#f7f2e6;border:1px solid #ece2ca;border-radius:5px;padding:2px 6px;white-space:nowrap;flex:none}
.mf-pk-pool{display:inline-flex;flex:none}
/* PAGERS + DAY NAV (Craig 7/24 "one big dashboard... no scroll bars anywhere"). Calm and small,
   always present when a list outruns its window — the controls ARE the disclosure. */
.mf-pager{display:flex;align-items:center;gap:8px;padding:8px 2px 2px;flex-wrap:wrap}
.mf-pgb{font:600 11px Inter,system-ui,sans-serif;color:#4a5a4d;background:#f4f6f2;border:1px solid #e2e6dd;border-radius:999px;padding:4px 11px;cursor:pointer;white-space:nowrap}
.mf-pgb:hover:not(:disabled){background:#eaf0e9}
.mf-pgb:disabled{opacity:.42;cursor:default}
.mf-pgb.today.on{background:var(--canopy,#1e3b2f);border-color:var(--canopy,#1e3b2f);color:#fff;opacity:1}
.mf-pgn{font:600 11px Inter,system-ui,sans-serif;color:#9aa39b;font-variant-numeric:tabular-nums}
/* (RETIRED 7/26) .mf-pgr/.mf-pgr-l/.mf-pgr-b — the 10/15/20 rows-per-window chooser. Row counts
   are now the fixed _MF_LEFT_PER/_MF_RIGHT_PER constants; there is nothing left to choose. */
.mf-day-nav{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-bottom:6px}
.mf-day-pick{font:600 11.5px Inter,system-ui,sans-serif;color:var(--canopy,#1e3b2f);background:#fff;border:1px solid #e2e6dd;border-radius:8px;padding:4px 8px;max-width:230px;cursor:pointer}
.mf-day-span{font:400 11px Inter,system-ui,sans-serif;color:#9aa39b;margin-bottom:8px}
.mf-cu-tab .n.park{font-weight:700;opacity:.7;margin-left:6px;color:#92600d;background:#fbf0da;border-radius:999px;padding:1px 7px;font-size:10px}
.mf-cu-tab.on .n.park{color:#fbf0da;background:rgba(255,255,255,.16);opacity:.95}
.mf-jc-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.mf-jc-t{font:600 12.5px/1.35 Inter,system-ui,sans-serif;color:var(--motm-charcoal,#2b2f2c);overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.mf-jc-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}
.mf-lane-badge{font:700 9px Inter,system-ui,sans-serif;letter-spacing:.05em;text-transform:uppercase;color:#fff;border-radius:999px;padding:2px 8px;white-space:nowrap;flex:none}
.mf-ld-row .b{font:800 10px Inter,system-ui,sans-serif;border-radius:6px;padding:2px 7px;flex:none;white-space:nowrap}
.mf-ld-row .b.ok{background:#eef5ef;color:var(--brand-ok,#15803d)}.mf-ld-row .b.wn{background:#faf3e3;color:#d97706}.mf-ld-row .b.bl{background:#fbece8;color:#c0492f}
.mf-rx-av{width:18px;height:18px;border-radius:50%;object-fit:cover;flex:none;display:block}
.mf-ld-chev{flex:none;color:#c3bcae;font:600 13px Inter;transition:transform .15s;line-height:1}
.mf-ld-chev.open{transform:rotate(90deg)}
.mf-rx-panel{display:none;margin:2px 0 6px;padding:8px 10px;background:#fff;border:1px solid #ece7da;border-radius:8px}
.mf-rx-panel.open{display:block}
.mf-rx-wrap{font:400 12px/1.5 Inter,system-ui,sans-serif;color:#374151;white-space:normal;margin-bottom:6px}
/* NO INNER SCROLLBARS (Craig 7/24): a long wrap used to scroll inside its own box — the exact
   thing the one-page law bans. It now CLAMPS with a fade and expands in place on click, so the
   content is never trapped behind a scrollbar and never silently cut off either. */
.mf-rx-wrap.wrapmd{max-height:320px;overflow:hidden;position:relative;cursor:pointer}
.mf-rx-wrap.wrapmd.clamped::after{content:'';position:absolute;left:0;right:0;bottom:0;height:46px;background:linear-gradient(to bottom,rgba(255,255,255,0),#fff 88%);pointer-events:none}
.mf-rx-wrap.wrapmd.open{max-height:none}
.mf-rx-wrap.wrapmd.clamped::before{content:'Show the full wrap ›';position:absolute;left:0;bottom:0;z-index:1;font:600 10.5px Inter,system-ui,sans-serif;color:var(--canopy,#1e3b2f);background:#fff;padding:2px 6px 0 0}
.mf-rx-rec{font:600 11px/1.45 Inter,system-ui,sans-serif;color:var(--motm-warning,#b87a14);white-space:normal;margin-bottom:6px}
.mf-rx-rec.prov{color:#6b736c}
.mf-rx-proofs{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px}
.mf-proof{display:inline-flex;align-items:center;gap:3px;font:600 10.5px Inter,system-ui,sans-serif;color:#24619f;background:#f1f6fb;border:1px solid #d7e4f2;border-radius:999px;padding:2px 9px;cursor:pointer;text-decoration:none;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-proof:hover{background:#e6f0fa}
/* EVIDENCE FOLD (Craig 7/23 4:53p): job-89 proof shots relocated INTO the completed-row receipt —
   a calm canopy-tinted block, court-honest verified/awaiting label, shots reuse the bv-ev thumbs. */
.mf-ev-fold{margin:2px 0 6px;padding:8px 10px;background:#f6f8f5;border:1px solid #dde7dc;border-radius:8px}
.mf-ev-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.mf-ev-title{font:700 10px Inter,system-ui,sans-serif;letter-spacing:.07em;text-transform:uppercase;color:var(--canopy,#3e7d5c)}
.mf-ev-changed{font:400 11.5px/1.45 Inter,system-ui,sans-serif;color:#6b7669;margin-bottom:6px}
.mf-ev-badge{display:inline-flex;align-items:center;gap:4px;font:600 10px Inter,system-ui,sans-serif;border-radius:999px;padding:2px 8px;white-space:nowrap}
.mf-ev-badge.ok{background:#eef6f0;border:1px solid #cfe6d6;color:var(--canopy,#3e7d5c)}
.mf-ev-badge.wn{background:#fdf3e2;border:1px solid #ecd9ae;color:#8a5c10}
.mf-ev-badge.aw{background:#f4f2ec;border:1px solid #e2ddcf;color:#6b7669}
/* COVERAGE HONESTY (Craig 7/23 5:02p item 7): client-touch job w/ no visual proof — visible absence,
   court-honest amber (a coverage gap, not a Craig-court failure), never red. */
.mf-noproof{font:700 9px Inter,system-ui,sans-serif;letter-spacing:.03em;background:#faf3e3;color:#b87a14;border:1px solid #ecd9ae;border-radius:999px;padding:2px 7px;flex:none;white-space:nowrap}
/* EVIDENCE VISIBILITY (Craig 7/26 1:32p "A lot of the jobs completed today have no evidence").
   Artifact chips read as PROOF — the canopy-tinted 📎 count on the row, the file chips in the
   panel. The absence tag borrows .mf-noproof's exact amber: an evidence gap is a coverage miss,
   never an alarm, and the two markers sitting side by side must read as one family. 'pre-law'
   is quieter still (grey) — those wraps aren't delinquent, the law postdates them. */
.mf-artn{font:700 9px Inter,system-ui,sans-serif;letter-spacing:.03em;background:#f1f4f0;color:var(--canopy,#3e7d5c);border:1px solid #dbe4d9;border-radius:999px;padding:2px 6px;flex:none;white-space:nowrap}
/* THE TITLE OUTRANKS THE CHIPS. .lbl is the row's only flex:1 item, so every fixed-width chip
   beside it shrinks the TITLE first — the evidence tags crushed "Deep-counting broken feeds" to
   "De…", which is Craig's own complaint relocated. Measured, not guessed: the completed row had
   357px to hold badge+title+attribution+tag+cost+time+chev, and the fixed items alone wanted 337.
   A min-width floor on .lbl was the wrong lever — it just pushed the overflow onto the right-hand
   end, clipping the cost and the timestamp (hiding data to show data). The width comes from the
   DECK instead: COMPLETED TODAY packs six fields per row while COMING UP holds a handful of cards
   that wrap and usually sits half empty, so the split stops being 50/50. Equal columns still apply
   below 900px, where auto-fit stacks them and the ratio is meaningless. */
@media (min-width:900px){ .mf-lower-deck{grid-template-columns:minmax(0,1.34fr) minmax(0,1fr)} }
.mf-ld-row.rx{gap:5px}
.mf-ld-row.rx .mf-attr{max-width:112px}
.mf-noev{font:700 9px Inter,system-ui,sans-serif;background:#faf3e3;color:#b87a14;border:1px solid #ecd9ae;border-radius:999px;padding:2px 6px;flex:none;white-space:nowrap}
.mf-noev.pre{background:#f4f2ec;color:#7c8479;border-color:#e2ddcf}
.mf-noev-note{font:400 11px/1.45 Inter,system-ui,sans-serif;color:#8a5c10;background:#fdf9f0;border:1px solid #efe3cb;border-radius:8px;padding:6px 9px;margin:2px 0 6px}
.mf-rx-arts{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-bottom:6px}
.mf-arts-l{font:700 9.5px Inter,system-ui,sans-serif;letter-spacing:.06em;text-transform:uppercase;color:#8d9489;flex:none}
.mf-art{display:inline-flex;align-items:center;gap:4px;font:600 10.5px Inter,system-ui,sans-serif;color:#4a5a4d;background:#f4f7f3;border:1px solid #dde5db;border-radius:999px;padding:2px 9px;cursor:pointer;text-decoration:none;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-art:hover{background:#e9f0e7;color:var(--canopy,#1e3b2f)}
/* QUEUED-ROW LEGIBILITY (Craig 7/26 "There isn't information here for me to see what this queued
   job is"): the target lane's face, the prompt-first sub-line, the priority/minter chips, and the
   expanded body + fact strip. Unstamped facts render muted italic — visibly a hole, not a value. */
.mf-jc-av{width:26px;height:26px;border-radius:50%;object-fit:cover;flex:none;display:block;margin-top:1px}
.mf-jc-sub{font:400 11px/1.4 Inter,system-ui,sans-serif;color:#6b736c;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.mf-jc-pri{font:700 9px Inter,system-ui,sans-serif;letter-spacing:.04em;text-transform:uppercase;background:#f0f3ef;color:#5b6a5d;border:1px solid #dde5db;border-radius:999px;padding:2px 7px;flex:none;white-space:nowrap}
.mf-jc-by{font:600 9.5px Inter,system-ui,sans-serif;color:#7b8a7d;background:#f6f8f5;border:1px solid #e2e9e0;border-radius:999px;padding:2px 7px;flex:none;white-space:nowrap;max-width:150px;overflow:hidden;text-overflow:ellipsis}
.mf-jc-body{font:400 11.5px/1.55 Inter,system-ui,sans-serif;color:#374151;white-space:pre-wrap;background:#fbfcfa;border:1px solid #eceee9;border-left:2px solid var(--canopy,#3e7d5c);border-radius:6px;padding:7px 9px;margin-bottom:7px}
.mf-jc-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:3px 12px;margin-bottom:7px}
.mf-jc-fact{display:flex;align-items:baseline;gap:6px;min-width:0}
.mf-jc-fact .k{font:700 9px Inter,system-ui,sans-serif;letter-spacing:.06em;text-transform:uppercase;color:#9aa39b;flex:none}
.mf-jc-fact .v{font:600 11px Inter,system-ui,sans-serif;color:#3f4a41;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-jc-fact .v.na{font-weight:400;font-style:italic;color:#a6ada7}
/* PROOF ALWAYS SURFACES (Craig 7/23): a thin divider above proof-bearing rows the 8-cap would bury */
.mf-ld-subh{font:700 9.5px Inter,system-ui,sans-serif;letter-spacing:.06em;text-transform:uppercase;color:var(--canopy,#3e7d5c);margin:10px 0 4px;padding-top:8px;border-top:1px dashed #dde7dc}
.mf-proof.plain{color:#6b736c;background:#f3f0e6;border-color:#e7e2d4;cursor:default}
.mf-rx-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.mf-rx-chip{font:700 10px Inter,system-ui,sans-serif;background:#f3f0e6;color:#6b736c;border-radius:999px;padding:2px 8px}
.mf-rx-id{font:400 10px ui-monospace,Menlo,monospace;color:#9aa39b;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.mf-eg-line{display:flex;gap:8px;align-items:center;padding:4px 0;border-top:1px solid #f0ece0;min-width:0}
.mf-eg-line:first-of-type{border-top:none}
.mf-eg-line .mf-rx-id{flex:1;min-width:0;white-space:nowrap}
.mf-eg-rec{font:400 10px Inter;color:var(--motm-warning,#b87a14);flex:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:45%}
.mf-eg-line .tm{color:#c3bcae;font:400 10px Inter;flex:none}
.mf-ld-row .dur.bumped{color:var(--brand-ok,#15803d);font-weight:800}
.mf-dc-ctl{display:flex;gap:6px;margin-bottom:6px;flex-wrap:wrap}
.mf-ctl{font:700 11px Inter,system-ui,sans-serif;color:#374151;background:#f3f0e6;border:1px solid #ddd6c4;border-radius:8px;padding:4px 12px;cursor:pointer;line-height:1.2}
.mf-ctl:hover{background:#ebe6d6}
.mf-ctl.kill{color:#c0492f;background:#fdf6f4;border-color:#eed4cc}
.mf-ctl.kill:hover{background:#fbece8}
.mf-ctl.rel{flex:none;margin-left:auto;color:#24619f;background:#f1f6fb;border-color:#d7e4f2;font-size:10px;padding:3px 10px}
.mf-ctl.rel:hover{background:#e6f0fa}
.mf-ld-row.held{background:#eceff2;border-radius:6px;padding-left:8px;padding-right:6px;margin:3px 0}
.mf-ld-row.held .lbl{color:#55636f}
.mf-ld-row.held .mf-ctl.kill{flex:none;font-size:10px;padding:3px 8px;margin-left:4px}
#mf-undo{position:fixed;left:50%;bottom:26px;transform:translate(-50%,16px);background:#2b2f2c;color:#f5f2e8;font:600 12.5px Inter,system-ui,sans-serif;border-radius:10px;padding:10px 14px;display:flex;align-items:center;gap:10px;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:9999;box-shadow:0 6px 24px rgba(0,0,0,.25)}
#mf-undo.show{opacity:1;transform:translate(-50%,0);pointer-events:auto}
#mf-undo .mf-rx-id{color:#c9c2b2;max-width:340px;white-space:nowrap}
#mf-undo button{font:700 11px Inter,system-ui,sans-serif;color:#2b2f2c;background:#f5d878;border:none;border-radius:7px;padding:5px 12px;cursor:pointer}
#mf-undo button:hover{background:#f0cd5a}
/* COMPLETED HISTORY pager (Craig 7/19) — day headers + the Earlier expander. Calm chrome:
   history is the record, not an alarm surface; the button wears the mf-ctl idiom. */
.mf-hist-h{margin-top:16px}
.mf-hist-n{font:600 10px Inter;color:#c3bcae;text-transform:none;letter-spacing:0}
.mf-earlier{display:block;width:100%;margin-top:10px;font:700 11.5px Inter,system-ui,sans-serif;color:#374151;background:#f3f0e6;border:1px solid #ddd6c4;border-radius:8px;padding:6px 12px;cursor:pointer;line-height:1.2;text-align:center}
.mf-earlier:hover{background:#ebe6d6}
.mf-earlier[disabled]{opacity:.6;cursor:default}
.mf-hist-more{padding:6px 4px 2px;color:#24619f;font:600 11px Inter;cursor:pointer}
.mf-hist-more:hover{text-decoration:underline}
.mf-hist-note{padding:8px 0 2px;color:#9aa39b;font:400 11px Inter}

/* ── JOB ID CHIP — running rows, queued/parked job cards, held rows (Craig 7/26 2:35p) ─────────
   Still used where there is no #handle to copy through (a queued/parked/held/running job has not
   joined a completed day's record yet — see _hndFor). The completed-row full-width bar this chip
   used to grow on .rx rows is RETIRED (Craig 7/26 4:25p): "The wide job ID bar is copied to
   clipboard and too much." Completed rows copy through the #handle now (below); this chip stays
   only where a handle cannot reach. */
.mf-jidc{display:inline-block;vertical-align:middle;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font:500 var(--fs-micro,10px)/1.35 ui-monospace,SFMono-Regular,Menlo,monospace;color:#a9a294;
  background:#f4f2ec;border:1px solid #e7e2d4;border-radius:5px;padding:1px 6px;cursor:pointer}
.mf-jidc:hover{color:var(--canopy,#1e3b2f);background:#eef2ec;border-color:#d7e0d4}
.mf-jidc:focus-visible{outline:2px solid var(--canopy,#1e3b2f);outline-offset:1px}
/* copy feedback is court-honest: --signal is the healthy state, the failure wears the same amber
   every other coverage gap on this surface wears — never red, nothing is broken. */
.mf-jidc.copied{color:#fff;background:var(--signal,#3e7d5c);border-color:var(--signal,#3e7d5c)}
.mf-jidc.copyfail{color:#8a5c10;background:#fdf3e2;border-color:#ecd9ae}
/* HELD rows still stack the chip onto its own line (same reasoning the retired .rx rule had —
   a held row's fixed fields + two control buttons leave no inline room for a 30-char id). */
.mf-ld-row.held{flex-wrap:wrap;row-gap:0}
.mf-ld-row.held .mf-jidc{flex-basis:100%;order:9;margin-top:1px;
  background:transparent;border-color:transparent;padding:1px 2px}
.mf-ld-row.held .mf-jidc:hover{background:#f4f2ec;border-color:#e7e2d4}
/* running rows and job cards already stack vertically — the chip just sits in the flow */
.mf-jid .mf-jidc.run{background:transparent;border-color:transparent;padding:0}
.mf-jid .mf-jidc.run:hover{background:#f4f2ec;border-color:#e7e2d4;padding:0 3px;margin:0 -3px}
.mf-jc-id{margin-top:4px;min-width:0}

/* SEARCH FIELD — the .mf-day-pick idiom (white, #e2e6dd hairline, 8px radius) so the search and
   the day picker read as two controls of one system rather than two eras of the widget. */
.mf-srch{display:flex;align-items:center;gap:7px;background:#fff;border:1px solid #e2e6dd;border-radius:8px;padding:5px 9px;margin-bottom:7px}
.mf-srch.on{border-color:var(--canopy,#1e3b2f);box-shadow:0 0 0 2px rgba(30,59,47,.07)}
.mf-srch-g{flex:none;line-height:1;color:#b3bab4;font-size:15px}
.mf-srch-i{flex:1;min-width:0;border:none;outline:none;background:none;padding:1px 0;
  font:500 var(--fs-body,13.5px)/1.35 Inter,system-ui,sans-serif;color:var(--motm-charcoal,#1a1d1c)}
.mf-srch-i::placeholder{color:#b3aea0;font-weight:400}
.mf-srch-i::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}
.mf-srch-x{flex:none;border:none;background:none;cursor:pointer;padding:2px 3px;line-height:1;
  font:600 12px Inter,system-ui,sans-serif;color:#9aa39b}
.mf-srch-x:hover{color:var(--canopy,#1e3b2f)}
.mf-srch-rng{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:7px}
.mf-srch-rl{font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;color:#9aa39b;text-transform:uppercase;letter-spacing:.06em}
.mf-srch-d{font:600 11px Inter,system-ui,sans-serif;color:var(--canopy,#1e3b2f);background:#fff;border:1px solid #e2e6dd;border-radius:7px;padding:3px 7px;cursor:pointer}
.mf-srch-rx{font:600 10px Inter,system-ui,sans-serif;color:#7d877f;background:transparent;border:1px solid #e2e6dd;border-radius:999px;padding:3px 9px;cursor:pointer}
.mf-srch-rx:hover{background:#f0f3ef;color:var(--canopy,#1e3b2f)}
/* CALM EMPTY STATE: no jobs match is an ANSWER, not an error — grey body type, no icon, no
   alarm colour. Nothing failed; the record simply does not hold what was asked for. */
.mf-srch-zero{padding:14px 2px 10px;font:400 var(--fs-body,13.5px)/1.5 Inter,system-ui,sans-serif;color:#9aa39b}
/* results span days, so each row states its own — the deck's single-day header cannot */
.mf-sq-day{flex:none;white-space:nowrap;font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;letter-spacing:.05em;
  color:#7d877f;background:#f1f4f0;border:1px solid #e2e6dd;border-radius:5px;padding:2px 6px}

/* ── #DAY HANDLES + LINEAGE CHAINS (Craig "fold both" 7/26, copy-target moved here 4:25p) ───────
   The handle leads the row because that is what it IS — a line number for the day's record. It is
   monospace for the same reason a job id is (a key you read character by character). IT IS NOW
   THE COPY CONTROL for the completed record's job id — "Let's just make the ID # out to the left
   the copy option" — so it is clickable/keyboard-reachable and wears the copy feedback states the
   retired id bar used to. flex:none so it never surrenders width to .lbl. */
.mf-hnd{flex:none;font:600 var(--fs-micro,10px)/1.35 ui-monospace,SFMono-Regular,Menlo,monospace;
  color:#b0a99b;letter-spacing:.02em;cursor:pointer;min-width:24px;border-radius:5px;padding:1px 3px;margin:-1px -3px}
.mf-ld-row:hover .mf-hnd{color:var(--canopy,#1e3b2f)}
.mf-hnd:hover{background:#f4f2ec}
.mf-hnd:focus-visible{outline:2px solid var(--canopy,#1e3b2f);outline-offset:1px}
/* copy feedback — same court-honest palette the retired id bar wore: --signal for success, the
   standing amber (never red) for "press ⌘C instead". */
.mf-hnd.copied{color:#fff;background:var(--signal,#3e7d5c)}
.mf-hnd.copyfail{color:#8a5c10;background:#fdf3e2}
.mf-eg-line .mf-hnd{margin-right:2px}

/* A MISSION ROW IS NOT AN ALARM. Three attempts that ended green is a SUCCESS story, so the chain
   row wears the deck's ordinary type and the outcome badge of its LAST attempt — never amber for
   having taken more than one go. Court-honest: the colour here reports the ending, not the effort.
   The only visual difference from an ordinary row is the chain chip and a hairline left rule that
   says "this one contains something". */
/* the verdict rides flex:none so the mission NAME gives up width first — the row must never
   ellipse away the '— attempt 4 — DONE' that is the whole reason the chain collapsed */
.mf-lin-at{flex:none;white-space:nowrap;font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;
  letter-spacing:.04em;color:#7d877f;background:#f1f4f0;border:1px solid #e2e6dd;
  border-radius:999px;padding:2px 8px;cursor:pointer}
.mf-ld-row.lin:hover .mf-lin-at{color:var(--canopy,#1e3b2f);border-color:#d7e0d4;background:#eef2ec}
/* the flat-row marker, for a chain member found on its own through search */
.mf-lin-mk{flex:none;white-space:nowrap;font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;
  color:#9aa39b;background:#f7f6f2;border:1px solid #ece9e0;border-radius:999px;padding:2px 7px}

/* THE OPEN CHAIN — indented under one hairline so the attempts read as belonging to the row above
   rather than as new rows in the day. Each step keeps its ordinary anatomy (badge, evidence tags,
   its own expandable receipt); only the small ordinal is added. */
.mf-lin-panel{padding-left:0}
.mf-lin-panel.open{border-left:2px solid #e7e2d4;margin-left:3px;padding-left:9px}
.mf-lin-step{display:flex;align-items:flex-start;gap:7px;min-width:0}
/* the step's body holds BOTH the member row and its own receipt panel, stacked — they must not
   become flex siblings of the ordinal, or an expanded receipt would sit beside its row */
.mf-lin-body{flex:1;min-width:0}
.mf-lin-sn{flex:none;margin-top:9px;width:15px;text-align:right;
  font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;color:#c3bdb0}

/* ── THE EVIDENCE VIEWER (Craig 8/5 video 2) ────────────────────────────────────────────────
   Craig's ask was "the images of what's been done" — so the artifact is the hero here and the
   chrome stays quiet: no card borders competing with screenshots, one hairline rule per item.
   Court-honest colour, per the standing law: amber (#b87a14 on #faf3e3) is a COVERAGE GAP —
   not published yet, withheld, too large. Red is reserved for the one state that is a real
   failure of proof: a wrap that claimed a file the fleet cannot find. */
.mf-artn.open{cursor:pointer}
.mf-artn.open:hover{background:var(--action-tint,#e4f9e8);border-color:var(--action-line,#8fdba8);color:var(--action-deep,#0c7a38)}
.mf-artn.open:focus-visible{outline:2px solid var(--action,#15a850);outline-offset:1px}
.mf-art.rev{background:#fff;border-style:dashed;color:#8d9a8f}
.mf-evv{font:400 var(--fs-body,13.5px)/1.5 Inter,system-ui,sans-serif;color:#2f3a31}
.mf-evv-title{font:600 15px Fraunces,Georgia,serif;color:var(--canopy,#1e3b2f)}
.mf-evv-sub{font:400 var(--fs-micro,10px) Inter,system-ui,sans-serif;color:#8a958c;margin:0 0 10px}
.mf-evv-sub code,.mf-evv-note code{font:500 10px ui-monospace,SFMono-Regular,Menlo,monospace;
  background:#f4f6f3;border-radius:4px;padding:1px 4px;word-break:break-all}
.mf-evv-item{border-top:1px solid #e8ece7;padding:12px 0}
.mf-evv-item:first-of-type{border-top:0}
.mf-evv-h{display:flex;align-items:baseline;gap:10px;margin-bottom:7px}
.mf-evv-n{flex:1;min-width:0;font:600 var(--fs-body,13.5px) Inter,system-ui,sans-serif;
  color:var(--canopy,#1e3b2f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-evv-s{flex:none;font:700 var(--fs-micro,10px) Inter,system-ui,sans-serif;letter-spacing:.04em;
  text-transform:uppercase;color:#9aa69c}
.mf-evv-s.ok{color:var(--signal,#3e7d5c)}
.mf-evv-s.warn{color:#b87a14}
.mf-evv-s.bad{color:#c0524d}
.mf-evv-b{min-height:18px}
.mf-evv-img{display:block;max-width:100%;height:auto;border:1px solid #e4e9e2;border-radius:8px;background:#fff}
.mf-evv-pdf{width:100%;height:70vh;border:1px solid #e4e9e2;border-radius:8px;background:#fff}
.mf-evv-pre{max-height:60vh;overflow:auto;margin:0;padding:11px 13px;background:#fbfcfa;
  border:1px solid #e8ece7;border-radius:8px;
  font:400 11.5px/1.55 ui-monospace,SFMono-Regular,Menlo,monospace;color:#39443b;white-space:pre-wrap;word-break:break-word}
.mf-evv-md{max-height:60vh;overflow:auto;padding:11px 15px;background:#fbfcfa;
  border:1px solid #e8ece7;border-radius:8px}
.mf-evv-md h1,.mf-evv-md h2,.mf-evv-md h3{font:600 14px Fraunces,Georgia,serif;color:var(--canopy,#1e3b2f);margin:12px 0 5px}
.mf-evv-md code{font:500 11px ui-monospace,Menlo,monospace;background:#f1f4f0;border-radius:4px;padding:1px 4px}
.mf-evv-act{display:flex;align-items:center;gap:10px;margin-top:6px}
.mf-evv-act a{font:600 var(--fs-micro,10px) Inter,system-ui,sans-serif;letter-spacing:.04em;
  text-transform:uppercase;color:var(--action-deep,#0c7a38);text-decoration:none}
.mf-evv-act a:hover{text-decoration:underline}
.mf-evv-p{flex:1;min-width:0;font:400 var(--fs-micro,10px) Inter,system-ui,sans-serif;color:#a3ada5;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mf-evv-note{font:400 12px/1.5 Inter,system-ui,sans-serif;border-radius:8px;padding:8px 11px}
.mf-evv-note.warn{color:#8a5c10;background:#fdf9f0;border:1px solid #efe3cb}
.mf-evv-note.bad{color:#8f3b37;background:#fdf2f1;border:1px solid #f0d4d2}
/* A REFERENCE ROW IS NOT A WARNING (8/6). Commit/QBO/Change-Log proofs have no bytes on the rail
   and are not supposed to — painting them amber would read as a defect on evidence that is fine.
   Calm --signal green, the same ink the loaded-bytes state wears at .mf-evv-s.ok above. */
.mf-evv-note.ok{color:var(--signal,#3e7d5c);background:#f4f8f5;border:1px solid #dfe8e1}
.mf-evv-note.ok a{color:var(--signal,#3e7d5c);font-weight:600}
