/* ==========================================================================
   note-evolution-takeover.css — Three-Substrate Workspace shell
   ─────────────────────────────────────────────────────────────────
   Wave 1 (2026-05-07) — Dark Roast Black Label v4 visual contract.
   Tokens consumed from `static/css/dark-roast-tokens.css` only.
   No --term-* references. No Tailwind admin colors. No rounded-corner
   bling, no drop shadows, no backdrop-filter.

   Geometry:
     The original static mockup used a 1360 px internal canvas. The live
     census shell often gives the takeover less room after the patient list,
     so the production layout uses tighter floors and only stacks on genuinely
     small screens.

   Visual contract:
     1 px hairline borders, 2 px max border-radius, monospace data,
     warm-coffee scanline overlay, two-tier severity (burnt-sienna
     recoverable, scarlet hard-block).

   Patch queue grid:
     24 px row grid, content-derived min-height per validation state.
     Container-owned scroll on .nev-review-queue.
     Push-down drawer (sibling tiles shift, no overlay).

   REF: docs/plans/2026-05-06-001-note-evolution-remediation-plan.md Wave 1
   REF: .handoffs/three-substrate-mockups-v1/INDEX.md (binding visual contract)
   ========================================================================== */

/* ----------------------------------------------------------------- *
 * Takeover host — sibling of .sol-clinical-grid-container, same     *
 * parent (.sol-workspace-main). Activates only when                 *
 * .sol-workspace-main has data-takeover="active".                   *
 * ----------------------------------------------------------------- */

#noteEvolutionTakeover {
    /* Default OFF: invisible until takeover-active flips it.
       The display:none here matches the inline style on the mount
       point so the takeover does not flash on page load. */
    display: none;
}

.sol-workspace-main[data-takeover="active"] #noteEvolutionTakeover {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    background: var(--dr-void, #120C06);
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-body, 'DM Sans', system-ui, sans-serif);
    /* Container-owned scroll: the takeover never lets the browser
       scroll the underlying chart. The 3-column grid below decides
       which column scrolls. */
    overflow: hidden;
    position: relative;
    /* Account for global Voice Dictation bar at bottom of viewport */
    padding-bottom: 80px;
}

/* Hide the chart-center (clinical grid) when takeover is active.
   The census strip above and rail beside remain visible. */
.sol-workspace-main[data-takeover="active"] .sol-clinical-grid-container,
.sol-workspace-main[data-takeover="active"] #dataDrawer {
    display: none !important;
}

/* FIX (2026-05-14): defense-in-depth hide for chart panels that
   somehow leak past the parent rule. Doctor reported the LABS panel
   (and tabs) showing above the takeover work surface, eating ~30% of
   vertical real estate. The takeover IS the workspace — nothing from
   the chart center should be visible simultaneously. Body-level
   attribute set by NoteEvolutionTakeover.enter() catches the panel
   regardless of which ancestor it sits under. */
body[data-takeover-active="true"] .sol-clinical-grid-container,
body[data-takeover-active="true"] .sol-clinical-grid,
body[data-takeover-active="true"] .sol-labs-panel,
body[data-takeover-active="true"] .sol-vitals-panel,
body[data-takeover-active="true"] .sol-meds-panel,
body[data-takeover-active="true"] .sol-cultures-panel,
body[data-takeover-active="true"] .sol-timeline-prominent,
body[data-takeover-active="true"] .sol-data-timeline-panel,
body[data-takeover-active="true"] .sol-problems-panel,
body[data-takeover-active="true"] .ai-overnight-summary,
body[data-takeover-active="true"] .reasoning-tree-panel,
body[data-takeover-active="true"] .pb-panel,
body[data-takeover-active="true"] #dataDrawer,
body[data-takeover-active="true"] .data-drawer {
    display: none !important;
}

/* Phase A / A-2 (2026-05-09): hide the rail (#noteRail) while the takeover
   is the active surface. The takeover IS the workspace at this point —
   leaving the rail beside it produced two competing UIs in UAT.

   Why a body-level attribute (not .sol-workspace-main): #noteRail is a
   sibling of .sol-workspace-main, not a descendant, so the existing
   .sol-workspace-main[data-takeover="active"] selectors can't reach it.
   The body attribute is set/cleared by NoteEvolutionTakeover.enter() /
   exit() / resetForPatientSwitch() (search "takeoverActive" in
   note-evolution-takeover.js).

   Why !important: the rail's own visibility logic is opinionated — it
   can re-show itself via expand() or stage transitions independent of
   the takeover. The takeover-active state must be a hard override; the
   rail must stay hidden until exit() clears the attribute. */
body[data-takeover-active="true"] #noteRail {
    display: none !important;
}

/* Phase B-2 (2026-05-09): defense-in-depth selector for the in-rail
   substrate's clinical-update textarea. The Phase A-2 rule above already
   hides #nevClinicalUpdateInput by parent-cascade — the textarea lives
   inside #railStageEvolution inside #noteRail (template structure verified
   2026-05-09 at templates/census.html lines 1558, 2493, 2500). CSS
   `display: none` on a parent hides every descendant.

   Why an explicit rule anyway: Phase B unifies the dual-textarea so that
   LivingUpdateColumn._draftText is the canonical input source. If a
   future refactor lifts the textarea out of #railStageEvolution (e.g., a
   floating composer overlay), the parent-cascade hide breaks silently
   and the doctor sees two competing input surfaces again. The explicit
   selector pins the contract: "this textarea is hidden whenever takeover
   is active, regardless of where in the DOM it lives." Cheap insurance.

   Verification: parent-cascade hide is already effective. This selector
   adds zero behavior change today; it's a future-refactor safeguard. */
body[data-takeover-active="true"] #nevClinicalUpdateInput {
    display: none !important;
}

/* Warm-coffee scanline overlay (replaces the cool-teal terminal
   register). Pinned to the takeover surface, not the body, so it
   doesn't bleed onto the rail. */
#noteEvolutionTakeover::before {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background-image:
        repeating-linear-gradient(
            0deg,
            rgba(230, 154, 76, 0.012) 0,
            rgba(230, 154, 76, 0.012) 1px,
            transparent 1px,
            transparent 3px
        );
    z-index: 1;
}

/* ----------------------------------------------------------------- *
 * Header strip — identity tuple + close affordance                  *
 * ----------------------------------------------------------------- */

.nev-takeover-header {
    display: flex;
    align-items: center;
    gap: 12px;
    /* Tightened 2026-05-14: 8/12 -> 4/10. Recovers ~10px of vertical
       chrome above the columns. The sub-header was eating ~38px while
       only carrying eyebrow + title + identity tuple + close. */
    padding: 4px 10px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-obsidian, #160E08);
    flex: 0 0 auto;
    position: relative;
    z-index: 2;
}

