/* Themed to the estate dark shell (design lead, 2026-08-02). The original light
 * palette was authored against a standalone harness; inside the real app it read
 * as a white sheet pasted onto a dark page. Colours now come from the shell's own
 * custom properties, with literal fallbacks so the panel still renders standalone. */
/* ═══════════════════════════════════════════════════════════════════════════════════════════════
 * Contract Review library / acceptance UI. A SEPARATE STYLESHEET so styles.css — owned by another
 * agent and being edited concurrently — is untouched. Every selector is namespaced `cru-`.
 *
 * The colour decisions are the doctrine, not decoration:
 *   .cru-acc-direct    green   — a human judged THIS clause on THIS contract.
 *   .cru-acc-inherited AMBER   — a human judged a SIMILAR clause on a DIFFERENT contract. It is
 *                                deliberately NOT green. An inherited acceptance must never look
 *                                like a fresh one, and it must never look like "resolved".
 *   .cru-risk-failed   red     — the analysis did not run. Loud, per fail-closed/surface-exclusions.
 * Severity colouring on a finding is driven only by its riskLevel; acceptance never restyles it.
 * ═══════════════════════════════════════════════════════════════════════════════════════════════ */

/* The module sets its OWN colour and surface rather than inheriting the shell's. Found by
 * screenshotting it inside the real app page: the shell supplies a light `color` for its own
 * background, my panels supply light backgrounds, and the result was near-white text on white —
 * present in the DOM, unreadable on screen. A component that renders legal findings must not depend
 * on what the surrounding theme happens to be. */
