.shape-b-p3-root .row:first-child { border-top:none }
.shape-b-p3-root .row:hover { background:var(--ivory-brand) }
.shape-b-p3-root .row-glyph { width:14px;text-align:center;color:var(--text-secondary);font-size:13px;flex-shrink:0 }
.shape-b-p3-root .row-name { font:500 var(--fs-small) var(--font-ui);flex-shrink:0 }
.shape-b-p3-root .row-sub { font:400 var(--fs-meta) var(--font-ui);color:var(--text-secondary);overflow:hidden; text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0 }
.shape-b-p3-root .row-detail { padding:10px 16px 12px 34px;border-top:1px solid var(--border-soft);background:var(--ivory-brand) }
.shape-b-p3-root .row-detail-row { display:flex;gap:8px;font-size:var(--fs-small);margin-bottom:5px }
.shape-b-p3-root .row-detail-row .k { color:var(--text-secondary);width:90px;flex-shrink:0 }
.shape-b-p3-root .row-remove { font:500 var(--fs-small) var(--font-ui);color:var(--field-error);background:none; border:1px solid var(--field-error);border-radius:6px;padding:5px 10px;cursor:pointer }
.shape-b-p3-root .detail-section-label { font-size:var(--fs-meta);letter-spacing:.04em;text-transform:uppercase; color:var(--text-secondary);font-weight:600;margin-top:8px;margin-bottom:4px }
.shape-b-p3-root .evidence-list { margin:4px 0 10px }
.shape-b-p3-root .evidence-item { padding:6px 0;border-bottom:1px solid var(--border-soft) }
.shape-b-p3-root .evidence-item:last-of-type { border-bottom:none }
.shape-b-p3-root .evidence-url { display:block;margin-top:2px;font-size:var(--fs-meta);color:var(--accent-ink); text-decoration:none;overflow-wrap:anywhere }
.shape-b-p3-root .evidence-url:hover { text-decoration:underline }
.shape-b-p3-root .contested-heading { font-size:var(--fs-meta);letter-spacing:.06em;text-transform:uppercase; color:var(--state-mutation-ink);font-weight:600;padding:10px 16px 4px;margin-top:4px; border-top:1px solid var(--border-soft) }


/* ── Contested-person state, transcribed in the same pass (DESK-4). ── */
.shape-b-p3-root .contested-heading { font-size:var(--fs-meta);letter-spacing:.06em;text-transform:uppercase; color:var(--state-mutation-ink);font-weight:600;padding:10px 16px 4px;margin-top:4px; border-top:1px solid var(--border-soft) }
.shape-b-p3-root .contested-row { border-top:1px solid var(--border-soft);background:var(--state-pending-tint) }
.shape-b-p3-root .contested-row:first-child { border-top:none }

/* ── The filter row's container rules, transcribed in DESK-16. Its INPUTS
 *    are not ported: search, status select and clear need data candidate-read
 *    does not return. The container is what the stats' 4px margin and
 *    content-width sizing depend on. ── */
.shape-b-p3-root .filter-row { display:flex;align-items:center;gap:8px;padding:10px 16px;min-width:max-content }
.shape-b-p3-root .filter-row .cluster-stat { margin-left:4px }


/* ── DESK-20: the remaining P4 classes, transcribed from the standard at
 *    sha256 79496c5d1178aaef (first 16). Comments stripped before parsing so a
 *    comment cannot be read as a selector.
 *
 * ⛔ DELIBERATELY NOT PORTED: .cand-status / .validated / .unvalidated — the
 *    status badge, which AL-27 item 1 keeps OUT (departures 5, 11, 12 stand).
 *    Porting style for an element that must not render would be dead weight
 *    that later reads as an intention to build it.
 *
 * ⚠ SCOPED UNDER .shape-b-p3-root, which P4 shares because it mounts in the
 *    shared shell. Verified before scoping: none of these names appears in
 *    public/ already, and P3 renders none of them. ── */