.nev-takeover-header-title {
    font-family: var(--dr-font-heading, 'Instrument Sans', sans-serif);
    font-size: var(--dr-text-base, 0.875rem);
    font-weight: 600;
    color: var(--dr-bone, #EBE1D7);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    margin-right: auto;
    min-width: 0;
    white-space: nowrap;
}

.nev-takeover-header-title .nev-takeover-marker {
    /* "EVOLUTION" eyebrow, dim mono. */
    display: inline-block;
    margin-right: 8px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-amber, #E69A4C);
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    text-transform: uppercase;
}

/* v7 state chip — derived from queue + entry state by
   NoteEvolutionWorkspace._renderQueueSummary. Five lifecycle phases:
   idle / capture / streaming / review / finalize-ready. Color codes
   the phase so the doctor reads the workspace state without inferring
   from button enable/disable. */
.nev-state-chip {
    display: inline-flex;
    align-items: center;
    margin-left: 4px;
    padding: 2px 8px;
    border-radius: 3px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    font-weight: 600;
    border: 1px solid transparent;
    transition: color 200ms, background-color 200ms, border-color 200ms;
}
.nev-state-chip[data-nev-state="idle"] {
    color: var(--dr-stone, #6B5D54);
    border-color: rgba(107, 93, 84, 0.40);
    background: rgba(107, 93, 84, 0.06);
}
.nev-state-chip[data-nev-state="capture"] {
    color: var(--dr-teal, #4CC4B4);
    border-color: rgba(76, 196, 180, 0.45);
    background: rgba(76, 196, 180, 0.06);
}
.nev-state-chip[data-nev-state="streaming"] {
    color: var(--dr-amber, #E69A4C);
    border-color: rgba(230, 154, 76, 0.55);
    background: rgba(230, 154, 76, 0.08);
    animation: nev-state-pulse 1.6s ease-in-out infinite;
}
.nev-state-chip[data-nev-state="review"] {
    color: var(--dr-honey, #E0B870);
    border-color: rgba(224, 184, 112, 0.45);
    background: rgba(224, 184, 112, 0.08);
}
.nev-state-chip[data-nev-state="finalize-ready"] {
    color: var(--dr-gold, #DAA520);
    border-color: rgba(218, 165, 32, 0.55);
    background: rgba(218, 165, 32, 0.10);
}
@keyframes nev-state-pulse {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.55; }
}

/* v7 taxonomy chip row — surfaced below the queue summary when patches
   exist. Zero-suppressed: a clean queue renders no row. Each chip
   color-codes its dimension (validation / risk / category) so the
   doctor scans the queue's blocker profile without reading text. */
.nev-taxonomy-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin: 4px 0;
}
.nev-tax-chip {
    display: inline-flex;
    align-items: center;
    padding: 2px 6px;
    border-radius: 3px;
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-espresso, #2A1C13);
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    letter-spacing: 0.02em;
    white-space: nowrap;
}
.nev-tax-chip[data-tax="valid"] {
    color: var(--dr-gold, #DAA520);
    border-color: rgba(218, 165, 32, 0.45);
}
.nev-tax-chip[data-tax="conflict"],
.nev-tax-chip[data-tax="ambiguous_target"] {
    color: var(--dr-amber, #E69A4C);
    border-color: rgba(230, 154, 76, 0.45);
}
.nev-tax-chip[data-tax="unsupported"],
.nev-tax-chip[data-tax="awaiting_confirm"] {
    color: var(--dr-mocha, #8B7355);
    border-color: rgba(139, 115, 85, 0.50);
}
.nev-tax-chip[data-tax="stale_anchor"],
.nev-tax-chip[data-tax="stale_content_warning"] {
    color: var(--dr-brass, #BFA162);
    border-color: rgba(191, 161, 98, 0.50);
}
.nev-tax-chip[data-tax="apply_failed"],
.nev-tax-chip[data-tax="risk_high"] {
    color: var(--dr-scarlet, #C44C4C);
    border-color: rgba(196, 76, 76, 0.55);
}
.nev-tax-chip[data-tax="new_problem"] {
    color: var(--dr-burnt-sienna, #C75B39);
    border-color: rgba(199, 91, 57, 0.55);
}
.nev-tax-chip[data-tax="risk_medium"] {
    color: var(--dr-honey, #E0B870);
    border-color: rgba(224, 184, 112, 0.45);
}
.nev-tax-chip[data-tax="risk_low"] {
    color: var(--dr-sage, #A8C4A0);
    border-color: rgba(168, 196, 160, 0.45);
}

.nev-takeover-identity {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
    user-select: text;
    min-width: 0;
    overflow: hidden;
}

.nev-takeover-identity .nev-id-field {
    display: inline-flex;
    align-items: baseline;
    gap: 4px;
    min-width: 0;
}

.nev-takeover-identity .nev-id-label {
    color: var(--dr-asparagus, #6E8068);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

.nev-takeover-identity .nev-id-value {
    color: var(--dr-bone, #EBE1D7);
    max-width: 9ch;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nev-takeover-close {
    background: transparent;
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-sm, 0.75rem);
    padding: 4px 12px;
    border-radius: 2px;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    transition: border-color 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1)),
                color 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-takeover-close:hover,
.nev-takeover-close:focus-visible {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-crema, #FFF7EE);
    outline: none;
}

.nev-takeover-close .nev-close-key {
    font-size: 0.5625rem;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

/* ----------------------------------------------------------------- *
 * 3-column body — percent-with-floors                               *
 * ----------------------------------------------------------------- */

.nev-takeover-body {
    /* CSS Grid: three named columns + drawer area as siblings.
       The drawer columns animate from 0fr to var(--drawer-width) when
       open; that's what makes them push, not overlay.

       Column weights (REBALANCED 2026-05-15):
       - Today's Note (right) is the doctor's primary output surface;
         it grows to ~56% of available width so the composed note is
         the dominant reading axis and doesn't feel too narrow.
       - Today's Update (left) holds dense fragment cards; needs
         enough room to read entries without truncation but not at the
         cost of the note.
       - Longitudinal A&P (middle) is reference context (one snippet
         per problem); narrower than before because the cards are
         scannable, not long-form. */
    display: grid;
    grid-template-columns:
        minmax(240px, 0.65fr)           /* left  — Today Update Journal */
        minmax(260px, 0.70fr)           /* middle — Longitudinal A&P    */
        minmax(460px, 1.75fr)           /* right — Today Working Note   */
        var(--nev-evidence-drawer-width, 0fr)
        var(--nev-audit-drawer-width, 0fr);
    gap: 8px;
    padding: 8px;
    flex: 1 1 auto;
    min-height: 0;
    background: var(--dr-void, #120C06);
    position: relative;
    z-index: 2;
    transition: grid-template-columns 320ms var(--dr-easing-ease-out, cubic-bezier(0.16, 1, 0.3, 1));
}

/* Single-column fallback only on genuinely narrow viewports. Normal laptop
   widths should keep the three-substrate relationship visible. */
@media (max-width: 980px) {
    .nev-takeover-body {
        grid-template-columns: 1fr;
        grid-auto-rows: minmax(320px, auto);
        overflow-y: auto;
    }
}

/* ----------------------------------------------------------------- *
 * Column shells                                                      *
 * ----------------------------------------------------------------- */

.nev-column {
    display: flex;
    flex-direction: column;
    background: var(--dr-obsidian, #160E08);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    min-height: 0;
    min-width: 0;
    overflow: hidden;
    /* Provenance Overlay v2 (2026-05-12): host for absolutely-positioned
       .nev-provenance-dock pills that surface off-viewport linked artifacts.
       Pills sit on top of the column-body scroll without participating in
       its scroll, so they stay visible regardless of body scroll position. */
    position: relative;
}

.nev-column-header {
    display: flex;
    align-items: baseline;
    gap: 8px;
    padding: 8px 10px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-dark-cacao, #1E140E);
    flex: 0 0 auto;
}

.nev-column-eyebrow {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    color: var(--dr-amber, #E69A4C);
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    text-transform: uppercase;
    flex: 0 0 auto;
}

.nev-column-title {
    font-family: var(--dr-font-heading, 'Instrument Sans', sans-serif);
    font-size: var(--dr-text-base, 0.875rem);
    font-weight: 600;
    color: var(--dr-bone, #EBE1D7);
    letter-spacing: 0;
    margin-right: auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nev-column-counter {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
}

.nev-column-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 8px;
}

/* ----------------------------------------------------------------- *
 * Left — Today Update Journal                                        *
 * Voice-strip anchor coupling: textarea 240 min, voice 72 anchored   *
 * bottom 16, total floor 380.                                        *
 * ----------------------------------------------------------------- */

.nev-living-update {
    display: flex;
    flex-direction: column;
    gap: 8px;
    height: 100%;
    min-height: 0;
}

.nev-entry-thread {
    display: flex;
    flex-direction: column;
    gap: 8px;
    flex: 1 1 auto;
    overflow-y: auto;
    min-height: 0;
}

.nev-entry-thread-empty {
    padding: 24px 8px;
    text-align: center;
    color: var(--dr-mocha, #8B7355);
    font-size: var(--dr-text-sm, 0.75rem);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
}

.nev-entry-card {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 6px 8px;
    background: var(--dr-dark-cacao, #1E140E);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-left: 2px solid var(--dr-amber, #E69A4C);
    border-radius: 2px;
}

.nev-entry-card[data-source="voice_final"] {
    border-left-color: var(--dr-teal, #4CC4B4);
}

.nev-entry-card[data-source="paste"] {
    border-left-color: var(--dr-brass, #BFA162);
}

.nev-entry-card[data-source="system"] {
    border-left-color: var(--dr-asparagus, #6E8068);
}

.nev-entry-meta {
    display: flex;
    align-items: center;
    gap: 6px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 9px;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
}

.nev-entry-meta .nev-entry-time {
    color: var(--dr-bone, #EBE1D7);
}

.nev-entry-meta .nev-entry-source {
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    color: var(--dr-amber, #E69A4C);
}

.nev-entry-meta .nev-entry-status {
    margin-left: auto;
    color: var(--dr-asparagus, #6E8068);
}

.nev-entry-text {
    font-size: 11.5px;
    color: var(--dr-bone, #EBE1D7);
    line-height: 1.4;
    white-space: pre-wrap;
    word-wrap: break-word;
}

.nev-entry-routing {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 4px;
}

.nev-entry-routing .nev-routing-chip {
    display: inline-block;
    padding: 1px 6px;
    border: 1px solid var(--dr-crater, #5A453A);
    border-radius: 2px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
}

/* New-entry composer */
.nev-entry-composer {
    display: flex;
    flex-direction: column;
    gap: 8px;
    flex: 0 0 auto;
    min-height: 0;
}

.nev-entry-textarea {
    min-height: 132px;
    max-height: min(32vh, 240px);
    background: var(--dr-dark-cacao, #1E140E);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    padding: 10px 12px;
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-sm, 0.75rem);
    line-height: 1.55;
    resize: vertical;
}

.nev-entry-textarea::placeholder {
    color: var(--dr-mocha, #8B7355);
    font-style: italic;
}

.nev-entry-textarea:focus {
    outline: none;
    border-color: var(--dr-amber, #E69A4C);
}

.nev-voice-strip {
    min-height: 52px;
    margin-bottom: 0;
    background: var(--dr-dark-cacao, #1E140E);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    padding: 10px 12px;
    display: flex;
    align-items: center;
    gap: 12px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
}

.nev-voice-strip .nev-voice-status {
    flex: 1;
    color: var(--dr-asparagus, #6E8068);
}

/* Wave 2 / 2f — voice interim ghost text. Renders BELOW the textarea,
   above the voice strip. Italic, --dr-mocha (secondary text), display
   only — never persisted. Per CONTRACT.md §3 and INDEX.md voice flow. */
.nev-voice-ghost {
    /* sits between textarea and voice strip; minimum vertical space so
       the layout doesn't jitter when ghost appears/disappears */
    min-height: 24px;
    padding: 4px 12px;
    margin: 0;
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    font-style: italic;
    line-height: 1.55;
    overflow: hidden;
    text-overflow: ellipsis;
    /* hidden by default; the JS adds .is-active when interim text exists */
    visibility: hidden;
}

.nev-voice-ghost.is-active {
    visibility: visible;
}

.nev-entry-actions {
    display: flex;
    gap: 8px;
    flex: 0 0 auto;
}

.nev-entry-actions button {
    background: transparent;
    border: 1px solid var(--dr-crater, #5A453A);
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    padding: 6px 10px;
    border-radius: 2px;
    cursor: pointer;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    text-transform: uppercase;
    transition: border-color 120ms, color 120ms;
}

.nev-entry-actions button:hover,
.nev-entry-actions button:focus-visible {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-crema, #FFF7EE);
    outline: none;
}

.nev-entry-actions button.primary {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-amber, #E69A4C);
}

.nev-entry-actions button.primary:hover,
.nev-entry-actions button.primary:focus-visible {
    color: var(--dr-crema, #FFF7EE);
    border-color: var(--dr-amber-hot, #D2691E);
}

/* ----------------------------------------------------------------- *
 * Middle — Longitudinal A&P hierarchy board                         *
 * ----------------------------------------------------------------- */


.nev-longitudinal-card[data-status="active"] { 
    border-left-color: var(--dr-amber, #E69A4C); 
    background: rgba(230, 154, 76, 0.05);
}
.nev-longitudinal-card[data-status="worsening"] { 
    border-left-color: var(--severity-worsening, #C25F90);
    background: var(--severity-worsening-bg, rgba(194, 95, 144, 0.08));
}
.nev-longitudinal-card[data-status="worsening"] .nev-longitudinal-name {
    color: var(--severity-worsening, #C25F90);
}
.nev-longitudinal-card[data-status="improving"] { 
    border-left-color: var(--severity-improving, #D4A040);
}
.nev-longitudinal-card[data-status="stable"] { 
    border-left-color: var(--severity-stable, #879A39);
}
.nev-longitudinal-card[data-status="monitoring"] { 
    border-left-color: var(--dr-brass, #BFA162); 
}
.nev-longitudinal-card[data-status="resolved"],
.nev-longitudinal-card[data-status="resolving"] { 
    border-left-color: var(--dr-crater, #6B564A); 
    opacity: 0.6;
    background: transparent;
}

/* Wave 1 visual nicety: pulse border-left when LS problem is "consulted"
   during an active generation. Reduced-motion safe via the body rule
   in dark-roast-tokens.css. */
.nev-longitudinal-card[data-consulted="true"] {
    border-left-color: var(--dr-teal, #4CC4B4);
    box-shadow: var(--dr-glow-teal-ghost,
        0 0 4px rgba(76, 196, 180, 0.08),
        0 0 12px rgba(76, 196, 180, 0.03));
}

.nev-longitudinal-header {
    display: flex;
    align-items: baseline;
    gap: 8px;
    min-width: 0;
}

.nev-longitudinal-name {
    font-family: var(--dr-font-heading, 'Instrument Sans', sans-serif);
    font-size: var(--dr-text-sm, 0.75rem);
    font-weight: 600;
    color: var(--dr-bone, #EBE1D7);
    margin-right: auto;
    min-width: 0;
    overflow-wrap: anywhere;
}

.nev-longitudinal-card--hero .nev-longitudinal-name {
    font-size: 0.875rem;
    font-weight: 700;
}

.nev-longitudinal-card--compact .nev-longitudinal-name,
.nev-longitudinal-card--ghost .nev-longitudinal-name {
    font-size: 0.6875rem;
}

.nev-status-pill {
    display: inline-block;
    padding: 1px 6px;
    border: 1px solid currentColor;
    border-radius: 2px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    color: var(--dr-asparagus, #6E8068);
}

.nev-status-pill[data-status="active"] { color: var(--dr-amber, #E69A4C); }
.nev-status-pill[data-status="worsening"] { color: var(--severity-worsening, #C25F90); border-color: var(--severity-worsening, #C25F90); }
.nev-status-pill[data-status="improving"] { color: var(--severity-improving, #D4A040); }
.nev-status-pill[data-status="stable"] { color: var(--severity-stable, #879A39); }
.nev-status-pill[data-status="monitoring"] { color: var(--dr-brass, #BFA162); }
.nev-status-pill[data-status="resolved"],
.nev-status-pill[data-status="resolving"] { color: var(--severity-resolved, #4CC4B4); }

.nev-longitudinal-meta {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
}

.nev-longitudinal-meta .nev-history-count {
    color: var(--dr-bone, #EBE1D7);
}

.nev-longitudinal-meta .nev-delta-dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--dr-amber, #E69A4C);
    display: inline-block;
}

.nev-longitudinal-card--hero .nev-longitudinal-meta .nev-delta-dot {
    width: 8px;
    height: 8px;
    box-shadow: 0 0 6px rgba(230, 154, 76, 0.55);
}

/* Tier 1 fragment-bridge — count badge + freshness dot on the longitudinal
 * card header. WHY: surfaces fragment activity routed by LivingUpdateColumn
 * onto the takeover's middle column, mirroring the rail's problem-card
 * fragment indicators. Painted by LongitudinalColumn._paintFragmentIndicator
 * in response to fragment:routed / fragments:loaded / fragment:rerouted
 * CustomEvents. */
.nev-longitudinal-fragment-count {
    display: inline-block;
    padding: 1px 6px;
    border: 1px solid var(--dr-teal, #4CC4B4);
    border-radius: 2px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    color: var(--dr-teal, #4CC4B4);
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    line-height: 1;
}

.nev-longitudinal-fragment-fresh {
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: var(--dr-teal, #4CC4B4);
    box-shadow: 0 0 4px rgba(76, 196, 180, 0.55);
    display: inline-block;
    align-self: center;
}

.nev-longitudinal-fragment-fresh--stale {
    background: var(--dr-mocha, #8B7355);
    box-shadow: none;
    opacity: 0.6;
}

.nev-longitudinal-meta .nev-consulted-marker {
    margin-left: auto;
    color: var(--dr-teal, #4CC4B4);
    text-transform: uppercase;
}

.nev-longitudinal-snippet {
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
    line-height: 1.55;
    white-space: pre-wrap;
    word-wrap: break-word;
    /* Wave 1: collapsed snippet, expand to latest APHistoryEntry on click */
    max-height: 4.4em;  /* 2 lines */
    overflow: hidden;
    transition: max-height 240ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-longitudinal-card--hero .nev-longitudinal-snippet {
    font-size: 0.6875rem;
    max-height: 6.2em;
    color: var(--dr-bone, #EBE1D7);
}

.nev-longitudinal-card--compact .nev-longitudinal-snippet,
.nev-longitudinal-card--ghost .nev-longitudinal-snippet {
    max-height: 3.1em;
}

.nev-longitudinal-card.expanded .nev-longitudinal-snippet {
    max-height: 600px;
    color: var(--dr-bone, #EBE1D7);
}

/* Snippet attribution row — tier badge + source chip + HD anchor. Makes
   the doctor's trust signal visible: silent fallback from accepted to
   in-flight to draft prose was hiding what kind of text was on screen. */
.nev-snippet-attribution {
    display: flex;
    gap: 6px;
    align-items: center;
    margin: 4px 0 2px;
    flex-wrap: wrap;
}

.nev-snippet-tier {
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1;
    padding: 2px 6px;
    border-radius: 3px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-weight: 600;
    border: 1px solid transparent;
}
.nev-snippet-tier[data-tier="accepted"] {
    color: var(--dr-sage, #A8C4A0);
    border-color: rgba(168, 196, 160, 0.35);
    background: rgba(168, 196, 160, 0.08);
}
.nev-snippet-tier[data-tier="in_flight"] {
    color: var(--dr-honey, #E0B870);
    border-color: rgba(224, 184, 112, 0.35);
    background: rgba(224, 184, 112, 0.08);
}
.nev-snippet-tier[data-tier="draft"] {
    color: var(--dr-mocha, #8B7355);
    border-color: rgba(139, 115, 85, 0.40);
    background: rgba(139, 115, 85, 0.06);
    font-style: italic;
}
.nev-snippet-tier[data-tier="empty"] {
    color: var(--dr-stone, #6B5D54);
    border-color: rgba(107, 93, 84, 0.40);
    background: transparent;
}

.nev-snippet-source,
.nev-snippet-hd {
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-stone, #6B5D54);
    opacity: 0.85;
}
.nev-snippet-hd {
    font-variant-numeric: tabular-nums;
}

/* Non-canonical tiers get a subtle de-emphasis on the snippet body. The
   tier badge does the loud signaling; the body just dims slightly so the
   eye reads "this is provisional" without losing the prose. */
.nev-longitudinal-snippet[data-tier="in_flight"],
.nev-longitudinal-snippet[data-tier="draft"] {
    opacity: 0.78;
}
.nev-longitudinal-snippet[data-tier="empty"] {
    opacity: 0.55;
    font-style: italic;
}

.nev-snippet-empty-placeholder {
    color: var(--dr-stone, #6B5D54);
}

/* Empty-history HX label — replaces the numeric count badge entirely
   when ap_history is empty, so "HX 0" never reads as "we have data". */
.nev-history-count-empty {
    color: var(--dr-stone, #6B5D54);
    font-style: italic;
    font-size: var(--dr-text-xs, 0.625rem);
}

/* Wave 3 / 3e Tier A — "SINCE PRIOR NOTE" inline section            */
/* Visible only on expanded cards. Render-LESS: empty problems get   */
/* the muted "No notable changes" line; never boilerplate filler.    */

.nev-longitudinal-deltas {
    margin-top: 8px;
    padding-top: 8px;
    border-top: 1px solid var(--dr-crater-deep, #3C2A21);
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.nev-longitudinal-deltas-header {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

.nev-longitudinal-deltas-empty {
    margin: 0;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
    font-style: italic;
}

.nev-longitudinal-deltas-loading {
    margin: 0;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
}

.nev-longitudinal-deltas-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.nev-delta-item {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-bone, #EBE1D7);
    line-height: 1.55;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 6px;
}

/* Label — for lab/vital this is the abbreviated name (Cr, K),     */
/* for treatment / consult this is the full action ("Started X").  */
.nev-delta-label {
    color: var(--dr-bone, #EBE1D7);
}

/* Old value is de-emphasized so the eye lands on the new value.   */
.nev-delta-old {
    color: var(--dr-mocha, #8B7355);
    text-decoration: line-through;
    text-decoration-color: var(--dr-mocha, #8B7355);
}

.nev-delta-arrow {
    color: var(--dr-mocha, #8B7355);
}

/* New value: per-direction accent. Mirrors Wave 3 / 3c diff arrow */
/* color logic — improving=harvest, worsening=magenta, neutral=bone. */
.nev-delta-new {
    color: var(--dr-bone, #EBE1D7);
    font-weight: 600;
}

.nev-delta-item[data-direction="improving"] .nev-delta-new {
    color: var(--severity-improving, #D4A040);
}

.nev-delta-item[data-direction="worsening"] .nev-delta-new {
    color: var(--severity-worsening, #C25F90);
}

/* Treatment/consult items have no old/new pair — accent the label */
/* directly so worsening "Started cefepime" still renders magenta. */
.nev-delta-item:not(:has(.nev-delta-new))[data-direction="improving"] .nev-delta-label {
    color: var(--severity-improving, #D4A040);
}

.nev-delta-item:not(:has(.nev-delta-new))[data-direction="worsening"] .nev-delta-label {
    color: var(--severity-worsening, #C25F90);
}

/* Note line (e.g. "crossed AKI threshold") sits to the right in   */
/* mocha so it never competes with the value.                       */
.nev-delta-note {
    color: var(--dr-mocha, #8B7355);
    font-style: italic;
    font-size: 0.5625rem;
}

/* ----------------------------------------------------------------- *
 * Wave 3 / 3f — Note inclusion band controls                         *
 * Per-card 4-button row: [Pin] [Brief] [Omit] [Auto]. Renders as    *
 * a single line with hairline borders. Active state = filled        *
 * background in the role color. Render-LESS contract: no popovers, *
 * no dropdowns, no "edit band" affordance — buttons ARE the surface.*
 * ----------------------------------------------------------------- */

.nev-band-controls {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 6px;
    align-items: center;
}

.nev-band-controls-label {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    color: var(--dr-mocha, #8B7355);
    margin-right: 4px;
}

.nev-band-button {
    flex: 0 0 auto;
    background: transparent;
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    padding: 2px 8px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    color: var(--dr-mocha, #8B7355);
    cursor: pointer;
    transition: border-color 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1)),
                color 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1)),
                background 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-band-button:hover:not(:disabled) {
    color: var(--dr-bone, #EBE1D7);
    border-color: var(--dr-mocha, #8B7355);
}

.nev-band-button:focus-visible {
    outline: 1px solid var(--dr-amber, #E69A4C);
    outline-offset: 1px;
}

.nev-band-button:disabled {
    opacity: 0.5;
    cursor: progress;
}

/* ── Per-band role colors (outline) ──                              */
.nev-band-button[data-band="doctor_pinned"] {
    color: var(--dr-gold, #DAA520);
    border-color: var(--dr-gold, #DAA520);
}

.nev-band-button[data-band="doctor_brief"] {
    color: var(--dr-amber, #E69A4C);
    border-color: var(--dr-amber, #E69A4C);
}

.nev-band-button[data-band="doctor_suppressed"] {
    color: var(--dr-mocha, #8B7355);
    border-color: var(--dr-mocha, #8B7355);
}

.nev-band-button[data-band="auto"] {
    color: var(--dr-mocha, #8B7355);
    border-color: var(--dr-crater-deep, #3C2A21);
}

/* ── Active state: subtle filled background. Hairline only.   ──    */
.nev-band-button[aria-pressed="true"][data-band="doctor_pinned"] {
    background: rgba(218, 165, 32, 0.10);
    color: var(--dr-gold, #DAA520);
    border-color: var(--dr-gold, #DAA520);
}

.nev-band-button[aria-pressed="true"][data-band="doctor_brief"] {
    background: rgba(230, 154, 76, 0.10);
    color: var(--dr-amber, #E69A4C);
    border-color: var(--dr-amber, #E69A4C);
}

.nev-band-button[aria-pressed="true"][data-band="doctor_suppressed"] {
    background: rgba(139, 115, 85, 0.10);
    color: var(--dr-bone, #EBE1D7);
    border-color: var(--dr-mocha, #8B7355);
}

.nev-band-button[aria-pressed="true"][data-band="auto"] {
    background: rgba(139, 115, 85, 0.05);
    color: var(--dr-bone, #EBE1D7);
    border-color: var(--dr-mocha, #8B7355);
}

/* ----------------------------------------------------------------- *
 * Right — Today Working Note + Patch Queue                          *
 * Container-owned scroll on the queue. Finalize bar pinned bottom.   *
 * ----------------------------------------------------------------- */

.nev-right-shell {
    /* FIX (2026-05-15): The right pane is a viewport manager, not a stack
       of legacy rail scrollers. Grid rows own the available height: note
       gets all remaining space, queue gets a clamped review lane, finalize
       stays pinned. Direct hosts scroll; migrated children are neutralized
       below so the doctor never lands in scroll-within-scroll. */
    --nev-queue-row: 18px;
    --nev-queue-min: calc(8 * var(--nev-queue-row));   /* 144px */
    --nev-queue-target: 34%;
    --nev-queue-max: calc(18 * var(--nev-queue-row));  /* 324px */
    --nev-row-grid: var(--nev-queue-row);
    display: grid;
    grid-template-areas:
        "note"
        "queue"
        "finalize";
    grid-template-rows:
        minmax(0, 1fr)
        minmax(
            var(--nev-queue-min),
            clamp(var(--nev-queue-min), var(--nev-queue-target), var(--nev-queue-max))
        )
        auto;
    flex: 1 1 auto;
    height: 100%;
    min-height: 0;
    overflow: hidden;
}

.nev-right-shell .nev-base-note-host {
    grid-area: note;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: 0;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background:
        linear-gradient(180deg, rgba(255, 247, 238, 0.018), transparent 42px),
        var(--dr-void, #120C06);
}

/* Strip legacy rail styles after #nevBaseNote is migrated into takeover.
   The host above owns note scrolling; the child document just contributes
   content height. */
.nev-right-shell .nev-base-note {
    min-height: 100%;
    padding: 0;
    border: none;
    background: transparent;
    box-shadow: none;
    overflow: visible;
}

.nev-right-shell .nev-base-note-doc {
    height: auto;
    min-height: 100%;
    max-height: none;
    overflow: visible;
    padding: 12px 18px 20px;
}

.nev-right-shell .nev-review-queue-host {
    grid-area: queue;
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    background: var(--dr-obsidian, #160E08);
    padding: 7px 7px 6px;
    border-top: 1px solid rgba(191, 161, 98, 0.16);
}

.nev-right-shell .nev-review-queue-host::before {
    content: "Review Queue";
    position: sticky;
    top: -7px;
    z-index: 3;
    display: flex;
    align-items: center;
    min-height: 22px;
    margin: -7px -7px 6px;
    padding: 3px 7px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background: linear-gradient(180deg, var(--dr-dark-cacao, #1E140E), var(--dr-obsidian, #160E08));
    color: var(--dr-amber, #E69A4C);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    font-weight: 700;
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    text-transform: uppercase;
}

/* Neutralize rail-tenant queue geometry after migration. The host above is
   the only queue scroller in takeover mode. */
.nev-right-shell .nev-review-queue {
    max-height: none;
    min-height: 0;
    overflow: visible;
    padding: 0;
    margin: 0;
}

/* Apply min-heights to existing .nev-review-card by validation state.
   This sits ON TOP of note-evolution.css so the takeover container
   can re-shape tile rhythm without forking the renderer. */
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card {
    /* Wave 3 / 3b safety-stripe baseline (mint = safe):
       low-risk + valid + proposed/accepted patches get the mint stripe. */
    min-height: calc(6 * var(--nev-row-grid));  /* 108 px compact baseline */
    height: auto;
    background: var(--dr-dark-cacao, #1E140E);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-left: 3px solid var(--dr-teal, #4CC4B4);
    border-radius: 2px;
    margin-bottom: 5px;
    padding: 5px 7px;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card-header {
    gap: 4px;
    margin-bottom: 4px;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-category-badge,
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-risk-badge,
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-evidence-state,
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-validation-badge,
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-op-chip {
    min-height: 16px;
    padding: 1px 5px;
    font-size: 0.5625rem;
    line-height: 1.2;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-assertion-item {
    grid-template-columns: minmax(46px, auto) minmax(0, 1fr);
    gap: 2px 6px;
    padding: 2px 0;
    font-size: 0.625rem;
    line-height: 1.28;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-assertion-action {
    font-size: 0.5625rem;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-evidence-line {
    margin-top: 4px;
    font-size: 0.5625rem;
    line-height: 1.32;
    display: -webkit-box;
    overflow: hidden;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card-actions {
    gap: 4px;
    margin-top: 6px;
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-card-btn {
    min-height: 22px;
    padding: 3px 6px;
    font-size: 0.5625rem;
}

/* Wave 3 / 3b safety-stripe ladder (locked):
     mint    --dr-teal      safe   (low-risk valid)
     amber   --dr-amber     soft   (medium-risk / unsupported / conflict / ambiguous)
     gold    --dr-gold      hi     (high-risk acceptable)
     scarlet --dr-scarlet   block  (apply_failed) */

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-validation="apply_failed"] {
    min-height: calc(5 * var(--nev-row-grid));  /* 90 px */
    border-left-color: var(--dr-scarlet, #C44C4C);  /* block — hard-stop */
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-validation="unsupported"] {
    min-height: calc(6 * var(--nev-row-grid));  /* 108 px */
    border-left-color: var(--dr-amber, #E69A4C);   /* soft — recoverable */
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-validation="conflict"] {
    min-height: calc(9 * var(--nev-row-grid));  /* 162 px */
    border-left-color: var(--dr-amber, #E69A4C);   /* soft — needs resolution */
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-validation="ambiguous_target"] {
    min-height: calc(10 * var(--nev-row-grid));  /* 180 px */
    border-left-color: var(--dr-amber, #E69A4C);   /* soft — needs picker */
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-validation="stale_anchor"] {
    /* Same as baseline + STALE banner above body. Soft severity (recoverable
       via re-run / remap), so amber stripe. */
    min-height: calc(7 * var(--nev-row-grid));
    border-left-color: var(--dr-amber, #E69A4C);
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-category="new_problem"] {
    min-height: calc(10 * var(--nev-row-grid));  /* 180 px */
    border-left-color: var(--dr-gold, #DAA520);
}

.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-risk="high"] {
    /* High-risk valid = hi (gold). High-risk + apply_failed escalates to
       scarlet via the more-specific apply_failed selector above. */
    border-left-color: var(--dr-gold, #DAA520);
}

/* High-risk + apply_failed = block (scarlet beats gold). Specificity wins
   because we're stacking two attribute selectors. */
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card[data-risk="high"][data-validation="apply_failed"] {
    border-left-color: var(--dr-scarlet, #C44C4C);
}

/* High-risk drawer-open state: push-down (sibling tiles shift, no
   overlay). When .high-risk-confirm-open class is set, the tile
   grows to 14 compact rows (252 px). Sibling tiles below shift
   automatically because they are flow siblings, not absolutely
   positioned. */
.sol-workspace-main[data-takeover="active"] .nev-review-queue-host .nev-review-card.high-risk-confirm-open {
    min-height: calc(14 * var(--nev-row-grid));  /* 252 px */
}

/* Paired BLOCKED / READY finalize bar — pinned to bottom of right
   column at all queue scroll positions. Always-visible action contract. */

.nev-right-shell .nev-finalize-host {
    grid-area: finalize;
    border-top: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-obsidian, #160E08);
    padding: 6px 10px;
    display: flex;
    align-items: center;
    gap: 16px;
    min-height: 42px;
    min-width: 0;
}

.nev-finalize-status {
    flex: 1;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    color: var(--dr-mocha, #8B7355);
    line-height: 1.55;
}

.nev-finalize-status .nev-finalize-helper {
    display: block;
    margin-top: 2px;
    color: var(--dr-asparagus, #6E8068);
}

.nev-finalize-bar-cta {
    display: flex;
    gap: 8px;
    align-items: center;
    flex-wrap: wrap;
    justify-content: flex-end;
}

.nev-jump-blocker-btn {
    background: transparent;
    border: 1px solid var(--dr-burnt-sienna, #C75B39);
    color: var(--dr-burnt-sienna, #C75B39);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    padding: 6px 12px;
    border-radius: 2px;
    cursor: pointer;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    text-transform: uppercase;
}

.nev-jump-blocker-btn:hover {
    border-color: var(--dr-scarlet, #C44C4C);
    color: var(--dr-scarlet, #C44C4C);
}

.nev-finalize-cta-btn {
    background: transparent;
    border: 1px solid var(--dr-mocha, #8B7355);
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-sm, 0.75rem);
    padding: 8px 16px;
    border-radius: 2px;
    cursor: not-allowed;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    text-transform: uppercase;
    font-weight: 600;
    transition: border-color 240ms, color 240ms;
}

.nev-finalize-host[data-state="ready"] .nev-finalize-cta-btn {
    /* READY: button color shifts to teal, becomes clickable */
    border-color: var(--dr-teal, #4CC4B4);
    color: var(--dr-teal, #4CC4B4);
    cursor: pointer;
}

.nev-finalize-host[data-state="ready"] .nev-finalize-cta-btn:hover,
.nev-finalize-host[data-state="ready"] .nev-finalize-cta-btn:focus-visible {
    color: var(--dr-crema, #FFF7EE);
    border-color: var(--dr-teal, #4CC4B4);
    box-shadow: var(--dr-glow-teal-ghost,
        0 0 4px rgba(76, 196, 180, 0.08),
        0 0 12px rgba(76, 196, 180, 0.03));
    outline: none;
}

.nev-finalize-host[data-state="blocked"] .nev-finalize-cta-btn {
    /* BLOCKED: dim mocha, not clickable */
    border-color: var(--dr-mocha, #8B7355);
    color: var(--dr-mocha, #8B7355);
}

/* Hide jump-blocker button unless the bar is in BLOCKED state */
.nev-finalize-host[data-state="ready"] .nev-jump-blocker-btn {
    display: none;
}

/* ────────────── Wave 3 / 3a — six validation badges (takeover) ──────────────
   Takeover overlays / overrides for the six validation states. The card-level
   severity stripe (border-left) is already wired above per data-validation;
   this block adds the in-card chrome (badge pill, warning/error strip,
   target picker) so the takeover surface matches the legacy rail-tenant CSS.
   Tokens come from --dr-* in dark-roast-tokens.css. */

.sol-workspace-main[data-takeover="active"] .nev-validation-badge {
    display: inline-flex;
    align-items: center;
    min-height: 18px;
    padding: 1px 6px;
    border-radius: 2px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    color: var(--dr-burnt-sienna, #C75B39);
    background: rgba(199,91,57,.08);
    border: 1px solid rgba(199,91,57,.34);
}

.sol-workspace-main[data-takeover="active"] .nev-validation-badge[data-validation="apply_failed"] {
    color: var(--dr-scarlet, #C44C4C);
    background: rgba(196,76,76,.10);
    border-color: rgba(196,76,76,.45);
}

.sol-workspace-main[data-takeover="active"] .nev-validation-badge[data-validation="conflict"] {
    color: var(--dr-amber, #E69A4C);
    background: rgba(230,154,76,.08);
    border-color: rgba(230,154,76,.45);
}

.sol-workspace-main[data-takeover="active"] .nev-validation-badge[data-validation="stale_anchor"],
.sol-workspace-main[data-takeover="active"] .nev-validation-badge[data-validation="unsupported"],
.sol-workspace-main[data-takeover="active"] .nev-validation-badge[data-validation="ambiguous_target"] {
    color: var(--dr-burnt-sienna, #C75B39);
    background: rgba(199,91,57,.08);
    border-color: rgba(199,91,57,.34);
}

/* ────────────── Wave 3 / 3b — op chip (takeover) ──────────────
   Renders inline with the category badge in the review-card header.
   Reads `op:replace` / `op:insert_before` / `op:new_problem` etc.
   Color is dim mocha (structural metadata, not severity); the
   category badge owns category color and the validation badge
   owns severity color, so the op chip stays neutral. */
.sol-workspace-main[data-takeover="active"] .nev-op-chip,
.note-evolution-workspace .nev-op-chip {
    display: inline-flex;
    align-items: center;
    min-height: 18px;
    padding: 1px 6px;
    border-radius: 2px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    font-weight: 600;
    letter-spacing: var(--dr-tracking-tight, 0.01em);
    text-transform: lowercase;
    color: var(--dr-mocha, #8B7355);
    background: rgba(139,115,85,.06);
    border: 1px solid rgba(139,115,85,.28);
}

/* new_problem / delete carry the category gold/burnt-sienna into the
   op chip so the structural shape is visually distinct on the rare
   ops that are themselves clinically high-stakes. */
.sol-workspace-main[data-takeover="active"] .nev-op-chip[data-op="new_problem"],
.note-evolution-workspace .nev-op-chip[data-op="new_problem"] {
    color: var(--dr-gold, #DAA520);
    border-color: rgba(218,165,32,.34);
    background: rgba(218,165,32,.06);
}
.sol-workspace-main[data-takeover="active"] .nev-op-chip[data-op="delete"],
.note-evolution-workspace .nev-op-chip[data-op="delete"] {
    color: var(--dr-burnt-sienna, #C75B39);
    border-color: rgba(199,91,57,.30);
    background: rgba(199,91,57,.06);
}

/* Banners above the body — mirror iter4 mockup §04 warning-strip / error-strip.
   Aligned to the 24 px row grid: 24 px tall total (4 px padding + 16 px line). */
.sol-workspace-main[data-takeover="active"] .nev-validation-strip {
    display: block;
    box-sizing: border-box;
    min-height: var(--nev-row-grid, 18px);
    padding: 3px 7px;
    margin: -5px -7px 6px -7px;
    border-radius: 2px 2px 0 0;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    line-height: 1.4;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

.sol-workspace-main[data-takeover="active"] .nev-stale-anchor-strip {
    background: rgba(230,154,76,.08);
    color: var(--dr-amber, #E69A4C);
    border-bottom: 1px solid rgba(230,154,76,.34);
}

.sol-workspace-main[data-takeover="active"] .nev-apply-failed-strip {
    background: rgba(196,76,76,.10);
    color: var(--dr-scarlet, #C44C4C);
    border-bottom: 1px solid rgba(196,76,76,.45);
}

/* Disabled Accept on unsupported/ambiguous_target — affordance visible but
   locked. Doctor sees "this is intended, but locked", not "this is missing". */
.sol-workspace-main[data-takeover="active"] .nev-card-btn.accept[disabled],
.sol-workspace-main[data-takeover="active"] .nev-card-btn.accept[aria-disabled="true"] {
    opacity: 0.45;
    cursor: not-allowed;
    pointer-events: auto; /* keep tooltip reachable */
}

/* Target picker — inline radio group on ambiguous_target cards. The picker
   sits between the assertion list and the action row. */
.sol-workspace-main[data-takeover="active"] .nev-target-picker {
    margin: 6px 0;
    padding: 5px 7px;
    border-radius: 2px;
    background: rgba(199,91,57,.04);
    border: 1px solid rgba(199,91,57,.20);
    border-left: 2px solid var(--dr-burnt-sienna, #C75B39);
}

.sol-workspace-main[data-takeover="active"] .nev-target-picker-label {
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    margin-bottom: 4px;
}

.sol-workspace-main[data-takeover="active"] .nev-target-picker-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
}

.sol-workspace-main[data-takeover="active"] .nev-target-radio {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 6px;
    border-radius: 2px;
    background: transparent;
    border: 1px solid rgba(199,91,57,.24);
    color: var(--dr-bone, #DDD);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    cursor: pointer;
    transition: border-color 0.12s ease, background 0.12s ease;
}

.sol-workspace-main[data-takeover="active"] .nev-target-radio:hover {
    border-color: rgba(199,91,57,.55);
    background: rgba(199,91,57,.06);
}

.sol-workspace-main[data-takeover="active"] .nev-target-radio.selected {
    border-color: var(--dr-burnt-sienna, #C75B39);
    background: rgba(199,91,57,.10);
    color: var(--dr-burnt-sienna, #C75B39);
}

.sol-workspace-main[data-takeover="active"] .nev-target-radio-marker {
    color: var(--dr-burnt-sienna, #C75B39);
    font-weight: 700;
}

.sol-workspace-main[data-takeover="active"] .nev-target-picker-helper {
    margin-top: 6px;
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.5;
}

.sol-workspace-main[data-takeover="active"] .nev-target-picker[data-state="selected"] .nev-target-picker-helper {
    color: var(--dr-teal, #55F3AA);
}

/* stale_anchor "Accept anyway" gets a subtle amber outline so the doctor
   sees the warning context. */
.sol-workspace-main[data-takeover="active"] .nev-card-btn.accept[data-stale-warn="true"] {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-amber, #E69A4C);
}

/* ----------------------------------------------------------------- *
 * Drawer host — siblings of 3-column grid                           *
 * Animated 0fr -> Nfr to push, not overlay.                          *
 * ----------------------------------------------------------------- */

.nev-evidence-drawer,
.nev-audit-drawer {
    background: var(--dr-dark-cacao, #1E140E);
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    overflow: hidden;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.nev-takeover-body[data-evidence-open="true"] {
    --nev-evidence-drawer-width: minmax(360px, 0.45fr);
}

.nev-takeover-body[data-audit-open="true"] {
    --nev-audit-drawer-width: minmax(360px, 0.45fr);
}

.nev-drawer-header {
    display: flex;
    align-items: baseline;
    gap: 8px;
    padding: 10px 12px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-obsidian, #160E08);
    flex: 0 0 auto;
}

.nev-drawer-title {
    font-family: var(--dr-font-heading, 'Instrument Sans', sans-serif);
    font-size: var(--dr-text-sm, 0.75rem);
    font-weight: 600;
    color: var(--dr-bone, #EBE1D7);
    margin-right: auto;
}

.nev-drawer-close {
    background: transparent;
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    padding: 2px 8px;
    border-radius: 2px;
    cursor: pointer;
}

.nev-drawer-body {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 12px;
    color: var(--dr-bone, #EBE1D7);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.55;
}

.nev-drawer-stub {
    color: var(--dr-mocha, #8B7355);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-style: italic;
}

/* ----------------------------------------------------------------- *
 * Evidence drawer content (Wave 2 / 2c) — location-bearing citations *
 * ----------------------------------------------------------------- */

.nev-evidence-drawer-header-section {
    padding-bottom: 10px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    margin-bottom: 10px;
}

.nev-evidence-row {
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex-wrap: wrap;
    margin-bottom: 4px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.45;
}

.nev-evidence-eyebrow {
    color: var(--dr-amber, #E69A4C);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    font-size: 0.5625rem;
}

.nev-evidence-problem {
    color: var(--dr-bone, #EBE1D7);
    font-weight: 600;
}

.nev-evidence-cat {
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    font-size: 0.5625rem;
}

.nev-evidence-risk {
    padding: 1px 6px;
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    text-transform: uppercase;
    font-size: 0.5625rem;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
}

.nev-evidence-risk-high {
    color: var(--dr-gold, #DAA520);
    border-color: var(--dr-gold, #DAA520);
}
.nev-evidence-risk-medium {
    color: var(--dr-amber, #E69A4C);
    border-color: var(--dr-amber, #E69A4C);
}
.nev-evidence-risk-low {
    color: var(--dr-teal, #4CC4B4);
    border-color: var(--dr-teal, #4CC4B4);
}

.nev-evidence-validation {
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

.nev-evidence-risk-diag {
    display: block;
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
    margin-top: 2px;
    font-style: italic;
}

.nev-evidence-section-title {
    color: var(--dr-amber, #E69A4C);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    margin: 12px 0 6px 0;
}

.nev-evidence-drawer-change {
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    padding-bottom: 12px;
    margin-bottom: 4px;
}

.nev-evidence-old,
.nev-evidence-new {
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.55;
    padding: 4px 8px;
    border-left: 2px solid var(--dr-crater-deep, #3C2A21);
    margin: 4px 0;
    white-space: pre-wrap;
    word-break: break-word;
}

.nev-evidence-old {
    color: var(--dr-mocha, #8B7355);
    text-decoration: line-through;
    text-decoration-color: var(--dr-burnt-sienna, #C75B39);
}

.nev-evidence-new {
    color: var(--dr-bone, #EBE1D7);
    border-left-color: var(--dr-teal, #4CC4B4);
}

.nev-evidence-citations {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.nev-evidence-group {
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    background: var(--dr-obsidian, #160E08);
}

.nev-evidence-group-header {
    padding: 4px 8px;
    background: var(--dr-roasted-bean, #3C2A1E);
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
}

.nev-evidence-row-item {
    padding: 6px 8px;
    border-bottom: 1px solid var(--dr-dark-cacao, #1E140E);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.5;
}

.nev-evidence-row-item:last-child {
    border-bottom: none;
}

.nev-evidence-row-item.no-locator {
    border-left: 2px solid var(--dr-burnt-sienna, #C75B39);
}

.nev-evidence-label {
    color: var(--dr-bone, #EBE1D7);
    font-weight: 500;
}

.nev-evidence-value {
    color: var(--dr-amber, #E69A4C);
}

.nev-evidence-locator {
    display: block;
    margin-top: 2px;
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
}

.nev-evidence-locator-missing {
    color: var(--dr-burnt-sienna, #C75B39);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

.nev-evidence-quote {
    margin-top: 4px;
    padding-left: 8px;
    border-left: 1px solid var(--dr-crater-deep, #3C2A21);
    color: var(--dr-bone, #EBE1D7);
    font-style: italic;
    line-height: 1.55;
}

/* ────────────── Wave 3 / 3c — Phosphor icon + diff arrow + confidence bar
   ──────────────
   Visual primitives in the evidence drawer. The Phosphor stylesheet is
   loaded in templates/census.html (already there pre-Wave 3); we just
   size the icon for the evidence drawer's tight typographic floor.
*/

/* Group-header icon (lab → ph-flask, vital → ph-drop, etc.). 12 px icon
   prepended to the group label. .nev-evidence-group-header is now a
   flex row so the icon and label sit on a single line. */
.nev-evidence-group-header {
    display: flex;
    align-items: center;
    gap: 6px;
}
.nev-evidence-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 12px;
    height: 12px;
    font-size: 12px;
    line-height: 1;
    color: var(--dr-amber, #E69A4C);
}
.nev-evidence-group[data-source-type="lab"] .nev-evidence-icon,
.nev-evidence-group[data-source-type="vital"] .nev-evidence-icon,
.nev-evidence-group[data-source-type="io"] .nev-evidence-icon {
    color: var(--dr-teal, #4CC4B4);
}
.nev-evidence-group[data-source-type="medication_order"] .nev-evidence-icon {
    color: var(--dr-gold, #DAA520);
}
.nev-evidence-group[data-source-type="voice_transcript"] .nev-evidence-icon,
.nev-evidence-group[data-source-type="doctor_update"] .nev-evidence-icon {
    color: var(--dr-mocha, #8B7355);
}

/* Diff arrow (op:replace patches in the change section). Mocha so it
   reads as structural, not severity. The diff-row is a 3-cell flex
   layout (old → arrow → new) so the arrow stays centered on the
   row regardless of clamp-truncation. */
.nev-evidence-diff-row {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}
.nev-evidence-diff-row .nev-evidence-old,
.nev-evidence-diff-row .nev-evidence-new {
    flex: 1 1 220px;
    margin: 0;
}
.nev-diff-arrow {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-sm, 0.75rem);
    color: var(--dr-mocha, #8B7355);
    user-select: none;
}

/* Confidence bar — 72×6 px gradient amber→teal whose painted width is
   driven by --confidence (0..1) set inline by the row renderer. The
   `meter` ARIA role is structural; visual presentation is the bar. */
.nev-evidence-confidence-bar {
    display: inline-block;
    width: 72px;
    height: 6px;
    margin-top: 4px;
    background: var(--dr-crater-deep, #3C2A21);
    border-radius: 2px;
    overflow: hidden;
    position: relative;
    vertical-align: middle;
}
.nev-evidence-confidence-bar::before {
    content: '';
    display: block;
    height: 100%;
    width: calc(72px * var(--confidence, 0.5));
    background: linear-gradient(
        90deg,
        var(--dr-amber, #E69A4C) 0%,
        var(--dr-teal, #4CC4B4) 100%
    );
    transition: width 240ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-evidence-empty {
    padding: 12px;
    border: 1px solid var(--dr-burnt-sienna, #C75B39);
    border-radius: 2px;
    background: var(--dr-obsidian, #160E08);
}

.nev-evidence-empty-msg {
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.55;
    margin: 0;
}

.nev-evidence-empty-msg strong {
    color: var(--dr-burnt-sienna, #C75B39);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

/* ----------------------------------------------------------------- *
 * Conflict block + 4-action resolution row (Wave 2 / 2d)             *
 * Inline with the patch tile, NOT a popup, NOT hover-only.            *
 * Layout per CONTRACT § 3 + INDEX.md conflict tile (9 rows / 216 px). *
 * ----------------------------------------------------------------- */

.nev-conflict-block {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 6px 8px;
    margin: 6px 0;
    border: 1px solid var(--dr-burnt-sienna, #C75B39);
    border-left-width: 3px;
    border-radius: 2px;
    background: rgba(199, 91, 57, 0.06);  /* burnt-sienna at low alpha */
}

.nev-conflict-headline {
    display: flex;
    align-items: baseline;
    gap: 8px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    margin-bottom: 4px;
}

.nev-conflict-marker {
    color: var(--dr-burnt-sienna, #C75B39);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-widest, 0.20em);
    font-weight: 600;
    font-size: 0.5625rem;
}

.nev-conflict-message {
    color: var(--dr-bone, #EBE1D7);
}

.nev-conflict-row {
    display: flex;
    align-items: baseline;
    gap: 6px;
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.35;
    padding: 1px 0;
}

.nev-conflict-row-label {
    flex: 0 0 82px;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wide, 0.05em);
    font-size: 0.5625rem;
}

.nev-conflict-row-value {
    color: var(--dr-bone, #EBE1D7);
    font-weight: 500;
}

.nev-conflict-row-meta {
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
}

.nev-conflict-row[data-source="doctor"] .nev-conflict-row-value {
    color: var(--dr-amber, #E69A4C);
}
.nev-conflict-row[data-source="ehr"] .nev-conflict-row-value {
    color: var(--dr-teal, #4CC4B4);
}
.nev-conflict-row[data-source="prior"] .nev-conflict-row-value {
    color: var(--dr-mocha, #8B7355);
    text-decoration: line-through;
    text-decoration-color: var(--dr-burnt-sienna, #C75B39);
}

/* 4-action button styling — only inside the takeover (these classes
   are also used in the rail-only path; takeover-scope keeps the
   visual contract aligned without breaking rail fallback). */

.sol-workspace-main[data-takeover="active"] .nev-card-btn.conflict-doctor {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-amber, #E69A4C);
}
.sol-workspace-main[data-takeover="active"] .nev-card-btn.conflict-doctor:hover {
    background: rgba(230, 154, 76, 0.08);
}

.sol-workspace-main[data-takeover="active"] .nev-card-btn.conflict-ehr {
    border-color: var(--dr-teal, #4CC4B4);
    color: var(--dr-teal, #4CC4B4);
}
.sol-workspace-main[data-takeover="active"] .nev-card-btn.conflict-ehr:hover {
    background: rgba(76, 196, 180, 0.08);
}

/* Conflict tile honors the active review-row grid in takeover. */
.sol-workspace-main[data-takeover="active"] .nev-review-card[data-validation="conflict"] {
    min-height: calc(9 * var(--nev-row-grid, 18px));
    height: auto;
}

/* ----------------------------------------------------------------- *
 * Command palette (Wave 2 / 2e) — inline overlay above right column  *
 * ----------------------------------------------------------------- */

.nev-command-palette {
    position: absolute;
    top: 64px;     /* below the takeover header */
    right: 16px;
    width: 520px;
    max-width: calc(100% - 32px);
    z-index: 100;
    /* The palette is a sibling of .nev-takeover-body so it can overlay
       the right column without affecting grid geometry. */
}

.nev-command-palette[hidden] {
    display: none !important;
}

.nev-cp-frame {
    background: var(--dr-obsidian, #160E08);
    border: 1px solid var(--dr-amber, #E69A4C);
    border-radius: 2px;
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    /* No drop-shadow per visual contract. The 1 px amber hairline
       does the visual lift instead. */
}

.nev-cp-input-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    background: var(--dr-dark-cacao, #1E140E);
}

.nev-cp-prompt {
    color: var(--dr-amber, #E69A4C);
    font-weight: 600;
}

.nev-cp-input {
    flex: 1 1 auto;
    background: transparent;
    border: none;
    outline: none;
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-sm, 0.75rem);
}

.nev-cp-hint {
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
}

.nev-cp-list {
    list-style: none;
    margin: 0;
    padding: 4px 0;
    max-height: 320px;
    overflow-y: auto;
}

.nev-cp-row {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 6px 12px;
    cursor: pointer;
    border-left: 2px solid transparent;
    transition: background 80ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-cp-row:hover,
.nev-cp-row.is-active {
    background: var(--dr-dark-cacao, #1E140E);
    border-left-color: var(--dr-amber, #E69A4C);
}

.nev-cp-row-main {
    display: flex;
    align-items: baseline;
    gap: 12px;
}

.nev-cp-row-label {
    color: var(--dr-bone, #EBE1D7);
    font-weight: 600;
    flex: 0 0 160px;
}

.nev-cp-row-description {
    color: var(--dr-mocha, #8B7355);
    flex: 1 1 auto;
    font-family: var(--dr-font-body, 'DM Sans', system-ui, sans-serif);
}

.nev-cp-row-signature {
    color: var(--dr-crater, #6B564A);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.5625rem;
    margin-left: 160px;
    /* Subtle dim mono signature beneath the row, per agent-native
       parity rule (action rows always carry a structured-call hint). */
}

.nev-cp-empty {
    padding: 12px;
    color: var(--dr-mocha, #8B7355);
    font-style: italic;
    text-align: center;
}

.nev-cp-footer {
    padding: 6px 12px;
    border-top: 1px solid var(--dr-crater-deep, #3C2A21);
    color: var(--dr-mocha, #8B7355);
    font-size: 0.5625rem;
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-wider, 0.10em);
    background: var(--dr-dark-cacao, #1E140E);
}

/* ----------------------------------------------------------------- *
 * New-problem block (Wave 2 / 2g) — bottom of A&P, high-risk only    *
 * ----------------------------------------------------------------- */

.nev-new-problem-block {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 12px 14px;
    margin: 16px 0 8px 0;
    border: 1px solid var(--dr-gold, #DAA520);
    border-left-width: 3px;
    border-radius: 2px;
    background: rgba(218, 165, 32, 0.05);
}

.nev-new-problem-block .nev-category-badge {
    align-self: flex-start;
    color: var(--dr-gold, #DAA520);
    border-color: var(--dr-gold, #DAA520);
    text-transform: uppercase;
    letter-spacing: var(--dr-tracking-widest, 0.20em);
}

.nev-new-problem-title {
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-heading, 'Instrument Sans', sans-serif);
    font-size: var(--dr-text-base, 0.875rem);
    font-weight: 600;
}

.nev-new-problem-block .nev-amendment.insert {
    color: var(--dr-bone, #EBE1D7);
    background: transparent;
    line-height: 1.55;
}

.nev-new-problem-plan {
    list-style: none;
    margin: 4px 0 0 0;
    padding-left: 16px;
    color: var(--dr-bone, #EBE1D7);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: var(--dr-text-xs, 0.625rem);
    line-height: 1.55;
}

.nev-new-problem-plan li {
    position: relative;
    padding-left: 8px;
}

.nev-new-problem-plan li::before {
    content: "·";
    position: absolute;
    left: 0;
    color: var(--dr-mocha, #8B7355);
}

/* New-problem tile in the review queue uses the active review-row grid. */
.sol-workspace-main[data-takeover="active"] .nev-review-card[data-category="new_problem"] {
    min-height: calc(10 * var(--nev-row-grid, 18px));
    height: auto;
}

/* ----------------------------------------------------------------- *
 * Traceability highlight (Wave 2 / 2k) — entry card -> patch link    *
 * The right-column patch click emits nev:patch-focused; the left     *
 * column subscribes and adds .is-traceability-source to the source    *
 * entry card.                                                        *
 * ----------------------------------------------------------------- */

.nev-entry-card.is-traceability-source {
    border-color: var(--dr-amber, #E69A4C);
    box-shadow: inset 3px 0 0 0 var(--dr-amber, #E69A4C);
    /* No drop-shadow per visual contract; the inset 3 px amber rail
       does the visual lift. */
    transition: border-color 120ms var(--dr-easing, cubic-bezier(0.4, 0, 0.2, 1));
}

.nev-entry-card.is-traceability-source .nev-entry-time {
    color: var(--dr-amber, #E69A4C);
}

/* ----------------------------------------------------------------- *
 * Reduced-motion respect                                             *
 * ----------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .nev-takeover-body,
    .nev-longitudinal-card,
    .nev-longitudinal-snippet,
    .nev-finalize-host[data-state="ready"] .nev-finalize-cta-btn {
        transition: none !important;
    }
}

/* =========================================================================
   PROVENANCE v0 — fan-out badge + spotlight (2026-05-11)
   
   LivingUpdateColumn paints `→ N patches` chip on each journal entry whose
   linkedEntryIds is non-empty. Clicking the chip fires nev:patch-fanout;
   the workspace adds .is-fanout-spotlight to matching patch tiles in the
   right column. Esc or outside-click clears.
   
   UI rule: badge is omitted entirely when count is 0 (the rendering layer
   does this; this CSS only styles the populated case). Never `→ 0`.
   ========================================================================= */
.nev-entry-fanout {
    margin-top: 6px;
    display: flex;
    align-items: center;
    min-height: 0;
}
.nev-entry-fanout:empty {
    /* Collapse vertical space when no badge is painted. The corpus rule
       is to omit, not show `→ 0`; the rendering layer leaves the host
       empty in that case. */
    margin-top: 0;
}

.nev-fanout-badge {
    font-family: var(--ff-ui, 'Instrument Sans', system-ui, sans-serif);
    font-size: 11px;
    letter-spacing: 0.05em;
    padding: 3px 9px;
    background: var(--dr-provenance-link-bg, #1A130D);
    color: var(--dr-teal, #4CC4B4);
    border: 1px solid var(--dr-provenance-link-border, #2E8A7E);
    cursor: pointer;
    transition: background 100ms ease-out, color 100ms ease-out, border-color 100ms ease-out;
    /* Provenance v0: badge is a navigation control, not decoration —
       hover indicates the click affordance clearly. */
}
.nev-fanout-badge:hover {
    background: var(--dr-teal-deep, #2E8A7E);
    color: var(--dr-fg-display, #FFF7EE);
    border-color: var(--dr-teal, #4CC4B4);
}
.nev-fanout-badge:focus-visible {
    outline: 2px solid var(--dr-teal, #4CC4B4);
    outline-offset: 2px;
}

/* Spotlight rule applied by workspace._handlePatchFanout. Bright outline
   plus subtle inner glow makes it readable against any validation state's
   existing chrome (apply_failed scarlet, conflict amber, etc.). No raw
   background change — preserves the validation-state visual axis. */
.is-fanout-spotlight {
    outline: 2px solid var(--dr-teal, #4CC4B4);
    outline-offset: -1px;
    box-shadow: inset 0 0 0 1px var(--dr-teal, #4CC4B4),
                0 0 12px -2px var(--dr-teal-deep, #2E8A7E);
    transition: outline-color 120ms ease-out, box-shadow 120ms ease-out;
}

/* =========================================================================
   PROVENANCE v0/v1 — fan-IN badge + spotlight (2026-05-11)

   Workspace paints `origin: N` button on patch tiles whose linkedEntryIds
   contains 2+ entries. Clicking fires nev:patch-origin; LivingUpdateColumn
   adds .is-fanin-spotlight to matching entry cards in the left column.
   Esc / outside-click clears. Mirrors the fan-OUT pattern above so the
   doctor learns one interaction model in both directions.

   UI rule: badge is omitted entirely when count <= 1 (the singleton edge
   is already shown by the Fan-OUT chip on the entry side). Same teal as
   .nev-fanout-badge — same provenance edge viewed from the other end.
   ========================================================================= */
.nev-origin-badge {
    font-family: var(--ff-ui, 'Instrument Sans', system-ui, sans-serif);
    font-size: 11px;
    letter-spacing: 0.05em;
    padding: 3px 9px;
    background: var(--dr-provenance-link-bg, #1A130D);
    color: var(--dr-teal, #4CC4B4);
    border: 1px solid var(--dr-provenance-link-border, #2E8A7E);
    cursor: pointer;
    transition: background 100ms ease-out, color 100ms ease-out, border-color 100ms ease-out;
}
.nev-origin-badge:hover {
    background: var(--dr-teal-deep, #2E8A7E);
    color: var(--dr-fg-display, #FFF7EE);
    border-color: var(--dr-teal, #4CC4B4);
}
.nev-origin-badge:focus-visible {
    outline: 2px solid var(--dr-teal, #4CC4B4);
    outline-offset: 2px;
}

/* Spotlight rule applied by living-update-column._handlePatchOrigin. Same
   visual axis as .is-fanout-spotlight — teal outline + inset glow — because
   it's the same provenance edge viewed from the other end. No background
   change; preserves the entry-card source/status visual axes. */
.is-fanin-spotlight {
    outline: 2px solid var(--dr-teal, #4CC4B4);
    outline-offset: -1px;
    box-shadow: inset 0 0 0 1px var(--dr-teal, #4CC4B4),
                0 0 12px -2px var(--dr-teal-deep, #2E8A7E);
    transition: outline-color 120ms ease-out, box-shadow 120ms ease-out;
}

/* =========================================================================
   PROVENANCE RAIL v0 (2026-05-11)

   SVG overlay rendered absolutely inside .nev-takeover-body, drawing
   connector paths between linked artifacts when a Fan-Out chain is
   active. Pointer-events: none so clicks pass through to underlying
   DOM. The workspace owns the drawing logic (see note-evolution-
   workspace.js::_drawProvenanceOverlay); this rule set styles the canvas.

   Daily-driver rail unaffected — overlay only renders inside the
   ENABLE_THREE_SUBSTRATE_TAKEOVER takeover host.

   v0 scope: Fan-Out direction only (entry → patches). v1 will hook
   the Fan-IN reverse direction (patches → entries via origin badge)
   into the same overlay. Dock indicators + 3-segment-with-middle-
   anchor design from v3 mock deferred.
   ========================================================================= */
.nev-takeover-body {
    /* Required for the overlay's absolute positioning to register
       against the takeover body, not the page. Existing layout uses
       grid; position: relative composes safely with that. */
    position: relative;
}

.nev-provenance-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
    z-index: 5;
    /* Hidden until the workspace adds .is-active. Avoids a flash of
       empty SVG before the first chain activates. */
    opacity: 0;
    transition: opacity 120ms ease-out;
}
.nev-provenance-overlay.is-active {
    opacity: 1;
}

.nev-provenance-path {
    fill: none;
    stroke: var(--dr-teal, #4CC4B4);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
    /* Subtle dashed pattern signals "ephemeral focus mode, not a
       permanent diagram element." Pattern dashes are 6px on / 4px off
       at the path's natural stroke. */
    stroke-dasharray: 6 4;
    /* Glow without a filter — composes with the spotlight box-shadow
       on the linked tiles for a unified visual. */
    filter: drop-shadow(0 0 4px var(--dr-teal-deep, #2E8A7E));
}

/* =========================================================================
   PROVENANCE OVERLAY v2 — DOCK INDICATORS (2026-05-12)
   ========================================================================= */
/* Off-viewport linked-artifact pills. Sit absolutely inside .nev-column
   (just below the column header for top, just above the column footer for
   bottom). Hidden by default; the workspace toggles .is-visible on them
   when the active provenance chain has anchors that have scrolled out of
   the column body's viewport. Click scrolls the offscreen anchor back into
   view. Border + color match .nev-provenance-path stroke (a path
   class preexisting from v0; not renamed). The chip reads as the
   overlay's continuation pulled into a label. */
.nev-provenance-dock {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    background: var(--dr-obsidian, #160E08);
    border: 1px solid var(--dr-teal-deep, #2E8A7E);
    color: var(--dr-teal, #4CC4B4);
    font-family: var(--dr-font-mono, 'Fira Code', monospace);
    font-size: 0.625rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    padding: 4px 10px;
    display: none;
    cursor: pointer;
    z-index: 6;
    pointer-events: auto;
    white-space: nowrap;
    border-radius: 2px;
    /* Match the rail's drop-shadow so visible docks read as part of the
       same lit chain. Subtle, not strobing. */
    box-shadow: 0 0 6px var(--dr-teal-deep, #2E8A7E);
}
.nev-provenance-dock.is-visible {
    display: inline-flex;
    align-items: center;
    gap: 6px;
}
.nev-provenance-dock-top    { top: 50px; }    /* below .nev-column-header */
.nev-provenance-dock-bottom { bottom: 6px; }
.nev-provenance-dock:hover,
.nev-provenance-dock:focus-visible {
    background: var(--dr-dark-cacao, #1E140E);
    color: var(--dr-bone, #EBE1D7);
    outline: none;
}

/* =========================================================================
   BASE NOTE STRUCTURED RENDERER (2026-05-11)

   The right column's "Today's Note" was rendered as flat `.textContent` —
   a giant blob of plaintext. This is the structured renderer's CSS: real
   document chrome with section headers, A&P problem cards, and status
   pills mapped to clinical severity tiers.

   Mounted into `.nev-base-note-host` (data-mount="base-note") via
   NoteEvolutionWorkspace._renderBaseNote().
   ========================================================================= */
.nev-base-note-doc {
    font-family: var(--ff-ui, 'Instrument Sans', system-ui, sans-serif);
    font-size: 14px;
    line-height: 1.65;
    color: var(--dr-fg-body, #E8E0D6);
    padding: 16px 24px 32px;
    overflow-y: auto;
    height: 100%;
    max-height: 100%;
    box-sizing: border-box;
}

/* Document header (Date, Service, Active Consults) — compact info strip. */
.nev-bn-doc-header {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 24px;
    padding: 0 0 8px;
    margin: 0 0 12px;
    border-bottom: 2px dashed var(--dr-divider, #2A2018);
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    font-size: 12px;
}
.nev-bn-doc-field { display: inline-flex; align-items: baseline; gap: 6px; }
.nev-bn-field-label {
    color: var(--dr-fg-muted, #8E8074);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 600;
    font-size: 11px;
}
.nev-bn-field-value { color: var(--dr-fg-display, #FFF7EE); font-weight: 500; }

/* Section: SUBJECTIVE / OBJECTIVE / etc. Top divider + uppercase title
   creates visible hierarchy without bouncing the eye between sections. */
.nev-bn-section {
    margin: 0 0 16px;
    padding-top: 8px;
    border-top: 1px solid var(--dr-divider-soft, #1F1810);
}
.nev-bn-section:first-of-type { border-top: none; padding-top: 0; }
.nev-bn-section-title {
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    font-size: 14px;
    font-weight: 800;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--dr-teal, #4CC4B4);
    margin: 0 0 12px;
    padding-bottom: 4px;
    border-bottom: 1px dashed var(--dr-divider-soft, #1F1810);
    display: inline-block;
}
.nev-bn-section-body { color: var(--dr-fg-body, #E8E0D6); }
.nev-bn-para { margin: 0 0 10px; }
.nev-bn-para:last-child { margin-bottom: 0; }

.nev-bn-list {
    margin: 6px 0 16px;
    padding-left: 20px;
    list-style: none;
}
.nev-bn-list li { position: relative; padding: 3px 0; }
.nev-bn-list li::before {
    content: '·';
    position: absolute;
    left: -14px;
    top: -2px;
    color: var(--dr-teal-deep, #2E8A7E);
    font-weight: 700;
    font-size: 16px;
}

/* A&P section — distinct chrome. The summary line above the problems
   gets italicized so it reads as epigraph, not body. */
.nev-bn-section-ap .nev-bn-section-title { color: var(--dr-amber, #E8A23A); }
.nev-bn-ap-summary {
    font-family: var(--ff-prose, 'Source Serif Pro', Georgia, serif);
    font-style: italic;
    font-size: 15px;
    color: var(--dr-fg-muted, #8E8074);
    margin: 0 0 12px;
    padding: 10px 14px;
    border-left: 3px solid var(--dr-amber-deep, #8A5F1E);
    background: var(--dr-bg-elev, rgba(255, 247, 238, 0.025));
    border-radius: 0 4px 4px 0;
}
.nev-bn-ap-summary > .nev-bn-para { margin: 0; }
.nev-bn-problems { display: flex; flex-direction: column; gap: 12px; }

/* Problem card — hash sigil + title + status pill in the header row,
   body indented under. Status colors lifted from the existing risk/
   validation palette so the same severity ladder applies whether the
   doctor's looking at a patch tile or a problem card. */
.nev-bn-problem {
    position: relative;
    padding: 8px 10px 10px 12px;
    background: var(--dr-obsidian, #160E08); /* Darker isolated background */
    border: 1px solid var(--dr-crater-deep, #3C2A21);
    border-left: 4px solid var(--dr-crater, #6B564A);
    border-radius: 6px;
    margin-bottom: 8px;
    transition: border-left-color 100ms ease-out, box-shadow 150ms ease;
    box-shadow: 0 4px 12px rgba(0,0,0, 0.3), inset 0 2px 10px rgba(0,0,0, 0.2);
}
.nev-bn-problem:hover {
    box-shadow: 0 6px 16px rgba(0,0,0, 0.4), inset 0 2px 10px rgba(0,0,0, 0.2);
}
.nev-bn-problem-header {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    background: rgba(255, 255, 255, 0.02);
    margin: -8px -10px 8px -12px;
    padding: 6px 10px 6px 12px;
    border-bottom: 1px solid var(--dr-crater-deep, #3C2A21);
    border-radius: 6px 6px 0 0;
}
.nev-bn-problem-hash {
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    color: var(--dr-fg-muted, #8E8074);
    font-weight: 700;
    font-size: 16px;
    line-height: 1;
}
.nev-bn-problem-title {
    margin: 0;
    flex: 1 1 auto;
    font-family: var(--ff-ui, 'Instrument Sans', system-ui, sans-serif);
    font-size: 18px;
    font-weight: 800;
    letter-spacing: -0.01em;
    color: var(--dr-bone, #EBE1D7);
    line-height: 1.2;
}
.nev-bn-problem-status {
    display: inline-flex;
    align-items: center;
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    padding: 4px 10px;
    border-radius: 4px;
    border: 1px dashed currentColor;
    background: var(--dr-bg-elev, rgba(0, 0, 0, 0.2));
}
.nev-bn-problem-body { padding-left: 2px; color: var(--dr-fg-body, #E8E0D6); }
.nev-bn-problem-body .nev-bn-para { font-size: 14.5px; line-height: 1.65; }
.nev-bn-problem-body .nev-bn-list { margin-top: 8px; font-size: 14.5px; line-height: 1.65; }

/* Status color ladder — locked to the same axis as risk/validation badges
   elsewhere. New = gold (novel, action required), Worsening = magenta
   (escalation), Stable = olive (steady-state), Improving = harvest (trending
   right), Resolved/Resolving = teal. */
.nev-bn-problem[data-status="new"]            { border-left-color: var(--dr-gold, #F5C24A); }
.nev-bn-problem[data-status="new"] .nev-bn-problem-status            { color: var(--dr-gold, #F5C24A); }
.nev-bn-problem[data-status="worsening"]      { border-left-color: var(--severity-worsening, #C25F90); }
.nev-bn-problem[data-status="worsening"] .nev-bn-problem-status      { color: var(--severity-worsening, #C25F90); }
.nev-bn-problem[data-status="stable"]         { border-left-color: var(--severity-stable, #879A39); }
.nev-bn-problem[data-status="stable"] .nev-bn-problem-status         { color: var(--severity-stable, #879A39); }
.nev-bn-problem[data-status="improving"]      { border-left-color: var(--severity-improving, #D4A040); }
.nev-bn-problem[data-status="improving"] .nev-bn-problem-status      { color: var(--severity-improving, #D4A040); }
.nev-bn-problem[data-status="resolving"],
.nev-bn-problem[data-status="resolved"]       { border-left-color: var(--severity-resolved, #4CC4B4); opacity: 0.78; }
.nev-bn-problem[data-status="resolving"] .nev-bn-problem-status,
.nev-bn-problem[data-status="resolved"] .nev-bn-problem-status       { color: var(--severity-resolved, #4CC4B4); }
.nev-bn-problem[data-status="active"]         { border-left-color: var(--dr-teal-deep, #2E8A7E); }
.nev-bn-problem[data-status="active"] .nev-bn-problem-status         { color: var(--dr-teal-deep, #2E8A7E); }

/* Fallback for total parse failure — preserve raw text so the doctor never
   stares at a blank pane. Monospace + scroll, reads as "diagnostic." */
.nev-bn-fallback {
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    font-size: 12px;
    line-height: 1.55;
    color: var(--dr-fg-body, #E8E0D6);
    white-space: pre-wrap;
    margin: 0;
    padding: 16px;
    background: var(--dr-bg-surface, rgba(255, 247, 238, 0.02));
    border: 1px dashed var(--dr-divider, #2A2018);
    border-radius: 4px;
}
.nev-bn-preface { margin: 0 0 16px; color: var(--dr-fg-body, #E8E0D6); font-family: var(--ff-mono, 'JetBrains Mono', monospace); }

/* ─── Inline diff overlay — "rolled-up Today's Note" (2026-05-11) ───
   Each accepted patch is projected as a single `<p.nev-bn-patch-line>`
   appended into the matching problem body (or section body / synthesized
   new-problem card). The line hosts the legacy `.nev-amendment` spans
   so the existing category/risk color CSS in note-evolution.css
   applies unchanged. We add layout-level placement here. */
.nev-bn-patch-line {
    margin: 6px 0 0;
    padding: 6px 8px 6px 10px;
    background: rgba(232, 162, 58, 0.05); /* Diff-like highlight */
    border: 1px dashed var(--dr-amber, #E8A23A);
    border-left: 4px solid var(--dr-amber, #E8A23A);
    border-radius: 4px;
    font-family: var(--ff-mono, 'JetBrains Mono', monospace); /* Monospace patches */
    font-size: 13.5px;
    line-height: 1.5;
    display: block;
    color: var(--dr-fg-body, #E8E0D6);
    cursor: pointer;
    transition: background 150ms ease, border-color 150ms ease, transform 150ms ease;
    box-shadow: 0 2px 8px rgba(0,0,0, 0.2);
}
.nev-bn-patch-line:hover {
    background: rgba(232, 162, 58, 0.12);
    border-color: var(--dr-gold, #F5C24A);
    transform: translateX(2px);
}
.nev-bn-patch-line:focus-visible {
    outline: 2px solid var(--dr-teal, #4CC4B4);
    outline-offset: -2px;
}

/* Explicit Diff-Esque Visuals for Insertions and Deletions inside Patches */
.nev-bn-patch-line .nev-amendment.insert {
    background: rgba(76, 196, 180, 0.2);
    color: var(--dr-teal, #4CC4B4);
    padding: 2px 6px;
    margin: 0 2px;
    border-radius: 3px;
    border-bottom: 1px solid rgba(76, 196, 180, 0.5);
    text-decoration: none;
    font-weight: 500;
}
.nev-bn-patch-line .nev-amendment.insert::before {
    content: '+';
    margin-right: 4px;
    opacity: 0.7;
    font-weight: 700;
}

.nev-bn-patch-line .nev-amendment.delete {
    background: rgba(196, 76, 76, 0.2);
    color: var(--dr-scarlet, #E5524A);
    padding: 2px 6px;
    margin: 0 2px;
    border-radius: 3px;
    border-bottom: 1px solid rgba(196, 76, 76, 0.5);
    text-decoration: line-through;
    opacity: 0.85;
    font-weight: 500;
}
.nev-bn-patch-line .nev-amendment.delete::before {
    content: '-';
    margin-right: 4px;
    opacity: 0.7;
    font-weight: 700;
    text-decoration: none;
    display: inline-block;
}

/* 2026-05-12 — inline edit affordance on accepted patch-line. Default is
   invisible (no clutter on a fresh substrate render); fades in on hover or
   keyboard focus so doctors discover it without seeing a row of tiny
   buttons across every line. */
.nev-bn-patch-edit {
    float: right;
    margin-left: 8px;
    padding: 1px 6px;
    font-family: var(--dr-font-mono, 'JetBrains Mono', monospace);
    font-size: 9.5px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--dr-mocha, #8E8074);
    background: transparent;
    border: 1px solid var(--dr-crater-deep, #2A2018);
    border-radius: 2px;
    cursor: pointer;
    opacity: 0;
    transition: opacity 150ms ease, color 150ms ease, border-color 150ms ease;
}
.nev-bn-patch-line:hover .nev-bn-patch-edit,
.nev-bn-patch-line:focus-within .nev-bn-patch-edit,
.nev-bn-patch-edit:focus-visible {
    opacity: 1;
}
.nev-bn-patch-edit:hover,
.nev-bn-patch-edit:focus-visible {
    color: var(--dr-bone, #FFF7EE);
    border-color: var(--dr-teal, #4CC4B4);
}
/* 2026-05-12 — symmetric reject affordance. Same hairline aesthetic +
   hover-fade pattern as `.nev-bn-patch-edit`; hover/focus flip to scarlet
   so the destructive intent reads at a glance. Color cue + window.confirm
   are the two guards against accidental clicks. */
.nev-bn-patch-reject {
    float: right;
    margin-left: 6px;
    padding: 1px 6px;
    font-family: var(--dr-font-mono, 'JetBrains Mono', monospace);
    font-size: 9.5px;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--dr-mocha, #8E8074);
    background: transparent;
    border: 1px solid var(--dr-crater-deep, #2A2018);
    border-radius: 2px;
    cursor: pointer;
    opacity: 0;
    transition: opacity 150ms ease, color 150ms ease, border-color 150ms ease;
}
.nev-bn-patch-line:hover .nev-bn-patch-reject,
.nev-bn-patch-line:focus-within .nev-bn-patch-reject,
.nev-bn-patch-reject:focus-visible {
    opacity: 1;
}
.nev-bn-patch-reject:hover,
.nev-bn-patch-reject:focus-visible {
    color: var(--dr-bone, #FFF7EE);
    border-color: var(--dr-scarlet, #E5524A);
}
/* 2026-05-12 — Edited-vs-accepted visual differentiation. Doctor-rewritten
   patches (`editPatch` Wave-1 edit-and-accept OR `editAcceptedPatch` post-
   accept edit) carry `status === 'edited'`. Prefix the insert span with a
   small ✎ mark in gold so a doctor reviewing the rolled-up note can see at
   a glance which lines are their own wording vs verbatim-accepted LLM
   output. Single character, no extra DOM element, no JS change — pure
   `data-status` attribute selector + `::before` content. */
.nev-bn-patch-line[data-status="edited"] .nev-amendment.insert::before {
    content: '✎';
    display: inline-block;
    color: var(--dr-gold, #F5C24A);
    font-weight: 700;
    margin-right: 4px;
    opacity: 0.85;
}
.nev-bn-patch-line[data-risk="high"]   { border-left-color: var(--dr-scarlet, #E5524A); }
.nev-bn-patch-line[data-risk="medium"] { border-left-color: var(--dr-amber, #E8A23A); }
.nev-bn-patch-line[data-risk="low"]    { border-left-color: var(--dr-teal, #4CC4B4); }

/* Stack the category badge to the left of the inserted text; suppress
   the heavy underline-by-default styling that .nev-amendment carries
   outside a problem-card context — inside the rolled-up doc, the
   left rail + badge is enough provenance. */
.nev-bn-patch-line .nev-amendment {
    border-bottom: none;
    background: transparent;
    color: inherit;
    padding: 0 2px;
}
.nev-bn-patch-line .nev-amendment.accepted.delete { display: none; }
.nev-bn-patch-line .nev-amendment.accepted.insert { opacity: 1; }
.nev-bn-patch-line .nev-category-badge {
    display: inline-block;
    font-family: var(--ff-mono, 'JetBrains Mono', monospace);
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    padding: 1px 5px;
    margin-right: 6px;
    border-radius: 2px;
    vertical-align: 1px;
    background: rgba(255, 247, 238, 0.06);
    color: var(--dr-fg-body, #E8E0D6);
}

/* Brief flash to draw the eye when a patch lands on accept. Animation
   class is removed via animationend so doctors scrubbing accept/reject
   don't strobe the column. */
@keyframes nev-bn-patch-flash {
    0%   { background: rgba(232, 162, 58, 0.22); }
    100% { background: var(--dr-bg-surface, rgba(255, 247, 238, 0.025)); }
}
.nev-bn-patch-line-flash {
    animation: nev-bn-patch-flash 0.9s ease-out 1;
}

/* Synthesized problem card for accepted `new_problem` / unmatched-target
   patches. Subtle "new" treatment (gold rail mirrors data-status="new"
   in the existing pill mapping) so it sits naturally alongside parsed
   problems without looking grafted on. */
.nev-bn-problem-new {
    border-left-style: dashed;
    background: rgba(245, 194, 74, 0.04);
}
.nev-bn-problem-new .nev-bn-problem-title { color: var(--dr-gold, #F5C24A); }

/* ────────────────────────────────────────────────────────────────────
   Divergence 2 (2026-05-16) — manual scoped slot-edit controls.

   The `data-nev-slot-type` attribute is emitted ONLY when the nested
   sub-flag chain (__ENABLE_NEV_SLOT_EDIT && __ENABLE_THREE_SUBSTRATE_
   TAKEOVER) is on, so every rule below is structurally dormant flag-OFF
   — zero visual delta vs the committed daily-driver right pane.

   The hover pencil is a single CSS ::after affordance (NOT a per-slot
   <button> in the DOM) — keeps the rendered tree byte-light and the
   click wiring delegated from #nevBaseNote. textarea/input/select only;
   there is deliberately NO contenteditable styling (vision non-goal).
   ──────────────────────────────────────────────────────────────────── */

/* Editable units get a quiet hover affordance: a hairline ring + a
   pencil glyph anchored top-right. position:relative is scoped to
   slot-typed nodes only so non-slot layout is untouched. */
[data-nev-slot-type] {
    position: relative;
    border-radius: 3px;
    transition: background var(--dr-timing-fast, 120ms)
        var(--dr-easing-ease-out, ease-out);
}
[data-nev-slot-type]:hover {
    background: rgba(245, 194, 74, 0.05);
    box-shadow: inset 0 0 0 1px var(--dr-divider-soft, rgba(255, 247, 238, 0.10));
}
[data-nev-slot-type]:hover::after {
    content: "\270E";                 /* ✎ lower-right pencil */
    position: absolute;
    top: 2px;
    right: 4px;
    font-size: 11px;
    line-height: 1;
    padding: 2px 4px;
    border-radius: 3px;
    color: var(--dr-gold, #F5C24A);
    background: var(--dr-bg-elev, rgba(20, 14, 10, 0.85));
    border: 1px solid var(--dr-divider, rgba(255, 247, 238, 0.14));
    pointer-events: none;             /* click goes to the slot/dblclick */
    opacity: 0;
    animation: nev-slot-pencil-in var(--dr-timing-fast, 120ms)
        var(--dr-easing-ease-out, ease-out) forwards;
}
/* A dedicated single-click pencil hit-target overlaying the glyph area.
   Rendered for keyboard/click users who prefer not to double-click;
   the delegated handler in note-evolution-workspace.js routes a click
   on `.nev-slot-edit-trigger` to _activateSlotEdit. Invisible until the
   slot is hovered (sits under the ::after glyph). */
.nev-slot-edit-trigger {
    position: absolute;
    top: 0;
    right: 0;
    width: 26px;
    height: 22px;
    border: 0;
    margin: 0;
    padding: 0;
    background: transparent;
    cursor: pointer;
    opacity: 0;
}
[data-nev-slot-type]:hover .nev-slot-edit-trigger { opacity: 1; }

@keyframes nev-slot-pencil-in {
    from { opacity: 0; transform: translateY(-1px); }
    to   { opacity: 0.92; transform: translateY(0); }
}

/* Active-editing slot: hide the hover pencil, draw a focus ring so the
   doctor sees exactly which unit is being amended. */
[data-nev-slot-type].editing { background: var(--dr-bg-elev, rgba(20, 14, 10, 0.6)); }
[data-nev-slot-type].editing:hover::after { content: none; }
[data-nev-slot-type].editing {
    box-shadow: inset 0 0 0 1px var(--dr-gold, #F5C24A);
    padding: 6px;
}

/* The inline editor container (control + Save/Cancel). */
.nev-slot-editor {
    display: flex;
    flex-direction: column;
    gap: 6px;
    width: 100%;
}

/* Dark-roast form controls. Auto-height textarea is sized in JS via the
   rows attribute (content-aware); width fills the slot. */
.nev-slot-textarea,
.nev-slot-input,
.nev-slot-select {
    width: 100%;
    box-sizing: border-box;
    font-family: var(--dr-font-body, inherit);
    font-size: 13px;
    line-height: 1.5;
    color: var(--dr-fg-body, #E8E0D6);
    background: var(--dr-bg-surface, rgba(255, 247, 238, 0.025));
    border: 1px solid var(--dr-divider, rgba(255, 247, 238, 0.16));
    border-radius: 4px;
    padding: 7px 9px;
    outline: none;
    resize: vertical;
}
.nev-slot-input,
.nev-slot-select { resize: none; }
.nev-slot-textarea:focus,
.nev-slot-input:focus,
.nev-slot-select:focus {
    border-color: var(--dr-gold, #F5C24A);
    box-shadow: 0 0 0 2px rgba(245, 194, 74, 0.18);
}
.nev-slot-textarea { min-height: 64px; }

/* Save / Cancel row — compact, right-aligned, peer-tool register. */
.nev-slot-actions {
    display: flex;
    gap: 6px;
    justify-content: flex-end;
}
.nev-slot-btn {
    font-family: var(--dr-font-body, inherit);
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.02em;
    padding: 5px 12px;
    border-radius: 4px;
    cursor: pointer;
    border: 1px solid var(--dr-divider, rgba(255, 247, 238, 0.16));
    background: var(--dr-bg-surface, rgba(255, 247, 238, 0.03));
    color: var(--dr-fg-body, #E8E0D6);
    transition: background var(--dr-timing-fast, 120ms)
        var(--dr-easing-ease-out, ease-out);
}
.nev-slot-btn:hover { background: rgba(255, 247, 238, 0.08); }
.nev-slot-save {
    border-color: var(--dr-gold, #F5C24A);
    color: var(--dr-gold, #F5C24A);
}
.nev-slot-save:hover { background: rgba(245, 194, 74, 0.14); }

/* ───────────────────────────────────────────────────────────────────
 * Divergence 1 (2026-05-16) — inline-at-knot action surface.
 *
 * Phase B: sticky note-block action bar at the top edge of the focused
 *          .nev-bn-problem (the right-pane mirror of the knot popover).
 * Phase C: read-only patch-ledger chip that replaces the queue card's
 *          action row when the queue is demoted (flag-ON only).
 *
 * Dormant unless __ENABLE_NEV_INLINE_ACTIONS (the markup is never
 * emitted otherwise — see _isInlineActionsEnabled()). All rules scoped
 * to the takeover surface so the rail/daily-driver is untouched. Dark
 * Roast --dr-* tokens with safe fallbacks. NO contenteditable styling.
 * ─────────────────────────────────────────────────────────────────── */

/* Phase B — sticky note-block action bar. Sits at the block's top edge
 * and stays pinned while the doctor scrolls the assessment body. */
.sol-workspace-main[data-takeover="active"] .nev-bn-action-bar {
    position: sticky;
    top: 0;
    z-index: 4;
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: -2px -2px 8px;
    padding: 6px 8px;
    background: rgba(18, 12, 6, 0.92);
    border: 1px solid rgba(191, 161, 98, 0.40);
    border-radius: 3px;
    backdrop-filter: blur(2px);
    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-head {
    display: flex;
    align-items: center;
    gap: 8px;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-title {
    font: 600 11px/1.2 inherit;
    color: var(--dr-crema, #FFF7EE);
    flex: 1 1 auto;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-count {
    font: 9px/1 inherit;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: 0.03em;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-row {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    align-items: center;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-cat {
    font: 8px/1 inherit;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--dr-brass, #BFA162);
    padding-right: 4px;
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn,
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-edit {
    appearance: none;
    border: 1px solid rgba(139, 115, 85, 0.55);
    background: rgba(30, 20, 14, 0.72);
    color: var(--dr-bone, #EBE1D7);
    font: 9px/1 inherit;
    padding: 4px 8px;
    border-radius: 2px;
    cursor: pointer;
    transition: background 120ms var(--dr-easing-ease-out, ease-out);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn:hover,
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-edit:hover {
    background: rgba(255, 247, 238, 0.08);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.accept {
    border-color: var(--dr-gold, #F5C24A);
    color: var(--dr-gold, #F5C24A);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.accept:hover {
    background: rgba(245, 194, 74, 0.14);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.reject {
    border-color: var(--dr-scarlet, #C44C4C);
    color: var(--dr-scarlet, #C44C4C);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.reject:hover {
    background: rgba(196, 76, 76, 0.12);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.doctor {
    border-color: var(--dr-amber, #E69A4C);
    color: var(--dr-amber, #E69A4C);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-btn.ehr {
    border-color: var(--dr-teal, #4CC4B4);
    color: var(--dr-teal, #4CC4B4);
}
.sol-workspace-main[data-takeover="active"] .nev-bn-ab-chip {
    font: 9px/1 inherit;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--dr-mocha, #8B7355);
    padding: 3px 6px;
    border: 1px solid rgba(139, 115, 85, 0.4);
    border-radius: 2px;
}

/* Phase C — read-only patch-ledger chip (replaces the queue card's
 * action row when the queue is demoted). No buttons; pure state. */
.sol-workspace-main[data-takeover="active"] .nev-ledger-chip {
    display: inline-flex;
    align-items: center;
    font: 9px/1 ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--dr-mocha, #8B7355);
    padding: 3px 8px;
    border: 1px solid rgba(139, 115, 85, 0.45);
    border-radius: 2px;
    background: rgba(18, 12, 6, 0.44);
}
.sol-workspace-main[data-takeover="active"] .nev-ledger-chip.accepted {
    color: var(--dr-gold, #F5C24A);
    border-color: rgba(245, 194, 74, 0.45);
}
.sol-workspace-main[data-takeover="active"] .nev-ledger-chip.rejected {
    color: var(--dr-scarlet, #C44C4C);
    border-color: rgba(196, 76, 76, 0.42);
}
.sol-workspace-main[data-takeover="active"] .nev-ledger-chip.edited {
    color: var(--dr-amber, #E69A4C);
    border-color: rgba(230, 154, 76, 0.42);
}
/* Ledger rows stay click-to-navigate (focus block + tapestry knot). */
.sol-workspace-main[data-takeover="active"] .nev-review-card:hover {
    cursor: pointer;
}