.cru { display: block; color: var(--text, #eef4fb); background: var(--panel, rgba(18,27,37,.96)); padding: .2rem; }
.cru h2, .cru h3, .cru p, .cru td, .cru th, .cru li, .cru blockquote, .cru summary, .cru span, .cru strong, .cru em {
  color: inherit;
}
.cru-head h2 { margin: 0 0 .25rem; font-size: 1.15rem; color: var(--text, #eef4fb); }
.cru-lede { margin: 0 0 .9rem; color: var(--muted, #a6b7ca); font-size: .9rem; max-width: 60rem; }
.cru-back { margin: 0 0 .6rem; }
.cru-actions { margin: .5rem 0 0; }

.cru-btn {
  font: inherit; font-size: .85rem; padding: .35rem .7rem; border-radius: .35rem;
  border: 1px solid var(--panel-border, #2a394a); background: var(--panel, rgba(18,27,37,.96)); color: var(--text, #eef4fb); cursor: pointer;
}
.cru-btn:hover { background: var(--bg-soft, #0d1620); }
.cru-btn:disabled { opacity: .55; cursor: default; }
.cru-primary { background: #1f4e79; border-color: #1f4e79; color: #fff; }
.cru-primary:hover { background: #17395a; }
.cru-link { background: none; border: none; color: #1f4e79; cursor: pointer; font: inherit; padding: 0; text-decoration: underline; }

.cru-table { width: 100%; border-collapse: collapse; font-size: .88rem; }
.cru-table th { text-align: left; font-weight: 600; color: var(--muted, #a6b7ca); border-bottom: 2px solid #e2e7ee; padding: .4rem .5rem; }
.cru-table td { border-bottom: 1px solid #eef1f5; padding: .5rem; vertical-align: top; }
.cru-row { cursor: pointer; }
.cru-row:hover { background: #f7f9fc; }
.cru-row-failed { background: #fff7f7; }
.cru-c-file { font-weight: 600; }
.cru-sub { display: block; font-weight: 400; color: #7a8494; font-size: .8rem; }
.cru-c-when, .cru-c-who { color: var(--muted, #a6b7ca); white-space: nowrap; }
.cru-unknown { color: #9aa3b1; font-style: italic; }
.cru-acc-count { display: inline-block; min-width: 1.4rem; text-align: center; background: #e6f3ea; color: #1d6b39; border-radius: .8rem; padding: 0 .4rem; font-weight: 600; }

.cru-risk { display: inline-block; padding: .1rem .5rem; border-radius: .8rem; font-size: .78rem; font-weight: 700; white-space: nowrap; }
/* Dark-theme severity pills: pale pastels read as washed-out on the shell's dark
   panel, so each is a translucent tint of its own hue with a light foreground. */
.cru-risk-high { background: rgba(190, 40, 40, .22); color: #ff9d9d; border: 1px solid rgba(190,40,40,.45); }
.cru-risk-medium { background: rgba(190, 130, 20, .20); color: #ffc978; border: 1px solid rgba(190,130,20,.45); }
.cru-risk-low { background: rgba(40, 150, 80, .20); color: #86e0a6; border: 1px solid rgba(40,150,80,.45); }
.cru-risk-unknown { background: rgba(120,140,165,.18); color: var(--muted, #a6b7ca); border: 1px solid rgba(120,140,165,.38); }
.cru-risk-failed { background: #a11c1c; color: #fff; }

.cru-counts { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin: .3rem 0 .8rem; }
.cru-count { font-size: .82rem; color: var(--muted, #a6b7ca); background: var(--bg-soft, #0d1620); border-radius: .8rem; padding: .1rem .6rem; }
.cru-count-direct { background: #e6f3ea; color: #1d6b39; }
.cru-count-inherited { background: #fdf1dd; color: #8a5a08; }

.cru-ledger-note { font-size: .84rem; color: #6a5320; background: #fdf9ef; border-left: 3px solid #d9a441; padding: .5rem .7rem; margin: 0 0 .8rem; }
.cru-ledger-note.cru-off { color: var(--muted, #a6b7ca); background: var(--bg-soft, #0d1620); border-left-color: #9aa3b1; }

.cru-summary { margin: 0 0 1rem; }
.cru-summary h3 { font-size: .95rem; margin: 0 0 .3rem; }
.cru-summary p { margin: 0; font-size: .9rem; line-height: 1.5; }

.cru-findings { display: grid; gap: .8rem; }
.cru-finding { border: 1px solid #e2e7ee; border-left: 4px solid var(--panel-border, #2a394a); border-radius: .4rem; padding: .7rem .85rem; background: var(--panel, rgba(18,27,37,.96)); }
.cru-sev-high { border-left-color: #c23b3b; }
.cru-sev-medium { border-left-color: #d9a441; }
.cru-sev-low { border-left-color: #4d9464; }
.cru-f-head { display: flex; flex-wrap: wrap; gap: .5rem; align-items: baseline; margin-bottom: .4rem; }
.cru-f-num { font-weight: 700; color: #7a8494; }
.cru-f-risk { font-size: .72rem; font-weight: 700; padding: .05rem .45rem; border-radius: .8rem; text-transform: uppercase; }
.cru-badge-high { background: #fde8e8; color: #a11c1c; }
.cru-badge-medium { background: #fdf3e0; color: #8a5a08; }
.cru-badge-low { background: #e8f2ea; color: #1d6b39; }
.cru-f-cat { font-size: .82rem; color: var(--text, #eef4fb); font-weight: 600; }
.cru-f-sec { font-size: .8rem; color: #7a8494; }
.cru-f-quote { margin: .3rem 0 .5rem; padding: .4rem .7rem; border-left: 3px solid #e2e7ee; background: var(--bg-soft, #0d1620); font-size: .88rem; line-height: 1.45; }
.cru-f-row { margin: .25rem 0; font-size: .86rem; line-height: 1.45; }
.cru-f-k { display: block; font-weight: 600; color: var(--muted, #a6b7ca); font-size: .78rem; text-transform: uppercase; letter-spacing: .02em; }

.cru-acc { margin-top: .6rem; padding: .55rem .7rem; border-radius: .35rem; font-size: .85rem; }
.cru-acc-state { display: block; font-weight: 700; margin-bottom: .25rem; }
.cru-acc-meta, .cru-acc-note, .cru-acc-warn { margin: .2rem 0; line-height: 1.45; }
.cru-acc-note { font-style: italic; }
.cru-acc-none { background: #f7f9fc; color: var(--muted, #a6b7ca); }
.cru-acc-direct { background: #eef7f1; border: 1px solid #cfe6d8; color: #1d5c33; }

/* AMBER, LOUD, AND EXPANDED. Never green, never collapsed, never quiet. */
.cru-acc-inherited { background: #fdf7ea; border: 2px solid #d9a441; color: #6a5320; }
.cru-acc-inherited .cru-acc-state { color: #8a5a08; letter-spacing: .01em; }
.cru-acc-warn { background: #fbf0d6; border-radius: .25rem; padding: .35rem .5rem; }
.cru-acc-superseded { border: 1px solid #d9a441; font-weight: 600; }
.cru-acc-src { margin: .4rem 0; }
.cru-acc-srclabel { display: block; font-size: .76rem; font-weight: 700; text-transform: uppercase; letter-spacing: .02em; color: #8a5a08; }
.cru-acc-src blockquote { margin: .2rem 0 0; padding: .4rem .7rem; background: var(--panel, rgba(18,27,37,.96)); border-left: 3px solid #d9a441; font-size: .86rem; line-height: 1.45; color: #3d3418; }
.cru-acc-actions { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .5rem; }

.cru-hist { margin-top: .4rem; }
.cru-hist summary { cursor: pointer; font-size: .8rem; color: var(--muted, #a6b7ca); }
.cru-hist ul { margin: .3rem 0 0; padding-left: 1.1rem; font-size: .8rem; }
.cru-hist-ev { display: inline-block; font-weight: 700; text-transform: uppercase; font-size: .7rem; padding: 0 .35rem; border-radius: .6rem; }
.cru-hist-accept { background: #e6f3ea; color: #1d6b39; }
.cru-hist-withdraw { background: #fde8e8; color: #a11c1c; }
.cru-hist-note { color: #7a8494; font-style: italic; }

.cru-ledger .cru-led-clause blockquote { margin: .2rem 0 0; padding: .3rem .5rem; background: var(--bg-soft, #0d1620); border-left: 2px solid #e2e7ee; font-size: .82rem; }
.cru-ledger td { font-size: .82rem; }

.cru-warn { background: #fdf9ef; border-left: 3px solid #d9a441; padding: .5rem .7rem; margin: 0 0 .8rem; font-size: .84rem; color: #6a5320; }
.cru-warn ul { margin: .3rem 0 0; padding-left: 1.1rem; }
.cru-error { background: #fdf0f0; border-left: 3px solid #c23b3b; padding: .7rem .9rem; color: #7a1f1f; font-size: .9rem; }
.cru-error p { margin: .3rem 0 0; }
.cru-failopen { background: #fdf0f0; border: 2px solid #c23b3b; border-radius: .4rem; padding: .8rem 1rem; color: #7a1f1f; }
.cru-failopen h3 { margin: 0 0 .3rem; font-size: 1rem; }
.cru-empty { color: #7a8494; font-style: italic; }
.cru-footlink { margin-top: 1rem; }

@media (max-width: 720px) {
  .cru-table thead { display: none; }
  .cru-table, .cru-table tbody, .cru-table tr, .cru-table td { display: block; width: 100%; }
  .cru-table tr { border-bottom: 1px solid #e2e7ee; padding: .4rem 0; }
  .cru-table td { border: none; padding: .15rem .2rem; }
}

/* Explicit colours re-asserted AFTER the blanket `color: inherit` above, so the deliberate ones win.
   Listed exhaustively from the rules that set a colour, not from memory. */
.cru-lede, .cru-c-when, .cru-c-who, .cru-count, .cru-f-sec, .cru-hist summary { color: var(--muted, #a6b7ca); }
.cru-unknown, .cru-empty, .cru-sub, .cru-f-num, .cru-hist-note { color: #7a8494; }
.cru-f-k { color: var(--muted, #a6b7ca); }
.cru-f-cat { color: var(--text, #eef4fb); }
.cru-f-quote { color: var(--text, #eef4fb); }
.cru-acc-none { color: var(--muted, #a6b7ca); }
.cru-acc-direct, .cru-acc-direct .cru-acc-state { color: #1d5c33; }
.cru-acc-inherited { color: #6a5320; }
.cru-acc-inherited .cru-acc-state { color: #8a5a08; }
.cru-acc-src blockquote { color: #3d3418; }
.cru-acc-srclabel { color: #8a5a08; }
.cru-count-direct { color: #1d6b39; }
.cru-count-inherited { color: #8a5a08; }
.cru-ledger-note { color: #6a5320; }
.cru-ledger-note.cru-off { color: var(--muted, #a6b7ca); }
.cru-warn { color: #6a5320; }
.cru-error, .cru-failopen { color: #7a1f1f; }
.cru-risk-high, .cru-badge-high { color: #a11c1c; }
.cru-risk-medium, .cru-badge-medium { color: #8a5a08; }
.cru-risk-low, .cru-badge-low { color: #1d6b39; }
.cru-risk-unknown { color: var(--muted, #a6b7ca); }
.cru-risk-failed { color: #fff; }
.cru-hist-accept { color: #1d6b39; }
.cru-hist-withdraw { color: #a11c1c; }
.cru-acc-count { color: #1d6b39; }
.cru-btn { color: var(--text, #eef4fb); }
.cru-primary { color: #fff; }
.cru-link { color: #1f4e79; }
.cru-table th { color: var(--muted, #a6b7ca); }

/* ── LEDGER SUGGESTION (default mode) ────────────────────────────────────────────────────────────
 * BLUE, and deliberately NOT the amber used for an auto-categorised acceptance and NOT the green
 * used for a human one. Three states, three appearances. Design lead ruling 2026-08-02: a match is
 * a suggestion to review, never a pre-categorisation, so it must not borrow the visual language of
 * a decision. It is also NOT the loudest thing on the card — the finding's own severity still is. */
.cru-sug {
  margin-top: .5rem; padding: .55rem .7rem; border-radius: .35rem; font-size: .85rem;
  background: #eef4fb; border: 1px solid #a9c6e6; color: #1f3f63;
}
.cru-sug-state { display: block; font-weight: 700; margin-bottom: .25rem; color: #1f4e79; }
.cru-sug-lead, .cru-sug-note { margin: .2rem 0; line-height: 1.45; color: #1f3f63; }
.cru-sug-note { color: #3c5877; }
.cru-sug-withdrawn { background: #e3edf8; border-radius: .25rem; padding: .35rem .5rem; font-weight: 600; }
.cru-sug .cru-acc-srclabel { color: #1f4e79; }
.cru-sug .cru-acc-src blockquote { background: var(--panel, rgba(18,27,37,.96)); border-left: 3px solid #a9c6e6; color: #1f3f63; }
.cru-sug-flag {
  display: inline-block; margin-left: .4rem; font-weight: 700; font-size: .72rem;
  text-transform: uppercase; letter-spacing: .02em;
  background: #dbe8f6; color: #1f4e79; border-radius: .8rem; padding: .05rem .5rem;
}
.cru-count-suggested { background: #dbe8f6; color: #1f4e79; }
.cru-ledger-note.cru-sug-tone { background: #f2f7fc; border-left-color: #4a7fb5; color: #1f3f63; }
.cru-ledger-note.cru-armed { background: #fdf1dd; border-left-color: #c23b3b; color: #7a1f1f; }
/* A suggested finding gets a marker on the card edge, so it is findable by scanning without the
   card itself reading as resolved. */
.cru-finding[data-suggested="1"] { box-shadow: inset 3px 0 0 0 #a9c6e6; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════════
 * DARK-SHELL CORRECTIONS (Tyler, 2026-08-02: "can't read the accepted bubble because it's white")
 *
 * ROOT CAUSE, not three separate paint bugs. The blanket rule near the top —
 *   `.cru h2, .cru p, .cru td, .cru span, .cru strong, … { color: inherit; }`
 * has specificity 0,1,1 (class + element). Every pill's own colour rule (`.cru-count-direct`,
 * `.cru-acc-count`, `.cru-badge-low`, …) is a single class, 0,1,0 — so the blanket rule WINS no
 * matter where it sits in the file. Those pills therefore inherited the shell's LIGHT text while
 * keeping their authored LIGHT background: present in the DOM, invisible on screen.
 *
 * Two things are corrected together, because fixing only one leaves it unreadable the other way:
 *   1. every remaining light surface becomes a translucent tint of its own hue, matching the
 *      severity pills that were already converted, and
 *   2. each selector is scoped `.cru .cru-x` (0,2,0) so it outranks the blanket rule instead of
 *      losing to it. Raising specificity without darkening the surface would just swap which half
 *      of the contrast problem you get.
 *
 * The doctrine is unchanged and deliberately still legible in the dark palette: direct acceptance
 * GREEN, inherited acceptance AMBER and louder, failure RED.
 * ═══════════════════════════════════════════════════════════════════════════════════════════════ */

/* counts + tallies */
.cru .cru-acc-count      { background: rgba(40,150,80,.20); color: #86e0a6; }
.cru .cru-count-direct   { background: rgba(40,150,80,.20); color: #86e0a6; }
.cru .cru-count-inherited{ background: rgba(190,130,20,.20); color: #ffc978; }

/* per-finding severity badges */
.cru .cru-badge-high     { background: rgba(190,40,40,.22); color: #ff9d9d; }
.cru .cru-badge-medium   { background: rgba(190,130,20,.20); color: #ffc978; }
.cru .cru-badge-low      { background: rgba(40,150,80,.20); color: #86e0a6; }

/* THE SUGGESTION FAMILY, missed when this block was written (Tyler
   2026-08-28: "this white pill needs fixed can't read"). Same root cause as
   everything above it: these were added after the correction and kept a light
   background while the blanket `.cru span { color: inherit }` rule handed them
   the shell's light text. Blue is the suggestion hue and stays blue — a
   suggestion must not read as an acceptance (green) or a risk (red). */
.cru .cru-count-suggested { background: rgba(60,120,200,.22); color: #9dc4f0; }
.cru .cru-sug            { background: rgba(60,120,200,.14); color: #cfe1f5; }
.cru .cru-sug-flag       { background: rgba(60,120,200,.22); color: #9dc4f0; }
.cru .cru-sug-withdrawn  { background: rgba(60,120,200,.12); color: var(--muted, #a6b7ca); }

/* decision-history chips */
.cru .cru-hist-accept    { background: rgba(40,150,80,.20); color: #86e0a6; }
.cru .cru-hist-withdraw  { background: rgba(190,40,40,.22); color: #ff9d9d; }
.cru .cru-hist-note      { color: var(--muted, #a6b7ca); }

/* the acceptance panel — the "white area" */
.cru .cru-acc-none       { background: var(--bg-soft, #0d1620); color: var(--muted, #a6b7ca); }
.cru .cru-acc-direct     { background: rgba(40,150,80,.12); border: 1px solid rgba(40,150,80,.45); color: var(--text, #eef4fb); }
.cru .cru-acc-direct .cru-acc-state { color: #86e0a6; }
.cru .cru-acc-inherited  { background: rgba(190,130,20,.12); border: 2px solid rgba(190,130,20,.55); color: var(--text, #eef4fb); }
.cru .cru-acc-inherited .cru-acc-state,
.cru .cru-acc-srclabel   { color: #ffc978; }
.cru .cru-acc-warn       { background: rgba(190,130,20,.18); color: var(--text, #eef4fb); }
.cru .cru-acc-src blockquote { background: var(--bg-soft, #0d1620); border-left-color: rgba(190,130,20,.65); color: var(--text, #eef4fb); }

/* notices */
.cru .cru-ledger-note    { background: rgba(190,130,20,.12); border-left-color: rgba(190,130,20,.65); color: var(--text, #eef4fb); }
.cru .cru-warn           { background: rgba(190,130,20,.12); border-left-color: rgba(190,130,20,.65); color: var(--text, #eef4fb); }
.cru .cru-error,
.cru .cru-failopen       { background: rgba(190,40,40,.14); border-color: rgba(190,40,40,.55); color: #ffc9c9; }

/* table + row surfaces */
.cru .cru-table th       { border-bottom: 2px solid var(--panel-border, #2a394a); }
.cru .cru-table td       { border-bottom: 1px solid var(--panel-border, #2a394a); }
.cru .cru-row:hover      { background: var(--bg-soft, #0d1620); }
.cru .cru-row-failed     { background: rgba(190,40,40,.10); }
.cru .cru-finding        { border-color: var(--panel-border, #2a394a); }
.cru .cru-f-quote        { border-left-color: var(--panel-border, #2a394a); }
.cru .cru-ledger .cru-led-clause blockquote { border-left-color: var(--panel-border, #2a394a); }

/* muted text that was picked for a white page */
.cru .cru-f-num, .cru .cru-f-sec, .cru .cru-sub,
.cru .cru-unknown, .cru .cru-empty { color: var(--muted, #a6b7ca); }

/* ── IN-APP DIALOG (replaces window.prompt / window.alert) ─────────────────────────────────────── */
.cru-modal-wrap {
  position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center;
  background: rgba(4, 8, 13, .66); padding: 1rem;
}
.cru-modal {
  width: min(34rem, 100%); background: var(--surface, #0f1823); color: var(--text, #eef4fb);
  border: 1px solid var(--panel-border, #2a394a); border-radius: .5rem; padding: 1rem 1.1rem;
  box-shadow: 0 18px 48px rgba(0, 0, 0, .55);
}
.cru-modal-title { margin: 0 0 .4rem; font-size: 1rem; }
.cru-modal-msg { margin: 0 0 .7rem; font-size: .9rem; line-height: 1.5; color: var(--muted, #a6b7ca); }
.cru-modal-input {
  width: 100%; box-sizing: border-box; font: inherit; font-size: .9rem; padding: .5rem .6rem;
  border-radius: .35rem; border: 1px solid var(--panel-border, #2a394a);
  background: var(--bg, #091018); color: var(--text, #eef4fb); resize: vertical;
}
.cru-modal-input:focus { outline: 2px solid #1f4e79; outline-offset: 1px; }
.cru-modal-actions { display: flex; justify-content: flex-end; gap: .5rem; margin-top: .8rem; }
.cru .cru-danger { border-color: rgba(190,40,40,.55); color: #ff9d9d; }
.cru .cru-danger:hover { background: rgba(190,40,40,.16); }

/* Reasoned vs word-overlap-only suggestions must be distinguishable at a glance. */
.cru .cru-sug-conf { float: right; font-weight: 600; font-size: .72rem; text-transform: uppercase;
  letter-spacing: .02em; color: #9ec9ff; }
.cru .cru-sug-unchecked { color: var(--muted, #a6b7ca); }
.cru .cru-sug-lexical { opacity: .92; }
.cru .cru-sug-why { margin: .45rem 0; padding: .45rem .6rem; border-radius: .3rem;
  background: rgba(60,120,200,.12); border-left: 3px solid rgba(90,150,230,.65); }
.cru .cru-sug-whylabel { display: block; font-size: .72rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .02em; color: #9ec9ff; margin-bottom: .2rem; }
.cru .cru-sug-why p { margin: .15rem 0; font-size: .86rem; line-height: 1.45; }
.cru .cru-sug-diff { color: #ffc978; }


/* REVIEWED MARK + REVIEW-COMPLETE STATUS (Tyler, 2026-08-04).
   Visually distinct from acceptance on purpose: reviewing says a person WALKED
   the risk, accepting says they judged it acceptable. Two different acts, and
   the screen must never let one read as the other. */
.cru-rev { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 8px 0 0; padding: 6px 10px; border-radius: 6px; font-size: 12.5px; }
.cru-rev-open { background: rgba(255,255,255,.03); border: 1px dashed var(--cru-line, #33445a); }
.cru-rev-done { background: rgba(80,180,255,.10); border: 1px solid rgba(80,180,255,.35); }
.cru-rev-state { font-weight: 700; }
.cru-rev-done .cru-rev-state { color: #7cc4ff; }
.cru-rev-open .cru-rev-state { color: var(--cru-muted, #93a4b8); }
.cru-rev-meta { color: var(--cru-muted, #93a4b8); }
.cru-rev .cru-btn { margin-left: auto; }

.cru-prog { margin: 10px 0 0; padding: 8px 12px; border-radius: 6px; font-size: 13px; }
.cru-prog-done { background: rgba(40,150,80,.16); border: 1px solid rgba(40,150,80,.45); color: #86e0a6; }
.cru-prog-part { background: rgba(224,175,104,.12); border: 1px solid rgba(224,175,104,.38); color: #e0af68; }
.cru-prog-empty { background: rgba(255,255,255,.03); border: 1px dashed var(--cru-line, #33445a);
  color: var(--cru-muted, #93a4b8); }


/* WHAT WE ARE RESPONSIBLE FOR. Deliberately a different visual language from the
   risk cards — an obligation is not a risk, and the two must never be skimmed as
   one list. */
.cru-obl { margin-top: 26px; }
.cru-obl > h3 { margin: 0 0 4px; }
.cru-obl-lede { margin: 0 0 12px; color: var(--cru-muted, #93a4b8); font-size: 13px; }
.cru-obl-item { border: 1px solid var(--cru-line, #33445a); border-left: 3px solid #7cc4ff;
  border-radius: 8px; padding: 12px 14px; margin: 0 0 10px; background: rgba(255,255,255,.02); }
.cru-obl-done { border-left-color: #86e0a6; }
.cru-obl-head { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; margin-bottom: 6px; }
.cru-obl-kind { font-size: 11px; text-transform: uppercase; letter-spacing: .05em;
  font-weight: 700; color: #7cc4ff; }
.cru-obl-sec { font-size: 12px; color: var(--cru-muted, #93a4b8); }
.cru-obl-when { font-size: 12px; color: #e0af68; margin-left: auto; }
.cru-obl-text { margin: 0 0 8px; font-weight: 600; }
.cru-obl-quote { margin: 0 0 8px; padding-left: 10px; border-left: 2px solid var(--cru-line, #33445a);
  color: var(--cru-muted, #93a4b8); font-size: 13px; font-style: italic; }
.cru-obl-check { margin: 0 0 8px; font-size: 13px; }


/* LIBRARY: review completion at a glance (Tyler, 2026-08-04). */
.cru-rv-done { color: #86e0a6; font-weight: 700; white-space: nowrap; }
.cru-rv-part { color: #e0af68; font-weight: 700; white-space: nowrap; }
.cru-rv-none { color: var(--cru-muted, #93a4b8); }

/* the PDF's filename, kept under the contract's real name */
.cru-c-sub {
  margin: 2px 0 0;
  font-size: 0.76rem;
  font-weight: 400;
  color: #a6b7ca;
  word-break: break-all;
}

/* ---- the PM job this contract belongs to ---- */
.cru-job {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin: 10px 0 0;
  padding: 10px 12px;
  border: 1px solid #2a394a;
  border-radius: 12px;
  background: #0f1823;
}
.cru-job-unset { border-color: #6b5a2a; background: rgba(255, 209, 102, 0.07); }
.cru-job-label {
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #a6b7ca;
}
.cru-job select {
  background: #101a26;
  color: #eef4fb;
  border: 1px solid #22344b;
  border-radius: 10px;
  padding: 6px 10px;
  font: inherit;
  max-width: 42ch;
}
.cru-job-change { margin-left: auto; }
.cru-job-why {
  flex: 1 0 100%;
  margin: 0;
  font-size: 0.78rem;
  color: #a6b7ca;
}

/* ---- what is waiting on this person, across every contract ---- */
.cru-waiting {
  margin: 0 0 20px;
  padding: 14px 16px;
  border: 1px solid #3b6ea5;
  border-left-width: 4px;
  border-radius: 12px;
  background: rgba(29, 110, 200, 0.10);
}
.cru-waiting h3 {
  margin: 0 0 12px;
  font-size: 0.74rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #9dc4f0;
}
.cru-waiting-err { border-color: #6b5a2a; background: rgba(255, 209, 102, 0.08); color: #ffd166; }
.cru-wait-contract + .cru-wait-contract { margin-top: 14px; padding-top: 12px; border-top: 1px solid rgba(157, 196, 240, 0.28); }
.cru-wait-contract h4 { margin: 0 0 8px; font-size: 0.95rem; }
.cru-wait-count {
  display: inline-block;
  min-width: 20px;
  padding: 1px 7px;
  border-radius: 999px;
  background: #1d6ec8;
  color: #fff;
  font-size: 0.72rem;
  text-align: center;
}
.cru-wait-list { list-style: none; margin: 0; padding: 0; }
.cru-wait-item + .cru-wait-item { margin-top: 10px; padding-top: 10px; border-top: 1px dashed rgba(157, 196, 240, 0.25); }
.cru-wait-role { font-weight: 700; }
.cru-wait-kind, .cru-wait-age {
  display: inline-block;
  border: 1px solid #2a394a;
  background: #172637;
  border-radius: 999px;
  padding: 1px 8px;
  font-size: 0.7rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.cru-wait-late { color: #ef6a6a; border-color: #5e2b2b; }
.cru-wait-item blockquote {
  margin: 6px 0;
  padding-left: 10px;
  border-left: 2px solid #2a394a;
  color: #a6b7ca;
  font-style: italic;
  font-size: 0.85rem;
}
.cru-wait-note { font-size: 0.82rem; margin-bottom: 6px; }