.shape-b-p3-root .why-selected { margin:4px 0 10px;padding:8px 10px;background:var(--field); border:1px solid var(--border-soft);border-radius:6px; font-size:var(--fs-small);line-height:1.5;color:var(--text) }
.shape-b-p3-root .filter-row-scroll { overflow-x:auto;overflow-y:hidden;scrollbar-width:none;cursor:grab; overscroll-behavior-x:contain;border-bottom:1px solid var(--border-soft);background:var(--surface); background-image: linear-gradient(to right, var(--surface) 30%, transparent), linear-gradient(to left, var(--surface) 30%, transparent), linear-gradient(to right, rgba(28,27,24,.18), transparent), linear-gradient(to left, rgba(28,27,24,.18), transparent); background-repeat:no-repeat; background-size:24px 100%, 24px 100%, 8px 100%, 8px 100%; background-position:left, right, left, right; background-attachment:local, local, scroll, scroll }
.shape-b-p3-root .filter-row-scroll::-webkit-scrollbar { display:none }
.shape-b-p3-root .filter-row-scroll.dragging { cursor:grabbing;user-select:none }
.shape-b-p3-root .filter-search { flex:0 0 200px;font:400 var(--fs-small) var(--font-ui); padding:6px 10px;border:1px solid var(--border-soft);border-radius:var(--radius-field); background:var(--field);color:var(--text) }.shape-b-p3-root .filter-clear { font:500 var(--fs-small) var(--font-ui);color:var(--text-secondary); background:none;border:1px solid var(--border-soft);border-radius:var(--radius-field); padding:6px 10px;cursor:pointer;flex-shrink:0 }
.shape-b-p3-root .filter-clear:hover { color:var(--text);border-color:var(--border-strong) }
.shape-b-p3-root .no-matches { padding:14px 16px;font-size:var(--fs-body);color:var(--text-secondary);font-style:italic }
.shape-b-p3-root .contested-badge { display:inline-block;margin-left:6px;font-size:10px;font-weight:600; text-transform:uppercase;letter-spacing:.04em;color:var(--state-mutation-ink); background:var(--state-pending-tint);border-radius:4px;padding:1px 7px;vertical-align:middle }.shape-b-p3-root .reflection-row { border-top:1px solid var(--border-soft);padding:12px 16px 12px 46px; display:flex;align-items:center;gap:8px;color:var(--text-secondary); font-style:italic;background:repeating-linear-gradient(135deg,var(--surface),var(--surface) 8px,rgba(133,126,111,.08) 8px,rgba(133,126,111,.08) 16px) }
.shape-b-p3-root .reflection-row:first-child { border-top:none }

/* ⛔ THE WARM CANVAS, P4 ONLY — AL-27's "also build" list, and item 3's
 *    constraint that it must never touch the shared shell. The standard sets it
 *    on `body` (its own `body{background:var(--canvas)}`), and CSS cannot style
 *    a parent from a child — so `:has()` is what makes it conditional on P4
 *    being mounted. P3 has no such class, so it cannot match, and the shared
 *    shell is untouched. ⚠ The check measures `body`'s own computed
 *    background, which is why a wrapper alone would not have satisfied it. */
body:has(.shape-b-p4-root) { background: var(--canvas); }

/* ⛔ DRAWER FACE LABELS — AL-27 item 7, "built EXACTLY to the standard (Arial,
 *    13.33px), scoped to P4 only."
 *
 * ⚠ THE CAUSE, FOUND BY LOOKING RATHER THAN GUESSED: neither the standard nor
 *    any file in public/ sets a font on `.face`. A `button` does not inherit
 *    font-family, so the standard's face falls to the user agent's default —
 *    Arial 13.3333px in this Chromium. Our app differs only because Mantine
 *    normalises button fonts globally, and the standard has no such reset.
 *
 * ⚠ THE VALUES ARE AL'S OWN, named in AL-27 item 7, which is why they are set
 *    explicitly rather than with `font: revert`: a revert would depend on the
 *    user agent and could not be checked against a stated number.
 *
 * ⛔ SCOPED TO .shape-b-p4-root, NOT .shape-b-p3-root — the faces are SHARED
 *    shell chrome, so scoping this to the shared root would restyle P3's
 *    drawers too, which item 3 forbids and the P3 regression would catch. */
