/* episode-tapestry.css — v7 Note Evolution course tapestry, scoped to
 * the takeover middle pane. Dark Roast --dr-* tokens only (with safe
 * fallbacks). Dormant unless __ENABLE_EPISODE_TAPESTRY (the markup is
 * never emitted otherwise). Never affects the rail or census. */

.nev-tap {
    /* Layout tokens (2026-06-29 overhaul). --nev-days is set inline per
       render (the day-column count). The WIDTH of a day column lives here,
       not as 1fr: a 1-2 day stay must read as a dense, intentional timeline
       instead of one bar stretched across the whole panel. The board sizes
       to content (width:max-content on spine/board) so the empty void to the
       right collapses; max-width:100% + the mount's overflow:auto handle long
       stays. */
    /* --nev-label-w / --nev-day-w (2026-07-01): previously 172px + clamp(150,
       18vw, 268px) — the 18vw term assumed the tapestry owns close to full
       viewport width. It actually renders inside the takeover's narrow
       middle column (~0.85fr of a 3-column grid, well under 18% of the
       viewport), so at typical widths the vw term hit its 268px ceiling
       regardless of the column's real size, forcing a single day (label +
       1 column) to need ~440px against a column that only had ~300px —
       clipped header/pills/lane text, reachable only via an easy-to-miss
       horizontal scrollbar. Values below are sized so label + 1 day fits
       inside the column's new 360px floor (see note-evolution-takeover.css);
       multi-day stays still legitimately scroll via the mount's overflow. */
    --nev-label-w: 150px;
    --nev-day-w: clamp(120px, 9vw, 190px);
    --nev-line: rgba(107, 86, 74, .30);
    display: grid;
    gap: 10px;
    /* Cap the reading column so a content-width board doesn't float in a vast
       dark panel on wide screens (the trailing void reads as "broken/empty"
       even when it's just chrome). Left-aligned; the panel bg fills the rest. */
    max-width: min(100%, 1180px);
    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
    color: var(--dr-bone, #EBE1D7);
}
.nev-tap[data-compact="1"] { --nev-day-w: clamp(96px, 6vw, 150px); }

.nev-tap-spine {
    display: grid;
    grid-template-columns: var(--nev-label-w) repeat(var(--nev-days, 1), var(--nev-day-w));
    width: max-content;
    max-width: 100%;
    border: 1px solid rgba(107, 86, 74, .58);
    border-radius: 4px;
    overflow: hidden;
    background: rgba(18, 12, 6, .44);
}
.nev-tap-spine-corner {
    border-right: 1px solid rgba(107, 86, 74, .46);
    background: rgba(42, 28, 19, .55);
}
.nev-tap-phase {
    border: 0;
    border-right: 1px solid rgba(107, 86, 74, .46);
    background: rgba(30, 20, 14, .72);
    color: var(--dr-bone, #EBE1D7);
    padding: 8px 10px;
    text-align: left;
    cursor: pointer;
    display: grid;
    gap: 3px;
    transition: background .12s ease;
}
.nev-tap-phase:last-child { border-right: 0; }
.nev-tap-phase:hover { background: rgba(46, 31, 20, .92); }
.nev-tap-phase.selected {
    background: rgba(76, 196, 180, .12);
    box-shadow: inset 0 -2px 0 var(--dr-teal, #4CC4B4);
}
.nev-tap-phase .d {
    font: 700 11px/1 inherit;
    color: var(--dr-crema, #FFF7EE);
    letter-spacing: .04em;
}
.nev-tap-phase .dt { font: 9px/1 inherit; color: var(--dr-mocha, #8B7355); }

.nev-tap-aware { display: flex; gap: 6px; flex-wrap: wrap; }
.nev-tap-pill {
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(191, 161, 98, .44);
    background: rgba(18, 12, 6, .44);
    color: var(--dr-warm-white, #F0E6D0);
    padding: 3px 7px;
    font: 9px/1 inherit;
    letter-spacing: .04em;
    text-transform: uppercase;
    border-radius: 2px;
}
.nev-tap-pill.pending { color: var(--dr-amber, #E69A4C); border-color: rgba(230, 154, 76, .62); }
.nev-tap-pill.ready { color: var(--dr-teal, #4CC4B4); border-color: rgba(76, 196, 180, .55); }
.nev-tap-pill.dim { color: var(--dr-mocha, #8B7355); }

.nev-tap-board {
    width: max-content;
    max-width: 100%;
    border: 1px solid rgba(107, 86, 74, .62);
    border-radius: 4px;
    overflow: hidden;
    background: rgba(18, 12, 6, .35);
}
.nev-tap-lane {
    display: grid;
    grid-template-columns: var(--nev-label-w) auto;
    min-height: 58px;
    border-bottom: 1px solid rgba(107, 86, 74, .42);
}
.nev-tap[data-compact="1"] .nev-tap-lane { min-height: 42px; }
.nev-tap-lane:last-child { border-bottom: 0; }
.nev-tap-lane:hover { background: rgba(255, 247, 238, .015); }
.nev-tap-lane[data-kind="readiness"] { background: rgba(169, 137, 214, .05); }
.nev-tap-lane.is-unscored { opacity: .82; }
.nev-tap-lane.is-deferred .nev-tap-lane-label { opacity: .6; }
.nev-tap-lane.nav-cursor { box-shadow: inset 2px 0 0 var(--dr-teal, #4CC4B4); }
.nev-tap-lane.inspected {
    background: rgba(76, 196, 180, .06);
    box-shadow: inset 3px 0 0 var(--dr-teal, #4CC4B4);
}
.nev-tap-lane-label {
    padding: 9px 11px;
    border-right: 1px solid rgba(107, 86, 74, .55);
    background: rgba(42, 28, 19, .55);
    overflow: hidden;
}
.nev-tap-lane-label .nm {
    display: flex;
    align-items: flex-start;
    gap: 6px;
    font: 600 12px/1.25 inherit;
    color: var(--dr-crema, #FFF7EE);
}
.nev-tap-lane-nm {
    cursor: pointer;
    min-width: 0;
    overflow-wrap: anywhere;
}
.nev-tap-lane-detail {
    appearance: none;
    -webkit-appearance: none;
    margin: 0;
    padding: 0;
    border: 0;
    background: transparent;
    text-align: left;
}
.nev-tap-lane-detail:focus-visible {
    border-radius: 2px;
    outline: 2px solid var(--wv-teal, var(--dr-teal, #4CC4B4));
    outline-offset: 2px;
}
.nev-tap-lane-nm:hover { text-decoration: underline; text-underline-offset: 2px; }
.nev-tap-lane-label .ty {
    font: 8px/1.2 inherit;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: .08em;
    margin-top: 5px;
}
.nev-tap-track {
    display: grid;
    grid-template-columns: repeat(var(--nev-days, 1), var(--nev-day-w));
    /* Row 1 = episode bars, row 2 = per-day knot stacks (grid-row set inline
       on each child). Separating the two rows is what stops same-day knots
       from point-stacking over the episode and over each other. */
    grid-auto-rows: min-content;
    align-content: center;
    align-items: start;
    row-gap: 5px;
    position: relative;
    padding: 8px 0;
    /* One faint guide at the START of each day column — aligned to the real
       column count (was hardcoded to 1/7, so on a 2-day stay the lines fell
       on nothing). */
    background: repeating-linear-gradient(
        to right, var(--nev-line) 0 1px, transparent 1px var(--nev-day-w));
}
.nev-tap-ep {
    min-height: 30px;
    margin: 0 5px;
    border: 1px solid rgba(191, 161, 98, .42);
    border-left: 4px solid var(--incl, var(--dr-brass, #BFA162));
    border-radius: 3px;
    background: rgba(46, 31, 21, .82);
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 2px;
    padding: 5px 9px;
    min-width: 0;
    overflow: hidden;
    color: var(--dr-bone, #EBE1D7);
}
.nev-tap-ep-state {
    font: 700 9px/1 inherit;
    letter-spacing: .07em;
    text-transform: uppercase;
    color: var(--dr-brass, #BFA162);
}
.nev-tap-ep-sum {
    font: 10px/1.25 inherit;
    color: var(--dr-bone, #EBE1D7);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nev-tap[data-compact="1"] .nev-tap-ep { min-height: 22px; padding: 3px 8px; }
.nev-tap[data-compact="1"] .nev-tap-ep-sum { display: none; }
.nev-tap-ep[data-state="watch"],
.nev-tap-ep[data-state="conflict"],
.nev-tap-ep[data-state="worsening"] { background: rgba(196, 76, 76, .12); }
.nev-tap-ep[data-state="watch"] .nev-tap-ep-state,
.nev-tap-ep[data-state="conflict"] .nev-tap-ep-state,
.nev-tap-ep[data-state="worsening"] .nev-tap-ep-state { color: var(--dr-scarlet, #C44C4C); }
.nev-tap-ep[data-state="resolved"],
.nev-tap-ep[data-state="controlled"],
.nev-tap-ep[data-state="improving"] { background: rgba(76, 196, 180, .09); }
.nev-tap-ep[data-state="resolved"] .nev-tap-ep-state,
.nev-tap-ep[data-state="controlled"] .nev-tap-ep-state,
.nev-tap-ep[data-state="improving"] .nev-tap-ep-state { color: var(--dr-teal, #4CC4B4); }

/* Knots (2026-06-29 rework): a change marker is now an inline CHIP [dot · label]
 * living in a per-day vertical stack (.nev-tap-knotstack), NOT a point-stacked
 * circle with an absolutely-positioned label. Multiple same-day changes list
 * downward and read cleanly; the DOT (.kg) carries the state color while the
 * chip body stays neutral so a lane with 4 changes reads as 4 calm rows. */
.nev-tap-knotstack {
    grid-row: 2;
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
    padding: 0 5px;
    align-self: start;
}
.nev-tap-knot {
    position: relative;
    z-index: 3;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    max-width: 100%;
    padding: 2px 8px 2px 4px;
    border: 1px solid rgba(107, 86, 74, .42);
    border-radius: 11px;
    background: rgba(46, 31, 21, .66);
    color: var(--dr-bone, #EBE1D7);
    font: 9px/1.25 inherit;
    text-align: left;
    cursor: pointer;
}
.nev-tap-knot:hover {
    background: rgba(60, 40, 27, .9);
    border-color: rgba(191, 161, 98, .5);
}
.nev-tap-knot .kg {
    flex: 0 0 auto;
    position: relative;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    font: 8px/1 inherit;
    color: var(--dr-void, #120C06);
    background: var(--dr-brass, #BFA162);
    box-shadow: 0 0 0 2px rgba(18, 12, 6, .7);
}
.nev-tap-knot .kl {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--dr-bone, #EBE1D7);
}
/* State color lives on the DOT now (was the whole circle). */
.nev-tap-knot.proposed .kg { background: var(--dr-amber, #E69A4C); box-shadow: 0 0 0 2px rgba(18,12,6,.7), 0 0 8px rgba(230,154,76,.5); }
.nev-tap-knot.detected .kg { background: var(--dr-brass, #BFA162); }
.nev-tap-knot.accepted .kg { background: var(--dr-teal, #4CC4B4); }
.nev-tap-knot.edited .kg { background: var(--dr-violet, #A989D6); }
.nev-tap-knot.rejected { opacity: .5; }
.nev-tap-knot.rejected .kg { background: var(--dr-crater, #6B564A); }
.nev-tap-knot.rejected .kl { text-decoration: line-through; color: var(--dr-mocha, #8B7355); }
.nev-tap-knot.conflict { border-color: rgba(196, 76, 76, .5); }
.nev-tap-knot.conflict .kg { background: var(--dr-scarlet, #C44C4C); box-shadow: 0 0 0 2px rgba(18,12,6,.7), 0 0 9px rgba(196,76,76,.6); }
.nev-tap-knot.apply_failed .kg { background: var(--dr-scarlet, #C44C4C); border: 1px dashed var(--dr-crema, #FFF7EE); }
.nev-tap-knot.carried_forward .kg { background: transparent; color: var(--dr-mocha, #8B7355); border: 1px solid rgba(139,115,85,.7); box-shadow: none; }
.nev-tap-knot.selected { outline: 2px solid var(--dr-crema, #FFF7EE); outline-offset: 2px; }
.nev-tap-knot.pulse .kg { animation: nevTapPulse 1.4s ease-in-out infinite; }
@keyframes nevTapPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.16); } }

/* Ledger knots (2026-05-27, plan KTD11): a pending Δ marks an unreconciled
 * HyperDrive delta the note hasn't absorbed — sourced from the ledger, NOT an
 * LLM patch. Dashed amber dot reads as "flagged, not yet acted", visually
 * distinct from the solid patch-knot states so the doctor can tell the two
 * apart at a glance. Reconciling reuses .pulse while the scoped propose
 * streams (U5). */
.nev-tap-knot.ledger_pending .kg,
.nev-tap-knot.ledger_reconciling .kg {
    background: transparent;
    color: var(--dr-amber, #E69A4C);
    border: 1.5px dashed var(--dr-amber, #E69A4C);
    box-shadow: none;
}
/* U6: carried-forward = a dim hollow waypoint. The considered-and-kept
 * decision stays visible but recedes so it reads as "looked at, intentionally
 * not amended" rather than "needs action". Dismiss has NO style — the knot is
 * removed from the lane entirely (audit row only). */
.nev-tap-knot.ledger_carried_forward { opacity: .6; }
.nev-tap-knot.ledger_carried_forward .kg {
    background: transparent;
    color: var(--dr-mocha, #8B7355);
    border: 1px solid rgba(139, 115, 85, .45);
    box-shadow: none;
}

/* Knot state-transition cue (2026-05-26): a one-shot "this just reconciled"
 * gesture, applied by episode-tapestry-column.js ONLY to a knot whose patch
 * state changed since the last render. The state color is already on the dot;
 * this adds the *motion* of the change settling into place — now played on the
 * DOT (.kg). Default = a brief seat (pop down to rest); the ::after sonar ping
 * echoes the meaning's direction (teal = accepted, scarlet = conflict/failed).
 * Conflict & apply-failed shake instead of seat so they read as "needs
 * attention". All one-shot — next render simply doesn't re-emit the class. */
.nev-tap-knot.nev-knot-just-changed .kg {
    animation: nevKnotSeat .24s cubic-bezier(.34, 1.56, .64, 1) both;
}
.nev-tap-knot.nev-knot-just-changed .kg::after {
    content: "";
    position: absolute;
    inset: -2px;
    border-radius: 50%;
    border: 1.5px solid var(--nev-knot-ping, var(--dr-crema, #FFF7EE));
    animation: nevKnotPing .5s ease-out both;
    pointer-events: none;
}
.nev-tap-knot.nev-knot-to-accepted .kg::after { --nev-knot-ping: var(--dr-teal, #4CC4B4); }
.nev-tap-knot.nev-knot-to-conflict .kg::after,
.nev-tap-knot.nev-knot-to-apply_failed .kg::after { --nev-knot-ping: var(--dr-scarlet, #C44C4C); }
.nev-tap-knot.nev-knot-to-conflict.nev-knot-just-changed .kg,
.nev-tap-knot.nev-knot-to-apply_failed.nev-knot-just-changed .kg {
    animation: nevKnotShake .3s ease-in-out both;
}
@keyframes nevKnotSeat { 0% { transform: scale(1.28); } 62% { transform: scale(.94); } 100% { transform: scale(1); } }
@keyframes nevKnotPing { from { transform: scale(1); opacity: .7; } to { transform: scale(2.4); opacity: 0; } }
@keyframes nevKnotShake { 0%, 100% { transform: translateX(0); } 20% { transform: translateX(-2px); } 40% { transform: translateX(2px); } 60% { transform: translateX(-1.5px); } 80% { transform: translateX(1.5px); } }
.nev-tap-knot:focus-visible,
.nev-tap-phase:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

/* ──────────────────────────────────────────────────────────────────
   Converged-surface affordance layer (toolbar / filters / per-lane
   tags / compile-pin / inspector). These elements are emitted by the
   passive census mount (episode-tapestry-column.js) but shipped WITHOUT
   any CSS — they fell back to raw browser-default controls jammed in the
   top-left. Styled here in the Dark Roast register (2026-06-29 overhaul).
   ────────────────────────────────────────────────────────────────── */

/* Awareness pills — slightly more presence than the 9px default. */
.nev-tap-aware { align-items: center; }

.nev-tap-toolbar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    padding: 7px 9px;
    border: 1px solid rgba(107, 86, 74, .5);
    border-radius: 4px;
    background: rgba(18, 12, 6, .42);
}
.nev-tap-filters {
    display: inline-flex;
    gap: 0;
    border: 1px solid rgba(107, 86, 74, .55);
    border-radius: 4px;
    overflow: hidden;
}
.nev-tap-fbtn {
    border: 0;
    border-right: 1px solid rgba(107, 86, 74, .62);
    background: rgba(30, 20, 14, .55);
    color: var(--wv-warmmid, #B9A88F);
    padding: 5px 11px;
    font: 10px/1 inherit;
    letter-spacing: .03em;
    cursor: pointer;
    transition: background .12s ease, color .12s ease;
}
.nev-tap-filters .nev-tap-fbtn:last-child { border-right: 0; }
.nev-tap-fbtn:hover { background: rgba(46, 31, 20, .9); color: var(--dr-bone, #EBE1D7); }
.nev-tap-fbtn.on {
    background: rgba(76, 196, 180, .14);
    color: var(--dr-teal, #4CC4B4);
}
.nev-tap-tgl {
    border: 1px solid rgba(107, 86, 74, .55);
    border-radius: 4px;
    background: rgba(30, 20, 14, .55);
    color: var(--dr-mocha, #8B7355);
    padding: 5px 10px;
    font: 10px/1 inherit;
    cursor: pointer;
    transition: background .12s ease, color .12s ease, border-color .12s ease;
}
.nev-tap-tgl:hover { background: rgba(46, 31, 20, .9); color: var(--dr-bone, #EBE1D7); }
.nev-tap-tgl.on {
    background: rgba(191, 161, 98, .16);
    border-color: rgba(191, 161, 98, .55);
    color: var(--dr-brass, #BFA162);
}
.nev-tap-count {
    margin-left: auto;
    font: 9px/1 inherit;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--dr-mocha, #8B7355);
}
.nev-tap-fbtn:focus-visible,
.nev-tap-tgl:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

/* Per-lane tags (classification / unscored / deferred). */
.nev-tap-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin-top: 6px;
}
.nev-tap-tag {
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(107, 86, 74, .5);
    border-radius: 2px;
    background: rgba(18, 12, 6, .4);
    color: var(--dr-mocha, #8B7355);
    padding: 2px 5px;
    font: 8px/1 inherit;
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-tag.cls { color: var(--dr-brass, #BFA162); border-color: rgba(191, 161, 98, .4); }
.nev-tap-tag.unscored {
    color: var(--dr-mocha, #8B7355);
    border-style: dashed;
}
.nev-tap-tag.deferred { color: var(--dr-violet, #A989D6); border-color: rgba(169, 137, 214, .4); }

/* Compile-pin toggle. */
.nev-tap-pin {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    border: 1px solid rgba(107, 86, 74, .5);
    border-radius: 3px;
    background: rgba(18, 12, 6, .4);
    color: var(--dr-mocha, #8B7355);
    font-size: 10px;
    line-height: 1;
    display: grid;
    place-items: center;
    cursor: pointer;
    padding: 0;
    transition: border-color .12s ease, background .12s ease;
}
.nev-tap-pin:hover { border-color: rgba(191, 161, 98, .6); }
.nev-tap-pin.on {
    border-color: rgba(230, 154, 76, .65);
    background: rgba(230, 154, 76, .12);
}
.nev-tap-pin:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

.nev-tap-emptyrow {
    padding: 22px 14px;
    text-align: center;
    color: var(--dr-mocha, #8B7355);
    font: 10px/1.4 inherit;
}

/* Lane inspector (read-only detail for a clicked lane). */
.nev-tap-inspector {
    width: max-content;
    max-width: 100%;
    border: 1px solid rgba(76, 196, 180, .34);
    border-radius: 4px;
    background: rgba(18, 12, 6, .5);
}
.nev-tap-insp-head {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 11px;
    border-bottom: 1px solid rgba(107, 86, 74, .42);
}
.nev-tap-insp-ttl {
    font: 600 12px/1.2 inherit;
    color: var(--dr-crema, #FFF7EE);
}
.nev-tap-insp-x {
    margin-left: auto;
    width: 22px;
    height: 22px;
    border: 1px solid rgba(107, 86, 74, .55);
    border-radius: 3px;
    background: transparent;
    color: var(--dr-mocha, #8B7355);
    cursor: pointer;
}
.nev-tap-insp-x:hover { color: var(--dr-crema, #FFF7EE); border-color: rgba(255, 247, 238, .5); }
.nev-tap-insp-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    padding: 9px 11px;
    border-bottom: 1px solid rgba(107, 86, 74, .3);
}
.nev-tap-insp-kv {
    font: 9px/1.3 inherit;
    color: var(--dr-bone, #EBE1D7);
    border: 1px solid rgba(107, 86, 74, .42);
    border-radius: 2px;
    padding: 2px 6px;
}
.nev-tap-insp-kv b {
    color: var(--dr-mocha, #8B7355);
    font-weight: 400;
    text-transform: uppercase;
    letter-spacing: .04em;
    margin-right: 4px;
}
.nev-tap-insp-eps { padding: 6px 11px 9px; display: grid; gap: 4px; }
.nev-tap-insp-ep {
    display: grid;
    grid-template-columns: 64px 80px 1fr;
    gap: 8px;
    align-items: baseline;
    font: 9px/1.35 inherit;
    color: var(--dr-bone, #EBE1D7);
    padding: 3px 0;
    border-bottom: 1px solid rgba(107, 86, 74, .22);
}
.nev-tap-insp-ep:last-child { border-bottom: 0; }
.nev-tap-insp-ep .d { color: var(--dr-brass, #BFA162); }
.nev-tap-insp-ep .s {
    color: var(--dr-teal, #4CC4B4);
    text-transform: uppercase;
    letter-spacing: .04em;
}
.nev-tap-insp-ep .x { color: var(--dr-bone, #EBE1D7); }
.nev-tap-insp-eps .x { color: var(--dr-mocha, #8B7355); }

/* ──────────────────────────────────────────────────────────────────
   Layout finesse pass (2026-06-29, infographic-gen layout grammar).
   Borrows ONLY the spatial principles — emphasis-by-de-emphasis, grouped
   bands, three-act rhythm. No argument/annotation rhetoric (a clinical
   course view documents state, it does not persuade — that would be the
   ungrounded entropy this project bans).
   ────────────────────────────────────────────────────────────────── */

/* (1) Emphasis by de-emphasis — the eye should land on the problems that
   need work today. Dimming is GENTLE (the prior surface was already too
   washed out); the active rows earn a status accent rail + full contrast
   rather than the stable rows being heavily faded. */
.nev-tap-lane[data-kind="problem"][data-status="resolved"] { opacity: .6; }
.nev-tap-lane[data-kind="problem"][data-status="stable"],
.nev-tap-lane[data-kind="problem"][data-status="controlled"],
.nev-tap-lane[data-kind="problem"][data-status="chronic_stable"],
.nev-tap-lane[data-kind="problem"][data-status="monitoring"],
.nev-tap-lane[data-kind="problem"][data-status="improving"] { opacity: .84; }
.nev-tap-lane[data-kind="problem"][data-status="active"] .nev-tap-lane-label,
.nev-tap-lane[data-kind="problem"][data-status="new"] .nev-tap-lane-label,
.nev-tap-lane[data-kind="problem"][data-status="reopened"] .nev-tap-lane-label,
.nev-tap-lane[data-kind="problem"][data-status="unstable"] .nev-tap-lane-label {
    box-shadow: inset 3px 0 0 var(--dr-brass, #BFA162);
}
.nev-tap-lane[data-kind="problem"][data-status="worsening"] .nev-tap-lane-label {
    box-shadow: inset 3px 0 0 var(--dr-scarlet, #C44C4C);
}
.nev-tap-lane[data-kind="problem"][data-status="worsening"] .nev-tap-lane-nm {
    color: var(--dr-crema, #FFF7EE);
}

/* (2) Patient-level context band — the Subjective/Objective/Disposition
   scaffold lanes are CONTEXT, not problems. Recede them into a lighter
   grouped band so three near-identical "context" rows stop competing with
   the problem lifelines for attention. (Readiness keeps its own violet tint
   set above.) */
.nev-tap-lane:not([data-kind="problem"]):not([data-kind="readiness"]) {
    background: rgba(42, 28, 19, .22);
}
.nev-tap-lane:not([data-kind="problem"]):not([data-kind="readiness"]) .nev-tap-lane-label {
    background: rgba(42, 28, 19, .4);
}
.nev-tap-lane:not([data-kind="problem"]):not([data-kind="readiness"]) .nev-tap-ep {
    background: rgba(42, 28, 19, .55);
}
.nev-tap-lane:not([data-kind="problem"]):not([data-kind="readiness"]) .nev-tap-ep-state {
    color: var(--dr-mocha, #8B7355);
}

/* (3) Three-act rhythm — set the provenance foot (Act 3: ledger / today's
   log) apart from the matrix (Act 2) with a hairline divider + breathing
   room, so it reads as a distinct movement rather than more grid. */
.nev-tap-foot {
    margin-top: 4px;
    padding-top: 13px;
    border-top: 1px solid rgba(107, 86, 74, .32);
}

/* Divergence 1 — inline-at-knot action popover. Markup is emitted only
 * when the nested __ENABLE_NEV_INLINE_ACTIONS + takeover + tapestry flag
 * chain is true. The popover is inserted as a board-flow sibling after
 * the lane row, not a floating overlay, so it pushes later lanes down. */
.nev-tap-knot-popover {
    border-bottom: 1px solid rgba(107, 86, 74, .42);
    border-left: 3px solid var(--dr-brass, #BFA162);
    background: rgba(18, 12, 6, .64);
    padding: 10px 12px 10px 160px;
    display: grid;
    gap: 8px;
}
.nev-tap-pop-head {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}
.nev-tap-pop-title {
    font: 11px/1.2 inherit;
    color: var(--dr-crema, #FFF7EE);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nev-tap-pop-cat,
.nev-tap-pop-status {
    border: 1px solid rgba(191, 161, 98, .36);
    color: var(--dr-brass, #BFA162);
    background: rgba(42, 28, 19, .55);
    border-radius: 2px;
    padding: 2px 5px;
    font: 8px/1 inherit;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.nev-tap-pop-status-transition {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: baseline;
    gap: 2px 9px;
    padding: 6px 8px;
    border: 1px solid rgba(76, 196, 180, .24);
    border-left: 3px solid var(--dr-teal, #4CC4B4);
    background: rgba(76, 196, 180, .055);
}
.nev-tap-pop-status-label {
    color: var(--dr-brass, #BFA162);
    font-family: inherit;
    font-size: 8px;
    font-weight: 700;
    line-height: 1.3;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.nev-tap-pop-status-transition strong {
    color: var(--dr-bone, #EBE1D7);
    font-family: inherit;
    font-size: 10px;
    font-weight: 700;
    line-height: 1.35;
}
.nev-tap-pop-status-note {
    grid-column: 1 / -1;
    color: var(--dr-mocha, #8B7355);
    font-family: inherit;
    font-size: 8px;
    font-weight: 600;
    line-height: 1.35;
}
.nev-tap-pop-x {
    margin-left: auto;
    width: 22px;
    height: 22px;
    border: 1px solid rgba(107, 86, 74, .58);
    background: transparent;
    color: var(--dr-mocha, #8B7355);
    cursor: pointer;
}
.nev-tap-cf {
    border: 1px solid rgba(196, 76, 76, .38);
    background: rgba(196, 76, 76, .07);
}
.nev-tap-cf-head {
    display: flex;
    gap: 7px;
    padding: 7px 8px;
    border-bottom: 1px solid rgba(196, 76, 76, .28);
    color: var(--dr-bone, #EBE1D7);
}
.nev-tap-cf-marker {
    color: var(--dr-scarlet, #C44C4C);
    font: 8px/1.2 inherit;
    letter-spacing: .08em;
}
.nev-tap-cf-msg { font: 9px/1.25 inherit; }
.nev-tap-cf-row {
    display: grid;
    grid-template-columns: 96px minmax(0, 1fr) auto;
    gap: 8px;
    padding: 6px 8px;
    border-top: 1px solid rgba(107, 86, 74, .32);
    font: 9px/1.25 inherit;
}
.nev-tap-cf-label { color: var(--dr-brass, #BFA162); }
.nev-tap-cf-val { color: var(--dr-bone, #EBE1D7); }
.nev-tap-cf-meta { color: var(--dr-mocha, #8B7355); }
.nev-tap-pop-actions {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}
.nev-tap-pop-btn {
    border: 1px solid rgba(107, 86, 74, .62);
    background: rgba(30, 20, 14, .72);
    color: var(--dr-bone, #EBE1D7);
    border-radius: 2px;
    padding: 5px 8px;
    font: 9px/1 inherit;
    cursor: pointer;
}
.nev-tap-pop-btn.accept,
.nev-tap-pop-btn.ehr { border-color: rgba(76, 196, 180, .55); color: var(--dr-teal, #4CC4B4); }
.nev-tap-pop-btn.doctor,
.nev-tap-pop-btn.secondary { border-color: rgba(191, 161, 98, .50); color: var(--dr-brass, #BFA162); }
.nev-tap-pop-btn.reject { border-color: rgba(196, 76, 76, .55); color: var(--dr-scarlet, #C44C4C); }
/* U5 ledger-knot popover: amber accent (matches the Δ glyph) + a delta line
 * showing {old}→{new}. The arrow color encodes trajectory (KTD11) — worsening
 * scarlet, improving teal, neutral mocha — so the doctor reads direction
 * pre-attentively, with no interpretation text. */
.nev-tap-knot-popover.ledger { border-left-color: var(--dr-amber, #E69A4C); }
.nev-tap-pop-delta {
    display: flex;
    align-items: center;
    gap: 7px;
    font: 10px/1.3 inherit;
    color: var(--dr-bone, #EBE1D7);
}
.nev-tap-arrow { font-weight: 700; }
.nev-tap-arrow.worse { color: var(--dr-scarlet, #C44C4C); }
.nev-tap-arrow.better { color: var(--dr-teal, #4CC4B4); }
.nev-tap-arrow.neutral { color: var(--dr-mocha, #8B7355); }
.nev-tap-pop-btn:hover,
.nev-tap-pop-x:hover { background: rgba(255, 247, 238, .06); }

/* Knot -> note FOCUS overlay (Sprint 1 Phase 2). Set by
 * NoteEvolutionWorkspace.focusProblemBlock as data-nev-focus on
 * .nev-bn-problem. CSS-only; never set unless a tapestry knot is
 * clicked (caller gated behind __ENABLE_EPISODE_TAPESTRY), so the
 * rail/one-shot render is unaffected. FOCUS, not zoom — opacity +
 * accent only, no transform/scale. */
.nev-bn-problem[data-nev-focus="dim"] {
    opacity: .42;
    transition: opacity .16s ease;
}
.nev-bn-problem[data-nev-focus="active"] {
    opacity: 1;
    outline: 1px solid rgba(255, 247, 238, .5);
    outline-offset: -1px;
    background: rgba(42, 28, 19, .55);
    transition: opacity .16s ease;
}

/* Phase 3 — block ribbon + today's-log (foot of the tapestry pane). */
.nev-tap-foot {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}
.nev-tap-foot-h {
    font: 8px/1.2 inherit;
    color: var(--dr-brass, #BFA162);
    letter-spacing: .08em;
    text-transform: uppercase;
    margin-bottom: 6px;
}
.nev-tap-ribbon,
.nev-tap-log {
    border: 1px solid rgba(107, 86, 74, .58);
    background: rgba(18, 12, 6, .48);
    padding: 8px;
    min-height: 96px;
    max-height: 200px;
    overflow: auto;
}
.nev-tap-rib {
    display: grid;
    grid-template-columns: 8px 1fr auto;
    gap: 6px;
    align-items: center;
    width: 100%;
    border: 0;
    border-bottom: 1px solid rgba(107, 86, 74, .32);
    background: transparent;
    color: var(--dr-bone, #EBE1D7);
    padding: 6px 4px;
    text-align: left;
    cursor: pointer;
}
.nev-tap-rib:last-child { border-bottom: 0; }
.nev-tap-rib:hover { background: rgba(255, 247, 238, .05); }
.nev-tap-rib .rk { width: 8px; height: 16px; background: var(--dr-crater, #6B564A); }
.nev-tap-rib .rl {
    font: 9px/1.15 inherit;
    color: var(--dr-bone, #EBE1D7);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.nev-tap-rib .rs {
    font: 8px/1 inherit;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
}
.nev-tap-rib.pending .rk { background: var(--dr-amber, #E69A4C); }
.nev-tap-rib.accepted .rk { background: var(--dr-teal, #4CC4B4); }
.nev-tap-rib.edited .rk { background: var(--dr-violet, #A989D6); }
.nev-tap-rib.conflict .rk { background: var(--dr-scarlet, #C44C4C); }
.nev-tap-rib.blocked .rk {
    background: var(--dr-scarlet, #C44C4C);
    background-image: repeating-linear-gradient(
        45deg, transparent 0 3px, rgba(0, 0, 0, .28) 3px 5px);
}
.nev-tap-logrow {
    display: grid;
    grid-template-columns: 42px 1fr auto;
    gap: 6px;
    align-items: start;
    font: 9px/1.3 inherit;
    color: var(--dr-bone, #EBE1D7);
    border-bottom: 1px solid rgba(107, 86, 74, .3);
    padding: 5px 0;
}
.nev-tap-logrow:last-child { border-bottom: 0; }
.nev-tap-logrow.muted { color: var(--dr-mocha, #8B7355); }
.nev-tap-logrow .t { color: var(--dr-brass, #BFA162); }
.nev-tap-revert {
    border: 1px solid rgba(191, 161, 98, .42);
    background: rgba(18, 12, 6, .5);
    color: var(--dr-bone, #EBE1D7);
    font: 8px/1 inherit;
    text-transform: uppercase;
    letter-spacing: .05em;
    padding: 3px 5px;
    cursor: pointer;
    border-radius: 2px;
}
.nev-tap-revert:hover { color: var(--dr-crema, #FFF7EE); border-color: rgba(255, 247, 238, .6); }
.nev-tap-rib:focus-visible,
.nev-tap-revert:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

@media (max-width: 1100px) {
    .nev-tap-foot { grid-template-columns: 1fr; }
}

@media (prefers-reduced-motion: reduce) {
    .nev-tap-knot.pulse { animation: none; }
    .nev-tap-knot.nev-knot-just-changed { animation: none; }
    .nev-tap-knot.nev-knot-just-changed::after { animation: none; content: none; }
    .nev-bn-problem[data-nev-focus] { transition: none; }
}

/* ──────────────────────────────────────────────────────────────────
   Tapestry redesign (2026-06-30) — claude.ai/design "Hospitalization
   Tapestry", option 1a "Lifelines". All gated by __ENABLE_TAPESTRY_ARCS
   in the JS render (markup absent flag-OFF), so these rules only ever
   match when the flag is on. Dark Roast --dr-* tokens; --dr-olive is the
   one new color (stable/chronic), supplied inline as a fallback.
   ────────────────────────────────────────────────────────────────── */

/* Header band — title + current hospital day. */
.nev-tap-header {
    padding: 13px 15px 11px;
    border: 1px solid rgba(107, 86, 74, .5);
    border-radius: 4px;
    background: linear-gradient(180deg, rgba(42, 28, 19, .34), rgba(18, 12, 6, .2));
}
.nev-tap-header-top {
    display: flex;
    align-items: baseline;
    gap: 11px;
    flex-wrap: wrap;
}
.nev-tap-header-title {
    font: 700 13px/1 inherit;
    color: var(--dr-crema, #FFF7EE);
    letter-spacing: .01em;
}
.nev-tap-header-day {
    margin-left: auto;
    font: 600 10px/1 inherit;
    color: var(--dr-brass, #BFA162);
    letter-spacing: .1em;
    text-transform: uppercase;
}

/* Per-lane status badge + onset day (in the lane label). */
.nev-tap-lane-meta {
    display: flex;
    align-items: center;
    gap: 7px;
    margin-top: 6px;
}
.nev-tap-status-badge {
    border: 1px solid rgba(191, 161, 98, .5);
    color: var(--dr-brass, #BFA162);
    border-radius: 2px;
    padding: 2px 5px;
    font: 7px/1 inherit;
    text-transform: uppercase;
    letter-spacing: .06em;
}
.nev-tap-status-badge.worse {
    border-color: rgba(196, 76, 76, .55);
    color: var(--dr-scarlet, #C44C4C);
}
.nev-tap-status-badge.better {
    border-color: rgba(76, 196, 180, .55);
    color: var(--dr-teal, #4CC4B4);
}
.nev-tap-status-badge.chronic {
    border-color: rgba(135, 154, 57, .6);
    color: var(--dr-olive, #879E39);
}
.nev-tap-lane-onset {
    font: 8px/1 inherit;
    color: var(--dr-mocha, #8B7355);
}
.nev-tap-lane-policy {
    margin-top: 6px;
    font: 7px/1.3 inherit;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: .07em;
}

/* View-mode toggle (Lifelines | Ledger) — shared by the lifelines toolbar
   and the ledger header. Only emitted when __ENABLE_TAPESTRY_ARCS. */
.nev-tap-vtoggle {
    display: inline-flex;
    gap: 0;
    border: 1px solid rgba(107, 86, 74, .55);
    border-radius: 4px;
    overflow: hidden;
    margin-right: 4px;
}
.nev-tap-vbtn {
    border: 0;
    border-right: 1px solid rgba(107, 86, 74, .62);
    background: rgba(30, 20, 14, .55);
    color: var(--wv-warmmid, #B9A88F);
    padding: 5px 11px;
    font: 10px/1 inherit;
    letter-spacing: .03em;
    cursor: pointer;
    transition: background .12s ease, color .12s ease;
}
.nev-tap-vtoggle .nev-tap-vbtn:last-child { border-right: 0; }
.nev-tap-vbtn:hover { background: rgba(46, 31, 20, .9); color: var(--dr-bone, #EBE1D7); }
.nev-tap-vbtn.on { background: rgba(230, 154, 76, .16); color: var(--dr-amber, #E69A4C); }
.nev-tap-vbtn:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

/* ── 1b Course Ledger (day-major view) ── */
.nev-tap-lg { gap: 10px; }
.nev-tap-lg-header { display: grid; gap: 10px; }
/* UX pass (2026-07-09): the ledger header's provenance pills read as boxed
   banners — compact them to quiet chips; the full wording rides tooltips. */
.nev-tap-lg-header .nev-tap-pill {
    font: 8px/1 inherit;
    padding: 2px 6px;
    letter-spacing: .05em;
}
.nev-tap-lg-recline {
    display: flex;
    align-items: center;
    gap: 8px;
    font: 9px/1 inherit;
    color: var(--dr-mocha, #8B7355);
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-lg-recbar {
    flex: 1;
    height: 1px;
    background: linear-gradient(90deg, rgba(107, 86, 74, .46), var(--dr-amber, #E69A4C));
}
.nev-tap-lg-recline .now { color: var(--dr-amber, #E69A4C); }

.nev-tap-lg-body {
    display: grid;
    grid-template-columns: 188px minmax(0, 1fr);
    border: 1px solid rgba(107, 86, 74, .62);
    border-radius: 4px;
    overflow: hidden;
}
.nev-tap[data-compact="1"] .nev-tap-lg-body { grid-template-columns: 150px minmax(0, 1fr); }

/* Problem rail */
.nev-tap-lg-rail {
    border-right: 1px solid rgba(107, 86, 74, .5);
    background: rgba(18, 12, 6, .4);
}
.nev-tap-lg-railhd {
    display: flex;
    align-items: baseline;
    gap: 6px;
    padding: 8px 9px;
    border-bottom: 1px solid rgba(107, 86, 74, .5);
    font: 8px/1 inherit;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: .09em;
}
.nev-tap-lg-railhd .x { color: var(--dr-brass, #BFA162); }
.nev-tap-lg-section {
    padding: 5px 9px;
    border-top: 1px solid rgba(107, 86, 74, .42);
    border-bottom: 1px solid rgba(107, 86, 74, .5);
    font: 7px/1 inherit;
    color: var(--dr-mocha, #8B7355);
    text-transform: uppercase;
    letter-spacing: .09em;
}
.nev-tap-lg-prow {
    padding: 6px 9px;
    border-bottom: 1px solid rgba(107, 86, 74, .32);
    display: grid;
    grid-template-columns: 6px 1fr auto;
    align-items: center;
    gap: 5px;
}
.nev-tap-lg-section + .nev-tap-lg-prow,
.nev-tap-lg-section ~ .nev-tap-lg-prow { opacity: .62; }
.nev-tap-lg-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--dr-brass, #BFA162); }
.nev-tap-lg-dot.worse { background: var(--dr-scarlet, #C44C4C); }
.nev-tap-lg-dot.active { background: var(--dr-amber, #E69A4C); }
.nev-tap-lg-dot.better { background: var(--dr-teal, #4CC4B4); }
.nev-tap-lg-dot.chronic { background: var(--dr-olive, #879E39); }
.nev-tap-lg-pn { font: 500 9.5px/1.2 inherit; color: var(--dr-bone, #EBE1D7); overflow-wrap: anywhere; }
.nev-tap-lg-new {
    font: 7px/1 inherit; color: var(--dr-scarlet, #C44C4C);
    text-transform: uppercase; letter-spacing: .05em;
}
.nev-tap-lg-bar {
    grid-column: 1 / -1;
    position: relative;
    height: 6px;
    margin-top: 5px;
    background: rgba(107, 86, 74, .16);
    border-radius: 3px;
    overflow: hidden;
}

/* Day stream */
.nev-tap-lg-stream { min-width: 0; }
.nev-tap-lg-day { position: relative; border-bottom: 1px solid rgba(107, 86, 74, .3); }
.nev-tap-lg-day:last-child { border-bottom: 0; }
.nev-tap-lg-day.is-today { background: rgba(230, 154, 76, .05); }
.nev-tap-lg-day.is-today::before {
    content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px;
    background: var(--dr-amber, #E69A4C);
}
.nev-tap-lg-dayhd {
    width: 100%;
    display: flex;
    align-items: baseline;
    gap: 9px;
    border: 0;
    background: transparent;
    color: var(--dr-bone, #EBE1D7);
    cursor: pointer;
    text-align: left;
    padding: 10px 12px 9px;
}
.nev-tap-lg-dayhd:hover { background: rgba(255, 247, 238, .02); }
.nev-tap-lg-dayhd .dn { font: 600 15px/1 inherit; color: var(--dr-crema, #FFF7EE); }
.nev-tap-lg-dayhd .dt { font: 8px/1 inherit; color: var(--dr-mocha, #8B7355); }
.nev-tap-lg-dayhd .sp { flex: 1; }
.nev-tap-lg-today {
    border: 1px solid rgba(230, 154, 76, .5);
    color: var(--dr-amber, #E69A4C);
    border-radius: 2px;
    padding: 1px 5px;
    font: 7px/1.3 inherit;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.nev-tap-lg-ct {
    border: 1px solid rgba(107, 86, 74, .5);
    color: var(--dr-mocha, #8B7355);
    border-radius: 9px;
    padding: 1px 7px;
    font: 8px/1.4 inherit;
}
.nev-tap-lg-dayhd .cv { color: var(--dr-mocha, #8B7355); font: 9px/1 inherit; }
.nev-tap-lg-changes { padding: 0 12px 9px; display: grid; gap: 5px; }
.nev-tap-lg-quiet { font: 9px/1.3 inherit; color: var(--dr-mocha, #8B7355); padding: 2px 0; }
.nev-tap-lg-chg {
    display: grid;
    grid-template-columns: 22px minmax(0, 1fr);
    gap: 9px;
    align-items: start;
    padding: 6px 0;
    border-top: 1px solid rgba(107, 86, 74, .22);
}
.nev-tap-lg-chg .nev-tap-knot { width: 20px; height: 20px; padding: 0; border-radius: 50%; justify-self: center; }
.nev-tap-lg-chg .nev-tap-knot .kg { width: 18px; height: 18px; }
.nev-tap-lg-chgbody { min-width: 0; }
.nev-tap-lg-chgtop {
    display: flex;
    align-items: baseline;
    gap: 8px;
    flex-wrap: wrap;
    width: 100%;
    border: 0;
    background: transparent;
    padding: 2px 4px;
    margin: -2px -4px;
    border-radius: 3px;
    text-align: left;
    cursor: pointer;
    color: inherit;
    transition: background .12s ease;
}
.nev-tap-lg-chgtop .nm { font: 600 11px/1.3 inherit; color: var(--dr-crema, #FFF7EE); }
.nev-tap-lg-chgtop .lb { font: 9px/1.3 inherit; color: var(--dr-mocha, #8B7355); }
/* Actionable-but-unselected: a calm, optional affordance — a faint "pending"
   tag + a hover hint, NOT a visible action row. */
.nev-tap-lg-cue {
    margin-left: auto;
    font: 7px/1.3 inherit;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--dr-amber, #E69A4C);
    opacity: .6;
}
.nev-tap-lg-chg.actionable .nev-tap-lg-chgtop:hover { background: rgba(230, 154, 76, .08); }
.nev-tap-lg-chg.actionable .nev-tap-lg-chgtop:hover .nev-tap-lg-cue { opacity: 1; }
.nev-tap-lg-chgtop:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 1px; }
/* Selected change — the only one showing its action row. */
.nev-tap-lg-chg.selected .nev-tap-lg-cue { display: none; }
.nev-tap-lg-chg.selected .nev-tap-knot { outline: 2px solid var(--dr-crema, #FFF7EE); outline-offset: 2px; }
.nev-tap-lg-acts { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 7px; }
.nev-tap-lg-act {
    border: 1px solid rgba(107, 86, 74, .55);
    background: rgba(30, 20, 14, .55);
    color: var(--dr-bone, #EBE1D7);
    border-radius: 2px;
    padding: 4px 8px;
    font: 8px/1 inherit;
    cursor: pointer;
}
.nev-tap-lg-act.acc { border-color: rgba(76, 196, 180, .55); color: var(--dr-teal, #4CC4B4); }
.nev-tap-lg-act.sec { border-color: rgba(191, 161, 98, .5); color: var(--dr-brass, #BFA162); }
.nev-tap-lg-act.rej { border-color: rgba(196, 76, 76, .55); color: var(--dr-scarlet, #C44C4C); }
.nev-tap-lg-act:hover { background: rgba(255, 247, 238, .06); }
.nev-tap-lg-act:focus-visible { outline: 1px solid var(--dr-teal, #4CC4B4); outline-offset: 2px; }

@media (max-width: 900px) {
    .nev-tap-lg-body { grid-template-columns: 1fr; }
    .nev-tap-lg-rail { border-right: 0; border-bottom: 1px solid rgba(107, 86, 74, .5); }
}

/* ──────────────────────────────────────────────────────────────────
   Course Tapestry §4a (2026-07-02, TURN-6 restyle) — claude.ai/design
   "Course Tapestry.dc.html", exact literals from TURN-6-VISUAL-GAP.md.
   Grounded weave view: the hierarchy system — height = salience
   (62/46/30/26px tiers), one-sheet surfaces on the #110B07 board with
   two border colors only (#3C2A21 hairline / #5A453A seam), butted
   ribbon runs labeled with the status word, knot discs with ring
   halos, IBM Plex two-voice type (Sans = names/numerals, Mono = all
   metadata; self-hosted in fonts.css — never CDN). All markup emitted
   ONLY by _renderWeaveView() (arcs flag + course render profile +
   Tapestry view-mode); flag-OFF none of these classes exist in the
   DOM, so nothing here can touch the daily-driver lifelines/ledger.
   ────────────────────────────────────────────────────────────────── */
.nev-tap-wv {
    /* Surface ramp, re-spaced 2026-08-19: the TURN-6 values packed six
       levels into 6/255 (measured indistinguishable on the owner's screen).
       Depth order preserved — recess deepest → base lightest — but adjacent
       planes now differ enough to read; rows/bands also carry borders. */
    --wv-board: #110B07;    /* the lane field (unchanged anchor) */
    --wv-base: #1A120B;     /* card frame — lifts off the page */
    --wv-spine: #1B110A;    /* day-spine header chrome */
    --wv-sect: #0C0704;     /* section band — recessed gap below board */
    --wv-chronic: #0A0604;  /* chronic fold — deeper recess */
    --wv-recess: #080503;   /* resolved rows — deepest well */
    /* 14a polish (2026-07-14): gridlines become HAIRLINES — translucent
       row/structural seams instead of solid opaque lines (quiet chrome).
       Every var(--wv-hair)/var(--wv-seam) consumer inherits the sweep. */
    --wv-hair: rgba(107, 86, 74, .42); /* .22 measured ~1.06:1 — the whole structural grid was invisible */
    --wv-seam: rgba(90, 69, 58, .6);
    --wv-ink: #FFF7EE;
    --wv-warm: #F0E6D0;
    --wv-bone: #EBE1D7;
    --wv-mocha: #8B7355;
    --wv-brass: #BFA162;
    --wv-amber: #E69A4C;
    --wv-teal: #4CC4B4;
    --wv-scarlet: #C44C4C;
    --wv-olive: #879A39;
    /* TURN-7 §2 palette discipline (blueprint §9.3 #9): burnt sienna for
       new-problem, gold for edited/accept-ready. Violet + magenta are
       RETIRED from this surface (their --wv-* tokens deleted with them). */
    --wv-sienna: #C75B39;
    --wv-gold: #DAA520;
    /* 14a: warm mid for secondary prose/metadata — mocha is too dim to read
       at the new sizes; mocha stays for decorative chrome only. */
    --wv-warmmid: #B9A88F;
    --wv-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
    --wv-sans: 'IBM Plex Sans', -apple-system, 'Segoe UI', sans-serif;
    --wv-serif: 'Iowan Old Style', 'Palatino Linotype', 'Book Antiqua', Georgia, 'Times New Roman', serif;
    --wv-thread: rgba(107, 86, 74, .12);
    /* Imported Turn-13 full-composition geometry. The embedded takeover
       keeps its own compact override in note-evolution-takeover.css. */
    --wv-label-w: 240px;
    --wv-now-w: 120px;
    /* One sheet: the card owns every internal seam — no gaps, no boxes. */
    gap: 0;
    max-width: min(100%, 1290px);
    font-family: var(--wv-mono);
    /* TURN-7 §4: day numerals, versions, lab values all column-align. */
    font-variant-numeric: tabular-nums;
    color: var(--wv-bone);
    background: var(--wv-base);
    border: 1px solid rgba(107, 86, 74, .5);
    border-radius: 9px;
    overflow: hidden;
    position: relative; /* hosts the §17 texture overlay */
    box-shadow: 0 18px 50px -20px rgba(0, 0, 0, .7);
}

/* ════════════════════════════════════════════════════════════════════════
   Turn 11 · 11a+11b — PASSIVE CENSUS proportion + legibility (2026-07-13,
   design cf6a41fd, option B "the board stays the star").

   Revised against LIVE ground truth (browser-tester capture: patient a Lewis,
   D4, 2333×1585, slice-1 deployed). The first 11a pass retired the
   max-width:1290px cap and earned the timeline (927→112px) — KEPT — but flexing
   the LABEL lane to 1fr parked the reclaimed width as a dead ~800px gap in the
   middle of every problem lane, and the real readable A&P (the deterministic
   Hospital Course narrative in the right rail, .nev-tap-cc-sent .tx) stayed at
   10px in a ~300px column. So the surface still read "empty + unreadable".

   Option B: (1) kill the gap — the name lane goes back to a FIXED shared width
   so lanes stay compact and column-aligned; the timeline stays earned. (2) The
   board is content-width and the instrument CENTERS on a wide mount (focus, not
   void). (3) The Hospital Course narrative rail widens and gets a real
   legibility floor (prose 10→15px, metadata →12px, small-caps letter-spacing
   dropped). Scoped to [data-wv-passive]; the embedded takeover face is
   untouched. Rollback-safe: drop the attribute and this block goes dark.
   ════════════════════════════════════════════════════════════════════════ */
.nev-tap-wv[data-wv-passive] {
    /* Diagnosis identity is the left-hand reading task. Give it a real rail
       instead of forcing full clinical names through the base 240px slot.
       The wider instrument ceiling uses available Census space without
       changing the embedded Note Evolution geometry. */
    --wv-label-w: clamp(360px, 24vw, 420px);
    --wv-now-w: 168px;
    max-width: min(100%, 1760px);
    margin-inline: auto;
    container: tapestry-passive / inline-size;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-spine,
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane {
    /* FIX (2026-07-16, doctor): track-min was the column MAX, so the timeline
       could never grow into free width — day columns at ~4% of the tapestry.
       Now pure flex: the timeline fills whatever the mount gives it. Safe —
       the passive face uses the adaptive axis (units bounded ≤23), so there
       is no 51-day crush case left to floor against, and no overflow. */
    grid-template-columns:
        var(--wv-label-w)      /* name lane — FIXED */
        minmax(0, 1fr)         /* timeline — fills  */
        var(--wv-now-w);       /* NOW value         */
}
/* Board fills the mount (2026-07-16, doctor — was compact-centered); the
   Hospital Course narrative rail keeps a readable but capped measure. */
.nev-tap-wv[data-wv-passive] .nev-tap-wv-main {
    /* FIX (2026-07-16, doctor): the board FILLS the mount instead of
       centering at content width — paired with the flexing timeline track
       above, day/range columns get real width. */
    grid-template-columns: minmax(0, 1fr);
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-main.with-cc {
    /* Timeline takes priority; the Hospital Course rail stays readable but
       capped tighter (was minmax(440px, 620px) — doctor: "the ledger is
       taking the whole thing"). */
    grid-template-columns: minmax(0, 1fr) minmax(360px, 480px);
    justify-content: start;
}
/* 11b legibility floor — the deterministic Hospital Course narrative is the
   readable clinical state; nothing on it renders below 12px, and the
   0.6–0.9px small-caps tracking is dropped (it hurts in the low-contrast well). */
.nev-tap-wv[data-wv-passive] .nev-tap-cc-sent .tx { font-size: 15px; line-height: 1.55; }
.nev-tap-wv[data-wv-passive] .nev-tap-cc-sent.rollup .tx { font-size: 13px; }
.nev-tap-wv[data-wv-passive] .nev-tap-cc-sent .n { font-size: 12px; }
.nev-tap-wv[data-wv-passive] .nev-tap-cc-head .sub,
.nev-tap-wv[data-wv-passive] .nev-tap-cc-foot .ft,
.nev-tap-wv[data-wv-passive] .nev-tap-oe .tx {
    font-size: 12px;
    letter-spacing: normal;
}
/* Diagnosis identity rail (passive Census only). The previous contract still
   hid information: a fixed 240px rail, two-line clamp on cc/hi, single-line
   ellipsis on lo/resolved, and fixed row heights. A diagnosis now owns the
   full first line and wraps to completion. Its chips follow on their own
   wrap row; status/category metadata may wrap beneath that. The grid row
   grows with the label, so no clinical name is traded away for scan density. */
.nev-tap-wv[data-wv-passive] .nev-tap-wv-label .nm,
.nev-tap-wv[data-wv-passive] .nev-tap-wv-label .nm .nev-tap-lane-nm {
    font-size: 16px;
    line-height: 1.35;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"] {
    height: auto;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"].tier-cc {
    min-height: 104px;
    --wv-rh: 22px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"].tier-hi {
    min-height: 92px;
    --wv-rh: 18px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"].tier-lo {
    min-height: 80px;
    --wv-rh: 14px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"].tier-resolved {
    min-height: 72px;
    --wv-rh: 10px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"] .nev-tap-wv-label {
    padding: 12px 16px;
    justify-content: center;
    gap: 7px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"] .nev-tap-wv-label .nm {
    flex-wrap: wrap;
    align-content: center;
    align-items: center;
    row-gap: 6px;
    white-space: normal;
    overflow: visible;
}
.nev-tap-wv[data-wv-passive]
    .nev-tap-wv-lane[data-kind="problem"] .nm .nev-tap-lane-nm {
    order: -1;
    flex: 1 0 100%;
    width: 100%;
    display: block;
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
    overflow-wrap: anywhere;
    -webkit-line-clamp: none;
    -webkit-box-orient: initial;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"] .ln2 {
    flex-wrap: wrap;
    row-gap: 5px;
    overflow: visible;
}
.nev-tap-wv[data-wv-passive] .nev-tap-wv-lane[data-kind="problem"] .nev-tap-wv-cat {
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
    line-height: 1.35;
}

/* Keep the timeline useful on mid-sized Census views by stacking the adjacent
   Hospital Course rail before either the day field or diagnosis identity is
   squeezed. The base 900px stack remains the embedded-face fallback. */
@media (max-width: 1500px) {
    .nev-tap-wv[data-wv-passive] {
        --wv-label-w: clamp(300px, 38vw, 360px);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main.with-cc {
        grid-template-columns: minmax(0, 1fr);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail {
        border-left: 0;
        border-top: 1px solid var(--wv-seam, #5A453A);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-focus .nev-tap-wv-focus {
        display: grid;
        grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
        align-items: start;
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-head,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-record,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-actions {
        grid-column: 1 / -1;
    }
}
@media (max-width: 850px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-focus .nev-tap-wv-focus {
        grid-template-columns: minmax(0, 1fr);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-head,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-record,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-actions {
        grid-column: 1;
    }
}
@media (max-width: 720px) {
    .nev-tap-wv[data-wv-passive] {
        --wv-label-w: clamp(220px, 58vw, 300px);
        --wv-now-w: 92px;
    }
}

/* The Census shell can leave the tapestry substantially narrower than the
   viewport (sidebar, chart frame, and other app chrome all consume width).
   Container queries make the board/detail decision from the instrument's
   actual width; the media rules above remain the conservative fallback. */
@container tapestry-passive (max-width: 1500px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main.with-cc {
        --wv-label-w: clamp(300px, 38cqw, 360px);
        grid-template-columns: minmax(0, 1fr);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail {
        border-left: 0;
        border-top: 1px solid var(--wv-seam, #5A453A);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-focus .nev-tap-wv-focus {
        display: grid;
        grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
        align-items: start;
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-head,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-record,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-actions {
        grid-column: 1 / -1;
    }
}
@container tapestry-passive (max-width: 850px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-focus .nev-tap-wv-focus {
        grid-template-columns: minmax(0, 1fr);
    }
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-head,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-record,
    .nev-tap-wv[data-wv-passive] .nev-tap-fx-actions {
        grid-column: 1;
    }
}
@container tapestry-passive (max-width: 720px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main {
        --wv-label-w: clamp(220px, 58cqw, 300px);
        --wv-now-w: 92px;
    }
}

/* TURN-7 §17: instrument texture — scanlines + one faint gold radial glow
   top-left, pointer-transparent, screen-blended over the whole card. */
/* Illuminated Loom §C: vellum grain — one 240px noise tile + a warm top light. */
.nev-tap-wv-texture {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 40;
    mix-blend-mode: soft-light;
    opacity: .6;
    background:
        url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='v'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.55 0 0 0 0 0.47 0 0 0 0 0.38 0 0 0 0.055 0'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23v)'/%3E%3C/svg%3E") repeat,
        radial-gradient(120% 60% at 50% 0%, color-mix(in srgb, var(--wv-brass) 6%, transparent), transparent 70%);
    background-size: 240px 240px, auto;
}
/* Illuminated Loom §D: gilt rule inside the margin + faint corner glow. */
.nev-tap-wv::after {
    content: '';
    position: absolute;
    inset: 5px;
    border: 1px solid color-mix(in srgb, var(--wv-brass) 38%, transparent);
    border-radius: 6px;
    pointer-events: none;
    z-index: 41;
    background:
        radial-gradient(circle 46px at 0 0, color-mix(in srgb, var(--wv-brass) 9%, transparent), transparent),
        radial-gradient(circle 46px at 100% 0, color-mix(in srgb, var(--wv-brass) 9%, transparent), transparent),
        radial-gradient(circle 46px at 0 100%, color-mix(in srgb, var(--wv-brass) 9%, transparent), transparent),
        radial-gradient(circle 46px at 100% 100%, color-mix(in srgb, var(--wv-brass) 9%, transparent), transparent);
}

/* ── Header: identity left, big amber day numeral right (§7) ── */
.nev-tap-wv-header {
    display: flex;
    align-items: center;
    gap: 14px;
    /* 14a: 20/24px header padding. */
    padding: 20px 24px;
    border: 0;
    border-bottom: 1px solid var(--wv-seam);
    border-radius: 0;
    background: linear-gradient(180deg, color-mix(in srgb, var(--wv-bone) 5%, var(--wv-base)), var(--wv-base));
    box-shadow: 0 2px 0 color-mix(in srgb, var(--wv-brass) 26%, transparent);
}
.nev-tap-wv-hd-id { display: grid; gap: 6px; min-width: 0; }
.nev-tap-wv-hd-id .tr { display: flex; align-items: center; gap: 10px; }
/* DEMOTED (2026-08-11, owner ruling): "Course Tapestry" is a panel label,
   not a headliner — the patient name is the page H1 and the amber day
   numeral is this header's visual anchor. Was 700 20px serif, which read as
   the chart's title and duplicated "compile course" / "D10 hospital day". */
/* Typography pass (owner 2026-09-06, "too terminal-esque"): the header
   re-points --wv-mono to the chart rail's DM Sans for ITS subtree only — the
   weave below keeps its tokens (IBM Plex Mono does load; an earlier note here
   claiming otherwise read font status before the chart opened). Tracking pulled in from .14em to UI-normal .08em; the amber day
   numeral (--wv-serif) is untouched, it is the header's anchor by ruling. */
.nev-tap-wv-header {
    --wv-mono: 'DM Sans', 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
}
.nev-tap-wv-header .nev-tap-header-title {
    font: 700 11px/1 var(--wv-mono);
    color: var(--wv-warmmid, #B9A88F);
    letter-spacing: .08em;
    text-transform: uppercase;
}
.nev-tap-wv-grounded {
    /* 14a: calmer pill — 10px readable, softer border. */
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--wv-teal);
    border: 1px solid color-mix(in srgb, var(--wv-teal) 30%, transparent);
    border-radius: 3px;
    padding: 4px 7px;
    flex: none;
}
.nev-tap-wv-hd-meta {
    font: 400 11.5px/1.4 var(--wv-mono);
    color: var(--wv-warmmid, #B9A88F);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.nev-tap-wv-hd-right {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 14px;
    flex: none;
}
/* RETIRED (2026-08-11, owner ruling): the .nev-tap-wv-live freshness pill
   (and its pulsing dot) is gone from the header — the state_version now
   rides the source-ladder pill as a quiet `v{N}` suffix. The wvDotPulse
   keyframes STAY: .nev-tap-oe-open .dot in the open-end rail still uses
   them. */
.nev-tap-wv-compile {
    /* 14a: a REAL primary button — 44px tall (>=40px floor, primary tier). */
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(230, 154, 76, .55);
    background: rgba(230, 154, 76, .09);
    color: var(--wv-amber);
    border-radius: 3px;
    padding: 0 16px;
    font: 700 11.5px/1 var(--wv-mono);
    letter-spacing: .04em;
    text-transform: uppercase;
    cursor: pointer;
    white-space: nowrap;
}
.nev-tap-wv-compile:hover { background: rgba(230, 154, 76, .18); }
.nev-tap-wv-compile.on { background: var(--wv-amber); color: #120C06; }
.nev-tap-wv-compile:focus-visible { outline: 1px solid var(--wv-teal); outline-offset: 2px; }
.nev-tap-wv-dayblk {
    display: grid;
    justify-items: end;
    gap: 3px;
    padding-left: 14px;
    border-left: 1px solid var(--wv-hair);
}
.nev-tap-wv-dayblk .n { font: 700 28px/1 var(--wv-serif); color: var(--wv-amber);
    font-variant-numeric: lining-nums tabular-nums; }
.nev-tap-wv-dayblk .cap {
    font: 400 10px/1 var(--wv-mono);
    color: var(--wv-mocha);
    letter-spacing: .09em;
    text-transform: uppercase;
    white-space: nowrap;
}

/* ── Toolbar: one segmented track, not separate buttons (§10) ── */
.nev-tap-wv .nev-tap-toolbar {
    gap: 10px;
    padding: 9px 20px;
    border: 0;
    border-bottom: 1px solid var(--wv-hair);
    border-radius: 0;
    background: var(--wv-sect);
}
.nev-tap-wv .nev-tap-vtoggle,
.nev-tap-wv .nev-tap-filters {
    gap: 2px;
    background: #160E08;
    border: 1px solid var(--wv-hair);
    border-radius: 5px;
    padding: 2px;
    margin-right: 0;
}
.nev-tap-wv .nev-tap-vbtn,
.nev-tap-wv .nev-tap-fbtn {
    border: 0;
    /* Turn-11 §11b hit-target floor: the label type stays 9px (option-B keeps
       the toolbar light) but the CLICKABLE box clears 40px vertically — the
       controls sit in their own row with room to spare, so no spacing
       conflict. Width already clears 40px from the padding + labels. */
    min-height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 5px 12px;
    border-radius: 3px;
    background: transparent;
    color: var(--wv-mocha);
    font: 400 10px/1 var(--wv-mono);
    letter-spacing: .07em;
    text-transform: uppercase;
}
.nev-tap-wv .nev-tap-vbtn:hover,
.nev-tap-wv .nev-tap-fbtn:hover { background: transparent; color: var(--wv-bone); }
.nev-tap-wv .nev-tap-vbtn.on,
.nev-tap-wv .nev-tap-fbtn.on {
    background: #2A1C13;
    color: var(--wv-warm);
    font-weight: 600;
}
.nev-tap-wv .nev-tap-tgl {
    border: 0;
    background: transparent;
    color: var(--wv-mocha);
    /* Turn-11 §11b hit-target floor — matches the filter/view buttons. */
    min-height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 5px 10px;
    border-radius: 3px;
    font: 400 10px/1 var(--wv-mono);
    letter-spacing: .07em;
    text-transform: uppercase;
}
.nev-tap-wv .nev-tap-tgl:hover { background: transparent; color: var(--wv-bone); }
.nev-tap-wv .nev-tap-tgl.on { background: #2A1C13; color: var(--wv-warm); font-weight: 600; }
.nev-tap-wv .nev-tap-count {
    font: 400 10px/1.4 var(--wv-mono);
    color: var(--wv-mocha);
    letter-spacing: .08em;
    text-transform: uppercase;
}

/* ── Main split: left board + compile panel when open ── */
.nev-tap-wv-main { display: grid; grid-template-columns: minmax(0, 1fr); }
.nev-tap-wv-main.with-cc { grid-template-columns: minmax(0, 1fr) minmax(300px, 360px); }
.nev-tap-wv-left { min-width: 0; }

/* ── Day spine: corner | D-cells (Sans numeral, mono date, event
      glyph) | NOW corner (§11) ── */
.nev-tap-wv-spine {
    display: grid;
    grid-template-columns: var(--wv-label-w) minmax(0, 1fr) var(--wv-now-w);
    border-bottom: 1px solid var(--wv-seam);
    border-left: 3px solid transparent; /* aligns with the lanes' cc-bar slot */
    background: var(--wv-spine);
}
.nev-tap-wv-corner,
.nev-tap-wv-nowhd {
    font: 400 10px/1.4 var(--wv-mono);
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--wv-mocha);
    padding: 8px 12px;
    display: flex;
    align-items: flex-end;
}
.nev-tap-wv-corner { border-right: 1px solid var(--wv-hair); }
.nev-tap-wv-nowhd {
    justify-content: flex-end;
    border-left: 1px solid var(--wv-hair);
    border-bottom: 1px dotted rgba(191, 161, 98, .4);
    cursor: help;
}
.nev-tap-wv-nowhd.historical { color: var(--wv-amber); }
.nev-tap-wv-days { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; }
.nev-tap-wv-day {
    position: relative;
    min-width: 0;
    overflow: hidden;
    border: 0;
    border-right: 1px solid var(--wv-hair);
    background: transparent;
    cursor: pointer;
    padding: 7px 2px 9px;
    display: grid;
    gap: 3px;
    justify-items: center;
    text-align: center;
    font: inherit;
}
.nev-tap-wv-day:hover { background: color-mix(in srgb, var(--wv-amber) 7%, transparent); }
/* Observation-date axis (2026-07-22): a 'gap' cell is a compressed empty
   stretch between two data days — a thin non-interactive connector, not a
   scrubbable column. It reads as "time passed, nothing recorded": faint
   centered dots, no hover, no pointer, subordinate to the data-day columns. */
.nev-tap-wv-day.gap {
    cursor: default;
    padding: 7px 0 9px;
    align-content: center;
}
.nev-tap-wv-day.gap:hover { background: transparent; }
.nev-tap-wv-day.gap {
    display: grid;
    gap: 1px;
    justify-items: center;
}
.nev-tap-wv-day.gap .gap-dots {
    font: 400 11px/1 var(--wv-mono);
    color: var(--wv-mocha);
    letter-spacing: 1px;
    opacity: .45;
}
.nev-tap-wv-day.gap .gap-count {
    font: 500 9.5px/1 var(--wv-mono);
    color: var(--wv-brass);
    letter-spacing: .02em;
    white-space: nowrap;
}
/* Observation spine (2026-07-22): patient-level physiology tracks on the same
   axis as the problem lanes. Compact rows; values monochrome unless out of
   range, where they take the status tone so the eye tracks the trajectory. */
.nev-tap-wv-obs-hd { display: flex; align-items: baseline; gap: 10px; }
.nev-tap-wv-obs-hint {
    font: 400 9.5px/1 var(--wv-mono);
    color: var(--wv-mocha);
    text-transform: none;
    letter-spacing: .02em;
}
.nev-tap-wv-obs-row { height: 34px; }
.nev-tap-wv-obs-row .nev-tap-wv-label { gap: 1px; }
.nev-tap-wv-obs-row .nev-tap-wv-label .nm {
    font: 500 12.5px/1 var(--wv-sans);
    color: var(--wv-ink);
}
.nev-tap-wv-obs-unit {
    font: 400 9.5px/1 var(--wv-mono);
    color: var(--wv-mocha);
    text-transform: uppercase;
    letter-spacing: .04em;
}
.nev-tap-wv-obs-cell {
    position: absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    white-space: nowrap;
    font: 500 12px/1 var(--wv-mono);
    /* in range = quiet mocha; the eye should skip these */
    color: var(--wv-mocha);
    padding: 1px 2px;
}
.nev-tap-wv-obs-cell.t-worse { color: var(--wv-scarlet); font-weight: 600;
    background: color-mix(in srgb, var(--wv-scarlet) 15%, transparent); border-radius: 3px; }
.nev-tap-wv-obs-cell.t-active { color: var(--wv-amber); font-weight: 600;
    background: color-mix(in srgb, var(--wv-amber) 14%, transparent); border-radius: 3px; }
.nev-tap-wv-obs-cell.is-now {
    color: var(--wv-ink);
    background: color-mix(in srgb, var(--wv-amber) 10%, transparent);
    border-radius: 3px;
    padding: 2px 4px;
}
.nev-tap-wv-obs-cell.is-now.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-obs-cell.is-now.t-active { color: var(--wv-amber); }
.nev-tap-wv-obs-verdict {
    font: 500 9.5px/1 var(--wv-mono);
    letter-spacing: .02em;
}
.nev-tap-wv-obs-verdict.t-context { color: var(--wv-mocha); }
.nev-tap-wv-obs-verdict.t-active { color: var(--wv-amber); }
.nev-tap-wv-obs-verdict.t-worse { color: var(--wv-scarlet); }
/* 14a: non-today day columns read quiet mocha; TODAY owns the warmth. */
.nev-tap-wv-day .d { font: 600 12px/1 var(--wv-sans); color: var(--wv-mocha); }
.nev-tap-wv-day .dt {
    font: 400 9.5px/1 var(--wv-mono);
    color: #A18B72;
    text-transform: uppercase;
}
.nev-tap-wv-day .ev { font: 400 9px/1 var(--wv-mono); }
.nev-tap-wv-day .ev.onset { color: var(--wv-scarlet); }
.nev-tap-wv-day .ev.new { color: var(--wv-sienna); }
.nev-tap-wv-day .ev.res { color: var(--wv-teal); }
.nev-tap-wv-day .ev.today { color: var(--wv-amber); }
/* UX pass (2026-07-09): amber discipline — amber is for pending work
   (knots, compile staleness), not for selection. The scrub cursor reads
   in bone ink so a selected history day can't be mistaken for an alert. */
.nev-tap-wv-day.selected { background: rgba(235, 225, 215, .07); }
.nev-tap-wv-day.selected .d { color: var(--wv-ink); }
.nev-tap-wv-day.selected::after {
    content: "";
    position: absolute;
    left: 0; right: 0; bottom: 0;
    height: 2px;
    background: var(--wv-bone);
}
/* today amber beats selected ink (design rule) — keep after .selected */
/* 14a: TODAY = a warm vertical plane — amber gradient + amber left edge
   + a printed TODAY cap (::before — ::after belongs to .selected's bar). */
.nev-tap-wv-day.today {
    background: linear-gradient(180deg, rgba(230, 154, 76, .14), rgba(230, 154, 76, .04));
    box-shadow: inset 2px 0 0 var(--wv-amber);
}
.nev-tap-wv-day.today::before {
    content: "today";
    font: 700 10px/1 var(--wv-mono);
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--wv-amber);
}
.nev-tap-wv-day.today .d { color: var(--wv-amber); }
.nev-tap-wv-day:focus-visible { outline: 1px solid var(--wv-teal); outline-offset: -2px; }
.nev-tap-wv-day.admission {
    background: linear-gradient(90deg, rgba(191, 161, 98, .12), rgba(191, 161, 98, .025));
    box-shadow: inset 2px 0 0 var(--wv-brass);
}
.nev-tap-wv-day.admission .d { color: var(--wv-ink); }
.nev-tap-wv-day.admission .dt {
    color: var(--wv-brass);
    letter-spacing: .08em;
}
.nev-tap-wv[data-wv-axis="adaptive"] .nev-tap-wv-day .dt {
    font-size: 7.5px;
}
.nev-tap-wv[data-wv-axis="adaptive"] .nev-tap-wv-day.long-day .d {
    font-size: 10px;
}
.nev-tap-wv-day.range {
    align-content: center;
    background: rgba(191, 161, 98, .035);
    border-right-color: rgba(191, 161, 98, .26);
}
.nev-tap-wv-day.range .d {
    color: var(--wv-warm);
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
}
.nev-tap-wv-day.range .dt { color: var(--wv-brass); white-space: nowrap; }
.nev-tap-wv-day.range .expand {
    position: absolute;
    top: 2px;
    right: 3px;
    color: var(--wv-mocha);
    font: 400 10px/1 var(--wv-mono);
}
.nev-tap-wv-time-reset {
    /* 14a: lifted from 7.5px; min-height is a partial 28px — the control
       lives inside the spine corner cell and a 40px box would blow the
       spine row (reported as a deliberate structural exception). */
    margin-left: auto;
    min-height: 28px;
    padding: 4px 8px;
    border: 1px solid rgba(191, 161, 98, .35);
    border-radius: 2px;
    background: transparent;
    color: var(--wv-brass);
    font: 600 9.5px/1 var(--wv-mono);
    letter-spacing: .04em;
    text-transform: uppercase;
    cursor: pointer;
}
.nev-tap-wv-time-reset:focus-visible {
    outline: 1px solid var(--wv-teal);
    outline-offset: 1px;
}

/* ── Lane rows: height = salience (§1). 14a lift: 72/60/30/26 — the
      hierarchy holds, the readable tiers grow with the 16px names. ── */
.nev-tap-wv-board { background: var(--wv-board); }
.nev-tap-wv-lane {
    display: grid;
    grid-template-columns: var(--wv-label-w) minmax(0, 1fr) var(--wv-now-w);
    /* FIX (2026-07-24, doctor): the problem boundary was a flat --wv-hair
       hairline — same visual weight as the intra-lane warp thread, so row
       breaks were ambiguous mid-scan. The boundary is now a SELVAGE: the
       stronger structural seam below + a 1px inner top-light on the next
       lane (rule after the tier block) = an embossed edge no intra-lane
       mark can imitate. */
    border-bottom: 1px solid var(--wv-seam);
    border-left: 3px solid transparent; /* cc-bar slot — anchor colors it */
    overflow: hidden;
}
.nev-tap-wv-lane.tier-cc {
    height: 72px;
    --wv-rh: 20px;
    background: linear-gradient(180deg, #1E130C, #170F09);
    box-shadow:
        inset 0 1px 0 rgba(255, 247, 238, .04),
        0 8px 16px -10px rgba(0, 0, 0, .65);
    position: relative;
    z-index: 1;
}
.nev-tap-wv-lane.tier-hi { height: 60px; --wv-rh: 16px; background: rgba(255, 247, 238, .03); /* rows must read against the bare board */ }
.nev-tap-wv-lane.tier-lo {
    height: 30px;
    --wv-rh: 10px;
    background: rgba(13, 9, 6, .5);
}
.nev-tap-wv-lane.tier-resolved {
    height: 26px;
    --wv-rh: 8px;
    opacity: .6;
    background: var(--wv-recess);
    box-shadow: inset 0 6px 10px -9px rgba(0, 0, 0, .8);
}
.nev-tap-wv-lane.tier-scaffold { height: 26px; --wv-rh: 9px; opacity: .85; }
/* Selvage top-light (2026-07-24): the second half of the embossed problem
   boundary — a 1px inner highlight on every following lane. tier-cc and
   tier-resolved keep their own shadows (cc already carries this highlight;
   resolved's recess must stay sunken). */
.nev-tap-wv-lane + .nev-tap-wv-lane:not(.tier-cc):not(.tier-resolved) {
    box-shadow: inset 0 1px 0 color-mix(in srgb, var(--wv-ink) 5%, transparent);
}
/* TURN-7 §1: the lane's left edge belongs to the INCLUSION POLICY now
   (blueprint §5.12 — the encoding that replaced the printed labels). The
   anchor keeps its wash + badge only; scaffold lanes keep the transparent
   default. memory is the app's fourth policy value (design shipped three);
   its brass follows the existing INCLUSION_COLOR vocabulary. */
.nev-tap-wv-lane.incl-must { border-left-color: var(--wv-scarlet); }
.nev-tap-wv-lane.incl-brief { border-left-color: color-mix(in srgb, var(--wv-amber) 80%, transparent); }
.nev-tap-wv-lane.incl-memory { border-left-color: color-mix(in srgb, var(--wv-brass) 80%, transparent); }
.nev-tap-wv-lane.incl-state { border-left-color: color-mix(in srgb, var(--wv-mocha) 45%, transparent); }
.nev-tap-wv-lane.anchor {
    background:
        linear-gradient(90deg, rgba(230, 154, 76, .055), transparent 42%),
        linear-gradient(180deg, #1E130C, #170F09);
}
.nev-tap-wv-lane.wv-lit { background: color-mix(in srgb, var(--wv-amber) 6%, transparent); }
/* Row hover (2026-08-19): the weave had none — tiers with their own fills keep them */
.nev-tap-wv-lane:not(.tier-cc):not(.tier-resolved):not(.anchor):hover {
    background: color-mix(in srgb, var(--wv-amber) 5%, transparent);
}

/* ── Left name column: exactly two lines, 200px (§2) ── */
.nev-tap-wv-label {
    position: relative;
    padding: 0 12px;
    border-right: 1px solid var(--wv-hair);
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    min-width: 0;
    overflow: hidden;
}
.nev-tap-wv-label .nm {
    display: flex;
    align-items: center;
    gap: 6px;
    min-width: 0;
    font: 500 12px/1.2 var(--wv-sans); /* scaffold nm has no inner span */
    color: var(--wv-bone);
    white-space: nowrap;
    overflow: hidden;
}
.nev-tap-wv-label .nm .nev-tap-lane-nm {
    font: 500 13px/1.25 var(--wv-sans);
    color: var(--wv-ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
    overflow-wrap: normal;
}
/* 14a legibility floor: the readable tiers carry 16px semibold ink names. */
.nev-tap-wv-lane.tier-cc .nm .nev-tap-lane-nm { font: 600 16px/1.25 var(--wv-sans); }
.nev-tap-wv-lane.tier-hi .nm .nev-tap-lane-nm { font: 600 16px/1.25 var(--wv-sans); }
/* UX pass (2026-07-09): never mid-word-truncate a problem name on the tall
   tiers — wrap to two clamped lines instead ("COPD exace…" was unreadable).
   The compressed tiers (30/26px rows) keep single-line ellipsis. */
.nev-tap-wv-lane.tier-cc .nm .nev-tap-lane-nm,
.nev-tap-wv-lane.tier-hi .nm .nev-tap-lane-nm {
    white-space: normal;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.nev-tap-wv-ccbadge {
    font: 700 9.5px/1 var(--wv-mono);
    color: var(--wv-board);
    background: var(--wv-amber);
    padding: 2px 5px;
    border-radius: 2px;
    letter-spacing: .04em;
    text-transform: uppercase;
    flex: none;
}
.nev-tap-wv-tag {
    font: 600 9.5px/1 var(--wv-mono);
    border-radius: 2px;
    padding: 2px 5px;
    letter-spacing: .04em;
    text-transform: uppercase;
    white-space: nowrap;
    flex: none;
}
.nev-tap-wv-tag.new { color: var(--wv-sienna); border: 1px solid rgba(199, 91, 57, .5); }
.nev-tap-wv-tag.resolved { color: var(--wv-mocha); border: 1px solid rgba(139, 115, 85, .4); }
.nev-tap-wv-label .ln2 { display: flex; align-items: center; gap: 6px; min-width: 0; }
.nev-tap-wv-st {
    /* 14a: the status chip is READ, not decoded — 10px outlined in its
       semantic color. */
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .09em;
    text-transform: uppercase;
    padding: 2px 6px;
    border-radius: 2px;
    border: 1px solid currentColor;
    flex: none;
}
.nev-tap-wv-st.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-st.t-active { color: var(--wv-amber); }
.nev-tap-wv-st.t-better { color: var(--wv-teal); }
.nev-tap-wv-st.t-olive { color: var(--wv-olive); }
.nev-tap-wv-st.t-brass { color: var(--wv-brass); }
.nev-tap-wv-st.t-dim,
.nev-tap-wv-st.t-context { color: var(--wv-mocha); }
.nev-tap-wv-cat {
    /* 14a: category · onset is secondary METADATA the doctor actually
       reads — 12px mono in the warm mid, not 9px mocha. */
    font: 400 12px/1 var(--wv-mono);
    color: var(--wv-warmmid, #B9A88F);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ── Clinical course field ─────────────────────────────────────────── */
.nev-tap-wv-track { position: relative; min-width: 0; background: color-mix(in srgb, var(--wv-mocha) 7%, transparent); border-radius: 4px; /* visible well — the 1px dotted midline alone read as empty space */ }
/* Illuminated Loom §G: every lane rides a bare warp thread, seen only where no
   ribbon is woven.
   FIX (2026-07-24, doctor): the 7px-dash warp read as a RULE LINE — scanning
   right on a tall lane, it was indistinguishable from the problem boundary
   below it ("which break is a problem break?"). The warp is now a sparse
   pearl stitch inset from the column seams: texture that says "lane
   continues, nothing woven", never a divider. Boundary disambiguation is the
   selvage groove on .nev-tap-wv-lane below. */
.nev-tap-wv-track::before {
    content: '';
    position: absolute;
    left: 8px; right: 8px; top: 50%;
    height: 1px;
    transform: translateY(-.5px);
    background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--wv-mocha) 42%, transparent) 0 1.5px, transparent 1.5px 9px);
    pointer-events: none;
}
.nev-tap-wv-obs-row .nev-tap-wv-track::before { content: none; }

/* Problem time is a topographic field, not a row of recolored bars. The SVG
   occupies the same adaptive-axis track as the day spine, knots and evidence
   markers. Painted paths remain native-title hover targets; the interactive
   overlays sit above them at z-index 5. */
.nev-tap-wv-thread {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    overflow: hidden;
    pointer-events: none;
    z-index: 1;
}
.nev-tap-wv-thread-run {
    color: var(--wv-mocha);
    --thread-fill: 16%;
    --thread-edge: 62%;
    --thread-glow: 14%;
    pointer-events: visiblePainted;
}
.nev-tap-wv-thread-run.t-worse {
    color: var(--wv-scarlet);
    --thread-fill: 46%;
    --thread-edge: 94%;
    --thread-glow: 34%;
}
.nev-tap-wv-thread-run.t-active {
    color: var(--wv-amber);
    --thread-fill: 38%;
    --thread-edge: 88%;
    --thread-glow: 28%;
}
.nev-tap-wv-thread-run.t-better {
    color: var(--wv-teal);
    --thread-fill: 34%;
    --thread-edge: 86%;
    --thread-glow: 24%;
}
.nev-tap-wv-thread-run.t-olive {
    color: var(--wv-olive);
    --thread-fill: 24%;
    --thread-edge: 76%;
    --thread-glow: 18%;
}
.nev-tap-wv-thread-run.t-brass {
    color: var(--wv-brass);
    --thread-fill: 12%;
    --thread-edge: 72%;
    --thread-glow: 14%;
}
.nev-tap-wv-thread-run.t-dim,
.nev-tap-wv-thread-run.t-context {
    color: var(--wv-mocha);
    --thread-fill: 10%;
    --thread-edge: 54%;
    --thread-glow: 8%;
}
.nev-tap-wv-thread-body {
    fill: color-mix(in srgb, currentColor var(--thread-fill), transparent);
    stroke: none;
    filter: drop-shadow(0 1px 1px color-mix(in srgb, currentColor var(--thread-glow), transparent));
}
.nev-tap-wv-thread-contour,
.nev-tap-wv-thread-rail,
.nev-tap-wv-thread-memory,
.nev-tap-wv-thread-notch,
.nev-tap-wv-thread-terminal {
    vector-effect: non-scaling-stroke;
}
.nev-tap-wv-thread-contour {
    fill: none;
    stroke: color-mix(in srgb, currentColor var(--thread-edge), transparent);
    stroke-width: 1.35;
    stroke-linecap: round;
    stroke-linejoin: round;
}
.nev-tap-wv-thread-rail {
    fill: none;
    stroke: color-mix(in srgb, currentColor 78%, transparent);
    stroke-width: 1.45;
    stroke-linecap: round;
    filter: drop-shadow(0 1px 0 color-mix(in srgb, currentColor 18%, transparent));
}
.nev-tap-wv-thread-run[data-morphology="unknown"] .nev-tap-wv-thread-contour {
    stroke-dasharray: 1 5;
    stroke-width: 1.6;
    stroke-linecap: round;
}
.nev-tap-wv-thread-run[data-morphology="on-hold"] .nev-tap-wv-thread-body {
    fill-opacity: .38;
}
.nev-tap-wv-thread-run[data-morphology="on-hold"] .nev-tap-wv-thread-contour {
    stroke-width: 1.8;
}
/* Provenance changes the line grammar, never the clinical status or opacity
   category: continuous physician assertion, sampled observation, mechanical
   system audit. It is deliberately not named or styled as confidence. */
.nev-tap-wv-thread-run.source-observed .nev-tap-wv-thread-contour {
    stroke-dasharray: 9 2;
}
.nev-tap-wv-thread-run.source-observed .nev-tap-wv-thread-rail {
    stroke-dasharray: 9 2;
}
.nev-tap-wv-thread-run.source-system .nev-tap-wv-thread-contour {
    stroke-dasharray: 3 3;
}
.nev-tap-wv-thread-run.source-system .nev-tap-wv-thread-rail {
    stroke-dasharray: 3 3;
}
.nev-tap-wv-thread-run.source-system .nev-tap-wv-thread-body { fill-opacity: .72; }
/* Fix 2 (2026-09-06): carried-not-reassessed runs wear the gap band's 135°
   honesty hatch over a quieter tone fill; observed runs stay solid. The
   pattern is emitted inline by wvThreadHtml (#wv-carried-hatch). */
.nev-tap-wv-thread-run.carried .nev-tap-wv-thread-body { fill-opacity: .5; }
.nev-tap-wv-thread-hatch { fill: url(#wv-carried-hatch); pointer-events: none; }
.nev-tap-wv-hatch-bar { fill: color-mix(in srgb, var(--wv-base) 55%, transparent); }
.nev-tap-wv-lgd.is-carried { color: var(--wv-mocha); }
.nev-tap-wv-thread-memory {
    fill: none;
    stroke: color-mix(in srgb, currentColor 40%, transparent);
    stroke-width: 1;
    stroke-dasharray: 1 6;
    stroke-linecap: round;
}
.nev-tap-wv-thread-notch {
    fill: var(--wv-board);
    stroke: color-mix(in srgb, currentColor 92%, transparent);
    stroke-width: 1.2;
    stroke-linejoin: round;
}
.nev-tap-wv-thread-terminal {
    fill: var(--wv-board);
    stroke: color-mix(in srgb, currentColor 78%, transparent);
    stroke-width: 1.35;
}
.nev-tap-wv-thread-label {
    position: absolute;
    display: block;
    top: var(--wv-label-y, 50%);
    transform: translateY(-50%);
    padding: 0 10px;
    box-sizing: border-box;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    color: var(--wv-warm);
    font: 600 11px/1.2 var(--wv-sans);
    letter-spacing: .01em;
    text-shadow: 0 1px 2px var(--wv-board), 0 -1px 2px var(--wv-board);
    pointer-events: none;
    z-index: 2;
}
.nev-tap-wv-thread-label.t-worse { color: var(--wv-warm); }
.nev-tap-wv-thread-label.t-active { color: var(--wv-warm); }
.nev-tap-wv-thread-label.t-better { color: var(--wv-bone); }
.nev-tap-wv-thread-label.t-olive { color: var(--wv-bone); }
.nev-tap-wv-thread-label.t-brass,
.nev-tap-wv-thread-label.t-dim,
.nev-tap-wv-thread-label.t-context { color: var(--wv-mocha); }

/* Exact-day markers own the state centerline. On the taller passive Census
   lanes, labels ride the interior clear channel instead of competing with
   those markers; the embedded workspace has no clinical markers and keeps
   its denser on-thread labels. */
.nev-tap-wv[data-wv-census] .nev-tap-wv-thread-label[data-label-side="below"] {
    top: clamp(9px, calc(var(--wv-label-y) + 36px), calc(100% - 9px));
}
.nev-tap-wv[data-wv-census] .nev-tap-wv-thread-label[data-label-side="above"] {
    top: clamp(9px, calc(var(--wv-label-y) - 36px), calc(100% - 9px));
}

/* Non-problem patient/readiness scaffold lanes intentionally remain simple
   dashed intervals. They carry no clinical state morphology. */
.nev-tap-wv-seg.scaffold {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    height: var(--wv-rh, 9px);
    display: flex;
    align-items: center;
    padding: 0 8px;
    box-sizing: border-box;
    z-index: 1;
    border: 1px dashed color-mix(in srgb, var(--wv-mocha) 45%, transparent);
    border-radius: 4px;
    background: transparent;
    overflow: hidden;
    white-space: nowrap;
    font: 400 10px/1 var(--wv-mono);
    letter-spacing: .05em;
    text-transform: none;
    color: var(--wv-mocha);
}
/* Exact-day markers remain the interactive layer above the SVG field. The
   40px button is the hit target; its inner 22px disc is the visible knot.
   --wv-overlay-y pins both evidence and action to the owning clinical state. */
.nev-tap-wv-clinical-mark {
    position: absolute;
    /* Keep the full 40px Census hit target inside the clipped lane. The raw
       state Y still chooses its position; clamp only intervenes at the two
       physical edges where exact centering would make the control unreachable. */
    top: clamp(20px, var(--wv-overlay-y, 50%), calc(100% - 20px));
    width: 40px;
    height: 40px;
    padding: 0;
    border: 0;
    background: transparent;
    transform: translate(-50%, -50%);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    z-index: 5;
}
.nev-tap-wv-clinical-mark > span {
    width: 22px;
    height: 22px;
    margin: 0;
    border: 1px solid color-mix(in srgb, var(--wv-bone) 70%, transparent);
    border-radius: 50%;
    background: radial-gradient(circle at 50% 32%, color-mix(in srgb, var(--wv-ink) 10%, var(--wv-base)), var(--wv-base) 62%);
    color: var(--wv-bone);
    box-shadow:
        0 0 0 3px color-mix(in srgb, var(--wv-board) 72%, transparent),
        inset 0 0 0 3px color-mix(in srgb, currentColor 12%, transparent);
    display: flex;
    align-items: center;
    justify-content: center;
    font: 700 11px/1 var(--wv-mono);
}
.nev-tap-wv-clinical-mark.kind-plan > span,
.nev-tap-wv-clinical-mark.kind-assessment > span {
    border-color: var(--wv-brass);
    color: var(--wv-brass);
}
.nev-tap-wv-clinical-mark.kind-transition > span {
    border-color: var(--wv-amber);
    color: var(--wv-amber);
}
.nev-tap-wv-clinical-mark.kind-origin > span {
    border-color: var(--wv-sienna);
    color: var(--wv-sienna);
}
.nev-tap-wv-clinical-mark.kind-metric > span,
.nev-tap-wv-clinical-mark.kind-evidence > span {
    border-color: var(--wv-teal);
    color: var(--wv-teal);
}
.nev-tap-wv-clinical-mark:not(:hover):not(.selected) > span {
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--wv-board) 45%, transparent);
}
.nev-tap-wv-clinical-mark:hover > span,
.nev-tap-wv-clinical-mark.selected > span {
    background: color-mix(in srgb, var(--wv-bone) 12%, var(--wv-base));
    box-shadow:
        0 0 0 3px color-mix(in srgb, var(--wv-board) 85%, transparent),
        0 0 0 5px color-mix(in srgb, var(--wv-amber) 35%, transparent);
}
.nev-tap-wv-clinical-mark:focus-visible {
    outline: 2px solid var(--wv-teal);
    outline-offset: -4px;
    border-radius: 50%;
}

/* ── Knots: discs pinned ON the ribbon, ring halo (§5) ── */
.nev-tap-knot.nev-tap-wv-knot {
    position: absolute;
    top: var(--wv-overlay-y, 50%);
    transform: translate(-50%, -50%);
    width: 18px;
    height: 18px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    display: grid;
    place-items: center;
    gap: 0;
    max-width: none;
    background: var(--wv-brass);
    color: #120C06;
    font: 700 9px/1 var(--wv-mono);
    box-shadow: 0 0 0 3px var(--wv-board), 0 2px 6px rgba(0, 0, 0, .6);
    /* Historical future veil subordinates ribbons, never the still-focusable
       clinical state controls themselves. */
    z-index: 5;
    cursor: pointer;
}
.nev-tap-knot.nev-tap-wv-knot .kg {
    width: auto;
    height: auto;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
    color: inherit;
    font: inherit;
    display: block;
    position: static;
}
.nev-tap-knot.nev-tap-wv-knot:hover {
    border: 0;
    box-shadow: 0 0 0 3px var(--wv-board), 0 0 0 5px var(--wv-amber);
}
.nev-tap-knot.nev-tap-wv-knot.proposed,
.nev-tap-knot.nev-tap-wv-knot.detected { background: var(--wv-amber); }
.nev-tap-knot.nev-tap-wv-knot.accepted { background: var(--wv-teal); }
.nev-tap-knot.nev-tap-wv-knot.edited { background: var(--wv-gold); }
.nev-tap-knot.nev-tap-wv-knot.conflict { background: var(--wv-scarlet); }
.nev-tap-knot.nev-tap-wv-knot.apply_failed { background: var(--wv-scarlet); }
.nev-tap-knot.nev-tap-wv-knot.rejected { background: var(--wv-mocha); opacity: .55; }
.nev-tap-knot.nev-tap-wv-knot.carried_forward {
    background: transparent;
    color: var(--wv-mocha);
    border: 1px solid rgba(139, 115, 85, .7);
    box-shadow: 0 0 0 3px var(--wv-board);
    opacity: 1;
}
/* §5: unabsorbed proposals = SOLID amber "!" discs (Δ belongs only to
   the suppressed row). The pending states pulse. */
.nev-tap-knot.nev-tap-wv-knot.ledger_pending,
.nev-tap-knot.nev-tap-wv-knot.ledger_reconciling {
    background: var(--wv-amber);
    color: #120C06;
    border: 0;
    animation: wvKnotPulse 1.5s ease-in-out infinite;
}
.nev-tap-knot.nev-tap-wv-knot.ledger_pending .kg,
.nev-tap-knot.nev-tap-wv-knot.ledger_reconciling .kg {
    background: transparent;
    color: inherit;
    border: 0;
    box-shadow: none;
}
.nev-tap-knot.nev-tap-wv-knot.ledger_carried_forward {
    background: transparent;
    color: var(--wv-mocha);
    border: 1px solid rgba(139, 115, 85, .45);
    box-shadow: 0 0 0 3px var(--wv-board);
    opacity: .6;
}
.nev-tap-knot.nev-tap-wv-knot.ledger_carried_forward .kg {
    background: transparent;
    color: inherit;
    border: 0;
}
.nev-tap-knot.nev-tap-wv-knot.pulse {
    width: 22px;
    height: 22px;
    animation: wvKnotPulse 1.5s ease-in-out infinite;
}
.nev-tap-knot.nev-tap-wv-knot.pulse .kg { animation: none; }
.nev-tap-knot.nev-tap-wv-knot.selected {
    outline: 2px solid var(--wv-ink);
    outline-offset: 2px;
}
.nev-tap-wv-knot-cluster {
    position: absolute;
    top: var(--wv-overlay-y, 50%);
    transform: translate(-50%, -50%);
    width: 22px;
    height: 18px;
    padding: 0;
    border: 1px dashed var(--wv-amber);
    border-radius: 9px;
    display: grid;
    place-items: center;
    background: var(--wv-board);
    color: var(--wv-amber);
    font: 700 8px/1 var(--wv-mono);
    z-index: 6;
    cursor: zoom-in;
}
.nev-tap-wv-knot-cluster:hover { background: rgba(230, 154, 76, .12); }
.nev-tap-wv-knot-cluster:focus-visible {
    outline: 1px solid var(--wv-teal);
    outline-offset: 2px;
}
/* Turn-11 §11b — knot hit-target floor (passive census only). The visible disc
   stays 18px so the timeline still reads as points, but a transparent ::before
   lifts the POINTER target to 32px in both axes. This is the WCAG 2.5.8 spacing
   floor, NOT a literal 40px box: a 40px box on a dense point-timeline would
   overlap adjacent-day discs — manufacturing the very shared-hit-box ambiguity
   that same-day clustering removes. Same-day de-overlap (JS) guarantees no two
   events coincide; the remaining adjacent-day proximity on 40+ day boards is a
   post-layout declustering pass (deferred). Scoped to [data-wv-passive] so the
   takeover knots (their own popover geometry) stay byte-identical. */
.nev-tap-wv[data-wv-passive] .nev-tap-knot.nev-tap-wv-knot::before,
.nev-tap-wv[data-wv-passive] .nev-tap-wv-knot-cluster::before {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 32px;
    height: 32px;
    transform: translate(-50%, -50%);
    /* transparent: extends only the clickable region, paints nothing */
}
/* Same-day cluster opens the day (focusProblemBandDay), it does not zoom a
   range apart — so it reads as a plain pointer, not the range zoom-in. */
.nev-tap-wv-knot-cluster.is-day { cursor: pointer; }
/* Provenance hover lights the lane AND halos its knots (§12). */
.nev-tap-wv-lane.wv-lit .nev-tap-knot.nev-tap-wv-knot {
    box-shadow: 0 0 0 3px var(--wv-board), 0 0 0 5px var(--wv-amber);
}
@keyframes wvKnotPulse {
    0%, 100% { transform: translate(-50%, -50%) scale(1); }
    50% { transform: translate(-50%, -50%) scale(1.18); }
}
@keyframes wvDotPulse {
    0%, 100% { opacity: 1; }
    50% { opacity: .35; }
}

/* ── Today band + scrub cursor (§11) — quiet, per-track overlays ── */
.nev-tap-wv-todayband {
    /* 14a: the warm vertical plane, carried down every track. Stays faint
       enough that segment labels + NOW still win. */
    position: absolute;
    top: 0; bottom: 0;
    background: linear-gradient(90deg, color-mix(in srgb, var(--wv-amber) 9%, transparent), color-mix(in srgb, var(--wv-amber) 2%, transparent));
    border-left: 1px solid var(--wv-amber);
    box-shadow: inset 3px 0 0 -2px color-mix(in srgb, var(--wv-brass) 60%, transparent);
    pointer-events: none;
    z-index: 2;
    animation: wvLoomBreath 7s ease-in-out infinite;
}
@keyframes wvLoomBreath { 0%, 100% { opacity: 1; } 50% { opacity: .74; } }
/* Finials as brass inset edges — the ceremony without an unreliable glyph:
   admission carries a gilt selvage edge; TODAY already has one via the band. */
.nev-tap-wv-day.admission { box-shadow: inset 2px 0 0 -1px color-mix(in srgb, var(--wv-brass) 55%, transparent); }
.nev-tap-wv-day.today .d { color: var(--wv-amber); }
.nev-tap-wv-scrubband {
    position: absolute;
    top: 0; bottom: 0;
    background: color-mix(in srgb, var(--wv-bone) 6%, transparent);
    border-left: 1px solid color-mix(in srgb, var(--wv-bone) 55%, transparent);
    border-right: 1px solid color-mix(in srgb, var(--wv-bone) 55%, transparent);
    pointer-events: none;
    z-index: 2;
}
.nev-tap-wv-gapband {
    position: absolute;
    top: 0; bottom: 0;
    pointer-events: none;
    z-index: 3;
    /* Gap = the warp lifts: weft-only threads + a wash toward base + the 135°
       honesty hatch retained. "unobserved", in the weave's language. */
    background:
        repeating-linear-gradient(135deg, transparent 0 4px, color-mix(in srgb, var(--wv-base) 40%, transparent) 4px 8px),
        repeating-linear-gradient(0deg, transparent 0 3px, color-mix(in srgb, var(--wv-base) 62%, transparent) 3px 4px),
        color-mix(in srgb, var(--wv-base) 30%, transparent);
}
.nev-tap-wv-futureveil {
    position: absolute;
    top: 0;
    bottom: 0;
    background: rgba(18, 12, 6, .42);
    border-left: 1px solid rgba(235, 225, 215, .12);
    pointer-events: none;
    z-index: 4;
}
.nev-tap-wv-day.after-focus {
    background: rgba(18, 12, 6, .18);
}
.nev-tap-wv-day.after-focus .ev {
    filter: saturate(.62);
}

/* ── NOW column: TRAJ micro-label → arc → status word (§6) ── */
.nev-tap-wv-now {
    border-left: 1px solid var(--wv-hair);
    box-shadow: inset 2px 0 0 -1px color-mix(in srgb, var(--wv-brass) 25%, transparent);
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 2px;
    padding: 0 12px;
    min-width: 0;
    overflow: hidden;
}
.nev-tap-wv-trajlbl {
    font: 400 9.5px/1 var(--wv-mono);
    color: var(--wv-mocha);
    letter-spacing: .08em;
    text-transform: uppercase;
    border-bottom: 1px dotted rgba(191, 161, 98, .4);
    align-self: flex-start;
    cursor: help;
}
.nev-tap-wv-traj { display: block; margin: 2px 0; max-width: 100%; }
.nev-tap-wv-nowvalue {
    /* 14a: the NOW value is the payoff — 15px ink; the unit label rides
       as a small mono prefix (.metric-label at .72em ≈ 10.8px). */
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: .35em;
    row-gap: 1px;
    max-width: 100%;
    font: 600 15px/1.15 var(--wv-mono);
    color: var(--wv-ink);
    white-space: normal;
}
.nev-tap-wv-nowvalue.long { font-size: 13px; }
.nev-tap-wv-nowvalue .metric-day {
    color: var(--wv-brass);
    font-size: .68em;
    font-weight: 700;
    letter-spacing: .05em;
}
.nev-tap-wv-nowvalue .metric-label {
    color: var(--wv-mocha);
    font-size: .72em;
    font-weight: 500;
    letter-spacing: .06em;
    text-transform: uppercase;
}
.nev-tap-wv-nowvalue .metric-value { color: var(--wv-ink); }
.nev-tap-wv-nowvalue .metric-trend {
    color: var(--wv-brass);
    font-size: .78em;
}
/* §5.3 enrichment (2026-07-22): value-curve sparkline + admit->now·peak range
   drop below the value line. Block children stack under the nowrap value. */
.nev-tap-wv-nowspark {
    display: block;
    margin: 2px 0 1px;
    width: min(96px, 100%);
    height: 18px;
    color: var(--wv-mocha);
    overflow: visible;
}
.nev-tap-wv-nowspark.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-nowspark.t-active { color: var(--wv-amber); }
.nev-tap-wv-nowspark.t-better { color: var(--wv-teal); }
.nev-tap-wv-nowspark.t-olive { color: var(--wv-olive); }
.nev-tap-wv-nowspark.t-brass { color: var(--wv-brass); }
.nev-tap-wv-nowspark .now { fill: currentColor; }
.nev-tap-wv-nowspark .ext { fill: var(--wv-amber); r: 2.4px; stroke: var(--wv-base); stroke-width: 1; }
.nev-tap-wv-nowvalue .metric-range {
    flex-basis: 100%;
    font: 400 9.5px/1.2 var(--wv-mono);
    color: var(--wv-mocha);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.nev-tap-wv-nowcue {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    align-items: baseline;
    gap: 6px;
    min-width: 0;
}
.nev-tap-wv-nowcue .cue-day {
    color: var(--wv-brass);
    font: 600 9.5px/1 var(--wv-mono);
    letter-spacing: .05em;
}
.nev-tap-wv-nowcue .cue-text {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    color: var(--wv-ink);
    font: 600 12px/1.25 var(--wv-sans);
}
.nev-tap-wv-traj.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-traj.t-active { color: var(--wv-amber); }
.nev-tap-wv-traj.t-better { color: var(--wv-teal); }
.nev-tap-wv-traj.t-olive { color: var(--wv-olive); }
.nev-tap-wv-traj.t-brass,
.nev-tap-wv-traj.t-dim,
.nev-tap-wv-traj.t-context { color: var(--wv-mocha); }
.nev-tap-wv-nowword {
    /* 14a: status word 10px in its semantic color. */
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .06em;
    text-transform: uppercase;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.nev-tap-wv-nowword.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-nowword.t-active { color: var(--wv-amber); }
.nev-tap-wv-nowword.t-better { color: var(--wv-teal); }
.nev-tap-wv-nowword.t-olive { color: var(--wv-olive); }
.nev-tap-wv-nowword.t-brass { color: var(--wv-brass); }
.nev-tap-wv-nowword.t-dim,
.nev-tap-wv-nowword.t-context { color: var(--wv-mocha); }

/* ── Section rows, chronic fold, suppressed row, legend (§11) ── */
.nev-tap-wv-section {
    /* 14a: group headers are quiet tinted BANDS — 10px mono, .12em,
       one shade below the board. */
    padding: 7px 12px 6px;
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--wv-mocha);
    background: linear-gradient(90deg, color-mix(in srgb, var(--wv-brass) 14%, transparent), transparent 34%), var(--wv-sect); /* the plain re-declaration below used to dead-code this gradient */
    border-bottom: 1px solid var(--wv-hair);
}
.nev-tap-wv-fold {
    width: 100%;
    min-height: 40px; /* 14a hit-target floor */
    display: flex;
    align-items: center;
    gap: 9px;
    border: 0;
    border-bottom: 1px solid var(--wv-hair);
    background: var(--wv-chronic);
    color: var(--wv-mocha);
    padding: 7px 20px;
    cursor: pointer;
    text-align: left;
    font: 400 10px/1 var(--wv-mono);
    letter-spacing: .1em;
    text-transform: uppercase;
}
.nev-tap-wv-fold:hover { color: var(--wv-bone); }
.nev-tap-wv-fold .cv { width: 10px; font: 400 9px/1 var(--wv-mono); }
.nev-tap-wv-chronic .nev-tap-wv-lane {
    height: 26px;
    --wv-rh: 7px;
    opacity: .55;
    background: var(--wv-chronic);
}
.nev-tap-wv-chronic .nev-tap-wv-lane .ln2 { display: none; }
.nev-tap-wv-chronic .nev-tap-wv-lane .nm .nev-tap-lane-nm {
    font: 500 12px/1.2 var(--wv-sans);
    color: var(--wv-bone);
}
.nev-tap-wv-ungrounded {
    display: flex;
    align-items: center;
    gap: 10px;
    border-bottom: 1px solid var(--wv-hair);
    background: rgba(230, 154, 76, .03);
    color: var(--wv-mocha);
    padding: 8px 20px;
    font: 400 10px/1.4 var(--wv-mono);
    letter-spacing: .06em;
    text-transform: uppercase;
}
.nev-tap-wv-ungrounded .dg {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    border: 1.5px dashed var(--wv-amber);
    color: var(--wv-amber);
    font: 600 8px/1 var(--wv-mono);
    flex: none;
}
/* UX pass (2026-07-09): legend + keyboard bar fold. Markup always renders
   (contract strings stay greppable); closed just hides it. Default closed —
   the key explains the surface, it is not the surface. */
.nev-tap-wv-meta.collapsed .nev-tap-wv-legend,
.nev-tap-wv-meta.collapsed .nev-tap-wv-cmdbar { display: none; }
.nev-tap-wv-fold.meta { border-top: 1px solid var(--wv-hair); }

/* UX pass (2026-07-09): inert patient-level scaffolds collapse to one row. */
.nev-tap-wv-scafrow {
    padding: 6px 12px 7px;
    border-bottom: 1px solid var(--wv-hair);
    font: 400 10px/1.4 var(--wv-mono);
    letter-spacing: .05em;
    color: var(--wv-mocha);
    background: var(--wv-sect);
}
.nev-tap-wv-scafrow .q { margin-left: 8px; opacity: .65; font-style: italic; }

.nev-tap-wv-legend {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 7px 20px;
    border-bottom: 1px solid var(--wv-seam);
    background: var(--wv-sect);
    flex-wrap: wrap;
}
.nev-tap-wv-lgd { font: 400 10px/1 var(--wv-mono); }
.nev-tap-wv-lgd.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-lgd.t-active { color: var(--wv-amber); }
.nev-tap-wv-lgd.t-better { color: var(--wv-teal); }
.nev-tap-wv-lgd.t-olive { color: var(--wv-olive); }
.nev-tap-wv-lgd.t-brass { color: var(--wv-brass); }
.nev-tap-wv-lgd.t-dim { color: var(--wv-mocha); }
.nev-tap-wv-lgk {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    font: 400 10px/1 var(--wv-mono);
    color: var(--wv-mocha);
}
.nev-tap-wv-lgk .k {
    width: 14px;
    height: 14px;
    border-radius: 50%;
    display: grid;
    place-items: center;
    font: 700 8px/1 var(--wv-mono);
    color: #120C06;
}
.nev-tap-wv-lgk .k.proposed { background: var(--wv-amber); }
.nev-tap-wv-lgk .k.accepted { background: var(--wv-teal); }
.nev-tap-wv-lgk .k.edited { background: var(--wv-gold); }
.nev-tap-wv-lgk .k.med { background: #E69A4C; box-shadow: 0 0 0 2px var(--wv-recess, #0D0805); }
/* Task C (2026-09-06): dated medication-change pips on the patient-level lane.
   Orange disc, dark ring (the Course Tapestry Live mock's pip); title carries
   every drug for that day. Unattributed by design — never on a problem lane. */
.nev-tap-wv-medpip {
    position: absolute;
    top: 50%;
    width: 9px;
    height: 9px;
    margin-left: -4.5px;
    border-radius: 50%;
    background: #E69A4C;
    box-shadow: 0 0 0 2px var(--wv-recess, #0D0805);
    transform: translateY(-50%);
    z-index: 3;
    cursor: help;
}
.nev-tap-wv-lgd-note { margin-left: auto; font: 400 10px/1 var(--wv-mono); color: var(--wv-mocha); }

/* ── TURN-7 additions ─────────────────────────────────────────────── */
/* §1 legend: inclusion-edge key */
.nev-tap-wv-lgd-pol { font: 400 10px/1 var(--wv-mono); color: var(--wv-mocha); }
.nev-tap-wv-lgd-pol .pm { color: var(--wv-scarlet); }
.nev-tap-wv-lgd-pol .pb { color: var(--wv-amber); }
.nev-tap-wv-lgd-pol .pmem { color: var(--wv-brass); }
.nev-tap-wv-lgd-pol .ps { color: var(--wv-mocha); }

/* §8 semantic phase spine — epochs between day spine and lanes. The
   active phase (contains the scrubbed day) lights its tone; the rest sit
   in hairline + dim mocha. Row renders ONLY when both derivation
   boundaries exist (see _wvPhases). */
.nev-tap-wv-phases {
    display: grid;
    grid-template-columns: var(--wv-label-w) minmax(0, 1fr) var(--wv-now-w);
    border-bottom: 1px solid var(--wv-hair);
    background: var(--wv-sect);
}
.nev-tap-wv-phases .lbl {
    padding: 6px 12px;
    font: 400 10px/1 var(--wv-mono);
    color: var(--wv-mocha);
    letter-spacing: .11em;
    text-transform: uppercase;
    border-right: 1px solid var(--wv-hair);
    display: flex;
    align-items: center;
}
.nev-tap-wv-phases .band { display: grid; min-width: 0; }
.nev-tap-wv-phases .band.adaptive {
    position: relative;
    display: block;
    min-height: 26px;
}
.nev-tap-wv-phases .band.adaptive .nev-tap-wv-phase {
    position: absolute;
    top: 0;
    bottom: 0;
    box-sizing: border-box;
}
.nev-tap-wv-phases .tail { border-left: 1px solid var(--wv-hair); }
.nev-tap-wv-phase {
    display: flex;
    align-items: center;
    padding: 5px 8px;
    margin: 4px 0;
    border-left: 2px solid rgba(107, 86, 74, .4);
    min-width: 0;
}
.nev-tap-wv-phase span {
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .09em;
    text-transform: uppercase;
    /* 2026-08-21: was hardcoded rgba(139,115,85,.85) — dark-theme mocha at
       85%, which measured 1.7:1 on the light cold-brew phase band. The token
       tracks every skin (identical look on the dark themes). */
    color: var(--wv-mocha);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.nev-tap-wv-phase.det.active { border-left-color: rgba(196, 76, 76, .55); }
.nev-tap-wv-phase.det.active span { color: var(--wv-scarlet); }
.nev-tap-wv-phase.turn.active { border-left-color: rgba(230, 154, 76, .6); }
.nev-tap-wv-phase.turn.active span { color: var(--wv-amber); }
.nev-tap-wv-phase.rec.active { border-left-color: rgba(76, 196, 180, .55); }
.nev-tap-wv-phase.rec.active span { color: var(--wv-teal); }

/* §12 keyboard command bar — sits directly under the legend row. */
.nev-tap-wv-cmdbar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 7px 20px;
    border-bottom: 1px solid var(--wv-hair);
    background: #0D0906;
}
.nev-tap-wv-cmdbar .tx { font: 400 10px/1.4 var(--wv-mono); color: var(--wv-mocha); }
.nev-tap-wv-cmdbar .tx b { color: var(--wv-bone); font-weight: 600; }
.nev-tap-wv-cmdbar .keys { margin-left: auto; display: flex; gap: 5px; align-items: center; }
.nev-tap-wv-cmdbar .kc {
    border: 1px solid var(--wv-seam);
    border-radius: 2px;
    padding: 3px 6px;
    font: 600 10px/1 var(--wv-mono);
    color: var(--wv-bone);
    background: #1A110B;
}

/* §18: motion + focus hygiene, weave-scoped. */
@media (prefers-reduced-motion: reduce) {
    .nev-tap-wv *,
    .nev-tap-wv *::before,
    .nev-tap-wv *::after { animation: none !important; transition: none !important; }
}
.nev-tap-wv button:focus-visible {
    outline: 1px solid var(--wv-teal);
    outline-offset: -1px;
}

/* ── Time machine: A&P as it stood — recessed band (§9/§12) ── */
.nev-tap-tm {
    background: var(--wv-recess, #0D0805);
    box-shadow: inset 0 10px 18px -14px rgba(0, 0, 0, .95);
}
.nev-tap-tm-head {
    display: flex;
    align-items: baseline;
    gap: 10px;
    padding: 10px 20px;
    border-bottom: 1px solid var(--wv-hair, #3C2A21);
    flex-wrap: wrap;
}
.nev-tap-tm-head .hd {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-brass, #BFA162);
    letter-spacing: .11em;
    text-transform: uppercase;
}
.nev-tap-tm-head .dy { font: 600 13px/1 var(--wv-mono, ui-monospace, monospace); color: var(--wv-ink, #FFF7EE); }
.nev-tap-tm-head .hint { margin-left: auto; font: 400 10px/1 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); }
.nev-tap-tm-diff {
    min-height: 40px; /* 14a hit-target floor */
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(76, 196, 180, .45);
    background: transparent;
    color: var(--wv-mocha, #8B7355);
    border-radius: 2px;
    padding: 0 11px;
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .06em;
    text-transform: uppercase;
    cursor: pointer;
}
.nev-tap-tm-diff.on { background: rgba(76, 196, 180, .18); color: #8FE8DB; }
.nev-tap-tm-diff:focus-visible { outline: 1px solid var(--wv-teal, #4CC4B4); outline-offset: 2px; }
.nev-tap-tm-body { padding: 8px 20px 12px; display: grid; gap: 6px; }
.nev-tap-tm-row {
    display: grid;
    grid-template-columns: 170px minmax(0, 1fr);
    gap: 12px;
    align-items: baseline;
    padding: 4px 0;
    border-bottom: 1px solid rgba(107, 86, 74, .14);
}
.nev-tap-tm-row .pn { font: 600 13px/1.3 var(--wv-sans, sans-serif); color: var(--wv-ink, #FFF7EE); }
.nev-tap-tm-row .ap { min-width: 0; display: grid; gap: 4px; }
.nev-tap-tm-row .ln { display: flex; gap: 8px; align-items: baseline; }
.nev-tap-tm-row .z {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-brass, #BFA162);
    letter-spacing: .08em;
    flex: none;
    width: 12px;
}
.nev-tap-tm-row .tx { font: 400 13px/1.5 var(--wv-sans, sans-serif); color: var(--wv-bone, #EBE1D7); }
.nev-tap-tm-today {
    font: 400 12px/1.5 var(--wv-sans, sans-serif);
    color: var(--wv-teal, #4CC4B4);
    box-shadow: inset 2px 0 0 rgba(76, 196, 180, .6);
    padding-left: 8px;
}
.nev-tap-tm-missing,
.nev-tap-tm-quiet { font: 400 10px/1.4 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); padding: 4px 0 0; }

/* ── Compile Course panel (§12): the terse deterministic skeleton ── */
.nev-tap-cc {
    border-left: 1px solid var(--wv-seam, #5A453A);
    background: var(--wv-sect, #0F0A06);
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.nev-tap-cc-head {
    display: flex;
    align-items: baseline;
    gap: 8px;
    padding: 11px 14px;
    border-bottom: 1px solid var(--wv-hair, #3C2A21);
    flex-wrap: wrap;
}
.nev-tap-cc-head .hd {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-brass, #BFA162);
    letter-spacing: .1em;
    text-transform: uppercase;
}
.nev-tap-cc-head .sub { font: 400 10px/1 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); }
.nev-tap-cc-asof {
    border-bottom: 1px dashed rgba(230, 154, 76, .38);
    padding: 7px 14px;
    font: 600 10px/1.4 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-amber, #E69A4C);
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-cc-body { padding: 8px 10px 10px; display: grid; gap: 3px; align-content: start; flex: 1; }
.nev-tap-cc-sent { padding: 7px 9px; border-radius: 2px; display: grid; gap: 4px; }
.nev-tap-cc-sent.wv-lit { background: rgba(230, 154, 76, .08); box-shadow: inset 2px 0 0 var(--wv-amber, #E69A4C); }
.nev-tap-cc-sent.rollup { background: rgba(139, 115, 85, .06); }
.nev-tap-cc-sent.rollup .tx { color: var(--wv-mocha, #8B7355); font-size: 11px; }
/* 14a: the embedded face lifts to 13px; the passive face keeps its 15px
   override (narrower takeover column). */
.nev-tap-cc-sent .tx { font: 400 13px/1.7 var(--wv-sans, sans-serif); color: var(--wv-bone, #EBE1D7); }
.nev-tap-cc-sent .n { color: var(--wv-mocha, #8B7355); font: 400 10px/1 var(--wv-mono, ui-monospace, monospace); }
.nev-tap-cc-st { font-weight: 600; }
.nev-tap-cc-st.t-worse { color: var(--wv-scarlet, #C44C4C); }
.nev-tap-cc-st.t-active { color: var(--wv-amber, #E69A4C); }
.nev-tap-cc-st.t-better { color: var(--wv-teal, #4CC4B4); }
.nev-tap-cc-st.t-olive { color: var(--wv-olive, #879A39); }
.nev-tap-cc-st.t-brass { color: var(--wv-brass, #BFA162); }
.nev-tap-cc-st.t-dim { color: var(--wv-mocha, #8B7355); }
.nev-tap-cc-day {
    font: 400 9.5px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-warm, #F0E6D0);
    background: rgba(42, 28, 19, .6);
    border: 1px solid var(--wv-seam, #5A453A);
    border-radius: 2px;
    padding: 1px 4px;
    white-space: nowrap;
}
.nev-tap-cc-sent .chips { display: flex; gap: 4px; flex-wrap: wrap; }
.nev-tap-cc-chip {
    border: 1px solid var(--wv-seam, #5A453A);
    color: var(--wv-warmmid, #B9A88F);
    padding: 3px 6px;
    font: 400 10px/1 var(--wv-mono, ui-monospace, monospace);
    border-radius: 2px;
    white-space: nowrap;
}
.nev-tap-cc-foot {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 14px;
    border-top: 1px solid var(--wv-hair, #3C2A21);
    flex-wrap: wrap;
}
.nev-tap-cc-foot .ft { font: 400 10px/1.3 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); }
.nev-tap-cc-stale {
    min-height: 40px; /* 14a hit-target floor */
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(230, 154, 76, .55);
    background: rgba(230, 154, 76, .09);
    color: var(--wv-amber, #E69A4C);
    border-radius: 2px;
    padding: 0 12px;
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .05em;
    text-transform: uppercase;
    cursor: pointer;
    white-space: nowrap;
}
.nev-tap-cc-stale:hover { background: rgba(230, 154, 76, .18); }
.nev-tap-cc-copy {
    margin-left: auto;
    min-height: 40px; /* 14a hit-target floor */
    display: inline-flex;
    align-items: center;
    border: 1px solid rgba(76, 196, 180, .5);
    background: transparent;
    color: var(--wv-teal, #4CC4B4);
    border-radius: 2px;
    padding: 0 13px;
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .05em;
    text-transform: uppercase;
    cursor: pointer;
    white-space: nowrap;
}
.nev-tap-cc-copy:hover { background: rgba(76, 196, 180, .1); }
.nev-tap-cc-stale:focus-visible,
.nev-tap-cc-copy:focus-visible { outline: 1px solid var(--wv-teal, #4CC4B4); outline-offset: 2px; }

@media (max-width: 900px) {
    .nev-tap-wv-main.with-cc,
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main.with-cc { grid-template-columns: 1fr; }
    .nev-tap-cc { border-left: 0; border-top: 1px solid var(--wv-seam, #5A453A); }
    /* 14a: --wv-now-w clears the 80px sparkline + 24px padding. */
    .nev-tap-wv { --wv-label-w: 148px; --wv-now-w: 104px; }
    .nev-tap-wv-header { flex-wrap: wrap; }
}

/* ══ Turn-12 (2026-07-08): contract conformance — ledger open end,
   two knot populations, source-ladder pill, roster sections ══ */

/* Right rail: open-end queue stacked above the compiled course. The rail
   carries the seam; panels inside drop their own left borders. */
.nev-tap-wv-rail {
    border-left: 1px solid var(--wv-seam, #5A453A);
    display: flex;
    flex-direction: column;
    min-width: 0;
    background: var(--wv-recess, #0D0805);
    box-shadow: inset 10px 0 18px -18px rgba(0, 0, 0, .95);
}
.nev-tap-wv-rail .nev-tap-cc {
    border-left: 0;
    border-top: 1px solid var(--wv-seam, #5A453A);
}
/* Task A (2026-09-06): named day events under the date + trajectory fold. */
.nev-tap-wv-day .evl {
    display: block;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font: 500 10px/1.25 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .02em;
    color: var(--wv-amber, #E6A94C);
    opacity: .92;
}
.nev-tap-wv-day .evl.more { opacity: .7; }
.nev-tap-wv-day.range.has-ev .d::after { content: ' •'; color: var(--wv-amber, #E6A94C); }
.nev-tap-wv-traj {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 4px 14px;
    font: 500 11px/1.4 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .04em;
    text-transform: lowercase;
    color: var(--wv-ink, #C9B8A8);
    background: var(--wv-sect, transparent);
    border-bottom: 1px solid var(--wv-hair, rgba(255,255,255,.08));
}
.nev-tap-wv-traj .lb { opacity: .6; text-transform: uppercase; margin-right: 4px; }
.nev-tap-wv-traj .sep { opacity: .4; }
.nev-tap-wv-traj .t-worse { color: var(--wv-scarlet); }
.nev-tap-wv-traj .t-active { color: var(--wv-amber); }
.nev-tap-wv-traj .t-better { color: var(--wv-teal); }
.nev-tap-wv-traj .t-olive { color: var(--wv-olive); }
.nev-tap-wv-traj .t-dim { color: var(--wv-mocha); }
.nev-tap-wv-traj .dot {
    display: inline-block; width: 7px; height: 7px; border-radius: 50%;
    margin-right: 5px; background: currentColor; vertical-align: 0;
}
/* Idle strip (2026-09-06): zero open knots, no focus, no compiled course →
   the rail is a 44px seam carrying only its head line; lanes take the width.
   Stacked breakpoints (≤1500px, rail already under the board) turn it into a
   44px-tall bar instead. No handler, no drawer: a problem name still opens
   the focus frame at full width. */
.nev-tap-wv-main.is-idle,
.nev-tap-wv[data-wv-passive] .nev-tap-wv-main.is-idle {
    grid-template-columns: minmax(0, 1fr) 44px;
}
.nev-tap-wv-rail.is-idle {
    writing-mode: vertical-rl;
    align-items: center;
    gap: 10px;
    padding: 12px 0;
    overflow: hidden;
    font-family: var(--wv-mono, ui-monospace, monospace);
    font-size: 11px;
    letter-spacing: .04em;
    color: var(--wv-ink, #C9B8A8); opacity: .75;
    white-space: nowrap;
}
.nev-tap-wv-rail.is-idle .nev-tap-oe-idle.sup { opacity: .7; }
@media (max-width: 1500px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main.is-idle { grid-template-columns: minmax(0, 1fr); }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-idle {
        writing-mode: horizontal-tb; flex-direction: row; height: 44px; padding: 0 14px;
    }
}
@container tapestry-passive (max-width: 1500px) {
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-main.is-idle { grid-template-columns: minmax(0, 1fr); }
    .nev-tap-wv[data-wv-passive] .nev-tap-wv-rail.is-idle {
        writing-mode: horizontal-tb; flex-direction: row; height: 44px; padding: 0 14px;
    }
}
@media (max-width: 900px) {
    .nev-tap-wv-main.is-idle { grid-template-columns: 1fr; }
    .nev-tap-wv-rail.is-idle { writing-mode: horizontal-tb; flex-direction: row; height: 44px; padding: 0 14px; }
}

/* ── Turn-11 §11c — per-problem focus frame (passive census only) ──
   Replaces the rail's global oe/cc stack while a problem is selected. The
   problem is the unit of work: name + status + trajectory sparkline, then
   today's grounded evidence, then the deterministic course-so-far. Read-only
   (the passive surface can't host inline patch accept/reject — isolation
   guard); the action model is the ledger-reconcile handoff (slice 2). Scoped
   to [data-wv-passive] so the takeover face is untouched. */
.nev-tap-wv-rail.is-focus { background: var(--wv-board); }
.nev-tap-wv[data-wv-passive] .nev-tap-wv-focus {
    display: flex;
    flex-direction: column;
    min-width: 0;
    overflow-y: auto;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-head {
    display: flex;
    align-items: center;
    gap: 9px;
    padding: 11px 13px;
    border-bottom: 1px solid var(--wv-hair);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-nm {
    font: 600 17px/1.15 var(--wv-sans);
    color: var(--wv-ink);
    min-width: 0;
    overflow-wrap: anywhere;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge {
    flex: none;
    font: 700 9px/1 var(--wv-mono);
    letter-spacing: .05em;
    text-transform: uppercase;
    padding: 3px 6px;
    border-radius: 2px;
    border: 1px solid var(--wv-mocha);
    color: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge.t-worse { color: var(--wv-scarlet); border-color: rgba(196, 76, 76, .55); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge.t-active { color: var(--wv-amber); border-color: rgba(230, 154, 76, .55); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge.t-better { color: var(--wv-teal); border-color: rgba(76, 196, 180, .55); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge.t-olive { color: #A9BE4E; border-color: rgba(135, 154, 57, .55); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-badge.t-brass { color: var(--wv-brass); border-color: rgba(191, 161, 98, .55); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark {
    display: inline-flex;
    align-items: flex-end;
    gap: 2px;
    height: 22px;
    margin-left: auto;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark .bar {
    width: 5px;
    border-radius: 1px;
    background: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark .bar.is-now { background: var(--wv-amber); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark .bar.is-now.t-worse { background: var(--wv-scarlet); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark .bar.is-now.t-better { background: var(--wv-teal); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-spark .bar.is-now.t-olive { background: #879A39; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-range {
    flex: none;
    font: 400 10px/1 var(--wv-mono);
    color: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-close {
    flex: none;
    /* §11b hit-target floor: a 40px square click box, quiet glyph. */
    width: 40px;
    height: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: var(--wv-mocha);
    font: 400 18px/1 var(--wv-mono);
    cursor: pointer;
    border-radius: 4px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-close:hover { color: var(--wv-bone); background: rgba(46, 31, 20, .5); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change {
    padding: 16px 18px 17px;
    border-bottom: 1px solid var(--wv-hair);
    background:
        linear-gradient(110deg, rgba(230, 154, 76, .11), transparent 58%),
        var(--wv-board);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change.is-quiet {
    background: linear-gradient(110deg, rgba(139, 115, 85, .08), transparent 58%);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change-kicker {
    margin-bottom: 8px;
    color: var(--wv-brass);
    font: 700 10px/1 var(--wv-mono);
    letter-spacing: .1em;
    text-transform: uppercase;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change-primary {
    max-width: 72ch;
    color: var(--wv-ink);
    font: 600 17px/1.4 var(--wv-sans);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change.is-quiet .nev-tap-fx-change-primary {
    color: var(--wv-warmmid);
    font-weight: 450;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change-why,
.nev-tap-wv[data-wv-passive] .nev-tap-fx-signals {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-top: 10px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-change-why > span,
.nev-tap-wv[data-wv-passive] .nev-tap-fx-signals > span {
    padding: 5px 8px;
    border: 1px solid rgba(76, 196, 180, .28);
    border-radius: 999px;
    background: rgba(76, 196, 180, .07);
    color: var(--wv-warm);
    font: 500 11px/1.2 var(--wv-mono);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-sect {
    padding: 14px 18px;
    border-bottom: 1px solid var(--wv-hair);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-sect:last-child { border-bottom: 0; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-lbl {
    font: 600 12px/1 var(--wv-mono);
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--wv-brass);
    margin-bottom: 7px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-empty {
    font: 400 12px/1.4 var(--wv-sans);
    color: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev {
    display: flex;
    align-items: center;
    gap: 8px;
    font: 400 13px/1.4 var(--wv-sans);
    color: var(--wv-warm);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .dot {
    flex: none;
    width: 7px;
    height: 7px;
    border-radius: 50%;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .dot.amber { background: var(--wv-amber); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .dot.teal { background: var(--wv-teal); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .txt { min-width: 0; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .txt b { color: var(--wv-ink); font-weight: 600; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .g.rising { color: var(--wv-scarlet); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .g.falling { color: var(--wv-teal); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ev .from { color: var(--wv-mocha); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-src {
    margin-left: auto;
    flex: none;
    border: 0;
    background: transparent;
    padding: 0;
    font: 400 11px/1 var(--wv-mono);
    color: var(--wv-brass);
    text-decoration: underline;
    cursor: pointer;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-srcbody {
    margin-top: 6px;
    font: 400 11px/1.4 var(--wv-mono);
    color: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-traj {
    display: grid;
    gap: 4px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow {
    display: grid;
    grid-template-columns: 58px minmax(84px, auto) minmax(0, 1fr);
    gap: 8px;
    align-items: baseline;
    font: 400 13px/1.4 var(--wv-sans);
    color: var(--wv-warm);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .d {
    flex: none;
    min-width: 52px;
    font: 400 11px/1.4 var(--wv-mono);
    color: var(--wv-mocha);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s { font-weight: 600; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-worse { color: var(--wv-scarlet); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-active { color: var(--wv-amber); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-better { color: var(--wv-teal); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-olive { color: #A9BE4E; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-brass { color: var(--wv-brass); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-dim,
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .s.t-context { color: var(--wv-mocha); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-trow .detail {
    min-width: 0;
    color: var(--wv-ink);
}
/* §11c slice 2 — A&P (current, read-only) with A / P on their own rows. */
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap { display: grid; gap: 6px; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap .ln {
    display: grid;
    grid-template-columns: 18px minmax(0, 1fr);
    gap: 9px;
    align-items: baseline;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap .z {
    flex: none;
    width: 12px;
    font: 700 11px/1.5 var(--wv-mono);
    color: var(--wv-brass);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap .tx {
    font: 450 14px/1.55 var(--wv-sans);
    color: var(--wv-ink);
    min-width: 0;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap ul.tx {
    margin: 0;
    padding-left: 18px;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-ap ul.tx li + li { margin-top: 5px; }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-record {
    border-bottom: 1px solid var(--wv-hair);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-record > summary {
    min-height: 40px;
    padding: 0 18px;
    display: flex;
    align-items: center;
    color: var(--wv-mocha);
    cursor: pointer;
    font: 600 10px/1 var(--wv-mono);
    letter-spacing: .07em;
    text-transform: uppercase;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-record[open] > summary {
    color: var(--wv-brass);
    border-bottom: 1px solid var(--wv-hair);
}
/* §11c slice 2 — action bar: draft&review (or read-only note) + pager. */
.nev-tap-wv[data-wv-passive] .nev-tap-fx-actions {
    display: flex;
    align-items: center;
    gap: 9px;
    flex-wrap: wrap;
    padding: 11px 13px;
    border-top: 1px solid var(--wv-hair);
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-reconcile {
    flex: none;
    min-height: 40px;
    display: inline-flex;
    align-items: center;
    padding: 9px 15px;
    border: 1px solid rgba(76, 196, 180, .6);
    border-radius: 3px;
    background: rgba(76, 196, 180, .15);
    color: #8FE8DB;
    font: 600 11px/1 var(--wv-mono);
    letter-spacing: .03em;
    cursor: pointer;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-reconcile:hover { background: rgba(76, 196, 180, .24); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pendnote {
    font: 400 11px/1.4 var(--wv-mono);
    color: var(--wv-amber);
    min-width: 0;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pendnote.quiet { color: var(--wv-mocha); }
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pager {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex: none;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pager .ct {
    font: 400 10px/1 var(--wv-mono);
    color: var(--wv-mocha);
    padding: 0 4px;
    white-space: nowrap;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pager .pg {
    /* §11b floor: 40px tall click box, quiet mono glyph. */
    min-height: 40px;
    min-width: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--wv-seam);
    border-radius: 3px;
    background: transparent;
    color: var(--wv-bone);
    font: 600 11px/1 var(--wv-mono);
    cursor: pointer;
}
.nev-tap-wv[data-wv-passive] .nev-tap-fx-pager .pg:hover { border-color: var(--wv-mocha); color: var(--wv-ink); }

/* ── Ledger open end (reconcile queue) ── */
.nev-tap-oe { display: flex; flex-direction: column; min-width: 0; }
.nev-tap-oe.has-open { box-shadow: inset 2px 0 0 rgba(230, 154, 76, .38); }
.nev-tap-oe-head {
    display: flex;
    align-items: baseline;
    gap: 8px;
    padding: 11px 14px;
    border-bottom: 1px solid var(--wv-hair, #3C2A21);
    background: rgba(230, 154, 76, .025);
}
.nev-tap-oe-head .hd {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-amber, #E69A4C);
    letter-spacing: .1em;
    text-transform: uppercase;
}
.nev-tap-oe-head .ct {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    font: 400 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-mocha, #8B7355);
}
.nev-tap-oe-open {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    border: 1px solid rgba(230, 154, 76, .55);
    border-radius: 9px;
    padding: 2px 7px;
    background: rgba(230, 154, 76, .08);
    color: var(--wv-amber, #E69A4C);
    box-shadow: 0 0 14px rgba(230, 154, 76, .08);
    font-weight: 700;
    letter-spacing: .07em;
    text-transform: uppercase;
}
.nev-tap-oe-open .dot {
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
    animation: wvDotPulse 1.5s ease-in-out infinite;
}
.nev-tap-oe-rest { white-space: nowrap; }
/* UX pass (2026-07-09): consecutive same-problem queue rows group under one
   problem header — the row itself carries only delta + note now. */
.nev-tap-oe-grp {
    padding: 8px 14px 3px;
    font: 600 9px/1 var(--wv-sans, sans-serif);
    color: var(--wv-bone, #EBE1D7);
    border-top: 1px solid var(--wv-hair, #3C2A21);
}
.nev-tap-oe-grp:first-child { border-top: 0; }
.nev-tap-oe-head { cursor: help; }

.nev-tap-oe-note {
    font: 400 11px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-warmmid, #B9A88F);
    padding: 6px 14px;
    border-bottom: 1px solid var(--wv-hair, #3C2A21);
}
.nev-tap-oe-asof {
    margin: 8px 14px 0;
    border: 1px dashed rgba(230, 154, 76, .5);
    border-radius: 2px;
    padding: 5px 7px;
    font: 600 10px/1.4 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-amber, #E69A4C);
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-oe-item { border-bottom: 1px solid var(--wv-hair, #3C2A21); }
/* 14a: each OPEN knot reads as a calm CARD; resolved/superseded stay
   flat one-line audit rows (the .done compression below). */
.nev-tap-oe-item:not(.done) {
    margin: 7px 10px;
    border: 1px solid var(--wv-seam, #5A453A);
    border-radius: 4px;
    background: rgba(19, 13, 8, .55);
}
.nev-tap-oe-item.done { opacity: .6; }
.nev-tap-oe-row {
    width: 100%;
    display: grid;
    grid-template-columns: 12px minmax(0, 1fr) auto;
    gap: 3px 8px;
    align-items: baseline;
    border: 0;
    background: transparent;
    padding: 10px 12px;
    min-height: 40px; /* 14a hit-target floor */
    cursor: pointer;
    text-align: left;
}
.nev-tap-oe-row:hover { background: rgba(230, 154, 76, .05); }
.nev-tap-oe-row.lane-lit {
    background: rgba(230, 154, 76, .07);
    box-shadow: inset 2px 0 0 rgba(191, 161, 98, .65);
}
.nev-tap-oe-row.sel { background: rgba(230, 154, 76, .07); box-shadow: inset 2px 0 0 var(--wv-amber, #E69A4C); }
.nev-tap-oe-row .dir { font: 600 9px/1 var(--wv-mono, ui-monospace, monospace); }
.nev-tap-oe-row .dir.worse { color: var(--wv-scarlet, #C44C4C); }
.nev-tap-oe-row .dir.better { color: var(--wv-teal, #4CC4B4); }
.nev-tap-oe-row .dir.neutral { color: var(--wv-brass, #BFA162); }
.nev-tap-oe-row .mid { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.nev-tap-oe-row .sum {
    /* 14a: the old→new delta is the payload — 15px ink. */
    font: 600 15px/1.25 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-ink, #FFF7EE);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.nev-tap-oe-row .kind {
    font: 600 9.5px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-mocha, #8B7355);
    border: 1px solid var(--wv-seam, #5A453A);
    border-radius: 2px;
    padding: 2px 5px;
    letter-spacing: .05em;
    flex: none;
}
.nev-tap-oe-row .st {
    /* 14a: state reads as a small outlined pill in its own color. */
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--wv-mocha, #8B7355);
    border: 1px solid currentColor;
    border-radius: 8px;
    padding: 2px 7px;
}
.nev-tap-oe-row .st.open { color: var(--wv-amber, #E69A4C); }
.nev-tap-oe-row .st.reconciling { color: var(--wv-amber, #E69A4C); }
.nev-tap-oe-row .st.accepted { color: var(--wv-teal, #4CC4B4); }
.nev-tap-oe-row .st.superseded { color: var(--wv-brass, #BFA162); }
.nev-tap-oe-row .sub {
    /* 14a: the one-line reason is readable — 12px warm mid. */
    grid-column: 2 / 4;
    font: 400 12px/1.4 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-warmmid, #B9A88F);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* 14a: resolved/superseded collapse to one quiet summary line. */
.nev-tap-oe-item.done .nev-tap-oe-row {
    padding: 6px 14px;
    min-height: 0;
}
.nev-tap-oe-item.done .nev-tap-oe-row .sum {
    font-size: 12px;
    color: var(--wv-warm, #F0E6D0);
}
.nev-tap-oe-item.done .nev-tap-oe-row .sub { display: none; }
.nev-tap-oe-sup {
    padding: 0 14px 9px 34px;
    font: 400 10px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-brass, #BFA162);
    opacity: .8;
}
/* §11d slice 2 — repeated-dump count badge on the collapsed row. */
.nev-tap-oe-dup {
    margin-left: 6px;
    padding: 1px 5px;
    border-radius: 8px;
    background: rgba(139, 115, 85, .22);
    color: var(--wv-mocha, #8B7355);
    font: 600 10px/1.4 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .02em;
}
/* §11d slice 2 — per-row "evidence" reveal for the raw payload. */
.nev-tap-oe-ev {
    display: inline-flex;
    align-items: center;
    margin: 0 0 4px 34px;
    padding: 3px 6px 3px 0;
    min-height: 40px; /* 14a hit-target floor — visual text stays small */
    border: 0;
    background: transparent;
    color: var(--wv-brass, #BFA162);
    font: 400 10px/1 var(--wv-mono, ui-monospace, monospace);
    text-decoration: underline;
    cursor: pointer;
}
.nev-tap-oe-ev:hover { color: var(--wv-bone, #EBE1D7); }
.nev-tap-oe-evbody {
    padding: 0 14px 9px 34px;
    font: 400 12px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-warmmid, #B9A88F);
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}
.nev-tap-oe-empty { padding: 12px 14px; border-bottom: 1px solid var(--wv-hair, #3C2A21); display: grid; gap: 6px; }
.nev-tap-oe-empty .hd {
    font: 600 10px/1.4 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-amber, #E69A4C);
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-oe-empty .tx { font: 400 11px/1.55 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); }
.nev-tap-oe-supp {
    padding: 9px 14px;
    border-bottom: 1px solid var(--wv-hair, #3C2A21);
    background: rgba(230, 154, 76, .03);
    font: 400 10px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-mocha, #8B7355);
}

/* Reconcile card — grounded delta detail, no canned draft. */
.nev-tap-oe-card {
    margin: 2px 14px 11px;
    border: 1px solid rgba(230, 154, 76, .4);
    border-radius: 3px;
    background: #0D0805;
    display: grid;
    gap: 8px;
    padding: 10px 11px;
}
.nev-tap-oe-card .hd { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.nev-tap-oe-card .tag {
    font: 700 9.5px/1 var(--wv-mono, ui-monospace, monospace);
    color: #120C06;
    background: var(--wv-brass, #BFA162);
    padding: 2px 5px;
    border-radius: 2px;
    letter-spacing: .05em;
    text-transform: uppercase;
}
.nev-tap-oe-card .sub { font: 400 12px/1.3 var(--wv-mono, ui-monospace, monospace); color: var(--wv-warmmid, #B9A88F); }
/* 14a: the delta prose is clinical reading — 15px sans, ink. */
.nev-tap-oe-card .tx { font: 400 15px/1.55 var(--wv-sans, sans-serif); color: var(--wv-ink, #FFF7EE); }
.nev-tap-oe-card .chips { display: flex; gap: 4px; flex-wrap: wrap; }
.nev-tap-oe-chip {
    border: 1px solid var(--wv-seam, #5A453A);
    color: var(--wv-warmmid, #B9A88F);
    padding: 3px 6px;
    font: 400 10px/1 var(--wv-mono, ui-monospace, monospace);
    border-radius: 2px;
    white-space: nowrap;
}
.nev-tap-oe-risk {
    font: 600 11px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-gold, #DAA520);
    border: 1px dashed rgba(218, 165, 32, .5);
    border-radius: 2px;
    padding: 4px 7px;
    letter-spacing: .04em;
}
.nev-tap-oe-actions { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.nev-tap-oe-btn {
    /* 14a: reconcile actions are real buttons — 40px hit box (clears the
       design's 38px and the global >=40px floor). */
    min-height: 40px;
    display: inline-flex;
    align-items: center;
    border-radius: 2px;
    padding: 0 14px;
    font: 700 10px/1 var(--wv-mono, ui-monospace, monospace);
    letter-spacing: .05em;
    cursor: pointer;
    text-transform: uppercase;
}
.nev-tap-oe-btn.accept {
    border: 1px solid rgba(76, 196, 180, .55);
    background: rgba(76, 196, 180, .15);
    color: #8FE8DB;
}
.nev-tap-oe-btn.accept.armed {
    border: 1px solid rgba(218, 165, 32, .7);
    background: rgba(218, 165, 32, .2);
    color: var(--wv-gold, #DAA520);
}
.nev-tap-oe-btn.reject,
.nev-tap-oe-btn.discard {
    border: 1px solid var(--wv-seam, #5A453A);
    background: transparent;
    color: var(--wv-warmmid, #B9A88F);
    font-weight: 600;
}
.nev-tap-oe-btn.discard { border-style: dashed; }
.nev-tap-oe-btn.reject:hover,
.nev-tap-oe-btn.discard:hover { color: var(--wv-bone, #EBE1D7); }
.nev-tap-oe-quiet,
.nev-tap-oe-card .ft {
    font: 400 10px/1.5 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-mocha, #8B7355);
    opacity: .8;
}

/* ── Two knot populations: ◇ server ledger knots (hollow diamonds,
   direction-colored border) vs ● solid patch discs. .sknot overrides the
   old amber-disc treatment for ledger states. ── */
.nev-tap-knot.nev-tap-wv-knot.sknot {
    width: 13px;
    height: 13px;
    border-radius: 2px;
    background: var(--wv-board, #110B07);
    color: var(--wv-bone, #EBE1D7);
    transform: translate(-50%, -50%) rotate(45deg);
    border: 1.5px solid var(--wv-brass, #BFA162);
    animation: none;
}
.nev-tap-knot.nev-tap-wv-knot.sknot.dir-worsening { border-color: var(--wv-scarlet, #C44C4C); }
.nev-tap-knot.nev-tap-wv-knot.sknot.dir-improving { border-color: var(--wv-teal, #4CC4B4); }
.nev-tap-knot.nev-tap-wv-knot.sknot.dir-neutral { border-color: var(--wv-brass, #BFA162); }
.nev-tap-knot.nev-tap-wv-knot.sknot .kg { transform: rotate(-45deg); font: 700 8px/1 var(--wv-mono, ui-monospace, monospace); }
.nev-tap-knot.nev-tap-wv-knot.sknot.pulse {
    width: 13px;
    height: 13px;
    animation: wvSknotPulse 1.6s ease-in-out infinite;
}
.nev-tap-knot.nev-tap-wv-knot.sknot.ledger_reconciling {
    box-shadow: 0 0 0 3px var(--wv-board), 0 0 0 4px rgba(230, 154, 76, .4);
    animation: wvSknotPulse 1.6s ease-in-out infinite;
}
/* REJECTED (the old carry-forward slot): dim hollow circle, ✕. */
.nev-tap-knot.nev-tap-wv-knot.sknot.ledger_carried_forward {
    transform: translate(-50%, -50%);
    border-radius: 50%;
    border: 1.5px solid rgba(139, 115, 85, .7);
    color: var(--wv-mocha, #8B7355);
    opacity: .6;
    animation: none;
}
.nev-tap-knot.nev-tap-wv-knot.sknot.ledger_carried_forward .kg { transform: none; }
.nev-tap-knot.nev-tap-wv-knot.sknot.selected {
    outline: 0;
    box-shadow: 0 0 0 3px var(--wv-board), 0 0 0 5px var(--wv-amber, #E69A4C);
}
@keyframes wvSknotPulse {
    0%, 100% { transform: translate(-50%, -50%) rotate(45deg) scale(1); opacity: 1; }
    50% { transform: translate(-50%, -50%) rotate(45deg) scale(1.15); opacity: .75; }
}

/* ── Source-ladder pill (data_quality) ── */
.nev-tap-wv-src {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-teal, #4CC4B4);
    border: 1px solid rgba(76, 196, 180, .4);
    border-radius: 3px;
    padding: 3px 6px;
    letter-spacing: .09em;
    text-transform: uppercase;
    cursor: help;
    white-space: nowrap;
}
.nev-tap-wv-src.degraded {
    color: var(--wv-amber, #E69A4C);
    border-color: rgba(230, 154, 76, .5);
}

/* Phases-unavailable row (tier ≥2 honesty). */
.nev-tap-wv-phases .band.thin { display: flex; }
.nev-tap-wv-phase.unavail {
    display: flex;
    align-items: center;
    padding: 5px 8px;
    margin: 4px 0;
    border-left: 2px solid rgba(107, 86, 74, .4);
    min-width: 0;
    cursor: help;
}
.nev-tap-wv-phase.unavail span {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: rgba(139, 115, 85, .85);
    letter-spacing: .09em;
    text-transform: uppercase;
}

/* ── Legend additions: 9-status header, opacity variants, populations ── */
.nev-tap-wv-lgd-hd {
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    color: var(--wv-mocha, #8B7355);
    letter-spacing: .09em;
    text-transform: uppercase;
    cursor: help;
}
.nev-tap-wv-lgd.t-new { color: var(--wv-sienna, #C75B39); }
.nev-tap-wv-lgd.o75 { opacity: .75; }
.nev-tap-wv-lgd-pop { font: 400 10px/1.4 var(--wv-mono, ui-monospace, monospace); color: var(--wv-mocha, #8B7355); }
.nev-tap-wv-lgd-pop .sk { color: var(--wv-amber, #E69A4C); }
.nev-tap-wv-lgd-pop .pk { color: var(--wv-teal, #4CC4B4); }

/* ── Lane flags + compile pin ── */
.nev-tap-wv-tag.flag { color: var(--wv-mocha, #8B7355); border: 1px solid rgba(139, 115, 85, .4); }
.nev-tap-wv-pin {
    color: var(--wv-brass, #BFA162);
    font: 600 10px/1 var(--wv-mono, ui-monospace, monospace);
    flex: none;
    cursor: help;
}

/* ── SLICE 2 Part B (2026-07-10): provisional course overlay ──────────
   Accepted-but-unfinalized decisions repaint lanes provisionally. The cue
   must never be color-alone: dashed outline + hollow ring + tooltip text. */
.nev-tap-wv-lane.is-provisional {
    outline: 1px dashed rgba(214, 178, 106, 0.55);
    outline-offset: -1px;
}
.nev-tap-wv-lane.is-provisional .nev-tap-wv-track {
    opacity: 0.75;
}
.nev-tap-wv-nowword.is-provisional {
    border-bottom: 1px dashed currentColor;
    font-style: italic;
}
.nev-tap-wv-nowword.is-provisional::before {
    content: "◌ ";
    opacity: 0.8;
}
.nev-tap-wv-provisional-mobile {
    display: none;
}
.nev-tap-wv-lgd.is-provisional {
    font-style: italic;
    opacity: 0.85;
}

/* R10d — one-line purpose beside the Tapestry/Ledger mode toggle. */
.nev-tap-vdesc {
    margin-left: 8px;
    font-family: var(--dr-font-mono, monospace);
    font-size: 9px;
    line-height: 1;
    color: var(--dr-mocha, #8B7355);
    align-self: center;
    white-space: nowrap;
}

/* ── RAG-as-thinking-surface: per-lane read-only evidence drawer (2026-07-13) ──
 * Inline push-down surface under a problem lane (same idiom as the knot popover).
 * Read-only reference: guidelines + this patient's data, cited, never in the note.
 * Dark Roast --dr-* tokens with hex fallbacks; flag-gated in JS (byte-identical OFF).
 */
.nev-tap-ev-btn {
    margin-left: 6px;
    padding: 0 6px;
    font: 9px/1.5 inherit;
    letter-spacing: .04em;
    text-transform: lowercase;
    color: var(--dr-brass, #BFA162);
    background: transparent;
    border: 1px solid rgba(191, 161, 98, .55);
    border-radius: 3px;
    cursor: pointer;
    vertical-align: middle;
}
.nev-tap-ev-btn:hover {
    color: var(--dr-brass, #BFA162);
    border-color: rgba(191, 161, 98, .70);
}
.nev-tap-ev-btn.is-open {
    color: var(--dr-crema, #FFF7EE);
    border-color: var(--dr-brass, #BFA162);
    background: rgba(191, 161, 98, .12);
}
.nev-tap-ev-drawer {
    margin: 2px 0 6px;
    padding: 0 12px 10px;
    border-left: 3px solid var(--dr-brass, #BFA162);
    background: rgba(139, 115, 85, .08);
    color: var(--dr-bone, #EBE1D7);
    font: 11px/1.5 inherit;
    /* 2026-08-11: guideline chunks made an UNBOUNDED drawer measure 20,287px
       inside the takeover's 30vh band — the head (and its close ×) scrolled
       unreachable and the content read as a two-line sliver. The drawer is
       reference material: bound it and let it scroll internally. */
    max-height: min(340px, 38vh);
    overflow-y: auto;
    /* The drawer renders INSIDE the horizontally-scrolled weave, whose track
       anchors to NOW — unpinned, its head (title + close ×) sits scrolled
       out of view and text starts mid-word. CSS sticky CANNOT pin it: the
       weave root is overflow-x:hidden, so sticky containment stops there —
       one level below the real scroller (.nev-column-body). Instead,
       _mountEvidenceDrawer sizes the drawer to the scrollport and keeps it
       pinned via a translateX scroll sync (scroll-space math also survives
       the census density zoom, which breaks vw/cqw formulas). */
    will-change: transform;
}
.nev-tap-ev-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 4px;
    /* Keep the title + close × reachable while the reference scrolls.
       Solid backing: the board texture would bleed through a sticky
       element with the drawer's 8%-alpha wash. */
    position: sticky;
    top: 0;
    padding: 8px 0 4px;
    background: var(--wv-base, #120C06);
    z-index: 1;
}
.nev-tap-ev-ttl {
    font-size: 11px;
    font-weight: 600;
    color: var(--dr-crema, #FFF7EE);
}
.nev-tap-ev-x {
    background: transparent;
    border: 0;
    color: var(--dr-mocha, #8B7355);
    font-size: 14px;
    line-height: 1;
    cursor: pointer;
}
.nev-tap-ev-x:hover { color: var(--dr-bone, #EBE1D7); }
.nev-tap-ev-note {
    color: var(--dr-mocha, #8B7355);
    font-style: italic;
}
.nev-tap-ev-sec { margin-top: 6px; }
.nev-tap-ev-seclbl {
    font-size: 9px;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--dr-mocha, #8B7355);
    margin-bottom: 2px;
}
.nev-tap-ev-list {
    margin: 0;
    padding: 0;
    list-style: none;
}
.nev-tap-ev-item {
    padding: 3px 0;
    border-top: 1px solid rgba(139, 115, 85, .18);
}
.nev-tap-ev-item:first-child { border-top: 0; }
.nev-tap-ev-txt { color: var(--dr-bone, #EBE1D7); }
.nev-tap-ev-disclosure {
    margin-top: 4px;
    padding-left: 8px;
    border-left: 1px solid rgba(191, 161, 98, .32);
}
.nev-tap-ev-disclosure > summary {
    color: var(--dr-brass, #BFA162);
    cursor: pointer;
    font-size: 10px;
    user-select: none;
}
.nev-tap-ev-disclosure > summary:hover,
.nev-tap-ev-disclosure[open] > summary {
    color: var(--dr-crema, #FFF7EE);
}
.nev-tap-ev-routing {
    display: grid;
    gap: 3px;
    margin-top: 4px;
}
.nev-tap-ev-action {
    justify-self: start;
    margin-top: 4px;
    min-height: 30px;
    padding: 4px 9px;
    border: 1px solid rgba(191, 161, 98, .55);
    border-radius: 3px;
    color: var(--dr-brass, #BFA162);
    background: transparent;
    font: 10px/1.3 inherit;
    cursor: pointer;
}
.nev-tap-ev-action:hover,
.nev-tap-ev-action:focus-visible {
    color: var(--dr-crema, #FFF7EE);
    border-color: var(--dr-brass, #BFA162);
}
.nev-tap-ev-action.primary {
    color: var(--dr-void, #0A0705);
    background: var(--dr-brass, #BFA162);
}
.nev-tap-ev-action:disabled { cursor: wait; opacity: .62; }
.nev-tap-ev-curbside {
    display: grid;
    gap: 6px;
    margin-top: 8px;
    padding: 9px;
    border: 1px solid rgba(191, 161, 98, .38);
    background: color-mix(in srgb, var(--wv-recess, #0E0905) 86%, transparent);
}
.nev-tap-ev-curbside.is-saved {
    border-color: rgba(76, 196, 180, .55);
    color: var(--dr-teal, #4CC4B4);
}
.nev-tap-ev-curbside label {
    display: grid;
    gap: 3px;
    color: var(--dr-bone, #EBE1D7);
    font-size: 10px;
}
.nev-tap-ev-curbside input,
.nev-tap-ev-curbside textarea {
    width: 100%;
    box-sizing: border-box;
    padding: 6px 7px;
    resize: vertical;
    border: 1px solid rgba(139, 115, 85, .55);
    border-radius: 3px;
    color: var(--dr-crema, #FFF7EE);
    background: var(--wv-base, #120C06);
    font: 11px/1.45 inherit;
}
.nev-tap-ev-curbside input:focus,
.nev-tap-ev-curbside textarea:focus {
    outline: 2px solid color-mix(in srgb, var(--dr-brass, #BFA162) 70%, transparent);
    outline-offset: 1px;
}
.nev-tap-ev-curbside-error { color: var(--dr-red, #C44C4C); }
.nev-tap-ev-src {
    margin-top: 1px;
    font-size: 9px;
    color: var(--dr-brass, #BFA162);
}
.nev-tap-ev-item.pt { display: flex; gap: 8px; align-items: baseline; }
.nev-tap-ev-kind {
    flex: 0 0 auto;
    font-size: 8px;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--dr-mocha, #8B7355);
    min-width: 30px;
}
.nev-tap-ev-disp { color: var(--dr-warm-white, #F0E6D0); }
.nev-tap-ev-foot {
    margin-top: 8px;
    font-size: 9px;
    font-style: italic;
    color: var(--dr-mocha, #8B7355);
}

/* ══════════════════════════════════════════════════════════════════
   14a visual-polish port (2026-07-14, design cf6a41fd card 14a) —
   NEW rules only; value lifts live inline above. Craft only: nothing
   here changes what data renders or when actions fire.
   ══════════════════════════════════════════════════════════════════ */

/* Item 3 — zebra rhythm. background-image only, so each tier's own
   background-color survives; the gradient tiers (cc/anchor) are excluded
   because a higher-specificity background-image would erase them.
   :where() keeps specificity flat so the worsening wash below can win
   purely by source order. */
.nev-tap-wv-board > .nev-tap-wv-lane:nth-child(even):where(:not(.tier-cc)):where(:not(.anchor)) {
    background-image: linear-gradient(
        rgba(255, 247, 238, .015), rgba(255, 247, 238, .015));
}
/* Item 3 — worsening row wash (after zebra, same specificity → wins). */
.nev-tap-wv-board > .nev-tap-wv-lane[data-status="worsening"]:where(:not(.tier-cc)):where(:not(.anchor)) {
    background-image: linear-gradient(
        rgba(196, 76, 76, .05), rgba(196, 76, 76, .05));
}

/* Item 3 — 3px status LEFT-CAP on the lane. The lane's own border-left
   still encodes INCLUSION POLICY (held fixed), so the status cap rides
   the label cell's inset edge instead — same mapping as WEAVE_TONE in
   episode-tapestry-column.js (no new interpretation, no data change).
   Resolved/context stay capless: they recede by design. */
.nev-tap-wv-lane[data-status="worsening"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="reopened"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="new"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="unstable"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="watch"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="conflict"] .nev-tap-wv-label {
    box-shadow: inset 3px 0 0 var(--wv-scarlet, #C44C4C);
}
.nev-tap-wv-lane[data-status="active"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="on_hold"] .nev-tap-wv-label {
    box-shadow: inset 3px 0 0 var(--wv-amber, #E69A4C);
}
.nev-tap-wv-lane[data-status="improving"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="controlled"] .nev-tap-wv-label {
    box-shadow: inset 3px 0 0 var(--wv-teal, #4CC4B4);
}
.nev-tap-wv-lane[data-status="stable"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="chronic_stable"] .nev-tap-wv-label {
    box-shadow: inset 3px 0 0 var(--wv-olive, #879A39);
}
.nev-tap-wv-lane[data-status="monitor"] .nev-tap-wv-label,
.nev-tap-wv-lane[data-status="monitoring"] .nev-tap-wv-label {
    box-shadow: inset 3px 0 0 var(--wv-brass, #BFA162);
}

/* Course hospital-problem contract v2 (2026-07-15). These selectors are
   emitted only for contract_version=2, keeping the v1 DOM and styling dark. */
.nev-tap-course-warnings {
    display: grid;
    gap: 4px;
    padding: 6px 10px;
    border-block: 1px solid rgba(230, 154, 76, .18);
    background: rgba(38, 25, 15, .72);
}
.nev-tap-course-warning {
    display: grid;
    grid-template-columns: 18px minmax(0, 1fr) auto;
    align-items: center;
    gap: 7px;
    min-height: 32px;
    padding: 5px 8px;
    border: 1px solid rgba(230, 154, 76, .25);
    border-radius: 4px;
    color: var(--dr-bone, #EBE1D7);
    font: 500 11px/1.35 var(--wv-sans, system-ui, sans-serif);
}
.nev-tap-course-warning.danger {
    border-color: rgba(196, 76, 76, .38);
    background: rgba(196, 76, 76, .08);
}
.nev-tap-course-warning.warning { background: rgba(230, 154, 76, .06); }
.nev-tap-course-warning .icon {
    display: grid;
    place-items: center;
    width: 17px;
    height: 17px;
    border: 1px solid currentColor;
    border-radius: 50%;
    color: var(--dr-amber, #E69A4C);
    font: 700 10px/1 var(--wv-mono, ui-monospace, monospace);
}
.nev-tap-course-warning.danger .icon { color: var(--dr-scarlet, #C44C4C); }
.nev-tap-course-retry {
    border: 1px solid rgba(230, 154, 76, .45);
    border-radius: 3px;
    padding: 4px 8px;
    background: rgba(230, 154, 76, .12);
    color: var(--dr-crema, #FFF7EE);
    font: 600 10px/1.2 var(--wv-sans, system-ui, sans-serif);
    cursor: pointer;
}
.nev-tap-course-retry:disabled { opacity: .55; cursor: wait; }

.nev-tap-course-tier { border-top: 1px solid rgba(139, 115, 85, .18); }
.nev-tap-course-tier-head {
    display: flex;
    align-items: center;
    gap: 7px;
    width: 100%;
    min-height: 30px;
    padding: 5px 10px;
    border: 0;
    background: rgba(139, 115, 85, .045);
    color: var(--dr-bone, #EBE1D7);
    text-align: left;
    font: 650 10px/1.2 var(--wv-sans, system-ui, sans-serif);
    letter-spacing: .055em;
    text-transform: uppercase;
}
button.nev-tap-course-tier-head { cursor: pointer; }
button.nev-tap-course-tier-head:hover { background: rgba(230, 154, 76, .07); }
.nev-tap-course-tier-head.static { color: var(--dr-crema, #FFF7EE); }
.nev-tap-course-tier-head .cv { width: 10px; color: var(--dr-mocha, #8B7355); }
.nev-tap-course-tier-head .count {
    margin-left: auto;
    min-width: 20px;
    color: var(--dr-brass, #BFA162);
    text-align: right;
    font-family: var(--wv-mono, ui-monospace, monospace);
}
.nev-tap-course-tier.background .nev-tap-course-tier-head,
.nev-tap-course-tier.resolved .nev-tap-course-tier-head { color: var(--dr-mocha, #8B7355); }
.nev-tap-course-tier.resolved .nev-tap-course-tier-body { opacity: .82; }

.nev-tap-course-badges {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 3px;
    margin-left: 4px;
}
.nev-tap-course-badge {
    border: 1px solid rgba(191, 161, 98, .25);
    border-radius: 999px;
    padding: 1px 4px;
    color: var(--dr-mocha, #8B7355);
    font: 600 8px/1.25 var(--wv-mono, ui-monospace, monospace);
    white-space: nowrap;
}
.nev-tap-course-badge.syncing { color: var(--dr-amber, #E69A4C); }
.nev-tap-course-badge.failed,
.nev-tap-course-badge.unavailable,
.nev-tap-course-badge.ambiguous { color: var(--dr-scarlet, #C44C4C); }
.nev-tap-course-badge.degraded { color: var(--dr-amber, #E69A4C); }

.nev-tap-course-detail {
    display: grid;
    gap: 4px;
    margin: 7px 0;
    padding: 7px 8px;
    border: 1px solid rgba(139, 115, 85, .2);
    background: rgba(139, 115, 85, .035);
    color: var(--dr-bone, #EBE1D7);
    font: 10px/1.35 var(--wv-sans, system-ui, sans-serif);
}
.nev-tap-course-detail > div { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: 7px; }
.nev-tap-course-detail .key {
    color: var(--dr-mocha, #8B7355);
    font: 600 9px/1.35 var(--wv-mono, ui-monospace, monospace);
    text-transform: uppercase;
}
.nev-tap-course-detail ul { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; }
.nev-tap-course-detail li { display: flex; justify-content: space-between; gap: 8px; }
.nev-tap-course-detail time { color: var(--dr-brass, #BFA162); white-space: nowrap; }

.nev-tap-course-exclusions {
    display: flex;
    flex-wrap: wrap;
    gap: 5px 12px;
    padding: 6px 10px;
    border-top: 1px solid rgba(139, 115, 85, .16);
    color: var(--dr-mocha, #8B7355);
    font: 9px/1.35 var(--wv-mono, ui-monospace, monospace);
}
.nev-tap-course-exclusions .title {
    color: var(--dr-brass, #BFA162);
    text-transform: uppercase;
    letter-spacing: .04em;
}
.nev-tap-course-exclusions b { color: var(--dr-bone, #EBE1D7); }

.nev-tap-wv-compile.is-blocked,
.nev-tap-wv-compile:disabled { opacity: .45; cursor: not-allowed; }
.nev-tap-lg-section.course-tier {
    width: 100%;
    border: 0;
    border-top: 1px solid rgba(139, 115, 85, .2);
    background: transparent;
    color: var(--dr-mocha, #8B7355);
    text-align: left;
    cursor: pointer;
}

/* ── Fragment→lane cues (WS-D2 2026-07-18) ──────────────────────────
   Count badge = Today's Update entries routed to this lane (Tier-1
   bridge; exact-match join, absent on any key miss). .is-fresh dot =
   an entry landed within the last 15 min. Pulse (.is-mapped) and hover
   spotlight (.wv-lit) reuse existing treatments. */
.nev-tap-frag-badge {
    display: inline-block;
    margin-left: 5px;
    padding: 0 5px;
    border-radius: 8px;
    border: 1px solid rgba(139, 115, 85, .45);
    background: rgba(139, 115, 85, .16);
    color: var(--dr-brass, #BFA162);
    font: 600 9px/1.5 var(--wv-mono, ui-monospace, monospace);
    vertical-align: 1px;
}
.nev-tap-frag-badge.is-fresh {
    position: relative;
    border-color: var(--dr-brass, #BFA162);
}
.nev-tap-frag-badge.is-fresh::after {
    content: '';
    position: absolute;
    top: -2px;
    right: -2px;
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: var(--dr-teal, #4FA8A0);
}

/* Illuminated Loom §K: the trend line casts stacked contour echoes — terrain. */
.nev-tap-wv-nowspark polyline {
    filter: drop-shadow(0 2px 0 color-mix(in srgb, currentColor 26%, transparent))
            drop-shadow(0 3px 0 color-mix(in srgb, currentColor 12%, transparent));
}
/* Illuminated Loom §M: the board settles like ink into paper on render. */
@keyframes wvInkSettle { from { opacity: .88; filter: saturate(.9); } to { opacity: 1; filter: none; } }
.nev-tap-wv-board { animation: wvInkSettle .45s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
    .nev-tap-wv-board, .nev-tap-wv-todayband { animation: none; }
}

/* NOW-line contrast fix (2026-07-30): the shared SOL now-indicator paints
   var(--sol-accent-primary) = #3b82f6. On the tapestry's near-black void that is
   ~2:1 — below the 3:1 UI-component floor (WCAG 1.4.11) and *less* legible than
   the axis labels (16.5:1) it should dominate. The single most important stroke
   on the surface was the least visible. Re-voice NOW as the live/teal thread,
   scoped to the tapestry surface only, so generic SOL timelines elsewhere keep
   their blue accent.
   Pinned to the Illuminated-Loom #4CC4B4 (NOT var(--dr-teal)): the roast ladder
   redefines --dr-teal to #00B5B5 per account theme, which would dim NOW to ~4.9:1
   and let the account theme re-voice the flagship surface's most important stroke.
   #4CC4B4 on void rgb(0,11,29) ≈ 9:1 (line passes 1.4.11; label text passes 4.5:1).
   The label is a filled chip — fill teal, ink with the void. */
.tapestry-primary-active .sol-now-line {
    background: #4CC4B4;
    box-shadow: 0 0 8px #4CC4B4, 0 0 20px rgba(76, 196, 180, 0.35);
}
.tapestry-primary-active .sol-now-label {
    background: #4CC4B4;
    color: #0D0805;
    font-weight: 700;
}

/* ── DOCTOR FACE (2026-09-24, owner: "no one can understand what the app is
   trying to communicate nor stand to physically look at it") ─────────────
   One status encoding per lane: ribbon colour + the NOW word. Everything
   below is a system-internal chip that was riding the doctor's row:
   scorer state, projection sync, data-quality ladder, keyboard hints. The
   DOM still renders them (tests, tooltips, inspector); the row does not
   show them. Rollback = delete this block. */
.nev-tap-wv .nev-tap-wv-tag.flag,          /* "unscored" honesty chip */
.nev-tap-wv .nev-tap-course-badges,        /* sync failed / physician source only / ... */
.nev-tap-wv .nev-tap-wv-ccbadge,           /* "top": the anchor is already tallest + amber edge */
.nev-tap-wv .nev-tap-wv-pin,               /* compile-pinned glyph */
.nev-tap-wv .nev-tap-wv-trajlbl,           /* "traj" label */
.nev-tap-wv .nev-tap-wv-st,                /* line-2 status chip, duplicates the NOW word */
.nev-tap-wv .nev-tap-wv-src,               /* "daily states / 2 day files / tier 1 / v69" */
.nev-tap-wv .nev-tap-wv-phases:has(.band.thin) { /* "phases unavailable, thin transition history" */
    display: none;
}
/* Type floor: nothing the doctor must read under 12px, no all-caps mono. */
.nev-tap-wv .nev-tap-wv-nowword {
    font: 600 12.5px/1.2 var(--wv-sans);
    letter-spacing: 0;
    text-transform: none;
    white-space: normal;
}
.nev-tap-wv .nev-tap-wv-nowword.is-carried { opacity: .78; }
.nev-tap-wv .nev-tap-wv-nowword .asof {
    font: 400 11.5px/1.2 var(--wv-mono);
    color: var(--wv-warmmid, #B9A88F);
}
.nev-tap-wv .nev-tap-wv-cat { font-size: 11.5px; letter-spacing: 0; }
.nev-tap-wv .nev-tap-wv-tag { font: 600 11px/1 var(--wv-sans); text-transform: none; letter-spacing: 0; }
.nev-tap-wv .nev-tap-wv-nowcue .cue-text { font-size: 12px; }
/* The clinical-reference button shows on the row you are on, not on all 20. */
.nev-tap-wv .nev-tap-wv-lane:not(:hover):not(:focus-within) .nev-tap-ev-btn:not(.is-open) {
    opacity: 0;
}
.nev-tap-wv .nev-tap-ev-btn { transition: opacity .12s ease; }