.shape-b-p4-root .face,
.shape-b-p4-root .face-label { font-family: Arial; font-size: 13.3333px; }.shape-b-p4-root .evidence-snippet { font-size:var(--fs-small);line-height:1.5;color:var(--text);font-style:italic }

/* ⛔ THE ADVISOR TOGGLE'S LINE-HEIGHT — THE SAME CAUSE AS THE DRAWER FACES
 *    ABOVE, AND I FIXED THE FACES WITHOUT NOTICING IT REACHED THIS BUTTON TOO.
 *
 * The standard's `.adv-toggle` (:90-91) sets font-size, font-weight and
 * font-family SEPARATELY — never the `font` shorthand — so it declares no
 * line-height and the button keeps the UA's `normal`: 12px (--fs-meta) renders
 * 15px tall. Our app's Mantine base sets a numeric line-height on buttons, so
 * the same 12px renders 12 × 1.5 = 18px — exactly the measured gap
 * (standard 39.0x15.0 vs built 39.2x18.0). This rule closes that one finding.
 *
 * ⛔ CORRECTION, WRITTEN AFTER MEASURING RATHER THAN LEFT STANDING. This
 *    comment first claimed the same 3px also explained the advisor block
 *    (159 vs 155) and its inline max-height (138 vs 134) — "one root cause,
 *    three findings". IT DOES NOT, and the re-run proved it: the toggle
 *    finding cleared and both advisor findings survived unchanged.
 *    THE REASON IS READABLE IN THE STANDARD: the toggle sits inside
 *    `.adv-head` (:467-470) beside `.adv-tag`, which is 14px to the toggle's
 *    12px, so the head's height is set by the tag and shrinking the toggle
 *    cannot move it. The advisor's residual 4px is on `.adv-content`'s
 *    scrollHeight and is NOT a port gap: every advisor rule body is
 *    byte-identical to the standard, both pages load the same Google Fonts,
 *    and the tokens resolve the same. It is reported as unexplained.
 *
 * Scoped to P4 only: the advisor is shared shell chrome, and P3 must stay
 * byte-identical. */
.shape-b-p4-root .adv-toggle { line-height: normal; }

/* ⛔ THE TWO-PANEL CONTESTED DESIGN — new in the canonical mockup, 2026-10-07.
 *    Bodies transcribed byte-identical from its own <style>; the bulk bar, its
 *    select and button, the per-person choice buttons and `.contested-detail`
 *    are all gone, and their rules are deleted above rather than left as dead
 *    weight.
 *
 * ⚠ AND THE PURPLE IS GONE WITH THEM. The canonical file contains NO
 *   `--provisional` at all — zero definitions, zero uses, counted — and uses
 *   `--state-mutation-ink` / `--state-pending-tint` instead, both of which
 *   `subleeva-tokens.css` actually owns. That answers the DESK-14 colour
 *   audit's central finding (a token the authoritative file did not define,
 *   duplicated across two stylesheets) at source rather than by my proposal. */
.shape-b-p4-root .contested-campaign-panel { margin:10px 0 0;padding:8px 10px;background:var(--field);
  border:1px solid var(--state-mutation-ink);border-radius:6px;font-size:var(--fs-small);line-height:1.5 }
.shape-b-p4-root .contested-campaign-panel-heading { font:600 var(--fs-small) var(--font-ui);color:var(--text);margin-bottom:6px }
.shape-b-p4-root .contested-commit-btn { font:500 var(--fs-small) var(--font-ui);color:#fff;
  background:var(--state-mutation-ink);border:none;border-radius:var(--radius-field);
  padding:6px 12px;cursor:pointer;margin-top:8px }

/* ⛔ THE SEVEN THEATRE-4 ITEMS — bodies transcribed byte-identical from the
 *    canonical's own <style> (d429e390).
 *
 * ⚠ AND THE COLOUR CAME OUT OF TWO OF THEM. `.mock-badge` and
 *   `.tier-illustrative` previously carried the amber/provisional pair; the
 *   canonical strips both to a neutral surface with a DASHED border, and states
 *   the reason in its own words: DESK_PATTERN §20 item 4 — a structural gap is
 *   "neither a gate (§4.5 reserves amber for an active decision blocking
 *   progress) nor a task", so "no reserved colour fits that meaning, so none is
 *   used". The label text is the channel, not the colour. These two overrides
 *   come AFTER the P3-scoped ports above so they win on source order for P4
 *   without touching P3's own rendering of the same classes. */
.shape-b-p4-root .mock-badge { display:inline-block;margin-left:6px;font-family:var(--font-ui);font-style:normal;text-decoration:none;
  font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary);
  background:var(--surface);border:1px dashed var(--border-strong);border-radius:4px;padding:1px 6px;vertical-align:middle }
.shape-b-p4-root .tier-illustrative { margin:4px 0 10px;padding:8px 10px;background:var(--surface);
  border:1px dashed var(--border-strong);border-radius:6px;font-size:var(--fs-small);color:var(--text-secondary) }

/* Item 2 — the snippet gate's own treatment: same neutral/dashed family, its
 * own copy, inline because it stands in for the snippet text itself. */
.shape-b-p4-root .evidence-snippet-withheld { font-size:var(--fs-small);line-height:1.5;color:var(--text-secondary);
  font-style:italic;background:var(--surface);border:1px dashed var(--border-strong);
  border-radius:4px;padding:4px 7px;display:inline-block }

/* Item 3 — the locked banner. A finished, successful state, so it reuses the
 * SAME success tokens the done spine pills and drawer progress rows use; it is
 * deliberately not amber, which is reserved for a pending gate. */
.shape-b-p4-root .locked-banner { padding:10px 16px;font-size:var(--fs-small);color:var(--state-success);
  background:var(--surface);border-bottom:1px solid var(--state-success);font-weight:500 }

/* Item 3 — the disabled affordance. ⚠ Keyed off the real `:disabled` pseudo-
 * class, matching the canonical, because the buttons carry the real attribute:
 * "a disabled button cannot fire its own onclick at all, which is what 'does
 * nothing silently' actually requires." */
.shape-b-p4-root .row-remove:disabled,
.shape-b-p4-root .contested-commit-btn:disabled,
.shape-b-p4-root .btn-primary:disabled { opacity:.45;cursor:not-allowed }

/* ⛔ THE BASE `.row` RULE WAS NEVER PORTED, and only its two modifiers were —
 *    `.row:first-child` and `.row:hover` sit at the very top of this file with
 *    no base rule beneath them. So every candidate row rendered with no flex
 *    layout at all: name and subtitle ran together as
 *    "Patrick GallagherFleet Director · DespatchLink", with no gap, no vertical
 *    centring and no row height.
 *
 * ⚠ MY OWN CLASS AUDIT LISTED `.row` AS MISSING THIS PASS AND I PORTED THE
 *   OTHER TWO IT NAMED, NOT THIS ONE. It was caught by looking at the check's
 *   own screenshot — the check itself reports it only as geometry on elements
 *   INSIDE the row, which reads as a size difference rather than an absent
 *   rule. Third time a geometry finding has turned out to be a missing
 *   stylesheet rule; the lesson holds.
 *
 * Body transcribed byte-identical from the canonical. */
.shape-b-p4-root .row { display:flex;align-items:center;gap:8px;padding:12px 16px 12px 46px;
  border-top:1px solid var(--border-soft);cursor:pointer;min-height:var(--target-min) }
